--- a/.classpath Wed Jul 09 12:15:53 2014 +0200
+++ b/.classpath Mon Jul 21 14:48:01 2014 +0200
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="src" path="server/renkan-web/src/main/java"/>
- <classpathentry kind="src" path="server/renkan-core/src/test/java"/>
- <classpathentry kind="src" path="server/renkan-management/src/main/java"/>
- <classpathentry kind="src" path="server/renkan-core/src/main/java"/>
- <classpathentry kind="src" path="server/renkan-web/src/test/java"/>
+ <classpathentry kind="src" path="server/java/renkan-web/src/main/java"/>
+ <classpathentry kind="src" path="server/java/renkan-core/src/test/java"/>
+ <classpathentry kind="src" path="server/java/renkan-management/src/main/java"/>
+ <classpathentry kind="src" path="server/java/renkan-core/src/main/java"/>
+ <classpathentry kind="src" path="server/java/renkan-web/src/test/java"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.web.container"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="var" path="M2_REPO/org/cometd/java/bayeux-api/2.7.0/bayeux-api-2.7.0.jar" sourcepath="M2_REPO/org/cometd/java/bayeux-api/2.5.0/bayeux-api-2.5.0-sources.jar">
@@ -211,5 +211,5 @@
<classpathentry kind="var" path="M2_REPO/commons-io/commons-io/2.4/commons-io-2.4.jar"/>
<classpathentry kind="var" path="M2_REPO/commons-logging/commons-logging/1.1.3/commons-logging-1.1.3.jar"/>
<classpathentry kind="var" path="M2_REPO/org/springframework/shell/spring-shell/1.0.0.RELEASE/spring-shell-1.0.0.RELEASE.jar"/>
- <classpathentry kind="output" path="server/target/classes"/>
+ <classpathentry kind="output" path="server/java/target/classes"/>
</classpath>
--- a/.hgignore Wed Jul 09 12:15:53 2014 +0200
+++ b/.hgignore Mon Jul 21 14:48:01 2014 +0200
@@ -1,11 +1,11 @@
syntax: regexp
^\.project$
-^server/target$
-^server/build$
-^server/\.gradle$
-^server/renkan\-[a-z]+/target$
-^server/renkan\-[a-z]+/build$
+^server/java/target$
+^server/java/build$
+^server/java/\.gradle$
+^server/java/renkan\-[a-z]+/target$
+^server/java/renkan\-[a-z]+/build$
^metadataplayer/libs$
^metadataplayer/metadataplayer$
^standalone/renkan/css$
--- a/.settings/org.eclipse.core.resources.prefs Wed Jul 09 12:15:53 2014 +0200
+++ b/.settings/org.eclipse.core.resources.prefs Mon Jul 21 14:48:01 2014 +0200
@@ -1,3 +1,3 @@
eclipse.preferences.version=1
-encoding//server/renkan-web/src/main/webapp/WEB-INF/i18n/messages_en.properties=UTF-8
-encoding//server/renkan-web/src/main/webapp/WEB-INF/i18n/messages_fr.properties=UTF-8
+encoding//server/java/renkan-web/src/main/webapp/WEB-INF/i18n/messages_en.properties=UTF-8
+encoding//server/java/renkan-web/src/main/webapp/WEB-INF/i18n/messages_fr.properties=UTF-8
--- a/.settings/org.eclipse.wst.common.component Wed Jul 09 12:15:53 2014 +0200
+++ b/.settings/org.eclipse.wst.common.component Mon Jul 21 14:48:01 2014 +0200
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="renkan">
<wb-resource deploy-path="/" source-path="/server/renkan-web/src/main/webapp"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/renkan-web/src/main/java"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/renkan-web/src/test/java"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/renkan-management/src/main/java"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/renkan-core/src/main/java"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/renkan-core/src/test/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/java/renkan-web/src/main/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/java/renkan-core/src/test/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/java/renkan-management/src/main/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/java/renkan-core/src/main/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/server/java/renkan-web/src/test/java"/>
<property name="java-output-path" value="/server/target/classes"/>
<property name="context-root" value="renkan"/>
</wb-module>
--- a/server/README.md Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-Dependencies
-
-- Icon user from echo-icon-theme (echo) (Open Icon Library - http://openiconlibrary.sourceforge.net/)
-licence CC BY-SA - Creative Commons
-- eye icon by : Danilo De Marco : http://www.danilodemarco.com/
-
-- cf pom.xml for dependencies
-
-Commandes maven:
-mvn -DskipTests -Djava.awt.headless=true -Duser.timezone="UTC" clean jetty:run-war
--- a/server/build.gradle Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-allprojects {
- apply plugin: 'maven'
-
- group = 'org.iri_research.renkan'
- version = '0.7.11'
-
-
- gradle.projectsEvaluated {
- tasks.withType(JavaCompile) {
- options.compilerArgs << "-Xlint"
- }
- }
-}
-
-ext {
- organization = "IRI"
-
- junit_version = '4.11'
- slf4j_log4j12_version = '1.7.5'
- spring_version = '3.2.6.RELEASE'
- javax_servlet_version = '3.0.1'
- java_inject_version = '1'
- commons_codec_version = '1.8'
- jackson_version = '2.2.3'
- joda_time_version = '2.3'
- spring_data_commons_version = '1.6.3.RELEASE'
- spring_data_jpa_version = '1.4.3.RELEASE'
- spring_data_mongodb_version = '1.3.3.RELEASE'
- spring_security_version = '3.2.0.RELEASE'
- jetty_version = '8.1.15.v20140411'
- persistence_api_version = '1.0.2'
- mongo_java_driver_version = '2.11.4'
-}
-
-subprojects {
- apply plugin: 'java'
- sourceCompatibility = 1.7
- targetCompatibility = 1.7
-
-
- repositories {
- mavenLocal()
- mavenCentral()
-
- maven { url "http://repo.maven.apache.org/maven2" }
- maven { url "http://maven.springframework.org/release" }
- maven { url "http://maven.springframework.org/milestone" }
- maven { url "http://repo.springsource.org/release" }
- maven { url "http://repo.springsource.org/libs-release" }
- }
-
- test {
- testLogging {
- events "passed", "skipped", "failed"//, "standardOut", "standardError"
- }
- }
-
- dependencies {
- testCompile group: 'junit', name: 'junit', version:junit_version
- runtime group: 'org.slf4j', name: 'slf4j-log4j12', version:slf4j_log4j12_version
- }
-
-}
Binary file server/gradle/wrapper/gradle-wrapper.jar has changed
--- a/server/gradle/wrapper/gradle-wrapper.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-#Wed Jul 02 17:20:02 CEST 2014
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
--- a/server/gradlew Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,164 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS="-Djava.awt.headless=true -Duser.timezone=\"UTC\""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
- [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
--- a/server/gradlew.bat Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS= "-Djava.awt.headless=true -Duser.timezone=^"UTC^""
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/README.md Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,10 @@
+Dependencies
+
+- Icon user from echo-icon-theme (echo) (Open Icon Library - http://openiconlibrary.sourceforge.net/)
+licence CC BY-SA - Creative Commons
+- eye icon by : Danilo De Marco : http://www.danilodemarco.com/
+
+- cf pom.xml for dependencies
+
+Commandes maven:
+mvn -DskipTests -Djava.awt.headless=true -Duser.timezone="UTC" clean jetty:run-war
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/build.gradle Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,63 @@
+allprojects {
+ apply plugin: 'maven'
+
+ group = 'org.iri_research.renkan'
+ version = '0.7.11'
+
+
+ gradle.projectsEvaluated {
+ tasks.withType(JavaCompile) {
+ options.compilerArgs << "-Xlint"
+ }
+ }
+}
+
+ext {
+ organization = "IRI"
+
+ junit_version = '4.11'
+ slf4j_log4j12_version = '1.7.5'
+ spring_version = '3.2.6.RELEASE'
+ javax_servlet_version = '3.0.1'
+ java_inject_version = '1'
+ commons_codec_version = '1.8'
+ jackson_version = '2.2.3'
+ joda_time_version = '2.3'
+ spring_data_commons_version = '1.6.3.RELEASE'
+ spring_data_jpa_version = '1.4.3.RELEASE'
+ spring_data_mongodb_version = '1.3.3.RELEASE'
+ spring_security_version = '3.2.0.RELEASE'
+ jetty_version = '8.1.15.v20140411'
+ persistence_api_version = '1.0.2'
+ mongo_java_driver_version = '2.11.4'
+}
+
+subprojects {
+ apply plugin: 'java'
+ sourceCompatibility = 1.7
+ targetCompatibility = 1.7
+
+
+ repositories {
+ mavenLocal()
+ mavenCentral()
+
+ maven { url "http://repo.maven.apache.org/maven2" }
+ maven { url "http://maven.springframework.org/release" }
+ maven { url "http://maven.springframework.org/milestone" }
+ maven { url "http://repo.springsource.org/release" }
+ maven { url "http://repo.springsource.org/libs-release" }
+ }
+
+ test {
+ testLogging {
+ events "passed", "skipped", "failed"//, "standardOut", "standardError"
+ }
+ }
+
+ dependencies {
+ testCompile group: 'junit', name: 'junit', version:junit_version
+ runtime group: 'org.slf4j', name: 'slf4j-log4j12', version:slf4j_log4j12_version
+ }
+
+}
Binary file server/java/gradle/wrapper/gradle-wrapper.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/gradle/wrapper/gradle-wrapper.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,6 @@
+#Wed Jul 02 17:20:02 CEST 2014
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.0-bin.zip
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/gradlew Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS="-Djava.awt.headless=true -Duser.timezone=\"UTC\""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/gradlew.bat Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS= "-Djava.awt.headless=true -Duser.timezone=^"UTC^""
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/pom.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan</artifactId>
+ <packaging>pom</packaging>
+ <version>0.7.11</version>
+ <name>Renkan project</name>
+
+ <modules>
+ <module>renkan-core</module>
+ <module>renkan-web</module>
+ <module>renkan-management</module>
+ </modules>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/build.gradle Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,36 @@
+
+description = 'renkan-core'
+
+repositories {
+ mavenCentral()
+}
+
+ext {
+ commons_collections_version = '4.0'
+ uuid_generator_version = '3.1.3'
+}
+
+dependencies {
+ compile group: 'javax.inject', name: 'javax.inject', version:java_inject_version
+ compile group: 'commons-codec', name: 'commons-codec', version:commons_codec_version
+ compile group: 'org.apache.commons', name: 'commons-collections4', version:commons_collections_version
+ compile group: 'com.fasterxml.uuid', name: 'java-uuid-generator', version:uuid_generator_version
+ compile group: 'joda-time', name: 'joda-time', version:joda_time_version
+ compile group: 'org.springframework', name: 'spring-core', version:spring_version
+ compile group: 'org.springframework', name: 'spring-beans', version:spring_version
+ compile group: 'org.springframework', name: 'spring-jdbc', version:spring_version
+ compile group: 'org.springframework', name: 'spring-context', version:spring_version
+ compile group: 'org.springframework.data', name: 'spring-data-commons', version:spring_data_commons_version
+ compile group: 'org.springframework.data', name: 'spring-data-jpa', version:spring_data_jpa_version
+ compile group: 'org.springframework.data', name: 'spring-data-mongodb', version:spring_data_mongodb_version
+ compile group: 'org.springframework.security', name: 'spring-security-core', version:spring_security_version
+ compile group: 'javax.persistence', name: 'persistence-api', version:persistence_api_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:jackson_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:jackson_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:jackson_version
+ compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version:jackson_version
+ compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-joda', version:jackson_version
+ compile group: 'org.mongodb', name: 'mongo-java-driver', version:mongo_java_driver_version
+ testCompile group: 'org.springframework', name: 'spring-test', version:spring_version
+ testRuntime group: 'org.slf4j', name: 'slf4j-log4j12', version:slf4j_log4j12_version
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/pom.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,203 @@
+<?xml version="1.0"?>
+<project
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+ xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan</artifactId>
+ <version>0.7.11</version>
+ </parent>
+ <artifactId>renkan-core</artifactId>
+ <name>renkan-core</name>
+ <url>http://maven.apache.org</url>
+ <properties>
+ <spring-version>3.2.6.RELEASE</spring-version>
+ <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
+ <spring-data-commons-version>1.6.3.RELEASE</spring-data-commons-version>
+ <spring-data-jpa-version>1.4.3.RELEASE</spring-data-jpa-version>
+ <mongo-driver-version>2.11.4</mongo-driver-version>
+ <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
+ <javax-persistence-api-version>1.0.2</javax-persistence-api-version>
+ <javax-inject-version>1</javax-inject-version>
+ <commons-codec-version>1.8</commons-codec-version>
+ <fasterxml-java-uuid-generator-version>3.1.3</fasterxml-java-uuid-generator-version>
+ <joda-version>2.3</joda-version>
+ <jackson-version>2.2.3</jackson-version>
+ <spring-security-version>3.2.0.RELEASE</spring-security-version>
+ <commons-collections-version>4.0</commons-collections-version>
+ <junit-version>4.11</junit-version>
+ <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <repositories>
+ <repository>
+ <id>spring-maven-release</id>
+ <name>Spring Maven Release Repository</name>
+ <url>http://maven.springframework.org/release</url>
+ </repository>
+ <repository>
+ <id>spring-maven-milestone</id>
+ <name>Spring Maven MILESTONE Repository</name>
+ <url>http://maven.springframework.org/milestone</url>
+ </repository>
+ <repository>
+ <id>spring-release</id>
+ <name>Spring Maven SNAPSHOT Repository</name>
+ <url>http://repo.springsource.org/release</url>
+ </repository>
+ <repository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>central</id>
+ <name>libs-release</name>
+ <url>http://repo.springsource.org/libs-release</url>
+ </repository>
+ </repositories>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <archive>
+ <index>true</index>
+ </archive>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ <version>${javax-inject-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>${commons-codec-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-collections4</artifactId>
+ <version>${commons-collections-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.uuid</groupId>
+ <artifactId>java-uuid-generator</artifactId>
+ <version>${fasterxml-java-uuid-generator-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ <version>${joda-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-jdbc</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>${spring-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-commons</artifactId>
+ <version>${spring-data-commons-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-jpa</artifactId>
+ <version>${spring-data-jpa-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-mongodb</artifactId>
+ <version>${spring-data-mongodb-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-core</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>${javax-persistence-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-json-provider</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-joda</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mongodb</groupId>
+ <artifactId>mongo-java-driver</artifactId>
+ <version>${mongo-driver-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>${slf4j-log4j12-version}</version>
+ <scope>test</scope>
+ </dependency>
+
+ </dependencies>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/Constants.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,67 @@
+package org.iri_research.renkan;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import com.fasterxml.uuid.EthernetAddress;
+import com.fasterxml.uuid.Generators;
+import com.fasterxml.uuid.NoArgGenerator;
+
+public class Constants {
+
+ public final static String KEYHEX = "f2338d2299ac28ef64f82956fde37337b87a2b9e8fc03e28fa0768cac37d838113c7d0fc78c60fce1e23b1b3e03ac7db4676b3189c267f26baaab10f72544441";
+ public final static int SALT_LENGTH = 24;
+ public final static int PAGINATION_SIZE = 10;
+ public final static String PROPERTIES_SERVLET_CONTEXT_NAME = "renkan.properties";
+ public final static String PROPERTIES_CLASSPATH_NAME = "renkan_run.properties";
+ public final static String ANONYMOUS_USER_BASE_NAME = "Anonymous";
+
+ private final static EthernetAddress ETHERNET_ADRESS = EthernetAddress
+ .fromInterface();
+ public final static NoArgGenerator UUID_GENERATOR = Generators
+ .timeBasedGenerator(ETHERNET_ADRESS);
+
+ public enum EditMode {
+ READ_ONLY(1), EDITION(2);
+
+ private int value;
+
+ private final static EditMode[] editModeValues = EditMode.values();
+
+ private EditMode(int i) {
+ this.value = i;
+ }
+
+ public static EditMode fromInt(int val) {
+ for (int i = 0; i < editModeValues.length; i++) {
+ if (editModeValues[i].value == val) {
+ return editModeValues[i];
+ }
+ }
+ return null;
+ }
+ }
+
+
+ public final static String ROLE_USER = "ROLE_USER";
+
+ public final static List<String> USER_ROLES_SELECT = Collections
+ .unmodifiableList(new ArrayList<String>() {
+ private static final long serialVersionUID = -3041530185134732199L;
+ {
+ add("ROLE_ADMIN");
+ add("ROLE_SPACES_ADMIN");
+ add("ROLE_GROUPS_ADMIN");
+ }
+ });
+
+ public final static List<String> USER_ROLES_ALL = Collections
+ .unmodifiableList(new ArrayList<String>() {
+ private static final long serialVersionUID = -3041530185134732199L;
+ {
+ add(ROLE_USER);
+ addAll(USER_ROLES_SELECT);
+ }
+ });
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/RenkanException.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,25 @@
+package org.iri_research.renkan;
+
+public class RenkanException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6952770322990047437L;
+
+ public RenkanException() {
+ }
+
+ public RenkanException(String message) {
+ super(message);
+ }
+
+ public RenkanException(Throwable exc) {
+ super(exc);
+ }
+
+ public RenkanException(String message, Throwable exc) {
+ super(message, exc);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/RenkanProperties.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,47 @@
+package org.iri_research.renkan;
+
+import java.util.Properties;
+
+import javax.annotation.Resource;
+import javax.inject.Named;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Named
+public class RenkanProperties {
+
+ @Resource(name = "renkanProperties")
+ private Properties properties;
+
+ private final Logger logger = LoggerFactory
+ .getLogger(RenkanProperties.class);
+
+ private static volatile RenkanProperties instance = null;
+
+ private RenkanProperties() {
+ this.logger.debug("Building RenkanProperties");
+ }
+
+ public static RenkanProperties getInstance() {
+ if (instance == null) {
+ synchronized (RenkanProperties.class) {
+ if (instance == null) {
+ instance = new RenkanProperties();
+ }
+ }
+ }
+ return instance;
+ }
+
+ public int getPaginationSize() {
+ return Integer.parseInt(properties.getProperty(
+ "renkan.pagination.size",
+ Integer.toString(Constants.PAGINATION_SIZE)));
+ }
+
+ public String getProperty(String name, String defaultVal) {
+ return properties.getProperty(name, defaultVal);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/RenkanRuntimeException.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,25 @@
+package org.iri_research.renkan;
+
+public class RenkanRuntimeException extends RuntimeException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 736470650035855769L;
+
+ public RenkanRuntimeException() {
+ }
+
+ public RenkanRuntimeException(String message) {
+ super(message);
+ }
+
+ public RenkanRuntimeException(Throwable exc) {
+ super(exc);
+ }
+
+ public RenkanRuntimeException(String message, Throwable exc) {
+ super(message, exc);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/AbstractRenkanModel.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,152 @@
+package org.iri_research.renkan.models;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.RenkanException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public abstract class AbstractRenkanModel<ID extends Serializable> implements
+ IRenkanModel<ID> {
+
+ @SuppressWarnings("unused")
+ private static Logger logger = LoggerFactory.getLogger(AbstractRenkanModel.class);
+
+ public AbstractRenkanModel(ID id, String title, String description,
+ String uri, String color) {
+ super();
+ this.id = id;
+ this.idSet = true;
+ this.title = title;
+ this.description = description;
+ this.uri = uri;
+ this.color = color;
+ }
+
+ protected AbstractRenkanModel() {
+ }
+
+ protected ID id = this.getDefaultId();
+ @JsonIgnore
+ protected boolean idSet = false;
+ protected String title;
+ protected String description;
+ protected String uri;
+ protected String color;
+
+ @Override
+ public String getTitle() {
+ return this.title;
+ }
+
+ @Override
+ public String getDescription() {
+ return this.description;
+ }
+
+ @Override
+ public String getUri() {
+ return this.uri;
+ }
+
+ @Override
+ public String getColor() {
+ return this.color;
+ }
+
+ @Override
+ public ID getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(ID id) {
+ this.idSet = true;
+ this.id = id;
+ }
+
+ @JsonIgnore
+ @Override
+ public boolean isIdSet() {
+ return this.idSet;
+ };
+
+ @Override
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ @Override
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ abstract protected String getRawKeyPart();
+ abstract protected ID getDefaultId();
+
+ private String getRawKey(String salt) {
+ StringBuffer key = new StringBuffer(salt != null ? salt + "|" : "");
+ key.append(this.getId());
+ key.append('|');
+ key.append(this.getRawKeyPart());
+ return key.toString();
+ }
+
+ public String getKey(String salt) throws RenkanException {
+
+ String rawKey = this.getRawKey(salt);
+
+ MessageDigest md;
+ try {
+ md = MessageDigest.getInstance("SHA-256");
+ } catch (NoSuchAlgorithmException e) {
+ throw new RenkanException("NoSuchAlgorithmException digest: "
+ + e.getMessage(), e);
+ }
+ String key;
+ final SecretKeySpec secret_key = new SecretKeySpec(
+ Constants.KEYHEX.getBytes(), "HmacSHA256");
+ md.update(secret_key.getEncoded());
+ try {
+ key = Hex.encodeHexString(md.digest(rawKey.getBytes("UTF-8")));
+ } catch (UnsupportedEncodingException e) {
+ throw new RenkanException("UnsupportedEncodingException digest: "
+ + e.getMessage(), e);
+ }
+
+ return key;
+ }
+
+ public boolean checkKey(String key, String salt) throws RenkanException {
+
+ if (key == null || key.isEmpty()) {
+ return false;
+ }
+
+ String signature = key;
+
+ String new_key = this.getKey(salt);
+
+ return new_key.equals(signature);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/Edge.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,110 @@
+package org.iri_research.renkan.models;
+
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+
+@Document(collection = "edges")
+@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
+public class Edge extends AbstractRenkanModel<String> {
+
+ @DBRef
+ private Node from;
+
+ @DBRef
+ private Node to;
+
+ @Field("project_id")
+ @JsonProperty("project_id")
+ private String projectId;
+
+ @Field("created_by")
+ @JsonProperty("created_by")
+ private String createdBy;
+
+ @SuppressWarnings("unused")
+ private Edge() {
+ }
+
+ public Edge(Edge edge, Node from, Node to, String projectId) {
+ this(Constants.UUID_GENERATOR.generate().toString(), edge.title,
+ edge.description, edge.uri, edge.color, from, to,
+ edge.createdBy, projectId);
+ }
+
+ public Edge(Edge edge) {
+ this(edge, edge.from, edge.to, edge.projectId);
+ }
+
+ @Autowired(required = true)
+ public Edge(String id, String title, String description, String uri,
+ String color, Node from, Node to, String createdBy, String projectId) {
+ super(id, title, description, uri, color);
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ this.from = from;
+ this.to = to;
+ this.createdBy = createdBy;
+ this.projectId = projectId;
+ }
+
+ @JsonProperty("project_id")
+ public String getProjectId() {
+ return projectId;
+ }
+
+ public void setProjectId(String projectId) {
+ this.projectId = projectId;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ @JsonIgnore
+ public Node getFromNode() {
+ return this.from;
+ }
+
+ public String getFrom() {
+ if (this.from != null) {
+ return this.from.id;
+ } else {
+ return null;
+ }
+ }
+
+ @JsonIgnore
+ public Node getToNode() {
+ return this.to;
+ }
+
+ public String getTo() {
+ if (this.to != null) {
+ return this.to.id;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.createdBy;
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/Group.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,76 @@
+package org.iri_research.renkan.models;
+
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Document(collection = "groups")
+public class Group extends AbstractRenkanModel<String> {
+
+ private String avatar;
+ private Set<String> users = new TreeSet<>();
+
+ public Group() {
+ }
+
+ public Group(String id, String title, String description, String uri,
+ String color) {
+ super(id, title, description, uri, color);
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public String getGroupName() {
+ return this.getTitle();
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.id;
+ }
+
+ public Set<String> getUsers() {
+ if(this.users == null) {
+ this.users = new TreeSet<>();
+ }
+ return this.users;
+ }
+
+
+ public boolean addUser(User user) {
+ return this.addUser(user.getId());
+ }
+
+ public boolean addUser(String userId) {
+ return this.getUsers().add(userId);
+ }
+
+ public boolean removeUser(User user) {
+ return this.removeUser(user.getId());
+ }
+
+ public boolean removeUser(String userId) {
+ if(this.getUsers() != null) {
+ return this.getUsers().remove(userId);
+ }
+ return false;
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/IRenkanModel.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,44 @@
+package org.iri_research.renkan.models;
+
+import java.io.Serializable;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.RenkanRuntimeException;
+
+public interface IRenkanModel<ID extends Serializable> {
+
+ public ID getId();
+
+ /**
+ * Set the object id. This method must throw a RenkanException if the
+ * current object id is not null
+ *
+ * @param id
+ * @throws RenkanRuntimeException
+ * if the current id is not null
+ */
+ public void setId(ID id);
+
+ public boolean isIdSet();
+
+ public String getTitle();
+
+ public String getDescription();
+
+ public String getUri();
+
+ public String getColor();
+
+ public void setTitle(String title);
+
+ public void setDescription(String description);
+
+ public void setUri(String uri);
+
+ public void setColor(String color);
+
+ public String getKey(String salt) throws RenkanException;
+
+ public boolean checkKey(String key, String salt) throws RenkanException;
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/Node.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,96 @@
+package org.iri_research.renkan.models;
+
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import com.fasterxml.jackson.annotation.JsonIdentityInfo;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.ObjectIdGenerators;
+
+@Document(collection = "nodes")
+@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
+public class Node extends AbstractRenkanModel<String> {
+
+ public Node(Node node, String projectId) {
+ this(Constants.UUID_GENERATOR.generate().toString(), node.title,
+ node.description, node.uri, node.color, node.createdBy,
+ node.position, node.image, node.size, projectId);
+ }
+
+ public Node(Node node) {
+ this(node, node.projectId);
+ }
+
+ @SuppressWarnings("unused")
+ private Node() {
+ }
+
+ @Autowired(required = true)
+ public Node(String id, String title, String description, String uri,
+ String color, String createdBy, Point position, String image,
+ Integer size, String projectId) {
+ super(id, title, description, uri, color);
+
+ this.projectId = projectId;
+ this.createdBy = createdBy;
+ this.position = position;
+ this.image = image;
+ this.size = (size == null) ? 0 : size.intValue();
+ }
+
+ @Field("project_id")
+ @JsonProperty("project_id")
+ private String projectId = null;
+
+ @Field("created_by")
+ @JsonProperty("created_by")
+ private String createdBy = null;
+
+ private Point position = null;
+
+ private String image;
+
+ private int size;
+
+ public Point getPosition() {
+ return position;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ @JsonProperty("project_id")
+ public String getProjectId() {
+ return projectId;
+ }
+
+ public void setProjectId(String projectId) {
+ this.projectId = projectId;
+ }
+
+ @JsonProperty("created_by")
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.createdBy;
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/Project.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,280 @@
+package org.iri_research.renkan.models;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.Constants.EditMode;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.utils.ColorGenerator;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@Document(collection = "projects")
+public class Project extends AbstractRenkanModel<String> {
+
+ private static Logger logger = LoggerFactory.getLogger(Project.class);
+
+ @Field("rev_counter")
+ private int revCounter = 1;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private DateTime created;
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private DateTime updated;
+
+ // Space
+ @Field("space_id")
+ @JsonProperty("space_id")
+ private String spaceId = null;
+
+ // Nodes
+ @DBRef
+ private List<Node> nodes = new ArrayList<Node>();
+
+ // edges
+ @DBRef
+ private List<Edge> edges = new ArrayList<Edge>();
+
+ //views
+ private List<View> views = new ArrayList<View>();
+
+ // Users
+ private List<RenkanUser> users = new ArrayList<RenkanUser>();
+
+ public Project(Project project) {
+ this(project.spaceId, Constants.UUID_GENERATOR.generate().toString(),
+ project.title, project.description, project.uri, new DateTime());
+
+ Map<String, Node> nodeCloneMap = new HashMap<String, Node>(
+ project.nodes.size());
+ for (Node node : project.nodes) {
+ Node newNode = new Node(node, this.id);
+ this.nodes.add(newNode);
+ nodeCloneMap.put(node.id, newNode);
+ }
+
+ for (Edge edge : project.edges) {
+ this.edges.add(new Edge(edge, nodeCloneMap.get(edge.getFrom()),
+ nodeCloneMap.get(edge.getTo()), this.id));
+ }
+ for (RenkanUser user : project.users) {
+ this.users.add(new RenkanUser(user));
+ }
+ }
+
+ public Project(String spaceId, String id, String title, String description,
+ String uri, DateTime created, int revCounter) {
+ super(id, title, description, uri, null);
+
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ this.revCounter = revCounter;
+ this.spaceId = spaceId;
+ this.created = created;
+ if (this.created == null) {
+ this.created = new DateTime();
+ }
+ this.setUpdated(new DateTime());
+ }
+
+ @Autowired(required = true)
+ public Project(String spaceId, String id, String title, String description,
+ String uri, DateTime created) {
+ this(spaceId, id, title, description, uri, created, 1);
+ logger.debug("partial constructor used");
+ }
+
+ @SuppressWarnings("unused")
+ private Project() {
+ }
+
+ public int getRevCounter() {
+ return this.revCounter;
+ }
+
+ public List<Node> getNodes() {
+ return this.nodes;
+ }
+
+ public List<Edge> getEdges() {
+ return this.edges;
+ }
+
+ public List<View> getViews() {
+ return this.views;
+ }
+
+ public List<RenkanUser> getUsers() {
+ return this.users;
+ }
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ public DateTime getCreated() {
+ return created;
+ }
+
+ public void setCreated(DateTime date) {
+ this.created = date;
+
+ }
+
+ @JsonProperty("space_id")
+ public String getSpaceId() {
+ return spaceId;
+ }
+
+ private String getRawKey(String prefix, Constants.EditMode editMode) {
+ StringBuffer key = new StringBuffer(prefix != null ? prefix + "|" : "");
+ key.append(this.getId());
+ key.append('|');
+ key.append(this.getSpaceId());
+ key.append('|');
+ key.append(this.getCreated().getMillis());
+ key.append('|');
+ key.append(editMode.toString());
+ return key.toString();
+ }
+
+ public String getKey(int editMode) throws RenkanException {
+ return this.getKey(EditMode.fromInt(editMode));
+ }
+
+ public String getKey(Constants.EditMode editMode) throws RenkanException {
+
+ String rawKey = this.getRawKey("", editMode);
+
+ MessageDigest md;
+ try {
+ md = MessageDigest.getInstance("SHA-256");
+ } catch (NoSuchAlgorithmException e) {
+ throw new RenkanException("NoSuchAlgorithmException digest: "
+ + e.getMessage(), e);
+ }
+ String key;
+ final SecretKeySpec secret_key = new SecretKeySpec(
+ Constants.KEYHEX.getBytes(), "HmacSHA256");
+ md.update(secret_key.getEncoded());
+ try {
+ key = Hex.encodeHexString(md.digest(rawKey.getBytes("UTF-8")));
+ } catch (UnsupportedEncodingException e) {
+ throw new RenkanException("UnsupportedEncodingException digest: "
+ + e.getMessage(), e);
+ }
+
+ return key;
+ }
+
+ public boolean checkKey(String key, Constants.EditMode editMode)
+ throws RenkanException {
+
+ if (key == null || key.isEmpty()) {
+ return false;
+ }
+
+ String signature = key;
+
+ String new_key = this.getKey(editMode);
+
+ return new_key.equals(signature);
+ }
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ public DateTime getUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(DateTime updated) {
+ this.updated = updated;
+ }
+
+ public void addUser(User user) {
+
+ if (user == null) {
+ // we add an anonymous user
+ // find an unique user name
+ this.addUser(null, null);
+ } else {
+ // if user is already in list do nothing
+ for (RenkanUser renkanUser : this.users) {
+ if (renkanUser.getUserId() != null
+ && renkanUser.getUserId().equals(user.getId())) {
+ return;
+ }
+ }
+ // user not found
+ this.users.add(new RenkanUser(this.getId(), user.getId(), user
+ .getColor(), user.getUsername()));
+
+ }
+
+ }
+
+ public void addUser(String username, String color) {
+
+ if (username == null) {
+ // find a new username
+ int i = 0;
+ boolean usernameFound = true;
+ while (i++ < 1000000 && usernameFound) {
+ username = String.format("%s-%s",
+ Constants.ANONYMOUS_USER_BASE_NAME, i);
+ usernameFound = false;
+ for (RenkanUser renkanUser : this.users) {
+ if (username.equals(renkanUser.getUsername())) {
+ usernameFound = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (color == null) {
+ int i = 0;
+ boolean colorFound = true;
+ while (i++ < 10000000 && colorFound) {
+ color = "#" + ColorGenerator.randomColorHex();
+ colorFound = false;
+ for (RenkanUser renkanUser : this.users) {
+ if (username.equals(renkanUser.getUsername())) {
+ colorFound = true;
+ break;
+ }
+ }
+ }
+ }
+
+ RenkanUser ruser = new RenkanUser(this.getId(), null, color, username);
+ this.users.add(ruser);
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.getId() + Long.toString(this.getCreated().getMillis());
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/ProjectRevision.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,92 @@
+package org.iri_research.renkan.models;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.bson.types.ObjectId;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Document(collection = "projectRevisions")
+public class ProjectRevision extends AbstractRenkanModel<ObjectId> {
+
+ @SuppressWarnings("unused")
+ private static Logger logger = LoggerFactory
+ .getLogger(ProjectRevision.class);
+
+ private int revision;
+
+ @DBRef
+ private Project project;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private DateTime created;
+
+ // Nodes
+ private List<Node> nodes = new ArrayList<Node>();
+
+ // Edgess
+ private List<Edge> edges = new ArrayList<Edge>();
+
+ @SuppressWarnings("unused")
+ private ProjectRevision() {
+ super();
+ }
+
+ public ProjectRevision(String title, String description, String uri,
+ Project project, int revision, Date created) {
+ this(null, title, description, uri, project, revision, created);
+ }
+
+ public ProjectRevision(ObjectId id, String title, String description,
+ String uri, Project project, int revision, Date created) {
+ super(id, title, description, uri, null);
+ if(this.id == null) {
+ this.id = new ObjectId();
+ }
+ this.project = project;
+ this.revision = revision;
+ if (created == null) {
+ this.created = new DateTime(System.currentTimeMillis());
+ }
+ }
+
+ public int getRevision() {
+ return revision;
+ }
+
+ public Project getProject() {
+ return project;
+ }
+
+ public List<Node> getNodes() {
+ return nodes;
+ }
+
+ public List<Edge> getEgdes() {
+ return edges;
+ }
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ public DateTime getCreated() {
+ return created;
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return Long.toString(this.getCreated().getMillis());
+ }
+
+ @Override
+ protected ObjectId getDefaultId() {
+ return new ObjectId();
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/ProjectSync.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,60 @@
+package org.iri_research.renkan.models;
+
+import org.bson.types.ObjectId;
+import org.joda.time.DateTime;
+import org.springframework.data.mongodb.core.mapping.DBRef;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+@Document(collection = "projectSyncs")
+public class ProjectSync {
+
+ private ObjectId id;
+
+ private String data;
+
+ @DBRef
+ private Project project;
+
+ private int revision;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private DateTime created;
+
+ private String user;
+
+ public ProjectSync(ObjectId id, String data, Project project, int revision,
+ DateTime created, String user) {
+ this.id = id;
+ this.data = data;
+ this.project = project;
+ this.revision = revision;
+ this.created = created;
+ this.user = user;
+ if (this.created == null) {
+ this.created = new DateTime(System.currentTimeMillis());
+ }
+ }
+
+ public ObjectId getId() {
+ return id;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public Project getProject() {
+ return project;
+ }
+
+ public int getRevision() {
+ return revision;
+ }
+
+ public String getUser() {
+ return user;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/RenkanSessionModeratorState.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,26 @@
+package org.iri_research.renkan.models;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public enum RenkanSessionModeratorState {
+ INSTANCE;
+
+ private Map<String, String> usersActivationMap = new HashMap<String, String>();
+ private Map<String, List<String>> projectsActivationMap = new HashMap<String, List<String>>();
+ private Map<String, List<RosterUser>> projectsUsersList = new HashMap<String, List<RosterUser>>();
+
+ public Map<String, String> getUsersActivationMap() {
+ return usersActivationMap;
+ }
+
+ public Map<String, List<String>> getProjectsActivationMap() {
+ return projectsActivationMap;
+ }
+
+ public Map<String, List<RosterUser>> getProjectsUsersList() {
+ return projectsUsersList;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/RenkanUser.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,61 @@
+package org.iri_research.renkan.models;
+
+import org.springframework.data.mongodb.core.mapping.Field;
+
+public class RenkanUser {
+
+ @Field(value = "user_id")
+ private String userId;
+ private String color;
+ private String username;
+
+ @SuppressWarnings("unused")
+ private RenkanUser() {
+ }
+
+ public RenkanUser(String projectId, String userId, String color,
+ String username) {
+ this.userId = userId;
+ this.color = color;
+ this.username = username;
+ }
+
+ public RenkanUser(RenkanUser user) {
+ if (user != null) {
+ this.setUserId(user.getUserId());
+ this.setColor(user.getColor());
+ this.setUsername(user.getUsername());
+ }
+ }
+
+ @Field(value = "user_id")
+ public String getUserId() {
+ return userId;
+ }
+
+ @Field(value = "user_id")
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public boolean isAnonymous() {
+ return this.getUserId() == null;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/RosterUser.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,68 @@
+package org.iri_research.renkan.models;
+
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class RosterUser extends AbstractRenkanModel<String> {
+
+ private String projectId;
+ private Long siteId;
+ private String clientId;
+
+ public RosterUser(String id, String title, String description, String uri,
+ String color, String project_id, Long site_id, String client_id) {
+ super(id, title, description, uri, color);
+
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ this.projectId = project_id;
+ this.siteId = site_id;
+ this.clientId = client_id;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ @JsonProperty(value = "project_id")
+ public String getProjectId() {
+ return projectId;
+ }
+
+ @JsonProperty(value = "site_id")
+ public Long getSiteId() {
+ return siteId;
+ }
+
+ @JsonProperty(value = "client_id")
+ public String getClientId() {
+ return clientId;
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.id;
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/Space.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,93 @@
+package org.iri_research.renkan.models;
+
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+@Document(collection = "spaces")
+public class Space extends AbstractRenkanModel<String> {
+
+ @Autowired
+ public Space(String id, String title, String description, String binConfig,
+ String uri, String color, String createdBy, String image,
+ DateTime created) {
+ super(id, title, description, uri, color);
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ this.binConfig = binConfig;
+ this.createdBy = createdBy;
+ this.setImage(image);
+ this.created = created;
+ if (this.created == null) {
+ this.created = new DateTime();
+ }
+ }
+
+ public Space() {
+ }
+
+ @Field("bin_config")
+ @JsonProperty("bin_config")
+ private String binConfig;
+
+ @Field("created_by")
+ @JsonProperty("created_by")
+ private String createdBy = null;
+ private String image;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private DateTime created;
+
+ public String getImage() {
+ return image;
+ }
+
+ @JsonProperty("created_by")
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ public DateTime getCreated() {
+ return created;
+ }
+
+ public void setCreated(DateTime date) {
+ this.created = date;
+
+ }
+
+ @JsonProperty("bin_config")
+ public String getBinConfig() {
+ return binConfig;
+ }
+
+ @JsonProperty("bin_config")
+ public void setBinConfig(String bin_config) {
+ this.binConfig = bin_config;
+ }
+
+ public void setImage(String image) {
+ this.image = image;
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.id+Long.toString(this.getCreated().getMillis());
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/User.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,213 @@
+package org.iri_research.renkan.models;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.UUID;
+
+import org.iri_research.renkan.Constants;
+import org.joda.time.LocalDate;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+@Document(collection = "users")
+public class User extends AbstractRenkanModel<String> implements UserDetails {
+
+ public static class UserComparator implements Comparator<User> {
+
+ @Override
+ public int compare(User u1, User u2) {
+ if(u1 == null || u1.getId() == null) {
+ return (u2==null || u2.getId() == null)? 0 : Integer.MIN_VALUE;
+ }
+ else {
+ return u2==null?Integer.MAX_VALUE:u1.getId().compareTo(u2.getId());
+ }
+
+ }
+
+ }
+
+ private static final long serialVersionUID = 6972038893086220548L;
+
+
+ private String avatar;
+ @Field("credentials_expiration_date")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private LocalDate credentialsExpirationDate;
+ private String email;
+ private boolean enabled;
+ @Field("expiration_date")
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
+ private LocalDate expirationDate;
+ private boolean locked;
+ private String password;
+ @Field("authorities")
+ private List<String> userAuthorities;
+
+ private Set<String> groups = new TreeSet<>();
+
+ public User() {
+ }
+
+ public User(String id, String title, String description, String uri,
+ String color) {
+ super(id, title, description, uri, color);
+ if(this.id == null) {
+ this.id = Constants.UUID_GENERATOR.generate().toString();
+ }
+ }
+
+ @Override
+ public Collection<? extends GrantedAuthority> getAuthorities() {
+ List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+ boolean hasUserRole = false;
+ for (String role : this.getUserAuthorities()) {
+ hasUserRole = hasUserRole || Constants.ROLE_USER.equals(role);
+ authorities.add(new SimpleGrantedAuthority(role));
+ }
+ if(!hasUserRole) {
+ authorities.add(new SimpleGrantedAuthority(Constants.ROLE_USER));
+ }
+
+ return authorities;
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public String getColor() {
+ return this.color;
+ }
+
+ public LocalDate getCredentialsExpirationDate() {
+ return credentialsExpirationDate;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public LocalDate getExpirationDate() {
+ return expirationDate;
+ }
+
+ @Override
+ @JsonIgnore
+ public String getPassword() {
+ return this.password;
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.id;
+ }
+
+ public List<String> getUserAuthorities() {
+ return userAuthorities;
+ }
+
+ @Override
+ @JsonIgnore
+ public String getUsername() {
+ return this.title;
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return this.expirationDate == null
+ || this.expirationDate.isAfter(LocalDate.now());
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return !this.locked;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return this.credentialsExpirationDate == null
+ || this.credentialsExpirationDate.isAfter(LocalDate.now());
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return this.enabled;
+ }
+
+ public boolean isLocked() {
+ return locked;
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
+ this.credentialsExpirationDate = credentialsExpirationDate;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public void setExpirationDate(LocalDate expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+
+ public void setLocked(boolean locked) {
+ this.locked = locked;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void setUserAuthorities(List<String> userAuthorities) {
+ this.userAuthorities = userAuthorities;
+ }
+
+ public Set<String> getGroups() {
+ if(this.groups == null) {
+ this.groups = new TreeSet<>();
+ }
+ return groups;
+ }
+
+
+ public boolean addGroup(Group g) {
+ return this.addGroup(g.getId());
+ }
+
+ public boolean addGroup(String groupId) {
+ return this.getGroups().add(groupId);
+ }
+
+ public boolean removeGroup(Group g) {
+ return this.removeGroup(g.getId());
+ }
+
+ public boolean removeGroup(String groupId) {
+ return (this.groups == null)?false:this.groups.remove(groupId);
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/models/View.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,101 @@
+package org.iri_research.renkan.models;
+
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class View extends AbstractRenkanModel<String> {
+
+ private DateTime created;
+ private DateTime updated;
+
+ @Field("zoom_level")
+ @JsonProperty("zoom_level")
+ private double zoomLevel;
+
+ private Point offset;
+
+ @Field("created_by")
+ @JsonProperty("created_by")
+ private String createdBy;
+
+ @SuppressWarnings("unused")
+ private View() {
+ }
+
+ public View(String view_id, String title, String description, String uri,
+ String color, String creatorId, double zoomLevel, Point offset) {
+ super(view_id, title, description, uri, color);
+ this.createdBy = creatorId;
+ this.zoomLevel = zoomLevel;
+ this.offset = offset;
+ this.created = new DateTime();
+ this.updated = new DateTime();
+ }
+
+ @Autowired(required = true)
+ public View(String view_id, String title, String description, String uri,
+ String color, String creatorId, double zoomLevel, Point offset, DateTime created) {
+ this(view_id, title, description, uri, color, creatorId, zoomLevel, offset);
+ if(created != null) {
+ this.created= created;
+ }
+ }
+
+ @Override
+ protected String getRawKeyPart() {
+ return this.id+Long.toString(this.getCreated().getMillis());
+ }
+
+ @Override
+ protected String getDefaultId() {
+ return UUID.randomUUID().toString();
+ }
+
+ public DateTime getCreated() {
+ return created;
+ }
+
+ public void setCreated(DateTime created) {
+ this.created = created;
+ }
+
+ public DateTime getUpdated() {
+ return updated;
+ }
+
+ public void setUpdated(DateTime updated) {
+ this.updated = updated;
+ }
+
+ public String getCreatedBy() {
+ return createdBy;
+ }
+
+ public void setCreatedBy(String createdBy) {
+ this.createdBy = createdBy;
+ }
+
+ public double getZoomLevel() {
+ return zoomLevel;
+ }
+
+ public void setZoomLevel(double zoomLevel) {
+ this.zoomLevel = zoomLevel;
+ }
+
+ public Point getOffset() {
+ return offset;
+ }
+
+ public void setOffset(Point offset) {
+ this.offset = offset;
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/EdgesRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,7 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.models.Edge;
+
+public interface EdgesRepository extends IRenkanRepository<Edge, String> {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.Group;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+public interface GroupsRepository extends IRenkanRepository<Group, String>, GroupsRepositoryCustom {
+
+ public List<Group> findByTitle(String title);
+
+ public Page<Group> findByTitle(String title, Pageable p);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,17 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+
+public interface GroupsRepositoryCustom {
+ /**
+ * Set the list of user for the group
+ * @param group: the group.
+ * @param userIds: the collection of user ids. This parameter must not be null.
+ */
+ public void setUsersList(Group group, Collection<String> userIds);
+ public Map<String, User> getUsersMap(Group group);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,66 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.IteratorUtils;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class GroupsRepositoryImpl implements GroupsRepositoryCustom {
+
+ @Autowired
+ private UsersRepository usersRepository;
+
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+ @Override
+ // TODO: implement a transaction mecanism...
+ public void setUsersList(Group group, Collection<String> userIds) {
+
+ assert userIds != null : "list of user ids must not be null";
+
+ // takes previous user list
+ List<String> oldUsers = new ArrayList<>(group.getUsers());
+
+ // calculate difference between two list
+ List<String> userIdDel = new ArrayList<>(oldUsers);
+ userIdDel.removeAll(userIds);
+
+ List<String> userIdAdd = new ArrayList<>(userIds);
+ userIdAdd.removeAll(oldUsers);
+
+ List<User> userAdd = IteratorUtils.toList(this.usersRepository.findAll(userIdAdd).iterator());
+ for (User user : userAdd) {
+ user.addGroup(group.getId());
+ }
+ this.usersRepository.save(userAdd);
+ List<User> userDel = IteratorUtils.toList(this.usersRepository.findAll(userIdDel).iterator());
+ for (User user : userDel) {
+ user.removeGroup(group.getId());
+ }
+ this.usersRepository.save(userDel);
+
+ group.getUsers().clear();
+ group.getUsers().addAll(userIds);
+
+ this.groupsRepository.save(group);
+ }
+
+ @Override
+ public Map<String, User> getUsersMap(Group group) {
+ HashMap<String, User> res = new HashMap<>(group.getUsers().size());
+
+ for (User user : this.usersRepository.findAll(group.getUsers())) {
+ res.put(user.getId(), user);
+ }
+
+ return res;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/IRenkanRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,13 @@
+package org.iri_research.renkan.repositories;
+
+import java.io.Serializable;
+
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import com.mongodb.DBCollection;
+
+public interface IRenkanRepository<T, ID extends Serializable> extends
+ PagingAndSortingRepository<T, ID> {
+
+ public DBCollection getCollection();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/NodesRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,7 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.models.Node;
+
+public interface NodesRepository extends IRenkanRepository<Node, String> {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,10 @@
+package org.iri_research.renkan.repositories;
+
+import org.bson.types.ObjectId;
+import org.iri_research.renkan.models.ProjectRevision;
+
+public interface ProjectRevisionsRepository extends
+ IRenkanRepository<ProjectRevision, ObjectId>,
+ ProjectRevisionsRepositoryCustom {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepositoryCustom.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,10 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectRevision;
+
+public interface ProjectRevisionsRepositoryCustom {
+
+ public ProjectRevision getProjectRevision(Project project, int revision);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepositoryImpl.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,22 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.Date;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectRevision;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ProjectRevisionsRepositoryImpl implements
+ ProjectRevisionsRepositoryCustom {
+
+ @Override
+ public ProjectRevision getProjectRevision(Project project, int revision) {
+ ProjectRevision pr = new ProjectRevision(project.getTitle(),
+ project.getDescription(), project.getUri(), project, revision,
+ new Date(System.currentTimeMillis()));
+
+ return pr;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,9 @@
+package org.iri_research.renkan.repositories;
+
+import org.bson.types.ObjectId;
+import org.iri_research.renkan.models.ProjectSync;
+
+public interface ProjectSyncsRepository extends
+ IRenkanRepository<ProjectSync, ObjectId>, ProjectSyncsRepositoryCustom {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryCustom.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectSync;
+
+public interface ProjectSyncsRepositoryCustom {
+
+ public ProjectSync getProjectSync(String data, Project project, String user)
+ throws RenkanException;
+
+ public ProjectSync getProjectSync(String data, String project_id,
+ String user) throws RenkanException;
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryImpl.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,52 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectSync;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ProjectSyncsRepositoryImpl implements ProjectSyncsRepositoryCustom {
+
+ @Autowired
+ private ProjectsRepository projectRepository;
+
+ @Override
+ public ProjectSync getProjectSync(String data, Project project, String user)
+ throws RenkanException {
+
+ if (project == null) {
+ throw new RenkanException("ProjectSyncsRepository : Null Project.");
+ }
+
+ ProjectSync ps = new ProjectSync(null, data, project,
+ this.projectRepository.getRevCounter(project.getId()),
+ new DateTime(), user);
+
+ return ps;
+ }
+
+ @Override
+ public ProjectSync getProjectSync(String data, String project_id,
+ String user) throws RenkanException {
+
+ if (project_id == null || "".equals(project_id)) {
+ throw new RenkanException(
+ "ProjectSyncsRepository : Null or empty project id.");
+ }
+
+ Project p = this.projectRepository.findOne(project_id);
+
+ if (p == null) {
+ throw new RenkanException(
+ "ProjectSyncsRepository : project not found for id "
+ + project_id);
+ }
+
+ return this.getProjectSync(data, p, user);
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,23 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.Project;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.mongodb.repository.Query;
+
+public interface ProjectsRepository extends IRenkanRepository<Project, String>,
+ ProjectsRepositoryCustom {
+
+ List<Project> findBySpaceId(String spaceId);
+
+ Page<Project> findBySpaceId(String spaceId, Pageable p);
+
+ @Query("{ 'space_id' : ?0, 'title' : { '$regex':?1, '$options': 'i'} }")
+ List<Project> findBySpaceIdAndTitleRegex(String spaceId, String title);
+
+ @Query("{ 'space_id' : ?0, 'title' : { '$regex':?1, '$options': 'i'} }")
+ Page<Project> findBySpaceIdAndTitleRegex(String spaceId, String title,
+ Pageable p);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.iri_research.renkan.models.Project;
+
+public interface ProjectsRepositoryCustom {
+
+ public int getRevCounter(String projectId);
+
+ public Map<String, Integer> getCountBySpace();
+
+ public Map<String, Integer> getCountBySpace(Collection<String> spaceIds);
+
+ public Map<String, Integer> getCountByUser();
+
+ public Map<String, Integer> getCountByUser(Collection<String> userIds);
+
+ public Map<String, Integer> getCountByUsername();
+
+ public Map<String, Integer> getCountByUsername(Collection<String> usernames);
+
+ public void deleteRecursive(String projectId);
+
+ public void deleteRecursive(Project project);
+
+ public void deleteRecursive(Iterable<? extends Project> projects);
+
+ public Project copy(Project p, String newTitle);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,229 @@
+package org.iri_research.renkan.repositories;
+
+import static org.springframework.data.mongodb.core.query.Criteria.where;
+import static org.springframework.data.mongodb.core.query.Query.query;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectRevision;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.mapreduce.GroupBy;
+import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Component;
+
+import com.mongodb.AggregationOutput;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBObject;
+
+@Component
+public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom {
+
+ @SuppressWarnings("unused")
+ private final Logger logger = LoggerFactory
+ .getLogger(ProjectsRepositoryImpl.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @Autowired
+ private NodesRepository nodesRepository;
+
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ @Autowired
+ private ProjectRevisionsRepository projectRevisionsRepository;
+
+ private class GroupSpaceResult {
+ public String space_id;
+ public int count;
+ }
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ @Override
+ public int getRevCounter(String projectId) {
+ Project p = this.mongoTemplate.findAndModify(
+ query(where("id").is(projectId)),
+ new Update().inc("rev_counter", 1), Project.class);
+
+ if (p == null) {
+ return -1;
+ }
+ return p.getRevCounter();
+ }
+
+ @Override
+ public Map<String, Integer> getCountBySpace(Collection<String> spaceIds) {
+
+ Criteria filter = null;
+
+ if (spaceIds != null) {
+ filter = Criteria.where("space_id").in(spaceIds);
+ }
+
+ GroupByResults<GroupSpaceResult> groupResult = this.mongoTemplate
+ .group(filter,
+ this.mongoTemplate.getCollectionName(Project.class),
+ GroupBy.key("space_id")
+ .initialDocument("{ count: 0 }")
+ .reduceFunction(
+ "function(doc, prev) { prev.count += 1; }"),
+ GroupSpaceResult.class);
+
+ HashMap<String, Integer> res = new HashMap<>();
+ for (GroupSpaceResult gr : groupResult) {
+ res.put(gr.space_id, new Integer(gr.count));
+ }
+
+ return res;
+
+ }
+
+ @Override
+ public Map<String, Integer> getCountBySpace() {
+ return this.getCountBySpace(null);
+ }
+
+ @Override
+ public Project copy(Project p, String newTitle) {
+
+ Project res = new Project(p);
+ res.setTitle(newTitle);
+ this.nodesRepository.save(res.getNodes());
+ this.edgesRepository.save(res.getEdges());
+
+ return this.projectsRepository.save(res);
+ }
+
+ @Override
+ public void deleteRecursive(String projectId) {
+ this.deleteRecursive(this.projectsRepository.findOne(projectId));
+ }
+
+ @Override
+ public void deleteRecursive(Project project) {
+ this.deleteRecursive(Arrays.asList(new Project[] { project }));
+ }
+
+ @Override
+ public void deleteRecursive(Iterable<? extends Project> projects) {
+
+ for (Project p : projects) {
+ if (p == null) {
+ continue;
+ }
+
+ ProjectRevision pr = this.projectRevisionsRepository
+ .getProjectRevision(p,
+ this.projectsRepository.getRevCounter(p.getId()));
+ this.projectRevisionsRepository.save(pr);
+
+ // delete edges
+ this.edgesRepository.delete(p.getEdges());
+ // delete nodes
+ this.nodesRepository.delete(p.getNodes());
+ // delete project
+ this.projectsRepository.delete(p);
+ }
+ }
+
+ @Override
+ public Map<String, Integer> getCountByUser() {
+ return getCountByUser(null);
+ }
+
+ @Override
+ public Map<String, Integer> getCountByUser(Collection<String> userIds) {
+
+ Criteria filter = null;
+
+ if (userIds != null) {
+ filter = Criteria.where("users.user_id").in(userIds);
+ }
+
+ DBObject projectOp = new BasicDBObject("$project", new BasicDBObject(
+ "users", 1));
+ DBObject unwindOp = new BasicDBObject("$unwind", "$users");
+ DBObject groupOpFields = new BasicDBObject("_id", "$users.user_id");
+ groupOpFields.put("count", new BasicDBObject("$sum", 1));
+ DBObject groupOp = new BasicDBObject("$group", groupOpFields);
+ DBObject matchOp = null;
+ if (filter != null) {
+ matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
+ }
+
+ AggregationOutput output = null;
+ if (filter != null) {
+ output = this.projectsRepository.getCollection().aggregate(matchOp,
+ projectOp, unwindOp, matchOp, groupOp);
+ } else {
+ output = this.projectsRepository.getCollection().aggregate(
+ projectOp, unwindOp, groupOp);
+ }
+
+ HashMap<String, Integer> res = new HashMap<>();
+
+ for (DBObject groupRes : output.results()) {
+ res.put((String) groupRes.get("_id"),
+ (Integer) groupRes.get("count"));
+ }
+
+ return res;
+ }
+
+ @Override
+ public Map<String, Integer> getCountByUsername() {
+ return this.getCountByUsername(null);
+ }
+
+ @Override
+ public Map<String, Integer> getCountByUsername(Collection<String> usernames) {
+
+ Criteria filter = null;
+
+ if (usernames != null) {
+ filter = Criteria.where("users.username").in(usernames);
+ }
+
+ DBObject projectOp = new BasicDBObject("$project", new BasicDBObject(
+ "users", 1));
+ DBObject unwindOp = new BasicDBObject("$unwind", "$users");
+ DBObject groupOpFields = new BasicDBObject("_id", "$users.username");
+ groupOpFields.put("count", new BasicDBObject("$sum", 1));
+ DBObject groupOp = new BasicDBObject("$group", groupOpFields);
+ DBObject matchOp = null;
+ if (filter != null) {
+ matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
+ }
+
+ AggregationOutput output = null;
+ if (filter != null) {
+ output = this.projectsRepository.getCollection().aggregate(matchOp,
+ projectOp, unwindOp, matchOp, groupOp);
+ } else {
+ output = this.projectsRepository.getCollection().aggregate(
+ projectOp, unwindOp, groupOp);
+ }
+
+ HashMap<String, Integer> res = new HashMap<>();
+
+ for (DBObject groupRes : output.results()) {
+ res.put((String) groupRes.get("_id"),
+ (Integer) groupRes.get("count"));
+ }
+
+ return res;
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+package org.iri_research.renkan.repositories;
+
+import java.io.Serializable;
+
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
+import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
+
+import com.mongodb.DBCollection;
+
+public class RenkanRepository<T, ID extends Serializable> extends
+ SimpleMongoRepository<T, ID> implements IRenkanRepository<T, ID> {
+
+ public RenkanRepository(MongoEntityInformation<T, ID> metadata,
+ MongoOperations mongoOperations) {
+ super(metadata, mongoOperations);
+ }
+
+ @Override
+ public DBCollection getCollection() {
+ return this.getMongoOperations().getCollection(
+ this.getEntityInformation().getCollectionName());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryException.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+package org.iri_research.renkan.repositories;
+
+public class RenkanRepositoryException extends Exception {
+
+ private static final long serialVersionUID = -7433823426870169568L;
+
+ public RenkanRepositoryException(String message) {
+ super(message);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryFactory.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,54 @@
+package org.iri_research.renkan.repositories;
+
+import java.io.Serializable;
+
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
+import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
+import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
+import org.springframework.data.repository.core.RepositoryMetadata;
+
+public class RenkanRepositoryFactory extends MongoRepositoryFactory {
+
+ private MongoOperations mongoOperations;
+
+ public RenkanRepositoryFactory(MongoOperations mongoOperations) {
+ super(mongoOperations);
+ this.mongoOperations = mongoOperations;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.springframework.data.repository.core.support.RepositoryFactorySupport
+ * #getTargetRepository(org.springframework.data.repository.core.
+ * RepositoryMetadata)
+ */
+ @Override
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected Object getTargetRepository(RepositoryMetadata metadata) {
+
+ Object res = super.getTargetRepository(metadata);
+
+ if (SimpleMongoRepository.class.equals(res.getClass())) {
+ MongoEntityInformation<?, Serializable> entityInformation = this
+ .getEntityInformation(metadata.getDomainType());
+ return new RenkanRepository(entityInformation, this.mongoOperations);
+ } else {
+ return res;
+ }
+
+ }
+
+ @Override
+ protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
+ Class<?> res = super.getRepositoryBaseClass(metadata);
+ if (SimpleMongoRepository.class.equals(res)) {
+ return RenkanRepository.class;
+ } else {
+ return res;
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryFactoryBean.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,19 @@
+package org.iri_research.renkan.repositories;
+
+import java.io.Serializable;
+
+import org.springframework.data.mongodb.core.MongoOperations;
+import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
+import org.springframework.data.repository.Repository;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
+
+public class RenkanRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
+ extends MongoRepositoryFactoryBean<T, S, ID> {
+
+ @Override
+ protected RepositoryFactorySupport getFactoryInstance(
+ MongoOperations operations) {
+ return new RenkanRepositoryFactory(operations);
+ }
+
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/SpacesRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,7 @@
+package org.iri_research.renkan.repositories;
+
+import org.iri_research.renkan.models.Space;
+
+public interface SpacesRepository extends IRenkanRepository<Space, String> {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.User;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+public interface UsersRepository extends IRenkanRepository<User, String>, UsersRepositoryCustom {
+
+ public List<User> findByTitle(String title);
+
+ public Page<User> findByTitle(String title, Pageable p);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,17 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.Collection;
+import java.util.Map;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+
+public interface UsersRepositoryCustom {
+ /**
+ * Set the users group list.
+ * @param user : the user
+ * @param groupIds : the list of group ids. this parameter must not be null.
+ */
+ public void setGroupsList(User user, Collection<String> groupIds);
+ public Map<String, Group> getGroupsMap(User user);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,66 @@
+package org.iri_research.renkan.repositories;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.IteratorUtils;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class UsersRepositoryImpl implements UsersRepositoryCustom {
+
+ @Autowired
+ private UsersRepository usersRepository;
+
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+ @Override
+ // TODO: implement a transaction mecanism...
+ public void setGroupsList(User user, Collection<String> groupIds) {
+
+ assert groupIds != null : "list of group ids must not be null";
+
+ // takes previous user list
+ List<String> oldGroups = new ArrayList<>(user.getGroups());
+
+ // calculate difference between two list
+ List<String> groupIdDel = new ArrayList<>(oldGroups);
+ groupIdDel.removeAll(groupIds);
+
+ List<String> groupIdAdd = new ArrayList<>(groupIds);
+ groupIdAdd.removeAll(oldGroups);
+
+ List<Group> groupAdd = IteratorUtils.toList(this.groupsRepository.findAll(groupIdAdd).iterator());
+ for (Group group : groupAdd) {
+ group.addUser(user);
+ }
+ this.groupsRepository.save(groupAdd);
+ List<Group> groupDel = IteratorUtils.toList(this.groupsRepository.findAll(groupIdDel).iterator());
+ for (Group group : groupDel) {
+ group.removeUser(user);
+ }
+ this.groupsRepository.save(groupDel);
+
+ user.getGroups().clear();
+ user.getGroups().addAll(groupIds);
+
+ this.usersRepository.save(user);
+ }
+
+ @Override
+ public Map<String, Group> getGroupsMap(User user) {
+ HashMap<String, Group> res = new HashMap<>(user.getGroups().size());
+
+ for (Group group : this.groupsRepository.findAll(user.getGroups())) {
+ res.put(group.getId(), group);
+ }
+
+ return res;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/utils/ColorGenerator.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+package org.iri_research.renkan.utils;
+
+import java.awt.Color;
+import java.util.Random;
+
+public class ColorGenerator {
+
+ public static Color randomColor() {
+
+ Random rand = new Random();
+
+ float r = rand.nextFloat() * 0.5f + 0.5f;
+ float g = rand.nextFloat() * 0.5f + 0.5f;
+ float b = rand.nextFloat() * 0.5f + 0.5f;
+
+ return new Color(r, g, b);
+ }
+
+ public static String randomColorHex() {
+ Color resColor = ColorGenerator.randomColor();
+ return Integer.toHexString(resColor.getRGB());
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/utils/RenkanLogger.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+package org.iri_research.renkan.utils;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+@Retention(RUNTIME)
+@Target(FIELD)
+@Documented
+public @interface RenkanLogger {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/main/java/org/iri_research/renkan/utils/RenkanLoggerInjector.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,38 @@
+package org.iri_research.renkan.utils;
+
+import java.lang.reflect.Field;
+
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.ReflectionUtils.FieldCallback;
+
+@Component
+public class RenkanLoggerInjector implements BeanPostProcessor {
+
+ @Override
+ public Object postProcessBeforeInitialization(final Object bean,
+ String beanName) throws BeansException {
+ ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
+ public void doWith(Field field) throws IllegalArgumentException,
+ IllegalAccessException {
+ // make the field accessible if defined private
+ ReflectionUtils.makeAccessible(field);
+ if (field.getAnnotation(RenkanLogger.class) != null) {
+ org.slf4j.Logger logger = LoggerFactory.getLogger(bean
+ .getClass());
+ field.set(bean, logger);
+ }
+ }
+ });
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName)
+ throws BeansException {
+ return bean;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,391 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class GroupsRepositoryTest {
+
+ private final static int USER_NB = 3;
+ private final static int GROUP_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(GroupsRepositoryTest.class);
+
+ @Autowired
+ private UsersRepository usersRepository;
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
+ private List<String> usersUuids = new ArrayList<>(USER_NB);
+
+ private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
+ private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
+
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ usersRepository.deleteAll();
+ for(int i=0; i < USER_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+ user.setLocked(false);
+ user.setEnabled(true);
+ user.setAvatar("A pretty picture");
+ user.setExpirationDate(new LocalDate());
+ user.setCredentialsExpirationDate(new LocalDate());
+ user.setEmail(String.format("user%d@mail.com", i));
+ user = usersRepository.save(user);
+ this.usersUuids.add(uuid);
+ this.usersList.put(uuid, user);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for(int i=0; i < GROUP_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
+ group.setAvatar("A pretty group picture " + i);
+ group = groupsRepository.save(group);
+ this.groupsUuids.add(uuid);
+ this.groupsList.put(uuid, group);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ }
+
+ @Test
+ public void testGroupFieldMapping() {
+ // query json directly with mongodb driver
+ // check field values
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Group.class));
+
+ for (DBObject obj : coll.find()) {
+ Assert.assertTrue("mongo object must have _id field",
+ obj.containsField("_id"));
+
+ String id = obj.get("_id").toString();
+
+ Group group = this.groupsList.get(id);
+
+ Assert.assertTrue("mongo object must have title field",
+ obj.containsField("title"));
+ Assert.assertEquals("Titles must be the same",
+ group.getTitle(), obj.get("title"));
+
+ Assert.assertTrue("mongo object must have description field",
+ obj.containsField("description"));
+ Assert.assertEquals("description must be the same",
+ group.getDescription(), obj.get("description"));
+
+ Assert.assertTrue("mongo object must have color field",
+ obj.containsField("color"));
+ Assert.assertEquals("Color must be the same", group.getColor(), obj.get("color"));
+
+ Assert.assertTrue("mongo object must have uri field",
+ obj.containsField("uri"));
+ Assert.assertEquals("Uri must be the same", group.getUri(), obj.get("uri"));
+
+ Assert.assertTrue("mongo object must have avatar field",
+ obj.containsField("avatar"));
+ Assert.assertEquals("Avater must be the same", group.getAvatar(), obj.get("avatar"));
+
+ }
+ }
+
+ @Test
+ public void testSetUsersList() {
+
+ Group group = this.groupsList.get(this.groupsUuids.get(0));
+
+ List<String> userIds = this.usersUuids;
+
+ this.groupsRepository.setUsersList(group, userIds);
+
+ //reload user
+ group = this.groupsRepository.findOne(group.getId());
+
+ Assert.assertEquals("group user list is big enough", userIds.size(), group.getUsers().size());
+ Assert.assertTrue("Group user list contains all users", group.getUsers().containsAll(userIds));
+
+ for (User u : this.usersRepository.findAll(userIds)) {
+ Assert.assertEquals(String.format("user list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ }
+ }
+
+
+ @Test
+ public void testAddUsersList() {
+ Group group = this.groupsList.get(this.groupsUuids.get(1));
+
+ List<String> userIds = this.usersUuids.subList(0, 1);
+ this.groupsRepository.setUsersList(group, userIds);
+
+ group = this.groupsRepository.findOne(group.getId());
+
+ Assert.assertEquals("group users is big enough", userIds.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+
+ User user = this.usersRepository.findOne(userIds.get(0));
+ Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
+ Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+
+ this.groupsRepository.setUsersList(group, this.usersUuids);
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ Assert.assertEquals("group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+
+ for (User u : this.usersRepository.findAll(this.usersUuids)) {
+ Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+ Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ }
+
+ }
+
+ @Test
+ public void testRemoveUsersList() {
+ Group group = this.groupsList.get(this.groupsUuids.get(2));
+
+ this.groupsRepository.setUsersList(group, this.usersUuids);
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+
+ for(User user : this.usersRepository.findAll(this.usersUuids)) {
+ Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
+ Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+ }
+
+ this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ Assert.assertEquals("group user list is big enough", 1, group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
+
+ User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
+ Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+ Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+
+ for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
+ Assert.assertEquals(String.format("group list for user %s must be size 0", otherUser.getId()), 0, otherUser.getGroups().size());
+ }
+
+ }
+
+
+ @Test
+ public void testAddUsersListExisting() {
+
+ // get first group
+ Group group = this.groupsList.get(this.groupsUuids.get(0));
+
+ List<String> userIds = this.usersUuids;
+
+ // set all users for first group
+ this.groupsRepository.setUsersList(group, userIds);
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ //check that group has all users
+ Assert.assertEquals("Group user list is big enough", userIds.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+
+ // and that users have all new group
+ for (User u : this.usersRepository.findAll(userIds)) {
+ Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ }
+
+
+ // get second group
+ group = this.groupsList.get(this.groupsUuids.get(1));
+
+ //first set one user
+ List<String> secondUserIds = this.usersUuids.subList(0, 1);
+ this.groupsRepository.setUsersList(group, secondUserIds);
+
+ // reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ // check that second group has all users
+ Assert.assertEquals("Group user list is big enough", secondUserIds.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all users", group.getUsers().containsAll(secondUserIds));
+
+ // check that group has new and old user
+ User user = this.usersRepository.findOne(secondUserIds.get(0));
+ Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), groupsUuids.get(0)), user.getGroups().contains(groupsUuids.get(0)));
+
+ // set all new users list for second group
+ this.groupsRepository.setUsersList(group, this.usersUuids);
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ //check that group 2 has all users
+ Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
+
+ // check that all users had group 1 and group 2
+ for (User u : this.usersRepository.findAll(this.usersUuids)) {
+ Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), groupsUuids.get(0)), u.getGroups().contains(groupsUuids.get(0)));
+ }
+
+ }
+
+
+ @Test
+ public void testRemoveGroupListExisting() {
+
+ // get first group
+ Group group = this.groupsList.get(this.groupsUuids.get(0));
+
+ List<String> userIds = this.usersUuids;
+
+ // set all users for first group
+ this.groupsRepository.setUsersList(group, userIds);
+
+ //reload group
+ group = this.groupsRepository.findOne(group.getId());
+
+ //check that group has all users
+ Assert.assertEquals("Group users list is big enough", userIds.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
+
+ // and that users have all new group
+ for (User u : this.usersRepository.findAll(userIds)) {
+ Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ }
+
+ // get 3rd group
+ group = this.groupsList.get(this.groupsUuids.get(2));
+
+ // set all users for 3rd group
+ this.groupsRepository.setUsersList(group, this.usersUuids);
+
+ //reload 3rd group
+ group = this.groupsRepository.findOne(group.getId());
+
+ //check that all users are set for 3rd group
+ Assert.assertEquals("Group users list is big enough", this.usersUuids.size(), group.getUsers().size());
+ Assert.assertTrue("User list contains all users", group.getUsers().containsAll(this.usersUuids));
+
+ //check that all users has 3rd group and 1st group
+ for(User user : this.usersRepository.findAll(this.usersUuids)) {
+ Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), this.groupsUuids.get(0)), user.getGroups().contains(this.groupsUuids.get(0)));
+ }
+
+ //set new user list for 3rd group
+ this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
+
+ //reload 3rd group
+ group = this.groupsRepository.findOne(group.getId());
+
+ //check that 3rd group has only one user (last user)
+ Assert.assertEquals("Group users list is big enough", 1, group.getUsers().size());
+ Assert.assertTrue("User list contains all users", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
+
+ // check that last user has 3rd and 1rst group
+ User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
+ Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), this.groupsUuids.get(0)), u.getGroups().contains(this.groupsUuids.get(0)));
+
+ // check that other users has only 1rst group
+ for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
+ Assert.assertEquals(String.format("Group list for user %s must be size 0", otherUser.getId()), 1, otherUser.getGroups().size());
+ Assert.assertTrue(String.format("Group list for user %s must contains group %s", otherUser.getId(), this.groupsUuids.get(0)), otherUser.getGroups().contains(this.groupsUuids.get(0)));
+ }
+
+ }
+
+ @Test
+ public void testGetUsersMap() {
+
+ Group group = this.groupsList.get(this.groupsUuids.get(0));
+
+ List<String> userIds = this.usersUuids;
+
+ this.groupsRepository.setUsersList(group, userIds);
+
+
+ Map<String, User> usersMap = this.groupsRepository.getUsersMap(group);
+
+ Assert.assertEquals ("user map should have same length than users list", this.usersUuids.size(), usersMap.size());
+ Assert.assertTrue("user map should contains all uuids", this.usersUuids.containsAll(usersMap.keySet()));
+ for (Entry<String, User> entry : usersMap.entrySet()) {
+ User user = entry.getValue();
+ String userId = entry.getKey();
+ Assert.assertTrue("user id in user uuid", this.usersUuids.contains(userId));
+ Assert.assertEquals("key id and value user id must be the same", userId, user.getId());
+ }
+
+ }
+
+
+ @After
+ public void teardown() {
+ this.usersRepository.deleteAll();
+ this.groupsRepository.deleteAll();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/ProjectSyncsRepositoryTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,177 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectSync;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectSyncsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class ProjectSyncsRepositoryTest {
+
+ private Logger logger = LoggerFactory
+ .getLogger(ProjectSyncsRepositoryTest.class);
+
+ @Autowired
+ private ProjectsRepository projectRepository;
+
+ @Autowired
+ private ProjectSyncsRepository projectSyncsRepository;
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+
+ public ProjectSyncsRepositoryTest() {
+ }
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ Space testSpace = new Space(UUID.randomUUID().toString(), "test",
+ "Test space", null, null, null, "test_user", null, null);
+ testSpace = spacesRepository.save(testSpace);
+ ArrayList<Project> pl = new ArrayList<Project>();
+ pl.add(new Project(testSpace.getId(), null, "test1", "desc1",
+ "http://localhost:8080/rest/projects/id1", new DateTime()));
+ pl.add(new Project(testSpace.getId(), null, "test2", "desc2",
+ "http://localhost:8080/rest/projects/id2", new DateTime()));
+ logger.debug("Setup : new Project ");
+ for (Project p : projectRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+ }
+
+ @After
+ public void teardown() {
+ logger.debug("Teardown");
+ projectRepository.deleteAll();
+ projectSyncsRepository.deleteAll();
+ }
+
+ @Test
+ public void testGetCollection() {
+ String collectionName = this.projectSyncsRepository.getCollection()
+ .getName();
+
+ Assert.assertEquals("The collection name should be projectSyncs",
+ "projectSyncs", collectionName);
+
+ }
+
+ @Test
+ public void testGetProjectSync() throws RenkanException {
+
+ Project p = projectRepository.findOne(this.testProjects.get(0).getId());
+
+ String data = "{\"example\":\"this is an example\"}";
+
+ ProjectSync ps = projectSyncsRepository
+ .getProjectSync(data, p, "user1");
+
+ ps = this.projectSyncsRepository.save(ps);
+
+ ps = this.projectSyncsRepository.findOne(ps.getId());
+
+ Assert.assertNotNull(ps);
+ Assert.assertEquals(data, ps.getData());
+
+ }
+
+ @Test
+ public void testGetProjectSyncRevision() throws RenkanException {
+
+ Project p = projectRepository.findOne(this.testProjects.get(0).getId());
+
+ String data = "{\"example\":\"this is an example\"}";
+
+ ProjectSync ps = projectSyncsRepository
+ .getProjectSync(data, p, "user1");
+
+ ps = this.projectSyncsRepository.save(ps);
+ ps = this.projectSyncsRepository.findOne(ps.getId());
+
+ p = projectRepository.findOne(this.testProjects.get(0).getId());
+
+ Assert.assertNotNull(ps.getProject());
+ Assert.assertEquals(p.getId(), ps.getProject().getId());
+ Assert.assertEquals(
+ "Revision of the project sync mustbe one less tha the rev counter pf the project",
+ p.getRevCounter() - 1, ps.getRevision());
+
+ Assert.assertEquals(
+ "Revision of the project sync mustbe one less tha the rev counter of its project",
+ ps.getProject().getRevCounter() - 1, ps.getRevision());
+
+ }
+
+ @Test(expected = RenkanException.class)
+ public void testGetProjectSyncExceptionNullProject() throws RenkanException {
+
+ String data = "{\"example\":\"this is an example\"}";
+ Project p = null;
+ ProjectSync ps = projectSyncsRepository
+ .getProjectSync(data, p, "user1");
+
+ // should never be executed.
+ Assert.assertNull(ps);
+ }
+
+ @Test(expected = RenkanException.class)
+ public void testGetProjectSyncExceptionNullId() throws RenkanException {
+
+ String data = "{\"example\":\"this is an example\"}";
+ String project_id = null;
+ ProjectSync ps = projectSyncsRepository.getProjectSync(data,
+ project_id, "user1");
+
+ // should never be executed.
+ Assert.assertNull(ps);
+ }
+
+ @Test(expected = RenkanException.class)
+ public void testGetProjectSyncExceptionEmptyId() throws RenkanException {
+
+ String data = "{\"example\":\"this is an example\"}";
+ String project_id = "";
+ ProjectSync ps = projectSyncsRepository.getProjectSync(data,
+ project_id, "user1");
+
+ // should never be executed.
+ Assert.assertNull(ps);
+ }
+
+ @Test(expected = RenkanException.class)
+ public void testGetProjectSyncExceptionBadId() throws RenkanException {
+
+ String data = "{\"example\":\"this is an example\"}";
+ String project_id = "BAD_ID";
+ ProjectSync ps = projectSyncsRepository.getProjectSync(data,
+ project_id, "user1");
+
+ // should never be executed.
+ Assert.assertNull(ps);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,696 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectRevision;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.ProjectRevisionsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.iri_research.renkan.utils.ColorGenerator;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+import com.mongodb.DBRef;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class ProjectsRepositoryTest {
+
+ private final static int SPACE_NB = 3;
+
+ private Logger logger = LoggerFactory
+ .getLogger(ProjectsRepositoryTest.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @Autowired
+ private NodesRepository nodesRepository;
+
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ @Autowired
+ private UsersRepository usersRepository;
+
+ @Autowired
+ private ProjectRevisionsRepository projectRevisionsRepository;
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+ private List<Node> testNodes = new ArrayList<>();
+ private List<Edge> testEdges = new ArrayList<>();
+ private List<User> testUsers = new ArrayList<>();
+
+ private DateTime creationDate = new DateTime();
+
+ private List<String> spaceIds = new ArrayList<>();
+
+ private Project copyProject;
+
+ public ProjectsRepositoryTest() {
+ }
+
+ @Before
+ public void setup() {
+
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ logger.debug("Setup");
+
+ // CREATE USERS
+ for (int i = 0; i < SPACE_NB + 1; i++) {
+ this.testUsers.add(new User(UUID.randomUUID().toString(),
+ "test_user" + (i + 1), "Test user " + (i + 1),
+ "http://www.iri.centrepompidou.fr/users/test_user"
+ + (i + 1), "#" + ColorGenerator.randomColorHex()));
+ }
+ usersRepository.save(this.testUsers);
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ Space testSpace = null;
+ for (int i = 0; i < SPACE_NB; i++) {
+ spaceIds.add(UUID.randomUUID().toString());
+ testSpace = new Space(this.spaceIds.get(i), "test space " + i,
+ "Test space " + i, null, null, null, "test_user", null,
+ this.creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ final Project project = new Project(testSpace.getId(), UUID
+ .randomUUID().toString(), "test project "
+ + ((SPACE_NB - 1) * i + j + 1), "desc"
+ + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1),
+ this.creationDate);
+ pl.add(project);
+ }
+ }
+
+ for (int i = 0; i < testUsers.size() - 1; i++) {
+ User u = this.testUsers.get(i);
+ for (int j = 0; j < pl.size(); j++) {
+ Project p = pl.get(j);
+ if (j < pl.size() - i) {
+ p.addUser(u);
+ } else {
+ p.addUser(null, null);
+ }
+
+ }
+ }
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+ copyProject = this.testProjects.get(0);
+
+ for (int i = 0; i < 3; i++) {
+ Node node = new Node("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/nodes/node" + i, "#ffff0" + i,
+ "test_user", new Point(0, i),
+ "http://renkan.org/images/node" + i, i, copyProject.getId());
+ node = this.nodesRepository.save(node);
+ copyProject.getNodes().add(node);
+ this.testNodes.add(node);
+ }
+ for (int i = 0; i < 3; i++) {
+ Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/edges/edge" + i, "#ffff0" + i,
+ this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
+ "test_user", copyProject.getId());
+ edge = this.edgesRepository.save(edge);
+ copyProject.getEdges().add(edge);
+ this.testEdges.add(edge);
+ }
+
+ this.projectsRepository.save(copyProject);
+
+ }
+
+ @After
+ public void teardown() {
+ logger.debug("Teardown");
+ edgesRepository.deleteAll();
+ nodesRepository.deleteAll();
+ projectRevisionsRepository.deleteAll();
+ projectsRepository.deleteAll();
+ spacesRepository.deleteAll();
+ usersRepository.deleteAll();
+ }
+
+ @Test
+ public void testInitialRevCounter() {
+
+ Project p = projectsRepository
+ .findOne(this.testProjects.get(0).getId());
+
+ Assert.assertEquals("Initial rev counter should be 1", 1,
+ p.getRevCounter());
+ }
+
+ @Test
+ public void testIncrementRevCounter() {
+
+ int revCounter = projectsRepository.getRevCounter(this.testProjects
+ .get(0).getId());
+ Assert.assertEquals("After 1 call rev counter should be 1", 1,
+ revCounter);
+ revCounter = projectsRepository.getRevCounter(this.testProjects.get(0)
+ .getId());
+ Assert.assertEquals("After 2 calls rev counter should be 2", 2,
+ revCounter);
+
+ for (int i = 0; i < 10; i++) {
+ revCounter = projectsRepository.getRevCounter(this.testProjects
+ .get(0).getId());
+ }
+
+ Assert.assertEquals("After 10 more calls rev counter should be 12", 12,
+ revCounter);
+
+ Project p = projectsRepository
+ .findOne(this.testProjects.get(0).getId());
+
+ Assert.assertEquals("next rev counter should be 13", 13,
+ p.getRevCounter());
+
+ p = projectsRepository.findOne(this.testProjects.get(1).getId());
+
+ Assert.assertEquals("other project next rev counter should be 1", 1,
+ p.getRevCounter());
+
+ }
+
+ @Test
+ public void testIncrementNonExisting() {
+
+ int revCounter = projectsRepository.getRevCounter("aaaa");
+ Assert.assertEquals("Rev counter non existing == -1", -1, revCounter);
+
+ }
+
+ @Test
+ public void testIncrementNull() {
+
+ int revCounter = projectsRepository.getRevCounter(null);
+ Assert.assertEquals("Rev counter null == -1", -1, revCounter);
+
+ }
+
+ @Test
+ public void testIncrementEmpty() {
+
+ int revCounter = projectsRepository.getRevCounter("");
+ Assert.assertEquals("Rev counter empty == -1", -1, revCounter);
+
+ }
+
+ @Test
+ public void testDateCreation() {
+
+ for (Project p : projectsRepository.findAll()) {
+ Assert.assertEquals(this.creationDate, p.getCreated());
+ }
+ }
+
+ @Test
+ public void testGetCountBySpace() {
+
+ Map<String, Integer> groupRes = projectsRepository.getCountBySpace();
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", SPACE_NB - 1, groupRes.size());
+
+ for (int i = 0; i < (SPACE_NB - 1); i++) {
+ Integer count = groupRes.get(this.spaceIds.get(i));
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of project/space", 2 - i, count.intValue());
+ }
+
+ Assert.assertNull("Last space id has no project i.e count is null",
+ groupRes.get(this.spaceIds.get(SPACE_NB - 1)));
+ }
+
+ @Test
+ public void testGetCountBySpaceFilter() {
+
+ List<String> spacesIdsFilter = Arrays.asList(this.spaceIds.get(0));
+
+ Map<String, Integer> groupRes = projectsRepository
+ .getCountBySpace(spacesIdsFilter);
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", 1, groupRes.size());
+
+ Integer count = groupRes.get(this.spaceIds.get(0));
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of project/space", 2, count.intValue());
+
+ for (int i = 1; i < SPACE_NB; i++) {
+ Assert.assertNull(
+ "other space id has no project i.e count is null",
+ groupRes.get(this.spaceIds.get(i)));
+ }
+ }
+
+ @Test
+ public void testGetCountByUser() {
+
+ Map<String, Integer> groupRes = projectsRepository.getCountByUser();
+ int nu = this.testUsers.size();
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", nu, groupRes.size());
+
+ for (int i = 0; i < nu - 1; i++) {
+ Integer count = groupRes.get(this.testUsers.get(i).getId());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size() - i,
+ count.intValue());
+ }
+ Assert.assertNull("Last user id has no project i.e count is null",
+ groupRes.get(this.testUsers.get(nu - 1).getId()));
+
+ Integer count = groupRes.get(null);
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of anonymous user/project", (nu - 1) * (nu - 2)
+ / 2, count.intValue());
+ }
+
+ @Test
+ public void testGetCountByUserFilter() {
+
+ List<String> userIdsFilter = Arrays.asList(this.testUsers.get(0)
+ .getId());
+
+ Map<String, Integer> groupRes = projectsRepository
+ .getCountByUser(userIdsFilter);
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", 1, groupRes.size());
+
+ Integer count = groupRes.get(this.testUsers.get(0).getId());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size(),
+ count.intValue());
+
+ }
+
+ @Test
+ public void testGetCountByUsername() {
+
+ Map<String, Integer> groupRes = projectsRepository.getCountByUsername();
+ int nu = this.testUsers.size() - 1;
+ int nb_username = this.testUsers.size() + (SPACE_NB - 1) * SPACE_NB / 2
+ - 2;
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", nb_username, groupRes.size());
+
+ for (int i = 0; i < nu - 1; i++) {
+ Integer count = groupRes.get(this.testUsers.get(i).getUsername());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size() - i,
+ count.intValue());
+ }
+ Assert.assertNull("Last user id has no project i.e count is null",
+ groupRes.get(this.testUsers.get(nu).getUsername()));
+
+ for (int i = 1; i < nu; i++) {
+ String anonymous_username = String.format("Anonymous-%d", i);
+ Integer count = groupRes.get(anonymous_username);
+ Assert.assertEquals("Nb of anonymous user/project", nu - i,
+ count.intValue());
+ }
+
+ }
+
+ @Test
+ public void testGetCountByUsernameFilter() {
+
+ List<String> usernamesFilter = Arrays.asList(this.testUsers.get(0)
+ .getUsername());
+
+ Map<String, Integer> groupRes = projectsRepository
+ .getCountByUsername(usernamesFilter);
+
+ Assert.assertNotNull("GroupRes not null", groupRes);
+ Assert.assertEquals("Group res size", 1, groupRes.size());
+
+ Integer count = groupRes.get(this.testUsers.get(0).getUsername());
+ Assert.assertNotNull("count not null", count);
+ Assert.assertEquals("Nb of user/project", testProjects.size(),
+ count.intValue());
+
+ }
+
+ @Test
+ public void testCopyProjectCreation() {
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Project.class));
+
+ DBObject filter = new BasicDBObject();
+ filter.put("_id", copyProject.getId());
+
+ DBCursor resFind = coll.find(filter);
+
+ Assert.assertEquals("The project must be found", 1, resFind.count());
+
+ for (DBObject obj : coll.find(filter)) {
+ Assert.assertEquals("id must be equal", copyProject.getId(),
+ obj.get("_id"));
+ }
+ }
+
+ @Test
+ public void testCopyProjectCopy() {
+
+ Project newProject = this.projectsRepository.copy(this.copyProject,
+ "copy_project");
+
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Project.class));
+
+ DBObject filter = new BasicDBObject();
+ filter.put("_id", newProject.getId());
+
+ DBCursor resFind = coll.find(filter);
+
+ Assert.assertEquals("The project must be found", 1, resFind.count());
+
+ for (DBObject obj : resFind) {
+ Assert.assertEquals("id must be equal", newProject.getId(),
+ obj.get("_id"));
+ Assert.assertEquals("title must be must be copy_project",
+ "copy_project", obj.get("title"));
+ Assert.assertEquals(
+ "space_id must be must be same than copyProject",
+ this.copyProject.getSpaceId(), obj.get("space_id"));
+ }
+
+ filter = new BasicDBObject();
+ filter.put("project_id", newProject.getId());
+
+ DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Node.class));
+ resFind = nodesColl.find(filter);
+
+ Assert.assertEquals("Must have 3 nodes", this.copyProject.getNodes()
+ .size(), resFind.count());
+
+ for (DBObject obj : resFind) {
+ // find node with same title in copy project
+ Node originalNode = null;
+ for (Node n : this.copyProject.getNodes()) {
+ if (n.getTitle().equals(obj.get("title"))) {
+ originalNode = n;
+ break;
+ }
+ }
+
+ Assert.assertNotNull("Must fincd original Node", originalNode);
+
+ // color, desc, id diff, uri, created_by, image, position, diff
+ // projectif, size
+ Assert.assertNotSame("id must be differents", originalNode.getId(),
+ obj.get("_id"));
+ Assert.assertNotSame("project id must be differents",
+ originalNode.getProjectId(), obj.get("project_id"));
+
+ Assert.assertEquals("same color", originalNode.getColor(),
+ obj.get("color"));
+ Assert.assertEquals("same desc", originalNode.getDescription(),
+ obj.get("description"));
+ Assert.assertEquals("same uri", originalNode.getUri(),
+ obj.get("uri"));
+ Assert.assertEquals("same image", originalNode.getImage(),
+ obj.get("image"));
+ Assert.assertEquals("same position", originalNode.getPosition()
+ .getX(), ((DBObject) obj.get("position")).get("x"));
+ Assert.assertEquals("same position", originalNode.getPosition()
+ .getY(), ((DBObject) obj.get("position")).get("y"));
+ Assert.assertEquals("same size", originalNode.getSize(),
+ obj.get("size"));
+
+ }
+
+ DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Edge.class));
+ resFind = edgesColl.find(filter);
+
+ Assert.assertEquals("Must have 3 edges", this.copyProject.getEdges()
+ .size(), resFind.count());
+
+ for (DBObject obj : resFind) {
+ // find node with same title in copy project
+ Edge originalEdge = null;
+ for (Edge e : this.copyProject.getEdges()) {
+ if (e.getTitle().equals(obj.get("title"))) {
+ originalEdge = e;
+ break;
+ }
+ }
+
+ Assert.assertNotNull("Must find original Node", originalEdge);
+
+ // color, desc, id diff, uri, created_by, image, position, diff
+ // projectif, size
+ Assert.assertFalse("id must be differents", originalEdge.getId()
+ .equals(obj.get("_id")));
+ Assert.assertFalse("project id must be differents", originalEdge
+ .getProjectId().equals(obj.get("project_id")));
+
+ Assert.assertEquals("same color", originalEdge.getColor(),
+ obj.get("color"));
+ Assert.assertEquals("same desc", originalEdge.getDescription(),
+ obj.get("description"));
+ Assert.assertEquals("same uri", originalEdge.getUri(),
+ obj.get("uri"));
+
+ // get FromNode
+ DBObject fromNode = nodesColl.findOne(((DBRef) obj.get("from"))
+ .getId());
+ Assert.assertNotNull("fromNode must exits ", fromNode);
+ Assert.assertFalse("must be different from node", originalEdge
+ .getFrom().equals(fromNode.get("_id")));
+ Assert.assertEquals("same from title", originalEdge.getFromNode()
+ .getTitle(), fromNode.get("title"));
+
+ DBObject toNode = nodesColl
+ .findOne(((DBRef) obj.get("to")).getId());
+ Assert.assertNotNull("toNode must exits", toNode);
+ Assert.assertFalse("must be different to node", originalEdge
+ .getTo().equals(toNode.get("_id")));
+ Assert.assertEquals("same to title", originalEdge.getToNode()
+ .getTitle(), toNode.get("title"));
+
+ }
+ }
+
+ @Test
+ public void testDeleteRecursive() {
+
+ List<Node> nodes = copyProject.getNodes();
+ List<Edge> edges = copyProject.getEdges();
+
+ this.projectsRepository.deleteRecursive(copyProject);
+
+ DBObject filter = new BasicDBObject();
+ filter.put("_id", copyProject.getId());
+
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Project.class));
+ DBCursor resFind = coll.find(filter);
+
+ Assert.assertEquals("The project must not be found", 0, resFind.count());
+
+ filter = new BasicDBObject();
+ filter.put("project_id", copyProject.getId());
+
+ DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Node.class));
+ resFind = nodesColl.find(filter);
+
+ Assert.assertEquals("no nodes left", 0, resFind.count());
+
+ for (Node n : nodes) {
+ DBObject nobj = nodesColl.findOne(n.getId());
+ Assert.assertNull("node should be deleted", nobj);
+ }
+
+ DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Edge.class));
+ resFind = edgesColl.find(filter);
+
+ Assert.assertEquals("no edges left", 0, resFind.count());
+
+ for (Edge e : edges) {
+ DBObject eobj = edgesColl.findOne(e.getId());
+ Assert.assertNull("edge should be deleted", eobj);
+ }
+
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testDeleteRecursiveProjectRevision() {
+
+ List<Node> nodes = copyProject.getNodes();
+ List<Edge> edges = copyProject.getEdges();
+
+ int revCounter = copyProject.getRevCounter();
+
+ this.projectsRepository.deleteRecursive(copyProject);
+
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(ProjectRevision.class));
+
+ DBObject filter = new BasicDBObject();
+ filter.put("project", new DBRef(mongoTemplate.getDb(), "projects",
+ copyProject.getId()));
+ filter.put("revision", new Integer(revCounter));
+
+ DBObject revision = coll.findOne(filter);
+
+ Assert.assertNotNull("Must find revision", revision);
+
+ for (DBObject nobj : ((Iterable<DBObject>) revision.get("nodes"))) {
+ Node node = null;
+ for (Node n : nodes) {
+ if (n.getId().equals(nobj.get("_id"))) {
+ node = n;
+ break;
+ }
+ }
+ Assert.assertNotNull("Node must be in the original list", node);
+ Assert.assertEquals("Nodes must have same title", node.getTitle(),
+ nobj.get("title"));
+ }
+
+ for (DBObject eobj : ((Iterable<DBObject>) revision.get("edges"))) {
+ Edge edge = null;
+ for (Edge e : edges) {
+ if (e.getId().equals(eobj.get("_id"))) {
+ edge = e;
+ break;
+ }
+ }
+ Assert.assertNotNull("Edge must be in the original list", edge);
+ Assert.assertEquals("Edges must have same title", edge.getTitle(),
+ eobj.get("title"));
+ }
+
+ }
+
+ @Test
+ public void testFindBySpaceIdAndTitleRegex() {
+
+ List<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
+ this.spaceIds.get(0), ".*Project.*");
+
+ Assert.assertEquals("res must have length " + (SPACE_NB - 1),
+ SPACE_NB - 1, res.size());
+ for (Project p : res) {
+ Assert.assertEquals("project must belong to the same space",
+ this.spaceIds.get(0), p.getSpaceId());
+ Assert.assertNotNull("project title must not be null", p.getTitle());
+ Assert.assertTrue("project tilte must contains title", p.getTitle()
+ .matches(".*project.*"));
+ }
+ }
+
+ @Test
+ public void testFindBySpaceIdAndTitleRegexBad() {
+
+ List<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
+ this.spaceIds.get(0), ".*foo.*");
+
+ Assert.assertEquals("res must have zero length", 0, res.size());
+ }
+
+ @Test
+ public void testFindBySpaceIdAndTitleRegexPageable() {
+
+ PageRequest pr = new PageRequest(0, 1);
+
+ Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
+ this.spaceIds.get(0), ".*Project.*", pr);
+
+ Assert.assertEquals("res must have length 1", 1,
+ res.getNumberOfElements());
+ for (Project p : res) {
+ Assert.assertEquals("project must belong to the same space",
+ this.spaceIds.get(0), p.getSpaceId());
+ Assert.assertNotNull("project title must not be null", p.getTitle());
+ Assert.assertTrue("project tilte must contains title", p.getTitle()
+ .matches(".*project.*"));
+ }
+ }
+
+ @Test
+ public void testFindBySpaceIdAndTitleRegexPageableBadSize() {
+
+ PageRequest pr = new PageRequest(0, 3);
+
+ Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
+ this.spaceIds.get(0), ".*Project.*", pr);
+
+ Assert.assertEquals("res must have length 2", 2,
+ res.getNumberOfElements());
+ for (Project p : res) {
+ Assert.assertEquals("project must belong to the same space",
+ this.spaceIds.get(0), p.getSpaceId());
+ Assert.assertNotNull("project title must not be null", p.getTitle());
+ Assert.assertTrue("project tilte must contains title", p.getTitle()
+ .matches(".*project.*"));
+ }
+ }
+
+ @Test
+ public void testFindBySpaceIdAndTitleRegexPageableBadPage() {
+
+ PageRequest pr = new PageRequest(1, 3);
+
+ Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
+ this.spaceIds.get(0), ".*Project.*", pr);
+
+ Assert.assertEquals("res must have length 0", 0,
+ res.getNumberOfElements());
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/SpacesRepositoryTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,163 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class SpacesRepositoryTest {
+
+ private final static int SPACE_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(SpacesRepositoryTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ spacesRepository.deleteAll();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Test
+ public void testFieldMapping() {
+ // query json directly with mongodb driver
+ // check field values
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Space.class));
+
+ for (DBObject obj : coll.find()) {
+ Assert.assertTrue("mongo object must have _id field",
+ obj.containsField("_id"));
+
+ String id = obj.get("_id").toString();
+
+ Space sp = this.spacesList.get(id);
+
+ Assert.assertTrue("mongo object must have title field",
+ obj.containsField("title"));
+ Assert.assertEquals("Titles must be the same", obj.get("title"),
+ sp.getTitle());
+
+ Assert.assertTrue("mongo object must have description field",
+ obj.containsField("description"));
+ Assert.assertEquals("description must be the same",
+ obj.get("description"), sp.getDescription());
+
+ Assert.assertTrue("mongo object must have color field",
+ obj.containsField("color"));
+ Assert.assertEquals("Color must be the same", obj.get("color"),
+ sp.getColor());
+
+ Assert.assertTrue("mongo object must have uri field",
+ obj.containsField("uri"));
+ Assert.assertEquals("Uri must be the same", obj.get("uri"),
+ sp.getUri());
+
+ Assert.assertTrue("mongo object must have image field",
+ obj.containsField("image"));
+ Assert.assertEquals("Image must be the same", obj.get("image"),
+ sp.getImage());
+
+ Assert.assertTrue("mongo object must have created field",
+ obj.containsField("created"));
+ Assert.assertEquals("Created must be the same", new DateTime(obj.get("created")),
+ sp.getCreated());
+
+ Assert.assertTrue("mongo object must have bin_config field",
+ obj.containsField("bin_config"));
+ Assert.assertEquals("Uri must be the same", obj.get("bin_config"),
+ sp.getBinConfig());
+
+ Assert.assertTrue("mongo object must have created_by field",
+ obj.containsField("created_by"));
+ Assert.assertEquals("created by must be the same",
+ obj.get("created_by"), sp.getCreatedBy());
+
+ }
+ }
+
+ @Test
+ public void testPagination() {
+
+ Sort s = new Sort(Direction.DESC, "created");
+ Pageable p = new PageRequest(0, 2, s);
+
+ Page<Space> page = this.spacesRepository.findAll(p);
+
+ Assert.assertEquals("page content length must be two", 2,
+ page.getNumberOfElements());
+ Assert.assertEquals("id must be id of last created space",
+ this.spacesUuids.get(SPACE_NB - 1), page.getContent().get(0)
+ .getId());
+ Assert.assertEquals("id must be id of last created space",
+ this.spacesUuids.get(SPACE_NB - 2), page.getContent().get(1)
+ .getId());
+
+ p = new PageRequest(1, 2, s);
+ page = this.spacesRepository.findAll(p);
+ Assert.assertEquals("page content length must be one", 1,
+ page.getNumberOfElements());
+ Assert.assertEquals("id must be id of first created space",
+ this.spacesUuids.get(0), page.getContent().get(0).getId());
+
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,402 @@
+package org.iri_research.renkan.test.repositories;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+import java.util.Map.Entry;
+
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("repositories-context.xml")
+public class UsersRepositoryTest {
+
+ private final static int USER_NB = 3;
+ private final static int GROUP_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(UsersRepositoryTest.class);
+
+ @Autowired
+ private UsersRepository usersRepository;
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
+ private List<String> usersUuids = new ArrayList<>(USER_NB);
+
+ private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
+ private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
+
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ usersRepository.deleteAll();
+ for(int i=0; i < USER_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+ user.setLocked(false);
+ user.setEnabled(true);
+ user.setAvatar("A pretty picture");
+ user.setExpirationDate(new LocalDate());
+ user.setCredentialsExpirationDate(new LocalDate());
+ user.setEmail(String.format("user%d@mail.com", i));
+ user = usersRepository.save(user);
+ this.usersUuids.add(uuid);
+ this.usersList.put(uuid, user);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for(int i=0; i < GROUP_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
+ group.setAvatar("A pretty group picture " + i);
+ group = groupsRepository.save(group);
+ this.groupsUuids.add(uuid);
+ this.groupsList.put(uuid, group);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ }
+
+ @Test
+ public void testUserFieldMapping() {
+ // query json directly with mongodb driver
+ // check field values
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(User.class));
+
+ for (DBObject obj : coll.find()) {
+ Assert.assertTrue("mongo object must have _id field",
+ obj.containsField("_id"));
+
+ String id = obj.get("_id").toString();
+
+ User user = this.usersList.get(id);
+
+ Assert.assertTrue("mongo object must have title field",
+ obj.containsField("title"));
+ Assert.assertEquals("Titles must be the same",
+ user.getTitle(), obj.get("title"));
+
+ Assert.assertTrue("mongo object must have description field",
+ obj.containsField("description"));
+ Assert.assertEquals("description must be the same",
+ user.getDescription(), obj.get("description"));
+
+ Assert.assertTrue("mongo object must have color field",
+ obj.containsField("color"));
+ Assert.assertEquals("Color must be the same", user.getColor(), obj.get("color"));
+
+ Assert.assertTrue("mongo object must have uri field",
+ obj.containsField("uri"));
+ Assert.assertEquals("Uri must be the same", user.getUri(), obj.get("uri"));
+
+ Assert.assertTrue("mongo object must have locked field",
+ obj.containsField("locked"));
+ Assert.assertEquals("Locked must be the same", user.isLocked(), obj.get("locked"));
+
+ Assert.assertTrue("mongo object must have activated field",
+ obj.containsField("enabled"));
+ Assert.assertEquals("Enabled must be the same", user.isEnabled(), obj.get("enabled"));
+
+ Assert.assertTrue("mongo object must have expiration_date field",
+ obj.containsField("expiration_date"));
+ Assert.assertEquals("expiration_date must be the same", user.getExpirationDate(), new LocalDate(obj.get("expiration_date")));
+
+ Assert.assertTrue("mongo object must have credentials_expiration_date field",
+ obj.containsField("credentials_expiration_date"));
+ Assert.assertEquals("credentials_expiration_date by must be the same", user.getCredentialsExpirationDate(), new LocalDate(obj.get("credentials_expiration_date")));
+
+ Assert.assertTrue("mongo object must have email field",
+ obj.containsField("email"));
+ Assert.assertEquals("Email must be the same", user.getEmail(), obj.get("email"));
+
+
+ }
+ }
+
+ @Test
+ public void testSetGroupsList() {
+
+ User user = this.usersList.get(this.usersUuids.get(0));
+
+ List<String> groupIds = this.groupsUuids;
+
+ this.usersRepository.setGroupsList(user, groupIds);
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+ for (Group g : this.groupsRepository.findAll(groupIds)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ }
+ }
+
+
+ @Test
+ public void testAddGroupsList() {
+ User user = this.usersList.get(this.usersUuids.get(1));
+
+ List<String> groupIds = this.groupsUuids.subList(0, 1);
+ this.usersRepository.setGroupsList(user, groupIds);
+
+ user = this.usersRepository.findOne(user.getId());
+
+ Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+ Group group = this.groupsRepository.findOne(groupIds.get(0));
+ Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+
+ this.usersRepository.setGroupsList(user, this.groupsUuids);
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+ for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ }
+
+ }
+
+ @Test
+ public void testRemoveGroupsList() {
+ User user = this.usersList.get(this.usersUuids.get(2));
+
+ this.usersRepository.setGroupsList(user, this.groupsUuids);
+
+ user = this.usersRepository.findOne(user.getId());
+
+ Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+ for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+ }
+
+ this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
+
+ Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+
+ for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
+ Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 0, otherGroup.getUsers().size());
+ }
+
+ }
+
+ @Test
+ public void testAddGroupsListExisting() {
+
+ // get first user
+ User user = this.usersList.get(this.usersUuids.get(0));
+
+ List<String> groupIds = this.groupsUuids;
+
+ // set all groups for first user
+ this.usersRepository.setGroupsList(user, groupIds);
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ //check that user has all group
+ Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+ // and that groups have all new user
+ for (Group g : this.groupsRepository.findAll(groupIds)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ }
+
+
+ // get second user
+ user = this.usersList.get(this.usersUuids.get(1));
+
+ //first set one group
+ List<String> secondGroupIds = this.groupsUuids.subList(0, 1);
+ this.usersRepository.setGroupsList(user, secondGroupIds);
+
+ // relaod user
+ user = this.usersRepository.findOne(user.getId());
+
+ // check that second user has all groups
+ Assert.assertEquals("user group is big enough", secondGroupIds.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(secondGroupIds));
+
+ // check that group has new and old user
+ Group group = this.groupsRepository.findOne(secondGroupIds.get(0));
+ Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), usersUuids.get(0)), group.getUsers().contains(usersUuids.get(0)));
+
+ // set all new group list for second user
+ this.usersRepository.setGroupsList(user, this.groupsUuids);
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ //check that user 2 has all groups
+ Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+ // check that all groups had user 1 and user 2
+ for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), usersUuids.get(0)), g.getUsers().contains(usersUuids.get(0)));
+ }
+
+ }
+
+ @Test
+ public void testRemoveGroupsListExisting() {
+
+ // get first user
+ User user = this.usersList.get(this.usersUuids.get(0));
+
+ List<String> groupIds = this.groupsUuids;
+
+ // set all groups for first user
+ this.usersRepository.setGroupsList(user, groupIds);
+
+ //reload user
+ user = this.usersRepository.findOne(user.getId());
+
+ //check that user has all group
+ Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
+
+ // and that groups have all new user
+ for (Group g : this.groupsRepository.findAll(groupIds)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ }
+
+ // get 3rd user
+ user = this.usersList.get(this.usersUuids.get(2));
+
+ // set all group for 3rd user
+ this.usersRepository.setGroupsList(user, this.groupsUuids);
+
+ //reload 3rd user
+ user = this.usersRepository.findOne(user.getId());
+
+ //check taht all group are set for 3rd user
+ Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
+
+ //check that all group has 3rd user and 1st user
+ for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
+ Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), this.usersUuids.get(0)), group.getUsers().contains(this.usersUuids.get(0)));
+ }
+
+ //set new group list for 3rd user
+ this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
+
+ //reload 3rd user
+ user = this.usersRepository.findOne(user.getId());
+
+ //check that 3rd user has only one group (last group)
+ Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
+ Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
+
+ // check that last group has 3rd and 1rst user
+ Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
+ Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), this.usersUuids.get(0)), g.getUsers().contains(this.usersUuids.get(0)));
+
+ // check that other groups has only 1rst user
+ for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
+ Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 1, otherGroup.getUsers().size());
+ Assert.assertTrue(String.format("user list for group %s must contains user %s", otherGroup.getId(), this.usersUuids.get(0)), otherGroup.getUsers().contains(this.usersUuids.get(0)));
+ }
+
+ }
+
+ @Test
+ public void testGetUsersMap() {
+
+ User user = this.usersList.get(this.usersUuids.get(0));
+
+ List<String> groupdIds = this.groupsUuids;
+
+ this.usersRepository.setGroupsList(user, groupdIds);
+
+
+ Map<String, Group> groupsMap = this.usersRepository.getGroupsMap(user);
+
+ Assert.assertEquals ("Group map should have same length than groups list", this.groupsUuids.size(), groupsMap.size());
+ Assert.assertTrue("Group map should contains all uuids", this.groupsUuids.containsAll(groupsMap.keySet()));
+ for (Entry<String, Group> entry : groupsMap.entrySet()) {
+ Assert.assertTrue("user id in user uuid", this.groupsUuids.contains(entry.getKey()));
+ Assert.assertEquals("key id and value user id must be the same", entry.getKey(), entry.getValue().getId());
+ }
+ }
+
+
+ @After
+ public void teardown() {
+ this.usersRepository.deleteAll();
+ this.groupsRepository.deleteAll();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration >
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.test">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.springframework.data.mongodb">
+ <level value="DEBUG" />
+ </logger>
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/resources/org/iri_research/renkan/test/models/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_models_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/resources/org/iri_research/renkan/test/repositories/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_repo_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-core/src/test/resources/org/iri_research/renkan/test/repositories/repositories-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/build.gradle Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,42 @@
+
+description = 'renkan-management'
+
+ext {
+ spring_shell_version = '1.0.0.RELEASE'
+}
+
+dependencies {
+ compile project(':renkan-core')
+ compile group: 'org.springframework.shell', name: 'spring-shell', version:spring_shell_version
+ runtime group: 'org.springframework', name: 'spring-webmvc', version:spring_version
+ runtime group: 'javax.servlet', name: 'javax.servlet-api', version:javax_servlet_version
+}
+
+buildscript {
+ repositories { jcenter() }
+ dependencies {
+ classpath 'com.github.jengelman.gradle.plugins:shadow:1.0.2'
+ }
+}
+
+apply plugin: 'com.github.johnrengelman.shadow'
+
+jar {
+ manifest {
+ attributes 'Main-Class': 'org.springframework.shell.Bootstrap'
+ }
+}
+
+shadowJar {
+ exclude 'META-INF/*.SF'
+ exclude 'META-INF/*.DSA'
+ exclude 'META-INF/*.RSA'
+
+ append('META-INF/spring.handlers')
+ append('META-INF/spring.schemas')
+
+}
+
+configure(shadowJar) {
+ group = BasePlugin.BUILD_GROUP
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/pom.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,156 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan</artifactId>
+ <version>0.7.11</version>
+ </parent>
+
+ <artifactId>renkan-management</artifactId>
+ <packaging>jar</packaging>
+
+ <name>renkan-management</name>
+
+ <properties>
+ <spring-shell-version>1.0.0.RELEASE</spring-shell-version>
+ <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
+ <javax-servlet-api-version>3.0.1</javax-servlet-api-version>
+ <spring-version>3.2.6.RELEASE</spring-version>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.shell</groupId>
+ <artifactId>spring-shell</artifactId>
+ <version>${spring-shell-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>${slf4j-log4j12-version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${spring-version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>${javax-servlet-api-version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.10</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ <configuration>
+ <archive>
+ <index>true</index>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <!--plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.2</version>
+ <executions>
+ <execution>
+ <id>copy-dependencies</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy-dependencies</goal>
+ </goals>
+ <configuration>
+ <outputDirectory>${project.build.directory}/lib</outputDirectory>
+ <overWriteReleases>true</overWriteReleases>
+ <overWriteSnapshots>true</overWriteSnapshots>
+ <overWriteIfNewer>true</overWriteIfNewer>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin-->
+ <plugin>
+ <!-- create an all-in-one executable jar with maven-shade-plugin
+ bound to phase:package
+ special handling for spring.handlers/spring.schemas files
+ to prevent overwriting (maven-shade-plugin joins them to
+ one file)
+
+ usage:
+ cd to <project>/target
+ java -jar hello-world-java-1.0-SNAPSHOT-executable.jar spring/batch/job/hello-world-job.xml helloWorldJob
+ -->
+ <artifactId>maven-shade-plugin</artifactId>
+ <version>2.3</version>
+ <executions>
+ <execution>
+ <phase>package</phase>
+ <goals>
+ <goal>shade</goal>
+ </goals>
+ <configuration>
+ <filters>
+ <filter>
+ <artifact>*:*</artifact>
+ <excludes>
+ <exclude>META-INF/*.SF</exclude>
+ <exclude>META-INF/*.DSA</exclude>
+ <exclude>META-INF/*.RSA</exclude>
+ </excludes>
+ </filter>
+ </filters>
+ <transformers>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+ <mainClass>org.springframework.shell.Bootstrap</mainClass>
+ </transformer>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+ <resource>META-INF/spring.handlers</resource>
+ </transformer>
+ <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+ <resource>META-INF/spring.schemas</resource>
+ </transformer>
+ </transformers>
+ <shadedArtifactAttached>true</shadedArtifactAttached>
+ <!-- configures the suffix name for the executable jar
+ here it will be '<project.artifact>-<project.version>-executable.jar'-->
+ <shadedClassifierName>full</shadedClassifierName>
+ <!--finalName>renkan-management-full-${project.version}</finalName-->
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/java/org/iri_research/renkan/management/CorrectProjectId.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,76 @@
+package org.iri_research.renkan.management;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CorrectProjectId implements CommandMarker {
+
+// public static void main(String[] args) {
+
+// @SuppressWarnings("resource")
+// ApplicationContext context = new ClassPathXmlApplicationContext(
+// "classpath:META-INF/applicationContext.xml");
+
+// CorrectProjectId p = context.getBean(CorrectProjectId.class);
+// p.start(args);
+
+// }
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+ @Autowired
+ private NodesRepository nodesRepository;
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ @CliAvailabilityIndicator({"correct-project-id"})
+ public boolean isCommandAvailable() {
+ return true;
+ }
+
+ @CliCommand(value="correct-project-id", help="correct-project-id")
+ public void start() {
+
+ for (Project proj : projectsRepository.findAll()) {
+
+ System.out.format("Processing project %s %n", proj.getId());
+
+ if(proj.getNodes() != null) {
+ List<Node> nodes = new ArrayList<>();
+ for(Node node: proj.getNodes()) {
+ if(node != null && node.getProjectId() == null) {
+ node.setProjectId(proj.getId());
+ nodes.add(node);
+ }
+ }
+ nodesRepository.save(nodes);
+ }
+ System.out.format("Node saved %s %n", proj.getId());
+
+ if(proj.getEdges() != null) {
+ List<Edge> edges = new ArrayList<>();
+ for(Edge edge : proj.getEdges()) {
+ if(edge != null && edge.getProjectId() == null) {
+ edge.setProjectId(proj.getId());
+ edges.add(edge);
+ }
+ }
+ edgesRepository.save(edges);
+ }
+ System.out.format("Edge saved %s %n", proj.getId());
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/java/org/iri_research/renkan/management/MigrateRenkanUser.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,73 @@
+package org.iri_research.renkan.management;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.RenkanUser;
+import org.iri_research.renkan.models.User;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.shell.core.CommandMarker;
+import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
+import org.springframework.shell.core.annotation.CliCommand;
+import org.springframework.stereotype.Component;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.WriteConcern;
+
+@Component
+public class MigrateRenkanUser implements CommandMarker {
+
+ @CliAvailabilityIndicator({"migrate-renkan-user"})
+ public boolean isCommandAvailable() {
+ return true;
+ }
+
+ @Autowired
+ private MongoTemplate template;
+
+ @CliCommand(value="migrate-renkan-user", help="Migrate Renkan User")
+ public void start() {
+
+ DBCollection userColl = template.getCollection(template
+ .getCollectionName(User.class));
+ DBCollection renkanUserColl = template.getCollection(template
+ .getCollectionName(RenkanUser.class));
+ DBCollection projectColl = template.getCollection(template
+ .getCollectionName(Project.class));
+
+ for (DBObject user : userColl.find()) {
+ if (!user.containsField("project_id")) {
+ continue;
+ }
+ String projectId = (String) user.get("project_id");
+ if (projectId == null || projectId.isEmpty()) {
+ user.removeField("project_id");
+ userColl.save(user);
+ continue;
+ }
+ DBObject proj = new BasicDBObject();
+ proj.put("_id", projectId);
+ if (projectColl.findOne(proj) != null) {
+ DBObject renkanUser = new BasicDBObject();
+ renkanUser.put("project_id", projectId);
+ renkanUser.put("user_id", user.get("_id"));
+ if (renkanUserColl.findOne(renkanUser) == null) {
+ System.out.println(String.format("%s : %s : %s",
+ user.get("_id"), user.get("title"),
+ user.get("project_id")));
+ renkanUser = new BasicDBObject();
+ renkanUser.put("project_id", user.get("project_id"));
+ renkanUser.put("user_id", user.get("_id"));
+ renkanUser.put("color", user.get("color"));
+ renkanUserColl.insert(renkanUser);
+ }
+ user.removeField("project_id");
+ userColl.save(user);
+ } else {
+ userColl.remove(user, WriteConcern.ACKNOWLEDGED);
+ }
+ }
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/resources/META-INF/applicationContext.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc.xsd"
+>
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+ <mvc:annotation-driven />
+
+ <util:properties id="propsLocations">
+ <prop key="servletContextProps">META-INF/renkan.properties</prop>
+ <prop key="classpathProps">classpath:renkan_run.properties</prop>
+ </util:properties>
+
+ <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1000"/>
+ <property name="location" value="#{propsLocations.servletContextProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="false"/>
+ </bean>
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1"/>
+ <property name="location" value="#{propsLocations.classpathProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="true"/>
+ </bean>
+
+ <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+ <property name="IgnoreResourceNotFound" value="true"/>
+ <property name="locations">
+ <list>
+ <value>#{propsLocations.servletContextProps}</value>
+ <value>#{propsLocations.classpathProps}</value>
+ </list>
+ </property>
+ <property name="fileEncoding" value="UTF-8"/>
+ </bean>
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <bean class="org.iri_research.renkan.RenkanProperties"
+ factory-method="getInstance" />
+
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+ <context:component-scan base-package="org.iri_research.renkan.management" />
+
+ <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
+ <property name="basenames">
+ <list>
+ <value>META-INF/i18n/messages</value>
+ <value>classpath:org/springframework/security/messages</value>
+ </list>
+ </property>
+ <property name="defaultEncoding" value="UTF-8"/>
+ <property name="fallbackToSystemLocale" value="true" />
+ </bean>
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/resources/META-INF/renkan.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+mongodb.host.name = localhost
+mongodb.host.port = 27017
+mongodb.db.name = renkan
+
+user.admin.name = admin
+#user.admin.password = admin
+user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+
+renkan.pagination.size = 2
+renkan.coweb.debug = false
+renkan.coweb.websocket = true
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/resources/META-INF/spring/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
+
+ <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="META-INF/renkan.properties"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="${mongodb.db.name}"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/resources/META-INF/spring/spring-shell-plugin.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.1.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd
+ ">
+
+ <context:annotation-config />
+ <mvc:annotation-driven />
+
+ <context:component-scan base-package="org.iri_research.renkan.management" />
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.repositories" />
+
+ <util:properties id="propsLocations">
+ <prop key="servletContextProps">META-INF/renkan.properties</prop>
+ <prop key="classpathProps">classpath:renkan_run.properties</prop>
+ </util:properties>
+
+ <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1000"/>
+ <property name="location" value="#{propsLocations.servletContextProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="false"/>
+ </bean>
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1"/>
+ <property name="location" value="#{propsLocations.classpathProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="true"/>
+ </bean>
+
+ <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+ <property name="IgnoreResourceNotFound" value="true"/>
+ <property name="locations">
+ <list>
+ <value>#{propsLocations.servletContextProps}</value>
+ <value>#{propsLocations.classpathProps}</value>
+ </list>
+ </property>
+ <property name="fileEncoding" value="UTF-8"/>
+ </bean>
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean class="org.iri_research.renkan.RenkanProperties"
+ factory-method="getInstance" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/main/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration>
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.beans.factory">
+ <level value="INFO" />
+ </logger>
+ <!--logger name="org.cometd">
+ <level value="DEBUG" />
+ </logger-->
+ <!--logger name="org.coweb">
+ <level value="DEBUG" />
+ </logger-->
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-management/src/test/java/org/iri_research/renkan/AppTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,19 @@
+package org.iri_research.renkan;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+{
+ /**
+ * Rigourous Test :-)
+ */
+ @Test
+ public void testApp()
+ {
+ assertTrue( true );
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/build.gradle Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,163 @@
+buildscript {
+ repositories {
+ jcenter()
+ }
+ dependencies {
+ classpath 'org.akhikhl.gretty:gretty:1.0.0'
+ }
+}
+
+repositories {
+ maven { url "lib" }
+ jcenter()
+}
+
+apply plugin: 'war'
+apply plugin: 'org.akhikhl.gretty'
+
+description = ''
+
+gretty {
+ servletContainer = 'jetty8'
+ host = '0.0.0.0'
+ port = 8080
+ contextPath = '/renkan'
+}
+
+
+ext {
+ javax_ws_rs_api_version = '2.0'
+ javax_annotation_api_version = '1.2'
+ cometd_version = '2.7.0'
+ coweb_version = '1.0.1-SNAPSHOT'
+ cowebx_version = '1.0'
+ jersey_version = '2.5.1'
+ thymeleaf_version = '2.1.3.RELEASE'
+ thymeleaf_extra_version = '2.1.1.RELEASE'
+ thymeleaf_joda_dialect_version = '0.0.3'
+ commons_io_version = '2.4'
+ guava_version = '17.0'
+ nekohtml_version = '1.9.19'
+ validation_api_version = '1.1.0.Final'
+ hibernate_validator_version = '5.0.1.Final'
+ jstl_version = '1.2'
+ json_path_assert_version = '0.9.1'
+}
+
+
+dependencies {
+ compile project(':renkan-core')
+ compile group: 'javax.inject', name: 'javax.inject', version:java_inject_version
+ compile group: 'javax.servlet', name: 'javax.servlet-api', version:javax_servlet_version
+ compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version:javax_ws_rs_api_version
+ compile group: 'javax.annotation', name: 'javax.annotation-api', version:javax_annotation_api_version
+ compile(group: 'org.cometd.java', name: 'bayeux-api', version:cometd_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ compile(group: 'org.cometd.java', name: 'cometd-java-common', version:cometd_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ compile(group: 'org.cometd.java', name: 'cometd-java-annotations', version:cometd_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ compile(group: 'org.cometd.java', name: 'cometd-websocket-jetty', version:cometd_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ compile (group: 'org.opencoweb', name: 'coweb-bots', version:coweb_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ compile (group: 'org.opencoweb', name: 'coweb-server', version:coweb_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ providedCompile (group: 'org.opencoweb', name: 'coweb-javascript', version:coweb_version) {
+ exclude group: 'org.eclipse.jetty'
+ }
+ providedCompile group: 'org.opencoweb.cowebx', name: 'cowebx-widgets-dojo', version:cowebx_version
+ compile group: 'org.glassfish.jersey.core', name: 'jersey-server', version:jersey_version
+ compile group: 'org.glassfish.jersey.ext', name: 'jersey-spring3', version:jersey_version
+ compile group: 'org.mongodb', name: 'mongo-java-driver', version:mongo_java_driver_version
+ compile group: 'org.springframework', name: 'spring-core', version:spring_version
+ compile group: 'org.springframework', name: 'spring-context', version:spring_version
+ compile group: 'org.springframework', name: 'spring-web', version:spring_version
+ compile group: 'org.springframework', name: 'spring-webmvc', version:spring_version
+ compile group: 'org.springframework.data', name: 'spring-data-commons', version:spring_data_commons_version
+ compile group: 'org.springframework.data', name: 'spring-data-jpa', version:spring_data_jpa_version
+ compile group: 'org.springframework.data', name: 'spring-data-mongodb', version:spring_data_mongodb_version
+ compile group: 'javax.persistence', name: 'persistence-api', version:persistence_api_version
+ compile group: 'org.thymeleaf', name: 'thymeleaf', version:thymeleaf_version
+ compile group: 'org.thymeleaf', name: 'thymeleaf-spring3', version:thymeleaf_version
+ compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity3', version:thymeleaf_extra_version
+ compile group: 'org.thymeleaf.extras', name: 'thymeleaf-joda-dialect', version:thymeleaf_joda_dialect_version
+ compile group: 'net.sourceforge.nekohtml', name: 'nekohtml', version:nekohtml_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:jackson_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:jackson_version
+ compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:jackson_version
+ compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version:jackson_version
+ compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-joda', version:jackson_version
+ compile group: 'commons-codec', name: 'commons-codec', version:commons_codec_version
+ compile group: 'org.springframework.security', name: 'spring-security-core', version:spring_security_version
+ compile group: 'org.springframework.security', name: 'spring-security-web', version:spring_security_version
+ compile group: 'org.springframework.security', name: 'spring-security-config', version:spring_security_version
+ compile group: 'org.springframework.security', name: 'spring-security-acl', version:spring_security_version
+ compile group: 'org.springframework.security', name: 'spring-security-taglibs', version:spring_security_version
+ compile group: 'de.undercouch', name: 'bson4jackson', version:jackson_version
+ compile group: 'joda-time', name: 'joda-time', version:joda_time_version
+ compile group: 'javax.validation', name: 'validation-api', version:validation_api_version
+ compile group: 'org.hibernate', name: 'hibernate-validator', version:hibernate_validator_version
+ compile group: 'com.google.guava', name: 'guava', version:guava_version
+ runtime group: 'javax.servlet', name: 'jstl', version:jstl_version
+ runtime group: 'org.eclipse.jetty.aggregate', name: 'jetty-all', version:jetty_version
+ testCompile group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-grizzly2', version:jersey_version
+ testCompile group: 'org.springframework', name: 'spring-test', version:spring_version
+ testCompile group: 'com.jayway.jsonpath', name: 'json-path-assert', version:json_path_assert_version
+ testCompile group: 'commons-io', name: 'commons-io', version:commons_io_version
+}
+
+//apply overlay
+
+war {
+ manifest { attributes(
+ "Implementation-Vendor": organization,
+ "Implementation-Title": project.name,
+ "Implementation-Version": project.version,
+ "Implementation-Vendor-Id": project.group,
+ "Built-By": "$System.env.USER",
+ "Build-Jdk": org.gradle.internal.SystemProperties.javaVersion,
+ "Specification-Vendor": organization,
+ "Specification-Title": project.name,
+ "Specification-Version": project.version
+ ) }
+
+ // coweb-javascript
+ from({ zipTree(configurations.providedCompile.filter{ it.name.startsWith('coweb-javascript') && it.name.endsWith(".war")}.singleFile)}) {
+ exclude "META-INF/**"
+ exclude "WEB-INF/**"
+ into "lib"
+ }
+
+ from( {zipTree(configurations.providedCompile.filter{ it.name.startsWith('cowebx-widgets-dojo') && it.name.endsWith(".war")}.singleFile)}) {
+ exclude "META-INF/**"
+ exclude "WEB-INF/**"
+ into "lib/cowebx/dojo"
+ }
+
+ from("../../client/dist/js") {
+ include "*.js"
+ into "static/js"
+ }
+ from("../../client/dist/lib") {
+ into "static/lib"
+ }
+ from("../../client/dist/css") {
+ include "*.css"
+ into "static/css"
+ }
+ from("../../client/dist/img") {
+ into "static/img"
+ }
+ from("../../client/dist/data") {
+ include "properties.json"
+ into "static/data"
+ }
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:20 CEST 2013
+admin-archetype-1.0.1-SNAPSHOT.jar>=
+admin-archetype-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/admin-archetype-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/admin-archetype-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-admin</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>admin-archetype</artifactId>
+ <packaging>maven-archetype</packaging>
+ <name>OpenCoweb :: Java :: Admin :: Archetype</name>
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.0-alpha-5</version>
+ </extension>
+ </extensions>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.0-alpha-4</version>
+ <extensions>true</extensions>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <filtering>false</filtering>
+ </resource>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <includes>
+ <include>**/archetype-metadata.xml</include>
+ </includes>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </build>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>admin-archetype</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145420</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145420</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145420</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-archetype/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>admin-archetype</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145420</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:21 CEST 2013
+admin-jar-1.0.1-SNAPSHOT.jar>=
+admin-jar-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/admin-jar-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/admin-jar-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-admin</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>admin-jar</artifactId>
+ <packaging>jar</packaging>
+ <name>OpenCoweb :: Java :: Admin :: Jar</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>javax</groupId>
+ <artifactId>javaee-api</artifactId>
+ <version>6.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.wink</groupId>
+ <artifactId>wink-json4j</artifactId>
+ <version>1.1.2-incubating</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <version>${project.version}</version>
+ <type>jar</type>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>admin-jar</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145421</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145421</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145421</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/admin-jar/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>admin-jar</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145421</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,3 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:20 CEST 2013
+coweb-admin-1.0.1-SNAPSHOT.pom>=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/coweb-admin-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>coweb-admin</artifactId>
+ <packaging>pom</packaging>
+ <name>OpenCoweb :: Java :: Admin</name>
+
+ <modules>
+ <module>admin-archetype</module>
+ <module>admin-jar</module>
+ </modules>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-admin</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145420</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145420</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-admin/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-admin</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145420</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:20 CEST 2013
+coweb-archetype-1.0.1-SNAPSHOT.jar>=
+coweb-archetype-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/coweb-archetype-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/coweb-archetype-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-archetype</artifactId>
+ <packaging>maven-archetype</packaging>
+ <name>OpenCoweb :: Java :: Archetype</name>
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.0-alpha-5</version>
+ </extension>
+ </extensions>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.0-alpha-4</version>
+ <extensions>true</extensions>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <filtering>false</filtering>
+ </resource>
+ <resource>
+ <directory>${basedir}/src/main/resources</directory>
+ <includes>
+ <include>**/archetype-metadata.xml</include>
+ </includes>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </build>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-archetype</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145420</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145420</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145420</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-archetype/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-archetype</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145420</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:09 CEST 2013
+coweb-bots-1.0.1-SNAPSHOT.jar>=
+coweb-bots-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/coweb-bots-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/coweb-bots-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>coweb-bots</artifactId>
+ <groupId>org.opencoweb</groupId>
+ <packaging>jar</packaging>
+ <name>OpenCoweb :: Java :: Bots</name>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-bots</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145409</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145409</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145409</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-bots/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-bots</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145409</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:22 CEST 2013
+coweb-build-1.0.1-SNAPSHOT.pom>=
+coweb-build-1.0.1-SNAPSHOT.war>=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/coweb-build-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>coweb-build</artifactId>
+ <name>OpenCoweb Build :: Applications</name>
+ <packaging>war</packaging>
+
+ <build>
+ <plugins>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.1.1</version>
+ <configuration>
+ <overlays>
+ <overlay>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <type>war</type>
+ <excludes>
+ <exclude>META-INF/**</exclude>
+ <exclude>WEB-INF/**</exclude>
+ </excludes>
+ <targetPath>lib</targetPath>
+ </overlay>
+ </overlays>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-bots</artifactId>
+ <version>${coweb-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-operationengine</artifactId>
+ <version>${coweb-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <version>${coweb-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <version>${coweb-version}</version>
+ <type>war</type>
+ </dependency>
+ </dependencies>
+</project>
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/coweb-build-1.0.1-SNAPSHOT.war has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-build</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145422</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>war</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145422</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145422</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-build/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-build</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145422</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:19 CEST 2013
+coweb-client-1.0.1-SNAPSHOT.jar>=
+coweb-client-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/coweb-client-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/coweb-client-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-client</artifactId>
+ <name>OpenCoweb :: Java :: Client</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-java-client</artifactId>
+ <version>${cometd-version}</version>
+ </dependency>
+ </dependencies>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-client</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145419</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145419</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145419</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-client/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-client</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145419</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,3 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:04 CEST 2013
+coweb-java-1.0.1-SNAPSHOT.pom>=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/coweb-java-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <packaging>pom</packaging>
+
+ <name>OpenCoweb</name>
+ <description>Open Cooperative Web Framework</description>
+ <version>1.0.1-SNAPSHOT</version>
+ <url>http://opencoweb.org</url>
+ <inceptionYear>2011</inceptionYear>
+ <organization>
+ <name>The Dojo Foundation</name>
+ <url>http://dojofoundation.org</url>
+ </organization>
+
+ <licenses>
+ <license>
+ <name>The New BSD License</name>
+ <url>http://www.opensource.org/licenses/bsd-license.html</url>
+ </license>
+ <license>
+ <name>The Academic Free License, v. 2.1</name>
+ <url>http://en.wikipedia.org/wiki/Academic_Free_License</url>
+ </license>
+ </licenses>
+
+ <developers>
+ <developer>
+ <id>parente</id>
+ <name>Peter Parente</name>
+ <email>pparent@us.ibm.com</email>
+ <organization>IBM Corporation</organization>
+ </developer>
+ <developer>
+ <id>bpburns</id>
+ <name>Brian Burns</name>
+ <email>bburns@us.ibm.com</email>
+ <organization>IBM Corporation</organization>
+ </developer>
+ <developer>
+ <id>vinomaster</id>
+ <name>Dan Gisolfi</name>
+ <email>gisolfi@us.ibm.com</email>
+ <organization>IBM Corporation</organization>
+ </developer>
+ </developers>
+
+ <scm>
+ <connection>scm:git:git@github.com:opencoweb/coweb.git</connection>
+ <developerConnection>scm:git:git@github.com:opencoweb/coweb.git</developerConnection>
+ <url>git@github.com:opencoweb/coweb.git</url>
+ </scm>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <cometd-version>2.7.0</cometd-version>
+ <coweb-version>1.0.1-SNAPSHOT</coweb-version>
+ </properties>
+
+ <modules>
+ <module>coweb-operationengine</module>
+ <module>coweb-bots</module>
+ <module>coweb-server</module>
+ <module>coweb-javascript</module>
+ <module>coweb-client</module>
+ <module>coweb-archetype</module>
+ <module>coweb-admin</module>
+ <module>coweb-build</module>
+ </modules>
+
+ <build>
+ <defaultGoal>install</defaultGoal>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.7</version>
+ <configuration>
+ <doctitle>${project.name} ${project.version} Java Server API</doctitle>
+ </configuration>
+ <executions>
+ <execution>
+ <id>aggregate</id>
+ <goals>
+ <goal>aggregate</goal>
+ </goals>
+ <phase>site</phase>
+ <configuration></configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.6</source>
+ <target>1.6</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+ <profiles>
+ <profile>
+ <id>release-sign-artifacts</id>
+ <activation>
+ <property>
+ <name>performRelease</name>
+ <value>true</value>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-gpg-plugin</artifactId>
+ <version>1.1</version>
+ <executions>
+ <execution>
+ <id>sign-artifacts</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145404</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145404</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-java/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145404</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:19 CEST 2013
+coweb-javascript-1.0.1-SNAPSHOT.pom>=
+coweb-javascript-1.0.1-SNAPSHOT.war>=
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/coweb-javascript-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <name>OpenCoweb :: Java :: JavaScript</name>
+ <packaging>war</packaging>
+
+ <properties>
+ <i18n-plugin-url>http://requirejs.org/docs/release/1.0.0/minified/i18n.js</i18n-plugin-url>
+ <coweb-jsoe>${project.build.directory}/${project.artifactId}-${project.version}/coweb/jsoe</coweb-jsoe>
+ <coweb-jsoe-src>src/main/webapp/coweb/jsoe</coweb-jsoe-src>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.2</version>
+ <configuration>
+ <warSourceExcludes>coweb/jsoe/</warSourceExcludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.4</version>
+ <executions>
+ <execution>
+ <id>unpack</id>
+ <phase>compile</phase>
+ <goals><goal>unpack</goal></goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.cometd.javascript</groupId>
+ <artifactId>cometd-javascript-common</artifactId>
+ <version>${cometd.version}</version>
+ <type>war</type>
+ <overWrite>false</overWrite>
+ <outputDirectory>${project.build.directory}/tmp</outputDirectory>
+ <includes>**/cometd.js,**/cometd/AckExtension.js</includes>
+ </artifactItem>
+ </artifactItems>
+ <!-- other configurations here -->
+ </configuration>
+ </execution>
+ </executions>
+
+ </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>prepare-package</phase>
+ <configuration>
+ <tasks>
+ <property name="workpath" location="${project.build.directory}/tmp" />
+ <echo message="HERE *************************** ${workpath}" />
+
+ <!-- Pull in cometd. -->
+ <delete dir="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd" />
+ <copy file="${workpath}/org/cometd.js"
+ tofile="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd.js" />
+ <copy file="${workpath}/org/cometd/AckExtension.js"
+ tofile="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd/AckExtension.js" />
+
+ <!-- Pull in requirejs's i18n library. -->
+ <mkdir dir="${project.build.directory}/${project.artifactId}-${project.version}/org/requirejs"/>
+ <get src="${i18n-plugin-url}"
+ dest="${project.build.directory}/${project.artifactId}-${project.version}/org/requirejs/i18n.js"/>
+
+ <!-- Use only the relevant coweb-jsoe files. -->
+ <copy todir="${coweb-jsoe}">
+ <fileset dir="${coweb-jsoe-src}/src/coweb/jsoe">
+ <include name="*.js" />
+ <exclude name="OTEngine.js" />
+ </fileset>
+ </copy>
+ <copy todir="${coweb-jsoe}/nls">
+ <fileset dir="${coweb-jsoe-src}/src/coweb/jsoe/nls" />
+ </copy>
+
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.cometd.javascript</groupId>
+ <artifactId>cometd-javascript-common</artifactId>
+ <version>${cometd-version}</version>
+ <type>war</type>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+</project>
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/coweb-javascript-1.0.1-SNAPSHOT.war has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145419</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>war</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145419</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145419</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-javascript/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145419</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:09 CEST 2013
+coweb-operationengine-1.0.1-SNAPSHOT.jar>=
+coweb-operationengine-1.0.1-SNAPSHOT.pom>=
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/coweb-operationengine-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/coweb-operationengine-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-operationengine</artifactId>
+ <name>OpenCoweb :: Java :: OperationEngine</name>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-operationengine</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145409</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145409</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145409</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-operationengine/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-operationengine</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145409</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/_remote.repositories Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,4 @@
+#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
+#Mon Oct 14 16:54:10 CEST 2013
+coweb-server-1.0.1-SNAPSHOT.pom>=
+coweb-server-1.0.1-SNAPSHOT.jar>=
Binary file server/java/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/coweb-server-1.0.1-SNAPSHOT.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/coweb-server-1.0.1-SNAPSHOT.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-java</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <name>OpenCoweb :: Java :: Server</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-bots</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-operationengine</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-java-server</artifactId>
+ <version>${cometd-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>bayeux-api</artifactId>
+ <version>${cometd-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-java-common</artifactId>
+ <version>${cometd-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-websocket-jetty</artifactId>
+ <version>${cometd-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata modelVersion="1.1.0">
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <version>1.0.1-SNAPSHOT</version>
+ <versioning>
+ <snapshot>
+ <localCopy>true</localCopy>
+ </snapshot>
+ <lastUpdated>20131014145410</lastUpdated>
+ <snapshotVersions>
+ <snapshotVersion>
+ <extension>jar</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145410</updated>
+ </snapshotVersion>
+ <snapshotVersion>
+ <extension>pom</extension>
+ <value>1.0.1-SNAPSHOT</value>
+ <updated>20131014145410</updated>
+ </snapshotVersion>
+ </snapshotVersions>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/coweb-server/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <versioning>
+ <versions>
+ <version>1.0.1-SNAPSHOT</version>
+ </versions>
+ <lastUpdated>20131014145410</lastUpdated>
+ </versioning>
+</metadata>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/opencoweb/maven-metadata-local.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata>
+ <plugins>
+ <plugin>
+ <name>OpenCoweb :: Java :: Archetype</name>
+ <prefix>coweb-archetype</prefix>
+ <artifactId>coweb-archetype</artifactId>
+ </plugin>
+ <plugin>
+ <name>OpenCoweb :: Java :: Admin :: Archetype</name>
+ <prefix>admin-archetype</prefix>
+ <artifactId>admin-archetype</artifactId>
+ </plugin>
+ </plugins>
+</metadata>
Binary file server/java/renkan-web/lib/org/thymeleaf/extras/thymeleaf-joda-dialect/0.0.3/thymeleaf-joda-dialect-0.0.3.jar has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/lib/org/thymeleaf/extras/thymeleaf-joda-dialect/0.0.3/thymeleaf-joda-dialect-0.0.3.pom Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,145 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.thymeleaf.extras</groupId>
+ <artifactId>thymeleaf-joda-dialect</artifactId>
+ <version>0.0.3</version>
+ <inceptionYear>2013</inceptionYear>
+ <contributors>
+ <contributor>
+ <name>Tom-Steve Watzke</name>
+ <email>ts.watzke@pitcom.de</email>
+ <roles>
+ <role>Project creator and Lead developer</role>
+ </roles>
+ </contributor>
+ <contributor>
+ <name>Dieter Hubau</name>
+ <email>dhubau@gmail.com</email>
+ <roles>
+ <role>Developer</role>
+ </roles>
+ </contributor>
+ </contributors>
+ <description>Thymeleaf dialect for formatting Joda Time objects</description>
+
+ <properties>
+ <java-version>1.7</java-version>
+ <org.springframework-version>3.2.4.RELEASE</org.springframework-version>
+ <org.springsecurityframework-version>3.2.4.RELEASE</org.springsecurityframework-version>
+ <org.thymeleaf-version>2.1.1.RELEASE</org.thymeleaf-version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>${org.springframework-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${org.springframework-version}</version>
+ </dependency>
+
+ <!-- thymeleaf html5 template resolver -->
+ <dependency>
+ <groupId>org.thymeleaf</groupId>
+ <artifactId>thymeleaf</artifactId>
+ <version>${org.thymeleaf-version}</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.thymeleaf</groupId>
+ <artifactId>thymeleaf-spring3</artifactId>
+ <version>${org.thymeleaf-version}</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ <version>2.1</version>
+ <type>jar</type>
+ <scope>compile</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ <version>2.5</version>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>${org.springframework-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.8.1</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.tomcat.maven</groupId>
+ <artifactId>tomcat7-maven-plugin</artifactId>
+ <version>2.0</version>
+ <executions>
+ <execution>
+ <id>deploy</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>deploy</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>${java-version}</source>
+ <target>${java-version}</target>
+ <compilerArgument>-Xlint:all</compilerArgument>
+ <showWarnings>true</showWarnings>
+ <showDeprecation>true</showDeprecation>
+ <failOnMissingWebXml>false</failOnMissingWebXml>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <repositories>
+ <!-- Necessary if using milestone builds of SpringSource products (as above) -->
+ <repository>
+ <id>spring-snapshot</id>
+ <name>Spring Maven SNAPSHOT Repository</name>
+ <url>http://repo.springsource.org/libs-snapshot</url>
+ </repository>
+ <!-- Required, as Spring JavaConfig has dependencies on released versions
+ of SpringSource products -->
+ <repository>
+ <id>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</id>
+ <url>http://repository.springsource.com/maven/bundles/release</url>
+ </repository>
+ <!-- Required, as Spring JavaConfig has dependencies on External OSGi bundles -->
+ <repository>
+ <id>SpringSource Enterprise Bundle Repository - External Bundle Releases</id>
+ <url>http://repository.springsource.com/maven/bundles/external</url>
+ </repository>
+ <repository>
+ <id>java.net</id>
+ <url>http://download.java.net/maven/2/</url>
+ </repository>
+ </repositories>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/pom.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,650 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan</artifactId>
+ <version>0.7.11</version>
+ </parent>
+ <artifactId>renkan-web</artifactId>
+ <packaging>war</packaging>
+
+ <properties>
+ <surefire-version>2.16</surefire-version>
+ <coweb-version>1.0.1-SNAPSHOT</coweb-version>
+ <cowebx-version>1.0</cowebx-version>
+ <jersey-version>2.5.1</jersey-version>
+ <spring-version>3.2.6.RELEASE</spring-version>
+ <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
+ <spring-security-version>3.2.0.RELEASE</spring-security-version>
+ <spring-data-commons-version>1.6.3.RELEASE</spring-data-commons-version>
+ <spring-data-jpa-version>1.4.3.RELEASE</spring-data-jpa-version>
+ <jetty-plugin-version>8.1.15.v20140411</jetty-plugin-version>
+ <jetty-version>8.1.15.v20140411</jetty-version>
+ <junit-version>4.11</junit-version>
+ <thymeleaf-version>2.1.3.RELEASE</thymeleaf-version>
+ <thymeleaf-springsecurity-version>2.1.1.RELEASE</thymeleaf-springsecurity-version>
+ <thymeleaf-joda-dialect-version>0.0.3</thymeleaf-joda-dialect-version>
+ <cometd-version>2.7.0</cometd-version>
+ <jackson-version>2.2.3</jackson-version>
+ <joda-version>2.3</joda-version>
+ <mongo-driver-version>2.11.4</mongo-driver-version>
+ <jaxrs-api-version>2.0</jaxrs-api-version>
+ <javax-annotation-version>1.2</javax-annotation-version>
+ <javax-inject-version>1</javax-inject-version>
+ <javax-servlet-api-version>3.0.1</javax-servlet-api-version>
+ <javax-servlet-jstl-version>1.2</javax-servlet-jstl-version>
+ <javax-persistence-api-version>1.0.2</javax-persistence-api-version>
+ <javax-validation-api-version>1.1.0.Final</javax-validation-api-version>
+ <hibernate-validator-version>5.0.1.Final</hibernate-validator-version>
+ <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
+ <nekohtml-version>1.9.19</nekohtml-version>
+ <commons-codec-version>1.8</commons-codec-version>
+ <bson4jackson-version>2.2.3</bson4jackson-version>
+ <guava-version>17.0</guava-version>
+ <json-path-version>0.9.1</json-path-version>
+ <commons-io-version>2.4</commons-io-version>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+
+ <build>
+ <defaultGoal>package</defaultGoal>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.7</source>
+ <target>1.7</target>
+ <compilerArgs>
+ <arg>-Xlint</arg>
+ </compilerArgs>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty-maven-plugin</artifactId>
+ <version>${jetty-plugin-version}</version>
+ <configuration>
+ <scanIntervalSeconds>10</scanIntervalSeconds>
+ <webApp>
+ <contextPath>/renkan</contextPath>
+ </webApp>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>2.3</version>
+ <configuration>
+ <failOnError>false</failOnError>
+ <archive>
+ <manifest>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+ </manifest>
+ </archive>
+ <overlays>
+ <overlay>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <type>war</type>
+ <excludes>
+ <exclude>META-INF/**</exclude>
+ <exclude>WEB-INF/**</exclude>
+ </excludes>
+ <targetPath>lib</targetPath>
+ </overlay>
+ <overlay>
+ <groupId>org.opencoweb.cowebx</groupId>
+ <artifactId>cowebx-widgets-dojo</artifactId>
+ <type>war</type>
+ <excludes>
+ <exclude>META-INF/**</exclude>
+ <exclude>WEB-INF/**</exclude>
+ </excludes>
+ <targetPath>lib/cowebx/dojo</targetPath>
+ </overlay>
+ </overlays>
+ <webResources>
+ <resource>
+ <directory>../../client/dist/js</directory>
+ <includes>
+ <include>*.js</include>
+ </includes>
+ <targetPath>static/js</targetPath>
+ </resource>
+ <resource>
+ <directory>../../client/dist/lib</directory>
+ <targetPath>static/lib</targetPath>
+ </resource>
+ <resource>
+ <directory>../../client/dist/css</directory>
+ <includes>
+ <include>*.css</include>
+ </includes>
+ <targetPath>static/css</targetPath>
+ </resource>
+ <resource>
+ <directory>../../client/dist/img</directory>
+ <targetPath>static/img</targetPath>
+ </resource>
+ <resource>
+ <directory>../../client/dist/data</directory>
+ <includes>
+ <include>properties.json</include>
+ </includes>
+ <targetPath>static/data</targetPath>
+ </resource>
+ </webResources>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>${surefire-version}</version>
+ </plugin>
+ </plugins>
+ </build>
+ <repositories>
+ <repository>
+ <id>lib</id>
+ <name>lib</name>
+ <releases>
+ <enabled>true</enabled>
+ <checksumPolicy>ignore</checksumPolicy>
+ </releases>
+ <url>file://${project.basedir}/lib</url>
+ </repository>
+ <repository>
+ <id>spring-maven-release</id>
+ <name>Spring Maven Release Repository</name>
+ <url>http://maven.springframework.org/release</url>
+ </repository>
+ <repository>
+ <id>spring-maven-milestone</id>
+ <name>Spring Maven MILESTONE Repository</name>
+ <url>http://maven.springframework.org/milestone</url>
+ </repository>
+ <repository>
+ <id>spring-release</id>
+ <name>Spring Maven SNAPSHOT Repository</name>
+ <url>http://repo.springsource.org/release</url>
+ </repository>
+ <repository>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ <id>central</id>
+ <name>libs-release</name>
+ <url>http://repo.springsource.org/libs-release</url>
+ </repository>
+ </repositories>
+ <dependencies>
+ <dependency>
+ <groupId>org.iri_research.renkan</groupId>
+ <artifactId>renkan-core</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.inject</groupId>
+ <artifactId>javax.inject</artifactId>
+ <version>${javax-inject-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>${javax-servlet-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.ws.rs</groupId>
+ <artifactId>javax.ws.rs-api</artifactId>
+ <version>${jaxrs-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.annotation</groupId>
+ <artifactId>javax.annotation-api</artifactId>
+ <version>${javax-annotation-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>bayeux-api</artifactId>
+ <version>${cometd-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-java-common</artifactId>
+ <version>${cometd-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-java-annotations</artifactId>
+ <version>${cometd-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.cometd.java</groupId>
+ <artifactId>cometd-websocket-jetty</artifactId>
+ <version>${cometd-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-bots</artifactId>
+ <version>${coweb-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-server</artifactId>
+ <version>${coweb-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-client</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-continuation</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-http</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-io</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-jmx</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-util</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb</groupId>
+ <artifactId>coweb-javascript</artifactId>
+ <version>${coweb-version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opencoweb.cowebx</groupId>
+ <artifactId>cowebx-widgets-dojo</artifactId>
+ <version>${cowebx-version}</version>
+ <type>war</type>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.core</groupId>
+ <artifactId>jersey-server</artifactId>
+ <version>${jersey-version}</version>
+ </dependency>
+ <!--dependency>
+ <groupId>org.glassfish.jersey.media</groupId>
+ <artifactId>jersey-media-json-jackson</artifactId>
+ <version>${jersey-version}</version>
+ </dependency-->
+ <dependency>
+ <groupId>org.glassfish.jersey.ext</groupId>
+ <artifactId>jersey-spring3</artifactId>
+ <version>${jersey-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.jersey.test-framework.providers</groupId>
+ <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
+ <version>${jersey-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.mongodb</groupId>
+ <artifactId>mongo-java-driver</artifactId>
+ <version>${mongo-driver-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-log4j12</artifactId>
+ <version>${slf4j-log4j12-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>${spring-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${spring-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-commons</artifactId>
+ <version>${spring-data-commons-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-jpa</artifactId>
+ <version>${spring-data-jpa-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-mongodb</artifactId>
+ <version>${spring-data-mongodb-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.persistence</groupId>
+ <artifactId>persistence-api</artifactId>
+ <version>${javax-persistence-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>${junit-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>${javax-servlet-jstl-version}</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.thymeleaf</groupId>
+ <artifactId>thymeleaf</artifactId>
+ <version>${thymeleaf-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.thymeleaf</groupId>
+ <artifactId>thymeleaf-spring3</artifactId>
+ <version>${thymeleaf-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.thymeleaf.extras</groupId>
+ <artifactId>thymeleaf-extras-springsecurity3</artifactId>
+ <version>${thymeleaf-springsecurity-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.thymeleaf.extras</groupId>
+ <artifactId>thymeleaf-joda-dialect</artifactId>
+ <version>${thymeleaf-joda-dialect-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>net.sourceforge.nekohtml</groupId>
+ <artifactId>nekohtml</artifactId>
+ <version>${nekohtml-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-json-provider</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.datatype</groupId>
+ <artifactId>jackson-datatype-joda</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>${commons-codec-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.jetty.aggregate</groupId>
+ <artifactId>jetty-all</artifactId>
+ <version>${jetty-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-core</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-web</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-config</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-acl</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-taglibs</artifactId>
+ <version>${spring-security-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>de.undercouch</groupId>
+ <artifactId>bson4jackson</artifactId>
+ <version>${bson4jackson-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>joda-time</groupId>
+ <artifactId>joda-time</artifactId>
+ <version>${joda-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.validation</groupId>
+ <artifactId>validation-api</artifactId>
+ <version>${javax-validation-api-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ <version>${hibernate-validator-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ <version>${guava-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.jayway.jsonpath</groupId>
+ <artifactId>json-path-assert</artifactId>
+ <version>${json-path-version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ <version>${commons-io-version}</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <organization>
+ <name>IRI</name>
+ <url>http://www.iri.centrepompidou.fr</url>
+ </organization>
+</project>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/assembly/management-application-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,20 @@
+<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
+ <fileSets>
+ <fileSet>
+ <outputDirectory>META-INF</outputDirectory>
+ <directory>src/main/management</directory>
+ <includes>
+ <include>*.*</include>
+ </includes>
+ </fileSet>
+ <fileSet>
+ <outputDirectory>META-INF/i18n</outputDirectory>
+ <directory>src/main/webapp/WEB-INF/i18n</directory>
+ <includes>
+ <include>*.*</include>
+ </includes>
+ </fileSet>
+ </fileSets>
+</assembly>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/AuthController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,29 @@
+package org.iri_research.renkan.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping("/auth")
+public class AuthController {
+
+ @SuppressWarnings("unused")
+ private final Logger logger = LoggerFactory.getLogger(AuthController.class);
+
+ @RequestMapping(value = "/login", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String login() {
+ return "auth/login";
+ }
+
+ @RequestMapping(value = "/loginfailed", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String loginFailed(Model model) {
+
+ model.addAttribute("login_error", true);
+ return "auth/login";
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/RenkanController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,204 @@
+package org.iri_research.renkan.controller;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.Constants.EditMode;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.RenkanProperties;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.rest.ObjectMapperProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.HttpServerErrorException;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.annotation.ObjectIdGenerators.UUIDGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+@Controller
+@RequestMapping("/p")
+public class RenkanController {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(RenkanController.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @Autowired
+ private ObjectMapperProvider mapperProvider;
+
+ private void checkCowebkey(String cowebkey, Project project,
+ Constants.EditMode editMode) {
+ if (cowebkey == null || cowebkey.isEmpty()) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Cowebkey missing");
+ }
+ try {
+ if (!project.checkKey(cowebkey, editMode)) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Bad cowebkey");
+ }
+ } catch (RenkanException e) {
+ throw new HttpServerErrorException(
+ HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
+ }
+ }
+
+ @RequestMapping(value = "/copy", method = RequestMethod.POST, produces = { "application/json;charset=UTF-8" })
+ public @ResponseBody
+ Project copyProject(@RequestParam(value = "project_id") String projectId) {
+
+ if (projectId == null || projectId.length() == 0) {
+ throw new IllegalArgumentException(
+ "RenkanContoller.renkanProject.copyProject: Project id is null or empty.");
+ }
+ Project project = this.projectsRepository.findOne(projectId);
+ if (project == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
+ + projectId + " not found for copyProject.");
+ }
+
+ Project newProject = this.projectsRepository.copy(project,
+ project.getTitle() + " (copy)");
+
+ return newProject;
+ }
+
+ @RequestMapping(value = "/{project_id}", method = RequestMethod.GET, produces = {
+ "text/html;charset=UTF-8", "!image/*" })
+ public ModelAndView renkanProject(
+ @PathVariable(value = "project_id") String project_id,
+ @RequestHeader(value = "Accept") String accept_header,
+ @RequestParam(value = "cowebkey") String cowebkey)
+ throws HttpMediaTypeNotSupportedException {
+
+ this.logger.debug("renkanProject : " + project_id + " Accept : "
+ + accept_header != null ? accept_header : "" + ", cowebkey: "
+ + cowebkey != null ? cowebkey : "");
+
+ if (project_id == null || project_id.length() == 0) {
+ throw new IllegalArgumentException(
+ "RenkanContoller.renkanProject: Project id is null or empty.");
+ }
+
+ Project project = this.projectsRepository.findOne(project_id);
+
+ if (project == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
+ + project_id + " not found.");
+ }
+
+ this.checkCowebkey(cowebkey, project, EditMode.EDITION);
+
+ Map<String, Object> model = new HashMap<String, Object>();
+ model.put("coweb_debug", Boolean.parseBoolean(RenkanProperties
+ .getInstance().getProperty("renkan.coweb.debug", "false")));
+ model.put("coweb_websockets", Boolean.parseBoolean(RenkanProperties
+ .getInstance().getProperty("renkan.coweb.websocket", "true")));
+ model.put("project", project);
+ model.put("space", spacesRepository.findOne(project.getSpaceId()));
+
+ return new ModelAndView("renkanProjectEdit", model);
+ }
+
+ @RequestMapping(value = "/pub/{project_id}", method = RequestMethod.GET, produces = {
+ "text/html;charset=UTF-8", "!image/*" })
+ public String renkanPublishProject(Model model,
+ @PathVariable(value = "project_id") String projectId,
+ @RequestParam(value = "cowebkey") String cowebkey) {
+ if (projectId == null || projectId.length() == 0) {
+ throw new IllegalArgumentException(
+ "RenkanContoller.renkanProject: Project id is null or empty.");
+ }
+
+ Project project = this.projectsRepository.findOne(projectId);
+ if (project == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
+ + projectId + " not found.");
+ }
+
+ this.checkCowebkey(cowebkey, project, EditMode.READ_ONLY);
+
+ model.addAttribute("project", project);
+ model.addAttribute("space",
+ spacesRepository.findOne(project.getSpaceId()));
+
+ return "renkanProjectPublish";
+ }
+
+ @RequestMapping(value = "/exp/{project_id}", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
+ public @ResponseBody String exportProject(@PathVariable(value = "project_id") String projectId, HttpServletResponse response) throws JsonProcessingException {
+
+ ObjectMapper mapper = this.mapperProvider.getContext(ObjectMapper.class);
+
+ Project project = this.projectsRepository.findOne(projectId);
+
+ if (project == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
+ + projectId + " not found.");
+ }
+
+ ObjectNode jsonNode = mapper.valueToTree(project);
+
+ jsonNode.remove("id");
+
+ Iterator<JsonNode> nodes = jsonNode.get("nodes").elements();
+
+ HashMap<String, String> nodeIds = new HashMap<String, String>();
+ UUIDGenerator uuidgens = new UUIDGenerator();
+
+ while(nodes.hasNext()) {
+ ObjectNode nodeNode = (ObjectNode) nodes.next();
+ String nodeId = nodeNode.get("id").asText();
+ String atId = uuidgens.generateId(nodeNode).toString();
+ nodeIds.put(nodeId, atId);
+ nodeNode.put("@id", atId);
+ nodeNode.remove("id");
+ nodeNode.remove("project_id");
+ }
+
+ Iterator<JsonNode> edges = jsonNode.get("edges").elements();
+ while(edges.hasNext()) {
+ ObjectNode edgeNode = (ObjectNode) edges.next();
+ edgeNode.put("from", nodeIds.get(edgeNode.get("from").asText()));
+ edgeNode.put("to", nodeIds.get(edgeNode.get("to").asText()));
+ edgeNode.remove("id");
+ edgeNode.remove("project_id");
+ }
+
+ String res = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);
+
+ response.setContentType("application/force-download");
+ response.setHeader("Content-Transfer-Encoding", "binary");
+ response.setHeader("Content-Disposition", "attachment; filename=\""+ projectId +".json\"");
+
+ return res;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/RenkanRootController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,96 @@
+package org.iri_research.renkan.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.servlet.ModelAndView;
+
+@Controller
+@RequestMapping("/")
+public class RenkanRootController {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(RenkanRootController.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String renkanIndex(
+ Model model,
+ @PageableDefault(sort = { "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
+ HttpServletRequest request) {
+
+ Page<Space> page = this.spacesRepository.findAll(p);
+
+ model.addAttribute("page", page);
+ model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
+ model.addAttribute("projectsCount",
+ this.projectsRepository.getCountBySpace());
+
+ return "renkanIndex";
+ }
+
+ @RequestMapping(value = "/s/{space_id}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public ModelAndView spaceIndex(
+ @PathVariable("space_id") String spaceId,
+ @RequestParam(required = false) String filter,
+ @PageableDefault(sort = { "updated", "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
+ HttpServletRequest request) {
+
+ logger.debug("SpaceId : " + (spaceId == null ? "null" : spaceId));
+
+ Map<String, Object> model = new HashMap<String, Object>();
+
+ if ("_".equals(spaceId)) {
+ spaceId = null;
+ }
+
+ Space space = this.spacesRepository.findOne(spaceId);
+
+ if (null == space) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Space "
+ + spaceId + " not found.");
+ }
+
+ model.put("space", space);
+ Page<Project> page;
+ if (filter != null && !filter.isEmpty()) {
+ page = this.projectsRepository.findBySpaceIdAndTitleRegex(spaceId,
+ filter, p);
+ } else {
+ page = this.projectsRepository.findBySpaceId(spaceId, p);
+ }
+
+ model.put("page", page);
+ model.put("baseUrl", Utils.buildBaseUrl(request));
+
+ return new ModelAndView("projectIndex", model);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/Utils.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,31 @@
+package org.iri_research.renkan.controller;
+
+import java.util.Enumeration;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class Utils {
+
+ public static String buildBaseUrl(HttpServletRequest request) {
+ StringBuffer baseUrl = request.getRequestURL();
+ boolean firstParam = true;
+ Enumeration<?> namesEnum = request.getParameterNames();
+ while (namesEnum.hasMoreElements()) {
+ String paramName = (String) namesEnum.nextElement();
+
+ if ("p.page".equals(paramName)) {
+ continue;
+ }
+ for (String val : request.getParameterValues(paramName)) {
+ if (firstParam) {
+ baseUrl.append('?');
+ firstParam = false;
+ } else {
+ baseUrl.append('&');
+ }
+ baseUrl.append(paramName).append('=').append(val);
+ }
+ }
+ return baseUrl.toString();
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/VersionHandlerInterceptor.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,55 @@
+package org.iri_research.renkan.controller;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.Attributes;
+import java.util.jar.Manifest;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
+@Component
+public class VersionHandlerInterceptor extends HandlerInterceptorAdapter {
+
+ @SuppressWarnings("unused")
+ private final Logger logger = LoggerFactory
+ .getLogger(VersionHandlerInterceptor.class);
+
+ private static String version = null;
+
+ @Override
+ public void postHandle(HttpServletRequest request,
+ HttpServletResponse response, Object handler,
+ ModelAndView modelAndView) throws Exception {
+ if(modelAndView != null) {
+ if(version == null) {
+ ServletContext context = request.getServletContext();
+ InputStream inputStream = context.getResourceAsStream("/META-INF/MANIFEST.MF");
+ if(inputStream != null) {
+ try {
+ Manifest manifest = new Manifest(inputStream);
+ Attributes att = manifest.getMainAttributes();
+ version = att.getValue("Implementation-Version");
+ }
+ catch(IOException e) {
+ version = "N/A";
+ }
+ }
+ if(version == null) {
+ version = "NULL";
+ }
+ else if (version == "") {
+ version = "EMPTY";
+ }
+ }
+ modelAndView.addObject("version", version);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/AbstractRenkanObjectAdminController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,5 @@
+package org.iri_research.renkan.controller.admin;
+
+public abstract class AbstractRenkanObjectAdminController {
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/AdminController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,22 @@
+package org.iri_research.renkan.controller.admin;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping("/admin")
+public class AdminController {
+
+ @SuppressWarnings("unused")
+ private final Logger logger = LoggerFactory
+ .getLogger(AdminController.class);
+
+ @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String adminIndex() {
+ return "admin/adminIndex";
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/GroupsAdminController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,193 @@
+package org.iri_research.renkan.controller.admin;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Locale;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.controller.Utils;
+import org.iri_research.renkan.forms.GroupForm;
+import org.iri_research.renkan.forms.GroupFormValidator;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.client.HttpClientErrorException;
+
+@Controller
+@RequestMapping("/admin/groups")
+public class GroupsAdminController {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(GroupsAdminController.class);
+
+ @Inject
+ private GroupsRepository groupsRepository;
+
+ @Inject
+ private UsersRepository usersRepository;
+
+
+ @InitBinder(value = { "group" })
+ protected void initBinder(WebDataBinder binder) {
+ binder.setValidator(new GroupFormValidator());
+ }
+
+ @InitBinder
+ public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
+ dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
+ }
+
+ @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String groupsList(
+ Model model,
+ @PageableDefault(sort = { "title" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
+ HttpServletRequest request) {
+
+ Page<Group> page = this.groupsRepository.findAll(p);
+
+ model.addAttribute("page", page);
+ model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
+ //TODO: add user count
+
+ return "admin/groupsList";
+ }
+
+ @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editGroup(Model model) {
+ return editGroup(model, null);
+ }
+
+ @RequestMapping(value = "/edit/{groupId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editGroup(Model model,
+ @PathVariable(value = "groupId") String groupId) {
+
+ GroupForm groupForm = null;
+ Group group = null;
+
+ if (groupId != null && groupId.length() > 0 && !"_".equals(groupId)) {
+ group = this.groupsRepository.findOne(groupId);
+ if (group == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "group " + groupId + " not found");
+ }
+ }
+ groupForm = new GroupForm(group);
+
+ model.addAttribute("group", groupForm);
+ model.addAttribute("allUsers", this.usersRepository.findAll());
+
+ return "admin/groupEdit";
+ }
+
+ @RequestMapping(value = "/save", method = RequestMethod.POST)
+ public String saveGroup(Model model,
+ @ModelAttribute("group") @Valid GroupForm groupForm,
+ BindingResult bindingResult) {
+
+ logger.debug("group title " + groupForm.getTitle());
+ logger.debug("user description " + groupForm.getDescription());
+
+ if (bindingResult.hasErrors()) {
+ return "admin/groupEdit";
+ }
+
+ groupForm.setGroupsRepository(groupsRepository);
+
+ try {
+ groupForm.save();
+ } catch (RenkanException e) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "group "
+ + groupForm.getId()==null?"":groupForm.getId() + " not found");
+ }
+
+ return "redirect:/admin/groups";
+ }
+
+ @RequestMapping(value = "/delete/{groupId}")
+ public String deleteGroup(HttpServletRequest request, Model model,
+ @PathVariable(value = "groupId") String groupId,
+ @RequestParam(value = "key", required = false) String key,
+ @RequestParam(value = "salt", required = false) String salt)
+ throws NoSuchAlgorithmException, RenkanException {
+
+ if (groupId == null || groupId.length() == 0) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Null or empty user id");
+ }
+
+ RequestMethod method = RequestMethod.valueOf(request.getMethod());
+
+ //TODO: check that group have no user
+
+
+ if (RequestMethod.GET.equals(method)) {
+
+ Group group = this.groupsRepository.findOne(groupId);
+
+ if (group == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "group " + groupId + " not found");
+ }
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String newSalt = Hex.encodeHexString(rawSalt);
+
+ model.addAttribute("groupObj", group);
+ model.addAttribute("salt", newSalt);
+ model.addAttribute("key", group.getKey(newSalt));
+
+ return "admin/groupDeleteConfirm";
+
+ } else if (RequestMethod.POST.equals(method) && key != null
+ && !key.isEmpty() && salt != null && !salt.isEmpty()) {
+
+ if (groupId != null && groupId.length() > 0) {
+
+ Group group = this.groupsRepository.findOne(groupId);
+ if (group != null) {
+ if (group.checkKey(key, salt)) {
+ this.groupsRepository.delete(groupId);
+ } else {
+ throw new HttpClientErrorException(
+ HttpStatus.BAD_REQUEST, "Key not ckecked");
+ }
+ }
+
+ }
+ return "redirect:/admin/groups";
+
+ } else {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Bad request method or parameters");
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/SpacesAdminController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,190 @@
+package org.iri_research.renkan.controller.admin;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.controller.Utils;
+import org.iri_research.renkan.forms.SpaceForm;
+import org.iri_research.renkan.forms.SpaceFormValidator;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.client.HttpClientErrorException;
+
+@Controller
+@RequestMapping("/admin/spaces")
+public class SpacesAdminController {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(SpacesAdminController.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @InitBinder(value = { "space" })
+ protected void initBinder(WebDataBinder binder) {
+ binder.setValidator(new SpaceFormValidator());
+ }
+
+ @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String spacesList(
+ Model model,
+ @PageableDefault(sort = { "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
+ HttpServletRequest request) {
+
+ Page<Space> page = this.spacesRepository.findAll(p);
+
+ model.addAttribute("page", page);
+ model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
+ model.addAttribute("projectsCount",
+ this.projectsRepository.getCountBySpace());
+
+ return "admin/spacesList";
+ }
+
+ @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editSpace(Model model) {
+ return editSpace(model, null);
+ }
+
+ @RequestMapping(value = "/edit/{spaceId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editSpace(Model model,
+ @PathVariable(value = "spaceId") String spaceId) {
+
+ SpaceForm spaceForm = null;
+
+ if (spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) {
+ spaceForm = new SpaceForm();
+ } else {
+ Space space = this.spacesRepository.findOne(spaceId);
+ if (space == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "space " + spaceId + " not found");
+ }
+ spaceForm = new SpaceForm(space);
+ }
+
+ model.addAttribute("space", spaceForm);
+
+ return "admin/spaceEdit";
+ }
+
+ @RequestMapping(value = "/save", method = RequestMethod.POST)
+ public String saveSpace(Model model,
+ @ModelAttribute("space") @Valid SpaceForm spaceForm,
+ BindingResult bindingResult) {
+
+ logger.debug("space title " + spaceForm.getTitle());
+ logger.debug("space description " + spaceForm.getDescription());
+
+ if (bindingResult.hasErrors()) {
+ return "admin/spaceEdit";
+ }
+
+ spaceForm.setSpacesRepository(spacesRepository);
+
+ try {
+ spaceForm.save();
+ } catch (RenkanException e) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space "
+ + spaceForm.getId() + " not found");
+ }
+
+ return "redirect:/admin/spaces";
+ }
+
+ @RequestMapping(value = "/delete/{spaceId}")
+ public String deleteSpace(HttpServletRequest request, Model model,
+ @PathVariable(value = "spaceId") String spaceId,
+ @RequestParam(value = "key", required = false) String key,
+ @RequestParam(value = "salt", required = false) String salt)
+ throws NoSuchAlgorithmException, RenkanException {
+
+ if (spaceId == null || spaceId.length() == 0) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Null or empty space id");
+ }
+
+ RequestMethod method = RequestMethod.valueOf(request.getMethod());
+
+ Map<String, Integer> nbProj = this.projectsRepository
+ .getCountBySpace(Arrays.asList(spaceId));
+ if (nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue() > 0) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "This space have projects");
+ }
+
+ if (RequestMethod.GET.equals(method)) {
+
+ Space space = this.spacesRepository.findOne(spaceId);
+
+ if (space == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "space " + spaceId + " not found");
+ }
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String newSalt = Hex.encodeHexString(rawSalt);
+
+ model.addAttribute("spaceObj", space);
+ model.addAttribute("salt", newSalt);
+ model.addAttribute("key", space.getKey(newSalt));
+
+ return "admin/spaceDeleteConfirm";
+ } else if (RequestMethod.POST.equals(method) && key != null
+ && !key.isEmpty() && salt != null && !salt.isEmpty()) {
+
+ if (spaceId != null && spaceId.length() > 0) {
+
+ Space space = this.spacesRepository.findOne(spaceId);
+ if (space != null) {
+ if (space.checkKey(key, salt)) {
+ this.spacesRepository.delete(spaceId);
+ } else {
+ throw new HttpClientErrorException(
+ HttpStatus.BAD_REQUEST, "Key not ckecked");
+ }
+ }
+
+ }
+ return "redirect:/admin/spaces";
+
+ } else {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Bad request method or parameters");
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,209 @@
+package org.iri_research.renkan.controller.admin;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.controller.Utils;
+import org.iri_research.renkan.forms.UserForm;
+import org.iri_research.renkan.forms.UserFormValidator;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.propertyeditors.StringTrimmerEditor;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.client.HttpClientErrorException;
+
+@Controller
+@RequestMapping("/admin/users")
+public class UsersAdminController {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(UsersAdminController.class);
+
+ @Inject
+ private UsersRepository usersRepository;
+
+ @Inject
+ private ProjectsRepository projectsRepository;
+
+ @Inject
+ private GroupsRepository groupsRepository;
+
+ @Resource(name="renkanPasswordEncoder")
+ private PasswordEncoder passwordEncoder;
+
+ @InitBinder(value = { "user" })
+ protected void initBinder(WebDataBinder binder) {
+ binder.setValidator(new UserFormValidator());
+ }
+
+ @InitBinder
+ public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
+ dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
+ }
+
+ @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String usersList(
+ Model model,
+ @PageableDefault(sort = { "username" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
+ HttpServletRequest request) {
+
+ Page<User> page = this.usersRepository.findAll(p);
+
+ model.addAttribute("page", page);
+ model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
+ model.addAttribute("projectsCount",
+ this.projectsRepository.getCountByUser());
+
+ return "admin/usersList";
+ }
+
+ @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editUser(Model model) {
+ return editUser(model, null);
+ }
+
+ @RequestMapping(value = "/edit/{userId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
+ public String editUser(Model model,
+ @PathVariable(value = "userId") String userId) {
+
+ UserForm userForm = null;
+ User user = null;
+
+ if (userId != null && userId.length() > 0 && !"_".equals(userId)) {
+ user = this.usersRepository.findOne(userId);
+ if (user == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "user " + userId + " not found");
+ }
+ }
+ userForm = new UserForm(user);
+
+ model.addAttribute("user", userForm);
+ model.addAttribute("allGroups", this.groupsRepository.findAll());
+
+ return "admin/userEdit";
+ }
+
+ @RequestMapping(value = "/save", method = RequestMethod.POST)
+ public String saveUser(Model model,
+ @ModelAttribute("user") @Valid UserForm userForm,
+ BindingResult bindingResult) {
+
+ logger.debug("user title " + userForm.getTitle());
+ logger.debug("user description " + userForm.getDescription());
+
+ if (bindingResult.hasErrors()) {
+ return "admin/userEdit";
+ }
+
+ userForm.setUsersRepository(usersRepository);
+ userForm.setPasswordEncoder(passwordEncoder);
+
+ try {
+ userForm.save();
+ } catch (RenkanException e) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "user "
+ + userForm.getId()==null?"":userForm.getId() + " not found");
+ }
+
+ return "redirect:/admin/users";
+ }
+
+ @RequestMapping(value = "/delete/{userId}")
+ public String deleteUser(HttpServletRequest request, Model model,
+ @PathVariable(value = "userId") String userId,
+ @RequestParam(value = "key", required = false) String key,
+ @RequestParam(value = "salt", required = false) String salt)
+ throws NoSuchAlgorithmException, RenkanException {
+
+ if (userId == null || userId.length() == 0) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Null or empty user id");
+ }
+
+ RequestMethod method = RequestMethod.valueOf(request.getMethod());
+
+ Map<String, Integer> nbProj = this.projectsRepository
+ .getCountByUser(Arrays.asList(userId));
+ if (nbProj.containsKey(userId) && nbProj.get(userId).intValue() > 0) {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "This user have projects");
+ }
+
+ if (RequestMethod.GET.equals(method)) {
+
+ User user = this.usersRepository.findOne(userId);
+
+ if (user == null) {
+ throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
+ "user " + userId + " not found");
+ }
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String newSalt = Hex.encodeHexString(rawSalt);
+
+ model.addAttribute("userObj", user);
+ model.addAttribute("salt", newSalt);
+ model.addAttribute("key", user.getKey(newSalt));
+
+ return "admin/userDeleteConfirm";
+
+ } else if (RequestMethod.POST.equals(method) && key != null
+ && !key.isEmpty() && salt != null && !salt.isEmpty()) {
+
+ if (userId != null && userId.length() > 0) {
+
+ User user = this.usersRepository.findOne(userId);
+ if (user != null) {
+ if (user.checkKey(key, salt)) {
+ this.usersRepository.delete(userId);
+ } else {
+ throw new HttpClientErrorException(
+ HttpStatus.BAD_REQUEST, "Key not ckecked");
+ }
+ }
+
+ }
+ return "redirect:/admin/users";
+
+ } else {
+ throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
+ "Bad request method or parameters");
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,272 @@
+package org.iri_research.renkan.coweb;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.coweb.DefaultSessionModerator;
+import org.iri_research.renkan.coweb.event.ISyncEventManager;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.RenkanSessionModeratorState;
+import org.iri_research.renkan.models.RosterUser;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.ApplicationContext;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
+public class RenkanSessionModerator extends DefaultSessionModerator {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(RenkanSessionModerator.class);
+
+ private ProjectsRepository projectsRepository;
+
+ public RenkanSessionModerator() {
+ super();
+ }
+
+ public ProjectsRepository getProjectsRepository() {
+ if (this.projectsRepository == null) {
+ ApplicationContext context = SpringConfigurer.getInstance()
+ .getApplicationContext();
+ this.projectsRepository = (ProjectsRepository) context
+ .getBean("projectsRepository");
+ }
+ return projectsRepository;
+ }
+
+ @Override
+ public synchronized boolean canClientJoinSession(String clientId,
+ Map<String, Object> userDefined) {
+
+ this.logger.debug("canClientJoinSession: " + clientId + " , "
+ + (userDefined == null ? "null" : userDefined.toString()));
+
+ if (RenkanSessionModeratorState.INSTANCE.getUsersActivationMap()
+ .containsKey(clientId)) {
+ this.logger
+ .warn("Client id already declared in user activation map: "
+ + clientId);
+ }
+
+ String projectId = (String) userDefined.get("project_id");
+
+ if (projectId == null) {
+ return false;
+ }
+
+ RenkanSessionModeratorState.INSTANCE.getUsersActivationMap().put(
+ clientId, projectId);
+ return true;
+ }
+
+ private synchronized void activateProject(String clientId) {
+
+ if (!RenkanSessionModeratorState.INSTANCE.getUsersActivationMap()
+ .containsKey(clientId)) {
+ this.logger.warn("Client id not declared in user activation map: "
+ + clientId);
+ return;
+ }
+ String project_id = RenkanSessionModeratorState.INSTANCE
+ .getUsersActivationMap().get(clientId);
+ if (project_id == null) {
+ this.logger
+ .warn("Null project id for client id in user activation map: "
+ + clientId);
+ return;
+ }
+
+ List<String> user_list = RenkanSessionModeratorState.INSTANCE
+ .getProjectsActivationMap().get(project_id);
+ if (user_list == null) {
+ user_list = new ArrayList<String>();
+ RenkanSessionModeratorState.INSTANCE.getProjectsActivationMap()
+ .put(project_id, user_list);
+ }
+
+ if (!user_list.contains(clientId)) {
+ user_list.add(clientId);
+ }
+
+ }
+
+ @Override
+ public synchronized void onClientJoinSession(String clientId) {
+
+ this.logger.debug("onClientJoinSession: " + clientId);
+
+ this.activateProject(clientId);
+
+ }
+
+ @Override
+ public synchronized void onClientLeaveSession(String clientId) {
+
+ this.logger.debug("onClientLeaveSession: " + clientId);
+
+ String project_id = RenkanSessionModeratorState.INSTANCE
+ .getUsersActivationMap().get(clientId);
+
+ RenkanSessionModeratorState.INSTANCE.getUsersActivationMap().remove(
+ clientId);
+ if (project_id == null) {
+ this.logger.warn("Leaving client have no associated project: "
+ + clientId);
+ return;
+ }
+
+ List<String> user_list = RenkanSessionModeratorState.INSTANCE
+ .getProjectsActivationMap().get(project_id);
+ if (user_list == null) {
+ this.logger
+ .warn("Leaving client have associated project but no project list : "
+ + clientId + ", " + project_id);
+ return;
+ }
+
+ if (!user_list.remove(clientId)) {
+ this.logger
+ .warn("Leaving client have associated project but not in project list : "
+ + clientId + ", " + project_id);
+ return;
+ }
+
+ if (user_list.isEmpty()) {
+ this.logger
+ .debug("Leaving client, project list empty, removing from active projects: "
+ + clientId + ", " + project_id);
+ RenkanSessionModeratorState.INSTANCE.getProjectsActivationMap()
+ .remove(project_id);
+ }
+
+ List<RosterUser> r_user_list = RenkanSessionModeratorState.INSTANCE
+ .getProjectsUsersList().get(project_id);
+ if (r_user_list == null) {
+ this.logger
+ .warn("Leaving client have associated project but no user list : "
+ + clientId + ", " + project_id);
+ return;
+ }
+ for (RosterUser rosterUser : r_user_list) {
+ if (rosterUser.getClientId().equals(clientId)) {
+ r_user_list.remove(rosterUser);
+ }
+ }
+ if (r_user_list.isEmpty()) {
+ this.logger
+ .debug("Leaving client, user list empty, removing from active projects: "
+ + clientId + ", " + project_id);
+ RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().remove(
+ project_id);
+ }
+
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public synchronized void onSync(String clientId, Map<String, Object> data) {
+
+ this.logger.debug("Debugging onSync client id: " + clientId);
+ this.logger.debug("Debugging onSync: " + data.toString());
+ this.logger.debug("Debugging onSync channel: " + data.get("channel"));
+ this.logger.debug("Debugging onSync type: " + data.get("type"));
+ this.logger.debug("Debugging onSync site: " + data.get("site"));
+ this.logger.debug("Debugging onSync value: " + data.get("value"));
+ this.logger.debug("Debugging onSync position: " + data.get("position"));
+
+ Map<String, Object> values = null;
+ if (data.containsKey("value") && data.get("value") != null) {
+ values = ((Map<String, Object>) data.get("value"));
+ }
+
+ if (values == null) {
+ this.logger.warn("onSync : no values in message.");
+ return;
+ }
+
+ String sync_type = (String) values.get("_type");
+ if (sync_type == null || sync_type.length() == 0) {
+ this.logger.warn("onSync : no type in value of message.");
+ return;
+ }
+
+ if (sync_type.startsWith("_")) {
+ this.logger.debug("onSync : type sync begin with _, ignore. "
+ + sync_type);
+ return;
+ }
+
+ ApplicationContext context = SpringConfigurer.getInstance()
+ .getApplicationContext();
+
+ String beanName = String.format("%sSyncEventManager",
+ sync_type.toLowerCase());
+
+ try {
+ ISyncEventManager<?, ?> eventManager = (ISyncEventManager<?, ?>) context
+ .getBean(beanName);
+ logger.debug("Debugging on Sync : dispatch to " + beanName);
+ eventManager.dispatchEvent(clientId, data);
+ } catch (Throwable e) {
+ this.logger.error(String.format(
+ "onSync EventManagerClass %s not found : error %s : %s",
+ sync_type, e.toString(), e.getMessage()));
+ //TODO: better manage errors (message back to the user, close the session ?
+ }
+
+ }
+
+ @Override
+ public Map<String, Object> getLateJoinState() {
+ this.logger.debug("getLateJoinState");
+
+ Map<String, Object> res = super.getLateJoinState();
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JodaModule());
+
+ for (String clientId : RenkanSessionModeratorState.INSTANCE
+ .getUsersActivationMap().keySet()) {
+ this.activateProject(clientId);
+ }
+
+ this.logger.debug("getLateJoinState : Project activated");
+
+ for (String project_id : RenkanSessionModeratorState.INSTANCE
+ .getProjectsActivationMap().keySet()) {
+
+ Project p = this.getProjectsRepository().findOne(project_id);
+ if (p != null) {
+ try {
+ res.put("renkan_" + project_id,
+ mapper.writeValueAsString(p));
+ } catch (JsonProcessingException e) {
+ this.logger.error("Error when deserializing project "
+ + project_id, e);
+ }
+ }
+
+ String user_res = "[]";
+ if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
+ .containsKey(project_id)) {
+ try {
+ user_res = mapper
+ .writeValueAsString(RenkanSessionModeratorState.INSTANCE
+ .getProjectsUsersList().get(project_id));
+ } catch (JsonProcessingException e) {
+ this.logger.error("Error when deserializing user list "
+ + project_id, e);
+ }
+ }
+ res.put("users_" + project_id, user_res);
+ }
+
+ this.logger.debug("getLateJoinState res : " + res.toString());
+ return res;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/SpringConfigurer.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,49 @@
+package org.iri_research.renkan.coweb;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+// @Scope("prototype")
+public class SpringConfigurer implements ApplicationContextAware {
+
+ // private BayeuxServer bayeuxServer;
+ // private ServerAnnotationProcessor processor;
+ private final Logger logger = LoggerFactory
+ .getLogger(SpringConfigurer.class);
+ private ApplicationContext context;
+
+ private static volatile SpringConfigurer instance = null;
+
+ private SpringConfigurer() {
+ this.logger.debug("Building SpringConfigurer");
+ }
+
+ public static SpringConfigurer getInstance() {
+ if (instance == null) {
+ synchronized (SpringConfigurer.class) {
+ if (instance == null) {
+ instance = new SpringConfigurer();
+ }
+ }
+ }
+ return instance;
+ }
+
+ @Override
+ @Inject
+ public void setApplicationContext(ApplicationContext context)
+ throws BeansException {
+ this.context = context;
+ }
+
+ public ApplicationContext getApplicationContext() {
+ return this.context;
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/AbstractBaseSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,100 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.models.IRenkanModel;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.ProjectSync;
+import org.iri_research.renkan.repositories.ProjectSyncsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractBaseSyncEventManager<T extends IRenkanModel<ID>, ID extends Serializable>
+ implements ISyncEventManager<T, ID> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(AbstractBaseSyncEventManager.class);
+
+ @Inject
+ private ProjectsRepository projectsRepository;
+
+ @Inject
+ private ProjectSyncsRepository projectSyncsRepository;
+
+ @Override
+ public ProjectsRepository getProjectsRepository() {
+ return this.projectsRepository;
+ }
+
+ @Override
+ public void dispatchEvent(String clientId, Map<String, Object> data) {
+
+ this.saveSyncEvent(data);
+
+ String eventType = (String) data.get("type");
+
+ if ("null".equalsIgnoreCase(eventType)) {
+ this.nullOperation(null, data);
+ } else if ("update".equalsIgnoreCase(eventType)) {
+ this.update(clientId, data);
+ } else if ("insert".equalsIgnoreCase(eventType)) {
+ this.insert(clientId, data);
+ } else if ("delete".equalsIgnoreCase(eventType)) {
+ this.delete(clientId, data);
+ } else {
+ logger.warn(String.format("dispatchEvent : eventType unknown %s",
+ eventType));
+ }
+ }
+
+ private void saveSyncEvent(Map<String, Object> data) {
+
+ String project_id = null;
+ String user_id = null;
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+
+ if (values != null) {
+ project_id = (String) values.get("_project_id");
+ }
+
+ if (project_id == null || "".equals(project_id)) {
+ logger.warn("saveSyncEvent : project id is null. Can not save sync event");
+ return;
+ }
+
+ Project p = this.projectsRepository.findOne(project_id);
+
+ if (p == null) {
+ logger.warn("saveSyncEvent : project not found. Can not save sync event");
+ return;
+ }
+
+ p.setUpdated(new DateTime());
+ this.projectsRepository.save(p);
+
+ user_id = (String) values.get("_user_id");
+
+ if (user_id == null) {
+ logger.warn("saveSyncEvent : No user id");
+ }
+
+ try {
+ ProjectSync ps = this.projectSyncsRepository.getProjectSync(
+ data.toString(), p, user_id);
+ this.projectSyncsRepository.save(ps);
+ } catch (RenkanException e) {
+ logger.warn(
+ "saveSyncEvent : Error when getting Projectr syn object", e);
+ }
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/AbstractSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,162 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.IRenkanModel;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBObject;
+import com.mongodb.WriteResult;
+
+public abstract class AbstractSyncEventManager<T extends IRenkanModel<ID>, ID extends Serializable>
+ extends AbstractBaseSyncEventManager<T, ID>
+ implements IPersistedSyncEventManager<T, ID> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(AbstractSyncEventManager.class);
+
+ @Override
+ public abstract IRenkanRepository<T, ID> getObjectRepository();
+
+ protected abstract List<T> getObjectList(Project project);
+
+ protected abstract void checkUpdate(String clientId, Map<String, Object> data);
+
+ @Override
+ public void update(String clientId, Map<String, Object> data) {
+
+ this.logger.debug("AbstractSyncEventManager: update "
+ + this.getClass().getName());
+
+ checkUpdate(clientId, data);
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String obj_id = (String) values.get("id");
+
+ this.logger.debug(String.format("update %s %s", this.getClass()
+ .getName(), obj_id));
+
+ DBCollection objCollection = this.getObjectRepository().getCollection();
+ DBObject obj = objCollection.findOne(obj_id);
+
+ if (null == obj) {
+ throw new CowebException("Object update: object not found",
+ String.format("Object %s not found in %s", obj_id,
+ objCollection.getName()));
+ }
+
+ boolean obj_changed = false;
+ // update object
+ for (String fieldname : values.keySet()) {
+ if (!"id".equalsIgnoreCase(fieldname) && !fieldname.startsWith("_")) {
+ Object new_value = values.get(fieldname);
+ Object old_value = obj.get(fieldname);
+ if ((new_value == null && old_value != null)
+ || (new_value != null && !new_value.equals(old_value))) {
+ obj.put(fieldname, new_value);
+ obj_changed = true;
+ }
+ }
+ }
+
+ if (obj_changed) {
+ obj.put("_id", obj_id);
+ WriteResult res = this.getObjectRepository().getCollection()
+ .update(new BasicDBObject("_id", obj_id), obj, true, false);
+
+ if (!res.getLastError().ok()) {
+ throw new CowebException(String.format(
+ "Error when writing object %s in %s", obj_id,
+ objCollection.getName()), res.getLastError()
+ .getErrorMessage());
+ }
+ }
+ }
+
+ @Override
+ public abstract void insert(String clientId, Map<String, Object> data);
+
+
+ protected abstract void checkDelete(String clientId, Map<String, Object> data);
+
+ @Override
+ public void delete(String clientId, Map<String, Object> data) {
+
+ this.logger.debug("AbstractSyncEventManager: delete "
+ + this.getClass().getName());
+ checkDelete(clientId, data);
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+ Project project = this.getProjectsRepository().findOne(project_id);
+
+ if (null == project) {
+ throw new CowebException(this.getClass().getName()
+ + " delete: project not found", String.format(
+ "Project %s not found", project_id));
+ }
+
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("object delete: bad delete position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+ int index = position.intValue();
+
+ @SuppressWarnings("unchecked")
+ ID object_id = (ID) values.get("id");
+
+ this.logger.debug(String.format(
+ "delete object %s in pos %d for project %s", object_id, index,
+ project_id));
+
+ IRenkanModel<ID> currentObject = null;
+
+ List<T> objList = this.getObjectList(project);
+
+ if (index < objList.size()) {
+ currentObject = objList.get(index);
+ }
+
+ if (currentObject == null || !object_id.equals(currentObject.getId())) {
+ index = -1;
+ this.logger
+ .warn(String
+ .format("delete object %s in pos %d for project %s not current object",
+ object_id, index, project_id));
+ for (int i = 0; i < project.getNodes().size(); i++) {
+ if (object_id.equals(objList.get(i).getId())) {
+ index = i;
+ break;
+ }
+ }
+ }
+
+ if (index < 0) {
+ this.logger.warn(String.format(
+ "delete object %s in pos %d for project %s not found",
+ object_id, index, project_id));
+ } else {
+ objList.remove(index);
+ this.getObjectRepository().delete(object_id);
+ this.getProjectsRepository().save(project);
+ }
+
+ }
+
+ @Override
+ public abstract void nullOperation(String clientId, Map<String, Object> data);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/EdgeSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,166 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Named
+public class EdgeSyncEventManager extends
+ AbstractSyncEventManager<Edge, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(EdgeSyncEventManager.class);
+
+ @Inject
+ private NodesRepository nodesRepository;
+
+ @Inject
+ private UsersRepository usersRepository;
+
+ @Inject
+ private EdgesRepository edgesRepository;
+
+ public NodesRepository getNodesRepository() {
+ return nodesRepository;
+ }
+
+ public UsersRepository getUsersRepository() {
+ return usersRepository;
+ }
+
+ public EdgesRepository getEdgesRepository() {
+ return edgesRepository;
+ }
+
+ @Override
+ public IRenkanRepository<Edge, String> getObjectRepository() {
+ return this.getEdgesRepository();
+ }
+
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+
+ // get project
+ this.logger.debug("EdgeSyncEventManager: insert Edge");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+
+ Project project = this.getProjectsRepository().findOne(project_id);
+
+ if (null == project) {
+ throw new CowebException("Edge insert: project not found",
+ String.format("Project %s not found", project_id));
+ }
+
+ String creator_id = (String) values.get("created_by");
+
+ String from_node_id = (String) values.get("from");
+ Node from_node = this.getNodesRepository().findOne(from_node_id);
+
+ if (null == from_node) {
+ throw new CowebException("Edge insert: from not found",
+ String.format("from %s not found", from_node_id));
+ }
+
+ String to_node_id = (String) values.get("to");
+ Node to_node = this.getNodesRepository().findOne(to_node_id);
+
+ if (null == to_node) {
+ throw new CowebException("Edge insert: to not found",
+ String.format("to %s not found", to_node_id));
+ }
+
+ String edge_id = (String) values.get("id");
+
+ //check that edge id is unique
+ if(this.getEdgesRepository().exists(edge_id)) {
+ throw new CowebException("edge insert: edge exists",
+ String.format("Edge %s already exists", edge_id));
+ }
+
+ Edge edge = new Edge(edge_id, (String) values.get("title"),
+ (String) values.get("description"), (String) values.get("uri"),
+ (String) values.get("color"), from_node, to_node, creator_id,
+ project_id);
+
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("Edge insert: bad insert position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+ int index = position.intValue();
+ List<Edge> edges = project.getEdges();
+ if (index > edges.size()) {
+ index = edges.size();
+ }
+ edges.add(index, edge);
+
+ this.getEdgesRepository().save(edge);
+ this.getProjectsRepository().save(project);
+
+ }
+
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ this.logger.debug("nullOperation: NOP");
+ }
+
+ @Override
+ protected List<Edge> getObjectList(Project project) {
+ return project.getEdges();
+ }
+
+ private boolean checkWrite(String clientId, Map<String, Object> data) {
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+
+ String edge_id = (String) values.get("id");
+
+ Edge edge = this.getEdgesRepository().findOne(edge_id);
+
+ if(edge==null) {
+ return true;
+ }
+ else if ( (project_id == edge.getProjectId()) || (project_id != null && project_id.equals(edge.getProjectId()))) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ @Override
+ protected void checkUpdate(String clientId, Map<String, Object> data) {
+
+ if(!checkWrite(clientId, data)) {
+ throw new CowebException("Error when updating edge","Edge not in correct project");
+ }
+ }
+
+ @Override
+ protected void checkDelete(String clientId, Map<String, Object> data) {
+ if(!checkWrite(clientId, data)) {
+ throw new CowebException("Error when updating edge","Edge not in correct project");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/IPersistedSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.io.Serializable;
+
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+
+public interface IPersistedSyncEventManager<T, ID extends Serializable> extends
+ ISyncEventManager<T, ID> {
+
+ public ProjectsRepository getProjectsRepository();
+
+ public IRenkanRepository<T, ID> getObjectRepository();
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ISyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,22 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.iri_research.renkan.repositories.ProjectsRepository;
+
+public interface ISyncEventManager<T, ID extends Serializable> {
+
+ public void dispatchEvent(String clientId, Map<String, Object> data);
+
+ public void update(String clientId, Map<String, Object> data);
+
+ public void insert(String clientId, Map<String, Object> data);
+
+ public void delete(String clientId, Map<String, Object> data);
+
+ public void nullOperation(String clientId, Map<String, Object> data);
+
+ public ProjectsRepository getProjectsRepository();
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/NodeSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,156 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.mongodb.core.geo.Point;
+
+@Named
+public class NodeSyncEventManager extends
+ AbstractSyncEventManager<Node, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(NodeSyncEventManager.class);
+
+ @Inject
+ private NodesRepository nodesRepository;
+
+ @Inject
+ private UsersRepository usersRepository;
+
+ public NodesRepository getNodesRepository() {
+ return nodesRepository;
+ }
+
+ @Override
+ public IRenkanRepository<Node, String> getObjectRepository() {
+ return this.getNodesRepository();
+ }
+
+ public UsersRepository getUsersRepository() {
+ return this.usersRepository;
+ }
+
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+
+ // get project
+ this.logger.debug("NodeSyncEventManager: insert Node");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+
+ Project project = this.getProjectsRepository().findOne(project_id);
+
+ if (null == project) {
+ throw new CowebException("node insert: project not found",
+ String.format("Project %s not found", project_id));
+ }
+
+ String creator_id = (String) values.get("created_by");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> positionValues = (Map<String, Object>) values
+ .get("position");
+
+ Point nodePosition = new Point(
+ ((Number) positionValues.get("x")).doubleValue(),
+ ((Number) positionValues.get("y")).doubleValue());
+
+ String image = (String) values.get("image");
+
+ String node_id = (String) values.get("id");
+
+ //check that node id is unique
+ if(this.getNodesRepository().exists(node_id)) {
+ throw new CowebException("node insert: node exists",
+ String.format("node %s already exists", node_id));
+ }
+
+
+ Integer size = (Integer) values.get("size");
+
+ Node node = new Node(node_id, (String) values.get("title"),
+ (String) values.get("description"), (String) values.get("uri"),
+ (String) values.get("color"), creator_id, nodePosition, image,
+ size, project_id);
+
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("node insert: bad insert position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+ int index = position.intValue();
+ List<Node> nodes = project.getNodes();
+ if (index > nodes.size()) {
+ index = nodes.size();
+ }
+ nodes.add(index, node);
+
+ this.getNodesRepository().save(node);
+ this.getProjectsRepository().save(project);
+
+ }
+
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ this.logger.debug("nullOperation: NOP");
+ }
+
+ @Override
+ protected List<Node> getObjectList(Project project) {
+ return project.getNodes();
+ }
+
+ private boolean checkWrite(String clientId, Map<String, Object> data) {
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+
+ String node_id = (String) values.get("id");
+
+ Node node = this.getNodesRepository().findOne(node_id);
+
+ if(node==null) {
+ return true;
+ }
+ else if ( (project_id == node.getProjectId()) || (project_id != null && project_id.equals(node.getProjectId()))) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ @Override
+ protected void checkUpdate(String clientId, Map<String, Object> data) {
+
+ if(!checkWrite(clientId, data)) {
+ throw new CowebException("Error when updating node","Node not in correct project");
+ }
+ }
+
+ @Override
+ protected void checkDelete(String clientId, Map<String, Object> data) {
+ if(!checkWrite(clientId, data)) {
+ throw new CowebException("Error when updating node","Node not in correct project");
+ }
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ProjectSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,87 @@
+/**
+ *
+ */
+package org.iri_research.renkan.coweb.event;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author ymh
+ *
+ */
+@Named
+public class ProjectSyncEventManager extends
+ AbstractSyncEventManager<Project, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(ProjectSyncEventManager.class);
+
+ @Override
+ public IRenkanRepository<Project, String> getObjectRepository() {
+ return this.getProjectsRepository();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#insert(java
+ * .util.Map)
+ */
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+ this.logger.debug("Insert called, do nothing");
+ // do nothing
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#delete(java
+ * .util.Map)
+ */
+ @Override
+ public void delete(String clientId, Map<String, Object> data) {
+ this.logger.debug("Delete called, do nothing");
+ // do nothing
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#nullOperation
+ * (java.util.Map)
+ */
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ this.logger.debug("Null called, do nothing");
+ // do nothing
+ }
+
+ @Override
+ protected List<Project> getObjectList(Project project) {
+ this.logger.error("Get object list called error");
+ throw new UnsupportedOperationException("Get object list called error");
+ }
+
+ @Override
+ protected void checkUpdate(String clientId, Map<String, Object> data) {
+ //do nothing
+ }
+
+ @Override
+ protected void checkDelete(String clientId, Map<String, Object> data) {
+ //do nothing
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/RosterSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,188 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Named;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.RenkanSessionModeratorState;
+import org.iri_research.renkan.models.RosterUser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Named
+public class RosterSyncEventManager extends
+ AbstractBaseSyncEventManager<RosterUser, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(RosterSyncEventManager.class);
+
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+ logger.debug("RosterUserSyncEventManager.insert " + data.toString());
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String projectId = (String) values.get("_project_id");
+
+ List<RosterUser> usersList = null;
+
+ if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
+ .containsKey(projectId)) {
+ usersList = RenkanSessionModeratorState.INSTANCE
+ .getProjectsUsersList().get(projectId);
+ }
+ if (usersList == null) {
+ usersList = new ArrayList<RosterUser>();
+ RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().put(
+ projectId, usersList);
+ }
+
+ String id = (String) values.get("id");
+
+ RosterUser user = null;
+
+ for (RosterUser rosterUser : usersList) {
+ if (rosterUser.getId().equals(id)) {
+ user = rosterUser;
+ break;
+ }
+ }
+ if (user != null) {
+ this.update(clientId, data);
+ return;
+ }
+
+ String title = (String) values.get("title");
+ String description = (String) values.get("description");
+ String uri = (String) values.get("uri");
+ String color = (String) values.get("color");
+ Long site_id = (Long) values.get("site_id");
+
+ user = new RosterUser(id, title, description, uri, color, projectId,
+ site_id, clientId);
+
+ Integer position = (Integer) data.get("position");
+ if (position == null) {
+ position = new Integer(0);
+ }
+
+ usersList.add(position.intValue(), user);
+
+ logger.debug("RosterUserSyncEventManager.insert in "
+ + projectId
+ + " : "
+ + RenkanSessionModeratorState.INSTANCE
+ .getProjectsActivationMap().toString());
+
+ }
+
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ // do nothing
+ return;
+ }
+
+ @Override
+ public void update(String clientId, Map<String, Object> data) {
+ logger.debug("RosterUserSyncEventManager.update " + data.toString());
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String projectId = (String) values.get("_project_id");
+
+ List<RosterUser> usersList = null;
+
+ if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
+ .containsKey(projectId)) {
+ usersList = RenkanSessionModeratorState.INSTANCE
+ .getProjectsUsersList().get(projectId);
+ }
+
+ if (usersList == null) {
+ logger.debug("RosterUserSyncEventManager.update : null user list");
+ return;
+ }
+
+ String id = (String) values.get("id");
+
+ RosterUser user = null;
+
+ for (RosterUser rosterUser : usersList) {
+ if (rosterUser.getId().equals(id)) {
+ user = rosterUser;
+ break;
+ }
+ }
+
+ if (user == null) {
+ logger.debug("RosterUserSyncEventManager.update : user not found in list");
+ return;
+ }
+
+ String title = (String) values.get("title");
+ String description = (String) values.get("description");
+ String uri = (String) values.get("uri");
+ String color = (String) values.get("color");
+
+ if (title != null) {
+ user.setTitle(title);
+ }
+ if (description != null) {
+ user.setDescription(description);
+ }
+ if (uri != null) {
+ user.setUri(uri);
+ }
+ if (color != null) {
+ user.setColor(color);
+ }
+
+ return;
+
+ }
+
+ @Override
+ public void delete(String clientId, Map<String, Object> data) {
+ logger.debug("RosterUserSyncEventManager.delete " + data.toString());
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String projectId = (String) values.get("_project_id");
+
+ List<RosterUser> usersList = null;
+
+ if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
+ .containsKey(projectId)) {
+ usersList = RenkanSessionModeratorState.INSTANCE
+ .getProjectsUsersList().get(projectId);
+ }
+
+ if (usersList == null) {
+ logger.debug("RosterUserSyncEventManager.delete : null user list");
+ return;
+ }
+
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("object delete: bad delete position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+ int index = position.intValue();
+
+ usersList.remove(index);
+
+ if (usersList.isEmpty()) {
+ RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().remove(
+ projectId);
+ }
+
+ return;
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,107 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Named
+public class UserSyncEventManager extends
+ AbstractSyncEventManager<User, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(UserSyncEventManager.class);
+
+ private final static String DEFAULT_COLOR = "#000080";
+
+ @Inject
+ private UsersRepository usersRepository;
+
+ public UsersRepository getUsersRepository() {
+ return this.usersRepository;
+ }
+
+ @Override
+ public IRenkanRepository<User, String> getObjectRepository() {
+ return this.getUsersRepository();
+ }
+
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+
+ // get project
+ this.logger.debug("UserSyncEventManager: insert User");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String project_id = (String) values.get("_project_id");
+
+ Project project = this.getProjectsRepository().findOne(project_id);
+
+ if (null == project) {
+ throw new CowebException("user insert: project not found",
+ String.format("Project %s not found", project_id));
+ }
+
+ String user_id = (String) values.get("id");
+ String color = (String) values.get("color");
+ if (color == null || color.length() == 0) {
+ color = UserSyncEventManager.DEFAULT_COLOR;
+ }
+
+ User user = new User(user_id, (String) values.get("title"),
+ (String) values.get("description"), (String) values.get("uri"),
+ color);
+
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("node insert: bad insert position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+ int index = position.intValue();
+ // TODO: correct this. done that to compile
+ List<User> users = new ArrayList<User>();// project.getUsers();
+ if (index > users.size()) {
+ index = users.size();
+ }
+ users.add(index, user);
+
+ this.getUsersRepository().save(user);
+ this.getProjectsRepository().save(project);
+
+ }
+
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ this.logger.debug("nullOperation: NOP");
+ }
+
+ @Override
+ protected List<User> getObjectList(Project project) {
+ // TODO: correct this, this is wrong, just put here to cpmpile
+ return null;
+ }
+
+ @Override
+ protected void checkUpdate(String clientId, Map<String, Object> data) {
+ // do nothing
+ }
+
+ @Override
+ protected void checkDelete(String clientId, Map<String, Object> data) {
+ // do nothing
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ViewSyncEventManager.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,210 @@
+package org.iri_research.renkan.coweb.event;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.coweb.CowebException;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.View;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.mongodb.core.geo.Point;
+
+import com.google.common.base.CaseFormat;
+
+@Named
+public class ViewSyncEventManager extends AbstractBaseSyncEventManager<View, String> {
+
+ private final Logger logger = LoggerFactory
+ .getLogger(ViewSyncEventManager.class);
+
+ @Inject
+ private UsersRepository usersRepository;
+
+ public UsersRepository getUsersRepository() {
+ return usersRepository;
+ }
+
+
+ @Override
+ public void insert(String clientId, Map<String, Object> data) {
+
+ // get project
+ this.logger.debug("EdgeSyncEventManager: insert view");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ Project project = getProject(values);
+
+ String view_id = (String) values.get("id");
+ //check that view id is unique
+ for (View pview : project.getViews()) {
+ if(pview.getId() != null && pview.getId().equals(view_id)) {
+ throw new CowebException("view insert: view exists",
+ String.format("view %s already exists", view_id));
+ }
+ }
+ View view = new View(view_id, null, null , null, null, null, 1.0, null);
+
+ updateViewInstance(values, view_id, view);
+
+ int index = this.getPosition(data);
+
+ List<View> views = project.getViews();
+ if (index > views.size()) {
+ index = views.size();
+ }
+ views.add(index, view);
+
+ this.getProjectsRepository().save(project);
+
+ }
+
+ private Project getProject(Map<String, Object> values)
+ throws CowebException {
+ String project_id = (String) values.get("_project_id");
+
+ Project project = this.getProjectsRepository().findOne(project_id);
+
+ if (null == project) {
+ throw new CowebException("View insert: project not found",
+ String.format("Project %s not found", project_id));
+ }
+ return project;
+ }
+
+ @Override
+ public void nullOperation(String clientId, Map<String, Object> data) {
+ this.logger.debug("nullOperation: NOP");
+ }
+
+ @Override
+ public void update(String clientId, Map<String, Object> data) {
+ this.logger.debug("ViewSyncEventManager: update "
+ + this.getClass().getName());
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+ String obj_id = (String) values.get("id");
+
+ this.logger.debug(String.format("update %s %s", this.getClass()
+ .getName(), obj_id));
+
+ Project project = getProject(values);
+
+ int position = getPosition(data);
+
+ if(position<0 || position >= project.getViews().size()) {
+ throw new CowebException("View update: bad position",
+ String.format("View %s bad position %d", obj_id, position));
+ }
+ View targetView = project.getViews().get(position);
+
+ boolean obj_changed = updateViewInstance(values, obj_id, targetView);
+
+ if(obj_changed) {
+ targetView.setUpdated(new DateTime());
+ this.getProjectsRepository().save(project);
+ }
+ }
+
+ private boolean updateViewInstance(Map<String, Object> values,
+ String obj_id, View targetView) throws CowebException {
+ boolean obj_changed = false;
+ // update object
+ for (String fieldname : values.keySet()) {
+ if (!"id".equalsIgnoreCase(fieldname) && !fieldname.startsWith("_")) {
+ String upperCaseFieldname = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, fieldname);
+ switch(fieldname) {
+ case "offset":
+ @SuppressWarnings("unchecked")
+ HashMap<String, Double> offset = (HashMap<String, Double>) values.get("offset");
+ Point offsetPoint = null;
+ if(offset != null) {
+ offsetPoint = new Point(offset.get("x")!= null?offset.get("x").doubleValue():0, offset.get("y")!=null?offset.get("y").doubleValue():0);
+ }
+ Point oldOffsetPoint = targetView.getOffset();
+ if ((offsetPoint == null && oldOffsetPoint != null)
+ || (offsetPoint != null && !offsetPoint.equals(oldOffsetPoint))) {
+ targetView.setOffset(offsetPoint);
+ obj_changed = true;
+ }
+ break;
+ case "zoom_level":
+ Double newZoomLevelDouble = (Double)values.get("zoom_level");
+ double newZoomLevel = newZoomLevelDouble==null?1.0:newZoomLevelDouble.doubleValue();
+ double oldNewZoomLevel = targetView.getZoomLevel();
+ if(newZoomLevel != oldNewZoomLevel) {
+ targetView.setZoomLevel(newZoomLevel);
+ obj_changed = true;
+ }
+ break;
+ default:
+ try {
+ Object new_value = values.get(fieldname);
+ logger.debug(String.format("field %s : new value class : %s ", fieldname, new_value == null?"NULL":new_value.getClass().toString()));
+ Object old_value = View.class.getMethod("get"+upperCaseFieldname).invoke(targetView);
+ if ((new_value == null && old_value != null)
+ || (new_value != null && !new_value.equals(old_value))) {
+ View.class.getMethod("set"+upperCaseFieldname, View.class.getMethod("get"+upperCaseFieldname).getReturnType()).invoke(targetView, new_value);
+ obj_changed = true;
+ }
+ }
+ catch (IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException
+ | SecurityException e) {
+ throw new CowebException("View update: problem on field update",
+ String.format("View %s bad field update %s : %s", obj_id, fieldname, e.toString()));
+ }
+ break;
+ }
+ }
+ }
+ return obj_changed;
+ }
+
+ private int getPosition(Map<String, Object> data) throws CowebException {
+ Integer position = (Integer) data.get("position");
+
+ if (position == null || position < 0) {
+ throw new CowebException("get position: bad insert position",
+ String.format("Bad position %s not found",
+ position == null ? "null" : position.toString()));
+ }
+
+ return position.intValue();
+ }
+
+ @Override
+ public void delete(String clientId, Map<String, Object> data) {
+
+ this.logger.debug("ViewSyncEventManager: delete "
+ + this.getClass().getName());
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> values = (Map<String, Object>) data.get("value");
+
+ Project project = getProject(values);
+ int position = getPosition(values);
+
+ this.logger.debug(String.format("delete %s %d", this.getClass()
+ .getName(), position));
+
+ if(position<0 || position > project.getViews().size()) {
+ throw new CowebException("node delete: bad delete position",
+ String.format("Bad position %d not found", position));
+ }
+
+ project.getViews().remove(position);
+
+ this.getProjectsRepository().save(project);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/GroupForm.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,84 @@
+package org.iri_research.renkan.forms;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class GroupForm extends RenkanForm<String, Group> {
+
+ private String avatar;
+ private Set<String> users;
+
+ private GroupsRepository groupsRepository;
+
+
+ public GroupForm() {
+ super();
+ }
+
+ public GroupForm(Group model) {
+ super(model);
+ if (model != null) {
+ this.avatar = model.getAvatar();
+ this.setUsers(new HashSet<>(model.getUsers()));
+ if(model.getUsers() != null) {
+ this.getUsers().addAll(model.getUsers());
+ }
+ }
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ @Override
+ protected Group getModelInstance() {
+ return new Group();
+ }
+
+ @Override
+ protected IRenkanRepository<Group, String> getRepository() {
+ return this.groupsRepository;
+ }
+
+ public GroupsRepository getGroupsRepository() {
+ return groupsRepository;
+ }
+
+
+ @Override
+ protected void saveToModel() {
+ if (this.getId() == null || this.getId().length() == 0) {
+ this.model.setId(Constants.UUID_GENERATOR.generate().toString());
+ }
+ this.model.setAvatar(this.avatar);
+ if(this.getUsers() != null) {
+ this.groupsRepository.setUsersList(model, this.getUsers());
+ }
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+
+ @Autowired
+ public void setGroupsRepository(GroupsRepository groupsRepository) {
+ this.groupsRepository = groupsRepository;
+ }
+
+ public Set<String> getUsers() {
+ return users;
+ }
+
+ public void setUsers(Set<String> users) {
+ this.users = users;
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/GroupFormValidator.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,27 @@
+package org.iri_research.renkan.forms;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+@Component
+public class GroupFormValidator implements Validator {
+
+ @SuppressWarnings("unused")
+ private Logger logger = LoggerFactory.getLogger(GroupFormValidator.class);
+
+ @Override
+ public boolean supports(Class<?> clazz) {
+ return GroupForm.class.equals(clazz);
+ }
+
+ @Override
+ public void validate(Object target, Errors errors) {
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
+ "renkan.error.name.empty");
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/RenkanForm.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,116 @@
+package org.iri_research.renkan.forms;
+
+import java.io.Serializable;
+
+import org.iri_research.renkan.RenkanException;
+import org.iri_research.renkan.models.IRenkanModel;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+
+public abstract class RenkanForm<ID extends Serializable, RM extends IRenkanModel<ID>> {
+
+ protected RM model;
+
+ private ID id;
+ private String title;
+ private String description;
+ private String uri;
+ private String color;
+
+ protected abstract void saveToModel();
+
+ protected abstract IRenkanRepository<RM, ID> getRepository();
+
+ protected abstract RM getModelInstance();
+
+ public RenkanForm() {
+ }
+
+ public RenkanForm(RM model) {
+ if (model == null) {
+ return;
+ }
+ this.model = model;
+ this.id = model.getId();
+ this.title = model.getTitle();
+ this.description = model.getDescription();
+ this.color = model.getColor();
+ this.uri = model.getUri();
+ }
+
+ public ID getId() {
+ return id;
+ }
+
+ public void setId(ID id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getUri() {
+ return uri;
+ }
+
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public void setModel(RM model) {
+ this.model = model;
+ }
+
+ private void saveToRenkanModel() {
+
+ this.model.setTitle(title);
+ this.model.setDescription(description);
+ this.model.setColor(color);
+ this.model.setUri(uri);
+ }
+
+ public RM save() throws RenkanException {
+
+ if (this.model == null) {
+
+ if (this.getId() != null) {
+ this.model = this.getRepository().findOne(this.getId());
+ if (this.model == null) {
+ throw new RenkanException("Model id "
+ + this.getId().toString() + " not found");
+ }
+ } else {
+ this.model = this.getModelInstance();
+ }
+ }
+
+ this.saveToRenkanModel();
+ this.saveToModel();
+
+ this.model = this.getRepository().save(this.model);
+
+ return this.model;
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/SpaceForm.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,66 @@
+package org.iri_research.renkan.forms;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+
+public class SpaceForm extends RenkanForm<String, Space> {
+
+ private SpacesRepository spacesRepository;
+
+ public SpaceForm() {
+ super();
+ }
+
+ public SpaceForm(Space model) {
+ super(model);
+ this.binConfig = model.getBinConfig();
+ this.image = model.getImage();
+ }
+
+ private String binConfig;
+ private String image;
+
+ public String getBinConfig() {
+ return binConfig;
+ }
+
+ public void setBinConfig(String binConfig) {
+ this.binConfig = binConfig;
+ }
+
+ public String getImage() {
+ return image;
+ }
+
+ public void setImage(String image) {
+ this.image = image;
+ }
+
+ @Override
+ protected void saveToModel() {
+ if (this.getId() == null || this.getId().length() == 0) {
+ this.model.setId(Constants.UUID_GENERATOR.generate().toString());
+ this.model.setCreated(new DateTime());
+ }
+ this.model.setBinConfig(binConfig);
+ this.model.setImage(image);
+ }
+
+ @Override
+ protected IRenkanRepository<Space, String> getRepository() {
+ return this.spacesRepository;
+ }
+
+ @Override
+ protected Space getModelInstance() {
+ return new Space();
+ }
+
+ public void setSpacesRepository(SpacesRepository spacesRepository) {
+ this.spacesRepository = spacesRepository;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/SpaceFormValidator.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,56 @@
+package org.iri_research.renkan.forms;
+
+import java.io.IOException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
+@Component
+public class SpaceFormValidator implements Validator {
+
+ private Logger logger = LoggerFactory.getLogger(SpaceFormValidator.class);
+
+ @Override
+ public boolean supports(Class<?> clazz) {
+ return SpaceForm.class.equals(clazz);
+ }
+
+ @Override
+ public void validate(Object target, Errors errors) {
+ SpaceForm space = (SpaceForm) target;
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
+ "renkan.error.title.empty");
+
+ if (space.getBinConfig() != null && space.getBinConfig().length() > 0) {
+ boolean valid = false;
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JodaModule());
+
+ try {
+ mapper.readTree(space.getBinConfig());
+ valid = true;
+ } catch (JsonProcessingException e) {
+ logger.debug(
+ "SpaceValidator JsonProcessingException error validating bin config",
+ e);
+ } catch (IOException e) {
+ logger.debug(
+ "SpaceValidator IOException error validating bin config",
+ e);
+ }
+ if (!valid) {
+ errors.rejectValue("binConfig", "renkan.error.bin_config.json");
+ }
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/UserForm.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,183 @@
+package org.iri_research.renkan.forms;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.LocalDate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.format.annotation.DateTimeFormat.ISO;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+public class UserForm extends RenkanForm<String, User> {
+
+ private String avatar;
+
+ @DateTimeFormat(iso = ISO.DATE)
+ private LocalDate credentialsExpirationDate;
+ @DateTimeFormat(iso = ISO.DATE)
+ private LocalDate expirationDate;
+
+ private String email;
+
+ private boolean enabled;
+ private boolean locked;
+ private String password;
+ private String passwordConfirm;
+ private Set<String> groups;
+ private List<String> userAuthorities;
+
+ private UsersRepository usersRepository;
+
+
+ private PasswordEncoder passwordEncoder;
+
+ public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
+ this.passwordEncoder = passwordEncoder;
+ }
+
+ public UserForm() {
+ super();
+ }
+
+ public UserForm(User model) {
+ super(model);
+ if (model != null) {
+ this.avatar = model.getAvatar();
+ this.credentialsExpirationDate = model.getCredentialsExpirationDate();
+ this.email = model.getEmail();
+ this.expirationDate = model.getExpirationDate();
+ this.enabled = model.isEnabled();
+ this.locked = model.isLocked();
+ this.userAuthorities = model.getUserAuthorities()!=null?new ArrayList<String>(model.getUserAuthorities()):new ArrayList<String>();
+ this.setGroups(new HashSet<>(model.getGroups()));
+ }
+ }
+
+ public String getAvatar() {
+ return avatar;
+ }
+
+ public LocalDate getCredentialsExpirationDate() {
+ return credentialsExpirationDate;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public LocalDate getExpirationDate() {
+ return expirationDate;
+ }
+
+ @Override
+ protected User getModelInstance() {
+ return new User();
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public String getPasswordConfirm() {
+ return passwordConfirm;
+ }
+
+ @Override
+ protected IRenkanRepository<User, String> getRepository() {
+ return this.usersRepository;
+ }
+
+ public UsersRepository getUsersRepository() {
+ return usersRepository;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public boolean isLocked() {
+ return locked;
+ }
+
+ @Override
+ protected void saveToModel() {
+ if (this.getId() == null || this.getId().length() == 0) {
+ this.model.setId(Constants.UUID_GENERATOR.generate().toString());
+ }
+ this.model.setAvatar(this.avatar);
+ this.model.setEmail(this.email);
+ this.model.setCredentialsExpirationDate(this.credentialsExpirationDate);
+ this.model.setExpirationDate(this.expirationDate);
+ this.model.setEnabled(this.enabled);
+ this.model.setLocked(this.locked);
+ this.model.setUserAuthorities((this.userAuthorities!=null && !this.userAuthorities.isEmpty())?new ArrayList<String>(this.userAuthorities):null);
+ if(this.getGroups() != null) {
+ this.usersRepository.setGroupsList(this.model, this.getGroups());
+ }
+ if(this.password != null && this.password.length() > 0) {
+ this.model.setPassword(this.passwordEncoder.encode(this.password));
+ }
+
+ }
+
+ public void setAvatar(String avatar) {
+ this.avatar = avatar;
+ }
+
+ public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
+ this.credentialsExpirationDate = credentialsExpirationDate;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public void setExpirationDate(LocalDate expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+
+ public void setLocked(boolean locked) {
+ this.locked = locked;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public void setPasswordConfirm(String passwordConfirm) {
+ this.passwordConfirm = passwordConfirm;
+ }
+
+ @Autowired
+ public void setUsersRepository(UsersRepository usersRepository) {
+ this.usersRepository = usersRepository;
+ }
+
+ public List<String> getUserAuthorities() {
+ return userAuthorities;
+ }
+
+ public void setUserAuthorities(List<String> userAuthorities) {
+ this.userAuthorities = userAuthorities;
+ }
+
+ public Set<String> getGroups() {
+ return groups;
+ }
+
+ public void setGroups(Set<String> groups) {
+ this.groups = groups;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/forms/UserFormValidator.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,47 @@
+package org.iri_research.renkan.forms;
+
+import org.iri_research.renkan.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.validation.Errors;
+import org.springframework.validation.ValidationUtils;
+import org.springframework.validation.Validator;
+
+@Component
+public class UserFormValidator implements Validator {
+
+ @SuppressWarnings("unused")
+ private Logger logger = LoggerFactory.getLogger(UserFormValidator.class);
+
+ @Override
+ public boolean supports(Class<?> clazz) {
+ return UserForm.class.equals(clazz);
+ }
+
+ @Override
+ public void validate(Object target, Errors errors) {
+ UserForm userForm = (UserForm) target;
+
+ ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
+ "renkan.error.name.empty");
+
+ //TODO : check for user name unicity
+ String pswd = userForm.getPassword();
+ String pswdConf = userForm.getPasswordConfirm();
+
+ if( (pswd == null && pswdConf != null)
+ || ((pswd != null || pswdConf != null) && !pswd.equals(pswdConf))) {
+ errors.rejectValue("password", "renkan.error.password.equals");
+ }
+
+ if(userForm.getId() == null && (pswd == null || pswd.length() == 0)) {
+ errors.rejectValue("password", "renkan.error.password.missing");
+ }
+
+ if(userForm.getUserAuthorities() != null && !Constants.USER_ROLES_ALL.containsAll(userForm.getUserAuthorities())) {
+ errors.rejectValue("userAuthorities", "renkan.error.authorities.bad_value", "Bad role value");
+ }
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/rest/ObjectMapperProvider.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,57 @@
+package org.iri_research.renkan.rest;
+
+import java.io.IOException;
+
+import javax.ws.rs.ext.ContextResolver;
+import javax.ws.rs.ext.Provider;
+
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
+@Component
+@Provider
+public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
+
+ public static class RenkanPointDeserializer extends StdDeserializer<Point> {
+
+ private static final long serialVersionUID = -2380557631785838410L;
+
+ protected RenkanPointDeserializer(Class<?> vc) {
+ super(vc);
+ }
+
+ @Override
+ public Point deserialize(JsonParser jp, DeserializationContext ctxt)
+ throws IOException, JsonProcessingException {
+ JsonNode node = jp.getCodec().readTree(jp);
+ double x = node.get("x") != null? node.get("x").asDouble(): Double.NaN;
+ double y = node.get("y") != null? node.get("y").asDouble(): Double.NaN;
+ Point p = new Point(x, y);
+ return p;
+ }
+ }
+ @Override
+ public ObjectMapper getContext(Class<?> type) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
+ false);
+ objectMapper.registerModule(new JodaModule());
+
+ SimpleModule pointModule = new SimpleModule("RenkanPointModule")
+ .addDeserializer(Point.class, new RenkanPointDeserializer(Point.class));
+ objectMapper.registerModule(pointModule);
+
+ return objectMapper;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,83 @@
+package org.iri_research.renkan.rest;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Singleton;
+import javax.ws.rs.Path;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+//TODO: Add views management
+//TODO: Add user management (on POST for example)
+@Singleton
+@Path("projects")
+@Component
+public class ProjectsResource extends RenkanResource<Project, String> {
+
+ private Logger logger = LoggerFactory.getLogger(ProjectsResource.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+ @Autowired
+ private NodesRepository nodesRepository;
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ @Override
+ protected IRenkanRepository<Project, String> getRepository() {
+ return this.projectsRepository;
+ }
+
+ @Override
+ protected String getNewId() {
+ return Constants.UUID_GENERATOR.generate().toString();
+ }
+
+ @Override
+ protected void prepareObject(Project obj) {
+ if (obj.getCreated() == null) {
+ obj.setCreated(new DateTime());
+ }
+ obj.setUpdated(new DateTime());
+
+ for (Node node : obj.getNodes()) {
+ node.setProjectId(obj.getId());
+ }
+ for (Edge edge : obj.getEdges()) {
+ edge.setProjectId(obj.getId());
+ }
+ }
+
+ @Override
+ protected List<String> getObjectListFieldList() {
+ return Arrays.asList(this.baseObjectListFieldList);
+ }
+
+ @Override
+ protected void doDeleteObject(String objectId) {
+ this.projectsRepository.deleteRecursive(objectId);
+ }
+
+ @Override
+ protected Project saveObjectPost(Project obj) {
+
+ logger.debug("Project Resource : Save object post " + obj.getTitle());
+ this.nodesRepository.save(obj.getNodes());
+ this.edgesRepository.save(obj.getEdges());
+ return super.saveObjectPost(obj);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/rest/RenkanResource.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,225 @@
+package org.iri_research.renkan.rest;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import org.glassfish.jersey.server.JSONP;
+import org.iri_research.renkan.models.IRenkanModel;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+
+public abstract class RenkanResource<T extends IRenkanModel<ID>, ID extends Serializable> {
+
+ private Logger logger = LoggerFactory.getLogger(RenkanResource.class);
+
+ protected String[] baseObjectListFieldList = { "description", "title",
+ "uri", "created", "color" };
+
+ abstract protected IRenkanRepository<T, ID> getRepository();
+
+ abstract protected ID getNewId();
+
+ abstract protected List<String> getObjectListFieldList();
+
+ @Context
+ private UriInfo uriInfo;
+
+ protected DBCollection getCollection() {
+ return this.getRepository().getCollection();
+ }
+
+ abstract protected void prepareObject(T obj);
+
+ protected void doDeleteObject(ID objectId) {
+ this.getRepository().delete(objectId);
+ }
+
+ // TODO: this produce application/javascript by default. I would rather have
+ // application/json. The prefered behaviour would be to produde js only od
+ // the callbacl query param is used
+ @GET
+ @Path("{id : [a-zA-Z\\-0-9]+}")
+ @JSONP(callback = "callback", queryParam = "callback")
+ @Produces({ "application/javascript", "application/x-javascript",
+ "text/ecmascript", "application/ecmascript", "text/jscript",
+ MediaType.APPLICATION_JSON + ";charset=utf-8" })
+ public T getObject(@PathParam("id") ID objectId) {
+
+ this.logger.debug("GetObject: " + objectId);
+
+ T obj = this.getRepository().findOne(objectId);
+
+ if (null == obj) {
+ throw new WebApplicationException(Status.NOT_FOUND);
+ }
+
+ return obj;
+ }
+
+ @DELETE
+ @Path("{id : [a-zA-Z\\-0-9]+}")
+ @Produces(MediaType.TEXT_PLAIN + ";charset=utf-8")
+ public Response deleteObject(@PathParam("id") ID objectId) {
+
+ this.logger.debug("DeleteObject : id " + objectId);
+ this.doDeleteObject(objectId);
+
+ return Response.ok(
+ this.uriInfo.getAbsolutePathBuilder().build().toString()
+ + " deleted").build();
+
+ }
+
+ protected T saveObject(T obj) {
+ return this.getRepository().save(obj);
+ }
+
+ protected T saveObjectPost(T obj) {
+ return this.saveObject(obj);
+ }
+
+ protected T saveObjectPut(T obj) {
+ return this.saveObject(obj);
+ }
+
+ /**
+ * test: curl -i -X PUT -H 'Content-Type: application/json' -d
+ *
+ * @test-data.json http://localhost:8080/renkan/rest/spaces/
+ * 12eff140-e65c-11e1-aff1-0800200c9a66
+ *
+ * @param objId
+ * @param objectContent
+ */
+ @PUT
+ @Path("{id : [a-zA-Z\\-0-9]+}")
+ @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
+ public Response putRenkanObject(@PathParam("id") ID objId, T obj) {
+
+ if (!objId.equals(obj.getId())) {
+ throw new WebApplicationException(Response
+ .status(Status.BAD_REQUEST)
+ .entity("Id parameter and id in JSON do not match").build());
+ }
+
+ if (!this.getRepository().exists(objId)) {
+ throw new WebApplicationException(Response.status(Status.NOT_FOUND)
+ .build());
+ }
+
+ this.saveObjectPut(obj);
+ this.getRepository().save(obj);
+ return Response.noContent().build();
+
+ }
+
+ @POST
+ @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
+ @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
+ public Response postRenkanObject(T obj) {
+
+ if (obj.isIdSet()) {
+ throw new WebApplicationException(Response
+ .status(Status.BAD_REQUEST)
+ .entity("Id in JSON must not be set").build());
+ }
+
+ obj.setId(getNewId());
+ this.prepareObject(obj);
+ obj = this.saveObjectPost(obj);
+ return Response
+ .created(
+ this.uriInfo.getAbsolutePathBuilder()
+ .segment(obj.getId().toString()).build())
+ .entity(obj).build();
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
+ public String getObjectList() throws JsonProcessingException {
+
+ BasicDBObject keys = new BasicDBObject();
+
+ for (String fieldname : this.getObjectListFieldList()) {
+ keys.put(fieldname, 1);
+ }
+ DBCursor cursor = this.getCollection().find(new BasicDBObject(), keys);
+
+ List<DBObject> res = new ArrayList<DBObject>();
+
+ try {
+ while (cursor.hasNext()) {
+ DBObject obj = cursor.next();
+ obj.put("id", obj.get("_id"));
+ DBObject links = new BasicDBObject();
+
+ DBObject linkdef = new BasicDBObject();
+ linkdef.put(
+ "href",
+ this.uriInfo.getAbsolutePathBuilder()
+ .path(obj.get("_id").toString()).build()
+ .toString());
+ linkdef.put("method", "get");
+ linkdef.put("produces", MediaType.APPLICATION_JSON
+ + ";charset=utf-8");
+ links.put("view", linkdef);
+
+ linkdef = new BasicDBObject();
+ linkdef.put(
+ "href",
+ this.uriInfo.getAbsolutePathBuilder()
+ .path(obj.get("_id").toString()).build()
+ .toString());
+ linkdef.put("method", "put");
+ linkdef.put("consumes", MediaType.APPLICATION_JSON
+ + ";charset=utf-8");
+ links.put("update", linkdef);
+
+ linkdef = new BasicDBObject();
+ linkdef.put(
+ "href",
+ this.uriInfo.getAbsolutePathBuilder()
+ .path(obj.get("_id").toString()).build()
+ .toString());
+ linkdef.put("method", "delete");
+ links.put("delete", linkdef);
+
+ obj.put("__links", links);
+ res.add(obj);
+ }
+ } finally {
+ cursor.close();
+ }
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ mapper.registerModule(new JodaModule());
+ return mapper.writeValueAsString(res);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/rest/RestApplication.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,27 @@
+package org.iri_research.renkan.rest;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.server.spring.SpringLifecycleListener;
+import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
+
+public class RestApplication extends ResourceConfig {
+
+ private ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider();
+
+ public RestApplication() {
+
+ this.packages("org.iri_research.renkan.rest");
+ this.register(SpringLifecycleListener.class);
+ this.register(RequestContextFilter.class);
+
+ ObjectMapper objectMapper = this.objectMapperProvider.getContext(ObjectMapper.class);
+
+ JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
+
+ this.register(provider);
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/rest/SpacesResource.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,61 @@
+package org.iri_research.renkan.rest;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.inject.Singleton;
+import javax.ws.rs.Path;
+
+import org.iri_research.renkan.Constants;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.IRenkanRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Singleton
+@Path("spaces")
+@Component
+public class SpacesResource extends RenkanResource<Space, String> {
+
+ @SuppressWarnings("unused")
+ private Logger logger = LoggerFactory.getLogger(SpacesResource.class);
+
+ private String[] spaceObjectListFieldList = { "created_by", "bin_config",
+ "image" };
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @Override
+ protected IRenkanRepository<Space, String> getRepository() {
+ return spacesRepository;
+ }
+
+ @Override
+ protected String getNewId() {
+ return Constants.UUID_GENERATOR.generate().toString();
+ }
+
+ @Override
+ protected void prepareObject(Space obj) {
+ if (obj.getCreated() == null) {
+ obj.setCreated(new DateTime());
+ }
+ }
+
+ @Override
+ protected List<String> getObjectListFieldList() {
+ ArrayList<String> fieldList = new ArrayList<>(
+ this.baseObjectListFieldList.length
+ + this.spaceObjectListFieldList.length);
+ fieldList.addAll(Arrays.asList(this.baseObjectListFieldList));
+ fieldList.addAll(Arrays.asList(this.spaceObjectListFieldList));
+ return fieldList;
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/java/org/iri_research/renkan/services/RenkanUserDetailsService.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,30 @@
+package org.iri_research.renkan.services;
+
+import java.util.List;
+
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RenkanUserDetailsService implements UserDetailsService {
+
+ @Autowired
+ private UsersRepository usersRepository;
+
+ @Override
+ public UserDetails loadUserByUsername(String username)
+ throws UsernameNotFoundException {
+ List<User> res = this.usersRepository.findByTitle(username);
+ if (res == null || res.size() == 0) {
+ throw new UsernameNotFoundException(String.format(
+ "User {0} not found.", username));
+ }
+ return res.get(0);
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/resources/META-INF/applicationContext.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc.xsd"
+>
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+ <mvc:annotation-driven />
+
+ <util:properties id="propsLocations">
+ <prop key="servletContextProps">META-INF/renkan.properties</prop>
+ <prop key="classpathProps">classpath:renkan_run.properties</prop>
+ </util:properties>
+
+ <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1000"/>
+ <property name="location" value="#{propsLocations.servletContextProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="false"/>
+ </bean>
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1"/>
+ <property name="location" value="#{propsLocations.classpathProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="true"/>
+ </bean>
+
+ <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+ <property name="IgnoreResourceNotFound" value="true"/>
+ <property name="locations">
+ <list>
+ <value>#{propsLocations.servletContextProps}</value>
+ <value>#{propsLocations.classpathProps}</value>
+ </list>
+ </property>
+ <property name="fileEncoding" value="UTF-8"/>
+ </bean>
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <bean class="org.iri_research.renkan.RenkanProperties"
+ factory-method="getInstance" />
+
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+ <context:component-scan base-package="org.iri_research.renkan.management" />
+
+ <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
+ <property name="basenames">
+ <list>
+ <value>META-INF/i18n/messages</value>
+ <value>classpath:org/springframework/security/messages</value>
+ </list>
+ </property>
+ <property name="defaultEncoding" value="UTF-8"/>
+ <property name="fallbackToSystemLocale" value="true" />
+ </bean>
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/resources/META-INF/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
+
+ <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="${mongodb.db.name}"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/resources/META-INF/renkan.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+mongodb.host.name = localhost
+mongodb.host.port = 27017
+mongodb.db.name = renkan
+
+user.admin.name = admin
+#user.admin.password = admin
+user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+
+renkan.pagination.size = 2
+renkan.coweb.debug = false
+renkan.coweb.websocket = true
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration>
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.beans.factory">
+ <level value="INFO" />
+ </logger>
+ <!--logger name="org.cometd">
+ <level value="DEBUG" />
+ </logger-->
+ <!--logger name="org.coweb">
+ <level value="DEBUG" />
+ </logger-->
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/applicationContext.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc.xsd"
+>
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+ <mvc:annotation-driven />
+
+ <util:properties id="propsLocations">
+ <prop key="servletContextProps">WEB-INF/renkan.properties</prop>
+ <prop key="classpathProps">classpath:renkan_run.properties</prop>
+ </util:properties>
+
+ <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1000"/>
+ <property name="location" value="#{propsLocations.servletContextProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="false"/>
+ </bean>
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1"/>
+ <property name="location" value="#{propsLocations.classpathProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="true"/>
+ </bean>
+
+ <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
+ <property name="IgnoreResourceNotFound" value="true"/>
+ <property name="locations">
+ <list>
+ <value>#{propsLocations.servletContextProps}</value>
+ <value>#{propsLocations.classpathProps}</value>
+ </list>
+ </property>
+ <property name="fileEncoding" value="UTF-8"/>
+ </bean>
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+ <import resource="spring-security.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <bean class="org.iri_research.renkan.RenkanProperties"
+ factory-method="getInstance" />
+
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+ <context:component-scan base-package="org.iri_research.renkan.management" />
+
+ <!--mvc:annotation-driven>
+ <mvc:argument-resolvers>
+ <bean class="org.springframework.data.web.PageableArgumentResolver">
+ <property name="fallbackPagable">
+ <bean class="org.springframework.data.domain.PageRequest">
+ <constructor-arg type="int" value="1"/>
+ <constructor-arg type="int" value="${renkan.pagination.size}"/>
+ </bean>
+ </property>
+ </bean>
+ </mvc:argument-resolvers>
+ </mvc:annotation-driven-->
+
+ <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
+ <property name="basenames">
+ <list>
+ <value>WEB-INF/i18n/messages</value>
+ <value>classpath:org/springframework/security/messages</value>
+ </list>
+ </property>
+ <property name="defaultEncoding" value="UTF-8"/>
+ <property name="fallbackToSystemLocale" value="true" />
+ </bean>
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/cowebConfig.json Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,6 @@
+{
+ "sessionModerator" : "org.iri_research.renkan.coweb.RenkanSessionModerator",
+ "moderatorIsUpdater" : true,
+ "operationEngine" : true,
+ "bots": []
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/i18n/messages.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,130 @@
+
+date.format = yyyy/MM/dd HH:mm
+date.date.format = yyyy/MM/dd
+date.date.datePicker.format = yy/mm/dd
+question.yes = yes
+question.no = no
+
+
+renkanIndex.renkan_exp = Create a Renkan
+renkanIndex.project_list = Renkan list
+renkanIndex.project_name = Name
+renkanIndex.project_creation = Creation
+renkanIndex.project_updated = Updated
+renkanIndex.project_edit = Edit
+renkanIndex.project_copy = Copy
+renkanIndex.project_delete = Delete
+renkanIndex.project_render = View
+renkanIndex.project_export = Export
+renkanIndex.project_commands = Comm.
+renkanIndex.project_edit_link = Edit renkan
+renkanIndex.project_copy_link = Copy renkan
+renkanIndex.project_delete_link = Delete renkan
+renkanIndex.project_render_link = View renkan
+renkanIndex.project_export_link = Export renkan
+renkanIndex.project_delete_confirm = Delete renkan "<%= title %>" ?
+renkanIndex.project_filter = Filter title
+
+renkanIndex.space_exp = Create a space
+renkanIndex.renkan_title = Title
+renkanIndex.renkan_file = File
+renkanIndex.renkan_spaces = Renkan Spaces
+renkanIndex.renkan_space = Renkan Space
+renkanIndex.space_list = Space list
+renkanIndex.space_name = Name
+renkanIndex.space_title = Title
+renkanIndex.space_creation = Creation date
+renkanIndex.space_open = Open
+renkanIndex.space_open_link = Open space
+renkanIndex.space_proj_count = Renkan count
+
+
+renkanIndex.js.empty_name_error = Please enter a title
+renkanIndex.js.empty_form_error = Please enter a title or a file
+
+renkanAdmin.renkan_admin = Renkan administration
+renkanAdmin.site_admin = Site administration
+
+renkanAdmin.object = Object
+renkanAdmin.object_list = {0} list
+
+renkanAdmin.space_objects_name = Spaces
+renkanAdmin.space_object_name = Spaces
+
+renkanAdmin.space_add = Add space
+renkanAdmin.space_edit = Edit space
+renkanAdmin.space_delete = Delete space
+renkanIndex.space_url = Url
+renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ?
+renkanAdmin.space_proj_count = Nb. Proj.
+
+renkanAdmin.object_name = Name
+renkanAdmin.object_edit = Edit
+renkanAdmin.object_delete = Delete
+renkanAdmin.object_edit_link = Edit
+renkanAdmin.object_delete_link = Del.
+
+renkanAdmin.form.title = Title
+renkanAdmin.form.name = Name
+renkanAdmin.form.uri = URI
+renkanAdmin.form.description = Description
+renkanAdmin.form.color = Color
+renkanAdmin.form.space.bin_config = Bin config
+renkanAdmin.form.space.submit = Ok
+renkanAdmin.form.space.cancel = Cancel
+renkanAdmin.form.space.format = Format
+renkanAdmin.form.space.compact = Compact
+
+renkanAdmin.form.avatar = Avatar
+renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
+renkanAdmin.form.expirationDate = Exp. date
+renkanAdmin.form.email = Email
+renkanAdmin.form.enabled = Enabled
+renkanAdmin.form.locked = Locked
+renkanAdmin.form.password = Password
+renkanAdmin.form.passwordConfirm = Confirm password
+renkanAdmin.form.roles = Roles
+renkanAdmin.form.groups = Groups
+renkanAdmin.form.users = Users
+renkanAdmin.form.user.submit = Ok
+
+renkan.error.title.empty = Title must not be empty or null
+renkan.error.name.empty = Name must not be empty or null
+renkan.error.bin_config.json = bin config field must contain a valid json
+renkan.error.password.equals = Password and Password confimation do not match
+renkan.error.password.missing = Password missing
+renkan.error.authorities.bad_value = Bad value for role
+
+
+renkanAuth.log_in = Log in
+renkanAuth.username_label = Username:
+renkanAuth.password_label = Password:
+renkanAuth.renkan_login = Renkan Authentication
+renkanAdmin.site_login = Site Authentication
+renkanAuth.login_error_message = Your login attempt was not successful, try again.
+renkanAuth.login_error_cause = Cause:
+
+renkanHeader.login = login
+renkanHeader.logout = logout
+renkanHeader.admin = administration
+renkanHeader.home = home
+
+renkan.user.roles.ROLE_USER = User
+renkan.user.roles.ROLE_ADMIN = Admin
+renkan.user.roles.ROLE_SPACES_ADMIN = Space admin
+renkan.user.roles.ROLE_GROUPS_ADMIN = Groups admin
+
+renkanAdmin.user_objects_name = Users
+renkanAdmin.user_add = Add user
+renkanAdmin.user_edit = Edit user
+renkanAdmin.user_delete = Del. user
+renkanIndex.user_url = Url
+renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
+
+renkanAdmin.group_objects_name = Groups
+renkanAdmin.group_add = Add group
+renkanAdmin.group_edit = Edit group
+renkanAdmin.group_delete = Del. group
+renkanIndex.group_url = Url
+renkanAdmin.group_confirm_delete = Do you want to delete the group with groupname "{0}" ?
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/i18n/messages_en.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,134 @@
+
+date.format = yyyy/dd/MM HH:mm
+date.date.format = yyyy/dd/MM
+date.date.datePicker.format = yy/dd/mm
+question.yes = yes
+question.no = no
+
+renkanIndex.renkan_exp = Create a Renkan
+renkanIndex.project_list = Renkan list
+renkanIndex.project_name = Name
+renkanIndex.project_creation = Creation
+renkanIndex.project_updated = Updated
+renkanIndex.project_edit = Edit
+renkanIndex.project_copy = Copy
+renkanIndex.project_delete = Delete
+renkanIndex.project_render = View
+renkanIndex.project_export = Export
+renkanIndex.project_commands = Comm.
+renkanIndex.project_edit_link = Edit renkan
+renkanIndex.project_copy_link = Copy renkan
+renkanIndex.project_delete_link = Delete renkan
+renkanIndex.project_render_link = View renkan
+renkanIndex.project_export_link = Export renkan
+renkanIndex.project_delete_confirm = Delete renkan "<%= title %>" ?
+renkanIndex.project_filter = Filter title
+
+renkanIndex.space_exp = Create a space
+renkanIndex.renkan_title = Title
+renkanIndex.renkan_file = File
+renkanIndex.renkan_spaces = Renkan Spaces
+renkanIndex.renkan_space = Renkan Space
+renkanIndex.space_list = Space list
+renkanIndex.space_name = Name
+renkanIndex.space_title = Title
+renkanIndex.space_creation = Creation date
+renkanIndex.space_open = Open
+renkanIndex.space_open_link = Open space
+renkanIndex.space_proj_count = Renkan count
+
+
+renkanIndex.js.empty_name_error = Please enter a title
+renkanIndex.js.empty_form_error = Please enter a title or a file
+
+renkanAdmin.renkan_admin = Renkan administration
+renkanAdmin.site_admin = Site administration
+
+renkanAdmin.object = Object
+renkanAdmin.object_list = {0} list
+
+renkanAdmin.space_objects_name = Spaces
+renkanAdmin.space_object_name = Spaces
+
+renkanAdmin.space_add = Add space
+renkanAdmin.space_edit = Edit space
+renkanAdmin.space_delete = Del. space
+renkanIndex.space_url = Url
+renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ?
+renkanAdmin.space_proj_count = Nb. Proj.
+
+renkanAdmin.object_name = Name
+renkanAdmin.object_created = Created
+renkanAdmin.object_edit = Edit
+renkanAdmin.object_proj_count = Renkan count
+renkanAdmin.object_delete = Delete
+renkanAdmin.object_edit_link = Edit
+renkanAdmin.object_delete_link = Del.
+
+renkanAdmin.form.title = Title
+renkanAdmin.form.name = Name
+renkanAdmin.form.uri = URI
+renkanAdmin.form.description = Description
+renkanAdmin.form.color = Color
+renkanAdmin.form.space.bin_config = Bin config
+renkanAdmin.form.space.submit = Ok
+renkanAdmin.form.space.cancel = Cancel
+renkanAdmin.form.space.format = Format
+renkanAdmin.form.space.compact = Compact
+
+
+renkanAdmin.user_objects_name = Users
+renkanAdmin.user_add = Add user
+renkanAdmin.user_edit = Edit user
+renkanAdmin.user_delete = Del. user
+renkanIndex.user_url = Url
+renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
+
+renkanAdmin.form.avatar = Avatar
+renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
+renkanAdmin.form.expirationDate = Exp. date
+renkanAdmin.form.email = Email
+renkanAdmin.form.enabled = Enabled
+renkanAdmin.form.locked = Locked
+renkanAdmin.form.password = Password
+renkanAdmin.form.passwordConfirm = Confirm password
+renkanAdmin.form.roles = Roles
+renkanAdmin.form.groups = Groups
+renkanAdmin.form.users = Users
+renkanAdmin.form.user.submit = Ok
+
+
+renkan.error.title.empty = Title must not be empty or null
+renkan.error.name.empty = Name must not be empty or null
+renkan.error.bin_config.json = bin config field must contain a valid json
+renkan.error.password.equals = Password and Password confimation do not match
+renkan.error.password.missing = Password missing
+renkan.error.authorities.bad_value = Bad value for role
+
+
+renkanAuth.log_in = Log in
+renkanAuth.username_label = Username:
+renkanAuth.password_label = Password:
+renkanAuth.renkan_login = Renkan Authentication
+renkanAdmin.site_login = Site Authentication
+renkanAuth.login_error_message = Your login attempt was not successful, try again.
+renkanAuth.login_error_cause = Cause:
+
+renkanHeader.login = login
+renkanHeader.logout = logout
+renkanHeader.admin = administration
+renkanHeader.home = home
+
+renkan.user.roles.ROLE_USER = User
+renkan.user.roles.ROLE_ADMIN = Admin
+renkan.user.roles.ROLE_SPACES_ADMIN = Space admin
+renkan.user.roles.ROLE_GROUPS_ADMIN = Groups admin
+
+
+renkanAdmin.group_objects_name = Groups
+renkanAdmin.group_add = Add group
+renkanAdmin.group_edit = Edit group
+renkanAdmin.group_delete = Del. group
+renkanIndex.group_url = Url
+renkanAdmin.group_confirm_delete = Do you want to delete the group with groupname "{0}" ?
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/i18n/messages_fr.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,129 @@
+
+date.format = dd/MM/yyyy HH:mm
+date.date.format = dd/MM/yyyy
+date.date.datePicker.format = dd/mm/yy
+question.yes = oui
+question.no = non
+
+renkanIndex.renkan_exp = Créer un Renkan
+
+renkanIndex.project_list = Liste des projets
+renkanIndex.project_title = Titre
+renkanIndex.project_creation = Creation
+renkanIndex.project_updated = Date màj.
+renkanIndex.project_edit = Edition
+renkanIndex.project_copy = Copier
+renkanIndex.project_delete = Eff.
+renkanIndex.project_render = Consult.
+renkanIndex.project_export = Export.
+renkanIndex.project_commands = Comm.
+renkanIndex.project_edit_link = Editer renkan
+renkanIndex.project_copy_link = Copier renkan
+renkanIndex.project_delete_link = Eff. renkan
+renkanIndex.project_render_link = Consult. renkan
+renkanIndex.project_export_link = Export. renkan
+renkanIndex.project_delete_confirm = Voulez-vous effacer le renkan "<%= title %>" ?
+renkanIndex.project_filter = Filtre titre
+
+renkanIndex.space_exp = Créer un espace
+renkanIndex.renkan_title = Titre
+renkanIndex.renkan_file = Fichier
+renkanIndex.renkan_spaces = Espaces Renkan
+renkanIndex.renkan_space = Espace Renkan
+renkanIndex.space_list = Liste des espaces
+renkanIndex.space_name = Nom
+renkanIndex.space_title = Titre
+renkanIndex.space_creation = Creation
+renkanIndex.space_open = Ouvrir
+renkanIndex.space_open_link = Ouvrir esp.
+renkanIndex.space_proj_count = Nb. proj.
+
+renkanIndex.js.empty_name_error = Veuillez entrer un titre
+renkanIndex.js.empty_form_error = Veuillez entrer un titre ou un fichier
+
+
+renkanAdmin.renkan_admin = Administration Renkan
+renkanAdmin.site_admin = Administration site
+
+renkanAdmin.object = Objet
+renkanAdmin.object_list = Liste de {0}
+
+renkanAdmin.space_objects_name = Espaces
+renkanAdmin.space_add = Nouvel espace
+renkanAdmin.space_edit = Edition espaces
+renkanAdmin.space_delete = Supression espace
+renkanIndex.space_url = Url
+renkanAdmin.space_confirm_delete = Confirmez-vous l'effacement de l'espace intitulé "{0}" ?
+renkanAdmin.space_proj_count = Nb. Proj.
+
+renkanAdmin.object_name = Nom
+renkanAdmin.object_created = Date Crea.
+renkanAdmin.object_proj_count = Nb. renkan
+renkanAdmin.object_edit = Modif.
+renkanAdmin.object_delete = Eff.
+renkanAdmin.object_edit_link = Modif.
+renkanAdmin.object_delete_link = Eff.
+
+renkanAdmin.form.title = Titre
+renkanAdmin.form.name = Nom
+renkanAdmin.form.uri = URI
+renkanAdmin.form.description = Description
+renkanAdmin.form.color = Couleur
+renkanAdmin.form.space.bin_config = Config chutier
+renkanAdmin.form.space.submit = Ok
+renkanAdmin.form.space.cancel = Annuler
+renkanAdmin.form.space.format = Formatter
+renkanAdmin.form.space.compact = Compacter
+
+renkanAdmin.user_objects_name = Utilisateurs
+renkanAdmin.user_add = Ajout utilisateur
+renkanAdmin.user_edit = Edition utilisateur
+renkanAdmin.user_delete = Delete space
+renkanIndex.user_url = Url
+renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
+
+renkanAdmin.form.avatar = Avatar
+renkanAdmin.form.credentialsExpirationDate = Date exp. mdp.
+renkanAdmin.form.expirationDate = Date exp.
+renkanAdmin.form.email = Email
+renkanAdmin.form.enabled = Actif
+renkanAdmin.form.locked = Verrouillé
+renkanAdmin.form.password = Mot de passe
+renkanAdmin.form.passwordConfirm = Conf. mot de passe
+renkanAdmin.form.roles = Rôles
+renkanAdmin.form.groups = Groupes
+renkanAdmin.form.users = Utilisateurs
+renkanAdmin.form.user.submit = Ok
+
+
+renkan.error.title.empty = Le champ titre ne doit pas être vide
+renkan.error.name.empty = Le champ nom ne doit pas être vide
+renkan.error.bin_config.json = le champ bin config doit contenir un json valide
+renkan.error.password.equals = Le mot de passe et sa confimation ne corresponde pas
+renkan.error.password.missing = Mot de passe manquant
+renkan.error.authorities.bad_value = Mauvaise valeur de rôle
+
+renkanAuth.log_in = Connection
+renkanAuth.username = Identifiant :
+renkanAuth.password = Mot de passe :
+renkanAuth.renkan_login = Renkan Authentification
+renkanAdmin.site_login = Site Authentification
+renkanAuth.login_error_message = Votre tentative de connexion a échoué, veuillez recommencer.
+renkanAuth.login_error_cause = Raison :
+
+renkanHeader.login = connexion
+renkanHeader.logout = déconnexion
+renkanHeader.admin = administration
+renkanHeader.home = accueil
+
+renkan.user.roles.ROLE_USER = Utilisateur
+renkan.user.roles.ROLE_ADMIN = Administrateur
+renkan.user.roles.ROLE_SPACES_ADMIN = Admin. espace
+renkan.user.roles.ROLE_GROUPS_ADMIN = Admin. groupes
+
+renkanAdmin.group_objects_name = Groupes
+renkanAdmin.group_add = aj. group
+renkanAdmin.group_edit = Edit. group
+renkanAdmin.group_delete = eff. group
+renkanIndex.group_url = Url
+renkanAdmin.group_confirm_delete = Voulez vous effacer le groupe "{0}" ?
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/jsp/projectPrompt.jsp Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,12 @@
+<%@ page language="java" contentType="text/html; charset=UTF-8"
+ pageEncoding="UTF-8"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Project prompt</title>
+</head>
+<body>
+ ${message}
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
+
+ <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="${mongodb.db.name}"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/renkan.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+mongodb.host.name = localhost
+mongodb.host.port = 27017
+mongodb.db.name = renkan
+
+user.admin.name = admin
+#user.admin.password = admin
+user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+
+renkan.pagination.size = 2
+renkan.coweb.debug = false
+renkan.coweb.websocket = false
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/spring-security.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,63 @@
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:security="http://www.springframework.org/schema/security"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/security
+ http://www.springframework.org/schema/security/spring-security-3.2.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util-3.0.xsd"
+>
+
+ <util:properties id="propsLocations">
+ <prop key="servletContextProps">WEB-INF/renkan.properties</prop>
+ <prop key="classpathProps">classpath:renkan_run.properties</prop>
+ </util:properties>
+
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1000"/>
+ <property name="location" value="#{propsLocations.servletContextProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="false"/>
+ </bean>
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <property name="order" value="1"/>
+ <property name="location" value="#{propsLocations.classpathProps}"/>
+ <property name="ignoreUnresolvablePlaceholders" value="true"/>
+ <property name="IgnoreResourceNotFound" value="true"/>
+ </bean>
+
+ <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
+ <constructor-arg name="strength" value="10" type="int"/>
+ </bean>
+
+ <bean class="org.iri_research.renkan.services.RenkanUserDetailsService" id="renkanUserDetailsService" />
+
+ <security:http auto-config="true" use-expressions="true">
+ <security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
+ <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
+ <security:form-login login-page="/auth/login" authentication-failure-url="/auth/loginfailed" password-parameter="password" username-parameter="username" />
+ <security:logout />
+ </security:http>
+
+ <security:authentication-manager>
+ <security:authentication-provider>
+ <security:password-encoder hash="sha-256"/>
+ <security:user-service>
+ <security:user name="${user.admin.name}" password="${user.admin.password}" authorities="ROLE_ADMIN, ROLE_USER"/>
+ </security:user-service>
+ </security:authentication-provider>
+ <security:authentication-provider user-service-ref='renkanUserDetailsService'>
+ <security:password-encoder ref="renkanPasswordEncoder" />
+ </security:authentication-provider>
+ </security:authentication-manager>
+ <!--security:authentication-manager>
+ <security:authentication-provider user-service-ref='renkanUserDetailsService'>
+ <security:password-encoder ref="renkanPasswordEncoder" />
+ </security:authentication-provider>
+ </security:authentication-manager-->
+
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/spring-servlet.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd
+ http://www.springframework.org/schema/mvc
+ http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
+
+ <!-- **************************************************************** -->
+ <!-- RESOURCE FOLDERS CONFIGURATION -->
+ <!-- Dispatcher configuration for serving static resources -->
+ <!-- **************************************************************** -->
+ <mvc:resources location="/static/" mapping="/static/**" />
+ <mvc:resources location="/lib/" mapping="/lib/**" />
+ <mvc:resources location="/_firebug/" mapping="/_firebug/**" />
+ <!--mvc:resources location="/css/" mapping="/css/**" /-->
+
+ <!-- **************************************************************** -->
+ <!-- SPRING ANNOTATION PROCESSING -->
+ <!-- **************************************************************** -->
+ <mvc:annotation-driven>
+ <mvc:argument-resolvers>
+ <bean class="org.springframework.data.web.PageableArgumentResolver">
+ <property name="prefix" value="p"/>
+ </bean>
+ </mvc:argument-resolvers>
+ </mvc:annotation-driven>
+ <mvc:interceptors>
+ <bean class="org.iri_research.renkan.controller.VersionHandlerInterceptor"/>
+ </mvc:interceptors>
+
+ <context:component-scan
+ base-package="org.iri_research.renkan.controller" />
+
+ <bean id="viewResolver"
+ class="org.springframework.web.servlet.view.UrlBasedViewResolver">
+ <property name="viewClass"
+ value="org.springframework.web.servlet.view.JstlView" />
+ <property name="prefix" value="/WEB-INF/jsp/" />
+ <property name="suffix" value=".jsp" />
+ <property name="order" value="2" />
+ <property name="redirectHttp10Compatible" value="false" />
+ </bean>
+
+ <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+ <property name="prefix" value="/WEB-INF/templates/" />
+ <property name="suffix" value=".html" />
+ <property name="templateMode" value="HTML5" />
+ <property name="characterEncoding" value="UTF-8" />
+ <property name="cacheable" value="false"/>
+ </bean>
+
+ <bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+ <property name="templateResolver" ref="templateResolver" />
+ <property name="additionalDialects">
+ <set>
+ <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
+ </set>
+ </property>
+ </bean>
+
+ <bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+ <property name="templateEngine" ref="templateEngine" />
+ <property name="order" value="1" />
+ <!--property name="viewNames" value="*.html,*.xhtml" /-->
+ <property name="characterEncoding" value="UTF-8"/>
+ <property name="redirectHttp10Compatible" value="false" />
+ </bean>
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/adminIndex.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+ <head>
+ <title>Renkan Admin</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper" th:with="headerTitle=#{renkanAdmin.renkan_admin}">
+ <header id="header" th:include="fragment/pageFragment :: headerFragment">
+ <h1 th:text="#{renkanAdmin.renkan_admin}">Renkan administration</h1>
+ </header>
+ <h2 th:text="#{renkanAdmin.site_admin}">Site administration</h2>
+ <table id="object_list">
+ <thead>
+ <tr>
+ <th th:text="#{renkanAdmin.object}">Object</th>
+ <th> </th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td colspan="2"><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.space_objects_name}">Spaces</a></td>
+ </tr>
+ <tr>
+ <td colspan="2"><a href="usersList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.user_objects_name}">Users</a></td>
+ </tr>
+ <tr>
+ <td colspan="2"><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.group_objects_name}">Groups</a></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupDeleteConfirm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - delete group</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">Groups List</a> / <span th:text="#{renkanAdmin.group_delete}">Delete group</span></h2>
+ <div id="object-delete-container">
+ <div id="object-delete-question" th:text="#{renkanAdmin.group_confirm_delete(${groupObj.title})}">Do you want to Delete group with name</div>
+ <div id="object-delete-confirm-buttons"><form action="groupsList.html" th:action="@{'/admin/groups/delete/'+${groupObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="groupsList.html" method="get" th:action="@{/admin/groups}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='groupsList.html'" th:onclick="'window.location.href=\''+@{/admin/groups}+'\''"/></form></div>
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupEdit.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - edit user</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+ <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
+ <link href='../../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css' rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
+
+ <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js}" ></script>
+ <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
+ <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">Groups List</a> / <span th:text="#{renkanAdmin.group_edit}">Edit group</span></h2>
+ <div th:include="fragment/groupForm::groupFormFragment" id="inner-container">
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupsList.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - Groups</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">List of objects</h2>
+ <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+ <div>
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">2</a>
+ <a href="#?p.page=3">3</a>
+ <span>4</span>
+ <a href="#?p.page=5">5</a>
+ <a href="#?p.page=6">6</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+ </div>
+ </div>
+ <div id="objects-content">
+ <ul class="object-tools">
+ <li><a href="groupEdit.html" th:href="@{/admin/groups/edit/}" th:text="#{renkanAdmin.group_add}">Add group</a></li>
+ </ul>
+ <table>
+ <thead>
+ <tr>
+ <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Groupname</th>
+ <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
+ <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr th:each="object: ${page.content}" >
+ <td th:text="${object.title}" class="object-table-title" >groupname</td>
+ <td><a href="groupEdit.html" th:href="@{'/admin/groups/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
+ <td><a href="#" th:href="@{'/admin/groups/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/spaceDeleteConfirm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+ <head>
+ <title>Renkan Admin - delete space</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">Spaces List</a> / <span th:text="#{renkanAdmin.space_delete}">Delete space</span></h2>
+ <div id="object-delete-container">
+ <div id="object-delete-question" th:text="#{renkanAdmin.space_confirm_delete(${spaceObj.title})}">Do you want to delete space with title</div>
+ <div id="object-delete-confirm-buttons"><form action="spacesList.html" th:action="@{'/admin/spaces/delete/'+${spaceObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="spacesList.html" method="get" th:action="@{/admin/spaces}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='spacesList.html'" th:onclick="'window.location.href=\''+@{/admin/spaces}+'\''"/></form></div>
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/spaceEdit.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+ <head>
+ <title>Renkan Admin - edit space</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+ <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
+
+ <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/ace/ace.js" th:src="@{/static/lib/ace/ace.js}" charset="utf-8"></script>
+ <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
+ <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">Spaces List</a> / <span th:text="#{renkanAdmin.space_edit}">Edit space</span></h2>
+ <div th:include="fragment/spaceForm::spaceFormFragment" id="inner-container">
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/spacesList.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - Spaces</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">List of objects</h2>
+ <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+ <div>
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">2</a>
+ <a href="#?p.page=3">3</a>
+ <span>4</span>
+ <a href="#?p.page=5">5</a>
+ <a href="#?p.page=6">6</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+ </div>
+ </div>
+ <div id="objects-content">
+ <ul class="object-tools">
+ <li><a href="spaceAdd.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li>
+ </ul>
+ <table>
+ <thead>
+ <tr>
+ <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Name</th>
+ <th th:text="#{renkanAdmin.object_created}" class="object-table-created">Created</th>
+ <th th:text="#{renkanAdmin.space_proj_count}" class="object-proj-count">Project count</th>
+ <th th:text="#{renkanIndex.space_url}" class="object-url">url</th>
+ <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
+ <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr th:each="object: ${page.content}" th:with="spaceProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
+ <td th:text="${object.title}" class="object-table-title" >title</td>
+ <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="object-table-created">created</td>
+ <td th:text="${spaceProjCount}" class="object-proj-count">nb. proj</td>
+ <td class="object-url"><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}" >url</a></td>
+ <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
+ <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="object-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/userDeleteConfirm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - delete user</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="usersList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a> / <span th:text="#{renkanAdmin.user_delete}">Delete user</span></h2>
+ <div id="object-delete-container">
+ <div id="object-delete-question" th:text="#{renkanAdmin.user_confirm_delete(${userObj.title})}">Do you want to Delete user with name</div>
+ <div id="object-delete-confirm-buttons"><form action="usersList.html" th:action="@{'/admin/users/delete/'+${userObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="usersList.html" method="get" th:action="@{/admin/users}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='usersList.html'" th:onclick="'window.location.href=\''+@{/admin/users}+'\''"/></form></div>
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/userEdit.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - edit user</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+ <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
+ <link href='../../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css' rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
+
+ <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
+ <script type="text/javascript" src="../../../static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js}" ></script>
+ <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
+ <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2><a href="userList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a> / <span th:text="#{renkanAdmin.user_edit}">Edit user</span></h2>
+ <div th:include="fragment/userForm::userFormFragment" id="inner-container">
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/admin/usersList.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Admin - Users</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">List of objects</h2>
+ <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+ <div>
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">2</a>
+ <a href="#?p.page=3">3</a>
+ <span>4</span>
+ <a href="#?p.page=5">5</a>
+ <a href="#?p.page=6">6</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+ </div>
+ </div>
+ <div id="objects-content">
+ <ul class="object-tools">
+ <li><a href="userEdit.html" th:href="@{/admin/users/edit/}" th:text="#{renkanAdmin.user_add}">Add user</a></li>
+ </ul>
+ <table>
+ <thead>
+ <tr>
+ <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Username</th>
+ <th th:text="#{renkanAdmin.object_proj_count}" class="object-proj-count">Project count</th>
+ <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
+ <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr th:each="object: ${page.content}" th:with="userProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
+ <td th:text="${object.title}" class="object-table-title" >username</td>
+ <td th:text="${userProjCount}" class="object-proj-count">nb. proj</td>
+ <td><a href="userEdit.html" th:href="@{'/admin/users/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
+ <td><a href="#" th:if="${userProjCount==0}" th:href="@{'/admin/users/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a><span th:if="${userProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/auth/login.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan Auth Login</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="../renkanIndex.html" id="home-link" th:href="@{/}" th:text="#{renkanAuth.renkan_login}">Renkan login</a></h1>
+ <div id="header-clear"></div>
+ </header>
+ <h2 th:text="#{renkanAdmin.site_login}">Site login</h2>
+ <div id="inner-container">
+ <div id="login-errors" th:if="${login_error}">
+ <div th:text="#{renkanAuth.login_error_message}">Your login attempt was not successful, try again.</div>
+ <div th:if="${session} and ${session.containsKey('SPRING_SECURITY_LAST_EXCEPTION')}"><span th:text="#{renkanAuth.login_error_cause}">Cause: </span> <span th:text="${session['SPRING_SECURITY_LAST_EXCEPTION'].message}">Cause of login error</span></div>
+ </div>
+ <form action="#" th:action="@{/j_spring_security_check}" method="post" id="login-form">
+ <fieldset id="login-fieldset" class="form-fields">
+ <div>
+ <label for="username" th:text="#{renkanAuth.username_label}">username:</label>
+ <input type="text" id="username" name="username"/>
+ </div>
+ <div>
+ <label for="password" th:text="#{renkanAuth.password_label}">password:</label>
+ <input type="password" name="password" id="password"/>
+ </div>
+ <input type="submit" value="log in" th:value="#{renkanAuth.log_in}"/>
+ </fieldset>
+ </form>
+ </div>
+ </div>
+ <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
+ <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ </body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/fragment/groupForm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <meta charset="utf-8"/>
+ <title>User form</title>
+ </head>
+<body>
+<div id="groupForm" th:fragment="groupFormFragment" >
+ <script type="text/javascript" th:inline="javascript">
+ //<![CDATA[
+
+ function groupFormSubmit() {
+
+ var errors = {};
+ var valid = true;
+
+ if(!$('#title').val()) {
+ errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
+ valid = false;
+ }
+
+ showformErrors(errors);
+
+ return valid;
+ }
+
+
+ $(function(){
+
+ $('#color').spectrum({
+ showInput: true,
+ showAlpha: true,
+ showPalette: true,
+ showInitial: true,
+ preferredFormat: 'hex'
+ });
+ $("#model-form").submit(function(e) {
+ return groupFormSubmit();
+ });
+
+ });
+ //]]>
+ </script>
+ <form action="#" th:object="${group}" th:action="@{/admin/groups/save}" method="post" id="model-form">
+ <fieldset class="form-fields">
+ <input type="hidden" th:field="*{id}" th:if="*{id}" />
+ <div>
+ <label for="title" th:text="#{renkanAdmin.form.name}">Name: </label>
+ <input type="text" th:field="*{title}" />
+ <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
+ </div>
+ <div>
+ <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
+ <input type="text" th:field="*{uri}" />
+ </div>
+ <div>
+ <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
+ <textarea th:field="*{description}"></textarea>
+ </div>
+ <div>
+ <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
+ <input type="text" th:field="*{color}" />
+ </div>
+ <div>
+ <label for="avatar" th:text="#{renkanAdmin.form.avatar}">Avatar: </label>
+ <input type="text" th:field="*{avatar}" />
+ </div>
+<!-- todo: only user managing the group can see that -->
+ <div>
+ <label for="users" th:text="#{renkanAdmin.form.users}">Groups: </label>
+ <select th:field="*{users}" multiple="multiple">
+ <option th:each="user: ${allUsers}" th:value="${user.id}" th:text="${user.title}">USER</option>
+ </select>
+ </div>
+ <div class="submit">
+ <button type="submit" name="save" th:text="#{renkanAdmin.form.user.submit}">Save</button>
+ <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.user.cancel}" th:onclick="location">Cancel</button-->
+ </div>
+
+ </fieldset>
+ </form>
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/fragment/pageFragment.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:th="http://www.thymeleaf.org"
+ xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
+ th:lang="${#ctx.getLocale().toLanguageTag()}" >
+<head>
+<meta charset="utf-8" />
+<title>pagination fragment</title>
+</head>
+<body>
+ <header id="header" th:fragment="headerFragment" >
+ <h1 th:utext="${headerTitle}">Renkan</h1>
+ <div id="header-nav" th:fragment="headerNavFragment">
+ <div sec:authorize="isAnonymous()" class="header-nav"><a href="auth/login.html" th:href="@{/auth/login}" th:text="#{renkanHeader.login}">login</a></div>
+ <div sec:authorize="isAuthenticated()" class="header-nav">
+ <img src="../../../static/img/user.png" th:src="@{/static/img/user.png}" id="header-nav-user-avatar"/><span sec:authentication="name">username</span> |
+ <span sec:authorize="hasRole('ROLE_USER')"><a href="" th:href="@{/}" th:text="#{renkanHeader.home}">home</a> |</span>
+ <span sec:authorize="hasRole('ROLE_ADMIN')"><a href="admin/adminIndex.html" th:href="@{/admin}" th:text="#{renkanHeader.admin}">admin</a> |</span>
+ <a href="renkanIndex.html" th:href="@{/j_spring_security_logout}" th:text="#{renkanHeader.logout}">logout</a>
+ </div>
+ <div id="header-clear"></div>
+ </div>
+ </header>
+ <footer id="footer" th:fragment="footerFragment" >
+ <div id="version">© <span th:text="${#dates.year(#dates.createNow())}" class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span th:text="${version}" class="version-version">0.0a</span></div>
+ </footer>
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/fragment/paginationFragment.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+<head>
+<meta charset="utf-8" />
+<title>pagination fragment</title>
+</head>
+<body>
+ <div id="paginationFragment" th:fragment="paginationFragment" >
+ <div th:if="${page.totalPages>1}">
+ <a th:if="!${page.firstPage}" th:href="@{${baseUrl}(p.page=1)}"><<</a>
+ <a th:if="${page.hasPreviousPage()}" th:href="@{${baseUrl}(p.page=${page.number})}"><</a>
+ <span th:if="${page.number-2} > 0">...</span>
+ <a th:each="i: ${#numbers.sequence(1,2)}" th:if="${page.number-2+i} > 0" th:href="@{${baseUrl}(p.page=${page.number-2+i})}" th:text="${page.number-2+i}"></a>
+ <span th:text="${page.number+1}"></span>
+ <a th:each="i: ${#numbers.sequence(1,2)}" th:if="${page.number+1+i} < ${page.totalPages+1}" th:href="@{${baseUrl}(p.page=${page.number+1+i})}" th:text="${page.number+1+i}"></a>
+ <span th:if="${page.number+3} < ${page.totalPages}">...</span>
+ <a th:if="${page.hasNextPage()}" th:href="@{${baseUrl}(p.page=${page.number+2})}">></a>
+ <a th:if="!${page.lastPage}" th:href="@{${baseUrl}(p.page=${page.totalPages})}">>></a>
+ </div>
+ <div th:remove="all">
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">3</a>
+ <a href="#?p.page=3">4</a>
+ <span>5</span>
+ <a href="#?p.page=5">6</a>
+ <a href="#?p.page=6">7</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+</div>
+ </div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/fragment/spaceForm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <meta charset="utf-8"/>
+ <title>Space form</title>
+ </head>
+<body>
+<div id="spaceForm" th:fragment="spaceFormFragment" >
+ <script type="text/javascript" th:inline="javascript">
+ //<![CDATA[
+
+ function spaceFormSubmit() {
+ return true;
+ var errors = {};
+ var valid = true;
+
+ if(!$('#title').val()) {
+ errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
+ valid = false;
+ }
+
+ if($('#binConfig').val()) {
+
+ var editor = ace.edit("binConfigDiv");
+ var annotations = editor.getSession().getAnnotations();
+ if(annotations.length>0) {
+ var error_message = /*[[#{renkan.error.bin_config.json}]]*/"renkan.error.bin_config.json";
+ errors['binConfigDiv'] = error_message + ". "+ annotations[0].type + ": (" +(annotations[0].row+1)+","+annotations[0].column+") " + annotations[0].text;
+ valid = false;
+ }
+ }
+
+ showformErrors(errors);
+
+ return valid;
+ }
+
+
+ function _setBinConfigStatus(editor) {
+ var annotations = editor.getSession().getAnnotations();
+ if(annotations.length>0) {
+ $('.binConfigButton').attr("disabled", "disabled");
+ }
+ else {
+ $('.binConfigButton').removeAttr("disabled");
+ }
+ }
+
+ $(function(){
+ var tabSize = 2;
+ var editor = ace.edit("binConfigDiv");
+ editor.setTheme("ace/theme/xcode");
+ editor.getSession().setMode("ace/mode/json");
+ editor.getSession().setTabSize(tabSize);
+ editor.getSession().setUseSoftTabs(true);
+ _setBinConfigStatus(editor);
+ editor.getSession().on('change', function(e) {
+ $('#binConfig').val(editor.getValue());
+ });
+ editor.getSession().on('changeAnnotation', function() {
+ _setBinConfigStatus(editor);
+ });
+
+ $('#binConfigFormatButton').click(function(){
+ var jsonText = editor.getValue();
+ try {
+ editor.setValue(formatJson(jsonText, tabSize),0);
+ editor.moveCursorTo(0,0);
+ editor.clearSelection();
+ } catch (e) {
+ //do nothing
+ }
+ });
+
+ $('#binConfigCompactButton').click(function(){
+ var jsonText = editor.getValue();
+ try {
+ editor.setValue(compactJson(jsonText),0);
+ editor.moveCursorTo(0,0);
+ editor.clearSelection();
+ } catch (e) {
+ //do nothing
+ }
+ });
+
+ $('#color').spectrum({
+ showInput: true,
+ showAlpha: true,
+ showPalette: true,
+ showInitial: true
+ });
+
+ $("#model-form").submit(function(e) {
+ return spaceFormSubmit();
+ });
+
+ });
+ //]]>
+ </script>
+ <form action="#" th:object="${space}" th:action="@{/admin/spaces/save}" method="post" id="model-form">
+ <fieldset class="form-fields">
+ <input type="hidden" th:field="*{id}" th:if="*{id}" />
+ <input type="hidden" th:field="*{binConfig}"/>
+ <div>
+ <label for="title" th:text="#{renkanAdmin.form.title}">Title: </label>
+ <input type="text" th:field="*{title}" />
+ <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
+ </div>
+ <div>
+ <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
+ <input type="text" th:field="*{uri}" />
+ </div>
+ <div>
+ <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
+ <textarea th:field="*{description}"></textarea>
+ </div>
+ <div>
+ <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
+ <input type="text" th:field="*{color}" />
+ </div>
+ <div>
+ <label for="binConfigContainer" th:text="#{renkanAdmin.form.space.bin_config}">Bin config: </label>
+ <div id="binConfigContainer">
+ <div id="binConfigButtonsDiv"><button type="button" id="binConfigFormatButton" th:text="#{renkanAdmin.form.space.format}" class="binConfigButton">Format</button><button type="button" id="binConfigCompactButton" th:text="#{renkanAdmin.form.space.compact}" class="binConfigButton">Compact</button></div>
+ <div id="binConfigDiv" th:text="*{binConfig}"></div>
+ </div>
+ <div th:if="${#fields.hasErrors('binConfig')}" th:errors="*{binConfig}" class="form-error"></div>
+ </div>
+
+ <div class="submit">
+ <button type="submit" name="save" th:text="#{renkanAdmin.form.space.submit}">Save</button>
+ <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.space.cancel}" th:onclick="location">Cancel</button-->
+ </div>
+
+ </fieldset>
+ </form>
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/fragment/userForm.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,155 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <meta charset="utf-8"/>
+ <title>User form</title>
+ </head>
+<body>
+<div id="userForm" th:fragment="userFormFragment" >
+ <script type="text/javascript" th:inline="javascript">
+ //<![CDATA[
+
+ function userFormSubmit() {
+
+ var errors = {};
+ var valid = true;
+
+ if(!$('#title').val()) {
+ errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
+ valid = false;
+ }
+
+ var password = $('#password').val();
+ var passwordConf = $('#passwordConfirm').val();
+ var objId = $('#id').val();
+
+ if(!objId && !password) {
+ errors['password'] = /*[[#{renkan.error.password.missing}]]*/"renkan.error.passwsord.missing";
+ valid = false;
+ }
+ if(valid && password !== passwordConf) {
+ errors['password'] = /*[[#{renkan.error.password.equals}]]*/"renkan.error.passwsord.equals";
+ valid = false;
+ }
+
+ showformErrors(errors);
+
+ return valid;
+ }
+
+
+ $(function(){
+ var regionalValue = /*[[${#ctx.getLocale().getLanguage()}]]*/"";
+ var dateFormat = /*[[#{date.date.datePicker.format}]]*/"yy/mm/dd";
+ $.datepicker.setDefaults($.datepicker.regional[ "" ]);
+ $('.datepicker').each(function (i,elt) {
+ var picker_options = $.extend({showButtonPanel: true},$.datepicker.regional[regionalValue=="en"?"":regionalValue]);
+ picker_options.dateFormat = dateFormat;
+ picker_options.altFormat = $.datepicker.ISO_8601;
+ var elt = $(elt);
+ picker_options.altField = '#'+elt.attr('id').replace('-disp', '');
+ elt.datepicker(picker_options);
+ });
+
+ $('#color').spectrum({
+ showInput: true,
+ showAlpha: true,
+ showPalette: true,
+ showInitial: true,
+ preferredFormat: 'hex'
+ });
+ $("#model-form").submit(function(e) {
+ $('.datepicker').each(function (i,elt) {
+ var elt = $(elt);
+ elt_val = elt.val();
+ console.log(elt.attr('id'),elt_val);
+ if(!elt_val) {
+ $('#'+elt.attr('id').replace('-disp', '')).val("");
+ }
+ });
+ return userFormSubmit();
+ });
+
+ });
+ //]]>
+ </script>
+ <form action="#" th:object="${user}" th:action="@{/admin/users/save}" method="post" id="model-form">
+ <fieldset class="form-fields">
+ <input type="hidden" th:field="*{id}" th:if="*{id}" />
+ <div>
+ <label for="title" th:text="#{renkanAdmin.form.name}">Name: </label>
+ <input type="text" th:field="*{title}" />
+ <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
+ </div>
+ <div>
+ <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
+ <input type="text" th:field="*{uri}" />
+ </div>
+ <div>
+ <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
+ <textarea th:field="*{description}"></textarea>
+ </div>
+ <div>
+ <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
+ <input type="text" th:field="*{color}" />
+ </div>
+ <div>
+ <label for="avatar" th:text="#{renkanAdmin.form.avatar}">Avatar: </label>
+ <input type="text" th:field="*{avatar}" />
+ </div>
+ <div>
+ <label for="password" th:text="#{renkanAdmin.form.password}">Password: </label>
+ <input type="password" th:field="*{password}" />
+ <div th:if="${#fields.hasErrors('password')}" th:errors="*{password}" class="form-error"></div>
+ </div>
+ <div>
+ <label for="passwordConfirm" th:text="#{renkanAdmin.form.passwordConfirm}">Confirm password: </label>
+ <input type="password" th:field="*{passwordConfirm}" />
+ <div th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}" class="form-error"></div>
+ </div>
+ <div>
+ <label for="credentialsExpirationDate" th:text="#{renkanAdmin.form.credentialsExpirationDate}">Credential expiration date: </label>
+ <input type="hidden" name="credentialsExpirationDate" th:field="*{credentialsExpirationDate}"/>
+ <input type="text" id="credentialsExpirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.credentialsExpirationDate != null}?${user.credentialsExpirationDate.toString(#messages.msg('date.date.format'))}:''"/>
+
+ </div>
+ <div>
+ <label for="expirationDate" th:text="#{renkanAdmin.form.expirationDate}">Expiration date: </label>
+ <input type="hidden" name="expirationDate" th:field="*{expirationDate}" />
+ <input type="text" id="expirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.expirationDate != null}?${user.expirationDate.toString(#messages.msg('date.date.format'))}:''"/>
+ </div>
+ <div>
+ <label for="email" th:text="#{renkanAdmin.form.email}">Email: </label>
+ <input type="email" th:field="*{email}" />
+ </div>
+ <div>
+ <label for="enabled" th:text="#{renkanAdmin.form.enabled}">Enabled: </label>
+ <input type="checkbox" th:field="*{enabled}" />
+ </div>
+ <div>
+ <label for="locked" th:text="#{renkanAdmin.form.locked}">Locked: </label>
+ <input type="checkbox" th:field="*{locked}" />
+ </div>
+<!-- todo: only user of admin group can see that -->
+ <div>
+ <label for="groups" th:text="#{renkanAdmin.form.groups}">Groups: </label>
+ <select th:field="*{groups}" multiple="multiple">
+ <option th:each="group: ${allGroups}" th:value="${group.id}" th:text="${group.title}">GROUP</option>
+ </select>
+ </div>
+ <div>
+ <label for="userAuthorities" th:text="#{renkanAdmin.form.roles}">Roles: </label>
+ <select th:field="*{userAuthorities}" multiple="multiple">
+ <option th:each="role: ${T(org.iri_research.renkan.Constants).USER_ROLES_SELECT}" th:value="${role}" th:text="#{${'renkan.user.roles.'+role}}">USER_ROLE</option>
+ </select>
+ </div>
+ <div class="submit">
+ <button type="submit" name="save" th:text="#{renkanAdmin.form.user.submit}">Save</button>
+ <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.user.cancel}" th:onclick="location">Cancel</button-->
+ </div>
+
+ </fieldset>
+ </form>
+</div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/projectIndex.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,248 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
+
+ <script th:remove="all" type="text/javascript" src="../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../static/js/thymol.js"></script>
+
+ <script src="../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script src="../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
+ <script src="../../static/lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}" ></script>
+ <script src="../../static/lib/URI.js" th:src="@{/static/lib/URI.js}" ></script>
+
+ <link href="../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css" rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
+ <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper">
+ <header id="header">
+ <h1><a href="renkanIndex.html" th:href="@{'/'}" id="home-link" th:text="#{renkanIndex.renkan_space}">Renkan Space</a>: <span th:text="${space.title}">Titre</span></h1>
+ <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
+ </header>
+ <div id="inner">
+ <div id="label" class="translate" th:text="#{renkanIndex.renkan_exp}">Create a Renkan</div>
+ <form action="#" id="new-renkan-form">
+ <fieldset id="form-fields">
+ <div id="title-field"><label th:text="#{renkanIndex.renkan_title}" for="renkantitle">title</label><input type="text" id="renkantitle" autofocus="autofocus" x-webkit-speech="x-webkit-speech"/></div>
+ <div id="file-field"><label th:text="#{renkanIndex.renkan_file}" for="renkanfile">file</label><input type="file" id="renkanfile"/></div>
+ </fieldset>
+ <div id="form-submit"><button type="submit">OK</button></div>
+ </form>
+ </div>
+ <div id="project-list-container">
+ <h2 th:text="#{renkanIndex.project_list}">Project list</h2>
+ <div id="project-filter-container">
+ <form method="get">
+ <input type="text" id="project-filter" name="filter" placeholder="filter title" th:placeholder="#{renkanIndex.project_filter}" th:value="${param['filter']}?${param['filter'][0]}:''" />
+ <button type="submit">OK</button>
+ </form>
+ </div>
+ <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+ <div>
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">2</a>
+ <a href="#?p.page=3">3</a>
+ <span>4</span>
+ <a href="#?p.page=5">5</a>
+ <a href="#?p.page=6">6</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+ </div>
+ </div>
+ <table th:with="columnSort=${param['p.sort']}?${param['p.sort'][0]}:'updated',sortDir=${param['p.sort.dir']}?${param['p.sort.dir'][0]}:'desc'">
+ <thead th:with="sortDirInv=${sortDir}=='desc'?'asc':'desc'">
+ <tr>
+ <th th:with="sorted=(${columnSort}=='title')"><span th:text="#{renkanIndex.project_name}">Name</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="title"/><input type="hidden" name="p.sort.dir" th:value="${sorted}?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sortable-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
+ <th th:with="sorted=(${columnSort}=='updated')"><span th:text="#{renkanIndex.project_updated}">Updated</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="updated"/><input type="hidden" name="p.sort.dir" th:value="(${sorted})?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sort-desc-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
+ <th th:with="sorted=(${columnSort}=='created')"><span th:text="#{renkanIndex.project_creation}" >Creation</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="created"/><input type="hidden" name="p.sort.dir" th:value="${sorted}?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sort-asc-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
+ <th th:text="#{renkanIndex.project_commands}">Comm.</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr th:each="project: ${page}">
+ <th th:text="${project.title}">title</th>
+ <td th:text="${project.updated}?${#dates.format(project.updated, #messages.msg('date.format'))}:''">update</td>
+ <td th:text="${#dates.format(project.created, #messages.msg('date.format'))}">date</td>
+ <td>
+ <a href="#" th:href="@{'/p/'+${project.id}(cowebkey=${project.getKey(2)})}" th:title="#{renkanIndex.project_edit_link}"><span class="ui-icon ui-icon-pencil renkan-basic-action"></span></a>
+ <a href="#" th:href="@{'/p/pub/'+${project.id}(cowebkey=${project.getKey(1)})}" th:title="#{renkanIndex.project_render_link}"><span class="ui-icon renkan-icon-eye renkan-basic-action"></span></a>
+ <span class="ui-icon ui-icon-triangle-1-e renkan-basic-action renkan-action-button" th:id="'renkan-action-button-'+${project.id}" th:attr="data-project_id=${project.id}"></span>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ <ul th:each="project: ${page}" class="action-menu" id="action-menu-" th:id="'action-menu-'+${project.id}">
+ <li><a href="#" th:href="@{'/p/'+${project.id}(cowebkey=${project.getKey(2)})}"><span class="ui-icon ui-icon-pencil"></span><span th:text="#{renkanIndex.project_edit_link}">Edit project</span></a></li>
+ <li><a href="#" th:attr="data-project_id=${project.id}" class="copy-project"><span class="ui-icon ui-icon-copy"></span><span th:text="#{renkanIndex.project_copy_link}">Copy project</span></a></li>
+ <li><a href="#" th:attr="data-project_id=${project.id},data-project_title=${project.title}" class="delete-project"><span class="ui-icon ui-icon-trash"></span><span th:text="#{renkanIndex.project_delete_link}">Delete project</span></a></li>
+ <li><a href="#" th:href="@{'/p/pub/'+${project.id}(cowebkey=${project.getKey(1)})}"><span class=" ui-icon renkan-icon-eye"></span><span th:text="#{renkanIndex.project_render_link}">View project</span></a></li>
+ <li><a href="#" th:href="@{'/p/exp/'+${project.id}}"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span><span th:text="#{renkanIndex.project_export_link}">Export project</span></a></li>
+ </ul>
+
+ </div>
+ </div>
+ <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
+ <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ <script th:inline="javascript" >
+ /*<![CDATA[*/
+ 'use strict';
+ function go2Title()
+ {
+ var renkantitle = $("#renkantitle").val(),
+ renkanfiles = $("#renkanfile").prop("files");
+
+ if(renkantitle.length === 0 && renkanfiles.length === 0) {
+ var alert_message = /*[[#{renkanIndex.js.empty_form_error}]]*/"Please enter a title or a file";
+ alert(alert_message);
+ return false;
+ }
+ var post_url = /*[[@{/rest/projects/}]]*/"/rest/projects/",
+ deferred = $.Deferred();
+
+ deferred.done(function(new_renkan) {
+ new_renkan.space_id = /*[[${space.id}]]*/"_";
+ $.ajax(post_url, {
+ data:JSON.stringify(new_renkan),
+ type: "POST",
+ dataType: "json",
+ contentType: "application/json; charset=UTF-8"
+ }).done(function(project){
+ var uri = new URI(window.location);
+ window.location = uri.setSearch("p.sort","created").setSearch("p.sort.dir", "desc").href();
+ });
+ });
+
+ if(renkanfiles.length === 0) {
+ deferred.resolve({
+ title: renkantitle,
+ description: "",
+ uri: null,
+ });
+ }
+ else {
+ var fr = new FileReader();
+ fr.onload = function() {
+ var new_renkan = JSON.parse(fr.result);
+ if(renkantitle.length > 0) {
+ new_renkan.title = renkantitle;
+ }
+ if(typeof new_renkan.created !== "undefined") {
+ delete new_renkan.created;
+ }
+ if(typeof new_renkan.updated !== "undefined") {
+ delete new_renkan.updated;
+ }
+ deferred.resolve(new_renkan);
+ };
+ fr.readAsText(renkanfiles[0]);
+ }
+ }
+
+ function copyProject(project_id)
+ {
+ var post_url = /*[[@{/p/copy}]]*/"#";
+ $.post(post_url, {"project_id": project_id})
+ .done(function(p){
+ window.location.reload();
+ });
+ }
+
+ function deleteProject(project_id, project_title)
+ {
+ var message = /*[[#{renkanIndex.project_delete_confirm}]]*/"Delete project \"<%= title %>\"";
+ if(confirm(_.template(message, {title: project_title}))) {
+ var delete_url = /*[[@{/rest/projects}]]*/"#";
+ $.ajax(delete_url+"/"+project_id, {
+ type: "DELETE"
+ }).done(function(){
+ window.location.reload();
+ });
+ }
+ }
+
+ function createMenuHandler(menu, timeoutCallback) {
+ return function(e) {
+ menu.toggle();
+ $(e.target).toggleClass("ui-icon-triangle-1-e").toggleClass("ui-icon-triangle-1-se");
+ $('.renkan-action-button').each(function() {
+ if($(this).prop('id') !== $(e.target).prop('id')) {
+ $(this).removeClass("ui-icon-triangle-1-se").addClass("ui-icon-triangle-1-e");
+ $("#action-menu-"+$(this).data('project_id')).hide();
+ var timeout = $("#action-menu-"+$(this).data('project_id')).data('blurtimeout');
+ if(typeof timeout !== 'undefined') {
+ clearTimeout(menu.data('blurtimeout'));
+ menu.removeData('blurtimeout');
+ }
+ }
+ });
+ if(menu.is(":visible")) {
+ menu.data('blurtimeout', setTimeout( timeoutCallback,5000));
+ }
+ }
+ }
+
+ $(function(){
+
+ $(".copy-project").click(function(event) {
+ var project_id = $(event.currentTarget).data("project_id");
+ copyProject(project_id);
+ });
+
+ $(".delete-project").click(function(event) {
+ deleteProject($(event.currentTarget).data("project_id"), $(event.currentTarget).data("project_title"));
+ });
+
+
+ $("#new-renkan-form").submit(function(e) {
+ e.preventDefault();
+ go2Title();
+ return false;
+ });
+
+ $("#import-renkan-form").submit(function(e) {
+ e.preventDefault();
+ console.log("import form event :", e);
+ });
+
+ $('.renkan-action-button').each(function() {
+ var projectId = $(this).data('project_id');
+ var menu = $('#action-menu-'+projectId).menu().position({ my: "left top", at: "right top", of: this }).hide();
+ var that = this;
+
+ var timeoutCallback = function() {
+ menu.hide();
+ $(that).removeClass("ui-icon-triangle-1-se").addClass("ui-icon-triangle-1-e");
+ menu.removeData('blurtimeout');
+ };
+
+ menu.on('menufocus', function() {
+ clearTimeout(menu.data('blurtimeout'));
+ menu.removeData('blurtimeout');
+ });
+ menu.on('menublur',function(e) {
+ menu.data('blurtimeout', setTimeout( timeoutCallback,200));
+ });
+
+ $(this).click(createMenuHandler(menu, timeoutCallback));
+ });
+ });
+
+ /*]]>*/
+ </script>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/renkanIndex.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
+ <head>
+ <title>Renkan</title>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
+
+ <link rel="shortcut icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
+
+ <script th:remove="all" type="text/javascript" src="../../static/lib/jquery.min.js"></script>
+ <script th:remove="all" type="text/javascript" src="../../static/js/thymol.js"></script>
+
+ <script src="../../lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script src="../../lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}" ></script>
+
+ <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
+ </head>
+ <body>
+ <div id="container">
+ <div id="wrapper" th:with="headerTitle=#{renkanIndex.renkan_spaces}">
+ <header id="header" th:include="fragment/pageFragment :: headerFragment">
+ <h1 th:text="#{renkanIndex.renkan_spaces}">Renkan Spaces</h1>
+ </header>
+ <div id="inner">
+ <div id="label" class="translate" th:text="#{renkanIndex.space_exp}">Create a Space</div>
+ <form action="#" onsubmit="go2Title();return false;">
+ <fieldset id="form-fields">
+ <div id="title-field"><label th:text="#{renkanIndex.renkan_title}" for="renkantitle">title</label><input type="text" id="renkantitle" autofocus="autofocus" x-webkit-speech="x-webkit-speech"/></div>
+ </fieldset>
+ <div id="form-submit"><button type="submit">OK</button></div>
+ </form>
+ </div>
+ <h2 th:text="#{renkanIndex.space_list}">Space list</h2>
+ <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
+ <div>
+ <a href="#?p.page=1"><<</a>
+ <a href="#?p.page=3"><</a>
+ <span>...</span>
+ <a href="#?p.page=2">2</a>
+ <a href="#?p.page=3">3</a>
+ <span>4</span>
+ <a href="#?p.page=5">5</a>
+ <a href="#?p.page=6">6</a>
+ <span>...</span>
+ <a href="#?p.page=5">></a>
+ <a href="#?p.page=7">>></a>
+ </div>
+ </div>
+ <table>
+ <thead>
+ <tr>
+ <th th:text="#{renkanIndex.space_name}">Name</th>
+ <th th:text="#{renkanIndex.space_creation}">Creation</th>
+ <th th:text="#{renkanIndex.space_proj_count}">Project count</th>
+ <th th:text="#{renkanIndex.space_open}">Open</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr th:each="space: ${page.content}">
+ <th th:text="${space.title}">title</th>
+ <td th:text="${#dates.format(space.created, #messages.msg('date.format'))}">date</td>
+ <td th:text="${#maps.containsKey(projectsCount, space.id)}? ${projectsCount[space.id]} : 0">nb. proj</td>
+ <td><a href="#" th:href="@{'/s/'+${space.id}}" th:text="#{renkanIndex.space_open_link}">Open space</a></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
+ <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </div>
+ <script th:inline="javascript" >
+ /*<![CDATA[*/
+
+ function go2Title()
+ {
+ var renkantitle = $("#renkantitle").val();
+ if(renkantitle.length == 0) {
+ var alert_message = /*[[#{renkanIndex.js.empty_name_error}]]*/"Please enter a title";
+ alert(alert_message);
+ return false;
+ }
+
+ new_space = {
+ title: renkantitle,
+ description: "(empty description)",
+ uri: null
+ };
+
+ var post_url = /*[[@{/rest/spaces/}]]*/"/rest/spaces/";
+ $.ajax(post_url, {
+ data:JSON.stringify(new_space),
+ type: "POST",
+ dataType: "json",
+ contentType: "application/json; charset=UTF-8"
+ }).done(function(space){
+ var template_url = /*[[@{'/s/<%=space_id%>'}]]*/"s/<%=space_id%>";
+ window.location = _.template(template_url, {space_id: space.id});
+ });
+
+ //? window.location = "p/" + renkantitle : alert(/*[[#{renkanIndex.js.empty_name_error}]]*/"Please enter a name");
+ }
+
+ /*]]>*/
+ </script>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/renkanProjectEdit.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+
+ <title>RENKAN</title>
+ <meta name="description" content="" />
+ <meta name="author" content="Institut de Recherche et d'Innovation" />
+ <link rel="icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" type="image/x-icon" />
+ <script src="lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script src="lib/jquery.mousewheel.min.js" th:src="@{/static/lib/jquery.mousewheel.min.js}"></script>
+ <script src="lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}"></script>
+ <script src="lib/backbone.js" th:src="@{/static/lib/backbone.js}"></script>
+ <script src="lib/backbone-relational.js" th:src="@{/static/lib/backbone-relational.js}"></script>
+ <script src="lib/paper.js" th:src="@{/static/lib/paper.js}"></script>
+ <script type="text/javascript" th:inline="javascript">
+ /*<![CDATA[*/
+ var require = {
+ baseUrl: /*[[@{/static/js/}]]*/""
+ };
+ /*]]>*/
+ </script>
+ <script src="js/config.js" th:src="@{/static/js/config.js}"></script>
+ <script type="text/javascript" th:inline="javascript">
+ var cowebConfig = {
+ baseUrl: window.location.protocol + '//' + window.location.host,
+ adminUrl : dojoConfig.baseUrl+'ocw_admin',
+ debug: /*[[${coweb_debug}]]*/false,
+ useWebSockets: /*[[${coweb_websockets}]]*/false
+ };
+ </script>
+ <script type="text/javascript" src="lib/dojo/dojo.js" data-dojo-config="isDebug: true, parseOnLoad: true" th:src="@{/static/lib/dojo/dojo.js}"></script>
+ <script type="text/javascript" th:inline="javascript">
+ /*<![CDATA[*/
+ function startRenkan() {
+ var renkan_config = {
+ static_url : /*[[@{/static/}]]*/ "",
+ read_only: true,
+ bins: [
+ {
+ type: "Wikipedia",
+ lang: "en",
+ search: "Digital Humanities"
+ },
+ {
+ type: "Wikipedia",
+ lang: "ja",
+ search: "Digital Humanities"
+ },
+ {
+ title: "LDT Project",
+ type: "Ldt",
+ ldt_type: "Project",
+ project_id: "67280b1c-ff30-11e0-a82d-00145ea49a02",
+ ldt_platform: "http://ldt.iri.centrepompidou.fr/"
+ }
+ ],
+ search: [
+ {
+ type: "Wikipedia",
+ lang: "fr"
+ },
+ {
+ type: "Wikipedia",
+ lang: "en"
+ },
+ {
+ type: "Wikipedia",
+ lang: "ja"
+ }
+ ],
+ property_files: [
+ /*[[@{/static/data/properties.json}]]*/ "data/properties.json",
+ ],
+ };
+ var space_config = /*[[${space.binConfig}?${space.binConfig}:'{}']]*/"{}";
+ space_config = JSON.parse(space_config || "{}");
+ var _renkan = new Rkns.Renkan($.extend({}, renkan_config, space_config));
+ var corenkanConfig = {
+ projectId: /*[[${project.id}]]*/"new_project",
+ renkan : _renkan
+ };
+
+ require({corenkanConfig: corenkanConfig}, ["corenkan"], function(corenkan) {
+ corenkan.app.onStatusChange = function(status) {
+ };
+ });
+ }
+ /*]]>*/
+ </script>
+ <script src="js/renkan.js" th:src="@{/static/js/renkan.js}"></script>
+ <link rel="stylesheet" href="css/renkan.css" th:href="@{/static/css/renkan.css}"/>
+ <link rel="stylesheet" href="../../static/css/style.css" th:href="@{/static/css/style.css}"/>
+ <link rel="stylesheet" href="../../static/css/renkanProject.css" th:href="@{/static/css/renkanProject.css}"/>
+ </head>
+ <body>
+ <header><a href="/" th:href="@{/}">RENKAN</a> > <a href=".." th:href="@{'/s/'+${space.id}}">Space</a></header>
+ <div id="renkan-wrapper">
+ <div id="renkan-container">
+ <div id="renkan"></div>
+ </div>
+ </div>
+ <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
+ <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/templates/renkanProjectPublish.html Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,59 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
+ <head>
+ <meta charset="utf-8" />
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+ <title>RENKAN</title>
+ <link rel="icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" type="image/x-icon" />
+ <meta name="description" content="" />
+ <meta name="author" content="Institut de Recherche et d'Innovation" />
+ <script src="lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
+ <script src="lib/jquery.mousewheel.min.js" th:src="@{/static/lib/jquery.mousewheel.min.js}"></script>
+ <script src="lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}"></script>
+ <script src="lib/backbone.js" th:src="@{/static/lib/backbone.js}"></script>
+ <script src="lib/backbone-relational.js" th:src="@{/static/lib/backbone-relational.js}"></script>
+ <script src="lib/paper.js" th:src="@{/static/lib/paper.js}"></script>
+ <script type="text/javascript" th:inline="javascript">
+ /*<![CDATA[*/
+ var require = {
+ baseUrl: /*[[@{/static/js/}]]*/""
+ };
+ /*]]>*/
+ </script>
+ <script src="lib/require.js" th:src="@{/static/lib/require.js}"></script>
+ <script src="js/renkan.js" th:src="@{/static/js/renkan.js}"></script>
+ <script type="text/javascript" th:inline="javascript">
+ /*<![CDATA[*/
+ function startRenkan() {
+ var _renkan = new Rkns.Renkan({
+ static_url:/*[[@{/static/}]]*/ "",
+ editor_mode: false,
+ show_bins: false,
+ url: /*[[@{/rest/projects/}+${project.id}]]*/ "../metadataplayer/json/renkan.json",
+ property_files: [
+ /*[[@{/static/data/properties.json}]]*/ "data/properties.json",
+ ]
+ });
+ Rkns.jsonIO(_renkan, {
+ url: /*[[@{/rest/projects/}+${project.id}]]*/ "../metadataplayer/json/renkan.json"
+ });
+ }
+ /*]]>*/
+ </script>
+ <link rel="stylesheet" href="css/renkan.css" th:href="@{/static/css/renkan.css}"/>
+ <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
+ <link href="../../static/css/renkanProject.css" rel="stylesheet" th:href="@{/static/css/renkanProject.css}"/>
+ </head>
+
+ <body>
+ <header><a href="/" th:href="@{/}">RENKAN</a> > <a href=".." th:href="@{'/s/'+${space.id}}">Space</a></header>
+ <div id="renkan-wrapper">
+ <div id="renkan-container">
+ <div id="renkan"></div>
+ </div>
+ </div>
+ <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
+ <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
+ </footer>
+ </body>
+</html>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/WEB-INF/web.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0">
+ <listener>
+ <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+ </listener>
+ <listener>
+ <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
+ </listener>
+ <context-param>
+ <param-name>contextConfigLocation</param-name>
+ <param-value>/WEB-INF/applicationContext.xml</param-value>
+ </context-param>
+ <servlet>
+ <servlet-name>cometd</servlet-name>
+ <servlet-class>org.cometd.server.CometdServlet</servlet-class>
+ <init-param>
+ <param-name>logLevel</param-name>
+ <param-value>1</param-value>
+ </init-param>
+ <init-param>
+ <param-name>timeout</param-name>
+ <param-value>30000</param-value>
+ </init-param>
+ <init-param>
+ <param-name>jsonDebug</param-name>
+ <param-value>false</param-value>
+ </init-param>
+ <init-param>
+ <param-name>maxSessionsPerBrowser</param-name>
+ <param-value>-1</param-value>
+ </init-param>
+ <init-param>
+ <param-name>transports</param-name>
+ <param-value>org.cometd.websocket.server.WebSocketTransport</param-value>
+ </init-param>
+ <init-param>
+ <param-name>ws.bufferSize</param-name>
+ <param-value>100000</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>cometd</servlet-name>
+ <url-pattern>/cometd/*</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>admin</servlet-name>
+ <servlet-class>org.coweb.servlet.AdminServlet</servlet-class>
+ <init-param>
+ <param-name>ConfigURI</param-name>
+ <param-value>/WEB-INF/cowebConfig.json</param-value>
+ </init-param>
+ <load-on-startup>2</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>admin</servlet-name>
+ <url-pattern>/ocw_admin/*</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>restServlet</servlet-name>
+ <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>org.iri_research.renkan.rest.RestApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>restServlet</servlet-name>
+ <url-pattern>/rest/*</url-pattern>
+ </servlet-mapping>
+ <servlet>
+ <servlet-name>spring</servlet-name>
+ <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>spring</servlet-name>
+ <url-pattern>/</url-pattern>
+ </servlet-mapping>
+ <filter>
+ <filter-name>springSecurityFilterChain</filter-name>
+ <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>springSecurityFilterChain</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+ <filter>
+ <filter-name>cross-origin</filter-name>
+ <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>cross-origin</filter-name>
+ <url-pattern>/cometd/*</url-pattern>
+ <url-pattern>/rest/*</url-pattern>
+ </filter-mapping>
+</web-app>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/css/index.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,490 @@
+::-moz-selection {
+ background: #a8d1ff;
+ color: inherit;
+ text-shadow: inherit;
+}
+
+::selection {
+ background: #a8d1ff;
+ color: inherit;
+ text-shadow: inherit;
+}
+
+body, html {
+ height: 100%;
+}
+
+body, h1, h2, table, tbody, thead, tr, td, th {
+ border: none;
+ margin: 0;
+ padding: 0;
+ text-align: left;
+ font-size: 100%;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: Arial, Helvetica, sans-serif;
+ background: #F6F6F6;
+ color: #333333;
+}
+
+h1 {
+ margin-bottom: 5px;
+ padding: 15px;
+ background: #333333;
+ color: #ffffff;
+ font-weight: bold;
+ font-size: 30px;
+}
+
+h2 {
+ margin: 12px 15px 2px;
+}
+
+h3 {
+ color: #999999;
+ font-size: 15px;
+ font-weight: bold;
+ font-style: italic;
+ margin: 5px 30px;
+}
+
+a {
+ text-decoration: none;
+ color: #3030a0;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+table {
+ border-collapse: collapse;
+ margin: 5px 15px;
+ border: 1px solid #CCCCCC;
+}
+
+th, td {
+ padding: 4px 12px 4px 4px;
+ border: 1px solid #cccccc;
+}
+
+thead {
+ font-size: 16px;
+}
+
+tbody {
+ font-size: 14px;
+}
+
+tbody tr:nth-child(even) {
+ background: #fafafa;
+}
+
+tbody tr:nth-child(odd) {
+ background: #f0f0f0;
+}
+
+thead tr {
+ background: #666666;
+ color: #f0e0e0;
+}
+
+tbody tr:hover {
+ background: #ffffff;
+}
+
+.pagination-container {
+ margin: 12px 15px 2px;
+ font-size: 14px;
+}
+
+.pagination-container a, .pagination-container span {
+ margin: 0 1px 0 1px;
+}
+
+div#container {
+ position: relative; /* needed for footer positioning*/
+ margin: 0 auto; /* center, not in IE5 */
+ height: auto !important; /* real browsers */
+ height: 100%; /* IE6: treaded as min-height*/
+ min-height: 100%; /* real browsers */
+}
+
+div#wrapper {
+ padding-bottom: 1em; /* bottom padding for footer */
+}
+
+header#header {
+ border-bottom: 2px solid #ffffff;
+ background: #333333;
+ color: #ffffff;
+ font-weight: bold;
+ font-size: 30px;
+}
+
+header h1 {
+ float: left;
+}
+
+header #header-clear {
+ clear: both;
+}
+
+header .header-nav {
+ background: #333333;
+ color: #ffffff;
+ float: right;
+ font-weight: normal;
+ font-size: 15px;
+ margin-bottom: 5px;
+ padding: 15px;
+ text-align: right;
+}
+
+header .header-nav a, header .header-nav a:ACTIVE, header .header-nav a:LINK,
+ header .header-nav a:VISITED {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+header .header-nav a:HOVER {
+ color: #ffffff;
+ text-decoration: underline;
+}
+
+#header-nav-user-avatar {
+ margin: 0 5px 2px 0;
+}
+
+footer#footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ font-size: 12px;
+}
+
+footer#footer div {
+ float: right;
+ margin: 15px 10px 0 0;
+}
+
+#home-link, #home-link:link, #home-link:hover, #home-link:active,
+ #home-link:visited {
+ text-decoration: none;
+ color: #ffffff;
+}
+
+#inner {
+ width: 350px;
+ height: 170px;
+ margin: 10px auto;
+}
+
+#button {
+ margin: 0 auto;
+ border-radius: 3px;
+ text-align: center;
+ font: 36px verdana, arial, sans-serif;
+ color: white;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .8);
+ height: 70px;
+ line-height: 70px;
+ background: #555;
+ background: -webkit-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
+ background: -moz-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
+ background: -ms-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
+ background: -o-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.9);
+}
+
+#button:hover {
+ cursor: pointer;
+ background: #666;
+ background: -webkit-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
+ background: -moz-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
+ background: -ms-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
+ background: -o-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
+}
+
+#button:active {
+ box-shadow: inset 0 1px 12px rgba(0, 0, 0, 0.9);
+ background: #444;
+}
+
+#label {
+ font: 30px verdana, arial, sans-serif bold;
+ text-align: center;
+ text-shadow: 0 1px 1px #fff;
+ height: 70px;
+ line-height: 70px;
+ margin: 16px auto 0;
+}
+
+form {
+ height: 38px;
+ position: relative;
+}
+
+button, input, label {
+ font-weight: bold;
+ font-size: 15px;
+}
+
+#inner label {
+ padding: 5px 10px 5px 0px;
+}
+
+#form-fields {
+ float: left;
+}
+
+#form-fields input {
+ width: 290px;
+}
+
+
+#inner div {
+ /* position: absolute;*/
+
+}
+
+#inner input {
+ padding: 5px 10px;
+ *padding: 0; /* IE7 hack */
+ height: 100%;
+ outline: none;
+}
+
+#inner input[type="text"] {
+ background: #fff;
+ border: 1px solid #bbb;
+ border-radius: 3px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+}
+
+#inner button[type="submit"] {
+ position: absolute;
+ right: -45px;
+ width: 45px;
+ height: 38px;
+}
+
+#objects-content {
+ float: left;
+}
+
+#objects-content table {
+ width: 100%;
+}
+
+.object-tools {
+ font-size: 11px;
+ font-weight: bold;
+ font-family: Arial, Helvetica, sans-serif;
+ padding-left: 0;
+ float: right;
+ position: relative;
+ margin: -2.4em -15px -2em 0;
+}
+
+.object-tools li {
+ list-style: none;
+}
+
+.object-tools a:link, .object-tools a:visited {
+ display: block;
+ float: left;
+ color: white;
+ padding: .1em 8px .1em 8px;
+ height: 14px;
+ background: #666666;
+ text-decoration: none;
+}
+
+.object-table-title {
+ width: 250px;
+}
+
+.object-table-created {
+ width: 120px;
+}
+
+.object-table-actions {
+ width: 40px;
+}
+
+.object-table-actions-disabled, .object-table-actions-disabled:link,
+ .object-table-actions-disabled:visited, .object-table-actions-disabled:hover,
+ .object-table-actions-disabled:active, .object-table-actions-disabled:focus
+ {
+ color: gray;
+ text-decoration: none;
+ cursor: default;
+}
+
+td.object-table-created {
+ text-align: center;
+}
+
+.form-fields label, .form-fields input, .form-fields textarea,
+ .form-fields #binConfigContainer {
+ display: inline-block;
+}
+
+.form-fields label {
+ width: 150px;
+ float: left;
+}
+
+.form-fields input, .form-fields textarea, .form-fields select {
+ width: 200px;
+}
+
+.form-fields div {
+ margin-bottom: 12px;
+}
+
+.form-error {
+ color: red;
+}
+
+#binConfigDiv {
+ position: relative;
+ width: 650px;
+ height: 150px;
+}
+
+.binConfigButton {
+ font-weight: normal;
+}
+
+.binConfigButton[disabled] {
+ color: graytext;
+}
+
+#binConfigDiv div {
+ margin-bottom: 0;
+}
+
+#object-delete-container {
+ margin-left: 12px;
+ margin-top: 1em;
+}
+
+#object-delete-confirm-buttons {
+ margin-top: 1em;
+}
+
+#object-delete-confirm-buttons form {
+ margin: 0;
+ padding: 0;
+ display: inline;
+}
+
+#object-delete-confirm-buttons input[type=submit] {
+ margin-right: 12px;
+}
+
+#project-filter-container {
+ margin: 12px 0 0 15px;
+}
+
+#project-filter-container input[type="text"] {
+ background: #fff;
+ border: 1px solid #bbb;
+ border-radius: 3px;
+ padding: 2px 10px 3px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ outline: none;
+ font-weight: normal;
+ font-size: 15px;
+}
+
+#project-filter-container button[type="submit"] {
+
+}
+
+.proj-sort-form {
+ float: right;
+ height: auto;
+}
+
+.proj-sort-form input[type=submit] {
+ width: 16px;
+ height: 16px;
+ border: 0;
+}
+
+.proj-sort-form input[type=submit]:HOVER {
+ opacity: .5;
+}
+
+.proj-sortable-col {
+ background: url("../img/sort_arrows.png") 0 0;
+}
+
+.proj-sort-desc-col {
+ background: url("../img/sort_arrows.png") 0 -17px;
+}
+
+.proj-sort-asc-col {
+ background: url("../img/sort_arrows.png") 0 -33px;
+}
+
+#inner-container {
+ margin: 12px 0px 0px 15px;
+}
+
+#login-errors {
+ color: #ff0000;
+ border: 1px solid #ff0000;
+ padding: 8px;
+ margin: 16px 16px 32px;
+ width: inherit;
+ float: left;
+}
+
+#login-form {
+ clear: both;
+}
+
+.renkan-icon-eye {
+ background-position: -160px -144px;
+}
+
+.renkan-basic-action {
+ display: inline-block;
+}
+
+.renkan-action-button {
+ cursor: pointer;
+}
+
+.ui-menu {
+ width: 180px;
+}
+
+.action-menu {
+ position: absolute;
+}
+
+.action-menu a {
+ color: #333333;
+}
+
+.action-menu a:ACTIVE {
+ color: #333333;
+}
+
+.action-menu a:LINK {
+ color: #333333;
+}
+
+.action-menu a:VISITED {
+ color: #333333;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/css/renkanProject.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,51 @@
+/* =============================================================================
+ Renkan
+ ========================================================================== */
+body {
+ background-color: #1E1E1E;
+}
+
+header {
+ font-size: 12px;
+ height: 15px;
+ padding: 5px 0 2px 10px;
+ color: white;
+}
+
+footer {
+ font-size: 10px;
+ position:absolute;
+ bottom: 0;
+ text-align: right;
+ width: 100%;
+ padding: 2px 0;
+ color: white;
+}
+
+a, a:VISITED, a:LINK {
+ color: white;
+ text-decoration: none;
+}
+
+a:HOVER {
+ text-decoration: underline;
+}
+
+
+#renkan-wrapper {
+ position:absolute;
+ top: 25px;
+ left: 0;
+ right: 0;
+ bottom: 18px;
+}
+
+#renkan-container {
+ min-height: 100%;
+ position: relative;
+ width: 100%;
+}
+
+#version {
+ padding-right: 5px;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/css/spectrum.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,481 @@
+/***
+Spectrum Colorpicker v1.0.9
+https://github.com/bgrins/spectrum
+Author: Brian Grinstead
+License: MIT
+***/
+
+.sp-container {
+ position:absolute;
+ top:0;
+ left:0;
+ display:inline-block;
+ *display: inline;
+ *zoom: 1;
+ z-index: 2147483647;
+ overflow: hidden;
+}
+.sp-container.sp-flat {
+ position: relative;
+}
+
+/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
+.sp-top {
+ position:relative;
+ width: 100%;
+ display:inline-block;
+}
+.sp-top-inner {
+ position:absolute;
+ top:0;
+ left:0;
+ bottom:0;
+ right:0;
+}
+.sp-color {
+ position: absolute;
+ top:0;
+ left:0;
+ bottom:0;
+ right:20%;
+}
+.sp-hue {
+ position: absolute;
+ top:0;
+ right:0;
+ bottom:0;
+ left:84%;
+ height: 100%;
+}
+.sp-fill {
+ padding-top: 80%;
+}
+.sp-sat, .sp-val {
+ position: absolute;
+ top:0;
+ left:0;
+ right:0;
+ bottom:0;
+}
+
+.sp-alpha-enabled .sp-top
+{
+ margin-bottom: 18px;
+}
+.sp-alpha-enabled .sp-alpha
+{
+ display: block;
+}
+
+.sp-alpha-handle
+{
+ position:absolute;
+ top:-4px;
+ bottom: -4px;
+ width: 6px;
+ left: 50%;
+ cursor: pointer;
+ border: 1px solid black;
+ background: white;
+ opacity: .8;
+}
+
+.sp-alpha
+{
+ display: none;
+ position: absolute;
+ bottom: -14px;
+ right: 0;
+ left: 0;
+ height: 8px;
+}
+.sp-alpha-inner{
+ border: solid 1px #333;
+}
+
+/* Don't allow text selection */
+.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
+ -webkit-user-select:none;
+ -moz-user-select: -moz-none;
+ -o-user-select:none;
+ user-select: none;
+}
+
+.sp-container.sp-input-disabled .sp-input-container {
+ display: none;
+}
+.sp-container.sp-buttons-disabled .sp-button-container {
+ display: none;
+}
+.sp-palette-only .sp-picker-container {
+ display: none;
+}
+.sp-palette-disabled .sp-palette-container {
+ display: none;
+}
+
+.sp-initial-disabled .sp-initial {
+ display: none;
+}
+
+
+/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
+.sp-sat {
+ background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
+ background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
+ background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
+ background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
+ background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
+ background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
+ filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
+}
+.sp-val {
+ background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
+ background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
+ background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
+ background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
+ background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
+ background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
+ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
+ filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
+}
+
+.sp-hue {
+ background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+ background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+ background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+ background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
+ background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
+}
+
+/* IE filters do not support multiple color stops.
+ Generate 6 divs, line them up, and do two color gradients for each.
+ Yes, really.
+ */
+
+.sp-1 {
+ height:17%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
+}
+.sp-2 {
+ height:16%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
+}
+.sp-3 {
+ height:17%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
+}
+.sp-4 {
+ height:17%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
+}
+.sp-5 {
+ height:16%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
+}
+.sp-6 {
+ height:17%;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
+}
+
+.sp-hidden {
+ display: none !important;
+}
+
+/* Clearfix hack */
+.sp-cf:before, .sp-cf:after { content: ""; display: table; }
+.sp-cf:after { clear: both; }
+.sp-cf { *zoom: 1; }
+
+/* Mobile devices, make hue slider bigger so it is easier to slide */
+@media (max-device-width: 480px) {
+ .sp-color { right: 40%; }
+ .sp-hue { left: 63%; }
+ .sp-fill { padding-top: 60%; }
+}
+
+.sp-dragger {
+ border-radius: 5px;
+ height: 5px;
+ width: 5px;
+ border: 1px solid #fff;
+ background: #000;
+ cursor: pointer;
+ position:absolute;
+ top:0;
+ left: 0;
+}
+.sp-slider {
+ position: absolute;
+ top:0;
+ cursor:pointer;
+ height: 3px;
+ left: -1px;
+ right: -1px;
+ border: 1px solid #000;
+ background: white;
+ opacity: .8;
+}
+
+/* Basic display options (colors, fonts, global widths) */
+.sp-container {
+ border-radius: 0;
+ background-color: #ECECEC;
+ border: solid 1px #f0c49B;
+ padding: 0;
+}
+.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue
+{
+ font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ -ms-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.sp-top
+{
+ margin-bottom: 3px;
+}
+.sp-color, .sp-hue
+{
+ border: solid 1px #666;
+}
+
+/* Input */
+.sp-input-container {
+ float:right;
+ width: 100px;
+ margin-bottom: 4px;
+}
+.sp-initial-disabled .sp-input-container {
+ width: 100%;
+}
+.sp-input {
+ font-size: 12px !important;
+ border: 1px inset;
+ padding: 4px 5px;
+ margin: 0;
+ width: 100%;
+ background:transparent;
+ border-radius: 3px;
+ color: #222;
+}
+.sp-input:focus {
+ border: 1px solid orange;
+}
+.sp-input.sp-validation-error
+{
+ border: 1px solid red;
+ background: #fdd;
+}
+.sp-picker-container , .sp-palette-container
+{
+ float:left;
+ position: relative;
+ padding: 10px;
+ padding-bottom: 300px;
+ margin-bottom: -290px;
+}
+.sp-picker-container
+{
+ width: 172px;
+ border-left: solid 1px #fff;
+}
+
+/* Palettes */
+.sp-palette-container
+{
+ border-right: solid 1px #ccc;
+}
+
+.sp-palette .sp-thumb-el {
+ display: block;
+ position:relative;
+ float:left;
+ width: 24px;
+ height: 15px;
+ margin: 3px;
+ cursor: pointer;
+ border:solid 2px transparent;
+}
+.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
+ border-color: orange;
+}
+.sp-thumb-el
+{
+ position:relative;
+}
+
+/* Initial */
+.sp-initial
+{
+ float: left;
+ border: solid 1px #333;
+}
+.sp-initial span {
+ width: 30px;
+ height: 25px;
+ border:none;
+ display:block;
+ float:left;
+ margin:0;
+}
+
+/* Buttons */
+.sp-button-container {
+ float: right;
+}
+
+/* Replacer (the little preview div that shows up instead of the <input>) */
+.sp-replacer {
+ margin:0;
+ overflow:hidden;
+ cursor:pointer;
+ padding: 4px;
+ display:inline-block;
+ *zoom: 1;
+ *display: inline;
+ border: solid 1px #91765d;
+ background: #eee;
+ color: #333;
+ vertical-align: middle;
+}
+.sp-replacer:hover, .sp-replacer.sp-active {
+ border-color: #F0C49B;
+ color: #111;
+}
+.sp-replacer.sp-disabled {
+ cursor:default;
+ border-color: silver;
+ color: silver;
+}
+.sp-dd {
+ padding: 2px 0;
+ height: 16px;
+ line-height: 16px;
+ float:left;
+ font-size:10px;
+}
+.sp-preview
+{
+ position:relative;
+ width:25px;
+ height: 20px;
+ border: solid 1px #222;
+ margin-right: 5px;
+ float:left;
+ z-index: 0;
+}
+
+.sp-palette
+{
+ *width: 220px;
+ max-width: 220px;
+}
+.sp-palette .sp-thumb-el
+{
+ width:16px;
+ height: 16px;
+ margin:2px 1px;
+ border: solid 1px #d0d0d0;
+}
+
+.sp-container
+{
+ padding-bottom:0;
+}
+
+
+/* Buttons: http://hellohappy.org/css3-buttons/ */
+.sp-container button {
+ background-color: #eeeeee;
+ background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
+ background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
+ background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
+ background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
+ background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
+ background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
+ border: 1px solid #ccc;
+ border-bottom: 1px solid #bbb;
+ border-radius: 3px;
+ color: #333;
+ font-size: 14px;
+ line-height: 1;
+ padding: 5px 4px;
+ text-align: center;
+ text-shadow: 0 1px 0 #eee;
+ vertical-align: middle;
+}
+.sp-container button:hover {
+ background-color: #dddddd;
+ background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
+ background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
+ background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
+ background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
+ background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
+ background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
+ border: 1px solid #bbb;
+ border-bottom: 1px solid #999;
+ cursor: pointer;
+ text-shadow: 0 1px 0 #ddd;
+}
+.sp-container button:active {
+ border: 1px solid #aaa;
+ border-bottom: 1px solid #888;
+ -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
+ -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
+ -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
+ -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
+ box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
+}
+.sp-cancel
+{
+ font-size: 11px;
+ color: #d93f3f !important;
+ margin:0;
+ padding:2px;
+ margin-right: 5px;
+ vertical-align: middle;
+ text-decoration:none;
+
+}
+.sp-cancel:hover
+{
+ color: #d93f3f !important;
+ text-decoration: underline;
+}
+
+
+.sp-palette span:hover, .sp-palette span.sp-thumb-active
+{
+ border-color: #000;
+}
+
+.sp-preview, .sp-alpha, .sp-thumb-el
+{
+ position:relative;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
+}
+.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner
+{
+ display:block;
+ position:absolute;
+ top:0;left:0;bottom:0;right:0;
+}
+
+.sp-palette .sp-thumb-inner
+{
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+}
+
+.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner
+{
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
+}
+
+.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner
+{
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/css/style.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,130 @@
+/* =============================================================================
+ HTML5 Boilerplate CSS: h5bp.com/css
+ ========================================================================== */
+
+article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
+audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
+audio:not([controls]) { display: none; }
+[hidden] { display: none; }
+
+html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
+html, button, input, select, textarea { font-family: sans-serif; color: #222; }
+body { margin: 0; font-size: 1em; line-height: 1.4; }
+
+::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
+::selection { background: #fe57a1; color: #fff; text-shadow: none; }
+
+a { color: #00e; }
+a:visited { color: #551a8b; }
+a:hover { color: #06e; }
+a:focus { outline: thin dotted; }
+a:hover, a:active { outline: 0; }
+
+abbr[title] { border-bottom: 1px dotted; }
+b, strong { font-weight: bold; }
+blockquote { margin: 1em 40px; }
+dfn { font-style: italic; }
+hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
+ins { background: #ff9; color: #000; text-decoration: none; }
+mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
+pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
+pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
+q { quotes: none; }
+q:before, q:after { content: ""; content: none; }
+small { font-size: 85%; }
+
+sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
+sup { top: -0.5em; }
+sub { bottom: -0.25em; }
+
+ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
+dd { margin: 0 0 0 40px; }
+nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
+
+img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
+
+svg:not(:root) { overflow: hidden; }
+
+figure { margin: 0; }
+
+form { margin: 0; }
+fieldset { border: 0; margin: 0; padding: 0; }
+label { cursor: pointer; }
+legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; }
+button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
+button, input { line-height: normal; }
+button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; }
+button[disabled], input[disabled] { cursor: default; }
+input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; }
+input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
+input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }
+button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
+textarea { overflow: auto; vertical-align: top; resize: vertical; }
+input:valid, textarea:valid { }
+input:invalid, textarea:invalid { background-color: #f0dddd; }
+
+table { border-collapse: collapse; border-spacing: 0; }
+td { vertical-align: top; }
+
+.chromeframe { margin: 0.2em 0; background: #ccc; color: black; padding: 0.2em 0; }
+
+
+
+/* ===== Primary Styles ========================================================
+ Author:
+ ========================================================================== */
+.templates { display: none; }
+
+.project_desc_label { font-weight: bold; }
+
+#project_display {
+ background: #9cbc2c;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ padding: 20px;
+ width: 400px;
+}
+
+
+
+/* =============================================================================
+ Media Queries
+ ========================================================================== */
+
+@media only screen and (min-width: 35em) {
+ /* Style adjustments for viewports that meet the condition */
+}
+
+/* =============================================================================
+ Non-Semantic Helper Classes
+ ========================================================================== */
+
+.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; *line-height: 0; }
+.ir br { display: none; }
+.hidden { display: none !important; visibility: hidden; }
+.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
+.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
+.invisible { visibility: hidden; }
+.clearfix:before, .clearfix:after { content: ""; display: table; }
+.clearfix:after { clear: both; }
+.clearfix { *zoom: 1; }
+
+/* =============================================================================
+ Print Styles
+ ========================================================================== */
+
+@media print {
+ * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */
+ a, a:visited { text-decoration: underline; }
+ a[href]:after { content: " (" attr(href) ")"; }
+ abbr[title]:after { content: " (" attr(title) ")"; }
+ .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */
+ pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
+ thead { display: table-header-group; } /* h5bp.com/t */
+ tr, img { page-break-inside: avoid; }
+ img { max-width: 100% !important; }
+ @page { margin: 0.5cm; }
+ p, h2, h3 { orphans: 3; widows: 3; }
+ h2, h3 { page-break-after: avoid; }
+}
Binary file server/java/renkan-web/src/main/webapp/static/img/favicon.ico has changed
Binary file server/java/renkan-web/src/main/webapp/static/img/sort_arrows.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/img/user.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/js/admin_form.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,18 @@
+function showformErrors(errors) {
+ $(".form-error").remove();
+
+ $.each(errors,function(k,v){
+ $("#"+k).after('<div class="form-error">'+v+'</div>');
+ });
+ $(".form-error").effect("highlight", {}, 1500);
+}
+
+
+function formatJson(jsonText, tabSize) {
+ var obj = JSON.parse(jsonText);
+ return JSON.stringify(obj, undefined, tabSize);
+}
+function compactJson(jsonText) {
+ var obj = JSON.parse(jsonText);
+ return JSON.stringify(obj);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/js/config.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,26 @@
+//
+// Config file. Split out from the app for ease of overlaying a new config
+// without affecting the app controller.
+//
+// Copyright (c) The Dojo Foundation 2011. All Rights Reserved.
+//
+var dojoConfig = {
+ baseUrl: '/renkan/',
+ async:true,
+ paths : {
+ coweb : 'lib/coweb',
+ cowebx: 'lib/cowebx',
+ org : 'lib/org',
+ corenkan: 'static/js/corenkan',
+ rcolor: 'static/lib/rcolor',
+ underscore: 'static/lib/underscore-min',
+ jquery: 'static/lib/jquery.min',
+ filesaver: 'static/lib/FileSaver',
+ },
+ packages:[{
+ name: 'dojo',
+ location:'static/lib/dojo',
+ main:'main'
+ }],
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/js/corenkan.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,619 @@
+/**
+ * TODO: add js header
+ */
+
+define([
+ "dojo",
+ "dojo/cookie",
+ "dojo/json",
+ "dojo/ready",
+ "coweb/main",
+ "rcolor",
+ ], function(dojo, cookie, json, ready, coweb, RColor) {
+
+ 'use strict';
+
+ var CoRenkan = function() {
+ };
+
+ var proto = CoRenkan.prototype;
+
+ proto.init = function() {
+ console.log("ready callback", dojo.config.corenkanConfig);
+
+ this.renkan = dojo.config.corenkanConfig.renkan;
+ this.project = dojo.config.corenkanConfig.renkan.project;
+
+ this.initCollab(dojo.config.corenkanConfig.projectId);
+
+
+ var that = this;
+
+ ready(function() {
+
+ var sess = coweb.initSession();
+ that.session = sess;
+
+ sess.prepare({userDefined: {project_id:dojo.config.corenkanConfig.projectId}, collab: true}).then(function(data) {
+ console.log("Prepare ok : ", data);
+ that.setObjects();
+ });
+
+ sess.onStatusChange = function(status) {
+ console.log(status);
+ that.onInternalStatusChange(status);
+ if(typeof that.onStatusChange === "function") {
+ that.onStatusChange(status);
+ }
+ };
+
+ });
+
+ };
+
+ proto.initCollab = function(id) {
+
+ console.log("init collabbs objects " + "users_" + id + ", " + "renkan_" + id);
+
+ this.users_collab = coweb.initCollab({id: "users_" + id});
+
+ this.users_collab.subscribeReady(this, "onLocalJoin");
+ this.users_collab.subscribeSiteJoin(this, 'onRemoteJoin');
+ this.users_collab.subscribeSiteLeave(this, 'onRemoteLeave');
+ this.users_collab.subscribeSync("roster", this, "onRemoteRosterChange");
+
+ this.users_collab.subscribeStateResponse(this, "onUsersStateResponse");
+
+
+ this.collab = coweb.initCollab({id : "renkan_" + id});
+
+ this.collab.subscribeSync("project", this, "onRemoteProjectChange");
+ this.collab.subscribeSync("user", this, "onRemoteUserChange");
+ this.collab.subscribeSync("node", this, "onRemoteNodeChange");
+ this.collab.subscribeSync("edge", this, "onRemoteEdgeChange");
+ this.collab.subscribeSync("view", this, "onRemoteViewChange");
+
+ this.collab.subscribeStateResponse(this, "onStateResponse");
+
+ };
+
+ proto.onLocalJoin = function(params) {
+ console.log("Local join", params);
+ this.current_site = params.site;
+ if(typeof this.renkan !== "undefined" && this.renkan !== null && typeof this.renkan.current_user !== "undefined") {
+ this.renkan.current_user.set("site_id", params.site);
+ }
+ };
+
+
+ proto.onRemoteJoin = function(params) {
+ console.log("Remote join", params);
+ // do nothing
+ };
+
+ proto.onRemoteLeave = function(params) {
+ console.log("Remote leave", params);
+
+ // remove remote site from current_user_list
+ if(typeof this.renkan === "undefined" || this.renkan === null || typeof this.renkan.current_user_list === "undefined" || this.renkan.current_user_list === null) {
+ return;
+ }
+ var filtered_user_list = this.renkan.current_user_list.filter(function(u) { return u.get("site_id") == params.site; });
+ for ( var user in filtered_user_list) {
+ this.renkan.current_user_list.remove(user);
+ }
+
+ };
+
+ proto.onUsersStateResponse = function(state) {
+
+ var user_list = json.parse(state);
+ console.log("Users State response", user_list);
+ _.each(user_list, function(user, i, l) {
+ user._id = user.id;
+ });
+ this.renkan.current_user_list.reset(user_list, {silent: true});
+ };
+
+ proto.onStateResponse = function(state) {
+ var obj = json.parse(state);
+ console.log("State response", obj);
+ obj._id = obj.id;
+ this.project.set(obj, {validate: true});
+ this.renkan.renderer.autoScale();
+ };
+
+ proto.onInternalStatusChange = function(status) {
+ if(status == "ready") {
+ this.renkan.read_only = false;
+ this.renkan.onStatusChange();
+ }
+ else {
+ this.renkan.read_only = true;
+ this.renkan.onStatusChange();
+ }
+ };
+
+ function prepareValues(obj,c) {
+ var values = {};
+ for(var fieldname in c.changes) {
+ if(c.changes[fieldname]) {
+ values[fieldname] = obj.get(fieldname);
+ }
+ }
+ return values;
+ }
+
+ proto.addObjectBind = function(type, obj, c, options, collab) {
+ console.log("add " + type,obj, c, options);
+ if(this.project === null) {
+ console.log("null project exiting");
+ return;
+ }
+ var values = obj.toJSON();
+ var new_values = {
+ id: obj.id,
+ _type: type,
+ _index: options.index,
+ _project_id : obj.get("project").get("_id"),
+ _user_id : (this.project.current_user!==null && typeof this.project.current_user !== "undefined")?this.project.current_user.id:null
+ };
+ for(var k in new_values) {
+ values[k] = new_values[k];
+ }
+ var position = c.indexOf(obj);
+ console.log("add position, index, values: ", position, options.index, values);
+ collab.sendSync(type, values, "insert", position);
+ };
+
+ proto.removeObjectBind = function(type, obj, c, options, collab) {
+ console.log("delete " + type,obj, c, options);
+ var values = {
+ id: obj.id,
+ _type: type,
+ _index: options.index,
+ _project_id : obj.get("project").id,
+ _user_id : (this.project.current_user!==null)?this.project.current_user.id:null
+ };
+ collab.sendSync(type, values, "delete", options.index);
+ };
+
+ proto.updateObjectBind = function(type, obj, options, collab) {
+ console.log("change " + type,obj, options);
+ if(typeof obj != "undefined" && obj.hasChanged()) {
+ var values = {
+ id: obj.id,
+ _type: type,
+ _project_id : obj.get("project").id,
+ _user_id : (this.project.current_user!==null)?this.project.current_user.id:null
+ };
+ _.extend(values,obj.changed);
+ collab.sendSync(type, values);
+ }
+ };
+
+ /**
+ * Called when an abject is changed
+ *
+ */
+ proto.objectChange = function(event, model, collection, options) {
+
+ console.log("project change all ", event, model, collection, options);
+ // check that current user is in user list of the project
+
+ if(this.project === null || this.project.current_user === null) {
+ return;
+ }
+ var current_user = this.project.current_user;
+
+ if(this.project.get("users").get(current_user.id) === null) {
+ var props = current_user.toJSON();
+ this.project.addUser(props);
+ }
+
+ };
+
+
+ proto.setObjects = function() {
+
+ console.log("Cookie BAYEUX_BROWSER : " + cookie("BAYEUX_BROWSER"));
+ var renkan = this.renkan;
+ var project = renkan.project;
+ this.setProject(project);
+ this.setRenkan(renkan);
+ this.setUser(renkan);
+
+ };
+
+ proto.setRenkan = function(renkan) {
+
+ console.log("Set Renkan");
+
+ var that = this;
+
+ renkan.current_user_list.bind("add", function(obj, c, options) {
+ that.addObjectBind("roster", obj, c, options, that.users_collab);
+ });
+ //renkan.current_user_list.bind("remove", function(obj, c, options) {
+ // that.removeObjectBind("_roster", obj, c, options, that.users_collab);
+ //});
+ renkan.current_user_list.bind("change", function(obj, options) {
+ that.updateObjectBind("roster", obj, options, that.users_collab);
+ });
+
+ renkan.current_user_list.bind("change", function(obj, options) {
+ console.log("update roster",obj, options);
+ // get user in project
+ var project = obj.get("project");
+ if(project === null) {
+ console.log("null project return");
+ return;
+ }
+ var user = project.get("users").get(obj.id);
+ if(user === null) {
+ console.log("user " + obj.id + " not in project. return");
+ return;
+ }
+ var new_val;
+ for(var att in obj.changed) {
+ new_val = obj.changed[att];
+ if(user.get("att") != new_val) {
+ user.set(att, new_val);
+ }
+ }
+ });
+
+ };
+
+ proto.setUser = function(renkan) {
+ console.log("set user : " + cookie("BAYEUX_BROWSER"));
+
+ if(typeof renkan === "undefined" || typeof renkan.project === "undefined" || renkan.project === null) {
+ return;
+ }
+
+ var user_id = cookie("BAYEUX_BROWSER");
+ var project = renkan.project;
+
+ var puser = project.get("users").get(user_id);
+ var puser_def = null;
+ if(puser === null || typeof puser === "undefined") {
+ var color = new RColor();
+ puser_def = {
+ id: user_id,
+ title: "anonymous",
+ project: project,
+ color: color.get(true, 0.5, 0.8),
+ site_id: this.current_site
+ };
+ }
+ else {
+ puser_def = puser.toJSON();
+ puser_def.project = project;
+ }
+ puser = renkan.current_user_list.push(puser_def);
+
+ project.current_user = puser;
+ renkan.current_user = puser.id;
+
+ var that = this;
+
+ project.once("all", function(event, model, collection, options){
+ that.objectChange(event, model, collection, options);
+ });
+ project.get("nodes").once("all", function(event, model, collection, options){
+ that.objectChange(event, model, collection, options);
+ });
+ project.get("edges").once("all", function(event, model, collection, options){
+ that.objectChange(event, model, collection, options);
+ });
+ project.get("views").once("all", function(event, model, collection, options){
+ that.objectChange(event, model, collection, options);
+ });
+
+ };
+
+ proto.setProject = function(project) {
+
+ console.log("project", project);
+
+ var projectFields = ["title", "description", "uri"];
+ var that = this;
+
+ var bind_field_index = function(fi){
+ var field = projectFields[fi];
+ project.bind("change:"+field, function(obj, c) {
+ console.log(c);
+ var values = {
+ id: obj.id,
+ _type: "project",
+ _project_id: obj.id,
+ _user_id : (that.project.current_user!==null)?that.project.current_user.id:null
+ };
+ values[field] = c;
+ that.collab.sendSync("project", values);
+ });
+ };
+ for(var fieldIndex in projectFields) {
+ bind_field_index(fieldIndex);
+ }
+
+
+ project.get("nodes").bind("add", function(obj, c, options) {
+ that.addObjectBind("node", obj, c, options, that.collab);
+ });
+
+ project.get("nodes").bind("remove", function(obj, c, options) {
+ that.removeObjectBind("node", obj, c, options, that.collab);
+ });
+
+ project.get("nodes").bind("change", function(obj, options) {
+ that.updateObjectBind("node", obj, options, that.collab);
+ });
+
+ project.get("users").bind("add", function(obj, c, options) {
+ that.addObjectBind("user", obj, c, options, that.collab);
+ });
+
+ project.get("users").bind("remove", function(obj, c, options) {
+ that.removeObjectBind("user", obj, c, options, that.collab);
+ });
+
+ project.get("users").bind("change", function(obj, options) {
+ that.updateObjectBind("user", obj, options, that.collab);
+ });
+
+ project.get("edges").bind("add", function(obj, c, options) {
+ that.addObjectBind("edge", obj, c, options, that.collab);
+ });
+
+ project.get("edges").bind("remove", function(obj, c, options) {
+ that.removeObjectBind("edge", obj, c, options, that.collab);
+ });
+
+ project.get("edges").bind("change", function(obj, options) {
+ that.updateObjectBind("edge", obj, options, that.collab);
+ });
+
+ project.get("views").bind("add", function(obj, c, options) {
+ that.addObjectBind("view", obj, c, options, that.collab);
+ });
+
+ project.get("views").bind("remove", function(obj, c, options) {
+ that.removeObjectBind("view", obj, c, options, that.collab);
+ });
+
+ project.get("views").bind("change", function(obj, options) {
+ that.updateObjectBind("view", obj, options, that.collab);
+ });
+
+
+ };
+
+
+ /**
+ * Called when a remote data store for project changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * TODO: manage project list change on server
+ * @param args Cooperative web event
+ */
+ proto.onRemoteProjectChange = function(args) {
+ console.log("Remote project change", args);
+ if (args.type === "update") {
+ this.onRemoteProjectUpdate(args.value, args.position);
+ }
+ };
+
+
+ /**
+ * Called when a remote data store for nodes changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteObjectChange = function(field, args) {
+
+ console.log("Remote "+ field +" change",args);
+ if (args.type === "insert") {
+ this.onRemoteObjectInsert(field, args.value, args.position);
+ } else if (args.type === "update") {
+ this.onRemoteObjectUpdate(field, args.value, args.position);
+ } else if (args.type === "delete") {
+ this.onRemoteObjectDelete(field, args.position);
+ }
+ };
+
+
+ /**
+ * Called when a remote data store for nodes changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteNodeChange = function(args) {
+ this.onRemoteObjectChange("nodes", args);
+ };
+
+
+ /**
+ * Called when a remote data store for nodes changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteUserChange = function(args) {
+ this.onRemoteObjectChange("users", args);
+ };
+
+ /**
+ * Called when a remote data store for nodes changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteEdgeChange = function(args) {
+ this.onRemoteObjectChange("edges", args);
+ };
+
+ /**
+ * Called when a remote data store for views changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteViewChange = function(args) {
+ this.onRemoteObjectChange("views", args);
+ };
+
+
+ /**
+ * Called when a remote data store for nodes changes in some manner. Dispatches to
+ * local methods for insert, update, delete handling.
+ * @param args Cooperative web event
+ */
+ proto.onRemoteRosterChange = function(args) {
+ this.onRemoteObjectChange(this.renkan.current_user_list, args);
+ };
+
+ /**
+ * Called when a project attribute changes value in a remote data store.
+ * Updates the attribute value of the item with the same id in the local
+ * data store.
+ *
+ * @param value Item data sent by remote data store
+ * @param position Which item to update.
+ */
+ proto.onRemoteProjectUpdate = function(values, position) {
+ var project_id = values.id;
+ if(typeof(project_id) === "undefined") {
+ return;
+ }
+
+ if(this.project !== null && project_id === this.project.id) {
+ for(var fieldname in values) {
+ if(fieldname != "id" && fieldname != "type") {
+ this.project.set(fieldname, values[fieldname]);
+ }
+ }
+ }
+
+ };
+
+ /**
+ * Called when an object is inserted in a remote data store.
+ *
+ * @param field_coll A collection or a string for one of the project collection
+ * @param value Item data sent by remote data store
+ * @param position Which item to update.
+ */
+ proto.onRemoteObjectInsert = function(field_coll, values, position) {
+
+ console.log("Remote ", field_coll ," insert values ", values, "position", position);
+
+ var coll = null;
+ if(typeof field_coll === "string") {
+ coll = this.project.get(field_coll);
+ }
+ else {
+ coll = field_coll;
+ }
+
+ var object_id = values.id;
+
+ var obj = coll.get(object_id);
+
+ if(obj !== null && typeof obj !== "undefined") {
+ this.onRemoteObjectUpdate(field_coll, values, coll.indexOf(obj));
+ }
+ else {
+ var add_values = {};
+ for(var fieldname in values) {
+ if(fieldname == "_id" || fieldname[0] !== '_' ) {
+ add_values[fieldname] = values[fieldname];
+ }
+ }
+ switch(field_coll) {
+ case "nodes":
+ this.project.addNode(add_values, {at:position});
+ break;
+ case "edges":
+ this.project.addEdge(add_values, {at:position});
+ break;
+ case "users":
+ this.project.addUser(add_values, {at:position});
+ break;
+ case "views":
+ this.project.addView(add_values, {at:position});
+ break;
+ default:
+ add_values.project = this.project;
+ coll.push(add_values, {at:position});
+ break;
+ }
+
+ }
+
+ };
+
+ /**
+ * Called when a object attribute changes value in a remote data store.
+ * Updates the attribute value of the item with the same id in the local
+ * data store.
+ *
+ * @param field_coll A collection or a string for one of the project collection
+ * @param value Item data sent by remote data store
+ * @param position Which item to update.
+ */
+ proto.onRemoteObjectUpdate = function(field_coll, values, position) {
+
+ console.log("Remote ", field_coll ," update values ", values, "position", position);
+
+ var coll = null;
+ if(typeof field_coll === "string") {
+ coll = this.project.get(field_coll);
+ }
+ else {
+ coll = field_coll;
+ }
+
+ var object_id = values.id;
+
+ if(this.project !== null) {
+ var obj = coll.get(object_id);
+ if(obj !== null && typeof obj !== "undefined") {
+ var changed_val = {};
+ for(var fieldname in values) {
+ if(fieldname != "id" && fieldname != "type" && fieldname != "_id") {
+ changed_val[fieldname] = values[fieldname];
+ }
+ }
+ obj.set(changed_val);
+ }
+ }
+ };
+
+ /**
+ * Called when a object is deleted in a remote data store.
+ *
+ * @param field_coll A collection or a string for one of the project collection
+ * @param position Which item to update.
+ */
+ proto.onRemoteObjectDelete = function(field_coll, position) {
+ console.log("Remote ", field_coll," delete position", position);
+ var coll = null;
+ if(typeof field_coll === "string") {
+ coll = this.project.get(field);
+ }
+ else {
+ coll = field_coll;
+ }
+
+ coll.remove(coll.at(position));
+ };
+
+
+ var app = new CoRenkan();
+ dojo.ready(function() {
+ app.init();
+ });
+
+
+ return {
+ app: app
+ };
+});
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/js/thymol.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,376 @@
+/*-------------------- Thymol - the flavour of Thymeleaf --------------------*
+
+ Thymol version 0.1.2 Copyright 2012 James J. Benson.
+ jjbenson .AT. users.sf.net
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" basis,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ *---------------------------------------------------------------------------*/
+
+var thURL = "http://www.thymeleaf.org";
+var thPrefix = "th";
+var thProtocol = "file:///";
+var thCache = new Object;
+
+$(function() {
+ thymol();
+});
+
+var thymol = function() {
+
+ var urlParams = {};
+ (function() {
+ var e, a = /\+/g, r = /([^&=]+)=?([^&]*)/g, d = function(s) {
+ return decodeURIComponent(s.replace(a, " "));
+ }, f = function(s) {
+ return new Param(d(s));
+ }, q = window.location.search.substring(1);
+ while (e = r.exec(q)) {
+ urlParams[d(e[1])] = f(e[2]);
+ }
+ })();
+
+ var debug = getThParam("thDebug",true,false);
+ var root = getThParam("thRoot",false,true);
+ var path = getThParam("thPath",false,true);
+
+ $.ajaxSetup({
+ async : false,
+ isLocal : true
+ });
+
+ (function() {
+ var htmlTag = $("html")[0];
+ $(htmlTag.attributes).each(function() {
+ if (thURL == this.value) {
+ var nsspec = this.localName.split(":");
+ if (nsspec.length > 0) {
+ thPrefix = nsspec[nsspec.length - 1];
+ return;
+ }
+ }
+ });
+ })();
+
+ var thIncl = new ThObj("include");
+ var thSubs = new ThObj("substituteby");
+ var thIf = new ThObj("if");
+ var thUnless = new ThObj("unless");
+ var thSwitch = new ThObj("switch");
+ var thCase = new ThObj("case");
+
+ var thFragEscp = "[" + thPrefix + "\\:fragment='";
+ var base = new ThNode(document, false, null, null, null, document.nodeName, "::", false, document);
+ process(base);
+ return;
+
+ function process(base) {
+ var n = base;
+ while (n.thDoc) {
+ getChildren(n);
+ if (n.firstChild && n.firstChild.thDoc && !n.visited) {
+ n.visited = true;
+ n = n.firstChild;
+ }
+ else {
+ doReplace(n.isNode, n.element, n.thDoc);
+ if (n.nextSibling && n.nextSibling.thDoc) {
+ n = n.nextSibling;
+ }
+ else {
+ if (n == base)
+ break;
+ else {
+ n = n.parentDoc;
+ }
+ }
+ }
+ }
+ }
+
+ function getChildren(base) {
+ var thIfSpecs = $(thIf.escp, base.thDoc);
+ var thUnlessSpecs = $(thUnless.escp, base.thDoc);
+ var thSwitchSpecs = $(thSwitch.escp, base.thDoc);
+ var ths = $(thIfSpecs).add(thUnlessSpecs).add(thSwitchSpecs);
+ ths.each(function() {
+ var element = this;
+ $(element.attributes).each(function() {
+ var thAttr = this;
+ if (thIf.name == thAttr.name || thUnless.name == thAttr.name || thSwitch.name == thAttr.name) {
+ processConditional(element, base, thAttr);
+ }
+ });
+ });
+ var thInclSpecs = $(thIncl.escp, base.thDoc);
+ var thSubsSpecs = $(thSubs.escp, base.thDoc);
+ ths = $(thInclSpecs).add(thSubsSpecs);
+ var count = 0;
+ var last = null;
+ ths.each(function() {
+ var element = this;
+ $(element.attributes).each(function() {
+ var thAttr = this;
+ if (thIncl.name == thAttr.name || thSubs.name == thAttr.name) {
+ var child = processImport(element, base, thAttr);
+ if( child != null ) {
+ if (count == 0) {
+ base.firstChild = child;
+ }
+ else {
+ last.nextSibling = child;
+ }
+ last = child;
+ count++;
+ }
+ }
+ });
+ });
+ }
+
+ function processConditional(element, base, attr) {
+ var args = attr.value.match(/[$\*#]{(!?.*)}/);
+ var processed = false;
+ if (args.length > 0) {
+ var param = args[1];
+ if (thSwitch.name == attr.name) {
+ processed = processSwitch(element, base, attr, param);
+ }
+ else {
+ var negate = false;
+ if (args[1].charAt(0) == '!') {
+ negate = true;
+ param = args[1].substring(1);
+ }
+ if ((!negate && isTrue(param)) || (negate && !isTrue(param))) {
+ if (thUnless.name == attr.name) { // true for "if" and
+ // false for "unless"
+ element.innerHTML = "";
+ }
+ processed = true;
+ }
+ else {
+ if (thIf.name == attr.name) { // false for "if", true for
+ // "unless"
+ element.innerHTML = "";
+ }
+ processed = true;
+ }
+
+ }
+ }
+ if (!processed && debug) {
+ window.alert("thymol.processConditional cannot process: " + attr.name + "=\"" + attr.value + "\"\n" + element.innerHTML);
+ }
+ element.removeAttribute(attr.name);
+ }
+
+ function processSwitch(element, base, attr, param) {
+ var matched = false;
+ var haveDefault = false;
+ var thCaseSpecs = $(thCase.escp, element);
+ thCaseSpecs.each(function() {
+ var caseClause = this;
+ var remove = true;
+ $(caseClause.attributes).each(function() {
+ var ccAttr = this;
+ if (thCase.name == ccAttr.name) {
+ if (!matched) {
+ var s = urlParams[param];
+ if (ccAttr.value == "*" || (s && (s.getStringValue() == ccAttr.value))) {
+ matched = true;
+ remove = false;
+ }
+ }
+ caseClause.removeAttribute(ccAttr.name);
+ }
+ });
+ if (remove) {
+ caseClause.innerHTML = "";
+ }
+ });
+ return matched;
+ }
+
+ function processImport(element, base, attr) {
+ var importNode = null;
+ var filePart = null;
+ var fragmentPart = "::";
+ if (attr.value.indexOf("::") < 0) {
+ filePart = getFilePart(attr.value);
+ }
+ else {
+ var names = attr.value.split("::");
+ filePart = getFilePart(names[0].trim());
+ fragmentPart = substitute(names[1].trim());
+ }
+ var isNode = (thSubs.name == attr.localName);
+ if (thCache[filePart] != null && thCache[filePart][fragmentPart] != null) {
+ isNode = ((thSubs.name == attr.localName) || (fragmentPart == "::"));
+ importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
+ }
+ else {
+ var fileName = filePart + ".html";
+ $.get(fileName, function(content, status) {
+ if ("success" == status) {
+ if (thCache[filePart] == null) {
+ thCache[filePart] = new Object;
+ }
+ if (fragmentPart == "::") {
+ var htmlContent = $("html", content)[0];
+ thCache[filePart][fragmentPart] = htmlContent;
+ }
+ else {
+ var fragSpec = thFragEscp + fragmentPart + "']";
+ var fragArray = $(fragSpec, content);
+ $(fragArray).each(function() {
+ thCache[filePart][fragmentPart] = this;
+ });
+ }
+ importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
+ }
+ else if (debug) {
+ window.alert("file read failed: " + filePart + " fragment: " + fragmentPart);
+ }
+ }, "xml");
+ if (importNode == null && debug) {
+ window.alert("fragment import failed: " + filePart + " fragment: " + fragmentPart);
+ }
+ }
+ element.removeAttribute(attr.name);
+ return importNode;
+ }
+
+ function getFilePart(part) {
+ var result = substitute(part);
+ if( result.charAt(0) != '.' ) { // Initial period character indicates a relative path
+ if( result.indexOf('/') >= 0 ) { // If it doesn't start with a '.', and there are no path separators, it's also treated as relative
+ result = thProtocol + root + path + result;
+ }
+ }
+ return result;
+ }
+
+ function doReplace(isNode, element, content) {
+ if (isNode) {
+ element.parentNode.replaceChild(content.cloneNode(true), element);
+ }
+ else {
+ try {
+ element.innerHTML = content.innerHTML;
+ }
+ catch (err) { // Work-around for IE
+ while (element.firstChild != null) {
+ element.removeChild(element.firstChild);
+ }
+ for (i = 0; i < content.childNodes.length; i++) {
+ element.appendChild(content.childNodes[i].cloneNode(true));
+ }
+ }
+ }
+ }
+
+ function ThNode(thDoc, visited, parentDoc, firstChild, nextSibling, fileName, fragName, isNode, element) {
+ this.thDoc = thDoc;
+ this.visited = visited;
+ this.parentDoc = parentDoc;
+ this.firstChild = firstChild;
+ this.nextSibling = nextSibling;
+ this.fileName = fileName;
+ this.fragName = fragName;
+ this.isNode = isNode;
+ this.element = element;
+ }
+
+ function ThObj(suffix) {
+ this.name = thPrefix + ":" + suffix;
+ this.escp = "[" + thPrefix + "\\:" + suffix + "]";
+ }
+
+ function Param(valueArg) {
+ this.value = valueArg;
+ this.getBooleanValue = function() {
+ return !(this.value == "false" || this.value == "off" || this.value == "no");
+ };
+ this.getStringValue = function() {
+ return this.value;
+ };
+ this.getNumericValue = function() {
+ return Number(this.value);
+ };
+ }
+
+ function isTrue(arg) {
+ var p = urlParams[arg];
+ if (p) {
+ return p.getBooleanValue();
+ }
+ return false;
+ }
+
+ function substitute(argValue) {
+ var result = argValue;
+ var args = argValue.match(/[$\*#]{(!?.*)}/);
+ if (args != null && args.length > 0) {
+ var param = args[1];
+ if(param) {
+ var paramValue = urlParams[param];
+ if (paramValue) {
+ result = paramValue.value;
+ }
+ }
+ }
+ return result;
+ }
+
+ function getThParam(paramName,isBoolean,isPath) {
+ var localValue;
+ if( isBoolean ) {
+ localValue = false;
+ }
+ else {
+ localValue = "";
+ }
+ var theParam = urlParams[paramName];
+ if (isBoolean && theParam) {
+ localValue = theParam.getBooleanValue();
+ }
+ else {
+ var paramValue;
+ try {
+ paramValue = eval(paramName);
+ if( !(typeof paramValue === "undefined") ) {
+ if( paramValue != null ) {
+ if ( isBoolean ) {
+ localValue = (paramValue==true);
+ }
+ else {
+ localValue = paramValue;
+ }
+ }
+ }
+ }
+ catch (err) {
+ if (err instanceof ReferenceError) {
+ }
+ if (err instanceof EvalError) {
+ }
+ }
+ }
+ if( !isBoolean && isPath && localValue.length > 0 && localValue.charAt(localValue.length-1) != '/' ) {
+ localValue = localValue + '/';
+ }
+ return localValue;
+ }
+
+};
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/URI.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,93 @@
+/*! URI.js v1.13.2 http://medialize.github.io/URI.js/ */
+/* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URITemplate.js, jquery.URI.js, URI.fragmentQuery.js */
+(function(f,g){"object"===typeof exports?module.exports=g():"function"===typeof define&&define.amd?define(g):f.IPv6=g(f)})(this,function(f){var g=f&&f.IPv6;return{best:function(f){f=f.toLowerCase().split(":");var k=f.length,b=8;""===f[0]&&""===f[1]&&""===f[2]?(f.shift(),f.shift()):""===f[0]&&""===f[1]?f.shift():""===f[k-1]&&""===f[k-2]&&f.pop();k=f.length;-1!==f[k-1].indexOf(".")&&(b=7);var g;for(g=0;g<k&&""!==f[g];g++);if(g<b)for(f.splice(g,1,"0000");f.length<b;)f.splice(g,0,"0000");for(g=0;g<b;g++){for(var k=
+f[g].split(""),r=0;3>r;r++)if("0"===k[0]&&1<k.length)k.splice(0,1);else break;f[g]=k.join("")}var k=-1,q=r=0,h=-1,w=!1;for(g=0;g<b;g++)w?"0"===f[g]?q+=1:(w=!1,q>r&&(k=h,r=q)):"0"===f[g]&&(w=!0,h=g,q=1);q>r&&(k=h,r=q);1<r&&f.splice(k,r,"");k=f.length;b="";""===f[0]&&(b=":");for(g=0;g<k;g++){b+=f[g];if(g===k-1)break;b+=":"}""===f[k-1]&&(b+=":");return b},noConflict:function(){f.IPv6===this&&(f.IPv6=g);return this}}});
+(function(f){function g(a){throw RangeError(z[a]);}function s(a,c){for(var d=a.length;d--;)a[d]=c(a[d]);return a}function k(a,c){return s(a.split(p),c).join(".")}function b(a){for(var c=[],d=0,b=a.length,p,e;d<b;)p=a.charCodeAt(d++),55296<=p&&56319>=p&&d<b?(e=a.charCodeAt(d++),56320==(e&64512)?c.push(((p&1023)<<10)+(e&1023)+65536):(c.push(p),d--)):c.push(p);return c}function u(a){return s(a,function(a){var c="";65535<a&&(a-=65536,c+=D(a>>>10&1023|55296),a=56320|a&1023);return c+=D(a)}).join("")}function r(a,
+c){return a+22+75*(26>a)-((0!=c)<<5)}function q(a,c,d){var b=0;a=d?B(a/H):a>>1;for(a+=B(a/c);a>v*y>>1;b+=l)a=B(a/v);return B(b+(v+1)*a/(a+E))}function h(c){var d=[],b=c.length,p,e=0,f=F,z=C,h,m,v,n,k;h=c.lastIndexOf(a);0>h&&(h=0);for(m=0;m<h;++m)128<=c.charCodeAt(m)&&g("not-basic"),d.push(c.charCodeAt(m));for(h=0<h?h+1:0;h<b;){m=e;p=1;for(v=l;;v+=l){h>=b&&g("invalid-input");n=c.charCodeAt(h++);n=10>n-48?n-22:26>n-65?n-65:26>n-97?n-97:l;(n>=l||n>B((t-e)/p))&&g("overflow");e+=n*p;k=v<=z?x:v>=z+y?y:
+v-z;if(n<k)break;n=l-k;p>B(t/n)&&g("overflow");p*=n}p=d.length+1;z=q(e-m,p,0==m);B(e/p)>t-f&&g("overflow");f+=B(e/p);e%=p;d.splice(e++,0,f)}return u(d)}function w(c){var d,p,e,f,z,h,m,n,v,k=[],w,s,A;c=b(c);w=c.length;d=F;p=0;z=C;for(h=0;h<w;++h)v=c[h],128>v&&k.push(D(v));for((e=f=k.length)&&k.push(a);e<w;){m=t;for(h=0;h<w;++h)v=c[h],v>=d&&v<m&&(m=v);s=e+1;m-d>B((t-p)/s)&&g("overflow");p+=(m-d)*s;d=m;for(h=0;h<w;++h)if(v=c[h],v<d&&++p>t&&g("overflow"),v==d){n=p;for(m=l;;m+=l){v=m<=z?x:m>=z+y?y:m-z;
+if(n<v)break;A=n-v;n=l-v;k.push(D(r(v+A%n,0)));n=B(A/n)}k.push(D(r(n,0)));z=q(p,s,e==f);p=0;++e}++p;++d}return k.join("")}var A="object"==typeof exports&&exports,m="object"==typeof module&&module&&module.exports==A&&module,n="object"==typeof global&&global;if(n.global===n||n.window===n)f=n;var e,t=2147483647,l=36,x=1,y=26,E=38,H=700,C=72,F=128,a="-",c=/^xn--/,d=/[^ -~]/,p=/\x2E|\u3002|\uFF0E|\uFF61/g,z={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)",
+"invalid-input":"Invalid input"},v=l-x,B=Math.floor,D=String.fromCharCode,G;e={version:"1.2.3",ucs2:{decode:b,encode:u},decode:h,encode:w,toASCII:function(a){return k(a,function(a){return d.test(a)?"xn--"+w(a):a})},toUnicode:function(a){return k(a,function(a){return c.test(a)?h(a.slice(4).toLowerCase()):a})}};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define(function(){return e});else if(A&&!A.nodeType)if(m)m.exports=e;else for(G in e)e.hasOwnProperty(G)&&(A[G]=e[G]);else f.punycode=
+e})(this);
+(function(f,g){"object"===typeof exports?module.exports=g():"function"===typeof define&&define.amd?define(g):f.SecondLevelDomains=g(f)})(this,function(f){var g=f&&f.SecondLevelDomains,s={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",
+bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",
+cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ","do":" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",
+et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ","in":" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",
+ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",
+kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",
+mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",
+pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",
+sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",
+na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",
+rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",
+tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",
+us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch "},has:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return!1;
+var g=f.lastIndexOf(".",b-1);if(0>=g||g>=b-1)return!1;var r=s.list[f.slice(b+1)];return r?0<=r.indexOf(" "+f.slice(g+1,b)+" "):!1},is:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1||0<=f.lastIndexOf(".",b-1))return!1;var g=s.list[f.slice(b+1)];return g?0<=g.indexOf(" "+f.slice(0,b)+" "):!1},get:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return null;var g=f.lastIndexOf(".",b-1);if(0>=g||g>=b-1)return null;var r=s.list[f.slice(b+1)];return!r||0>r.indexOf(" "+f.slice(g+
+1,b)+" ")?null:f.slice(g+1)},noConflict:function(){f.SecondLevelDomains===this&&(f.SecondLevelDomains=g);return this}};return s});
+(function(f,g){"object"===typeof exports?module.exports=g(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],g):f.URI=g(f.punycode,f.IPv6,f.SecondLevelDomains,f)})(this,function(f,g,s,k){function b(a,c){if(!(this instanceof b))return new b(a,c);void 0===a&&(a="undefined"!==typeof location?location.href+"":"");this.href(a);return void 0!==c?this.absoluteTo(c):this}function u(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,
+"\\$1")}function r(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function q(a){return"Array"===r(a)}function h(a,c){var d,b;if(q(c)){d=0;for(b=c.length;d<b;d++)if(!h(a,c[d]))return!1;return!0}var e=r(c);d=0;for(b=a.length;d<b;d++)if("RegExp"===e){if("string"===typeof a[d]&&a[d].match(c))return!0}else if(a[d]===c)return!0;return!1}function w(a,c){if(!q(a)||!q(c)||a.length!==c.length)return!1;a.sort();c.sort();for(var d=0,b=a.length;d<b;d++)if(a[d]!==c[d])return!1;
+return!0}function A(a){return escape(a)}function m(a){return encodeURIComponent(a).replace(/[!'()*]/g,A).replace(/\*/g,"%2A")}var n=k&&k.URI;b.version="1.13.2";var e=b.prototype,t=Object.prototype.hasOwnProperty;b._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:b.duplicateQueryParameters,escapeQuerySpace:b.escapeQuerySpace}};b.duplicateQueryParameters=!1;b.escapeQuerySpace=!0;b.protocol_expression=
+/^[a-z][a-z0-9.+-]*$/i;b.idn_expression=/[^a-z0-9\.-]/i;b.punycode_expression=/(xn--)/i;b.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;b.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
+b.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;b.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/};b.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};b.invalid_hostname_characters=
+/[^a-zA-Z0-9\.-]/;b.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"};b.getDomAttribute=function(a){if(a&&a.nodeName){var c=a.nodeName.toLowerCase();return"input"===c&&"image"!==a.type?void 0:b.domAttributes[c]}};b.encode=m;b.decode=decodeURIComponent;b.iso8859=function(){b.encode=escape;b.decode=unescape};b.unicode=function(){b.encode=m;b.decode=decodeURIComponent};b.characters=
+{pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}};b.encodeQuery=
+function(a,c){var d=b.encode(a+"");void 0===c&&(c=b.escapeQuerySpace);return c?d.replace(/%20/g,"+"):d};b.decodeQuery=function(a,c){a+="";void 0===c&&(c=b.escapeQuerySpace);try{return b.decode(c?a.replace(/\+/g,"%20"):a)}catch(d){return a}};b.recodePath=function(a){a=(a+"").split("/");for(var c=0,d=a.length;c<d;c++)a[c]=b.encodePathSegment(b.decode(a[c]));return a.join("/")};b.decodePath=function(a){a=(a+"").split("/");for(var c=0,d=a.length;c<d;c++)a[c]=b.decodePathSegment(a[c]);return a.join("/")};
+var l={encode:"encode",decode:"decode"},x,y=function(a,c){return function(d){return b[c](d+"").replace(b.characters[a][c].expression,function(d){return b.characters[a][c].map[d]})}};for(x in l)b[x+"PathSegment"]=y("pathname",l[x]);b.encodeReserved=y("reserved","encode");b.parse=function(a,c){var d;c||(c={});d=a.indexOf("#");-1<d&&(c.fragment=a.substring(d+1)||null,a=a.substring(0,d));d=a.indexOf("?");-1<d&&(c.query=a.substring(d+1)||null,a=a.substring(0,d));"//"===a.substring(0,2)?(c.protocol=null,
+a=a.substring(2),a=b.parseAuthority(a,c)):(d=a.indexOf(":"),-1<d&&(c.protocol=a.substring(0,d)||null,c.protocol&&!c.protocol.match(b.protocol_expression)?c.protocol=void 0:"file"===c.protocol?a=a.substring(d+3):"//"===a.substring(d+1,d+3)?(a=a.substring(d+3),a=b.parseAuthority(a,c)):(a=a.substring(d+1),c.urn=!0)));c.path=a;return c};b.parseHost=function(a,c){var d=a.indexOf("/"),b;-1===d&&(d=a.length);"["===a.charAt(0)?(b=a.indexOf("]"),c.hostname=a.substring(1,b)||null,c.port=a.substring(b+2,d)||
+null,"/"===c.port&&(c.port=null)):a.indexOf(":")!==a.lastIndexOf(":")?(c.hostname=a.substring(0,d)||null,c.port=null):(b=a.substring(0,d).split(":"),c.hostname=b[0]||null,c.port=b[1]||null);c.hostname&&"/"!==a.substring(d).charAt(0)&&(d++,a="/"+a);return a.substring(d)||"/"};b.parseAuthority=function(a,c){a=b.parseUserinfo(a,c);return b.parseHost(a,c)};b.parseUserinfo=function(a,c){var d=a.indexOf("/"),p=-1<d?a.lastIndexOf("@",d):a.indexOf("@");-1<p&&(-1===d||p<d)?(d=a.substring(0,p).split(":"),c.username=
+d[0]?b.decode(d[0]):null,d.shift(),c.password=d[0]?b.decode(d.join(":")):null,a=a.substring(p+1)):(c.username=null,c.password=null);return a};b.parseQuery=function(a,c){if(!a)return{};a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,"");if(!a)return{};for(var d={},p=a.split("&"),e=p.length,f,h,m=0;m<e;m++)f=p[m].split("="),h=b.decodeQuery(f.shift(),c),f=f.length?b.decodeQuery(f.join("="),c):null,d[h]?("string"===typeof d[h]&&(d[h]=[d[h]]),d[h].push(f)):d[h]=f;return d};b.build=function(a){var c="";a.protocol&&
+(c+=a.protocol+":");a.urn||!c&&!a.hostname||(c+="//");c+=b.buildAuthority(a)||"";"string"===typeof a.path&&("/"!==a.path.charAt(0)&&"string"===typeof a.hostname&&(c+="/"),c+=a.path);"string"===typeof a.query&&a.query&&(c+="?"+a.query);"string"===typeof a.fragment&&a.fragment&&(c+="#"+a.fragment);return c};b.buildHost=function(a){var c="";if(a.hostname)c=b.ip6_expression.test(a.hostname)?c+("["+a.hostname+"]"):c+a.hostname;else return"";a.port&&(c+=":"+a.port);return c};b.buildAuthority=function(a){return b.buildUserinfo(a)+
+b.buildHost(a)};b.buildUserinfo=function(a){var c="";a.username&&(c+=b.encode(a.username),a.password&&(c+=":"+b.encode(a.password)),c+="@");return c};b.buildQuery=function(a,c,d){var p="",f,e,h,m;for(e in a)if(t.call(a,e)&&e)if(q(a[e]))for(f={},h=0,m=a[e].length;h<m;h++)void 0!==a[e][h]&&void 0===f[a[e][h]+""]&&(p+="&"+b.buildQueryParameter(e,a[e][h],d),!0!==c&&(f[a[e][h]+""]=!0));else void 0!==a[e]&&(p+="&"+b.buildQueryParameter(e,a[e],d));return p.substring(1)};b.buildQueryParameter=function(a,
+c,d){return b.encodeQuery(a,d)+(null!==c?"="+b.encodeQuery(c,d):"")};b.addQuery=function(a,c,d){if("object"===typeof c)for(var p in c)t.call(c,p)&&b.addQuery(a,p,c[p]);else if("string"===typeof c)void 0===a[c]?a[c]=d:("string"===typeof a[c]&&(a[c]=[a[c]]),q(d)||(d=[d]),a[c]=a[c].concat(d));else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");};b.removeQuery=function(a,c,d){var p;if(q(c))for(d=0,p=c.length;d<p;d++)a[c[d]]=void 0;else if("object"===typeof c)for(p in c)t.call(c,
+p)&&b.removeQuery(a,p,c[p]);else if("string"===typeof c)if(void 0!==d)if(a[c]===d)a[c]=void 0;else{if(q(a[c])){p=a[c];var e={},f,h;if(q(d))for(f=0,h=d.length;f<h;f++)e[d[f]]=!0;else e[d]=!0;f=0;for(h=p.length;f<h;f++)void 0!==e[p[f]]&&(p.splice(f,1),h--,f--);a[c]=p}}else a[c]=void 0;else throw new TypeError("URI.addQuery() accepts an object, string as the first parameter");};b.hasQuery=function(a,c,d,e){if("object"===typeof c){for(var f in c)if(t.call(c,f)&&!b.hasQuery(a,f,c[f]))return!1;return!0}if("string"!==
+typeof c)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");switch(r(d)){case "Undefined":return c in a;case "Boolean":return a=Boolean(q(a[c])?a[c].length:a[c]),d===a;case "Function":return!!d(a[c],c,a);case "Array":return q(a[c])?(e?h:w)(a[c],d):!1;case "RegExp":return q(a[c])?e?h(a[c],d):!1:Boolean(a[c]&&a[c].match(d));case "Number":d=String(d);case "String":return q(a[c])?e?h(a[c],d):!1:a[c]===d;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter");
+}};b.commonPath=function(a,c){var d=Math.min(a.length,c.length),b;for(b=0;b<d;b++)if(a.charAt(b)!==c.charAt(b)){b--;break}if(1>b)return a.charAt(0)===c.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(b)||"/"!==c.charAt(b))b=a.substring(0,b).lastIndexOf("/");return a.substring(0,b+1)};b.withinString=function(a,c,d){d||(d={});var e=d.start||b.findUri.start,f=d.end||b.findUri.end,h=d.trim||b.findUri.trim,m=/[a-z0-9-]=["']?$/i;for(e.lastIndex=0;;){var g=e.exec(a);if(!g)break;g=g.index;if(d.ignoreHtml){var n=
+a.slice(Math.max(g-3,0),g);if(n&&m.test(n))continue}var n=g+a.slice(g).search(f),l=a.slice(g,n).replace(h,"");d.ignore&&d.ignore.test(l)||(n=g+l.length,l=c(l,g,n,a),a=a.slice(0,g)+l+a.slice(n),e.lastIndex=g+l.length)}e.lastIndex=0;return a};b.ensureValidHostname=function(a){if(a.match(b.invalid_hostname_characters)){if(!f)throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-] and Punycode.js is not available');if(f.toASCII(a).match(b.invalid_hostname_characters))throw new TypeError('Hostname "'+
+a+'" contains characters other than [A-Z0-9.-]');}};b.noConflict=function(a){if(a)return a={URI:this.noConflict()},k.URITemplate&&"function"===typeof k.URITemplate.noConflict&&(a.URITemplate=k.URITemplate.noConflict()),k.IPv6&&"function"===typeof k.IPv6.noConflict&&(a.IPv6=k.IPv6.noConflict()),k.SecondLevelDomains&&"function"===typeof k.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=k.SecondLevelDomains.noConflict()),a;k.URI===this&&(k.URI=n);return this};e.build=function(a){if(!0===a)this._deferred_build=
+!0;else if(void 0===a||this._deferred_build)this._string=b.build(this._parts),this._deferred_build=!1;return this};e.clone=function(){return new b(this)};e.valueOf=e.toString=function(){return this.build(!1)._string};l={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"};y=function(a){return function(c,d){if(void 0===c)return this._parts[a]||"";this._parts[a]=c||null;this.build(!d);return this}};for(x in l)e[x]=y(l[x]);l={query:"?",fragment:"#"};y=function(a,
+c){return function(d,b){if(void 0===d)return this._parts[a]||"";null!==d&&(d+="",d.charAt(0)===c&&(d=d.substring(1)));this._parts[a]=d;this.build(!b);return this}};for(x in l)e[x]=y(x,l[x]);l={search:["?","query"],hash:["#","fragment"]};y=function(a,c){return function(d,b){var e=this[a](d,b);return"string"===typeof e&&e.length?c+e:e}};for(x in l)e[x]=y(l[x][1],l[x][0]);e.pathname=function(a,c){if(void 0===a||!0===a){var d=this._parts.path||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}this._parts.path=
+a?b.recodePath(a):"/";this.build(!c);return this};e.path=e.pathname;e.href=function(a,c){var d;if(void 0===a)return this.toString();this._string="";this._parts=b._parts();var e=a instanceof b,f="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(f=b.getDomAttribute(a),a=a[f]||"",f=!1);!e&&f&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a)this._parts=b.parse(a,this._parts);else if(e||f)for(d in e=e?a._parts:a,e)t.call(this._parts,d)&&(this._parts[d]=e[d]);else throw new TypeError("invalid input");
+this.build(!c);return this};e.is=function(a){var c=!1,d=!1,e=!1,f=!1,h=!1,m=!1,g=!1,n=!this._parts.urn;this._parts.hostname&&(n=!1,d=b.ip4_expression.test(this._parts.hostname),e=b.ip6_expression.test(this._parts.hostname),c=d||e,h=(f=!c)&&s&&s.has(this._parts.hostname),m=f&&b.idn_expression.test(this._parts.hostname),g=f&&b.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return n;case "absolute":return!n;case "domain":case "name":return f;case "sld":return h;
+case "ip":return c;case "ip4":case "ipv4":case "inet4":return d;case "ip6":case "ipv6":case "inet6":return e;case "idn":return m;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return g}return null};var E=e.protocol,H=e.port,C=e.hostname;e.protocol=function(a,c){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(b.protocol_expression)))throw new TypeError('Protocol "'+a+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return E.call(this,
+a,c)};e.scheme=e.protocol;e.port=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError('Port "'+a+'" contains characters other than [0-9]');return H.call(this,a,c)};e.hostname=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var d={};b.parseHost(a,d);a=d.hostname}return C.call(this,a,c)};e.host=function(a,c){if(this._parts.urn)return void 0===a?"":this;
+if(void 0===a)return this._parts.hostname?b.buildHost(this._parts):"";b.parseHost(a,this._parts);this.build(!c);return this};e.authority=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?b.buildAuthority(this._parts):"";b.parseAuthority(a,this._parts);this.build(!c);return this};e.userinfo=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var d=b.buildUserinfo(this._parts);return d.substring(0,
+d.length-1)}"@"!==a[a.length-1]&&(a+="@");b.parseUserinfo(a,this._parts);this.build(!c);return this};e.resource=function(a,c){var d;if(void 0===a)return this.path()+this.search()+this.hash();d=b.parse(a);this._parts.path=d.path;this._parts.query=d.query;this._parts.fragment=d.fragment;this.build(!c);return this};e.subdomain=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.length-this.domain().length-
+1;return this._parts.hostname.substring(0,d)||""}d=this._parts.hostname.length-this.domain().length;d=this._parts.hostname.substring(0,d);d=new RegExp("^"+u(d));a&&"."!==a.charAt(a.length-1)&&(a+=".");a&&b.ensureValidHostname(a);this._parts.hostname=this._parts.hostname.replace(d,a);this.build(!c);return this};e.domain=function(a,c){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.match(/\./g);
+if(d&&2>d.length)return this._parts.hostname;d=this._parts.hostname.length-this.tld(c).length-1;d=this._parts.hostname.lastIndexOf(".",d-1)+1;return this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");b.ensureValidHostname(a);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(d=new RegExp(u(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a));this.build(!c);return this};e.tld=function(a,c){if(this._parts.urn)return void 0===a?
+"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf("."),d=this._parts.hostname.substring(d+1);return!0!==c&&s&&s.list[d.toLowerCase()]?s.get(this._parts.hostname)||d:d}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(s&&s.is(a))d=new RegExp(u(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a);else throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||
+this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");d=new RegExp(u(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(d,a)}else throw new TypeError("cannot set TLD empty");this.build(!c);return this};e.directory=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var d=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,
+d)||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}d=this._parts.path.length-this.filename().length;d=this._parts.path.substring(0,d);d=new RegExp("^"+u(d));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=b.recodePath(a);this._parts.path=this._parts.path.replace(d,a);this.build(!c);return this};e.filename=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";
+var d=this._parts.path.lastIndexOf("/"),d=this._parts.path.substring(d+1);return a?b.decodePathSegment(d):d}d=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&(d=!0);var e=new RegExp(u(this.filename())+"$");a=b.recodePath(a);this._parts.path=this._parts.path.replace(e,a);d?this.normalizePath(c):this.build(!c);return this};e.suffix=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this.filename(),
+e=d.lastIndexOf(".");if(-1===e)return"";d=d.substring(e+1);d=/^[a-z0-9%]+$/i.test(d)?d:"";return a?b.decodePathSegment(d):d}"."===a.charAt(0)&&(a=a.substring(1));if(d=this.suffix())e=a?new RegExp(u(d)+"$"):new RegExp(u("."+d)+"$");else{if(!a)return this;this._parts.path+="."+b.recodePath(a)}e&&(a=b.recodePath(a),this._parts.path=this._parts.path.replace(e,a));this.build(!c);return this};e.segment=function(a,c,d){var b=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),e=e.split(b);void 0!==
+a&&"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');f&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===c)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(q(c)){e=[];a=0;for(var h=c.length;a<h;a++)if(c[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(c[a])}else{if(c||"string"===typeof c)""===e[e.length-1]?e[e.length-1]=c:e.push(c)}else c||"string"===typeof c&&c.length?
+e[a]=c:e.splice(a,1);f&&e.unshift("");return this.path(e.join(b),d)};e.segmentCoded=function(a,c,d){var e,f;"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0===c){a=this.segment(a,c,d);if(q(a))for(e=0,f=a.length;e<f;e++)a[e]=b.decode(a[e]);else a=void 0!==a?b.decode(a):void 0;return a}if(q(c))for(e=0,f=c.length;e<f;e++)c[e]=b.decode(c[e]);else c="string"===typeof c?b.encode(c):c;return this.segment(a,c,d)};var F=e.query;e.query=function(a,c){if(!0===a)return b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
+if("function"===typeof a){var d=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace),e=a.call(this,d);this._parts.query=b.buildQuery(e||d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);this.build(!c);return this}return void 0!==a&&"string"!==typeof a?(this._parts.query=b.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!c),this):F.call(this,a,c)};e.setQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
+if("object"===typeof a)for(var f in a)t.call(a,f)&&(e[f]=a[f]);else if("string"===typeof a)e[a]=void 0!==c?c:null;else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.addQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.addQuery(e,a,void 0===c?null:c);this._parts.query=
+b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.removeQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.removeQuery(e,a,c);this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.hasQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
+return b.hasQuery(e,a,c,d)};e.setSearch=e.setQuery;e.addSearch=e.addQuery;e.removeSearch=e.removeQuery;e.hasSearch=e.hasQuery;e.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};e.normalizeProtocol=function(a){"string"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),
+this.build(!a));return this};e.normalizeHostname=function(a){this._parts.hostname&&(this.is("IDN")&&f?this._parts.hostname=f.toASCII(this._parts.hostname):this.is("IPv6")&&g&&(this._parts.hostname=g.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!a));return this};e.normalizePort=function(a){"string"===typeof this._parts.protocol&&this._parts.port===b.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};e.normalizePath=
+function(a){if(this._parts.urn||!this._parts.path||"/"===this._parts.path)return this;var c,d=this._parts.path,e="",f,h;"/"!==d.charAt(0)&&(c=!0,d="/"+d);d=d.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");c&&(e=d.substring(1).match(/^(\.\.\/)+/)||"")&&(e=e[0]);for(;;){f=d.indexOf("/..");if(-1===f)break;else if(0===f){d=d.substring(3);continue}h=d.substring(0,f).lastIndexOf("/");-1===h&&(h=f);d=d.substring(0,h)+d.substring(f+3)}c&&this.is("relative")&&(d=e+d.substring(1));d=b.recodePath(d);
+this._parts.path=d;this.build(!a);return this};e.normalizePathname=e.normalizePath;e.normalizeQuery=function(a){"string"===typeof this._parts.query&&(this._parts.query.length?this.query(b.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a));return this};e.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};e.normalizeSearch=e.normalizeQuery;e.normalizeHash=e.normalizeFragment;e.iso8859=function(){var a=
+b.encode,c=b.decode;b.encode=escape;b.decode=decodeURIComponent;this.normalize();b.encode=a;b.decode=c;return this};e.unicode=function(){var a=b.encode,c=b.decode;b.encode=m;b.decode=unescape;this.normalize();b.encode=a;b.decode=c;return this};e.readable=function(){var a=this.clone();a.username("").password("").normalize();var c="";a._parts.protocol&&(c+=a._parts.protocol+"://");a._parts.hostname&&(a.is("punycode")&&f?(c+=f.toUnicode(a._parts.hostname),a._parts.port&&(c+=":"+a._parts.port)):c+=a.host());
+a._parts.hostname&&a._parts.path&&"/"!==a._parts.path.charAt(0)&&(c+="/");c+=a.path(!0);if(a._parts.query){for(var d="",e=0,h=a._parts.query.split("&"),m=h.length;e<m;e++){var g=(h[e]||"").split("="),d=d+("&"+b.decodeQuery(g[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"));void 0!==g[1]&&(d+="="+b.decodeQuery(g[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}c+="?"+d.substring(1)}return c+=b.decodeQuery(a.hash(),!0)};e.absoluteTo=function(a){var c=this.clone(),d=["protocol","username",
+"password","hostname","port"],e,f;if(this._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a instanceof b||(a=new b(a));c._parts.protocol||(c._parts.protocol=a._parts.protocol);if(this._parts.hostname)return c;for(e=0;f=d[e];e++)c._parts[f]=a._parts[f];c._parts.path?".."===c._parts.path.substring(-2)&&(c._parts.path+="/"):(c._parts.path=a._parts.path,c._parts.query||(c._parts.query=a._parts.query));"/"!==c.path().charAt(0)&&(a=a.directory(),c._parts.path=(a?
+a+"/":"")+c._parts.path,c.normalizePath());c.build();return c};e.relativeTo=function(a){var c=this.clone().normalize(),d,e,f,h;if(c._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a=(new b(a)).normalize();d=c._parts;e=a._parts;f=c.path();h=a.path();if("/"!==f.charAt(0))throw Error("URI is already relative");if("/"!==h.charAt(0))throw Error("Cannot calculate a URI relative to another relative URI");d.protocol===e.protocol&&(d.protocol=null);if(d.username===
+e.username&&d.password===e.password&&null===d.protocol&&null===d.username&&null===d.password&&d.hostname===e.hostname&&d.port===e.port)d.hostname=null,d.port=null;else return c.build();if(f===h)return d.path="",c.build();a=b.commonPath(c.path(),a.path());if(!a)return c.build();e=e.path.substring(a.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");d.path=e+d.path.substring(a.length);return c.build()};e.equals=function(a){var c=this.clone();a=new b(a);var d={},e={},f={},h;c.normalize();a.normalize();
+if(c.toString()===a.toString())return!0;d=c.query();e=a.query();c.query("");a.query("");if(c.toString()!==a.toString()||d.length!==e.length)return!1;d=b.parseQuery(d,this._parts.escapeQuerySpace);e=b.parseQuery(e,this._parts.escapeQuerySpace);for(h in d)if(t.call(d,h)){if(!q(d[h])){if(d[h]!==e[h])return!1}else if(!w(d[h],e[h]))return!1;f[h]=!0}for(h in e)if(t.call(e,h)&&!f[h])return!1;return!0};e.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};e.escapeQuerySpace=
+function(a){this._parts.escapeQuerySpace=!!a;return this};return b});
+(function(f,g){"object"===typeof exports?module.exports=g(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],g):f.URITemplate=g(f.URI,f)})(this,function(f,g){function s(b){if(s._cache[b])return s._cache[b];if(!(this instanceof s))return new s(b);this.expression=b;s._cache[b]=this;return this}function k(b){this.data=b;this.cache={}}var b=g&&g.URITemplate,u=Object.prototype.hasOwnProperty,r=s.prototype,q={"":{prefix:"",separator:",",named:!1,empty_name_separator:!1,encode:"encode"},
+"+":{prefix:"",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},"#":{prefix:"#",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},".":{prefix:".",separator:".",named:!1,empty_name_separator:!1,encode:"encode"},"/":{prefix:"/",separator:"/",named:!1,empty_name_separator:!1,encode:"encode"},";":{prefix:";",separator:";",named:!0,empty_name_separator:!1,encode:"encode"},"?":{prefix:"?",separator:"&",named:!0,empty_name_separator:!0,encode:"encode"},"&":{prefix:"&",
+separator:"&",named:!0,empty_name_separator:!0,encode:"encode"}};s._cache={};s.EXPRESSION_PATTERN=/\{([^a-zA-Z0-9%_]?)([^\}]+)(\}|$)/g;s.VARIABLE_PATTERN=/^([^*:]+)((\*)|:(\d+))?$/;s.VARIABLE_NAME_PATTERN=/[^a-zA-Z0-9%_]/;s.expand=function(b,f){var g=q[b.operator],m=g.named?"Named":"Unnamed",n=b.variables,e=[],t,l,k;for(k=0;l=n[k];k++)t=f.get(l.name),t.val.length?e.push(s["expand"+m](t,g,l.explode,l.explode&&g.separator||",",l.maxlength,l.name)):t.type&&e.push("");return e.length?g.prefix+e.join(g.separator):
+""};s.expandNamed=function(b,g,k,m,n,e){var t="",l=g.encode;g=g.empty_name_separator;var s=!b[l].length,q=2===b.type?"":f[l](e),r,u,C;u=0;for(C=b.val.length;u<C;u++)n?(r=f[l](b.val[u][1].substring(0,n)),2===b.type&&(q=f[l](b.val[u][0].substring(0,n)))):s?(r=f[l](b.val[u][1]),2===b.type?(q=f[l](b.val[u][0]),b[l].push([q,r])):b[l].push([void 0,r])):(r=b[l][u][1],2===b.type&&(q=b[l][u][0])),t&&(t+=m),k?t+=q+(g||r?"=":"")+r:(u||(t+=f[l](e)+(g||r?"=":"")),2===b.type&&(t+=q+","),t+=r);return t};s.expandUnnamed=
+function(b,g,k,m,n){var e="",t=g.encode;g=g.empty_name_separator;var l=!b[t].length,s,q,r,u;r=0;for(u=b.val.length;r<u;r++)n?q=f[t](b.val[r][1].substring(0,n)):l?(q=f[t](b.val[r][1]),b[t].push([2===b.type?f[t](b.val[r][0]):void 0,q])):q=b[t][r][1],e&&(e+=m),2===b.type&&(s=n?f[t](b.val[r][0].substring(0,n)):b[t][r][0],e+=s,e=k?e+(g||q?"=":""):e+","),e+=q;return e};s.noConflict=function(){g.URITemplate===s&&(g.URITemplate=b);return s};r.expand=function(b){var f="";this.parts&&this.parts.length||this.parse();
+b instanceof k||(b=new k(b));for(var g=0,m=this.parts.length;g<m;g++)f+="string"===typeof this.parts[g]?this.parts[g]:s.expand(this.parts[g],b);return f};r.parse=function(){var b=this.expression,f=s.EXPRESSION_PATTERN,g=s.VARIABLE_PATTERN,m=s.VARIABLE_NAME_PATTERN,n=[],e=0,k,l,r;for(f.lastIndex=0;;){l=f.exec(b);if(null===l){n.push(b.substring(e));break}else n.push(b.substring(e,l.index)),e=l.index+l[0].length;if(!q[l[1]])throw Error('Unknown Operator "'+l[1]+'" in "'+l[0]+'"');if(!l[3])throw Error('Unclosed Expression "'+
+l[0]+'"');k=l[2].split(",");for(var u=0,E=k.length;u<E;u++){r=k[u].match(g);if(null===r)throw Error('Invalid Variable "'+k[u]+'" in "'+l[0]+'"');if(r[1].match(m))throw Error('Invalid Variable Name "'+r[1]+'" in "'+l[0]+'"');k[u]={name:r[1],explode:!!r[3],maxlength:r[4]&&parseInt(r[4],10)}}if(!k.length)throw Error('Expression Missing Variable(s) "'+l[0]+'"');n.push({expression:l[0],operator:l[1],variables:k})}n.length||n.push(b);this.parts=n;return this};k.prototype.get=function(b){var f=this.data,
+g={type:0,val:[],encode:[],encodeReserved:[]},m;if(void 0!==this.cache[b])return this.cache[b];this.cache[b]=g;f="[object Function]"===String(Object.prototype.toString.call(f))?f(b):"[object Function]"===String(Object.prototype.toString.call(f[b]))?f[b](b):f[b];if(void 0!==f&&null!==f)if("[object Array]"===String(Object.prototype.toString.call(f))){m=0;for(b=f.length;m<b;m++)void 0!==f[m]&&null!==f[m]&&g.val.push([void 0,String(f[m])]);g.val.length&&(g.type=3)}else if("[object Object]"===String(Object.prototype.toString.call(f))){for(m in f)u.call(f,
+m)&&void 0!==f[m]&&null!==f[m]&&g.val.push([m,String(f[m])]);g.val.length&&(g.type=2)}else g.type=1,g.val.push([void 0,String(f)]);return g};f.expand=function(b,g){var k=(new s(b)).expand(g);return new f(k)};return s});
+(function(f,g){"object"===typeof exports?module.exports=g(require("jquery","./URI")):"function"===typeof define&&define.amd?define(["jquery","./URI"],g):g(f.jQuery,f.URI)})(this,function(f,g){function s(b){return b.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function k(b){var f=b.nodeName.toLowerCase();return"input"===f&&"image"!==b.type?void 0:g.domAttributes[f]}function b(b){return{get:function(g){return f(g).uri()[b]()},set:function(g,e){f(g).uri()[b](e);return e}}}function u(b,g){var e,h,l;if(!k(b)||
+!g)return!1;e=g.match(A);if(!e||!e[5]&&":"!==e[2]&&!q[e[2]])return!1;l=f(b).uri();if(e[5])return l.is(e[5]);if(":"===e[2])return h=e[1].toLowerCase()+":",q[h]?q[h](l,e[4]):!1;h=e[1].toLowerCase();return r[h]?q[e[2]](l[h](),e[4],h):!1}var r={},q={"=":function(b,f){return b===f},"^=":function(b,f){return!!(b+"").match(new RegExp("^"+s(f),"i"))},"$=":function(b,f){return!!(b+"").match(new RegExp(s(f)+"$","i"))},"*=":function(b,f,e){"directory"===e&&(b+="/");return!!(b+"").match(new RegExp(s(f),"i"))},
+"equals:":function(b,f){return b.equals(f)},"is:":function(b,f){return b.is(f)}};f.each("authority directory domain filename fragment hash host hostname href password path pathname port protocol query resource scheme search subdomain suffix tld username".split(" "),function(g,h){r[h]=!0;f.attrHooks["uri:"+h]=b(h)});var h=function(b,g){return f(b).uri().href(g).toString()};f.each(["src","href","action","uri","cite"],function(b,g){f.attrHooks[g]={set:h}});f.attrHooks.uri.get=function(b){return f(b).uri()};
+f.fn.uri=function(b){var f=this.first(),e=f.get(0),h=k(e);if(!h)throw Error('Element "'+e.nodeName+'" does not have either property: href, src, action, cite');if(void 0!==b){var l=f.data("uri");if(l)return l.href(b);b instanceof g||(b=g(b||""))}else{if(b=f.data("uri"))return b;b=g(f.attr(h)||"")}b._dom_element=e;b._dom_attribute=h;b.normalize();f.data("uri",b);return b};g.prototype.build=function(b){if(this._dom_element)this._string=g.build(this._parts),this._deferred_build=!1,this._dom_element.setAttribute(this._dom_attribute,
+this._string),this._dom_element[this._dom_attribute]=this._string;else if(!0===b)this._deferred_build=!0;else if(void 0===b||this._deferred_build)this._string=g.build(this._parts),this._deferred_build=!1;return this};var w,A=/^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;w=f.expr.createPseudo?f.expr.createPseudo(function(b){return function(f){return u(f,b)}}):function(b,f,e){return u(b,e[3])};f.expr[":"].uri=w;return f});
+(function(f,g){"object"===typeof exports?module.exports=g(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],g):g(f.URI)})(this,function(f){var g=f.prototype,s=g.fragment;f.fragmentPrefix="?";var k=f._parts;f._parts=function(){var b=k();b.fragmentPrefix=f.fragmentPrefix;return b};g.fragmentPrefix=function(b){this._parts.fragmentPrefix=b;return this};g.fragment=function(b,g){var k=this._parts.fragmentPrefix,q=this._parts.fragment||"";return!0===b?q.substring(0,k.length)!==k?
+{}:f.parseQuery(q.substring(k.length)):void 0!==b&&"string"!==typeof b?(this._parts.fragment=k+f.buildQuery(b),this.build(!g),this):s.call(this,b,g)};g.addFragment=function(b,g,k){var q=this._parts.fragmentPrefix,h=f.parseQuery((this._parts.fragment||"").substring(q.length));f.addQuery(h,b,g);this._parts.fragment=q+f.buildQuery(h);"string"!==typeof b&&(k=g);this.build(!k);return this};g.removeFragment=function(b,g,k){var q=this._parts.fragmentPrefix,h=f.parseQuery((this._parts.fragment||"").substring(q.length));
+f.removeQuery(h,b,g);this._parts.fragment=q+f.buildQuery(h);"string"!==typeof b&&(k=g);this.build(!k);return this};g.addHash=g.addFragment;g.removeHash=g.removeFragment;return f});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/ace.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+(function(){function o(e){var i=function(e,t){return r("",e,t)},s=t;e&&(t[e]||(t[e]={}),s=t[e]);if(!s.define||!s.define.packaged)n.original=s.define,s.define=n,s.define.packaged=!0;if(!s.require||!s.require.packaged)r.original=s.require,s.require=i,s.require.packaged=!0}var e="ace",t=function(){return this}();if(!e&&typeof requirejs!="undefined")return;var n=function(e,t,r){if(typeof e!="string"){n.original?n.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=t),n.modules||(n.modules={}),n.modules[e]=r},r=function(e,t,n){if(Object.prototype.toString.call(t)==="[object Array]"){var i=[];for(var o=0,u=t.length;o<u;++o){var a=s(e,t[o]);if(!a&&r.original)return r.original.apply(window,arguments);i.push(a)}n&&n.apply(null,i)}else{if(typeof t=="string"){var f=s(e,t);return!f&&r.original?r.original.apply(window,arguments):(n&&n(),f)}if(r.original)return r.original.apply(window,arguments)}},i=function(e,t){if(t.indexOf("!")!==-1){var n=t.split("!");return i(e,n[0])+"!"+i(e,n[1])}if(t.charAt(0)=="."){var r=e.split("/").slice(0,-1).join("/");t=r+"/"+t;while(t.indexOf(".")!==-1&&s!=t){var s=t;t=t.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return t},s=function(e,t){t=i(e,t);var s=n.modules[t];if(!s)return null;if(typeof s=="function"){var o={},u={id:t,uri:"",exports:o,packaged:!0},a=function(e,n){return r(t,e,n)},f=s(a,o,u);return o=f||u.exports,n.modules[t]=o,o}return s};o(e)})(),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/multi_select","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/mode/folding/fold_mode","ace/theme/textmate","ace/config"],function(e,t,n){e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer,f=e("./multi_select").MultiSelect;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./mode/folding/fold_mode"),e("./theme/textmate"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e,e=document.getElementById(n);if(!e)throw"ace.edit can't find div #"+n}if(e.env&&e.env.editor instanceof s)return e.env.editor;var o=t.createEditSession(r.getInnerText(e));e.innerHTML="";var u=new s(new a(e));new f(u),u.setSession(o);var l={document:o,editor:u,onResize:u.resize.bind(u,null)};return i.addListener(window,"resize",l.onResize),u.on("destroy",function(){i.removeListener(window,"resize",l.onResize)}),e.env=u.env=l,u},t.createEditSession=function(e,t){var n=new o(e,n);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u}),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(e,t,n){e("./regexp"),e("./es5-shim")}),ace.define("ace/lib/regexp",["require","exports","module"],function(e,t,n){function o(e){return(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":"")}function u(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}var r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},i=r.exec.call(/()??/,"")[1]===undefined,s=function(){var e=/^/g;return r.test.call(e,""),!e.lastIndex}();if(s&&i)return;RegExp.prototype.exec=function(e){var t=r.exec.apply(this,arguments),n,a;if(typeof e=="string"&&t){!i&&t.length>1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===undefined&&(t[e]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)n=this._xregexp.captureNames[f-1],n&&(t[n]=t[f]);!s&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)=="[object Array]"});var m=Object("a"),g=m[0]!="a"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=" \n\f\r \u2028\u2029";if(!String.prototype.trim||_.trim()){_="["+_+"]";var D=new RegExp("^"+_+_+"*"),P=new RegExp(_+_+"*$");String.prototype.trim=function(){return String(this).replace(D,"").replace(P,"")}}var F=function(e){if(e==null)throw new TypeError("can't convert "+e+" to object");return Object(e)}}),ace.define("ace/lib/dom",["require","exports","module"],function(e,t,n){if(typeof document=="undefined")return;var r="http://www.w3.org/1999/xhtml";t.getDocumentHead=function(e){return e||(e=document),e.head||e.getElementsByTagName("head")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||r,e):document.createElement(e)},t.hasCssClass=function(e,t){var n=e.className.split(/\s+/g);return n.indexOf(t)!==-1},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=" "+n)},t.removeCssClass=function(e,t){var n=e.className.split(/\s+/g);for(;;){var r=n.indexOf(t);if(r==-1)break;n.splice(r,1)}e.className=n.join(" ")},t.toggleCssClass=function(e,t){var n=e.className.split(/\s+/g),r=!0;for(;;){var i=n.indexOf(t);if(i==-1)break;r=!1,n.splice(i,1)}return r&&n.push(t),e.className=n.join(" "),r},t.setCssClass=function(e,n,r){r?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var n=0,r;t=t||document;if(t.createStyleSheet&&(r=t.styleSheets)){while(n<r.length)if(r[n++].owningElement.id===e)return!0}else if(r=t.getElementsByTagName("style"))while(n<r.length)if(r[n++].id===e)return!0;return!1},t.importCssString=function(n,i,s){s=s||document;if(i&&t.hasCssString(i,s))return null;var o;s.createStyleSheet?(o=s.createStyleSheet(),o.cssText=n,i&&(o.owningElement.id=i)):(o=s.createElementNS?s.createElementNS(r,"style"):s.createElement("style"),o.appendChild(s.createTextNode(n)),i&&(o.id=i),t.getDocumentHead(s).appendChild(o))},t.importCssStylsheet=function(e,n){if(n.createStyleSheet)n.createStyleSheet(e);else{var r=t.createElement("link");r.rel="stylesheet",r.href=e,t.getDocumentHead(n).appendChild(r)}},t.getInnerWidth=function(e){return parseInt(t.computedStyle(e,"paddingLeft"),10)+parseInt(t.computedStyle(e,"paddingRight"),10)+e.clientWidth},t.getInnerHeight=function(e){return parseInt(t.computedStyle(e,"paddingTop"),10)+parseInt(t.computedStyle(e,"paddingBottom"),10)+e.clientHeight},window.pageYOffset!==undefined?(t.getPageScrollTop=function(){return window.pageYOffset},t.getPageScrollLeft=function(){return window.pageXOffset}):(t.getPageScrollTop=function(){return document.body.scrollTop},t.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?t.computedStyle=function(e,t){return t?(window.getComputedStyle(e,"")||{})[t]||"":window.getComputedStyle(e,"")||{}}:t.computedStyle=function(e,t){return t?e.currentStyle[t]:e.currentStyle},t.scrollbarWidth=function(e){var n=t.createElement("ace_inner");n.style.width="100%",n.style.minWidth="0px",n.style.height="200px",n.style.display="block";var r=t.createElement("ace_outer"),i=r.style;i.position="absolute",i.left="-10000px",i.overflow="hidden",i.width="200px",i.minWidth="0px",i.height="150px",i.display="block",r.appendChild(n);var s=e.documentElement;s.appendChild(r);var o=n.offsetWidth;i.overflow="scroll";var u=n.offsetWidth;return o==u&&(u=r.clientWidth),s.removeChild(r),o-u},t.setInnerHtml=function(e,t){var n=e.cloneNode(!1);return n.innerHTML=t,e.parentNode.replaceChild(n,e),n},"textContent"in document.documentElement?(t.setInnerText=function(e,t){e.textContent=t},t.getInnerText=function(e){return e.textContent}):(t.setInnerText=function(e,t){e.innerText=t},t.getInnerText=function(e){return e.innerText}),t.getParentWindow=function(e){return e.defaultView||e.parentWindow}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent","ace/lib/dom"],function(e,t,n){function o(e,t,n){var s=0;!i.isOpera||"KeyboardEvent"in window||!i.isMac?s=0|(t.ctrlKey?1:0)|(t.altKey?2:0)|(t.shiftKey?4:0)|(t.metaKey?8:0):s=0|(t.metaKey?1:0)|(t.altKey?2:0)|(t.shiftKey?4:0)|(t.ctrlKey?8:0);if(n in r.MODIFIER_KEYS){switch(r.MODIFIER_KEYS[n]){case"Alt":s=2;break;case"Shift":s=4;break;case"Ctrl":s=1;break;default:s=8}n=0}return s&8&&(n==91||n==93)&&(n=0),!!s||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,s,n):!1}var r=e("./keys"),i=e("./useragent"),s=e("./dom");t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n(window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||e.ctrlKey&&i.isMac?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},document.documentElement.setCapture?t.capture=function(e,n,r){function s(o){n(o),i||(i=!0,r(o)),t.removeListener(e,"mousemove",n),t.removeListener(e,"mouseup",s),t.removeListener(e,"losecapture",s),e.releaseCapture()}var i=!1;t.addListener(e,"mousemove",n),t.addListener(e,"mouseup",s),t.addListener(e,"losecapture",s),e.setCapture()}:t.capture=function(e,t,n){function r(e){t&&t(e),n&&n(e),document.removeEventListener("mousemove",t,!0),document.removeEventListener("mouseup",r,!0),e.stopPropagation()}document.addEventListener("mousemove",t,!0),document.addEventListener("mouseup",r,!0)},t.addMouseWheelListener=function(e,n){var r=8,i=function(e){e.wheelDelta!==undefined?e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/r,e.wheelY=-e.wheelDeltaY/r):(e.wheelX=0,e.wheelY=-e.wheelDelta/r):e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)};t.addListener(e,"DOMMouseScroll",i),t.addListener(e,"mousewheel",i)},t.addMultiMouseDownListener=function(e,n,r,s){var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};t.addListener(e,"mousedown",function(e){if(t.getButton(e)!=0)o=0;else{var i=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||i)o=0;o+=1,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600)}o==1&&(u=e.clientX,a=e.clientY),r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}),i.isOldIE&&t.addListener(e,"dblclick",function(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)})},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var s=null;r(e,"keydown",function(e){s=e.keyCode}),r(e,"keypress",function(e){return o(n,e,s)})}else{var u=null;r(e,"keydown",function(e){return u=e.keyIdentifier||e.keyCode,o(n,e,e.keyCode)})}};if(window.postMessage&&!i.isOldIE){var u=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+u;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame,t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}};for(var t in e.FUNCTION_KEYS){var n=e.FUNCTION_KEYS[t].toLowerCase();e[n]=parseInt(t,10)}return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",e}();r.mixin(t,i),t.keyCodeToString=function(e){return(i[e]||String.fromCharCode(e)).toLowerCase()}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){t.inherits=function(){var e=function(){};return function(t,n){e.prototype=n.prototype,t.super_=n.prototype,t.prototype=new e,t.prototype.constructor=t}}(),t.mixin=function(e,t){for(var n in t)e[n]=t[n]},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/useragent",["require","exports","module"],function(e,t,n){t.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},t.getOS=function(){return t.isMac?t.OS.MAC:t.isLinux?t.OS.LINUX:t.OS.WINDOWS};if(typeof navigator!="object")return;var r=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),i=navigator.userAgent;t.isWin=r=="win",t.isMac=r=="mac",t.isLinux=r=="linux",t.isIE=(navigator.appName=="Microsoft Internet Explorer"||navigator.appName.indexOf("MSAppHost")>=0)&&parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=window.controllers&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0}),ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config"],function(e,t,n){e("./lib/fixoldbrowsers");var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/useragent"),o=e("./keyboard/textinput").TextInput,u=e("./mouse/mouse_handler").MouseHandler,a=e("./mouse/fold_handler").FoldHandler,f=e("./keyboard/keybinding").KeyBinding,l=e("./edit_session").EditSession,c=e("./search").Search,h=e("./range").Range,p=e("./lib/event_emitter").EventEmitter,d=e("./commands/command_manager").CommandManager,v=e("./commands/default_commands").commands,m=e("./config"),g=function(e,t){var n=e.getContainerElement();this.container=n,this.renderer=e,this.commands=new d(s.isMac?"mac":"win",v),this.textInput=new o(e.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.keyBinding=new f(this),this.$mouseHandler=new u(this),new a(this),this.$blockScrolling=0,this.$search=(new c).set({wrap:!0}),this.setSession(t||new l("")),m.resetOptions(this),m._emit("editor",this)};(function(){r.implement(this,p),this.setKeyboardHandler=function(e){if(typeof e=="string"&&e){this.$keybindingId=e;var t=this;m.loadModule(["keybinding",e],function(n){t.$keybindingId==e&&t.keyBinding.setKeyboardHandler(n&&n.handler)})}else delete this.$keybindingId,this.keyBinding.setKeyboardHandler(e)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;if(this.session){var t=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeLeftTop",this.$onScrollLeftChange);var n=this.session.getSelection();n.removeEventListener("changeCursor",this.$onCursorChange),n.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=e,this.$onDocumentChange=this.onDocumentChange.bind(this),e.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull(),this._emit("changeSession",{session:e,oldSession:t})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e){this.renderer.setTheme(e)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.setFontSize=function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.renderer.updateFontSize()},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session.findMatchingBracket(e.getCursorPosition());if(t)var n=new h(t.row,t.column,t.row,t.column+1);else if(e.session.$mode.getMatching)var n=e.session.$mode.getMatching(e.session);n&&(e.session.$bracketHighlight=e.session.addMarker(n,"ace_bracket","text"))},50)},this.focus=function(){var e=this;setTimeout(function(){e.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){if(this.$isFocused)return;this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus")},this.onBlur=function(){if(!this.$isFocused)return;this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur")},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(e){var t=e.data,n=t.range,r;n.start.row==n.end.row&&t.action!="insertLines"&&t.action!="removeLines"?r=n.end.row:r=Infinity,this.renderer.updateLines(n.start.row,r),this._emit("change",e),this.$cursorChange()},this.onTokenizerUpdate=function(e){var t=e.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.$highlightBrackets(),this.$updateHighlightActiveLine(),this._emit("changeSelection")},this.$updateHighlightActiveLine=function(){var e=this.getSession(),t;this.$highlightActiveLine&&(this.$selectionStyle!="line"||!this.selection.isMultiLine())&&(t=this.getCursorPosition());if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new h(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._emit("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._emit("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var e="";return this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e){if(this.$readOnly)return;this._emit("paste",e),this.insert(e)},this.execCommand=function(e,t){this.commands.exec(e,this,t)},this.insert=function(e){var t=this.session,n=t.getMode(),r=this.getCursorPosition();if(this.getBehavioursEnabled()){var i=n.transformAction(t.getState(r.row),"insertion",this,t,e);i&&(e=i.text)}e=e.replace(" ",this.session.getTabString());if(!this.selection.isEmpty())r=this.session.remove(this.getSelectionRange()),this.clearSelection();else if(this.session.getOverwrite()){var s=new h.fromPoints(r,r);s.end.column+=e.length,this.session.remove(s)}this.clearSelection();var o=r.column,u=t.getState(r.row),a=t.getLine(r.row),f=n.checkOutdent(u,a,e),l=t.insert(r,e);i&&i.selection&&(i.selection.length==2?this.selection.setSelectionRange(new h(r.row,o+i.selection[0],r.row,o+i.selection[1])):this.selection.setSelectionRange(new h(r.row+i.selection[0],i.selection[1],r.row+i.selection[2],i.selection[3])));if(t.getDocument().isNewLine(e)){var c=n.getNextLineIndent(u,a.slice(0,r.column),t.getTabString());this.moveCursorTo(r.row+1,0);var p=t.getTabSize(),d=Number.MAX_VALUE;for(var v=r.row+1;v<=l.row;++v){var m=0;a=t.getLine(v);for(var g=0;g<a.length;++g)if(a.charAt(g)==" ")m+=p;else{if(a.charAt(g)!=" ")break;m+=1}/[^\s]/.test(a)&&(d=Math.min(m,d))}for(var v=r.row+1;v<=l.row;++v){var y=d;a=t.getLine(v);for(var g=0;g<a.length&&y>0;++g)a.charAt(g)==" "?y-=p:a.charAt(g)==" "&&(y-=1);t.remove(new h(v,0,v,g))}t.indentRows(r.row+1,l.row,c)}f&&n.autoOutdent(u,t,r.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;t<n.length?(r=n.charAt(t)+n.charAt(t-1),i=new h(e.row,t-1,e.row,t+1)):(r=n.charAt(t-1)+n.charAt(t-2),i=new h(e.row,t-2,e.row,t)),this.session.replace(i,r)},this.toLowerCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toLowerCase()),this.selection.setSelectionRange(e)},this.toUpperCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toUpperCase()),this.selection.setSelectionRange(e)},this.indent=function(){var e=this.session,t=this.getSelectionRange();if(!(t.start.row<t.end.row||t.start.column<t.end.column)){var r;if(this.session.getUseSoftTabs()){var s=e.getTabSize(),o=this.getCursorPosition(),u=e.documentToScreenColumn(o.row,o.column),a=s-u%s;r=i.stringRepeat(" ",a)}else r=" ";return this.insert(r)}var n=this.$getSelectedRows();e.indentRows(n.first,n.last," ")},this.blockIndent=function(){var e=this.$getSelectedRows();this.session.indentRows(e.first,e.last," ")},this.blockOutdent=function(){var e=this.session.getSelection();this.session.outdentRows(e.getRange())},this.sortLines=function(){var e=this.$getSelectedRows(),t=this.session,n=[];for(i=e.first;i<=e.last;i++)n.push(t.getLine(i));n.sort(function(e,t){return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0});var r=new h(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex<t-1){var i=n.exec(r);if(i.index<=t&&i.index+i[0].length>=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new h(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n<o?e*=Math.pow(10,s.end-n-1):e*=Math.pow(10,s.end-n),a+=e,a/=Math.pow(10,u);var f=a.toFixed(u),l=new h(t,s.start,t,s.end);this.session.replace(l,f),this.moveCursorTo(t,Math.max(s.start+1,n+f.length-s.value.length))}}},this.removeLines=function(){var e=this.$getSelectedRows(),t;e.first===0||e.last+1<this.session.getLength()?t=new h(e.first,0,e.last+1,0):t=new h(e.first-1,this.session.getLine(e.first-1).length,e.last,this.session.getLine(e.last).length),this.session.remove(t),this.clearSelection()},this.duplicateSelection=function(){var e=this.selection,t=this.session,n=e.getRange();if(n.isEmpty()){var r=n.start.row;t.duplicateLines(r,r)}else{var i=reverse?n.start:n.end,s=t.insert(i,t.getTextRange(n),!1);n.start=i,n.end=s,e.setSelectionRange(n,reverse)}},this.moveLinesDown=function(){this.$moveLines(function(e,t){return this.session.moveLinesDown(e,t)})},this.moveLinesUp=function(){this.$moveLines(function(e,t){return this.session.moveLinesUp(e,t)})},this.moveText=function(e,t){return this.session.moveText(e,t)},this.copyLinesUp=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t),0})},this.copyLinesDown=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t)})},this.$moveLines=function(e){var t=this.selection;if(!t.inMultiSelectMode||this.inVirtualSelectionMode){var n=t.toOrientedRange(),r=this.$getSelectedRows(n),i=e.call(this,r.first,r.last);n.moveBy(i,0),t.fromOrientedRange(n)}else{var s=t.rangeList.ranges;t.rangeList.detach(this.session);for(var o=s.length;o--;){var u=o,r=s[o].collapseRows(),a=r.end.row,f=r.start.row;while(o--){var r=s[o].collapseRows();if(!(f-r.end.row<=1))break;f=r.end.row}o++;var i=e.call(this,f,a);while(u>=o)s[u].moveBy(i,0),u--}t.fromOrientedRange(t.ranges[0]),t.rangeList.attach(this.session)}},this.$getSelectedRows=function(){var e=this.getSelectionRange().collapseRows();return{first:e.start.row,last:e.end.row}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t==1?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t==0&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e){var t=this.getCursorPosition(),n=this.session.getBracketRange(t);if(!n){n=this.find({needle:/[{}()\[\]]/g,preventScroll:!0,start:{row:t.row,column:t.column-1}});if(!n)return;var r=n.start;r.row==t.row&&Math.abs(r.column-t.column)<2&&(n=this.session.getBracketRange(r))}r=n&&n.cursor||r,r&&(e?n&&n.isEqual(this.getSelectionRange())?this.clearSelection():this.selection.selectTo(r.row,r.column):(this.clearSelection(),this.moveCursorTo(r.row,r.column)))},this.gotoLine=function(e,t,n){this.selection.clearSelection(),this.session.unfold({row:e-1,column:t||0}),this.$blockScrolling+=1,this.moveCursorTo(e-1,t||0),this.$blockScrolling-=1,this.isRowFullyVisible(e-1)||this.scrollToLine(e-1,!0,n)},this.navigateTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.navigateUp=function(e){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),e=e||1,this.selection.moveCursorBy(-e,0)},this.navigateDown=function(e){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),e=e||1,this.selection.moveCursorBy(e,0)},this.navigateLeft=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){var e=this.renderer.scrollTop;this.selection.moveCursorFileEnd(),this.clearSelection(),this.renderer.animateScrolling(e)},this.navigateFileStart=function(){var e=this.renderer.scrollTop;this.selection.moveCursorFileStart(),this.clearSelection(),this.renderer.animateScrolling(e)},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(e,t){t&&this.$search.set(t);var n=this.$search.find(this.session),r=0;return n?(this.$tryReplace(n,e)&&(r=1),n!==null&&(this.selection.setSelectionRange(n),this.renderer.scrollSelectionIntoView(n.start,n.end)),r):r},this.replaceAll=function(e,t){t&&this.$search.set(t);var n=this.$search.findAll(this.session),r=0;if(!n.length)return r;this.$blockScrolling+=1;var i=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0);for(var s=n.length-1;s>=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!=0&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._emit("destroy",this)},this.setAutoScrollEditorIntoView=function(e){if(e===!0)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&n.isFocused()){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.top<o.height&&s.top+t.top+o.lineHeight>window.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e===!1)return;delete this.setAutoScrollEditorIntoView,this.removeEventListener("changeSelection",s),this.renderer.removeEventListener("afterRender",u),this.renderer.removeEventListener("beforeRender",o)}}}).call(g.prototype),m.defineOptions(g.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._emit("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.renderer.$cursorLayer.setBlinking(!e)},initialValue:!1},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",focusTimout:"$mouseHandler",firstLineNumber:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session"}),t.Editor=g}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]=="object"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function(e){if(typeof e!="object")return e;var t=e.constructor();for(var n in e)typeof e[n]=="object"?t[n]=this.deepCopy(e[n]):t[n]=e[n];return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},t.escapeHTML=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)};return i.delay=i,i.schedule=function(e){n==null&&(n=setTimeout(r,e||0))},i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=i.isChrome<18,a=function(e,t){function b(e){if(h)return;if(k)t=0,r=e?0:n.value.length-1;else var t=e?2:1,r=2;try{n.setSelectionRange(t,r)}catch(i){}}function w(){if(h)return;n.value=a,i.isWebKit&&y.schedule()}function F(){setTimeout(function(){p&&(n.style.cssText=p,p=""),t.renderer.$keepTextAreaAtCursor==null&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())},0)}var n=s.createElement("textarea");n.className="ace_text-input",i.isTouchPad&&n.setAttribute("x-palm-disable-auto-cap",!0),n.wrap="off",n.autocorrect="off",n.autocapitalize="off",n.spellcheck=!1,n.style.bottom="2000em",e.insertBefore(n,e.firstChild);var a="",f=!1,l=!1,c=!1,h=!1,p="",d=!0;try{var v=document.activeElement===n}catch(m){}r.addListener(n,"blur",function(){t.onBlur(),v=!1}),r.addListener(n,"focus",function(){v=!0,t.onFocus(),b()}),this.focus=function(){n.focus()},this.blur=function(){n.blur()},this.isFocused=function(){return v};var g=o.delayedCall(function(){v&&b(d)}),y=o.delayedCall(function(){h||(n.value=a,v&&b())});i.isWebKit||t.addEventListener("changeSelection",function(){t.selection.isEmpty()!=d&&(d=!d,g.schedule())}),w(),v&&t.onFocus();var E=function(e){return e.selectionStart===0&&e.selectionEnd===e.value.length};!n.setSelectionRange&&n.createTextRange&&(n.setSelectionRange=function(e,t){var n=this.createTextRange();n.collapse(!0),n.moveStart("character",e),n.moveEnd("character",t),n.select()},E=function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!t||t.parentElement()!=e?!1:t.text==e.value});if(i.isOldIE){var S=!1,x=function(e){if(S)return;var t=n.value;if(h||!t||t==a)return;if(e&&t==a[0])return T.schedule();L(t),S=!0,w(),S=!1},T=o.delayedCall(x);r.addListener(n,"propertychange",x);var N={13:1,27:1};r.addListener(n,"keyup",function(e){h&&(!n.value||N[e.keyCode])&&setTimeout(B,0);if((n.value.charCodeAt(0)||0)<129)return;h?P():D()})}var C=function(e){f?f=!1:l?l=!1:E(n)?(t.selectAll(),b()):k&&b(t.selection.isEmpty())},k=null;this.setInputHandler=function(e){k=e},this.getInputHandler=function(){return k};var L=function(e){k&&(e=k(e),k=null),c?(b(),e&&t.onPaste(e),c=!1):e==a[0]?Date.now()-H>100&&t.execCommand("del",{source:"ace"}):(e.substring(0,2)==a?e=e.substr(2):e[0]==a[0]?e=e.substr(1):e[e.length-1]==a[0]&&(e=e.slice(0,-1)),e[e.length-1]==a[0]&&(e=e.slice(0,-1)),e&&t.onTextInput(e))},A=function(e){if(h)return;var t=n.value;L(t),w()},O=function(e){var i=t.getCopyText();if(!i){r.preventDefault(e);return}var s=e.clipboardData||window.clipboardData;if(s&&!u){var o=s.setData("Text",i);o&&(t.onCut(),r.preventDefault(e))}o||(f=!0,n.value=i,n.select(),setTimeout(function(){f=!1,w(),b(),t.onCut()}))},M=function(e){var i=t.getCopyText();if(!i){r.preventDefault(e);return}var s=e.clipboardData||window.clipboardData;if(s&&!u){var o=s.setData("Text",i);o&&(t.onCopy(),r.preventDefault(e))}o||(l=!0,n.value=i,n.select(),setTimeout(function(){l=!1,w(),b(),t.onCopy()}))},_=function(e){var s=e.clipboardData||window.clipboardData;if(s){var o=s.getData("Text");o&&t.onPaste(o),i.isIE&&setTimeout(b),r.preventDefault(e)}else n.value="",c=!0};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",C),r.addListener(n,"input",A),r.addListener(n,"cut",O),r.addListener(n,"copy",M),r.addListener(n,"paste",_),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:M(e);break;case 86:_(e);break;case 88:O(e)}});var D=function(e){h=!0,t.onCompositionStart(),setTimeout(P,0)},P=function(){if(!h)return;t.onCompositionUpdate(n.value)},H=-1,B=function(e){h=!1,t.onCompositionEnd(),H=Date.now()},j=o.delayedCall(P,50);r.addListener(n,"compositionstart",D),r.addListener(n,i.isGecko?"text":"keyup",function(){j.schedule()}),r.addListener(n,"compositionend",B),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){p||(p=n.style.cssText),n.style.cssText="z-index:100000;"+(i.isIE?"opacity:0.1;":""),b(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t});var o=t.container.getBoundingClientRect(),u=s.computedStyle(t.container),a=o.top+(parseInt(u.borderTopWidth)||0),f=o.left+(parseInt(o.borderLeftWidth)||0),l=o.bottom-a-n.clientHeight,c=function(e){n.style.left=e.clientX-f-2+"px",n.style.top=Math.min(e.clientY-a-2,l)+"px"};c(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),i.isWin&&r.capture(t.container,c,F)},this.onContextMenuClose=F,i.isGecko||r.addListener(n,"contextmenu",function(e){t.textInput.onContextMenu(e),F()})};t.TextInput=a}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop","ace/config"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop").DragdropHandler,f=e("../config"),l=function(e){this.editor=e,new s(this),new o(this),new a(this),r.addListener(e.container,"mousedown",function(t){return e.focus(),r.preventDefault(t)});var t=e.renderer.getMouseEventTarget();r.addListener(t,"click",this.onMouseEvent.bind(this,"click")),r.addListener(t,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener(t,[300,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel"));var n=e.renderer.$gutter;r.addListener(n,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(n,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(n,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(n,"mousemove",this.onMouseEvent.bind(this,"guttermousemove"))};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){t&&this.setState(t),this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){s.x=e.clientX,s.y=e.clientY},u=function(e){clearInterval(f),a(),s[s.state+"End"]&&s[s.state+"End"](e),s.$clickSelection=null,n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1},a=function(){s[s.state]&&s[s.state]()};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){u(e.domEvent)});r.capture(this.editor.container,o,u);var f=setInterval(a,20)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:1},dragDelay:{initialValue:150},focusTimout:{initialValue:0}}),t.MouseHandler=l}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/useragent"],function(e,t,n){function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","drag","dragEnd","dragWait","dragWaitEnd","startDrag","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/useragent"),s=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();o&&(r.moveCursorToPosition(n),r.selection.clearSelection()),r.textInput.onContextMenu(e.domEvent);return}if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode)return this.setState("focusWait"),this.captureMouse(e),e.preventDefault()}return!t||this.$clickSelection||e.getShiftKey()||r.inMultiSelectMode?this.startSelect(n):t&&(this.mousedownEvent.time=(new Date).getTime(),this.setState("dragWait")),this.captureMouse(e),e.preventDefault()},this.startSelect=function(e){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y),this.mousedownEvent.getShiftKey()?this.editor.selection.selectToPosition(e):this.$clickSelection||(this.editor.moveCursorToPosition(e),this.editor.selection.clearSelection()),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.startDrag=function(){var e=this.editor;this.setState("drag"),this.dragRange=e.getSelectionRange();var t=e.getSelectionStyle();this.dragSelectionMarker=e.session.addMarker(this.dragRange,"ace_selection",t),e.clearSelection(),r.addCssClass(e.container,"ace_dragging"),this.$dragKeybinding||(this.$dragKeybinding={handleKeyboard:function(e,t,n,r){if(n=="esc")return{command:this.command}},command:{exec:function(e){var t=e.$mouseHandler;t.dragCursor=null,t.dragEnd(),t.startSelect()}}}),e.keyBinding.addKeyboardHandler(this.$dragKeybinding)},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=(new Date).getTime();(e>s||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.dragWait=function(e){var t=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),n=(new Date).getTime(),r=this.editor;t>s?this.startSelect(this.mousedownEvent.getDocumentPosition()):n-this.mousedownEvent.time>r.$mouseHandler.$dragDelay&&this.startDrag()},this.dragWaitEnd=function(e){this.mousedownEvent.domEvent=e,this.startSelect()},this.drag=function(){var e=this.editor;this.dragCursor=e.renderer.screenToTextCoordinates(this.x,this.y),e.moveCursorToPosition(this.dragCursor),e.renderer.scrollCursorIntoView()},this.dragEnd=function(e){var t=this.editor,n=this.dragCursor,i=this.dragRange;r.removeCssClass(t.container,"ace_dragging"),t.session.removeMarker(this.dragSelectionMarker),t.keyBinding.removeKeyboardHandler(this.$dragKeybinding);if(!n)return;t.clearSelection();if(e&&(e.ctrlKey||e.altKey)){var s=t.session,o=i;o.end=s.insert(n,s.getTextRange(i)),o.start=n}else{if(i.contains(n.row,n.column))return;var o=t.moveText(i,n)}if(!o)return;t.selection.setSelectionRange(o)},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);if(i){i.isEmpty()&&(i.start.column--,i.end.column++),this.$clickSelection=i,this.setState("select");return}this.$clickSelection=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines"),this.$clickSelection=n.selection.getLineRange(t.row)},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("null")},this.onMouseWheel=function(e){if(e.getShiftKey()||e.getAccelKey())return;var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(o.prototype),t.DefaultHandlers=o}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/event"],function(e,t,n){function s(e){function f(){u=r.createElement("div"),u.className="ace_gutter-tooltip",u.style.display="none",t.container.appendChild(u)}function l(){u||f();var e=o.getDocumentPosition().row,r=n.$annotations[e];if(!r)return c();var i=t.session.getLength();if(e==i){var s=t.renderer.pixelToScreenCoordinates(0,o.y).row,l=o.$pos;if(s>t.session.documentToScreenRow(l.row,l.column))return c()}if(a==r)return;a=r.text.join("<br/>"),u.style.display="block",u.innerHTML=a,t.on("mousewheel",c),h(o)}function c(){s&&(s=clearTimeout(s)),a&&(u.style.display="none",a=null,t.removeEventListener("mousewheel",c))}function h(e){var n=t.renderer.$gutter.getBoundingClientRect();u.style.left=e.x+15+"px",e.y+3*t.renderer.lineHeight+15<n.bottom?(u.style.bottom="",u.style.top=e.y+15+"px"):(u.style.top="",u.style.bottom=n.bottom-e.y+5+"px")}var t=e.editor,n=t.renderer.$gutterLayer;e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused())return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.captureMouse(r,"selectByLines"),r.preventDefault()});var s,o,u,a;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();a&&h(t),o=t;if(s)return;s=setTimeout(function(){s=null,o&&!e.isMousePressed?l():c()},50)}),i.addListener(t.renderer.$gutter,"mouseout",function(e){o=null;if(!a||s)return;s=setTimeout(function(){s=null,c()},50)})}var r=e("../lib/dom"),i=e("../lib/event");t.GutterHandler=s}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor;if(e.getReadOnly())this.$inSelection=!1;else{var t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop",["require","exports","module","ace/lib/event"],function(e,t,n){var r=e("../lib/event"),i=function(e){function h(){u=t.selection.toOrientedRange(),n=t.session.addMarker(u,"ace_selection",t.getSelectionStyle()),t.clearSelection(),clearInterval(o),o=setInterval(c,20),f=0,r.addListener(document,"mousemove",v)}function p(){clearInterval(o),t.session.removeMarker(n),n=null,t.selection.fromOrientedRange(u),f=0,r.removeListener(document,"mousemove",v)}function v(){d==null&&(d=setTimeout(function(){d!=null&&n&&p()},20))}var t=e.editor,n,i,s,o,u,a,f=0,l=t.container;r.addListener(l,"dragenter",function(e){if(t.getReadOnly())return;var i=e.dataTransfer.types;if(i&&Array.prototype.indexOf.call(i,"text/plain")===-1)return;return n||h(),f++,r.preventDefault(e)}),r.addListener(l,"dragover",function(e){if(t.getReadOnly())return;var n=e.dataTransfer.types;if(n&&Array.prototype.indexOf.call(n,"text/plain")===-1)return;return d!==null&&(d=null),i=e.clientX,s=e.clientY,r.preventDefault(e)});var c=function(){a=t.renderer.screenToTextCoordinates(i,s),t.moveCursorToPosition(a),t.renderer.scrollCursorIntoView()};r.addListener(l,"dragleave",function(e){f--;if(f<=0&&n)return p(),r.preventDefault(e)}),r.addListener(l,"drop",function(e){if(!n)return;return u.end=t.session.insert(a,e.dataTransfer.getData("Text")),u.start=a,p(),t.focus(),r.preventDefault(e)});var d=null};t.DragdropHandler=i}),ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/event_emitter"],function(e,t,n){"no use strict";function f(e){return e.replace(/-(.)/g,function(e,t){return t.toUpperCase()})}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./lib/net"),o=e("./lib/event_emitter").EventEmitter,u=function(){return this}(),a={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{}};t.get=function(e){if(!a.hasOwnProperty(e))throw new Error("Unknown config key: "+e);return a[e]},t.set=function(e,t){if(!a.hasOwnProperty(e))throw new Error("Unknown config key: "+e);a[e]=t},t.all=function(){return r.copyObject(a)},i.implement(t,o),t.moduleUrl=function(e,t){if(a.$moduleUrls[e])return a.$moduleUrls[e];var n=e.split("/");t=t||n[n.length-2]||"";var r=n[n.length-1].replace(t,"").replace(/(^[\-_])|([\-_]$)/,"");!r&&n.length>1&&(r=n[n.length-2]);var i=a[t+"Path"];return i==null&&(i=a.basePath),i&&i.slice(-1)!="/"&&(i+="/"),i+t+"-"+r+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i)return r&&r(i);var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e}),r&&r(e)})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=function(){a.packaged=e.packaged||n.packaged||u.define&&define.packaged;if(!u.document)return"";var r={},i="",s=document.getElementsByTagName("script");for(var o=0;o<s.length;o++){var l=s[o],c=l.src||l.getAttribute("src");if(!c)continue;var h=l.attributes;for(var p=0,d=h.length;p<d;p++){var v=h[p];v.name.indexOf("data-ace-")===0&&(r[f(v.name.replace(/^data-ace-/,""))]=v.value)}var m=c.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/);m&&(i=m[1])}i&&(r.base=r.base||i,r.packaged=!0),r.basePath=r.base,r.workerPath=r.workerPath||r.base,r.modePath=r.modePath||r.base,r.themePath=r.themePath||r.base,delete r.base;for(var g in r)typeof r[g]!="undefined"&&t.set(g,r[g])};var l={setOptions:function(e){Object.keys(e).forEach(function(t){this.setOption(t,e[t])},this)},getOptions:function(e){var t={};return Object.keys(e).forEach(function(e){t[e]=this.getOption(e)},this),t},setOption:function(e,t){if(this["$"+e]===t)return;var n=this.$options[e];if(!n)return undefined;if(n.forwardTo)return this[n.forwardTo]&&this[n.forwardTo].setOption(e,t);n.handlesSet||(this["$"+e]=t),n&&n.set&&n.set.call(this,t)},getOption:function(e){var t=this.$options[e];return t?t.forwardTo?this[t.forwardTo]&&this[t.forwardTo].getOption(e):t&&t.get?t.get.call(this):this["$"+e]:undefined}},c={};t.defineOptions=function(e,t,n){return e.$options||(c[t]=e.$options={}),Object.keys(n).forEach(function(t){var r=n[t];typeof r=="string"&&(r={forwardTo:r}),r.name||(r.name=t),e.$options[r.name]=r,"initialValue"in r&&(e["$"+r.name]=r.initialValue)}),i.implement(e,l),this},t.resetOptions=function(e){Object.keys(e.$options).forEach(function(t){var n=e.$options[t];"value"in n&&e.setOption(t,n.value)})},t.setDefaultValue=function(e,n,r){var i=c[e]||(c[e]={});i[n]&&(i.forwardTo?t.setDefaultValue(i.forwardTo,n,r):i[n].value=r)},t.setDefaultValues=function(e,n){Object.keys(n).forEach(function(r){t.setDefaultValue(e,r,n[r])})}}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),t.target||(t.target=this);for(var o=0;o<n.length;o++){n[o](t);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;for(var r=0;r<n.length;r++)n[r](t)},r.once=function(e,t){var n=this,r=function(){fun&&fun.apply(null,arguments),n.removeEventListener(event,r)};this.addEventListener(event,r)},r.setDefaultHandler=function(e,t){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[e])throw new Error("The default handler for '"+e+"' is already set");this._defaultHandlers[e]=t},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?"unshift":"push"](t),t},r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("guttermousedown",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){var r=o.start.row,u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0),this.$data={editor:this.$editor}},this.setKeyboardHandler=function(e){if(this.$handlers[this.$handlers.length-1]==e)return;while(this.$handlers[1])this.removeKeyboardHandler(this.$handlers[1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=s.passEvent!=1:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&i.stopEvent(r);if(o)break}return o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){var t=this.$callKeyboardHandlers(-1,e);t||this.$editor.commands.exec("insertstring",this.$editor,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./config"),o=e("./lib/event_emitter").EventEmitter,u=e("./selection").Selection,a=e("./mode/text").Mode,f=e("./range").Range,l=e("./document").Document,c=e("./background_tokenizer").BackgroundTokenizer,h=e("./search_highlight").SearchHighlight,p=function(e,t){this.$breakpoints=[],this.$decorations=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$undoSelect=!0,this.$foldData=[],this.$foldData.toString=function(){return this.join("\n")},this.on("changeFold",this.onChangeFold.bind(this)),this.$onChange=this.onChange.bind(this);if(typeof e!="object"||!e.getLine)e=new l(e);this.setDocument(e),this.selection=new u(this),this.setMode(t),s.resetOptions(this),s._emit("session",this)};(function(){function g(e){return e<4352?!1:e>=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t<s))return i;r=i-1}}return n-1},this.resetCaches=function(){this.$modified=!0,this.$wrapData=[],this.$rowLengthCache=[],this.$resetRowCache(0),this.bgTokenizer&&this.bgTokenizer.start(0)},this.onChangeFold=function(e){var t=e.data;this.$resetRowCache(t.start.row)},this.onChange=function(e){var t=e.data;this.$modified=!0,this.$resetRowCache(t.range.start.row);var n=this.$updateInternalDataOnChange(e);!this.$fromUndo&&this.$undoManager&&!t.ignore&&(this.$deltasDoc.push(t),n&&n.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:n}),this.$informUndoManager.schedule()),this.bgTokenizer.$updateOnChange(t),this._emit("change",e)},this.setValue=function(e){this.doc.setValue(e),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(e){return this.bgTokenizer.getState(e)},this.getTokens=function(e){return this.bgTokenizer.getTokens(e)},this.getTokenAt=function(e,t){var n=this.bgTokenizer.getTokens(e),r,i=0;if(t==null)s=n.length-1,i=this.getLine(e).length;else for(var s=0;s<n.length;s++){i+=n[s].value.length;if(i>=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t]}),t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(e){if(this.$overwrite==e)return;this.$overwrite=e,this._emit("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._emit("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._emit("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t<e.length;t++)this.$breakpoints[e[t]]="ace_breakpoint";this._emit("changeBreakpoint",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._emit("changeBreakpoint",{})},this.setBreakpoint=function(e,t){t===undefined&&(t="ace_breakpoint"),t?this.$breakpoints[e]=t:delete this.$breakpoints[e],this._emit("changeBreakpoint",{})},this.clearBreakpoint=function(e){delete this.$breakpoints[e],this._emit("changeBreakpoint",{})},this.addMarker=function(e,t,n,r){var i=this.$markerId++,s={range:e,type:n||"line",renderer:typeof n=="function"?n:null,clazz:t,inFront:!!r,id:i};return r?(this.$frontMarkers[i]=s,this._emit("changeFrontMarker")):(this.$backMarkers[i]=s,this._emit("changeBackMarker")),i},this.addDynamicMarker=function(e,t){if(!e.update)return;var n=this.$markerId++;return e.id=n,e.inFront=!!t,t?(this.$frontMarkers[n]=e,this._emit("changeFrontMarker")):(this.$backMarkers[n]=e,this._emit("changeBackMarker")),e},this.removeMarker=function(e){var t=this.$frontMarkers[e]||this.$backMarkers[e];if(!t)return;var n=t.inFront?this.$frontMarkers:this.$backMarkers;t&&(delete n[e],this._emit(t.inFront?"changeFrontMarker":"changeBackMarker"))},this.getMarkers=function(e){return e?this.$frontMarkers:this.$backMarkers},this.highlight=function(e){if(!this.$searchHighlight){var t=new h(null,"ace_selected-word","text");this.$searchHighlight=this.addDynamicMarker(t)}this.$searchHighlight.setRegexp(e)},this.highlightLines=function(e,t,n,r){typeof t!="number"&&(n=t,t=e),n||(n="ace_step");var i=new f(e,0,t,Infinity);return i.id=this.addMarker(i,n,"fullLine",r),i},this.setAnnotations=function(e){this.$annotations=e,this._emit("changeAnnotation",{})},this.getAnnotations=function(){return this.$annotations||[]},this.clearAnnotations=function(){this.setAnnotations([])},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r?\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getWordRange=function(e,t){var n=this.getLine(e),r=!1;t>0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(o<n.length&&n.charAt(o).match(i))o++;return new f(e,s,e,o)},this.getAWordRange=function(e,t){var n=this.getWordRange(e,t),r=this.getLine(n.end.row);while(r.charAt(n.end.column).match(/[ \t]/))n.end.column+=1;return n},this.setNewLineMode=function(e){this.doc.setNewLineMode(e)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.setUseWorker=function(e){this.setOption("useWorker",e)},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(e){var t=e.data;this.bgTokenizer.start(t.first),this._emit("tokenizerUpdate",e)},this.$modes={},this.$mode=null,this.$modeId=null,this.setMode=function(e){if(e&&typeof e=="object"){if(e.getTokenizer)return this.$onChangeMode(e);var t=e,n=t.path}else n=e||"ace/mode/text";this.$modes["ace/mode/text"]||(this.$modes["ace/mode/text"]=new a);if(this.$modes[n]&&!t)return this.$onChangeMode(this.$modes[n]);this.$modeId=n,s.loadModule(["mode",n],function(e){if(this.$modeId!==n)return;if(this.$modes[n]&&!t)return this.$onChangeMode(this.$modes[n]);e&&e.Mode&&(e=new e.Mode(t),t||(this.$modes[n]=e,e.$id=n),this.$onChangeMode(e))}.bind(this)),this.$mode||this.$onChangeMode(this.$modes["ace/mode/text"],!0)},this.$onChangeMode=function(e,t){if(this.$mode===e)return;this.$mode=e,this.$stopWorker(),this.$useWorker&&this.$startWorker();var n=e.getTokenizer();if(n.addEventListener!==undefined){var r=this.onReloadTokenizer.bind(this);n.addEventListener("update",r)}if(!this.bgTokenizer){this.bgTokenizer=new c(n);var i=this;this.bgTokenizer.addEventListener("update",function(e){i._emit("tokenizerUpdate",e)})}else this.bgTokenizer.setTokenizer(n);this.bgTokenizer.setDocument(this.getDocument()),this.tokenRe=e.tokenRe,this.nonTokenRe=e.nonTokenRe,t||(this.$modeId=e.$id,this.$setFolding(e.foldingRules),this._emit("changeMode"),this.bgTokenizer.start(0))},this.$stopWorker=function(){this.$worker&&this.$worker.terminate(),this.$worker=null},this.$startWorker=function(){if(typeof Worker!="undefined"&&!e.noWorker)try{this.$worker=this.$mode.createWorker(this)}catch(t){console.log("Could not load worker"),console.log(t),this.$worker=null}else this.$worker=null},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(e){e=Math.round(Math.max(0,e));if(this.$scrollTop===e||isNaN(e))return;this.$scrollTop=e,this._signal("changeScrollTop",e)},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(e){e=Math.round(Math.max(0,e));if(this.$scrollLeft===e||isNaN(e))return;this.$scrollLeft=e,this._signal("changeScrollLeft",e)},this.getScrollLeft=function(){return this.$scrollLeft},this.getScreenWidth=function(){return this.$computeWidth(),this.screenWidth},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;a<u;a++){if(a>o){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;r<e.length;r++){var i=e[r];i.group=="doc"&&(this.doc.applyDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!1,n))}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.setUndoSelect=function(e){this.$undoSelect=e},this.$getUndoSelection=function(e,t,n){function r(e){var n=e.action==="insertText"||e.action==="insertLines";return t?!n:n}var i=e[0],s,o,u=!1;r(i)?(s=i.range.clone(),u=!0):(s=f.fromPoints(i.range.start,i.range.start),u=!1);for(var a=1;a<e.length;a++)i=e[a],r(i)?(o=i.range.start,s.compare(o.row,o.column)==-1&&s.setStart(i.range.start),o=i.range.end,s.compare(o.row,o.column)==1&&s.setEnd(i.range.end),u=!0):(o=i.range.start,s.compare(o.row,o.column)==-1&&(s=f.fromPoints(i.range.start,i.range.start)),u=!1);if(n!=null){var l=n.compareRange(s);l==1?s.setStart(n.start):l==-1&&s.setEnd(n.end)}return s},this.replace=function(e,t){return this.doc.replace(e,t)},this.moveText=function(e,t,n){var r=this.getTextRange(e),i=this.getFoldsInRange(e),s=f.fromPoints(t,t);if(!n){this.remove(e);var o=e.start.row-e.end.row,u=o?-e.end.column:e.start.column-e.end.column;u&&(s.start.row==e.end.row&&s.start.column>e.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.insert({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o<r;++o)if(s.charAt(o)!=" ")break;o<r&&s.charAt(o)==" "?(n.start.column=o,n.end.column=o+1):(n.start.column=0,n.end.column=o),this.remove(n)}},this.$moveLines=function(e,t,n){e=this.getRowFoldStart(e),t=this.getRowFoldEnd(t);if(n<0){var r=this.getRowFoldStart(e+n);if(r<0)return 0;var i=r-e}else if(n>0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeLines(e,t);return this.doc.insertLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=[];for(var n=0;n<t;n++)this.$wrapData.push([]);this.$updateWrapData(0,t-1)}this._emit("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange.min=e,this.$wrapLimitRange.max=t,this.$modified=!0,this._emit("changeWrapMode")},this.adjustWrapLimit=function(e){var t=this.$constrainWrapLimit(e);return t!=this.$wrapLimit&&t>0?(this.$wrapLimit=t,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._emit("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e){var t=this.$wrapLimitRange.min;t&&(e=Math.max(t,e));var n=this.$wrapLimitRange.max;return n&&(e=Math.min(n,e)),Math.max(1,e)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n,r=e.data.action,i=e.data.range.start.row,s=e.data.range.end.row,o=e.data.range.start,u=e.data.range.end,a=null;r.indexOf("Lines")!=-1?(r=="insertLines"?s=i+e.data.lines.length:s=i,n=e.data.lines?e.data.lines.length:s-i):n=s-i;if(n!=0)if(r.indexOf("remove")!=-1){this[t?"$wrapData":"$rowLengthCache"].splice(i,n);var f=this.$foldData;a=this.getFoldsInRange(e.data.range),this.removeFolds(a);var l=this.getFoldLine(u.row),c=0;if(l){l.addRemoveChars(u.row,u.column,o.column-u.column),l.shiftRow(-n);var h=this.getFoldLine(i);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=u.row&&l.shiftRow(-n)}s=i}else{var p;if(t){p=[i,0];for(var d=0;d<n;d++)p.push([]);this.$wrapData.splice.apply(this.$wrapData,p)}else p=Array(n),p.unshift(i,0),this.$rowLengthCache.splice.apply(this.$rowLengthCache,p);var f=this.$foldData,l=this.getFoldLine(i),c=0;if(l){var v=l.range.compareInside(o.row,o.column);v==0?(l=l.split(o.row,o.column),l.shiftRow(n),l.addRemoveChars(s,0,u.column-o.column)):v==-1&&(l.addRemoveChars(i,0,u.column-o.column),l.shiftRow(n)),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=i&&l.shiftRow(n)}}else{n=Math.abs(e.data.range.start.column-e.data.range.end.column),r.indexOf("remove")!=-1&&(a=this.getFoldsInRange(e.data.range),this.removeFolds(a),n=-n);var l=this.getFoldLine(i);l&&l.addRemoveChars(i,o.column,n)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),t?this.$updateWrapData(i,s):this.$updateRowLengthCache(i,s),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var n=this.doc.getAllLines(),r=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,c=e;t=Math.min(t,n.length-1);while(c<=t){f=this.getFoldLine(c,f);if(!f)a=this.$getDisplayTokens(i.stringTrimRight(n[c])),s[c]=this.$computeWrapSplits(a,o,r),c++;else{a=[],f.walk(function(e,t,r,i){var s;if(e!=null){s=this.$getDisplayTokens(e,a.length),s[0]=u;for(var o=1;o<s.length;o++)s[o]=l}else s=this.$getDisplayTokens(n[t].substring(i,r),a.length);a=a.concat(s)}.bind(this),f.end.row,n[f.end.row].length+1);while(a.length!=0&&a[a.length-1]>=d)a.pop();s[f.start.row]=this.$computeWrapSplits(a,o,r),c=f.end.row+1}}};var t=1,n=2,u=3,l=4,p=9,d=10,v=11,m=12;this.$computeWrapSplits=function(e,t){function o(t){var r=e.slice(i,t),o=r.length;r.join("").replace(/12/g,function(){o-=1}).replace(/2/g,function(){o-=1}),s+=o,n.push(s),i=t}if(e.length==0)return[];var n=[],r=e.length,i=0,s=0;while(r-i>t){var a=i+t;if(e[a]>=d){while(e[a]>=d)a++;o(a);continue}if(e[a]==u||e[a]==l){for(a;a!=i-1;a--)if(e[a]==u)break;if(a>i){o(a);continue}a=i+t;for(a;a<e.length;a++)if(e[a]!=l)break;if(a==e.length)break;o(a);continue}var f=Math.max(a-10,i-1);while(a>f&&e[a]<u)a--;while(a>f&&e[a]==p)a--;if(a>f){o(++a);continue}a=i+t,o(a)}return n},this.$getDisplayTokens=function(e,r){var i=[],s;r=r||0;for(var o=0;o<e.length;o++){var u=e.charCodeAt(o);if(u==9){s=this.getScreenTabSize(i.length+r),i.push(v);for(var a=1;a<s;a++)i.push(m)}else u==32?i.push(d):u>39&&u<48||u>57&&u<64?i.push(p):u>=4352&&g(u)?i.push(t,n):i.push(t)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i<e.length;i++){r=e.charCodeAt(i),r==9?n+=this.getScreenTabSize(n):r>=4352&&g(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.getRowLength=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getScreenLastRowColumn=function(e){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE);return this.documentToScreenColumn(t.row,t.column)},this.getDocumentLastRowColumn=function(e,t){var n=this.documentToScreenRow(e,t);return this.getScreenLastRowColumn(n)},this.getDocumentLastRowColumnPosition=function(e,t){var n=this.documentToScreenRow(e,t);return this.screenToDocumentPosition(n,Number.MAX_VALUE/10)},this.getRowSplitData=function(e){return this.$useWrapMode?this.$wrapData[e]:undefined},this.getScreenTabSize=function(e){return this.$tabSize-e%this.$tabSize},this.screenToDocumentRow=function(e,t){return this.screenToDocumentPosition(e,t).row},this.screenToDocumentColumn=function(e,t){return this.screenToDocumentPosition(e,t).column},this.screenToDocumentPosition=function(e,t){if(e<0)return{row:0,column:0};var n,r=0,i=0,s,o=0,u=0,a=this.$screenRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u-1>=e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}if(this.$useWrapMode){var v=this.$wrapData[r];v&&(s=v[e-o],e>o&&v.length&&(i=v[e-o-1]||v[v.length-1],n=n.substring(i)))}return i+=this.$getStringScreenWidth(n,t)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u<e){if(u>=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);if(this.$useWrapMode){var v=this.$wrapData[i],m=0;while(d.length>=v[m])r++,m++;d=d.substring(v[m-1]||0,d.length)}return{row:r,column:this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;r<n.length;r++)t=n[r],e-=t.end.row-t.start.row}else{var i=this.$wrapData.length,s=0,r=0,t=this.$foldData[r++],o=t?t.start.row:Infinity;while(s<i)e+=this.$wrapData[s].length+1,s++,s>o&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}return e}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:typeof e=="string"&&(e=parseInt(e,10)||!1);if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setUseWrapMode(!0),this.setWrapLimitRange(t,t)}this.$wrap=e},get:function(){return this.getUseWrapMode()?this.getWrapLimitRange().min||"free":"off"},handlesSet:!0},firstLineNumber:{set:function(){this._emit("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._emit("changeTabSize")},initialValue:4,handlesSet:!0}}),t.EditSession=p}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.lead=this.selectionLead=this.doc.createAnchor(0,0),this.anchor=this.selectionAnchor=this.doc.createAnchor(0,0);var t=this;this.lead.on("change",function(e){t._emit("changeCursor"),t.$isEmpty||t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.selectionAnchor.on("change",function(){t.$isEmpty||t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.anchor.setPosition(e,t),this.$isEmpty&&(this.$isEmpty=!1,this._emit("changeSelection"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.shiftSelection=function(e){if(this.$isEmpty){this.moveCursorTo(this.lead.row,this.lead.column+e);return}var t=this.getSelectionAnchor(),n=this.getSelectionLead(),r=this.isBackwards();(!r||t.column!==0)&&this.setSelectionAnchor(t.row,t.column+e),(r||n.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(n.row,n.column+e)})},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column==0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row<this.doc.getLength()-1&&this.moveCursorTo(this.lead.row+1,0);else{var n=this.session.getTabSize(),e=this.lead;this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column,e.column+n).split(" ").length-1==n?this.moveCursorBy(0,n):this.moveCursorBy(0,1)}},this.moveCursorLineStart=function(){var e=this.lead.row,t=this.lead.column,n=this.session.documentToScreenRow(e,t),r=this.session.screenToDocumentPosition(n,0),i=this.session.getDisplayLine(e,null,r.row,r.column),s=i.match(/^\s*/);s[0].length!=t&&!this.session.$useEmacsStyleLineStart&&(r.column+=s[0].length),this.moveCursorToPosition(r)},this.moveCursorLineEnd=function(){var e=this.lead,t=this.session.getDocumentLastRowColumnPosition(e.row,e.column);if(this.lead.column==t.column){var n=this.session.getLine(t.row);if(t.column==n.length){var r=n.search(/\s+$/);r>0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e<this.doc.getLength()-1&&this.moveCursorWordRight();return}if(i=this.session.tokenRe.exec(r))t+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.moveCursorLongWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1)){this.moveCursorTo(n.start.row,n.start.column);return}var r=this.session.getFoldStringAt(e,t,-1);r==null&&(r=this.doc.getLine(e).substring(0,t));var s=i.stringReverse(r),o;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;if(o=this.session.nonTokenRe.exec(s))t-=this.session.nonTokenRe.lastIndex,s=s.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0;if(t<=0){this.moveCursorTo(e,0),this.moveCursorLeft(),e>0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<=1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e<s&&/^\s*$/.test(r));/^\s+/.test(r)||(r=""),t=0}var o=this.$shortWordEndIndex(r);this.moveCursorTo(e,t+o)},this.moveCursorShortWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1))return this.moveCursorTo(n.start.row,n.start.column);var r=this.session.getLine(e).substring(0,t);if(t==0){do e--,r=this.doc.getLine(e);while(e>0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e}}).call(u.prototype),t.Selection=u}),ace.define("ace/range",["require","exports","module"],function(e,t,n){var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,t.Range=i}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang"],function(e,t,n){var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=function(){this.$tokenizer=new r((new i).getRules()),this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|s])+","g"),this.getTokenizer=function(){return this.$tokenizer},this.toggleCommentLines=function(e,t,n,r){var i=t.doc,s,o;if(!this.lineCommentStart)return!1;Array.isArray(this.lineCommentStart)?(s=this.lineCommentStart.map(u.escapeRegExp).join("|"),o=this.lineCommentStart[0]):(s=u.escapeRegExp(this.lineCommentStart),o=this.lineCommentStart),s=new RegExp("^\\s*(?:"+s+") ?");var a=!0,f=Infinity,l=[];for(var c=n;c<=r;c++){var h=i.getLine(c),p=h.search(/\S|$/);l[c]=p,p<f&&(f=p),a&&!s.test(h)&&(a=!1)}if(a)for(var c=n;c<=r;c++){var h=i.getLine(c),d=h.match(s);i.removeInLine(c,l[c],d[0].length)}else{o+=" ";for(var c=n;c<=r;c++)i.insertInLine({row:c,column:f},o)}},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){if(!this.$embeds)return;this.$modes={};for(var t=0;t<this.$embeds.length;t++)e[this.$embeds[t]]&&(this.$modes[this.$embeds[t]]=new e[this.$embeds[t]]);var n=["toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction"];for(var t=0;t<n.length;t++)(function(e){var r=n[t],i=e[r];e[n[t]]=function(){return this.$delegator(r,arguments,i)}})(this)},this.$delegator=function(e,t,n){var r=t[0];for(var i=0;i<this.$embeds.length;i++){if(!this.$modes[this.$embeds[i]])continue;var s=r.split(this.$embeds[i]);if(!s[0]&&s[1]){t[0]=s[1];var o=this.$modes[this.$embeds[i]];return o[e].apply(o,t)}}var u=n.apply(this,t);return n?u:undefined},this.transformAction=function(e,t,n,r,i){if(this.$behaviour){var s=this.$behaviour.getBehaviours();for(var o in s)if(s[o][t]){var u=s[o][t].apply(this,arguments);if(u)return u}}}}).call(a.prototype),t.Mode=a}),ace.define("ace/tokenizer",["require","exports","module"],function(e,t,n){var r=1e3,i=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g";for(var u=0;u<n.length;u++){var a=n[u];a.defaultToken&&(s.defaultToken=a.defaultToken),a.caseInsensitive&&(o="gi");if(a.regex==null)continue;a.regex instanceof RegExp&&(a.regex=a.regex.toString().slice(1,-1));var f=a.regex,l=(new RegExp("(?:("+f+")|(.))")).exec("a").length-2;Array.isArray(a.token)?a.token.length==1?a.token=a.token[0]:(a.tokenArray=a.token,a.onMatch=this.$arrayTokens):typeof a.token=="function"&&!a.onMatch&&(l>1?a.onMatch=this.$applyToken:a.onMatch=a.token),l>1&&(/\\\d/.test(a.regex)?f=a.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(l=1,f=this.removeCapturingGroups(a.regex)),!a.splitRegex&&typeof a.token!="string"&&(a.splitRegex=this.createSplitterRegexp(a.regex,o))),s[i]=u,i+=l,r.push(f),a.onMatch||(a.onMatch=null),a.__proto__=null}this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;i<s;i++)t[i]&&(r[r.length]={type:n[i],value:t[i]});return r},this.$arrayTokens=function(e){if(!e)return[];var t=this.splitRegex.exec(e),n=[],r=this.tokenArray;if(r.length!=t.length-1)return window.console&&console.error(r,t,e,this.splitRegex,this),[{type:"error.invalid",value:e}];for(var i=0,s=r.length;i<s;i++)t[i+1]&&(n[n.length]={type:r[i],value:t[i+1]});return n},this.removeCapturingGroups=function(e){var t=e.replace(/\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g,function(e,t){return t?"(?:":e});return t},this.createSplitterRegexp=function(e,t){if(e.indexOf("(?=")!=-1){var n=0,r=!1,i={};e.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([])/g,function(e,t,s,o,u,a){return r?r=u!="]":u?r=!0:o?(n==i.stack&&(i.end=a+1),n--):s&&(n++,s.length!=1&&(i.stack=n,i.start=a)),e}),i.end!=null&&/^\)*$/.test(e.substr(i.end))&&(e=e.substring(0,i.start)+e.substr(i.end))}return new RegExp(e,(t||"").replace("g",""))},this.getLineTokens=function(e,t){if(t&&typeof t!="string"){var n=t.slice(0);t=n[0]}else var n=[];var i=t||"start",s=this.states[i],o=this.matchMappings[i],u=this.regExps[i];u.lastIndex=0;var a,f=[],l=0,c={type:null,value:""};while(a=u.exec(e)){var h=o.defaultToken,p=null,d=a[0],v=u.lastIndex;if(v-d.length>l){var m=e.substring(l,v-d.length);c.type==h?c.value+=m:(c.type&&f.push(c),c={type:h,value:m})}for(var g=0;g<a.length-2;g++){if(a[g+1]===undefined)continue;p=s[o[g]],p.onMatch?h=p.onMatch(d,i,n):h=p.token,p.next&&(typeof p.next=="string"?i=p.next:i=p.next(i,n),s=this.states[i],s||(window.console&&console.error&&console.error(i,"doesn't exist"),i="start",s=this.states[i]),o=this.matchMappings[i],l=v,u=this.regExps[i],u.lastIndex=v);break}if(d)if(typeof h=="string")!!p&&p.merge===!1||c.type!==h?(c.type&&f.push(c),c={type:h,value:d}):c.value+=d;else{c.type&&f.push(c),c={type:null,value:""};for(var g=0;g<h.length;g++)f.push(h[g])}if(l==e.length)break;l=v;if(f.length>r){c.value+=e.substr(l),i="start";break}}return c.type&&f.push(c),{tokens:f,state:n.length?n:i}}}).call(i.prototype),t.Tokenizer=i}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){for(var n in e){var r=e[n];for(var i=0;i<r.length;i++){var s=r[i];s.next&&(s.next=t+s.next)}this.$rules[t+n]=r}},this.getRules=function(){return this.$rules},this.embedRules=function(e,t,n,i,s){var o=(new e).getRules();if(i)for(var u=0;u<i.length;u++)i[u]=t+i[u];else{i=[];for(var a in o)i.push(t+a)}this.addRules(o,t);if(n){var f=Array.prototype[s?"push":"unshift"];for(var u=0;u<i.length;u++)f.apply(this.$rules[i[u]],r.deepCopy(n))}this.$embeds||(this.$embeds=[]),this.$embeds.push(t)},this.getEmbeds=function(){return this.$embeds};var e=function(e,t){return e!="start"&&t.unshift(this.nextState,e),this.nextState},t=function(e,t){return t[0]!==e?"start":(t.shift(),t.shift())};this.normalizeRules=function(){function i(s){var o=r[s];o.processed=!0;for(var u=0;u<o.length;u++){var a=o[u];!a.regex&&a.start&&(a.regex=a.start,a.next||(a.next=[]),a.next.push({defaultToken:a.token},{token:a.token+".end",regex:a.end||a.start,next:"pop"}),a.token=a.token+".start",a.push=!0);var f=a.next||a.push;if(f&&Array.isArray(f)){var l=a.stateName||a.token+n++;r[l]=f,a.next=l,i(l)}else f=="pop"&&(a.next=t);a.push&&(a.nextState=a.next||a.push,a.next=e,delete a.push);if(a.rules)for(var c in a.rules)r[c]?r[c].push&&r[c].push.apply(r[c],a.rules[c]):r[c]=a.rules[c];if(a.include||typeof a=="string")var h=a.include||a,p=r[h];else Array.isArray(a)&&(p=a);if(p){var d=[u,1].concat(p);a.noEscape&&(d=d.filter(function(e){return!e.next})),o.splice.apply(o,d),u--,p=null}}}var n=0,r=this.$rules;Object.keys(r).forEach(i)},this.createKeywordMapper=function(e,t,n,r){var i=Object.create(null);return Object.keys(e).forEach(function(t){var s=e[t];n&&(s=s.toLowerCase());var o=s.split(r||"|");for(var u=o.length;u--;)i[o[u]]=t}),e=null,n?function(e){return i[e.toLowerCase()]||t}:function(e){return i[e]||t}},this.getKeywords=function(){return this.$keywords}}).call(i.prototype),t.TextHighlightRules=i}),ace.define("ace/mode/behaviour",["require","exports","module"],function(e,t,n){var r=function(){this.$behaviours={}};(function(){this.add=function(e,t,n){switch(undefined){case this.$behaviours:this.$behaviours={};case this.$behaviours[e]:this.$behaviours[e]={}}this.$behaviours[e][t]=n},this.addBehaviours=function(e){for(var t in e)for(var n in e[t])this.add(t,n,e[t][n])},this.remove=function(e){this.$behaviours&&this.$behaviours[e]&&delete this.$behaviours[e]},this.inherit=function(e,t){if(typeof e=="function")var n=(new e).getBehaviours(t);else var n=e.getBehaviours(t);this.addBehaviours(n)},this.getBehaviours=function(e){if(!e)return this.$behaviours;var t={};for(var n=0;n<e.length;n++)this.$behaviours[e[n]]&&(t[e[n]]=this.$behaviours[e[n]]);return t}}).call(r.prototype),t.Behaviour=r}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./range").Range,o=e("./anchor").Anchor,u=function(e){this.$lines=[],e.length==0?this.$lines=[""]:Array.isArray(e)?this.insertLines(0,e):this.insert({row:0,column:0},e)};(function(){r.implement(this,i),this.setValue=function(e){var t=this.getLength();this.remove(new s(0,0,t,this.getLine(t-1).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},"aaa".split(/a/).length==0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){if(e.start.row==e.end.row)return this.$lines[e.start.row].substring(e.start.column,e.end.column);var t=this.getLines(e.start.row+1,e.end.row-1);return t.unshift((this.$lines[e.start.row]||"").substring(e.start.column)),t.push((this.$lines[e.end.row]||"").substring(0,e.end.column)),t.join(this.getNewLineCharacter())},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t&&(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length),e},this.insert=function(e,t){if(!t||t.length===0)return e;e=this.$clipPosition(e),this.getLength()<=1&&this.$detectNewLine(t);var n=this.$split(t),r=n.splice(0,1)[0],i=n.length==0?null:n.splice(n.length-1,1)[0];return e=this.insertInLine(e,r),i!==null&&(e=this.insertNewLine(e),e=this.insertLines(e.row,n),e=this.insertInLine(e,i||"")),e},this.insertLines=function(e,t){if(t.length==0)return{row:e,column:0};if(t.length>65535){var n=this.insertLines(e,t.slice(65535));t=t.slice(0,65535)}var r=[e,0];r.push.apply(r,t),this.$lines.splice.apply(this.$lines,r);var i=new s(e,0,e+t.length,0),o={action:"insertLines",range:i,lines:t};return this._emit("change",{data:o}),n||i.end},this.insertNewLine=function(e){e=this.$clipPosition(e);var t=this.$lines[e.row]||"";this.$lines[e.row]=t.substring(0,e.column),this.$lines.splice(e.row+1,0,t.substring(e.column,t.length));var n={row:e.row+1,column:0},r={action:"insertText",range:s.fromPoints(e,n),text:this.getNewLineCharacter()};return this._emit("change",{data:r}),n},this.insertInLine=function(e,t){if(t.length==0)return e;var n=this.$lines[e.row]||"";this.$lines[e.row]=n.substring(0,e.column)+t+n.substring(e.column);var r={row:e.row,column:e.column+t.length},i={action:"insertText",range:s.fromPoints(e,r),text:t};return this._emit("change",{data:i}),r},this.remove=function(e){e.start=this.$clipPosition(e.start),e.end=this.$clipPosition(e.end);if(e.isEmpty())return e.start;var t=e.start.row,n=e.end.row;if(e.isMultiLine()){var r=e.start.column==0?t:t+1,i=n-1;e.end.column>0&&this.removeInLine(n,0,e.end.column),i>=r&&this.removeLines(r,i),r!=t&&(this.removeInLine(t,e.start.column,this.getLine(t).length),this.removeNewLine(e.start.row))}else this.removeInLine(t,e.start.column,e.end.column);return e.start},this.removeInLine=function(e,t,n){if(t==n)return;var r=new s(e,t,e,n),i=this.getLine(e),o=i.substring(t,n),u=i.substring(0,t)+i.substring(n,i.length);this.$lines.splice(e,1,u);var a={action:"removeText",range:r,text:o};return this._emit("change",{data:a}),r.start},this.removeLines=function(e,t){var n=new s(e,0,t+1,0),r=this.$lines.splice(e,t-e+1),i={action:"removeLines",range:n,nl:this.getNewLineCharacter(),lines:r};return this._emit("change",{data:i}),r},this.removeNewLine=function(e){var t=this.getLine(e),n=this.getLine(e+1),r=new s(e,t.length,e+1,0),i=t+n;this.$lines.splice(e,2,i);var o={action:"removeText",range:r,text:this.getNewLineCharacter()};this._emit("change",{data:o})},this.replace=function(e,t){if(t.length==0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);if(t)var n=this.insert(e.start,t);else n=e.start;return n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.insertLines(r.start.row,n.lines):n.action=="insertText"?this.insert(r.start,n.text):n.action=="removeLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="removeText"&&this.remove(r)}},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="insertText"?this.remove(r):n.action=="removeLines"?this.insertLines(r.start.row,n.lines):n.action=="removeText"&&this.insert(r.start,n.text)}},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length;return i+r*o+e.column}}).call(u.prototype),t.Document=u}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.document=e,typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n),this.$onChange=this.onChange.bind(this),e.on("change",this.$onChange)};(function(){r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(e){var t=e.data,n=t.range;if(n.start.row==n.end.row&&n.start.row!=this.row)return;if(n.start.row>this.row)return;if(n.start.row==this.row&&n.start.column>this.column)return;var r=this.row,i=this.column;t.action==="insertText"?n.start.row===r&&n.start.column<=i?n.start.row===n.end.row?i+=n.end.column-n.start.column:(i-=n.start.column,r+=n.end.row-n.start.row):n.start.row!==n.end.row&&n.start.row<r&&(r+=n.end.row-n.start.row):t.action==="insertLines"?n.start.row<=r&&(r+=n.end.row-n.start.row):t.action=="removeText"?n.start.row==r&&n.start.column<i?n.end.column>=i?i=n.start.column:i=Math.max(0,i-(n.end.column-n.start.column)):n.start.row!==n.end.row&&n.start.row<r?(n.end.row==r&&(i=Math.max(0,i-n.end.column)+n.start.column),r-=n.end.row-n.start.row):n.end.row==r&&(r-=n.end.row-n.start.row,i=Math.max(0,i-n.end.column)+n.start.column):t.action=="removeLines"&&n.start.row<=r&&(n.end.row<=r?r-=n.end.row-n.start.row:(r=n.start.row,i=0)),this.setPosition(r,i,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._emit("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=function(e,t){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.tokenizer=e;var n=this;this.$worker=function(){if(!n.running)return;var e=new Date,t=n.currentLine,r=n.doc,i=0,s=r.getLength();while(n.currentLine<s){n.$tokenizeRow(n.currentLine);while(n.lines[n.currentLine])n.currentLine++;i++;if(i%5==0&&new Date-e>20){n.fireUpdateEvent(t,n.currentLine-1),n.running=setTimeout(n.$worker,20);return}}n.running=!1,n.fireUpdateEvent(t,s-1)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._emit("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.$updateOnChange=function(e){var t=e.range,n=t.start.row,r=t.end.row-n;if(r===0)this.lines[n]=null;else if(e.action=="removeText"||e.action=="removeLines")this.lines.splice(n,r+1,null),this.states.splice(n,r+1,null);else{var i=Array(r+1);i.unshift(n,1),this.lines.splice.apply(this.lines,i),this.states.splice.apply(this.states,i)}this.currentLine=Math.min(n,this.currentLine,this.doc.getLength()),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i,null,this.type)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(e,t,n){function u(){this.getFoldAt=function(e,t,n){var r=this.getFoldLine(e);if(!r)return null;var i=r.folds;for(var s=0;s<i.length;s++){var o=i[s];if(o.range.contains(e,t)){if(n==1&&o.range.isEnd(e,t))continue;if(n==-1&&o.range.isStart(e,t))continue;return o}}},this.getFoldsInRange=function(e){var t=e.start,n=e.end,r=this.$foldData,i=[];t.column+=1,n.column-=1;for(var s=0;s<r.length;s++){var o=r[s].range.compareRange(e);if(o==2)continue;if(o==-2)break;var u=r[s].folds;for(var a=0;a<u.length;a++){var f=u[a];o=f.range.compareRange(e);if(o==-2)break;if(o==2)continue;if(o==42)break;i.push(f)}}return t.column-=1,n.column+=1,i},this.getAllFolds=function(){function n(t){e.push(t)}var e=[],t=this.$foldData;for(var r=0;r<t.length;r++)for(var i=0;i<t[r].folds.length;i++)n(t[r].folds[i]);return e},this.getFoldStringAt=function(e,t,n,r){r=r||this.getFoldLine(e);if(!r)return null;var i={end:{column:0}},s,o;for(var u=0;u<r.folds.length;u++){o=r.folds[u];var a=o.range.compareEnd(e,t);if(a==-1){s=this.getLine(o.start.row).substring(i.end.column,o.start.column);break}if(a===0)return null;i=o}return s||(s=this.getLine(o.start.row).substring(i.end.column)),n==-1?s.substring(0,t-i.end.column):n==1?s.substring(t-i.end.column):s},this.getFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.start.row<=e&&i.end.row>=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.end.row>=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i<n.length;i++){var s=n[i],o=s.end.row,u=s.start.row;if(o>=t){u<t&&(u>=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u==f&&l-a<2)throw"The range has to be at least 2 characters width";var c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);if(c&&!c.range.isStart(u,a)||h&&!h.range.isEnd(f,l))throw"A fold can't intersect already existing fold"+o.range+c.range;var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d<n.length;d++){var v=n[d];if(f==v.start.row){v.addFold(o),r=!0;break}if(u==v.end.row){v.addFold(o),r=!0;if(!o.sameRow){var m=n[d+1];if(m&&m.start.row==f){v.merge(m);break}}break}if(f<=v.start.row)break}return r||(v=this.$addFoldLine(new i(this.$foldData,o))),this.$useWrapMode?this.$updateWrapData(v.start.row,v.start.row):this.$updateRowLengthCache(v.start.row,v.start.row),this.$modified=!0,this._emit("changeFold",{data:o}),o},this.addFolds=function(e){e.forEach(function(e){this.addFold(e)},this)},this.removeFold=function(e){var t=e.foldLine,n=t.start.row,r=t.end.row,i=this.$foldData,s=t.folds;if(s.length==1)i.splice(i.indexOf(t),1);else if(t.range.isEnd(e.end.row,e.end.column))s.pop(),t.end.row=s[s.length-1].end.row,t.end.column=s[s.length-1].end.column;else if(t.range.isStart(e.start.row,e.start.column))s.shift(),t.start.row=s[0].start.row,t.start.column=s[0].start.column;else if(e.sameRow)s.splice(s.indexOf(e),1);else{var o=t.split(e.start.row,e.start.column);s=o.folds,s.shift(),o.start.row=s[0].start.row,o.start.column=s[0].start.column}this.$useWrapMode?this.$updateWrapData(n,r):this.$updateRowLengthCache(n,r),this.$modified=!0,this._emit("changeFold",{data:e})},this.removeFolds=function(e){var t=[];for(var n=0;n<e.length;n++)t.push(e[n]);t.forEach(function(e){this.removeFold(e)},this),this.$modified=!0},this.expandFold=function(e){this.removeFold(e),e.subFolds.forEach(function(t){e.restoreRange(t),this.addFold(t)},this),e.collapseChildren>0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRange(n);if(t)this.removeFolds(i);else while(i.length)this.expandFolds(i),i=this.getFoldsInRange(n)},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row,i=0),t==null&&(t=e.end.row,n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t<r)return;if(t==r){if(n<i)return;u=Math.max(i,u)}e!=null?o+=e:o+=s.getLine(t).substring(u,n)},t,n),o},this.getDisplayLine=function(e,t,n,r){var i=this.getFoldLine(e);if(!i){var s;return s=this.doc.getLine(e),s.substring(r||0,t||s.length)}return this.getFoldDisplayLine(i,e,t,n,r)},this.$cloneFoldData=function(){var e=[];return e=this.$foldData.map(function(t){var n=t.folds.map(function(e){return e.clone()});return new i(e,n)}),e},this.toggleFold=function(e){var t=this.selection,n=t.getRange(),r,i;if(n.isEmpty()){var s=n.start;r=this.getFoldAt(s.row,s.column);if(r){this.expandFold(r);return}(i=this.findMatchingBracket(s))?n.comparePoint(i)==1?n.end=i:(n.start=i,n.start.column++,n.end.column--):(i=this.findMatchingBracket({row:s.row,column:s.column+1}))?(n.comparePoint(i)==1?n.end=i:n.start=i,n.start.column++):n=this.getCommentFoldRange(s.row,s.column)||n}else{var o=this.getFoldsInRange(n);if(e&&o.length){this.expandFolds(o);return}o.length==1&&(r=o[0])}r||(r=this.getFoldAt(n.start.row,n.start.column));if(r&&r.range.toString()==n.toString()){this.expandFold(r);return}var u="...";if(!n.isMultiLine()){u=this.getTextRange(n);if(u.length<4)return;u=u.trim().substring(0,2)+".."}this.addFold(u,n)},this.getCommentFoldRange=function(e,t,n){var i=new o(this,e,t),s=i.getCurrentToken();if(s&&/^comment|string/.test(s.type)){var u=new r,a=new RegExp(s.type.replace(/\..*/,"\\."));if(n!=1){do s=i.stepBackward();while(s&&a.test(s.type));i.stepForward()}u.start.row=i.getCurrentTokenRow(),u.start.column=i.getCurrentTokenColumn()+2,i=new o(this,e,t);if(n!=-1){do s=i.stepForward();while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return u.end.row=i.getCurrentTokenRow(),u.end.column=i.getCurrentTokenColumn()+s.value.length-2,u}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;t=t||this.getLength();for(var i=e||0;i<t;i++){r[i]==null&&(r[i]=this.getFoldWidget(i));if(r[i]!="start")continue;var s=this.getFoldWidgetRange(i);if(s&&s.end.row<=t)try{var o=this.addFold("...",s);o.collapseChildren=n}catch(u){}i=s.end.row}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.removeListener("change",this.$updateFoldWidgets),this._emit("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){var n=this.getFoldWidget(e),r=this.getLine(e);t=t.domEvent;var i=t.shiftKey,s=t.ctrlKey||t.metaKey,o=t.altKey,u=n==="end"?-1:1,a=this.getFoldAt(e,u===-1?0:r.length,u);if(a){i||s?this.removeFold(a):this.expandFold(a);return}var f=this.getFoldWidgetRange(e);if(f&&!f.isMultiLine()){a=this.getFoldAt(f.start.row,f.start.column,1);if(a&&f.isEqual(a.range)){this.removeFold(a);return}}if(o){var l=this.getParentFoldRangeData(e);if(l.range)var c=l.range.start.row+1,h=l.range.end.row;this.foldAll(c,h,s?1e4:0)}else if(i){var h=f?f.end.row:this.getLength();this.foldAll(e+1,f.end.row,s?1e4:0)}else f&&(s&&(f.collapseChildren=1e4),this.addFold("...",f));f||((t.target||t.srcElement).className+=" ace_invalid")},this.updateFoldWidgets=function(e){var t=e.data,n=t.range,r=n.start.row,i=n.end.row-r;if(i===0)this.foldWidgets[r]=null;else if(t.action=="removeText"||t.action=="removeLines")this.foldWidgets.splice(r,i+1,null);else{var s=Array(i+1);s.unshift(r,1),this.foldWidgets.splice.apply(this.foldWidgets,s)}}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.row<this.startRow||e.endRow>this.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw"Trying to add fold to FoldRow that doesn't have a matching row";this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f<i.length;f++){s=i[f],o=s.range.compareStart(t,n);if(o==-1){e(null,t,n,r,a);return}u=e(null,s.start.row,s.start.column,r,a),u=!u&&e(s.placeholder,s.start.row,s.start.column,r);if(u||o==0)return;a=!s.sameRow,r=s.end.column}e(null,t,n,r,a)},this.getNextFoldTo=function(e,t){var n,r;for(var i=0;i<this.folds.length;i++){n=this.folds[i],r=n.range.compareEnd(e,t);if(r==-1)return{fold:n,kind:"after"};if(r==0)return{fold:n,kind:"inside"}}return null},this.addRemoveChars=function(e,t,n){var r=this.getNextFoldTo(e,t),i,s;if(r){i=r.fold;if(r.kind=="inside"&&i.start.column!=t&&i.start.row!=e)window.console&&window.console.log(e,t,i);else if(i.start.row==e){s=this.folds;var o=s.indexOf(i);o==0&&(this.start.column+=n);for(o;o<s.length;o++){i=s[o],i.start.column+=n;if(!i.sameRow)return;i.end.column+=n}this.end.column+=n}}},this.split=function(e,t){var n=this.getNextFoldTo(e,t).fold,r=this.folds,s=this.foldData;if(!n)return null;var o=r.indexOf(n),u=r[o-1];this.end.row=u.end.row,this.end.column=u.end.column,r=r.splice(o,r.length-o);var a=new i(s,r);return s.splice(s.indexOf(this)+1,0,a),a},this.merge=function(e){var t=e.folds;for(var n=0;n<t.length;n++)this.addFold(t[n]);var r=this.foldData;r.splice(r.indexOf(e),1)},this.toString=function(){var e=[this.range.toString()+": ["];return this.folds.forEach(function(t){e.push(" "+t.toString())}),e.push("]"),e.join("\n")},this.idxToPosition=function(e){var t=0,n;for(var r=0;r<this.folds.length;r++){var n=this.folds[r];e-=n.start.column-t;if(e<0)return{row:n.start.row,column:n.start.column+e};e-=n.placeholder.length;if(e<0)return n.start;t=n.end.column}return{row:this.end.row,column:this.end.column+e}}}).call(i.prototype),t.FoldLine=i}),ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"],function(e,t,n){function u(e,t){e.row-=t.row,e.row==0&&(e.column-=t.column)}function a(e,t){u(e.start,t),u(e.end,t)}function f(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row}function l(e,t){f(e.start,t),f(e.end,t)}var r=e("../range").Range,i=e("../range_list").RangeList,s=e("../lib/oop"),o=t.Fold=function(e,t){this.foldLine=null,this.placeholder=t,this.range=e,this.start=e.start,this.end=e.end,this.sameRow=e.start.row==e.end.row,this.subFolds=this.ranges=[]};s.inherits(o,i),function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()},this.setFoldLine=function(e){this.foldLine=e,this.subFolds.forEach(function(t){t.setFoldLine(e)})},this.clone=function(){var e=this.range.clone(),t=new o(e,this.placeholder);return this.subFolds.forEach(function(e){t.subFolds.push(e.clone())}),t.collapseChildren=this.collapseChildren,t},this.addSubFold=function(e){if(this.range.isEqual(e))return;if(!this.range.containsRange(e))throw"A fold can't intersect already existing fold"+e.range+this.range;a(e,this.start);var t=e.start.row,n=e.start.column;for(var r=0,i=-1;r<this.subFolds.length;r++){i=this.subFolds[r].range.compare(t,n);if(i!=1)break}var s=this.subFolds[r];if(i==0)return s.addSubFold(e);var t=e.range.end.row,n=e.range.end.column;for(var o=r,i=-1;o<this.subFolds.length;o++){i=this.subFolds[o].range.compare(t,n);if(i!=1)break}var u=this.subFolds[o];if(i==0)throw"A fold can't intersect already existing fold"+e.range+this.range;var f=this.subFolds.splice(r,o-r,e);return e.setFoldLine(this.foldLine),e},this.restoreRange=function(e){return l(e,this.start)}}.call(o.prototype)}),ace.define("ace/range_list",["require","exports","module","ace/range"],function(e,t,n){var r=e("./range").Range,i=r.comparePoints,s=function(){this.ranges=[]};(function(){this.comparePoints=i,this.pointIndex=function(e,t,n){var r=this.ranges;for(var s=n||0;s<r.length;s++){var o=r[s],u=i(e,o.end);if(u>0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.call(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s<t.length;s++){r=n,n=t[s];var o=i(r.end,n.start);if(o<0)continue;if(o==0&&!r.isEmpty()&&!n.isEmpty())continue;i(r.end,n.end)<0&&(r.end.row=n.end.row,r.end.column=n.end.column),t.splice(s,1),e.push(n),n=r,s--}return this.ranges=t,e},this.contains=function(e,t){return this.pointIndex({row:e,column:t})>=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row<e)return[];var r=this.pointIndex({row:e,column:0});r<0&&(r=-r-1);var i=this.pointIndex({row:t,column:0},r);i<0&&(i=-i-1);var s=[];for(var o=r;o<i;o++)s.push(n[o]);return s},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(e){this.session&&this.detach(),this.session=e,this.onChange=this.$onChange.bind(this),this.session.on("change",this.onChange)},this.detach=function(){if(!this.session)return;this.session.removeListener("change",this.onChange),this.session=null},this.$onChange=function(e){var t=e.data.range;if(e.data.action[0]=="i")var n=t.start,r=t.end;else var r=t.start,n=t.end;var i=n.row,s=r.row,o=s-i,u=-n.column+r.column,a=this.ranges;for(var f=0,l=a.length;f<l;f++){var c=a[f];if(c.end.row<i)continue;if(c.start.row>i)break;c.start.row==i&&c.start.column>=n.column&&(c.start.column+=u,c.start.row+=o),c.end.row==i&&c.end.column>=n.column&&(c.end.column==n.column&&u>0&&f<l-1&&c.end.column>c.start.column&&c.end.column==a[f+1].start.column&&(c.end.column-=u),c.end.column+=u,c.end.row+=o)}if(o!=0&&f<l)for(;f<l;f++){var c=a[f];c.start.row+=o,c.end.row+=o}}}).call(s.prototype),t.RangeList=s}),ace.define("ace/token_iterator",["require","exports","module"],function(e,t,n){var r=function(e,t,n){this.$session=e,this.$row=t,this.$rowTokens=e.getTokens(t);var r=e.getTokenAt(t,n);this.$tokenIndex=r?r.index:-1};(function(){this.stepBackward=function(){this.$tokenIndex-=1;while(this.$tokenIndex<0){this.$row-=1;if(this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){this.$tokenIndex+=1;var e;while(this.$tokenIndex>=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a<l){var c=f.charAt(a);if(c==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else c==e&&(s+=1);a+=1}do u=o.stepForward();while(u&&!n.test(u.type));if(u==null)break;a=0}return null}}var r=e("../token_iterator").TokenIterator,i=e("../range").Range;t.BracketMatch=s}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$matchIterator(e,this.$options);if(!t)return!1;var n=null;return t.forEach(function(e,t,r){if(!e.start){var i=e.offset+(r||0);n=new s(t,i,t,i+e.length)}else n=e;return!0}),n},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a;for(var l=u.offset||0;l<=f;l++){for(var c=0;c<a;c++)if(i[l+c].search(u[c])==-1)break;var h=i[l],p=i[l+a-1],d=h.match(u[0])[0].length,v=p.match(u[a-1])[0].length;o.push(new s(l,h.length-d,l+a-1,v))}}else for(var m=0;m<i.length;m++){var g=r.getMatchOffsets(i[m],u);for(var c=0;c<g.length;c++){var y=g[c];o.push(new s(m,y.offset,m,y.offset+y.length))}}if(n){var b=n.start.column,w=n.start.column,m=0,c=o.length-1;while(m<c&&o[m].start.column<b&&o[m].start.row==n.start.row)m++;while(m<c&&o[c].end.column>w&&o[c].end.row==n.end.row)c--;return o.slice(m,c+1)}return o},this.replace=function(e,t){var n=this.$options,r=this.$assembleRegExp(n);if(n.$isMultiLine)return t;if(!r)return;var i=r.exec(e);if(!i||i[0].length!=e.length)return null;t=e.replace(r,t);if(n.preserveCase){t=t.split("");for(var s=Math.min(e.length,e.length);s--;){var o=e[s];o&&o.toLowerCase()!=o?t[s]=t[s].toUpperCase():t[s]=t[s].toLowerCase()}t=t.join("")}return t},this.$matchIterator=function(e,t){var n=this.$assembleRegExp(t);if(!n)return!1;var i=this,o,u=t.backwards;if(t.$isMultiLine)var a=n.length,f=function(t,r,i){var u=t.search(n[0]);if(u==-1)return;for(var f=1;f<a;f++){t=e.getLine(r+f);if(t.search(n[f])==-1)return}var l=t.match(n[a-1])[0].length,c=new s(r,u,r+a-1,l);n.offset==1?(c.start.row--,c.start.column=Number.MAX_VALUE):i&&(c.start.column+=i);if(o(c))return!0};else if(u)var f=function(e,t,i){var s=r.getMatchOffsets(e,n);for(var u=s.length-1;u>=0;u--)if(o(s[u],t,i))return!0};else var f=function(e,t,i){var s=r.getMatchOffsets(e,n);for(var u=0;u<s.length;u++)if(o(s[u],t,i))return!0};return{forEach:function(n){o=n,i.$lineIterator(e,t).forEach(f)}}},this.$assembleRegExp=function(e){if(e.needle instanceof RegExp)return e.re=e.needle;var t=e.needle;if(!e.needle)return e.re=!1;e.regExp||(t=r.escapeRegExp(t)),e.wholeWord&&(t="\\b"+t+"\\b");var n=e.caseSensitive?"g":"gi";e.$isMultiLine=/[\n\r]/.test(t);if(e.$isMultiLine)return e.re=this.$assembleMultilineRegExp(t,n);try{var i=new RegExp(t,n)}catch(s){i=!1}return e.re=i},this.$assembleMultilineRegExp=function(e,t){var n=e.replace(/\r\n|\r|\n/g,"$\n^").split("\n"),r=[];for(var i=0;i<n.length;i++)try{r.push(new RegExp(n[i],t))}catch(s){return!1}return n[0]==""?(r.shift(),r.offset=1):r.offset=0,r},this.$lineIterator=function(e,t){var n=t.backwards==1,r=t.skipCurrent!=0,i=t.range,s=t.start;s||(s=i?i[n?"end":"start"]:e.selection.getRange()),s.start&&(s=s[r!=n?"end":"start"]);var o=i?i.start.row:0,u=i?i.end.row:e.getLength()-1,a=n?function(n){var r=s.row,i=e.getLine(r).substring(0,s.column);if(n(i,r))return;for(r--;r>=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../keyboard/hash_handler").HashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){this.platform=e,this.commands=this.byName={},this.commmandKeyBinding={},this.addCommands(t),this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var r={editor:t,command:e,args:n},i=this._emit("exec",r);return this._signal("afterExec",r),i===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys"],function(e,t,n){function i(e,t){this.platform=t,this.commands={},this.commmandKeyBinding={},this.addCommands(e)}var r=e("../lib/keys");(function(){this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e){var t=typeof e=="string"?e:e.name;e=this.commands[t],delete this.commands[t];var n=this.commmandKeyBinding;for(var r in n)for(var i in n[r])n[r][i]==e&&delete n[r][i]},this.bindKey=function(e,t){if(!e)return;if(typeof t=="function"){this.addCommand({exec:t,bindKey:e,name:t.name||e});return}var n=this.commmandKeyBinding;e.split("|").forEach(function(e){var r=this.parseKeys(e,t),i=r.hashId;(n[i]||(n[i]={}))[r.key]=t},this)},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n}),n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){var t=e.bindKey;if(!t)return;var n=typeof t=="string"?t:t[this.platform];this.bindKey(n,e)},this.parseKeys=function(e){e.indexOf(" ")!=-1&&(e=e.split(/\s+/).pop());var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=this.commmandKeyBinding;return r[t]&&r[t][n]},this.handleKeyboard=function(e,t,n,r){return{command:this.findKeyCommand(t,n)}}}).call(i.prototype),t.HashHandler=i}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config"],function(e,t,n){function s(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config");t.commands=[{name:"selectall",bindKey:s("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:s(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:s("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:s("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},readOnly:!0},{name:"unfold",bindKey:s("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},readOnly:!0},{name:"foldall",bindKey:s("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll()},readOnly:!0},{name:"unfoldall",bindKey:s("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},readOnly:!0},{name:"findnext",bindKey:s("Ctrl-K","Command-G"),exec:function(e){e.findNext()},readOnly:!0},{name:"findprevious",bindKey:s("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},readOnly:!0},{name:"find",bindKey:s("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:s("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotostart",bindKey:s("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectup",bindKey:s("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:!0},{name:"golineup",bindKey:s("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selecttoend",bindKey:s("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoend",bindKey:s("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectdown",bindKey:s("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",readOnly:!0},{name:"golinedown",bindKey:s("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordleft",bindKey:s("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordleft",bindKey:s("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolinestart",bindKey:s("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolinestart",bindKey:s("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectleft",bindKey:s("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoleft",bindKey:s("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordright",bindKey:s("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordright",bindKey:s("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolineend",bindKey:s("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolineend",bindKey:s("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectright",bindKey:s("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoright",bindKey:s("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:s(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:s("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:s(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:s("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:s("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"togglerecording",bindKey:s("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:s("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:s("Ctrl-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttomatching",bindKey:s("Ctrl-Shift-P",null),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},multiSelectAction:"forEach"},{name:"removeline",bindKey:s("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:s("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},multiSelectAction:"forEach"},{name:"sortlines",bindKey:s("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:s("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine"},{name:"modifyNumberUp",bindKey:s("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:s("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},multiSelectAction:"forEach"},{name:"replace",bindKey:s("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:s("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:s("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:s("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()}},{name:"movelinesup",bindKey:s("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()}},{name:"copylinesdown",bindKey:s("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()}},{name:"movelinesdown",bindKey:s("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()}},{name:"del",bindKey:s("Delete","Delete|Ctrl-D"),exec:function(e){e.remove("right")},multiSelectAction:"forEach"},{name:"backspace",bindKey:s("Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach"},{name:"removetolinestart",bindKey:s("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach"},{name:"removetolineend",bindKey:s("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach"},{name:"removewordleft",bindKey:s("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach"},{name:"removewordright",bindKey:s("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach"},{name:"outdent",bindKey:s("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach"},{name:"indent",bindKey:s("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach"},{name:"blockoutdent",bindKey:s("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine"},{name:"blockindent",bindKey:s("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach"},{name:"splitline",bindKey:s(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach"},{name:"transposeletters",bindKey:s("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)}},{name:"touppercase",bindKey:s("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach"},{name:"tolowercase",bindKey:s("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach"}]}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){var r=function(){this.reset()};(function(){this.execute=function(e){var t=e.args[0];this.$doc=e.args[1],this.$undoStack.push(t),this.$redoStack=[]},this.undo=function(e){var t=this.$undoStack.pop(),n=null;return t&&(n=this.$doc.undoChanges(t,e),this.$redoStack.push(t)),n},this.redo=function(e){var t=this.$redoStack.pop(),n=null;return t&&(n=this.$doc.redoChanges(t,e),this.$undoStack.push(t)),n},this.reset=function(){this.$undoStack=[],this.$redoStack=[]},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/useragent","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/useragent"),u=e("./config"),a=e("./layer/gutter").Gutter,f=e("./layer/marker").Marker,l=e("./layer/text").Text,c=e("./layer/cursor").Cursor,h=e("./scrollbar").ScrollBar,p=e("./renderloop").RenderLoop,d=e("./lib/event_emitter").EventEmitter,v=".ace_editor {position: relative;overflow: hidden;font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;font-size: 12px;line-height: normal;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\");}.ace_scrollbar {position: absolute;overflow-x: hidden;overflow-y: scroll;right: 0;top: 0;bottom: 0;}.ace_scrollbar-inner {position: absolute;width: 1px;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;border: solid lightgray 1px;margin: -1px;padding: 0 1px;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: nowrap;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {color: black;font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_cursor[style*=\"opacity: 0\"]{-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_line {white-space: nowrap;}.ace_marker-layer .ace_step {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;}.ace_editor.ace_dragging .ace_content {cursor: move;}.ace_gutter-tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: inline-block;max-width: 500px;padding: 4px;position: fixed;z-index: 300;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre-line;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: inline-block;width: 11px;vertical-align: top;background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;}.ace_fold-widget.ace_end {background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");}.ace_fold-widget.ace_closed {background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");}.ace_dark .ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}";i.importCssString(v,"ace_editor");var m=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new a(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new f(this.content);var r=this.$textLayer=new l(this.content);this.canvas=r.element,this.$markerFront=new f(this.content),this.$cursorLayer=new c(this.content),this.$horizScroll=!1,this.$horizScrollAlwaysVisible=!1,this.scrollBar=new h(this.container),this.scrollBar.addEventListener("scroll",function(e){n.$inScrollAnimation||n.session.setScrollTop(e.data)}),this.scrollTop=0,this.scrollLeft=0,s.addListener(this.scroller,"scroll",function(){var e=n.scroller.scrollLeft;n.scrollLeft=e,n.session.setScrollLeft(e)}),this.cursorPos={row:0,column:0},this.$textLayer.addEventListener("changeCharacterSize",function(){n.updateCharacterSize(),n.onResize(!0)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),u.resetOptions(this),u._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.characterWidth=this.$textLayer.getCharacterWidth(),this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session=e,this.scroller.className="ace_scroller",this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(e,t){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRow<t&&(this.$changedLines.lastRow=t)):this.$changedLines={firstRow:e,lastRow:t};if(this.$changedLines.firstRow>this.layerConfig.lastRow||this.$changedLines.lastRow<this.layerConfig.firstRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.onResize=function(e,t,n,r){var s=0,o=this.$size;if(this.resizing>2)return;this.resizing>1?this.resizing++:this.resizing=e?1:0,r||(r=i.getInnerHeight(this.container)),r&&(e||o.height!=r)&&(o.height=r,s=this.CHANGE_SIZE,o.scrollerHeight=this.scroller.clientHeight,o.scrollerHeight||(o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBar.getWidth())),this.scrollBar.setHeight(o.scrollerHeight),this.session&&(this.session.setScrollTop(this.getScrollTop()),s|=this.CHANGE_FULL)),n||(n=i.getInnerWidth(this.container));if(n&&(e||this.resizing>1||o.width!=n)){s=this.CHANGE_SIZE,o.width=n;var t=this.$showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=t+"px",o.scrollerWidth=Math.max(0,n-t-this.scrollBar.getWidth()),this.scroller.style.right=this.scrollBar.getWidth()+"px";if(this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}e?this.$renderChanges(s,!0):this.$loop.schedule(s),e&&(this.$gutterLayer.$padding=null),e&&delete this.resizing},this.onGutterResize=function(){var e=this.$size.width,t=this.$showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=t+"px",this.$size.scrollerWidth=Math.max(0,e-t-this.scrollBar.getWidth()),this.session.getUseWrapMode()&&this.adjustWrapLimit()&&this.$loop.schedule(this.CHANGE_FULL)},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden"},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;if(t<0||t>e.height-this.lineHeight)return;var r=this.characterWidth;if(this.$composition){var i=this.textarea.value.replace(/^\x01+/,"");r*=this.session.$getStringScreenWidth(i)[0]}n-=this.scrollLeft,n>this.$size.scrollerWidth-r&&(n=this.$size.scrollerWidth-r),n-=this.scrollBar.width,this.textarea.style.height=this.lineHeight+"px",this.textarea.style.width=r+"px",this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-n-r)+"px",this.textarea.style.bottom=Math.max(0,this.$size.height-t-this.lineHeight)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+e},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.getHScrollBarAlwaysVisible=function(){return this.$horizScrollAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.$horizScrollAlwaysVisible!=e&&(this.$horizScrollAlwaysVisible=e,(!this.$horizScrollAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL))},this.$updateScrollBar=function(){this.scrollBar.setInnerHeight(this.layerConfig.maxHeight),this.scrollBar.setScrollTop(this.scrollTop)},this.$renderChanges=function(e,t){if(!t&&(!e||!this.session||!this.container.offsetWidth))return;this._signal("beforeRender"),(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL)&&this.$computeLayerConfig();if(e&this.CHANGE_H_SCROLL){this.scroller.scrollLeft=this.scrollLeft;var n=this.scroller.scrollLeft;this.scrollLeft=n,this.session.setScrollLeft(n),this.scroller.className=this.scrollLeft==0?"ace_scroller":"ace_scroller ace_scroll-left"}if(e&this.CHANGE_FULL){this.$textLayer.checkForSizeChanges(),this.$updateScrollBar(),this.$textLayer.update(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(this.layerConfig):this.$textLayer.scrollLines(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this.$updateScrollBar(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(this.layerConfig):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(this.layerConfig),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(this.layerConfig),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(this.layerConfig),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(this.layerConfig),e&this.CHANGE_SIZE&&this.$updateScrollBar(),this._signal("afterRender")},this.$computeLayerConfig=function(){if(!this.$size.scrollerHeight)return this.onResize(!0);var e=this.session,t=this.scrollTop%this.lineHeight,n=this.$size.scrollerHeight+this.lineHeight,r=this.$getLongestLine(),i=this.$horizScrollAlwaysVisible||this.$size.scrollerWidth-r<0,s=this.$horizScroll!==i;this.$horizScroll=i,s&&(this.scroller.style.overflowX=i?"scroll":"hidden",i||this.session.setScrollLeft(0));var o=this.session.getScreenLength()*this.lineHeight;this.session.setScrollTop(Math.max(0,Math.min(this.scrollTop,o-this.$size.scrollerHeight)));var u=Math.ceil(n/this.lineHeight)-1,a=Math.max(0,Math.round((this.scrollTop-t)/this.lineHeight)),f=a+u,l,c,h=this.lineHeight;a=e.screenToDocumentRow(a,0);var p=e.getFoldLine(a);p&&(a=p.start.row),l=e.documentToScreenRow(a,0),c=e.getRowLength(a)*h,f=Math.min(e.screenToDocumentRow(f,0),e.getLength()-1),n=this.$size.scrollerHeight+e.getRowLength(f)*h+c,t=this.scrollTop-l*h,this.layerConfig={width:r,padding:this.$padding,firstRow:a,firstRowScreen:l,lastRow:f,lineHeight:h,characterWidth:this.characterWidth,minHeight:n,maxHeight:o,offset:t,height:this.$size.scrollerHeight},this.$gutterLayer.element.style.marginTop=-t+"px",this.content.style.marginTop=-t+"px",this.content.style.width=r+2*this.$padding+"px",this.content.style.height=n+"px",s&&this.onResize(!0)},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(t<n.firstRow)return;if(t===Infinity){this.$showGutter&&this.$gutterLayer.update(n),this.$textLayer.update(n);return}return this.$textLayer.updateLines(n,e,t),!0},this.$getLongestLine=function(){var e=this.session.getScreenWidth();return this.$textLayer.showInvisibles&&(e+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t){if(this.$size.scrollerHeight===0)return;var n=this.$cursorLayer.getPixelPosition(e),r=n.left,i=n.top;this.scrollTop>i?(t&&(i-=t*this.$size.scrollerHeight),this.session.setScrollTop(i)):this.scrollTop+this.$size.scrollerHeight<i+this.lineHeight&&(t&&(i+=t*this.$size.scrollerHeight),this.session.setScrollTop(i+this.lineHeight-this.$size.scrollerHeight));var s=this.scrollLeft;s>r?(r<this.$padding+2*this.layerConfig.characterWidth&&(r=0),this.session.setScrollLeft(r)):s+this.$size.scrollerWidth<r+this.characterWidth&&this.session.setScrollLeft(Math.round(r+this.characterWidth-this.$size.scrollerWidth))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(e){this.session.setScrollTop(e*this.lineHeight)},this.alignCursor=function(e,t){typeof e=="number"&&(e={row:e,column:0});var n=this.$cursorLayer.getPixelPosition(e),r=this.$size.scrollerHeight-this.lineHeight,i=n.top-r*(t||0);return this.session.setScrollTop(i),i},this.STEPS=8,this.$calcSteps=function(e,t){var n=0,r=this.STEPS,i=[],s=function(e,t,n){return n*(Math.pow(e-1,3)+1)+t};for(n=0;n<r;++n)i.push(s(n/this.STEPS,e,t-e));return i},this.scrollToLine=function(e,t,n,r){var i=this.$cursorLayer.getPixelPosition({row:e,column:0}),s=i.top;t&&(s-=this.$size.scrollerHeight/2);var o=this.scrollTop;this.session.setScrollTop(s),n!==!1&&this.animateScrolling(o,r)},this.animateScrolling=function(e,t){var n=this.scrollTop;if(this.$animatedScroll&&Math.abs(e-n)<1e5){var r=this,i=r.$calcSteps(e,n);this.$inScrollAnimation=!0,clearInterval(this.$timer),r.session.setScrollTop(i.shift()),this.$timer=setInterval(function(){i.length?(r.session.setScrollTop(i.shift()),r.session.$scrollTop=n):n!=null?(r.session.$scrollTop=-1,r.session.setScrollTop(n),n=null):(r.$timer=clearInterval(r.$timer),r.$inScrollAnimation=!1,t&&t())},10)}},this.scrollToY=function(e){this.scrollTop!==e&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=e)},this.scrollToX=function(e){e<0&&(e=0),this.scrollLeft!==e&&(this.scrollLeft=e),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollBy=function(e,t){t&&this.session.setScrollTop(this.session.getScrollTop()+t),e&&this.session.setScrollLeft(this.session.getScrollLeft()+e)},this.isScrollableBy=function(e,t){if(t<0&&this.session.getScrollTop()>=1)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e){function r(e){i.importCssString(e.cssText,e.cssClass,t.container.ownerDocument),t.theme&&i.removeCssClass(t.container,t.theme.cssClass),t.$theme=e.cssClass,t.theme=e,i.addCssClass(t.container,e.cssClass),i.setCssClass(t.container,"ace_dark",e.isDark);var n=e.padding||4;t.$padding&&n!=t.$padding&&t.setPadding(n),t.$size&&(t.$size.width=0,t.onResize()),t._dispatchEvent("themeLoaded",{theme:e})}var t=this;this.$themeValue=e,t._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var n=e||"ace/theme/textmate";u.loadModule(["theme",n],r)}else r(e)},this.getTheme=function(){return this.$themeValue},this.setStyle=function(t,n){i.setCssClass(this.container,t,n!=0)},this.unsetStyle=function(t){i.removeCssClass(this.container,t)},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(m.prototype),u.defineOptions(m.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0}}),t.VirtualRenderer=m}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this)};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];var t,n;for(var r=0;r<e.length;r++){var i=e[r],n=i.row,t=this.$annotations[n];t||(t=this.$annotations[n]={text:[]});var o=i.text;o=o?s.escapeHTML(o):i.html||"",t.text.indexOf(o)===-1&&t.text.push(o);var u=i.type;u=="error"?t.className=" ace_error":u=="warning"&&t.className!=" ace_error"?t.className=" ace_warning":u=="info"&&!t.className&&(t.className=" ace_info")}},this.$updateAnnotations=function(e){if(!this.$annotations.length)return;var t=e.data,n=t.range,r=n.start.row,i=n.end.row-r;if(i!==0)if(t.action=="removeText"||t.action=="removeLines")this.$annotations.splice(r,i+1,null);else{var s=Array(i+1);s.unshift(r,1),this.$annotations.splice.apply(this.$annotations,s)}},this.update=function(e){var t={className:""},n=[],i=e.firstRow,s=e.lastRow,o=this.session.getNextFoldLine(i),u=o?o.start.row:Infinity,a=this.$showFoldWidgets&&this.session.foldWidgets,f=this.session.$breakpoints,l=this.session.$decorations,c=this.session.$firstLineNumber,h=0;for(;;){i>u&&(i=o.end.row+1,o=this.session.getNextFoldLine(i,o),u=o?o.start.row:Infinity);if(i>s)break;var p=this.$annotations[i]||t;n.push("<div class='ace_gutter-cell ",f[i]||"",l[i]||"",p.className,"' style='height:",this.session.getRowLength(i)*e.lineHeight,"px;'>",h=i+c);if(a){var d=a[i];d==null&&(d=a[i]=this.session.getFoldWidget(i)),d&&n.push("<span class='ace_fold-widget ace_",d,d=="start"&&i==u&&i<o.end.row?" ace_closed":" ace_open","' style='height:",e.lineHeight,"px","'></span>")}n.push("</div>"),i++}this.element=r.setInnerHtml(this.element,n.join("")),this.element.style.height=e.minHeight+"px",this.session.$useWrapMode&&(h=this.session.getLength());var v=(""+h).length*e.characterWidth,m=this.$padding||this.$computePadding();v+=m.left+m.right,v!==this.gutterWidth&&(this.gutterWidth=v,this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._emit("changeGutterWidth",v))},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(e){e?r.addCssClass(this.element,"ace_folding-enabled"):r.removeCssClass(this.element,"ace_folding-enabled"),this.$showFoldWidgets=e,this.$padding=null},this.getShowFoldWidgets=function(){return this.$showFoldWidgets},this.$computePadding=function(){if(!this.element.firstChild)return{left:0,right:0};var e=r.computedStyle(this.element.firstChild);return this.$padding={},this.$padding.left=parseInt(e.paddingLeft)+1,this.$padding.right=parseInt(e.paddingRight),this.$padding},this.getRegion=function(e){var t=this.$padding||this.$computePadding(),n=this.element.getBoundingClientRect();if(e.x<t.left+n.left)return"markers";if(this.$showFoldWidgets&&e.x>n.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var s=r.range.clipRows(e.firstRow,e.lastRow);if(s.isEmpty())continue;s=s.toScreenRange(this.session);if(r.renderer){var o=this.$getTop(s.start.row,e),u=this.$padding+s.start.column*e.characterWidth;r.renderer(t,s,u,o,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,s,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,s,r.clazz,e):s.isMultiLine()?r.type=="text"?this.drawTextMarker(t,s,r.clazz,e):this.drawMultiLineMarker(t,s,r.clazz,e):this.drawSingleLineMarker(t,s,r.clazz+" ace_start",e)}this.element=i.setInnerHtml(this.element,t.join(""))},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(e,t,n,i){var s=t.start.row,o=new r(s,t.start.column,s,this.session.getScreenLastRowColumn(s));this.drawSingleLineMarker(e,o,n+" ace_start",i,1,"text"),s=t.end.row,o=new r(s,0,s,t.end.column),this.drawSingleLineMarker(e,o,n,i,0,"text");for(s=t.start.row+1;s<t.end.row;s++)o.start.row=s,o.end.row=s,o.end.column=this.session.getScreenLastRowColumn(s),this.drawSingleLineMarker(e,o,n,i,1,"text")},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;e.push("<div class='",n," ace_start' style='","height:",o,"px;","right:0;","top:",u,"px;","left:",a,"px;'></div>"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("<div class='",n,"' style='","height:",o,"px;","width:",f,"px;","top:",u,"px;","left:",s,"px;'></div>"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<0)return;u=this.$getTop(t.start.row+1,r),e.push("<div class='",n,"' style='","height:",o,"px;","right:0;","top:",u,"px;","left:",s,"px;'></div>")},this.drawSingleLineMarker=function(e,t,n,r,i){var s=r.lineHeight,o=(t.end.column+(i||0)-t.start.column)*r.characterWidth,u=this.$getTop(t.start.row,r),a=this.$padding+t.start.column*r.characterWidth;e.push("<div class='",n,"' style='","height:",s,"px;","width:",o,"px;","top:",u,"px;","left:",a,"px;'></div>")},this.drawFullLineMarker=function(e,t,n,r){var i=this.$getTop(t.start.row,r),s=r.lineHeight;t.start.row!=t.end.row&&(s+=this.$getTop(t.end.row,r)-i),e.push("<div class='",n,"' style='","height:",s,"px;","top:",i,"px;","left:0;right:0;'></div>")},this.drawScreenLineMarker=function(e,t,n,r){var i=this.$getTop(t.start.row,r),s=r.lineHeight;e.push("<div class='",n,"' style='","height:",s,"px;","top:",i,"px;","left:0;right:0;'></div>")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$characterSize={width:0,height:0},this.checkForSizeChanges(),this.$pollSizeChanges()};(function(){r.implement(this,u),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){var e=this;this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=o.isIE||o.isOldGecko?function(){var e=1e3;if(!this.$measureNode){var t=this.$measureNode=i.createElement("div"),n=t.style;n.width=n.height="auto",n.left=n.top=-e*40+"px",n.visibility="hidden",n.position="fixed",n.overflow="visible",n.whiteSpace="nowrap",t.innerHTML=s.stringRepeat("Xy",e);if(this.element.ownerDocument.body)this.element.ownerDocument.body.appendChild(t);else{var r=this.element.parentNode;while(!i.hasCssClass(r,"ace_editor"))r=r.parentNode;r.appendChild(t)}}if(!this.element.offsetWidth)return null;var n=this.$measureNode.style,o=i.computedStyle(this.element);for(var u in this.$fontStyles)n[u]=o[u];var a={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(e*2)};return a.width==0||a.height==0?null:a}:function(){if(!this.$measureNode){var e=this.$measureNode=i.createElement("div"),t=e.style;t.width=t.height="auto",t.left=t.top="-100px",t.visibility="hidden",t.position="fixed",t.overflow="visible",t.whiteSpace="nowrap",e.innerHTML="X";var n=this.element.parentNode;while(n&&!i.hasCssClass(n,"ace_editor"))n=n.parentNode;if(!n)return this.$measureNode=null;n.appendChild(e)}var r=this.$measureNode.getBoundingClientRect(),s={height:r.height,width:r.width};return s.width==0||s.height==0?null:s},this.setSession=function(e){this.session=e,this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n<e+1;n++)this.showInvisibles?t.push("<span class='ace_invisible'>"+this.TAB_CHAR+s.stringRepeat(" ",n-1)+"</span>"):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide";if(this.showInvisibles){r+=" ace_invisible";var i=s.stringRepeat(this.SPACE_CHAR,this.tabSize),o=this.TAB_CHAR+s.stringRepeat(" ",this.tabSize-1)}else var i=s.stringRepeat(" ",this.tabSize),o=i;this.$tabStrings[" "]="<span class='"+r+"'>"+i+"</span>",this.$tabStrings[" "]="<span class='"+r+"'>"+o+"</span>"}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),s=Math.min(n,e.lastRow),o=this.element.childNodes,u=0;for(var a=e.firstRow;a<r;a++){var f=this.session.getFoldLine(a);if(f){if(f.containsRow(r)){r=f.start.row;break}a=f.end.row}u++}var a=r,f=this.session.getNextFoldLine(a),l=f?f.start.row:Infinity;for(;;){a>l&&(a=f.end.row+1,f=this.session.getNextFoldLine(a,f),l=f?f.start.row:Infinity);if(a>s)break;var c=o[u++];if(c){var h=[];this.$renderLine(h,a,!this.$useLineGroups(),a==l?f:!1),i.setInnerHtml(c,h.join(""))}a++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow<e.firstRow)return this.update(e);if(e.lastRow<t.firstRow)return this.update(e);var n=this.element;if(t.firstRow<e.firstRow)for(var r=this.session.getFoldedRowCount(t.firstRow,e.firstRow-1);r>0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRow<t.firstRow){var i=this.$renderLinesFragment(e,e.firstRow,t.firstRow-1);n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i)}if(e.lastRow>t.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a);else{var l=a.childNodes;while(l.length)r.appendChild(l[0])}s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,s=n,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>r)break;this.$useLineGroups()&&t.push("<div class='ace_line_group'>"),this.$renderLine(t,s,!1,s==u?o:!1),this.$useLineGroups()&&t.push("</div>"),s++}this.element=i.setInnerHtml(this.element,t.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?"<span class='ace_invisible'>"+s.stringRepeat(i.SPACE_CHAR,e.length)+"</span>":s.stringRepeat(" ",e.length);if(e=="&")return"&";if(e=="<")return"<";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e==" "){var f=i.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,"<span class='"+f+"' style='width:"+i.config.characterWidth*2+"px'>"+l+"</span>"}return r?"<span class='ace_invisible ace_invalid'>"+i.SPACE_CHAR+"</span>":(t+=1,"<span class='ace_cjk' style='width:"+i.config.characterWidth*2+"px'>"+e+"</span>")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("<span class='",f,"'",l,">",a,"</span>")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t){var n=t.search(this.$indentGuideRe);return n<=0?t:t[0]==" "?(n-=n%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],n/this.tabSize)),t.substr(n)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],n)),t.substr(n)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,s=0,o=n[0],u=0;for(var a=0;a<t.length;a++){var f=t[a],l=f.value;if(a==0&&this.displayIndentGuides){i=l.length,l=this.renderIndentGuide(e,l);if(!l)continue;i-=l.length}if(i+l.length<o)u=this.$renderToken(e,u,f,l),i+=l.length;else{while(i+l.length>=o)u=this.$renderToken(e,u,f,l.substring(0,o-i)),l=l.substring(o-i),i=o,r||e.push("</div>","<div class='ace_line' style='height:",this.config.lineHeight,"px'>"),s++,u=0,o=n[s]||Number.MAX_VALUE;l.length!=0&&(i+=l.length,u=this.$renderToken(e,u,f,l))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s<t.length;s++)r=t[s],i=r.value,n=this.$renderToken(e,n,r,i)},this.$renderLine=function(e,t,n,r){!r&&r!=0&&(r=this.session.getFoldLine(t));if(r)var i=this.$getFoldLineTokens(t,r);else var i=this.session.getTokens(t);n||e.push("<div class='ace_line' style='height:",this.config.lineHeight,"px'>");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("<span class='ace_invisible'>",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"</span>")),n||e.push("</div>")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.length<t){s+=e[i].value.length,i++;if(i==e.length)return}if(s!=t){var o=e[i].value.substring(t-s);o.length>n-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(s<n&&i<e.length){var o=e[i].value;o.length+s>n?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors")};(function(){this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,e?r.addCssClass(this.element,"ace_smooth-blinking"):r.removeCssClass(this.element,"ace_smooth-blinking"),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking");for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity="";if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity=0}.bind(this),.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity="";t()}.bind(this),this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;n<i;n++){var s=this.getPixelPosition(t[n].cursor,!0);if((s.top>e.height+e.offset||s.top<-e.offset)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px"}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar",this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.width=i.scrollbarWidth(e.ownerDocument),this.element.style.width=(this.width||15)+5+"px",s.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){r.implement(this,o),this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.width},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}).call(u.prototype),t.ScrollBar=u}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor"],function(e,t,n){function h(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=n==-1,c.find(e)}function v(e,t){return e.row==t.row&&e.column==t.column}function m(e){e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),t.onSessionChange.call(e,e),e.on("changeSession",t.onSessionChange.bind(e)),e.on("mousedown",o),e.commands.addCommands(f.defaultCommands),g(e)}function g(e){function i(){n&&(r.style.cursor="",n=!1)}var t=e.textInput.getElement(),n=!1,r=e.renderer.content;u.addListener(t,"keydown",function(e){e.keyCode==18&&!(e.ctrlKey||e.shiftKey||e.metaKey)?n||(r.style.cursor="crosshair",n=!0):n&&(r.style.cursor="")}),u.addListener(t,"keyup",i),u.addListener(t,"blur",i)}var r=e("./range_list").RangeList,i=e("./range").Range,s=e("./selection").Selection,o=e("./mouse/multi_select_handler").onMouseDown,u=e("./lib/event"),a=e("./lib/lang"),f=e("./commands/multi_select_commands");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var l=e("./search").Search,c=new l,p=e("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(p.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(!e)return;if(!this.inMultiSelectMode&&this.rangeCount==0){var n=this.toOrientedRange();this.rangeList.add(n),this.rangeList.add(e);if(this.rangeList.ranges.length!=2)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(n),this.$onAddRange(n)}e.cursor||(e.cursor=e.end);var r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),this.rangeCount>1&&!this.inMultiSelectMode&&(this._emit("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._emit("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._emit("removeRange",{ranges:e}),this.rangeCount==0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._emit("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeList.ranges.concat()},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c<o;c++)f.push(this.getLineRange(c,!0));l=this.getLineRange(o,!0),l.end.column=n.end.column,f.push(l),f.forEach(this.addRange,this)}},this.toggleBlockSelection=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column<t.column;if(s)var o=e.column,u=t.column;else var o=t.column,u=e.column;var a=e.row<t.row;if(a)var f=e.row,l=t.row;else var f=t.row,l=e.row;o<0&&(o=0),f<0&&(f=0),f==l&&(n=!0);for(var c=f;c<=l;c++){var h=i.fromPoints(this.session.screenToDocumentPosition(c,o),this.session.screenToDocumentPosition(c,u));if(h.isEmpty()){if(p&&v(h.end,p))break;var p=h.end}h.cursor=s?h.start:h.end,r.push(h)}a&&r.reverse();if(!n){var d=r.length-1;while(r[d].isEmpty()&&d>0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.on("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeEventListener("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;t.multiSelectAction?t.multiSelectAction=="forEach"?n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),t.exec(n,e.args||{})):t.multiSelectAction(n,e.args||{}):(t.exec(n,e.args||{}),n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()),e.preventDefault()},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=this.session,i=this.selection,o=i.rangeList,u=i._eventRegistry;i._eventRegistry={};var a=new s(r);this.inVirtualSelectionMode=!0;for(var f=o.ranges.length;f--;){if(n)while(f>0&&o.ranges[f].start.row==o.ranges[f-1].end.row)f--;a.fromOrientedRange(o.ranges[f]),this.selection=r.selection=a,e.exec(this,t||{}),a.toOrientedRange(o.ranges[f])}a.detach(),this.selection=r.selection=i,this.inVirtualSelectionMode=!1,i._eventRegistry=u,i.mergeOverlappingRanges(),this.onCursorChange(),this.onSelectionChange()},this.exitMultiSelectMode=function(){if(this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getCopyText=function(){var e="";if(this.inMultiSelectMode){var t=this.multiSelect.rangeList.ranges;e=[];for(var n=0;n<t.length;n++)e.push(this.session.getTextRange(t[n]));e=e.join(this.session.getDocument().getNewLineCharacter())}else this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange()));return e},this.onPaste=function(e){if(this.$readOnly)return;this._signal("paste",e);if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return this.insert(e);var t=e.split(/\r\n|\r|\n/),n=this.selection.rangeList.ranges;if(t.length>n.length||t.length<=2||!t[1])return this.commands.exec("insertstring",this,e);for(var r=n.length;r--;){var i=n[r];i.isEmpty()||this.session.remove(i),this.session.insert(i.start,t[r])}},this.findAll=function(e,t,n){t=t||{},t.needle=e||t.needle,this.$search.set(t);var r=this.$search.findAll(this.session);if(!r.length)return 0;this.$blockScrolling+=1;var i=this.multiSelect;n||i.toSingleRange(r[0]);for(var s=r.length;s--;)i.addRange(r[s],!0);return this.$blockScrolling-=1,r.length},this.selectMoreLines=function(e,t){var n=this.selection.toOrientedRange(),r=n.cursor==n.end,s=this.session.documentToScreenPosition(n.cursor);this.selection.$desiredColumn&&(s.column=this.selection.$desiredColumn);var o=this.session.screenToDocumentPosition(s.row+e,s.column);if(!n.isEmpty())var u=this.session.documentToScreenPosition(r?n.end:n.start),a=this.session.screenToDocumentPosition(u.row+e,u.column);else var a=o;if(r){var f=i.fromPoints(o,a);f.cursor=f.start}else{var f=i.fromPoints(a,o);f.cursor=f.end}f.desiredColumn=s.column;if(!this.selection.inMultiSelectMode)this.selection.addRange(n);else if(t)var l=n.cursor;this.selection.addRange(f),l&&this.selection.substractPoint(l)},this.transposeSelections=function(e){var t=this.session,n=t.multiSelect,r=n.ranges;for(var i=r.length;i--;){var s=r[i];if(s.isEmpty()){var o=t.getWordRange(s.start.row,s.start.column);s.start.row=o.start.row,s.start.column=o.start.column,s.end.row=o.end.row,s.end.column=o.end.column}}n.mergeOverlappingRanges();var u=[];for(var i=r.length;i--;){var s=r[i];u.unshift(t.getTextRange(s))}e<0?u.unshift(u.pop()):u.push(u.shift());for(var i=r.length;i--;){var s=r[i],o=s.clone();t.replace(s,u[i]),s.start.row=o.start.row,s.start.column=o.start.column}},this.selectMore=function(e,t){var n=this.session,r=n.multiSelect,i=r.toOrientedRange();if(i.isEmpty()){var i=n.getWordRange(i.start.row,i.start.column);i.cursor=i.end,this.multiSelect.addRange(i)}var s=n.getTextRange(i),o=h(n,s,e);o&&(o.cursor=e==-1?o.start:o.end,this.multiSelect.addRange(o)),t&&this.multiSelect.substractPoint(i.cursor)},this.alignCursors=function(){var e=this.session,t=e.multiSelect,n=t.ranges;if(!n.length){var r=this.selection.getRange(),s=r.start.row,o=r.end.row,u=this.session.doc.removeLines(s,o);u=this.$reAlignText(u),this.session.doc.insertLines(s,u),r.start.column=0,r.end.column=u[u.length-1].length,this.selection.setRange(r)}else{var f=-1,l=n.filter(function(e){if(e.cursor.row==f)return!0;f=e.cursor.row});t.$onRemoveRange(l);var c=0,h=Infinity,p=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>c&&(c=n.column),i<h&&(h=i),i});n.forEach(function(t,n){var r=t.cursor,s=c-r.column,o=p[n]-h;s>o?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=c,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e){function o(e){return a.stringRepeat(" ",e)}function u(e){return e[2]?o(r)+e[2]+o(i-e[2].length+s)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function f(e){return e[2]?o(r+i-e[2].length)+e[2]+o(s," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?o(r)+e[2]+o(s)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var t=!0,n=!0,r,i,s;return e.map(function(e){var o=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return o?r==null?(r=o[1].length,i=o[2].length,s=o[3].length,o):(r+i+s!=o[1].length+o[2].length+o[3].length&&(n=!1),r!=o[1].length&&(t=!1),r>o[1].length&&(r=o[1].length),i<o[2].length&&(i=o[2].length),s>o[3].length&&(s=o[3].length),o):[e]}).map(t?n?f:u:l)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t.multiSelect||(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t.multiSelect;var n=e.oldSession;n&&(n.multiSelect&&n.multiSelect.editor==this&&(n.multiSelect.editor=null),t.multiSelect.removeEventListener("addRange",this.$onAddRange),t.multiSelect.removeEventListener("removeRange",this.$onRemoveRange),t.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect),t.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)),t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m}),ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(e,t,n){function i(e,t){return e.row==t.row&&e.column==t.column}function s(e){var t=e.domEvent,n=t.altKey,s=t.shiftKey,o=e.getAccelKey(),u=e.getButton();if(e.editor.inMultiSelectMode&&u==2){e.editor.textInput.onContextMenu(e.domEvent);return}if(!o&&!n){u==0&&e.editor.inMultiSelectMode&&e.editor.exitMultiSelectMode();return}var a=e.editor,f=a.selection,l=a.inMultiSelectMode,c=e.getDocumentPosition(),h=f.getCursor(),p=e.inSelection()||f.isEmpty()&&i(c,h),d=e.x,v=e.y,m=function(e){d=e.clientX,v=e.clientY},g=function(){var e=a.renderer.pixelToScreenCoordinates(d,v),t=y.screenToDocumentPosition(e.row,e.column);if(i(w,e)&&i(t,f.selectionLead))return;w=e,a.selection.moveCursorToPosition(t),a.selection.clearSelection(),a.renderer.scrollCursorIntoView(),a.removeSelectionMarkers(x),x=f.rectangularRangeBlock(w,b),x.forEach(a.addSelectionMarker,a),a.updateSelectionMarkers()},y=a.session,b=a.renderer.pixelToScreenCoordinates(d,v),w=b;if(o&&!s&&!n&&u==0){if(!l&&p)return;if(!l){var E=f.toOrientedRange();a.addSelectionMarker(E)}var S=f.rangeList.rangeAtPoint(c);r.capture(a.container,function(){},function(){var e=f.toOrientedRange();S&&e.isEmpty()&&i(S.cursor,e.cursor)?f.substractPoint(e.cursor):(E&&(a.removeSelectionMarker(E),f.addRange(E)),f.addRange(e))})}else if(n&&u==0){e.stop(),l&&!o?f.toSingleRange():!l&&o&&f.addRange();var x=[];s?(b=y.documentToScreenPosition(f.lead),g()):(f.moveCursorToPosition(c),f.clearSelection());var T=function(e){clearInterval(C),a.removeSelectionMarkers(x);for(var t=0;t<x.length;t++)f.addRange(x[t])},N=g;r.capture(a.container,m,T);var C=setInterval(function(){N()},20);return e.preventDefault()}}var r=e("../lib/event");t.onMouseDown=s}),ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(e,t,n){t.defaultCommands=[{name:"addCursorAbove",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:!0},{name:"addCursorBelow",exec:function(e){e.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:!0},{name:"addCursorAboveSkipCurrent",exec:function(e){e.selectMoreLines(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:!0},{name:"addCursorBelowSkipCurrent",exec:function(e){e.selectMoreLines(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:!0},{name:"selectMoreBefore",exec:function(e){e.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:!0},{name:"selectMoreAfter",exec:function(e){e.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:!0},{name:"selectNextBefore",exec:function(e){e.selectMore(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:!0},{name:"selectNextAfter",exec:function(e){e.selectMore(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:!0},{name:"splitIntoLines",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readonly:!0},{name:"alignCursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"}}],t.multiSelectCommands=[{name:"singleSelection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},readonly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var r=e("../keyboard/hash_handler").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/event_emitter").EventEmitter,s=e("../config"),o=function(t,n,r){this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),this.onError=this.onError.bind(this);var i;if(s.get("packaged"))i=s.moduleUrl(n,"worker");else{var o=this.$normalizePath;typeof e.supports!="undefined"&&e.supports.indexOf("ucjs2-pinf-0")>=0?i=e.nameToUrl("ace/worker/worker_sourcemint"):(e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),i=o(e.toUrl("ace/worker/worker",null,"_")));var u={};t.forEach(function(t){u[t]=o(e.toUrl(t,null,"_").replace(/.js(\?.*)?$/,""))})}this.$worker=new Worker(i),this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onerror=this.onError,this.$worker.onmessage=this.onMessage};(function(){r.implement(this,i),this.onError=function(e){throw window.console&&console.log&&console.log(e),e},this.onMessage=function(e){var t=e.data;switch(t.type){case"log":window.console&&console.log&&console.log.apply(console,t.data);break;case"event":this._emit(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id])}},this.$normalizePath=function(e){return location.host?(e=e.replace(/^[a-z]+:\/\/[^\/]+/,""),e=location.protocol+"//"+location.host+(e.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+e.replace(/^[\/]+/,""),e):e},this.terminate=function(){this._emit("terminate",{}),this.$worker.terminate(),this.$worker=null,this.$doc.removeEventListener("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){e.range={start:e.data.range.start,end:e.data.range.end},this.emit("change",e)}}).call(o.prototype);var u=function(e,t,n){this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,o=Object.create(i),u=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){u.messageBuffer.push(e),r&&setTimeout(a)};var a=function(){var e=u.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&o._emit(e.event,e.data)};o.postMessage=function(e){u.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},s.loadModule(["worker",t],function(e){r=new e[n](o);while(u.messageBuffer.length)a()})};u.prototype=o.prototype,t.UIWorkerClient=u,t.WorkerClient=o}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session,i=this.$pos;this.pos=t.createAnchor(i.row,i.column),this.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.pos.on("change",function(t){n.removeMarker(e.markerId),e.markerId=n.addMarker(new r(t.value.row,t.value.column,t.value.row,t.value.column+e.length),e.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1),n.on("change",function(i){e.removeMarker(n.markerId),n.markerId=e.addMarker(new r(i.value.row,i.value.column,i.value.row,i.value.column+t.length),t.othersClass,null,!1)})})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e<this.others.length;e++)this.session.removeMarker(this.others[e].markerId)},this.onUpdate=function(e){var t=e.data,n=t.range;if(n.start.row!==n.end.row)return;if(n.start.row!==this.pos.row)return;if(this.$updating)return;this.$updating=!0;var i=t.action==="insertText"?n.end.column-n.start.column:n.start.column-n.end.column;if(n.start.column>=this.pos.column&&n.start.column<=this.pos.column+this.length+1){var s=n.start.column-this.pos.column;this.length+=i;if(!this.session.$fromUndo){if(t.action==="insertText")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.insert(a,t.text)}else if(t.action==="removeText")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.remove(new r(a.row,a.column,a.row,a.column-i))}n.start.column===this.pos.column&&t.action==="insertText"?setTimeout(function(){this.pos.setPosition(this.pos.row,this.pos.column-i);for(var e=0;e<this.others.length;e++){var t=this.others[e],r={row:t.row,column:t.column-i};t.row===n.start.row&&n.start.column<t.column&&(r.column+=i),t.setPosition(r.row,r.column)}}.bind(this),0):n.start.column===this.pos.column&&t.action==="removeText"&&setTimeout(function(){for(var e=0;e<this.others.length;e++){var t=this.others[e];t.row===n.start.row&&n.start.column<t.column&&t.setPosition(t.row,t.column-i)}}.bind(this),0)}this.pos._emit("change",{value:this.pos});for(var o=0;o<this.others.length;o++)this.others[o]._emit("change",{value:this.others[o]})}this.$updating=!1},this.onCursorChange=function(e){if(this.$updating)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.pos.detach();for(var e=0;e<this.others.length;e++)this.others[e].detach();this.session.setUndoSelect(!0)},this.cancel=function(){if(this.$undoStackDepth===-1)throw Error("Canceling placeholders only supported with undo manager attached to session.");var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n<t;n++)e.undo(!0)}}).call(o.prototype),t.PlaceHolder=o}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++t<a){var c=e.getLine(t).search(i);if(c==-1)continue;if(c<=o)break;l=t}if(l>f){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=this.getFoldWidget(e,u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm .ace_scroller {background-color: #FFFFFF;}.ace-tm .ace_cursor {border-left: 2px solid black;}.ace-tm .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_markup.ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});
+ (function() {
+ ace.require(["ace/ace"], function(a) {
+ a && a.config.init();
+ if (!window.ace)
+ window.ace = {};
+ for (var key in a) if (a.hasOwnProperty(key))
+ ace[key] = a[key];
+ });
+ })();
+
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/ext-textarea.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1 @@
+ace.define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate","ace/mode/text"],function(e,t,n){function a(e,t){for(var n in t)e.style[n]=t[n]}function f(e,t){if(e.type!="textarea")throw"Textarea required!";var n=e.parentNode,i=document.createElement("div"),s=function(){var t="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(n){t+=n+":"+u(e,i,n)+";"});var n=u(e,i,"width")||e.clientWidth+"px",r=u(e,i,"height")||e.clientHeight+"px";t+="height:"+r+";width:"+n+";",t+="display:inline-block;",i.setAttribute("style",t)};r.addListener(window,"resize",s),s(),n.insertBefore(i,e.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var o=n.onsubmit;n.onsubmit=function(n){e.value=t(),o&&o.call(this,n)};break}n=n.parentNode}return i}function l(t,n,r){s.loadScript(t,function(){e([n],r)})}function c(n,r,i,s,o,u){function c(e){return e==="true"||e==1}var a=n.getSession(),f=n.renderer;u=u||l,n.setDisplaySettings=function(e){e==null&&(e=i.style.display=="none"),e?(i.style.display="block",i.hideButton.focus(),n.on("focus",function t(){n.removeListener("focus",t),i.style.display="none"})):n.focus()},n.setOption=function(t,i){if(o[t]==i)return;switch(t){case"gutter":f.setShowGutter(c(i));break;case"mode":i!="text"?u("mode-"+i+".js","ace/mode/"+i,function(){var t=e("../mode/"+i).Mode;a.setMode(new t)}):a.setMode(new(e("../mode/text").Mode));break;case"theme":i!="textmate"?u("theme-"+i+".js","ace/theme/"+i,function(){n.setTheme("ace/theme/"+i)}):n.setTheme("ace/theme/textmate");break;case"fontSize":r.style.fontSize=i;break;case"keybindings":switch(i){case"vim":n.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":n.setKeyboardHandler("ace/keyboard/emacs");break;default:n.setKeyboardHandler(null)}break;case"softWrap":switch(i){case"off":a.setUseWrapMode(!1),f.setPrintMarginColumn(80);break;case"40":a.setUseWrapMode(!0),a.setWrapLimitRange(40,40),f.setPrintMarginColumn(40);break;case"80":a.setUseWrapMode(!0),a.setWrapLimitRange(80,80),f.setPrintMarginColumn(80);break;case"free":a.setUseWrapMode(!0),a.setWrapLimitRange(null,null),f.setPrintMarginColumn(80)}break;case"useSoftTabs":a.setUseSoftTabs(c(i));break;case"showPrintMargin":f.setShowPrintMargin(c(i));break;case"showInvisibles":n.setShowInvisibles(c(i))}o[t]=i},n.getOption=function(e){return o[e]},n.getOptions=function(){return o};for(var h in t.options)n.setOption(h,t.options[h]);return n}function h(e,t,n,i){function f(e,t,n,r){if(!n){e.push("<input type='checkbox' title='",t,"' ",r=="true"?"checked='true'":"","'></input>");return}e.push("<select title='"+t+"'>");for(var i in n)e.push("<option value='"+i+"' "),r==i&&e.push(" selected "),e.push(">",n[i],"</option>");e.push("</select>")}var s=null,o={mode:"Mode:",gutter:"Display Gutter:",theme:"Theme:",fontSize:"Font Size:",softWrap:"Soft Wrap:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"},u={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},gutter:s,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},softWrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:s,useSoftTabs:s,showInvisibles:s},a=[];a.push("<table><tr><th>Setting</th><th>Value</th></tr>");for(var l in i)a.push("<tr><td>",o[l],"</td>"),a.push("<td>"),f(a,l,u[l],i[l]),a.push("</td></tr>");a.push("</table>"),e.innerHTML=a.join("");var c=function(e){var t=e.currentTarget;n.setOption(t.title,t.value)},h=function(e){var t=e.currentTarget;n.setOption(t.title,t.checked)},p=e.getElementsByTagName("select");for(var d=0;d<p.length;d++)p[d].onchange=c;var v=e.getElementsByTagName("input");for(var d=0;d<v.length;d++)v[d].onclick=h;var m=document.createElement("input");m.type="button",m.value="Hide",r.addListener(m,"click",function(){n.setDisplaySettings(!1)}),e.appendChild(m),e.hideButton=m}var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/net"),o=e("../ace");e("../theme/textmate"),n.exports=t=o;var u=function(e,t,n){var r=e.style[n];r||(window.getComputedStyle?r=window.getComputedStyle(e,"").getPropertyValue(n):r=e.currentStyle[n]);if(!r||r=="auto"||r=="intrinsic")r=t.style[n];return r};t.transformTextarea=function(e,t){var n,s=f(e,function(){return n.getValue()});e.style.display="none",s.style.background="white";var u=document.createElement("div");a(u,{top:"0px",left:"0px",right:"0px",bottom:"0px",border:"1px solid gray",position:"absolute"}),s.appendChild(u);var l=document.createElement("div");a(l,{position:"absolute",right:"0px",bottom:"0px",background:"red",cursor:"nw-resize",borderStyle:"solid",borderWidth:"9px 8px 10px 9px",width:"2px",borderColor:"lightblue gray gray lightblue",zIndex:101});var p=document.createElement("div"),d={top:"0px",left:"20%",right:"0px",bottom:"0px",position:"absolute",padding:"5px",zIndex:100,color:"white",display:"none",overflow:"auto",fontSize:"14px",boxShadow:"-5px 2px 3px gray"};i.isOldIE?d.backgroundColor="#333":d.backgroundColor="rgba(0, 0, 0, 0.6)",a(p,d),s.appendChild(p);var v={},m=o.edit(u);n=m.getSession(),n.setValue(e.value||e.innerHTML),m.focus(),s.appendChild(l),c(m,u,p,o,v,t),h(p,l,m,v);var g="";return r.addListener(l,"mousemove",function(e){var t=this.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;n+r<(t.width+t.height)/2?(this.style.cursor="pointer",g="toggle"):(g="resize",this.style.cursor="nw-resize")}),r.addListener(l,"mousedown",function(e){if(g=="toggle"){m.setDisplaySettings();return}s.style.zIndex=1e5;var t=s.getBoundingClientRect(),n=t.width+t.left-e.clientX,i=t.height+t.top-e.clientY;r.capture(l,function(e){s.style.width=e.clientX-t.left+n+"px",s.style.height=e.clientY-t.top+i+"px",m.resize()},function(){})}),m},t.options={mode:"text",theme:"textmate",gutter:"false",fontSize:"12px",softWrap:"off",keybindings:"ace",showPrintMargin:"false",useSoftTabs:"true",showInvisibles:"false"}})
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/mode-json.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1 @@
+ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){var r=e("../lib/oop"),i=e("./text").Mode,s=e("../tokenizer").Tokenizer,o=e("./json_highlight_rules").JsonHighlightRules,u=e("./matching_brace_outdent").MatchingBraceOutdent,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=e("../worker/worker_client").WorkerClient,c=function(){this.$tokenizer=new s((new o).getRules()),this.$outdent=new u,this.$behaviour=new a,this.foldingRules=new f};r.inherits(c,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new l(["ace"],"ace/mode/json_worker","JsonWorker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations([t.data])}),t.on("ok",function(){e.clearAnnotations()}),t}}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f=0,l=-1,c="",h=0,p=-1,d="",v="",m=function(){m.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},m.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},m.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,c[0])||(f=0),l=r.row,c=n+i.substr(r.column),f++},m.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(h=0),p=r.row,d=i.substr(0,r.column)+n,v=i.substr(r.column),h++},m.isAutoInsertedClosing=function(e,t,n){return f>0&&e.row===l&&n===c[0]&&t.substr(e.column)===c},m.isMaybeInsertedClosing=function(e,t){return h>0&&e.row===p&&t.substr(e.column)===v&&t.substr(0,e.column)==d},m.popAutoInsertedClosing=function(){c=c.substr(1),f--},m.clearMaybeInsertedClosing=function(){h=0,p=-1},this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){var a=n.getSelectionRange(),f=r.doc.getTextRange(a);if(f!==""&&f!=="{"&&n.getWrapBehavioursEnabled())return{text:"{"+f+"}",selection:!1};if(m.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])?(m.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(m.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){var l=u.substring(s.column,s.column+1);if(l=="}"){var c=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(c!==null&&m.isAutoInsertedClosing(s,u,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else if(i=="\n"||i=="\r\n"){var p="";m.isMaybeInsertedClosing(s,u)&&(p=o.stringRepeat("}",h),m.clearMaybeInsertedClosing());var l=u.substring(s.column,s.column+1);if(l=="}"||p!==""){var d=r.findMatchingBracket({row:s.row,column:s.column},"}");if(!d)return null;var v=this.getNextLineIndent(e,u.substring(0,s.column),r.getTabString()),g=this.$getIndent(u);return{text:"\n"+v+"\n"+g+p,selection:[1,v.length,1,v.length]}}}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;h--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return{text:"("+o+")",selection:!1};if(m.isSaneInsertion(n,r))return m.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&m.isAutoInsertedClosing(u,a,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return{text:"["+o+"]",selection:!1};if(m.isSaneInsertion(n,r))return m.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&m.isAutoInsertedClosing(u,a,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return{text:s+u+s,selection:!1};var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column);if(l=="\\")return null;var c=r.getTokens(o.start.row),h=0,p,d=-1;for(var v=0;v<c.length;v++){p=c[v],p.type=="string"?d=-1:d<0&&(d=p.value.indexOf(s));if(p.value.length+h>o.start.column)break;h+=c[v].value.length}if(!p||d<0&&p.type!=="comment"&&(p.type!=="string"||o.start.column!==p.value.length+h-1&&p.value.lastIndexOf(s)===p.value.length-1)){if(!m.isSaneInsertion(n,r))return;return{text:s+s,selection:[1,1]}}if(p&&p.type==="string"){var g=f.substring(a.column,a.column+1);if(g==s)return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};r.inherits(m,i),t.CstyleBehaviour=m}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i){var s=i.index;return i[1]?this.openingBracketBlock(e,i[1],n,s):e.getCommentFoldRange(n,s+i[0].length,1)}if(t!=="markbeginend")return;var i=r.match(this.foldingStopMarker);if(i){var s=i.index+i[0].length;return i[1]?this.closingBracketBlock(e,i[1],n,s):e.getCommentFoldRange(n,s,-1)}}}.call(o.prototype)})
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/theme-twilight.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1 @@
+ace.define("ace/theme/twilight",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-twilight",t.cssText=".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight .ace_scroller {background-color: #141414}.ace-twilight .ace_text-layer {color: #F8F8F8}.ace-twilight .ace_cursor {border-left: 2px solid #A7A7A7}.ace-twilight .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;border-radius: 2px}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_markup.ace_underline {text-decoration: underline}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERH5zzBz5sz/AA5EBAYqeZXWAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/theme-xcode.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1 @@
+ace.define("ace/theme/xcode",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */.ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode .ace_scroller {background-color: #FFFFFF}.ace-xcode .ace_text-layer {color: #000000}.ace-xcode .ace_cursor {border-left: 2px solid #000000}.ace-xcode .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y;}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/ace/worker-json.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1 @@
+"no use strict";(function(e){if(typeof e.window!="undefined"&&e.document)return;e.console={log:function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},error:function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})}},e.window=e,e.ace=e,e.normalizeModule=function(e,t){if(t.indexOf("!")!==-1){var n=t.split("!");return normalizeModule(e,n[0])+"!"+normalizeModule(e,n[1])}if(t.charAt(0)=="."){var r=e.split("/").slice(0,-1).join("/");t=r+"/"+t;while(t.indexOf(".")!==-1&&i!=t){var i=t;t=t.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return t},e.require=function(e,t){if(!t.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");t=normalizeModule(e,t);var n=require.modules[t];if(n)return n.initialized||(n.initialized=!0,n.exports=n.factory().exports),n.exports;var r=t.split("/");r[0]=require.tlns[r[0]]||r[0];var i=r.join("/")+".js";return require.id=t,importScripts(i),require(e,t)},require.modules={},require.tlns={},e.define=function(e,t,n){arguments.length==2?(n=t,typeof e!="string"&&(t=e,e=require.id)):arguments.length==1&&(n=e,e=require.id);if(e.indexOf("text!")===0)return;var r=function(t,n){return require(e,t,n)};require.modules[e]={factory:function(){var e={exports:{}},t=n(r,e.exports,e);return t&&(e.exports=t),e}}},e.initBaseUrls=function(t){require.tlns=t},e.initSender=function(){var t=require(null,"ace/lib/event_emitter").EventEmitter,n=require(null,"ace/lib/oop"),r=function(){};return function(){n.implement(this,t),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(r.prototype),new r},e.main=null,e.sender=null,e.onmessage=function(e){var t=e.data;if(t.command){if(!main[t.command])throw new Error("Unknown command:"+t.command);main[t.command].apply(main,t.args)}else if(t.init){initBaseUrls(t.tlns),require(null,"ace/lib/fixoldbrowsers"),sender=initSender();var n=require(null,t.module)[t.classname];main=new n(sender)}else t.event&&sender&&sender._emit(t.event,t.data)}})(this),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(e,t,n){e("./regexp"),e("./es5-shim")}),ace.define("ace/lib/regexp",["require","exports","module"],function(e,t,n){function r(e){return(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":"")}function i(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}var s={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},o=s.exec.call(/()??/,"")[1]===undefined,u=function(){var e=/^/g;return s.test.call(e,""),!e.lastIndex}();if(u&&o)return;RegExp.prototype.exec=function(e){var t=s.exec.apply(this,arguments),n,a;if(typeof e=="string"&&t){!o&&t.length>1&&i(t,"")>-1&&(a=RegExp(this.source,s.replace.call(r(this),"g","")),s.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===undefined&&(t[e]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)n=this._xregexp.captureNames[f-1],n&&(t[n]=t[f]);!u&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},u||(RegExp.prototype.test=function(e){var t=s.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function i(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function s(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function o(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function u(e){var t,n,r;if(o(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(o(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(o(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if(typeof t!="function")throw new TypeError("Function.prototype.bind called on incompatible "+t);var n=c.call(arguments,1),i=function(){if(this instanceof i){var r=t.apply(this,n.concat(c.call(arguments)));return Object(r)===r?r:this}return t.apply(e,n.concat(c.call(arguments)))};return t.prototype&&(r.prototype=t.prototype,i.prototype=new r,r.prototype=null),i});var a=Function.prototype.call,f=Array.prototype,l=Object.prototype,c=f.slice,h=a.bind(l.toString),p=a.bind(l.hasOwnProperty),d,v,m,g,y;if(y=p(l,"__defineGetter__"))d=a.bind(l.__defineGetter__),v=a.bind(l.__defineSetter__),m=a.bind(l.__lookupGetter__),g=a.bind(l.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=c.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),u=e+o,a=u+s-o,f=n-u,l=n-o;if(a<u)for(var h=0;h<f;++h)this[a+h]=this[u+h];else if(a>u)for(h=f;h--;)this[a+h]=this[u+h];if(s&&e===l)this.length=l,this.push.apply(this,i);else{this.length=l+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var b=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?b.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(c.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(e){return h(e)=="[object Array]"});var w=Object("a"),E=w[0]!="a"||!(0 in w);Array.prototype.forEach||(Array.prototype.forEach=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=arguments[1],i=-1,s=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError;while(++i<s)i in n&&e.call(r,n[i],i,t)}),Array.prototype.map||(Array.prototype.map=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=Array(r),s=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var o=0;o<r;o++)o in n&&(i[o]=e.call(s,n[o],o,t));return i}),Array.prototype.filter||(Array.prototype.filter=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=[],s,o=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var u=0;u<r;u++)u in n&&(s=n[u],e.call(o,s,u,t)&&i.push(s));return i}),Array.prototype.every||(Array.prototype.every=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var s=0;s<r;s++)if(s in n&&!e.call(i,n[s],s,t))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var s=0;s<r;s++)if(s in n&&e.call(i,n[s],s,t))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");if(!r&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var i=0,s;if(arguments.length>=2)s=arguments[1];else do{if(i in n){s=n[i++];break}if(++i>=r)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;i<r;i++)i in n&&(s=e.call(void 0,s,n[i],i,t));return s}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");if(!r&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var i,s=r-1;if(arguments.length>=2)i=arguments[1];else do{if(s in n){i=n[s--];break}if(--s<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do s in this&&(i=e.call(void 0,i,n[s],s,t));while(s--);return i});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(e){var t=E&&h(this)=="[object String]"?this.split(""):F(this),n=t.length>>>0;if(!n)return-1;var r=0;arguments.length>1&&(r=s(arguments[1])),r=r>=0?r:Math.max(0,n+r);for(;r<n;r++)if(r in t&&t[r]===e)return r;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(e){var t=E&&h(this)=="[object String]"?this.split(""):F(this),n=t.length>>>0;if(!n)return-1;var r=n-1;arguments.length>1&&(r=Math.min(r,s(arguments[1]))),r=r>=0?r:n-Math.abs(r);for(;r>=0;r--)if(r in t&&e===t[r])return r;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__||(e.constructor?e.constructor.prototype:l)});if(!Object.getOwnPropertyDescriptor){var S="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(e,t){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError(S+e);if(!p(e,t))return;var n,r,i;n={enumerable:!0,configurable:!0};if(y){var s=e.__proto__;e.__proto__=l;var r=m(e,t),i=g(e,t);e.__proto__=s;if(r||i)return r&&(n.get=r),i&&(n.set=i),n}return n.value=e[t],n}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(e){return Object.keys(e)});if(!Object.create){var x;Object.prototype.__proto__===null?x=function(){return{__proto__:null}}:x=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(e,t){var n;if(e===null)n=x();else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return t!==void 0&&Object.defineProperties(n,t),n}}if(Object.defineProperty){var T=i({}),N=typeof document=="undefined"||i(document.createElement("div"));if(!T||!N)var C=Object.defineProperty}if(!Object.defineProperty||C){var k="Property description must be an object: ",L="Object.defineProperty called on non-object: ",A="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(e,t,n){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError(L+e);if(typeof n!="object"&&typeof n!="function"||n===null)throw new TypeError(k+n);if(C)try{return C.call(Object,e,t,n)}catch(r){}if(p(n,"value"))if(y&&(m(e,t)||g(e,t))){var i=e.__proto__;e.__proto__=l,delete e[t],e[t]=n.value,e.__proto__=i}else e[t]=n.value;else{if(!y)throw new TypeError(A);p(n,"get")&&d(e,t,n.get),p(n,"set")&&v(e,t,n.set)}return e}}Object.defineProperties||(Object.defineProperties=function(e,t){for(var n in t)p(t,n)&&Object.defineProperty(e,n,t[n]);return e}),Object.seal||(Object.seal=function(e){return e}),Object.freeze||(Object.freeze=function(e){return e});try{Object.freeze(function(){})}catch(O){Object.freeze=function(e){return function(t){return typeof t=="function"?t:e(t)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(e){return e}),Object.isSealed||(Object.isSealed=function(e){return!1}),Object.isFrozen||(Object.isFrozen=function(e){return!1}),Object.isExtensible||(Object.isExtensible=function(e){if(Object(e)===e)throw new TypeError;var t="";while(p(e,t))t+="?";e[t]=!0;var n=p(e,t);return delete e[t],n});if(!Object.keys){var M=!0,_=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],D=_.length;for(var P in{toString:null})M=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)p(e,t)&&I.push(t);if(M)for(var n=0,r=D;n<r;n++){var i=_[n];p(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var H=" \n\f\r \u2028\u2029";if(!String.prototype.trim||H.trim()){H="["+H+"]";var B=new RegExp("^"+H+H+"*"),j=new RegExp(H+H+"*$");String.prototype.trim=function(){return String(this).replace(B,"").replace(j,"")}}var F=function(e){if(e==null)throw new TypeError("can't convert "+e+" to object");return Object(e)}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),t.target||(t.target=this);for(var o=0;o<n.length;o++){n[o](t);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;for(var r=0;r<n.length;r++)n[r](t)},r.once=function(e,t){var n=this,r=function(){fun&&fun.apply(null,arguments),n.removeEventListener(event,r)};this.addEventListener(event,r)},r.setDefaultHandler=function(e,t){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[e])throw new Error("The default handler for '"+e+"' is already set");this._defaultHandlers[e]=t},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?"unshift":"push"](t),t},r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){t.inherits=function(){var e=function(){};return function(t,n){e.prototype=n.prototype,t.super_=n.prototype,t.prototype=new e,t.prototype.constructor=t}}(),t.mixin=function(e,t){for(var n in t)e[n]=t[n]},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"],function(e,t,n){var r=e("../lib/oop"),i=e("../worker/mirror").Mirror,s=e("./json/json_parse"),o=t.JsonWorker=function(e){i.call(this,e),this.setTimeout(200)};r.inherits(o,i),function(){this.onUpdate=function(){var e=this.doc.getValue();try{var t=s(e)}catch(n){var r=this.doc.indexToPosition(n.at-1);this.sender.emit("error",{row:r.row,column:r.column,text:n.message,type:"error"});return}this.sender.emit("ok")}}.call(o.prototype)}),ace.define("ace/worker/mirror",["require","exports","module","ace/document","ace/lib/lang"],function(e,t,n){var r=e("../document").Document,i=e("../lib/lang"),s=t.Mirror=function(e){this.sender=e;var t=this.doc=new r(""),n=this.deferredUpdate=i.delayedCall(this.onUpdate.bind(this)),s=this;e.on("change",function(e){t.applyDeltas([e.data]),n.schedule(s.$timeout)})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./range").Range,o=e("./anchor").Anchor,u=function(e){this.$lines=[],e.length==0?this.$lines=[""]:Array.isArray(e)?this.insertLines(0,e):this.insert({row:0,column:0},e)};(function(){r.implement(this,i),this.setValue=function(e){var t=this.getLength();this.remove(new s(0,0,t,this.getLine(t-1).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},"aaa".split(/a/).length==0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){if(e.start.row==e.end.row)return this.$lines[e.start.row].substring(e.start.column,e.end.column);var t=this.getLines(e.start.row+1,e.end.row-1);return t.unshift((this.$lines[e.start.row]||"").substring(e.start.column)),t.push((this.$lines[e.end.row]||"").substring(0,e.end.column)),t.join(this.getNewLineCharacter())},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t&&(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length),e},this.insert=function(e,t){if(!t||t.length===0)return e;e=this.$clipPosition(e),this.getLength()<=1&&this.$detectNewLine(t);var n=this.$split(t),r=n.splice(0,1)[0],i=n.length==0?null:n.splice(n.length-1,1)[0];return e=this.insertInLine(e,r),i!==null&&(e=this.insertNewLine(e),e=this.insertLines(e.row,n),e=this.insertInLine(e,i||"")),e},this.insertLines=function(e,t){if(t.length==0)return{row:e,column:0};if(t.length>65535){var n=this.insertLines(e,t.slice(65535));t=t.slice(0,65535)}var r=[e,0];r.push.apply(r,t),this.$lines.splice.apply(this.$lines,r);var i=new s(e,0,e+t.length,0),o={action:"insertLines",range:i,lines:t};return this._emit("change",{data:o}),n||i.end},this.insertNewLine=function(e){e=this.$clipPosition(e);var t=this.$lines[e.row]||"";this.$lines[e.row]=t.substring(0,e.column),this.$lines.splice(e.row+1,0,t.substring(e.column,t.length));var n={row:e.row+1,column:0},r={action:"insertText",range:s.fromPoints(e,n),text:this.getNewLineCharacter()};return this._emit("change",{data:r}),n},this.insertInLine=function(e,t){if(t.length==0)return e;var n=this.$lines[e.row]||"";this.$lines[e.row]=n.substring(0,e.column)+t+n.substring(e.column);var r={row:e.row,column:e.column+t.length},i={action:"insertText",range:s.fromPoints(e,r),text:t};return this._emit("change",{data:i}),r},this.remove=function(e){e.start=this.$clipPosition(e.start),e.end=this.$clipPosition(e.end);if(e.isEmpty())return e.start;var t=e.start.row,n=e.end.row;if(e.isMultiLine()){var r=e.start.column==0?t:t+1,i=n-1;e.end.column>0&&this.removeInLine(n,0,e.end.column),i>=r&&this.removeLines(r,i),r!=t&&(this.removeInLine(t,e.start.column,this.getLine(t).length),this.removeNewLine(e.start.row))}else this.removeInLine(t,e.start.column,e.end.column);return e.start},this.removeInLine=function(e,t,n){if(t==n)return;var r=new s(e,t,e,n),i=this.getLine(e),o=i.substring(t,n),u=i.substring(0,t)+i.substring(n,i.length);this.$lines.splice(e,1,u);var a={action:"removeText",range:r,text:o};return this._emit("change",{data:a}),r.start},this.removeLines=function(e,t){var n=new s(e,0,t+1,0),r=this.$lines.splice(e,t-e+1),i={action:"removeLines",range:n,nl:this.getNewLineCharacter(),lines:r};return this._emit("change",{data:i}),r},this.removeNewLine=function(e){var t=this.getLine(e),n=this.getLine(e+1),r=new s(e,t.length,e+1,0),i=t+n;this.$lines.splice(e,2,i);var o={action:"removeText",range:r,text:this.getNewLineCharacter()};this._emit("change",{data:o})},this.replace=function(e,t){if(t.length==0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);if(t)var n=this.insert(e.start,t);else n=e.start;return n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.insertLines(r.start.row,n.lines):n.action=="insertText"?this.insert(r.start,n.text):n.action=="removeLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="removeText"&&this.remove(r)}},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="insertText"?this.remove(r):n.action=="removeLines"?this.insertLines(r.start.row,n.lines):n.action=="removeText"&&this.insert(r.start,n.text)}},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length;return i+r*o+e.column}}).call(u.prototype),t.Document=u}),ace.define("ace/range",["require","exports","module"],function(e,t,n){var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,t.Range=i}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.document=e,typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n),this.$onChange=this.onChange.bind(this),e.on("change",this.$onChange)};(function(){r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(e){var t=e.data,n=t.range;if(n.start.row==n.end.row&&n.start.row!=this.row)return;if(n.start.row>this.row)return;if(n.start.row==this.row&&n.start.column>this.column)return;var r=this.row,i=this.column;t.action==="insertText"?n.start.row===r&&n.start.column<=i?n.start.row===n.end.row?i+=n.end.column-n.start.column:(i-=n.start.column,r+=n.end.row-n.start.row):n.start.row!==n.end.row&&n.start.row<r&&(r+=n.end.row-n.start.row):t.action==="insertLines"?n.start.row<=r&&(r+=n.end.row-n.start.row):t.action=="removeText"?n.start.row==r&&n.start.column<i?n.end.column>=i?i=n.start.column:i=Math.max(0,i-(n.end.column-n.start.column)):n.start.row!==n.end.row&&n.start.row<r?(n.end.row==r&&(i=Math.max(0,i-n.end.column)+n.start.column),r-=n.end.row-n.start.row):n.end.row==r&&(r-=n.end.row-n.start.row,i=Math.max(0,i-n.end.column)+n.start.column):t.action=="removeLines"&&n.start.row<=r&&(n.end.row<=r?r-=n.end.row-n.start.row:(r=n.start.row,i=0)),this.setPosition(r,i,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._emit("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]=="object"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function(e){if(typeof e!="object")return e;var t=e.constructor();for(var n in e)typeof e[n]=="object"?t[n]=this.deepCopy(e[n]):t[n]=e[n];return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},t.escapeHTML=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)};return i.delay=i,i.schedule=function(e){n==null&&(n=setTimeout(r,e||0))},i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),ace.define("ace/mode/json/json_parse",["require","exports","module"],function(e,t,n){var r,i,s={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:"\n",r:"\r",t:" "},o,u=function(e){throw{name:"SyntaxError",message:e,at:r,text:o}},a=function(e){return e&&e!==i&&u("Expected '"+e+"' instead of '"+i+"'"),i=o.charAt(r),r+=1,i},f=function(){var e,t="";i==="-"&&(t="-",a("-"));while(i>="0"&&i<="9")t+=i,a();if(i==="."){t+=".";while(a()&&i>="0"&&i<="9")t+=i}if(i==="e"||i==="E"){t+=i,a();if(i==="-"||i==="+")t+=i,a();while(i>="0"&&i<="9")t+=i,a()}e=+t;if(!isNaN(e))return e;u("Bad number")},l=function(){var e,t,n="",r;if(i==='"')while(a()){if(i==='"')return a(),n;if(i==="\\"){a();if(i==="u"){r=0;for(t=0;t<4;t+=1){e=parseInt(a(),16);if(!isFinite(e))break;r=r*16+e}n+=String.fromCharCode(r)}else{if(typeof s[i]!="string")break;n+=s[i]}}else n+=i}u("Bad string")},c=function(){while(i&&i<=" ")a()},h=function(){switch(i){case"t":return a("t"),a("r"),a("u"),a("e"),!0;case"f":return a("f"),a("a"),a("l"),a("s"),a("e"),!1;case"n":return a("n"),a("u"),a("l"),a("l"),null}u("Unexpected '"+i+"'")},p,d=function(){var e=[];if(i==="["){a("["),c();if(i==="]")return a("]"),e;while(i){e.push(p()),c();if(i==="]")return a("]"),e;a(","),c()}}u("Bad array")},v=function(){var e,t={};if(i==="{"){a("{"),c();if(i==="}")return a("}"),t;while(i){e=l(),c(),a(":"),Object.hasOwnProperty.call(t,e)&&u('Duplicate key "'+e+'"'),t[e]=p(),c();if(i==="}")return a("}"),t;a(","),c()}}u("Bad object")};return p=function(){c();switch(i){case"{":return v();case"[":return d();case'"':return l();case"-":return f();default:return i>="0"&&i<="9"?f():h()}},function(e,t){var n;return o=e,r=0,i=" ",n=p(),c(),i&&u("Syntax error"),typeof t=="function"?function s(e,n){var r,i,o=e[n];if(o&&typeof o=="object")for(r in o)Object.hasOwnProperty.call(o,r)&&(i=s(o,r),i!==undefined?o[r]=i:delete o[r]);return t.call(e,n,o)}({"":n},""):n}})
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/LICENSE Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,37 @@
+License Disclaimer:
+
+All contents of this directory are Copyright (c) the Dojo Foundation, with the
+following exceptions:
+-------------------------------------------------------------------------------
+
+firebug.html, firebug.js, errIcon.png, infoIcon.png, warningIcon.png:
+ * Copyright (c) 2006-2007, Joe Hewitt, All rights reserved.
+ Distributed under the terms of the BSD License (see below)
+
+-------------------------------------------------------------------------------
+
+Copyright (c) 2006-2007, Joe Hewitt
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the Dojo Foundation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/errorIcon.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,208 @@
+.firebug {
+ margin: 0;
+ background:#fff;
+ font-family: Lucida Grande, Tahoma, sans-serif;
+ font-size: 11px;
+ overflow: hidden;
+ border: 1px solid black;
+ position: relative;
+}
+.firebug a {
+ text-decoration: none;
+}
+.firebug a:hover {
+ text-decoration: underline;
+}
+.firebug a:visited{
+ color:#0000FF;
+}
+.firebug #firebugToolbar {
+ height: 18px;
+ line-height:18px;
+ border-top: 1px solid ThreeDHighlight;
+ border-bottom: 1px solid ThreeDShadow;
+ padding: 2px 6px;
+
+ background:#f0f0f0;
+}
+.firebug #firebugLog, .firebug #objectLog {
+ overflow: auto;
+ position: absolute;
+ left: 0;
+ width: 100%;
+}
+#objectLog{
+ overflow:scroll;
+ height:258px;
+}
+.firebug #firebugCommandLine {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 18px;
+ border: none;
+ border-top: 1px solid ThreeDShadow;
+}
+.firebug .logRow {
+ position: relative;
+ border-bottom: 1px solid #D7D7D7;
+ padding: 2px 4px 1px 6px;
+ background-color: #FFFFFF;
+}
+.firebug .logRow-command {
+ font-family: Monaco, monospace;
+ color: blue;
+}
+.firebug .objectBox-null {
+ padding: 0 2px;
+ border: 1px solid #666666;
+ background-color: #888888;
+ color: #FFFFFF;
+}
+.firebug .objectBox-string {
+ font-family: Monaco, monospace;
+ color: red;
+ white-space: pre;
+}
+.firebug .objectBox-number {
+ color: #000088;
+}
+.firebug .objectBox-function {
+ font-family: Monaco, monospace;
+ color: DarkGreen;
+}
+.firebug .objectBox-object {
+ color: DarkGreen;
+ font-weight: bold;
+}
+.firebug .logRow-info,
+.firebug .logRow-error,
+.firebug .logRow-warning
+ {
+ background: #00FFFF no-repeat 2px 2px;
+ padding-left: 20px;
+ padding-bottom: 3px;
+}
+.firebug .logRow-info {
+ background: #FFF url(infoIcon.png) no-repeat 2px 2px;
+ padding-left: 20px;
+ padding-bottom: 3px;
+}
+.firebug .logRow-warning {
+
+ background: #00FFFF url(warningIcon.png) no-repeat 2px 2px;
+ padding-left: 20px;
+ padding-bottom: 3px;
+}
+.firebug .logRow-error {
+ background: LightYellow url(errorIcon.png) no-repeat 2px 2px;
+ padding-left: 20px;
+ padding-bottom: 3px;
+}
+.firebug .errorMessage {
+ vertical-align: top;
+ color: #FF0000;
+}
+.firebug .objectBox-sourceLink {
+ position: absolute;
+ right: 4px;
+ top: 2px;
+ padding-left: 8px;
+ font-family: Lucida Grande, sans-serif;
+ font-weight: bold;
+ color: #0000FF;
+}
+.firebug .logRow-group {
+ background: #EEEEEE;
+ border-bottom: none;
+}
+.firebug .logGroup {
+ background: #EEEEEE;
+}
+.firebug .logGroupBox {
+ margin-left: 24px;
+ border-top: 1px solid #D7D7D7;
+ border-left: 1px solid #D7D7D7;
+}
+.firebug .selectorTag,
+.firebug .selectorId,
+.firebug .selectorClass {
+ font-family: Monaco, monospace;
+ font-weight: normal;
+}
+.firebug .selectorTag {
+ color: #0000FF;
+}
+.firebug .selectorId {
+ color: DarkBlue;
+}
+.firebug .selectorClass {
+ color: red;
+}
+.firebug .objectBox-element {
+ font-family: Monaco, monospace;
+ color: #000088;
+}
+.firebug .nodeChildren {
+ margin-left: 16px;
+}
+.firebug .nodeTag {
+ color: blue;
+}
+.firebug .nodeValue {
+ color: #FF0000;
+ font-weight: normal;
+}
+.firebug .nodeText,
+.firebug .nodeComment {
+ margin: 0 2px;
+ vertical-align: top;
+}
+.firebug .nodeText {
+ color: #333333;
+}
+.firebug .nodeComment {
+ color: DarkGreen;
+}
+.firebug .propertyNameCell {
+ vertical-align: top;
+}
+.firebug .propertyName {
+ font-weight: bold;
+}
+#firebugToolbar ul.tabs{
+ margin:0 !important;
+ padding:0;
+}
+#firebugToolbar ul.tabs li{
+ list-style:none;
+ background:transparent url(tab_lft_norm.png) no-repeat left;
+ line-height:18px;
+ float:left;
+ margin-left:5px;
+}
+#firebugToolbar ul.tabs li.right{
+ float:right;
+ margin-right:5px;
+ margin-left:0;
+}
+#firebugToolbar ul.tabs li.gap{
+ margin-left:20px;
+}
+#firebugToolbar .tabs a{
+ text-decoration:none;
+ background:transparent url(tab_rgt_norm.png) no-repeat right;
+ line-height:18px;
+ padding:3px 9px 4px 0px;
+ margin-left:9px;
+ color:#333333;
+}
+#firebugToolbar .tabs li:hover{
+ background:transparent url(tab_lft_over.png) no-repeat left;
+}
+#firebugToolbar .tabs a:hover{
+ text-decoration:none;
+ background:transparent url(tab_rgt_over.png) no-repeat right;
+ color:#FFFFFF;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,898 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+//>>built
+define("dojo/_firebug/firebug",["../_base/kernel","require","../_base/html","../sniff","../_base/array","../_base/lang","../_base/event","../_base/unload"],function(_1,_2,_3,_4){
+var _5=(/Trident/.test(window.navigator.userAgent));
+if(_5){
+var _6=["log","info","debug","warn","error"];
+for(var i=0;i<_6.length;i++){
+var m=_6[i];
+if(!console[m]||console[m]._fake){
+continue;
+}
+var n="_"+_6[i];
+console[n]=console[m];
+console[m]=(function(){
+var _7=n;
+return function(){
+console[_7](Array.prototype.join.call(arguments," "));
+};
+})();
+}
+try{
+console.clear();
+}
+catch(e){
+}
+}
+if(_4("ff")||_4("chrome")||_4("safari")||_5||window.firebug||(typeof console!="undefined"&&console.firebug)||_1.config.useCustomLogger||_4("air")){
+return;
+}
+try{
+if(window!=window.parent){
+if(window.parent["console"]){
+window.console=window.parent.console;
+}
+return;
+}
+}
+catch(e){
+}
+var _8=document;
+var _9=window;
+var _a=0;
+var _b=null;
+var _c=null;
+var _d=null;
+var _e=null;
+var _f=null;
+var _10=null;
+var _11=false;
+var _12=[];
+var _13=[];
+var _14={};
+var _15={};
+var _16=null;
+var _17;
+var _18;
+var _19=false;
+var _1a=null;
+var _1b=document.createElement("div");
+var _1c;
+var _1d;
+window.console={_connects:[],log:function(){
+_1e(arguments,"");
+},debug:function(){
+_1e(arguments,"debug");
+},info:function(){
+_1e(arguments,"info");
+},warn:function(){
+_1e(arguments,"warning");
+},error:function(){
+_1e(arguments,"error");
+},assert:function(_1f,_20){
+if(!_1f){
+var _21=[];
+for(var i=1;i<arguments.length;++i){
+_21.push(arguments[i]);
+}
+_1e(_21.length?_21:["Assertion Failure"],"error");
+throw _20?_20:"Assertion Failure";
+}
+},dir:function(obj){
+var str=_22(obj);
+str=str.replace(/\n/g,"<br />");
+str=str.replace(/\t/g," ");
+_23([str],"dir");
+},dirxml:function(_24){
+var _25=[];
+_26(_24,_25);
+_23(_25,"dirxml");
+},group:function(){
+_23(arguments,"group",_27);
+},groupEnd:function(){
+_23(arguments,"",_28);
+},time:function(_29){
+_14[_29]=new Date().getTime();
+},timeEnd:function(_2a){
+if(_2a in _14){
+var _2b=(new Date()).getTime()-_14[_2a];
+_1e([_2a+":",_2b+"ms"]);
+delete _14[_2a];
+}
+},count:function(_2c){
+if(!_15[_2c]){
+_15[_2c]=0;
+}
+_15[_2c]++;
+_1e([_2c+": "+_15[_2c]]);
+},trace:function(_2d){
+var _2e=_2d||3;
+var f=console.trace.caller;
+for(var i=0;i<_2e;i++){
+var _2f=f.toString();
+var _30=[];
+for(var a=0;a<f.arguments.length;a++){
+_30.push(f.arguments[a]);
+}
+if(f.arguments.length){
+}else{
+}
+f=f.caller;
+}
+},profile:function(){
+this.warn(["profile() not supported."]);
+},profileEnd:function(){
+},clear:function(){
+if(_c){
+while(_c.childNodes.length){
+_1.destroy(_c.firstChild);
+}
+}
+_1.forEach(this._connects,_1.disconnect);
+},open:function(){
+_31(true);
+},close:function(){
+if(_11){
+_31();
+}
+},_restoreBorder:function(){
+if(_1c){
+_1c.style.border=_1d;
+}
+},openDomInspector:function(){
+_19=true;
+_c.style.display="none";
+_16.style.display="block";
+_d.style.display="none";
+document.body.style.cursor="pointer";
+_17=_1.connect(document,"mousemove",function(evt){
+if(!_19){
+return;
+}
+if(!_1a){
+_1a=setTimeout(function(){
+_1a=null;
+},50);
+}else{
+return;
+}
+var _32=evt.target;
+if(_32&&(_1c!==_32)){
+var _33=true;
+console._restoreBorder();
+var _34=[];
+_26(_32,_34);
+_16.innerHTML=_34.join("");
+_1c=_32;
+_1d=_1c.style.border;
+_1c.style.border="#0000FF 1px solid";
+}
+});
+setTimeout(function(){
+_18=_1.connect(document,"click",function(evt){
+document.body.style.cursor="";
+_19=!_19;
+_1.disconnect(_18);
+});
+},30);
+},_closeDomInspector:function(){
+document.body.style.cursor="";
+_1.disconnect(_17);
+_1.disconnect(_18);
+_19=false;
+console._restoreBorder();
+},openConsole:function(){
+_c.style.display="block";
+_16.style.display="none";
+_d.style.display="none";
+console._closeDomInspector();
+},openObjectInspector:function(){
+_c.style.display="none";
+_16.style.display="none";
+_d.style.display="block";
+console._closeDomInspector();
+},recss:function(){
+var i,a,s;
+a=document.getElementsByTagName("link");
+for(i=0;i<a.length;i++){
+s=a[i];
+if(s.rel.toLowerCase().indexOf("stylesheet")>=0&&s.href){
+var h=s.href.replace(/(&|%5C?)forceReload=\d+/,"");
+s.href=h+(h.indexOf("?")>=0?"&":"?")+"forceReload="+new Date().valueOf();
+}
+}
+}};
+function _31(_35){
+_11=_35||!_11;
+if(_b){
+_b.style.display=_11?"block":"none";
+}
+};
+function _36(){
+_31(true);
+if(_f){
+_f.focus();
+}
+};
+function _37(x,y,w,h){
+var win=window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
+if(!win){
+var msg="Firebug Lite could not open a pop-up window, most likely because of a blocker.\n"+"Either enable pop-ups for this domain, or change the djConfig to popup=false.";
+alert(msg);
+}
+_38(win);
+var _39=win.document;
+var _3a="<html style=\"height:100%;\"><head><title>Firebug Lite</title></head>\n"+"<body bgColor=\"#ccc\" style=\"height:97%;\" onresize=\"opener.onFirebugResize()\">\n"+"<div id=\"fb\"></div>"+"</body></html>";
+_39.write(_3a);
+_39.close();
+return win;
+};
+function _38(wn){
+var d=new Date();
+d.setTime(d.getTime()+(60*24*60*60*1000));
+d=d.toUTCString();
+var dc=wn.document,_3b;
+if(wn.innerWidth){
+_3b=function(){
+return {w:wn.innerWidth,h:wn.innerHeight};
+};
+}else{
+if(dc.documentElement&&dc.documentElement.clientWidth){
+_3b=function(){
+return {w:dc.documentElement.clientWidth,h:dc.documentElement.clientHeight};
+};
+}else{
+if(dc.body){
+_3b=function(){
+return {w:dc.body.clientWidth,h:dc.body.clientHeight};
+};
+}
+}
+}
+window.onFirebugResize=function(){
+_49(_3b().h);
+clearInterval(wn._firebugWin_resize);
+wn._firebugWin_resize=setTimeout(function(){
+var x=wn.screenLeft,y=wn.screenTop,w=wn.outerWidth||wn.document.body.offsetWidth,h=wn.outerHeight||wn.document.body.offsetHeight;
+document.cookie="_firebugPosition="+[x,y,w,h].join(",")+"; expires="+d+"; path=/";
+},5000);
+};
+};
+function _3c(){
+if(_b){
+return;
+}
+_31(true);
+if(_1.config.popup){
+var _3d="100%";
+var _3e=document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
+var p=_3e?_3e[1].split(","):[2,2,320,480];
+_9=_37(p[0],p[1],p[2],p[3]);
+_8=_9.document;
+_1.config.debugContainerId="fb";
+_9.console=window.console;
+_9.dojo=window.dojo;
+}else{
+_8=document;
+_3d=(_1.config.debugHeight||300)+"px";
+}
+var _3f=_8.createElement("link");
+_3f.href=_2.toUrl("./firebug.css");
+_3f.rel="stylesheet";
+_3f.type="text/css";
+var _40=_8.getElementsByTagName("head");
+if(_40){
+_40=_40[0];
+}
+if(!_40){
+_40=_8.getElementsByTagName("html")[0];
+}
+if(_4("ie")){
+window.setTimeout(function(){
+_40.appendChild(_3f);
+},0);
+}else{
+_40.appendChild(_3f);
+}
+if(_1.config.debugContainerId){
+_b=_8.getElementById(_1.config.debugContainerId);
+}
+if(!_b){
+_b=_8.createElement("div");
+_8.body.appendChild(_b);
+}
+_b.className+=" firebug";
+_b.id="firebug";
+_b.style.height=_3d;
+_b.style.display=(_11?"block":"none");
+var _41=function(_42,_43,_44,_45){
+return "<li class=\""+_45+"\"><a href=\"javascript:void(0);\" onclick=\"console."+_44+"(); return false;\" title=\""+_43+"\">"+_42+"</a></li>";
+};
+_b.innerHTML="<div id=\"firebugToolbar\">"+" <ul id=\"fireBugTabs\" class=\"tabs\">"+_41("Clear","Remove All Console Logs","clear","")+_41("ReCSS","Refresh CSS without reloading page","recss","")+_41("Console","Show Console Logs","openConsole","gap")+_41("DOM","Show DOM Inspector","openDomInspector","")+_41("Object","Show Object Inspector","openObjectInspector","")+((_1.config.popup)?"":_41("Close","Close the console","close","gap"))+"\t</ul>"+"</div>"+"<input type=\"text\" id=\"firebugCommandLine\" />"+"<div id=\"firebugLog\"></div>"+"<div id=\"objectLog\" style=\"display:none;\">Click on an object in the Log display</div>"+"<div id=\"domInspect\" style=\"display:none;\">Hover over HTML elements in the main page. Click to hold selection.</div>";
+_10=_8.getElementById("firebugToolbar");
+_f=_8.getElementById("firebugCommandLine");
+_46(_f,"keydown",_47);
+_46(_8,_4("ie")||_4("safari")?"keydown":"keypress",_48);
+_c=_8.getElementById("firebugLog");
+_d=_8.getElementById("objectLog");
+_16=_8.getElementById("domInspect");
+_e=_8.getElementById("fireBugTabs");
+_49();
+_4a();
+};
+_1.addOnLoad(_3c);
+function _4b(){
+_8=null;
+if(_9.console){
+_9.console.clear();
+}
+_9=null;
+_b=null;
+_c=null;
+_d=null;
+_16=null;
+_f=null;
+_12=[];
+_13=[];
+_14={};
+};
+function _4c(){
+var _4d=_f.value;
+_f.value="";
+_23(["> ",_4d],"command");
+var _4e;
+try{
+_4e=eval(_4d);
+}
+catch(e){
+}
+};
+function _49(h){
+var _4f=25;
+var _50=h?h-(_4f+_f.offsetHeight+25+(h*0.01))+"px":(_b.offsetHeight-_4f-_f.offsetHeight)+"px";
+_c.style.top=_4f+"px";
+_c.style.height=_50;
+_d.style.height=_50;
+_d.style.top=_4f+"px";
+_16.style.height=_50;
+_16.style.top=_4f+"px";
+_f.style.bottom=0;
+_1.addOnWindowUnload(_4b);
+};
+function _23(_51,_52,_53){
+if(_c){
+_54(_51,_52,_53);
+}else{
+_12.push([_51,_52,_53]);
+}
+};
+function _4a(){
+var _55=_12;
+_12=[];
+for(var i=0;i<_55.length;++i){
+_54(_55[i][0],_55[i][1],_55[i][2]);
+}
+};
+function _54(_56,_57,_58){
+var _59=_c.scrollTop+_c.offsetHeight>=_c.scrollHeight;
+_58=_58||_5a;
+_58(_56,_57);
+if(_59){
+_c.scrollTop=_c.scrollHeight-_c.offsetHeight;
+}
+};
+function _5b(row){
+var _5c=_13.length?_13[_13.length-1]:_c;
+_5c.appendChild(row);
+};
+function _5a(_5d,_5e){
+var row=_c.ownerDocument.createElement("div");
+row.className="logRow"+(_5e?" logRow-"+_5e:"");
+row.innerHTML=_5d.join("");
+_5b(row);
+};
+function _27(_5f,_60){
+_1e(_5f,_60);
+var _61=_c.ownerDocument.createElement("div");
+_61.className="logGroupBox";
+_5b(_61);
+_13.push(_61);
+};
+function _28(){
+_13.pop();
+};
+function _1e(_62,_63){
+var _64=[];
+var _65=_62[0];
+var _66=0;
+if(typeof (_65)!="string"){
+_65="";
+_66=-1;
+}
+var _67=_68(_65);
+for(var i=0;i<_67.length;++i){
+var _69=_67[i];
+if(_69&&typeof _69=="object"){
+_69.appender(_62[++_66],_64);
+}else{
+_6a(_69,_64);
+}
+}
+var ids=[];
+var obs=[];
+for(i=_66+1;i<_62.length;++i){
+_6a(" ",_64);
+var _6b=_62[i];
+if(_6b===undefined||_6b===null){
+_6c(_6b,_64);
+}else{
+if(typeof (_6b)=="string"){
+_6a(_6b,_64);
+}else{
+if(_6b instanceof Date){
+_6a(_6b.toString(),_64);
+}else{
+if(_6b.nodeType==9){
+_6a("[ XmlDoc ]",_64);
+}else{
+var id="_a"+_a++;
+ids.push(id);
+obs.push(_6b);
+var str="<a id=\""+id+"\" href=\"javascript:void(0);\">"+_6d(_6b)+"</a>";
+_6e(str,_64);
+}
+}
+}
+}
+}
+_23(_64,_63);
+for(i=0;i<ids.length;i++){
+var btn=_8.getElementById(ids[i]);
+if(!btn){
+continue;
+}
+btn.obj=obs[i];
+_9.console._connects.push(_1.connect(btn,"onclick",function(){
+console.openObjectInspector();
+try{
+_22(this.obj);
+}
+catch(e){
+this.obj=e;
+}
+_d.innerHTML="<pre>"+_22(this.obj)+"</pre>";
+}));
+}
+};
+function _68(_6f){
+var _70=[];
+var reg=/((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
+var _71={s:_6a,d:_72,i:_72,f:_73};
+for(var m=reg.exec(_6f);m;m=reg.exec(_6f)){
+var _74=m[8]?m[8]:m[5];
+var _75=_74 in _71?_71[_74]:_76;
+var _77=m[3]?parseInt(m[3]):(m[4]=="."?-1:0);
+_70.push(_6f.substr(0,m[0][0]=="%"?m.index:m.index+1));
+_70.push({appender:_75,precision:_77});
+_6f=_6f.substr(m.index+m[0].length);
+}
+_70.push(_6f);
+return _70;
+};
+function _78(_79){
+function _7a(ch){
+switch(ch){
+case "<":
+return "<";
+case ">":
+return ">";
+case "&":
+return "&";
+case "'":
+return "'";
+case "\"":
+return """;
+}
+return "?";
+};
+return String(_79).replace(/[<>&"']/g,_7a);
+};
+function _7b(_7c){
+try{
+return _7c+"";
+}
+catch(e){
+return null;
+}
+};
+function _6e(_7d,_7e){
+_7e.push(_7b(_7d));
+};
+function _6a(_7f,_80){
+_80.push(_78(_7b(_7f)));
+};
+function _6c(_81,_82){
+_82.push("<span class=\"objectBox-null\">",_78(_7b(_81)),"</span>");
+};
+function _83(_84,_85){
+_85.push("<span class=\"objectBox-string\">"",_78(_7b(_84)),""</span>");
+};
+function _72(_86,_87){
+_87.push("<span class=\"objectBox-number\">",_78(_7b(_86)),"</span>");
+};
+function _73(_88,_89){
+_89.push("<span class=\"objectBox-number\">",_78(_7b(_88)),"</span>");
+};
+function _8a(_8b,_8c){
+_8c.push("<span class=\"objectBox-function\">",_6d(_8b),"</span>");
+};
+function _76(_8d,_8e){
+try{
+if(_8d===undefined){
+_6c("undefined",_8e);
+}else{
+if(_8d===null){
+_6c("null",_8e);
+}else{
+if(typeof _8d=="string"){
+_83(_8d,_8e);
+}else{
+if(typeof _8d=="number"){
+_72(_8d,_8e);
+}else{
+if(typeof _8d=="function"){
+_8a(_8d,_8e);
+}else{
+if(_8d.nodeType==1){
+_8f(_8d,_8e);
+}else{
+if(typeof _8d=="object"){
+_90(_8d,_8e);
+}else{
+_6a(_8d,_8e);
+}
+}
+}
+}
+}
+}
+}
+}
+catch(e){
+}
+};
+function _90(_91,_92){
+var _93=_7b(_91);
+var _94=/\[object (.*?)\]/;
+var m=_94.exec(_93);
+_92.push("<span class=\"objectBox-object\">",m?m[1]:_93,"</span>");
+};
+function _8f(_95,_96){
+_96.push("<span class=\"objectBox-selector\">");
+_96.push("<span class=\"selectorTag\">",_78(_95.nodeName.toLowerCase()),"</span>");
+if(_95.id){
+_96.push("<span class=\"selectorId\">#",_78(_95.id),"</span>");
+}
+if(_95.className){
+_96.push("<span class=\"selectorClass\">.",_78(_95.className),"</span>");
+}
+_96.push("</span>");
+};
+function _26(_97,_98){
+if(_97.nodeType==1){
+_98.push("<div class=\"objectBox-element\">","<<span class=\"nodeTag\">",_97.nodeName.toLowerCase(),"</span>");
+for(var i=0;i<_97.attributes.length;++i){
+var _99=_97.attributes[i];
+if(!_99.specified){
+continue;
+}
+_98.push(" <span class=\"nodeName\">",_99.nodeName.toLowerCase(),"</span>="<span class=\"nodeValue\">",_78(_99.nodeValue),"</span>"");
+}
+if(_97.firstChild){
+_98.push("></div><div class=\"nodeChildren\">");
+for(var _9a=_97.firstChild;_9a;_9a=_9a.nextSibling){
+_26(_9a,_98);
+}
+_98.push("</div><div class=\"objectBox-element\"></<span class=\"nodeTag\">",_97.nodeName.toLowerCase(),"></span></div>");
+}else{
+_98.push("/></div>");
+}
+}else{
+if(_97.nodeType==3){
+_98.push("<div class=\"nodeText\">",_78(_97.nodeValue),"</div>");
+}
+}
+};
+function _46(_9b,_9c,_9d){
+if(document.all){
+_9b.attachEvent("on"+_9c,_9d);
+}else{
+_9b.addEventListener(_9c,_9d,false);
+}
+};
+function _9e(_9f,_a0,_a1){
+if(document.all){
+_9f.detachEvent("on"+_a0,_a1);
+}else{
+_9f.removeEventListener(_a0,_a1,false);
+}
+};
+function _a2(_a3){
+if(document.all){
+_a3.cancelBubble=true;
+}else{
+_a3.stopPropagation();
+}
+};
+function _a4(msg,_a5,_a6){
+var _a7=_a5.lastIndexOf("/");
+var _a8=_a7==-1?_a5:_a5.substr(_a7+1);
+var _a9=["<span class=\"errorMessage\">",msg,"</span>","<div class=\"objectBox-sourceLink\">",_a8," (line ",_a6,")</div>"];
+_23(_a9,"error");
+};
+var _aa=new Date().getTime();
+function _48(_ab){
+var _ac=(new Date()).getTime();
+if(_ac>_aa+200){
+_ab=_1.fixEvent(_ab);
+var _ad=_1.keys;
+var ekc=_ab.keyCode;
+_aa=_ac;
+if(ekc==_ad.F12){
+_31();
+}else{
+if((ekc==_ad.NUMPAD_ENTER||ekc==76)&&_ab.shiftKey&&(_ab.metaKey||_ab.ctrlKey)){
+_36();
+}else{
+return;
+}
+}
+_a2(_ab);
+}
+};
+function _47(e){
+var dk=_1.keys;
+if(e.keyCode==13&&_f.value){
+_ae(_f.value);
+_4c();
+}else{
+if(e.keyCode==27){
+_f.value="";
+}else{
+if(e.keyCode==dk.UP_ARROW||e.charCode==dk.UP_ARROW){
+_af("older");
+}else{
+if(e.keyCode==dk.DOWN_ARROW||e.charCode==dk.DOWN_ARROW){
+_af("newer");
+}else{
+if(e.keyCode==dk.HOME||e.charCode==dk.HOME){
+_b0=1;
+_af("older");
+}else{
+if(e.keyCode==dk.END||e.charCode==dk.END){
+_b0=999999;
+_af("newer");
+}
+}
+}
+}
+}
+}
+};
+var _b0=-1;
+var _b1=null;
+function _ae(_b2){
+var _b3=_b4("firebug_history");
+_b3=(_b3)?_1.fromJson(_b3):[];
+var pos=_1.indexOf(_b3,_b2);
+if(pos!=-1){
+_b3.splice(pos,1);
+}
+_b3.push(_b2);
+_b4("firebug_history",_1.toJson(_b3),30);
+while(_b3.length&&!_b4("firebug_history")){
+_b3.shift();
+_b4("firebug_history",_1.toJson(_b3),30);
+}
+_b1=null;
+_b0=-1;
+};
+function _af(_b5){
+var _b6=_b4("firebug_history");
+_b6=(_b6)?_1.fromJson(_b6):[];
+if(!_b6.length){
+return;
+}
+if(_b1===null){
+_b1=_f.value;
+}
+if(_b0==-1){
+_b0=_b6.length;
+}
+if(_b5=="older"){
+--_b0;
+if(_b0<0){
+_b0=0;
+}
+}else{
+if(_b5=="newer"){
+++_b0;
+if(_b0>_b6.length){
+_b0=_b6.length;
+}
+}
+}
+if(_b0==_b6.length){
+_f.value=_b1;
+_b1=null;
+}else{
+_f.value=_b6[_b0];
+}
+};
+function _b4(_b7,_b8){
+var c=document.cookie;
+if(arguments.length==1){
+var _b9=c.match(new RegExp("(?:^|; )"+_b7+"=([^;]*)"));
+return _b9?decodeURIComponent(_b9[1]):undefined;
+}else{
+var d=new Date();
+d.setMonth(d.getMonth()+1);
+document.cookie=_b7+"="+encodeURIComponent(_b8)+((d.toUtcString)?"; expires="+d.toUTCString():"");
+}
+};
+function _ba(it){
+return it&&it instanceof Array||typeof it=="array";
+};
+function _bb(o){
+var cnt=0;
+for(var nm in o){
+cnt++;
+}
+return cnt;
+};
+function _22(o,i,txt,_bc){
+var ind=" \t";
+txt=txt||"";
+i=i||ind;
+_bc=_bc||[];
+var _bd;
+if(o&&o.nodeType==1){
+var _be=[];
+_26(o,_be);
+return _be.join("");
+}
+var br=",\n",cnt=0,_bf=_bb(o);
+if(o instanceof Date){
+return i+o.toString()+br;
+}
+looking:
+for(var nm in o){
+cnt++;
+if(cnt==_bf){
+br="\n";
+}
+if(o[nm]===window||o[nm]===document){
+}else{
+if(o[nm]===null){
+txt+=i+nm+" : NULL"+br;
+}else{
+if(o[nm]&&o[nm].nodeType){
+if(o[nm].nodeType==1){
+}else{
+if(o[nm].nodeType==3){
+txt+=i+nm+" : [ TextNode "+o[nm].data+" ]"+br;
+}
+}
+}else{
+if(typeof o[nm]=="object"&&(o[nm] instanceof String||o[nm] instanceof Number||o[nm] instanceof Boolean)){
+txt+=i+nm+" : "+o[nm]+","+br;
+}else{
+if(o[nm] instanceof Date){
+txt+=i+nm+" : "+o[nm].toString()+br;
+}else{
+if(typeof (o[nm])=="object"&&o[nm]){
+for(var j=0,_c0;_c0=_bc[j];j++){
+if(o[nm]===_c0){
+txt+=i+nm+" : RECURSION"+br;
+continue looking;
+}
+}
+_bc.push(o[nm]);
+_bd=(_ba(o[nm]))?["[","]"]:["{","}"];
+txt+=i+nm+" : "+_bd[0]+"\n";
+txt+=_22(o[nm],i+ind,"",_bc);
+txt+=i+_bd[1]+br;
+}else{
+if(typeof o[nm]=="undefined"){
+txt+=i+nm+" : undefined"+br;
+}else{
+if(nm=="toString"&&typeof o[nm]=="function"){
+var _c1=o[nm]();
+if(typeof _c1=="string"&&_c1.match(/function ?(.*?)\(/)){
+_c1=_78(_6d(o[nm]));
+}
+txt+=i+nm+" : "+_c1+br;
+}else{
+txt+=i+nm+" : "+_78(_6d(o[nm]))+br;
+}
+}
+}
+}
+}
+}
+}
+}
+}
+return txt;
+};
+function _6d(obj){
+var _c2=(obj instanceof Error);
+if(obj.nodeType==1){
+return _78("< "+obj.tagName.toLowerCase()+" id=\""+obj.id+"\" />");
+}
+if(obj.nodeType==3){
+return _78("[TextNode: \""+obj.nodeValue+"\"]");
+}
+var nm=(obj&&(obj.id||obj.name||obj.ObjectID||obj.widgetId));
+if(!_c2&&nm){
+return "{"+nm+"}";
+}
+var _c3=2;
+var _c4=4;
+var cnt=0;
+if(_c2){
+nm="[ Error: "+(obj.message||obj.description||obj)+" ]";
+}else{
+if(_ba(obj)){
+nm="["+obj.slice(0,_c4).join(",");
+if(obj.length>_c4){
+nm+=" ... ("+obj.length+" items)";
+}
+nm+="]";
+}else{
+if(typeof obj=="function"){
+nm=obj+"";
+var reg=/function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
+var m=reg.exec(nm);
+if(m){
+if(!m[1]){
+m[1]="function";
+}
+nm=m[1]+m[2];
+}else{
+nm="function()";
+}
+}else{
+if(typeof obj!="object"||typeof obj=="string"){
+nm=obj+"";
+}else{
+nm="{";
+for(var i in obj){
+cnt++;
+if(cnt>_c3){
+break;
+}
+nm+=i+":"+_78(obj[i])+" ";
+}
+nm+="}";
+}
+}
+}
+}
+return nm;
+};
+_46(document,_4("ie")||_4("safari")?"keydown":"keypress",_48);
+if((document.documentElement.getAttribute("debug")=="true")||(_1.config.isDebug)){
+_31(true);
+}
+_1.addOnWindowUnload(function(){
+_9e(document,_4("ie")||_4("safari")?"keydown":"keypress",_48);
+window.onFirebugResize=null;
+window.console=null;
+});
+});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.js.uncompressed.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1191 @@
+define("dojo/_firebug/firebug", [
+ "../_base/kernel",
+ "require",
+ "../_base/html",
+ "../sniff",
+ "../_base/array",
+ "../_base/lang",
+ "../_base/event",
+ "../_base/unload"], function(dojo, require, html, has){
+
+ // module:
+ // dojo/_firebug/firebug
+ // summary:
+ // Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox
+ // description:
+ // Opens a console for logging, debugging, and error messages.
+ // Contains partial functionality to Firebug. See function list below.
+ //
+ // NOTE:
+ // Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug.
+ // Firebug Lite is included in Dojo by permission from Joe Hewitt
+ // If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug
+ // functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html
+ //
+ // NOTE:
+ // To test Firebug Lite in Firefox:
+ //
+ // - FF2: set "console = null" before loading dojo and set djConfig.isDebug=true
+ // - FF3: disable Firebug and set djConfig.isDebug=true
+ //
+ // example:
+ // Supports inline objects in object inspector window (only simple trace of dom nodes, however)
+ // | console.log("my object", {foo:"bar"})
+ // example:
+ // Option for console to open in popup window
+ // | var djConfig = {isDebug: true, popup:true };
+ // example:
+ // Option for console height (ignored for popup)
+ // | var djConfig = {isDebug: true, debugHeight:100 }
+
+
+ var isNewIE = (/Trident/.test(window.navigator.userAgent));
+ if(isNewIE){
+ // Fixing IE's console
+ // IE doesn't insert space between arguments. How annoying.
+ var calls = ["log", "info", "debug", "warn", "error"];
+ for(var i=0;i<calls.length;i++){
+ var m = calls[i];
+ if(!console[m] ||console[m]._fake){
+ // IE9 doesn't have console.debug method, a fake one is added later
+ continue;
+ }
+ var n = "_"+calls[i];
+ console[n] = console[m];
+ console[m] = (function(){
+ var type = n;
+ return function(){
+ console[type](Array.prototype.join.call(arguments, " "));
+ };
+ })();
+ }
+ // clear the console on load. This is more than a convenience - too many logs crashes it.
+ // If closed it throws an error
+ try{ console.clear(); }catch(e){}
+ }
+
+ if(
+ has("ff") || // Firefox has Firebug
+ has("chrome") || // Chrome 3+ has a console
+ has("safari") || // Safari 4 has a console
+ isNewIE || // Has the new IE console
+ window.firebug || // Testing for mozilla firebug lite
+ (typeof console != "undefined" && console.firebug) || //The firebug console
+ dojo.config.useCustomLogger || // Allow custom loggers
+ has("air") // isDebug triggers AIRInsector, not Firebug
+ ){
+ return;
+ }
+
+ // don't build firebug in iframes
+ try{
+ if(window != window.parent){
+ // but if we've got a parent logger, connect to it
+ if(window.parent["console"]){
+ window.console = window.parent.console;
+ }
+ return;
+ }
+ }catch(e){/*squelch*/}
+
+ // ***************************************************************************
+ // Placing these variables before the functions that use them to avoid a
+ // shrinksafe bug where variable renaming does not happen correctly otherwise.
+
+ // most of the objects in this script are run anonomously
+ var _firebugDoc = document;
+ var _firebugWin = window;
+ var __consoleAnchorId__ = 0;
+
+ var consoleFrame = null;
+ var consoleBody = null;
+ var consoleObjectInspector = null;
+ var fireBugTabs = null;
+ var commandLine = null;
+ var consoleToolbar = null;
+
+ var frameVisible = false;
+ var messageQueue = [];
+ var groupStack = [];
+ var timeMap = {};
+ var countMap = {};
+
+ var consoleDomInspector = null;
+ var _inspectionMoveConnection;
+ var _inspectionClickConnection;
+ var _inspectionEnabled = false;
+ var _inspectionTimer = null;
+ var _inspectTempNode = document.createElement("div");
+
+
+ var _inspectCurrentNode;
+ var _restoreBorderStyle;
+
+ // ***************************************************************************
+
+ window.console = {
+ _connects: [],
+ log: function(){
+ // summary:
+ // Sends arguments to console.
+ logFormatted(arguments, "");
+ },
+
+ debug: function(){
+ // summary:
+ // Sends arguments to console. Missing finctionality to show script line of trace.
+ logFormatted(arguments, "debug");
+ },
+
+ info: function(){
+ // summary:
+ // Sends arguments to console, highlighted with (I) icon.
+ logFormatted(arguments, "info");
+ },
+
+ warn: function(){
+ // summary:
+ // Sends warning arguments to console, highlighted with (!) icon and blue style.
+ logFormatted(arguments, "warning");
+ },
+
+ error: function(){
+ // summary:
+ // Sends error arguments (object) to console, highlighted with (X) icon and yellow style
+ // NEW: error object now displays in object inspector
+ logFormatted(arguments, "error");
+ },
+
+ assert: function(truth, message){
+ // summary:
+ // Tests for true. Throws exception if false.
+ if(!truth){
+ var args = [];
+ for(var i = 1; i < arguments.length; ++i){
+ args.push(arguments[i]);
+ }
+
+ logFormatted(args.length ? args : ["Assertion Failure"], "error");
+ throw message ? message : "Assertion Failure";
+ }
+ },
+
+ dir: function(obj){
+ var str = printObject( obj );
+ str = str.replace(/\n/g, "<br />");
+ str = str.replace(/\t/g, " ");
+ logRow([str], "dir");
+ },
+
+ dirxml: function(node){
+ var html = [];
+ appendNode(node, html);
+ logRow(html, "dirxml");
+ },
+
+ group: function(){
+ // summary:
+ // collects log messages into a group, starting with this call and ending with
+ // groupEnd(). Missing collapse functionality
+ logRow(arguments, "group", pushGroup);
+ },
+
+ groupEnd: function(){
+ // summary:
+ // Closes group. See above
+ logRow(arguments, "", popGroup);
+ },
+
+ time: function(name){
+ // summary:
+ // Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);
+ // example:
+ // | console.time("load");
+ // | console.time("myFunction");
+ // | console.timeEnd("load");
+ // | console.timeEnd("myFunction");
+ timeMap[name] = new Date().getTime();
+ },
+
+ timeEnd: function(name){
+ // summary:
+ // See above.
+ if(name in timeMap){
+ var delta = (new Date()).getTime() - timeMap[name];
+ logFormatted([name+ ":", delta+"ms"]);
+ delete timeMap[name];
+ }
+ },
+
+ count: function(name){
+ // summary:
+ // Not supported
+ if(!countMap[name]) countMap[name] = 0;
+ countMap[name]++;
+ logFormatted([name+": "+countMap[name]]);
+ },
+
+ trace: function(_value){
+ var stackAmt = _value || 3;
+ var f = console.trace.caller; //function that called trace
+ console.log(">>> console.trace(stack)");
+ for(var i=0;i<stackAmt;i++){
+ var func = f.toString();
+ var args=[];
+ for (var a = 0; a < f.arguments.length; a++){
+ args.push(f.arguments[a]);
+ }
+ if(f.arguments.length){
+ console.dir({"function":func, "arguments":args});
+ }else{
+ console.dir({"function":func});
+ }
+
+ f = f.caller;
+ }
+ },
+
+ profile: function(){
+ // summary:
+ // Not supported
+ this.warn(["profile() not supported."]);
+ },
+
+ profileEnd: function(){ },
+
+ clear: function(){
+ // summary:
+ // Clears message console. Do not call this directly
+ if(consoleBody){
+ while(consoleBody.childNodes.length){
+ dojo.destroy(consoleBody.firstChild);
+ }
+ }
+ dojo.forEach(this._connects,dojo.disconnect);
+ },
+
+ open: function(){
+ // summary:
+ // Opens message console. Do not call this directly
+ toggleConsole(true);
+ },
+
+ close: function(){
+ // summary:
+ // Closes message console. Do not call this directly
+ if(frameVisible){
+ toggleConsole();
+ }
+ },
+ _restoreBorder: function(){
+ if(_inspectCurrentNode){
+ _inspectCurrentNode.style.border = _restoreBorderStyle;
+ }
+ },
+ openDomInspector: function(){
+ _inspectionEnabled = true;
+ consoleBody.style.display = "none";
+ consoleDomInspector.style.display = "block";
+ consoleObjectInspector.style.display = "none";
+ document.body.style.cursor = "pointer";
+ _inspectionMoveConnection = dojo.connect(document, "mousemove", function(evt){
+ if(!_inspectionEnabled){ return; }
+ if(!_inspectionTimer){
+ _inspectionTimer = setTimeout(function(){ _inspectionTimer = null; }, 50);
+ }else{
+ return;
+ }
+ var node = evt.target;
+ if(node && (_inspectCurrentNode !== node)){
+ var parent = true;
+
+ console._restoreBorder();
+ var html = [];
+ appendNode(node, html);
+ consoleDomInspector.innerHTML = html.join("");
+
+ _inspectCurrentNode = node;
+ _restoreBorderStyle = _inspectCurrentNode.style.border;
+ _inspectCurrentNode.style.border = "#0000FF 1px solid";
+ }
+ });
+ setTimeout(function(){
+ _inspectionClickConnection = dojo.connect(document, "click", function(evt){
+ document.body.style.cursor = "";
+ _inspectionEnabled = !_inspectionEnabled;
+ dojo.disconnect(_inspectionClickConnection);
+ // console._restoreBorder();
+ });
+ }, 30);
+ },
+ _closeDomInspector: function(){
+ document.body.style.cursor = "";
+ dojo.disconnect(_inspectionMoveConnection);
+ dojo.disconnect(_inspectionClickConnection);
+ _inspectionEnabled = false;
+ console._restoreBorder();
+ },
+ openConsole:function(){
+ // summary:
+ // Closes object inspector and opens message console. Do not call this directly
+ consoleBody.style.display = "block";
+ consoleDomInspector.style.display = "none";
+ consoleObjectInspector.style.display = "none";
+ console._closeDomInspector();
+ },
+ openObjectInspector:function(){
+ consoleBody.style.display = "none";
+ consoleDomInspector.style.display = "none";
+ consoleObjectInspector.style.display = "block";
+ console._closeDomInspector();
+ },
+ recss: function(){
+ // this is placed in dojo since the console is most likely
+ // in another window and dojo is easilly accessible
+ var i,a,s;a=document.getElementsByTagName('link');
+ for(i=0;i<a.length;i++){
+ s=a[i];
+ if(s.rel.toLowerCase().indexOf('stylesheet')>=0&&s.href){
+ var h=s.href.replace(/(&|%5C?)forceReload=\d+/,'');
+ s.href=h+(h.indexOf('?')>=0?'&':'?')+'forceReload='+new Date().valueOf();
+ }
+ }
+ }
+ };
+
+ // ***************************************************************************
+
+ function toggleConsole(forceOpen){
+ frameVisible = forceOpen || !frameVisible;
+ if(consoleFrame){
+ consoleFrame.style.display = frameVisible ? "block" : "none";
+ }
+ }
+
+ function focusCommandLine(){
+ toggleConsole(true);
+ if(commandLine){
+ commandLine.focus();
+ }
+ }
+
+ function openWin(x,y,w,h){
+ var win = window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
+ if(!win){
+ var msg = "Firebug Lite could not open a pop-up window, most likely because of a blocker.\n" +
+ "Either enable pop-ups for this domain, or change the djConfig to popup=false.";
+ alert(msg);
+ }
+ createResizeHandler(win);
+ var newDoc=win.document;
+ //Safari needs an HTML height
+ var HTMLstring= '<html style="height:100%;"><head><title>Firebug Lite</title></head>\n' +
+ '<body bgColor="#ccc" style="height:97%;" onresize="opener.onFirebugResize()">\n' +
+ '<div id="fb"></div>' +
+ '</body></html>';
+
+ newDoc.write(HTMLstring);
+ newDoc.close();
+ return win;
+ }
+
+ function createResizeHandler(wn){
+ // summary:
+ // Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE).
+ //
+
+ var d = new Date();
+ d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days
+ d = d.toUTCString();
+
+ var dc = wn.document,
+ getViewport;
+
+ if (wn.innerWidth){
+ getViewport = function(){
+ return{w:wn.innerWidth, h:wn.innerHeight};
+ };
+ }else if (dc.documentElement && dc.documentElement.clientWidth){
+ getViewport = function(){
+ return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight};
+ };
+ }else if (dc.body){
+ getViewport = function(){
+ return{w:dc.body.clientWidth, h:dc.body.clientHeight};
+ };
+ }
+
+
+ window.onFirebugResize = function(){
+
+ //resize the height of the console log body
+ layout(getViewport().h);
+
+ clearInterval(wn._firebugWin_resize);
+ wn._firebugWin_resize = setTimeout(function(){
+ var x = wn.screenLeft,
+ y = wn.screenTop,
+ w = wn.outerWidth || wn.document.body.offsetWidth,
+ h = wn.outerHeight || wn.document.body.offsetHeight;
+
+ document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/";
+
+ }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move
+
+ };
+ }
+
+
+ /*****************************************************************************/
+
+
+ function createFrame(){
+ if(consoleFrame){
+ return;
+ }
+ toggleConsole(true);
+ if(dojo.config.popup){
+ var containerHeight = "100%";
+ var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
+ var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480];
+
+ _firebugWin = openWin(p[0],p[1],p[2],p[3]); // global
+ _firebugDoc = _firebugWin.document; // global
+
+ dojo.config.debugContainerId = 'fb';
+
+ // connecting popup
+ _firebugWin.console = window.console;
+ _firebugWin.dojo = window.dojo;
+ }else{
+ _firebugDoc = document;
+ containerHeight = (dojo.config.debugHeight || 300) + "px";
+ }
+
+ var styleElement = _firebugDoc.createElement("link");
+ styleElement.href = require.toUrl("./firebug.css");
+ styleElement.rel = "stylesheet";
+ styleElement.type = "text/css";
+ var styleParent = _firebugDoc.getElementsByTagName("head");
+ if(styleParent){
+ styleParent = styleParent[0];
+ }
+ if(!styleParent){
+ styleParent = _firebugDoc.getElementsByTagName("html")[0];
+ }
+ if(has("ie")){
+ window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0);
+ }else{
+ styleParent.appendChild(styleElement);
+ }
+
+ if(dojo.config.debugContainerId){
+ consoleFrame = _firebugDoc.getElementById(dojo.config.debugContainerId);
+ }
+ if(!consoleFrame){
+ consoleFrame = _firebugDoc.createElement("div");
+ _firebugDoc.body.appendChild(consoleFrame);
+ }
+ consoleFrame.className += " firebug";
+ consoleFrame.id = "firebug";
+ consoleFrame.style.height = containerHeight;
+ consoleFrame.style.display = (frameVisible ? "block" : "none");
+
+ var buildLink = function(label, title, method, _class){
+ return '<li class="'+_class+'"><a href="javascript:void(0);" onclick="console.'+ method +'(); return false;" title="'+title+'">'+label+'</a></li>';
+ };
+ consoleFrame.innerHTML =
+ '<div id="firebugToolbar">'
+ + ' <ul id="fireBugTabs" class="tabs">'
+
+ + buildLink("Clear", "Remove All Console Logs", "clear", "")
+ + buildLink("ReCSS", "Refresh CSS without reloading page", "recss", "")
+
+ + buildLink("Console", "Show Console Logs", "openConsole", "gap")
+ + buildLink("DOM", "Show DOM Inspector", "openDomInspector", "")
+ + buildLink("Object", "Show Object Inspector", "openObjectInspector", "")
+ + ((dojo.config.popup) ? "" : buildLink("Close", "Close the console", "close", "gap"))
+
+ + ' </ul>'
+ + '</div>'
+ + '<input type="text" id="firebugCommandLine" />'
+ + '<div id="firebugLog"></div>'
+ + '<div id="objectLog" style="display:none;">Click on an object in the Log display</div>'
+ + '<div id="domInspect" style="display:none;">Hover over HTML elements in the main page. Click to hold selection.</div>';
+
+
+ consoleToolbar = _firebugDoc.getElementById("firebugToolbar");
+
+ commandLine = _firebugDoc.getElementById("firebugCommandLine");
+ addEvent(commandLine, "keydown", onCommandLineKeyDown);
+
+ addEvent(_firebugDoc, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
+
+ consoleBody = _firebugDoc.getElementById("firebugLog");
+ consoleObjectInspector = _firebugDoc.getElementById("objectLog");
+ consoleDomInspector = _firebugDoc.getElementById("domInspect");
+ fireBugTabs = _firebugDoc.getElementById("fireBugTabs");
+ layout();
+ flush();
+ }
+
+ dojo.addOnLoad(createFrame);
+
+ function clearFrame(){
+ _firebugDoc = null;
+
+ if(_firebugWin.console){
+ _firebugWin.console.clear();
+ }
+ _firebugWin = null;
+ consoleFrame = null;
+ consoleBody = null;
+ consoleObjectInspector = null;
+ consoleDomInspector = null;
+ commandLine = null;
+ messageQueue = [];
+ groupStack = [];
+ timeMap = {};
+ }
+
+
+ function evalCommandLine(){
+ var text = commandLine.value;
+ commandLine.value = "";
+
+ logRow(["> ", text], "command");
+
+ var value;
+ try{
+ value = eval(text);
+ }catch(e){
+ console.debug(e); // put exception on the console
+ }
+
+ console.log(value);
+ }
+
+ function layout(h){
+ var tHeight = 25; //consoleToolbar.offsetHeight; // tab style not ready on load - throws off layout
+ var height = h ?
+ h - (tHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" :
+ (consoleFrame.offsetHeight - tHeight - commandLine.offsetHeight) + "px";
+
+ consoleBody.style.top = tHeight + "px";
+ consoleBody.style.height = height;
+ consoleObjectInspector.style.height = height;
+ consoleObjectInspector.style.top = tHeight + "px";
+ consoleDomInspector.style.height = height;
+ consoleDomInspector.style.top = tHeight + "px";
+ commandLine.style.bottom = 0;
+
+ dojo.addOnWindowUnload(clearFrame);
+ }
+
+ function logRow(message, className, handler){
+ if(consoleBody){
+ writeMessage(message, className, handler);
+ }else{
+ messageQueue.push([message, className, handler]);
+ }
+ }
+
+ function flush(){
+ var queue = messageQueue;
+ messageQueue = [];
+
+ for(var i = 0; i < queue.length; ++i){
+ writeMessage(queue[i][0], queue[i][1], queue[i][2]);
+ }
+ }
+
+ function writeMessage(message, className, handler){
+ var isScrolledToBottom =
+ consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
+
+ handler = handler||writeRow;
+
+ handler(message, className);
+
+ if(isScrolledToBottom){
+ consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
+ }
+ }
+
+ function appendRow(row){
+ var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
+ container.appendChild(row);
+ }
+
+ function writeRow(message, className){
+ var row = consoleBody.ownerDocument.createElement("div");
+ row.className = "logRow" + (className ? " logRow-"+className : "");
+ row.innerHTML = message.join("");
+ appendRow(row);
+ }
+
+ function pushGroup(message, className){
+ logFormatted(message, className);
+
+ //var groupRow = consoleBody.ownerDocument.createElement("div");
+ //groupRow.className = "logGroup";
+ var groupRowBox = consoleBody.ownerDocument.createElement("div");
+ groupRowBox.className = "logGroupBox";
+ //groupRow.appendChild(groupRowBox);
+ appendRow(groupRowBox);
+ groupStack.push(groupRowBox);
+ }
+
+ function popGroup(){
+ groupStack.pop();
+ }
+
+ // ***************************************************************************
+
+ function logFormatted(objects, className){
+ var html = [];
+
+ var format = objects[0];
+ var objIndex = 0;
+
+ if(typeof(format) != "string"){
+ format = "";
+ objIndex = -1;
+ }
+
+ var parts = parseFormat(format);
+
+ for(var i = 0; i < parts.length; ++i){
+ var part = parts[i];
+ if(part && typeof part == "object"){
+ part.appender(objects[++objIndex], html);
+ }else{
+ appendText(part, html);
+ }
+ }
+
+
+ var ids = [];
+ var obs = [];
+ for(i = objIndex+1; i < objects.length; ++i){
+ appendText(" ", html);
+
+ var object = objects[i];
+ if(object === undefined || object === null ){
+ appendNull(object, html);
+
+ }else if(typeof(object) == "string"){
+ appendText(object, html);
+
+ }else if(object instanceof Date){
+ appendText(object.toString(), html);
+
+ }else if(object.nodeType == 9){
+ appendText("[ XmlDoc ]", html);
+
+ }else{
+ // Create link for object inspector
+ // need to create an ID for this link, since it is currently text
+ var id = "_a" + __consoleAnchorId__++;
+ ids.push(id);
+ // need to save the object, so the arrays line up
+ obs.push(object);
+ var str = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';
+
+ appendLink( str , html);
+ }
+ }
+
+ logRow(html, className);
+
+ // Now that the row is inserted in the DOM, loop through all of the links that were just created
+ for(i=0; i<ids.length; i++){
+ var btn = _firebugDoc.getElementById(ids[i]);
+ if(!btn){ continue; }
+
+ // store the object in the dom btn for reference later
+ // avoid parsing these objects unless necessary
+ btn.obj = obs[i];
+
+ _firebugWin.console._connects.push(dojo.connect(btn, "onclick", function(){
+
+ console.openObjectInspector();
+
+ try{
+ printObject(this.obj);
+ }catch(e){
+ this.obj = e;
+ }
+ consoleObjectInspector.innerHTML = "<pre>" + printObject( this.obj ) + "</pre>";
+ }));
+ }
+ }
+
+ function parseFormat(format){
+ var parts = [];
+
+ var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
+ var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
+
+ for(var m = reg.exec(format); m; m = reg.exec(format)){
+ var type = m[8] ? m[8] : m[5];
+ var appender = type in appenderMap ? appenderMap[type] : appendObject;
+ var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
+
+ parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
+ parts.push({appender: appender, precision: precision});
+
+ format = format.substr(m.index+m[0].length);
+ }
+
+ parts.push(format);
+
+ return parts;
+ }
+
+ function escapeHTML(value){
+ function replaceChars(ch){
+ switch(ch){
+ case "<":
+ return "<";
+ case ">":
+ return ">";
+ case "&":
+ return "&";
+ case "'":
+ return "'";
+ case '"':
+ return """;
+ }
+ return "?";
+ }
+ return String(value).replace(/[<>&"']/g, replaceChars);
+ }
+
+ function objectToString(object){
+ try{
+ return object+"";
+ }catch(e){
+ return null;
+ }
+ }
+
+ // ***************************************************************************
+ function appendLink(object, html){
+ // needed for object links - no HTML escaping
+ html.push( objectToString(object) );
+ }
+
+ function appendText(object, html){
+ html.push(escapeHTML(objectToString(object)));
+ }
+
+ function appendNull(object, html){
+ html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendString(object, html){
+ html.push('<span class="objectBox-string">"', escapeHTML(objectToString(object)),
+ '"</span>');
+ }
+
+ function appendInteger(object, html){
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFloat(object, html){
+ html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
+ }
+
+ function appendFunction(object, html){
+ html.push('<span class="objectBox-function">', getObjectAbbr(object), '</span>');
+ }
+
+ function appendObject(object, html){
+ try{
+ if(object === undefined){
+ appendNull("undefined", html);
+ }else if(object === null){
+ appendNull("null", html);
+ }else if(typeof object == "string"){
+ appendString(object, html);
+ }else if(typeof object == "number"){
+ appendInteger(object, html);
+ }else if(typeof object == "function"){
+ appendFunction(object, html);
+ }else if(object.nodeType == 1){
+ appendSelector(object, html);
+ }else if(typeof object == "object"){
+ appendObjectFormatted(object, html);
+ }else{
+ appendText(object, html);
+ }
+ }catch(e){
+ /* squelch */
+ }
+ }
+
+ function appendObjectFormatted(object, html){
+ var text = objectToString(object);
+ var reObject = /\[object (.*?)\]/;
+
+ var m = reObject.exec(text);
+ html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>');
+ }
+
+ function appendSelector(object, html){
+ html.push('<span class="objectBox-selector">');
+
+ html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
+ if(object.id){
+ html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
+ }
+ if(object.className){
+ html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
+ }
+
+ html.push('</span>');
+ }
+
+ function appendNode(node, html){
+ if(node.nodeType == 1){
+ html.push(
+ '<div class="objectBox-element">',
+ '<<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
+
+ for(var i = 0; i < node.attributes.length; ++i){
+ var attr = node.attributes[i];
+ if(!attr.specified){ continue; }
+
+ html.push(' <span class="nodeName">', attr.nodeName.toLowerCase(),
+ '</span>="<span class="nodeValue">', escapeHTML(attr.nodeValue),
+ '</span>"');
+ }
+
+ if(node.firstChild){
+ html.push('></div><div class="nodeChildren">');
+
+ for(var child = node.firstChild; child; child = child.nextSibling){
+ appendNode(child, html);
+ }
+
+ html.push('</div><div class="objectBox-element"></<span class="nodeTag">',
+ node.nodeName.toLowerCase(), '></span></div>');
+ }else{
+ html.push('/></div>');
+ }
+ }else if (node.nodeType == 3){
+ html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
+ '</div>');
+ }
+ }
+
+ // ***************************************************************************
+
+ function addEvent(object, name, handler){
+ if(document.all){
+ object.attachEvent("on"+name, handler);
+ }else{
+ object.addEventListener(name, handler, false);
+ }
+ }
+
+ function removeEvent(object, name, handler){
+ if(document.all){
+ object.detachEvent("on"+name, handler);
+ }else{
+ object.removeEventListener(name, handler, false);
+ }
+ }
+
+ function cancelEvent(event){
+ if(document.all){
+ event.cancelBubble = true;
+ }else{
+ event.stopPropagation();
+ }
+ }
+
+ function onError(msg, href, lineNo){
+ var lastSlash = href.lastIndexOf("/");
+ var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
+
+ var html = [
+ '<span class="errorMessage">', msg, '</span>',
+ '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
+ ];
+
+ logRow(html, "error");
+ }
+
+
+ //After converting to div instead of iframe, now getting two keydowns right away in IE 6.
+ //Make sure there is a little bit of delay.
+ var onKeyDownTime = new Date().getTime();
+
+ function onKeyDown(event){
+ var timestamp = (new Date()).getTime();
+ if(timestamp > onKeyDownTime + 200){
+ event = dojo.fixEvent(event);
+ var keys = dojo.keys;
+ var ekc = event.keyCode;
+ onKeyDownTime = timestamp;
+ if(ekc == keys.F12){
+ toggleConsole();
+ }else if(
+ (ekc == keys.NUMPAD_ENTER || ekc == 76) &&
+ event.shiftKey &&
+ (event.metaKey || event.ctrlKey)
+ ){
+ focusCommandLine();
+ }else{
+ return;
+ }
+ cancelEvent(event);
+ }
+ }
+
+ function onCommandLineKeyDown(e){
+ var dk = dojo.keys;
+ if(e.keyCode == 13 && commandLine.value){
+ addToHistory(commandLine.value);
+ evalCommandLine();
+ }else if(e.keyCode == 27){
+ commandLine.value = "";
+ }else if(e.keyCode == dk.UP_ARROW || e.charCode == dk.UP_ARROW){
+ navigateHistory("older");
+ }else if(e.keyCode == dk.DOWN_ARROW || e.charCode == dk.DOWN_ARROW){
+ navigateHistory("newer");
+ }else if(e.keyCode == dk.HOME || e.charCode == dk.HOME){
+ historyPosition = 1;
+ navigateHistory("older");
+ }else if(e.keyCode == dk.END || e.charCode == dk.END){
+ historyPosition = 999999;
+ navigateHistory("newer");
+ }
+ }
+
+ var historyPosition = -1;
+ var historyCommandLine = null;
+
+ function addToHistory(value){
+ var history = cookie("firebug_history");
+ history = (history) ? dojo.fromJson(history) : [];
+ var pos = dojo.indexOf(history, value);
+ if (pos != -1){
+ history.splice(pos, 1);
+ }
+ history.push(value);
+ cookie("firebug_history", dojo.toJson(history), 30);
+ while(history.length && !cookie("firebug_history")){
+ history.shift();
+ cookie("firebug_history", dojo.toJson(history), 30);
+ }
+ historyCommandLine = null;
+ historyPosition = -1;
+ }
+
+ function navigateHistory(direction){
+ var history = cookie("firebug_history");
+ history = (history) ? dojo.fromJson(history) : [];
+ if(!history.length){
+ return;
+ }
+
+ if(historyCommandLine === null){
+ historyCommandLine = commandLine.value;
+ }
+
+ if(historyPosition == -1){
+ historyPosition = history.length;
+ }
+
+ if(direction == "older"){
+ --historyPosition;
+ if(historyPosition < 0){
+ historyPosition = 0;
+ }
+ }else if(direction == "newer"){
+ ++historyPosition;
+ if(historyPosition > history.length){
+ historyPosition = history.length;
+ }
+ }
+
+ if(historyPosition == history.length){
+ commandLine.value = historyCommandLine;
+ historyCommandLine = null;
+ }else{
+ commandLine.value = history[historyPosition];
+ }
+ }
+
+ function cookie(name, value){
+ var c = document.cookie;
+ if(arguments.length == 1){
+ var matches = c.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
+ return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
+ }else{
+ var d = new Date();
+ d.setMonth(d.getMonth()+1);
+ document.cookie = name + "=" + encodeURIComponent(value) + ((d.toUtcString) ? "; expires=" + d.toUTCString() : "");
+ }
+ }
+
+ function isArray(it){
+ return it && it instanceof Array || typeof it == "array";
+ }
+
+ //***************************************************************************************************
+ // Print Object Helpers
+ function objectLength(o){
+ var cnt = 0;
+ for(var nm in o){
+ cnt++;
+ }
+ return cnt;
+ }
+
+ function printObject(o, i, txt, used){
+ // Recursively trace object, indenting to represent depth for display in object inspector
+ var ind = " \t";
+ txt = txt || "";
+ i = i || ind;
+ used = used || [];
+ var opnCls;
+
+ if(o && o.nodeType == 1){
+ var html = [];
+ appendNode(o, html);
+ return html.join("");
+ }
+
+ var br=",\n", cnt = 0, length = objectLength(o);
+
+ if(o instanceof Date){
+ return i + o.toString() + br;
+ }
+ looking:
+ for(var nm in o){
+ cnt++;
+ if(cnt==length){br = "\n";}
+ if(o[nm] === window || o[nm] === document){
+ // do nothing
+ }else if(o[nm] === null){
+ txt += i+nm + " : NULL" + br;
+ }else if(o[nm] && o[nm].nodeType){
+ if(o[nm].nodeType == 1){
+ //txt += i+nm + " : < "+o[nm].tagName+" id=\""+ o[nm].id+"\" />" + br;
+ }else if(o[nm].nodeType == 3){
+ txt += i+nm + " : [ TextNode "+o[nm].data + " ]" + br;
+ }
+
+ }else if(typeof o[nm] == "object" && (o[nm] instanceof String || o[nm] instanceof Number || o[nm] instanceof Boolean)){
+ txt += i+nm + " : " + o[nm] + "," + br;
+
+ }else if(o[nm] instanceof Date){
+ txt += i+nm + " : " + o[nm].toString() + br;
+
+ }else if(typeof(o[nm]) == "object" && o[nm]){
+ for(var j = 0, seen; seen = used[j]; j++){
+ if(o[nm] === seen){
+ txt += i+nm + " : RECURSION" + br;
+ continue looking;
+ }
+ }
+ used.push(o[nm]);
+
+ opnCls = (isArray(o[nm]))?["[","]"]:["{","}"];
+ txt += i+nm +" : " + opnCls[0] + "\n";//non-standard break, (no comma)
+ txt += printObject(o[nm], i+ind, "", used);
+ txt += i + opnCls[1] + br;
+
+ }else if(typeof o[nm] == "undefined"){
+ txt += i+nm + " : undefined" + br;
+ }else if(nm == "toString" && typeof o[nm] == "function"){
+ var toString = o[nm]();
+ if(typeof toString == "string" && toString.match(/function ?(.*?)\(/)){
+ toString = escapeHTML(getObjectAbbr(o[nm]));
+ }
+ txt += i+nm +" : " + toString + br;
+ }else{
+ txt += i+nm +" : "+ escapeHTML(getObjectAbbr(o[nm])) + br;
+ }
+ }
+ return txt;
+ }
+
+ function getObjectAbbr(obj){
+ // Gets an abbreviation of an object for display in log
+ // X items in object, including id
+ // X items in an array
+ // TODO: Firebug Sr. actually goes by char count
+ var isError = (obj instanceof Error);
+ if(obj.nodeType == 1){
+ return escapeHTML('< '+obj.tagName.toLowerCase()+' id=\"'+ obj.id+ '\" />');
+ }
+ if(obj.nodeType == 3){
+ return escapeHTML('[TextNode: "'+obj.nodeValue+'"]');
+ }
+ var nm = (obj && (obj.id || obj.name || obj.ObjectID || obj.widgetId));
+ if(!isError && nm){ return "{"+nm+"}"; }
+
+ var obCnt = 2;
+ var arCnt = 4;
+ var cnt = 0;
+
+ if(isError){
+ nm = "[ Error: "+(obj.message || obj.description || obj)+" ]";
+ }else if(isArray(obj)){
+ nm = "[" + obj.slice(0,arCnt).join(",");
+ if(obj.length > arCnt){
+ nm += " ... ("+obj.length+" items)";
+ }
+ nm += "]";
+ }else if(typeof obj == "function"){
+ nm = obj + "";
+ var reg = /function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
+ var m = reg.exec(nm);
+ if(m){
+ if(!m[1]){
+ m[1] = "function";
+ }
+ nm = m[1] + m[2];
+ }else{
+ nm = "function()";
+ }
+ }else if(typeof obj != "object" || typeof obj == "string"){
+ nm = obj + "";
+ }else{
+ nm = "{";
+ for(var i in obj){
+ cnt++;
+ if(cnt > obCnt){ break; }
+ nm += i+":"+escapeHTML(obj[i])+" ";
+ }
+ nm+="}";
+ }
+
+ return nm;
+ }
+
+ //*************************************************************************************
+
+ //window.onerror = onError;
+
+ addEvent(document, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
+
+ if( (document.documentElement.getAttribute("debug") == "true")||
+ (dojo.config.isDebug)
+ ){
+ toggleConsole(true);
+ }
+
+ dojo.addOnWindowUnload(function(){
+ // Erase the globals and event handlers I created, to prevent spurious leak warnings
+ removeEvent(document, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
+ window.onFirebugResize = null;
+ window.console = null;
+ });
+
+});
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/infoIcon.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_lft_norm.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_lft_over.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_rgt_norm.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_rgt_over.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/dojo/_firebug/warningIcon.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/cookie.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,49 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+//>>built
+define("dojo/cookie",["./_base/kernel","./regexp"],function(_1,_2){
+_1.cookie=function(_3,_4,_5){
+var c=document.cookie,_6;
+if(arguments.length==1){
+var _7=c.match(new RegExp("(?:^|; )"+_2.escapeString(_3)+"=([^;]*)"));
+_6=_7?decodeURIComponent(_7[1]):undefined;
+}else{
+_5=_5||{};
+var _8=_5.expires;
+if(typeof _8=="number"){
+var d=new Date();
+d.setTime(d.getTime()+_8*24*60*60*1000);
+_8=_5.expires=d;
+}
+if(_8&&_8.toUTCString){
+_5.expires=_8.toUTCString();
+}
+_4=encodeURIComponent(_4);
+var _9=_3+"="+_4,_a;
+for(_a in _5){
+_9+="; "+_a;
+var _b=_5[_a];
+if(_b!==true){
+_9+="="+_b;
+}
+}
+document.cookie=_9;
+}
+return _6;
+};
+_1.cookie.isSupported=function(){
+if(!("cookieEnabled" in navigator)){
+this("__djCookieTest__","CookiesAllowed");
+navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";
+if(navigator.cookieEnabled){
+this("__djCookieTest__","",{expires:-1});
+}
+}
+return navigator.cookieEnabled;
+};
+return _1.cookie;
+});
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/dojo.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,15 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+/*
+ This is an optimized version of Dojo, built for deployment and not for
+ development. To get sources and documentation, please visit:
+
+ http://dojotoolkit.org
+*/
+
+//>>built
+(function(_1,_2){var _3=function(){},_4=function(it){for(var p in it){return 0;}return 1;},_5={}.toString,_6=function(it){return _5.call(it)=="[object Function]";},_7=function(it){return _5.call(it)=="[object String]";},_8=function(it){return _5.call(it)=="[object Array]";},_9=function(_a,_b){if(_a){for(var i=0;i<_a.length;){_b(_a[i++]);}}},_c=function(_d,_e){for(var p in _e){_d[p]=_e[p];}return _d;},_f=function(_10,_11){return _c(new Error(_10),{src:"dojoLoader",info:_11});},_12=1,uid=function(){return "_"+_12++;},req=function(_13,_14,_15){return _16(_13,_14,_15,0,req);},_17=this,doc=_17.document,_18=doc&&doc.createElement("DiV"),has=req.has=function(_19){return _6(_1a[_19])?(_1a[_19]=_1a[_19](_17,doc,_18)):_1a[_19];},_1a=has.cache=_2.hasCache;has.add=function(_1b,_1c,now,_1d){(_1a[_1b]===undefined||_1d)&&(_1a[_1b]=_1c);return now&&has(_1b);};0&&has.add("host-node",_1.has&&"host-node" in _1.has?_1.has["host-node"]:(typeof process=="object"&&process.versions&&process.versions.node&&process.versions.v8));if(0){require("./_base/configNode.js").config(_2);_2.loaderPatch.nodeRequire=require;}0&&has.add("host-rhino",_1.has&&"host-rhino" in _1.has?_1.has["host-rhino"]:(typeof load=="function"&&(typeof Packages=="function"||typeof Packages=="object")));if(0){for(var _1e=_1.baseUrl||".",arg,_1f=this.arguments,i=0;i<_1f.length;){arg=(_1f[i++]+"").split("=");if(arg[0]=="baseUrl"){_1e=arg[1];break;}}load(_1e+"/_base/configRhino.js");rhinoDojoConfig(_2,_1e,_1f);}for(var p in _1.has){has.add(p,_1.has[p],0,1);}var _20=1,_21=2,_22=3,_23=4,_24=5;if(0){_20="requested";_21="arrived";_22="not-a-module";_23="executing";_24="executed";}var _25=0,_26="sync",xd="xd",_27=[],_28=0,_29=_3,_2a=_3,_2b;if(1){req.isXdUrl=_3;req.initSyncLoader=function(_2c,_2d,_2e){if(!_28){_28=_2c;_29=_2d;_2a=_2e;}return {sync:_26,requested:_20,arrived:_21,nonmodule:_22,executing:_23,executed:_24,syncExecStack:_27,modules:_2f,execQ:_30,getModule:_31,injectModule:_32,setArrived:_33,signal:_34,finishExec:_35,execModule:_36,dojoRequirePlugin:_28,getLegacyMode:function(){return _25;},guardCheckComplete:_37};};if(1){var _38=location.protocol,_39=location.host;req.isXdUrl=function(url){if(/^\./.test(url)){return false;}if(/^\/\//.test(url)){return true;}var _3a=url.match(/^([^\/\:]+\:)\/+([^\/]+)/);return _3a&&(_3a[1]!=_38||(_39&&_3a[2]!=_39));};1||has.add("dojo-xhr-factory",1);has.add("dojo-force-activex-xhr",1&&!doc.addEventListener&&window.location.protocol=="file:");has.add("native-xhr",typeof XMLHttpRequest!="undefined");if(has("native-xhr")&&!has("dojo-force-activex-xhr")){_2b=function(){return new XMLHttpRequest();};}else{for(var _3b=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],_3c,i=0;i<3;){try{_3c=_3b[i++];if(new ActiveXObject(_3c)){break;}}catch(e){}}_2b=function(){return new ActiveXObject(_3c);};}req.getXhr=_2b;has.add("dojo-gettext-api",1);req.getText=function(url,_3d,_3e){var xhr=_2b();xhr.open("GET",_3f(url),false);xhr.send(null);if(xhr.status==200||(!location.host&&!xhr.status)){if(_3e){_3e(xhr.responseText,_3d);}}else{throw _f("xhrFailed",xhr.status);}return xhr.responseText;};}}else{req.async=1;}var _40=new Function("return eval(arguments[0]);");req.eval=function(_41,_42){return _40(_41+"\r\n////@ sourceURL="+_42);};var _43={},_44="error",_34=req.signal=function(_45,_46){var _47=_43[_45];_9(_47&&_47.slice(0),function(_48){_48.apply(null,_8(_46)?_46:[_46]);});},on=req.on=function(_49,_4a){var _4b=_43[_49]||(_43[_49]=[]);_4b.push(_4a);return {remove:function(){for(var i=0;i<_4b.length;i++){if(_4b[i]===_4a){_4b.splice(i,1);return;}}}};};var _4c=[],_4d={},_4e=[],_4f={},map=req.map={},_50=[],_2f={},_51="",_52={},_53="url:",_54={},_55={},_56=0;if(1){var _57=function(_58){var p,_59,_5a,now,m;for(p in _54){_59=_54[p];_5a=p.match(/^url\:(.+)/);if(_5a){_52[_53+_5b(_5a[1],_58)]=_59;}else{if(p=="*now"){now=_59;}else{if(p!="*noref"){m=_5c(p,_58,true);_52[m.mid]=_52[_53+m.url]=_59;}}}}if(now){now(_5d(_58));}_54={};},_5e=function(s){return s.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(c){return "\\"+c;});},_5f=function(map,_60){_60.splice(0,_60.length);for(var p in map){_60.push([p,map[p],new RegExp("^"+_5e(p)+"(/|$)"),p.length]);}_60.sort(function(lhs,rhs){return rhs[3]-lhs[3];});return _60;},_61=function(_62,_63){_9(_62,function(_64){_63.push([_7(_64[0])?new RegExp("^"+_5e(_64[0])+"$"):_64[0],_64[1]]);});},_65=function(_66){var _67=_66.name;if(!_67){_67=_66;_66={name:_67};}_66=_c({main:"main"},_66);_66.location=_66.location?_66.location:_67;if(_66.packageMap){map[_67]=_66.packageMap;}if(!_66.main.indexOf("./")){_66.main=_66.main.substring(2);}_4f[_67]=_66;},_68=[],_69=function(_6a,_6b,_6c){for(var p in _6a){if(p=="waitSeconds"){req.waitms=(_6a[p]||0)*1000;}if(p=="cacheBust"){_51=_6a[p]?(_7(_6a[p])?_6a[p]:(new Date()).getTime()+""):"";}if(p=="baseUrl"||p=="combo"){req[p]=_6a[p];}if(1&&p=="async"){var _6d=_6a[p];req.legacyMode=_25=(_7(_6d)&&/sync|legacyAsync/.test(_6d)?_6d:(!_6d?_26:false));req.async=!_25;}if(_6a[p]!==_1a){req.rawConfig[p]=_6a[p];p!="has"&&has.add("config-"+p,_6a[p],0,_6b);}}if(!req.baseUrl){req.baseUrl="./";}if(!/\/$/.test(req.baseUrl)){req.baseUrl+="/";}for(p in _6a.has){has.add(p,_6a.has[p],0,_6b);}_9(_6a.packages,_65);for(_1e in _6a.packagePaths){_9(_6a.packagePaths[_1e],function(_6e){var _6f=_1e+"/"+_6e;if(_7(_6e)){_6e={name:_6e};}_6e.location=_6f;_65(_6e);});}_5f(_c(map,_6a.map),_50);_9(_50,function(_70){_70[1]=_5f(_70[1],[]);if(_70[0]=="*"){_50.star=_70;}});_5f(_c(_4d,_6a.paths),_4e);_61(_6a.aliases,_4c);if(_6b){_68.push({config:_6a.config});}else{for(p in _6a.config){var _71=_31(p,_6c);_71.config=_c(_71.config||{},_6a.config[p]);}}if(_6a.cache){_57();_54=_6a.cache;if(_6a.cache["*noref"]){_57();}}_34("config",[_6a,req.rawConfig]);};if(has("dojo-cdn")||1){var _72=doc.getElementsByTagName("script"),i=0,_73,_74,src,_75;while(i<_72.length){_73=_72[i++];if((src=_73.getAttribute("src"))&&(_75=src.match(/(((.*)\/)|^)dojo\.js(\W|$)/i))){_74=_75[3]||"";_2.baseUrl=_2.baseUrl||_74;_56=_73;}if((src=(_73.getAttribute("data-dojo-config")||_73.getAttribute("djConfig")))){_55=req.eval("({ "+src+" })","data-dojo-config");_56=_73;}if(0){if((src=_73.getAttribute("data-main"))){_55.deps=_55.deps||[src];}}}}if(0){try{if(window.parent!=window&&window.parent.require){var doh=window.parent.require("doh");doh&&_c(_55,doh.testConfig);}}catch(e){}}req.rawConfig={};_69(_2,1);if(has("dojo-cdn")){_4f.dojo.location=_74;if(_74){_74+="/";}_4f.dijit.location=_74+"../dijit/";_4f.dojox.location=_74+"../dojox/";}_69(_1,1);_69(_55,1);}else{_4d=_2.paths;_4e=_2.pathsMapProg;_4f=_2.packs;_4c=_2.aliases;_50=_2.mapProgs;_2f=_2.modules;_52=_2.cache;_51=_2.cacheBust;req.rawConfig=_2;}if(0){req.combo=req.combo||{add:_3};var _76=0,_77=[],_78=null;}var _79=function(_7a){_37(function(){_9(_7a.deps,_32);if(0&&_76&&!_78){_78=setTimeout(function(){_76=0;_78=null;req.combo.done(function(_7b,url){var _7c=function(){_7d(0,_7b);_7e();};_77.push(_7b);_7f=_7b;req.injectUrl(url,_7c,_7b);_7f=0;},req);},0);}});},_16=function(a1,a2,a3,_80,_81){var _82,_83;if(_7(a1)){_82=_31(a1,_80,true);if(_82&&_82.executed){return _82.result;}throw _f("undefinedModule",a1);}if(!_8(a1)){_69(a1,0,_80);a1=a2;a2=a3;}if(_8(a1)){if(!a1.length){a2&&a2();}else{_83="require*"+uid();for(var mid,_84=[],i=0;i<a1.length;){mid=a1[i++];_84.push(_31(mid,_80));}_82=_c(_85("",_83,0,""),{injected:_21,deps:_84,def:a2||_3,require:_80?_80.require:req,gc:1});_2f[_82.mid]=_82;_79(_82);var _86=_87&&_25!=_26;_37(function(){_36(_82,_86);});if(!_82.executed){_30.push(_82);}_7e();}}return _81;},_5d=function(_88){if(!_88){return req;}var _89=_88.require;if(!_89){_89=function(a1,a2,a3){return _16(a1,a2,a3,_88,_89);};_88.require=_c(_89,req);_89.module=_88;_89.toUrl=function(_8a){return _5b(_8a,_88);};_89.toAbsMid=function(mid){return _b8(mid,_88);};if(0){_89.undef=function(mid){req.undef(mid,_88);};}if(1){_89.syncLoadNls=function(mid){var _8b=_5c(mid,_88),_8c=_2f[_8b.mid];if(!_8c||!_8c.executed){_8d=_52[_8b.mid]||_52[_53+_8b.url];if(_8d){_8e(_8d);_8c=_2f[_8b.mid];}}return _8c&&_8c.executed&&_8c.result;};}}return _89;},_30=[],_8f=[],_90={},_91=function(_92){_92.injected=_20;_90[_92.mid]=1;if(_92.url){_90[_92.url]=_92.pack||1;}_93();},_33=function(_94){_94.injected=_21;delete _90[_94.mid];if(_94.url){delete _90[_94.url];}if(_4(_90)){_95();1&&_25==xd&&(_25=_26);}},_96=req.idle=function(){return !_8f.length&&_4(_90)&&!_30.length&&!_87;},_97=function(_98,map){if(map){for(var i=0;i<map.length;i++){if(map[i][2].test(_98)){return map[i];}}}return 0;},_99=function(_9a){var _9b=[],_9c,_9d;_9a=_9a.replace(/\\/g,"/").split("/");while(_9a.length){_9c=_9a.shift();if(_9c==".."&&_9b.length&&_9d!=".."){_9b.pop();_9d=_9b[_9b.length-1];}else{if(_9c!="."){_9b.push(_9d=_9c);}}}return _9b.join("/");},_85=function(pid,mid,_9e,url){if(1){var xd=req.isXdUrl(url);return {pid:pid,mid:mid,pack:_9e,url:url,executed:0,def:0,isXd:xd,isAmd:!!(xd||(_4f[pid]&&_4f[pid].isAmd))};}else{return {pid:pid,mid:mid,pack:_9e,url:url,executed:0,def:0};}},_9f=function(mid,_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7){var pid,_a8,_a9,_aa,url,_ab,_ac,_ad;_ad=mid;_ac=/^\./.test(mid);if(/(^\/)|(\:)|(\.js$)/.test(mid)||(_ac&&!_a0)){return _85(0,mid,0,mid);}else{mid=_99(_ac?(_a0.mid+"/../"+mid):mid);if(/^\./.test(mid)){throw _f("irrationalPath",mid);}if(_a0){_aa=_97(_a0.mid,_a4);}_aa=_aa||_a4.star;_aa=_aa&&_97(mid,_aa[1]);if(_aa){mid=_aa[1]+mid.substring(_aa[3]);}_75=mid.match(/^([^\/]+)(\/(.+))?$/);pid=_75?_75[1]:"";if((_a8=_a1[pid])){mid=pid+"/"+(_a9=(_75[3]||_a8.main));}else{pid="";}var _ae=0,_af=0;_9(_a6,function(_b0){var _b1=mid.match(_b0[0]);if(_b1&&_b1.length>_ae){_af=_6(_b0[1])?mid.replace(_b0[0],_b0[1]):_b0[1];}});if(_af){return _9f(_af,0,_a1,_a2,_a3,_a4,_a5,_a6,_a7);}_ab=_a2[mid];if(_ab){return _a7?_85(_ab.pid,_ab.mid,_ab.pack,_ab.url):_a2[mid];}}_aa=_97(mid,_a5);if(_aa){url=_aa[1]+mid.substring(_aa[3]);}else{if(pid){url=_a8.location+"/"+_a9;}else{if(has("config-tlmSiblingOfDojo")){url="../"+mid;}else{url=mid;}}}if(!(/(^\/)|(\:)/.test(url))){url=_a3+url;}url+=".js";return _85(pid,mid,_a8,_99(url));},_5c=function(mid,_b2,_b3){return _9f(mid,_b2,_4f,_2f,req.baseUrl,_b3?[]:_50,_b3?[]:_4e,_b3?[]:_4c);},_b4=function(_b5,_b6,_b7){return _b5.normalize?_b5.normalize(_b6,function(mid){return _b8(mid,_b7);}):_b8(_b6,_b7);},_b9=0,_31=function(mid,_ba,_bb){var _bc,_bd,_be,_bf;_bc=mid.match(/^(.+?)\!(.*)$/);if(_bc){_bd=_31(_bc[1],_ba,_bb);if(1&&_25==_26&&!_bd.executed){_32(_bd);if(_bd.injected===_21&&!_bd.executed){_37(function(){_36(_bd);});}if(_bd.executed){_c0(_bd);}else{_30.unshift(_bd);}}if(_bd.executed===_24&&!_bd.load){_c0(_bd);}if(_bd.load){_be=_b4(_bd,_bc[2],_ba);mid=(_bd.mid+"!"+(_bd.dynamic?++_b9+"!":"")+_be);}else{_be=_bc[2];mid=_bd.mid+"!"+(++_b9)+"!waitingForPlugin";}_bf={plugin:_bd,mid:mid,req:_5d(_ba),prid:_be};}else{_bf=_5c(mid,_ba);}return _2f[_bf.mid]||(!_bb&&(_2f[_bf.mid]=_bf));},_b8=req.toAbsMid=function(mid,_c1){return _5c(mid,_c1).mid;},_5b=req.toUrl=function(_c2,_c3){var _c4=_5c(_c2+"/x",_c3),url=_c4.url;return _3f(_c4.pid===0?_c2:url.substring(0,url.length-5));},_c5={injected:_21,executed:_24,def:_22,result:_22},_c6=function(mid){return _2f[mid]=_c({mid:mid},_c5);},_c7=_c6("require"),_c8=_c6("exports"),_c9=_c6("module"),_ca=function(_cb,_cc){req.trace("loader-run-factory",[_cb.mid]);var _cd=_cb.def,_ce;1&&_27.unshift(_cb);if(has("config-dojo-loader-catches")){try{_ce=_6(_cd)?_cd.apply(null,_cc):_cd;}catch(e){_34(_44,_cb.result=_f("factoryThrew",[_cb,e]));}}else{_ce=_6(_cd)?_cd.apply(null,_cc):_cd;}_cb.result=_ce===undefined&&_cb.cjs?_cb.cjs.exports:_ce;1&&_27.shift(_cb);},_cf={},_d0=0,_c0=function(_d1){var _d2=_d1.result;_d1.dynamic=_d2.dynamic;_d1.normalize=_d2.normalize;_d1.load=_d2.load;return _d1;},_d3=function(_d4){var map={};_9(_d4.loadQ,function(_d5){var _d6=_b4(_d4,_d5.prid,_d5.req.module),mid=_d4.dynamic?_d5.mid.replace(/waitingForPlugin$/,_d6):(_d4.mid+"!"+_d6),_d7=_c(_c({},_d5),{mid:mid,prid:_d6,injected:0});if(!_2f[mid]){_e9(_2f[mid]=_d7);}map[_d5.mid]=_2f[mid];_33(_d5);delete _2f[_d5.mid];});_d4.loadQ=0;var _d8=function(_d9){for(var _da,_db=_d9.deps||[],i=0;i<_db.length;i++){_da=map[_db[i].mid];if(_da){_db[i]=_da;}}};for(var p in _2f){_d8(_2f[p]);}_9(_30,_d8);},_35=function(_dc){req.trace("loader-finish-exec",[_dc.mid]);_dc.executed=_24;_dc.defOrder=_d0++;1&&_9(_dc.provides,function(cb){cb();});if(_dc.loadQ){_c0(_dc);_d3(_dc);}for(i=0;i<_30.length;){if(_30[i]===_dc){_30.splice(i,1);}else{i++;}}if(/^require\*/.test(_dc.mid)){delete _2f[_dc.mid];}},_dd=[],_36=function(_de,_df){if(_de.executed===_23){req.trace("loader-circular-dependency",[_dd.concat(_de.mid).join("->")]);return (!_de.def||_df)?_cf:(_de.cjs&&_de.cjs.exports);}if(!_de.executed){if(!_de.def){return _cf;}var mid=_de.mid,_e0=_de.deps||[],arg,_e1,_e2=[],i=0;if(0){_dd.push(mid);req.trace("loader-exec-module",["exec",_dd.length,mid]);}_de.executed=_23;while((arg=_e0[i++])){_e1=((arg===_c7)?_5d(_de):((arg===_c8)?_de.cjs.exports:((arg===_c9)?_de.cjs:_36(arg,_df))));if(_e1===_cf){_de.executed=0;req.trace("loader-exec-module",["abort",mid]);0&&_dd.pop();return _cf;}_e2.push(_e1);}_ca(_de,_e2);_35(_de);0&&_dd.pop();}return _de.result;},_87=0,_37=function(_e3){try{_87++;_e3();}finally{_87--;}if(_96()){_34("idle",[]);}},_7e=function(){if(_87){return;}_37(function(){_29();for(var _e4,_e5,i=0;i<_30.length;){_e4=_d0;_e5=_30[i];_36(_e5);if(_e4!=_d0){_29();i=0;}else{i++;}}});};if(0){req.undef=function(_e6,_e7){var _e8=_31(_e6,_e7);_33(_e8);_c(_e8,{def:0,executed:0,injected:0,node:0});};}if(1){if(has("dojo-loader-eval-hint-url")===undefined){has.add("dojo-loader-eval-hint-url",1);}var _3f=function(url){url+="";return url+(_51?((/\?/.test(url)?"&":"?")+_51):"");},_e9=function(_ea){var _eb=_ea.plugin;if(_eb.executed===_24&&!_eb.load){_c0(_eb);}var _ec=function(def){_ea.result=def;_33(_ea);_35(_ea);_7e();};if(_eb.load){_eb.load(_ea.prid,_ea.req,_ec);}else{if(_eb.loadQ){_eb.loadQ.push(_ea);}else{_eb.loadQ=[_ea];_30.unshift(_eb);_32(_eb);}}},_8d=0,_7f=0,_ed=0,_8e=function(_ee,_ef){if(has("config-stripStrict")){_ee=_ee.replace(/"use strict"/g,"");}_ed=1;if(has("config-dojo-loader-catches")){try{if(_ee===_8d){_8d.call(null);}else{req.eval(_ee,has("dojo-loader-eval-hint-url")?_ef.url:_ef.mid);}}catch(e){_34(_44,_f("evalModuleThrew",_ef));}}else{if(_ee===_8d){_8d.call(null);}else{req.eval(_ee,has("dojo-loader-eval-hint-url")?_ef.url:_ef.mid);}}_ed=0;},_32=function(_f0){var mid=_f0.mid,url=_f0.url;if(_f0.executed||_f0.injected||_90[mid]||(_f0.url&&((_f0.pack&&_90[_f0.url]===_f0.pack)||_90[_f0.url]==1))){return;}_91(_f0);if(0){var _f1=0;if(_f0.plugin&&_f0.plugin.isCombo){req.combo.add(_f0.plugin.mid,_f0.prid,0,req);_f1=1;}else{if(!_f0.plugin){_f1=req.combo.add(0,_f0.mid,_f0.url,req);}}if(_f1){_76=1;return;}}if(_f0.plugin){_e9(_f0);return;}var _f2=function(){_7d(_f0);if(_f0.injected!==_21){if(has("dojo-enforceDefine")){_34(_44,_f("noDefine",_f0));return;}_33(_f0);_c(_f0,_c5);req.trace("loader-define-nonmodule",[_f0.url]);}if(1&&_25){!_27.length&&_7e();}else{_7e();}};_8d=_52[mid]||_52[_53+_f0.url];if(_8d){req.trace("loader-inject",["cache",_f0.mid,url]);_8e(_8d,_f0);_f2();return;}if(1&&_25){if(_f0.isXd){_25==_26&&(_25=xd);}else{if(_f0.isAmd&&_25!=_26){}else{var _f3=function(_f4){if(_25==_26){_27.unshift(_f0);_8e(_f4,_f0);_27.shift();_7d(_f0);if(!_f0.cjs){_33(_f0);_35(_f0);}if(_f0.finish){var _f5=mid+"*finish",_f6=_f0.finish;delete _f0.finish;def(_f5,["dojo",("dojo/require!"+_f6.join(",")).replace(/\./g,"/")],function(_f7){_9(_f6,function(mid){_f7.require(mid);});});_30.unshift(_31(_f5));}_f2();}else{_f4=_2a(_f0,_f4);if(_f4){_8e(_f4,_f0);_f2();}else{_7f=_f0;req.injectUrl(_3f(url),_f2,_f0);_7f=0;}}};req.trace("loader-inject",["xhr",_f0.mid,url,_25!=_26]);if(has("config-dojo-loader-catches")){try{req.getText(url,_25!=_26,_f3);}catch(e){_34(_44,_f("xhrInjectFailed",[_f0,e]));}}else{req.getText(url,_25!=_26,_f3);}return;}}}req.trace("loader-inject",["script",_f0.mid,url]);_7f=_f0;req.injectUrl(_3f(url),_f2,_f0);_7f=0;},_f8=function(_f9,_fa,def){req.trace("loader-define-module",[_f9.mid,_fa]);if(0&&_f9.plugin&&_f9.plugin.isCombo){_f9.result=_6(def)?def():def;_33(_f9);_35(_f9);return _f9;}var mid=_f9.mid;if(_f9.injected===_21){_34(_44,_f("multipleDefine",_f9));return _f9;}_c(_f9,{deps:_fa,def:def,cjs:{id:_f9.mid,uri:_f9.url,exports:(_f9.result={}),setExports:function(_fb){_f9.cjs.exports=_fb;},config:function(){return _f9.config;}}});for(var i=0;_fa[i];i++){_fa[i]=_31(_fa[i],_f9);}if(1&&_25&&!_90[mid]){_79(_f9);_30.push(_f9);_7e();}_33(_f9);if(!_6(def)&&!_fa.length){_f9.result=def;_35(_f9);}return _f9;},_7d=function(_fc,_fd){var _fe=[],_ff,args;while(_8f.length){args=_8f.shift();_fd&&(args[0]=_fd.shift());_ff=(args[0]&&_31(args[0]))||_fc;_fe.push([_ff,args[1],args[2]]);}_57(_fc);_9(_fe,function(args){_79(_f8.apply(null,args));});};}var _100=0,_95=_3,_93=_3;if(1){_95=function(){_100&&clearTimeout(_100);_100=0;};_93=function(){_95();if(req.waitms){_100=window.setTimeout(function(){_95();_34(_44,_f("timeout",_90));},req.waitms);}};}if(1){has.add("ie-event-behavior",doc.attachEvent&&typeof Windows==="undefined"&&(typeof opera==="undefined"||opera.toString()!="[object Opera]"));}if(1&&(1||1)){var _101=function(node,_102,_103,_104){if(!has("ie-event-behavior")){node.addEventListener(_102,_104,false);return function(){node.removeEventListener(_102,_104,false);};}else{node.attachEvent(_103,_104);return function(){node.detachEvent(_103,_104);};}},_105=_101(window,"load","onload",function(){req.pageLoaded=1;doc.readyState!="complete"&&(doc.readyState="complete");_105();});if(1){var _72=doc.getElementsByTagName("script"),i=0,_73;while(!_56){if(!/^dojo/.test((_73=_72[i++])&&_73.type)){_56=_73;}}req.injectUrl=function(url,_106,_107){var node=_107.node=doc.createElement("script"),_108=function(e){e=e||window.event;var node=e.target||e.srcElement;if(e.type==="load"||/complete|loaded/.test(node.readyState)){_109();_10a();_106&&_106();}},_109=_101(node,"load","onreadystatechange",_108),_10a=_101(node,"error","onerror",function(e){_109();_10a();_34(_44,_f("scriptError",[url,e]));});node.type="text/javascript";node.charset="utf-8";node.src=url;_56.parentNode.insertBefore(node,_56);return node;};}}if(1){req.log=function(){try{for(var i=0;i<arguments.length;i++){}}catch(e){}};}else{req.log=_3;}if(0){var _10b=req.trace=function(_10c,args){if(_10b.on&&_10b.group[_10c]){_34("trace",[_10c,args]);for(var arg,dump=[],text="trace:"+_10c+(args.length?(":"+args[0]):""),i=1;i<args.length;){arg=args[i++];if(_7(arg)){text+=", "+arg;}else{dump.push(arg);}}req.log(text);dump.length&&dump.push(".");req.log.apply(req,dump);}};_c(_10b,{on:1,group:{},set:function(_10d,_10e){if(_7(_10d)){_10b.group[_10d]=_10e;}else{_c(_10b.group,_10d);}}});_10b.set(_c(_c(_c({},_2.trace),_1.trace),_55.trace));on("config",function(_10f){_10f.trace&&_10b.set(_10f.trace);});}else{req.trace=_3;}var def=function(mid,_110,_111){var _112=arguments.length,_113=["require","exports","module"],args=[0,mid,_110];if(_112==1){args=[0,(_6(mid)?_113:[]),mid];}else{if(_112==2&&_7(mid)){args=[mid,(_6(_110)?_113:[]),_110];}else{if(_112==3){args=[mid,_110,_111];}}}if(0&&args[1]===_113){args[2].toString().replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,"").replace(/require\(["']([\w\!\-_\.\/]+)["']\)/g,function(_114,dep){args[1].push(dep);});}req.trace("loader-define",args.slice(0,2));var _115=args[0]&&_31(args[0]),_116;if(_115&&!_90[_115.mid]){_79(_f8(_115,args[1],args[2]));}else{if(!has("ie-event-behavior")||!1||_ed){_8f.push(args);}else{_115=_115||_7f;if(!_115){for(mid in _90){_116=_2f[mid];if(_116&&_116.node&&_116.node.readyState==="interactive"){_115=_116;break;}}if(0&&!_115){for(var i=0;i<_77.length;i++){_115=_77[i];if(_115.node&&_115.node.readyState==="interactive"){break;}_115=0;}}}if(0&&_8(_115)){_79(_f8(_31(_115.shift()),args[1],args[2]));if(!_115.length){_77.splice(i,1);}}else{if(_115){_57(_115);_79(_f8(_115,args[1],args[2]));}else{_34(_44,_f("ieDefineFailed",args[0]));}}_7e();}}};def.amd={vendor:"dojotoolkit.org"};if(0){req.def=def;}_c(_c(req,_2.loaderPatch),_1.loaderPatch);on(_44,function(arg){try{console.error(arg);if(arg instanceof Error){for(var p in arg){}}}catch(e){}});_c(req,{uid:uid,cache:_52,packs:_4f});if(0){_c(req,{paths:_4d,aliases:_4c,modules:_2f,legacyMode:_25,execQ:_30,defQ:_8f,waiting:_90,packs:_4f,mapProgs:_50,pathsMapProg:_4e,listenerQueues:_43,computeMapProg:_5f,computeAliases:_61,runMapProg:_97,compactPath:_99,getModuleInfo:_9f});}if(_17.define){if(1){_34(_44,_f("defineAlreadyDefined",0));}return;}else{_17.define=def;_17.require=req;if(0){require=req;}}if(0&&req.combo&&req.combo.plugins){var _117=req.combo.plugins,_118;for(_118 in _117){_c(_c(_31(_118),_117[_118]),{isCombo:1,executed:"executed",load:1});}}if(1){_9(_68,function(c){_69(c);});var _119=_55.deps||_1.deps||_2.deps,_11a=_55.callback||_1.callback||_2.callback;req.boot=(_119||_11a)?[_119||[],_11a]:0;}if(!1){!req.async&&req(["dojo"]);req.boot&&req.apply(null,req.boot);}})(this.dojoConfig||this.djConfig||this.require||{},{async:0,hasCache:{"config-selectorEngine":"acme","config-tlmSiblingOfDojo":1,"dojo-built":1,"dojo-loader":1,dom:1,"host-browser":1},packages:[{location:"../dijit",name:"dijit"},{location:"../dojox",name:"dojox"},{location:".",name:"dojo"}]});require({cache:{"dojo/request/default":function(){define(["exports","require","../has"],function(_11b,_11c,has){var _11d=has("config-requestProvider"),_11e;if(1){_11e="./xhr";}else{if(0){_11e="./node";}}if(!_11d){_11d=_11e;}_11b.getPlatformDefaultId=function(){return _11e;};_11b.load=function(id,_11f,_120,_121){_11c([id=="platform"?_11e:_11d],function(_122){_120(_122);});};});},"dojo/_base/fx":function(){define(["./kernel","./config","./lang","../Evented","./Color","../aspect","../sniff","../dom","../dom-style"],function(dojo,_123,lang,_124,_125,_126,has,dom,_127){var _128=lang.mixin;var _129={};var _12a=_129._Line=function(_12b,end){this.start=_12b;this.end=end;};_12a.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};var _12c=_129.Animation=function(args){_128(this,args);if(lang.isArray(this.curve)){this.curve=new _12a(this.curve[0],this.curve[1]);}};_12c.prototype=new _124();lang.extend(_12c,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){var _12d=this._percent,_12e=this.easing;return _12e?_12e(_12d):_12d;},_fire:function(evt,args){var a=args||[];if(this[evt]){if(_123.debugAtAllCosts){this[evt].apply(this,a);}else{try{this[evt].apply(this,a);}catch(e){console.error("exception in animation handler for:",evt);console.error(e);}}}return this;},play:function(_12f,_130){var _131=this;if(_131._delayTimer){_131._clearTimer();}if(_130){_131._stopTimer();_131._active=_131._paused=false;_131._percent=0;}else{if(_131._active&&!_131._paused){return _131;}}_131._fire("beforeBegin",[_131.node]);var de=_12f||_131.delay,_132=lang.hitch(_131,"_play",_130);if(de>0){_131._delayTimer=setTimeout(_132,de);return _131;}_132();return _131;},_play:function(_133){var _134=this;if(_134._delayTimer){_134._clearTimer();}_134._startTime=new Date().valueOf();if(_134._paused){_134._startTime-=_134.duration*_134._percent;}_134._active=true;_134._paused=false;var _135=_134.curve.getValue(_134._getStep());if(!_134._percent){if(!_134._startRepeatCount){_134._startRepeatCount=_134.repeat;}_134._fire("onBegin",[_135]);}_134._fire("onPlay",[_135]);_134._cycle();return _134;},pause:function(){var _136=this;if(_136._delayTimer){_136._clearTimer();}_136._stopTimer();if(!_136._active){return _136;}_136._paused=true;_136._fire("onPause",[_136.curve.getValue(_136._getStep())]);return _136;},gotoPercent:function(_137,_138){var _139=this;_139._stopTimer();_139._active=_139._paused=true;_139._percent=_137;if(_138){_139.play();}return _139;},stop:function(_13a){var _13b=this;if(_13b._delayTimer){_13b._clearTimer();}if(!_13b._timer){return _13b;}_13b._stopTimer();if(_13a){_13b._percent=1;}_13b._fire("onStop",[_13b.curve.getValue(_13b._getStep())]);_13b._active=_13b._paused=false;return _13b;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _13c=this;if(_13c._active){var curr=new Date().valueOf();var step=_13c.duration===0?1:(curr-_13c._startTime)/(_13c.duration);if(step>=1){step=1;}_13c._percent=step;if(_13c.easing){step=_13c.easing(step);}_13c._fire("onAnimate",[_13c.curve.getValue(step)]);if(_13c._percent<1){_13c._startTimer();}else{_13c._active=false;if(_13c.repeat>0){_13c.repeat--;_13c.play(null,true);}else{if(_13c.repeat==-1){_13c.play(null,true);}else{if(_13c._startRepeatCount){_13c.repeat=_13c._startRepeatCount;_13c._startRepeatCount=0;}}}_13c._percent=0;_13c._fire("onEnd",[_13c.node]);!_13c.repeat&&_13c._stopTimer();}}return _13c;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_13d=null,_13e={run:function(){}};lang.extend(_12c,{_startTimer:function(){if(!this._timer){this._timer=_126.after(_13e,"run",lang.hitch(this,"_cycle"),true);ctr++;}if(!_13d){_13d=setInterval(lang.hitch(_13e,"run"),this.rate);}},_stopTimer:function(){if(this._timer){this._timer.remove();this._timer=null;ctr--;}if(ctr<=0){clearInterval(_13d);_13d=null;ctr=0;}}});var _13f=has("ie")?function(node){var ns=node.style;if(!ns.width.length&&_127.get(node,"width")=="auto"){ns.width="auto";}}:function(){};_129._fade=function(args){args.node=dom.byId(args.node);var _140=_128({properties:{}},args),_141=(_140.properties.opacity={});_141.start=!("start" in _140)?function(){return +_127.get(_140.node,"opacity")||0;}:_140.start;_141.end=_140.end;var anim=_129.animateProperty(_140);_126.after(anim,"beforeBegin",lang.partial(_13f,_140.node),true);return anim;};_129.fadeIn=function(args){return _129._fade(_128({end:1},args));};_129.fadeOut=function(args){return _129._fade(_128({end:0},args));};_129._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _142=function(_143){this._properties=_143;for(var p in _143){var prop=_143[p];if(prop.start instanceof _125){prop.tempColor=new _125();}}};_142.prototype.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p],_144=prop.start;if(_144 instanceof _125){ret[p]=_125.blendColors(_144,prop.end,r,prop.tempColor).toCss();}else{if(!lang.isArray(_144)){ret[p]=((prop.end-_144)*r)+_144+(p!="opacity"?prop.units||"px":0);}}}return ret;};_129.animateProperty=function(args){var n=args.node=dom.byId(args.node);if(!args.easing){args.easing=dojo._defaultEasing;}var anim=new _12c(args);_126.after(anim,"beforeBegin",lang.hitch(anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];if(lang.isFunction(prop)){prop=prop(n);}prop=pm[p]=_128({},(lang.isObject(prop)?prop:{end:prop}));if(lang.isFunction(prop.start)){prop.start=prop.start(n);}if(lang.isFunction(prop.end)){prop.end=prop.end(n);}var _145=(p.toLowerCase().indexOf("color")>=0);function _146(node,p){var v={height:node.offsetHeight,width:node.offsetWidth}[p];if(v!==undefined){return v;}v=_127.get(node,p);return (p=="opacity")?+v:(_145?v:parseFloat(v));};if(!("end" in prop)){prop.end=_146(n,p);}else{if(!("start" in prop)){prop.start=_146(n,p);}}if(_145){prop.start=new _125(prop.start);prop.end=new _125(prop.end);}else{prop.start=(p=="opacity")?+prop.start:parseFloat(prop.start);}}this.curve=new _142(pm);}),true);_126.after(anim,"onAnimate",lang.hitch(_127,"set",anim.node),true);return anim;};_129.anim=function(node,_147,_148,_149,_14a,_14b){return _129.animateProperty({node:node,duration:_148||_12c.prototype.duration,properties:_147,easing:_149,onEnd:_14a}).play(_14b||0);};if(1){_128(dojo,_129);dojo._Animation=_12c;}return _129;});},"dojo/dom-form":function(){define(["./_base/lang","./dom","./io-query","./json"],function(lang,dom,ioq,json){function _14c(obj,name,_14d){if(_14d===null){return;}var val=obj[name];if(typeof val=="string"){obj[name]=[val,_14d];}else{if(lang.isArray(val)){val.push(_14d);}else{obj[name]=_14d;}}};var _14e="file|submit|image|reset|button";var form={fieldToObject:function fieldToObject(_14f){var ret=null;_14f=dom.byId(_14f);if(_14f){var _150=_14f.name,type=(_14f.type||"").toLowerCase();if(_150&&type&&!_14f.disabled){if(type=="radio"||type=="checkbox"){if(_14f.checked){ret=_14f.value;}}else{if(_14f.multiple){ret=[];var _151=[_14f.firstChild];while(_151.length){for(var node=_151.pop();node;node=node.nextSibling){if(node.nodeType==1&&node.tagName.toLowerCase()=="option"){if(node.selected){ret.push(node.value);}}else{if(node.nextSibling){_151.push(node.nextSibling);}if(node.firstChild){_151.push(node.firstChild);}break;}}}}else{ret=_14f.value;}}}}return ret;},toObject:function formToObject(_152){var ret={},_153=dom.byId(_152).elements;for(var i=0,l=_153.length;i<l;++i){var item=_153[i],_154=item.name,type=(item.type||"").toLowerCase();if(_154&&type&&_14e.indexOf(type)<0&&!item.disabled){_14c(ret,_154,form.fieldToObject(item));if(type=="image"){ret[_154+".x"]=ret[_154+".y"]=ret[_154].x=ret[_154].y=0;}}}return ret;},toQuery:function formToQuery(_155){return ioq.objectToQuery(form.toObject(_155));},toJson:function formToJson(_156,_157){return json.stringify(form.toObject(_156),null,_157?4:0);}};return form;});},"dojo/i18n":function(){define(["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json","module"],function(dojo,_158,has,_159,_15a,lang,xhr,json,_15b){has.add("dojo-preload-i18n-Api",1);1||has.add("dojo-v1x-i18n-Api",1);var _15c=dojo.i18n={},_15d=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_15e=function(root,_15f,_160,_161){for(var _162=[_160+_161],_163=_15f.split("-"),_164="",i=0;i<_163.length;i++){_164+=(_164?"-":"")+_163[i];if(!root||root[_164]){_162.push(_160+_164+"/"+_161);_162.specificity=_164;}}return _162;},_165={},_166=function(_167,_168,_169){_169=_169?_169.toLowerCase():dojo.locale;_167=_167.replace(/\./g,"/");_168=_168.replace(/\./g,"/");return (/root/i.test(_169))?(_167+"/nls/"+_168):(_167+"/nls/"+_169+"/"+_168);},_16a=dojo.getL10nName=function(_16b,_16c,_16d){return _16b=_15b.id+"!"+_166(_16b,_16c,_16d);},_16e=function(_16f,_170,_171,_172,_173,load){_16f([_170],function(root){var _174=lang.clone(root.root||root.ROOT),_175=_15e(!root._v1x&&root,_173,_171,_172);_16f(_175,function(){for(var i=1;i<_175.length;i++){_174=lang.mixin(lang.clone(_174),arguments[i]);}var _176=_170+"/"+_173;_165[_176]=_174;_174.$locale=_175.specificity;load();});});},_177=function(id,_178){return /^\./.test(id)?_178(id):id;},_179=function(_17a){var list=_15a.extraLocale||[];list=lang.isArray(list)?list:[list];list.push(_17a);return list;},load=function(id,_17b,load){if(has("dojo-preload-i18n-Api")){var _17c=id.split("*"),_17d=_17c[1]=="preload";if(_17d){if(!_165[id]){_165[id]=1;_17e(_17c[2],json.parse(_17c[3]),1,_17b);}load(1);}if(_17d||_17f(id,_17b,load)){return;}}var _180=_15d.exec(id),_181=_180[1]+"/",_182=_180[5]||_180[4],_183=_181+_182,_184=(_180[5]&&_180[4]),_185=_184||dojo.locale||"",_186=_183+"/"+_185,_187=_184?[_185]:_179(_185),_188=_187.length,_189=function(){if(!--_188){load(lang.delegate(_165[_186]));}};_159.forEach(_187,function(_18a){var _18b=_183+"/"+_18a;if(has("dojo-preload-i18n-Api")){_18c(_18b);}if(!_165[_18b]){_16e(_17b,_183,_181,_182,_18a,_189);}else{_189();}});};if(has("dojo-unit-tests")){var _18d=_15c.unitTests=[];}if(has("dojo-preload-i18n-Api")||1){var _18e=_15c.normalizeLocale=function(_18f){var _190=_18f?_18f.toLowerCase():dojo.locale;return _190=="root"?"ROOT":_190;},isXd=function(mid,_191){return (1&&1)?_191.isXdUrl(_158.toUrl(mid+".js")):true;},_192=0,_193=[],_17e=_15c._preloadLocalizations=function(_194,_195,_196,_197){_197=_197||_158;function _198(mid,_199){if(isXd(mid,_197)||_196){_197([mid],_199);}else{_1b3([mid],_199,_197);}};function _19a(_19b,func){var _19c=_19b.split("-");while(_19c.length){if(func(_19c.join("-"))){return;}_19c.pop();}func("ROOT");};function _19d(){_192++;};function _19e(){--_192;while(!_192&&_193.length){load.apply(null,_193.shift());}};function _19f(path,name,loc,_1a0){return _1a0.toAbsMid(path+name+"/"+loc);};function _1a1(_1a2){_1a2=_18e(_1a2);_19a(_1a2,function(loc){if(_159.indexOf(_195,loc)>=0){var mid=_194.replace(/\./g,"/")+"_"+loc;_19d();_198(mid,function(_1a3){for(var p in _1a3){var _1a4=_1a3[p],_1a5=p.match(/(.+)\/([^\/]+)$/),_1a6,_1a7;if(!_1a5){continue;}_1a6=_1a5[2];_1a7=_1a5[1]+"/";_1a4._localized=_1a4._localized||{};var _1a8;if(loc==="ROOT"){var root=_1a8=_1a4._localized;delete _1a4._localized;root.root=_1a4;_165[_158.toAbsMid(p)]=root;}else{_1a8=_1a4._localized;_165[_19f(_1a7,_1a6,loc,_158)]=_1a4;}if(loc!==_1a2){function _1a9(_1aa,_1ab,_1ac,_1ad){var _1ae=[],_1af=[];_19a(_1a2,function(loc){if(_1ad[loc]){_1ae.push(_158.toAbsMid(_1aa+loc+"/"+_1ab));_1af.push(_19f(_1aa,_1ab,loc,_158));}});if(_1ae.length){_19d();_197(_1ae,function(){for(var i=0;i<_1ae.length;i++){_1ac=lang.mixin(lang.clone(_1ac),arguments[i]);_165[_1af[i]]=_1ac;}_165[_19f(_1aa,_1ab,_1a2,_158)]=lang.clone(_1ac);_19e();});}else{_165[_19f(_1aa,_1ab,_1a2,_158)]=_1ac;}};_1a9(_1a7,_1a6,_1a4,_1a8);}}_19e();});return true;}return false;});};_1a1();_159.forEach(dojo.config.extraLocale,_1a1);},_17f=function(id,_1b0,load){if(_192){_193.push([id,_1b0,load]);}return _192;},_18c=function(){};}if(1){var _1b1={},_1b2=new Function("__bundle","__checkForLegacyModules","__mid","__amdValue","var define = function(mid, factory){define.called = 1; __amdValue.result = factory || mid;},"+"\t require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return __amdValue;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_1b3=function(deps,_1b4,_1b5){var _1b6=[];_159.forEach(deps,function(mid){var url=_1b5.toUrl(mid+".js");function load(text){var _1b7=_1b2(text,_18c,mid,_1b1);if(_1b7===_1b1){_1b6.push(_165[url]=_1b1.result);}else{if(_1b7 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_1b7);_1b7={};}_1b6.push(_165[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_1b7:{root:_1b7,_v1x:1}));}};if(_165[url]){_1b6.push(_165[url]);}else{var _1b8=_1b5.syncLoadNls(mid);if(_1b8){_1b6.push(_1b8);}else{if(!xhr){try{_1b5.getText(url,true,load);}catch(e){_1b6.push(_165[url]={});}}else{xhr.get({url:url,sync:true,load:load,error:function(){_1b6.push(_165[url]={});}});}}}});_1b4&&_1b4.apply(null,_1b6);};_18c=function(_1b9){for(var _1ba,_1bb=_1b9.split("/"),_1bc=dojo.global[_1bb[0]],i=1;_1bc&&i<_1bb.length-1;_1bc=_1bc[_1bb[i++]]){}if(_1bc){_1ba=_1bc[_1bb[i]];if(!_1ba){_1ba=_1bc[_1bb[i].replace(/-/g,"_")];}if(_1ba){_165[_1b9]=_1ba;}}return _1ba;};_15c.getLocalization=function(_1bd,_1be,_1bf){var _1c0,_1c1=_166(_1bd,_1be,_1bf);load(_1c1,(!isXd(_1c1,_158)?function(deps,_1c2){_1b3(deps,_1c2,_158);}:_158),function(_1c3){_1c0=_1c3;});return _1c0;};if(has("dojo-unit-tests")){_18d.push(function(doh){doh.register("tests.i18n.unit",function(t){var _1c4;_1c4=_1b2("{prop:1}",_18c,"nonsense",_1b1);t.is({prop:1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("({prop:1})",_18c,"nonsense",_1b1);t.is({prop:1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("{'prop-x':1}",_18c,"nonsense",_1b1);t.is({"prop-x":1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("({'prop-x':1})",_18c,"nonsense",_1b1);t.is({"prop-x":1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("define({'prop-x':1})",_18c,"nonsense",_1b1);t.is(_1b1,_1c4);t.is({"prop-x":1},_1b1.result);_1c4=_1b2("define('some/module', {'prop-x':1})",_18c,"nonsense",_1b1);t.is(_1b1,_1c4);t.is({"prop-x":1},_1b1.result);_1c4=_1b2("this is total nonsense and should throw an error",_18c,"nonsense",_1b1);t.is(_1c4 instanceof Error,true);});});}}return lang.mixin(_15c,{dynamic:true,normalize:_177,load:load,cache:_165,getL10nName:_16a});});},"dojo/promise/tracer":function(){define(["../_base/lang","./Promise","../Evented"],function(lang,_1c5,_1c6){"use strict";var _1c7=new _1c6;var emit=_1c7.emit;_1c7.emit=null;function _1c8(args){setTimeout(function(){emit.apply(_1c7,args);},0);};_1c5.prototype.trace=function(){var args=lang._toArray(arguments);this.then(function(_1c9){_1c8(["resolved",_1c9].concat(args));},function(_1ca){_1c8(["rejected",_1ca].concat(args));},function(_1cb){_1c8(["progress",_1cb].concat(args));});return this;};_1c5.prototype.traceRejected=function(){var args=lang._toArray(arguments);this.otherwise(function(_1cc){_1c8(["rejected",_1cc].concat(args));});return this;};return _1c7;});},"dojo/errors/RequestError":function(){define(["./create"],function(_1cd){return _1cd("RequestError",function(_1ce,_1cf){this.response=_1cf;});});},"dojo/_base/html":function(){define(["./kernel","../dom","../dom-style","../dom-attr","../dom-prop","../dom-class","../dom-construct","../dom-geometry"],function(dojo,dom,_1d0,attr,prop,cls,ctr,geom){dojo.byId=dom.byId;dojo.isDescendant=dom.isDescendant;dojo.setSelectable=dom.setSelectable;dojo.getAttr=attr.get;dojo.setAttr=attr.set;dojo.hasAttr=attr.has;dojo.removeAttr=attr.remove;dojo.getNodeProp=attr.getNodeProp;dojo.attr=function(node,name,_1d1){if(arguments.length==2){return attr[typeof name=="string"?"get":"set"](node,name);}return attr.set(node,name,_1d1);};dojo.hasClass=cls.contains;dojo.addClass=cls.add;dojo.removeClass=cls.remove;dojo.toggleClass=cls.toggle;dojo.replaceClass=cls.replace;dojo._toDom=dojo.toDom=ctr.toDom;dojo.place=ctr.place;dojo.create=ctr.create;dojo.empty=function(node){ctr.empty(node);};dojo._destroyElement=dojo.destroy=function(node){ctr.destroy(node);};dojo._getPadExtents=dojo.getPadExtents=geom.getPadExtents;dojo._getBorderExtents=dojo.getBorderExtents=geom.getBorderExtents;dojo._getPadBorderExtents=dojo.getPadBorderExtents=geom.getPadBorderExtents;dojo._getMarginExtents=dojo.getMarginExtents=geom.getMarginExtents;dojo._getMarginSize=dojo.getMarginSize=geom.getMarginSize;dojo._getMarginBox=dojo.getMarginBox=geom.getMarginBox;dojo.setMarginBox=geom.setMarginBox;dojo._getContentBox=dojo.getContentBox=geom.getContentBox;dojo.setContentSize=geom.setContentSize;dojo._isBodyLtr=dojo.isBodyLtr=geom.isBodyLtr;dojo._docScroll=dojo.docScroll=geom.docScroll;dojo._getIeDocumentElementOffset=dojo.getIeDocumentElementOffset=geom.getIeDocumentElementOffset;dojo._fixIeBiDiScrollLeft=dojo.fixIeBiDiScrollLeft=geom.fixIeBiDiScrollLeft;dojo.position=geom.position;dojo.marginBox=function marginBox(node,box){return box?geom.setMarginBox(node,box):geom.getMarginBox(node);};dojo.contentBox=function contentBox(node,box){return box?geom.setContentSize(node,box):geom.getContentBox(node);};dojo.coords=function(node,_1d2){dojo.deprecated("dojo.coords()","Use dojo.position() or dojo.marginBox().");node=dom.byId(node);var s=_1d0.getComputedStyle(node),mb=geom.getMarginBox(node,s);var abs=geom.position(node,_1d2);mb.x=abs.x;mb.y=abs.y;return mb;};dojo.getProp=prop.get;dojo.setProp=prop.set;dojo.prop=function(node,name,_1d3){if(arguments.length==2){return prop[typeof name=="string"?"get":"set"](node,name);}return prop.set(node,name,_1d3);};dojo.getStyle=_1d0.get;dojo.setStyle=_1d0.set;dojo.getComputedStyle=_1d0.getComputedStyle;dojo.__toPixelValue=dojo.toPixelValue=_1d0.toPixelValue;dojo.style=function(node,name,_1d4){switch(arguments.length){case 1:return _1d0.get(node);case 2:return _1d0[typeof name=="string"?"get":"set"](node,name);}return _1d0.set(node,name,_1d4);};return dojo;});},"dojo/_base/kernel":function(){define(["../has","./config","require","module"],function(has,_1d5,_1d6,_1d7){var i,p,_1d8={},_1d9={},dojo={config:_1d5,global:this,dijit:_1d8,dojox:_1d9};var _1da={dojo:["dojo",dojo],dijit:["dijit",_1d8],dojox:["dojox",_1d9]},_1db=(_1d6.map&&_1d6.map[_1d7.id.match(/[^\/]+/)[0]]),item;for(p in _1db){if(_1da[p]){_1da[p][0]=_1db[p];}else{_1da[p]=[_1db[p],{}];}}for(p in _1da){item=_1da[p];item[1]._scopeName=item[0];if(!_1d5.noGlobals){this[item[0]]=item[1];}}dojo.scopeMap=_1da;dojo.baseUrl=dojo.config.baseUrl=_1d6.baseUrl;dojo.isAsync=!1||_1d6.async;dojo.locale=_1d5.locale;var rev="$Rev: fd52c96 $".match(/[0-9a-f]{7,}/);dojo.version={major:1,minor:9,patch:3,flag:"",revision:rev?rev[0]:NaN,toString:function(){var v=dojo.version;return v.major+"."+v.minor+"."+v.patch+v.flag+" ("+v.revision+")";}};1||has.add("extend-dojo",1);(Function("d","d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);if(0){dojo.exit=function(_1dc){quit(_1dc);};}else{dojo.exit=function(){};}1||has.add("dojo-guarantee-console",1);if(1){typeof console!="undefined"||(console={});var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var tn;i=0;while((tn=cn[i++])){if(!console[tn]){(function(){var tcn=tn+"";console[tcn]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(tcn+":");console["log"](a.join(" "));}:function(){};console[tcn]._fake=true;})();}}}has.add("dojo-debug-messages",!!_1d5.isDebug);dojo.deprecated=dojo.experimental=function(){};if(has("dojo-debug-messages")){dojo.deprecated=function(_1dd,_1de,_1df){var _1e0="DEPRECATED: "+_1dd;if(_1de){_1e0+=" "+_1de;}if(_1df){_1e0+=" -- will be removed in version: "+_1df;}console.warn(_1e0);};dojo.experimental=function(_1e1,_1e2){var _1e3="EXPERIMENTAL: "+_1e1+" -- APIs subject to change without notice.";if(_1e2){_1e3+=" "+_1e2;}console.warn(_1e3);};}1||has.add("dojo-modulePaths",1);if(1){if(_1d5.modulePaths){dojo.deprecated("dojo.modulePaths","use paths configuration");var _1e4={};for(p in _1d5.modulePaths){_1e4[p.replace(/\./g,"/")]=_1d5.modulePaths[p];}_1d6({paths:_1e4});}}1||has.add("dojo-moduleUrl",1);if(1){dojo.moduleUrl=function(_1e5,url){dojo.deprecated("dojo.moduleUrl()","use require.toUrl","2.0");var _1e6=null;if(_1e5){_1e6=_1d6.toUrl(_1e5.replace(/\./g,"/")+(url?("/"+url):"")+"/*.*").replace(/\/\*\.\*/,"")+(url?"":"/");}return _1e6;};}dojo._hasResource={};return dojo;});},"dojo/io-query":function(){define(["./_base/lang"],function(lang){var _1e7={};return {objectToQuery:function objectToQuery(map){var enc=encodeURIComponent,_1e8=[];for(var name in map){var _1e9=map[name];if(_1e9!=_1e7[name]){var _1ea=enc(name)+"=";if(lang.isArray(_1e9)){for(var i=0,l=_1e9.length;i<l;++i){_1e8.push(_1ea+enc(_1e9[i]));}}else{_1e8.push(_1ea+enc(_1e9));}}}return _1e8.join("&");},queryToObject:function queryToObject(str){var dec=decodeURIComponent,qp=str.split("&"),ret={},name,val;for(var i=0,l=qp.length,item;i<l;++i){item=qp[i];if(item.length){var s=item.indexOf("=");if(s<0){name=dec(item);val="";}else{name=dec(item.slice(0,s));val=dec(item.slice(s+1));}if(typeof ret[name]=="string"){ret[name]=[ret[name]];}if(lang.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}}return ret;}};});},"dojo/_base/Deferred":function(){define(["./kernel","../Deferred","../promise/Promise","../errors/CancelError","../has","./lang","../when"],function(dojo,_1eb,_1ec,_1ed,has,lang,when){var _1ee=function(){};var _1ef=Object.freeze||function(){};var _1f0=dojo.Deferred=function(_1f1){var _1f2,_1f3,_1f4,_1f5,_1f6,head,_1f7;var _1f8=(this.promise=new _1ec());function _1f9(_1fa){if(_1f3){throw new Error("This deferred has already been resolved");}_1f2=_1fa;_1f3=true;_1fb();};function _1fb(){var _1fc;while(!_1fc&&_1f7){var _1fd=_1f7;_1f7=_1f7.next;if((_1fc=(_1fd.progress==_1ee))){_1f3=false;}var func=(_1f6?_1fd.error:_1fd.resolved);if(has("config-useDeferredInstrumentation")){if(_1f6&&_1eb.instrumentRejected){_1eb.instrumentRejected(_1f2,!!func);}}if(func){try{var _1fe=func(_1f2);if(_1fe&&typeof _1fe.then==="function"){_1fe.then(lang.hitch(_1fd.deferred,"resolve"),lang.hitch(_1fd.deferred,"reject"),lang.hitch(_1fd.deferred,"progress"));continue;}var _1ff=_1fc&&_1fe===undefined;if(_1fc&&!_1ff){_1f6=_1fe instanceof Error;}_1fd.deferred[_1ff&&_1f6?"reject":"resolve"](_1ff?_1f2:_1fe);}catch(e){_1fd.deferred.reject(e);}}else{if(_1f6){_1fd.deferred.reject(_1f2);}else{_1fd.deferred.resolve(_1f2);}}}};this.isResolved=_1f8.isResolved=function(){return _1f5==0;};this.isRejected=_1f8.isRejected=function(){return _1f5==1;};this.isFulfilled=_1f8.isFulfilled=function(){return _1f5>=0;};this.isCanceled=_1f8.isCanceled=function(){return _1f4;};this.resolve=this.callback=function(_200){this.fired=_1f5=0;this.results=[_200,null];_1f9(_200);};this.reject=this.errback=function(_201){_1f6=true;this.fired=_1f5=1;if(has("config-useDeferredInstrumentation")){if(_1eb.instrumentRejected){_1eb.instrumentRejected(_201,!!_1f7);}}_1f9(_201);this.results=[null,_201];};this.progress=function(_202){var _203=_1f7;while(_203){var _204=_203.progress;_204&&_204(_202);_203=_203.next;}};this.addCallbacks=function(_205,_206){this.then(_205,_206,_1ee);return this;};_1f8.then=this.then=function(_207,_208,_209){var _20a=_209==_1ee?this:new _1f0(_1f8.cancel);var _20b={resolved:_207,error:_208,progress:_209,deferred:_20a};if(_1f7){head=head.next=_20b;}else{_1f7=head=_20b;}if(_1f3){_1fb();}return _20a.promise;};var _20c=this;_1f8.cancel=this.cancel=function(){if(!_1f3){var _20d=_1f1&&_1f1(_20c);if(!_1f3){if(!(_20d instanceof Error)){_20d=new _1ed(_20d);}_20d.log=false;_20c.reject(_20d);}}_1f4=true;};_1ef(_1f8);};lang.extend(_1f0,{addCallback:function(_20e){return this.addCallbacks(lang.hitch.apply(dojo,arguments));},addErrback:function(_20f){return this.addCallbacks(null,lang.hitch.apply(dojo,arguments));},addBoth:function(_210){var _211=lang.hitch.apply(dojo,arguments);return this.addCallbacks(_211,_211);},fired:-1});_1f0.when=dojo.when=when;return _1f0;});},"dojo/NodeList-dom":function(){define(["./_base/kernel","./query","./_base/array","./_base/lang","./dom-class","./dom-construct","./dom-geometry","./dom-attr","./dom-style"],function(dojo,_212,_213,lang,_214,_215,_216,_217,_218){var _219=function(a){return a.length==1&&(typeof a[0]=="string");};var _21a=function(node){var p=node.parentNode;if(p){p.removeChild(node);}};var _21b=_212.NodeList,awc=_21b._adaptWithCondition,aafe=_21b._adaptAsForEach,aam=_21b._adaptAsMap;function _21c(_21d){return function(node,name,_21e){if(arguments.length==2){return _21d[typeof name=="string"?"get":"set"](node,name);}return _21d.set(node,name,_21e);};};lang.extend(_21b,{_normalize:function(_21f,_220){var _221=_21f.parse===true;if(typeof _21f.template=="string"){var _222=_21f.templateFunc||(dojo.string&&dojo.string.substitute);_21f=_222?_222(_21f.template,_21f):_21f;}var type=(typeof _21f);if(type=="string"||type=="number"){_21f=_215.toDom(_21f,(_220&&_220.ownerDocument));if(_21f.nodeType==11){_21f=lang._toArray(_21f.childNodes);}else{_21f=[_21f];}}else{if(!lang.isArrayLike(_21f)){_21f=[_21f];}else{if(!lang.isArray(_21f)){_21f=lang._toArray(_21f);}}}if(_221){_21f._runParse=true;}return _21f;},_cloneNode:function(node){return node.cloneNode(true);},_place:function(ary,_223,_224,_225){if(_223.nodeType!=1&&_224=="only"){return;}var _226=_223,_227;var _228=ary.length;for(var i=_228-1;i>=0;i--){var node=(_225?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&dojo.parser&&dojo.parser.parse){if(!_227){_227=_226.ownerDocument.createElement("div");}_227.appendChild(node);dojo.parser.parse(_227);node=_227.firstChild;while(_227.firstChild){_227.removeChild(_227.firstChild);}}if(i==_228-1){_215.place(node,_226,_224);}else{_226.parentNode.insertBefore(node,_226);}_226=node;}},position:aam(_216.position),attr:awc(_21c(_217),_219),style:awc(_21c(_218),_219),addClass:aafe(_214.add),removeClass:aafe(_214.remove),toggleClass:aafe(_214.toggle),replaceClass:aafe(_214.replace),empty:aafe(_215.empty),removeAttr:aafe(_217.remove),marginBox:aam(_216.getMarginBox),place:function(_229,_22a){var item=_212(_229)[0];return this.forEach(function(node){_215.place(node,item,_22a);});},orphan:function(_22b){return (_22b?_212._filterResult(this,_22b):this).forEach(_21a);},adopt:function(_22c,_22d){return _212(_22c).place(this[0],_22d)._stash(this);},query:function(_22e){if(!_22e){return this;}var ret=new _21b;this.map(function(node){_212(_22e,node).forEach(function(_22f){if(_22f!==undefined){ret.push(_22f);}});});return ret._stash(this);},filter:function(_230){var a=arguments,_231=this,_232=0;if(typeof _230=="string"){_231=_212._filterResult(this,a[0]);if(a.length==1){return _231._stash(this);}_232=1;}return this._wrap(_213.filter(_231,a[_232],a[_232+1]),this);},addContent:function(_233,_234){_233=this._normalize(_233,this[0]);for(var i=0,node;(node=this[i]);i++){if(_233.length){this._place(_233,node,_234,i>0);}else{_215.empty(node);}}return this;}});return _21b;});},"dojo/query":function(){define(["./_base/kernel","./has","./dom","./on","./_base/array","./_base/lang","./selector/_loader","./selector/_loader!default"],function(dojo,has,dom,on,_235,lang,_236,_237){"use strict";has.add("array-extensible",function(){return lang.delegate([],{length:1}).length==1&&!has("bug-for-in-skips-shadowed");});var ap=Array.prototype,aps=ap.slice,apc=ap.concat,_238=_235.forEach;var tnl=function(a,_239,_23a){var _23b=new (_23a||this._NodeListCtor||nl)(a);return _239?_23b._stash(_239):_23b;};var _23c=function(f,a,o){a=[0].concat(aps.call(a,0));o=o||dojo.global;return function(node){a[0]=node;return f.apply(o,a);};};var _23d=function(f,o){return function(){this.forEach(_23c(f,arguments,o));return this;};};var _23e=function(f,o){return function(){return this.map(_23c(f,arguments,o));};};var _23f=function(f,o){return function(){return this.filter(_23c(f,arguments,o));};};var _240=function(f,g,o){return function(){var a=arguments,body=_23c(f,a,o);if(g.call(o||dojo.global,a)){return this.map(body);}this.forEach(body);return this;};};var _241=function(_242){var _243=this instanceof nl&&has("array-extensible");if(typeof _242=="number"){_242=Array(_242);}var _244=(_242&&"length" in _242)?_242:arguments;if(_243||!_244.sort){var _245=_243?this:[],l=_245.length=_244.length;for(var i=0;i<l;i++){_245[i]=_244[i];}if(_243){return _245;}_244=_245;}lang._mixin(_244,nlp);_244._NodeListCtor=function(_246){return nl(_246);};return _244;};var nl=_241,nlp=nl.prototype=has("array-extensible")?[]:{};nl._wrap=nlp._wrap=tnl;nl._adaptAsMap=_23e;nl._adaptAsForEach=_23d;nl._adaptAsFilter=_23f;nl._adaptWithCondition=_240;_238(["slice","splice"],function(name){var f=ap[name];nlp[name]=function(){return this._wrap(f.apply(this,arguments),name=="slice"?this:null);};});_238(["indexOf","lastIndexOf","every","some"],function(name){var f=_235[name];nlp[name]=function(){return f.apply(dojo,[this].concat(aps.call(arguments,0)));};});lang.extend(_241,{constructor:nl,_NodeListCtor:nl,toString:function(){return this.join(",");},_stash:function(_247){this._parent=_247;return this;},on:function(_248,_249){var _24a=this.map(function(node){return on(node,_248,_249);});_24a.remove=function(){for(var i=0;i<_24a.length;i++){_24a[i].remove();}};return _24a;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor(0);}},concat:function(item){var t=aps.call(this,0),m=_235.map(arguments,function(a){return aps.call(a,0);});return this._wrap(apc.apply(t,m),this);},map:function(func,obj){return this._wrap(_235.map(this,func,obj),this);},forEach:function(_24b,_24c){_238(this,_24b,_24c);return this;},filter:function(_24d){var a=arguments,_24e=this,_24f=0;if(typeof _24d=="string"){_24e=_250._filterResult(this,a[0]);if(a.length==1){return _24e._stash(this);}_24f=1;}return this._wrap(_235.filter(_24e,a[_24f],a[_24f+1]),this);},instantiate:function(_251,_252){var c=lang.isFunction(_251)?_251:lang.getObject(_251);_252=_252||{};return this.forEach(function(node){new c(_252,node);});},at:function(){var t=new this._NodeListCtor(0);_238(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});function _253(_254,_255){var _256=function(_257,root){if(typeof root=="string"){root=dom.byId(root);if(!root){return new _255([]);}}var _258=typeof _257=="string"?_254(_257,root):_257?(_257.end&&_257.on)?_257:[_257]:[];if(_258.end&&_258.on){return _258;}return new _255(_258);};_256.matches=_254.match||function(node,_259,root){return _256.filter([node],_259,root).length>0;};_256.filter=_254.filter||function(_25a,_25b,root){return _256(_25b,root).filter(function(node){return _235.indexOf(_25a,node)>-1;});};if(typeof _254!="function"){var _25c=_254.search;_254=function(_25d,root){return _25c(root||document,_25d);};}return _256;};var _250=_253(_237,_241);dojo.query=_253(_237,function(_25e){return _241(_25e);});_250.load=function(id,_25f,_260){_236.load(id,_25f,function(_261){_260(_253(_261,_241));});};dojo._filterQueryResult=_250._filterResult=function(_262,_263,root){return new _241(_250.filter(_262,_263,root));};dojo.NodeList=_250.NodeList=_241;return _250;});},"dojo/has":function(){define(["require","module"],function(_264,_265){var has=_264.has||function(){};if(!1){var _266=typeof window!="undefined"&&typeof location!="undefined"&&typeof document!="undefined"&&window.location==location&&window.document==document,_267=this,doc=_266&&document,_268=doc&&doc.createElement("DiV"),_269=(_265.config&&_265.config())||{};has=function(name){return typeof _269[name]=="function"?(_269[name]=_269[name](_267,doc,_268)):_269[name];};has.cache=_269;has.add=function(name,test,now,_26a){(typeof _269[name]=="undefined"||_26a)&&(_269[name]=test);return now&&has(name);};1||has.add("host-browser",_266);0&&has.add("host-node",(typeof process=="object"&&process.versions&&process.versions.node&&process.versions.v8));0&&has.add("host-rhino",(typeof load=="function"&&(typeof Packages=="function"||typeof Packages=="object")));1||has.add("dom",_266);1||has.add("dojo-dom-ready-api",1);1||has.add("dojo-sniff",1);}if(1){has.add("dom-addeventlistener",!!document.addEventListener);has.add("touch","ontouchstart" in document||window.navigator.msMaxTouchPoints>0);has.add("device-width",screen.availWidth||innerWidth);var form=document.createElement("form");has.add("dom-attributes-explicit",form.attributes.length==0);has.add("dom-attributes-specified-flag",form.attributes.length>0&&form.attributes.length<40);}has.clearElement=function(_26b){_26b.innerHTML="";return _26b;};has.normalize=function(id,_26c){var _26d=id.match(/[\?:]|[^:\?]*/g),i=0,get=function(skip){var term=_26d[i++];if(term==":"){return 0;}else{if(_26d[i++]=="?"){if(!skip&&has(term)){return get();}else{get(true);return get(skip);}}return term||0;}};id=get();return id&&_26c(id);};has.load=function(id,_26e,_26f){if(id){_26e([id],_26f);}else{_26f();}};return has;});},"dojo/_base/loader":function(){define(["./kernel","../has","require","module","../json","./lang","./array"],function(dojo,has,_270,_271,json,lang,_272){if(!1){console.error("cannot load the Dojo v1.x loader with a foreign loader");return 0;}1||has.add("dojo-fast-sync-require",1);var _273=function(id){return {src:_271.id,id:id};},_274=function(name){return name.replace(/\./g,"/");},_275=/\/\/>>built/,_276=[],_277=[],_278=function(mid,_279,_27a){_276.push(_27a);_272.forEach(mid.split(","),function(mid){var _27b=_27c(mid,_279.module);_277.push(_27b);_27d(_27b);});_27e();},_27e=(1?function(){var _27f,mid;for(mid in _280){_27f=_280[mid];if(_27f.noReqPluginCheck===undefined){_27f.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(!_27f.executed&&!_27f.noReqPluginCheck&&_27f.injected==_281){return;}}_282(function(){var _283=_276;_276=[];_272.forEach(_283,function(cb){cb(1);});});}:(function(){var _284,_285=function(m){_284[m.mid]=1;for(var t,_286,deps=m.deps||[],i=0;i<deps.length;i++){_286=deps[i];if(!(t=_284[_286.mid])){if(t===0||!_285(_286)){_284[m.mid]=0;return false;}}}return true;};return function(){var _287,mid;_284={};for(mid in _280){_287=_280[mid];if(_287.executed||_287.noReqPluginCheck){_284[mid]=1;}else{if(_287.noReqPluginCheck!==0){_287.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(_287.noReqPluginCheck){_284[mid]=1;}else{if(_287.injected!==_2b3){_284[mid]=0;}}}}for(var t,i=0,end=_277.length;i<end;i++){_287=_277[i];if(!(t=_284[_287.mid])){if(t===0||!_285(_287)){return;}}}_282(function(){var _288=_276;_276=[];_272.forEach(_288,function(cb){cb(1);});});};})()),_289=function(mid,_28a,_28b){_28a([mid],function(_28c){_28a(_28c.names,function(){for(var _28d="",args=[],i=0;i<arguments.length;i++){_28d+="var "+_28c.names[i]+"= arguments["+i+"]; ";args.push(arguments[i]);}eval(_28d);var _28e=_28a.module,_28f=[],_290,_291={provide:function(_292){_292=_274(_292);var _293=_27c(_292,_28e);if(_293!==_28e){_2b9(_293);}},require:function(_294,_295){_294=_274(_294);_295&&(_27c(_294,_28e).result=_2b4);_28f.push(_294);},requireLocalization:function(_296,_297,_298){if(!_290){_290=["dojo/i18n"];}_298=(_298||dojo.locale).toLowerCase();_296=_274(_296)+"/nls/"+(/root/i.test(_298)?"":_298+"/")+_274(_297);if(_27c(_296,_28e).isXd){_290.push("dojo/i18n!"+_296);}},loadInit:function(f){f();}},hold={},p;try{for(p in _291){hold[p]=dojo[p];dojo[p]=_291[p];}_28c.def.apply(null,args);}catch(e){_299("error",[_273("failedDojoLoadInit"),e]);}finally{for(p in _291){dojo[p]=hold[p];}}if(_290){_28f=_28f.concat(_290);}if(_28f.length){_278(_28f.join(","),_28a,_28b);}else{_28b();}});});},_29a=function(text,_29b,_29c){var _29d=/\(|\)/g,_29e=1,_29f;_29d.lastIndex=_29b;while((_29f=_29d.exec(text))){if(_29f[0]==")"){_29e-=1;}else{_29e+=1;}if(_29e==0){break;}}if(_29e!=0){throw "unmatched paren around character "+_29d.lastIndex+" in: "+text;}return [dojo.trim(text.substring(_29c,_29d.lastIndex))+";\n",_29d.lastIndex];},_2a0=/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,_2a1=/(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,_2a2=/(^|\s)(require|define)\s*\(/m,_2a3=function(text,_2a4){var _2a5,_2a6,_2a7,_2a8,_2a9=[],_2aa=[],_2ab=[];_2a4=_2a4||text.replace(_2a0,function(_2ac){_2a1.lastIndex=_2a2.lastIndex=0;return (_2a1.test(_2ac)||_2a2.test(_2ac))?"":_2ac;});while((_2a5=_2a1.exec(_2a4))){_2a6=_2a1.lastIndex;_2a7=_2a6-_2a5[0].length;_2a8=_29a(_2a4,_2a6,_2a7);if(_2a5[2]=="loadInit"){_2a9.push(_2a8[0]);}else{_2aa.push(_2a8[0]);}_2a1.lastIndex=_2a8[1];}_2ab=_2a9.concat(_2aa);if(_2ab.length||!_2a2.test(_2a4)){return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g,"\n0 && dojo.loadInit("),_2ab.join(""),_2ab];}else{return 0;}},_2ad=function(_2ae,text){var _2af,id,_2b0=[],_2b1=[];if(_275.test(text)||!(_2af=_2a3(text))){return 0;}id=_2ae.mid+"-*loadInit";for(var p in _27c("dojo",_2ae).result.scopeMap){_2b0.push(p);_2b1.push("\""+p+"\"");}return "// xdomain rewrite of "+_2ae.mid+"\n"+"define('"+id+"',{\n"+"\tnames:"+json.stringify(_2b0)+",\n"+"\tdef:function("+_2b0.join(",")+"){"+_2af[1]+"}"+"});\n\n"+"define("+json.stringify(_2b0.concat(["dojo/loadInit!"+id]))+", function("+_2b0.join(",")+"){\n"+_2af[0]+"});";},_2b2=_270.initSyncLoader(_278,_27e,_2ad),sync=_2b2.sync,_281=_2b2.requested,_2b3=_2b2.arrived,_2b4=_2b2.nonmodule,_2b5=_2b2.executing,_2b6=_2b2.executed,_2b7=_2b2.syncExecStack,_280=_2b2.modules,_2b8=_2b2.execQ,_27c=_2b2.getModule,_27d=_2b2.injectModule,_2b9=_2b2.setArrived,_299=_2b2.signal,_2ba=_2b2.finishExec,_2bb=_2b2.execModule,_2bc=_2b2.getLegacyMode,_282=_2b2.guardCheckComplete;_278=_2b2.dojoRequirePlugin;dojo.provide=function(mid){var _2bd=_2b7[0],_2be=lang.mixin(_27c(_274(mid),_270.module),{executed:_2b5,result:lang.getObject(mid,true)});_2b9(_2be);if(_2bd){(_2bd.provides||(_2bd.provides=[])).push(function(){_2be.result=lang.getObject(mid);delete _2be.provides;_2be.executed!==_2b6&&_2ba(_2be);});}return _2be.result;};has.add("config-publishRequireResult",1,0,0);dojo.require=function(_2bf,_2c0){function _2c1(mid,_2c2){var _2c3=_27c(_274(mid),_270.module);if(_2b7.length&&_2b7[0].finish){_2b7[0].finish.push(mid);return undefined;}if(_2c3.executed){return _2c3.result;}_2c2&&(_2c3.result=_2b4);var _2c4=_2bc();_27d(_2c3);_2c4=_2bc();if(_2c3.executed!==_2b6&&_2c3.injected===_2b3){_2b2.guardCheckComplete(function(){_2bb(_2c3);});}if(_2c3.executed){return _2c3.result;}if(_2c4==sync){if(_2c3.cjs){_2b8.unshift(_2c3);}else{_2b7.length&&(_2b7[0].finish=[mid]);}}else{_2b8.push(_2c3);}return undefined;};var _2c5=_2c1(_2bf,_2c0);if(has("config-publishRequireResult")&&!lang.exists(_2bf)&&_2c5!==undefined){lang.setObject(_2bf,_2c5);}return _2c5;};dojo.loadInit=function(f){f();};dojo.registerModulePath=function(_2c6,_2c7){var _2c8={};_2c8[_2c6.replace(/\./g,"/")]=_2c7;_270({paths:_2c8});};dojo.platformRequire=function(_2c9){var _2ca=(_2c9.common||[]).concat(_2c9[dojo._name]||_2c9["default"]||[]),temp;while(_2ca.length){if(lang.isArray(temp=_2ca.shift())){dojo.require.apply(dojo,temp);}else{dojo.require(temp);}}};dojo.requireIf=dojo.requireAfterIf=function(_2cb,_2cc,_2cd){if(_2cb){dojo.require(_2cc,_2cd);}};dojo.requireLocalization=function(_2ce,_2cf,_2d0){_270(["../i18n"],function(i18n){i18n.getLocalization(_2ce,_2cf,_2d0);});};return {extractLegacyApiApplications:_2a3,require:_278,loadInit:_289};});},"dojo/json":function(){define(["./has"],function(has){"use strict";var _2d1=typeof JSON!="undefined";has.add("json-parse",_2d1);has.add("json-stringify",_2d1&&JSON.stringify({a:0},function(k,v){return v||1;})=="{\"a\":1}");if(has("json-stringify")){return JSON;}else{var _2d2=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};return {parse:has("json-parse")?JSON.parse:function(str,_2d3){if(_2d3&&!/^([\s\[\{]*(?:"(?:\\.|[^"])*"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){throw new SyntaxError("Invalid characters in JSON");}return eval("("+str+")");},stringify:function(_2d4,_2d5,_2d6){var _2d7;if(typeof _2d5=="string"){_2d6=_2d5;_2d5=null;}function _2d8(it,_2d9,key){if(_2d5){it=_2d5(key,it);}var val,_2da=typeof it;if(_2da=="number"){return isFinite(it)?it+"":"null";}if(_2da=="boolean"){return it+"";}if(it===null){return "null";}if(typeof it=="string"){return _2d2(it);}if(_2da=="function"||_2da=="undefined"){return _2d7;}if(typeof it.toJSON=="function"){return _2d8(it.toJSON(key),_2d9,key);}if(it instanceof Date){return "\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"".replace(/\{(\w+)(\+)?\}/g,function(t,prop,plus){var num=it["getUTC"+prop]()+(plus?1:0);return num<10?"0"+num:num;});}if(it.valueOf()!==it){return _2d8(it.valueOf(),_2d9,key);}var _2db=_2d6?(_2d9+_2d6):"";var sep=_2d6?" ":"";var _2dc=_2d6?"\n":"";if(it instanceof Array){var itl=it.length,res=[];for(key=0;key<itl;key++){var obj=it[key];val=_2d8(obj,_2db,key);if(typeof val!="string"){val="null";}res.push(_2dc+_2db+val);}return "["+res.join(",")+_2dc+_2d9+"]";}var _2dd=[];for(key in it){var _2de;if(it.hasOwnProperty(key)){if(typeof key=="number"){_2de="\""+key+"\"";}else{if(typeof key=="string"){_2de=_2d2(key);}else{continue;}}val=_2d8(it[key],_2db,key);if(typeof val!="string"){continue;}_2dd.push(_2dc+_2db+_2de+":"+sep+val);}}return "{"+_2dd.join(",")+_2dc+_2d9+"}";};return _2d8(_2d4,"","");}};}});},"dojo/_base/declare":function(){define(["./kernel","../has","./lang"],function(dojo,has,lang){var mix=lang.mixin,op=Object.prototype,opts=op.toString,xtor=new Function,_2df=0,_2e0="constructor";function err(msg,cls){throw new Error("declare"+(cls?" "+cls:"")+": "+msg);};function _2e1(_2e2,_2e3){var _2e4=[],_2e5=[{cls:0,refs:[]}],_2e6={},_2e7=1,l=_2e2.length,i=0,j,lin,base,top,_2e8,rec,name,refs;for(;i<l;++i){base=_2e2[i];if(!base){err("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?",_2e3);}else{if(opts.call(base)!="[object Function]"){err("mixin #"+i+" is not a callable constructor.",_2e3);}}lin=base._meta?base._meta.bases:[base];top=0;for(j=lin.length-1;j>=0;--j){_2e8=lin[j].prototype;if(!_2e8.hasOwnProperty("declaredClass")){_2e8.declaredClass="uniqName_"+(_2df++);}name=_2e8.declaredClass;if(!_2e6.hasOwnProperty(name)){_2e6[name]={count:0,refs:[],cls:lin[j]};++_2e7;}rec=_2e6[name];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_2e5[0].refs.push(top);}while(_2e5.length){top=_2e5.pop();_2e4.push(top.cls);--_2e7;while(refs=top.refs,refs.length==1){top=refs[0];if(!top||--top.count){top=0;break;}_2e4.push(top.cls);--_2e7;}if(top){for(i=0,l=refs.length;i<l;++i){top=refs[i];if(!--top.count){_2e5.push(top);}}}}if(_2e7){err("can't build consistent linearization",_2e3);}base=_2e2[0];_2e4[0]=base?base._meta&&base===_2e4[_2e4.length-base._meta.bases.length]?base._meta.bases.length:1:0;return _2e4;};function _2e9(args,a,f){var name,_2ea,_2eb,_2ec,meta,base,_2ed,opf,pos,_2ee=this._inherited=this._inherited||{};if(typeof args=="string"){name=args;args=a;a=f;}f=0;_2ec=args.callee;name=name||_2ec.nom;if(!name){err("can't deduce a name to call inherited()",this.declaredClass);}meta=this.constructor._meta;_2eb=meta.bases;pos=_2ee.p;if(name!=_2e0){if(_2ee.c!==_2ec){pos=0;base=_2eb[0];meta=base._meta;if(meta.hidden[name]!==_2ec){_2ea=meta.chains;if(_2ea&&typeof _2ea[name]=="string"){err("calling chained method with inherited: "+name,this.declaredClass);}do{meta=base._meta;_2ed=base.prototype;if(meta&&(_2ed[name]===_2ec&&_2ed.hasOwnProperty(name)||meta.hidden[name]===_2ec)){break;}}while(base=_2eb[++pos]);pos=base?pos:-1;}}base=_2eb[++pos];if(base){_2ed=base.prototype;if(base._meta&&_2ed.hasOwnProperty(name)){f=_2ed[name];}else{opf=op[name];do{_2ed=base.prototype;f=_2ed[name];if(f&&(base._meta?_2ed.hasOwnProperty(name):f!==opf)){break;}}while(base=_2eb[++pos]);}}f=base&&f||op[name];}else{if(_2ee.c!==_2ec){pos=0;meta=_2eb[0]._meta;if(meta&&meta.ctor!==_2ec){_2ea=meta.chains;if(!_2ea||_2ea.constructor!=="manual"){err("calling chained constructor with inherited",this.declaredClass);}while(base=_2eb[++pos]){meta=base._meta;if(meta&&meta.ctor===_2ec){break;}}pos=base?pos:-1;}}while(base=_2eb[++pos]){meta=base._meta;f=meta?meta.ctor:base;if(f){break;}}f=base&&f;}_2ee.c=f;_2ee.p=pos;if(f){return a===true?f:f.apply(this,a||args);}};function _2ef(name,args){if(typeof name=="string"){return this.__inherited(name,args,true);}return this.__inherited(name,true);};function _2f0(args,a1,a2){var f=this.getInherited(args,a1);if(f){return f.apply(this,a2||a1||args);}};var _2f1=dojo.config.isDebug?_2f0:_2e9;function _2f2(cls){var _2f3=this.constructor._meta.bases;for(var i=0,l=_2f3.length;i<l;++i){if(_2f3[i]===cls){return true;}}return this instanceof cls;};function _2f4(_2f5,_2f6){for(var name in _2f6){if(name!=_2e0&&_2f6.hasOwnProperty(name)){_2f5[name]=_2f6[name];}}if(has("bug-for-in-skips-shadowed")){for(var _2f7=lang._extraNames,i=_2f7.length;i;){name=_2f7[--i];if(name!=_2e0&&_2f6.hasOwnProperty(name)){_2f5[name]=_2f6[name];}}}};function _2f8(_2f9,_2fa){var name,t;for(name in _2fa){t=_2fa[name];if((t!==op[name]||!(name in op))&&name!=_2e0){if(opts.call(t)=="[object Function]"){t.nom=name;}_2f9[name]=t;}}if(has("bug-for-in-skips-shadowed")){for(var _2fb=lang._extraNames,i=_2fb.length;i;){name=_2fb[--i];t=_2fa[name];if((t!==op[name]||!(name in op))&&name!=_2e0){if(opts.call(t)=="[object Function]"){t.nom=name;}_2f9[name]=t;}}}return _2f9;};function _2fc(_2fd){_2fe.safeMixin(this.prototype,_2fd);return this;};function _2ff(_300,_301){return _2fe([this].concat(_300),_301||{});};function _302(_303,_304){return function(){var a=arguments,args=a,a0=a[0],f,i,m,l=_303.length,_305;if(!(this instanceof a.callee)){return _306(a);}if(_304&&(a0&&a0.preamble||this.preamble)){_305=new Array(_303.length);_305[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_303[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_305[i]=a;}}for(i=l-1;i>=0;--i){f=_303[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_305?_305[i]:a);}}f=this.postscript;if(f){f.apply(this,args);}};};function _307(ctor,_308){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _306(a);}if(_308){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(ctor){ctor.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _309(_30a){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _306(a);}for(;f=_30a[i];++i){m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,a);break;}}f=this.postscript;if(f){f.apply(this,a);}};};function _30b(name,_30c,_30d){return function(){var b,m,f,i=0,step=1;if(_30d){i=_30c.length-1;step=-1;}for(;b=_30c[i];i+=step){m=b._meta;f=(m?m.hidden:b.prototype)[name];if(f){f.apply(this,arguments);}}};};function _30e(ctor){xtor.prototype=ctor.prototype;var t=new xtor;xtor.prototype=null;return t;};function _306(args){var ctor=args.callee,t=_30e(ctor);ctor.apply(t,args);return t;};function _2fe(_30f,_310,_311){if(typeof _30f!="string"){_311=_310;_310=_30f;_30f="";}_311=_311||{};var _312,i,t,ctor,name,_313,_314,_315=1,_316=_310;if(opts.call(_310)=="[object Array]"){_313=_2e1(_310,_30f);t=_313[0];_315=_313.length-t;_310=_313[_315];}else{_313=[0];if(_310){if(opts.call(_310)=="[object Function]"){t=_310._meta;_313=_313.concat(t?t.bases:_310);}else{err("base class is not a callable constructor.",_30f);}}else{if(_310!==null){err("unknown base class. Did you use dojo.require to pull it in?",_30f);}}}if(_310){for(i=_315-1;;--i){_312=_30e(_310);if(!i){break;}t=_313[i];(t._meta?_2f4:mix)(_312,t.prototype);ctor=new Function;ctor.superclass=_310;ctor.prototype=_312;_310=_312.constructor=ctor;}}else{_312={};}_2fe.safeMixin(_312,_311);t=_311.constructor;if(t!==op.constructor){t.nom=_2e0;_312.constructor=t;}for(i=_315-1;i;--i){t=_313[i]._meta;if(t&&t.chains){_314=mix(_314||{},t.chains);}}if(_312["-chains-"]){_314=mix(_314||{},_312["-chains-"]);}t=!_314||!_314.hasOwnProperty(_2e0);_313[0]=ctor=(_314&&_314.constructor==="manual")?_309(_313):(_313.length==1?_307(_311.constructor,t):_302(_313,t));ctor._meta={bases:_313,hidden:_311,chains:_314,parents:_316,ctor:_311.constructor};ctor.superclass=_310&&_310.prototype;ctor.extend=_2fc;ctor.createSubclass=_2ff;ctor.prototype=_312;_312.constructor=ctor;_312.getInherited=_2ef;_312.isInstanceOf=_2f2;_312.inherited=_2f1;_312.__inherited=_2e9;if(_30f){_312.declaredClass=_30f;lang.setObject(_30f,ctor);}if(_314){for(name in _314){if(_312[name]&&typeof _314[name]=="string"&&name!=_2e0){t=_312[name]=_30b(name,_313,_314[name]==="after");t.nom=name;}}}return ctor;};dojo.safeMixin=_2fe.safeMixin=_2f8;dojo.declare=_2fe;return _2fe;});},"dojo/dom":function(){define(["./sniff","./_base/window"],function(has,win){if(has("ie")<=7){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}}var dom={};if(has("ie")){dom.byId=function(id,doc){if(typeof id!="string"){return id;}var _317=doc||win.doc,te=id&&_317.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var eles=_317.all[id];if(!eles||eles.nodeName){eles=[eles];}var i=0;while((te=eles[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{dom.byId=function(id,doc){return ((typeof id=="string")?(doc||win.doc).getElementById(id):id)||null;};}dom.isDescendant=function(node,_318){try{node=dom.byId(node);_318=dom.byId(_318);while(node){if(node==_318){return true;}node=node.parentNode;}}catch(e){}return false;};has.add("css-user-select",function(_319,doc,_31a){if(!_31a){return false;}var _31b=_31a.style;var _31c=["Khtml","O","ms","Moz","Webkit"],i=_31c.length,name="userSelect",_31d;do{if(typeof _31b[name]!=="undefined"){return name;}}while(i--&&(name=_31c[i]+"UserSelect"));return false;});var _31e=has("css-user-select");dom.setSelectable=_31e?function(node,_31f){dom.byId(node).style[_31e]=_31f?"":"none";}:function(node,_320){node=dom.byId(node);var _321=node.getElementsByTagName("*"),i=_321.length;if(_320){node.removeAttribute("unselectable");while(i--){_321[i].removeAttribute("unselectable");}}else{node.setAttribute("unselectable","on");while(i--){_321[i].setAttribute("unselectable","on");}}};return dom;});},"dojo/_base/browser":function(){if(require.has){require.has.add("config-selectorEngine","acme");}define(["../ready","./kernel","./connect","./unload","./window","./event","./html","./NodeList","../query","./xhr","./fx"],function(dojo){return dojo;});},"dojo/selector/acme":function(){define(["../dom","../sniff","../_base/array","../_base/lang","../_base/window"],function(dom,has,_322,lang,win){var trim=lang.trim;var each=_322.forEach;var _323=function(){return win.doc;};var _324=(_323().compatMode)=="BackCompat";var _325=">~+";var _326=false;var _327=function(){return true;};var _328=function(_329){if(_325.indexOf(_329.slice(-1))>=0){_329+=" * ";}else{_329+=" ";}var ts=function(s,e){return trim(_329.slice(s,e));};var _32a=[];var _32b=-1,_32c=-1,_32d=-1,_32e=-1,_32f=-1,inId=-1,_330=-1,_331,lc="",cc="",_332;var x=0,ql=_329.length,_333=null,_334=null;var _335=function(){if(_330>=0){var tv=(_330==x)?null:ts(_330,x);_333[(_325.indexOf(tv)<0)?"tag":"oper"]=tv;_330=-1;}};var _336=function(){if(inId>=0){_333.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _337=function(){if(_32f>=0){_333.classes.push(ts(_32f+1,x).replace(/\\/g,""));_32f=-1;}};var _338=function(){_336();_335();_337();};var _339=function(){_338();if(_32e>=0){_333.pseudos.push({name:ts(_32e+1,x)});}_333.loops=(_333.pseudos.length||_333.attrs.length||_333.classes.length);_333.oquery=_333.query=ts(_332,x);_333.otag=_333.tag=(_333["oper"])?null:(_333.tag||"*");if(_333.tag){_333.tag=_333.tag.toUpperCase();}if(_32a.length&&(_32a[_32a.length-1].oper)){_333.infixOper=_32a.pop();_333.query=_333.infixOper.query+" "+_333.query;}_32a.push(_333);_333=null;};for(;lc=cc,cc=_329.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_333){_332=x;_333={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return _326?this.otag:this.tag;}};_330=x;}if(_331){if(cc==_331){_331=null;}continue;}else{if(cc=="'"||cc=="\""){_331=cc;continue;}}if(_32b>=0){if(cc=="]"){if(!_334.attr){_334.attr=ts(_32b+1,x);}else{_334.matchFor=ts((_32d||_32b+1),x);}var cmf=_334.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_334.matchFor=cmf.slice(1,-1);}}if(_334.matchFor){_334.matchFor=_334.matchFor.replace(/\\/g,"");}_333.attrs.push(_334);_334=null;_32b=_32d=-1;}else{if(cc=="="){var _33a=("|~^$*".indexOf(lc)>=0)?lc:"";_334.type=_33a+cc;_334.attr=ts(_32b+1,x-_33a.length);_32d=x+1;}}}else{if(_32c>=0){if(cc==")"){if(_32e>=0){_334.value=ts(_32c+1,x);}_32e=_32c=-1;}}else{if(cc=="#"){_338();inId=x+1;}else{if(cc=="."){_338();_32f=x;}else{if(cc==":"){_338();_32e=x;}else{if(cc=="["){_338();_32b=x;_334={};}else{if(cc=="("){if(_32e>=0){_334={name:ts(_32e+1,x),value:null};_333.pseudos.push(_334);}_32c=x;}else{if((cc==" ")&&(lc!=cc)){_339();}}}}}}}}}return _32a;};var _33b=function(_33c,_33d){if(!_33c){return _33d;}if(!_33d){return _33c;}return function(){return _33c.apply(window,arguments)&&_33d.apply(window,arguments);};};var _33e=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _33f=function(n){return (1==n.nodeType);};var _340="";var _341=function(elem,attr){if(!elem){return _340;}if(attr=="class"){return elem.className||_340;}if(attr=="for"){return elem.htmlFor||_340;}if(attr=="style"){return elem.style.cssText||_340;}return (_326?elem.getAttribute(attr):elem.getAttribute(attr,2))||_340;};var _342={"*=":function(attr,_343){return function(elem){return (_341(elem,attr).indexOf(_343)>=0);};},"^=":function(attr,_344){return function(elem){return (_341(elem,attr).indexOf(_344)==0);};},"$=":function(attr,_345){return function(elem){var ea=" "+_341(elem,attr);var _346=ea.lastIndexOf(_345);return _346>-1&&(_346==(ea.length-_345.length));};},"~=":function(attr,_347){var tval=" "+_347+" ";return function(elem){var ea=" "+_341(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_348){var _349=_348+"-";return function(elem){var ea=_341(elem,attr);return ((ea==_348)||(ea.indexOf(_349)==0));};},"=":function(attr,_34a){return function(elem){return (_341(elem,attr)==_34a);};}};var _34b=(typeof _323().firstChild.nextElementSibling=="undefined");var _34c=!_34b?"nextElementSibling":"nextSibling";var _34d=!_34b?"previousElementSibling":"previousSibling";var _34e=(_34b?_33f:_327);var _34f=function(node){while(node=node[_34d]){if(_34e(node)){return false;}}return true;};var _350=function(node){while(node=node[_34c]){if(_34e(node)){return false;}}return true;};var _351=function(node){var root=node.parentNode;root=root.nodeType!=7?root:root.nextSibling;var i=0,tret=root.children||root.childNodes,ci=(node["_i"]||node.getAttribute("_i")||-1),cl=(root["_l"]||(typeof root.getAttribute!=="undefined"?root.getAttribute("_l"):-1));if(!tret){return -1;}var l=tret.length;if(cl==l&&ci>=0&&cl>=0){return ci;}if(has("ie")&&typeof root.setAttribute!=="undefined"){root.setAttribute("_l",l);}else{root["_l"]=l;}ci=-1;for(var te=root["firstElementChild"]||root["firstChild"];te;te=te[_34c]){if(_34e(te)){if(has("ie")){te.setAttribute("_i",++i);}else{te["_i"]=++i;}if(node===te){ci=i;}}}return ci;};var _352=function(elem){return !((_351(elem))%2);};var _353=function(elem){return ((_351(elem))%2);};var _354={"checked":function(name,_355){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"disabled":function(name,_356){return function(elem){return elem.disabled;};},"enabled":function(name,_357){return function(elem){return !elem.disabled;};},"first-child":function(){return _34f;},"last-child":function(){return _350;},"only-child":function(name,_358){return function(node){return _34f(node)&&_350(node);};},"empty":function(name,_359){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(name,_35a){var cz=_35a.charAt(0);if(cz=="\""||cz=="'"){_35a=_35a.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_35a)>=0);};},"not":function(name,_35b){var p=_328(_35b)[0];var _35c={el:1};if(p.tag!="*"){_35c.tag=1;}if(!p.classes.length){_35c.classes=1;}var ntf=_35d(p,_35c);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_35e){var pi=parseInt;if(_35e=="odd"){return _353;}else{if(_35e=="even"){return _352;}}if(_35e.indexOf("n")!=-1){var _35f=_35e.split("n",2);var pred=_35f[0]?((_35f[0]=="-")?-1:pi(_35f[0])):1;var idx=_35f[1]?pi(_35f[1]):0;var lb=0,ub=-1;if(pred>0){if(idx<0){idx=(idx%pred)&&(pred+(idx%pred));}else{if(idx>0){if(idx>=pred){lb=idx-idx%pred;}idx=idx%pred;}}}else{if(pred<0){pred*=-1;if(idx>0){ub=idx;idx=idx%pred;}}}if(pred>0){return function(elem){var i=_351(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_35e=idx;}}var _360=pi(_35e);return function(elem){return (_351(elem)==_360);};}};var _361=(has("ie")<9||has("ie")==9&&has("quirks"))?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_326?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _35d=function(_362,_363){if(!_362){return _327;}_363=_363||{};var ff=null;if(!("el" in _363)){ff=_33b(ff,_33f);}if(!("tag" in _363)){if(_362.tag!="*"){ff=_33b(ff,function(elem){return (elem&&((_326?elem.tagName:elem.tagName.toUpperCase())==_362.getTag()));});}}if(!("classes" in _363)){each(_362.classes,function(_364,idx,arr){var re=new RegExp("(?:^|\\s)"+_364+"(?:\\s|$)");ff=_33b(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _363)){each(_362.pseudos,function(_365){var pn=_365.name;if(_354[pn]){ff=_33b(ff,_354[pn](pn,_365.value));}});}if(!("attrs" in _363)){each(_362.attrs,function(attr){var _366;var a=attr.attr;if(attr.type&&_342[attr.type]){_366=_342[attr.type](a,attr.matchFor);}else{if(a.length){_366=_361(a);}}if(_366){ff=_33b(ff,_366);}});}if(!("id" in _363)){if(_362.id){ff=_33b(ff,function(elem){return (!!elem&&(elem.id==_362.id));});}}if(!ff){if(!("default" in _363)){ff=_327;}}return ff;};var _367=function(_368){return function(node,ret,bag){while(node=node[_34c]){if(_34b&&(!_33f(node))){continue;}if((!bag||_369(node,bag))&&_368(node)){ret.push(node);}break;}return ret;};};var _36a=function(_36b){return function(root,ret,bag){var te=root[_34c];while(te){if(_34e(te)){if(bag&&!_369(te,bag)){break;}if(_36b(te)){ret.push(te);}}te=te[_34c];}return ret;};};var _36c=function(_36d){_36d=_36d||_327;return function(root,ret,bag){var te,x=0,tret=root.children||root.childNodes;while(te=tret[x++]){if(_34e(te)&&(!bag||_369(te,bag))&&(_36d(te,x))){ret.push(te);}}return ret;};};var _36e=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _36f={};var _370=function(_371){var _372=_36f[_371.query];if(_372){return _372;}var io=_371.infixOper;var oper=(io?io.oper:"");var _373=_35d(_371,{el:1});var qt=_371.tag;var _374=("*"==qt);var ecs=_323()["getElementsByClassName"];if(!oper){if(_371.id){_373=(!_371.loops&&_374)?_327:_35d(_371,{el:1,id:1});_372=function(root,arr){var te=dom.byId(_371.id,(root.ownerDocument||root));if(!te||!_373(te)){return;}if(9==root.nodeType){return _33e(te,arr);}else{if(_36e(te,root)){return _33e(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_371.classes.length&&!_324){_373=_35d(_371,{el:1,classes:1,id:1});var _375=_371.classes.join(" ");_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tret=root.getElementsByClassName(_375);while((te=tret[x++])){if(_373(te,root)&&_369(te,bag)){ret.push(te);}}return ret;};}else{if(!_374&&!_371.loops){_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tag=_371.getTag(),tret=tag?root.getElementsByTagName(tag):[];while((te=tret[x++])){if(_369(te,bag)){ret.push(te);}}return ret;};}else{_373=_35d(_371,{el:1,tag:1,id:1});_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tag=_371.getTag(),tret=tag?root.getElementsByTagName(tag):[];while((te=tret[x++])){if(_373(te,root)&&_369(te,bag)){ret.push(te);}}return ret;};}}}}else{var _376={el:1};if(_374){_376.tag=1;}_373=_35d(_371,_376);if("+"==oper){_372=_367(_373);}else{if("~"==oper){_372=_36a(_373);}else{if(">"==oper){_372=_36c(_373);}}}}return _36f[_371.query]=_372;};var _377=function(root,_378){var _379=_33e(root),qp,x,te,qpl=_378.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_378[i];x=_379.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_370(qp);for(var j=0;(te=_379[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_379=ret;}return ret;};var _37a={},_37b={};var _37c=function(_37d){var _37e=_328(trim(_37d));if(_37e.length==1){var tef=_370(_37e[0]);return function(root){var r=tef(root,[]);if(r){r.nozip=true;}return r;};}return function(root){return _377(root,_37e);};};var _37f=has("ie")?"commentStrip":"nozip";var qsa="querySelectorAll";var _380=!!_323()[qsa];var _381=/\\[>~+]|n\+\d|([^ \\])?([>~+])([^ =])?/g;var _382=function(_383,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_383;};var _384=/([^[]*)([^\]]*])?/g;var _385=function(_386,_387,att){return _387.replace(_381,_382)+(att||"");};var _388=function(_389,_38a){_389=_389.replace(_384,_385);if(_380){var _38b=_37b[_389];if(_38b&&!_38a){return _38b;}}var _38c=_37a[_389];if(_38c){return _38c;}var qcz=_389.charAt(0);var _38d=(-1==_389.indexOf(" "));if((_389.indexOf("#")>=0)&&(_38d)){_38a=true;}var _38e=(_380&&(!_38a)&&(_325.indexOf(qcz)==-1)&&(!has("ie")||(_389.indexOf(":")==-1))&&(!(_324&&(_389.indexOf(".")>=0)))&&(_389.indexOf(":contains")==-1)&&(_389.indexOf(":checked")==-1)&&(_389.indexOf("|=")==-1));if(_38e){var tq=(_325.indexOf(_389.charAt(_389.length-1))>=0)?(_389+" *"):_389;return _37b[_389]=function(root){try{if(!((9==root.nodeType)||_38d)){throw "";}var r=root[qsa](tq);r[_37f]=true;return r;}catch(e){return _388(_389,true)(root);}};}else{var _38f=_389.match(/([^\s,](?:"(?:\\.|[^"])+"|'(?:\\.|[^'])+'|[^,])*)/g);return _37a[_389]=((_38f.length<2)?_37c(_389):function(root){var _390=0,ret=[],tp;while((tp=_38f[_390++])){ret=ret.concat(_37c(tp)(root));}return ret;});}};var _391=0;var _392=has("ie")?function(node){if(_326){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_391)||_391);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_391));};var _369=function(node,bag){if(!bag){return 1;}var id=_392(node);if(!bag[id]){return bag[id]=1;}return 0;};var _393="_zipIdx";var _394=function(arr){if(arr&&arr.nozip){return arr;}if(!arr||!arr.length){return [];}if(arr.length<2){return [arr[0]];}var ret=[];_391++;var x,te;if(has("ie")&&_326){var _395=_391+"";for(x=0;x<arr.length;x++){if((te=arr[x])&&te.getAttribute(_393)!=_395){ret.push(te);te.setAttribute(_393,_395);}}}else{if(has("ie")&&arr.commentStrip){try{for(x=0;x<arr.length;x++){if((te=arr[x])&&_33f(te)){ret.push(te);}}}catch(e){}}else{for(x=0;x<arr.length;x++){if((te=arr[x])&&te[_393]!=_391){ret.push(te);te[_393]=_391;}}}}return ret;};var _396=function(_397,root){root=root||_323();var od=root.ownerDocument||root;_326=(od.createElement("div").tagName==="div");var r=_388(_397)(root);if(r&&r.nozip){return r;}return _394(r);};_396.filter=function(_398,_399,root){var _39a=[],_39b=_328(_399),_39c=(_39b.length==1&&!/[^\w#\.]/.test(_399))?_35d(_39b[0]):function(node){return _322.indexOf(_396(_399,dom.byId(root)),node)!=-1;};for(var x=0,te;te=_398[x];x++){if(_39c(te)){_39a.push(te);}}return _39a;};return _396;});},"dojo/errors/RequestTimeoutError":function(){define(["./create","./RequestError"],function(_39d,_39e){return _39d("RequestTimeoutError",null,_39e,{dojoType:"timeout"});});},"dojo/dom-style":function(){define(["./sniff","./dom"],function(has,dom){var _39f,_3a0={};if(has("webkit")){_39f=function(node){var s;if(node.nodeType==1){var dv=node.ownerDocument.defaultView;s=dv.getComputedStyle(node,null);if(!s&&node.style){node.style.display="";s=dv.getComputedStyle(node,null);}}return s||{};};}else{if(has("ie")&&(has("ie")<9||has("quirks"))){_39f=function(node){return node.nodeType==1&&node.currentStyle?node.currentStyle:{};};}else{_39f=function(node){return node.nodeType==1?node.ownerDocument.defaultView.getComputedStyle(node,null):{};};}}_3a0.getComputedStyle=_39f;var _3a1;if(!has("ie")){_3a1=function(_3a2,_3a3){return parseFloat(_3a3)||0;};}else{_3a1=function(_3a4,_3a5){if(!_3a5){return 0;}if(_3a5=="medium"){return 4;}if(_3a5.slice&&_3a5.slice(-2)=="px"){return parseFloat(_3a5);}var s=_3a4.style,rs=_3a4.runtimeStyle,cs=_3a4.currentStyle,_3a6=s.left,_3a7=rs.left;rs.left=cs.left;try{s.left=_3a5;_3a5=s.pixelLeft;}catch(e){_3a5=0;}s.left=_3a6;rs.left=_3a7;return _3a5;};}_3a0.toPixelValue=_3a1;var astr="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(astr);}catch(e){return f?{}:null;}};var _3a8=has("ie")<9||(has("ie")<10&&has("quirks"))?function(node){try{return af(node).Opacity/100;}catch(e){return 1;}}:function(node){return _39f(node).opacity;};var _3a9=has("ie")<9||(has("ie")<10&&has("quirks"))?function(node,_3aa){if(_3aa===""){_3aa=1;}var ov=_3aa*100,_3ab=_3aa===1;if(_3ab){node.style.zoom="";if(af(node)){node.style.filter=node.style.filter.replace(new RegExp("\\s*progid:"+astr+"\\([^\\)]+?\\)","i"),"");}}else{node.style.zoom=1;if(af(node)){af(node,1).Opacity=ov;}else{node.style.filter+=" progid:"+astr+"(Opacity="+ov+")";}af(node,1).Enabled=true;}if(node.tagName.toLowerCase()=="tr"){for(var td=node.firstChild;td;td=td.nextSibling){if(td.tagName.toLowerCase()=="td"){_3a9(td,_3aa);}}}return _3aa;}:function(node,_3ac){return node.style.opacity=_3ac;};var _3ad={left:true,top:true};var _3ae=/margin|padding|width|height|max|min|offset/;function _3af(node,type,_3b0){type=type.toLowerCase();if(has("ie")){if(_3b0=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(type=="fontweight"){switch(_3b0){case 700:return "bold";case 400:default:return "normal";}}}if(!(type in _3ad)){_3ad[type]=_3ae.test(type);}return _3ad[type]?_3a1(node,_3b0):_3b0;};var _3b1={cssFloat:1,styleFloat:1,"float":1};_3a0.get=function getStyle(node,name){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");if(l==2&&op){return _3a8(n);}name=_3b1[name]?"cssFloat" in n.style?"cssFloat":"styleFloat":name;var s=_3a0.getComputedStyle(n);return (l==1)?s:_3af(n,name,s[name]||n.style[name]);};_3a0.set=function setStyle(node,name,_3b2){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");name=_3b1[name]?"cssFloat" in n.style?"cssFloat":"styleFloat":name;if(l==3){return op?_3a9(n,_3b2):n.style[name]=_3b2;}for(var x in name){_3a0.set(node,x,name[x]);}return _3a0.getComputedStyle(n);};return _3a0;});},"dojo/dom-geometry":function(){define(["./sniff","./_base/window","./dom","./dom-style"],function(has,win,dom,_3b3){var geom={};geom.boxModel="content-box";if(has("ie")){geom.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}geom.getPadExtents=function getPadExtents(node,_3b4){node=dom.byId(node);var s=_3b4||_3b3.getComputedStyle(node),px=_3b3.toPixelValue,l=px(node,s.paddingLeft),t=px(node,s.paddingTop),r=px(node,s.paddingRight),b=px(node,s.paddingBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};var none="none";geom.getBorderExtents=function getBorderExtents(node,_3b5){node=dom.byId(node);var px=_3b3.toPixelValue,s=_3b5||_3b3.getComputedStyle(node),l=s.borderLeftStyle!=none?px(node,s.borderLeftWidth):0,t=s.borderTopStyle!=none?px(node,s.borderTopWidth):0,r=s.borderRightStyle!=none?px(node,s.borderRightWidth):0,b=s.borderBottomStyle!=none?px(node,s.borderBottomWidth):0;return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getPadBorderExtents=function getPadBorderExtents(node,_3b6){node=dom.byId(node);var s=_3b6||_3b3.getComputedStyle(node),p=geom.getPadExtents(node,s),b=geom.getBorderExtents(node,s);return {l:p.l+b.l,t:p.t+b.t,r:p.r+b.r,b:p.b+b.b,w:p.w+b.w,h:p.h+b.h};};geom.getMarginExtents=function getMarginExtents(node,_3b7){node=dom.byId(node);var s=_3b7||_3b3.getComputedStyle(node),px=_3b3.toPixelValue,l=px(node,s.marginLeft),t=px(node,s.marginTop),r=px(node,s.marginRight),b=px(node,s.marginBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getMarginBox=function getMarginBox(node,_3b8){node=dom.byId(node);var s=_3b8||_3b3.getComputedStyle(node),me=geom.getMarginExtents(node,s),l=node.offsetLeft-me.l,t=node.offsetTop-me.t,p=node.parentNode,px=_3b3.toPixelValue,pcs;if(has("mozilla")){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl;t=st;}else{if(p&&p.style){pcs=_3b3.getComputedStyle(p);if(pcs.overflow!="visible"){l+=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t+=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}}else{if(has("opera")||(has("ie")==8&&!has("quirks"))){if(p){pcs=_3b3.getComputedStyle(p);l-=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t-=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}return {l:l,t:t,w:node.offsetWidth+me.w,h:node.offsetHeight+me.h};};geom.getContentBox=function getContentBox(node,_3b9){node=dom.byId(node);var s=_3b9||_3b3.getComputedStyle(node),w=node.clientWidth,h,pe=geom.getPadExtents(node,s),be=geom.getBorderExtents(node,s);if(!w){w=node.offsetWidth;h=node.offsetHeight;}else{h=node.clientHeight;be.w=be.h=0;}if(has("opera")){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};function _3ba(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};function _3bb(node){return node.tagName.toLowerCase()=="button"||node.tagName.toLowerCase()=="input"&&(node.getAttribute("type")||"").toLowerCase()=="button";};function _3bc(node){return geom.boxModel=="border-box"||node.tagName.toLowerCase()=="table"||_3bb(node);};geom.setContentSize=function setContentSize(node,box,_3bd){node=dom.byId(node);var w=box.w,h=box.h;if(_3bc(node)){var pb=geom.getPadBorderExtents(node,_3bd);if(w>=0){w+=pb.w;}if(h>=0){h+=pb.h;}}_3ba(node,NaN,NaN,w,h);};var _3be={l:0,t:0,w:0,h:0};geom.setMarginBox=function setMarginBox(node,box,_3bf){node=dom.byId(node);var s=_3bf||_3b3.getComputedStyle(node),w=box.w,h=box.h,pb=_3bc(node)?_3be:geom.getPadBorderExtents(node,s),mb=geom.getMarginExtents(node,s);if(has("webkit")){if(_3bb(node)){var ns=node.style;if(w>=0&&!ns.width){ns.width="4px";}if(h>=0&&!ns.height){ns.height="4px";}}}if(w>=0){w=Math.max(w-pb.w-mb.w,0);}if(h>=0){h=Math.max(h-pb.h-mb.h,0);}_3ba(node,box.l,box.t,w,h);};geom.isBodyLtr=function isBodyLtr(doc){doc=doc||win.doc;return (win.body(doc).dir||doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};geom.docScroll=function docScroll(doc){doc=doc||win.doc;var node=win.doc.parentWindow||win.doc.defaultView;return "pageXOffset" in node?{x:node.pageXOffset,y:node.pageYOffset}:(node=has("quirks")?win.body(doc):doc.documentElement)&&{x:geom.fixIeBiDiScrollLeft(node.scrollLeft||0,doc),y:node.scrollTop||0};};if(has("ie")){geom.getIeDocumentElementOffset=function getIeDocumentElementOffset(doc){doc=doc||win.doc;var de=doc.documentElement;if(has("ie")<8){var r=de.getBoundingClientRect(),l=r.left,t=r.top;if(has("ie")<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};}geom.fixIeBiDiScrollLeft=function fixIeBiDiScrollLeft(_3c0,doc){doc=doc||win.doc;var ie=has("ie");if(ie&&!geom.isBodyLtr(doc)){var qk=has("quirks"),de=qk?win.body(doc):doc.documentElement,pwin=win.global;if(ie==6&&!qk&&pwin.frameElement&&de.scrollHeight>de.clientHeight){_3c0+=de.clientLeft;}return (ie<8||qk)?(_3c0+de.clientWidth-de.scrollWidth):-_3c0;}return _3c0;};geom.position=function(node,_3c1){node=dom.byId(node);var db=win.body(node.ownerDocument),ret=node.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(has("ie")<9){var _3c2=geom.getIeDocumentElementOffset(node.ownerDocument);ret.x-=_3c2.x+(has("quirks")?db.clientLeft+db.offsetLeft:0);ret.y-=_3c2.y+(has("quirks")?db.clientTop+db.offsetTop:0);}if(_3c1){var _3c3=geom.docScroll(node.ownerDocument);ret.x+=_3c3.x;ret.y+=_3c3.y;}return ret;};geom.getMarginSize=function getMarginSize(node,_3c4){node=dom.byId(node);var me=geom.getMarginExtents(node,_3c4||_3b3.getComputedStyle(node));var size=node.getBoundingClientRect();return {w:(size.right-size.left)+me.w,h:(size.bottom-size.top)+me.h};};geom.normalizeEvent=function(_3c5){if(!("layerX" in _3c5)){_3c5.layerX=_3c5.offsetX;_3c5.layerY=_3c5.offsetY;}if(!has("dom-addeventlistener")){var se=_3c5.target;var doc=(se&&se.ownerDocument)||document;var _3c6=has("quirks")?doc.body:doc.documentElement;var _3c7=geom.getIeDocumentElementOffset(doc);_3c5.pageX=_3c5.clientX+geom.fixIeBiDiScrollLeft(_3c6.scrollLeft||0,doc)-_3c7.x;_3c5.pageY=_3c5.clientY+(_3c6.scrollTop||0)-_3c7.y;}};return geom;});},"dojo/dom-prop":function(){define(["exports","./_base/kernel","./sniff","./_base/lang","./dom","./dom-style","./dom-construct","./_base/connect"],function(_3c8,dojo,has,lang,dom,_3c9,ctr,conn){var _3ca={},_3cb=0,_3cc=dojo._scopeName+"attrid";_3c8.names={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"};_3c8.get=function getProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3cd=_3c8.names[lc]||name;return node[_3cd];};_3c8.set=function setProp(node,name,_3ce){node=dom.byId(node);var l=arguments.length;if(l==2&&typeof name!="string"){for(var x in name){_3c8.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_3cf=_3c8.names[lc]||name;if(_3cf=="style"&&typeof _3ce!="string"){_3c9.set(node,_3ce);return node;}if(_3cf=="innerHTML"){if(has("ie")&&node.tagName.toLowerCase() in {col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1}){ctr.empty(node);node.appendChild(ctr.toDom(_3ce,node.ownerDocument));}else{node[_3cf]=_3ce;}return node;}if(lang.isFunction(_3ce)){var _3d0=node[_3cc];if(!_3d0){_3d0=_3cb++;node[_3cc]=_3d0;}if(!_3ca[_3d0]){_3ca[_3d0]={};}var h=_3ca[_3d0][_3cf];if(h){conn.disconnect(h);}else{try{delete node[_3cf];}catch(e){}}if(_3ce){_3ca[_3d0][_3cf]=conn.connect(node,_3cf,_3ce);}else{node[_3cf]=null;}return node;}node[_3cf]=_3ce;return node;};});},"dojo/when":function(){define(["./Deferred","./promise/Promise"],function(_3d1,_3d2){"use strict";return function when(_3d3,_3d4,_3d5,_3d6){var _3d7=_3d3&&typeof _3d3.then==="function";var _3d8=_3d7&&_3d3 instanceof _3d2;if(!_3d7){if(arguments.length>1){return _3d4?_3d4(_3d3):_3d3;}else{return new _3d1().resolve(_3d3);}}else{if(!_3d8){var _3d9=new _3d1(_3d3.cancel);_3d3.then(_3d9.resolve,_3d9.reject,_3d9.progress);_3d3=_3d9.promise;}}if(_3d4||_3d5||_3d6){return _3d3.then(_3d4,_3d5,_3d6);}return _3d3;};});},"dojo/dom-attr":function(){define(["exports","./sniff","./_base/lang","./dom","./dom-style","./dom-prop"],function(_3da,has,lang,dom,_3db,prop){var _3dc={innerHTML:1,className:1,htmlFor:has("ie"),value:1},_3dd={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"};function _3de(node,name){var attr=node.getAttributeNode&&node.getAttributeNode(name);return attr&&attr.specified;};_3da.has=function hasAttr(node,name){var lc=name.toLowerCase();return _3dc[prop.names[lc]||name]||_3de(dom.byId(node),_3dd[lc]||name);};_3da.get=function getAttr(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3df=prop.names[lc]||name,_3e0=_3dc[_3df],_3e1=node[_3df];if(_3e0&&typeof _3e1!="undefined"){return _3e1;}if(_3df!="href"&&(typeof _3e1=="boolean"||lang.isFunction(_3e1))){return _3e1;}var _3e2=_3dd[lc]||name;return _3de(node,_3e2)?node.getAttribute(_3e2):null;};_3da.set=function setAttr(node,name,_3e3){node=dom.byId(node);if(arguments.length==2){for(var x in name){_3da.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_3e4=prop.names[lc]||name,_3e5=_3dc[_3e4];if(_3e4=="style"&&typeof _3e3!="string"){_3db.set(node,_3e3);return node;}if(_3e5||typeof _3e3=="boolean"||lang.isFunction(_3e3)){return prop.set(node,name,_3e3);}node.setAttribute(_3dd[lc]||name,_3e3);return node;};_3da.remove=function removeAttr(node,name){dom.byId(node).removeAttribute(_3dd[name.toLowerCase()]||name);};_3da.getNodeProp=function getNodeProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3e6=prop.names[lc]||name;if((_3e6 in node)&&_3e6!="href"){return node[_3e6];}var _3e7=_3dd[lc]||name;return _3de(node,_3e7)?node.getAttribute(_3e7):null;};});},"dojo/dom-construct":function(){define(["exports","./_base/kernel","./sniff","./_base/window","./dom","./dom-attr"],function(_3e8,dojo,has,win,dom,attr){var _3e9={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_3ea=/<\s*([\w\:]+)/,_3eb={},_3ec=0,_3ed="__"+dojo._scopeName+"ToDomId";for(var _3ee in _3e9){if(_3e9.hasOwnProperty(_3ee)){var tw=_3e9[_3ee];tw.pre=_3ee=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";tw.post="</"+tw.reverse().join("></")+">";}}var _3ef;if(has("ie")<=8){_3ef=function(doc){doc.__dojo_html5_tested="yes";var div=_3f0("div",{innerHTML:"<nav>a</nav>",style:{visibility:"hidden"}},doc.body);if(div.childNodes.length!==1){("abbr article aside audio canvas details figcaption figure footer header "+"hgroup mark meter nav output progress section summary time video").replace(/\b\w+\b/g,function(n){doc.createElement(n);});}_3f1(div);};}function _3f2(node,ref){var _3f3=ref.parentNode;if(_3f3){_3f3.insertBefore(node,ref);}};function _3f4(node,ref){var _3f5=ref.parentNode;if(_3f5){if(_3f5.lastChild==ref){_3f5.appendChild(node);}else{_3f5.insertBefore(node,ref.nextSibling);}}};_3e8.toDom=function toDom(frag,doc){doc=doc||win.doc;var _3f6=doc[_3ed];if(!_3f6){doc[_3ed]=_3f6=++_3ec+"";_3eb[_3f6]=doc.createElement("div");}if(has("ie")<=8){if(!doc.__dojo_html5_tested&&doc.body){_3ef(doc);}}frag+="";var _3f7=frag.match(_3ea),tag=_3f7?_3f7[1].toLowerCase():"",_3f8=_3eb[_3f6],wrap,i,fc,df;if(_3f7&&_3e9[tag]){wrap=_3e9[tag];_3f8.innerHTML=wrap.pre+frag+wrap.post;for(i=wrap.length;i;--i){_3f8=_3f8.firstChild;}}else{_3f8.innerHTML=frag;}if(_3f8.childNodes.length==1){return _3f8.removeChild(_3f8.firstChild);}df=doc.createDocumentFragment();while((fc=_3f8.firstChild)){df.appendChild(fc);}return df;};_3e8.place=function place(node,_3f9,_3fa){_3f9=dom.byId(_3f9);if(typeof node=="string"){node=/^\s*</.test(node)?_3e8.toDom(node,_3f9.ownerDocument):dom.byId(node);}if(typeof _3fa=="number"){var cn=_3f9.childNodes;if(!cn.length||cn.length<=_3fa){_3f9.appendChild(node);}else{_3f2(node,cn[_3fa<0?0:_3fa]);}}else{switch(_3fa){case "before":_3f2(node,_3f9);break;case "after":_3f4(node,_3f9);break;case "replace":_3f9.parentNode.replaceChild(node,_3f9);break;case "only":_3e8.empty(_3f9);_3f9.appendChild(node);break;case "first":if(_3f9.firstChild){_3f2(node,_3f9.firstChild);break;}default:_3f9.appendChild(node);}}return node;};var _3f0=_3e8.create=function _3f0(tag,_3fb,_3fc,pos){var doc=win.doc;if(_3fc){_3fc=dom.byId(_3fc);doc=_3fc.ownerDocument;}if(typeof tag=="string"){tag=doc.createElement(tag);}if(_3fb){attr.set(tag,_3fb);}if(_3fc){_3e8.place(tag,_3fc,pos);}return tag;};function _3fd(node){if(node.canHaveChildren){try{node.innerHTML="";return;}catch(e){}}for(var c;c=node.lastChild;){_3fe(c,node);}};_3e8.empty=function empty(node){_3fd(dom.byId(node));};function _3fe(node,_3ff){if(node.firstChild){_3fd(node);}if(_3ff){has("ie")&&_3ff.canHaveChildren&&"removeNode" in node?node.removeNode(false):_3ff.removeChild(node);}};var _3f1=_3e8.destroy=function _3f1(node){node=dom.byId(node);if(!node){return;}_3fe(node,node.parentNode);};});},"dojo/request/xhr":function(){define(["../errors/RequestError","./watch","./handlers","./util","../has"],function(_400,_401,_402,util,has){has.add("native-xhr",function(){return typeof XMLHttpRequest!=="undefined";});has.add("dojo-force-activex-xhr",function(){return has("activex")&&!document.addEventListener&&window.location.protocol==="file:";});has.add("native-xhr2",function(){if(!has("native-xhr")){return;}var x=new XMLHttpRequest();return typeof x["addEventListener"]!=="undefined"&&(typeof opera==="undefined"||typeof x["upload"]!=="undefined");});has.add("native-formdata",function(){return typeof FormData==="function";});function _403(_404,_405){var _406=_404.xhr;_404.status=_404.xhr.status;_404.text=_406.responseText;if(_404.options.handleAs==="xml"){_404.data=_406.responseXML;}if(!_405){try{_402(_404);}catch(e){_405=e;}}if(_405){this.reject(_405);}else{if(util.checkStatus(_406.status)){this.resolve(_404);}else{_405=new _400("Unable to load "+_404.url+" status: "+_406.status,_404);this.reject(_405);}}};var _407,_408,_409,_40a;if(has("native-xhr2")){_407=function(_40b){return !this.isFulfilled();};_40a=function(dfd,_40c){_40c.xhr.abort();};_409=function(_40d,dfd,_40e){function _40f(evt){dfd.handleResponse(_40e);};function _410(evt){var _411=evt.target;var _412=new _400("Unable to load "+_40e.url+" status: "+_411.status,_40e);dfd.handleResponse(_40e,_412);};function _413(evt){if(evt.lengthComputable){_40e.loaded=evt.loaded;_40e.total=evt.total;dfd.progress(_40e);}};_40d.addEventListener("load",_40f,false);_40d.addEventListener("error",_410,false);_40d.addEventListener("progress",_413,false);return function(){_40d.removeEventListener("load",_40f,false);_40d.removeEventListener("error",_410,false);_40d.removeEventListener("progress",_413,false);_40d=null;};};}else{_407=function(_414){return _414.xhr.readyState;};_408=function(_415){return 4===_415.xhr.readyState;};_40a=function(dfd,_416){var xhr=_416.xhr;var _417=typeof xhr.abort;if(_417==="function"||_417==="object"||_417==="unknown"){xhr.abort();}};}function _418(_419){return this.xhr.getResponseHeader(_419);};var _41a,_41b={data:null,query:null,sync:false,method:"GET"};function xhr(url,_41c,_41d){var _41e=util.parseArgs(url,util.deepCreate(_41b,_41c),has("native-formdata")&&_41c&&_41c.data&&_41c.data instanceof FormData);url=_41e.url;_41c=_41e.options;var _41f,last=function(){_41f&&_41f();};var dfd=util.deferred(_41e,_40a,_407,_408,_403,last);var _420=_41e.xhr=xhr._create();if(!_420){dfd.cancel(new _400("XHR was not created"));return _41d?dfd:dfd.promise;}_41e.getHeader=_418;if(_409){_41f=_409(_420,dfd,_41e);}var data=_41c.data,_421=!_41c.sync,_422=_41c.method;try{_420.open(_422,url,_421,_41c.user||_41a,_41c.password||_41a);if(_41c.withCredentials){_420.withCredentials=_41c.withCredentials;}var _423=_41c.headers,_424="application/x-www-form-urlencoded";if(_423){for(var hdr in _423){if(hdr.toLowerCase()==="content-type"){_424=_423[hdr];}else{if(_423[hdr]){_420.setRequestHeader(hdr,_423[hdr]);}}}}if(_424&&_424!==false){_420.setRequestHeader("Content-Type",_424);}if(!_423||!("X-Requested-With" in _423)){_420.setRequestHeader("X-Requested-With","XMLHttpRequest");}if(util.notify){util.notify.emit("send",_41e,dfd.promise.cancel);}_420.send(data);}catch(e){dfd.reject(e);}_401(dfd);_420=null;return _41d?dfd:dfd.promise;};xhr._create=function(){throw new Error("XMLHTTP not available");};if(has("native-xhr")&&!has("dojo-force-activex-xhr")){xhr._create=function(){return new XMLHttpRequest();};}else{if(has("activex")){try{new ActiveXObject("Msxml2.XMLHTTP");xhr._create=function(){return new ActiveXObject("Msxml2.XMLHTTP");};}catch(e){try{new ActiveXObject("Microsoft.XMLHTTP");xhr._create=function(){return new ActiveXObject("Microsoft.XMLHTTP");};}catch(e){}}}}util.addCommonMethods(xhr);return xhr;});},"dojo/text":function(){define(["./_base/kernel","require","./has","./request"],function(dojo,_425,has,_426){var _427;if(1){_427=function(url,sync,load){_426(url,{sync:!!sync}).then(load);};}else{if(_425.getText){_427=_425.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _428={},_429=function(text){if(text){text=text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _42a=text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_42a){text=_42a[1];}}else{text="";}return text;},_42b={},_42c={};dojo.cache=function(_42d,url,_42e){var key;if(typeof _42d=="string"){if(/\//.test(_42d)){key=_42d;_42e=url;}else{key=_425.toUrl(_42d.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_42d+"";_42e=url;}var val=(_42e!=undefined&&typeof _42e!="string")?_42e.value:_42e,_42f=_42e&&_42e.sanitize;if(typeof val=="string"){_428[key]=val;return _42f?_429(val):val;}else{if(val===null){delete _428[key];return null;}else{if(!(key in _428)){_427(key,true,function(text){_428[key]=text;});}return _42f?_429(_428[key]):_428[key];}}};return {dynamic:true,normalize:function(id,_430){var _431=id.split("!"),url=_431[0];return (/^\./.test(url)?_430(url):url)+(_431[1]?"!"+_431[1]:"");},load:function(id,_432,load){var _433=id.split("!"),_434=_433.length>1,_435=_433[0],url=_432.toUrl(_433[0]),_436="url:"+url,text=_42b,_437=function(text){load(_434?_429(text):text);};if(_435 in _428){text=_428[_435];}else{if(_432.cache&&_436 in _432.cache){text=_432.cache[_436];}else{if(url in _428){text=_428[url];}}}if(text===_42b){if(_42c[url]){_42c[url].push(_437);}else{var _438=_42c[url]=[_437];_427(url,!_432.async,function(text){_428[_435]=_428[url]=text;for(var i=0;i<_438.length;){_438[i++](text);}delete _42c[url];});}}else{_437(text);}}};});},"dojo/keys":function(){define(["./_base/kernel","./sniff"],function(dojo,has){return dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:has("webkit")?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,UP_DPAD:175,DOWN_DPAD:176,LEFT_DPAD:177,RIGHT_DPAD:178,copyKey:has("mac")&&!has("air")?(has("safari")?91:224):17};});},"dojo/domReady":function(){define(["./has"],function(has){var _439=this,doc=document,_43a={"loaded":1,"complete":1},_43b=typeof doc.readyState!="string",_43c=!!_43a[doc.readyState],_43d=[],_43e;function _43f(_440){_43d.push(_440);if(_43c){_441();}};_43f.load=function(id,req,load){_43f(load);};_43f._Q=_43d;_43f._onQEmpty=function(){};if(_43b){doc.readyState="loading";}function _441(){if(_43e){return;}_43e=true;while(_43d.length){try{(_43d.shift())(doc);}catch(err){}}_43e=false;_43f._onQEmpty();};if(!_43c){var _442=[],_443=function(evt){evt=evt||_439.event;if(_43c||(evt.type=="readystatechange"&&!_43a[doc.readyState])){return;}if(_43b){doc.readyState="complete";}_43c=1;_441();},on=function(node,_444){node.addEventListener(_444,_443,false);_43d.push(function(){node.removeEventListener(_444,_443,false);});};if(!has("dom-addeventlistener")){on=function(node,_445){_445="on"+_445;node.attachEvent(_445,_443);_43d.push(function(){node.detachEvent(_445,_443);});};var div=doc.createElement("div");try{if(div.doScroll&&_439.frameElement===null){_442.push(function(){try{div.doScroll("left");return 1;}catch(e){}});}}catch(e){}}on(doc,"DOMContentLoaded");on(_439,"load");if("onreadystatechange" in doc){on(doc,"readystatechange");}else{if(!_43b){_442.push(function(){return _43a[doc.readyState];});}}if(_442.length){var _446=function(){if(_43c){return;}var i=_442.length;while(i--){if(_442[i]()){_443("poller");return;}}setTimeout(_446,30);};_446();}}return _43f;});},"dojo/_base/lang":function(){define(["./kernel","../has","../sniff"],function(dojo,has){has.add("bug-for-in-skips-shadowed",function(){for(var i in {toString:1}){return 0;}return 1;});var _447=has("bug-for-in-skips-shadowed")?"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split("."):[],_448=_447.length,_449=function(_44a,_44b,_44c){var p,i=0,_44d=dojo.global;if(!_44c){if(!_44a.length){return _44d;}else{p=_44a[i++];try{_44c=dojo.scopeMap[p]&&dojo.scopeMap[p][1];}catch(e){}_44c=_44c||(p in _44d?_44d[p]:(_44b?_44d[p]={}:undefined));}}while(_44c&&(p=_44a[i++])){_44c=(p in _44c?_44c[p]:(_44b?_44c[p]={}:undefined));}return _44c;},opts=Object.prototype.toString,_44e=function(obj,_44f,_450){return (_450||[]).concat(Array.prototype.slice.call(obj,_44f||0));},_451=/\{([^\}]+)\}/g;var lang={_extraNames:_447,_mixin:function(dest,_452,_453){var name,s,i,_454={};for(name in _452){s=_452[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _454)||_454[name]!==s))){dest[name]=_453?_453(s):s;}}if(has("bug-for-in-skips-shadowed")){if(_452){for(i=0;i<_448;++i){name=_447[i];s=_452[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _454)||_454[name]!==s))){dest[name]=_453?_453(s):s;}}}}return dest;},mixin:function(dest,_455){if(!dest){dest={};}for(var i=1,l=arguments.length;i<l;i++){lang._mixin(dest,arguments[i]);}return dest;},setObject:function(name,_456,_457){var _458=name.split("."),p=_458.pop(),obj=_449(_458,true,_457);return obj&&p?(obj[p]=_456):undefined;},getObject:function(name,_459,_45a){return _449(name.split("."),_459,_45a);},exists:function(name,obj){return lang.getObject(name,false,obj)!==undefined;},isString:function(it){return (typeof it=="string"||it instanceof String);},isArray:function(it){return it&&(it instanceof Array||typeof it=="array");},isFunction:function(it){return opts.call(it)==="[object Function]";},isObject:function(it){return it!==undefined&&(it===null||typeof it=="object"||lang.isArray(it)||lang.isFunction(it));},isArrayLike:function(it){return it&&it!==undefined&&!lang.isString(it)&&!lang.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(lang.isArray(it)||isFinite(it.length));},isAlien:function(it){return it&&!lang.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));},extend:function(ctor,_45b){for(var i=1,l=arguments.length;i<l;i++){lang._mixin(ctor.prototype,arguments[i]);}return ctor;},_hitchArgs:function(_45c,_45d){var pre=lang._toArray(arguments,2);var _45e=lang.isString(_45d);return function(){var args=lang._toArray(arguments);var f=_45e?(_45c||dojo.global)[_45d]:_45d;return f&&f.apply(_45c||this,pre.concat(args));};},hitch:function(_45f,_460){if(arguments.length>2){return lang._hitchArgs.apply(dojo,arguments);}if(!_460){_460=_45f;_45f=null;}if(lang.isString(_460)){_45f=_45f||dojo.global;if(!_45f[_460]){throw (["lang.hitch: scope[\"",_460,"\"] is null (scope=\"",_45f,"\")"].join(""));}return function(){return _45f[_460].apply(_45f,arguments||[]);};}return !_45f?_460:function(){return _460.apply(_45f,arguments||[]);};},delegate:(function(){function TMP(){};return function(obj,_461){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_461){lang._mixin(tmp,_461);}return tmp;};})(),_toArray:has("ie")?(function(){function slow(obj,_462,_463){var arr=_463||[];for(var x=_462||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};return function(obj){return ((obj.item)?slow:_44e).apply(this,arguments);};})():_44e,partial:function(_464){var arr=[null];return lang.hitch.apply(dojo,arr.concat(lang._toArray(arguments)));},clone:function(src){if(!src||typeof src!="object"||lang.isFunction(src)){return src;}if(src.nodeType&&"cloneNode" in src){return src.cloneNode(true);}if(src instanceof Date){return new Date(src.getTime());}if(src instanceof RegExp){return new RegExp(src);}var r,i,l;if(lang.isArray(src)){r=[];for(i=0,l=src.length;i<l;++i){if(i in src){r.push(lang.clone(src[i]));}}}else{r=src.constructor?new src.constructor():{};}return lang._mixin(r,src,lang.clone);},trim:String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");},replace:function(tmpl,map,_465){return tmpl.replace(_465||_451,lang.isFunction(map)?map:function(_466,k){return lang.getObject(k,false,map);});}};1&&lang.mixin(dojo,lang);return lang;});},"dojo/request/util":function(){define(["exports","../errors/RequestError","../errors/CancelError","../Deferred","../io-query","../_base/array","../_base/lang","../promise/Promise"],function(_467,_468,_469,_46a,_46b,_46c,lang,_46d){_467.deepCopy=function deepCopy(_46e,_46f){for(var name in _46f){var tval=_46e[name],sval=_46f[name];if(tval!==sval){if(tval&&typeof tval==="object"&&sval&&typeof sval==="object"){_467.deepCopy(tval,sval);}else{_46e[name]=sval;}}}return _46e;};_467.deepCreate=function deepCreate(_470,_471){_471=_471||{};var _472=lang.delegate(_470),name,_473;for(name in _470){_473=_470[name];if(_473&&typeof _473==="object"){_472[name]=_467.deepCreate(_473,_471[name]);}}return _467.deepCopy(_472,_471);};var _474=Object.freeze||function(obj){return obj;};function _475(_476){return _474(_476);};function _477(_478){return _478.data||_478.text;};_467.deferred=function deferred(_479,_47a,_47b,_47c,_47d,last){var def=new _46a(function(_47e){_47a&&_47a(def,_479);if(!_47e||!(_47e instanceof _468)&&!(_47e instanceof _469)){return new _469("Request canceled",_479);}return _47e;});def.response=_479;def.isValid=_47b;def.isReady=_47c;def.handleResponse=_47d;function _47f(_480){_480.response=_479;throw _480;};var _481=def.then(_475).otherwise(_47f);if(_467.notify){_481.then(lang.hitch(_467.notify,"emit","load"),lang.hitch(_467.notify,"emit","error"));}var _482=_481.then(_477);var _483=new _46d();for(var prop in _482){if(_482.hasOwnProperty(prop)){_483[prop]=_482[prop];}}_483.response=_481;_474(_483);if(last){def.then(function(_484){last.call(def,_484);},function(_485){last.call(def,_479,_485);});}def.promise=_483;def.then=_483.then;return def;};_467.addCommonMethods=function addCommonMethods(_486,_487){_46c.forEach(_487||["GET","POST","PUT","DELETE"],function(_488){_486[(_488==="DELETE"?"DEL":_488).toLowerCase()]=function(url,_489){_489=lang.delegate(_489||{});_489.method=_488;return _486(url,_489);};});};_467.parseArgs=function parseArgs(url,_48a,_48b){var data=_48a.data,_48c=_48a.query;if(data&&!_48b){if(typeof data==="object"){_48a.data=_46b.objectToQuery(data);}}if(_48c){if(typeof _48c==="object"){_48c=_46b.objectToQuery(_48c);}if(_48a.preventCache){_48c+=(_48c?"&":"")+"request.preventCache="+(+(new Date));}}else{if(_48a.preventCache){_48c="request.preventCache="+(+(new Date));}}if(url&&_48c){url+=(~url.indexOf("?")?"&":"?")+_48c;}return {url:url,options:_48a,getHeader:function(_48d){return null;}};};_467.checkStatus=function(stat){stat=stat||0;return (stat>=200&&stat<300)||stat===304||stat===1223||!stat;};});},"dojo/Evented":function(){define(["./aspect","./on"],function(_48e,on){"use strict";var _48f=_48e.after;function _490(){};_490.prototype={on:function(type,_491){return on.parse(this,type,_491,function(_492,type){return _48f(_492,"on"+type,_491,true);});},emit:function(type,_493){var args=[this];args.push.apply(args,arguments);return on.emit.apply(on,args);}};return _490;});},"dojo/mouse":function(){define(["./_base/kernel","./on","./has","./dom","./_base/window"],function(dojo,on,has,dom,win){has.add("dom-quirks",win.doc&&win.doc.compatMode=="BackCompat");has.add("events-mouseenter",win.doc&&"onmouseenter" in win.doc.createElement("div"));has.add("events-mousewheel",win.doc&&"onmousewheel" in win.doc);var _494;if((has("dom-quirks")&&has("ie"))||!has("dom-addeventlistener")){_494={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_495){return e.button&_495;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{_494={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_496){return e.button==_496;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}dojo.mouseButtons=_494;function _497(type,_498){var _499=function(node,_49a){return on(node,type,function(evt){if(_498){return _498(evt,_49a);}if(!dom.isDescendant(evt.relatedTarget,node)){return _49a.call(this,evt);}});};_499.bubble=function(_49b){return _497(type,function(evt,_49c){var _49d=_49b(evt.target);var _49e=evt.relatedTarget;if(_49d&&(_49d!=(_49e&&_49e.nodeType==1&&_49b(_49e)))){return _49c.call(_49d,evt);}});};return _499;};var _49f;if(has("events-mousewheel")){_49f="mousewheel";}else{_49f=function(node,_4a0){return on(node,"DOMMouseScroll",function(evt){evt.wheelDelta=-evt.detail;_4a0.call(this,evt);});};}return {_eventHandler:_497,enter:_497("mouseover"),leave:_497("mouseout"),wheel:_49f,isLeft:_494.isLeft,isMiddle:_494.isMiddle,isRight:_494.isRight};});},"dojo/_base/xhr":function(){define(["./kernel","./sniff","require","../io-query","../dom","../dom-form","./Deferred","./config","./json","./lang","./array","../on","../aspect","../request/watch","../request/xhr","../request/util"],function(dojo,has,_4a1,ioq,dom,_4a2,_4a3,_4a4,json,lang,_4a5,on,_4a6,_4a7,_4a8,util){dojo._xhrObj=_4a8._create;var cfg=dojo.config;dojo.objectToQuery=ioq.objectToQuery;dojo.queryToObject=ioq.queryToObject;dojo.fieldToObject=_4a2.fieldToObject;dojo.formToObject=_4a2.toObject;dojo.formToQuery=_4a2.toQuery;dojo.formToJson=_4a2.toJson;dojo._blockAsync=false;var _4a9=dojo._contentHandlers=dojo.contentHandlers={"text":function(xhr){return xhr.responseText;},"json":function(xhr){return json.fromJson(xhr.responseText||null);},"json-comment-filtered":function(xhr){if(!_4a4.useCommentedJson){console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");}var _4aa=xhr.responseText;var _4ab=_4aa.indexOf("/*");var _4ac=_4aa.lastIndexOf("*/");if(_4ab==-1||_4ac==-1){throw new Error("JSON was not comment filtered");}return json.fromJson(_4aa.substring(_4ab+2,_4ac));},"javascript":function(xhr){return dojo.eval(xhr.responseText);},"xml":function(xhr){var _4ad=xhr.responseXML;if(_4ad&&has("dom-qsa2.1")&&!_4ad.querySelectorAll&&has("dom-parser")){_4ad=new DOMParser().parseFromString(xhr.responseText,"application/xml");}if(has("ie")){if((!_4ad||!_4ad.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_4a5.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_4ad=dom;}catch(e){return false;}return true;});}}return _4ad;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _4a9["json-comment-filtered"](xhr);}else{return _4a9["json"](xhr);}}};dojo._ioSetArgs=function(args,_4ae,_4af,_4b0){var _4b1={args:args,url:args.url};var _4b2=null;if(args.form){var form=dom.byId(args.form);var _4b3=form.getAttributeNode("action");_4b1.url=_4b1.url||(_4b3?_4b3.value:null);_4b2=_4a2.toObject(form);}var _4b4=[{}];if(_4b2){_4b4.push(_4b2);}if(args.content){_4b4.push(args.content);}if(args.preventCache){_4b4.push({"dojo.preventCache":new Date().valueOf()});}_4b1.query=ioq.objectToQuery(lang.mixin.apply(null,_4b4));_4b1.handleAs=args.handleAs||"text";var d=new _4a3(function(dfd){dfd.canceled=true;_4ae&&_4ae(dfd);var err=dfd.ioArgs.error;if(!err){err=new Error("request cancelled");err.dojoType="cancel";dfd.ioArgs.error=err;}return err;});d.addCallback(_4af);var ld=args.load;if(ld&&lang.isFunction(ld)){d.addCallback(function(_4b5){return ld.call(args,_4b5,_4b1);});}var err=args.error;if(err&&lang.isFunction(err)){d.addErrback(function(_4b6){return err.call(args,_4b6,_4b1);});}var _4b7=args.handle;if(_4b7&&lang.isFunction(_4b7)){d.addBoth(function(_4b8){return _4b7.call(args,_4b8,_4b1);});}d.addErrback(function(_4b9){return _4b0(_4b9,d);});if(cfg.ioPublish&&dojo.publish&&_4b1.args.ioPublish!==false){d.addCallbacks(function(res){dojo.publish("/dojo/io/load",[d,res]);return res;},function(res){dojo.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){dojo.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_4b1;return d;};var _4ba=function(dfd){var ret=_4a9[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _4bb=function(_4bc,dfd){if(!dfd.ioArgs.args.failOk){console.error(_4bc);}return _4bc;};var _4bd=function(dfd){if(_4be<=0){_4be=0;if(cfg.ioPublish&&dojo.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){dojo.publish("/dojo/io/stop");}}};var _4be=0;_4a6.after(_4a7,"_onAction",function(){_4be-=1;});_4a6.after(_4a7,"_onInFlight",_4bd);dojo._ioCancelAll=_4a7.cancelAll;dojo._ioNotifyStart=function(dfd){if(cfg.ioPublish&&dojo.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_4be){dojo.publish("/dojo/io/start");}_4be+=1;dojo.publish("/dojo/io/send",[dfd]);}};dojo._ioWatch=function(dfd,_4bf,_4c0,_4c1){var args=dfd.ioArgs.options=dfd.ioArgs.args;lang.mixin(dfd,{response:dfd.ioArgs,isValid:function(_4c2){return _4bf(dfd);},isReady:function(_4c3){return _4c0(dfd);},handleResponse:function(_4c4){return _4c1(dfd);}});_4a7(dfd);_4bd(dfd);};var _4c5="application/x-www-form-urlencoded";dojo._ioAddQueryToUrl=function(_4c6){if(_4c6.query.length){_4c6.url+=(_4c6.url.indexOf("?")==-1?"?":"&")+_4c6.query;_4c6.query=null;}};dojo.xhr=function(_4c7,args,_4c8){var rDfd;var dfd=dojo._ioSetArgs(args,function(dfd){rDfd&&rDfd.cancel();},_4ba,_4bb);var _4c9=dfd.ioArgs;if("postData" in args){_4c9.query=args.postData;}else{if("putData" in args){_4c9.query=args.putData;}else{if("rawBody" in args){_4c9.query=args.rawBody;}else{if((arguments.length>2&&!_4c8)||"POST|PUT".indexOf(_4c7.toUpperCase())===-1){dojo._ioAddQueryToUrl(_4c9);}}}}var _4ca={method:_4c7,handleAs:"text",timeout:args.timeout,withCredentials:args.withCredentials,ioArgs:_4c9};if(typeof args.headers!=="undefined"){_4ca.headers=args.headers;}if(typeof args.contentType!=="undefined"){if(!_4ca.headers){_4ca.headers={};}_4ca.headers["Content-Type"]=args.contentType;}if(typeof _4c9.query!=="undefined"){_4ca.data=_4c9.query;}if(typeof args.sync!=="undefined"){_4ca.sync=args.sync;}dojo._ioNotifyStart(dfd);try{rDfd=_4a8(_4c9.url,_4ca,true);}catch(e){dfd.cancel();return dfd;}dfd.ioArgs.xhr=rDfd.response.xhr;rDfd.then(function(){dfd.resolve(dfd);}).otherwise(function(_4cb){_4c9.error=_4cb;if(_4cb.response){_4cb.status=_4cb.response.status;_4cb.responseText=_4cb.response.text;_4cb.xhr=_4cb.response.xhr;}dfd.reject(_4cb);});return dfd;};dojo.xhrGet=function(args){return dojo.xhr("GET",args);};dojo.rawXhrPost=dojo.xhrPost=function(args){return dojo.xhr("POST",args,true);};dojo.rawXhrPut=dojo.xhrPut=function(args){return dojo.xhr("PUT",args,true);};dojo.xhrDelete=function(args){return dojo.xhr("DELETE",args);};dojo._isDocumentOk=function(x){return util.checkStatus(x.status);};dojo._getText=function(url){var _4cc;dojo.xhrGet({url:url,sync:true,load:function(text){_4cc=text;}});return _4cc;};lang.mixin(dojo.xhr,{_xhrObj:dojo._xhrObj,fieldToObject:_4a2.fieldToObject,formToObject:_4a2.toObject,objectToQuery:ioq.objectToQuery,formToQuery:_4a2.toQuery,formToJson:_4a2.toJson,queryToObject:ioq.queryToObject,contentHandlers:_4a9,_ioSetArgs:dojo._ioSetArgs,_ioCancelAll:dojo._ioCancelAll,_ioNotifyStart:dojo._ioNotifyStart,_ioWatch:dojo._ioWatch,_ioAddQueryToUrl:dojo._ioAddQueryToUrl,_isDocumentOk:dojo._isDocumentOk,_getText:dojo._getText,get:dojo.xhrGet,post:dojo.xhrPost,put:dojo.xhrPut,del:dojo.xhrDelete});return dojo.xhr;});},"dojo/topic":function(){define(["./Evented"],function(_4cd){var hub=new _4cd;return {publish:function(_4ce,_4cf){return hub.emit.apply(hub,arguments);},subscribe:function(_4d0,_4d1){return hub.on.apply(hub,arguments);}};});},"dojo/loadInit":function(){define(["./_base/loader"],function(_4d2){return {dynamic:0,normalize:function(id){return id;},load:_4d2.loadInit};});},"dojo/_base/unload":function(){define(["./kernel","./lang","../on"],function(dojo,lang,on){var win=window;var _4d3={addOnWindowUnload:function(obj,_4d4){if(!dojo.windowUnloaded){on(win,"unload",(dojo.windowUnloaded=function(){}));}on(win,"unload",lang.hitch(obj,_4d4));},addOnUnload:function(obj,_4d5){on(win,"beforeunload",lang.hitch(obj,_4d5));}};dojo.addOnWindowUnload=_4d3.addOnWindowUnload;dojo.addOnUnload=_4d3.addOnUnload;return _4d3;});},"dojo/Deferred":function(){define(["./has","./_base/lang","./errors/CancelError","./promise/Promise","./promise/instrumentation"],function(has,lang,_4d6,_4d7,_4d8){"use strict";var _4d9=0,_4da=1,_4db=2;var _4dc="This deferred has already been fulfilled.";var _4dd=Object.freeze||function(){};var _4de=function(_4df,type,_4e0,_4e1,_4e2){if(1){if(type===_4db&&_4e3.instrumentRejected&&_4df.length===0){_4e3.instrumentRejected(_4e0,false,_4e1,_4e2);}}for(var i=0;i<_4df.length;i++){_4e4(_4df[i],type,_4e0,_4e1);}};var _4e4=function(_4e5,type,_4e6,_4e7){var func=_4e5[type];var _4e8=_4e5.deferred;if(func){try{var _4e9=func(_4e6);if(type===_4d9){if(typeof _4e9!=="undefined"){_4ea(_4e8,type,_4e9);}}else{if(_4e9&&typeof _4e9.then==="function"){_4e5.cancel=_4e9.cancel;_4e9.then(_4eb(_4e8,_4da),_4eb(_4e8,_4db),_4eb(_4e8,_4d9));return;}_4ea(_4e8,_4da,_4e9);}}catch(error){_4ea(_4e8,_4db,error);}}else{_4ea(_4e8,type,_4e6);}if(1){if(type===_4db&&_4e3.instrumentRejected){_4e3.instrumentRejected(_4e6,!!func,_4e7,_4e8.promise);}}};var _4eb=function(_4ec,type){return function(_4ed){_4ea(_4ec,type,_4ed);};};var _4ea=function(_4ee,type,_4ef){if(!_4ee.isCanceled()){switch(type){case _4d9:_4ee.progress(_4ef);break;case _4da:_4ee.resolve(_4ef);break;case _4db:_4ee.reject(_4ef);break;}}};var _4e3=function(_4f0){var _4f1=this.promise=new _4d7();var _4f2=this;var _4f3,_4f4,_4f5;var _4f6=false;var _4f7=[];if(1&&Error.captureStackTrace){Error.captureStackTrace(_4f2,_4e3);Error.captureStackTrace(_4f1,_4e3);}this.isResolved=_4f1.isResolved=function(){return _4f3===_4da;};this.isRejected=_4f1.isRejected=function(){return _4f3===_4db;};this.isFulfilled=_4f1.isFulfilled=function(){return !!_4f3;};this.isCanceled=_4f1.isCanceled=function(){return _4f6;};this.progress=function(_4f8,_4f9){if(!_4f3){_4de(_4f7,_4d9,_4f8,null,_4f2);return _4f1;}else{if(_4f9===true){throw new Error(_4dc);}else{return _4f1;}}};this.resolve=function(_4fa,_4fb){if(!_4f3){_4de(_4f7,_4f3=_4da,_4f4=_4fa,null,_4f2);_4f7=null;return _4f1;}else{if(_4fb===true){throw new Error(_4dc);}else{return _4f1;}}};var _4fc=this.reject=function(_4fd,_4fe){if(!_4f3){if(1&&Error.captureStackTrace){Error.captureStackTrace(_4f5={},_4fc);}_4de(_4f7,_4f3=_4db,_4f4=_4fd,_4f5,_4f2);_4f7=null;return _4f1;}else{if(_4fe===true){throw new Error(_4dc);}else{return _4f1;}}};this.then=_4f1.then=function(_4ff,_500,_501){var _502=[_501,_4ff,_500];_502.cancel=_4f1.cancel;_502.deferred=new _4e3(function(_503){return _502.cancel&&_502.cancel(_503);});if(_4f3&&!_4f7){_4e4(_502,_4f3,_4f4,_4f5);}else{_4f7.push(_502);}return _502.deferred.promise;};this.cancel=_4f1.cancel=function(_504,_505){if(!_4f3){if(_4f0){var _506=_4f0(_504);_504=typeof _506==="undefined"?_504:_506;}_4f6=true;if(!_4f3){if(typeof _504==="undefined"){_504=new _4d6();}_4fc(_504);return _504;}else{if(_4f3===_4db&&_4f4===_504){return _504;}}}else{if(_505===true){throw new Error(_4dc);}}};_4dd(_4f1);};_4e3.prototype.toString=function(){return "[object Deferred]";};if(_4d8){_4d8(_4e3);}return _4e3;});},"dojo/_base/NodeList":function(){define(["./kernel","../query","./array","./html","../NodeList-dom"],function(dojo,_507,_508){var _509=_507.NodeList,nlp=_509.prototype;nlp.connect=_509._adaptAsForEach(function(){return dojo.connect.apply(this,arguments);});nlp.coords=_509._adaptAsMap(dojo.coords);_509.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];_508.forEach(_509.events,function(evt){var _50a="on"+evt;nlp[_50a]=function(a,b){return this.connect(_50a,a,b);};});dojo.NodeList=_509;return _509;});},"dojo/request":function(){define(["./request/default!"],function(_50b){return _50b;});},"dojo/_base/Color":function(){define(["./kernel","./lang","./array","./config"],function(dojo,lang,_50c,_50d){var _50e=dojo.Color=function(_50f){if(_50f){this.setColor(_50f);}};_50e.named={"black":[0,0,0],"silver":[192,192,192],"gray":[128,128,128],"white":[255,255,255],"maroon":[128,0,0],"red":[255,0,0],"purple":[128,0,128],"fuchsia":[255,0,255],"green":[0,128,0],"lime":[0,255,0],"olive":[128,128,0],"yellow":[255,255,0],"navy":[0,0,128],"blue":[0,0,255],"teal":[0,128,128],"aqua":[0,255,255],"transparent":_50d.transparentColor||[0,0,0,0]};lang.extend(_50e,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_510){if(lang.isString(_510)){_50e.fromString(_510,this);}else{if(lang.isArray(_510)){_50e.fromArray(_510,this);}else{this._set(_510.r,_510.g,_510.b,_510.a);if(!(_510 instanceof _50e)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var arr=_50c.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+arr.join("");},toCss:function(_511){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_511?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});_50e.blendColors=dojo.blendColors=function(_512,end,_513,obj){var t=obj||new _50e();_50c.forEach(["r","g","b","a"],function(x){t[x]=_512[x]+(end[x]-_512[x])*_513;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};_50e.fromRgb=dojo.colorFromRgb=function(_514,obj){var m=_514.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&_50e.fromArray(m[1].split(/\s*,\s*/),obj);};_50e.fromHex=dojo.colorFromHex=function(_515,obj){var t=obj||new _50e(),bits=(_515.length==4)?4:8,mask=(1<<bits)-1;_515=Number("0x"+_515.substr(1));if(isNaN(_515)){return null;}_50c.forEach(["b","g","r"],function(x){var c=_515&mask;_515>>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};_50e.fromArray=dojo.colorFromArray=function(a,obj){var t=obj||new _50e();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};_50e.fromString=dojo.colorFromString=function(str,obj){var a=_50e.named[str];return a&&_50e.fromArray(a,obj)||_50e.fromRgb(str,obj)||_50e.fromHex(str,obj);};return _50e;});},"dojo/promise/instrumentation":function(){define(["./tracer","../has","../_base/lang","../_base/array"],function(_516,has,lang,_517){function _518(_519,_51a,_51b){var _51c="";if(_519&&_519.stack){_51c+=_519.stack;}if(_51a&&_51a.stack){_51c+="\n ----------------------------------------\n rejected"+_51a.stack.split("\n").slice(1).join("\n").replace(/^\s+/," ");}if(_51b&&_51b.stack){_51c+="\n ----------------------------------------\n"+_51b.stack;}console.error(_519,_51c);};function _51d(_51e,_51f,_520,_521){if(!_51f){_518(_51e,_520,_521);}};var _522=[];var _523=false;var _524=1000;function _525(_526,_527,_528,_529){if(_527){_517.some(_522,function(obj,ix){if(obj.error===_526){_522.splice(ix,1);return true;}});}else{if(!_517.some(_522,function(obj){return obj.error===_526;})){_522.push({error:_526,rejection:_528,deferred:_529,timestamp:new Date().getTime()});}}if(!_523){_523=setTimeout(_52a,_524);}};function _52a(){var now=new Date().getTime();var _52b=now-_524;_522=_517.filter(_522,function(obj){if(obj.timestamp<_52b){_518(obj.error,obj.rejection,obj.deferred);return false;}return true;});if(_522.length){_523=setTimeout(_52a,_522[0].timestamp+_524-now);}else{_523=false;}};return function(_52c){var _52d=has("config-useDeferredInstrumentation");if(_52d){_516.on("resolved",lang.hitch(console,"log","resolved"));_516.on("rejected",lang.hitch(console,"log","rejected"));_516.on("progress",lang.hitch(console,"log","progress"));var args=[];if(typeof _52d==="string"){args=_52d.split(",");_52d=args.shift();}if(_52d==="report-rejections"){_52c.instrumentRejected=_51d;}else{if(_52d==="report-unhandled-rejections"||_52d===true||_52d===1){_52c.instrumentRejected=_525;_524=parseInt(args[0],10)||_524;}else{throw new Error("Unsupported instrumentation usage <"+_52d+">");}}}};});},"dojo/selector/_loader":function(){define(["../has","require"],function(has,_52e){"use strict";var _52f=document.createElement("div");has.add("dom-qsa2.1",!!_52f.querySelectorAll);has.add("dom-qsa3",function(){try{_52f.innerHTML="<p class='TEST'></p>";return _52f.querySelectorAll(".TEST:empty").length==1;}catch(e){}});var _530;var acme="./acme",lite="./lite";return {load:function(id,_531,_532,_533){var req=_52e;id=id=="default"?has("config-selectorEngine")||"css3":id;id=id=="css2"||id=="lite"?lite:id=="css2.1"?has("dom-qsa2.1")?lite:acme:id=="css3"?has("dom-qsa3")?lite:acme:id=="acme"?acme:(req=_531)&&id;if(id.charAt(id.length-1)=="?"){id=id.substring(0,id.length-1);var _534=true;}if(_534&&(has("dom-compliant-qsa")||_530)){return _532(_530);}req([id],function(_535){if(id!="./lite"){_530=_535;}_532(_535);});}};});},"dojo/promise/Promise":function(){define(["../_base/lang"],function(lang){"use strict";function _536(){throw new TypeError("abstract");};return lang.extend(function Promise(){},{then:function(_537,_538,_539){_536();},cancel:function(_53a,_53b){_536();},isResolved:function(){_536();},isRejected:function(){_536();},isFulfilled:function(){_536();},isCanceled:function(){_536();},always:function(_53c){return this.then(_53c,_53c);},otherwise:function(_53d){return this.then(null,_53d);},trace:function(){return this;},traceRejected:function(){return this;},toString:function(){return "[object Promise]";}});});},"dojo/request/watch":function(){define(["./util","../errors/RequestTimeoutError","../errors/CancelError","../_base/array","../_base/window","../has!host-browser?dom-addeventlistener?:../on:"],function(util,_53e,_53f,_540,win,on){var _541=null,_542=[];function _543(){var now=+(new Date);for(var i=0,dfd;i<_542.length&&(dfd=_542[i]);i++){var _544=dfd.response,_545=_544.options;if((dfd.isCanceled&&dfd.isCanceled())||(dfd.isValid&&!dfd.isValid(_544))){_542.splice(i--,1);_546._onAction&&_546._onAction();}else{if(dfd.isReady&&dfd.isReady(_544)){_542.splice(i--,1);dfd.handleResponse(_544);_546._onAction&&_546._onAction();}else{if(dfd.startTime){if(dfd.startTime+(_545.timeout||0)<now){_542.splice(i--,1);dfd.cancel(new _53e("Timeout exceeded",_544));_546._onAction&&_546._onAction();}}}}}_546._onInFlight&&_546._onInFlight(dfd);if(!_542.length){clearInterval(_541);_541=null;}};function _546(dfd){if(dfd.response.options.timeout){dfd.startTime=+(new Date);}if(dfd.isFulfilled()){return;}_542.push(dfd);if(!_541){_541=setInterval(_543,50);}if(dfd.response.options.sync){_543();}};_546.cancelAll=function cancelAll(){try{_540.forEach(_542,function(dfd){try{dfd.cancel(new _53f("All requests canceled."));}catch(e){}});}catch(e){}};if(win&&on&&win.doc.attachEvent){on(win.global,"unload",function(){_546.cancelAll();});}return _546;});},"dojo/on":function(){define(["./has!dom-addeventlistener?:./aspect","./_base/kernel","./sniff"],function(_547,dojo,has){"use strict";if(1){var _548=window.ScriptEngineMajorVersion;has.add("jscript",_548&&(_548()+ScriptEngineMinorVersion()/10));has.add("event-orientationchange",has("touch")&&!has("android"));has.add("event-stopimmediatepropagation",window.Event&&!!window.Event.prototype&&!!window.Event.prototype.stopImmediatePropagation);has.add("event-focusin",function(_549,doc,_54a){return "onfocusin" in _54a;});}var on=function(_54b,type,_54c,_54d){if(typeof _54b.on=="function"&&typeof type!="function"&&!_54b.nodeType){return _54b.on(type,_54c);}return on.parse(_54b,type,_54c,_54e,_54d,this);};on.pausable=function(_54f,type,_550,_551){var _552;var _553=on(_54f,type,function(){if(!_552){return _550.apply(this,arguments);}},_551);_553.pause=function(){_552=true;};_553.resume=function(){_552=false;};return _553;};on.once=function(_554,type,_555,_556){var _557=on(_554,type,function(){_557.remove();return _555.apply(this,arguments);});return _557;};on.parse=function(_558,type,_559,_55a,_55b,_55c){if(type.call){return type.call(_55c,_558,_559);}if(type.indexOf(",")>-1){var _55d=type.split(/\s*,\s*/);var _55e=[];var i=0;var _55f;while(_55f=_55d[i++]){_55e.push(_55a(_558,_55f,_559,_55b,_55c));}_55e.remove=function(){for(var i=0;i<_55e.length;i++){_55e[i].remove();}};return _55e;}return _55a(_558,type,_559,_55b,_55c);};var _560=/^touch/;function _54e(_561,type,_562,_563,_564){var _565=type.match(/(.*):(.*)/);if(_565){type=_565[2];_565=_565[1];return on.selector(_565,type).call(_564,_561,_562);}if(has("touch")){if(_560.test(type)){_562=_566(_562);}if(!has("event-orientationchange")&&(type=="orientationchange")){type="resize";_561=window;_562=_566(_562);}}if(_567){_562=_567(_562);}if(_561.addEventListener){var _568=type in _569,_56a=_568?_569[type]:type;_561.addEventListener(_56a,_562,_568);return {remove:function(){_561.removeEventListener(_56a,_562,_568);}};}type="on"+type;if(_56b&&_561.attachEvent){return _56b(_561,type,_562);}throw new Error("Target must be an event emitter");};on.selector=function(_56c,_56d,_56e){return function(_56f,_570){var _571=typeof _56c=="function"?{matches:_56c}:this,_572=_56d.bubble;function _573(_574){_571=_571&&_571.matches?_571:dojo.query;while(!_571.matches(_574,_56c,_56f)){if(_574==_56f||_56e===false||!(_574=_574.parentNode)||_574.nodeType!=1){return;}}return _574;};if(_572){return on(_56f,_572(_573),_570);}return on(_56f,_56d,function(_575){var _576=_573(_575.target);return _576&&_570.call(_576,_575);});};};function _577(){this.cancelable=false;this.defaultPrevented=true;};function _578(){this.bubbles=false;};var _579=[].slice,_57a=on.emit=function(_57b,type,_57c){var args=_579.call(arguments,2);var _57d="on"+type;if("parentNode" in _57b){var _57e=args[0]={};for(var i in _57c){_57e[i]=_57c[i];}_57e.preventDefault=_577;_57e.stopPropagation=_578;_57e.target=_57b;_57e.type=type;_57c=_57e;}do{_57b[_57d]&&_57b[_57d].apply(_57b,args);}while(_57c&&_57c.bubbles&&(_57b=_57b.parentNode));return _57c&&_57c.cancelable&&_57c;};var _569=has("event-focusin")?{}:{focusin:"focus",focusout:"blur"};if(!has("event-stopimmediatepropagation")){var _57f=function(){this.immediatelyStopped=true;this.modified=true;};var _567=function(_580){return function(_581){if(!_581.immediatelyStopped){_581.stopImmediatePropagation=_57f;return _580.apply(this,arguments);}};};}if(has("dom-addeventlistener")){on.emit=function(_582,type,_583){if(_582.dispatchEvent&&document.createEvent){var _584=_582.ownerDocument||document;var _585=_584.createEvent("HTMLEvents");_585.initEvent(type,!!_583.bubbles,!!_583.cancelable);for(var i in _583){if(!(i in _585)){_585[i]=_583[i];}}return _582.dispatchEvent(_585)&&_585;}return _57a.apply(on,arguments);};}else{on._fixEvent=function(evt,_586){if(!evt){var w=_586&&(_586.ownerDocument||_586.document||_586).parentWindow||window;evt=w.event;}if(!evt){return evt;}try{if(_587&&evt.type==_587.type&&evt.srcElement==_587.target){evt=_587;}}catch(e){}if(!evt.target){evt.target=evt.srcElement;evt.currentTarget=(_586||evt.srcElement);if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(!evt.stopPropagation){evt.stopPropagation=_588;evt.preventDefault=_589;}switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;_58a(evt);break;}}return evt;};var _587,_58b=function(_58c){this.handle=_58c;};_58b.prototype.remove=function(){delete _dojoIEListeners_[this.handle];};var _58d=function(_58e){return function(evt){evt=on._fixEvent(evt,this);var _58f=_58e.call(this,evt);if(evt.modified){if(!_587){setTimeout(function(){_587=null;});}_587=evt;}return _58f;};};var _56b=function(_590,type,_591){_591=_58d(_591);if(((_590.ownerDocument?_590.ownerDocument.parentWindow:_590.parentWindow||_590.window||window)!=top||has("jscript")<5.8)&&!has("config-_allow_leaks")){if(typeof _dojoIEListeners_=="undefined"){_dojoIEListeners_=[];}var _592=_590[type];if(!_592||!_592.listeners){var _593=_592;_592=Function("event","var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}");_592.listeners=[];_590[type]=_592;_592.global=this;if(_593){_592.listeners.push(_dojoIEListeners_.push(_593)-1);}}var _594;_592.listeners.push(_594=(_592.global._dojoIEListeners_.push(_591)-1));return new _58b(_594);}return _547.after(_590,type,_591,true);};var _58a=function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _588=function(){this.cancelBubble=true;};var _589=on._preventDefault=function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){try{this.keyCode=0;}catch(e){}}this.defaultPrevented=true;this.returnValue=false;this.modified=true;};}if(has("touch")){var _595=function(){};var _596=window.orientation;var _566=function(_597){return function(_598){var _599=_598.corrected;if(!_599){var type=_598.type;try{delete _598.type;}catch(e){}if(_598.type){if(has("mozilla")){var _599={};for(var name in _598){_599[name]=_598[name];}}else{_595.prototype=_598;var _599=new _595;}_599.preventDefault=function(){_598.preventDefault();};_599.stopPropagation=function(){_598.stopPropagation();};}else{_599=_598;_599.type=type;}_598.corrected=_599;if(type=="resize"){if(_596==window.orientation){return null;}_596=window.orientation;_599.type="orientationchange";return _597.call(this,_599);}if(!("rotation" in _599)){_599.rotation=0;_599.scale=1;}var _59a=_599.changedTouches[0];for(var i in _59a){delete _599[i];_599[i]=_59a[i];}}return _597.call(this,_599);};};}return on;});},"dojo/_base/sniff":function(){define(["./kernel","./lang","../sniff"],function(dojo,lang,has){if(!1){return has;}dojo._name="browser";lang.mixin(dojo,{isBrowser:true,isFF:has("ff"),isIE:has("ie"),isKhtml:has("khtml"),isWebKit:has("webkit"),isMozilla:has("mozilla"),isMoz:has("mozilla"),isOpera:has("opera"),isSafari:has("safari"),isChrome:has("chrome"),isMac:has("mac"),isIos:has("ios"),isAndroid:has("android"),isWii:has("wii"),isQuirks:has("quirks"),isAir:has("air")});return has;});},"dojo/errors/create":function(){define(["../_base/lang"],function(lang){return function(name,ctor,base,_59b){base=base||Error;var _59c=function(_59d){if(base===Error){if(Error.captureStackTrace){Error.captureStackTrace(this,_59c);}var err=Error.call(this,_59d),prop;for(prop in err){if(err.hasOwnProperty(prop)){this[prop]=err[prop];}}this.message=_59d;this.stack=err.stack;}else{base.apply(this,arguments);}if(ctor){ctor.apply(this,arguments);}};_59c.prototype=lang.delegate(base.prototype,_59b);_59c.prototype.name=name;_59c.prototype.constructor=_59c;return _59c;};});},"dojo/_base/array":function(){define(["./kernel","../has","./lang"],function(dojo,has,lang){var _59e={},u;function _59f(fn){return _59e[fn]=new Function("item","index","array",fn);};function _5a0(some){var _5a1=!some;return function(a,fn,o){var i=0,l=a&&a.length||0,_5a2;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_59e[fn]||_59f(fn);}if(o){for(;i<l;++i){_5a2=!fn.call(o,a[i],i,a);if(some^_5a2){return !_5a2;}}}else{for(;i<l;++i){_5a2=!fn(a[i],i,a);if(some^_5a2){return !_5a2;}}}return _5a1;};};function _5a3(up){var _5a4=1,_5a5=0,_5a6=0;if(!up){_5a4=_5a5=_5a6=-1;}return function(a,x,from,last){if(last&&_5a4>0){return _5a7.lastIndexOf(a,x,from);}var l=a&&a.length||0,end=up?l+_5a6:_5a5,i;if(from===u){i=up?_5a5:l+_5a6;}else{if(from<0){i=l+from;if(i<0){i=_5a5;}}else{i=from>=l?l+_5a6:from;}}if(l&&typeof a=="string"){a=a.split("");}for(;i!=end;i+=_5a4){if(a[i]==x){return i;}}return -1;};};var _5a7={every:_5a0(false),some:_5a0(true),indexOf:_5a3(true),lastIndexOf:_5a3(false),forEach:function(arr,_5a8,_5a9){var i=0,l=arr&&arr.length||0;if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5a8=="string"){_5a8=_59e[_5a8]||_59f(_5a8);}if(_5a9){for(;i<l;++i){_5a8.call(_5a9,arr[i],i,arr);}}else{for(;i<l;++i){_5a8(arr[i],i,arr);}}},map:function(arr,_5aa,_5ab,Ctr){var i=0,l=arr&&arr.length||0,out=new (Ctr||Array)(l);if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5aa=="string"){_5aa=_59e[_5aa]||_59f(_5aa);}if(_5ab){for(;i<l;++i){out[i]=_5aa.call(_5ab,arr[i],i,arr);}}else{for(;i<l;++i){out[i]=_5aa(arr[i],i,arr);}}return out;},filter:function(arr,_5ac,_5ad){var i=0,l=arr&&arr.length||0,out=[],_5ae;if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5ac=="string"){_5ac=_59e[_5ac]||_59f(_5ac);}if(_5ad){for(;i<l;++i){_5ae=arr[i];if(_5ac.call(_5ad,_5ae,i,arr)){out.push(_5ae);}}}else{for(;i<l;++i){_5ae=arr[i];if(_5ac(_5ae,i,arr)){out.push(_5ae);}}}return out;},clearCache:function(){_59e={};}};1&&lang.mixin(dojo,_5a7);return _5a7;});},"dojo/_base/json":function(){define(["./kernel","../json"],function(dojo,json){dojo.fromJson=function(js){return eval("("+js+")");};dojo._escapeString=json.stringify;dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_5af){return json.stringify(it,function(key,_5b0){if(_5b0){var tf=_5b0.__json__||_5b0.json;if(typeof tf=="function"){return tf.call(_5b0);}}return _5b0;},_5af&&dojo.toJsonIndentStr);};return dojo;});},"dojo/_base/window":function(){define(["./kernel","./lang","../sniff"],function(dojo,lang,has){var ret={global:dojo.global,doc:this["document"]||null,body:function(doc){doc=doc||dojo.doc;return doc.body||doc.getElementsByTagName("body")[0];},setContext:function(_5b1,_5b2){dojo.global=ret.global=_5b1;dojo.doc=ret.doc=_5b2;},withGlobal:function(_5b3,_5b4,_5b5,_5b6){var _5b7=dojo.global;try{dojo.global=ret.global=_5b3;return ret.withDoc.call(null,_5b3.document,_5b4,_5b5,_5b6);}finally{dojo.global=ret.global=_5b7;}},withDoc:function(_5b8,_5b9,_5ba,_5bb){var _5bc=ret.doc,oldQ=has("quirks"),_5bd=has("ie"),isIE,mode,pwin;try{dojo.doc=ret.doc=_5b8;dojo.isQuirks=has.add("quirks",dojo.doc.compatMode=="BackCompat",true,true);if(has("ie")){if((pwin=_5b8.parentWindow)&&pwin.navigator){isIE=parseFloat(pwin.navigator.appVersion.split("MSIE ")[1])||undefined;mode=_5b8.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}dojo.isIE=has.add("ie",isIE,true,true);}}if(_5ba&&typeof _5b9=="string"){_5b9=_5ba[_5b9];}return _5b9.apply(_5ba,_5bb||[]);}finally{dojo.doc=ret.doc=_5bc;dojo.isQuirks=has.add("quirks",oldQ,true,true);dojo.isIE=has.add("ie",_5bd,true,true);}}};1&&lang.mixin(dojo,ret);return ret;});},"dojo/dom-class":function(){define(["./_base/lang","./_base/array","./dom"],function(lang,_5be,dom){var _5bf="className";var cls,_5c0=/\s+/,a1=[""];function _5c1(s){if(typeof s=="string"||s instanceof String){if(s&&!_5c0.test(s)){a1[0]=s;return a1;}var a=s.split(_5c0);if(a.length&&!a[0]){a.shift();}if(a.length&&!a[a.length-1]){a.pop();}return a;}if(!s){return [];}return _5be.filter(s,function(x){return x;});};var _5c2={};cls={contains:function containsClass(node,_5c3){return ((" "+dom.byId(node)[_5bf]+" ").indexOf(" "+_5c3+" ")>=0);},add:function addClass(node,_5c4){node=dom.byId(node);_5c4=_5c1(_5c4);var cls=node[_5bf],_5c5;cls=cls?" "+cls+" ":" ";_5c5=cls.length;for(var i=0,len=_5c4.length,c;i<len;++i){c=_5c4[i];if(c&&cls.indexOf(" "+c+" ")<0){cls+=c+" ";}}if(_5c5<cls.length){node[_5bf]=cls.substr(1,cls.length-2);}},remove:function removeClass(node,_5c6){node=dom.byId(node);var cls;if(_5c6!==undefined){_5c6=_5c1(_5c6);cls=" "+node[_5bf]+" ";for(var i=0,len=_5c6.length;i<len;++i){cls=cls.replace(" "+_5c6[i]+" "," ");}cls=lang.trim(cls);}else{cls="";}if(node[_5bf]!=cls){node[_5bf]=cls;}},replace:function replaceClass(node,_5c7,_5c8){node=dom.byId(node);_5c2[_5bf]=node[_5bf];cls.remove(_5c2,_5c8);cls.add(_5c2,_5c7);if(node[_5bf]!==_5c2[_5bf]){node[_5bf]=_5c2[_5bf];}},toggle:function toggleClass(node,_5c9,_5ca){node=dom.byId(node);if(_5ca===undefined){_5c9=_5c1(_5c9);for(var i=0,len=_5c9.length,c;i<len;++i){c=_5c9[i];cls[cls.contains(node,c)?"remove":"add"](node,c);}}else{cls[_5ca?"add":"remove"](node,_5c9);}return _5ca;}};return cls;});},"dojo/_base/config":function(){define(["../has","require"],function(has,_5cb){var _5cc={};if(1){var src=_5cb.rawConfig,p;for(p in src){_5cc[p]=src[p];}}else{var _5cd=function(_5ce,_5cf,_5d0){for(p in _5ce){p!="has"&&has.add(_5cf+p,_5ce[p],0,_5d0);}};_5cc=1?_5cb.rawConfig:this.dojoConfig||this.djConfig||{};_5cd(_5cc,"config",1);_5cd(_5cc.has,"",1);}if(!_5cc.locale&&typeof navigator!="undefined"){_5cc.locale=(navigator.language||navigator.userLanguage).toLowerCase();}return _5cc;});},"dojo/main":function(){define(["./_base/kernel","./has","require","./sniff","./_base/lang","./_base/array","./_base/config","./ready","./_base/declare","./_base/connect","./_base/Deferred","./_base/json","./_base/Color","./has!dojo-firebug?./_firebug/firebug","./_base/browser","./_base/loader"],function(_5d1,has,_5d2,_5d3,lang,_5d4,_5d5,_5d6){if(_5d5.isDebug){_5d2(["./_firebug/firebug"]);}1||has.add("dojo-config-require",1);if(1){var deps=_5d5.require;if(deps){deps=_5d4.map(lang.isArray(deps)?deps:[deps],function(item){return item.replace(/\./g,"/");});if(_5d1.isAsync){_5d2(deps);}else{_5d6(1,function(){_5d2(deps);});}}}return _5d1;});},"dojo/_base/event":function(){define(["./kernel","../on","../has","../dom-geometry"],function(dojo,on,has,dom){if(on._fixEvent){var _5d7=on._fixEvent;on._fixEvent=function(evt,se){evt=_5d7(evt,se);if(evt){dom.normalizeEvent(evt);}return evt;};}var ret={fix:function(evt,_5d8){if(on._fixEvent){return on._fixEvent(evt,_5d8);}return evt;},stop:function(evt){if(has("dom-addeventlistener")||(evt&&evt.preventDefault)){evt.preventDefault();evt.stopPropagation();}else{evt=evt||window.event;evt.cancelBubble=true;on._preventDefault.call(evt);}}};if(1){dojo.fixEvent=ret.fix;dojo.stopEvent=ret.stop;}return ret;});},"dojo/sniff":function(){define(["./has"],function(has){if(1){var n=navigator,dua=n.userAgent,dav=n.appVersion,tv=parseFloat(dav);has.add("air",dua.indexOf("AdobeAIR")>=0);has.add("msapp",parseFloat(dua.split("MSAppHost/")[1])||undefined);has.add("khtml",dav.indexOf("Konqueror")>=0?tv:undefined);has.add("webkit",parseFloat(dua.split("WebKit/")[1])||undefined);has.add("chrome",parseFloat(dua.split("Chrome/")[1])||undefined);has.add("safari",dav.indexOf("Safari")>=0&&!has("chrome")?parseFloat(dav.split("Version/")[1]):undefined);has.add("mac",dav.indexOf("Macintosh")>=0);has.add("quirks",document.compatMode=="BackCompat");if(dua.match(/(iPhone|iPod|iPad)/)){var p=RegExp.$1.replace(/P/,"p");var v=dua.match(/OS ([\d_]+)/)?RegExp.$1:"1";var os=parseFloat(v.replace(/_/,".").replace(/_/g,""));has.add(p,os);has.add("ios",os);}has.add("android",parseFloat(dua.split("Android ")[1])||undefined);has.add("bb",(dua.indexOf("BlackBerry")>=0||dua.indexOf("BB10")>=0)&&parseFloat(dua.split("Version/")[1])||undefined);has.add("trident",parseFloat(dav.split("Trident/")[1])||undefined);has.add("svg",typeof SVGAngle!=="undefined");if(!has("webkit")){if(dua.indexOf("Opera")>=0){has.add("opera",tv>=9.8?parseFloat(dua.split("Version/")[1])||tv:tv);}if(dua.indexOf("Gecko")>=0&&!has("khtml")&&!has("webkit")&&!has("trident")){has.add("mozilla",tv);}if(has("mozilla")){has.add("ff",parseFloat(dua.split("Firefox/")[1]||dua.split("Minefield/")[1])||undefined);}if(document.all&&!has("opera")){var isIE=parseFloat(dav.split("MSIE ")[1])||undefined;var mode=document.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}has.add("ie",isIE);}has.add("wii",typeof opera!="undefined"&&opera.wiiremote);}}return has;});},"dojo/request/handlers":function(){define(["../json","../_base/kernel","../_base/array","../has","../selector/_loader"],function(JSON,_5d9,_5da,has){has.add("activex",typeof ActiveXObject!=="undefined");has.add("dom-parser",function(_5db){return "DOMParser" in _5db;});var _5dc;if(has("activex")){var dp=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML.DOMDocument"];_5dc=function(_5dd){var _5de=_5dd.data;if(_5de&&has("dom-qsa2.1")&&!_5de.querySelectorAll&&has("dom-parser")){_5de=new DOMParser().parseFromString(_5dd.text,"application/xml");}if(!_5de||!_5de.documentElement){var text=_5dd.text;_5da.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(text);_5de=dom;}catch(e){return false;}return true;});}return _5de;};}var _5df={"javascript":function(_5e0){return _5d9.eval(_5e0.text||"");},"json":function(_5e1){return JSON.parse(_5e1.text||null);},"xml":_5dc};function _5e2(_5e3){var _5e4=_5df[_5e3.options.handleAs];_5e3.data=_5e4?_5e4(_5e3):(_5e3.data||_5e3.text);return _5e3;};_5e2.register=function(name,_5e5){_5df[name]=_5e5;};return _5e2;});},"dojo/aspect":function(){define([],function(){"use strict";var _5e6,_5e7=0;function _5e8(_5e9,type,_5ea,_5eb){var _5ec=_5e9[type];var _5ed=type=="around";var _5ee;if(_5ed){var _5ef=_5ea(function(){return _5ec.advice(this,arguments);});_5ee={remove:function(){if(_5ef){_5ef=_5e9=_5ea=null;}},advice:function(_5f0,args){return _5ef?_5ef.apply(_5f0,args):_5ec.advice(_5f0,args);}};}else{_5ee={remove:function(){if(_5ee.advice){var _5f1=_5ee.previous;var next=_5ee.next;if(!next&&!_5f1){delete _5e9[type];}else{if(_5f1){_5f1.next=next;}else{_5e9[type]=next;}if(next){next.previous=_5f1;}}_5e9=_5ea=_5ee.advice=null;}},id:_5e7++,advice:_5ea,receiveArguments:_5eb};}if(_5ec&&!_5ed){if(type=="after"){while(_5ec.next&&(_5ec=_5ec.next)){}_5ec.next=_5ee;_5ee.previous=_5ec;}else{if(type=="before"){_5e9[type]=_5ee;_5ee.next=_5ec;_5ec.previous=_5ee;}}}else{_5e9[type]=_5ee;}return _5ee;};function _5f2(type){return function(_5f3,_5f4,_5f5,_5f6){var _5f7=_5f3[_5f4],_5f8;if(!_5f7||_5f7.target!=_5f3){_5f3[_5f4]=_5f8=function(){var _5f9=_5e7;var args=arguments;var _5fa=_5f8.before;while(_5fa){args=_5fa.advice.apply(this,args)||args;_5fa=_5fa.next;}if(_5f8.around){var _5fb=_5f8.around.advice(this,args);}var _5fc=_5f8.after;while(_5fc&&_5fc.id<_5f9){if(_5fc.receiveArguments){var _5fd=_5fc.advice.apply(this,args);_5fb=_5fd===_5e6?_5fb:_5fd;}else{_5fb=_5fc.advice.call(this,_5fb,args);}_5fc=_5fc.next;}return _5fb;};if(_5f7){_5f8.around={advice:function(_5fe,args){return _5f7.apply(_5fe,args);}};}_5f8.target=_5f3;}var _5ff=_5e8((_5f8||_5f7),type,_5f5,_5f6);_5f5=null;return _5ff;};};var _600=_5f2("after");var _601=_5f2("before");var _602=_5f2("around");return {before:_601,around:_602,after:_600};});},"dojo/ready":function(){define(["./_base/kernel","./has","require","./domReady","./_base/lang"],function(dojo,has,_603,_604,lang){var _605=0,_606=[],_607=0,_608=function(){_605=1;dojo._postLoad=dojo.config.afterOnLoad=true;_609();},_609=function(){if(_607){return;}_607=1;while(_605&&(!_604||_604._Q.length==0)&&(_603.idle?_603.idle():true)&&_606.length){var f=_606.shift();try{f();}catch(e){e.info=e.message;if(_603.signal){_603.signal("error",e);}else{throw e;}}}_607=0;};_603.on&&_603.on("idle",_609);if(_604){_604._onQEmpty=_609;}var _60a=dojo.ready=dojo.addOnLoad=function(_60b,_60c,_60d){var _60e=lang._toArray(arguments);if(typeof _60b!="number"){_60d=_60c;_60c=_60b;_60b=1000;}else{_60e.shift();}_60d=_60d?lang.hitch.apply(dojo,_60e):function(){_60c();};_60d.priority=_60b;for(var i=0;i<_606.length&&_60b>=_606[i].priority;i++){}_606.splice(i,0,_60d);_609();};1||has.add("dojo-config-addOnLoad",1);if(1){var dca=dojo.config.addOnLoad;if(dca){_60a[(lang.isArray(dca)?"apply":"call")](dojo,dca);}}if(1&&dojo.config.parseOnLoad&&!dojo.isAsync){_60a(99,function(){if(!dojo.parser){dojo.deprecated("Add explicit require(['dojo/parser']);","","2.0");_603(["dojo/parser"]);}});}if(_604){_604(_608);}else{_608();}return _60a;});},"dojo/_base/connect":function(){define(["./kernel","../on","../topic","../aspect","./event","../mouse","./sniff","./lang","../keys"],function(dojo,on,hub,_60f,_610,_611,has,lang){has.add("events-keypress-typed",function(){var _612={charCode:0};try{_612=document.createEvent("KeyboardEvent");(_612.initKeyboardEvent||_612.initKeyEvent).call(_612,"keypress",true,true,null,false,false,false,false,9,3);}catch(e){}return _612.charCode==0&&!has("opera");});function _613(obj,_614,_615,_616,_617){_616=lang.hitch(_615,_616);if(!obj||!(obj.addEventListener||obj.attachEvent)){return _60f.after(obj||dojo.global,_614,_616,true);}if(typeof _614=="string"&&_614.substring(0,2)=="on"){_614=_614.substring(2);}if(!obj){obj=dojo.global;}if(!_617){switch(_614){case "keypress":_614=_618;break;case "mouseenter":_614=_611.enter;break;case "mouseleave":_614=_611.leave;break;}}return on(obj,_614,_616,_617);};var _619={106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39,229:113};var _61a=has("mac")?"metaKey":"ctrlKey";var _61b=function(evt,_61c){var faux=lang.mixin({},evt,_61c);_61d(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};function _61d(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _618;if(has("events-keypress-typed")){var _61e=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};_618=function(_61f,_620){var _621=on(_61f,"keydown",function(evt){var k=evt.keyCode;var _622=(k!=13)&&k!=32&&(k!=27||!has("ie"))&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222)&&k!=229;if(_622||evt.ctrlKey){var c=_622?0:k;if(evt.ctrlKey){if(k==3||k==13){return _620.call(evt.currentTarget,evt);}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=_619[c]||c;}}}}var faux=_61b(evt,{type:"keypress",faux:true,charCode:c});_620.call(evt.currentTarget,faux);if(has("ie")){_61e(evt,faux.keyCode);}}});var _623=on(_61f,"keypress",function(evt){var c=evt.charCode;c=c>=32?c:0;evt=_61b(evt,{charCode:c,faux:true});return _620.call(this,evt);});return {remove:function(){_621.remove();_623.remove();}};};}else{if(has("opera")){_618=function(_624,_625){return on(_624,"keypress",function(evt){var c=evt.which;if(c==3){c=99;}c=c<32&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return _625.call(this,_61b(evt,{charCode:c}));});};}else{_618=function(_626,_627){return on(_626,"keypress",function(evt){_61d(evt);return _627.call(this,evt);});};}}var _628={_keypress:_618,connect:function(obj,_629,_62a,_62b,_62c){var a=arguments,args=[],i=0;args.push(typeof a[0]=="string"?null:a[i++],a[i++]);var a1=a[i+1];args.push(typeof a1=="string"||typeof a1=="function"?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){args.push(a[i]);}return _613.apply(this,args);},disconnect:function(_62d){if(_62d){_62d.remove();}},subscribe:function(_62e,_62f,_630){return hub.subscribe(_62e,lang.hitch(_62f,_630));},publish:function(_631,args){return hub.publish.apply(hub,[_631].concat(args));},connectPublisher:function(_632,obj,_633){var pf=function(){_628.publish(_632,arguments);};return _633?_628.connect(obj,_633,pf):_628.connect(obj,pf);},isCopyKey:function(e){return e[_61a];}};_628.unsubscribe=_628.disconnect;1&&lang.mixin(dojo,_628);return _628;});},"dojo/errors/CancelError":function(){define(["./create"],function(_634){return _634("CancelError",null,null,{dojoType:"cancel"});});}}});(function(){var _635=this.require;_635({cache:{}});!_635.async&&_635(["dojo"]);_635.boot&&_635.apply(null,_635.boot);})();
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/dojo/regexp.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,33 @@
+/*
+ Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
+ Available via Academic Free License >= 2.1 OR the modified BSD license.
+ see: http://dojotoolkit.org/license for details
+*/
+
+//>>built
+define("dojo/regexp",["./_base/kernel","./_base/lang"],function(_1,_2){
+var _3={};
+_2.setObject("dojo.regexp",_3);
+_3.escapeString=function(_4,_5){
+return _4.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){
+if(_5&&_5.indexOf(ch)!=-1){
+return ch;
+}
+return "\\"+ch;
+});
+};
+_3.buildGroupRE=function(_6,re,_7){
+if(!(_6 instanceof Array)){
+return re(_6);
+}
+var b=[];
+for(var i=0;i<_6.length;i++){
+b.push(re(_6[i]));
+}
+return _3.group(b.join("|"),_7);
+};
+_3.group=function(_8,_9){
+return "("+(_9?"?:":"")+_8+")";
+};
+return _3;
+});
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/animated-overlay.gif has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png has changed
Binary file server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/jquery-ui.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1177 @@
+/*! jQuery UI - v1.10.3 - 2013-10-19
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden {
+ display: none;
+}
+.ui-helper-hidden-accessible {
+ border: 0;
+ clip: rect(0 0 0 0);
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ padding: 0;
+ position: absolute;
+ width: 1px;
+}
+.ui-helper-reset {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ line-height: 1.3;
+ text-decoration: none;
+ font-size: 100%;
+ list-style: none;
+}
+.ui-helper-clearfix:before,
+.ui-helper-clearfix:after {
+ content: "";
+ display: table;
+ border-collapse: collapse;
+}
+.ui-helper-clearfix:after {
+ clear: both;
+}
+.ui-helper-clearfix {
+ min-height: 0; /* support: IE7 */
+}
+.ui-helper-zfix {
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ position: absolute;
+ opacity: 0;
+ filter:Alpha(Opacity=0);
+}
+
+.ui-front {
+ z-index: 100;
+}
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled {
+ cursor: default !important;
+}
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ display: block;
+ text-indent: -99999px;
+ overflow: hidden;
+ background-repeat: no-repeat;
+}
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.ui-resizable {
+ position: relative;
+}
+.ui-resizable-handle {
+ position: absolute;
+ font-size: 0.1px;
+ display: block;
+}
+.ui-resizable-disabled .ui-resizable-handle,
+.ui-resizable-autohide .ui-resizable-handle {
+ display: none;
+}
+.ui-resizable-n {
+ cursor: n-resize;
+ height: 7px;
+ width: 100%;
+ top: -5px;
+ left: 0;
+}
+.ui-resizable-s {
+ cursor: s-resize;
+ height: 7px;
+ width: 100%;
+ bottom: -5px;
+ left: 0;
+}
+.ui-resizable-e {
+ cursor: e-resize;
+ width: 7px;
+ right: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-w {
+ cursor: w-resize;
+ width: 7px;
+ left: -5px;
+ top: 0;
+ height: 100%;
+}
+.ui-resizable-se {
+ cursor: se-resize;
+ width: 12px;
+ height: 12px;
+ right: 1px;
+ bottom: 1px;
+}
+.ui-resizable-sw {
+ cursor: sw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ bottom: -5px;
+}
+.ui-resizable-nw {
+ cursor: nw-resize;
+ width: 9px;
+ height: 9px;
+ left: -5px;
+ top: -5px;
+}
+.ui-resizable-ne {
+ cursor: ne-resize;
+ width: 9px;
+ height: 9px;
+ right: -5px;
+ top: -5px;
+}
+.ui-selectable-helper {
+ position: absolute;
+ z-index: 100;
+ border: 1px dotted black;
+}
+.ui-accordion .ui-accordion-header {
+ display: block;
+ cursor: pointer;
+ position: relative;
+ margin-top: 2px;
+ padding: .5em .5em .5em .7em;
+ min-height: 0; /* support: IE7 */
+}
+.ui-accordion .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-noicons {
+ padding-left: .7em;
+}
+.ui-accordion .ui-accordion-icons .ui-accordion-icons {
+ padding-left: 2.2em;
+}
+.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
+ position: absolute;
+ left: .5em;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-accordion .ui-accordion-content {
+ padding: 1em 2.2em;
+ border-top: 0;
+ overflow: auto;
+}
+.ui-autocomplete {
+ position: absolute;
+ top: 0;
+ left: 0;
+ cursor: default;
+}
+.ui-button {
+ display: inline-block;
+ position: relative;
+ padding: 0;
+ line-height: normal;
+ margin-right: .1em;
+ cursor: pointer;
+ vertical-align: middle;
+ text-align: center;
+ overflow: visible; /* removes extra width in IE */
+}
+.ui-button,
+.ui-button:link,
+.ui-button:visited,
+.ui-button:hover,
+.ui-button:active {
+ text-decoration: none;
+}
+/* to make room for the icon, a width needs to be set here */
+.ui-button-icon-only {
+ width: 2.2em;
+}
+/* button elements seem to need a little more width */
+button.ui-button-icon-only {
+ width: 2.4em;
+}
+.ui-button-icons-only {
+ width: 3.4em;
+}
+button.ui-button-icons-only {
+ width: 3.7em;
+}
+
+/* button text element */
+.ui-button .ui-button-text {
+ display: block;
+ line-height: normal;
+}
+.ui-button-text-only .ui-button-text {
+ padding: .4em 1em;
+}
+.ui-button-icon-only .ui-button-text,
+.ui-button-icons-only .ui-button-text {
+ padding: .4em;
+ text-indent: -9999999px;
+}
+.ui-button-text-icon-primary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 1em .4em 2.1em;
+}
+.ui-button-text-icon-secondary .ui-button-text,
+.ui-button-text-icons .ui-button-text {
+ padding: .4em 2.1em .4em 1em;
+}
+.ui-button-text-icons .ui-button-text {
+ padding-left: 2.1em;
+ padding-right: 2.1em;
+}
+/* no icon support for input elements, provide padding by default */
+input.ui-button {
+ padding: .4em 1em;
+}
+
+/* button icon element(s) */
+.ui-button-icon-only .ui-icon,
+.ui-button-text-icon-primary .ui-icon,
+.ui-button-text-icon-secondary .ui-icon,
+.ui-button-text-icons .ui-icon,
+.ui-button-icons-only .ui-icon {
+ position: absolute;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-button-icon-only .ui-icon {
+ left: 50%;
+ margin-left: -8px;
+}
+.ui-button-text-icon-primary .ui-button-icon-primary,
+.ui-button-text-icons .ui-button-icon-primary,
+.ui-button-icons-only .ui-button-icon-primary {
+ left: .5em;
+}
+.ui-button-text-icon-secondary .ui-button-icon-secondary,
+.ui-button-text-icons .ui-button-icon-secondary,
+.ui-button-icons-only .ui-button-icon-secondary {
+ right: .5em;
+}
+
+/* button sets */
+.ui-buttonset {
+ margin-right: 7px;
+}
+.ui-buttonset .ui-button {
+ margin-left: 0;
+ margin-right: -.3em;
+}
+
+/* workarounds */
+/* reset extra padding in Firefox, see h5bp.com/l */
+input.ui-button::-moz-focus-inner,
+button.ui-button::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+.ui-datepicker {
+ width: 17em;
+ padding: .2em .2em 0;
+ display: none;
+}
+.ui-datepicker .ui-datepicker-header {
+ position: relative;
+ padding: .2em 0;
+}
+.ui-datepicker .ui-datepicker-prev,
+.ui-datepicker .ui-datepicker-next {
+ position: absolute;
+ top: 2px;
+ width: 1.8em;
+ height: 1.8em;
+}
+.ui-datepicker .ui-datepicker-prev-hover,
+.ui-datepicker .ui-datepicker-next-hover {
+ top: 1px;
+}
+.ui-datepicker .ui-datepicker-prev {
+ left: 2px;
+}
+.ui-datepicker .ui-datepicker-next {
+ right: 2px;
+}
+.ui-datepicker .ui-datepicker-prev-hover {
+ left: 1px;
+}
+.ui-datepicker .ui-datepicker-next-hover {
+ right: 1px;
+}
+.ui-datepicker .ui-datepicker-prev span,
+.ui-datepicker .ui-datepicker-next span {
+ display: block;
+ position: absolute;
+ left: 50%;
+ margin-left: -8px;
+ top: 50%;
+ margin-top: -8px;
+}
+.ui-datepicker .ui-datepicker-title {
+ margin: 0 2.3em;
+ line-height: 1.8em;
+ text-align: center;
+}
+.ui-datepicker .ui-datepicker-title select {
+ font-size: 1em;
+ margin: 1px 0;
+}
+.ui-datepicker select.ui-datepicker-month-year {
+ width: 100%;
+}
+.ui-datepicker select.ui-datepicker-month,
+.ui-datepicker select.ui-datepicker-year {
+ width: 49%;
+}
+.ui-datepicker table {
+ width: 100%;
+ font-size: .9em;
+ border-collapse: collapse;
+ margin: 0 0 .4em;
+}
+.ui-datepicker th {
+ padding: .7em .3em;
+ text-align: center;
+ font-weight: bold;
+ border: 0;
+}
+.ui-datepicker td {
+ border: 0;
+ padding: 1px;
+}
+.ui-datepicker td span,
+.ui-datepicker td a {
+ display: block;
+ padding: .2em;
+ text-align: right;
+ text-decoration: none;
+}
+.ui-datepicker .ui-datepicker-buttonpane {
+ background-image: none;
+ margin: .7em 0 0 0;
+ padding: 0 .2em;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 0;
+}
+.ui-datepicker .ui-datepicker-buttonpane button {
+ float: right;
+ margin: .5em .2em .4em;
+ cursor: pointer;
+ padding: .2em .6em .3em .6em;
+ width: auto;
+ overflow: visible;
+}
+.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
+ float: left;
+}
+
+/* with multiple calendars */
+.ui-datepicker.ui-datepicker-multi {
+ width: auto;
+}
+.ui-datepicker-multi .ui-datepicker-group {
+ float: left;
+}
+.ui-datepicker-multi .ui-datepicker-group table {
+ width: 95%;
+ margin: 0 auto .4em;
+}
+.ui-datepicker-multi-2 .ui-datepicker-group {
+ width: 50%;
+}
+.ui-datepicker-multi-3 .ui-datepicker-group {
+ width: 33.3%;
+}
+.ui-datepicker-multi-4 .ui-datepicker-group {
+ width: 25%;
+}
+.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
+ border-left-width: 0;
+}
+.ui-datepicker-multi .ui-datepicker-buttonpane {
+ clear: left;
+}
+.ui-datepicker-row-break {
+ clear: both;
+ width: 100%;
+ font-size: 0;
+}
+
+/* RTL support */
+.ui-datepicker-rtl {
+ direction: rtl;
+}
+.ui-datepicker-rtl .ui-datepicker-prev {
+ right: 2px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next {
+ left: 2px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-prev:hover {
+ right: 1px;
+ left: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-next:hover {
+ left: 1px;
+ right: auto;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane {
+ clear: right;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button {
+ float: left;
+}
+.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
+.ui-datepicker-rtl .ui-datepicker-group {
+ float: right;
+}
+.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
+.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
+ border-right-width: 0;
+ border-left-width: 1px;
+}
+.ui-dialog {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding: .2em;
+ outline: 0;
+}
+.ui-dialog .ui-dialog-titlebar {
+ padding: .4em 1em;
+ position: relative;
+}
+.ui-dialog .ui-dialog-title {
+ float: left;
+ margin: .1em 0;
+ white-space: nowrap;
+ width: 90%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.ui-dialog .ui-dialog-titlebar-close {
+ position: absolute;
+ right: .3em;
+ top: 50%;
+ width: 21px;
+ margin: -10px 0 0 0;
+ padding: 1px;
+ height: 20px;
+}
+.ui-dialog .ui-dialog-content {
+ position: relative;
+ border: 0;
+ padding: .5em 1em;
+ background: none;
+ overflow: auto;
+}
+.ui-dialog .ui-dialog-buttonpane {
+ text-align: left;
+ border-width: 1px 0 0 0;
+ background-image: none;
+ margin-top: .5em;
+ padding: .3em 1em .5em .4em;
+}
+.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
+ float: right;
+}
+.ui-dialog .ui-dialog-buttonpane button {
+ margin: .5em .4em .5em 0;
+ cursor: pointer;
+}
+.ui-dialog .ui-resizable-se {
+ width: 12px;
+ height: 12px;
+ right: -5px;
+ bottom: -5px;
+ background-position: 16px 16px;
+}
+.ui-draggable .ui-dialog-titlebar {
+ cursor: move;
+}
+.ui-menu {
+ list-style: none;
+ padding: 2px;
+ margin: 0;
+ display: block;
+ outline: none;
+}
+.ui-menu .ui-menu {
+ margin-top: -3px;
+ position: absolute;
+}
+.ui-menu .ui-menu-item {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ /* support: IE10, see #8844 */
+ list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
+}
+.ui-menu .ui-menu-divider {
+ margin: 5px -2px 5px -2px;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ border-width: 1px 0 0 0;
+}
+.ui-menu .ui-menu-item a {
+ text-decoration: none;
+ display: block;
+ padding: 2px .4em;
+ line-height: 1.5;
+ min-height: 0; /* support: IE7 */
+ font-weight: normal;
+}
+.ui-menu .ui-menu-item a.ui-state-focus,
+.ui-menu .ui-menu-item a.ui-state-active {
+ font-weight: normal;
+ margin: -1px;
+}
+
+.ui-menu .ui-state-disabled {
+ font-weight: normal;
+ margin: .4em 0 .2em;
+ line-height: 1.5;
+}
+.ui-menu .ui-state-disabled a {
+ cursor: default;
+}
+
+/* icon support */
+.ui-menu-icons {
+ position: relative;
+}
+.ui-menu-icons .ui-menu-item a {
+ position: relative;
+ padding-left: 2em;
+}
+
+/* left-aligned */
+.ui-menu .ui-icon {
+ position: absolute;
+ top: .2em;
+ left: .2em;
+}
+
+/* right-aligned */
+.ui-menu .ui-menu-icon {
+ position: static;
+ float: right;
+}
+.ui-progressbar {
+ height: 2em;
+ text-align: left;
+ overflow: hidden;
+}
+.ui-progressbar .ui-progressbar-value {
+ margin: -1px;
+ height: 100%;
+}
+.ui-progressbar .ui-progressbar-overlay {
+ background: url("images/animated-overlay.gif");
+ height: 100%;
+ filter: alpha(opacity=25);
+ opacity: 0.25;
+}
+.ui-progressbar-indeterminate .ui-progressbar-value {
+ background-image: none;
+}
+.ui-slider {
+ position: relative;
+ text-align: left;
+}
+.ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1.2em;
+ height: 1.2em;
+ cursor: default;
+}
+.ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: .7em;
+ display: block;
+ border: 0;
+ background-position: 0 0;
+}
+
+/* For IE8 - See #6727 */
+.ui-slider.ui-state-disabled .ui-slider-handle,
+.ui-slider.ui-state-disabled .ui-slider-range {
+ filter: inherit;
+}
+
+.ui-slider-horizontal {
+ height: .8em;
+}
+.ui-slider-horizontal .ui-slider-handle {
+ top: -.3em;
+ margin-left: -.6em;
+}
+.ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+}
+.ui-slider-horizontal .ui-slider-range-min {
+ left: 0;
+}
+.ui-slider-horizontal .ui-slider-range-max {
+ right: 0;
+}
+
+.ui-slider-vertical {
+ width: .8em;
+ height: 100px;
+}
+.ui-slider-vertical .ui-slider-handle {
+ left: -.3em;
+ margin-left: 0;
+ margin-bottom: -.6em;
+}
+.ui-slider-vertical .ui-slider-range {
+ left: 0;
+ width: 100%;
+}
+.ui-slider-vertical .ui-slider-range-min {
+ bottom: 0;
+}
+.ui-slider-vertical .ui-slider-range-max {
+ top: 0;
+}
+.ui-spinner {
+ position: relative;
+ display: inline-block;
+ overflow: hidden;
+ padding: 0;
+ vertical-align: middle;
+}
+.ui-spinner-input {
+ border: none;
+ background: none;
+ color: inherit;
+ padding: 0;
+ margin: .2em 0;
+ vertical-align: middle;
+ margin-left: .4em;
+ margin-right: 22px;
+}
+.ui-spinner-button {
+ width: 16px;
+ height: 50%;
+ font-size: .5em;
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ position: absolute;
+ cursor: default;
+ display: block;
+ overflow: hidden;
+ right: 0;
+}
+/* more specificity required here to overide default borders */
+.ui-spinner a.ui-spinner-button {
+ border-top: none;
+ border-bottom: none;
+ border-right: none;
+}
+/* vertical centre icon */
+.ui-spinner .ui-icon {
+ position: absolute;
+ margin-top: -8px;
+ top: 50%;
+ left: 0;
+}
+.ui-spinner-up {
+ top: 0;
+}
+.ui-spinner-down {
+ bottom: 0;
+}
+
+/* TR overrides */
+.ui-spinner .ui-icon-triangle-1-s {
+ /* need to fix icons sprite */
+ background-position: -65px -16px;
+}
+.ui-tabs {
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
+ padding: .2em;
+}
+.ui-tabs .ui-tabs-nav {
+ margin: 0;
+ padding: .2em .2em 0;
+}
+.ui-tabs .ui-tabs-nav li {
+ list-style: none;
+ float: left;
+ position: relative;
+ top: 0;
+ margin: 1px .2em 0 0;
+ border-bottom-width: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+.ui-tabs .ui-tabs-nav li a {
+ float: left;
+ padding: .5em 1em;
+ text-decoration: none;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active {
+ margin-bottom: -1px;
+ padding-bottom: 1px;
+}
+.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
+.ui-tabs .ui-tabs-nav li.ui-state-disabled a,
+.ui-tabs .ui-tabs-nav li.ui-tabs-loading a {
+ cursor: text;
+}
+.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
+.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {
+ cursor: pointer;
+}
+.ui-tabs .ui-tabs-panel {
+ display: block;
+ border-width: 0;
+ padding: 1em 1.4em;
+ background: none;
+}
+.ui-tooltip {
+ padding: 8px;
+ position: absolute;
+ z-index: 9999;
+ max-width: 300px;
+ -webkit-box-shadow: 0 0 5px #aaa;
+ box-shadow: 0 0 5px #aaa;
+}
+body .ui-tooltip {
+ border-width: 2px;
+}
+
+/* Component containers
+----------------------------------*/
+.ui-widget {
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
+ font-size: 1.1em;
+}
+.ui-widget .ui-widget {
+ font-size: 1em;
+}
+.ui-widget input,
+.ui-widget select,
+.ui-widget textarea,
+.ui-widget button {
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
+ font-size: 1em;
+}
+.ui-widget-content {
+ border: 1px solid #dddddd;
+ background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;
+ color: #333333;
+}
+.ui-widget-content a {
+ color: #333333;
+}
+.ui-widget-header {
+ border: 1px solid #e78f08;
+ background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;
+ color: #ffffff;
+ font-weight: bold;
+}
+.ui-widget-header a {
+ color: #ffffff;
+}
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default,
+.ui-widget-content .ui-state-default,
+.ui-widget-header .ui-state-default {
+ border: 1px solid #cccccc;
+ background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;
+ font-weight: bold;
+ color: #1c94c4;
+}
+.ui-state-default a,
+.ui-state-default a:link,
+.ui-state-default a:visited {
+ color: #1c94c4;
+ text-decoration: none;
+}
+.ui-state-hover,
+.ui-widget-content .ui-state-hover,
+.ui-widget-header .ui-state-hover,
+.ui-state-focus,
+.ui-widget-content .ui-state-focus,
+.ui-widget-header .ui-state-focus {
+ border: 1px solid #fbcb09;
+ background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;
+ font-weight: bold;
+ color: #c77405;
+}
+.ui-state-hover a,
+.ui-state-hover a:hover,
+.ui-state-hover a:link,
+.ui-state-hover a:visited {
+ color: #c77405;
+ text-decoration: none;
+}
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active {
+ border: 1px solid #fbd850;
+ background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
+ font-weight: bold;
+ color: #eb8f00;
+}
+.ui-state-active a,
+.ui-state-active a:link,
+.ui-state-active a:visited {
+ color: #eb8f00;
+ text-decoration: none;
+}
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight,
+.ui-widget-content .ui-state-highlight,
+.ui-widget-header .ui-state-highlight {
+ border: 1px solid #fed22f;
+ background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;
+ color: #363636;
+}
+.ui-state-highlight a,
+.ui-widget-content .ui-state-highlight a,
+.ui-widget-header .ui-state-highlight a {
+ color: #363636;
+}
+.ui-state-error,
+.ui-widget-content .ui-state-error,
+.ui-widget-header .ui-state-error {
+ border: 1px solid #cd0a0a;
+ background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;
+ color: #ffffff;
+}
+.ui-state-error a,
+.ui-widget-content .ui-state-error a,
+.ui-widget-header .ui-state-error a {
+ color: #ffffff;
+}
+.ui-state-error-text,
+.ui-widget-content .ui-state-error-text,
+.ui-widget-header .ui-state-error-text {
+ color: #ffffff;
+}
+.ui-priority-primary,
+.ui-widget-content .ui-priority-primary,
+.ui-widget-header .ui-priority-primary {
+ font-weight: bold;
+}
+.ui-priority-secondary,
+.ui-widget-content .ui-priority-secondary,
+.ui-widget-header .ui-priority-secondary {
+ opacity: .7;
+ filter:Alpha(Opacity=70);
+ font-weight: normal;
+}
+.ui-state-disabled,
+.ui-widget-content .ui-state-disabled,
+.ui-widget-header .ui-state-disabled {
+ opacity: .35;
+ filter:Alpha(Opacity=35);
+ background-image: none;
+}
+.ui-state-disabled .ui-icon {
+ filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
+}
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon {
+ width: 16px;
+ height: 16px;
+}
+.ui-icon,
+.ui-widget-content .ui-icon {
+ background-image: url(images/ui-icons_222222_256x240.png);
+}
+.ui-widget-header .ui-icon {
+ background-image: url(images/ui-icons_ffffff_256x240.png);
+}
+.ui-state-default .ui-icon {
+ background-image: url(images/ui-icons_ef8c08_256x240.png);
+}
+.ui-state-hover .ui-icon,
+.ui-state-focus .ui-icon {
+ background-image: url(images/ui-icons_ef8c08_256x240.png);
+}
+.ui-state-active .ui-icon {
+ background-image: url(images/ui-icons_ef8c08_256x240.png);
+}
+.ui-state-highlight .ui-icon {
+ background-image: url(images/ui-icons_228ef1_256x240.png);
+}
+.ui-state-error .ui-icon,
+.ui-state-error-text .ui-icon {
+ background-image: url(images/ui-icons_ffd27a_256x240.png);
+}
+
+/* positioning */
+.ui-icon-blank { background-position: 16px 16px; }
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-on { background-position: -96px -144px; }
+.ui-icon-radio-off { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-left,
+.ui-corner-tl {
+ border-top-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-top,
+.ui-corner-right,
+.ui-corner-tr {
+ border-top-right-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-left,
+.ui-corner-bl {
+ border-bottom-left-radius: 4px;
+}
+.ui-corner-all,
+.ui-corner-bottom,
+.ui-corner-right,
+.ui-corner-br {
+ border-bottom-right-radius: 4px;
+}
+
+/* Overlays */
+.ui-widget-overlay {
+ background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;
+ opacity: .5;
+ filter: Alpha(Opacity=50);
+}
+.ui-widget-shadow {
+ margin: -5px 0 0 -5px;
+ padding: 5px;
+ background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;
+ opacity: .2;
+ filter: Alpha(Opacity=20);
+ border-radius: 5px;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.10.3 - 2013-10-19
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.10.3 - 2013-05-03
+* http://jqueryui.com
+* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-be.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CA.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-ky.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nb.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-nn.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js
+* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
+jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}),jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}),jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}),jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"<Geri",nextText:"İrəli>",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}),jQuery(function(e){e.datepicker.regional.be={closeText:"Зачыніць",prevText:"←Папяр.",nextText:"Наст.→",currentText:"Сёньня",monthNames:["Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань"],monthNamesShort:["Сту","Лют","Сак","Кра","Тра","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сьн"],dayNames:["нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота"],dayNamesShort:["ндз","пнд","аўт","срд","чцв","птн","сбт"],dayNamesMin:["Нд","Пн","Аў","Ср","Чц","Пт","Сб"],weekHeader:"Тд",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.be)}),jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}),jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}),jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}),jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}),jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}),jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}),jQuery(function(e){e.datepicker.regional.de={closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}),jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}),jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}),jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}),jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}),jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"<Anta",nextText:"Sekv>",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}),jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}),jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}),jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"<Aur",nextText:"Hur>",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}),jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سهشنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}),jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}),jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"<Fyrra",nextText:"Næsta>",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}),jQuery(function(e){e.datepicker.regional["fr-CA"]={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CA"])}),jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}),jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}),jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"<Ant",nextText:"Seg>",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}),jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}),jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}),jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}),jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}),jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"<Նախ.",nextText:"Հաջ.>",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}),jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}),jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}),jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}),jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}),jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"< წინა",nextText:"შემდეგი >",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}),jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"<Алдыңғы",nextText:"Келесі>",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}),jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើរួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃនេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}),jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}),jQuery(function(e){e.datepicker.regional.ky={closeText:"Жабуу",prevText:"<Мур",nextText:"Кий>",currentText:"Бүгүн",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],dayNamesShort:["жек","дүй","шей","шар","бей","жум","ише"],dayNamesMin:["Жк","Дш","Шш","Шр","Бш","Жм","Иш"],weekHeader:"Жум",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ky)}),jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}),jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}),jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}),jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}),jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്ച്ച്","ഏപ്രില്","മേയ്","ജൂണ്","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്","ഒക്ടോബര്","നവംബര്","ഡിസംബര്"],monthNamesShort:["ജനു","ഫെബ്","മാര്","ഏപ്രി","മേയ്","ജൂണ്","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്","തിങ്കള്","ചൊവ്വ","ബുധന്","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}),jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"<Sebelum",nextText:"Selepas>",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}),jQuery(function(e){e.datepicker.regional.nb={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nb)
+}),jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}),jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}),jQuery(function(e){e.datepicker.regional.nn={closeText:"Lukk",prevText:"«Førre",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nn)}),jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}),jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}),jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}),jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"<Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}),jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"<Suandant",nextText:"Precedent>",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}),jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}),jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}),jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}),jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}),jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"<mbrapa",nextText:"Përpara>",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}),jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}),jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}),jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}),jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}),jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}),jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"<Қафо",nextText:"Пеш>",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}),jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}),jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}),jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}),jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}),jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}),jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])});
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/jquery-ui/jquery-ui.min.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,12 @@
+/*! jQuery UI - v1.10.3 - 2013-05-03
+* http://jqueryui.com
+* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
+* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
+(function(t,e){function i(e,i){var n,o,a,r=e.nodeName.toLowerCase();return"area"===r?(n=e.parentNode,o=n.name,e.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap=#"+o+"]")[0],!!a&&s(a)):!1):(/input|select|textarea|button|object/.test(r)?!e.disabled:"a"===r?e.href||i:i)&&s(e)}function s(e){return t.expr.filters.visible(e)&&!t(e).parents().addBack().filter(function(){return"hidden"===t.css(this,"visibility")}).length}var n=0,o=/^ui-id-\d+$/;t.ui=t.ui||{},t.extend(t.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),t.fn.extend({focus:function(e){return function(i,s){return"number"==typeof i?this.each(function(){var e=this;setTimeout(function(){t(e).focus(),s&&s.call(e)},i)}):e.apply(this,arguments)}}(t.fn.focus),scrollParent:function(){var e;return e=t.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(t.css(this,"position"))&&/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!e.length?t(document):e},zIndex:function(i){if(i!==e)return this.css("zIndex",i);if(this.length)for(var s,n,o=t(this[0]);o.length&&o[0]!==document;){if(s=o.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(n=parseInt(o.css("zIndex"),10),!isNaN(n)&&0!==n))return n;o=o.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){o.test(this.id)&&t(this).removeAttr("id")})}}),t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])},focusable:function(e){return i(e,!isNaN(t.attr(e,"tabindex")))},tabbable:function(e){var s=t.attr(e,"tabindex"),n=isNaN(s);return(n||s>=0)&&i(e,!n)}}),t("<a>").outerWidth(1).jquery||t.each(["Width","Height"],function(i,s){function n(e,i,s,n){return t.each(o,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),n&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var o="Width"===s?["Left","Right"]:["Top","Bottom"],a=s.toLowerCase(),r={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+s]=function(i){return i===e?r["inner"+s].call(this):this.each(function(){t(this).css(a,n(this,i)+"px")})},t.fn["outer"+s]=function(e,i){return"number"!=typeof e?r["outer"+s].call(this,e):this.each(function(){t(this).css(a,n(this,e,!0,i)+"px")})}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(t.fn.removeData=function(e){return function(i){return arguments.length?e.call(this,t.camelCase(i)):e.call(this)}}(t.fn.removeData)),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),t.support.selectstart="onselectstart"in document.createElement("div"),t.fn.extend({disableSelection:function(){return this.bind((t.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(t){t.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),t.extend(t.ui,{plugin:{add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i){var s,n=t.plugins[e];if(n&&t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType)for(s=0;n.length>s;s++)t.options[n[s][0]]&&n[s][1].apply(t.element,i)}},hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)}})})(jQuery),function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),s===e)return o[i]===e?null:o[i];o[i]=s}else{if(s===e)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})}(jQuery),function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,o="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})}(jQuery),function(t){t.widget("ui.draggable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(t(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){t("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(t(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_mouseDrag:function(e,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||t.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1):!1},_mouseUp:function(e){return t("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.element.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,t(document).width()-this.helperProportions.width-this.margins.left,(t(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(e){var i,s,n,o,a=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=e.pageX,l=e.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s]),"drag"===e&&(this.positionAbs=this._convertPositionTo("absolute")),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i){var s=t(this).data("ui-draggable"),n=s.options,o=t.extend({},i,{item:s.element});s.sortables=[],t(n.connectToSortable).each(function(){var i=t.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",e,o))})},stop:function(e,i){var s=t(this).data("ui-draggable"),n=t.extend({},i,{item:s.element});t.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(e),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",e,n))})},drag:function(e,i){var s=t(this).data("ui-draggable"),n=this;t.each(s.sortables,function(){var o=!1,a=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(o=!0,t.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==a&&this.instance._intersectsWith(this.instance.containerCache)&&t.contains(a.instance.element[0],this.instance.element[0])&&(o=!1),o})),o?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=t(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},e.target=this.instance.currentItem[0],this.instance._mouseCapture(e,!0),this.instance._mouseStart(e,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",e),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(e)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",e,this.instance._uiHash(this.instance)),this.instance._mouseStop(e,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",e),s.dropped=!1)})}}),t.ui.plugin.add("draggable","cursor",{start:function(){var e=t("body"),i=t(this).data("ui-draggable").options;e.css("cursor")&&(i._cursor=e.css("cursor")),e.css("cursor",i.cursor)},stop:function(){var e=t(this).data("ui-draggable").options;e._cursor&&t("body").css("cursor",e._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._opacity&&t(i.helper).css("opacity",s._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(){var e=t(this).data("ui-draggable");e.scrollParent[0]!==document&&"HTML"!==e.scrollParent[0].tagName&&(e.overflowOffset=e.scrollParent.offset())},drag:function(e){var i=t(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-e.pageY<s.scrollSensitivity?i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop+s.scrollSpeed:e.pageY-i.overflowOffset.top<s.scrollSensitivity&&(i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+i.scrollParent[0].offsetWidth-e.pageX<s.scrollSensitivity?i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft+s.scrollSpeed:e.pageX-i.overflowOffset.left<s.scrollSensitivity&&(i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(e.pageY-t(document).scrollTop()<s.scrollSensitivity?n=t(document).scrollTop(t(document).scrollTop()-s.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<s.scrollSensitivity&&(n=t(document).scrollTop(t(document).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(e.pageX-t(document).scrollLeft()<s.scrollSensitivity?n=t(document).scrollLeft(t(document).scrollLeft()-s.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<s.scrollSensitivity&&(n=t(document).scrollLeft(t(document).scrollLeft()+s.scrollSpeed)))),n!==!1&&t.ui.ddmanager&&!s.dropBehaviour&&t.ui.ddmanager.prepareOffsets(i,e)}}),t.ui.plugin.add("draggable","snap",{start:function(){var e=t(this).data("ui-draggable"),i=e.options;e.snapElements=[],t(i.snap.constructor!==String?i.snap.items||":data(ui-draggable)":i.snap).each(function(){var i=t(this),s=i.offset();this!==e.element[0]&&e.snapElements.push({item:this,width:i.outerWidth(),height:i.outerHeight(),top:s.top,left:s.left})})},drag:function(e,i){var s,n,o,a,r,h,l,c,u,d,p=t(this).data("ui-draggable"),f=p.options,g=f.snapTolerance,m=i.offset.left,v=m+p.helperProportions.width,_=i.offset.top,b=_+p.helperProportions.height;for(u=p.snapElements.length-1;u>=0;u--)r=p.snapElements[u].left,h=r+p.snapElements[u].width,l=p.snapElements[u].top,c=l+p.snapElements[u].height,r-g>v||m>h+g||l-g>b||_>c+g||!t.contains(p.snapElements[u].item.ownerDocument,p.snapElements[u].item)?(p.snapElements[u].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=!1):("inner"!==f.snapMode&&(s=g>=Math.abs(l-b),n=g>=Math.abs(c-_),o=g>=Math.abs(r-v),a=g>=Math.abs(h-m),s&&(i.position.top=p._convertPositionTo("relative",{top:l-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h}).left-p.margins.left)),d=s||n||o||a,"outer"!==f.snapMode&&(s=g>=Math.abs(l-_),n=g>=Math.abs(c-b),o=g>=Math.abs(r-m),a=g>=Math.abs(h-v),s&&(i.position.top=p._convertPositionTo("relative",{top:l,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c-p.helperProportions.height,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[u].snapping&&(s||n||o||a||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=s||n||o||a||d)}}),t.ui.plugin.add("draggable","stack",{start:function(){var e,i=this.data("ui-draggable").options,s=t.makeArray(t(i.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});s.length&&(e=parseInt(t(s[0]).css("zIndex"),10)||0,t(s).each(function(i){t(this).css("zIndex",e+i)}),this.css("zIndex",e+s.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._zIndex&&t(i.helper).css("zIndex",s._zIndex)}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}t.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(i)?i:function(t){return t.is(i)
+},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},t.ui.ddmanager.droppables[e.scope]=t.ui.ddmanager.droppables[e.scope]||[],t.ui.ddmanager.droppables[e.scope].push(this),e.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var e=0,i=t.ui.ddmanager.droppables[this.options.scope];i.length>e;e++)i[e]===this&&i.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(e,i){"accept"===e&&(this.accept=t.isFunction(i)?i:function(t){return t.is(i)}),t.Widget.prototype._setOption.apply(this,arguments)},_activate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var e=t.data(this,"ui-droppable");return e.options.greedy&&!e.options.disabled&&e.options.scope===s.options.scope&&e.accept.call(e.element[0],s.currentItem||s.element)&&t.ui.intersect(s,t.extend(e,{offset:e.element.offset()}),e.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}}}),t.ui.intersect=function(t,i,s){if(!i.offset)return!1;var n,o,a=(t.positionAbs||t.position.absolute).left,r=a+t.helperProportions.width,h=(t.positionAbs||t.position.absolute).top,l=h+t.helperProportions.height,c=i.offset.left,u=c+i.proportions.width,d=i.offset.top,p=d+i.proportions.height;switch(s){case"fit":return a>=c&&u>=r&&h>=d&&p>=l;case"intersect":return a+t.helperProportions.width/2>c&&u>r-t.helperProportions.width/2&&h+t.helperProportions.height/2>d&&p>l-t.helperProportions.height/2;case"pointer":return n=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,o=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,e(o,d,i.proportions.height)&&e(n,c,i.proportions.width);case"touch":return(h>=d&&p>=h||l>=d&&p>=l||d>h&&l>p)&&(a>=c&&u>=a||r>=c&&u>=r||c>a&&r>u);default:return!1}},t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions.height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions={width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight})}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&t.ui.intersect(e,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").bind("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=t.ui.intersect(e,this,this.options.tolerance),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t.data(this,"ui-droppable").options.scope===n}),o.length&&(s=t.data(o[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").unbind("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}}}(jQuery),function(t){function e(t){return parseInt(t,10)||0}function i(t){return!isNaN(parseInt(t,10))}t.widget("ui.resizable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var e,i,s,n,o,a=this,r=this.options;if(this.element.addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),e=this.handles.split(","),this.handles={},i=0;e.length>i;i++)s=t.trim(e[i]),o="ui-resizable-"+s,n=t("<div class='ui-resizable-handle "+o+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=t(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),t(this.handles[i]).length},this._renderAxis(this.element),this._handles=t(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),t(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(t(this).removeClass("ui-resizable-autohide"),a._handles.show())}).mouseleave(function(){r.disabled||a.resizing||(t(this).addClass("ui-resizable-autohide"),a._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,o,a=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=e(this.helper.css("left")),n=e(this.helper.css("top")),a.containment&&(s+=t(a.containment).scrollLeft()||0,n+=t(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,o=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===o?this.axis+"-resize":o),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(e){var i,s=this.helper,n={},o=this.originalMousePosition,a=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,c=this.size.height,u=e.pageX-o.left||0,d=e.pageY-o.top||0,p=this._change[a];return p?(i=p.apply(this,[e,u,d]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==c&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||this._trigger("resize",e,this.ui()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&t.ui.hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null,h=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(t){var e,s,n,o,a,r=this.options;a={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||t)&&(e=a.minHeight*this.aspectRatio,n=a.minWidth/this.aspectRatio,s=a.maxHeight*this.aspectRatio,o=a.maxWidth/this.aspectRatio,e>a.minWidth&&(a.minWidth=e),n>a.minHeight&&(a.minHeight=n),a.maxWidth>s&&(a.maxWidth=s),a.maxHeight>o&&(a.maxHeight=o)),this._vBoundaries=a},_updateCache:function(t){this.offset=this.helper.offset(),i(t.left)&&(this.position.left=t.left),i(t.top)&&(this.position.top=t.top),i(t.height)&&(this.size.height=t.height),i(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,s=this.size,n=this.axis;return i(t.height)?t.width=t.height*this.aspectRatio:i(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===n&&(t.left=e.left+(s.width-t.width),t.top=null),"nw"===n&&(t.top=e.top+(s.height-t.height),t.left=e.left+(s.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,s=this.axis,n=i(t.width)&&e.maxWidth&&e.maxWidth<t.width,o=i(t.height)&&e.maxHeight&&e.maxHeight<t.height,a=i(t.width)&&e.minWidth&&e.minWidth>t.width,r=i(t.height)&&e.minHeight&&e.minHeight>t.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,c=/sw|nw|w/.test(s),u=/nw|ne|n/.test(s);return a&&(t.width=e.minWidth),r&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),o&&(t.height=e.maxHeight),a&&c&&(t.left=h-e.minWidth),n&&c&&(t.left=h-e.maxWidth),r&&u&&(t.top=l-e.minHeight),o&&u&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var t,e,i,s,n,o=this.helper||this.element;for(t=0;this._proportionallyResizeElements.length>t;t++){if(n=this._proportionallyResizeElements[t],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],e=0;i.length>e;e++)this.borderDif[e]=(parseInt(i[e],10)||0)+(parseInt(s[e],10)||0);n.css({height:o.height()-this.borderDif[0]-this.borderDif[2]||0,width:o.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&t.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,c=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,o,a,r,h,l=t(this).data("ui-resizable"),c=l.options,u=l.element,d=c.containment,p=d instanceof t?d.get(0):/parent/.test(d)?u.parent().get(0):d;p&&(l.containerElement=t(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(i=t(p),s=[],t(["Top","Right","Left","Bottom"]).each(function(t,n){s[t]=e(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,o=l.containerSize.height,a=l.containerSize.width,r=t.ui.hasScroll(p,"left")?p.scrollWidth:a,h=t.ui.hasScroll(p)?p.scrollHeight:o,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(e){var i,s,n,o,a=t(this).data("ui-resizable"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio),a.position.top=a._helper?h.top:0),a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top,i=Math.abs((a._helper?a.offset.left-u.left:a.offset.left-u.left)+a.sizeDiff.width),s=Math.abs((a._helper?a.offset.top-u.top:a.offset.top-h.top)+a.sizeDiff.height),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o&&(i-=a.parentData.left),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio))},stop:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=function(e){t(e).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseInt(e.width(),10),height:parseInt(e.height(),10),left:parseInt(e.css("left"),10),top:parseInt(e.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):t.each(i.alsoResize,function(t){s(t)})},resize:function(e,i){var s=t(this).data("ui-resizable"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0},h=function(e,s){t(e).each(function(){var e=t(this),n=t(this).data("ui-resizable-alsoresize"),o={},a=s&&s.length?s:e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(a,function(t,e){var i=(n[e]||0)+(r[e]||0);i&&i>=0&&(o[e]=i||null)}),e.css(o)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):t.each(n.alsoResize,function(t,e){h(t,e)})},stop:function(){t(this).removeData("resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).data("ui-resizable");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).data("ui-resizable");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,c=Math.round((s.width-n.width)/h)*h,u=Math.round((s.height-n.height)/l)*l,d=n.width+c,p=n.height+u,f=i.maxWidth&&d>i.maxWidth,g=i.maxHeight&&p>i.maxHeight,m=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=h),v&&(p+=l),f&&(d-=h),g&&(p-=l),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):(e.size.width=d,e.size.height=p,e.position.top=o.top-u,e.position.left=o.left-c)}})}(jQuery),function(t){t.widget("ui.selectable",t.ui.mouse,{version:"1.10.3",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e=t(i.options.filter,i.element[0]),e.addClass("ui-selectee"),e.each(function(){var e=t(this),i=e.offset();t.data(this,"selectable-item",{element:this,$element:e,left:i.left,top:i.top,right:i.left+e.outerWidth(),bottom:i.top+e.outerHeight(),startselected:!1,selected:e.hasClass("ui-selected"),selecting:e.hasClass("ui-selecting"),unselecting:e.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=e.addClass("ui-selectee"),this._mouseInit(),this.helper=t("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):undefined}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||o>i.right||i.top>h||a>i.bottom):"fit"===n.tolerance&&(l=i.left>o&&r>i.right&&i.top>a&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-t(document).scrollTop()<a.scrollSensitivity?r=t(document).scrollTop(t(document).scrollTop()-a.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<a.scrollSensitivity&&(r=t(document).scrollTop(t(document).scrollTop()+a.scrollSpeed)),e.pageX-t(document).scrollLeft()<a.scrollSensitivity?r=t(document).scrollLeft(t(document).scrollLeft()-a.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<a.scrollSensitivity&&(r=t(document).scrollLeft(t(document).scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;
+this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,o,a=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&r.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){a.push(this)});return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t("<td> </td>",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}(jQuery),function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function s(e,i){var s,n,a={};for(s in i)n=i[s],e[s]!==n&&(o[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(a[s]=n));return a}var n=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var e=t(this);return{el:e,start:i(this)}}),o=function(){t.each(n,function(t,i){e[i]&&a[i+"Class"](e[i])})},o(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,o,a,r){return"boolean"==typeof n||n===e?o?t.effects.animateClass.call(this,n?{add:s}:{remove:s},o,a,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,o,a)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.3",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,o;for(o=0;s.length>o;o++)null!==s[o]&&(n=t.data(i+s[o]),n===e&&(n=""),t.css(s[o],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(o)&&o.call(n[0]),t.isFunction(e)&&e()}var n=t(this),o=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):a.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,o=i.queue,a=t.effects.effect[i.effect];return t.fx.off||!a?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):o===!1?this.each(e):this.queue(o||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()}(jQuery),function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("<span>").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons"))
+},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),o.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,o=this.element.parent(),a=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),o=n.attr("id");s||(s=a+"-header-"+e,i.attr("id",s)),o||(o=a+"-panel-"+e,n.attr("id",o)),i.attr("aria-controls",o),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=o.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n[0]===s[0],a=o&&i.collapsible,r=a?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:a?t():n,newPanel:r};e.preventDefault(),o&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=a?!1:this.headers.index(n),this.active=o?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),o||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var o,a,r,h=this,l=0,c=t.length&&(!e.length||t.index()<e.index()),u=this.options.animate||{},d=c&&u.down||u,p=function(){h._toggleComplete(n)};return"number"==typeof d&&(r=d),"string"==typeof d&&(a=d),a=a||d.easing||u.easing,r=r||d.duration||u.duration,e.length?t.length?(o=t.show().outerHeight(),e.animate(i,{duration:r,easing:a,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(s,{duration:r,easing:a,complete:p,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?l+=i.now:"content"!==h.options.heightStyle&&(i.now=Math.round(o-e.outerHeight()-l),l=0)}}),undefined):e.animate(i,r,a,p):t.animate(s,r,a,p)},_toggleComplete:function(t){var e=t.oldPanel;e.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}})}(jQuery),function(t){var e=0;t.widget("ui.autocomplete",{version:"1.10.3",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o?!0:a?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:case o.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];t(e.target).closest(".ui-menu-item").length||this._delay(function(){var e=this;this.document.one("mousedown",function(s){s.target===e.element[0]||s.target===i||t.contains(i,s.target)||e.close()})})},menufocus:function(e,i){if(this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",e,{item:s})?e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=t("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e||(e=this.element.closest(".ui-front")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):undefined},_search:function(t){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var t=this,i=++e;return function(s){i===e&&t.__response(s),t.pending--,t.pending||t.element.removeClass("ui-autocomplete-loading")}},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({label:e.label||e.value,value:e.value||e.label},e)})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<a>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[t](e),undefined):(this.search(null,e),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.text(e))}})}(jQuery),function(t){var e,i,s,n,o="ui-button ui-widget ui-state-default ui-corner-all",a="ui-state-hover ui-state-active ",r="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",h=function(){var e=t(this);setTimeout(function(){e.find(":ui-button").button("refresh")},1)},l=function(e){var i=e.name,s=e.form,n=t([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?t(s).find("[name='"+i+"']"):t("[name='"+i+"']",e.ownerDocument).filter(function(){return!this.form})),n};t.widget("ui.button",{version:"1.10.3",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,h),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var a=this,r=this.options,c="checkbox"===this.type||"radio"===this.type,u=c?"":"ui-state-active",d="ui-state-focus";null===r.label&&(r.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){r.disabled||this===e&&t(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){r.disabled||t(this).removeClass(u)}).bind("click"+this.eventNamespace,function(t){r.disabled&&(t.preventDefault(),t.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){a.buttonElement.addClass(d)}).bind("blur"+this.eventNamespace,function(){a.buttonElement.removeClass(d)}),c&&(this.element.bind("change"+this.eventNamespace,function(){n||a.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(t){r.disabled||(n=!1,i=t.pageX,s=t.pageY)}).bind("mouseup"+this.eventNamespace,function(t){r.disabled||(i!==t.pageX||s!==t.pageY)&&(n=!0)})),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return r.disabled||n?!1:undefined}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(r.disabled||n)return!1;t(this).addClass("ui-state-active"),a.buttonElement.attr("aria-pressed","true");var e=a.element[0];l(e).not(e).map(function(){return t(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return r.disabled?!1:(t(this).addClass("ui-state-active"),e=this,a.document.one("mouseup",function(){e=null}),undefined)}).bind("mouseup"+this.eventNamespace,function(){return r.disabled?!1:(t(this).removeClass("ui-state-active"),undefined)}).bind("keydown"+this.eventNamespace,function(e){return r.disabled?!1:((e.keyCode===t.ui.keyCode.SPACE||e.keyCode===t.ui.keyCode.ENTER)&&t(this).addClass("ui-state-active"),undefined)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){t(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===t.ui.keyCode.SPACE&&t(this).click()})),this._setOption("disabled",r.disabled),this._resetButton()},_determineButtonType:function(){var t,e,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(t=this.element.parents().last(),e="label[for='"+this.element.attr("id")+"']",this.buttonElement=t.find(e),this.buttonElement.length||(t=t.length?t.siblings():this.element.siblings(),this.buttonElement=t.filter(e),this.buttonElement.length||(this.buttonElement=t.find(e))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+a+" "+r).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(t,e){return this._super(t,e),"disabled"===t?(e?this.element.prop("disabled",!0):this.element.prop("disabled",!1),undefined):(this._resetButton(),undefined)},refresh:function(){var e=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");e!==this.options.disabled&&this._setOption("disabled",e),"radio"===this.type?l(this.element[0]).each(function(){t(this).is(":checked")?t(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):t(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),undefined;var e=this.buttonElement.removeClass(r),i=t("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(e.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,o=[];s.primary||s.secondary?(this.options.text&&o.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&e.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&e.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(o.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||e.attr("title",t.trim(i)))):o.push("ui-button-text-only"),e.addClass(o.join(" "))}}),t.widget("ui.buttonset",{version:"1.10.3",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(t,e){"disabled"===t&&this.buttons.button("option",t,e),this._super(t,e)},refresh:function(){var e="rtl"===this.element.css("direction");this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(e?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(e?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})}(jQuery),function(t,e){function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.dpDiv=s(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function s(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(i,"mouseout",function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){t.datepicker._isDisabledDatepicker(o.inline?e.parent()[0]:o.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))})}function n(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}t.extend(t.ui,{datepicker:{version:"1.10.3"}});var o,a="datepicker";t.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return n(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var n=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?s(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),t.data(e,a,i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.click(function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,a,i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,o,r){var h,l,c,u,d,p=this._dialogInst;return p||(this.uuid+=1,h="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+h+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),t("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},t.data(this._dialogInput[0],a,p)),n(p.settings,o||{}),i=i&&i.constructor===Date?this._formatDate(p,i):i,this._dialogInput.val(i),this._pos=r?r.length?r:[r.pageX,r.pageY]:null,this._pos||(l=document.documentElement.clientWidth,c=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+u,c/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],a,p),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,a);s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,a),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,a)}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(i,s,o){var a,r,h,l,c=this._getInst(i);return 2===arguments.length&&"string"==typeof s?"defaults"===s?t.extend({},t.datepicker._defaults):c?"all"===s?t.extend({},c.settings):this._get(c,s):null:(a=s||{},"string"==typeof s&&(a={},a[s]=o),c&&(this._curInst===c&&this._hideDatepicker(),r=this._getDateDatepicker(i,!0),h=this._getMinMaxDate(c,"min"),l=this._getMinMaxDate(c,"max"),n(c.settings,a),null!==h&&a.dateFormat!==e&&a.minDate===e&&(c.settings.minDate=this._formatDate(c,h)),null!==l&&a.dateFormat!==e&&a.maxDate===e&&(c.settings.maxDate=this._formatDate(c,l)),"disabled"in a&&(a.disabled?this._disableDatepicker(i):this._enableDatepicker(i)),this._attachments(t(i),c),this._autoSize(c),this._setDate(c,r),this._updateAlternate(c),this._updateDatepicker(c)),e)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;
+case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(i){var s,n,o=t.datepicker._getInst(i.target);return t.datepicker._get(o,"constrainInput")?(s=t.datepicker._possibleChars(t.datepicker._get(o,"dateFormat")),n=String.fromCharCode(null==i.charCode?i.keyCode:i.charCode),i.ctrlKey||i.metaKey||" ">n||!s||s.indexOf(n)>-1):e},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var i,s,o,a,r,h,l;i=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==i&&(t.datepicker._curInst.dpDiv.stop(!0,!0),i&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),s=t.datepicker._get(i,"beforeShow"),o=s?s.apply(e,[e,i]):{},o!==!1&&(n(i.settings,o),i.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(i),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return a|="fixed"===t(this).css("position"),!a}),r={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(i),r=t.datepicker._checkOffset(i,r,a),i.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":a?"fixed":"absolute",display:"none",left:r.left+"px",top:r.top+"px"}),i.inline||(h=t.datepicker._get(i,"showAnim"),l=t.datepicker._get(i,"duration"),i.dpDiv.zIndex(t(e).zIndex()+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?i.dpDiv.show(h,t.datepicker._get(i,"showOptions"),l):i.dpDiv[h||"show"](h?l:null),t.datepicker._shouldFocusInput(i)&&i.input.focus(),t.datepicker._curInst=i))}},_updateDatepicker:function(e){this.maxRows=4,o=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var i,s=this._getNumberOfMonths(e),n=s[1],a=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.focus(),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,r=this._curInst;!r||e&&r!==t.data(e,a)||this._datepickerShowing&&(i=this._get(r,"showAnim"),s=this._get(r,"duration"),n=function(){t.datepicker._tidyDialog(r)},t.effects&&(t.effects.effect[i]||t.effects[i])?r.dpDiv.hide(i,t.datepicker._get(r,"showOptions"),s,n):r.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(r,"onClose"),o&&o.apply(r.input?r.input[0]:null,[r.input?r.input.val():"",r]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).each(function(){t(this).val(n)}))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(i,s,n){if(null==i||null==s)throw"Invalid arguments";if(s="object"==typeof s?""+s:s+"",""===s)return null;var o,a,r,h,l=0,c=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof c?c:(new Date).getFullYear()%100+parseInt(c,10),d=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,p=(n?n.dayNames:null)||this._defaults.dayNames,f=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,g=(n?n.monthNames:null)||this._defaults.monthNames,m=-1,v=-1,_=-1,b=-1,y=!1,w=function(t){var e=i.length>o+1&&i.charAt(o+1)===t;return e&&o++,e},k=function(t){var e=w(t),i="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n=RegExp("^\\d{1,"+i+"}"),o=s.substring(l).match(n);if(!o)throw"Missing number at position "+l;return l+=o[0].length,parseInt(o[0],10)},x=function(i,n,o){var a=-1,r=t.map(w(i)?o:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(r,function(t,i){var n=i[1];return s.substr(l,n.length).toLowerCase()===n.toLowerCase()?(a=i[0],l+=n.length,!1):e}),-1!==a)return a+1;throw"Unknown name at position "+l},D=function(){if(s.charAt(l)!==i.charAt(o))throw"Unexpected literal at position "+l;l++};for(o=0;i.length>o;o++)if(y)"'"!==i.charAt(o)||w("'")?D():y=!1;else switch(i.charAt(o)){case"d":_=k("d");break;case"D":x("D",d,p);break;case"o":b=k("o");break;case"m":v=k("m");break;case"M":v=x("M",f,g);break;case"y":m=k("y");break;case"@":h=new Date(k("@")),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"!":h=new Date((k("!")-this._ticksTo1970)/1e4),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"'":w("'")?D():y=!0;break;default:D()}if(s.length>l&&(r=s.substr(l),!/^\s+/.test(r)))throw"Extra/unparsed characters found in date: "+r;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),b>-1)for(v=1,_=b;;){if(a=this._getDaysInMonth(m,v-1),a>=_)break;v++,_-=a}if(h=this._daylightSavingAdjust(new Date(m,v-1,_)),h.getFullYear()!==m||h.getMonth()+1!==v||h.getDate()!==_)throw"Invalid date";return h},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getYear()%100?"0":"")+e.getYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,i){return t.settings[i]!==e?t.settings[i]:this._defaults[i]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,v,_,b,y,w,k,x,D,C,I,P,T,M,S,z,A,H,E,N,W,O,F,R,L=new Date,j=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(t,"isRTL"),B=this._get(t,"showButtonPanel"),V=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),q=this._get(t,"showCurrentAtPos"),Q=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],$=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),G=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-q,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=G&&G>e?G:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-Q,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":V?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+Q,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":V?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?$:j,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),v=this._get(t,"showOtherMonths"),_=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,D=0;U[1]>D;D++){if(C=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",P="",X){if(P+="<div class='ui-datepicker-group",U[1]>1)switch(D){case 0:P+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:P+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:P+=" ui-datepicker-group-middle",I=""}P+="'>"}for(P+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,G,J,k>0||D>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",T=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,T+="<th"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(P+=T+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),z=(this._getFirstDayOfMonth(te,Z)-c+7)%7,A=Math.ceil((z+S)/7),H=X?this.maxRows>A?this.maxRows:A:A,this.maxRows=H,E=this._daylightSavingAdjust(new Date(te,Z,1-z)),N=0;H>N;N++){for(P+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(E)+"</td>":"",w=0;7>w;w++)O=m?m.apply(t.input?t.input[0]:null,[E]):[!0,""],F=E.getMonth()!==Z,R=F&&!_||!O[0]||G&&G>E||J&&E>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(E.getTime()===C.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===E.getTime()&&b.getTime()===C.getTime()?" "+this._dayOverClass:"")+(R?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!v?"":" "+O[1]+(E.getTime()===$.getTime()?" "+this._currentClass:"")+(E.getTime()===j.getTime()?" ui-datepicker-today":""))+"'"+(F&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"'")+"'")+(R?"":" data-handler='selectDay' data-event='click' data-month='"+E.getMonth()+"' data-year='"+E.getFullYear()+"'")+">"+(F&&!v?" ":R?"<span class='ui-state-default'>"+E.getDate()+"</span>":"<a class='ui-state-default"+(E.getTime()===j.getTime()?" ui-state-highlight":"")+(E.getTime()===$.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+E.getDate()+"</a>")+"</td>",E.setDate(E.getDate()+1),E=this._daylightSavingAdjust(E);P+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),P+="</tbody></table>"+(X?"</div>"+(U[0]>0&&D===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=P}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),v=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(_||(b+=y+(!o&&m&&v?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),_&&(b+=(!o&&m&&v?"":" ")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.drawYear+("Y"===i?e:0),n=t.drawMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).mousedown(t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.10.3"}(jQuery),function(t){var e={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};t.widget("ui.dialog",{version:"1.10.3",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._destroyOverlay(),this.opener.filter(":focusable").focus().length||t(this.document[0].activeElement).blur(),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!!this.uiDialog.nextAll(":visible").insertBefore(this.uiDialog).length;return i&&!e&&this._trigger("focus",t),i},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),undefined):(this._isOpen=!0,this.opener=t(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._trigger("open"),undefined)},_focusTabbable:function(){var t=this.element.find("[autofocus]");t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).focus()},_keepFocus:function(e){function i(){var e=this.document[0].activeElement,i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),undefined;if(e.keyCode===t.ui.keyCode.TAB){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(n.focus(1),e.preventDefault()):(s.focus(1),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=t("<button></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(e),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title||t.html(" "),t.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),undefined):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(e.element[0],arguments)},o={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,t("<button></button>",s).button(o).appendTo(e.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),undefined)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){t(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){s.position=[o.position.left-i.document.scrollLeft(),o.position.top-i.document.scrollTop()],t(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}
+}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){t(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){s.height=t(this).height(),s.width=t(this).width(),t(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(s){var n=this,o=!1,a={};t.each(s,function(t,s){n._setOption(t,s),t in e&&(o=!0),t in i&&(a[t]=s)}),o&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",a)},_setOption:function(t,e){var i,s,n=this.uiDialog;"dialogClass"===t&&n.removeClass(this.options.dialogClass).addClass(e),"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:""+e}),"draggable"===t&&(i=n.is(":data(ui-draggable)"),i&&!e&&n.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&(s=n.is(":data(ui-resizable)"),s&&!e&&n.resizable("destroy"),s&&"string"==typeof e&&n.resizable("option","handles",e),s||e===!1||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=this,i=this.widgetFullName;t.ui.dialog.overlayInstances||this._delay(function(){t.ui.dialog.overlayInstances&&this.document.bind("focusin.dialog",function(s){e._allowInteraction(s)||(s.preventDefault(),t(".ui-dialog:visible:last .ui-dialog-content").data(i)._focusTabbable())})}),this.overlay=t("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),t.ui.dialog.overlayInstances++}},_destroyOverlay:function(){this.options.modal&&this.overlay&&(t.ui.dialog.overlayInstances--,t.ui.dialog.overlayInstances||this.document.unbind("focusin.dialog"),this.overlay.remove(),this.overlay=null)}}),t.ui.dialog.overlayInstances=0,t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{_position:function(){var e,i=this.options.position,s=[],n=[0,0];i?(("string"==typeof i||"object"==typeof i&&"0"in i)&&(s=i.split?i.split(" "):[i[0],i[1]],1===s.length&&(s[1]=s[0]),t.each(["left","top"],function(t,e){+s[t]===s[t]&&(n[t]=s[t],s[t]=e)}),i={my:s[0]+(0>n[0]?n[0]:"+"+n[0])+" "+s[1]+(0>n[1]?n[1]:"+"+n[1]),at:s.join(" ")}),i=t.extend({},t.ui.dialog.prototype.options.position,i)):i=t.ui.dialog.prototype.options.position,e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.position(i),e||this.uiDialog.hide()}})}(jQuery),function(t){var e=/up|down|vertical/,i=/up|left|vertical|horizontal/;t.effects.effect.blind=function(s,n){var o,a,r,h=t(this),l=["position","top","bottom","left","right","height","width"],c=t.effects.setMode(h,s.mode||"hide"),u=s.direction||"up",d=e.test(u),p=d?"height":"width",f=d?"top":"left",g=i.test(u),m={},v="show"===c;h.parent().is(".ui-effects-wrapper")?t.effects.save(h.parent(),l):t.effects.save(h,l),h.show(),o=t.effects.createWrapper(h).css({overflow:"hidden"}),a=o[p](),r=parseFloat(o.css(f))||0,m[p]=v?a:0,g||(h.css(d?"bottom":"right",0).css(d?"top":"left","auto").css({position:"absolute"}),m[f]=v?r:a+r),v&&(o.css(p,0),g||o.css(f,r+a)),o.animate(m,{duration:s.duration,easing:s.easing,queue:!1,complete:function(){"hide"===c&&h.hide(),t.effects.restore(h,l),t.effects.removeWrapper(h),n()}})}}(jQuery),function(t){t.effects.effect.bounce=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"effect"),l="hide"===h,c="show"===h,u=e.direction||"up",d=e.distance,p=e.times||5,f=2*p+(c||l?1:0),g=e.duration/f,m=e.easing,v="up"===u||"down"===u?"top":"left",_="up"===u||"left"===u,b=a.queue(),y=b.length;for((c||l)&&r.push("opacity"),t.effects.save(a,r),a.show(),t.effects.createWrapper(a),d||(d=a["top"===v?"outerHeight":"outerWidth"]()/3),c&&(o={opacity:1},o[v]=0,a.css("opacity",0).css(v,_?2*-d:2*d).animate(o,g,m)),l&&(d/=Math.pow(2,p-1)),o={},o[v]=0,s=0;p>s;s++)n={},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m).animate(o,g,m),d=l?2*d:d/2;l&&(n={opacity:0},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m)),a.queue(function(){l&&a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}),y>1&&b.splice.apply(b,[1,0].concat(b.splice(y,f+1))),a.dequeue()}}(jQuery),function(t){t.effects.effect.clip=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"hide"),l="show"===h,c=e.direction||"vertical",u="vertical"===c,d=u?"height":"width",p=u?"top":"left",f={};t.effects.save(a,r),a.show(),s=t.effects.createWrapper(a).css({overflow:"hidden"}),n="IMG"===a[0].tagName?s:a,o=n[d](),l&&(n.css(d,0),n.css(p,o/2)),f[d]=l?o:0,f[p]=l?0:o/2,n.animate(f,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){l||a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.drop=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","opacity","height","width"],a=t.effects.setMode(n,e.mode||"hide"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h?"pos":"neg",u={opacity:r?1:0};t.effects.save(n,o),n.show(),t.effects.createWrapper(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===c?-s:s),u[l]=(r?"pos"===c?"+=":"-=":"pos"===c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.explode=function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),g||p.hide(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=t.effects.setMode(p,e.mode||"hide"),g="show"===f,m=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*_,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*v,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*v,top:-o*_}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:_,left:r+(g?l*v:0),top:h+(g?c*_:0),opacity:g?0:1}).animate({left:r+(g?0:l*v),top:h+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,s)}}(jQuery),function(t){t.effects.effect.fade=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}}(jQuery),function(t){t.effects.effect.fold=function(e,i){var s,n,o=t(this),a=["position","top","bottom","left","right","height","width"],r=t.effects.setMode(o,e.mode||"hide"),h="show"===r,l="hide"===r,c=e.size||15,u=/([0-9]+)%/.exec(c),d=!!e.horizFirst,p=h!==d,f=p?["width","height"]:["height","width"],g=e.duration/2,m={},v={};t.effects.save(o,a),o.show(),s=t.effects.createWrapper(o).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],u&&(c=parseInt(u[1],10)/100*n[l?0:1]),h&&s.css(d?{height:0,width:c}:{height:c,width:0}),m[f[0]]=h?n[0]:c,v[f[1]]=h?n[1]:0,s.animate(m,g,e.easing).animate(v,g,e.easing,function(){l&&o.hide(),t.effects.restore(o,a),t.effects.removeWrapper(o),i()})}}(jQuery),function(t){t.effects.effect.highlight=function(e,i){var s=t(this),n=["backgroundImage","backgroundColor","opacity"],o=t.effects.setMode(s,e.mode||"show"),a={backgroundColor:s.css("backgroundColor")};"hide"===o&&(a.opacity=0),t.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===o&&s.hide(),t.effects.restore(s,n),i()}})}}(jQuery),function(t){t.effects.effect.pulsate=function(e,i){var s,n=t(this),o=t.effects.setMode(n,e.mode||"show"),a="show"===o,r="hide"===o,h=a||"hide"===o,l=2*(e.times||5)+(h?1:0),c=e.duration/l,u=0,d=n.queue(),p=d.length;for((a||!n.is(":visible"))&&(n.css("opacity",0).show(),u=1),s=1;l>s;s++)n.animate({opacity:u},c,e.easing),u=1-u;n.animate({opacity:u},c,e.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&d.splice.apply(d,[1,0].concat(d.splice(p,l+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.puff=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"hide"),o="hide"===n,a=parseInt(e.percent,10)||150,r=a/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};t.extend(e,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:o?a:100,from:o?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(e)},t.effects.effect.scale=function(e,i){var s=t(this),n=t.extend(!0,{},e),o=t.effects.setMode(s,e.mode||"effect"),a=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"hide"===o?0:100),r=e.direction||"both",h=e.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},c={y:"horizontal"!==r?a/100:1,x:"vertical"!==r?a/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==o&&(n.origin=h||["middle","center"],n.restore=!0),n.from=e.from||("show"===o?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*c.y,width:l.width*c.x,outerHeight:l.outerHeight*c.y,outerWidth:l.outerWidth*c.x},n.fade&&("show"===o&&(n.from.opacity=0,n.to.opacity=1),"hide"===o&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},t.effects.effect.size=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],c=["fontSize"],u=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],d=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=t.effects.setMode(a,e.mode||"effect"),f=e.restore||"effect"!==p,g=e.scale||"both",m=e.origin||["middle","center"],v=a.css("position"),_=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&a.show(),s={height:a.height(),width:a.width(),outerHeight:a.outerHeight(),outerWidth:a.outerWidth()},"toggle"===e.mode&&"show"===p?(a.from=e.to||b,a.to=e.from||s):(a.from=e.from||("show"===p?b:s),a.to=e.to||("hide"===p?b:s)),o={from:{y:a.from.height/s.height,x:a.from.width/s.width},to:{y:a.to.height/s.height,x:a.to.width/s.width}},("box"===g||"both"===g)&&(o.from.y!==o.to.y&&(_=_.concat(u),a.from=t.effects.setTransition(a,u,o.from.y,a.from),a.to=t.effects.setTransition(a,u,o.to.y,a.to)),o.from.x!==o.to.x&&(_=_.concat(d),a.from=t.effects.setTransition(a,d,o.from.x,a.from),a.to=t.effects.setTransition(a,d,o.to.x,a.to))),("content"===g||"both"===g)&&o.from.y!==o.to.y&&(_=_.concat(c).concat(l),a.from=t.effects.setTransition(a,c,o.from.y,a.from),a.to=t.effects.setTransition(a,c,o.to.y,a.to)),t.effects.save(a,_),a.show(),t.effects.createWrapper(a),a.css("overflow","hidden").css(a.from),m&&(n=t.effects.getBaseline(m,s),a.from.top=(s.outerHeight-a.outerHeight())*n.y,a.from.left=(s.outerWidth-a.outerWidth())*n.x,a.to.top=(s.outerHeight-a.to.outerHeight)*n.y,a.to.left=(s.outerWidth-a.to.outerWidth)*n.x),a.css(a.from),("content"===g||"both"===g)&&(u=u.concat(["marginTop","marginBottom"]).concat(c),d=d.concat(["marginLeft","marginRight"]),l=r.concat(u).concat(d),a.find("*[width]").each(function(){var i=t(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&t.effects.save(i,l),i.from={height:s.height*o.from.y,width:s.width*o.from.x,outerHeight:s.outerHeight*o.from.y,outerWidth:s.outerWidth*o.from.x},i.to={height:s.height*o.to.y,width:s.width*o.to.x,outerHeight:s.height*o.to.y,outerWidth:s.width*o.to.x},o.from.y!==o.to.y&&(i.from=t.effects.setTransition(i,u,o.from.y,i.from),i.to=t.effects.setTransition(i,u,o.to.y,i.to)),o.from.x!==o.to.x&&(i.from=t.effects.setTransition(i,d,o.from.x,i.from),i.to=t.effects.setTransition(i,d,o.to.x,i.to)),i.css(i.from),i.animate(i.to,e.duration,e.easing,function(){f&&t.effects.restore(i,l)})})),a.animate(a.to,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){0===a.to.opacity&&a.css("opacity",a.from.opacity),"hide"===p&&a.hide(),t.effects.restore(a,_),f||("static"===v?a.css({position:"relative",top:a.to.top,left:a.to.left}):t.each(["top","left"],function(t,e){a.css(e,function(e,i){var s=parseInt(i,10),n=t?a.to.left:a.to.top;return"auto"===i?n+"px":s+n+"px"})})),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.shake=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","height","width"],a=t.effects.setMode(n,e.mode||"effect"),r=e.direction||"left",h=e.distance||20,l=e.times||3,c=2*l+1,u=Math.round(e.duration/c),d="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},g={},m={},v=n.queue(),_=v.length;for(t.effects.save(n,o),n.show(),t.effects.createWrapper(n),f[d]=(p?"-=":"+=")+h,g[d]=(p?"+=":"-=")+2*h,m[d]=(p?"-=":"+=")+2*h,n.animate(f,u,e.easing),s=1;l>s;s++)n.animate(g,u,e.easing).animate(m,u,e.easing);n.animate(g,u,e.easing).animate(f,u/2,e.easing).queue(function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}),_>1&&v.splice.apply(v,[1,0].concat(v.splice(_,c+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.slide=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","width","height"],a=t.effects.setMode(n,e.mode||"show"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u={};t.effects.save(n,o),n.show(),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0),t.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,c?isNaN(s)?"-"+s:-s:s),u[l]=(r?c?"+=":"-=":c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.transfer=function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),i()})}}(jQuery),function(t){t.widget("ui.menu",{version:"1.10.3",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.mouseHandled=!0,this.select(e),i.has(".ui-menu").length?this.expand(e):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,o,a,r,h=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:h=!1,n=this.previousFilter||"",o=String.fromCharCode(e.keyCode),a=!1,clearTimeout(this.filterTimer),o===n?a=!0:o=n+o,r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=a&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(o=String.fromCharCode(e.keyCode),r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=o,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})}(jQuery),function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var o,a=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(o!==e)return o;var i,s,n=t("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=n.children()[0];return t("body").append(n),i=a.offsetWidth,n.css("overflow","scroll"),s=a.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),o=i-s},getScrollInfo:function(e){var i=e.isWindow?"":e.element.css("overflow-x"),s=e.isWindow?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]);return{element:i,isWindow:s,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var o,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),w=t.position.getScrollInfo(y),k=(e.collision||"flip").split(" "),x={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=l.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=l.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),x[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),o=i(x.at,p,g),v.left+=o[0],v.top+=o[1],this.each(function(){var n,l,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),D=u+f+s(this,"marginRight")+w.width,C=d+_+s(this,"marginBottom")+w.height,I=t.extend({},v),P=i(x.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?I.left-=u:"center"===e.my[0]&&(I.left-=u/2),"bottom"===e.my[1]?I.top-=d:"center"===e.my[1]&&(I.top-=d/2),I.left+=P[0],I.top+=P[1],t.support.offsetFractions||(I.left=h(I.left),I.top=h(I.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[k[i]]&&t.ui.position[k[i]][s](I,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:D,collisionHeight:C,offset:[o[0]+P[0],o[1]+P[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(l=function(t){var i=m.left-I.left,s=i+p-u,n=m.top-I.top,o=n+g-d,h={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:I.left,top:I.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>o?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(h.horizontal="center"),d>g&&g>r(n+o)&&(h.vertical="middle"),h.important=a(r(i),r(s))>a(r(n),r(o))?"horizontal":"vertical",e.using.call(this,t,h)}),c.offset(t.extend(I,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-o-n;e.collisionWidth>o?h>0&&0>=l?(i=t.left+h+e.collisionWidth-o-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+o-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-o-n;e.collisionHeight>o?h>0&&0>=l?(i=t.top+h+e.collisionHeight-o-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+o-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-a-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-a-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,o,a=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(a?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},a&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)e.style[o]=s[o];e.appendChild(r),i=a||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()}(jQuery),function(t,e){t.widget("ui.progressbar",{version:"1.10.3",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=t("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()
+},value:function(t){return t===e?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),e)},_constrainedValue:function(t){return t===e&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}})}(jQuery),function(t){var e=5;t.widget("ui.slider",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),o="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e)})},_createRange:function(){var e=this.options,i="";e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=t("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===e.range||"max"===e.range?" ui-slider-range-"+e.range:""))):this.range=t([])},_setupEvents:function(){var t=this.handles.add(this.range).filter("a");this._off(t),this._on(t,this._handleEvents),this._hoverable(t),this._focusable(t)},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,o.addClass("ui-state-active").focus(),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_start:function(t,e){var i={handle:this.handles[e],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("start",t,i)},_slide:function(t,e,i){var s,n,o;this.options.values&&this.options.values.length?(s=this.values(e?0:1),2===this.options.values.length&&this.options.range===!0&&(0===e&&i>s||1===e&&s>i)&&(i=s),i!==this.values(e)&&(n=this.values(),n[e]=i,o=this._trigger("slide",t,{handle:this.handles[e],value:i,values:n}),s=this.values(e?0:1),o!==!1&&this.values(e,i,!0))):i!==this.value()&&(o=this._trigger("slide",t,{handle:this.handles[e],value:i}),o!==!1&&this.value(i))},_stop:function(t,e){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("stop",t,i)},_change:function(t,e){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._lastChangedValue=e,this._trigger("change",t,i)}},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),undefined;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),t.Widget.prototype._setOption.apply(this,arguments),e){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(i){var s,n,o,a,r=t(i.target).data("ui-slider-handle-index");switch(i.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,t(i.target).addClass("ui-state-active"),s=this._start(i,r),s===!1))return}switch(a=this.options.step,n=o=this.options.values&&this.options.values.length?this.values(r):this.value(),i.keyCode){case t.ui.keyCode.HOME:o=this._valueMin();break;case t.ui.keyCode.END:o=this._valueMax();break;case t.ui.keyCode.PAGE_UP:o=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.PAGE_DOWN:o=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(n===this._valueMax())return;o=this._trimAlignValue(n+a);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(n===this._valueMin())return;o=this._trimAlignValue(n-a)}this._slide(i,r,o)},click:function(t){t.preventDefault()},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),t(e.target).removeClass("ui-state-active"))}}})}(jQuery),function(t){function e(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.widget("ui.spinner",{version:"1.10.3",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e={},i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);void 0!==n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var t=this.element[0]===this.document[0].activeElement;t||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var t=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=t.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*t.height())&&t.height()>0&&t.height(t.height()),this.options.disabled&&this.disable()},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>▲</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>▼</span>"+"</a>"},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){if("culture"===t||"numberFormat"===t){var i=this._parse(this.element.val());return this.options[t]=e,this.element.val(this._format(i)),void 0}("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(e.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(e.down)),this._super(t,e),"disabled"===t&&(e?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:e(function(t){this._super(t),this._value(this.element.val())}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:e(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:e(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:e(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:e(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(e(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}})}(jQuery),function(t,e){function i(){return++n}function s(t){return t.hash.length>1&&decodeURIComponent(t.href.replace(o,""))===decodeURIComponent(location.href.replace(o,""))}var n=0,o=/#.*$/;t.widget("ui.tabs",{version:"1.10.3",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var e=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var i=this.options.active,s=this.options.collapsible,n=location.hash.substring(1);return null===i&&(n&&this.tabs.each(function(s,o){return t(o).attr("aria-controls")===n?(i=s,!1):e}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===i||-1===i)&&(i=this.tabs.length?0:!1)),i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),-1===i&&(i=s?!1:0)),!s&&i===!1&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(i){var s=t(this.document[0].activeElement).closest("li"),n=this.tabs.index(s),o=!0;if(!this._handlePageNav(i)){switch(i.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:o=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return i.preventDefault(),clearTimeout(this.activating),this._activate(n),e;case t.ui.keyCode.ENTER:return i.preventDefault(),clearTimeout(this.activating),this._activate(n===this.options.active?!1:n),e;default:return}i.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,o),i.ctrlKey||(s.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.focus())},_handlePageNav:function(i){return i.altKey&&i.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):i.altKey&&i.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):e},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).focus(),t},_setOption:function(t,i){return"active"===t?(this._activate(i),e):"disabled"===t?(this._setupDisabled(i),e):(this._super(t,i),"collapsible"===t&&(this.element.toggleClass("ui-tabs-collapsible",i),i||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(i),"heightStyle"===t&&this._setupHeightStyle(i),e)},_tabId:function(t){return t.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=t(),this.anchors.each(function(i,n){var o,a,r,h=t(n).uniqueId().attr("id"),l=t(n).closest("li"),c=l.attr("aria-controls");s(n)?(o=n.hash,a=e.element.find(e._sanitizeSelector(o))):(r=e._tabId(l),o="#"+r,a=e.element.find(o),a.length||(a=e._createPanel(r),a.insertAfter(e.panels[i-1]||e.tablist)),a.attr("aria-live","polite")),a.length&&(e.panels=e.panels.add(a)),c&&l.data("ui-tabs-aria-controls",c),l.attr({"aria-controls":o.substring(1),"aria-labelledby":h}),a.attr("aria-labelledby",h)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(e){t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1);for(var i,s=0;i=this.tabs[s];s++)e===!0||-1!==t.inArray(s,e)?t(i).addClass("ui-state-disabled").attr("aria-disabled","true"):t(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=e},_setupEvents:function(e){var i={click:function(t){t.preventDefault()}};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr({"aria-expanded":"false","aria-hidden":"true"}),i.oldTab.attr("aria-selected","false"),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr({"aria-expanded":"true","aria-hidden":"false"}),i.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+t+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var s=this.options.disabled;s!==!1&&(i===e?s=!1:(i=this._getIndex(i),s=t.isArray(s)?t.map(s,function(t){return t!==i?t:null}):t.map(this.tabs,function(t,e){return e!==i?e:null})),this._setupDisabled(s))},disable:function(i){var s=this.options.disabled;if(s!==!0){if(i===e)s=!0;else{if(i=this._getIndex(i),-1!==t.inArray(i,s))return;s=t.isArray(s)?t.merge([i],s).sort():[i]}this._setupDisabled(s)}},load:function(e,i){e=this._getIndex(e);var n=this,o=this.tabs.eq(e),a=o.find(".ui-tabs-anchor"),r=this._getPanelForTab(o),h={tab:o,panel:r};s(a[0])||(this.xhr=t.ajax(this._ajaxSettings(a,i,h)),this.xhr&&"canceled"!==this.xhr.statusText&&(o.addClass("ui-tabs-loading"),r.attr("aria-busy","true"),this.xhr.success(function(t){setTimeout(function(){r.html(t),n._trigger("load",i,h)},1)}).complete(function(t,e){setTimeout(function(){"abort"===e&&n.panels.stop(!1,!0),o.removeClass("ui-tabs-loading"),r.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href"),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})}(jQuery),function(t){function e(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))}function i(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")}var s=0;t.widget("ui.tooltip",{version:"1.10.3",options:{content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(e,i){var s=this;return"disabled"===e?(this[i?"_disable":"_enable"](),this.options[e]=i,void 0):(this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e)}),void 0)},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.is("[title]")&&e.data("ui-tooltip-title",e.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))})},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s?this._open(e,t,s):(i=s.call(t[0],function(i){t.data("ui-tooltip-open")&&n._delay(function(){e&&(e.type=o),this._open(e,t,i)})}),i&&this._open(e,t,i),void 0)},_open:function(i,s,n){function o(t){l.of=t,a.is(":hidden")||a.position(l)}var a,r,h,l=t.extend({},this.options.position);
+if(n){if(a=this._find(s),a.length)return a.find(".ui-tooltip-content").html(n),void 0;s.is("[title]")&&(i&&"mouseover"===i.type?s.attr("title",""):s.removeAttr("title")),a=this._tooltip(s),e(s,a.attr("id")),a.find(".ui-tooltip-content").html(n),this.options.track&&i&&/^mouse/.test(i.type)?(this._on(this.document,{mousemove:o}),o(i)):a.position(t.extend({of:s},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(h=this.delayedShow=setInterval(function(){a.is(":visible")&&(o(l.of),clearInterval(h))},t.fx.interval)),this._trigger("open",i,{tooltip:a}),r={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var i=t.Event(e);i.currentTarget=s[0],this.close(i,!0)}},remove:function(){this._removeTooltip(a)}},i&&"mouseover"!==i.type||(r.mouseleave="close"),i&&"focusin"!==i.type||(r.focusout="close"),this._on(!0,s,r)}},close:function(e){var s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);this.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&n.attr("title",n.data("ui-tooltip-title")),i(n),o.stop(!0),this._hide(o,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),this.closing=!0,this._trigger("close",e,{tooltip:o}),this.closing=!1)},_tooltip:function(e){var i="ui-tooltip-"+s++,n=t("<div>").attr({id:i,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return t("<div>").addClass("ui-tooltip-content").appendTo(n),n.appendTo(this.document[0].body),this.tooltips[i]=e,n},_find:function(e){var i=e.data("ui-tooltip-id");return i?t("#"+i):t()},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0),t("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))})}})}(jQuery);
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/rcolor.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,55 @@
+// Free to use & distribute under the MIT license
+// Wes Johnson (@SterlingWes)
+//
+// inspired by http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
+
+(function (root, factory) {
+ if (typeof exports === 'object') {
+ module.exports = factory;
+ } else if (typeof define === 'function' && define.amd) {
+ define(factory);
+ } else {
+ root.RColor = factory();
+ }
+}(this, function () {
+
+ var RColor = function() {
+ this.hue = Math.random(),
+ this.goldenRatio = 0.618033988749895;
+ };
+
+ RColor.prototype.hsvToRgb = function (h,s,v) {
+ var h_i = Math.floor(h*6),
+ f = h*6 - h_i,
+ p = v * (1-s),
+ q = v * (1-f*s),
+ t = v * (1-(1-f)*s),
+ r = 255,
+ g = 255,
+ b = 255;
+ switch(h_i) {
+ case 0: r = v, g = t, b = p; break;
+ case 1: r = q, g = v, b = p; break;
+ case 2: r = p, g = v, b = t; break;
+ case 3: r = p, g = q, b = v; break;
+ case 4: r = t, g = p, b = v; break;
+ case 5: r = v, g = p, b = q; break;
+ }
+ return [Math.floor(r*256),Math.floor(g*256),Math.floor(b*256)];
+ };
+
+ RColor.prototype.get = function(hex,saturation,value) {
+ this.hue += this.goldenRatio;
+ this.hue %= 1;
+ if(typeof saturation !== "number") saturation = 0.5;
+ if(typeof value !== "number") value = 0.95;
+ var rgb = this.hsvToRgb(this.hue,saturation,value);
+ if(hex)
+ return "#"+rgb[0].toString(16)+rgb[1].toString(16)+rgb[2].toString(16);
+ else
+ return rgb;
+ };
+
+ return RColor;
+
+}));
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/main/webapp/static/lib/spectrum.js Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,1767 @@
+// Spectrum Colorpicker v1.0.9
+// https://github.com/bgrins/spectrum
+// Author: Brian Grinstead
+// License: MIT
+
+(function (window, $, undefined) {
+ var defaultOpts = {
+
+ // Callbacks
+ beforeShow: noop,
+ move: noop,
+ change: noop,
+ show: noop,
+ hide: noop,
+
+ // Options
+ color: false,
+ flat: false,
+ showInput: false,
+ showButtons: true,
+ clickoutFiresChange: false,
+ showInitial: false,
+ showPalette: false,
+ showPaletteOnly: false,
+ showSelectionPalette: true,
+ localStorageKey: false,
+ maxSelectionSize: 7,
+ cancelText: "cancel",
+ chooseText: "choose",
+ preferredFormat: false,
+ className: "",
+ showAlpha: false,
+ theme: "sp-light",
+ palette: ['fff', '000'],
+ selectionPalette: [],
+ disabled: false
+ },
+ spectrums = [],
+ IE = !!/msie/i.exec( window.navigator.userAgent ),
+ rgbaSupport = (function() {
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ var elem = document.createElement('div');
+ var style = elem.style;
+ style.cssText = 'background-color:rgba(0,0,0,.5)';
+ return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');
+ })(),
+ replaceInput = [
+ "<div class='sp-replacer'>",
+ "<div class='sp-preview'><div class='sp-preview-inner'></div></div>",
+ "<div class='sp-dd'>▼</div>",
+ "</div>"
+ ].join(''),
+ markup = (function () {
+
+ // IE does not support gradients with multiple stops, so we need to simulate
+ // that for the rainbow slider with 8 divs that each have a single gradient
+ var gradientFix = "";
+ if (IE) {
+ for (var i = 1; i <= 6; i++) {
+ gradientFix += "<div class='sp-" + i + "'></div>";
+ }
+ }
+
+ return [
+ "<div class='sp-container sp-hidden'>",
+ "<div class='sp-palette-container'>",
+ "<div class='sp-palette sp-thumb sp-cf'></div>",
+ "</div>",
+ "<div class='sp-picker-container'>",
+ "<div class='sp-top sp-cf'>",
+ "<div class='sp-fill'></div>",
+ "<div class='sp-top-inner'>",
+ "<div class='sp-color'>",
+ "<div class='sp-sat'>",
+ "<div class='sp-val'>",
+ "<div class='sp-dragger'></div>",
+ "</div>",
+ "</div>",
+ "</div>",
+ "<div class='sp-hue'>",
+ "<div class='sp-slider'></div>",
+ gradientFix,
+ "</div>",
+ "</div>",
+ "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
+ "</div>",
+ "<div class='sp-input-container sp-cf'>",
+ "<input class='sp-input' type='text' spellcheck='false' />",
+ "</div>",
+ "<div class='sp-initial sp-thumb sp-cf'></div>",
+ "<div class='sp-button-container sp-cf'>",
+ "<a class='sp-cancel' href='#'></a>",
+ "<button class='sp-choose'></button>",
+ "</div>",
+ "</div>",
+ "</div>"
+ ].join("");
+ })();
+
+ function paletteTemplate (p, color, className) {
+ var html = [];
+ for (var i = 0; i < p.length; i++) {
+ var tiny = tinycolor(p[i]);
+ var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light";
+ c += (tinycolor.equals(color, p[i])) ? " sp-thumb-active" : "";
+
+ var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter();
+ html.push('<span title="' + tiny.toRgbString() + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';" /></span>');
+ }
+ return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>";
+ }
+
+ function hideAll() {
+ for (var i = 0; i < spectrums.length; i++) {
+ if (spectrums[i]) {
+ spectrums[i].hide();
+ }
+ }
+ }
+
+ function instanceOptions(o, callbackContext) {
+ var opts = $.extend({}, defaultOpts, o);
+ opts.callbacks = {
+ 'move': bind(opts.move, callbackContext),
+ 'change': bind(opts.change, callbackContext),
+ 'show': bind(opts.show, callbackContext),
+ 'hide': bind(opts.hide, callbackContext),
+ 'beforeShow': bind(opts.beforeShow, callbackContext)
+ };
+
+ return opts;
+ }
+
+ function spectrum(element, o) {
+
+ var opts = instanceOptions(o, element),
+ flat = opts.flat,
+ showSelectionPalette = opts.showSelectionPalette,
+ localStorageKey = opts.localStorageKey,
+ theme = opts.theme,
+ callbacks = opts.callbacks,
+ resize = throttle(reflow, 10),
+ visible = false,
+ dragWidth = 0,
+ dragHeight = 0,
+ dragHelperHeight = 0,
+ slideHeight = 0,
+ slideWidth = 0,
+ alphaWidth = 0,
+ alphaSlideHelperWidth = 0,
+ slideHelperHeight = 0,
+ currentHue = 0,
+ currentSaturation = 0,
+ currentValue = 0,
+ currentAlpha = 1,
+ palette = opts.palette.slice(0),
+ paletteArray = $.isArray(palette[0]) ? palette : [palette],
+ selectionPalette = opts.selectionPalette.slice(0),
+ maxSelectionSize = opts.maxSelectionSize,
+ draggingClass = "sp-dragging";
+
+ var doc = element.ownerDocument,
+ body = doc.body,
+ boundElement = $(element),
+ disabled = false,
+ container = $(markup, doc).addClass(theme),
+ dragger = container.find(".sp-color"),
+ dragHelper = container.find(".sp-dragger"),
+ slider = container.find(".sp-hue"),
+ slideHelper = container.find(".sp-slider"),
+ alphaSliderInner = container.find(".sp-alpha-inner"),
+ alphaSlider = container.find(".sp-alpha"),
+ alphaSlideHelper = container.find(".sp-alpha-handle"),
+ textInput = container.find(".sp-input"),
+ paletteContainer = container.find(".sp-palette"),
+ initialColorContainer = container.find(".sp-initial"),
+ cancelButton = container.find(".sp-cancel"),
+ chooseButton = container.find(".sp-choose"),
+ isInput = boundElement.is("input"),
+ shouldReplace = isInput && !flat,
+ replacer = (shouldReplace) ? $(replaceInput).addClass(theme) : $([]),
+ offsetElement = (shouldReplace) ? replacer : boundElement,
+ previewElement = replacer.find(".sp-preview-inner"),
+ initialColor = opts.color || (isInput && boundElement.val()),
+ colorOnShow = false,
+ preferredFormat = opts.preferredFormat,
+ currentPreferredFormat = preferredFormat,
+ clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange;
+
+
+ function applyOptions() {
+
+ container.toggleClass("sp-flat", flat);
+ container.toggleClass("sp-input-disabled", !opts.showInput);
+ container.toggleClass("sp-alpha-enabled", opts.showAlpha);
+ container.toggleClass("sp-buttons-disabled", !opts.showButtons || flat);
+ container.toggleClass("sp-palette-disabled", !opts.showPalette);
+ container.toggleClass("sp-palette-only", opts.showPaletteOnly);
+ container.toggleClass("sp-initial-disabled", !opts.showInitial);
+ container.addClass(opts.className);
+
+ reflow();
+ }
+
+ function initialize() {
+
+ if (IE) {
+ container.find("*:not(input)").attr("unselectable", "on");
+ }
+
+ applyOptions();
+
+ if (shouldReplace) {
+ boundElement.hide().after(replacer);
+ }
+
+ if (flat) {
+ boundElement.after(container).hide();
+ }
+ else {
+ $(body).append(container);
+ }
+
+ if (localStorageKey && window.localStorage) {
+
+ // Migrate old palettes over to new format. May want to remove this eventually.
+ try {
+ var oldPalette = window.localStorage[localStorageKey].split(",#");
+ if (oldPalette.length > 1) {
+ delete window.localStorage[localStorageKey];
+ $.each(oldPalette, function(i, c) {
+ addColorToSelectionPalette(c);
+ });
+ }
+ }
+ catch(e) { }
+
+ try {
+ selectionPalette = window.localStorage[localStorageKey].split(";");
+ }
+ catch (e) { }
+ }
+
+ offsetElement.bind("click.spectrum touchstart.spectrum", function (e) {
+ if (!disabled) {
+ toggle();
+ }
+
+ e.stopPropagation();
+
+ if (!$(e.target).is("input")) {
+ e.preventDefault();
+ }
+ });
+
+ if(boundElement.is(":disabled") || (opts.disabled === true)) {
+ disable();
+ }
+
+ // Prevent clicks from bubbling up to document. This would cause it to be hidden.
+ container.click(stopPropagation);
+
+ // Handle user typed input
+ textInput.change(setFromTextInput);
+ textInput.bind("paste", function () {
+ setTimeout(setFromTextInput, 1);
+ });
+ textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });
+
+ cancelButton.text(opts.cancelText);
+ cancelButton.bind("click.spectrum", function (e) {
+ e.stopPropagation();
+ e.preventDefault();
+ hide("cancel");
+ });
+
+ chooseButton.text(opts.chooseText);
+ chooseButton.bind("click.spectrum", function (e) {
+ e.stopPropagation();
+ e.preventDefault();
+
+ if (isValid()) {
+ updateOriginalInput(true);
+ hide();
+ }
+ });
+
+ draggable(alphaSlider, function (dragX, dragY, e) {
+ currentAlpha = (dragX / alphaWidth);
+ if (e.shiftKey) {
+ currentAlpha = Math.round(currentAlpha * 10) / 10;
+ }
+
+ move();
+ });
+
+ draggable(slider, function (dragX, dragY) {
+ currentHue = parseFloat(dragY / slideHeight);
+ move();
+ }, dragStart, dragStop);
+
+ draggable(dragger, function (dragX, dragY) {
+ currentSaturation = parseFloat(dragX / dragWidth);
+ currentValue = parseFloat((dragHeight - dragY) / dragHeight);
+ move();
+ }, dragStart, dragStop);
+
+ if (!!initialColor) {
+ set(initialColor);
+
+ // In case color was black - update the preview UI and set the format
+ // since the set function will not run (default color is black).
+ updateUI();
+ currentPreferredFormat = preferredFormat || tinycolor(initialColor).format;
+
+ addColorToSelectionPalette(initialColor);
+ }
+ else {
+ updateUI();
+ }
+
+ if (flat) {
+ show();
+ }
+
+ function palletElementClick(e) {
+ if (e.data && e.data.ignore) {
+ set($(this).data("color"));
+ move();
+ }
+ else {
+ set($(this).data("color"));
+ updateOriginalInput(true);
+ move();
+ hide();
+ }
+
+ return false;
+ }
+
+ var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum";
+ paletteContainer.delegate(".sp-thumb-el", paletteEvent, palletElementClick);
+ initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, palletElementClick);
+ }
+
+ function addColorToSelectionPalette(color) {
+ if (showSelectionPalette) {
+ var colorRgb = tinycolor(color).toRgbString();
+ if ($.inArray(colorRgb, selectionPalette) === -1) {
+ selectionPalette.push(colorRgb);
+ while(selectionPalette.length > maxSelectionSize) {
+ selectionPalette.shift();
+ }
+ }
+
+ if (localStorageKey && window.localStorage) {
+ try {
+ window.localStorage[localStorageKey] = selectionPalette.join(";");
+ }
+ catch(e) { }
+ }
+ }
+ }
+
+ function getUniqueSelectionPalette() {
+ var unique = [];
+ var p = selectionPalette;
+ var paletteLookup = {};
+ var rgb;
+
+ if (opts.showPalette) {
+
+ for (var i = 0; i < paletteArray.length; i++) {
+ for (var j = 0; j < paletteArray[i].length; j++) {
+ rgb = tinycolor(paletteArray[i][j]).toRgbString();
+ paletteLookup[rgb] = true;
+ }
+ }
+
+ for (i = 0; i < p.length; i++) {
+ rgb = tinycolor(p[i]).toRgbString();
+
+ if (!paletteLookup.hasOwnProperty(rgb)) {
+ unique.push(p[i]);
+ paletteLookup[rgb] = true;
+ }
+ }
+ }
+
+ return unique.reverse().slice(0, opts.maxSelectionSize);
+ }
+
+ function drawPalette() {
+
+ var currentColor = get();
+
+ var html = $.map(paletteArray, function (palette, i) {
+ return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i);
+ });
+
+ if (selectionPalette) {
+ html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection"));
+ }
+
+ paletteContainer.html(html.join(""));
+ }
+
+ function drawInitial() {
+ if (opts.showInitial) {
+ var initial = colorOnShow;
+ var current = get();
+ initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial"));
+ }
+ }
+
+ function dragStart() {
+ if (dragHeight === 0 || dragWidth === 0 || slideHeight === 0) {
+ reflow();
+ }
+ container.addClass(draggingClass);
+ }
+
+ function dragStop() {
+ container.removeClass(draggingClass);
+ }
+
+ function setFromTextInput() {
+ var tiny = tinycolor(textInput.val());
+ if (tiny.ok) {
+ set(tiny);
+ }
+ else {
+ textInput.addClass("sp-validation-error");
+ }
+ }
+
+ function toggle() {
+ if (visible) {
+ hide();
+ }
+ else {
+ show();
+ }
+ }
+
+ function show() {
+ var event = $.Event('beforeShow.spectrum');
+
+ if (visible) {
+ reflow();
+ return;
+ }
+
+ boundElement.trigger(event, [ get() ]);
+
+ if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) {
+ return;
+ }
+
+ hideAll();
+ visible = true;
+
+ $(doc).bind("click.spectrum", hide);
+ $(window).bind("resize.spectrum", resize);
+ replacer.addClass("sp-active");
+ container.removeClass("sp-hidden");
+
+ if (opts.showPalette) {
+ drawPalette();
+ }
+ reflow();
+ updateUI();
+
+ colorOnShow = get();
+
+ drawInitial();
+ callbacks.show(colorOnShow);
+ boundElement.trigger('show.spectrum', [ colorOnShow ]);
+ }
+
+ function hide(e) {
+
+ // Return on right click
+ if (e && e.type == "click" && e.button == 2) { return; }
+
+ // Return if hiding is unnecessary
+ if (!visible || flat) { return; }
+ visible = false;
+
+ $(doc).unbind("click.spectrum", hide);
+ $(window).unbind("resize.spectrum", resize);
+
+ replacer.removeClass("sp-active");
+ container.addClass("sp-hidden");
+
+ var colorHasChanged = !tinycolor.equals(get(), colorOnShow);
+
+ if (colorHasChanged) {
+ if (clickoutFiresChange && e !== "cancel") {
+ updateOriginalInput(true);
+ }
+ else {
+ revert();
+ }
+ }
+
+ callbacks.hide(get());
+ boundElement.trigger('hide.spectrum', [ get() ]);
+ }
+
+ function revert() {
+ set(colorOnShow, true);
+ }
+
+ function set(color, ignoreFormatChange) {
+ if (tinycolor.equals(color, get())) {
+ return;
+ }
+
+ var newColor = tinycolor(color);
+ var newHsv = newColor.toHsv();
+
+ currentHue = newHsv.h;
+ currentSaturation = newHsv.s;
+ currentValue = newHsv.v;
+ currentAlpha = newHsv.a;
+
+ updateUI();
+
+ if (newColor.ok && !ignoreFormatChange) {
+ currentPreferredFormat = preferredFormat || newColor.format;
+ }
+ }
+
+ function get() {
+ return tinycolor.fromRatio({ h: currentHue, s: currentSaturation, v: currentValue, a: Math.round(currentAlpha * 100) / 100 });
+ }
+
+ function isValid() {
+ return !textInput.hasClass("sp-validation-error");
+ }
+
+ function move() {
+ updateUI();
+
+ callbacks.move(get());
+ boundElement.trigger('move.spectrum', [ get() ]);
+ }
+
+ function updateUI() {
+
+ textInput.removeClass("sp-validation-error");
+
+ updateHelperLocations();
+
+ // Update dragger background color (gradients take care of saturation and value).
+ var flatColor = tinycolor({ h: currentHue, s: "1.0", v: "1.0" });
+ dragger.css("background-color", flatColor.toHexString());
+
+ // Get a format that alpha will be included in (hex and names ignore alpha)
+ var format = currentPreferredFormat;
+ if (currentAlpha < 1) {
+ if (format === "hex" || format === "name") {
+ format = "rgb";
+ }
+ }
+
+ var realColor = get(),
+ realHex = realColor.toHexString(),
+ realRgb = realColor.toRgbString();
+
+
+ // Update the replaced elements background color (with actual selected color)
+ if (rgbaSupport || realColor.alpha === 1) {
+ previewElement.css("background-color", realRgb);
+ }
+ else {
+ previewElement.css("background-color", "transparent");
+ previewElement.css("filter", realColor.toFilter());
+ }
+
+ if (opts.showAlpha) {
+ var rgb = realColor.toRgb();
+ rgb.a = 0;
+ var realAlpha = tinycolor(rgb).toRgbString();
+ var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")";
+
+ if (IE) {
+ alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex));
+ }
+ else {
+ alphaSliderInner.css("background", "-webkit-" + gradient);
+ alphaSliderInner.css("background", "-moz-" + gradient);
+ alphaSliderInner.css("background", "-ms-" + gradient);
+ alphaSliderInner.css("background", gradient);
+ }
+ }
+
+
+ // Update the text entry input as it changes happen
+ if (opts.showInput) {
+ if (currentAlpha < 1) {
+ if (format === "hex" || format === "name") {
+ format = "rgb";
+ }
+ }
+ textInput.val(realColor.toString(format));
+ }
+
+ if (opts.showPalette) {
+ drawPalette();
+ }
+
+ drawInitial();
+ }
+
+ function updateHelperLocations() {
+ var s = currentSaturation;
+ var v = currentValue;
+
+ // Where to show the little circle in that displays your current selected color
+ var dragX = s * dragWidth;
+ var dragY = dragHeight - (v * dragHeight);
+ dragX = Math.max(
+ -dragHelperHeight,
+ Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight)
+ );
+ dragY = Math.max(
+ -dragHelperHeight,
+ Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)
+ );
+ dragHelper.css({
+ "top": dragY,
+ "left": dragX
+ });
+
+ var alphaX = currentAlpha * alphaWidth;
+ alphaSlideHelper.css({
+ "left": alphaX - (alphaSlideHelperWidth / 2)
+ });
+
+ // Where to show the bar that displays your current selected hue
+ var slideY = (currentHue) * slideHeight;
+ slideHelper.css({
+ "top": slideY - slideHelperHeight
+ });
+ }
+
+ function updateOriginalInput(fireCallback) {
+ var color = get();
+
+ if (isInput) {
+ boundElement.val(color.toString(currentPreferredFormat)).change();
+ }
+
+ var hasChanged = !tinycolor.equals(color, colorOnShow);
+ colorOnShow = color;
+
+ // Update the selection palette with the current color
+ addColorToSelectionPalette(color);
+ if (fireCallback && hasChanged) {
+ callbacks.change(color);
+ boundElement.trigger('change.spectrum', [ color ]);
+ }
+ }
+
+ function reflow() {
+ dragWidth = dragger.width();
+ dragHeight = dragger.height();
+ dragHelperHeight = dragHelper.height();
+ slideWidth = slider.width();
+ slideHeight = slider.height();
+ slideHelperHeight = slideHelper.height();
+ alphaWidth = alphaSlider.width();
+ alphaSlideHelperWidth = alphaSlideHelper.width();
+
+ if (!flat) {
+ container.offset(getOffset(container, offsetElement));
+ }
+
+ updateHelperLocations();
+ }
+
+ function destroy() {
+ boundElement.show();
+ offsetElement.unbind("click.spectrum touchstart.spectrum");
+ container.remove();
+ replacer.remove();
+ spectrums[spect.id] = null;
+ }
+
+ function option(optionName, optionValue) {
+ if (optionName === undefined) {
+ return $.extend({}, opts);
+ }
+ if (optionValue === undefined) {
+ return opts[optionName];
+ }
+
+ opts[optionName] = optionValue;
+ applyOptions();
+ }
+
+ function enable() {
+ disabled = false;
+ boundElement.attr("disabled", false);
+ offsetElement.removeClass("sp-disabled");
+ }
+
+ function disable() {
+ hide();
+ disabled = true;
+ boundElement.attr("disabled", true);
+ offsetElement.addClass("sp-disabled");
+ }
+
+ initialize();
+
+ var spect = {
+ show: show,
+ hide: hide,
+ toggle: toggle,
+ reflow: reflow,
+ option: option,
+ enable: enable,
+ disable: disable,
+ set: function (c) {
+ set(c);
+ updateOriginalInput();
+ },
+ get: get,
+ destroy: destroy,
+ container: container
+ };
+
+ spect.id = spectrums.push(spect) - 1;
+
+ return spect;
+ }
+
+ /**
+ * checkOffset - get the offset below/above and left/right element depending on screen position
+ * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
+ */
+ function getOffset(picker, input) {
+ var extraY = 0;
+ var dpWidth = picker.outerWidth();
+ var dpHeight = picker.outerHeight();
+ var inputHeight = input.outerHeight();
+ var doc = picker[0].ownerDocument;
+ var docElem = doc.documentElement;
+ var viewWidth = docElem.clientWidth + $(doc).scrollLeft();
+ var viewHeight = docElem.clientHeight + $(doc).scrollTop();
+ var offset = input.offset();
+ offset.top += inputHeight;
+
+ offset.left -=
+ Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
+ Math.abs(offset.left + dpWidth - viewWidth) : 0);
+
+ offset.top -=
+ Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
+ Math.abs(dpHeight + inputHeight - extraY) : extraY));
+
+ return offset;
+ }
+
+ /**
+ * noop - do nothing
+ */
+ function noop() {
+
+ }
+
+ /**
+ * stopPropagation - makes the code only doing this a little easier to read in line
+ */
+ function stopPropagation(e) {
+ e.stopPropagation();
+ }
+
+ /**
+ * Create a function bound to a given object
+ * Thanks to underscore.js
+ */
+ function bind(func, obj) {
+ var slice = Array.prototype.slice;
+ var args = slice.call(arguments, 2);
+ return function () {
+ return func.apply(obj, args.concat(slice.call(arguments)));
+ };
+ }
+
+ /**
+ * Lightweight drag helper. Handles containment within the element, so that
+ * when dragging, the x is within [0,element.width] and y is within [0,element.height]
+ */
+ function draggable(element, onmove, onstart, onstop) {
+ onmove = onmove || function () { };
+ onstart = onstart || function () { };
+ onstop = onstop || function () { };
+ var doc = element.ownerDocument || document;
+ var dragging = false;
+ var offset = {};
+ var maxHeight = 0;
+ var maxWidth = 0;
+ var hasTouch = ('ontouchstart' in window);
+
+ var duringDragEvents = {};
+ duringDragEvents["selectstart"] = prevent;
+ duringDragEvents["dragstart"] = prevent;
+ duringDragEvents[(hasTouch ? "touchmove" : "mousemove")] = move;
+ duringDragEvents[(hasTouch ? "touchend" : "mouseup")] = stop;
+
+ function prevent(e) {
+ if (e.stopPropagation) {
+ e.stopPropagation();
+ }
+ if (e.preventDefault) {
+ e.preventDefault();
+ }
+ e.returnValue = false;
+ }
+
+ function move(e) {
+ if (dragging) {
+ // Mouseup happened outside of window
+ if (IE && document.documentMode < 9 && !e.button) {
+ return stop();
+ }
+
+ var touches = e.originalEvent.touches;
+ var pageX = touches ? touches[0].pageX : e.pageX;
+ var pageY = touches ? touches[0].pageY : e.pageY;
+
+ var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
+ var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
+
+ if (hasTouch) {
+ // Stop scrolling in iOS
+ prevent(e);
+ }
+
+ onmove.apply(element, [dragX, dragY, e]);
+ }
+ }
+ function start(e) {
+ var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
+ var touches = e.originalEvent.touches;
+
+ if (!rightclick && !dragging) {
+ if (onstart.apply(element, arguments) !== false) {
+ dragging = true;
+ maxHeight = $(element).height();
+ maxWidth = $(element).width();
+ offset = $(element).offset();
+
+ $(doc).bind(duringDragEvents);
+ $(doc.body).addClass("sp-dragging");
+
+ if (!hasTouch) {
+ move(e);
+ }
+
+ prevent(e);
+ }
+ }
+ }
+ function stop() {
+ if (dragging) {
+ $(doc).unbind(duringDragEvents);
+ $(doc.body).removeClass("sp-dragging");
+ onstop.apply(element, arguments);
+ }
+ dragging = false;
+ }
+
+ $(element).bind(hasTouch ? "touchstart" : "mousedown", start);
+ }
+
+ function throttle(func, wait, debounce) {
+ var timeout;
+ return function () {
+ var context = this, args = arguments;
+ var throttler = function () {
+ timeout = null;
+ func.apply(context, args);
+ };
+ if (debounce) clearTimeout(timeout);
+ if (debounce || !timeout) timeout = setTimeout(throttler, wait);
+ };
+ }
+
+
+ /**
+ * Define a jQuery plugin
+ */
+ var dataID = "spectrum.id";
+ $.fn.spectrum = function (opts, extra) {
+
+ if (typeof opts == "string") {
+
+ var returnValue = this;
+ var args = Array.prototype.slice.call( arguments, 1 );
+
+ this.each(function () {
+ var spect = spectrums[$(this).data(dataID)];
+ if (spect) {
+
+ var method = spect[opts];
+ if (!method) {
+ throw new Error( "Spectrum: no such method: '" + opts + "'" );
+ }
+
+ if (opts == "get") {
+ returnValue = spect.get();
+ }
+ else if (opts == "container") {
+ returnValue = spect.container;
+ }
+ else if (opts == "option") {
+ returnValue = spect.option.apply(spect, args);
+ }
+ else if (opts == "destroy") {
+ spect.destroy();
+ $(this).removeData(dataID);
+ }
+ else {
+ method.apply(spect, args);
+ }
+ }
+ });
+
+ return returnValue;
+ }
+
+ // Initializing a new instance of spectrum
+ return this.spectrum("destroy").each(function () {
+ var spect = spectrum(this, opts);
+ $(this).data(dataID, spect.id);
+ });
+ };
+
+ $.fn.spectrum.load = true;
+ $.fn.spectrum.loadOpts = {};
+ $.fn.spectrum.draggable = draggable;
+ $.fn.spectrum.defaults = defaultOpts;
+
+ $.spectrum = { };
+ $.spectrum.localization = { };
+ $.spectrum.palettes = { };
+
+ $.fn.spectrum.processNativeColorInputs = function () {
+ var colorInput = $("<input type='color' value='!' />")[0];
+ var supportsColor = colorInput.type === "color" && colorInput.value != "!";
+
+ if (!supportsColor) {
+ $("input[type=color]").spectrum({
+ preferredFormat: "hex6"
+ });
+ }
+ };
+
+ // TinyColor.js - <https://github.com/bgrins/TinyColor> - 2011 Brian Grinstead - v0.5
+
+ (function (window) {
+
+ var trimLeft = /^[\s,#]+/,
+ trimRight = /\s+$/,
+ tinyCounter = 0,
+ math = Math,
+ mathRound = math.round,
+ mathMin = math.min,
+ mathMax = math.max,
+ mathRandom = math.random,
+ parseFloat = window.parseFloat;
+
+ function tinycolor(color, opts) {
+
+ // If input is already a tinycolor, return itself
+ if (typeof color == "object" && color.hasOwnProperty("_tc_id")) {
+ return color;
+ }
+
+ var rgb = inputToRGB(color);
+ var r = rgb.r, g = rgb.g, b = rgb.b, a = parseFloat(rgb.a), format = rgb.format;
+
+ return {
+ ok: rgb.ok,
+ format: format,
+ _tc_id: tinyCounter++,
+ alpha: a,
+ toHsv: function () {
+ var hsv = rgbToHsv(r, g, b);
+ return { h: hsv.h, s: hsv.s, v: hsv.v, a: a };
+ },
+ toHsvString: function () {
+ var hsv = rgbToHsv(r, g, b);
+ var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
+ return (a == 1) ?
+ "hsv(" + h + ", " + s + "%, " + v + "%)" :
+ "hsva(" + h + ", " + s + "%, " + v + "%, " + a + ")";
+ },
+ toHsl: function () {
+ var hsl = rgbToHsl(r, g, b);
+ return { h: hsl.h, s: hsl.s, l: hsl.l, a: a };
+ },
+ toHslString: function () {
+ var hsl = rgbToHsl(r, g, b);
+ var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
+ return (a == 1) ?
+ "hsl(" + h + ", " + s + "%, " + l + "%)" :
+ "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")";
+ },
+ toHex: function () {
+ return rgbToHex(r, g, b);
+ },
+ toHexString: function (force6Char) {
+ return '#' + rgbToHex(r, g, b, force6Char);
+ },
+ toRgb: function () {
+ return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a };
+ },
+ toRgbString: function () {
+ return (a == 1) ?
+ "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" :
+ "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + a + ")";
+ },
+ toName: function () {
+ return hexNames[rgbToHex(r, g, b)] || false;
+ },
+ toFilter: function (opts, secondColor) {
+
+ var hex = rgbToHex(r, g, b, true);
+ var secondHex = hex;
+ var alphaHex = Math.round(parseFloat(a) * 255).toString(16);
+ var secondAlphaHex = alphaHex;
+ var gradientType = opts && opts.gradientType ? "GradientType = 1, " : "";
+
+ if (secondColor) {
+ var s = tinycolor(secondColor);
+ secondHex = s.toHex();
+ secondAlphaHex = Math.round(parseFloat(s.alpha) * 255).toString(16);
+ }
+
+ return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr=#" + pad2(alphaHex) + hex + ",endColorstr=#" + pad2(secondAlphaHex) + secondHex + ")";
+ },
+ toString: function (format) {
+ format = format || this.format;
+ var formattedString = false;
+ if (format === "rgb") {
+ formattedString = this.toRgbString();
+ }
+ if (format === "hex") {
+ formattedString = this.toHexString();
+ }
+ if (format === "hex6") {
+ formattedString = this.toHexString(true);
+ }
+ if (format === "name") {
+ formattedString = this.toName();
+ }
+ if (format === "hsl") {
+ formattedString = this.toHslString();
+ }
+ if (format === "hsv") {
+ formattedString = this.toHsvString();
+ }
+
+ return formattedString || this.toHexString(true);
+ }
+ };
+ }
+
+ // If input is an object, force 1 into "1.0" to handle ratios properly
+ // String input requires "1.0" as input, so 1 will be treated as 1
+ tinycolor.fromRatio = function (color) {
+
+ if (typeof color == "object") {
+ for (var i in color) {
+ if (color[i] === 1) {
+ color[i] = "1.0";
+ }
+ }
+ }
+
+ return tinycolor(color);
+
+ };
+
+ // Given a string or object, convert that input to RGB
+ // Possible string inputs:
+ //
+ // "red"
+ // "#f00" or "f00"
+ // "#ff0000" or "ff0000"
+ // "rgb 255 0 0" or "rgb (255, 0, 0)"
+ // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
+ // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
+ // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
+ // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
+ // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
+ // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
+ //
+ function inputToRGB(color) {
+
+ var rgb = { r: 0, g: 0, b: 0 };
+ var a = 1;
+ var ok = false;
+ var format = false;
+
+ if (typeof color == "string") {
+ color = stringInputToObject(color);
+ }
+
+ if (typeof color == "object") {
+ if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
+ rgb = rgbToRgb(color.r, color.g, color.b);
+ ok = true;
+ format = "rgb";
+ }
+ else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
+ rgb = hsvToRgb(color.h, color.s, color.v);
+ ok = true;
+ format = "hsv";
+ }
+ else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
+ rgb = hslToRgb(color.h, color.s, color.l);
+ ok = true;
+ format = "hsl";
+ }
+
+ if (color.hasOwnProperty("a")) {
+ a = color.a;
+ }
+ }
+
+ rgb.r = mathMin(255, mathMax(rgb.r, 0));
+ rgb.g = mathMin(255, mathMax(rgb.g, 0));
+ rgb.b = mathMin(255, mathMax(rgb.b, 0));
+
+
+ // Don't let the range of [0,255] come back in [0,1].
+ // Potentially lose a little bit of precision here, but will fix issues where
+ // .5 gets interpreted as half of the total, instead of half of 1.
+ // If it was supposed to be 128, this was already taken care of in the conversion function
+ if (rgb.r < 1) { rgb.r = mathRound(rgb.r); }
+ if (rgb.g < 1) { rgb.g = mathRound(rgb.g); }
+ if (rgb.b < 1) { rgb.b = mathRound(rgb.b); }
+
+ return {
+ ok: ok,
+ format: (color && color.format) || format,
+ r: rgb.r,
+ g: rgb.g,
+ b: rgb.b,
+ a: a
+ };
+ }
+
+
+
+ // Conversion Functions
+ // --------------------
+
+ // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
+ // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+
+ // `rgbToRgb`
+ // Handle bounds / percentage checking to conform to CSS color spec
+ // <http://www.w3.org/TR/css3-color/>
+ // *Assumes:* r, g, b in [0, 255] or [0, 1]
+ // *Returns:* { r, g, b } in [0, 255]
+ function rgbToRgb(r, g, b) {
+ return {
+ r: bound01(r, 255) * 255,
+ g: bound01(g, 255) * 255,
+ b: bound01(b, 255) * 255
+ };
+ }
+
+ // `rgbToHsl`
+ // Converts an RGB color value to HSL.
+ // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
+ // *Returns:* { h, s, l } in [0,1]
+ function rgbToHsl(r, g, b) {
+
+ r = bound01(r, 255);
+ g = bound01(g, 255);
+ b = bound01(b, 255);
+
+ var max = mathMax(r, g, b), min = mathMin(r, g, b);
+ var h, s, l = (max + min) / 2;
+
+ if (max == min) {
+ h = s = 0; // achromatic
+ }
+ else {
+ var d = max - min;
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+ switch (max) {
+ case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+ case g: h = (b - r) / d + 2; break;
+ case b: h = (r - g) / d + 4; break;
+ }
+
+ h /= 6;
+ }
+
+ return { h: h, s: s, l: l };
+ }
+
+ // `hslToRgb`
+ // Converts an HSL color value to RGB.
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
+ // *Returns:* { r, g, b } in the set [0, 255]
+ function hslToRgb(h, s, l) {
+ var r, g, b;
+
+ h = bound01(h, 360);
+ s = bound01(s, 100);
+ l = bound01(l, 100);
+
+ function hue2rgb(p, q, t) {
+ if (t < 0) t += 1;
+ if (t > 1) t -= 1;
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
+ if (t < 1 / 2) return q;
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
+ return p;
+ }
+
+ if (s === 0) {
+ r = g = b = l; // achromatic
+ }
+ else {
+ var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+ var p = 2 * l - q;
+ r = hue2rgb(p, q, h + 1 / 3);
+ g = hue2rgb(p, q, h);
+ b = hue2rgb(p, q, h - 1 / 3);
+ }
+
+ return { r: r * 255, g: g * 255, b: b * 255 };
+ }
+
+ // `rgbToHsv`
+ // Converts an RGB color value to HSV
+ // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
+ // *Returns:* { h, s, v } in [0,1]
+ function rgbToHsv(r, g, b) {
+
+ r = bound01(r, 255);
+ g = bound01(g, 255);
+ b = bound01(b, 255);
+
+ var max = mathMax(r, g, b), min = mathMin(r, g, b);
+ var h, s, v = max;
+
+ var d = max - min;
+ s = max === 0 ? 0 : d / max;
+
+ if (max == min) {
+ h = 0; // achromatic
+ }
+ else {
+ switch (max) {
+ case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+ case g: h = (b - r) / d + 2; break;
+ case b: h = (r - g) / d + 4; break;
+ }
+ h /= 6;
+ }
+ return { h: h, s: s, v: v };
+ }
+
+ // `hsvToRgb`
+ // Converts an HSV color value to RGB.
+ // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
+ // *Returns:* { r, g, b } in the set [0, 255]
+ function hsvToRgb(h, s, v) {
+ h = bound01(h, 360) * 6;
+ s = bound01(s, 100);
+ v = bound01(v, 100);
+
+ var i = math.floor(h),
+ f = h - i,
+ p = v * (1 - s),
+ q = v * (1 - f * s),
+ t = v * (1 - (1 - f) * s),
+ mod = i % 6,
+ r = [v, q, p, p, t, v][mod],
+ g = [t, v, v, q, p, p][mod],
+ b = [p, p, t, v, v, q][mod];
+
+ return { r: r * 255, g: g * 255, b: b * 255 };
+ }
+
+ // `rgbToHex`
+ // Converts an RGB color to hex
+ // Assumes r, g, and b are contained in the set [0, 255]
+ // Returns a 3 or 6 character hex
+ function rgbToHex(r, g, b, force6Char) {
+
+ var hex = [
+ pad2(mathRound(r).toString(16)),
+ pad2(mathRound(g).toString(16)),
+ pad2(mathRound(b).toString(16))
+ ];
+
+ // Return a 3 character hex if possible
+ if (!force6Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
+ return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
+ }
+
+ return hex.join("");
+ }
+
+ // `equals`
+ // Can be called with any tinycolor input
+ tinycolor.equals = function (color1, color2) {
+ if (!color1 || !color2) { return false; }
+ return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
+ };
+ tinycolor.random = function () {
+ return tinycolor.fromRatio({
+ r: mathRandom(),
+ g: mathRandom(),
+ b: mathRandom()
+ });
+ };
+
+
+ // Modification Functions
+ // ----------------------
+ // Thanks to less.js for some of the basics here
+ // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
+
+
+ tinycolor.desaturate = function (color, amount) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.s -= ((amount || 10) / 100);
+ hsl.s = clamp01(hsl.s);
+ return tinycolor(hsl);
+ };
+ tinycolor.saturate = function (color, amount) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.s += ((amount || 10) / 100);
+ hsl.s = clamp01(hsl.s);
+ return tinycolor(hsl);
+ };
+ tinycolor.greyscale = function (color) {
+ return tinycolor.desaturate(color, 100);
+ };
+ tinycolor.lighten = function (color, amount) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.l += ((amount || 10) / 100);
+ hsl.l = clamp01(hsl.l);
+ return tinycolor(hsl);
+ };
+ tinycolor.darken = function (color, amount) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.l -= ((amount || 10) / 100);
+ hsl.l = clamp01(hsl.l);
+ return tinycolor(hsl);
+ };
+ tinycolor.complement = function (color) {
+ var hsl = tinycolor(color).toHsl();
+ hsl.h = (hsl.h + 0.5) % 1;
+ return tinycolor(hsl);
+ };
+
+
+ // Combination Functions
+ // ---------------------
+ // Thanks to jQuery xColor for some of the ideas behind these
+ // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
+
+ tinycolor.triad = function (color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h * 360;
+ return [
+ tinycolor(color),
+ tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
+ tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
+ ];
+ };
+ tinycolor.tetrad = function (color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h * 360;
+ return [
+ tinycolor(color),
+ tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
+ tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
+ tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
+ ];
+ };
+ tinycolor.splitcomplement = function (color) {
+ var hsl = tinycolor(color).toHsl();
+ var h = hsl.h * 360;
+ return [
+ tinycolor(color),
+ tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),
+ tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })
+ ];
+ };
+ tinycolor.analogous = function (color, results, slices) {
+ results = results || 6;
+ slices = slices || 30;
+
+ var hsl = tinycolor(color).toHsl();
+ var part = 360 / slices;
+ var ret = [tinycolor(color)];
+
+ hsl.h *= 360;
+
+ for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
+ hsl.h = (hsl.h + part) % 360;
+ ret.push(tinycolor(hsl));
+ }
+ return ret;
+ };
+ tinycolor.monochromatic = function (color, results) {
+ results = results || 6;
+ var hsv = tinycolor(color).toHsv();
+ var h = hsv.h, s = hsv.s, v = hsv.v;
+ var ret = [];
+ var modification = 1 / results;
+
+ while (results--) {
+ ret.push(tinycolor({ h: h, s: s, v: v }));
+ v = (v + modification) % 1;
+ }
+
+ return ret;
+ };
+ tinycolor.readable = function (color1, color2) {
+ var a = tinycolor(color1).toRgb(), b = tinycolor(color2).toRgb();
+ return (
+ (b.r - a.r) * (b.r - a.r) +
+ (b.g - a.g) * (b.g - a.g) +
+ (b.b - a.b) * (b.b - a.b)
+ ) > 0x28A4;
+ };
+
+ // Big List of Colors
+ // ---------
+ // <http://www.w3.org/TR/css3-color/#svg-color>
+ var names = tinycolor.names = {
+ aliceblue: "f0f8ff",
+ antiquewhite: "faebd7",
+ aqua: "0ff",
+ aquamarine: "7fffd4",
+ azure: "f0ffff",
+ beige: "f5f5dc",
+ bisque: "ffe4c4",
+ black: "000",
+ blanchedalmond: "ffebcd",
+ blue: "00f",
+ blueviolet: "8a2be2",
+ brown: "a52a2a",
+ burlywood: "deb887",
+ burntsienna: "ea7e5d",
+ cadetblue: "5f9ea0",
+ chartreuse: "7fff00",
+ chocolate: "d2691e",
+ coral: "ff7f50",
+ cornflowerblue: "6495ed",
+ cornsilk: "fff8dc",
+ crimson: "dc143c",
+ cyan: "0ff",
+ darkblue: "00008b",
+ darkcyan: "008b8b",
+ darkgoldenrod: "b8860b",
+ darkgray: "a9a9a9",
+ darkgreen: "006400",
+ darkgrey: "a9a9a9",
+ darkkhaki: "bdb76b",
+ darkmagenta: "8b008b",
+ darkolivegreen: "556b2f",
+ darkorange: "ff8c00",
+ darkorchid: "9932cc",
+ darkred: "8b0000",
+ darksalmon: "e9967a",
+ darkseagreen: "8fbc8f",
+ darkslateblue: "483d8b",
+ darkslategray: "2f4f4f",
+ darkslategrey: "2f4f4f",
+ darkturquoise: "00ced1",
+ darkviolet: "9400d3",
+ deeppink: "ff1493",
+ deepskyblue: "00bfff",
+ dimgray: "696969",
+ dimgrey: "696969",
+ dodgerblue: "1e90ff",
+ firebrick: "b22222",
+ floralwhite: "fffaf0",
+ forestgreen: "228b22",
+ fuchsia: "f0f",
+ gainsboro: "dcdcdc",
+ ghostwhite: "f8f8ff",
+ gold: "ffd700",
+ goldenrod: "daa520",
+ gray: "808080",
+ green: "008000",
+ greenyellow: "adff2f",
+ grey: "808080",
+ honeydew: "f0fff0",
+ hotpink: "ff69b4",
+ indianred: "cd5c5c",
+ indigo: "4b0082",
+ ivory: "fffff0",
+ khaki: "f0e68c",
+ lavender: "e6e6fa",
+ lavenderblush: "fff0f5",
+ lawngreen: "7cfc00",
+ lemonchiffon: "fffacd",
+ lightblue: "add8e6",
+ lightcoral: "f08080",
+ lightcyan: "e0ffff",
+ lightgoldenrodyellow: "fafad2",
+ lightgray: "d3d3d3",
+ lightgreen: "90ee90",
+ lightgrey: "d3d3d3",
+ lightpink: "ffb6c1",
+ lightsalmon: "ffa07a",
+ lightseagreen: "20b2aa",
+ lightskyblue: "87cefa",
+ lightslategray: "789",
+ lightslategrey: "789",
+ lightsteelblue: "b0c4de",
+ lightyellow: "ffffe0",
+ lime: "0f0",
+ limegreen: "32cd32",
+ linen: "faf0e6",
+ magenta: "f0f",
+ maroon: "800000",
+ mediumaquamarine: "66cdaa",
+ mediumblue: "0000cd",
+ mediumorchid: "ba55d3",
+ mediumpurple: "9370db",
+ mediumseagreen: "3cb371",
+ mediumslateblue: "7b68ee",
+ mediumspringgreen: "00fa9a",
+ mediumturquoise: "48d1cc",
+ mediumvioletred: "c71585",
+ midnightblue: "191970",
+ mintcream: "f5fffa",
+ mistyrose: "ffe4e1",
+ moccasin: "ffe4b5",
+ navajowhite: "ffdead",
+ navy: "000080",
+ oldlace: "fdf5e6",
+ olive: "808000",
+ olivedrab: "6b8e23",
+ orange: "ffa500",
+ orangered: "ff4500",
+ orchid: "da70d6",
+ palegoldenrod: "eee8aa",
+ palegreen: "98fb98",
+ paleturquoise: "afeeee",
+ palevioletred: "db7093",
+ papayawhip: "ffefd5",
+ peachpuff: "ffdab9",
+ peru: "cd853f",
+ pink: "ffc0cb",
+ plum: "dda0dd",
+ powderblue: "b0e0e6",
+ purple: "800080",
+ red: "f00",
+ rosybrown: "bc8f8f",
+ royalblue: "4169e1",
+ saddlebrown: "8b4513",
+ salmon: "fa8072",
+ sandybrown: "f4a460",
+ seagreen: "2e8b57",
+ seashell: "fff5ee",
+ sienna: "a0522d",
+ silver: "c0c0c0",
+ skyblue: "87ceeb",
+ slateblue: "6a5acd",
+ slategray: "708090",
+ slategrey: "708090",
+ snow: "fffafa",
+ springgreen: "00ff7f",
+ steelblue: "4682b4",
+ tan: "d2b48c",
+ teal: "008080",
+ thistle: "d8bfd8",
+ tomato: "ff6347",
+ turquoise: "40e0d0",
+ violet: "ee82ee",
+ wheat: "f5deb3",
+ white: "fff",
+ whitesmoke: "f5f5f5",
+ yellow: "ff0",
+ yellowgreen: "9acd32"
+ };
+
+ // Make it easy to access colors via `hexNames[hex]`
+ var hexNames = tinycolor.hexNames = flip(names);
+
+
+ // Utilities
+ // ---------
+
+ // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
+ function flip(o) {
+ var flipped = {};
+ for (var i in o) {
+ if (o.hasOwnProperty(i)) {
+ flipped[o[i]] = i;
+ }
+ }
+ return flipped;
+ }
+
+ // Take input from [0, n] and return it as [0, 1]
+ function bound01(n, max) {
+ if (isOnePointZero(n)) { n = "100%"; }
+
+ var processPercent = isPercentage(n);
+ n = mathMin(max, mathMax(0, parseFloat(n)));
+
+ // Automatically convert percentage into number
+ if (processPercent) {
+ n = n * (max / 100);
+ }
+
+ // Handle floating point rounding errors
+ if (math.abs(n - max) < 0.000001) {
+ return 1;
+ }
+ else if (n >= 1) {
+ return (n % max) / parseFloat(max);
+ }
+ return n;
+ }
+
+ // Force a number between 0 and 1
+ function clamp01(val) {
+ return mathMin(1, mathMax(0, val));
+ }
+
+ // Parse an integer into hex
+ function parseHex(val) {
+ return parseInt(val, 16);
+ }
+
+ // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
+ // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
+ function isOnePointZero(n) {
+ return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
+ }
+
+ // Check to see if string passed in is a percentage
+ function isPercentage(n) {
+ return typeof n === "string" && n.indexOf('%') != -1;
+ }
+
+ // Force a hex value to have 2 characters
+ function pad2(c) {
+ return c.length == 1 ? '0' + c : '' + c;
+ }
+
+ var matchers = (function () {
+
+ // <http://www.w3.org/TR/css3-values/#integers>
+ var CSS_INTEGER = "[-\\+]?\\d+%?";
+
+ // <http://www.w3.org/TR/css3-values/#number-value>
+ var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
+
+ // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
+ var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
+
+ // Actual matching.
+ // Parentheses and commas are optional, but not required.
+ // Whitespace can take the place of commas or opening paren
+ var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+ var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+
+ return {
+ rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
+ rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
+ hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
+ hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
+ hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
+ hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+ hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
+ };
+ })();
+
+ // `stringInputToObject`
+ // Permissive string parsing. Take in a number of formats, and output an object
+ // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
+ function stringInputToObject(color) {
+
+ color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
+ var named = false;
+ if (names[color]) {
+ color = names[color];
+ named = true;
+ }
+ else if (color == 'transparent') {
+ return { r: 0, g: 0, b: 0, a: 0 };
+ }
+
+ // Try to match string input using regular expressions.
+ // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
+ // Just return an object and let the conversion functions handle that.
+ // This way the result will be the same whether the tinycolor is initialized with string or object.
+ var match;
+ if ((match = matchers.rgb.exec(color))) {
+ return { r: match[1], g: match[2], b: match[3] };
+ }
+ if ((match = matchers.rgba.exec(color))) {
+ return { r: match[1], g: match[2], b: match[3], a: match[4] };
+ }
+ if ((match = matchers.hsl.exec(color))) {
+ return { h: match[1], s: match[2], l: match[3] };
+ }
+ if ((match = matchers.hsla.exec(color))) {
+ return { h: match[1], s: match[2], l: match[3], a: match[4] };
+ }
+ if ((match = matchers.hsv.exec(color))) {
+ return { h: match[1], s: match[2], v: match[3] };
+ }
+ if ((match = matchers.hex6.exec(color))) {
+ return {
+ r: parseHex(match[1]),
+ g: parseHex(match[2]),
+ b: parseHex(match[3]),
+ format: named ? "name" : "hex"
+ };
+ }
+ if ((match = matchers.hex3.exec(color))) {
+ return {
+ r: parseHex(match[1] + '' + match[1]),
+ g: parseHex(match[2] + '' + match[2]),
+ b: parseHex(match[3] + '' + match[3]),
+ format: named ? "name" : "hex"
+ };
+ }
+
+ return false;
+ }
+
+ // Everything is ready, expose to window
+ window.tinycolor = tinycolor;
+
+ })(this);
+
+ $(function () {
+ if ($.fn.spectrum.load) {
+ $.fn.spectrum.processNativeColorInputs();
+ }
+ });
+
+
+ function log(){window.console&&(log=Function.prototype.bind?Function.prototype.bind.call(console.log,console):function(){Function.prototype.apply.call(console.log,console,arguments)},log.apply(this,arguments))};
+
+
+})(window, jQuery);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/controller/AdminControllerTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,114 @@
+package org.iri_research.renkan.test.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = { "controller-context.xml",
+ "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
+public class AdminControllerTest {
+
+ private final static int SPACE_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(AdminControllerTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+
+ @Autowired
+ private WebApplicationContext context;
+ private MockMvc mvc;
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ pl.add(new Project(testSpace.getId(), UUID.randomUUID()
+ .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
+ "desc" + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1), creationDate));
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+ this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ }
+
+ @Test
+ public void testContext() throws Exception {
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/");
+ MvcResult res = this.mvc.perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
+
+ logger.debug("testContext resp : "
+ + res.getResponse().getContentAsString());
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,484 @@
+package org.iri_research.renkan.test.controller;
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.util.NestedServletException;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = { "controller-context.xml",
+ "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
+public class GroupsAdminControllerTest {
+
+ private final static int SPACE_NB = 3;
+ private final static int USER_NB = 3;
+ private final static int GROUP_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(GroupsAdminControllerTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+ @Autowired
+ private UsersRepository usersRepository;
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+
+
+ @Autowired
+ private PasswordEncoder renkanPasswordEncoder;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+
+ private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
+ private List<String> usersUuids = new ArrayList<>(USER_NB);
+
+ private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
+ private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
+
+
+
+ @Autowired
+ private WebApplicationContext context;
+ private MockMvc mvc;
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ usersRepository.deleteAll();
+ groupsRepository.deleteAll();
+
+ for(int i=0; i < USER_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+ user.setLocked(false);
+ user.setEnabled(true);
+ user.setAvatar("A pretty picture");
+ user.setExpirationDate(new LocalDate());
+ user.setCredentialsExpirationDate(new LocalDate());
+ user.setEmail(String.format("user%d@mail.com", i));
+ user = usersRepository.save(user);
+ this.usersUuids.add(uuid);
+ this.usersList.put(uuid, user);
+ }
+
+
+ for(int i=0; i < GROUP_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
+ group.setAvatar("A pretty group picture " + i);
+ group = groupsRepository.save(group);
+ this.groupsUuids.add(uuid);
+ this.groupsList.put(uuid, group);
+ }
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ Project p = new Project(testSpace.getId(), UUID.randomUUID()
+ .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
+ "desc" + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1), creationDate);
+ p.addUser(this.usersList.get(this.usersUuids.get(0)));
+ pl.add(p);
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+
+
+ this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ usersRepository.deleteAll();
+ groupsRepository.deleteAll();
+
+ }
+
+ @Test
+ public void testGroupPostUpdate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/save");
+ post = post.param("id", this.groupsUuids.get(0));
+ post = post.param("title", "New name");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
+
+ Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
+
+ Assert.assertNotNull("Should find space", group);
+ Assert.assertEquals("Title equals", "New name", group.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ group.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", group.getColor());
+ }
+
+ @Test
+ public void testGroupPostCreate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/save")
+ .param("title", "New name")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("avatar", "A pretty avatar");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
+
+ Assert.assertEquals("Must have one more group", GROUP_NB + 1,
+ this.groupsRepository.count());
+
+ for (Group group : this.groupsRepository.findAll()) {
+ if (this.groupsList.containsKey(group.getId())) {
+ continue;
+ }
+ else {
+ Assert.assertNotNull("Should find group", group);
+ Assert.assertEquals("Title equals", "New name", group.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ group.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", group.getColor());
+ Assert.assertEquals("Avatar equals", "A pretty avatar", group.getAvatar());
+ Assert.assertTrue(
+ "id sould match uuid regex",
+ group.getId()
+ .matches(
+ "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
+ }
+ }
+ }
+
+ @Test
+ public void testGroupPostUpdateEmptyTitle() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/save")
+ .param("id", this.groupsUuids.get(0))
+ .param("title", "")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("avatar", "A pretty avatar");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/groupEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("group"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("group", "title"));
+
+ Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
+
+ Assert.assertNotNull("Should find group", group);
+ Assert.assertEquals("name equals", "group0", group.getTitle());
+
+ Assert.assertEquals("name equals", "Group nb 0", group.getDescription());
+
+ }
+
+ @Test
+ public void testGroupPostCreateEmptyName() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/save")
+ .param("title", "")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("avatar", "A pretty avatar");
+
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/groupEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("group"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("group", "title"));
+
+ Assert.assertEquals("Must not have one more group", GROUP_NB,this.groupsRepository.count());
+
+ }
+
+ @Test
+ public void testUserPostCreateBadPassword() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save")
+ .param("title", "user")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("expirationDate","2007-11-24")
+ .param("credentialsExpirationDate","2009-11-29")
+ .param("password", "test")
+ .param("passwordConfirm", "test2");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "password"));
+
+ Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
+
+ }
+
+
+ @Test
+ public void testDeleteGroup() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/groups/delete/"
+ + this.groupsUuids.get(GROUP_NB - 1));
+
+ MvcResult res = this.mvc
+ .perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(
+ MockMvcResultMatchers.view().name(
+ "admin/groupDeleteConfirm"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeExists(
+ "groupObj", "key", "salt")).andReturn();
+
+ Map<String, Object> model = res.getModelAndView().getModel();
+
+ Group group = (Group) model.get("groupObj");
+ Assert.assertNotNull("Group is not null", group);
+ Assert.assertEquals("Must be first group id",
+ this.groupsUuids.get(GROUP_NB - 1), group.getId());
+
+ String key = (String) model.get("key");
+ Assert.assertNotNull("key is not null", key);
+
+ String salt = (String) model.get("salt");
+ Assert.assertNotNull("salt is not null", salt);
+
+ Assert.assertTrue("Key must be checked", group.checkKey(key, salt));
+
+ }
+
+ @Test
+ public void testDeleteFakeGroup() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/groups/delete/" + UUID.randomUUID().toString());
+
+ try {
+ this.mvc.perform(get).andExpect(
+ MockMvcResultMatchers.status().isNotFound());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.NOT_FOUND,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ }
+
+ @Test
+ public void testDoDeleteGroupNoKey() throws Exception {
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/delete/"
+ + this.spacesUuids.get(GROUP_NB - 1));
+
+ try {
+ this.mvc.perform(post).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ Assert.assertEquals("Must have same nb of group", GROUP_NB,
+ this.groupsRepository.count());
+
+ }
+
+ @Test
+ public void testDoDeleteGroup() throws Exception {
+
+ Group group = this.groupsList.get(this.groupsUuids.get(GROUP_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = group.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/groups/delete/%s?key=%s&salt=%s",
+ this.groupsUuids.get(GROUP_NB - 1), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
+
+ Assert.assertEquals("Must have one less space", GROUP_NB - 1,
+ this.groupsRepository.count());
+
+ group = this.groupsRepository.findOne(this.groupsUuids
+ .get(GROUP_NB - 1));
+
+ Assert.assertNull("Group " + this.groupsUuids.get(GROUP_NB - 1)
+ + " deleted", group);
+
+ }
+
+ @Test
+ public void testDoDeleteGroupFake() throws Exception {
+
+ Group group = this.groupsList.get(this.groupsUuids.get(GROUP_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = group.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/groups/delete/%s?key=%s&salt=%s",
+ UUID.randomUUID(), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
+
+ Assert.assertEquals("Must have the same nb of group", GROUP_NB,
+ this.groupsRepository.count());
+
+ }
+
+ @Test
+ public void testUpdateUserGroups() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/groups/save");
+ post = post.param("id", this.groupsUuids.get(0));
+ post = post.param("title", "New name");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("users", this.usersUuids.toArray(new String[GroupsAdminControllerTest.GROUP_NB]));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
+
+ Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
+
+ Assert.assertNotNull("Should find group", group);
+ Assert.assertEquals("Title equals", "New name", group.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ group.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", group.getColor());
+
+ Assert.assertNotNull("Users must be set", group.getUsers());
+ Assert.assertEquals("all users must be set", USER_NB, group.getUsers().size());
+ Assert.assertTrue("users list must contains all users", this.usersUuids.containsAll(group.getUsers()));
+
+ }
+
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/controller/RenkanControllerTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,191 @@
+package org.iri_research.renkan.test.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = { "controller-context.xml",
+ "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
+public class RenkanControllerTest {
+
+ private final static int SPACE_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(RenkanControllerTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+ @Autowired
+ private NodesRepository nodesRepository;
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ private ArrayList<Project> testProjects = new ArrayList<>();
+ private ArrayList<Node> testNodes = new ArrayList<>();
+ private ArrayList<Edge> testEdges = new ArrayList<>();
+
+ @Autowired
+ private WebApplicationContext context;
+ private MockMvc mvc;
+
+ private void clean() {
+ edgesRepository.deleteAll();
+ nodesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ spacesRepository.deleteAll();
+ }
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ this.clean();
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ pl.add(new Project(testSpace.getId(), UUID.randomUUID()
+ .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
+ "desc" + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1), creationDate));
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ Project testProject = pl.get(0);
+
+ for (int i = 0; i < 3; i++) {
+ Node node = new Node("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/nodes/node" + i, "#ffff0" + i,
+ "test_user", new Point(0, i),
+ "http://renkan.org/images/node" + i, i, testProject.getId());
+ node = this.nodesRepository.save(node);
+ testProject.getNodes().add(node);
+ this.testNodes.add(node);
+ }
+
+ for (int i = 0; i < 3; i++) {
+ Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/edges/edge" + i, "#ffff0" + i,
+ this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
+ "test_user", testProject.getId());
+ edge = this.edgesRepository.save(edge);
+ testProject.getEdges().add(edge);
+ this.testEdges.add(edge);
+ }
+
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+ this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
+ }
+
+
+ @After
+ public void teardown() {
+ this.clean();
+ }
+
+ @Test
+ public void testExportProject() throws Exception {
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
+ MvcResult res = this.mvc.perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
+ .andReturn();
+
+ logger.debug("testExportProject resp : "
+ + res.getResponse().getContentAsString());
+ }
+
+ @Test
+ public void testExportProjectContent() throws Exception {
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
+ MvcResult res = this.mvc.perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.jsonPath("title").exists())
+ .andExpect(MockMvcResultMatchers.jsonPath("title").value("test1"))
+ .andExpect(MockMvcResultMatchers.jsonPath("description").exists())
+ .andExpect(MockMvcResultMatchers.jsonPath("description").value("desc1"))
+ .andExpect(MockMvcResultMatchers.jsonPath("nodes").isArray())
+ .andExpect(MockMvcResultMatchers.jsonPath("edges").isArray())
+ .andReturn();
+
+ logger.debug("testExportProjectContent resp : "
+ + res.getResponse().getContentAsString());
+ }
+
+
+ @Test
+ public void testExportProjectExclude() throws Exception {
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
+ MvcResult res = this.mvc.perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
+ .andExpect(MockMvcResultMatchers.jsonPath("id").doesNotExist())
+ .andExpect(MockMvcResultMatchers.jsonPath("nodes[*].id").doesNotExist())
+ .andExpect(MockMvcResultMatchers.jsonPath("nodes[*].@id").exists())
+ .andExpect(MockMvcResultMatchers.jsonPath("edges[*].id").doesNotExist())
+ .andReturn();
+
+ logger.debug("testExportProjectContentExclude resp : "
+ + res.getResponse().getContentAsString());
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/controller/SpacesAdminControllerTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,557 @@
+package org.iri_research.renkan.test.controller;
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.joda.time.DateTime;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.util.NestedServletException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = { "controller-context.xml",
+ "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
+public class SpacesAdminControllerTest {
+
+ private final static int SPACE_NB = 3;
+
+ private Logger logger = LoggerFactory.getLogger(SpacesAdminControllerTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+
+ @Autowired
+ private WebApplicationContext context;
+ private MockMvc mvc;
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ pl.add(new Project(testSpace.getId(), UUID.randomUUID()
+ .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
+ "desc" + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1), creationDate));
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+ this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ }
+
+ @Test
+ public void testSpacePostUpdate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("id", this.spacesUuids.get(0));
+ post = post.param("title", "New title");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
+
+ Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
+
+ Assert.assertNotNull("Should find space", sp);
+ Assert.assertEquals("Title equals", "New title", sp.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ sp.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", sp.getColor());
+ Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig());
+
+ }
+
+ @Test
+ public void testSpacePostCreate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("title", "New title");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
+
+ Assert.assertEquals("Must have one more space", SPACE_NB + 1,
+ this.spacesRepository.count());
+
+ for (Space sp : this.spacesRepository.findAll()) {
+ if (this.spacesList.containsKey(sp.getId())) {
+ continue;
+ } else {
+ Assert.assertNotNull("Should find space", sp);
+ Assert.assertEquals("Title equals", "New title", sp.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ sp.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", sp.getColor());
+ Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig());
+ Assert.assertTrue(
+ "id sould match uuid regex",
+ sp.getId()
+ .matches(
+ "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
+ Assert.assertNotNull("Date created should be not null",
+ sp.getCreated());
+ }
+ }
+ }
+
+ @Test
+ public void testSpacePostUpdateEmptyTitle() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("id", this.spacesUuids.get(0));
+ post = post.param("title", "");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "title"));
+
+ Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
+
+ Assert.assertNotNull("Should find space", sp);
+ Assert.assertEquals("Title equals", "test 0", sp.getTitle());
+
+ }
+
+ @Test
+ public void testSpacePostCreateEmptyTitle() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("title", "");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "title"));
+
+ Assert.assertEquals("Must not have one more space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+ @Test
+ public void testSpacePostUpdateBadJson() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("id", this.spacesUuids.get(0));
+ post = post.param("title", "New Title");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "binConfig"));
+
+ Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
+
+ Assert.assertNotNull("Should find space", sp);
+ Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig());
+
+ }
+
+ @Test
+ public void testSpacePostCreateBadJson() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("title", "New Title");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "binConfig"));
+
+ Assert.assertEquals("Must not have one more space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+ @Test
+ public void testSpacePostUpdateAllErrors() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("id", this.spacesUuids.get(0));
+ post = post.param("title", "");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "{");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(2))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "title"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "binConfig"));
+
+ Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
+
+ Assert.assertNotNull("Should find space", sp);
+ Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig());
+ Assert.assertEquals("title equals", "test 0", sp.getTitle());
+
+ }
+
+ @Test
+ public void testSpacePostCreateAllErrors() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/save");
+ post = post.param("title", "");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("binConfig", "}");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(2))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasErrors(
+ "space"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "title"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeHasFieldErrors(
+ "space", "binConfig"));
+
+ Assert.assertEquals("Must not have one more space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+ @Test
+ public void testDeleteSpace() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/spaces/delete/"
+ + this.spacesUuids.get(SPACE_NB - 1));
+
+ MvcResult res = this.mvc
+ .perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(
+ MockMvcResultMatchers.view().name(
+ "admin/spaceDeleteConfirm"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeExists(
+ "spaceObj", "key", "salt")).andReturn();
+
+ Map<String, Object> model = res.getModelAndView().getModel();
+
+ Space space = (Space) model.get("spaceObj");
+ Assert.assertNotNull("Space is not null", space);
+ Assert.assertEquals("Must be first space id",
+ this.spacesUuids.get(SPACE_NB - 1), space.getId());
+
+ String key = (String) model.get("key");
+ Assert.assertNotNull("key is not null", key);
+
+ String salt = (String) model.get("salt");
+ Assert.assertNotNull("salt is not null", salt);
+
+ Assert.assertTrue("Key must be checked", space.checkKey(key, salt));
+
+ }
+
+ @Test
+ public void testDeleteFakeSpace() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/spaces/delete/" + UUID.randomUUID().toString());
+
+ try {
+ this.mvc.perform(get).andExpect(
+ MockMvcResultMatchers.status().isNotFound());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.NOT_FOUND,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ }
+
+ @Test
+ public void testDeleteSpaceProject() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/spaces/delete/" + this.spacesUuids.get(0));
+
+ try {
+ this.mvc.perform(get).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ }
+
+ @Test
+ public void testDoDeleteSpaceNoKey() throws Exception {
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/spaces/delete/"
+ + this.spacesUuids.get(SPACE_NB - 1));
+
+ try {
+ this.mvc.perform(post).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ Assert.assertEquals("Must have same nb of space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+ @Test
+ public void testDoDeleteSpace() throws Exception {
+
+ Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = space.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/spaces/delete/%s?key=%s&salt=%s",
+ this.spacesUuids.get(SPACE_NB - 1), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
+
+ Assert.assertEquals("Must have one less space", SPACE_NB - 1,
+ this.spacesRepository.count());
+
+ space = this.spacesRepository.findOne(this.spacesUuids
+ .get(SPACE_NB - 1));
+
+ Assert.assertNull("Space " + this.spacesUuids.get(SPACE_NB - 1)
+ + " deleted", space);
+
+ }
+
+ @Test
+ public void testDoDeleteSpaceFake() throws Exception {
+
+ Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = space.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/spaces/delete/%s?key=%s&salt=%s",
+ UUID.randomUUID(), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
+
+ Assert.assertEquals("Must have the same nb of space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+ @Test
+ public void testDoDeleteSpaceProject() throws Exception {
+
+ Space space = this.spacesList.get(this.spacesUuids.get(0));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = space.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/spaces/delete/%s?key=%s&salt=%s",
+ this.spacesUuids.get(0), key, salt));
+
+ try {
+ this.mvc.perform(post).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ Assert.assertEquals("Must have the same nb of space", SPACE_NB,
+ this.spacesRepository.count());
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,549 @@
+package org.iri_research.renkan.test.controller;
+
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import org.apache.commons.codec.binary.Hex;
+import org.iri_research.renkan.models.Group;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.models.User;
+import org.iri_research.renkan.repositories.GroupsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.repositories.UsersRepository;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.util.NestedServletException;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(locations = { "controller-context.xml",
+ "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
+public class UsersAdminControllerTest {
+
+ private final static int SPACE_NB = 3;
+ private final static int USER_NB = 3;
+ private final static int GROUP_NB = 4;
+
+ private Logger logger = LoggerFactory.getLogger(UsersAdminControllerTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+ @Autowired
+ private ProjectsRepository projectsRepository;
+ @Autowired
+ private UsersRepository usersRepository;
+ @Autowired
+ private GroupsRepository groupsRepository;
+
+
+ @Autowired
+ private PasswordEncoder renkanPasswordEncoder;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
+ private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
+
+ private ArrayList<Project> testProjects = new ArrayList<Project>();
+
+ private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
+ private List<String> usersUuids = new ArrayList<>(USER_NB);
+
+ private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
+ private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
+
+ @Autowired
+ private WebApplicationContext context;
+ private MockMvc mvc;
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ usersRepository.deleteAll();
+
+ for(int i=0; i < USER_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
+ user.setLocked(false);
+ user.setEnabled(true);
+ user.setAvatar("A pretty picture");
+ user.setExpirationDate(new LocalDate());
+ user.setCredentialsExpirationDate(new LocalDate());
+ user.setEmail(String.format("user%d@mail.com", i));
+ user = usersRepository.save(user);
+ this.usersUuids.add(uuid);
+ this.usersList.put(uuid, user);
+ }
+
+ for(int i=0; i < GROUP_NB; i++) {
+ String uuid = UUID.randomUUID().toString();
+ Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
+ group.setAvatar("A pretty group picture " + i);
+ group = groupsRepository.save(group);
+ this.groupsUuids.add(uuid);
+ this.groupsList.put(uuid, group);
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ ArrayList<Project> pl = new ArrayList<Project>();
+ for (int i = 0; i < SPACE_NB; i++) {
+ DateTime creationDate = new DateTime();
+ String uuid = UUID.randomUUID().toString();
+ spacesUuids.add(uuid);
+ Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
+ "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
+ "test_user", "http://ldt.iri.centrepompidou.fr",
+ creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(uuid, testSpace);
+ for (int j = 0; j < SPACE_NB - 1 - i; j++) {
+ Project p = new Project(testSpace.getId(), UUID.randomUUID()
+ .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
+ "desc" + ((SPACE_NB - 1) * i + j + 1),
+ "http://localhost:8080/rest/projects/id"
+ + ((SPACE_NB - 1) * i + j + 1), creationDate);
+ p.addUser(this.usersList.get(this.usersUuids.get(0)));
+ pl.add(p);
+ }
+ try {
+ Thread.sleep(1);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+
+ for (Project p : projectsRepository.save(pl)) {
+ this.testProjects.add(p);
+ }
+
+
+
+ this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ projectsRepository.deleteAll();
+ usersRepository.deleteAll();
+ }
+
+ @Test
+ public void testUserPostUpdate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save");
+ post = post.param("id", this.usersUuids.get(0));
+ post = post.param("title", "New name");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
+
+ User user = this.usersRepository.findOne(this.usersUuids.get(0));
+
+ Assert.assertNotNull("Should find user", user);
+ Assert.assertEquals("Title equals", "New name", user.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ user.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", user.getColor());
+ }
+
+ @Test
+ public void testUserPostCreate() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save")
+ .param("title", "New name")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("expirationDate","2007-11-24")
+ .param("credentialsExpirationDate","2009-11-29")
+ .param("password", "test")
+ .param("passwordConfirm", "test");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
+
+ Assert.assertEquals("Must have one more space", USER_NB + 1,
+ this.usersRepository.count());
+
+ for (User user : this.usersRepository.findAll()) {
+ if (this.usersList.containsKey(user.getId())) {
+ continue;
+ }
+ else {
+ Assert.assertNotNull("Should find user", user);
+ Assert.assertEquals("Title equals", "New name", user.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ user.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", user.getColor());
+ Assert.assertTrue(
+ "id sould match uuid regex",
+ user.getId()
+ .matches(
+ "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
+ Assert.assertTrue("password must match \"test\"", renkanPasswordEncoder.matches("test", user.getPassword()));
+ Assert.assertEquals(new LocalDate(2007, 11, 24), user.getExpirationDate());
+ }
+ }
+ }
+
+ @Test
+ public void testUserPostUpdateEmptyTitle() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save")
+ .param("id", this.usersUuids.get(0))
+ .param("title", "")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("expirationDate","2007-11-24")
+ .param("credentialsExpirationDate","2009-11-29")
+ .param("password", "test")
+ .param("passwordConfirm", "test");
+
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "title"));
+
+ User user = this.usersRepository.findOne(this.usersUuids.get(0));
+
+ Assert.assertNotNull("Should find user", user);
+ Assert.assertEquals("name equals", "user0", user.getTitle());
+
+ Assert.assertEquals("name equals", "User nb 0", user.getDescription());
+
+ }
+
+ @Test
+ public void testUserPostCreateEmptyName() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save")
+ .param("title", "")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("expirationDate","2007-11-24")
+ .param("credentialsExpirationDate","2009-11-29")
+ .param("password", "test")
+ .param("passwordConfirm", "test");
+
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "title"));
+
+ Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
+
+ }
+
+ @Test
+ public void testUserPostCreateBadPassword() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save")
+ .param("title", "user")
+ .param("description", "New description")
+ .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
+ .param("color", "#ffffff")
+ .param("expirationDate","2007-11-24")
+ .param("credentialsExpirationDate","2009-11-29")
+ .param("password", "test")
+ .param("passwordConfirm", "test2");
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
+ .andExpect(MockMvcResultMatchers.model().hasErrors())
+ .andExpect(MockMvcResultMatchers.model().errorCount(1))
+ .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
+ .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "password"));
+
+ Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
+
+ }
+
+ @Test
+ public void testDeleteUser() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/users/delete/"
+ + this.usersUuids.get(USER_NB - 1));
+
+ MvcResult res = this.mvc
+ .perform(get)
+ .andExpect(MockMvcResultMatchers.status().isOk())
+ .andExpect(
+ MockMvcResultMatchers.view().name(
+ "admin/userDeleteConfirm"))
+ .andExpect(
+ MockMvcResultMatchers.model().attributeExists(
+ "userObj", "key", "salt")).andReturn();
+
+ Map<String, Object> model = res.getModelAndView().getModel();
+
+ User user = (User) model.get("userObj");
+ Assert.assertNotNull("User is not null", user);
+ Assert.assertEquals("Must be first user id",
+ this.usersUuids.get(USER_NB - 1), user.getId());
+
+ String key = (String) model.get("key");
+ Assert.assertNotNull("key is not null", key);
+
+ String salt = (String) model.get("salt");
+ Assert.assertNotNull("salt is not null", salt);
+
+ Assert.assertTrue("Key must be checked", user.checkKey(key, salt));
+
+ }
+
+ @Test
+ public void testDeleteFakeUser() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/users/delete/" + UUID.randomUUID().toString());
+
+ try {
+ this.mvc.perform(get).andExpect(
+ MockMvcResultMatchers.status().isNotFound());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.NOT_FOUND,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ }
+
+ @Test
+ public void testDeleteUserProject() throws Exception {
+
+ MockHttpServletRequestBuilder get = MockMvcRequestBuilders
+ .get("/admin/users/delete/" + this.usersUuids.get(0));
+
+ try {
+ this.mvc.perform(get).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ }
+
+ @Test
+ public void testDoDeleteUserNoKey() throws Exception {
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/delete/"
+ + this.usersUuids.get(USER_NB - 1));
+
+ try {
+ this.mvc.perform(post).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ Assert.assertEquals("Must have same nb of user", USER_NB,
+ this.usersRepository.count());
+
+ }
+
+ @Test
+ public void testDoDeleteUser() throws Exception {
+
+ User user = this.usersList.get(this.usersUuids.get(USER_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = user.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/users/delete/%s?key=%s&salt=%s",
+ this.usersUuids.get(USER_NB - 1), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
+
+ Assert.assertEquals("Must have one less user", USER_NB - 1,
+ this.usersRepository.count());
+
+ user = this.usersRepository.findOne(this.usersUuids
+ .get(USER_NB - 1));
+
+ Assert.assertNull("User " + this.usersUuids.get(USER_NB - 1)
+ + " deleted", user);
+
+ }
+
+ @Test
+ public void testDoDeleteSpaceFake() throws Exception {
+
+ User user = this.usersList.get(this.usersUuids.get(USER_NB - 1));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = user.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/users/delete/%s?key=%s&salt=%s",
+ UUID.randomUUID(), key, salt));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
+
+ Assert.assertEquals("Must have the same nb of user", USER_NB,
+ this.usersRepository.count());
+
+ }
+
+ @Test
+ public void testDoDeleteUserProject() throws Exception {
+
+ User user = this.usersList.get(this.usersUuids.get(0));
+
+ SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
+ rand.setSeed(System.currentTimeMillis());
+ byte[] rawSalt = new byte[50];
+ rand.nextBytes(rawSalt);
+ String salt = Hex.encodeHexString(rawSalt);
+ String key = user.getKey(salt);
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
+ .format("/admin/users/delete/%s?key=%s&salt=%s",
+ this.usersUuids.get(0), key, salt));
+
+ try {
+ this.mvc.perform(post).andExpect(
+ MockMvcResultMatchers.status().isBadRequest());
+ } catch (NestedServletException e) {
+ Assert.assertNotNull("Nested exception must not be null",
+ e.getCause());
+ Assert.assertEquals(
+ "Inner exception must be a HttpClientErrorException",
+ HttpClientErrorException.class, e.getCause().getClass());
+ Assert.assertEquals("Exception error status must be not found",
+ HttpStatus.BAD_REQUEST,
+ ((HttpClientErrorException) e.getCause()).getStatusCode());
+ }
+
+ Assert.assertEquals("Must have the same nb of user", USER_NB,
+ this.usersRepository.count());
+
+ }
+
+ @Test
+ public void testUpdateUserGroups() throws Exception {
+
+ MockHttpServletRequestBuilder post = MockMvcRequestBuilders
+ .post("/admin/users/save");
+ post = post.param("id", this.usersUuids.get(0));
+ post = post.param("title", "New name");
+ post = post.param("description", "New description");
+ post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
+ post = post.param("color", "#ffffff");
+ post = post.param("groups", this.groupsUuids.toArray(new String[UsersAdminControllerTest.GROUP_NB]));
+
+ this.mvc.perform(post)
+ .andExpect(MockMvcResultMatchers.status().isSeeOther())
+ .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
+
+ User user = this.usersRepository.findOne(this.usersUuids.get(0));
+
+ Assert.assertNotNull("Should find user", user);
+ Assert.assertEquals("Title equals", "New name", user.getTitle());
+ Assert.assertEquals("Description equals", "New description",
+ user.getDescription());
+ Assert.assertEquals("Uri equals",
+ "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
+ Assert.assertEquals("Color equals", "#ffffff", user.getColor());
+
+ Assert.assertNotNull("Groups must be set", user.getGroups());
+ Assert.assertEquals("all users must be set", GROUP_NB, user.getGroups().size());
+ Assert.assertTrue("users list must contains all users", this.groupsUuids.containsAll(user.getGroups()));
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/rest/DeserializationTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,143 @@
+package org.iri_research.renkan.test.rest;
+
+import java.io.IOException;
+
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.rest.ObjectMapperProvider;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("models-context.xml")
+public class DeserializationTest {
+
+ private Logger logger = LoggerFactory.getLogger(DeserializationTest.class);
+
+ @Autowired
+ private ObjectMapperProvider objectMapperProvider;
+
+ private String testJSON = "{\n" +
+ " \"users\": [],\n" +
+ " \"nodes\": [\n" +
+ " {\n" +
+ " \"title\": \"node0\",\n" +
+ " \"uri\": \"\",\n" +
+ " \"description\": \"This is node 0\",\n" +
+ " \"position\": {\n" +
+ " \"x\": -90.5,\n" +
+ " \"y\": 235\n" +
+ " },\n" +
+ " \"image\": null,\n" +
+ " \"color\": null,\n" +
+ " \"created_by\": null,\n" +
+ " \"size\": 0,\n" +
+ " \"@id\": \"224d9578-d2a2-4d7d-ae04-9a674a0ecd08\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"title\": \"node1\",\n" +
+ " \"uri\": \"\",\n" +
+ " \"description\": \"This is node 1\",\n" +
+ " \"position\": {\n" +
+ " \"x\": -429.5984204131227,\n" +
+ " \"y\": 98.65856622114218\n" +
+ " },\n" +
+ " \"image\": null,\n" +
+ " \"color\": null,\n" +
+ " \"created_by\": null,\n" +
+ " \"size\": 0,\n" +
+ " \"@id\": \"1b73ea10-e557-443e-b73d-dc00fb63d60c\"\n" +
+ " },\n" +
+ " {\n" +
+ " \"title\": \"node2\",\n" +
+ " \"uri\": \"\",\n" +
+ " \"description\": \"This is node 2\",\n" +
+ " \"position\": {\n" +
+ " \"x\": -496.5,\n" +
+ " \"y\": -86\n" +
+ " },\n" +
+ " \"image\": null,\n" +
+ " \"color\": null,\n" +
+ " \"created_by\": null,\n" +
+ " \"size\": 0,\n" +
+ " \"@id\": \"af5e97b0-2692-4dd2-8726-75a02cf40dff\"\n" +
+ " }\n" +
+ " ],\n" +
+ " \"edges\": [\n" +
+ " {\n" +
+ " \"title\": \"edge0\",\n" +
+ " \"uri\": \"\",\n" +
+ " \"description\": \"This is edge 0\",\n" +
+ " \"from\": \"af5e97b0-2692-4dd2-8726-75a02cf40dff\",\n" +
+ " \"to\": \"1b73ea10-e557-443e-b73d-dc00fb63d60c\",\n" +
+ " \"color\": null,\n" +
+ " \"created_by\": null\n" +
+ " }\n" +
+ " ],\n" +
+ " \"title\": \"Test Deserialization\",\n" +
+ " \"description\": \"Description test deserialization.\",\n" +
+ " \"uri\": null,\n" +
+ " \"color\": \"#ffff01\",\n" +
+ " \"revCounter\": 94,\n" +
+ " \"created\": 1385377361448,\n" +
+ " \"updated\": 1400568565070\n" +
+ "}";
+
+ @Before
+ public void setup() {
+ logger.debug("Setup");
+ }
+
+ @Test
+ public void testDeserialization() throws JsonParseException, JsonMappingException, IOException {
+
+ ObjectMapper mapper = this.objectMapperProvider.getContext(ObjectMapper.class);
+
+ Project p = mapper.readValue(testJSON, Project.class);
+
+ Assert.assertNotNull(p);
+ Assert.assertEquals("Title must be the same", "Test Deserialization", p.getTitle());
+ Assert.assertEquals("Description must be the same", "Description test deserialization.", p.getDescription());
+
+ Assert.assertEquals("Must have 3 nodes", 3, p.getNodes().size());
+ Assert.assertEquals("Must have 1 edge", 1, p.getEdges().size());
+
+ Assert.assertEquals("Edge goes from node node2", "node2", p.getEdges().get(0).getFromNode().getTitle() );
+ Assert.assertEquals("Edge goes to node node1", "node1", p.getEdges().get(0).getToNode().getTitle() );
+ }
+
+ @Test
+ public void testDeserializationId() throws JsonParseException, JsonMappingException, IOException {
+
+ ObjectMapper mapper = this.objectMapperProvider.getContext(ObjectMapper.class);
+
+ Project p = mapper.readValue(testJSON, Project.class);
+
+ Assert.assertNotNull("Project is null",p);
+ Assert.assertNotNull("Project Id is null", p.getId());
+
+ for (Node n : p.getNodes()) {
+ Assert.assertNotNull("Id of node must not be null", n.getId());
+ }
+ for (Edge e : p.getEdges()) {
+ Assert.assertNotNull("Id of edge must not be null", e.getId());
+ }
+ }
+
+ @After
+ public void teardown() {
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,317 @@
+package org.iri_research.renkan.test.rest;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.commons.io.IOUtils;
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.test.JerseyTest;
+import org.iri_research.renkan.models.Edge;
+import org.iri_research.renkan.models.Node;
+import org.iri_research.renkan.models.Project;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.EdgesRepository;
+import org.iri_research.renkan.repositories.NodesRepository;
+import org.iri_research.renkan.repositories.ProjectRevisionsRepository;
+import org.iri_research.renkan.repositories.ProjectsRepository;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.rest.RestApplication;
+import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.Point;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DBCollection;
+import com.mongodb.DBCursor;
+import com.mongodb.DBObject;
+
+//import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("rest-context.xml")
+public class ProjectRestTest extends JerseyTest {
+
+ private Logger logger = LoggerFactory.getLogger(ProjectRestTest.class);
+
+ @Autowired
+ private ProjectsRepository projectsRepository;
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ @Autowired
+ private NodesRepository nodesRepository;
+
+ @Autowired
+ private EdgesRepository edgesRepository;
+
+ @Autowired
+ private ProjectRevisionsRepository projectRevisionsRepository;
+
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ private Project testProject;
+ private List<Node> testNodes = new ArrayList<Node>();
+ private List<Edge> testEdges = new ArrayList<>();
+
+ private DateTime creationDate = new DateTime();
+
+ private String spaceId = UUID.randomUUID().toString();
+ private String projectId = UUID.randomUUID().toString();
+
+ private File tempFile = null;
+
+ private ObjectMapper getObjectMapper() {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JodaModule());
+ return mapper;
+ }
+
+ public ProjectRestTest() {
+ }
+
+ // @Override
+ // protected AppDescriptor configure() {
+ // return new WebAppDescriptor.Builder("org.iri_research.renkan.rest")
+ // .contextPath("rest")
+ // .contextParam("contextConfigLocation",
+ // "classpath:/org/iri_research/renkan/test/rest/rest-context.xml")
+ // .initParam("com.sun.jersey.config.property.packages",
+ // "org.iri_research.renkan.rest")
+ // .servletClass(SpringServlet.class)
+ // .contextListenerClass(ContextLoaderListener.class)
+ // .build();
+ // };
+
+ @Override
+ protected Application configure() {
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ ResourceConfig rc = new RestApplication()
+ .property("contextConfigLocation",
+ "classpath:/org/iri_research/renkan/test/rest/rest-context.xml");
+ rc.setApplicationName("rest");
+ return rc;
+ };
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ Space testSpace = new Space(this.spaceId, "test space", "Test space",
+ null, null, null, "test_user", null, this.creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ testProject = new Project(testSpace.getId(), this.projectId, "test", "desc",
+ "http://localhost:8080/rest/projects/id", this.creationDate);
+
+ for (int i = 0; i < 3; i++) {
+ Node node = new Node("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/nodes/node" + i, "#ffff0" + i,
+ "test_user", new Point(0, i),
+ "http://renkan.org/images/node" + i, i, testProject.getId());
+ node = this.nodesRepository.save(node);
+ testProject.getNodes().add(node);
+ this.testNodes.add(node);
+ }
+
+ for (int i = 0; i < 3; i++) {
+ Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
+ "http://renkan.org/edges/edge" + i, "#ffff0" + i,
+ this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
+ "test_user", testProject.getId());
+ edge = this.edgesRepository.save(edge);
+ testProject.getEdges().add(edge);
+ this.testEdges.add(edge);
+ }
+
+ this.projectsRepository.save(testProject);
+ try {
+ this.tempFile = File.createTempFile("export_json", ".json");
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ @After
+ public void teardown() {
+ logger.debug("Teardown");
+ edgesRepository.deleteAll();
+ nodesRepository.deleteAll();
+ projectRevisionsRepository.deleteAll();
+ projectsRepository.deleteAll();
+ spacesRepository.deleteAll();
+ if(this.tempFile != null) {
+ this.tempFile.deleteOnExit();
+ }
+ }
+
+ @Test
+ public void testGetProject() throws JsonProcessingException, IOException {
+ WebTarget webResource = this.target();
+ String respString = webResource.path("projects")
+ .path(testProject.getId()).request().acceptEncoding("UTF-8").accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
+ Assert.assertNotNull("get resp String not empty", respString);
+ Assert.assertFalse("get resp String non empty", respString.isEmpty());
+
+ PrintWriter writer = new PrintWriter(this.tempFile, "UTF-8");
+ writer.write(respString);
+ writer.close();
+
+ logger.debug("Test get Project : respString : " + respString);
+
+ ObjectMapper mapper = this.getObjectMapper();
+
+ JsonNode projectNode = mapper.readTree(respString);
+
+ Assert.assertNotNull("project node not null", projectNode);
+
+ Assert.assertNotNull("Must have an id", projectNode.get("id"));
+ Assert.assertEquals("id must match", this.projectId, projectNode.get("id").asText());
+ Assert.assertNotNull("Must have a created date", projectNode.get("created"));
+ Assert.assertEquals("creation date must match", this.creationDate.toString(ISODateTimeFormat.dateTime()), projectNode.get("created").asText());
+ }
+
+ @Test
+ public void testDeleteProject() {
+
+ List<Node> nodes = testProject.getNodes();
+ List<Edge> edges = testProject.getEdges();
+
+ WebTarget webResource = this.target();
+ String respString = webResource.path("projects")
+ .path(testProject.getId()).request().delete(String.class);
+
+ Assert.assertTrue("Response text must contain deleted",
+ respString.contains("deleted"));
+ Assert.assertTrue("Response text must contain id",
+ respString.contains(this.testProject.getId()));
+
+ DBObject filter = new BasicDBObject();
+ filter.put("_id", testProject.getId());
+
+ DBCollection coll = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Project.class));
+ DBCursor resFind = coll.find(filter);
+
+ Assert.assertEquals("The project must not be found", 0, resFind.count());
+
+ filter = new BasicDBObject();
+ filter.put("project_id", testProject.getId());
+
+ DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Node.class));
+ resFind = nodesColl.find(filter);
+
+ Assert.assertEquals("no nodes left", 0, resFind.count());
+
+ for (Node n : nodes) {
+ DBObject nobj = nodesColl.findOne(n.getId());
+ Assert.assertNull("node should be deleted", nobj);
+ }
+
+ DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
+ .getCollectionName(Edge.class));
+ resFind = edgesColl.find(filter);
+
+ Assert.assertEquals("no edges left", 0, resFind.count());
+
+ for (Edge e : edges) {
+ DBObject eobj = edgesColl.findOne(e.getId());
+ Assert.assertNull("edge should be deleted", eobj);
+ }
+
+ }
+
+ @Test
+ public void testPostProject() throws IOException {
+ InputStream in = this.getClass().getResourceAsStream("/org/iri_research/renkan/test/rest/test-project.json");
+ StringWriter sw = new StringWriter();
+ IOUtils.copy(in, sw, "utf-8");
+
+ String jsonStr = sw.toString().replaceAll("\\<space_id\\>", this.spaceId);
+
+ WebTarget webResource = this.target();
+ Response resp = webResource.path("projects").request(MediaType.APPLICATION_JSON).post(Entity.entity(jsonStr, MediaType.APPLICATION_JSON), Response.class);
+
+ Assert.assertEquals("Status must be OK", 201, resp.getStatus());
+
+ ObjectMapper mapper = new ObjectMapper();
+ JsonNode node = mapper.readTree(resp.readEntity(String.class));
+
+ Assert.assertNotNull("Must have a project in response", node);
+
+ JsonNode idNode = node.findValue("id");
+ Assert.assertNotNull("Project must have an id", idNode);
+ String id = idNode.asText();
+ Assert.assertNotNull("Project must have an id not null", id);
+ Assert.assertNotEquals("Project must have an id not empty", "", id);
+
+ Iterator<JsonNode> edges = node.get("edges").elements();
+ int totalEdges = 0;
+ while(edges.hasNext()) {
+ ObjectNode edgeNode = (ObjectNode) edges.next();
+ totalEdges++;
+ JsonNode edgeIdNode = edgeNode.get("id");
+ Assert.assertNotNull("Edge must have an id", edgeIdNode);
+ String edgeId = edgeIdNode.asText();
+ Assert.assertNotNull("Edge must have an id not null",edgeId);
+ Assert.assertNotEquals("Edge must have an id not empty", "", edgeId);
+ JsonNode projIdNode = edgeNode.findValue("project_id");
+ Assert.assertNotNull("Edge project id node not null",projIdNode);
+ Assert.assertNotNull("Edge project id not null",projIdNode.asText());
+ Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText());
+ }
+ Assert.assertEquals("Must have one edge", 1, totalEdges);
+
+ Iterator<JsonNode> nodes = node.get("nodes").elements();
+ int totalNodes = 0;
+ while(nodes.hasNext()) {
+ ObjectNode nodeNode = (ObjectNode) nodes.next();
+ totalNodes++;
+ JsonNode nodeIdNode = nodeNode.get("id");
+ Assert.assertNotNull("Edge must have an id", nodeIdNode);
+ String nodeId = nodeIdNode.asText();
+ Assert.assertNotNull("Edge must have an id not null",nodeId);
+ Assert.assertNotEquals("Edge must have an id not empty", "", nodeId);
+ JsonNode projIdNode = nodeNode.findValue("project_id");
+ Assert.assertNotNull("Edge project id node not null",projIdNode);
+ Assert.assertNotNull("Edge project id not null",projIdNode.asText());
+ Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText());
+ }
+ Assert.assertEquals("Must have 2 nodes", 2, totalNodes);
+
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/java/org/iri_research/renkan/test/rest/SpaceRestTest.java Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,890 @@
+package org.iri_research.renkan.test.rest;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.UUID;
+
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.glassfish.jersey.server.ResourceConfig;
+import org.glassfish.jersey.server.model.Resource;
+import org.glassfish.jersey.test.JerseyTest;
+import org.iri_research.renkan.models.Space;
+import org.iri_research.renkan.repositories.SpacesRepository;
+import org.iri_research.renkan.rest.RestApplication;
+import org.iri_research.renkan.rest.SpacesResource;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.joda.JodaModule;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("rest-context.xml")
+public class SpaceRestTest extends JerseyTest {
+
+ private Logger logger = LoggerFactory.getLogger(SpaceRestTest.class);
+
+ @Autowired
+ private SpacesRepository spacesRepository;
+
+ private Map<String, Space> spacesList = new HashMap<String, Space>();
+ private String firstSpaceUUID = null;
+
+ public SpaceRestTest() {
+ }
+
+ // @Override
+ // protected AppDescriptor configure() {
+ // return new WebAppDescriptor.Builder("org.iri_research.renkan.rest")
+ // .contextPath("rest")
+ // .contextParam("contextConfigLocation",
+ // "classpath:/org/iri_research/renkan/test/rest/rest-context.xml")
+ // .initParam("com.sun.jersey.config.property.packages",
+ // "org.iri_research.renkan.rest")
+ // .servletClass(SpringServlet.class)
+ // .contextListenerClass(ContextLoaderListener.class)
+ // .build();
+ // };
+
+ @Override
+ protected Application configure() {
+ TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
+ ResourceConfig rc = new RestApplication()
+ .property("contextConfigLocation",
+ "classpath:/org/iri_research/renkan/test/rest/rest-context.xml");
+ rc.setApplicationName("rest");
+ return rc;
+ };
+
+ @Before
+ public void setup() {
+
+ logger.debug("Setup");
+ spacesRepository.deleteAll();
+ DateTime creationDate = new DateTime();
+ this.firstSpaceUUID = UUID.randomUUID().toString();
+ Space testSpace = new Space(firstSpaceUUID, "test", "Test space", "{}",
+ "http://ldt.iri.centrepompidou.fr", "#ababab", "test_user",
+ "http://ldt.iri.centrepompidou.fr", creationDate);
+ testSpace = spacesRepository.save(testSpace);
+ this.spacesList.put(firstSpaceUUID, testSpace);
+
+ Resource resource = Resource.builder(SpacesResource.class).build();
+ String baseUri = resource.getPath();
+ logger.debug("Path is " + baseUri);
+ for (Resource cres : resource.getChildResources()) {
+ logger.debug(cres.getAllMethods().toString() + " at " + baseUri
+ + "/" + cres.getPath());
+ }
+
+ }
+
+ @After
+ public void teardown() {
+ spacesRepository.deleteAll();
+ }
+
+ @Test
+ public void testSetup() throws JsonProcessingException, IOException {
+
+ WebTarget webTarget = this.target("spaces");
+ String respString = webTarget.request().get(String.class);
+
+ Assert.assertNotNull(
+ "The response string for the list of spaces must not be null",
+ respString);
+
+ logger.debug("RESPONSE : " + respString);
+
+ Assert.assertTrue(
+ "The length of the space list resp. string must be > 0",
+ respString.length() > 0);
+
+ ObjectMapper mapper = getObjectMapper();
+
+ JsonNode spacesList = mapper.readTree(respString);
+
+ Assert.assertTrue("The spaceList must be an array",
+ spacesList.isArray());
+ Assert.assertEquals(
+ "The spaceList length must be = " + this.spacesList.size(),
+ this.spacesList.size(), spacesList.size());
+
+ for (JsonNode jsonNode : spacesList) {
+ Assert.assertTrue("the space must have an id",
+ jsonNode.hasNonNull("id"));
+ String id = jsonNode.get("id").asText();
+ Assert.assertTrue("The id must be in the spacesList",
+ this.spacesList.containsKey(id));
+ Space space = this.spacesList.get(id);
+ Assert.assertNotNull(
+ "The object must in the spacesList must not be null", space);
+
+ }
+
+ }
+
+ @Test
+ public void testTitle() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("_id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a title",
+ jsonNode.hasNonNull("title"));
+ String title = jsonNode.get("title").asText();
+ Assert.assertEquals(
+ "space title must be equals to " + space.getTitle(),
+ space.getTitle(), title);
+ }
+
+ }
+
+ @Test
+ public void testDescription() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a description",
+ jsonNode.hasNonNull("description"));
+ String description = jsonNode.get("description").asText();
+ Assert.assertEquals(
+ "space description must be equals to "
+ + space.getDescription(), space.getDescription(),
+ description);
+ }
+
+ }
+
+ @Test
+ public void testUri() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a uri",
+ jsonNode.hasNonNull("uri"));
+ String uri = jsonNode.get("uri").asText();
+ Assert.assertEquals(
+ "space uri must be equals to " + space.getUri(),
+ space.getUri(), uri);
+ }
+
+ }
+
+ @Test
+ public void testColor() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ mapper.registerModule(new JodaModule());
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a color",
+ jsonNode.hasNonNull("color"));
+ String color = jsonNode.get("color").asText();
+ Assert.assertEquals(
+ "space color must be equals to " + space.getColor(),
+ space.getColor(), color);
+ }
+
+ }
+
+ @Test
+ public void testBinConfig() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a bin_config",
+ jsonNode.hasNonNull("bin_config"));
+ String binConfig = jsonNode.get("bin_config").asText();
+ Assert.assertEquals(
+ "space bin_config must be equals to "
+ + space.getBinConfig(), space.getBinConfig(),
+ binConfig);
+ }
+
+ }
+
+ private ObjectMapper getObjectMapper() {
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.registerModule(new JodaModule());
+ return mapper;
+ }
+
+ @Test
+ public void testCreatedBy() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a created_by",
+ jsonNode.hasNonNull("created_by"));
+ String createdBy = jsonNode.get("created_by").asText();
+ Assert.assertEquals(
+ "space created_by must be equals to "
+ + space.getCreatedBy(), space.getCreatedBy(),
+ createdBy);
+ }
+
+ }
+
+ @Test
+ public void testCreated() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a created",
+ jsonNode.hasNonNull("created"));
+
+ String dateStr = jsonNode.get("created").asText();
+
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime date = fmt.parseDateTime(dateStr);
+
+ Assert.assertEquals("Created date must be the same",
+ space.getCreated(), date);
+
+ }
+
+ }
+
+ @Test
+ public void testImage() throws JsonProcessingException, IOException {
+
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").request()
+ .get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode spacesList = mapper.readTree(respString);
+
+ for (JsonNode jsonNode : spacesList) {
+ String id = jsonNode.get("id").asText();
+ Space space = this.spacesList.get(id);
+
+ Assert.assertTrue("the space must have a image",
+ jsonNode.hasNonNull("image"));
+ String image = jsonNode.get("image").asText();
+ Assert.assertEquals(
+ "space image must be equals to " + space.getImage(),
+ space.getImage(), image);
+ }
+
+ }
+
+ @Test
+ public void testSingleCreated() throws JsonProcessingException, IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ String id = jsonNode.get("id").asText();
+ Assert.assertEquals("id must be equals", space.getId(), id);
+
+ Assert.assertTrue("the space must have a created",
+ jsonNode.hasNonNull("created"));
+
+ String dateStr = jsonNode.get("created").asText();
+
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime date = fmt.parseDateTime(dateStr);
+
+ Assert.assertEquals("Created date must be the same",
+ space.getCreated(), date);
+
+ }
+
+ @Test
+ public void testSingleTitle() throws JsonProcessingException, IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a title",
+ jsonNode.hasNonNull("title"));
+ String title = jsonNode.get("title").asText();
+ Assert.assertEquals(
+ "space title must be equals to " + space.getTitle(),
+ space.getTitle(), title);
+ }
+
+ @Test
+ public void testSingleDescription() throws JsonProcessingException,
+ IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a description",
+ jsonNode.hasNonNull("description"));
+ String description = jsonNode.get("description").asText();
+ Assert.assertEquals(
+ "space description must be equals to " + space.getDescription(),
+ space.getDescription(), description);
+ }
+
+ @Test
+ public void testSingleUri() throws JsonProcessingException, IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a uri",
+ jsonNode.hasNonNull("uri"));
+ String uri = jsonNode.get("uri").asText();
+ Assert.assertEquals("space uri must be equals to " + space.getUri(),
+ space.getUri(), uri);
+ }
+
+ @Test
+ public void testSingleColor() throws JsonProcessingException, IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a color",
+ jsonNode.hasNonNull("color"));
+ String color = jsonNode.get("color").asText();
+ Assert.assertEquals(
+ "space color must be equals to " + space.getColor(),
+ space.getColor(), color);
+ }
+
+ @Test
+ public void testSingleBinConfig() throws JsonProcessingException,
+ IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a bin_config",
+ jsonNode.hasNonNull("bin_config"));
+ String binConfig = jsonNode.get("bin_config").asText();
+ Assert.assertEquals(
+ "space bin_config must be equals to " + space.getBinConfig(),
+ space.getBinConfig(), binConfig);
+ }
+
+ @Test
+ public void testSingleCreatedBy() throws JsonProcessingException,
+ IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a created_by",
+ jsonNode.hasNonNull("created_by"));
+ String createdBy = jsonNode.get("created_by").asText();
+ Assert.assertEquals(
+ "space created_by must be equals to " + space.getCreatedBy(),
+ space.getCreatedBy(), createdBy);
+ }
+
+ @Test
+ public void testSingleImage() throws JsonProcessingException, IOException {
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+ WebTarget WebTarget = this.target();
+ String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON).get(String.class);
+ logger.debug("RESPONSE : " + respString);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(respString);
+
+ Assert.assertTrue("the space must have a image",
+ jsonNode.hasNonNull("image"));
+ String image = jsonNode.get("image").asText();
+ Assert.assertEquals(
+ "space image must be equals to " + space.getImage(),
+ space.getImage(), image);
+ }
+
+ @Test
+ public void testPost() throws JsonProcessingException, IOException {
+
+ String title = "test_post";
+ String description = "test space post";
+ String uri = "http://ldt.iri.centrepompidou.fr/test_post";
+ String color = "#bcbcbc";
+ String image = "http://ldt.iri.centrepompidou.fr/test_post/image";
+ String created = "2013-01-01T01:01:01.001+0000";
+ String expectedCreated = "2013-01-01T01:01:01.001Z";
+ String bin_config = "{name: 'test_post_config'}";
+ String created_by = "test_user_post";
+
+ String spaceJson = String.format("{" + "\"title\":\"%s\","
+ + "\"description\":\"%s\"," + "\"uri\":\"%s\","
+ + "\"color\":\"%s\"," + "\"image\":\"%s\","
+ + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
+ + "\"created_by\":\"%s\"" + "}", title, description, uri,
+ color, image, created, bin_config, created_by);
+
+ WebTarget webTarget = this.target();
+ Response resp = webTarget.path("spaces").request()
+ .accept(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertEquals("Resp status = created : " + respStr,
+ Status.CREATED.getStatusCode(), resp.getStatus());
+ Assert.assertTrue("Resp must be application/json", resp.getMediaType()
+ .isCompatible(MediaType.APPLICATION_JSON_TYPE));
+
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode objNode = mapper.readTree(respStr);
+
+ Assert.assertTrue("the space must have an id", objNode.hasNonNull("id"));
+ String idStr = objNode.get("id").asText();
+ Assert.assertFalse("The id str must not be empty", idStr.length() == 0);
+
+ Assert.assertTrue("the space must have a title",
+ objNode.hasNonNull("title"));
+ String titleStr = objNode.get("title").asText();
+ Assert.assertEquals("space title must be equals to " + title, title,
+ titleStr);
+
+ Assert.assertTrue("the space must have a description",
+ objNode.hasNonNull("description"));
+ String descriptionStr = objNode.get("description").asText();
+ Assert.assertEquals("space description must be equals to "
+ + description, description, descriptionStr);
+
+ Assert.assertTrue("the space must have a uri",
+ objNode.hasNonNull("uri"));
+ String uriStr = objNode.get("uri").asText();
+ Assert.assertEquals("space uri must be equals to " + uri, uri, uriStr);
+
+ Assert.assertTrue("the space must have a color",
+ objNode.hasNonNull("color"));
+ String colorStr = objNode.get("color").asText();
+ Assert.assertEquals("space color must be equals to " + color, color,
+ colorStr);
+
+ Assert.assertTrue("the space must have a bin_config",
+ objNode.hasNonNull("bin_config"));
+ String bin_configStr = objNode.get("bin_config").asText();
+ Assert.assertEquals("space bin_config must be equals to " + bin_config,
+ bin_config, bin_configStr);
+
+ Assert.assertTrue("the space must have a created_by",
+ objNode.hasNonNull("created_by"));
+ String created_byStr = objNode.get("created_by").asText();
+ Assert.assertEquals("space created_by must be equals to " + created_by,
+ created_by, created_byStr);
+
+ Assert.assertTrue("the space must have a created",
+ objNode.hasNonNull("created"));
+ String createdStr = objNode.get("created").asText();
+ Assert.assertEquals("space created must be equals to " + expectedCreated,
+ expectedCreated, createdStr);
+
+ // object must be created
+ Space sp = this.spacesRepository.findOne(idStr);
+
+ Assert.assertNotNull("Space object must be in rep", sp);
+
+ Assert.assertEquals("space title must be equals to " + title, title,
+ sp.getTitle());
+ Assert.assertEquals("space description must be equals to "
+ + description, description, sp.getDescription());
+ Assert.assertEquals("space uri must be equals to " + uri, uri,
+ sp.getUri());
+ Assert.assertEquals("space color must be equals to " + color, color,
+ sp.getColor());
+ Assert.assertEquals("space bin_config must be equals to " + bin_config,
+ bin_config, sp.getBinConfig());
+ Assert.assertEquals("space created_by must be equals to " + created_by,
+ created_by, sp.getCreatedBy());
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime created_date = fmt.parseDateTime(created);
+ Assert.assertEquals("space created must be equals to " + created,
+ created_date, sp.getCreated());
+
+ }
+
+ @Test
+ public void testPostWithId() {
+
+ String id = UUID.randomUUID().toString();
+ String title = "test_post";
+ String description = "test space post";
+ String uri = "http://ldt.iri.centrepompidou.fr/test_post";
+ String color = "#bcbcbc";
+ String image = "http://ldt.iri.centrepompidou.fr/test_post/image";
+ String created = "2013-01-01T01:01:01.001+0000";
+ String bin_config = "{name: 'test_post_config'}";
+ String created_by = "test_user_post";
+
+ String spaceJson = String.format("{" + "\"id\":\"%s\","
+ + "\"title\":\"%s\"," + "\"description\":\"%s\","
+ + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
+ + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
+ + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
+ color, image, created, bin_config, created_by);
+
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").request()
+ .accept(MediaType.APPLICATION_JSON)
+ .post(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertEquals("Resp status = Bad Request : " + respStr,
+ Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+ Assert.assertEquals("Error message", "Id in JSON must not be set", respStr);
+
+ }
+
+ @Test
+ public void testPut() throws JsonProcessingException, IOException {
+
+ String id = this.firstSpaceUUID;
+ String title = "test_post";
+ String description = "test space put";
+ String uri = "http://ldt.iri.centrepompidou.fr/test_put";
+ String color = "#bcbcbc";
+ String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
+ String created = "2013-01-01T01:01:01.001+0000";
+ String bin_config = "{name: 'test_put_config'}";
+ String created_by = "test_user_put";
+
+ String spaceJson = String.format("{" + "\"id\":\"%s\","
+ + "\"title\":\"%s\"," + "\"description\":\"%s\","
+ + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
+ + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
+ + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
+ color, image, created, bin_config, created_by);
+
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request()// type(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON)// .entity(spaceJson)
+ .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
+
+ String respStr = "";
+
+ if (resp.getStatus() != 204) {
+ respStr = resp.readEntity(String.class);
+ }
+
+ Assert.assertEquals("Resp status = created : " + respStr,
+ Status.NO_CONTENT.getStatusCode(), resp.getStatus());
+ Assert.assertNull("Resp type must be null", resp.getMediaType());
+
+ // object must be updated
+ Space sp = this.spacesRepository.findOne(id);
+
+ Assert.assertNotNull("Space object must be in rep", sp);
+
+ Assert.assertEquals("space title must be equals to " + title, title,
+ sp.getTitle());
+ Assert.assertEquals("space description must be equals to "
+ + description, description, sp.getDescription());
+ Assert.assertEquals("space uri must be equals to " + uri, uri,
+ sp.getUri());
+ Assert.assertEquals("space color must be equals to " + color, color,
+ sp.getColor());
+ Assert.assertEquals("space bin_config must be equals to " + bin_config,
+ bin_config, sp.getBinConfig());
+ Assert.assertEquals("space created_by must be equals to " + created_by,
+ created_by, sp.getCreatedBy());
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime created_date = fmt.parseDateTime(created);
+ Assert.assertEquals("space created must be equals to " + created,
+ created_date, sp.getCreated());
+
+ }
+
+ @Test
+ public void testPutWithoutId() {
+
+ String title = "test_put";
+ String description = "test space put";
+ String uri = "http://ldt.iri.centrepompidou.fr/test_put";
+ String color = "#bcbcbc";
+ String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
+ String created = "2013-01-01T01:01:01.001+0000";
+ String bin_config = "{name: 'test_put_config'}";
+ String created_by = "test_user_put";
+
+ String spaceJson = String.format("{" + "\"title\":\"%s\","
+ + "\"description\":\"%s\"," + "\"uri\":\"%s\","
+ + "\"color\":\"%s\"," + "\"image\":\"%s\","
+ + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
+ + "\"created_by\":\"%s\"" + "}", title, description, uri,
+ color, image, created, bin_config, created_by);
+
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.APPLICATION_JSON)
+ .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertEquals("Resp status = Bad Request : " + respStr,
+ Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
+ Assert.assertEquals("Error message",
+ "Id parameter and id in JSON do not match", respStr);
+ }
+
+ @Test
+ public void testPutBadId() {
+
+ String id = UUID.randomUUID().toString();
+ String title = "test_post";
+ String description = "test space put";
+ String uri = "http://ldt.iri.centrepompidou.fr/test_put";
+ String color = "#bcbcbc";
+ String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
+ String created = "2013-01-01T01:01:01.001+0000";
+ String bin_config = "{name: 'test_put_config'}";
+ String created_by = "test_user_put";
+
+ String spaceJson = String.format("{" + "\"id\":\"%s\","
+ + "\"title\":\"%s\"," + "\"description\":\"%s\","
+ + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
+ + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
+ + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
+ color, image, created, bin_config, created_by);
+
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(id)
+ .request(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON)
+ .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertEquals("Resp status = Bad Request : " + respStr,
+ Status.NOT_FOUND.getStatusCode(), resp.getStatus());
+
+ }
+
+ @Test
+ public void testDelete() {
+
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .request().accept(MediaType.TEXT_PLAIN).delete();
+
+ String respStr = resp.readEntity(String.class);
+ URI reqUri = WebTarget.getUriBuilder().path("spaces")
+ .path(this.firstSpaceUUID).build();
+
+ Assert.assertEquals("Status must be deleted : " + respStr,
+ Status.OK.getStatusCode(), resp.getStatus());
+ Assert.assertEquals(
+ String.format("Message must be \"%s deleted\"", reqUri),
+ String.format("%s deleted", reqUri), respStr);
+
+ // object must be updated
+ Space sp = this.spacesRepository.findOne(this.firstSpaceUUID);
+
+ Assert.assertNull("Space object must be in rep", sp);
+
+ }
+
+ @Test
+ public void testSingleGetJsonp() throws JsonProcessingException,
+ IOException {
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .queryParam("callback", "callback_func").request()
+ .accept("application/javascript").get();
+ Assert.assertEquals("return type must be application/javascript",
+ "application/javascript", resp.getMediaType().toString());
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertTrue("resp must start with callback call",
+ respStr.startsWith("callback_func("));
+ Assert.assertTrue("resp must start with callback call",
+ respStr.endsWith(")"));
+
+ String jsonStr = respStr.substring("callback_func(".length(),
+ respStr.length() - 1);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(jsonStr);
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+
+ String id = jsonNode.get("id").asText();
+ Assert.assertEquals("id must be equals", space.getId(), id);
+
+ Assert.assertTrue("the space must have a created",
+ jsonNode.hasNonNull("created"));
+
+ String dateStr = jsonNode.get("created").asText();
+
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime date = fmt.parseDateTime(dateStr);
+
+ Assert.assertEquals("Created date must be the same",
+ space.getCreated(), date);
+
+ Assert.assertEquals("title must be the same", space.getTitle(),
+ jsonNode.get("title").asText());
+
+ }
+
+ @Test
+ public void testSingleGetJsonpAcceptAll() throws JsonProcessingException,
+ IOException {
+ WebTarget WebTarget = this.target();
+ Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
+ .queryParam("callback", "callback_func").request()
+ .accept("*/*").get();
+ Assert.assertEquals("return type must be application/javascript",
+ "application/javascript", resp.getMediaType().toString());
+
+ String respStr = resp.readEntity(String.class);
+
+ Assert.assertTrue("resp must start with callback call",
+ respStr.startsWith("callback_func("));
+ Assert.assertTrue("resp must start with callback call",
+ respStr.endsWith(")"));
+
+ String jsonStr = respStr.substring("callback_func(".length(),
+ respStr.length() - 1);
+ ObjectMapper mapper = getObjectMapper();
+ JsonNode jsonNode = mapper.readTree(jsonStr);
+
+ Space space = this.spacesList.get(this.firstSpaceUUID);
+
+ String id = jsonNode.get("id").asText();
+ Assert.assertEquals("id must be equals", space.getId(), id);
+
+ Assert.assertTrue("the space must have a created",
+ jsonNode.hasNonNull("created"));
+
+ String dateStr = jsonNode.get("created").asText();
+
+ DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
+ DateTime date = fmt.parseDateTime(dateStr);
+
+ Assert.assertEquals("Created date must be the same",
+ space.getCreated(), date);
+
+ Assert.assertEquals("title must be the same", space.getTitle(),
+ jsonNode.get("title").asText());
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration >
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.test">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.springframework.data.mongodb">
+ <level value="DEBUG" />
+ </logger>
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
+ <constructor-arg name="strength" value="10" type="int"/>
+ </bean>
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+
+ <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
+ <property name="basenames">
+ <list>
+ <value>WEB-INF/i18n/messages</value>
+ <value>classpath:org/springframework/security/messages</value>
+ </list>
+ </property>
+ <property name="defaultEncoding" value="UTF-8"/>
+ <property name="fallbackToSystemLocale" value="true" />
+ </bean>
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/controller/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_controller_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/models-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_rest_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/rest-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/test-project.json Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,47 @@
+{
+ "title" : "Project Rest Post Test",
+ "description" : "",
+ "uri" : null,
+ "color" : null,
+ "revCounter" : 6,
+ "nodes" : [ {
+ "@id" : "f286bae5-4303-49c1-8534-43520e117940",
+ "title" : "storytelling",
+ "description" : "Tag 'storytelling'",
+ "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/search/?search=storytelling&field=all",
+ "color" : null,
+ "position" : {
+ "x" : 7.5,
+ "y" : -76.0
+ },
+ "image" : "http://localhost:8080/renkan/static/img/ldt-tag.png",
+ "size" : 0,
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ }, {
+ "@id" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
+ "title" : "Introduction générale par Hidetaka Ishida",
+ "description" : "石田英敬によるイントロダクション (langue française フランス語)",
+ "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/e328e188-ff2f-11e0-b9e1-00145ea49a02/#id=s_A91AB45B-AB6B-EFCA-4A08-40B2F74F294F",
+ "color" : null,
+ "position" : {
+ "x" : -283.5,
+ "y" : 39.0
+ },
+ "image" : "http://localhost:8080/renkan/static/img/ldt-segment.png",
+ "size" : 0,
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ } ],
+ "edges" : [ {
+ "@id" : "15cedd4c-99be-4d83-b849-3ee7d9d26a2c",
+ "title" : "",
+ "description" : "",
+ "uri" : "",
+ "color" : null,
+ "from" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
+ "to" : "f286bae5-4303-49c1-8534-43520e117940",
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ } ],
+ "views" : [ ],
+ "users" : [ ],
+ "space_id" : "<space_id>"
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/settings.gradle Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,8 @@
+rootProject.name = 'renkan'
+include ':renkan-core'
+include ':renkan-web'
+include ':renkan-management'
+
+project(':renkan-core').projectDir = "$rootDir/renkan-core" as File
+project(':renkan-web').projectDir = "$rootDir/renkan-web" as File
+project(':renkan-management').projectDir = "$rootDir/renkan-management" as File
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/main/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration>
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.beans.factory">
+ <level value="INFO" />
+ </logger>
+ <!--logger name="org.cometd">
+ <level value="DEBUG" />
+ </logger-->
+ <!--logger name="org.coweb">
+ <level value="DEBUG" />
+ </logger-->
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/main/webapp/WEB-INF/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
+
+ <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
+ <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="${mongodb.db.name}"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/main/webapp/WEB-INF/renkan.properties Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,11 @@
+mongodb.host.name = localhost
+mongodb.host.port = 27017
+mongodb.db.name = renkan
+
+user.admin.name = admin
+#user.admin.password = admin
+user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
+
+renkan.pagination.size = 2
+renkan.coweb.debug = false
+renkan.coweb.websocket = true
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/log4j.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
+<!DOCTYPE log4j:configuration >
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
+ </layout>
+ </appender>
+ <logger name="org.iri_research.renkan">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.eclipse.jetty.util.log">
+ <level value="INFO" />
+ </logger>
+ <logger name="org.springframework.test">
+ <level value="DEBUG" />
+ </logger>
+ <logger name="org.springframework.data.mongodb">
+ <level value="DEBUG" />
+ </logger>
+ <root>
+ <priority value ="WARN" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
+ <constructor-arg name="strength" value="10" type="int"/>
+ </bean>
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+
+ <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
+ <property name="basenames">
+ <list>
+ <value>WEB-INF/i18n/messages</value>
+ <value>classpath:org/springframework/security/messages</value>
+ </list>
+ </property>
+ <property name="defaultEncoding" value="UTF-8"/>
+ <property name="fallbackToSystemLocale" value="true" />
+ </bean>
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/controller/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_controller_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/models/models-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.models" />
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/models/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_models_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/repositories/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_repo_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/rest/mongo-config.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:p="http://www.springframework.org/schema/p"
+ xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:jpa="http://www.springframework.org/schema/data/jpa"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/data/mongo
+ http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+ <!-- Default bean name is 'mongo' -->
+ <mongo:mongo host="localhost" port="27017"/>
+
+ <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
+ <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+ <constructor-arg ref="mongo"/>
+ <constructor-arg value="renkan_rest_test"/>
+ <property name="writeResultChecking" value="EXCEPTION"/>
+ </bean>
+
+ <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
+
+</beans>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/rest/rest-context.xml Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context-3.2.xsd">
+
+ <!-- Activates various annotations to be detected in bean classes -->
+ <context:annotation-config />
+
+ <!-- Configures the annotation-driven Spring MVC Controller programming model.
+ Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
+
+ <!-- Loads MongoDB configuraton -->
+ <import resource="mongo-config.xml"/>
+
+ <bean id="springConfigurer"
+ class="org.iri_research.renkan.coweb.SpringConfigurer"
+ factory-method="getInstance" />
+
+ <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
+ For example @Controller and @Service. Make sure to set the correct base-package-->
+ <context:component-scan base-package="org.iri_research.renkan.rest" />
+ <context:component-scan base-package="org.iri_research.renkan.coweb" />
+
+</beans>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/server/java/src/test/resources/org/iri_research/renkan/test/rest/test-project.json Mon Jul 21 14:48:01 2014 +0200
@@ -0,0 +1,47 @@
+{
+ "title" : "Project Rest Post Test",
+ "description" : "",
+ "uri" : null,
+ "color" : null,
+ "revCounter" : 6,
+ "nodes" : [ {
+ "@id" : "f286bae5-4303-49c1-8534-43520e117940",
+ "title" : "storytelling",
+ "description" : "Tag 'storytelling'",
+ "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/search/?search=storytelling&field=all",
+ "color" : null,
+ "position" : {
+ "x" : 7.5,
+ "y" : -76.0
+ },
+ "image" : "http://localhost:8080/renkan/static/img/ldt-tag.png",
+ "size" : 0,
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ }, {
+ "@id" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
+ "title" : "Introduction générale par Hidetaka Ishida",
+ "description" : "石田英敬によるイントロダクション (langue française フランス語)",
+ "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/e328e188-ff2f-11e0-b9e1-00145ea49a02/#id=s_A91AB45B-AB6B-EFCA-4A08-40B2F74F294F",
+ "color" : null,
+ "position" : {
+ "x" : -283.5,
+ "y" : 39.0
+ },
+ "image" : "http://localhost:8080/renkan/static/img/ldt-segment.png",
+ "size" : 0,
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ } ],
+ "edges" : [ {
+ "@id" : "15cedd4c-99be-4d83-b849-3ee7d9d26a2c",
+ "title" : "",
+ "description" : "",
+ "uri" : "",
+ "color" : null,
+ "from" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
+ "to" : "f286bae5-4303-49c1-8534-43520e117940",
+ "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
+ } ],
+ "views" : [ ],
+ "users" : [ ],
+ "space_id" : "<space_id>"
+}
\ No newline at end of file
--- a/server/pom.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan</artifactId>
- <packaging>pom</packaging>
- <version>0.7.11</version>
- <name>Renkan project</name>
-
- <modules>
- <module>renkan-core</module>
- <module>renkan-web</module>
- <module>renkan-management</module>
- </modules>
-
- <build>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-</project>
--- a/server/renkan-core/build.gradle Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,36 +0,0 @@
-
-description = 'renkan-core'
-
-repositories {
- mavenCentral()
-}
-
-ext {
- commons_collections_version = '4.0'
- uuid_generator_version = '3.1.3'
-}
-
-dependencies {
- compile group: 'javax.inject', name: 'javax.inject', version:java_inject_version
- compile group: 'commons-codec', name: 'commons-codec', version:commons_codec_version
- compile group: 'org.apache.commons', name: 'commons-collections4', version:commons_collections_version
- compile group: 'com.fasterxml.uuid', name: 'java-uuid-generator', version:uuid_generator_version
- compile group: 'joda-time', name: 'joda-time', version:joda_time_version
- compile group: 'org.springframework', name: 'spring-core', version:spring_version
- compile group: 'org.springframework', name: 'spring-beans', version:spring_version
- compile group: 'org.springframework', name: 'spring-jdbc', version:spring_version
- compile group: 'org.springframework', name: 'spring-context', version:spring_version
- compile group: 'org.springframework.data', name: 'spring-data-commons', version:spring_data_commons_version
- compile group: 'org.springframework.data', name: 'spring-data-jpa', version:spring_data_jpa_version
- compile group: 'org.springframework.data', name: 'spring-data-mongodb', version:spring_data_mongodb_version
- compile group: 'org.springframework.security', name: 'spring-security-core', version:spring_security_version
- compile group: 'javax.persistence', name: 'persistence-api', version:persistence_api_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:jackson_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:jackson_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:jackson_version
- compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version:jackson_version
- compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-joda', version:jackson_version
- compile group: 'org.mongodb', name: 'mongo-java-driver', version:mongo_java_driver_version
- testCompile group: 'org.springframework', name: 'spring-test', version:spring_version
- testRuntime group: 'org.slf4j', name: 'slf4j-log4j12', version:slf4j_log4j12_version
-}
--- a/server/renkan-core/pom.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,203 +0,0 @@
-<?xml version="1.0"?>
-<project
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
- xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan</artifactId>
- <version>0.7.11</version>
- </parent>
- <artifactId>renkan-core</artifactId>
- <name>renkan-core</name>
- <url>http://maven.apache.org</url>
- <properties>
- <spring-version>3.2.6.RELEASE</spring-version>
- <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
- <spring-data-commons-version>1.6.3.RELEASE</spring-data-commons-version>
- <spring-data-jpa-version>1.4.3.RELEASE</spring-data-jpa-version>
- <mongo-driver-version>2.11.4</mongo-driver-version>
- <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
- <javax-persistence-api-version>1.0.2</javax-persistence-api-version>
- <javax-inject-version>1</javax-inject-version>
- <commons-codec-version>1.8</commons-codec-version>
- <fasterxml-java-uuid-generator-version>3.1.3</fasterxml-java-uuid-generator-version>
- <joda-version>2.3</joda-version>
- <jackson-version>2.2.3</jackson-version>
- <spring-security-version>3.2.0.RELEASE</spring-security-version>
- <commons-collections-version>4.0</commons-collections-version>
- <junit-version>4.11</junit-version>
- <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
- <repositories>
- <repository>
- <id>spring-maven-release</id>
- <name>Spring Maven Release Repository</name>
- <url>http://maven.springframework.org/release</url>
- </repository>
- <repository>
- <id>spring-maven-milestone</id>
- <name>Spring Maven MILESTONE Repository</name>
- <url>http://maven.springframework.org/milestone</url>
- </repository>
- <repository>
- <id>spring-release</id>
- <name>Spring Maven SNAPSHOT Repository</name>
- <url>http://repo.springsource.org/release</url>
- </repository>
- <repository>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <id>central</id>
- <name>libs-release</name>
- <url>http://repo.springsource.org/libs-release</url>
- </repository>
- </repositories>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <archive>
- <index>true</index>
- </archive>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>javax.inject</groupId>
- <artifactId>javax.inject</artifactId>
- <version>${javax-inject-version}</version>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>${commons-codec-version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-collections4</artifactId>
- <version>${commons-collections-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.uuid</groupId>
- <artifactId>java-uuid-generator</artifactId>
- <version>${fasterxml-java-uuid-generator-version}</version>
- </dependency>
- <dependency>
- <groupId>joda-time</groupId>
- <artifactId>joda-time</artifactId>
- <version>${joda-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-commons</artifactId>
- <version>${spring-data-commons-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-jpa</artifactId>
- <version>${spring-data-jpa-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-mongodb</artifactId>
- <version>${spring-data-mongodb-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-core</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.persistence</groupId>
- <artifactId>persistence-api</artifactId>
- <version>${javax-persistence-api-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.jaxrs</groupId>
- <artifactId>jackson-jaxrs-json-provider</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.datatype</groupId>
- <artifactId>jackson-datatype-joda</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>${junit-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>${mongo-driver-version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j-log4j12-version}</version>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-</project>
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/Constants.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-package org.iri_research.renkan;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import com.fasterxml.uuid.EthernetAddress;
-import com.fasterxml.uuid.Generators;
-import com.fasterxml.uuid.NoArgGenerator;
-
-public class Constants {
-
- public final static String KEYHEX = "f2338d2299ac28ef64f82956fde37337b87a2b9e8fc03e28fa0768cac37d838113c7d0fc78c60fce1e23b1b3e03ac7db4676b3189c267f26baaab10f72544441";
- public final static int SALT_LENGTH = 24;
- public final static int PAGINATION_SIZE = 10;
- public final static String PROPERTIES_SERVLET_CONTEXT_NAME = "renkan.properties";
- public final static String PROPERTIES_CLASSPATH_NAME = "renkan_run.properties";
- public final static String ANONYMOUS_USER_BASE_NAME = "Anonymous";
-
- private final static EthernetAddress ETHERNET_ADRESS = EthernetAddress
- .fromInterface();
- public final static NoArgGenerator UUID_GENERATOR = Generators
- .timeBasedGenerator(ETHERNET_ADRESS);
-
- public enum EditMode {
- READ_ONLY(1), EDITION(2);
-
- private int value;
-
- private final static EditMode[] editModeValues = EditMode.values();
-
- private EditMode(int i) {
- this.value = i;
- }
-
- public static EditMode fromInt(int val) {
- for (int i = 0; i < editModeValues.length; i++) {
- if (editModeValues[i].value == val) {
- return editModeValues[i];
- }
- }
- return null;
- }
- }
-
-
- public final static String ROLE_USER = "ROLE_USER";
-
- public final static List<String> USER_ROLES_SELECT = Collections
- .unmodifiableList(new ArrayList<String>() {
- private static final long serialVersionUID = -3041530185134732199L;
- {
- add("ROLE_ADMIN");
- add("ROLE_SPACES_ADMIN");
- add("ROLE_GROUPS_ADMIN");
- }
- });
-
- public final static List<String> USER_ROLES_ALL = Collections
- .unmodifiableList(new ArrayList<String>() {
- private static final long serialVersionUID = -3041530185134732199L;
- {
- add(ROLE_USER);
- addAll(USER_ROLES_SELECT);
- }
- });
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/RenkanException.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-package org.iri_research.renkan;
-
-public class RenkanException extends Exception {
-
- /**
- *
- */
- private static final long serialVersionUID = -6952770322990047437L;
-
- public RenkanException() {
- }
-
- public RenkanException(String message) {
- super(message);
- }
-
- public RenkanException(Throwable exc) {
- super(exc);
- }
-
- public RenkanException(String message, Throwable exc) {
- super(message, exc);
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/RenkanProperties.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-package org.iri_research.renkan;
-
-import java.util.Properties;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Named
-public class RenkanProperties {
-
- @Resource(name = "renkanProperties")
- private Properties properties;
-
- private final Logger logger = LoggerFactory
- .getLogger(RenkanProperties.class);
-
- private static volatile RenkanProperties instance = null;
-
- private RenkanProperties() {
- this.logger.debug("Building RenkanProperties");
- }
-
- public static RenkanProperties getInstance() {
- if (instance == null) {
- synchronized (RenkanProperties.class) {
- if (instance == null) {
- instance = new RenkanProperties();
- }
- }
- }
- return instance;
- }
-
- public int getPaginationSize() {
- return Integer.parseInt(properties.getProperty(
- "renkan.pagination.size",
- Integer.toString(Constants.PAGINATION_SIZE)));
- }
-
- public String getProperty(String name, String defaultVal) {
- return properties.getProperty(name, defaultVal);
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/RenkanRuntimeException.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-package org.iri_research.renkan;
-
-public class RenkanRuntimeException extends RuntimeException {
-
- /**
- *
- */
- private static final long serialVersionUID = 736470650035855769L;
-
- public RenkanRuntimeException() {
- }
-
- public RenkanRuntimeException(String message) {
- super(message);
- }
-
- public RenkanRuntimeException(Throwable exc) {
- super(exc);
- }
-
- public RenkanRuntimeException(String message, Throwable exc) {
- super(message, exc);
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/AbstractRenkanModel.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,152 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.io.Serializable;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.RenkanException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-public abstract class AbstractRenkanModel<ID extends Serializable> implements
- IRenkanModel<ID> {
-
- @SuppressWarnings("unused")
- private static Logger logger = LoggerFactory.getLogger(AbstractRenkanModel.class);
-
- public AbstractRenkanModel(ID id, String title, String description,
- String uri, String color) {
- super();
- this.id = id;
- this.idSet = true;
- this.title = title;
- this.description = description;
- this.uri = uri;
- this.color = color;
- }
-
- protected AbstractRenkanModel() {
- }
-
- protected ID id = this.getDefaultId();
- @JsonIgnore
- protected boolean idSet = false;
- protected String title;
- protected String description;
- protected String uri;
- protected String color;
-
- @Override
- public String getTitle() {
- return this.title;
- }
-
- @Override
- public String getDescription() {
- return this.description;
- }
-
- @Override
- public String getUri() {
- return this.uri;
- }
-
- @Override
- public String getColor() {
- return this.color;
- }
-
- @Override
- public ID getId() {
- return this.id;
- }
-
- @Override
- public void setId(ID id) {
- this.idSet = true;
- this.id = id;
- }
-
- @JsonIgnore
- @Override
- public boolean isIdSet() {
- return this.idSet;
- };
-
- @Override
- public void setTitle(String title) {
- this.title = title;
- }
-
- @Override
- public void setDescription(String description) {
- this.description = description;
- }
-
- @Override
- public void setUri(String uri) {
- this.uri = uri;
- }
-
- @Override
- public void setColor(String color) {
- this.color = color;
- }
-
- abstract protected String getRawKeyPart();
- abstract protected ID getDefaultId();
-
- private String getRawKey(String salt) {
- StringBuffer key = new StringBuffer(salt != null ? salt + "|" : "");
- key.append(this.getId());
- key.append('|');
- key.append(this.getRawKeyPart());
- return key.toString();
- }
-
- public String getKey(String salt) throws RenkanException {
-
- String rawKey = this.getRawKey(salt);
-
- MessageDigest md;
- try {
- md = MessageDigest.getInstance("SHA-256");
- } catch (NoSuchAlgorithmException e) {
- throw new RenkanException("NoSuchAlgorithmException digest: "
- + e.getMessage(), e);
- }
- String key;
- final SecretKeySpec secret_key = new SecretKeySpec(
- Constants.KEYHEX.getBytes(), "HmacSHA256");
- md.update(secret_key.getEncoded());
- try {
- key = Hex.encodeHexString(md.digest(rawKey.getBytes("UTF-8")));
- } catch (UnsupportedEncodingException e) {
- throw new RenkanException("UnsupportedEncodingException digest: "
- + e.getMessage(), e);
- }
-
- return key;
- }
-
- public boolean checkKey(String key, String salt) throws RenkanException {
-
- if (key == null || key.isEmpty()) {
- return false;
- }
-
- String signature = key;
-
- String new_key = this.getKey(salt);
-
- return new_key.equals(signature);
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/Edge.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.mapping.DBRef;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
-
-@Document(collection = "edges")
-@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
-public class Edge extends AbstractRenkanModel<String> {
-
- @DBRef
- private Node from;
-
- @DBRef
- private Node to;
-
- @Field("project_id")
- @JsonProperty("project_id")
- private String projectId;
-
- @Field("created_by")
- @JsonProperty("created_by")
- private String createdBy;
-
- @SuppressWarnings("unused")
- private Edge() {
- }
-
- public Edge(Edge edge, Node from, Node to, String projectId) {
- this(Constants.UUID_GENERATOR.generate().toString(), edge.title,
- edge.description, edge.uri, edge.color, from, to,
- edge.createdBy, projectId);
- }
-
- public Edge(Edge edge) {
- this(edge, edge.from, edge.to, edge.projectId);
- }
-
- @Autowired(required = true)
- public Edge(String id, String title, String description, String uri,
- String color, Node from, Node to, String createdBy, String projectId) {
- super(id, title, description, uri, color);
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- this.from = from;
- this.to = to;
- this.createdBy = createdBy;
- this.projectId = projectId;
- }
-
- @JsonProperty("project_id")
- public String getProjectId() {
- return projectId;
- }
-
- public void setProjectId(String projectId) {
- this.projectId = projectId;
- }
-
- public String getCreatedBy() {
- return createdBy;
- }
-
- @JsonIgnore
- public Node getFromNode() {
- return this.from;
- }
-
- public String getFrom() {
- if (this.from != null) {
- return this.from.id;
- } else {
- return null;
- }
- }
-
- @JsonIgnore
- public Node getToNode() {
- return this.to;
- }
-
- public String getTo() {
- if (this.to != null) {
- return this.to.id;
- } else {
- return null;
- }
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.createdBy;
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/Group.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-import org.springframework.data.mongodb.core.mapping.Document;
-
-@Document(collection = "groups")
-public class Group extends AbstractRenkanModel<String> {
-
- private String avatar;
- private Set<String> users = new TreeSet<>();
-
- public Group() {
- }
-
- public Group(String id, String title, String description, String uri,
- String color) {
- super(id, title, description, uri, color);
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- }
-
- public String getAvatar() {
- return avatar;
- }
-
- public void setAvatar(String avatar) {
- this.avatar = avatar;
- }
-
- public String getGroupName() {
- return this.getTitle();
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.id;
- }
-
- public Set<String> getUsers() {
- if(this.users == null) {
- this.users = new TreeSet<>();
- }
- return this.users;
- }
-
-
- public boolean addUser(User user) {
- return this.addUser(user.getId());
- }
-
- public boolean addUser(String userId) {
- return this.getUsers().add(userId);
- }
-
- public boolean removeUser(User user) {
- return this.removeUser(user.getId());
- }
-
- public boolean removeUser(String userId) {
- if(this.getUsers() != null) {
- return this.getUsers().remove(userId);
- }
- return false;
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/IRenkanModel.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,44 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.io.Serializable;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.RenkanRuntimeException;
-
-public interface IRenkanModel<ID extends Serializable> {
-
- public ID getId();
-
- /**
- * Set the object id. This method must throw a RenkanException if the
- * current object id is not null
- *
- * @param id
- * @throws RenkanRuntimeException
- * if the current id is not null
- */
- public void setId(ID id);
-
- public boolean isIdSet();
-
- public String getTitle();
-
- public String getDescription();
-
- public String getUri();
-
- public String getColor();
-
- public void setTitle(String title);
-
- public void setDescription(String description);
-
- public void setUri(String uri);
-
- public void setColor(String color);
-
- public String getKey(String salt) throws RenkanException;
-
- public boolean checkKey(String key, String salt) throws RenkanException;
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/Node.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import com.fasterxml.jackson.annotation.JsonIdentityInfo;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.ObjectIdGenerators;
-
-@Document(collection = "nodes")
-@JsonIdentityInfo(generator=ObjectIdGenerators.UUIDGenerator.class, property="@id")
-public class Node extends AbstractRenkanModel<String> {
-
- public Node(Node node, String projectId) {
- this(Constants.UUID_GENERATOR.generate().toString(), node.title,
- node.description, node.uri, node.color, node.createdBy,
- node.position, node.image, node.size, projectId);
- }
-
- public Node(Node node) {
- this(node, node.projectId);
- }
-
- @SuppressWarnings("unused")
- private Node() {
- }
-
- @Autowired(required = true)
- public Node(String id, String title, String description, String uri,
- String color, String createdBy, Point position, String image,
- Integer size, String projectId) {
- super(id, title, description, uri, color);
-
- this.projectId = projectId;
- this.createdBy = createdBy;
- this.position = position;
- this.image = image;
- this.size = (size == null) ? 0 : size.intValue();
- }
-
- @Field("project_id")
- @JsonProperty("project_id")
- private String projectId = null;
-
- @Field("created_by")
- @JsonProperty("created_by")
- private String createdBy = null;
-
- private Point position = null;
-
- private String image;
-
- private int size;
-
- public Point getPosition() {
- return position;
- }
-
- public String getImage() {
- return image;
- }
-
- @JsonProperty("project_id")
- public String getProjectId() {
- return projectId;
- }
-
- public void setProjectId(String projectId) {
- this.projectId = projectId;
- }
-
- @JsonProperty("created_by")
- public String getCreatedBy() {
- return createdBy;
- }
-
- public int getSize() {
- return size;
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.createdBy;
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/Project.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,280 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.Constants.EditMode;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.utils.ColorGenerator;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.mapping.DBRef;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Document(collection = "projects")
-public class Project extends AbstractRenkanModel<String> {
-
- private static Logger logger = LoggerFactory.getLogger(Project.class);
-
- @Field("rev_counter")
- private int revCounter = 1;
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private DateTime created;
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private DateTime updated;
-
- // Space
- @Field("space_id")
- @JsonProperty("space_id")
- private String spaceId = null;
-
- // Nodes
- @DBRef
- private List<Node> nodes = new ArrayList<Node>();
-
- // edges
- @DBRef
- private List<Edge> edges = new ArrayList<Edge>();
-
- //views
- private List<View> views = new ArrayList<View>();
-
- // Users
- private List<RenkanUser> users = new ArrayList<RenkanUser>();
-
- public Project(Project project) {
- this(project.spaceId, Constants.UUID_GENERATOR.generate().toString(),
- project.title, project.description, project.uri, new DateTime());
-
- Map<String, Node> nodeCloneMap = new HashMap<String, Node>(
- project.nodes.size());
- for (Node node : project.nodes) {
- Node newNode = new Node(node, this.id);
- this.nodes.add(newNode);
- nodeCloneMap.put(node.id, newNode);
- }
-
- for (Edge edge : project.edges) {
- this.edges.add(new Edge(edge, nodeCloneMap.get(edge.getFrom()),
- nodeCloneMap.get(edge.getTo()), this.id));
- }
- for (RenkanUser user : project.users) {
- this.users.add(new RenkanUser(user));
- }
- }
-
- public Project(String spaceId, String id, String title, String description,
- String uri, DateTime created, int revCounter) {
- super(id, title, description, uri, null);
-
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- this.revCounter = revCounter;
- this.spaceId = spaceId;
- this.created = created;
- if (this.created == null) {
- this.created = new DateTime();
- }
- this.setUpdated(new DateTime());
- }
-
- @Autowired(required = true)
- public Project(String spaceId, String id, String title, String description,
- String uri, DateTime created) {
- this(spaceId, id, title, description, uri, created, 1);
- logger.debug("partial constructor used");
- }
-
- @SuppressWarnings("unused")
- private Project() {
- }
-
- public int getRevCounter() {
- return this.revCounter;
- }
-
- public List<Node> getNodes() {
- return this.nodes;
- }
-
- public List<Edge> getEdges() {
- return this.edges;
- }
-
- public List<View> getViews() {
- return this.views;
- }
-
- public List<RenkanUser> getUsers() {
- return this.users;
- }
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- public DateTime getCreated() {
- return created;
- }
-
- public void setCreated(DateTime date) {
- this.created = date;
-
- }
-
- @JsonProperty("space_id")
- public String getSpaceId() {
- return spaceId;
- }
-
- private String getRawKey(String prefix, Constants.EditMode editMode) {
- StringBuffer key = new StringBuffer(prefix != null ? prefix + "|" : "");
- key.append(this.getId());
- key.append('|');
- key.append(this.getSpaceId());
- key.append('|');
- key.append(this.getCreated().getMillis());
- key.append('|');
- key.append(editMode.toString());
- return key.toString();
- }
-
- public String getKey(int editMode) throws RenkanException {
- return this.getKey(EditMode.fromInt(editMode));
- }
-
- public String getKey(Constants.EditMode editMode) throws RenkanException {
-
- String rawKey = this.getRawKey("", editMode);
-
- MessageDigest md;
- try {
- md = MessageDigest.getInstance("SHA-256");
- } catch (NoSuchAlgorithmException e) {
- throw new RenkanException("NoSuchAlgorithmException digest: "
- + e.getMessage(), e);
- }
- String key;
- final SecretKeySpec secret_key = new SecretKeySpec(
- Constants.KEYHEX.getBytes(), "HmacSHA256");
- md.update(secret_key.getEncoded());
- try {
- key = Hex.encodeHexString(md.digest(rawKey.getBytes("UTF-8")));
- } catch (UnsupportedEncodingException e) {
- throw new RenkanException("UnsupportedEncodingException digest: "
- + e.getMessage(), e);
- }
-
- return key;
- }
-
- public boolean checkKey(String key, Constants.EditMode editMode)
- throws RenkanException {
-
- if (key == null || key.isEmpty()) {
- return false;
- }
-
- String signature = key;
-
- String new_key = this.getKey(editMode);
-
- return new_key.equals(signature);
- }
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- public DateTime getUpdated() {
- return updated;
- }
-
- public void setUpdated(DateTime updated) {
- this.updated = updated;
- }
-
- public void addUser(User user) {
-
- if (user == null) {
- // we add an anonymous user
- // find an unique user name
- this.addUser(null, null);
- } else {
- // if user is already in list do nothing
- for (RenkanUser renkanUser : this.users) {
- if (renkanUser.getUserId() != null
- && renkanUser.getUserId().equals(user.getId())) {
- return;
- }
- }
- // user not found
- this.users.add(new RenkanUser(this.getId(), user.getId(), user
- .getColor(), user.getUsername()));
-
- }
-
- }
-
- public void addUser(String username, String color) {
-
- if (username == null) {
- // find a new username
- int i = 0;
- boolean usernameFound = true;
- while (i++ < 1000000 && usernameFound) {
- username = String.format("%s-%s",
- Constants.ANONYMOUS_USER_BASE_NAME, i);
- usernameFound = false;
- for (RenkanUser renkanUser : this.users) {
- if (username.equals(renkanUser.getUsername())) {
- usernameFound = true;
- break;
- }
- }
- }
- }
-
- if (color == null) {
- int i = 0;
- boolean colorFound = true;
- while (i++ < 10000000 && colorFound) {
- color = "#" + ColorGenerator.randomColorHex();
- colorFound = false;
- for (RenkanUser renkanUser : this.users) {
- if (username.equals(renkanUser.getUsername())) {
- colorFound = true;
- break;
- }
- }
- }
- }
-
- RenkanUser ruser = new RenkanUser(this.getId(), null, color, username);
- this.users.add(ruser);
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.getId() + Long.toString(this.getCreated().getMillis());
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/ProjectRevision.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.bson.types.ObjectId;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.data.mongodb.core.mapping.DBRef;
-import org.springframework.data.mongodb.core.mapping.Document;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-@Document(collection = "projectRevisions")
-public class ProjectRevision extends AbstractRenkanModel<ObjectId> {
-
- @SuppressWarnings("unused")
- private static Logger logger = LoggerFactory
- .getLogger(ProjectRevision.class);
-
- private int revision;
-
- @DBRef
- private Project project;
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private DateTime created;
-
- // Nodes
- private List<Node> nodes = new ArrayList<Node>();
-
- // Edgess
- private List<Edge> edges = new ArrayList<Edge>();
-
- @SuppressWarnings("unused")
- private ProjectRevision() {
- super();
- }
-
- public ProjectRevision(String title, String description, String uri,
- Project project, int revision, Date created) {
- this(null, title, description, uri, project, revision, created);
- }
-
- public ProjectRevision(ObjectId id, String title, String description,
- String uri, Project project, int revision, Date created) {
- super(id, title, description, uri, null);
- if(this.id == null) {
- this.id = new ObjectId();
- }
- this.project = project;
- this.revision = revision;
- if (created == null) {
- this.created = new DateTime(System.currentTimeMillis());
- }
- }
-
- public int getRevision() {
- return revision;
- }
-
- public Project getProject() {
- return project;
- }
-
- public List<Node> getNodes() {
- return nodes;
- }
-
- public List<Edge> getEgdes() {
- return edges;
- }
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- public DateTime getCreated() {
- return created;
- }
-
- @Override
- protected String getRawKeyPart() {
- return Long.toString(this.getCreated().getMillis());
- }
-
- @Override
- protected ObjectId getDefaultId() {
- return new ObjectId();
- }
-
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/ProjectSync.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-package org.iri_research.renkan.models;
-
-import org.bson.types.ObjectId;
-import org.joda.time.DateTime;
-import org.springframework.data.mongodb.core.mapping.DBRef;
-import org.springframework.data.mongodb.core.mapping.Document;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-@Document(collection = "projectSyncs")
-public class ProjectSync {
-
- private ObjectId id;
-
- private String data;
-
- @DBRef
- private Project project;
-
- private int revision;
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private DateTime created;
-
- private String user;
-
- public ProjectSync(ObjectId id, String data, Project project, int revision,
- DateTime created, String user) {
- this.id = id;
- this.data = data;
- this.project = project;
- this.revision = revision;
- this.created = created;
- this.user = user;
- if (this.created == null) {
- this.created = new DateTime(System.currentTimeMillis());
- }
- }
-
- public ObjectId getId() {
- return id;
- }
-
- public String getData() {
- return data;
- }
-
- public Project getProject() {
- return project;
- }
-
- public int getRevision() {
- return revision;
- }
-
- public String getUser() {
- return user;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/RenkanSessionModeratorState.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public enum RenkanSessionModeratorState {
- INSTANCE;
-
- private Map<String, String> usersActivationMap = new HashMap<String, String>();
- private Map<String, List<String>> projectsActivationMap = new HashMap<String, List<String>>();
- private Map<String, List<RosterUser>> projectsUsersList = new HashMap<String, List<RosterUser>>();
-
- public Map<String, String> getUsersActivationMap() {
- return usersActivationMap;
- }
-
- public Map<String, List<String>> getProjectsActivationMap() {
- return projectsActivationMap;
- }
-
- public Map<String, List<RosterUser>> getProjectsUsersList() {
- return projectsUsersList;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/RenkanUser.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-package org.iri_research.renkan.models;
-
-import org.springframework.data.mongodb.core.mapping.Field;
-
-public class RenkanUser {
-
- @Field(value = "user_id")
- private String userId;
- private String color;
- private String username;
-
- @SuppressWarnings("unused")
- private RenkanUser() {
- }
-
- public RenkanUser(String projectId, String userId, String color,
- String username) {
- this.userId = userId;
- this.color = color;
- this.username = username;
- }
-
- public RenkanUser(RenkanUser user) {
- if (user != null) {
- this.setUserId(user.getUserId());
- this.setColor(user.getColor());
- this.setUsername(user.getUsername());
- }
- }
-
- @Field(value = "user_id")
- public String getUserId() {
- return userId;
- }
-
- @Field(value = "user_id")
- public void setUserId(String userId) {
- this.userId = userId;
- }
-
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public boolean isAnonymous() {
- return this.getUserId() == null;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/RosterUser.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class RosterUser extends AbstractRenkanModel<String> {
-
- private String projectId;
- private Long siteId;
- private String clientId;
-
- public RosterUser(String id, String title, String description, String uri,
- String color, String project_id, Long site_id, String client_id) {
- super(id, title, description, uri, color);
-
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- this.projectId = project_id;
- this.siteId = site_id;
- this.clientId = client_id;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public void setUri(String uri) {
- this.uri = uri;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
- @JsonProperty(value = "project_id")
- public String getProjectId() {
- return projectId;
- }
-
- @JsonProperty(value = "site_id")
- public Long getSiteId() {
- return siteId;
- }
-
- @JsonProperty(value = "client_id")
- public String getClientId() {
- return clientId;
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.id;
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/Space.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-@Document(collection = "spaces")
-public class Space extends AbstractRenkanModel<String> {
-
- @Autowired
- public Space(String id, String title, String description, String binConfig,
- String uri, String color, String createdBy, String image,
- DateTime created) {
- super(id, title, description, uri, color);
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- this.binConfig = binConfig;
- this.createdBy = createdBy;
- this.setImage(image);
- this.created = created;
- if (this.created == null) {
- this.created = new DateTime();
- }
- }
-
- public Space() {
- }
-
- @Field("bin_config")
- @JsonProperty("bin_config")
- private String binConfig;
-
- @Field("created_by")
- @JsonProperty("created_by")
- private String createdBy = null;
- private String image;
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private DateTime created;
-
- public String getImage() {
- return image;
- }
-
- @JsonProperty("created_by")
- public String getCreatedBy() {
- return createdBy;
- }
-
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- public DateTime getCreated() {
- return created;
- }
-
- public void setCreated(DateTime date) {
- this.created = date;
-
- }
-
- @JsonProperty("bin_config")
- public String getBinConfig() {
- return binConfig;
- }
-
- @JsonProperty("bin_config")
- public void setBinConfig(String bin_config) {
- this.binConfig = bin_config;
- }
-
- public void setImage(String image) {
- this.image = image;
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.id+Long.toString(this.getCreated().getMillis());
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-
-}
\ No newline at end of file
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/User.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,213 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-import java.util.UUID;
-
-import org.iri_research.renkan.Constants;
-import org.joda.time.LocalDate;
-import org.springframework.data.mongodb.core.mapping.Document;
-import org.springframework.data.mongodb.core.mapping.Field;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
-@Document(collection = "users")
-public class User extends AbstractRenkanModel<String> implements UserDetails {
-
- public static class UserComparator implements Comparator<User> {
-
- @Override
- public int compare(User u1, User u2) {
- if(u1 == null || u1.getId() == null) {
- return (u2==null || u2.getId() == null)? 0 : Integer.MIN_VALUE;
- }
- else {
- return u2==null?Integer.MAX_VALUE:u1.getId().compareTo(u2.getId());
- }
-
- }
-
- }
-
- private static final long serialVersionUID = 6972038893086220548L;
-
-
- private String avatar;
- @Field("credentials_expiration_date")
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private LocalDate credentialsExpirationDate;
- private String email;
- private boolean enabled;
- @Field("expiration_date")
- @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT")
- private LocalDate expirationDate;
- private boolean locked;
- private String password;
- @Field("authorities")
- private List<String> userAuthorities;
-
- private Set<String> groups = new TreeSet<>();
-
- public User() {
- }
-
- public User(String id, String title, String description, String uri,
- String color) {
- super(id, title, description, uri, color);
- if(this.id == null) {
- this.id = Constants.UUID_GENERATOR.generate().toString();
- }
- }
-
- @Override
- public Collection<? extends GrantedAuthority> getAuthorities() {
- List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
- boolean hasUserRole = false;
- for (String role : this.getUserAuthorities()) {
- hasUserRole = hasUserRole || Constants.ROLE_USER.equals(role);
- authorities.add(new SimpleGrantedAuthority(role));
- }
- if(!hasUserRole) {
- authorities.add(new SimpleGrantedAuthority(Constants.ROLE_USER));
- }
-
- return authorities;
- }
-
- public String getAvatar() {
- return avatar;
- }
-
- public String getColor() {
- return this.color;
- }
-
- public LocalDate getCredentialsExpirationDate() {
- return credentialsExpirationDate;
- }
-
- public String getEmail() {
- return email;
- }
-
- public LocalDate getExpirationDate() {
- return expirationDate;
- }
-
- @Override
- @JsonIgnore
- public String getPassword() {
- return this.password;
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.id;
- }
-
- public List<String> getUserAuthorities() {
- return userAuthorities;
- }
-
- @Override
- @JsonIgnore
- public String getUsername() {
- return this.title;
- }
-
- @Override
- public boolean isAccountNonExpired() {
- return this.expirationDate == null
- || this.expirationDate.isAfter(LocalDate.now());
- }
-
- @Override
- public boolean isAccountNonLocked() {
- return !this.locked;
- }
-
- @Override
- public boolean isCredentialsNonExpired() {
- return this.credentialsExpirationDate == null
- || this.credentialsExpirationDate.isAfter(LocalDate.now());
- }
-
- @Override
- public boolean isEnabled() {
- return this.enabled;
- }
-
- public boolean isLocked() {
- return locked;
- }
-
- public void setAvatar(String avatar) {
- this.avatar = avatar;
- }
-
- public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
- this.credentialsExpirationDate = credentialsExpirationDate;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- }
-
- public void setExpirationDate(LocalDate expirationDate) {
- this.expirationDate = expirationDate;
- }
-
- public void setLocked(boolean locked) {
- this.locked = locked;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public void setUserAuthorities(List<String> userAuthorities) {
- this.userAuthorities = userAuthorities;
- }
-
- public Set<String> getGroups() {
- if(this.groups == null) {
- this.groups = new TreeSet<>();
- }
- return groups;
- }
-
-
- public boolean addGroup(Group g) {
- return this.addGroup(g.getId());
- }
-
- public boolean addGroup(String groupId) {
- return this.getGroups().add(groupId);
- }
-
- public boolean removeGroup(Group g) {
- return this.removeGroup(g.getId());
- }
-
- public boolean removeGroup(String groupId) {
- return (this.groups == null)?false:this.groups.remove(groupId);
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/models/View.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,101 +0,0 @@
-package org.iri_research.renkan.models;
-
-import java.util.UUID;
-
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.data.mongodb.core.mapping.Field;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class View extends AbstractRenkanModel<String> {
-
- private DateTime created;
- private DateTime updated;
-
- @Field("zoom_level")
- @JsonProperty("zoom_level")
- private double zoomLevel;
-
- private Point offset;
-
- @Field("created_by")
- @JsonProperty("created_by")
- private String createdBy;
-
- @SuppressWarnings("unused")
- private View() {
- }
-
- public View(String view_id, String title, String description, String uri,
- String color, String creatorId, double zoomLevel, Point offset) {
- super(view_id, title, description, uri, color);
- this.createdBy = creatorId;
- this.zoomLevel = zoomLevel;
- this.offset = offset;
- this.created = new DateTime();
- this.updated = new DateTime();
- }
-
- @Autowired(required = true)
- public View(String view_id, String title, String description, String uri,
- String color, String creatorId, double zoomLevel, Point offset, DateTime created) {
- this(view_id, title, description, uri, color, creatorId, zoomLevel, offset);
- if(created != null) {
- this.created= created;
- }
- }
-
- @Override
- protected String getRawKeyPart() {
- return this.id+Long.toString(this.getCreated().getMillis());
- }
-
- @Override
- protected String getDefaultId() {
- return UUID.randomUUID().toString();
- }
-
- public DateTime getCreated() {
- return created;
- }
-
- public void setCreated(DateTime created) {
- this.created = created;
- }
-
- public DateTime getUpdated() {
- return updated;
- }
-
- public void setUpdated(DateTime updated) {
- this.updated = updated;
- }
-
- public String getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(String createdBy) {
- this.createdBy = createdBy;
- }
-
- public double getZoomLevel() {
- return zoomLevel;
- }
-
- public void setZoomLevel(double zoomLevel) {
- this.zoomLevel = zoomLevel;
- }
-
- public Point getOffset() {
- return offset;
- }
-
- public void setOffset(Point offset) {
- this.offset = offset;
- }
-
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/EdgesRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.models.Edge;
-
-public interface EdgesRepository extends IRenkanRepository<Edge, String> {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.List;
-
-import org.iri_research.renkan.models.Group;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-
-public interface GroupsRepository extends IRenkanRepository<Group, String>, GroupsRepositoryCustom {
-
- public List<Group> findByTitle(String title);
-
- public Page<Group> findByTitle(String title, Pageable p);
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryCustom.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-
-public interface GroupsRepositoryCustom {
- /**
- * Set the list of user for the group
- * @param group: the group.
- * @param userIds: the collection of user ids. This parameter must not be null.
- */
- public void setUsersList(Group group, Collection<String> userIds);
- public Map<String, User> getUsersMap(Group group);
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/GroupsRepositoryImpl.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.collections4.IteratorUtils;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class GroupsRepositoryImpl implements GroupsRepositoryCustom {
-
- @Autowired
- private UsersRepository usersRepository;
-
- @Autowired
- private GroupsRepository groupsRepository;
-
- @Override
- // TODO: implement a transaction mecanism...
- public void setUsersList(Group group, Collection<String> userIds) {
-
- assert userIds != null : "list of user ids must not be null";
-
- // takes previous user list
- List<String> oldUsers = new ArrayList<>(group.getUsers());
-
- // calculate difference between two list
- List<String> userIdDel = new ArrayList<>(oldUsers);
- userIdDel.removeAll(userIds);
-
- List<String> userIdAdd = new ArrayList<>(userIds);
- userIdAdd.removeAll(oldUsers);
-
- List<User> userAdd = IteratorUtils.toList(this.usersRepository.findAll(userIdAdd).iterator());
- for (User user : userAdd) {
- user.addGroup(group.getId());
- }
- this.usersRepository.save(userAdd);
- List<User> userDel = IteratorUtils.toList(this.usersRepository.findAll(userIdDel).iterator());
- for (User user : userDel) {
- user.removeGroup(group.getId());
- }
- this.usersRepository.save(userDel);
-
- group.getUsers().clear();
- group.getUsers().addAll(userIds);
-
- this.groupsRepository.save(group);
- }
-
- @Override
- public Map<String, User> getUsersMap(Group group) {
- HashMap<String, User> res = new HashMap<>(group.getUsers().size());
-
- for (User user : this.usersRepository.findAll(group.getUsers())) {
- res.put(user.getId(), user);
- }
-
- return res;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/IRenkanRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.io.Serializable;
-
-import org.springframework.data.repository.PagingAndSortingRepository;
-
-import com.mongodb.DBCollection;
-
-public interface IRenkanRepository<T, ID extends Serializable> extends
- PagingAndSortingRepository<T, ID> {
-
- public DBCollection getCollection();
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/NodesRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.models.Node;
-
-public interface NodesRepository extends IRenkanRepository<Node, String> {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.bson.types.ObjectId;
-import org.iri_research.renkan.models.ProjectRevision;
-
-public interface ProjectRevisionsRepository extends
- IRenkanRepository<ProjectRevision, ObjectId>,
- ProjectRevisionsRepositoryCustom {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepositoryCustom.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectRevision;
-
-public interface ProjectRevisionsRepositoryCustom {
-
- public ProjectRevision getProjectRevision(Project project, int revision);
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectRevisionsRepositoryImpl.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.Date;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectRevision;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ProjectRevisionsRepositoryImpl implements
- ProjectRevisionsRepositoryCustom {
-
- @Override
- public ProjectRevision getProjectRevision(Project project, int revision) {
- ProjectRevision pr = new ProjectRevision(project.getTitle(),
- project.getDescription(), project.getUri(), project, revision,
- new Date(System.currentTimeMillis()));
-
- return pr;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.bson.types.ObjectId;
-import org.iri_research.renkan.models.ProjectSync;
-
-public interface ProjectSyncsRepository extends
- IRenkanRepository<ProjectSync, ObjectId>, ProjectSyncsRepositoryCustom {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryCustom.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectSync;
-
-public interface ProjectSyncsRepositoryCustom {
-
- public ProjectSync getProjectSync(String data, Project project, String user)
- throws RenkanException;
-
- public ProjectSync getProjectSync(String data, String project_id,
- String user) throws RenkanException;
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectSyncsRepositoryImpl.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectSync;
-import org.joda.time.DateTime;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ProjectSyncsRepositoryImpl implements ProjectSyncsRepositoryCustom {
-
- @Autowired
- private ProjectsRepository projectRepository;
-
- @Override
- public ProjectSync getProjectSync(String data, Project project, String user)
- throws RenkanException {
-
- if (project == null) {
- throw new RenkanException("ProjectSyncsRepository : Null Project.");
- }
-
- ProjectSync ps = new ProjectSync(null, data, project,
- this.projectRepository.getRevCounter(project.getId()),
- new DateTime(), user);
-
- return ps;
- }
-
- @Override
- public ProjectSync getProjectSync(String data, String project_id,
- String user) throws RenkanException {
-
- if (project_id == null || "".equals(project_id)) {
- throw new RenkanException(
- "ProjectSyncsRepository : Null or empty project id.");
- }
-
- Project p = this.projectRepository.findOne(project_id);
-
- if (p == null) {
- throw new RenkanException(
- "ProjectSyncsRepository : project not found for id "
- + project_id);
- }
-
- return this.getProjectSync(data, p, user);
-
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.List;
-
-import org.iri_research.renkan.models.Project;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.mongodb.repository.Query;
-
-public interface ProjectsRepository extends IRenkanRepository<Project, String>,
- ProjectsRepositoryCustom {
-
- List<Project> findBySpaceId(String spaceId);
-
- Page<Project> findBySpaceId(String spaceId, Pageable p);
-
- @Query("{ 'space_id' : ?0, 'title' : { '$regex':?1, '$options': 'i'} }")
- List<Project> findBySpaceIdAndTitleRegex(String spaceId, String title);
-
- @Query("{ 'space_id' : ?0, 'title' : { '$regex':?1, '$options': 'i'} }")
- Page<Project> findBySpaceIdAndTitleRegex(String spaceId, String title,
- Pageable p);
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryCustom.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.iri_research.renkan.models.Project;
-
-public interface ProjectsRepositoryCustom {
-
- public int getRevCounter(String projectId);
-
- public Map<String, Integer> getCountBySpace();
-
- public Map<String, Integer> getCountBySpace(Collection<String> spaceIds);
-
- public Map<String, Integer> getCountByUser();
-
- public Map<String, Integer> getCountByUser(Collection<String> userIds);
-
- public Map<String, Integer> getCountByUsername();
-
- public Map<String, Integer> getCountByUsername(Collection<String> usernames);
-
- public void deleteRecursive(String projectId);
-
- public void deleteRecursive(Project project);
-
- public void deleteRecursive(Iterable<? extends Project> projects);
-
- public Project copy(Project p, String newTitle);
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/ProjectsRepositoryImpl.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import static org.springframework.data.mongodb.core.query.Criteria.where;
-import static org.springframework.data.mongodb.core.query.Query.query;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectRevision;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.mapreduce.GroupBy;
-import org.springframework.data.mongodb.core.mapreduce.GroupByResults;
-import org.springframework.data.mongodb.core.query.Criteria;
-import org.springframework.data.mongodb.core.query.Update;
-import org.springframework.stereotype.Component;
-
-import com.mongodb.AggregationOutput;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBObject;
-
-@Component
-public class ProjectsRepositoryImpl implements ProjectsRepositoryCustom {
-
- @SuppressWarnings("unused")
- private final Logger logger = LoggerFactory
- .getLogger(ProjectsRepositoryImpl.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @Autowired
- private NodesRepository nodesRepository;
-
- @Autowired
- private EdgesRepository edgesRepository;
-
- @Autowired
- private ProjectRevisionsRepository projectRevisionsRepository;
-
- private class GroupSpaceResult {
- public String space_id;
- public int count;
- }
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- @Override
- public int getRevCounter(String projectId) {
- Project p = this.mongoTemplate.findAndModify(
- query(where("id").is(projectId)),
- new Update().inc("rev_counter", 1), Project.class);
-
- if (p == null) {
- return -1;
- }
- return p.getRevCounter();
- }
-
- @Override
- public Map<String, Integer> getCountBySpace(Collection<String> spaceIds) {
-
- Criteria filter = null;
-
- if (spaceIds != null) {
- filter = Criteria.where("space_id").in(spaceIds);
- }
-
- GroupByResults<GroupSpaceResult> groupResult = this.mongoTemplate
- .group(filter,
- this.mongoTemplate.getCollectionName(Project.class),
- GroupBy.key("space_id")
- .initialDocument("{ count: 0 }")
- .reduceFunction(
- "function(doc, prev) { prev.count += 1; }"),
- GroupSpaceResult.class);
-
- HashMap<String, Integer> res = new HashMap<>();
- for (GroupSpaceResult gr : groupResult) {
- res.put(gr.space_id, new Integer(gr.count));
- }
-
- return res;
-
- }
-
- @Override
- public Map<String, Integer> getCountBySpace() {
- return this.getCountBySpace(null);
- }
-
- @Override
- public Project copy(Project p, String newTitle) {
-
- Project res = new Project(p);
- res.setTitle(newTitle);
- this.nodesRepository.save(res.getNodes());
- this.edgesRepository.save(res.getEdges());
-
- return this.projectsRepository.save(res);
- }
-
- @Override
- public void deleteRecursive(String projectId) {
- this.deleteRecursive(this.projectsRepository.findOne(projectId));
- }
-
- @Override
- public void deleteRecursive(Project project) {
- this.deleteRecursive(Arrays.asList(new Project[] { project }));
- }
-
- @Override
- public void deleteRecursive(Iterable<? extends Project> projects) {
-
- for (Project p : projects) {
- if (p == null) {
- continue;
- }
-
- ProjectRevision pr = this.projectRevisionsRepository
- .getProjectRevision(p,
- this.projectsRepository.getRevCounter(p.getId()));
- this.projectRevisionsRepository.save(pr);
-
- // delete edges
- this.edgesRepository.delete(p.getEdges());
- // delete nodes
- this.nodesRepository.delete(p.getNodes());
- // delete project
- this.projectsRepository.delete(p);
- }
- }
-
- @Override
- public Map<String, Integer> getCountByUser() {
- return getCountByUser(null);
- }
-
- @Override
- public Map<String, Integer> getCountByUser(Collection<String> userIds) {
-
- Criteria filter = null;
-
- if (userIds != null) {
- filter = Criteria.where("users.user_id").in(userIds);
- }
-
- DBObject projectOp = new BasicDBObject("$project", new BasicDBObject(
- "users", 1));
- DBObject unwindOp = new BasicDBObject("$unwind", "$users");
- DBObject groupOpFields = new BasicDBObject("_id", "$users.user_id");
- groupOpFields.put("count", new BasicDBObject("$sum", 1));
- DBObject groupOp = new BasicDBObject("$group", groupOpFields);
- DBObject matchOp = null;
- if (filter != null) {
- matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
- }
-
- AggregationOutput output = null;
- if (filter != null) {
- output = this.projectsRepository.getCollection().aggregate(matchOp,
- projectOp, unwindOp, matchOp, groupOp);
- } else {
- output = this.projectsRepository.getCollection().aggregate(
- projectOp, unwindOp, groupOp);
- }
-
- HashMap<String, Integer> res = new HashMap<>();
-
- for (DBObject groupRes : output.results()) {
- res.put((String) groupRes.get("_id"),
- (Integer) groupRes.get("count"));
- }
-
- return res;
- }
-
- @Override
- public Map<String, Integer> getCountByUsername() {
- return this.getCountByUsername(null);
- }
-
- @Override
- public Map<String, Integer> getCountByUsername(Collection<String> usernames) {
-
- Criteria filter = null;
-
- if (usernames != null) {
- filter = Criteria.where("users.username").in(usernames);
- }
-
- DBObject projectOp = new BasicDBObject("$project", new BasicDBObject(
- "users", 1));
- DBObject unwindOp = new BasicDBObject("$unwind", "$users");
- DBObject groupOpFields = new BasicDBObject("_id", "$users.username");
- groupOpFields.put("count", new BasicDBObject("$sum", 1));
- DBObject groupOp = new BasicDBObject("$group", groupOpFields);
- DBObject matchOp = null;
- if (filter != null) {
- matchOp = new BasicDBObject("$match", filter.getCriteriaObject());
- }
-
- AggregationOutput output = null;
- if (filter != null) {
- output = this.projectsRepository.getCollection().aggregate(matchOp,
- projectOp, unwindOp, matchOp, groupOp);
- } else {
- output = this.projectsRepository.getCollection().aggregate(
- projectOp, unwindOp, groupOp);
- }
-
- HashMap<String, Integer> res = new HashMap<>();
-
- for (DBObject groupRes : output.results()) {
- res.put((String) groupRes.get("_id"),
- (Integer) groupRes.get("count"));
- }
-
- return res;
-
- }
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.io.Serializable;
-
-import org.springframework.data.mongodb.core.MongoOperations;
-import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
-import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
-
-import com.mongodb.DBCollection;
-
-public class RenkanRepository<T, ID extends Serializable> extends
- SimpleMongoRepository<T, ID> implements IRenkanRepository<T, ID> {
-
- public RenkanRepository(MongoEntityInformation<T, ID> metadata,
- MongoOperations mongoOperations) {
- super(metadata, mongoOperations);
- }
-
- @Override
- public DBCollection getCollection() {
- return this.getMongoOperations().getCollection(
- this.getEntityInformation().getCollectionName());
- }
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryException.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-public class RenkanRepositoryException extends Exception {
-
- private static final long serialVersionUID = -7433823426870169568L;
-
- public RenkanRepositoryException(String message) {
- super(message);
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryFactory.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.io.Serializable;
-
-import org.springframework.data.mongodb.core.MongoOperations;
-import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
-import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory;
-import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
-import org.springframework.data.repository.core.RepositoryMetadata;
-
-public class RenkanRepositoryFactory extends MongoRepositoryFactory {
-
- private MongoOperations mongoOperations;
-
- public RenkanRepositoryFactory(MongoOperations mongoOperations) {
- super(mongoOperations);
- this.mongoOperations = mongoOperations;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.springframework.data.repository.core.support.RepositoryFactorySupport
- * #getTargetRepository(org.springframework.data.repository.core.
- * RepositoryMetadata)
- */
- @Override
- @SuppressWarnings({ "rawtypes", "unchecked" })
- protected Object getTargetRepository(RepositoryMetadata metadata) {
-
- Object res = super.getTargetRepository(metadata);
-
- if (SimpleMongoRepository.class.equals(res.getClass())) {
- MongoEntityInformation<?, Serializable> entityInformation = this
- .getEntityInformation(metadata.getDomainType());
- return new RenkanRepository(entityInformation, this.mongoOperations);
- } else {
- return res;
- }
-
- }
-
- @Override
- protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
- Class<?> res = super.getRepositoryBaseClass(metadata);
- if (SimpleMongoRepository.class.equals(res)) {
- return RenkanRepository.class;
- } else {
- return res;
- }
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/RenkanRepositoryFactoryBean.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.io.Serializable;
-
-import org.springframework.data.mongodb.core.MongoOperations;
-import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean;
-import org.springframework.data.repository.Repository;
-import org.springframework.data.repository.core.support.RepositoryFactorySupport;
-
-public class RenkanRepositoryFactoryBean<T extends Repository<S, ID>, S, ID extends Serializable>
- extends MongoRepositoryFactoryBean<T, S, ID> {
-
- @Override
- protected RepositoryFactorySupport getFactoryInstance(
- MongoOperations operations) {
- return new RenkanRepositoryFactory(operations);
- }
-
-}
\ No newline at end of file
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/SpacesRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import org.iri_research.renkan.models.Space;
-
-public interface SpacesRepository extends IRenkanRepository<Space, String> {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepository.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.List;
-
-import org.iri_research.renkan.models.User;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-
-public interface UsersRepository extends IRenkanRepository<User, String>, UsersRepositoryCustom {
-
- public List<User> findByTitle(String title);
-
- public Page<User> findByTitle(String title, Pageable p);
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryCustom.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.Collection;
-import java.util.Map;
-
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-
-public interface UsersRepositoryCustom {
- /**
- * Set the users group list.
- * @param user : the user
- * @param groupIds : the list of group ids. this parameter must not be null.
- */
- public void setGroupsList(User user, Collection<String> groupIds);
- public Map<String, Group> getGroupsMap(User user);
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/repositories/UsersRepositoryImpl.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-package org.iri_research.renkan.repositories;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.collections4.IteratorUtils;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class UsersRepositoryImpl implements UsersRepositoryCustom {
-
- @Autowired
- private UsersRepository usersRepository;
-
- @Autowired
- private GroupsRepository groupsRepository;
-
- @Override
- // TODO: implement a transaction mecanism...
- public void setGroupsList(User user, Collection<String> groupIds) {
-
- assert groupIds != null : "list of group ids must not be null";
-
- // takes previous user list
- List<String> oldGroups = new ArrayList<>(user.getGroups());
-
- // calculate difference between two list
- List<String> groupIdDel = new ArrayList<>(oldGroups);
- groupIdDel.removeAll(groupIds);
-
- List<String> groupIdAdd = new ArrayList<>(groupIds);
- groupIdAdd.removeAll(oldGroups);
-
- List<Group> groupAdd = IteratorUtils.toList(this.groupsRepository.findAll(groupIdAdd).iterator());
- for (Group group : groupAdd) {
- group.addUser(user);
- }
- this.groupsRepository.save(groupAdd);
- List<Group> groupDel = IteratorUtils.toList(this.groupsRepository.findAll(groupIdDel).iterator());
- for (Group group : groupDel) {
- group.removeUser(user);
- }
- this.groupsRepository.save(groupDel);
-
- user.getGroups().clear();
- user.getGroups().addAll(groupIds);
-
- this.usersRepository.save(user);
- }
-
- @Override
- public Map<String, Group> getGroupsMap(User user) {
- HashMap<String, Group> res = new HashMap<>(user.getGroups().size());
-
- for (Group group : this.groupsRepository.findAll(user.getGroups())) {
- res.put(group.getId(), group);
- }
-
- return res;
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/utils/ColorGenerator.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-package org.iri_research.renkan.utils;
-
-import java.awt.Color;
-import java.util.Random;
-
-public class ColorGenerator {
-
- public static Color randomColor() {
-
- Random rand = new Random();
-
- float r = rand.nextFloat() * 0.5f + 0.5f;
- float g = rand.nextFloat() * 0.5f + 0.5f;
- float b = rand.nextFloat() * 0.5f + 0.5f;
-
- return new Color(r, g, b);
- }
-
- public static String randomColorHex() {
- Color resColor = ColorGenerator.randomColor();
- return Integer.toHexString(resColor.getRGB());
- }
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/utils/RenkanLogger.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-package org.iri_research.renkan.utils;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-@Retention(RUNTIME)
-@Target(FIELD)
-@Documented
-public @interface RenkanLogger {
-
-}
--- a/server/renkan-core/src/main/java/org/iri_research/renkan/utils/RenkanLoggerInjector.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-package org.iri_research.renkan.utils;
-
-import java.lang.reflect.Field;
-
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.stereotype.Component;
-import org.springframework.util.ReflectionUtils;
-import org.springframework.util.ReflectionUtils.FieldCallback;
-
-@Component
-public class RenkanLoggerInjector implements BeanPostProcessor {
-
- @Override
- public Object postProcessBeforeInitialization(final Object bean,
- String beanName) throws BeansException {
- ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() {
- public void doWith(Field field) throws IllegalArgumentException,
- IllegalAccessException {
- // make the field accessible if defined private
- ReflectionUtils.makeAccessible(field);
- if (field.getAnnotation(RenkanLogger.class) != null) {
- org.slf4j.Logger logger = LoggerFactory.getLogger(bean
- .getClass());
- field.set(bean, logger);
- }
- }
- });
- return bean;
- }
-
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName)
- throws BeansException {
- return bean;
- }
-}
\ No newline at end of file
--- a/server/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/GroupsRepositoryTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,391 +0,0 @@
-package org.iri_research.renkan.test.repositories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.LocalDate;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("repositories-context.xml")
-public class GroupsRepositoryTest {
-
- private final static int USER_NB = 3;
- private final static int GROUP_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(GroupsRepositoryTest.class);
-
- @Autowired
- private UsersRepository usersRepository;
- @Autowired
- private GroupsRepository groupsRepository;
-
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
- private List<String> usersUuids = new ArrayList<>(USER_NB);
-
- private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
- private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
-
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- usersRepository.deleteAll();
- for(int i=0; i < USER_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
- user.setLocked(false);
- user.setEnabled(true);
- user.setAvatar("A pretty picture");
- user.setExpirationDate(new LocalDate());
- user.setCredentialsExpirationDate(new LocalDate());
- user.setEmail(String.format("user%d@mail.com", i));
- user = usersRepository.save(user);
- this.usersUuids.add(uuid);
- this.usersList.put(uuid, user);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for(int i=0; i < GROUP_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
- group.setAvatar("A pretty group picture " + i);
- group = groupsRepository.save(group);
- this.groupsUuids.add(uuid);
- this.groupsList.put(uuid, group);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
-
-
- }
-
- @Test
- public void testGroupFieldMapping() {
- // query json directly with mongodb driver
- // check field values
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Group.class));
-
- for (DBObject obj : coll.find()) {
- Assert.assertTrue("mongo object must have _id field",
- obj.containsField("_id"));
-
- String id = obj.get("_id").toString();
-
- Group group = this.groupsList.get(id);
-
- Assert.assertTrue("mongo object must have title field",
- obj.containsField("title"));
- Assert.assertEquals("Titles must be the same",
- group.getTitle(), obj.get("title"));
-
- Assert.assertTrue("mongo object must have description field",
- obj.containsField("description"));
- Assert.assertEquals("description must be the same",
- group.getDescription(), obj.get("description"));
-
- Assert.assertTrue("mongo object must have color field",
- obj.containsField("color"));
- Assert.assertEquals("Color must be the same", group.getColor(), obj.get("color"));
-
- Assert.assertTrue("mongo object must have uri field",
- obj.containsField("uri"));
- Assert.assertEquals("Uri must be the same", group.getUri(), obj.get("uri"));
-
- Assert.assertTrue("mongo object must have avatar field",
- obj.containsField("avatar"));
- Assert.assertEquals("Avater must be the same", group.getAvatar(), obj.get("avatar"));
-
- }
- }
-
- @Test
- public void testSetUsersList() {
-
- Group group = this.groupsList.get(this.groupsUuids.get(0));
-
- List<String> userIds = this.usersUuids;
-
- this.groupsRepository.setUsersList(group, userIds);
-
- //reload user
- group = this.groupsRepository.findOne(group.getId());
-
- Assert.assertEquals("group user list is big enough", userIds.size(), group.getUsers().size());
- Assert.assertTrue("Group user list contains all users", group.getUsers().containsAll(userIds));
-
- for (User u : this.usersRepository.findAll(userIds)) {
- Assert.assertEquals(String.format("user list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- }
- }
-
-
- @Test
- public void testAddUsersList() {
- Group group = this.groupsList.get(this.groupsUuids.get(1));
-
- List<String> userIds = this.usersUuids.subList(0, 1);
- this.groupsRepository.setUsersList(group, userIds);
-
- group = this.groupsRepository.findOne(group.getId());
-
- Assert.assertEquals("group users is big enough", userIds.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
-
- User user = this.usersRepository.findOne(userIds.get(0));
- Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
- Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
-
- this.groupsRepository.setUsersList(group, this.usersUuids);
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- Assert.assertEquals("group user list is big enough", this.usersUuids.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
-
- for (User u : this.usersRepository.findAll(this.usersUuids)) {
- Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
- Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- }
-
- }
-
- @Test
- public void testRemoveUsersList() {
- Group group = this.groupsList.get(this.groupsUuids.get(2));
-
- this.groupsRepository.setUsersList(group, this.usersUuids);
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
-
- for(User user : this.usersRepository.findAll(this.usersUuids)) {
- Assert.assertEquals(String.format("group list for user %s must be size 1", user.getId()), 1, user.getGroups().size());
- Assert.assertTrue(String.format("group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
- }
-
- this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- Assert.assertEquals("group user list is big enough", 1, group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
-
- User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
- Assert.assertEquals(String.format("group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
- Assert.assertTrue(String.format("group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
-
- for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
- Assert.assertEquals(String.format("group list for user %s must be size 0", otherUser.getId()), 0, otherUser.getGroups().size());
- }
-
- }
-
-
- @Test
- public void testAddUsersListExisting() {
-
- // get first group
- Group group = this.groupsList.get(this.groupsUuids.get(0));
-
- List<String> userIds = this.usersUuids;
-
- // set all users for first group
- this.groupsRepository.setUsersList(group, userIds);
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- //check that group has all users
- Assert.assertEquals("Group user list is big enough", userIds.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
-
- // and that users have all new group
- for (User u : this.usersRepository.findAll(userIds)) {
- Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- }
-
-
- // get second group
- group = this.groupsList.get(this.groupsUuids.get(1));
-
- //first set one user
- List<String> secondUserIds = this.usersUuids.subList(0, 1);
- this.groupsRepository.setUsersList(group, secondUserIds);
-
- // reload group
- group = this.groupsRepository.findOne(group.getId());
-
- // check that second group has all users
- Assert.assertEquals("Group user list is big enough", secondUserIds.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all users", group.getUsers().containsAll(secondUserIds));
-
- // check that group has new and old user
- User user = this.usersRepository.findOne(secondUserIds.get(0));
- Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), groupsUuids.get(0)), user.getGroups().contains(groupsUuids.get(0)));
-
- // set all new users list for second group
- this.groupsRepository.setUsersList(group, this.usersUuids);
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- //check that group 2 has all users
- Assert.assertEquals("Group user list is big enough", this.usersUuids.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(this.usersUuids));
-
- // check that all users had group 1 and group 2
- for (User u : this.usersRepository.findAll(this.usersUuids)) {
- Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), groupsUuids.get(0)), u.getGroups().contains(groupsUuids.get(0)));
- }
-
- }
-
-
- @Test
- public void testRemoveGroupListExisting() {
-
- // get first group
- Group group = this.groupsList.get(this.groupsUuids.get(0));
-
- List<String> userIds = this.usersUuids;
-
- // set all users for first group
- this.groupsRepository.setUsersList(group, userIds);
-
- //reload group
- group = this.groupsRepository.findOne(group.getId());
-
- //check that group has all users
- Assert.assertEquals("Group users list is big enough", userIds.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all user", group.getUsers().containsAll(userIds));
-
- // and that users have all new group
- for (User u : this.usersRepository.findAll(userIds)) {
- Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 1, u.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- }
-
- // get 3rd group
- group = this.groupsList.get(this.groupsUuids.get(2));
-
- // set all users for 3rd group
- this.groupsRepository.setUsersList(group, this.usersUuids);
-
- //reload 3rd group
- group = this.groupsRepository.findOne(group.getId());
-
- //check that all users are set for 3rd group
- Assert.assertEquals("Group users list is big enough", this.usersUuids.size(), group.getUsers().size());
- Assert.assertTrue("User list contains all users", group.getUsers().containsAll(this.usersUuids));
-
- //check that all users has 3rd group and 1st group
- for(User user : this.usersRepository.findAll(this.usersUuids)) {
- Assert.assertEquals(String.format("Group list for user %s must be size 2", user.getId()), 2, user.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), group.getId()), user.getGroups().contains(group.getId()));
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", user.getId(), this.groupsUuids.get(0)), user.getGroups().contains(this.groupsUuids.get(0)));
- }
-
- //set new user list for 3rd group
- this.groupsRepository.setUsersList(group, this.usersUuids.subList(USER_NB-1, USER_NB));
-
- //reload 3rd group
- group = this.groupsRepository.findOne(group.getId());
-
- //check that 3rd group has only one user (last user)
- Assert.assertEquals("Group users list is big enough", 1, group.getUsers().size());
- Assert.assertTrue("User list contains all users", group.getUsers().contains(this.usersUuids.get(USER_NB-1)));
-
- // check that last user has 3rd and 1rst group
- User u = this.usersRepository.findOne(this.usersUuids.get(USER_NB-1));
- Assert.assertEquals(String.format("Group list for user %s must be size 1", u.getId()), 2, u.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), group.getId()), u.getGroups().contains(group.getId()));
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", u.getId(), this.groupsUuids.get(0)), u.getGroups().contains(this.groupsUuids.get(0)));
-
- // check that other users has only 1rst group
- for(User otherUser: this.usersRepository.findAll(this.usersUuids.subList(0, USER_NB-2))) {
- Assert.assertEquals(String.format("Group list for user %s must be size 0", otherUser.getId()), 1, otherUser.getGroups().size());
- Assert.assertTrue(String.format("Group list for user %s must contains group %s", otherUser.getId(), this.groupsUuids.get(0)), otherUser.getGroups().contains(this.groupsUuids.get(0)));
- }
-
- }
-
- @Test
- public void testGetUsersMap() {
-
- Group group = this.groupsList.get(this.groupsUuids.get(0));
-
- List<String> userIds = this.usersUuids;
-
- this.groupsRepository.setUsersList(group, userIds);
-
-
- Map<String, User> usersMap = this.groupsRepository.getUsersMap(group);
-
- Assert.assertEquals ("user map should have same length than users list", this.usersUuids.size(), usersMap.size());
- Assert.assertTrue("user map should contains all uuids", this.usersUuids.containsAll(usersMap.keySet()));
- for (Entry<String, User> entry : usersMap.entrySet()) {
- User user = entry.getValue();
- String userId = entry.getKey();
- Assert.assertTrue("user id in user uuid", this.usersUuids.contains(userId));
- Assert.assertEquals("key id and value user id must be the same", userId, user.getId());
- }
-
- }
-
-
- @After
- public void teardown() {
- this.usersRepository.deleteAll();
- this.groupsRepository.deleteAll();
- }
-
-}
--- a/server/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/ProjectSyncsRepositoryTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,177 +0,0 @@
-package org.iri_research.renkan.test.repositories;
-
-import java.util.ArrayList;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectSync;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectSyncsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("repositories-context.xml")
-public class ProjectSyncsRepositoryTest {
-
- private Logger logger = LoggerFactory
- .getLogger(ProjectSyncsRepositoryTest.class);
-
- @Autowired
- private ProjectsRepository projectRepository;
-
- @Autowired
- private ProjectSyncsRepository projectSyncsRepository;
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
-
- public ProjectSyncsRepositoryTest() {
- }
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- Space testSpace = new Space(UUID.randomUUID().toString(), "test",
- "Test space", null, null, null, "test_user", null, null);
- testSpace = spacesRepository.save(testSpace);
- ArrayList<Project> pl = new ArrayList<Project>();
- pl.add(new Project(testSpace.getId(), null, "test1", "desc1",
- "http://localhost:8080/rest/projects/id1", new DateTime()));
- pl.add(new Project(testSpace.getId(), null, "test2", "desc2",
- "http://localhost:8080/rest/projects/id2", new DateTime()));
- logger.debug("Setup : new Project ");
- for (Project p : projectRepository.save(pl)) {
- this.testProjects.add(p);
- }
- }
-
- @After
- public void teardown() {
- logger.debug("Teardown");
- projectRepository.deleteAll();
- projectSyncsRepository.deleteAll();
- }
-
- @Test
- public void testGetCollection() {
- String collectionName = this.projectSyncsRepository.getCollection()
- .getName();
-
- Assert.assertEquals("The collection name should be projectSyncs",
- "projectSyncs", collectionName);
-
- }
-
- @Test
- public void testGetProjectSync() throws RenkanException {
-
- Project p = projectRepository.findOne(this.testProjects.get(0).getId());
-
- String data = "{\"example\":\"this is an example\"}";
-
- ProjectSync ps = projectSyncsRepository
- .getProjectSync(data, p, "user1");
-
- ps = this.projectSyncsRepository.save(ps);
-
- ps = this.projectSyncsRepository.findOne(ps.getId());
-
- Assert.assertNotNull(ps);
- Assert.assertEquals(data, ps.getData());
-
- }
-
- @Test
- public void testGetProjectSyncRevision() throws RenkanException {
-
- Project p = projectRepository.findOne(this.testProjects.get(0).getId());
-
- String data = "{\"example\":\"this is an example\"}";
-
- ProjectSync ps = projectSyncsRepository
- .getProjectSync(data, p, "user1");
-
- ps = this.projectSyncsRepository.save(ps);
- ps = this.projectSyncsRepository.findOne(ps.getId());
-
- p = projectRepository.findOne(this.testProjects.get(0).getId());
-
- Assert.assertNotNull(ps.getProject());
- Assert.assertEquals(p.getId(), ps.getProject().getId());
- Assert.assertEquals(
- "Revision of the project sync mustbe one less tha the rev counter pf the project",
- p.getRevCounter() - 1, ps.getRevision());
-
- Assert.assertEquals(
- "Revision of the project sync mustbe one less tha the rev counter of its project",
- ps.getProject().getRevCounter() - 1, ps.getRevision());
-
- }
-
- @Test(expected = RenkanException.class)
- public void testGetProjectSyncExceptionNullProject() throws RenkanException {
-
- String data = "{\"example\":\"this is an example\"}";
- Project p = null;
- ProjectSync ps = projectSyncsRepository
- .getProjectSync(data, p, "user1");
-
- // should never be executed.
- Assert.assertNull(ps);
- }
-
- @Test(expected = RenkanException.class)
- public void testGetProjectSyncExceptionNullId() throws RenkanException {
-
- String data = "{\"example\":\"this is an example\"}";
- String project_id = null;
- ProjectSync ps = projectSyncsRepository.getProjectSync(data,
- project_id, "user1");
-
- // should never be executed.
- Assert.assertNull(ps);
- }
-
- @Test(expected = RenkanException.class)
- public void testGetProjectSyncExceptionEmptyId() throws RenkanException {
-
- String data = "{\"example\":\"this is an example\"}";
- String project_id = "";
- ProjectSync ps = projectSyncsRepository.getProjectSync(data,
- project_id, "user1");
-
- // should never be executed.
- Assert.assertNull(ps);
- }
-
- @Test(expected = RenkanException.class)
- public void testGetProjectSyncExceptionBadId() throws RenkanException {
-
- String data = "{\"example\":\"this is an example\"}";
- String project_id = "BAD_ID";
- ProjectSync ps = projectSyncsRepository.getProjectSync(data,
- project_id, "user1");
-
- // should never be executed.
- Assert.assertNull(ps);
- }
-
-}
--- a/server/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/ProjectsRepositoryTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,696 +0,0 @@
-package org.iri_research.renkan.test.repositories;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectRevision;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.ProjectRevisionsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.iri_research.renkan.utils.ColorGenerator;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-import com.mongodb.DBRef;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("repositories-context.xml")
-public class ProjectsRepositoryTest {
-
- private final static int SPACE_NB = 3;
-
- private Logger logger = LoggerFactory
- .getLogger(ProjectsRepositoryTest.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @Autowired
- private NodesRepository nodesRepository;
-
- @Autowired
- private EdgesRepository edgesRepository;
-
- @Autowired
- private UsersRepository usersRepository;
-
- @Autowired
- private ProjectRevisionsRepository projectRevisionsRepository;
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
- private List<Node> testNodes = new ArrayList<>();
- private List<Edge> testEdges = new ArrayList<>();
- private List<User> testUsers = new ArrayList<>();
-
- private DateTime creationDate = new DateTime();
-
- private List<String> spaceIds = new ArrayList<>();
-
- private Project copyProject;
-
- public ProjectsRepositoryTest() {
- }
-
- @Before
- public void setup() {
-
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- logger.debug("Setup");
-
- // CREATE USERS
- for (int i = 0; i < SPACE_NB + 1; i++) {
- this.testUsers.add(new User(UUID.randomUUID().toString(),
- "test_user" + (i + 1), "Test user " + (i + 1),
- "http://www.iri.centrepompidou.fr/users/test_user"
- + (i + 1), "#" + ColorGenerator.randomColorHex()));
- }
- usersRepository.save(this.testUsers);
-
- ArrayList<Project> pl = new ArrayList<Project>();
- Space testSpace = null;
- for (int i = 0; i < SPACE_NB; i++) {
- spaceIds.add(UUID.randomUUID().toString());
- testSpace = new Space(this.spaceIds.get(i), "test space " + i,
- "Test space " + i, null, null, null, "test_user", null,
- this.creationDate);
- testSpace = spacesRepository.save(testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- final Project project = new Project(testSpace.getId(), UUID
- .randomUUID().toString(), "test project "
- + ((SPACE_NB - 1) * i + j + 1), "desc"
- + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1),
- this.creationDate);
- pl.add(project);
- }
- }
-
- for (int i = 0; i < testUsers.size() - 1; i++) {
- User u = this.testUsers.get(i);
- for (int j = 0; j < pl.size(); j++) {
- Project p = pl.get(j);
- if (j < pl.size() - i) {
- p.addUser(u);
- } else {
- p.addUser(null, null);
- }
-
- }
- }
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
- copyProject = this.testProjects.get(0);
-
- for (int i = 0; i < 3; i++) {
- Node node = new Node("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/nodes/node" + i, "#ffff0" + i,
- "test_user", new Point(0, i),
- "http://renkan.org/images/node" + i, i, copyProject.getId());
- node = this.nodesRepository.save(node);
- copyProject.getNodes().add(node);
- this.testNodes.add(node);
- }
- for (int i = 0; i < 3; i++) {
- Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/edges/edge" + i, "#ffff0" + i,
- this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
- "test_user", copyProject.getId());
- edge = this.edgesRepository.save(edge);
- copyProject.getEdges().add(edge);
- this.testEdges.add(edge);
- }
-
- this.projectsRepository.save(copyProject);
-
- }
-
- @After
- public void teardown() {
- logger.debug("Teardown");
- edgesRepository.deleteAll();
- nodesRepository.deleteAll();
- projectRevisionsRepository.deleteAll();
- projectsRepository.deleteAll();
- spacesRepository.deleteAll();
- usersRepository.deleteAll();
- }
-
- @Test
- public void testInitialRevCounter() {
-
- Project p = projectsRepository
- .findOne(this.testProjects.get(0).getId());
-
- Assert.assertEquals("Initial rev counter should be 1", 1,
- p.getRevCounter());
- }
-
- @Test
- public void testIncrementRevCounter() {
-
- int revCounter = projectsRepository.getRevCounter(this.testProjects
- .get(0).getId());
- Assert.assertEquals("After 1 call rev counter should be 1", 1,
- revCounter);
- revCounter = projectsRepository.getRevCounter(this.testProjects.get(0)
- .getId());
- Assert.assertEquals("After 2 calls rev counter should be 2", 2,
- revCounter);
-
- for (int i = 0; i < 10; i++) {
- revCounter = projectsRepository.getRevCounter(this.testProjects
- .get(0).getId());
- }
-
- Assert.assertEquals("After 10 more calls rev counter should be 12", 12,
- revCounter);
-
- Project p = projectsRepository
- .findOne(this.testProjects.get(0).getId());
-
- Assert.assertEquals("next rev counter should be 13", 13,
- p.getRevCounter());
-
- p = projectsRepository.findOne(this.testProjects.get(1).getId());
-
- Assert.assertEquals("other project next rev counter should be 1", 1,
- p.getRevCounter());
-
- }
-
- @Test
- public void testIncrementNonExisting() {
-
- int revCounter = projectsRepository.getRevCounter("aaaa");
- Assert.assertEquals("Rev counter non existing == -1", -1, revCounter);
-
- }
-
- @Test
- public void testIncrementNull() {
-
- int revCounter = projectsRepository.getRevCounter(null);
- Assert.assertEquals("Rev counter null == -1", -1, revCounter);
-
- }
-
- @Test
- public void testIncrementEmpty() {
-
- int revCounter = projectsRepository.getRevCounter("");
- Assert.assertEquals("Rev counter empty == -1", -1, revCounter);
-
- }
-
- @Test
- public void testDateCreation() {
-
- for (Project p : projectsRepository.findAll()) {
- Assert.assertEquals(this.creationDate, p.getCreated());
- }
- }
-
- @Test
- public void testGetCountBySpace() {
-
- Map<String, Integer> groupRes = projectsRepository.getCountBySpace();
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", SPACE_NB - 1, groupRes.size());
-
- for (int i = 0; i < (SPACE_NB - 1); i++) {
- Integer count = groupRes.get(this.spaceIds.get(i));
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of project/space", 2 - i, count.intValue());
- }
-
- Assert.assertNull("Last space id has no project i.e count is null",
- groupRes.get(this.spaceIds.get(SPACE_NB - 1)));
- }
-
- @Test
- public void testGetCountBySpaceFilter() {
-
- List<String> spacesIdsFilter = Arrays.asList(this.spaceIds.get(0));
-
- Map<String, Integer> groupRes = projectsRepository
- .getCountBySpace(spacesIdsFilter);
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", 1, groupRes.size());
-
- Integer count = groupRes.get(this.spaceIds.get(0));
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of project/space", 2, count.intValue());
-
- for (int i = 1; i < SPACE_NB; i++) {
- Assert.assertNull(
- "other space id has no project i.e count is null",
- groupRes.get(this.spaceIds.get(i)));
- }
- }
-
- @Test
- public void testGetCountByUser() {
-
- Map<String, Integer> groupRes = projectsRepository.getCountByUser();
- int nu = this.testUsers.size();
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", nu, groupRes.size());
-
- for (int i = 0; i < nu - 1; i++) {
- Integer count = groupRes.get(this.testUsers.get(i).getId());
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of user/project", testProjects.size() - i,
- count.intValue());
- }
- Assert.assertNull("Last user id has no project i.e count is null",
- groupRes.get(this.testUsers.get(nu - 1).getId()));
-
- Integer count = groupRes.get(null);
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of anonymous user/project", (nu - 1) * (nu - 2)
- / 2, count.intValue());
- }
-
- @Test
- public void testGetCountByUserFilter() {
-
- List<String> userIdsFilter = Arrays.asList(this.testUsers.get(0)
- .getId());
-
- Map<String, Integer> groupRes = projectsRepository
- .getCountByUser(userIdsFilter);
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", 1, groupRes.size());
-
- Integer count = groupRes.get(this.testUsers.get(0).getId());
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of user/project", testProjects.size(),
- count.intValue());
-
- }
-
- @Test
- public void testGetCountByUsername() {
-
- Map<String, Integer> groupRes = projectsRepository.getCountByUsername();
- int nu = this.testUsers.size() - 1;
- int nb_username = this.testUsers.size() + (SPACE_NB - 1) * SPACE_NB / 2
- - 2;
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", nb_username, groupRes.size());
-
- for (int i = 0; i < nu - 1; i++) {
- Integer count = groupRes.get(this.testUsers.get(i).getUsername());
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of user/project", testProjects.size() - i,
- count.intValue());
- }
- Assert.assertNull("Last user id has no project i.e count is null",
- groupRes.get(this.testUsers.get(nu).getUsername()));
-
- for (int i = 1; i < nu; i++) {
- String anonymous_username = String.format("Anonymous-%d", i);
- Integer count = groupRes.get(anonymous_username);
- Assert.assertEquals("Nb of anonymous user/project", nu - i,
- count.intValue());
- }
-
- }
-
- @Test
- public void testGetCountByUsernameFilter() {
-
- List<String> usernamesFilter = Arrays.asList(this.testUsers.get(0)
- .getUsername());
-
- Map<String, Integer> groupRes = projectsRepository
- .getCountByUsername(usernamesFilter);
-
- Assert.assertNotNull("GroupRes not null", groupRes);
- Assert.assertEquals("Group res size", 1, groupRes.size());
-
- Integer count = groupRes.get(this.testUsers.get(0).getUsername());
- Assert.assertNotNull("count not null", count);
- Assert.assertEquals("Nb of user/project", testProjects.size(),
- count.intValue());
-
- }
-
- @Test
- public void testCopyProjectCreation() {
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Project.class));
-
- DBObject filter = new BasicDBObject();
- filter.put("_id", copyProject.getId());
-
- DBCursor resFind = coll.find(filter);
-
- Assert.assertEquals("The project must be found", 1, resFind.count());
-
- for (DBObject obj : coll.find(filter)) {
- Assert.assertEquals("id must be equal", copyProject.getId(),
- obj.get("_id"));
- }
- }
-
- @Test
- public void testCopyProjectCopy() {
-
- Project newProject = this.projectsRepository.copy(this.copyProject,
- "copy_project");
-
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Project.class));
-
- DBObject filter = new BasicDBObject();
- filter.put("_id", newProject.getId());
-
- DBCursor resFind = coll.find(filter);
-
- Assert.assertEquals("The project must be found", 1, resFind.count());
-
- for (DBObject obj : resFind) {
- Assert.assertEquals("id must be equal", newProject.getId(),
- obj.get("_id"));
- Assert.assertEquals("title must be must be copy_project",
- "copy_project", obj.get("title"));
- Assert.assertEquals(
- "space_id must be must be same than copyProject",
- this.copyProject.getSpaceId(), obj.get("space_id"));
- }
-
- filter = new BasicDBObject();
- filter.put("project_id", newProject.getId());
-
- DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Node.class));
- resFind = nodesColl.find(filter);
-
- Assert.assertEquals("Must have 3 nodes", this.copyProject.getNodes()
- .size(), resFind.count());
-
- for (DBObject obj : resFind) {
- // find node with same title in copy project
- Node originalNode = null;
- for (Node n : this.copyProject.getNodes()) {
- if (n.getTitle().equals(obj.get("title"))) {
- originalNode = n;
- break;
- }
- }
-
- Assert.assertNotNull("Must fincd original Node", originalNode);
-
- // color, desc, id diff, uri, created_by, image, position, diff
- // projectif, size
- Assert.assertNotSame("id must be differents", originalNode.getId(),
- obj.get("_id"));
- Assert.assertNotSame("project id must be differents",
- originalNode.getProjectId(), obj.get("project_id"));
-
- Assert.assertEquals("same color", originalNode.getColor(),
- obj.get("color"));
- Assert.assertEquals("same desc", originalNode.getDescription(),
- obj.get("description"));
- Assert.assertEquals("same uri", originalNode.getUri(),
- obj.get("uri"));
- Assert.assertEquals("same image", originalNode.getImage(),
- obj.get("image"));
- Assert.assertEquals("same position", originalNode.getPosition()
- .getX(), ((DBObject) obj.get("position")).get("x"));
- Assert.assertEquals("same position", originalNode.getPosition()
- .getY(), ((DBObject) obj.get("position")).get("y"));
- Assert.assertEquals("same size", originalNode.getSize(),
- obj.get("size"));
-
- }
-
- DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Edge.class));
- resFind = edgesColl.find(filter);
-
- Assert.assertEquals("Must have 3 edges", this.copyProject.getEdges()
- .size(), resFind.count());
-
- for (DBObject obj : resFind) {
- // find node with same title in copy project
- Edge originalEdge = null;
- for (Edge e : this.copyProject.getEdges()) {
- if (e.getTitle().equals(obj.get("title"))) {
- originalEdge = e;
- break;
- }
- }
-
- Assert.assertNotNull("Must find original Node", originalEdge);
-
- // color, desc, id diff, uri, created_by, image, position, diff
- // projectif, size
- Assert.assertFalse("id must be differents", originalEdge.getId()
- .equals(obj.get("_id")));
- Assert.assertFalse("project id must be differents", originalEdge
- .getProjectId().equals(obj.get("project_id")));
-
- Assert.assertEquals("same color", originalEdge.getColor(),
- obj.get("color"));
- Assert.assertEquals("same desc", originalEdge.getDescription(),
- obj.get("description"));
- Assert.assertEquals("same uri", originalEdge.getUri(),
- obj.get("uri"));
-
- // get FromNode
- DBObject fromNode = nodesColl.findOne(((DBRef) obj.get("from"))
- .getId());
- Assert.assertNotNull("fromNode must exits ", fromNode);
- Assert.assertFalse("must be different from node", originalEdge
- .getFrom().equals(fromNode.get("_id")));
- Assert.assertEquals("same from title", originalEdge.getFromNode()
- .getTitle(), fromNode.get("title"));
-
- DBObject toNode = nodesColl
- .findOne(((DBRef) obj.get("to")).getId());
- Assert.assertNotNull("toNode must exits", toNode);
- Assert.assertFalse("must be different to node", originalEdge
- .getTo().equals(toNode.get("_id")));
- Assert.assertEquals("same to title", originalEdge.getToNode()
- .getTitle(), toNode.get("title"));
-
- }
- }
-
- @Test
- public void testDeleteRecursive() {
-
- List<Node> nodes = copyProject.getNodes();
- List<Edge> edges = copyProject.getEdges();
-
- this.projectsRepository.deleteRecursive(copyProject);
-
- DBObject filter = new BasicDBObject();
- filter.put("_id", copyProject.getId());
-
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Project.class));
- DBCursor resFind = coll.find(filter);
-
- Assert.assertEquals("The project must not be found", 0, resFind.count());
-
- filter = new BasicDBObject();
- filter.put("project_id", copyProject.getId());
-
- DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Node.class));
- resFind = nodesColl.find(filter);
-
- Assert.assertEquals("no nodes left", 0, resFind.count());
-
- for (Node n : nodes) {
- DBObject nobj = nodesColl.findOne(n.getId());
- Assert.assertNull("node should be deleted", nobj);
- }
-
- DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Edge.class));
- resFind = edgesColl.find(filter);
-
- Assert.assertEquals("no edges left", 0, resFind.count());
-
- for (Edge e : edges) {
- DBObject eobj = edgesColl.findOne(e.getId());
- Assert.assertNull("edge should be deleted", eobj);
- }
-
- }
-
- @SuppressWarnings("unchecked")
- @Test
- public void testDeleteRecursiveProjectRevision() {
-
- List<Node> nodes = copyProject.getNodes();
- List<Edge> edges = copyProject.getEdges();
-
- int revCounter = copyProject.getRevCounter();
-
- this.projectsRepository.deleteRecursive(copyProject);
-
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(ProjectRevision.class));
-
- DBObject filter = new BasicDBObject();
- filter.put("project", new DBRef(mongoTemplate.getDb(), "projects",
- copyProject.getId()));
- filter.put("revision", new Integer(revCounter));
-
- DBObject revision = coll.findOne(filter);
-
- Assert.assertNotNull("Must find revision", revision);
-
- for (DBObject nobj : ((Iterable<DBObject>) revision.get("nodes"))) {
- Node node = null;
- for (Node n : nodes) {
- if (n.getId().equals(nobj.get("_id"))) {
- node = n;
- break;
- }
- }
- Assert.assertNotNull("Node must be in the original list", node);
- Assert.assertEquals("Nodes must have same title", node.getTitle(),
- nobj.get("title"));
- }
-
- for (DBObject eobj : ((Iterable<DBObject>) revision.get("edges"))) {
- Edge edge = null;
- for (Edge e : edges) {
- if (e.getId().equals(eobj.get("_id"))) {
- edge = e;
- break;
- }
- }
- Assert.assertNotNull("Edge must be in the original list", edge);
- Assert.assertEquals("Edges must have same title", edge.getTitle(),
- eobj.get("title"));
- }
-
- }
-
- @Test
- public void testFindBySpaceIdAndTitleRegex() {
-
- List<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
- this.spaceIds.get(0), ".*Project.*");
-
- Assert.assertEquals("res must have length " + (SPACE_NB - 1),
- SPACE_NB - 1, res.size());
- for (Project p : res) {
- Assert.assertEquals("project must belong to the same space",
- this.spaceIds.get(0), p.getSpaceId());
- Assert.assertNotNull("project title must not be null", p.getTitle());
- Assert.assertTrue("project tilte must contains title", p.getTitle()
- .matches(".*project.*"));
- }
- }
-
- @Test
- public void testFindBySpaceIdAndTitleRegexBad() {
-
- List<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
- this.spaceIds.get(0), ".*foo.*");
-
- Assert.assertEquals("res must have zero length", 0, res.size());
- }
-
- @Test
- public void testFindBySpaceIdAndTitleRegexPageable() {
-
- PageRequest pr = new PageRequest(0, 1);
-
- Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
- this.spaceIds.get(0), ".*Project.*", pr);
-
- Assert.assertEquals("res must have length 1", 1,
- res.getNumberOfElements());
- for (Project p : res) {
- Assert.assertEquals("project must belong to the same space",
- this.spaceIds.get(0), p.getSpaceId());
- Assert.assertNotNull("project title must not be null", p.getTitle());
- Assert.assertTrue("project tilte must contains title", p.getTitle()
- .matches(".*project.*"));
- }
- }
-
- @Test
- public void testFindBySpaceIdAndTitleRegexPageableBadSize() {
-
- PageRequest pr = new PageRequest(0, 3);
-
- Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
- this.spaceIds.get(0), ".*Project.*", pr);
-
- Assert.assertEquals("res must have length 2", 2,
- res.getNumberOfElements());
- for (Project p : res) {
- Assert.assertEquals("project must belong to the same space",
- this.spaceIds.get(0), p.getSpaceId());
- Assert.assertNotNull("project title must not be null", p.getTitle());
- Assert.assertTrue("project tilte must contains title", p.getTitle()
- .matches(".*project.*"));
- }
- }
-
- @Test
- public void testFindBySpaceIdAndTitleRegexPageableBadPage() {
-
- PageRequest pr = new PageRequest(1, 3);
-
- Page<Project> res = this.projectsRepository.findBySpaceIdAndTitleRegex(
- this.spaceIds.get(0), ".*Project.*", pr);
-
- Assert.assertEquals("res must have length 0", 0,
- res.getNumberOfElements());
- }
-}
--- a/server/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/SpacesRepositoryTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-package org.iri_research.renkan.test.repositories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("repositories-context.xml")
-public class SpacesRepositoryTest {
-
- private final static int SPACE_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(SpacesRepositoryTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- spacesRepository.deleteAll();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
-
- @Test
- public void testFieldMapping() {
- // query json directly with mongodb driver
- // check field values
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Space.class));
-
- for (DBObject obj : coll.find()) {
- Assert.assertTrue("mongo object must have _id field",
- obj.containsField("_id"));
-
- String id = obj.get("_id").toString();
-
- Space sp = this.spacesList.get(id);
-
- Assert.assertTrue("mongo object must have title field",
- obj.containsField("title"));
- Assert.assertEquals("Titles must be the same", obj.get("title"),
- sp.getTitle());
-
- Assert.assertTrue("mongo object must have description field",
- obj.containsField("description"));
- Assert.assertEquals("description must be the same",
- obj.get("description"), sp.getDescription());
-
- Assert.assertTrue("mongo object must have color field",
- obj.containsField("color"));
- Assert.assertEquals("Color must be the same", obj.get("color"),
- sp.getColor());
-
- Assert.assertTrue("mongo object must have uri field",
- obj.containsField("uri"));
- Assert.assertEquals("Uri must be the same", obj.get("uri"),
- sp.getUri());
-
- Assert.assertTrue("mongo object must have image field",
- obj.containsField("image"));
- Assert.assertEquals("Image must be the same", obj.get("image"),
- sp.getImage());
-
- Assert.assertTrue("mongo object must have created field",
- obj.containsField("created"));
- Assert.assertEquals("Created must be the same", new DateTime(obj.get("created")),
- sp.getCreated());
-
- Assert.assertTrue("mongo object must have bin_config field",
- obj.containsField("bin_config"));
- Assert.assertEquals("Uri must be the same", obj.get("bin_config"),
- sp.getBinConfig());
-
- Assert.assertTrue("mongo object must have created_by field",
- obj.containsField("created_by"));
- Assert.assertEquals("created by must be the same",
- obj.get("created_by"), sp.getCreatedBy());
-
- }
- }
-
- @Test
- public void testPagination() {
-
- Sort s = new Sort(Direction.DESC, "created");
- Pageable p = new PageRequest(0, 2, s);
-
- Page<Space> page = this.spacesRepository.findAll(p);
-
- Assert.assertEquals("page content length must be two", 2,
- page.getNumberOfElements());
- Assert.assertEquals("id must be id of last created space",
- this.spacesUuids.get(SPACE_NB - 1), page.getContent().get(0)
- .getId());
- Assert.assertEquals("id must be id of last created space",
- this.spacesUuids.get(SPACE_NB - 2), page.getContent().get(1)
- .getId());
-
- p = new PageRequest(1, 2, s);
- page = this.spacesRepository.findAll(p);
- Assert.assertEquals("page content length must be one", 1,
- page.getNumberOfElements());
- Assert.assertEquals("id must be id of first created space",
- this.spacesUuids.get(0), page.getContent().get(0).getId());
-
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- }
-
-}
--- a/server/renkan-core/src/test/java/org/iri_research/renkan/test/repositories/UsersRepositoryTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,402 +0,0 @@
-package org.iri_research.renkan.test.repositories;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-import java.util.Map.Entry;
-
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.LocalDate;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("repositories-context.xml")
-public class UsersRepositoryTest {
-
- private final static int USER_NB = 3;
- private final static int GROUP_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(UsersRepositoryTest.class);
-
- @Autowired
- private UsersRepository usersRepository;
- @Autowired
- private GroupsRepository groupsRepository;
-
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
- private List<String> usersUuids = new ArrayList<>(USER_NB);
-
- private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
- private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
-
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- usersRepository.deleteAll();
- for(int i=0; i < USER_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
- user.setLocked(false);
- user.setEnabled(true);
- user.setAvatar("A pretty picture");
- user.setExpirationDate(new LocalDate());
- user.setCredentialsExpirationDate(new LocalDate());
- user.setEmail(String.format("user%d@mail.com", i));
- user = usersRepository.save(user);
- this.usersUuids.add(uuid);
- this.usersList.put(uuid, user);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for(int i=0; i < GROUP_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
- group.setAvatar("A pretty group picture " + i);
- group = groupsRepository.save(group);
- this.groupsUuids.add(uuid);
- this.groupsList.put(uuid, group);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
-
-
- }
-
- @Test
- public void testUserFieldMapping() {
- // query json directly with mongodb driver
- // check field values
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(User.class));
-
- for (DBObject obj : coll.find()) {
- Assert.assertTrue("mongo object must have _id field",
- obj.containsField("_id"));
-
- String id = obj.get("_id").toString();
-
- User user = this.usersList.get(id);
-
- Assert.assertTrue("mongo object must have title field",
- obj.containsField("title"));
- Assert.assertEquals("Titles must be the same",
- user.getTitle(), obj.get("title"));
-
- Assert.assertTrue("mongo object must have description field",
- obj.containsField("description"));
- Assert.assertEquals("description must be the same",
- user.getDescription(), obj.get("description"));
-
- Assert.assertTrue("mongo object must have color field",
- obj.containsField("color"));
- Assert.assertEquals("Color must be the same", user.getColor(), obj.get("color"));
-
- Assert.assertTrue("mongo object must have uri field",
- obj.containsField("uri"));
- Assert.assertEquals("Uri must be the same", user.getUri(), obj.get("uri"));
-
- Assert.assertTrue("mongo object must have locked field",
- obj.containsField("locked"));
- Assert.assertEquals("Locked must be the same", user.isLocked(), obj.get("locked"));
-
- Assert.assertTrue("mongo object must have activated field",
- obj.containsField("enabled"));
- Assert.assertEquals("Enabled must be the same", user.isEnabled(), obj.get("enabled"));
-
- Assert.assertTrue("mongo object must have expiration_date field",
- obj.containsField("expiration_date"));
- Assert.assertEquals("expiration_date must be the same", user.getExpirationDate(), new LocalDate(obj.get("expiration_date")));
-
- Assert.assertTrue("mongo object must have credentials_expiration_date field",
- obj.containsField("credentials_expiration_date"));
- Assert.assertEquals("credentials_expiration_date by must be the same", user.getCredentialsExpirationDate(), new LocalDate(obj.get("credentials_expiration_date")));
-
- Assert.assertTrue("mongo object must have email field",
- obj.containsField("email"));
- Assert.assertEquals("Email must be the same", user.getEmail(), obj.get("email"));
-
-
- }
- }
-
- @Test
- public void testSetGroupsList() {
-
- User user = this.usersList.get(this.usersUuids.get(0));
-
- List<String> groupIds = this.groupsUuids;
-
- this.usersRepository.setGroupsList(user, groupIds);
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
-
- for (Group g : this.groupsRepository.findAll(groupIds)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- }
- }
-
-
- @Test
- public void testAddGroupsList() {
- User user = this.usersList.get(this.usersUuids.get(1));
-
- List<String> groupIds = this.groupsUuids.subList(0, 1);
- this.usersRepository.setGroupsList(user, groupIds);
-
- user = this.usersRepository.findOne(user.getId());
-
- Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
-
- Group group = this.groupsRepository.findOne(groupIds.get(0));
- Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
-
- this.usersRepository.setGroupsList(user, this.groupsUuids);
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
-
- for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- }
-
- }
-
- @Test
- public void testRemoveGroupsList() {
- User user = this.usersList.get(this.usersUuids.get(2));
-
- this.usersRepository.setGroupsList(user, this.groupsUuids);
-
- user = this.usersRepository.findOne(user.getId());
-
- Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
-
- for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", group.getId()), 1, group.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
- }
-
- this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
-
- Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
-
- for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
- Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 0, otherGroup.getUsers().size());
- }
-
- }
-
- @Test
- public void testAddGroupsListExisting() {
-
- // get first user
- User user = this.usersList.get(this.usersUuids.get(0));
-
- List<String> groupIds = this.groupsUuids;
-
- // set all groups for first user
- this.usersRepository.setGroupsList(user, groupIds);
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- //check that user has all group
- Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
-
- // and that groups have all new user
- for (Group g : this.groupsRepository.findAll(groupIds)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- }
-
-
- // get second user
- user = this.usersList.get(this.usersUuids.get(1));
-
- //first set one group
- List<String> secondGroupIds = this.groupsUuids.subList(0, 1);
- this.usersRepository.setGroupsList(user, secondGroupIds);
-
- // relaod user
- user = this.usersRepository.findOne(user.getId());
-
- // check that second user has all groups
- Assert.assertEquals("user group is big enough", secondGroupIds.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(secondGroupIds));
-
- // check that group has new and old user
- Group group = this.groupsRepository.findOne(secondGroupIds.get(0));
- Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), usersUuids.get(0)), group.getUsers().contains(usersUuids.get(0)));
-
- // set all new group list for second user
- this.usersRepository.setGroupsList(user, this.groupsUuids);
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- //check that user 2 has all groups
- Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
-
- // check that all groups had user 1 and user 2
- for (Group g : this.groupsRepository.findAll(this.groupsUuids)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), usersUuids.get(0)), g.getUsers().contains(usersUuids.get(0)));
- }
-
- }
-
- @Test
- public void testRemoveGroupsListExisting() {
-
- // get first user
- User user = this.usersList.get(this.usersUuids.get(0));
-
- List<String> groupIds = this.groupsUuids;
-
- // set all groups for first user
- this.usersRepository.setGroupsList(user, groupIds);
-
- //reload user
- user = this.usersRepository.findOne(user.getId());
-
- //check that user has all group
- Assert.assertEquals("user group is big enough", groupIds.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(groupIds));
-
- // and that groups have all new user
- for (Group g : this.groupsRepository.findAll(groupIds)) {
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 1, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- }
-
- // get 3rd user
- user = this.usersList.get(this.usersUuids.get(2));
-
- // set all group for 3rd user
- this.usersRepository.setGroupsList(user, this.groupsUuids);
-
- //reload 3rd user
- user = this.usersRepository.findOne(user.getId());
-
- //check taht all group are set for 3rd user
- Assert.assertEquals("user group is big enough", this.groupsUuids.size(), user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().containsAll(this.groupsUuids));
-
- //check that all group has 3rd user and 1st user
- for(Group group : this.groupsRepository.findAll(this.groupsUuids)) {
- Assert.assertEquals(String.format("user list for group %s must be size 2", group.getId()), 2, group.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), user.getId()), group.getUsers().contains(user.getId()));
- Assert.assertTrue(String.format("user list for group %s must contains user %s", group.getId(), this.usersUuids.get(0)), group.getUsers().contains(this.usersUuids.get(0)));
- }
-
- //set new group list for 3rd user
- this.usersRepository.setGroupsList(user, this.groupsUuids.subList(GROUP_NB-1, GROUP_NB));
-
- //reload 3rd user
- user = this.usersRepository.findOne(user.getId());
-
- //check that 3rd user has only one group (last group)
- Assert.assertEquals("user group is big enough", 1, user.getGroups().size());
- Assert.assertTrue("Group list contains all group", user.getGroups().contains(this.groupsUuids.get(GROUP_NB-1)));
-
- // check that last group has 3rd and 1rst user
- Group g = this.groupsRepository.findOne(this.groupsUuids.get(GROUP_NB-1));
- Assert.assertEquals(String.format("user list for group %s must be size 1", g.getId()), 2, g.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), user.getId()), g.getUsers().contains(user.getId()));
- Assert.assertTrue(String.format("user list for group %s must contains user %s", g.getId(), this.usersUuids.get(0)), g.getUsers().contains(this.usersUuids.get(0)));
-
- // check that other groups has only 1rst user
- for(Group otherGroup: this.groupsRepository.findAll(this.groupsUuids.subList(0, GROUP_NB-2))) {
- Assert.assertEquals(String.format("user list for group %s must be size 0", otherGroup.getId()), 1, otherGroup.getUsers().size());
- Assert.assertTrue(String.format("user list for group %s must contains user %s", otherGroup.getId(), this.usersUuids.get(0)), otherGroup.getUsers().contains(this.usersUuids.get(0)));
- }
-
- }
-
- @Test
- public void testGetUsersMap() {
-
- User user = this.usersList.get(this.usersUuids.get(0));
-
- List<String> groupdIds = this.groupsUuids;
-
- this.usersRepository.setGroupsList(user, groupdIds);
-
-
- Map<String, Group> groupsMap = this.usersRepository.getGroupsMap(user);
-
- Assert.assertEquals ("Group map should have same length than groups list", this.groupsUuids.size(), groupsMap.size());
- Assert.assertTrue("Group map should contains all uuids", this.groupsUuids.containsAll(groupsMap.keySet()));
- for (Entry<String, Group> entry : groupsMap.entrySet()) {
- Assert.assertTrue("user id in user uuid", this.groupsUuids.contains(entry.getKey()));
- Assert.assertEquals("key id and value user id must be the same", entry.getKey(), entry.getValue().getId());
- }
- }
-
-
- @After
- public void teardown() {
- this.usersRepository.deleteAll();
- this.groupsRepository.deleteAll();
- }
-
-}
--- a/server/renkan-core/src/test/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration >
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.test">
- <level value="DEBUG" />
- </logger>
- <logger name="org.springframework.data.mongodb">
- <level value="DEBUG" />
- </logger>
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/renkan-core/src/test/resources/org/iri_research/renkan/test/models/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_models_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-core/src/test/resources/org/iri_research/renkan/test/repositories/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_repo_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-core/src/test/resources/org/iri_research/renkan/test/repositories/repositories-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
-
-</beans>
\ No newline at end of file
--- a/server/renkan-management/build.gradle Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-
-description = 'renkan-management'
-
-ext {
- spring_shell_version = '1.0.0.RELEASE'
-}
-
-dependencies {
- compile project(':renkan-core')
- compile group: 'org.springframework.shell', name: 'spring-shell', version:spring_shell_version
- runtime group: 'org.springframework', name: 'spring-webmvc', version:spring_version
- runtime group: 'javax.servlet', name: 'javax.servlet-api', version:javax_servlet_version
-}
-
-buildscript {
- repositories { jcenter() }
- dependencies {
- classpath 'com.github.jengelman.gradle.plugins:shadow:1.0.2'
- }
-}
-
-apply plugin: 'com.github.johnrengelman.shadow'
-
-jar {
- manifest {
- attributes 'Main-Class': 'org.springframework.shell.Bootstrap'
- }
-}
-
-shadowJar {
- exclude 'META-INF/*.SF'
- exclude 'META-INF/*.DSA'
- exclude 'META-INF/*.RSA'
-
- append('META-INF/spring.handlers')
- append('META-INF/spring.schemas')
-
-}
-
-configure(shadowJar) {
- group = BasePlugin.BUILD_GROUP
-}
--- a/server/renkan-management/pom.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan</artifactId>
- <version>0.7.11</version>
- </parent>
-
- <artifactId>renkan-management</artifactId>
- <packaging>jar</packaging>
-
- <name>renkan-management</name>
-
- <properties>
- <spring-shell-version>1.0.0.RELEASE</spring-shell-version>
- <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
- <javax-servlet-api-version>3.0.1</javax-servlet-api-version>
- <spring-version>3.2.6.RELEASE</spring-version>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan-core</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.shell</groupId>
- <artifactId>spring-shell</artifactId>
- <version>${spring-shell-version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j-log4j12-version}</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring-version}</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>${javax-servlet-api-version}</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- </configuration>
- </plugin>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- <version>2.4</version>
- <configuration>
- <archive>
- <index>true</index>
- </archive>
- </configuration>
- </plugin>
-
- <!--plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.2</version>
- <executions>
- <execution>
- <id>copy-dependencies</id>
- <phase>package</phase>
- <goals>
- <goal>copy-dependencies</goal>
- </goals>
- <configuration>
- <outputDirectory>${project.build.directory}/lib</outputDirectory>
- <overWriteReleases>true</overWriteReleases>
- <overWriteSnapshots>true</overWriteSnapshots>
- <overWriteIfNewer>true</overWriteIfNewer>
- </configuration>
- </execution>
- </executions>
- </plugin-->
- <plugin>
- <!-- create an all-in-one executable jar with maven-shade-plugin
- bound to phase:package
- special handling for spring.handlers/spring.schemas files
- to prevent overwriting (maven-shade-plugin joins them to
- one file)
-
- usage:
- cd to <project>/target
- java -jar hello-world-java-1.0-SNAPSHOT-executable.jar spring/batch/job/hello-world-job.xml helloWorldJob
- -->
- <artifactId>maven-shade-plugin</artifactId>
- <version>2.3</version>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>org.springframework.shell.Bootstrap</mainClass>
- </transformer>
- <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
- <resource>META-INF/spring.handlers</resource>
- </transformer>
- <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
- <resource>META-INF/spring.schemas</resource>
- </transformer>
- </transformers>
- <shadedArtifactAttached>true</shadedArtifactAttached>
- <!-- configures the suffix name for the executable jar
- here it will be '<project.artifact>-<project.version>-executable.jar'-->
- <shadedClassifierName>full</shadedClassifierName>
- <!--finalName>renkan-management-full-${project.version}</finalName-->
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-</project>
--- a/server/renkan-management/src/main/java/org/iri_research/renkan/management/CorrectProjectId.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-package org.iri_research.renkan.management;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.shell.core.CommandMarker;
-import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.stereotype.Component;
-
-@Component
-public class CorrectProjectId implements CommandMarker {
-
-// public static void main(String[] args) {
-
-// @SuppressWarnings("resource")
-// ApplicationContext context = new ClassPathXmlApplicationContext(
-// "classpath:META-INF/applicationContext.xml");
-
-// CorrectProjectId p = context.getBean(CorrectProjectId.class);
-// p.start(args);
-
-// }
-
- @Autowired
- private ProjectsRepository projectsRepository;
- @Autowired
- private NodesRepository nodesRepository;
- @Autowired
- private EdgesRepository edgesRepository;
-
- @CliAvailabilityIndicator({"correct-project-id"})
- public boolean isCommandAvailable() {
- return true;
- }
-
- @CliCommand(value="correct-project-id", help="correct-project-id")
- public void start() {
-
- for (Project proj : projectsRepository.findAll()) {
-
- System.out.format("Processing project %s %n", proj.getId());
-
- if(proj.getNodes() != null) {
- List<Node> nodes = new ArrayList<>();
- for(Node node: proj.getNodes()) {
- if(node != null && node.getProjectId() == null) {
- node.setProjectId(proj.getId());
- nodes.add(node);
- }
- }
- nodesRepository.save(nodes);
- }
- System.out.format("Node saved %s %n", proj.getId());
-
- if(proj.getEdges() != null) {
- List<Edge> edges = new ArrayList<>();
- for(Edge edge : proj.getEdges()) {
- if(edge != null && edge.getProjectId() == null) {
- edge.setProjectId(proj.getId());
- edges.add(edge);
- }
- }
- edgesRepository.save(edges);
- }
- System.out.format("Edge saved %s %n", proj.getId());
- }
- }
-}
--- a/server/renkan-management/src/main/java/org/iri_research/renkan/management/MigrateRenkanUser.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-package org.iri_research.renkan.management;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.RenkanUser;
-import org.iri_research.renkan.models.User;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.shell.core.CommandMarker;
-import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
-import org.springframework.shell.core.annotation.CliCommand;
-import org.springframework.stereotype.Component;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import com.mongodb.WriteConcern;
-
-@Component
-public class MigrateRenkanUser implements CommandMarker {
-
- @CliAvailabilityIndicator({"migrate-renkan-user"})
- public boolean isCommandAvailable() {
- return true;
- }
-
- @Autowired
- private MongoTemplate template;
-
- @CliCommand(value="migrate-renkan-user", help="Migrate Renkan User")
- public void start() {
-
- DBCollection userColl = template.getCollection(template
- .getCollectionName(User.class));
- DBCollection renkanUserColl = template.getCollection(template
- .getCollectionName(RenkanUser.class));
- DBCollection projectColl = template.getCollection(template
- .getCollectionName(Project.class));
-
- for (DBObject user : userColl.find()) {
- if (!user.containsField("project_id")) {
- continue;
- }
- String projectId = (String) user.get("project_id");
- if (projectId == null || projectId.isEmpty()) {
- user.removeField("project_id");
- userColl.save(user);
- continue;
- }
- DBObject proj = new BasicDBObject();
- proj.put("_id", projectId);
- if (projectColl.findOne(proj) != null) {
- DBObject renkanUser = new BasicDBObject();
- renkanUser.put("project_id", projectId);
- renkanUser.put("user_id", user.get("_id"));
- if (renkanUserColl.findOne(renkanUser) == null) {
- System.out.println(String.format("%s : %s : %s",
- user.get("_id"), user.get("title"),
- user.get("project_id")));
- renkanUser = new BasicDBObject();
- renkanUser.put("project_id", user.get("project_id"));
- renkanUser.put("user_id", user.get("_id"));
- renkanUser.put("color", user.get("color"));
- renkanUserColl.insert(renkanUser);
- }
- user.removeField("project_id");
- userColl.save(user);
- } else {
- userColl.remove(user, WriteConcern.ACKNOWLEDGED);
- }
- }
-
- }
-}
--- a/server/renkan-management/src/main/resources/META-INF/applicationContext.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd"
->
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
- <mvc:annotation-driven />
-
- <util:properties id="propsLocations">
- <prop key="servletContextProps">META-INF/renkan.properties</prop>
- <prop key="classpathProps">classpath:renkan_run.properties</prop>
- </util:properties>
-
- <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1000"/>
- <property name="location" value="#{propsLocations.servletContextProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="false"/>
- </bean>
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1"/>
- <property name="location" value="#{propsLocations.classpathProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="true"/>
- </bean>
-
- <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="IgnoreResourceNotFound" value="true"/>
- <property name="locations">
- <list>
- <value>#{propsLocations.servletContextProps}</value>
- <value>#{propsLocations.classpathProps}</value>
- </list>
- </property>
- <property name="fileEncoding" value="UTF-8"/>
- </bean>
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <bean class="org.iri_research.renkan.RenkanProperties"
- factory-method="getInstance" />
-
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
- <context:component-scan base-package="org.iri_research.renkan.management" />
-
- <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
- <property name="basenames">
- <list>
- <value>META-INF/i18n/messages</value>
- <value>classpath:org/springframework/security/messages</value>
- </list>
- </property>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="fallbackToSystemLocale" value="true" />
- </bean>
-
-</beans>
--- a/server/renkan-management/src/main/resources/META-INF/renkan.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-mongodb.host.name = localhost
-mongodb.host.port = 27017
-mongodb.db.name = renkan
-
-user.admin.name = admin
-#user.admin.password = admin
-user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
-
-renkan.pagination.size = 2
-renkan.coweb.debug = false
-renkan.coweb.websocket = true
\ No newline at end of file
--- a/server/renkan-management/src/main/resources/META-INF/spring/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
-
- <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="META-INF/renkan.properties"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="${mongodb.db.name}"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-management/src/main/resources/META-INF/spring/spring-shell-plugin.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd
- ">
-
- <context:annotation-config />
- <mvc:annotation-driven />
-
- <context:component-scan base-package="org.iri_research.renkan.management" />
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.repositories" />
-
- <util:properties id="propsLocations">
- <prop key="servletContextProps">META-INF/renkan.properties</prop>
- <prop key="classpathProps">classpath:renkan_run.properties</prop>
- </util:properties>
-
- <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1000"/>
- <property name="location" value="#{propsLocations.servletContextProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="false"/>
- </bean>
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1"/>
- <property name="location" value="#{propsLocations.classpathProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="true"/>
- </bean>
-
- <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="IgnoreResourceNotFound" value="true"/>
- <property name="locations">
- <list>
- <value>#{propsLocations.servletContextProps}</value>
- <value>#{propsLocations.classpathProps}</value>
- </list>
- </property>
- <property name="fileEncoding" value="UTF-8"/>
- </bean>
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean class="org.iri_research.renkan.RenkanProperties"
- factory-method="getInstance" />
-
-</beans>
\ No newline at end of file
--- a/server/renkan-management/src/main/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration>
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.beans.factory">
- <level value="INFO" />
- </logger>
- <!--logger name="org.cometd">
- <level value="DEBUG" />
- </logger-->
- <!--logger name="org.coweb">
- <level value="DEBUG" />
- </logger-->
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/renkan-management/src/test/java/org/iri_research/renkan/AppTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-package org.iri_research.renkan;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-/**
- * Unit test for simple App.
- */
-public class AppTest
-{
- /**
- * Rigourous Test :-)
- */
- @Test
- public void testApp()
- {
- assertTrue( true );
- }
-}
--- a/server/renkan-web/build.gradle Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-buildscript {
- repositories {
- jcenter()
- }
- dependencies {
- classpath 'org.akhikhl.gretty:gretty:1.0.0'
- }
-}
-
-repositories {
- maven { url "lib" }
- jcenter()
-}
-
-apply plugin: 'war'
-apply plugin: 'org.akhikhl.gretty'
-
-description = ''
-
-gretty {
- servletContainer = 'jetty8'
- host = '0.0.0.0'
- port = 8080
- contextPath = '/renkan'
-}
-
-
-ext {
- javax_ws_rs_api_version = '2.0'
- javax_annotation_api_version = '1.2'
- cometd_version = '2.7.0'
- coweb_version = '1.0.1-SNAPSHOT'
- cowebx_version = '1.0'
- jersey_version = '2.5.1'
- thymeleaf_version = '2.1.3.RELEASE'
- thymeleaf_extra_version = '2.1.1.RELEASE'
- thymeleaf_joda_dialect_version = '0.0.3'
- commons_io_version = '2.4'
- guava_version = '17.0'
- nekohtml_version = '1.9.19'
- validation_api_version = '1.1.0.Final'
- hibernate_validator_version = '5.0.1.Final'
- jstl_version = '1.2'
- json_path_assert_version = '0.9.1'
-}
-
-
-dependencies {
- compile project(':renkan-core')
- compile group: 'javax.inject', name: 'javax.inject', version:java_inject_version
- compile group: 'javax.servlet', name: 'javax.servlet-api', version:javax_servlet_version
- compile group: 'javax.ws.rs', name: 'javax.ws.rs-api', version:javax_ws_rs_api_version
- compile group: 'javax.annotation', name: 'javax.annotation-api', version:javax_annotation_api_version
- compile(group: 'org.cometd.java', name: 'bayeux-api', version:cometd_version) {
- exclude group: 'org.eclipse.jetty'
- }
- compile(group: 'org.cometd.java', name: 'cometd-java-common', version:cometd_version) {
- exclude group: 'org.eclipse.jetty'
- }
- compile(group: 'org.cometd.java', name: 'cometd-java-annotations', version:cometd_version) {
- exclude group: 'org.eclipse.jetty'
- }
- compile(group: 'org.cometd.java', name: 'cometd-websocket-jetty', version:cometd_version) {
- exclude group: 'org.eclipse.jetty'
- }
- compile (group: 'org.opencoweb', name: 'coweb-bots', version:coweb_version) {
- exclude group: 'org.eclipse.jetty'
- }
- compile (group: 'org.opencoweb', name: 'coweb-server', version:coweb_version) {
- exclude group: 'org.eclipse.jetty'
- }
- providedCompile (group: 'org.opencoweb', name: 'coweb-javascript', version:coweb_version) {
- exclude group: 'org.eclipse.jetty'
- }
- providedCompile group: 'org.opencoweb.cowebx', name: 'cowebx-widgets-dojo', version:cowebx_version
- compile group: 'org.glassfish.jersey.core', name: 'jersey-server', version:jersey_version
- compile group: 'org.glassfish.jersey.ext', name: 'jersey-spring3', version:jersey_version
- compile group: 'org.mongodb', name: 'mongo-java-driver', version:mongo_java_driver_version
- compile group: 'org.springframework', name: 'spring-core', version:spring_version
- compile group: 'org.springframework', name: 'spring-context', version:spring_version
- compile group: 'org.springframework', name: 'spring-web', version:spring_version
- compile group: 'org.springframework', name: 'spring-webmvc', version:spring_version
- compile group: 'org.springframework.data', name: 'spring-data-commons', version:spring_data_commons_version
- compile group: 'org.springframework.data', name: 'spring-data-jpa', version:spring_data_jpa_version
- compile group: 'org.springframework.data', name: 'spring-data-mongodb', version:spring_data_mongodb_version
- compile group: 'javax.persistence', name: 'persistence-api', version:persistence_api_version
- compile group: 'org.thymeleaf', name: 'thymeleaf', version:thymeleaf_version
- compile group: 'org.thymeleaf', name: 'thymeleaf-spring3', version:thymeleaf_version
- compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity3', version:thymeleaf_extra_version
- compile group: 'org.thymeleaf.extras', name: 'thymeleaf-joda-dialect', version:thymeleaf_joda_dialect_version
- compile group: 'net.sourceforge.nekohtml', name: 'nekohtml', version:nekohtml_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version:jackson_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version:jackson_version
- compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version:jackson_version
- compile group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version:jackson_version
- compile group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-joda', version:jackson_version
- compile group: 'commons-codec', name: 'commons-codec', version:commons_codec_version
- compile group: 'org.springframework.security', name: 'spring-security-core', version:spring_security_version
- compile group: 'org.springframework.security', name: 'spring-security-web', version:spring_security_version
- compile group: 'org.springframework.security', name: 'spring-security-config', version:spring_security_version
- compile group: 'org.springframework.security', name: 'spring-security-acl', version:spring_security_version
- compile group: 'org.springframework.security', name: 'spring-security-taglibs', version:spring_security_version
- compile group: 'de.undercouch', name: 'bson4jackson', version:jackson_version
- compile group: 'joda-time', name: 'joda-time', version:joda_time_version
- compile group: 'javax.validation', name: 'validation-api', version:validation_api_version
- compile group: 'org.hibernate', name: 'hibernate-validator', version:hibernate_validator_version
- compile group: 'com.google.guava', name: 'guava', version:guava_version
- runtime group: 'javax.servlet', name: 'jstl', version:jstl_version
- runtime group: 'org.eclipse.jetty.aggregate', name: 'jetty-all', version:jetty_version
- testCompile group: 'org.glassfish.jersey.test-framework.providers', name: 'jersey-test-framework-provider-grizzly2', version:jersey_version
- testCompile group: 'org.springframework', name: 'spring-test', version:spring_version
- testCompile group: 'com.jayway.jsonpath', name: 'json-path-assert', version:json_path_assert_version
- testCompile group: 'commons-io', name: 'commons-io', version:commons_io_version
-}
-
-//apply overlay
-
-war {
- manifest { attributes(
- "Implementation-Vendor": organization,
- "Implementation-Title": project.name,
- "Implementation-Version": project.version,
- "Implementation-Vendor-Id": project.group,
- "Built-By": "$System.env.USER",
- "Build-Jdk": org.gradle.internal.SystemProperties.javaVersion,
- "Specification-Vendor": organization,
- "Specification-Title": project.name,
- "Specification-Version": project.version
- ) }
-
- // coweb-javascript
- from({ zipTree(configurations.providedCompile.filter{ it.name.startsWith('coweb-javascript') && it.name.endsWith(".war")}.singleFile)}) {
- exclude "META-INF/**"
- exclude "WEB-INF/**"
- into "lib"
- }
-
- from( {zipTree(configurations.providedCompile.filter{ it.name.startsWith('cowebx-widgets-dojo') && it.name.endsWith(".war")}.singleFile)}) {
- exclude "META-INF/**"
- exclude "WEB-INF/**"
- into "lib/cowebx/dojo"
- }
-
- from("../../client/dist/js") {
- include "*.js"
- into "static/js"
- }
- from("../../client/dist/lib") {
- into "static/lib"
- }
- from("../../client/dist/css") {
- include "*.css"
- into "static/css"
- }
- from("../../client/dist/img") {
- into "static/img"
- }
- from("../../client/dist/data") {
- include "properties.json"
- into "static/data"
- }
-}
-
--- a/server/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:20 CEST 2013
-admin-archetype-1.0.1-SNAPSHOT.jar>=
-admin-archetype-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/admin-archetype-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/admin-archetype-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-admin</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>admin-archetype</artifactId>
- <packaging>maven-archetype</packaging>
- <name>OpenCoweb :: Java :: Admin :: Archetype</name>
-
- <build>
- <extensions>
- <extension>
- <groupId>org.apache.maven.archetype</groupId>
- <artifactId>archetype-packaging</artifactId>
- <version>2.0-alpha-5</version>
- </extension>
- </extensions>
- <plugins>
- <plugin>
- <artifactId>maven-archetype-plugin</artifactId>
- <version>2.0-alpha-4</version>
- <extensions>true</extensions>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <filtering>false</filtering>
- </resource>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <includes>
- <include>**/archetype-metadata.xml</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
-
-</project>
--- a/server/renkan-web/lib/org/opencoweb/admin-archetype/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>admin-archetype</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145420</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145420</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145420</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/admin-archetype/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>admin-archetype</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145420</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:21 CEST 2013
-admin-jar-1.0.1-SNAPSHOT.jar>=
-admin-jar-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/admin-jar-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/admin-jar-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-admin</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>admin-jar</artifactId>
- <packaging>jar</packaging>
- <name>OpenCoweb :: Java :: Admin :: Jar</name>
-
- <dependencies>
- <dependency>
- <groupId>javax</groupId>
- <artifactId>javaee-api</artifactId>
- <version>6.0</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.wink</groupId>
- <artifactId>wink-json4j</artifactId>
- <version>1.1.2-incubating</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <version>${project.version}</version>
- <type>jar</type>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-</project>
--- a/server/renkan-web/lib/org/opencoweb/admin-jar/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>admin-jar</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145421</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145421</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145421</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/admin-jar/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>admin-jar</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145421</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:20 CEST 2013
-coweb-admin-1.0.1-SNAPSHOT.pom>=
--- a/server/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/coweb-admin-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>coweb-admin</artifactId>
- <packaging>pom</packaging>
- <name>OpenCoweb :: Java :: Admin</name>
-
- <modules>
- <module>admin-archetype</module>
- <module>admin-jar</module>
- </modules>
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-admin/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-admin</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145420</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145420</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-admin/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-admin</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145420</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:20 CEST 2013
-coweb-archetype-1.0.1-SNAPSHOT.jar>=
-coweb-archetype-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/coweb-archetype-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/coweb-archetype-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-archetype</artifactId>
- <packaging>maven-archetype</packaging>
- <name>OpenCoweb :: Java :: Archetype</name>
-
- <build>
- <extensions>
- <extension>
- <groupId>org.apache.maven.archetype</groupId>
- <artifactId>archetype-packaging</artifactId>
- <version>2.0-alpha-5</version>
- </extension>
- </extensions>
- <plugins>
- <plugin>
- <artifactId>maven-archetype-plugin</artifactId>
- <version>2.0-alpha-4</version>
- <extensions>true</extensions>
- </plugin>
- </plugins>
- <resources>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <filtering>false</filtering>
- </resource>
- <resource>
- <directory>${basedir}/src/main/resources</directory>
- <includes>
- <include>**/archetype-metadata.xml</include>
- </includes>
- <filtering>true</filtering>
- </resource>
- </resources>
- </build>
-
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-archetype/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-archetype</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145420</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145420</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145420</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-archetype/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-archetype</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145420</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:09 CEST 2013
-coweb-bots-1.0.1-SNAPSHOT.jar>=
-coweb-bots-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/coweb-bots-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/coweb-bots-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>coweb-bots</artifactId>
- <groupId>org.opencoweb</groupId>
- <packaging>jar</packaging>
- <name>OpenCoweb :: Java :: Bots</name>
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-bots/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-bots</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145409</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145409</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145409</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-bots/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-bots</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145409</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:22 CEST 2013
-coweb-build-1.0.1-SNAPSHOT.pom>=
-coweb-build-1.0.1-SNAPSHOT.war>=
--- a/server/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/coweb-build-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <artifactId>coweb-build</artifactId>
- <name>OpenCoweb Build :: Applications</name>
- <packaging>war</packaging>
-
- <build>
- <plugins>
-
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.1.1</version>
- <configuration>
- <overlays>
- <overlay>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <type>war</type>
- <excludes>
- <exclude>META-INF/**</exclude>
- <exclude>WEB-INF/**</exclude>
- </excludes>
- <targetPath>lib</targetPath>
- </overlay>
- </overlays>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <dependencies>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-bots</artifactId>
- <version>${coweb-version}</version>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-operationengine</artifactId>
- <version>${coweb-version}</version>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <version>${coweb-version}</version>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <version>${coweb-version}</version>
- <type>war</type>
- </dependency>
- </dependencies>
-</project>
Binary file server/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/coweb-build-1.0.1-SNAPSHOT.war has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-build/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-build</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145422</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>war</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145422</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145422</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-build/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-build</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145422</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:19 CEST 2013
-coweb-client-1.0.1-SNAPSHOT.jar>=
-coweb-client-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/coweb-client-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/coweb-client-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-client</artifactId>
- <name>OpenCoweb :: Java :: Client</name>
-
- <dependencies>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-java-client</artifactId>
- <version>${cometd-version}</version>
- </dependency>
- </dependencies>
-
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-client/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-client</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145419</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145419</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145419</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-client/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-client</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145419</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:04 CEST 2013
-coweb-java-1.0.1-SNAPSHOT.pom>=
--- a/server/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/coweb-java-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <packaging>pom</packaging>
-
- <name>OpenCoweb</name>
- <description>Open Cooperative Web Framework</description>
- <version>1.0.1-SNAPSHOT</version>
- <url>http://opencoweb.org</url>
- <inceptionYear>2011</inceptionYear>
- <organization>
- <name>The Dojo Foundation</name>
- <url>http://dojofoundation.org</url>
- </organization>
-
- <licenses>
- <license>
- <name>The New BSD License</name>
- <url>http://www.opensource.org/licenses/bsd-license.html</url>
- </license>
- <license>
- <name>The Academic Free License, v. 2.1</name>
- <url>http://en.wikipedia.org/wiki/Academic_Free_License</url>
- </license>
- </licenses>
-
- <developers>
- <developer>
- <id>parente</id>
- <name>Peter Parente</name>
- <email>pparent@us.ibm.com</email>
- <organization>IBM Corporation</organization>
- </developer>
- <developer>
- <id>bpburns</id>
- <name>Brian Burns</name>
- <email>bburns@us.ibm.com</email>
- <organization>IBM Corporation</organization>
- </developer>
- <developer>
- <id>vinomaster</id>
- <name>Dan Gisolfi</name>
- <email>gisolfi@us.ibm.com</email>
- <organization>IBM Corporation</organization>
- </developer>
- </developers>
-
- <scm>
- <connection>scm:git:git@github.com:opencoweb/coweb.git</connection>
- <developerConnection>scm:git:git@github.com:opencoweb/coweb.git</developerConnection>
- <url>git@github.com:opencoweb/coweb.git</url>
- </scm>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <cometd-version>2.7.0</cometd-version>
- <coweb-version>1.0.1-SNAPSHOT</coweb-version>
- </properties>
-
- <modules>
- <module>coweb-operationengine</module>
- <module>coweb-bots</module>
- <module>coweb-server</module>
- <module>coweb-javascript</module>
- <module>coweb-client</module>
- <module>coweb-archetype</module>
- <module>coweb-admin</module>
- <module>coweb-build</module>
- </modules>
-
- <build>
- <defaultGoal>install</defaultGoal>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>2.7</version>
- <configuration>
- <doctitle>${project.name} ${project.version} Java Server API</doctitle>
- </configuration>
- <executions>
- <execution>
- <id>aggregate</id>
- <goals>
- <goal>aggregate</goal>
- </goals>
- <phase>site</phase>
- <configuration></configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- <pluginManagement>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- </plugins>
- </pluginManagement>
- </build>
- <profiles>
- <profile>
- <id>release-sign-artifacts</id>
- <activation>
- <property>
- <name>performRelease</name>
- <value>true</value>
- </property>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-gpg-plugin</artifactId>
- <version>1.1</version>
- <executions>
- <execution>
- <id>sign-artifacts</id>
- <phase>verify</phase>
- <goals>
- <goal>sign</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </profile>
- </profiles>
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-java/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145404</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145404</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-java/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145404</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:19 CEST 2013
-coweb-javascript-1.0.1-SNAPSHOT.pom>=
-coweb-javascript-1.0.1-SNAPSHOT.war>=
--- a/server/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/coweb-javascript-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <name>OpenCoweb :: Java :: JavaScript</name>
- <packaging>war</packaging>
-
- <properties>
- <i18n-plugin-url>http://requirejs.org/docs/release/1.0.0/minified/i18n.js</i18n-plugin-url>
- <coweb-jsoe>${project.build.directory}/${project.artifactId}-${project.version}/coweb/jsoe</coweb-jsoe>
- <coweb-jsoe-src>src/main/webapp/coweb/jsoe</coweb-jsoe-src>
- </properties>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.2</version>
- <configuration>
- <warSourceExcludes>coweb/jsoe/</warSourceExcludes>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.4</version>
- <executions>
- <execution>
- <id>unpack</id>
- <phase>compile</phase>
- <goals><goal>unpack</goal></goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.cometd.javascript</groupId>
- <artifactId>cometd-javascript-common</artifactId>
- <version>${cometd.version}</version>
- <type>war</type>
- <overWrite>false</overWrite>
- <outputDirectory>${project.build.directory}/tmp</outputDirectory>
- <includes>**/cometd.js,**/cometd/AckExtension.js</includes>
- </artifactItem>
- </artifactItems>
- <!-- other configurations here -->
- </configuration>
- </execution>
- </executions>
-
- </plugin>
- <plugin>
- <artifactId>maven-antrun-plugin</artifactId>
- <executions>
- <execution>
- <phase>prepare-package</phase>
- <configuration>
- <tasks>
- <property name="workpath" location="${project.build.directory}/tmp" />
- <echo message="HERE *************************** ${workpath}" />
-
- <!-- Pull in cometd. -->
- <delete dir="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd" />
- <copy file="${workpath}/org/cometd.js"
- tofile="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd.js" />
- <copy file="${workpath}/org/cometd/AckExtension.js"
- tofile="${project.build.directory}/${project.artifactId}-${project.version}/org/cometd/AckExtension.js" />
-
- <!-- Pull in requirejs's i18n library. -->
- <mkdir dir="${project.build.directory}/${project.artifactId}-${project.version}/org/requirejs"/>
- <get src="${i18n-plugin-url}"
- dest="${project.build.directory}/${project.artifactId}-${project.version}/org/requirejs/i18n.js"/>
-
- <!-- Use only the relevant coweb-jsoe files. -->
- <copy todir="${coweb-jsoe}">
- <fileset dir="${coweb-jsoe-src}/src/coweb/jsoe">
- <include name="*.js" />
- <exclude name="OTEngine.js" />
- </fileset>
- </copy>
- <copy todir="${coweb-jsoe}/nls">
- <fileset dir="${coweb-jsoe-src}/src/coweb/jsoe/nls" />
- </copy>
-
- </tasks>
- </configuration>
- <goals>
- <goal>run</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>org.cometd.javascript</groupId>
- <artifactId>cometd-javascript-common</artifactId>
- <version>${cometd-version}</version>
- <type>war</type>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-</project>
Binary file server/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/coweb-javascript-1.0.1-SNAPSHOT.war has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-javascript/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145419</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>war</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145419</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145419</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-javascript/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145419</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:09 CEST 2013
-coweb-operationengine-1.0.1-SNAPSHOT.jar>=
-coweb-operationengine-1.0.1-SNAPSHOT.pom>=
Binary file server/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/coweb-operationengine-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/coweb-operationengine-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-operationengine</artifactId>
- <name>OpenCoweb :: Java :: OperationEngine</name>
-
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-operationengine/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-operationengine</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145409</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145409</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145409</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-operationengine/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-operationengine</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145409</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/_remote.repositories Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
-#Mon Oct 14 16:54:10 CEST 2013
-coweb-server-1.0.1-SNAPSHOT.pom>=
-coweb-server-1.0.1-SNAPSHOT.jar>=
Binary file server/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/coweb-server-1.0.1-SNAPSHOT.jar has changed
--- a/server/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/coweb-server-1.0.1-SNAPSHOT.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-java</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- </parent>
-
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <name>OpenCoweb :: Java :: Server</name>
-
- <dependencies>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-bots</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-operationengine</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-java-server</artifactId>
- <version>${cometd-version}</version>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>bayeux-api</artifactId>
- <version>${cometd-version}</version>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-java-common</artifactId>
- <version>${cometd-version}</version>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-websocket-jetty</artifactId>
- <version>${cometd-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
- </dependencies>
-
-</project>
--- a/server/renkan-web/lib/org/opencoweb/coweb-server/1.0.1-SNAPSHOT/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata modelVersion="1.1.0">
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <versioning>
- <snapshot>
- <localCopy>true</localCopy>
- </snapshot>
- <lastUpdated>20131014145410</lastUpdated>
- <snapshotVersions>
- <snapshotVersion>
- <extension>jar</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145410</updated>
- </snapshotVersion>
- <snapshotVersion>
- <extension>pom</extension>
- <value>1.0.1-SNAPSHOT</value>
- <updated>20131014145410</updated>
- </snapshotVersion>
- </snapshotVersions>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/coweb-server/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <versioning>
- <versions>
- <version>1.0.1-SNAPSHOT</version>
- </versions>
- <lastUpdated>20131014145410</lastUpdated>
- </versioning>
-</metadata>
--- a/server/renkan-web/lib/org/opencoweb/maven-metadata-local.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<metadata>
- <plugins>
- <plugin>
- <name>OpenCoweb :: Java :: Archetype</name>
- <prefix>coweb-archetype</prefix>
- <artifactId>coweb-archetype</artifactId>
- </plugin>
- <plugin>
- <name>OpenCoweb :: Java :: Admin :: Archetype</name>
- <prefix>admin-archetype</prefix>
- <artifactId>admin-archetype</artifactId>
- </plugin>
- </plugins>
-</metadata>
Binary file server/renkan-web/lib/org/thymeleaf/extras/thymeleaf-joda-dialect/0.0.3/thymeleaf-joda-dialect-0.0.3.jar has changed
--- a/server/renkan-web/lib/org/thymeleaf/extras/thymeleaf-joda-dialect/0.0.3/thymeleaf-joda-dialect-0.0.3.pom Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.thymeleaf.extras</groupId>
- <artifactId>thymeleaf-joda-dialect</artifactId>
- <version>0.0.3</version>
- <inceptionYear>2013</inceptionYear>
- <contributors>
- <contributor>
- <name>Tom-Steve Watzke</name>
- <email>ts.watzke@pitcom.de</email>
- <roles>
- <role>Project creator and Lead developer</role>
- </roles>
- </contributor>
- <contributor>
- <name>Dieter Hubau</name>
- <email>dhubau@gmail.com</email>
- <roles>
- <role>Developer</role>
- </roles>
- </contributor>
- </contributors>
- <description>Thymeleaf dialect for formatting Joda Time objects</description>
-
- <properties>
- <java-version>1.7</java-version>
- <org.springframework-version>3.2.4.RELEASE</org.springframework-version>
- <org.springsecurityframework-version>3.2.4.RELEASE</org.springsecurityframework-version>
- <org.thymeleaf-version>2.1.1.RELEASE</org.thymeleaf-version>
- </properties>
-
- <dependencies>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
-
- <!-- thymeleaf html5 template resolver -->
- <dependency>
- <groupId>org.thymeleaf</groupId>
- <artifactId>thymeleaf</artifactId>
- <version>${org.thymeleaf-version}</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.thymeleaf</groupId>
- <artifactId>thymeleaf-spring3</artifactId>
- <version>${org.thymeleaf-version}</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
- <groupId>joda-time</groupId>
- <artifactId>joda-time</artifactId>
- <version>2.1</version>
- <type>jar</type>
- <scope>compile</scope>
- </dependency>
-
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${org.springframework-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.8.1</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.tomcat.maven</groupId>
- <artifactId>tomcat7-maven-plugin</artifactId>
- <version>2.0</version>
- <executions>
- <execution>
- <id>deploy</id>
- <phase>pre-integration-test</phase>
- <goals>
- <goal>deploy</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.3.2</version>
- <configuration>
- <source>${java-version}</source>
- <target>${java-version}</target>
- <compilerArgument>-Xlint:all</compilerArgument>
- <showWarnings>true</showWarnings>
- <showDeprecation>true</showDeprecation>
- <failOnMissingWebXml>false</failOnMissingWebXml>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
- <repositories>
- <!-- Necessary if using milestone builds of SpringSource products (as above) -->
- <repository>
- <id>spring-snapshot</id>
- <name>Spring Maven SNAPSHOT Repository</name>
- <url>http://repo.springsource.org/libs-snapshot</url>
- </repository>
- <!-- Required, as Spring JavaConfig has dependencies on released versions
- of SpringSource products -->
- <repository>
- <id>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</id>
- <url>http://repository.springsource.com/maven/bundles/release</url>
- </repository>
- <!-- Required, as Spring JavaConfig has dependencies on External OSGi bundles -->
- <repository>
- <id>SpringSource Enterprise Bundle Repository - External Bundle Releases</id>
- <url>http://repository.springsource.com/maven/bundles/external</url>
- </repository>
- <repository>
- <id>java.net</id>
- <url>http://download.java.net/maven/2/</url>
- </repository>
- </repositories>
-</project>
--- a/server/renkan-web/pom.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,650 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan</artifactId>
- <version>0.7.11</version>
- </parent>
- <artifactId>renkan-web</artifactId>
- <packaging>war</packaging>
-
- <properties>
- <surefire-version>2.16</surefire-version>
- <coweb-version>1.0.1-SNAPSHOT</coweb-version>
- <cowebx-version>1.0</cowebx-version>
- <jersey-version>2.5.1</jersey-version>
- <spring-version>3.2.6.RELEASE</spring-version>
- <spring-data-mongodb-version>1.3.3.RELEASE</spring-data-mongodb-version>
- <spring-security-version>3.2.0.RELEASE</spring-security-version>
- <spring-data-commons-version>1.6.3.RELEASE</spring-data-commons-version>
- <spring-data-jpa-version>1.4.3.RELEASE</spring-data-jpa-version>
- <jetty-plugin-version>8.1.15.v20140411</jetty-plugin-version>
- <jetty-version>8.1.15.v20140411</jetty-version>
- <junit-version>4.11</junit-version>
- <thymeleaf-version>2.1.3.RELEASE</thymeleaf-version>
- <thymeleaf-springsecurity-version>2.1.1.RELEASE</thymeleaf-springsecurity-version>
- <thymeleaf-joda-dialect-version>0.0.3</thymeleaf-joda-dialect-version>
- <cometd-version>2.7.0</cometd-version>
- <jackson-version>2.2.3</jackson-version>
- <joda-version>2.3</joda-version>
- <mongo-driver-version>2.11.4</mongo-driver-version>
- <jaxrs-api-version>2.0</jaxrs-api-version>
- <javax-annotation-version>1.2</javax-annotation-version>
- <javax-inject-version>1</javax-inject-version>
- <javax-servlet-api-version>3.0.1</javax-servlet-api-version>
- <javax-servlet-jstl-version>1.2</javax-servlet-jstl-version>
- <javax-persistence-api-version>1.0.2</javax-persistence-api-version>
- <javax-validation-api-version>1.1.0.Final</javax-validation-api-version>
- <hibernate-validator-version>5.0.1.Final</hibernate-validator-version>
- <slf4j-log4j12-version>1.7.5</slf4j-log4j12-version>
- <nekohtml-version>1.9.19</nekohtml-version>
- <commons-codec-version>1.8</commons-codec-version>
- <bson4jackson-version>2.2.3</bson4jackson-version>
- <guava-version>17.0</guava-version>
- <json-path-version>0.9.1</json-path-version>
- <commons-io-version>2.4</commons-io-version>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-
- <build>
- <defaultGoal>package</defaultGoal>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.1</version>
- <configuration>
- <source>1.7</source>
- <target>1.7</target>
- <compilerArgs>
- <arg>-Xlint</arg>
- </compilerArgs>
- </configuration>
- </plugin>
-
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>${jetty-plugin-version}</version>
- <configuration>
- <scanIntervalSeconds>10</scanIntervalSeconds>
- <webApp>
- <contextPath>/renkan</contextPath>
- </webApp>
- </configuration>
- </plugin>
-
- <plugin>
- <artifactId>maven-war-plugin</artifactId>
- <version>2.3</version>
- <configuration>
- <failOnError>false</failOnError>
- <archive>
- <manifest>
- <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
- <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
- </manifest>
- </archive>
- <overlays>
- <overlay>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <type>war</type>
- <excludes>
- <exclude>META-INF/**</exclude>
- <exclude>WEB-INF/**</exclude>
- </excludes>
- <targetPath>lib</targetPath>
- </overlay>
- <overlay>
- <groupId>org.opencoweb.cowebx</groupId>
- <artifactId>cowebx-widgets-dojo</artifactId>
- <type>war</type>
- <excludes>
- <exclude>META-INF/**</exclude>
- <exclude>WEB-INF/**</exclude>
- </excludes>
- <targetPath>lib/cowebx/dojo</targetPath>
- </overlay>
- </overlays>
- <webResources>
- <resource>
- <directory>../../client/dist/js</directory>
- <includes>
- <include>*.js</include>
- </includes>
- <targetPath>static/js</targetPath>
- </resource>
- <resource>
- <directory>../../client/dist/lib</directory>
- <targetPath>static/lib</targetPath>
- </resource>
- <resource>
- <directory>../../client/dist/css</directory>
- <includes>
- <include>*.css</include>
- </includes>
- <targetPath>static/css</targetPath>
- </resource>
- <resource>
- <directory>../../client/dist/img</directory>
- <targetPath>static/img</targetPath>
- </resource>
- <resource>
- <directory>../../client/dist/data</directory>
- <includes>
- <include>properties.json</include>
- </includes>
- <targetPath>static/data</targetPath>
- </resource>
- </webResources>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-surefire-plugin</artifactId>
- <version>${surefire-version}</version>
- </plugin>
- </plugins>
- </build>
- <repositories>
- <repository>
- <id>lib</id>
- <name>lib</name>
- <releases>
- <enabled>true</enabled>
- <checksumPolicy>ignore</checksumPolicy>
- </releases>
- <url>file://${project.basedir}/lib</url>
- </repository>
- <repository>
- <id>spring-maven-release</id>
- <name>Spring Maven Release Repository</name>
- <url>http://maven.springframework.org/release</url>
- </repository>
- <repository>
- <id>spring-maven-milestone</id>
- <name>Spring Maven MILESTONE Repository</name>
- <url>http://maven.springframework.org/milestone</url>
- </repository>
- <repository>
- <id>spring-release</id>
- <name>Spring Maven SNAPSHOT Repository</name>
- <url>http://repo.springsource.org/release</url>
- </repository>
- <repository>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- <id>central</id>
- <name>libs-release</name>
- <url>http://repo.springsource.org/libs-release</url>
- </repository>
- </repositories>
- <dependencies>
- <dependency>
- <groupId>org.iri_research.renkan</groupId>
- <artifactId>renkan-core</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
- <groupId>javax.inject</groupId>
- <artifactId>javax.inject</artifactId>
- <version>${javax-inject-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>${javax-servlet-api-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.ws.rs</groupId>
- <artifactId>javax.ws.rs-api</artifactId>
- <version>${jaxrs-api-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.annotation</groupId>
- <artifactId>javax.annotation-api</artifactId>
- <version>${javax-annotation-version}</version>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>bayeux-api</artifactId>
- <version>${cometd-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-java-common</artifactId>
- <version>${cometd-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-java-annotations</artifactId>
- <version>${cometd-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.cometd.java</groupId>
- <artifactId>cometd-websocket-jetty</artifactId>
- <version>${cometd-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-bots</artifactId>
- <version>${coweb-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-server</artifactId>
- <version>${coweb-version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-client</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-continuation</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-http</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-io</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-jmx</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-util</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.eclipse.jetty</groupId>
- <artifactId>jetty-websocket</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.opencoweb</groupId>
- <artifactId>coweb-javascript</artifactId>
- <version>${coweb-version}</version>
- <type>war</type>
- </dependency>
- <dependency>
- <groupId>org.opencoweb.cowebx</groupId>
- <artifactId>cowebx-widgets-dojo</artifactId>
- <version>${cowebx-version}</version>
- <type>war</type>
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.core</groupId>
- <artifactId>jersey-server</artifactId>
- <version>${jersey-version}</version>
- </dependency>
- <!--dependency>
- <groupId>org.glassfish.jersey.media</groupId>
- <artifactId>jersey-media-json-jackson</artifactId>
- <version>${jersey-version}</version>
- </dependency-->
- <dependency>
- <groupId>org.glassfish.jersey.ext</groupId>
- <artifactId>jersey-spring3</artifactId>
- <version>${jersey-version}</version>
- </dependency>
- <dependency>
- <groupId>org.glassfish.jersey.test-framework.providers</groupId>
- <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
- <version>${jersey-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongo-java-driver</artifactId>
- <version>${mongo-driver-version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j-log4j12-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${spring-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${spring-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-commons</artifactId>
- <version>${spring-data-commons-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-jpa</artifactId>
- <version>${spring-data-jpa-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-mongodb</artifactId>
- <version>${spring-data-mongodb-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.persistence</groupId>
- <artifactId>persistence-api</artifactId>
- <version>${javax-persistence-api-version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>${junit-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>${javax-servlet-jstl-version}</version>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.thymeleaf</groupId>
- <artifactId>thymeleaf</artifactId>
- <version>${thymeleaf-version}</version>
- </dependency>
- <dependency>
- <groupId>org.thymeleaf</groupId>
- <artifactId>thymeleaf-spring3</artifactId>
- <version>${thymeleaf-version}</version>
- </dependency>
- <dependency>
- <groupId>org.thymeleaf.extras</groupId>
- <artifactId>thymeleaf-extras-springsecurity3</artifactId>
- <version>${thymeleaf-springsecurity-version}</version>
- </dependency>
- <dependency>
- <groupId>org.thymeleaf.extras</groupId>
- <artifactId>thymeleaf-joda-dialect</artifactId>
- <version>${thymeleaf-joda-dialect-version}</version>
- </dependency>
- <dependency>
- <groupId>net.sourceforge.nekohtml</groupId>
- <artifactId>nekohtml</artifactId>
- <version>${nekohtml-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.jaxrs</groupId>
- <artifactId>jackson-jaxrs-json-provider</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.datatype</groupId>
- <artifactId>jackson-datatype-joda</artifactId>
- <version>${jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>${commons-codec-version}</version>
- </dependency>
- <dependency>
- <groupId>org.eclipse.jetty.aggregate</groupId>
- <artifactId>jetty-all</artifactId>
- <version>${jetty-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-core</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-web</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-config</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-acl</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-taglibs</artifactId>
- <version>${spring-security-version}</version>
- </dependency>
- <dependency>
- <groupId>de.undercouch</groupId>
- <artifactId>bson4jackson</artifactId>
- <version>${bson4jackson-version}</version>
- </dependency>
- <dependency>
- <groupId>joda-time</groupId>
- <artifactId>joda-time</artifactId>
- <version>${joda-version}</version>
- </dependency>
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>${javax-validation-api-version}</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-validator</artifactId>
- <version>${hibernate-validator-version}</version>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>${guava-version}</version>
- </dependency>
- <dependency>
- <groupId>com.jayway.jsonpath</groupId>
- <artifactId>json-path-assert</artifactId>
- <version>${json-path-version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- <version>${commons-io-version}</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <organization>
- <name>IRI</name>
- <url>http://www.iri.centrepompidou.fr</url>
- </organization>
-</project>
--- a/server/renkan-web/src/main/assembly/management-application-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
- <fileSets>
- <fileSet>
- <outputDirectory>META-INF</outputDirectory>
- <directory>src/main/management</directory>
- <includes>
- <include>*.*</include>
- </includes>
- </fileSet>
- <fileSet>
- <outputDirectory>META-INF/i18n</outputDirectory>
- <directory>src/main/webapp/WEB-INF/i18n</directory>
- <includes>
- <include>*.*</include>
- </includes>
- </fileSet>
- </fileSets>
-</assembly>
\ No newline at end of file
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/AuthController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-@Controller
-@RequestMapping("/auth")
-public class AuthController {
-
- @SuppressWarnings("unused")
- private final Logger logger = LoggerFactory.getLogger(AuthController.class);
-
- @RequestMapping(value = "/login", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String login() {
- return "auth/login";
- }
-
- @RequestMapping(value = "/loginfailed", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String loginFailed(Model model) {
-
- model.addAttribute("login_error", true);
- return "auth/login";
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/RenkanController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,204 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletResponse;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.Constants.EditMode;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.RenkanProperties;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.rest.ObjectMapperProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.HttpMediaTypeNotSupportedException;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.HttpServerErrorException;
-import org.springframework.web.servlet.ModelAndView;
-
-import com.fasterxml.jackson.annotation.ObjectIdGenerators.UUIDGenerator;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-@Controller
-@RequestMapping("/p")
-public class RenkanController {
-
- private final Logger logger = LoggerFactory
- .getLogger(RenkanController.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @Autowired
- private ObjectMapperProvider mapperProvider;
-
- private void checkCowebkey(String cowebkey, Project project,
- Constants.EditMode editMode) {
- if (cowebkey == null || cowebkey.isEmpty()) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Cowebkey missing");
- }
- try {
- if (!project.checkKey(cowebkey, editMode)) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Bad cowebkey");
- }
- } catch (RenkanException e) {
- throw new HttpServerErrorException(
- HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage());
- }
- }
-
- @RequestMapping(value = "/copy", method = RequestMethod.POST, produces = { "application/json;charset=UTF-8" })
- public @ResponseBody
- Project copyProject(@RequestParam(value = "project_id") String projectId) {
-
- if (projectId == null || projectId.length() == 0) {
- throw new IllegalArgumentException(
- "RenkanContoller.renkanProject.copyProject: Project id is null or empty.");
- }
- Project project = this.projectsRepository.findOne(projectId);
- if (project == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
- + projectId + " not found for copyProject.");
- }
-
- Project newProject = this.projectsRepository.copy(project,
- project.getTitle() + " (copy)");
-
- return newProject;
- }
-
- @RequestMapping(value = "/{project_id}", method = RequestMethod.GET, produces = {
- "text/html;charset=UTF-8", "!image/*" })
- public ModelAndView renkanProject(
- @PathVariable(value = "project_id") String project_id,
- @RequestHeader(value = "Accept") String accept_header,
- @RequestParam(value = "cowebkey") String cowebkey)
- throws HttpMediaTypeNotSupportedException {
-
- this.logger.debug("renkanProject : " + project_id + " Accept : "
- + accept_header != null ? accept_header : "" + ", cowebkey: "
- + cowebkey != null ? cowebkey : "");
-
- if (project_id == null || project_id.length() == 0) {
- throw new IllegalArgumentException(
- "RenkanContoller.renkanProject: Project id is null or empty.");
- }
-
- Project project = this.projectsRepository.findOne(project_id);
-
- if (project == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
- + project_id + " not found.");
- }
-
- this.checkCowebkey(cowebkey, project, EditMode.EDITION);
-
- Map<String, Object> model = new HashMap<String, Object>();
- model.put("coweb_debug", Boolean.parseBoolean(RenkanProperties
- .getInstance().getProperty("renkan.coweb.debug", "false")));
- model.put("coweb_websockets", Boolean.parseBoolean(RenkanProperties
- .getInstance().getProperty("renkan.coweb.websocket", "true")));
- model.put("project", project);
- model.put("space", spacesRepository.findOne(project.getSpaceId()));
-
- return new ModelAndView("renkanProjectEdit", model);
- }
-
- @RequestMapping(value = "/pub/{project_id}", method = RequestMethod.GET, produces = {
- "text/html;charset=UTF-8", "!image/*" })
- public String renkanPublishProject(Model model,
- @PathVariable(value = "project_id") String projectId,
- @RequestParam(value = "cowebkey") String cowebkey) {
- if (projectId == null || projectId.length() == 0) {
- throw new IllegalArgumentException(
- "RenkanContoller.renkanProject: Project id is null or empty.");
- }
-
- Project project = this.projectsRepository.findOne(projectId);
- if (project == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
- + projectId + " not found.");
- }
-
- this.checkCowebkey(cowebkey, project, EditMode.READ_ONLY);
-
- model.addAttribute("project", project);
- model.addAttribute("space",
- spacesRepository.findOne(project.getSpaceId()));
-
- return "renkanProjectPublish";
- }
-
- @RequestMapping(value = "/exp/{project_id}", method = RequestMethod.GET, produces = { "application/json;charset=UTF-8" })
- public @ResponseBody String exportProject(@PathVariable(value = "project_id") String projectId, HttpServletResponse response) throws JsonProcessingException {
-
- ObjectMapper mapper = this.mapperProvider.getContext(ObjectMapper.class);
-
- Project project = this.projectsRepository.findOne(projectId);
-
- if (project == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Project "
- + projectId + " not found.");
- }
-
- ObjectNode jsonNode = mapper.valueToTree(project);
-
- jsonNode.remove("id");
-
- Iterator<JsonNode> nodes = jsonNode.get("nodes").elements();
-
- HashMap<String, String> nodeIds = new HashMap<String, String>();
- UUIDGenerator uuidgens = new UUIDGenerator();
-
- while(nodes.hasNext()) {
- ObjectNode nodeNode = (ObjectNode) nodes.next();
- String nodeId = nodeNode.get("id").asText();
- String atId = uuidgens.generateId(nodeNode).toString();
- nodeIds.put(nodeId, atId);
- nodeNode.put("@id", atId);
- nodeNode.remove("id");
- nodeNode.remove("project_id");
- }
-
- Iterator<JsonNode> edges = jsonNode.get("edges").elements();
- while(edges.hasNext()) {
- ObjectNode edgeNode = (ObjectNode) edges.next();
- edgeNode.put("from", nodeIds.get(edgeNode.get("from").asText()));
- edgeNode.put("to", nodeIds.get(edgeNode.get("to").asText()));
- edgeNode.remove("id");
- edgeNode.remove("project_id");
- }
-
- String res = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);
-
- response.setContentType("application/force-download");
- response.setHeader("Content-Transfer-Encoding", "binary");
- response.setHeader("Content-Disposition", "attachment; filename=\""+ projectId +".json\"");
-
- return res;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/RenkanRootController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.web.PageableDefault;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.servlet.ModelAndView;
-
-@Controller
-@RequestMapping("/")
-public class RenkanRootController {
-
- private final Logger logger = LoggerFactory
- .getLogger(RenkanRootController.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String renkanIndex(
- Model model,
- @PageableDefault(sort = { "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
- HttpServletRequest request) {
-
- Page<Space> page = this.spacesRepository.findAll(p);
-
- model.addAttribute("page", page);
- model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
- model.addAttribute("projectsCount",
- this.projectsRepository.getCountBySpace());
-
- return "renkanIndex";
- }
-
- @RequestMapping(value = "/s/{space_id}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public ModelAndView spaceIndex(
- @PathVariable("space_id") String spaceId,
- @RequestParam(required = false) String filter,
- @PageableDefault(sort = { "updated", "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
- HttpServletRequest request) {
-
- logger.debug("SpaceId : " + (spaceId == null ? "null" : spaceId));
-
- Map<String, Object> model = new HashMap<String, Object>();
-
- if ("_".equals(spaceId)) {
- spaceId = null;
- }
-
- Space space = this.spacesRepository.findOne(spaceId);
-
- if (null == space) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "Space "
- + spaceId + " not found.");
- }
-
- model.put("space", space);
- Page<Project> page;
- if (filter != null && !filter.isEmpty()) {
- page = this.projectsRepository.findBySpaceIdAndTitleRegex(spaceId,
- filter, p);
- } else {
- page = this.projectsRepository.findBySpaceId(spaceId, p);
- }
-
- model.put("page", page);
- model.put("baseUrl", Utils.buildBaseUrl(request));
-
- return new ModelAndView("projectIndex", model);
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/Utils.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-
-public class Utils {
-
- public static String buildBaseUrl(HttpServletRequest request) {
- StringBuffer baseUrl = request.getRequestURL();
- boolean firstParam = true;
- Enumeration<?> namesEnum = request.getParameterNames();
- while (namesEnum.hasMoreElements()) {
- String paramName = (String) namesEnum.nextElement();
-
- if ("p.page".equals(paramName)) {
- continue;
- }
- for (String val : request.getParameterValues(paramName)) {
- if (firstParam) {
- baseUrl.append('?');
- firstParam = false;
- } else {
- baseUrl.append('&');
- }
- baseUrl.append(paramName).append('=').append(val);
- }
- }
- return baseUrl.toString();
- }
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/VersionHandlerInterceptor.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-package org.iri_research.renkan.controller;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.jar.Attributes;
-import java.util.jar.Manifest;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-
-@Component
-public class VersionHandlerInterceptor extends HandlerInterceptorAdapter {
-
- @SuppressWarnings("unused")
- private final Logger logger = LoggerFactory
- .getLogger(VersionHandlerInterceptor.class);
-
- private static String version = null;
-
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- if(modelAndView != null) {
- if(version == null) {
- ServletContext context = request.getServletContext();
- InputStream inputStream = context.getResourceAsStream("/META-INF/MANIFEST.MF");
- if(inputStream != null) {
- try {
- Manifest manifest = new Manifest(inputStream);
- Attributes att = manifest.getMainAttributes();
- version = att.getValue("Implementation-Version");
- }
- catch(IOException e) {
- version = "N/A";
- }
- }
- if(version == null) {
- version = "NULL";
- }
- else if (version == "") {
- version = "EMPTY";
- }
- }
- modelAndView.addObject("version", version);
- }
- }
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/AbstractRenkanObjectAdminController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,5 +0,0 @@
-package org.iri_research.renkan.controller.admin;
-
-public abstract class AbstractRenkanObjectAdminController {
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/AdminController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package org.iri_research.renkan.controller.admin;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-@Controller
-@RequestMapping("/admin")
-public class AdminController {
-
- @SuppressWarnings("unused")
- private final Logger logger = LoggerFactory
- .getLogger(AdminController.class);
-
- @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String adminIndex() {
- return "admin/adminIndex";
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/GroupsAdminController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,193 +0,0 @@
-package org.iri_research.renkan.controller.admin;
-
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Locale;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.controller.Utils;
-import org.iri_research.renkan.forms.GroupForm;
-import org.iri_research.renkan.forms.GroupFormValidator;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.propertyeditors.StringTrimmerEditor;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.web.PageableDefault;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.HttpClientErrorException;
-
-@Controller
-@RequestMapping("/admin/groups")
-public class GroupsAdminController {
-
- private final Logger logger = LoggerFactory
- .getLogger(GroupsAdminController.class);
-
- @Inject
- private GroupsRepository groupsRepository;
-
- @Inject
- private UsersRepository usersRepository;
-
-
- @InitBinder(value = { "group" })
- protected void initBinder(WebDataBinder binder) {
- binder.setValidator(new GroupFormValidator());
- }
-
- @InitBinder
- public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
- dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
- }
-
- @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String groupsList(
- Model model,
- @PageableDefault(sort = { "title" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
- HttpServletRequest request) {
-
- Page<Group> page = this.groupsRepository.findAll(p);
-
- model.addAttribute("page", page);
- model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
- //TODO: add user count
-
- return "admin/groupsList";
- }
-
- @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editGroup(Model model) {
- return editGroup(model, null);
- }
-
- @RequestMapping(value = "/edit/{groupId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editGroup(Model model,
- @PathVariable(value = "groupId") String groupId) {
-
- GroupForm groupForm = null;
- Group group = null;
-
- if (groupId != null && groupId.length() > 0 && !"_".equals(groupId)) {
- group = this.groupsRepository.findOne(groupId);
- if (group == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "group " + groupId + " not found");
- }
- }
- groupForm = new GroupForm(group);
-
- model.addAttribute("group", groupForm);
- model.addAttribute("allUsers", this.usersRepository.findAll());
-
- return "admin/groupEdit";
- }
-
- @RequestMapping(value = "/save", method = RequestMethod.POST)
- public String saveGroup(Model model,
- @ModelAttribute("group") @Valid GroupForm groupForm,
- BindingResult bindingResult) {
-
- logger.debug("group title " + groupForm.getTitle());
- logger.debug("user description " + groupForm.getDescription());
-
- if (bindingResult.hasErrors()) {
- return "admin/groupEdit";
- }
-
- groupForm.setGroupsRepository(groupsRepository);
-
- try {
- groupForm.save();
- } catch (RenkanException e) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "group "
- + groupForm.getId()==null?"":groupForm.getId() + " not found");
- }
-
- return "redirect:/admin/groups";
- }
-
- @RequestMapping(value = "/delete/{groupId}")
- public String deleteGroup(HttpServletRequest request, Model model,
- @PathVariable(value = "groupId") String groupId,
- @RequestParam(value = "key", required = false) String key,
- @RequestParam(value = "salt", required = false) String salt)
- throws NoSuchAlgorithmException, RenkanException {
-
- if (groupId == null || groupId.length() == 0) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Null or empty user id");
- }
-
- RequestMethod method = RequestMethod.valueOf(request.getMethod());
-
- //TODO: check that group have no user
-
-
- if (RequestMethod.GET.equals(method)) {
-
- Group group = this.groupsRepository.findOne(groupId);
-
- if (group == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "group " + groupId + " not found");
- }
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String newSalt = Hex.encodeHexString(rawSalt);
-
- model.addAttribute("groupObj", group);
- model.addAttribute("salt", newSalt);
- model.addAttribute("key", group.getKey(newSalt));
-
- return "admin/groupDeleteConfirm";
-
- } else if (RequestMethod.POST.equals(method) && key != null
- && !key.isEmpty() && salt != null && !salt.isEmpty()) {
-
- if (groupId != null && groupId.length() > 0) {
-
- Group group = this.groupsRepository.findOne(groupId);
- if (group != null) {
- if (group.checkKey(key, salt)) {
- this.groupsRepository.delete(groupId);
- } else {
- throw new HttpClientErrorException(
- HttpStatus.BAD_REQUEST, "Key not ckecked");
- }
- }
-
- }
- return "redirect:/admin/groups";
-
- } else {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Bad request method or parameters");
- }
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/SpacesAdminController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,190 +0,0 @@
-package org.iri_research.renkan.controller.admin;
-
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Arrays;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.controller.Utils;
-import org.iri_research.renkan.forms.SpaceForm;
-import org.iri_research.renkan.forms.SpaceFormValidator;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.web.PageableDefault;
-import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.HttpClientErrorException;
-
-@Controller
-@RequestMapping("/admin/spaces")
-public class SpacesAdminController {
-
- private final Logger logger = LoggerFactory
- .getLogger(SpacesAdminController.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @InitBinder(value = { "space" })
- protected void initBinder(WebDataBinder binder) {
- binder.setValidator(new SpaceFormValidator());
- }
-
- @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String spacesList(
- Model model,
- @PageableDefault(sort = { "created" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
- HttpServletRequest request) {
-
- Page<Space> page = this.spacesRepository.findAll(p);
-
- model.addAttribute("page", page);
- model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
- model.addAttribute("projectsCount",
- this.projectsRepository.getCountBySpace());
-
- return "admin/spacesList";
- }
-
- @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editSpace(Model model) {
- return editSpace(model, null);
- }
-
- @RequestMapping(value = "/edit/{spaceId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editSpace(Model model,
- @PathVariable(value = "spaceId") String spaceId) {
-
- SpaceForm spaceForm = null;
-
- if (spaceId == null || spaceId.length() == 0 || "_".equals(spaceId)) {
- spaceForm = new SpaceForm();
- } else {
- Space space = this.spacesRepository.findOne(spaceId);
- if (space == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "space " + spaceId + " not found");
- }
- spaceForm = new SpaceForm(space);
- }
-
- model.addAttribute("space", spaceForm);
-
- return "admin/spaceEdit";
- }
-
- @RequestMapping(value = "/save", method = RequestMethod.POST)
- public String saveSpace(Model model,
- @ModelAttribute("space") @Valid SpaceForm spaceForm,
- BindingResult bindingResult) {
-
- logger.debug("space title " + spaceForm.getTitle());
- logger.debug("space description " + spaceForm.getDescription());
-
- if (bindingResult.hasErrors()) {
- return "admin/spaceEdit";
- }
-
- spaceForm.setSpacesRepository(spacesRepository);
-
- try {
- spaceForm.save();
- } catch (RenkanException e) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "space "
- + spaceForm.getId() + " not found");
- }
-
- return "redirect:/admin/spaces";
- }
-
- @RequestMapping(value = "/delete/{spaceId}")
- public String deleteSpace(HttpServletRequest request, Model model,
- @PathVariable(value = "spaceId") String spaceId,
- @RequestParam(value = "key", required = false) String key,
- @RequestParam(value = "salt", required = false) String salt)
- throws NoSuchAlgorithmException, RenkanException {
-
- if (spaceId == null || spaceId.length() == 0) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Null or empty space id");
- }
-
- RequestMethod method = RequestMethod.valueOf(request.getMethod());
-
- Map<String, Integer> nbProj = this.projectsRepository
- .getCountBySpace(Arrays.asList(spaceId));
- if (nbProj.containsKey(spaceId) && nbProj.get(spaceId).intValue() > 0) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "This space have projects");
- }
-
- if (RequestMethod.GET.equals(method)) {
-
- Space space = this.spacesRepository.findOne(spaceId);
-
- if (space == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "space " + spaceId + " not found");
- }
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String newSalt = Hex.encodeHexString(rawSalt);
-
- model.addAttribute("spaceObj", space);
- model.addAttribute("salt", newSalt);
- model.addAttribute("key", space.getKey(newSalt));
-
- return "admin/spaceDeleteConfirm";
- } else if (RequestMethod.POST.equals(method) && key != null
- && !key.isEmpty() && salt != null && !salt.isEmpty()) {
-
- if (spaceId != null && spaceId.length() > 0) {
-
- Space space = this.spacesRepository.findOne(spaceId);
- if (space != null) {
- if (space.checkKey(key, salt)) {
- this.spacesRepository.delete(spaceId);
- } else {
- throw new HttpClientErrorException(
- HttpStatus.BAD_REQUEST, "Key not ckecked");
- }
- }
-
- }
- return "redirect:/admin/spaces";
-
- } else {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Bad request method or parameters");
- }
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/controller/admin/UsersAdminController.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
-package org.iri_research.renkan.controller.admin;
-
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.controller.Utils;
-import org.iri_research.renkan.forms.UserForm;
-import org.iri_research.renkan.forms.UserFormValidator;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.propertyeditors.StringTrimmerEditor;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.web.PageableDefault;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.InitBinder;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.client.HttpClientErrorException;
-
-@Controller
-@RequestMapping("/admin/users")
-public class UsersAdminController {
-
- private final Logger logger = LoggerFactory
- .getLogger(UsersAdminController.class);
-
- @Inject
- private UsersRepository usersRepository;
-
- @Inject
- private ProjectsRepository projectsRepository;
-
- @Inject
- private GroupsRepository groupsRepository;
-
- @Resource(name="renkanPasswordEncoder")
- private PasswordEncoder passwordEncoder;
-
- @InitBinder(value = { "user" })
- protected void initBinder(WebDataBinder binder) {
- binder.setValidator(new UserFormValidator());
- }
-
- @InitBinder
- public void initDateBinder(final WebDataBinder dataBinder, final Locale locale) {
- dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
- }
-
- @RequestMapping(value = "", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String usersList(
- Model model,
- @PageableDefault(sort = { "username" }, direction = Direction.DESC, page = 0, value = Constants.PAGINATION_SIZE) Pageable p,
- HttpServletRequest request) {
-
- Page<User> page = this.usersRepository.findAll(p);
-
- model.addAttribute("page", page);
- model.addAttribute("baseUrl", Utils.buildBaseUrl(request));
- model.addAttribute("projectsCount",
- this.projectsRepository.getCountByUser());
-
- return "admin/usersList";
- }
-
- @RequestMapping(value = "/edit/", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editUser(Model model) {
- return editUser(model, null);
- }
-
- @RequestMapping(value = "/edit/{userId}", method = RequestMethod.GET, produces = { "text/html;charset=UTF-8" })
- public String editUser(Model model,
- @PathVariable(value = "userId") String userId) {
-
- UserForm userForm = null;
- User user = null;
-
- if (userId != null && userId.length() > 0 && !"_".equals(userId)) {
- user = this.usersRepository.findOne(userId);
- if (user == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "user " + userId + " not found");
- }
- }
- userForm = new UserForm(user);
-
- model.addAttribute("user", userForm);
- model.addAttribute("allGroups", this.groupsRepository.findAll());
-
- return "admin/userEdit";
- }
-
- @RequestMapping(value = "/save", method = RequestMethod.POST)
- public String saveUser(Model model,
- @ModelAttribute("user") @Valid UserForm userForm,
- BindingResult bindingResult) {
-
- logger.debug("user title " + userForm.getTitle());
- logger.debug("user description " + userForm.getDescription());
-
- if (bindingResult.hasErrors()) {
- return "admin/userEdit";
- }
-
- userForm.setUsersRepository(usersRepository);
- userForm.setPasswordEncoder(passwordEncoder);
-
- try {
- userForm.save();
- } catch (RenkanException e) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND, "user "
- + userForm.getId()==null?"":userForm.getId() + " not found");
- }
-
- return "redirect:/admin/users";
- }
-
- @RequestMapping(value = "/delete/{userId}")
- public String deleteUser(HttpServletRequest request, Model model,
- @PathVariable(value = "userId") String userId,
- @RequestParam(value = "key", required = false) String key,
- @RequestParam(value = "salt", required = false) String salt)
- throws NoSuchAlgorithmException, RenkanException {
-
- if (userId == null || userId.length() == 0) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Null or empty user id");
- }
-
- RequestMethod method = RequestMethod.valueOf(request.getMethod());
-
- Map<String, Integer> nbProj = this.projectsRepository
- .getCountByUser(Arrays.asList(userId));
- if (nbProj.containsKey(userId) && nbProj.get(userId).intValue() > 0) {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "This user have projects");
- }
-
- if (RequestMethod.GET.equals(method)) {
-
- User user = this.usersRepository.findOne(userId);
-
- if (user == null) {
- throw new HttpClientErrorException(HttpStatus.NOT_FOUND,
- "user " + userId + " not found");
- }
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String newSalt = Hex.encodeHexString(rawSalt);
-
- model.addAttribute("userObj", user);
- model.addAttribute("salt", newSalt);
- model.addAttribute("key", user.getKey(newSalt));
-
- return "admin/userDeleteConfirm";
-
- } else if (RequestMethod.POST.equals(method) && key != null
- && !key.isEmpty() && salt != null && !salt.isEmpty()) {
-
- if (userId != null && userId.length() > 0) {
-
- User user = this.usersRepository.findOne(userId);
- if (user != null) {
- if (user.checkKey(key, salt)) {
- this.usersRepository.delete(userId);
- } else {
- throw new HttpClientErrorException(
- HttpStatus.BAD_REQUEST, "Key not ckecked");
- }
- }
-
- }
- return "redirect:/admin/users";
-
- } else {
- throw new HttpClientErrorException(HttpStatus.BAD_REQUEST,
- "Bad request method or parameters");
- }
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/RenkanSessionModerator.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,272 +0,0 @@
-package org.iri_research.renkan.coweb;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.coweb.DefaultSessionModerator;
-import org.iri_research.renkan.coweb.event.ISyncEventManager;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.RenkanSessionModeratorState;
-import org.iri_research.renkan.models.RosterUser;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.ApplicationContext;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-
-public class RenkanSessionModerator extends DefaultSessionModerator {
-
- private final Logger logger = LoggerFactory
- .getLogger(RenkanSessionModerator.class);
-
- private ProjectsRepository projectsRepository;
-
- public RenkanSessionModerator() {
- super();
- }
-
- public ProjectsRepository getProjectsRepository() {
- if (this.projectsRepository == null) {
- ApplicationContext context = SpringConfigurer.getInstance()
- .getApplicationContext();
- this.projectsRepository = (ProjectsRepository) context
- .getBean("projectsRepository");
- }
- return projectsRepository;
- }
-
- @Override
- public synchronized boolean canClientJoinSession(String clientId,
- Map<String, Object> userDefined) {
-
- this.logger.debug("canClientJoinSession: " + clientId + " , "
- + (userDefined == null ? "null" : userDefined.toString()));
-
- if (RenkanSessionModeratorState.INSTANCE.getUsersActivationMap()
- .containsKey(clientId)) {
- this.logger
- .warn("Client id already declared in user activation map: "
- + clientId);
- }
-
- String projectId = (String) userDefined.get("project_id");
-
- if (projectId == null) {
- return false;
- }
-
- RenkanSessionModeratorState.INSTANCE.getUsersActivationMap().put(
- clientId, projectId);
- return true;
- }
-
- private synchronized void activateProject(String clientId) {
-
- if (!RenkanSessionModeratorState.INSTANCE.getUsersActivationMap()
- .containsKey(clientId)) {
- this.logger.warn("Client id not declared in user activation map: "
- + clientId);
- return;
- }
- String project_id = RenkanSessionModeratorState.INSTANCE
- .getUsersActivationMap().get(clientId);
- if (project_id == null) {
- this.logger
- .warn("Null project id for client id in user activation map: "
- + clientId);
- return;
- }
-
- List<String> user_list = RenkanSessionModeratorState.INSTANCE
- .getProjectsActivationMap().get(project_id);
- if (user_list == null) {
- user_list = new ArrayList<String>();
- RenkanSessionModeratorState.INSTANCE.getProjectsActivationMap()
- .put(project_id, user_list);
- }
-
- if (!user_list.contains(clientId)) {
- user_list.add(clientId);
- }
-
- }
-
- @Override
- public synchronized void onClientJoinSession(String clientId) {
-
- this.logger.debug("onClientJoinSession: " + clientId);
-
- this.activateProject(clientId);
-
- }
-
- @Override
- public synchronized void onClientLeaveSession(String clientId) {
-
- this.logger.debug("onClientLeaveSession: " + clientId);
-
- String project_id = RenkanSessionModeratorState.INSTANCE
- .getUsersActivationMap().get(clientId);
-
- RenkanSessionModeratorState.INSTANCE.getUsersActivationMap().remove(
- clientId);
- if (project_id == null) {
- this.logger.warn("Leaving client have no associated project: "
- + clientId);
- return;
- }
-
- List<String> user_list = RenkanSessionModeratorState.INSTANCE
- .getProjectsActivationMap().get(project_id);
- if (user_list == null) {
- this.logger
- .warn("Leaving client have associated project but no project list : "
- + clientId + ", " + project_id);
- return;
- }
-
- if (!user_list.remove(clientId)) {
- this.logger
- .warn("Leaving client have associated project but not in project list : "
- + clientId + ", " + project_id);
- return;
- }
-
- if (user_list.isEmpty()) {
- this.logger
- .debug("Leaving client, project list empty, removing from active projects: "
- + clientId + ", " + project_id);
- RenkanSessionModeratorState.INSTANCE.getProjectsActivationMap()
- .remove(project_id);
- }
-
- List<RosterUser> r_user_list = RenkanSessionModeratorState.INSTANCE
- .getProjectsUsersList().get(project_id);
- if (r_user_list == null) {
- this.logger
- .warn("Leaving client have associated project but no user list : "
- + clientId + ", " + project_id);
- return;
- }
- for (RosterUser rosterUser : r_user_list) {
- if (rosterUser.getClientId().equals(clientId)) {
- r_user_list.remove(rosterUser);
- }
- }
- if (r_user_list.isEmpty()) {
- this.logger
- .debug("Leaving client, user list empty, removing from active projects: "
- + clientId + ", " + project_id);
- RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().remove(
- project_id);
- }
-
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public synchronized void onSync(String clientId, Map<String, Object> data) {
-
- this.logger.debug("Debugging onSync client id: " + clientId);
- this.logger.debug("Debugging onSync: " + data.toString());
- this.logger.debug("Debugging onSync channel: " + data.get("channel"));
- this.logger.debug("Debugging onSync type: " + data.get("type"));
- this.logger.debug("Debugging onSync site: " + data.get("site"));
- this.logger.debug("Debugging onSync value: " + data.get("value"));
- this.logger.debug("Debugging onSync position: " + data.get("position"));
-
- Map<String, Object> values = null;
- if (data.containsKey("value") && data.get("value") != null) {
- values = ((Map<String, Object>) data.get("value"));
- }
-
- if (values == null) {
- this.logger.warn("onSync : no values in message.");
- return;
- }
-
- String sync_type = (String) values.get("_type");
- if (sync_type == null || sync_type.length() == 0) {
- this.logger.warn("onSync : no type in value of message.");
- return;
- }
-
- if (sync_type.startsWith("_")) {
- this.logger.debug("onSync : type sync begin with _, ignore. "
- + sync_type);
- return;
- }
-
- ApplicationContext context = SpringConfigurer.getInstance()
- .getApplicationContext();
-
- String beanName = String.format("%sSyncEventManager",
- sync_type.toLowerCase());
-
- try {
- ISyncEventManager<?, ?> eventManager = (ISyncEventManager<?, ?>) context
- .getBean(beanName);
- logger.debug("Debugging on Sync : dispatch to " + beanName);
- eventManager.dispatchEvent(clientId, data);
- } catch (Throwable e) {
- this.logger.error(String.format(
- "onSync EventManagerClass %s not found : error %s : %s",
- sync_type, e.toString(), e.getMessage()));
- //TODO: better manage errors (message back to the user, close the session ?
- }
-
- }
-
- @Override
- public Map<String, Object> getLateJoinState() {
- this.logger.debug("getLateJoinState");
-
- Map<String, Object> res = super.getLateJoinState();
- ObjectMapper mapper = new ObjectMapper();
- mapper.registerModule(new JodaModule());
-
- for (String clientId : RenkanSessionModeratorState.INSTANCE
- .getUsersActivationMap().keySet()) {
- this.activateProject(clientId);
- }
-
- this.logger.debug("getLateJoinState : Project activated");
-
- for (String project_id : RenkanSessionModeratorState.INSTANCE
- .getProjectsActivationMap().keySet()) {
-
- Project p = this.getProjectsRepository().findOne(project_id);
- if (p != null) {
- try {
- res.put("renkan_" + project_id,
- mapper.writeValueAsString(p));
- } catch (JsonProcessingException e) {
- this.logger.error("Error when deserializing project "
- + project_id, e);
- }
- }
-
- String user_res = "[]";
- if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
- .containsKey(project_id)) {
- try {
- user_res = mapper
- .writeValueAsString(RenkanSessionModeratorState.INSTANCE
- .getProjectsUsersList().get(project_id));
- } catch (JsonProcessingException e) {
- this.logger.error("Error when deserializing user list "
- + project_id, e);
- }
- }
- res.put("users_" + project_id, user_res);
- }
-
- this.logger.debug("getLateJoinState res : " + res.toString());
- return res;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/SpringConfigurer.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-package org.iri_research.renkan.coweb;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-@Component
-// @Scope("prototype")
-public class SpringConfigurer implements ApplicationContextAware {
-
- // private BayeuxServer bayeuxServer;
- // private ServerAnnotationProcessor processor;
- private final Logger logger = LoggerFactory
- .getLogger(SpringConfigurer.class);
- private ApplicationContext context;
-
- private static volatile SpringConfigurer instance = null;
-
- private SpringConfigurer() {
- this.logger.debug("Building SpringConfigurer");
- }
-
- public static SpringConfigurer getInstance() {
- if (instance == null) {
- synchronized (SpringConfigurer.class) {
- if (instance == null) {
- instance = new SpringConfigurer();
- }
- }
- }
- return instance;
- }
-
- @Override
- @Inject
- public void setApplicationContext(ApplicationContext context)
- throws BeansException {
- this.context = context;
- }
-
- public ApplicationContext getApplicationContext() {
- return this.context;
- }
-}
\ No newline at end of file
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/AbstractBaseSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.io.Serializable;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.models.IRenkanModel;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.ProjectSync;
-import org.iri_research.renkan.repositories.ProjectSyncsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class AbstractBaseSyncEventManager<T extends IRenkanModel<ID>, ID extends Serializable>
- implements ISyncEventManager<T, ID> {
-
- private final Logger logger = LoggerFactory
- .getLogger(AbstractBaseSyncEventManager.class);
-
- @Inject
- private ProjectsRepository projectsRepository;
-
- @Inject
- private ProjectSyncsRepository projectSyncsRepository;
-
- @Override
- public ProjectsRepository getProjectsRepository() {
- return this.projectsRepository;
- }
-
- @Override
- public void dispatchEvent(String clientId, Map<String, Object> data) {
-
- this.saveSyncEvent(data);
-
- String eventType = (String) data.get("type");
-
- if ("null".equalsIgnoreCase(eventType)) {
- this.nullOperation(null, data);
- } else if ("update".equalsIgnoreCase(eventType)) {
- this.update(clientId, data);
- } else if ("insert".equalsIgnoreCase(eventType)) {
- this.insert(clientId, data);
- } else if ("delete".equalsIgnoreCase(eventType)) {
- this.delete(clientId, data);
- } else {
- logger.warn(String.format("dispatchEvent : eventType unknown %s",
- eventType));
- }
- }
-
- private void saveSyncEvent(Map<String, Object> data) {
-
- String project_id = null;
- String user_id = null;
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
-
- if (values != null) {
- project_id = (String) values.get("_project_id");
- }
-
- if (project_id == null || "".equals(project_id)) {
- logger.warn("saveSyncEvent : project id is null. Can not save sync event");
- return;
- }
-
- Project p = this.projectsRepository.findOne(project_id);
-
- if (p == null) {
- logger.warn("saveSyncEvent : project not found. Can not save sync event");
- return;
- }
-
- p.setUpdated(new DateTime());
- this.projectsRepository.save(p);
-
- user_id = (String) values.get("_user_id");
-
- if (user_id == null) {
- logger.warn("saveSyncEvent : No user id");
- }
-
- try {
- ProjectSync ps = this.projectSyncsRepository.getProjectSync(
- data.toString(), p, user_id);
- this.projectSyncsRepository.save(ps);
- } catch (RenkanException e) {
- logger.warn(
- "saveSyncEvent : Error when getting Projectr syn object", e);
- }
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/AbstractSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,162 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.IRenkanModel;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.DBObject;
-import com.mongodb.WriteResult;
-
-public abstract class AbstractSyncEventManager<T extends IRenkanModel<ID>, ID extends Serializable>
- extends AbstractBaseSyncEventManager<T, ID>
- implements IPersistedSyncEventManager<T, ID> {
-
- private final Logger logger = LoggerFactory
- .getLogger(AbstractSyncEventManager.class);
-
- @Override
- public abstract IRenkanRepository<T, ID> getObjectRepository();
-
- protected abstract List<T> getObjectList(Project project);
-
- protected abstract void checkUpdate(String clientId, Map<String, Object> data);
-
- @Override
- public void update(String clientId, Map<String, Object> data) {
-
- this.logger.debug("AbstractSyncEventManager: update "
- + this.getClass().getName());
-
- checkUpdate(clientId, data);
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String obj_id = (String) values.get("id");
-
- this.logger.debug(String.format("update %s %s", this.getClass()
- .getName(), obj_id));
-
- DBCollection objCollection = this.getObjectRepository().getCollection();
- DBObject obj = objCollection.findOne(obj_id);
-
- if (null == obj) {
- throw new CowebException("Object update: object not found",
- String.format("Object %s not found in %s", obj_id,
- objCollection.getName()));
- }
-
- boolean obj_changed = false;
- // update object
- for (String fieldname : values.keySet()) {
- if (!"id".equalsIgnoreCase(fieldname) && !fieldname.startsWith("_")) {
- Object new_value = values.get(fieldname);
- Object old_value = obj.get(fieldname);
- if ((new_value == null && old_value != null)
- || (new_value != null && !new_value.equals(old_value))) {
- obj.put(fieldname, new_value);
- obj_changed = true;
- }
- }
- }
-
- if (obj_changed) {
- obj.put("_id", obj_id);
- WriteResult res = this.getObjectRepository().getCollection()
- .update(new BasicDBObject("_id", obj_id), obj, true, false);
-
- if (!res.getLastError().ok()) {
- throw new CowebException(String.format(
- "Error when writing object %s in %s", obj_id,
- objCollection.getName()), res.getLastError()
- .getErrorMessage());
- }
- }
- }
-
- @Override
- public abstract void insert(String clientId, Map<String, Object> data);
-
-
- protected abstract void checkDelete(String clientId, Map<String, Object> data);
-
- @Override
- public void delete(String clientId, Map<String, Object> data) {
-
- this.logger.debug("AbstractSyncEventManager: delete "
- + this.getClass().getName());
- checkDelete(clientId, data);
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
- Project project = this.getProjectsRepository().findOne(project_id);
-
- if (null == project) {
- throw new CowebException(this.getClass().getName()
- + " delete: project not found", String.format(
- "Project %s not found", project_id));
- }
-
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("object delete: bad delete position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
- int index = position.intValue();
-
- @SuppressWarnings("unchecked")
- ID object_id = (ID) values.get("id");
-
- this.logger.debug(String.format(
- "delete object %s in pos %d for project %s", object_id, index,
- project_id));
-
- IRenkanModel<ID> currentObject = null;
-
- List<T> objList = this.getObjectList(project);
-
- if (index < objList.size()) {
- currentObject = objList.get(index);
- }
-
- if (currentObject == null || !object_id.equals(currentObject.getId())) {
- index = -1;
- this.logger
- .warn(String
- .format("delete object %s in pos %d for project %s not current object",
- object_id, index, project_id));
- for (int i = 0; i < project.getNodes().size(); i++) {
- if (object_id.equals(objList.get(i).getId())) {
- index = i;
- break;
- }
- }
- }
-
- if (index < 0) {
- this.logger.warn(String.format(
- "delete object %s in pos %d for project %s not found",
- object_id, index, project_id));
- } else {
- objList.remove(index);
- this.getObjectRepository().delete(object_id);
- this.getProjectsRepository().save(project);
- }
-
- }
-
- @Override
- public abstract void nullOperation(String clientId, Map<String, Object> data);
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/EdgeSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,166 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Named
-public class EdgeSyncEventManager extends
- AbstractSyncEventManager<Edge, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(EdgeSyncEventManager.class);
-
- @Inject
- private NodesRepository nodesRepository;
-
- @Inject
- private UsersRepository usersRepository;
-
- @Inject
- private EdgesRepository edgesRepository;
-
- public NodesRepository getNodesRepository() {
- return nodesRepository;
- }
-
- public UsersRepository getUsersRepository() {
- return usersRepository;
- }
-
- public EdgesRepository getEdgesRepository() {
- return edgesRepository;
- }
-
- @Override
- public IRenkanRepository<Edge, String> getObjectRepository() {
- return this.getEdgesRepository();
- }
-
- @Override
- public void insert(String clientId, Map<String, Object> data) {
-
- // get project
- this.logger.debug("EdgeSyncEventManager: insert Edge");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
-
- Project project = this.getProjectsRepository().findOne(project_id);
-
- if (null == project) {
- throw new CowebException("Edge insert: project not found",
- String.format("Project %s not found", project_id));
- }
-
- String creator_id = (String) values.get("created_by");
-
- String from_node_id = (String) values.get("from");
- Node from_node = this.getNodesRepository().findOne(from_node_id);
-
- if (null == from_node) {
- throw new CowebException("Edge insert: from not found",
- String.format("from %s not found", from_node_id));
- }
-
- String to_node_id = (String) values.get("to");
- Node to_node = this.getNodesRepository().findOne(to_node_id);
-
- if (null == to_node) {
- throw new CowebException("Edge insert: to not found",
- String.format("to %s not found", to_node_id));
- }
-
- String edge_id = (String) values.get("id");
-
- //check that edge id is unique
- if(this.getEdgesRepository().exists(edge_id)) {
- throw new CowebException("edge insert: edge exists",
- String.format("Edge %s already exists", edge_id));
- }
-
- Edge edge = new Edge(edge_id, (String) values.get("title"),
- (String) values.get("description"), (String) values.get("uri"),
- (String) values.get("color"), from_node, to_node, creator_id,
- project_id);
-
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("Edge insert: bad insert position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
- int index = position.intValue();
- List<Edge> edges = project.getEdges();
- if (index > edges.size()) {
- index = edges.size();
- }
- edges.add(index, edge);
-
- this.getEdgesRepository().save(edge);
- this.getProjectsRepository().save(project);
-
- }
-
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- this.logger.debug("nullOperation: NOP");
- }
-
- @Override
- protected List<Edge> getObjectList(Project project) {
- return project.getEdges();
- }
-
- private boolean checkWrite(String clientId, Map<String, Object> data) {
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
-
- String edge_id = (String) values.get("id");
-
- Edge edge = this.getEdgesRepository().findOne(edge_id);
-
- if(edge==null) {
- return true;
- }
- else if ( (project_id == edge.getProjectId()) || (project_id != null && project_id.equals(edge.getProjectId()))) {
- return true;
- }
- else {
- return false;
- }
- }
-
- @Override
- protected void checkUpdate(String clientId, Map<String, Object> data) {
-
- if(!checkWrite(clientId, data)) {
- throw new CowebException("Error when updating edge","Edge not in correct project");
- }
- }
-
- @Override
- protected void checkDelete(String clientId, Map<String, Object> data) {
- if(!checkWrite(clientId, data)) {
- throw new CowebException("Error when updating edge","Edge not in correct project");
- }
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/IPersistedSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.io.Serializable;
-
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-
-public interface IPersistedSyncEventManager<T, ID extends Serializable> extends
- ISyncEventManager<T, ID> {
-
- public ProjectsRepository getProjectsRepository();
-
- public IRenkanRepository<T, ID> getObjectRepository();
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ISyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.io.Serializable;
-import java.util.Map;
-
-import org.iri_research.renkan.repositories.ProjectsRepository;
-
-public interface ISyncEventManager<T, ID extends Serializable> {
-
- public void dispatchEvent(String clientId, Map<String, Object> data);
-
- public void update(String clientId, Map<String, Object> data);
-
- public void insert(String clientId, Map<String, Object> data);
-
- public void delete(String clientId, Map<String, Object> data);
-
- public void nullOperation(String clientId, Map<String, Object> data);
-
- public ProjectsRepository getProjectsRepository();
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/NodeSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,156 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.data.mongodb.core.geo.Point;
-
-@Named
-public class NodeSyncEventManager extends
- AbstractSyncEventManager<Node, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(NodeSyncEventManager.class);
-
- @Inject
- private NodesRepository nodesRepository;
-
- @Inject
- private UsersRepository usersRepository;
-
- public NodesRepository getNodesRepository() {
- return nodesRepository;
- }
-
- @Override
- public IRenkanRepository<Node, String> getObjectRepository() {
- return this.getNodesRepository();
- }
-
- public UsersRepository getUsersRepository() {
- return this.usersRepository;
- }
-
- @Override
- public void insert(String clientId, Map<String, Object> data) {
-
- // get project
- this.logger.debug("NodeSyncEventManager: insert Node");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
-
- Project project = this.getProjectsRepository().findOne(project_id);
-
- if (null == project) {
- throw new CowebException("node insert: project not found",
- String.format("Project %s not found", project_id));
- }
-
- String creator_id = (String) values.get("created_by");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> positionValues = (Map<String, Object>) values
- .get("position");
-
- Point nodePosition = new Point(
- ((Number) positionValues.get("x")).doubleValue(),
- ((Number) positionValues.get("y")).doubleValue());
-
- String image = (String) values.get("image");
-
- String node_id = (String) values.get("id");
-
- //check that node id is unique
- if(this.getNodesRepository().exists(node_id)) {
- throw new CowebException("node insert: node exists",
- String.format("node %s already exists", node_id));
- }
-
-
- Integer size = (Integer) values.get("size");
-
- Node node = new Node(node_id, (String) values.get("title"),
- (String) values.get("description"), (String) values.get("uri"),
- (String) values.get("color"), creator_id, nodePosition, image,
- size, project_id);
-
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("node insert: bad insert position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
- int index = position.intValue();
- List<Node> nodes = project.getNodes();
- if (index > nodes.size()) {
- index = nodes.size();
- }
- nodes.add(index, node);
-
- this.getNodesRepository().save(node);
- this.getProjectsRepository().save(project);
-
- }
-
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- this.logger.debug("nullOperation: NOP");
- }
-
- @Override
- protected List<Node> getObjectList(Project project) {
- return project.getNodes();
- }
-
- private boolean checkWrite(String clientId, Map<String, Object> data) {
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
-
- String node_id = (String) values.get("id");
-
- Node node = this.getNodesRepository().findOne(node_id);
-
- if(node==null) {
- return true;
- }
- else if ( (project_id == node.getProjectId()) || (project_id != null && project_id.equals(node.getProjectId()))) {
- return true;
- }
- else {
- return false;
- }
- }
-
- @Override
- protected void checkUpdate(String clientId, Map<String, Object> data) {
-
- if(!checkWrite(clientId, data)) {
- throw new CowebException("Error when updating node","Node not in correct project");
- }
- }
-
- @Override
- protected void checkDelete(String clientId, Map<String, Object> data) {
- if(!checkWrite(clientId, data)) {
- throw new CowebException("Error when updating node","Node not in correct project");
- }
- }
-
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ProjectSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,87 +0,0 @@
-/**
- *
- */
-package org.iri_research.renkan.coweb.event;
-
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Named;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * @author ymh
- *
- */
-@Named
-public class ProjectSyncEventManager extends
- AbstractSyncEventManager<Project, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(ProjectSyncEventManager.class);
-
- @Override
- public IRenkanRepository<Project, String> getObjectRepository() {
- return this.getProjectsRepository();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#insert(java
- * .util.Map)
- */
- @Override
- public void insert(String clientId, Map<String, Object> data) {
- this.logger.debug("Insert called, do nothing");
- // do nothing
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#delete(java
- * .util.Map)
- */
- @Override
- public void delete(String clientId, Map<String, Object> data) {
- this.logger.debug("Delete called, do nothing");
- // do nothing
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.iri_research.renkan.coweb.event.AbstractSyncEventManager#nullOperation
- * (java.util.Map)
- */
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- this.logger.debug("Null called, do nothing");
- // do nothing
- }
-
- @Override
- protected List<Project> getObjectList(Project project) {
- this.logger.error("Get object list called error");
- throw new UnsupportedOperationException("Get object list called error");
- }
-
- @Override
- protected void checkUpdate(String clientId, Map<String, Object> data) {
- //do nothing
- }
-
- @Override
- protected void checkDelete(String clientId, Map<String, Object> data) {
- //do nothing
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/RosterSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,188 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Named;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.RenkanSessionModeratorState;
-import org.iri_research.renkan.models.RosterUser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Named
-public class RosterSyncEventManager extends
- AbstractBaseSyncEventManager<RosterUser, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(RosterSyncEventManager.class);
-
- @Override
- public void insert(String clientId, Map<String, Object> data) {
- logger.debug("RosterUserSyncEventManager.insert " + data.toString());
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String projectId = (String) values.get("_project_id");
-
- List<RosterUser> usersList = null;
-
- if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
- .containsKey(projectId)) {
- usersList = RenkanSessionModeratorState.INSTANCE
- .getProjectsUsersList().get(projectId);
- }
- if (usersList == null) {
- usersList = new ArrayList<RosterUser>();
- RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().put(
- projectId, usersList);
- }
-
- String id = (String) values.get("id");
-
- RosterUser user = null;
-
- for (RosterUser rosterUser : usersList) {
- if (rosterUser.getId().equals(id)) {
- user = rosterUser;
- break;
- }
- }
- if (user != null) {
- this.update(clientId, data);
- return;
- }
-
- String title = (String) values.get("title");
- String description = (String) values.get("description");
- String uri = (String) values.get("uri");
- String color = (String) values.get("color");
- Long site_id = (Long) values.get("site_id");
-
- user = new RosterUser(id, title, description, uri, color, projectId,
- site_id, clientId);
-
- Integer position = (Integer) data.get("position");
- if (position == null) {
- position = new Integer(0);
- }
-
- usersList.add(position.intValue(), user);
-
- logger.debug("RosterUserSyncEventManager.insert in "
- + projectId
- + " : "
- + RenkanSessionModeratorState.INSTANCE
- .getProjectsActivationMap().toString());
-
- }
-
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- // do nothing
- return;
- }
-
- @Override
- public void update(String clientId, Map<String, Object> data) {
- logger.debug("RosterUserSyncEventManager.update " + data.toString());
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String projectId = (String) values.get("_project_id");
-
- List<RosterUser> usersList = null;
-
- if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
- .containsKey(projectId)) {
- usersList = RenkanSessionModeratorState.INSTANCE
- .getProjectsUsersList().get(projectId);
- }
-
- if (usersList == null) {
- logger.debug("RosterUserSyncEventManager.update : null user list");
- return;
- }
-
- String id = (String) values.get("id");
-
- RosterUser user = null;
-
- for (RosterUser rosterUser : usersList) {
- if (rosterUser.getId().equals(id)) {
- user = rosterUser;
- break;
- }
- }
-
- if (user == null) {
- logger.debug("RosterUserSyncEventManager.update : user not found in list");
- return;
- }
-
- String title = (String) values.get("title");
- String description = (String) values.get("description");
- String uri = (String) values.get("uri");
- String color = (String) values.get("color");
-
- if (title != null) {
- user.setTitle(title);
- }
- if (description != null) {
- user.setDescription(description);
- }
- if (uri != null) {
- user.setUri(uri);
- }
- if (color != null) {
- user.setColor(color);
- }
-
- return;
-
- }
-
- @Override
- public void delete(String clientId, Map<String, Object> data) {
- logger.debug("RosterUserSyncEventManager.delete " + data.toString());
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String projectId = (String) values.get("_project_id");
-
- List<RosterUser> usersList = null;
-
- if (RenkanSessionModeratorState.INSTANCE.getProjectsUsersList()
- .containsKey(projectId)) {
- usersList = RenkanSessionModeratorState.INSTANCE
- .getProjectsUsersList().get(projectId);
- }
-
- if (usersList == null) {
- logger.debug("RosterUserSyncEventManager.delete : null user list");
- return;
- }
-
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("object delete: bad delete position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
- int index = position.intValue();
-
- usersList.remove(index);
-
- if (usersList.isEmpty()) {
- RenkanSessionModeratorState.INSTANCE.getProjectsUsersList().remove(
- projectId);
- }
-
- return;
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/UserSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Named
-public class UserSyncEventManager extends
- AbstractSyncEventManager<User, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(UserSyncEventManager.class);
-
- private final static String DEFAULT_COLOR = "#000080";
-
- @Inject
- private UsersRepository usersRepository;
-
- public UsersRepository getUsersRepository() {
- return this.usersRepository;
- }
-
- @Override
- public IRenkanRepository<User, String> getObjectRepository() {
- return this.getUsersRepository();
- }
-
- @Override
- public void insert(String clientId, Map<String, Object> data) {
-
- // get project
- this.logger.debug("UserSyncEventManager: insert User");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String project_id = (String) values.get("_project_id");
-
- Project project = this.getProjectsRepository().findOne(project_id);
-
- if (null == project) {
- throw new CowebException("user insert: project not found",
- String.format("Project %s not found", project_id));
- }
-
- String user_id = (String) values.get("id");
- String color = (String) values.get("color");
- if (color == null || color.length() == 0) {
- color = UserSyncEventManager.DEFAULT_COLOR;
- }
-
- User user = new User(user_id, (String) values.get("title"),
- (String) values.get("description"), (String) values.get("uri"),
- color);
-
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("node insert: bad insert position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
- int index = position.intValue();
- // TODO: correct this. done that to compile
- List<User> users = new ArrayList<User>();// project.getUsers();
- if (index > users.size()) {
- index = users.size();
- }
- users.add(index, user);
-
- this.getUsersRepository().save(user);
- this.getProjectsRepository().save(project);
-
- }
-
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- this.logger.debug("nullOperation: NOP");
- }
-
- @Override
- protected List<User> getObjectList(Project project) {
- // TODO: correct this, this is wrong, just put here to cpmpile
- return null;
- }
-
- @Override
- protected void checkUpdate(String clientId, Map<String, Object> data) {
- // do nothing
- }
-
- @Override
- protected void checkDelete(String clientId, Map<String, Object> data) {
- // do nothing
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/coweb/event/ViewSyncEventManager.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,210 +0,0 @@
-package org.iri_research.renkan.coweb.event;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import org.coweb.CowebException;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.View;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.data.mongodb.core.geo.Point;
-
-import com.google.common.base.CaseFormat;
-
-@Named
-public class ViewSyncEventManager extends AbstractBaseSyncEventManager<View, String> {
-
- private final Logger logger = LoggerFactory
- .getLogger(ViewSyncEventManager.class);
-
- @Inject
- private UsersRepository usersRepository;
-
- public UsersRepository getUsersRepository() {
- return usersRepository;
- }
-
-
- @Override
- public void insert(String clientId, Map<String, Object> data) {
-
- // get project
- this.logger.debug("EdgeSyncEventManager: insert view");
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- Project project = getProject(values);
-
- String view_id = (String) values.get("id");
- //check that view id is unique
- for (View pview : project.getViews()) {
- if(pview.getId() != null && pview.getId().equals(view_id)) {
- throw new CowebException("view insert: view exists",
- String.format("view %s already exists", view_id));
- }
- }
- View view = new View(view_id, null, null , null, null, null, 1.0, null);
-
- updateViewInstance(values, view_id, view);
-
- int index = this.getPosition(data);
-
- List<View> views = project.getViews();
- if (index > views.size()) {
- index = views.size();
- }
- views.add(index, view);
-
- this.getProjectsRepository().save(project);
-
- }
-
- private Project getProject(Map<String, Object> values)
- throws CowebException {
- String project_id = (String) values.get("_project_id");
-
- Project project = this.getProjectsRepository().findOne(project_id);
-
- if (null == project) {
- throw new CowebException("View insert: project not found",
- String.format("Project %s not found", project_id));
- }
- return project;
- }
-
- @Override
- public void nullOperation(String clientId, Map<String, Object> data) {
- this.logger.debug("nullOperation: NOP");
- }
-
- @Override
- public void update(String clientId, Map<String, Object> data) {
- this.logger.debug("ViewSyncEventManager: update "
- + this.getClass().getName());
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
- String obj_id = (String) values.get("id");
-
- this.logger.debug(String.format("update %s %s", this.getClass()
- .getName(), obj_id));
-
- Project project = getProject(values);
-
- int position = getPosition(data);
-
- if(position<0 || position >= project.getViews().size()) {
- throw new CowebException("View update: bad position",
- String.format("View %s bad position %d", obj_id, position));
- }
- View targetView = project.getViews().get(position);
-
- boolean obj_changed = updateViewInstance(values, obj_id, targetView);
-
- if(obj_changed) {
- targetView.setUpdated(new DateTime());
- this.getProjectsRepository().save(project);
- }
- }
-
- private boolean updateViewInstance(Map<String, Object> values,
- String obj_id, View targetView) throws CowebException {
- boolean obj_changed = false;
- // update object
- for (String fieldname : values.keySet()) {
- if (!"id".equalsIgnoreCase(fieldname) && !fieldname.startsWith("_")) {
- String upperCaseFieldname = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, fieldname);
- switch(fieldname) {
- case "offset":
- @SuppressWarnings("unchecked")
- HashMap<String, Double> offset = (HashMap<String, Double>) values.get("offset");
- Point offsetPoint = null;
- if(offset != null) {
- offsetPoint = new Point(offset.get("x")!= null?offset.get("x").doubleValue():0, offset.get("y")!=null?offset.get("y").doubleValue():0);
- }
- Point oldOffsetPoint = targetView.getOffset();
- if ((offsetPoint == null && oldOffsetPoint != null)
- || (offsetPoint != null && !offsetPoint.equals(oldOffsetPoint))) {
- targetView.setOffset(offsetPoint);
- obj_changed = true;
- }
- break;
- case "zoom_level":
- Double newZoomLevelDouble = (Double)values.get("zoom_level");
- double newZoomLevel = newZoomLevelDouble==null?1.0:newZoomLevelDouble.doubleValue();
- double oldNewZoomLevel = targetView.getZoomLevel();
- if(newZoomLevel != oldNewZoomLevel) {
- targetView.setZoomLevel(newZoomLevel);
- obj_changed = true;
- }
- break;
- default:
- try {
- Object new_value = values.get(fieldname);
- logger.debug(String.format("field %s : new value class : %s ", fieldname, new_value == null?"NULL":new_value.getClass().toString()));
- Object old_value = View.class.getMethod("get"+upperCaseFieldname).invoke(targetView);
- if ((new_value == null && old_value != null)
- || (new_value != null && !new_value.equals(old_value))) {
- View.class.getMethod("set"+upperCaseFieldname, View.class.getMethod("get"+upperCaseFieldname).getReturnType()).invoke(targetView, new_value);
- obj_changed = true;
- }
- }
- catch (IllegalAccessException | IllegalArgumentException
- | InvocationTargetException | NoSuchMethodException
- | SecurityException e) {
- throw new CowebException("View update: problem on field update",
- String.format("View %s bad field update %s : %s", obj_id, fieldname, e.toString()));
- }
- break;
- }
- }
- }
- return obj_changed;
- }
-
- private int getPosition(Map<String, Object> data) throws CowebException {
- Integer position = (Integer) data.get("position");
-
- if (position == null || position < 0) {
- throw new CowebException("get position: bad insert position",
- String.format("Bad position %s not found",
- position == null ? "null" : position.toString()));
- }
-
- return position.intValue();
- }
-
- @Override
- public void delete(String clientId, Map<String, Object> data) {
-
- this.logger.debug("ViewSyncEventManager: delete "
- + this.getClass().getName());
-
- @SuppressWarnings("unchecked")
- Map<String, Object> values = (Map<String, Object>) data.get("value");
-
- Project project = getProject(values);
- int position = getPosition(values);
-
- this.logger.debug(String.format("delete %s %d", this.getClass()
- .getName(), position));
-
- if(position<0 || position > project.getViews().size()) {
- throw new CowebException("node delete: bad delete position",
- String.format("Bad position %d not found", position));
- }
-
- project.getViews().remove(position);
-
- this.getProjectsRepository().save(project);
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/GroupForm.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class GroupForm extends RenkanForm<String, Group> {
-
- private String avatar;
- private Set<String> users;
-
- private GroupsRepository groupsRepository;
-
-
- public GroupForm() {
- super();
- }
-
- public GroupForm(Group model) {
- super(model);
- if (model != null) {
- this.avatar = model.getAvatar();
- this.setUsers(new HashSet<>(model.getUsers()));
- if(model.getUsers() != null) {
- this.getUsers().addAll(model.getUsers());
- }
- }
- }
-
- public String getAvatar() {
- return avatar;
- }
-
- @Override
- protected Group getModelInstance() {
- return new Group();
- }
-
- @Override
- protected IRenkanRepository<Group, String> getRepository() {
- return this.groupsRepository;
- }
-
- public GroupsRepository getGroupsRepository() {
- return groupsRepository;
- }
-
-
- @Override
- protected void saveToModel() {
- if (this.getId() == null || this.getId().length() == 0) {
- this.model.setId(Constants.UUID_GENERATOR.generate().toString());
- }
- this.model.setAvatar(this.avatar);
- if(this.getUsers() != null) {
- this.groupsRepository.setUsersList(model, this.getUsers());
- }
- }
-
- public void setAvatar(String avatar) {
- this.avatar = avatar;
- }
-
-
- @Autowired
- public void setGroupsRepository(GroupsRepository groupsRepository) {
- this.groupsRepository = groupsRepository;
- }
-
- public Set<String> getUsers() {
- return users;
- }
-
- public void setUsers(Set<String> users) {
- this.users = users;
- }
-
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/GroupFormValidator.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.validation.Errors;
-import org.springframework.validation.ValidationUtils;
-import org.springframework.validation.Validator;
-
-@Component
-public class GroupFormValidator implements Validator {
-
- @SuppressWarnings("unused")
- private Logger logger = LoggerFactory.getLogger(GroupFormValidator.class);
-
- @Override
- public boolean supports(Class<?> clazz) {
- return GroupForm.class.equals(clazz);
- }
-
- @Override
- public void validate(Object target, Errors errors) {
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
- "renkan.error.name.empty");
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/RenkanForm.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import java.io.Serializable;
-
-import org.iri_research.renkan.RenkanException;
-import org.iri_research.renkan.models.IRenkanModel;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-
-public abstract class RenkanForm<ID extends Serializable, RM extends IRenkanModel<ID>> {
-
- protected RM model;
-
- private ID id;
- private String title;
- private String description;
- private String uri;
- private String color;
-
- protected abstract void saveToModel();
-
- protected abstract IRenkanRepository<RM, ID> getRepository();
-
- protected abstract RM getModelInstance();
-
- public RenkanForm() {
- }
-
- public RenkanForm(RM model) {
- if (model == null) {
- return;
- }
- this.model = model;
- this.id = model.getId();
- this.title = model.getTitle();
- this.description = model.getDescription();
- this.color = model.getColor();
- this.uri = model.getUri();
- }
-
- public ID getId() {
- return id;
- }
-
- public void setId(ID id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getUri() {
- return uri;
- }
-
- public void setUri(String uri) {
- this.uri = uri;
- }
-
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
- public void setModel(RM model) {
- this.model = model;
- }
-
- private void saveToRenkanModel() {
-
- this.model.setTitle(title);
- this.model.setDescription(description);
- this.model.setColor(color);
- this.model.setUri(uri);
- }
-
- public RM save() throws RenkanException {
-
- if (this.model == null) {
-
- if (this.getId() != null) {
- this.model = this.getRepository().findOne(this.getId());
- if (this.model == null) {
- throw new RenkanException("Model id "
- + this.getId().toString() + " not found");
- }
- } else {
- this.model = this.getModelInstance();
- }
- }
-
- this.saveToRenkanModel();
- this.saveToModel();
-
- this.model = this.getRepository().save(this.model);
-
- return this.model;
-
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/SpaceForm.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-
-public class SpaceForm extends RenkanForm<String, Space> {
-
- private SpacesRepository spacesRepository;
-
- public SpaceForm() {
- super();
- }
-
- public SpaceForm(Space model) {
- super(model);
- this.binConfig = model.getBinConfig();
- this.image = model.getImage();
- }
-
- private String binConfig;
- private String image;
-
- public String getBinConfig() {
- return binConfig;
- }
-
- public void setBinConfig(String binConfig) {
- this.binConfig = binConfig;
- }
-
- public String getImage() {
- return image;
- }
-
- public void setImage(String image) {
- this.image = image;
- }
-
- @Override
- protected void saveToModel() {
- if (this.getId() == null || this.getId().length() == 0) {
- this.model.setId(Constants.UUID_GENERATOR.generate().toString());
- this.model.setCreated(new DateTime());
- }
- this.model.setBinConfig(binConfig);
- this.model.setImage(image);
- }
-
- @Override
- protected IRenkanRepository<Space, String> getRepository() {
- return this.spacesRepository;
- }
-
- @Override
- protected Space getModelInstance() {
- return new Space();
- }
-
- public void setSpacesRepository(SpacesRepository spacesRepository) {
- this.spacesRepository = spacesRepository;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/SpaceFormValidator.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import java.io.IOException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.validation.Errors;
-import org.springframework.validation.ValidationUtils;
-import org.springframework.validation.Validator;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-
-@Component
-public class SpaceFormValidator implements Validator {
-
- private Logger logger = LoggerFactory.getLogger(SpaceFormValidator.class);
-
- @Override
- public boolean supports(Class<?> clazz) {
- return SpaceForm.class.equals(clazz);
- }
-
- @Override
- public void validate(Object target, Errors errors) {
- SpaceForm space = (SpaceForm) target;
-
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
- "renkan.error.title.empty");
-
- if (space.getBinConfig() != null && space.getBinConfig().length() > 0) {
- boolean valid = false;
- ObjectMapper mapper = new ObjectMapper();
- mapper.registerModule(new JodaModule());
-
- try {
- mapper.readTree(space.getBinConfig());
- valid = true;
- } catch (JsonProcessingException e) {
- logger.debug(
- "SpaceValidator JsonProcessingException error validating bin config",
- e);
- } catch (IOException e) {
- logger.debug(
- "SpaceValidator IOException error validating bin config",
- e);
- }
- if (!valid) {
- errors.rejectValue("binConfig", "renkan.error.bin_config.json");
- }
- }
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/UserForm.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,183 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.LocalDate;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.format.annotation.DateTimeFormat.ISO;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-public class UserForm extends RenkanForm<String, User> {
-
- private String avatar;
-
- @DateTimeFormat(iso = ISO.DATE)
- private LocalDate credentialsExpirationDate;
- @DateTimeFormat(iso = ISO.DATE)
- private LocalDate expirationDate;
-
- private String email;
-
- private boolean enabled;
- private boolean locked;
- private String password;
- private String passwordConfirm;
- private Set<String> groups;
- private List<String> userAuthorities;
-
- private UsersRepository usersRepository;
-
-
- private PasswordEncoder passwordEncoder;
-
- public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
- this.passwordEncoder = passwordEncoder;
- }
-
- public UserForm() {
- super();
- }
-
- public UserForm(User model) {
- super(model);
- if (model != null) {
- this.avatar = model.getAvatar();
- this.credentialsExpirationDate = model.getCredentialsExpirationDate();
- this.email = model.getEmail();
- this.expirationDate = model.getExpirationDate();
- this.enabled = model.isEnabled();
- this.locked = model.isLocked();
- this.userAuthorities = model.getUserAuthorities()!=null?new ArrayList<String>(model.getUserAuthorities()):new ArrayList<String>();
- this.setGroups(new HashSet<>(model.getGroups()));
- }
- }
-
- public String getAvatar() {
- return avatar;
- }
-
- public LocalDate getCredentialsExpirationDate() {
- return credentialsExpirationDate;
- }
-
- public String getEmail() {
- return email;
- }
-
- public LocalDate getExpirationDate() {
- return expirationDate;
- }
-
- @Override
- protected User getModelInstance() {
- return new User();
- }
-
- public String getPassword() {
- return password;
- }
-
- public String getPasswordConfirm() {
- return passwordConfirm;
- }
-
- @Override
- protected IRenkanRepository<User, String> getRepository() {
- return this.usersRepository;
- }
-
- public UsersRepository getUsersRepository() {
- return usersRepository;
- }
-
- public boolean isEnabled() {
- return enabled;
- }
-
- public boolean isLocked() {
- return locked;
- }
-
- @Override
- protected void saveToModel() {
- if (this.getId() == null || this.getId().length() == 0) {
- this.model.setId(Constants.UUID_GENERATOR.generate().toString());
- }
- this.model.setAvatar(this.avatar);
- this.model.setEmail(this.email);
- this.model.setCredentialsExpirationDate(this.credentialsExpirationDate);
- this.model.setExpirationDate(this.expirationDate);
- this.model.setEnabled(this.enabled);
- this.model.setLocked(this.locked);
- this.model.setUserAuthorities((this.userAuthorities!=null && !this.userAuthorities.isEmpty())?new ArrayList<String>(this.userAuthorities):null);
- if(this.getGroups() != null) {
- this.usersRepository.setGroupsList(this.model, this.getGroups());
- }
- if(this.password != null && this.password.length() > 0) {
- this.model.setPassword(this.passwordEncoder.encode(this.password));
- }
-
- }
-
- public void setAvatar(String avatar) {
- this.avatar = avatar;
- }
-
- public void setCredentialsExpirationDate(LocalDate credentialsExpirationDate) {
- this.credentialsExpirationDate = credentialsExpirationDate;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- }
-
- public void setExpirationDate(LocalDate expirationDate) {
- this.expirationDate = expirationDate;
- }
-
- public void setLocked(boolean locked) {
- this.locked = locked;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public void setPasswordConfirm(String passwordConfirm) {
- this.passwordConfirm = passwordConfirm;
- }
-
- @Autowired
- public void setUsersRepository(UsersRepository usersRepository) {
- this.usersRepository = usersRepository;
- }
-
- public List<String> getUserAuthorities() {
- return userAuthorities;
- }
-
- public void setUserAuthorities(List<String> userAuthorities) {
- this.userAuthorities = userAuthorities;
- }
-
- public Set<String> getGroups() {
- return groups;
- }
-
- public void setGroups(Set<String> groups) {
- this.groups = groups;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/forms/UserFormValidator.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-package org.iri_research.renkan.forms;
-
-import org.iri_research.renkan.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-import org.springframework.validation.Errors;
-import org.springframework.validation.ValidationUtils;
-import org.springframework.validation.Validator;
-
-@Component
-public class UserFormValidator implements Validator {
-
- @SuppressWarnings("unused")
- private Logger logger = LoggerFactory.getLogger(UserFormValidator.class);
-
- @Override
- public boolean supports(Class<?> clazz) {
- return UserForm.class.equals(clazz);
- }
-
- @Override
- public void validate(Object target, Errors errors) {
- UserForm userForm = (UserForm) target;
-
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "title",
- "renkan.error.name.empty");
-
- //TODO : check for user name unicity
- String pswd = userForm.getPassword();
- String pswdConf = userForm.getPasswordConfirm();
-
- if( (pswd == null && pswdConf != null)
- || ((pswd != null || pswdConf != null) && !pswd.equals(pswdConf))) {
- errors.rejectValue("password", "renkan.error.password.equals");
- }
-
- if(userForm.getId() == null && (pswd == null || pswd.length() == 0)) {
- errors.rejectValue("password", "renkan.error.password.missing");
- }
-
- if(userForm.getUserAuthorities() != null && !Constants.USER_ROLES_ALL.containsAll(userForm.getUserAuthorities())) {
- errors.rejectValue("userAuthorities", "renkan.error.authorities.bad_value", "Bad role value");
- }
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/rest/ObjectMapperProvider.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-package org.iri_research.renkan.rest;
-
-import java.io.IOException;
-
-import javax.ws.rs.ext.ContextResolver;
-import javax.ws.rs.ext.Provider;
-
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.stereotype.Component;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
-import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-
-@Component
-@Provider
-public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
-
- public static class RenkanPointDeserializer extends StdDeserializer<Point> {
-
- private static final long serialVersionUID = -2380557631785838410L;
-
- protected RenkanPointDeserializer(Class<?> vc) {
- super(vc);
- }
-
- @Override
- public Point deserialize(JsonParser jp, DeserializationContext ctxt)
- throws IOException, JsonProcessingException {
- JsonNode node = jp.getCodec().readTree(jp);
- double x = node.get("x") != null? node.get("x").asDouble(): Double.NaN;
- double y = node.get("y") != null? node.get("y").asDouble(): Double.NaN;
- Point p = new Point(x, y);
- return p;
- }
- }
- @Override
- public ObjectMapper getContext(Class<?> type) {
- ObjectMapper objectMapper = new ObjectMapper();
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
- false);
- objectMapper.registerModule(new JodaModule());
-
- SimpleModule pointModule = new SimpleModule("RenkanPointModule")
- .addDeserializer(Point.class, new RenkanPointDeserializer(Point.class));
- objectMapper.registerModule(pointModule);
-
- return objectMapper;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/rest/ProjectsResource.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-package org.iri_research.renkan.rest;
-
-import java.util.Arrays;
-import java.util.List;
-
-import javax.inject.Singleton;
-import javax.ws.rs.Path;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-//TODO: Add views management
-//TODO: Add user management (on POST for example)
-@Singleton
-@Path("projects")
-@Component
-public class ProjectsResource extends RenkanResource<Project, String> {
-
- private Logger logger = LoggerFactory.getLogger(ProjectsResource.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
- @Autowired
- private NodesRepository nodesRepository;
- @Autowired
- private EdgesRepository edgesRepository;
-
- @Override
- protected IRenkanRepository<Project, String> getRepository() {
- return this.projectsRepository;
- }
-
- @Override
- protected String getNewId() {
- return Constants.UUID_GENERATOR.generate().toString();
- }
-
- @Override
- protected void prepareObject(Project obj) {
- if (obj.getCreated() == null) {
- obj.setCreated(new DateTime());
- }
- obj.setUpdated(new DateTime());
-
- for (Node node : obj.getNodes()) {
- node.setProjectId(obj.getId());
- }
- for (Edge edge : obj.getEdges()) {
- edge.setProjectId(obj.getId());
- }
- }
-
- @Override
- protected List<String> getObjectListFieldList() {
- return Arrays.asList(this.baseObjectListFieldList);
- }
-
- @Override
- protected void doDeleteObject(String objectId) {
- this.projectsRepository.deleteRecursive(objectId);
- }
-
- @Override
- protected Project saveObjectPost(Project obj) {
-
- logger.debug("Project Resource : Save object post " + obj.getTitle());
- this.nodesRepository.save(obj.getNodes());
- this.edgesRepository.save(obj.getEdges());
- return super.saveObjectPost(obj);
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/rest/RenkanResource.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,225 +0,0 @@
-package org.iri_research.renkan.rest;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-import javax.ws.rs.core.UriInfo;
-
-import org.glassfish.jersey.server.JSONP;
-import org.iri_research.renkan.models.IRenkanModel;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-
-public abstract class RenkanResource<T extends IRenkanModel<ID>, ID extends Serializable> {
-
- private Logger logger = LoggerFactory.getLogger(RenkanResource.class);
-
- protected String[] baseObjectListFieldList = { "description", "title",
- "uri", "created", "color" };
-
- abstract protected IRenkanRepository<T, ID> getRepository();
-
- abstract protected ID getNewId();
-
- abstract protected List<String> getObjectListFieldList();
-
- @Context
- private UriInfo uriInfo;
-
- protected DBCollection getCollection() {
- return this.getRepository().getCollection();
- }
-
- abstract protected void prepareObject(T obj);
-
- protected void doDeleteObject(ID objectId) {
- this.getRepository().delete(objectId);
- }
-
- // TODO: this produce application/javascript by default. I would rather have
- // application/json. The prefered behaviour would be to produde js only od
- // the callbacl query param is used
- @GET
- @Path("{id : [a-zA-Z\\-0-9]+}")
- @JSONP(callback = "callback", queryParam = "callback")
- @Produces({ "application/javascript", "application/x-javascript",
- "text/ecmascript", "application/ecmascript", "text/jscript",
- MediaType.APPLICATION_JSON + ";charset=utf-8" })
- public T getObject(@PathParam("id") ID objectId) {
-
- this.logger.debug("GetObject: " + objectId);
-
- T obj = this.getRepository().findOne(objectId);
-
- if (null == obj) {
- throw new WebApplicationException(Status.NOT_FOUND);
- }
-
- return obj;
- }
-
- @DELETE
- @Path("{id : [a-zA-Z\\-0-9]+}")
- @Produces(MediaType.TEXT_PLAIN + ";charset=utf-8")
- public Response deleteObject(@PathParam("id") ID objectId) {
-
- this.logger.debug("DeleteObject : id " + objectId);
- this.doDeleteObject(objectId);
-
- return Response.ok(
- this.uriInfo.getAbsolutePathBuilder().build().toString()
- + " deleted").build();
-
- }
-
- protected T saveObject(T obj) {
- return this.getRepository().save(obj);
- }
-
- protected T saveObjectPost(T obj) {
- return this.saveObject(obj);
- }
-
- protected T saveObjectPut(T obj) {
- return this.saveObject(obj);
- }
-
- /**
- * test: curl -i -X PUT -H 'Content-Type: application/json' -d
- *
- * @test-data.json http://localhost:8080/renkan/rest/spaces/
- * 12eff140-e65c-11e1-aff1-0800200c9a66
- *
- * @param objId
- * @param objectContent
- */
- @PUT
- @Path("{id : [a-zA-Z\\-0-9]+}")
- @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
- public Response putRenkanObject(@PathParam("id") ID objId, T obj) {
-
- if (!objId.equals(obj.getId())) {
- throw new WebApplicationException(Response
- .status(Status.BAD_REQUEST)
- .entity("Id parameter and id in JSON do not match").build());
- }
-
- if (!this.getRepository().exists(objId)) {
- throw new WebApplicationException(Response.status(Status.NOT_FOUND)
- .build());
- }
-
- this.saveObjectPut(obj);
- this.getRepository().save(obj);
- return Response.noContent().build();
-
- }
-
- @POST
- @Consumes(MediaType.APPLICATION_JSON + ";charset=utf-8")
- @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
- public Response postRenkanObject(T obj) {
-
- if (obj.isIdSet()) {
- throw new WebApplicationException(Response
- .status(Status.BAD_REQUEST)
- .entity("Id in JSON must not be set").build());
- }
-
- obj.setId(getNewId());
- this.prepareObject(obj);
- obj = this.saveObjectPost(obj);
- return Response
- .created(
- this.uriInfo.getAbsolutePathBuilder()
- .segment(obj.getId().toString()).build())
- .entity(obj).build();
- }
-
- @GET
- @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
- public String getObjectList() throws JsonProcessingException {
-
- BasicDBObject keys = new BasicDBObject();
-
- for (String fieldname : this.getObjectListFieldList()) {
- keys.put(fieldname, 1);
- }
- DBCursor cursor = this.getCollection().find(new BasicDBObject(), keys);
-
- List<DBObject> res = new ArrayList<DBObject>();
-
- try {
- while (cursor.hasNext()) {
- DBObject obj = cursor.next();
- obj.put("id", obj.get("_id"));
- DBObject links = new BasicDBObject();
-
- DBObject linkdef = new BasicDBObject();
- linkdef.put(
- "href",
- this.uriInfo.getAbsolutePathBuilder()
- .path(obj.get("_id").toString()).build()
- .toString());
- linkdef.put("method", "get");
- linkdef.put("produces", MediaType.APPLICATION_JSON
- + ";charset=utf-8");
- links.put("view", linkdef);
-
- linkdef = new BasicDBObject();
- linkdef.put(
- "href",
- this.uriInfo.getAbsolutePathBuilder()
- .path(obj.get("_id").toString()).build()
- .toString());
- linkdef.put("method", "put");
- linkdef.put("consumes", MediaType.APPLICATION_JSON
- + ";charset=utf-8");
- links.put("update", linkdef);
-
- linkdef = new BasicDBObject();
- linkdef.put(
- "href",
- this.uriInfo.getAbsolutePathBuilder()
- .path(obj.get("_id").toString()).build()
- .toString());
- linkdef.put("method", "delete");
- links.put("delete", linkdef);
-
- obj.put("__links", links);
- res.add(obj);
- }
- } finally {
- cursor.close();
- }
- ObjectMapper mapper = new ObjectMapper();
- mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
- mapper.registerModule(new JodaModule());
- return mapper.writeValueAsString(res);
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/rest/RestApplication.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-package org.iri_research.renkan.rest;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.spring.SpringLifecycleListener;
-import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
-
-public class RestApplication extends ResourceConfig {
-
- private ObjectMapperProvider objectMapperProvider = new ObjectMapperProvider();
-
- public RestApplication() {
-
- this.packages("org.iri_research.renkan.rest");
- this.register(SpringLifecycleListener.class);
- this.register(RequestContextFilter.class);
-
- ObjectMapper objectMapper = this.objectMapperProvider.getContext(ObjectMapper.class);
-
- JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider(objectMapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS);
-
- this.register(provider);
-
- }
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/rest/SpacesResource.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-package org.iri_research.renkan.rest;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.inject.Singleton;
-import javax.ws.rs.Path;
-
-import org.iri_research.renkan.Constants;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.IRenkanRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Singleton
-@Path("spaces")
-@Component
-public class SpacesResource extends RenkanResource<Space, String> {
-
- @SuppressWarnings("unused")
- private Logger logger = LoggerFactory.getLogger(SpacesResource.class);
-
- private String[] spaceObjectListFieldList = { "created_by", "bin_config",
- "image" };
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @Override
- protected IRenkanRepository<Space, String> getRepository() {
- return spacesRepository;
- }
-
- @Override
- protected String getNewId() {
- return Constants.UUID_GENERATOR.generate().toString();
- }
-
- @Override
- protected void prepareObject(Space obj) {
- if (obj.getCreated() == null) {
- obj.setCreated(new DateTime());
- }
- }
-
- @Override
- protected List<String> getObjectListFieldList() {
- ArrayList<String> fieldList = new ArrayList<>(
- this.baseObjectListFieldList.length
- + this.spaceObjectListFieldList.length);
- fieldList.addAll(Arrays.asList(this.baseObjectListFieldList));
- fieldList.addAll(Arrays.asList(this.spaceObjectListFieldList));
- return fieldList;
- }
-
-}
--- a/server/renkan-web/src/main/java/org/iri_research/renkan/services/RenkanUserDetailsService.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-package org.iri_research.renkan.services;
-
-import java.util.List;
-
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-@Service
-public class RenkanUserDetailsService implements UserDetailsService {
-
- @Autowired
- private UsersRepository usersRepository;
-
- @Override
- public UserDetails loadUserByUsername(String username)
- throws UsernameNotFoundException {
- List<User> res = this.usersRepository.findByTitle(username);
- if (res == null || res.size() == 0) {
- throw new UsernameNotFoundException(String.format(
- "User {0} not found.", username));
- }
- return res.get(0);
- }
-
-}
--- a/server/renkan-web/src/main/resources/META-INF/applicationContext.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd"
->
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
- <mvc:annotation-driven />
-
- <util:properties id="propsLocations">
- <prop key="servletContextProps">META-INF/renkan.properties</prop>
- <prop key="classpathProps">classpath:renkan_run.properties</prop>
- </util:properties>
-
- <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1000"/>
- <property name="location" value="#{propsLocations.servletContextProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="false"/>
- </bean>
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1"/>
- <property name="location" value="#{propsLocations.classpathProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="true"/>
- </bean>
-
- <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="IgnoreResourceNotFound" value="true"/>
- <property name="locations">
- <list>
- <value>#{propsLocations.servletContextProps}</value>
- <value>#{propsLocations.classpathProps}</value>
- </list>
- </property>
- <property name="fileEncoding" value="UTF-8"/>
- </bean>
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <bean class="org.iri_research.renkan.RenkanProperties"
- factory-method="getInstance" />
-
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
- <context:component-scan base-package="org.iri_research.renkan.management" />
-
- <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
- <property name="basenames">
- <list>
- <value>META-INF/i18n/messages</value>
- <value>classpath:org/springframework/security/messages</value>
- </list>
- </property>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="fallbackToSystemLocale" value="true" />
- </bean>
-
-</beans>
--- a/server/renkan-web/src/main/resources/META-INF/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
-
- <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="${mongodb.db.name}"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-web/src/main/resources/META-INF/renkan.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-mongodb.host.name = localhost
-mongodb.host.port = 27017
-mongodb.db.name = renkan
-
-user.admin.name = admin
-#user.admin.password = admin
-user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
-
-renkan.pagination.size = 2
-renkan.coweb.debug = false
-renkan.coweb.websocket = true
\ No newline at end of file
--- a/server/renkan-web/src/main/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration>
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.beans.factory">
- <level value="INFO" />
- </logger>
- <!--logger name="org.cometd">
- <level value="DEBUG" />
- </logger-->
- <!--logger name="org.coweb">
- <level value="DEBUG" />
- </logger-->
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/renkan-web/src/main/webapp/WEB-INF/applicationContext.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc.xsd"
->
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
- <mvc:annotation-driven />
-
- <util:properties id="propsLocations">
- <prop key="servletContextProps">WEB-INF/renkan.properties</prop>
- <prop key="classpathProps">classpath:renkan_run.properties</prop>
- </util:properties>
-
- <!--context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="${propsLocations.servletContextProps}"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="${propsLocations.classpathProps}"/-->
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1000"/>
- <property name="location" value="#{propsLocations.servletContextProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="false"/>
- </bean>
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1"/>
- <property name="location" value="#{propsLocations.classpathProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="true"/>
- </bean>
-
- <bean id="renkanProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- <property name="IgnoreResourceNotFound" value="true"/>
- <property name="locations">
- <list>
- <value>#{propsLocations.servletContextProps}</value>
- <value>#{propsLocations.classpathProps}</value>
- </list>
- </property>
- <property name="fileEncoding" value="UTF-8"/>
- </bean>
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
- <import resource="spring-security.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <bean class="org.iri_research.renkan.RenkanProperties"
- factory-method="getInstance" />
-
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
- <context:component-scan base-package="org.iri_research.renkan.management" />
-
- <!--mvc:annotation-driven>
- <mvc:argument-resolvers>
- <bean class="org.springframework.data.web.PageableArgumentResolver">
- <property name="fallbackPagable">
- <bean class="org.springframework.data.domain.PageRequest">
- <constructor-arg type="int" value="1"/>
- <constructor-arg type="int" value="${renkan.pagination.size}"/>
- </bean>
- </property>
- </bean>
- </mvc:argument-resolvers>
- </mvc:annotation-driven-->
-
- <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
- <property name="basenames">
- <list>
- <value>WEB-INF/i18n/messages</value>
- <value>classpath:org/springframework/security/messages</value>
- </list>
- </property>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="fallbackToSystemLocale" value="true" />
- </bean>
-
-</beans>
--- a/server/renkan-web/src/main/webapp/WEB-INF/cowebConfig.json Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-{
- "sessionModerator" : "org.iri_research.renkan.coweb.RenkanSessionModerator",
- "moderatorIsUpdater" : true,
- "operationEngine" : true,
- "bots": []
-}
--- a/server/renkan-web/src/main/webapp/WEB-INF/i18n/messages.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-
-date.format = yyyy/MM/dd HH:mm
-date.date.format = yyyy/MM/dd
-date.date.datePicker.format = yy/mm/dd
-question.yes = yes
-question.no = no
-
-
-renkanIndex.renkan_exp = Create a Renkan
-renkanIndex.project_list = Renkan list
-renkanIndex.project_name = Name
-renkanIndex.project_creation = Creation
-renkanIndex.project_updated = Updated
-renkanIndex.project_edit = Edit
-renkanIndex.project_copy = Copy
-renkanIndex.project_delete = Delete
-renkanIndex.project_render = View
-renkanIndex.project_export = Export
-renkanIndex.project_commands = Comm.
-renkanIndex.project_edit_link = Edit renkan
-renkanIndex.project_copy_link = Copy renkan
-renkanIndex.project_delete_link = Delete renkan
-renkanIndex.project_render_link = View renkan
-renkanIndex.project_export_link = Export renkan
-renkanIndex.project_delete_confirm = Delete renkan "<%= title %>" ?
-renkanIndex.project_filter = Filter title
-
-renkanIndex.space_exp = Create a space
-renkanIndex.renkan_title = Title
-renkanIndex.renkan_file = File
-renkanIndex.renkan_spaces = Renkan Spaces
-renkanIndex.renkan_space = Renkan Space
-renkanIndex.space_list = Space list
-renkanIndex.space_name = Name
-renkanIndex.space_title = Title
-renkanIndex.space_creation = Creation date
-renkanIndex.space_open = Open
-renkanIndex.space_open_link = Open space
-renkanIndex.space_proj_count = Renkan count
-
-
-renkanIndex.js.empty_name_error = Please enter a title
-renkanIndex.js.empty_form_error = Please enter a title or a file
-
-renkanAdmin.renkan_admin = Renkan administration
-renkanAdmin.site_admin = Site administration
-
-renkanAdmin.object = Object
-renkanAdmin.object_list = {0} list
-
-renkanAdmin.space_objects_name = Spaces
-renkanAdmin.space_object_name = Spaces
-
-renkanAdmin.space_add = Add space
-renkanAdmin.space_edit = Edit space
-renkanAdmin.space_delete = Delete space
-renkanIndex.space_url = Url
-renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ?
-renkanAdmin.space_proj_count = Nb. Proj.
-
-renkanAdmin.object_name = Name
-renkanAdmin.object_edit = Edit
-renkanAdmin.object_delete = Delete
-renkanAdmin.object_edit_link = Edit
-renkanAdmin.object_delete_link = Del.
-
-renkanAdmin.form.title = Title
-renkanAdmin.form.name = Name
-renkanAdmin.form.uri = URI
-renkanAdmin.form.description = Description
-renkanAdmin.form.color = Color
-renkanAdmin.form.space.bin_config = Bin config
-renkanAdmin.form.space.submit = Ok
-renkanAdmin.form.space.cancel = Cancel
-renkanAdmin.form.space.format = Format
-renkanAdmin.form.space.compact = Compact
-
-renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
-renkanAdmin.form.expirationDate = Exp. date
-renkanAdmin.form.email = Email
-renkanAdmin.form.enabled = Enabled
-renkanAdmin.form.locked = Locked
-renkanAdmin.form.password = Password
-renkanAdmin.form.passwordConfirm = Confirm password
-renkanAdmin.form.roles = Roles
-renkanAdmin.form.groups = Groups
-renkanAdmin.form.users = Users
-renkanAdmin.form.user.submit = Ok
-
-renkan.error.title.empty = Title must not be empty or null
-renkan.error.name.empty = Name must not be empty or null
-renkan.error.bin_config.json = bin config field must contain a valid json
-renkan.error.password.equals = Password and Password confimation do not match
-renkan.error.password.missing = Password missing
-renkan.error.authorities.bad_value = Bad value for role
-
-
-renkanAuth.log_in = Log in
-renkanAuth.username_label = Username:
-renkanAuth.password_label = Password:
-renkanAuth.renkan_login = Renkan Authentication
-renkanAdmin.site_login = Site Authentication
-renkanAuth.login_error_message = Your login attempt was not successful, try again.
-renkanAuth.login_error_cause = Cause:
-
-renkanHeader.login = login
-renkanHeader.logout = logout
-renkanHeader.admin = administration
-renkanHeader.home = home
-
-renkan.user.roles.ROLE_USER = User
-renkan.user.roles.ROLE_ADMIN = Admin
-renkan.user.roles.ROLE_SPACES_ADMIN = Space admin
-renkan.user.roles.ROLE_GROUPS_ADMIN = Groups admin
-
-renkanAdmin.user_objects_name = Users
-renkanAdmin.user_add = Add user
-renkanAdmin.user_edit = Edit user
-renkanAdmin.user_delete = Del. user
-renkanIndex.user_url = Url
-renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
-
-renkanAdmin.group_objects_name = Groups
-renkanAdmin.group_add = Add group
-renkanAdmin.group_edit = Edit group
-renkanAdmin.group_delete = Del. group
-renkanIndex.group_url = Url
-renkanAdmin.group_confirm_delete = Do you want to delete the group with groupname "{0}" ?
-
--- a/server/renkan-web/src/main/webapp/WEB-INF/i18n/messages_en.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-
-date.format = yyyy/dd/MM HH:mm
-date.date.format = yyyy/dd/MM
-date.date.datePicker.format = yy/dd/mm
-question.yes = yes
-question.no = no
-
-renkanIndex.renkan_exp = Create a Renkan
-renkanIndex.project_list = Renkan list
-renkanIndex.project_name = Name
-renkanIndex.project_creation = Creation
-renkanIndex.project_updated = Updated
-renkanIndex.project_edit = Edit
-renkanIndex.project_copy = Copy
-renkanIndex.project_delete = Delete
-renkanIndex.project_render = View
-renkanIndex.project_export = Export
-renkanIndex.project_commands = Comm.
-renkanIndex.project_edit_link = Edit renkan
-renkanIndex.project_copy_link = Copy renkan
-renkanIndex.project_delete_link = Delete renkan
-renkanIndex.project_render_link = View renkan
-renkanIndex.project_export_link = Export renkan
-renkanIndex.project_delete_confirm = Delete renkan "<%= title %>" ?
-renkanIndex.project_filter = Filter title
-
-renkanIndex.space_exp = Create a space
-renkanIndex.renkan_title = Title
-renkanIndex.renkan_file = File
-renkanIndex.renkan_spaces = Renkan Spaces
-renkanIndex.renkan_space = Renkan Space
-renkanIndex.space_list = Space list
-renkanIndex.space_name = Name
-renkanIndex.space_title = Title
-renkanIndex.space_creation = Creation date
-renkanIndex.space_open = Open
-renkanIndex.space_open_link = Open space
-renkanIndex.space_proj_count = Renkan count
-
-
-renkanIndex.js.empty_name_error = Please enter a title
-renkanIndex.js.empty_form_error = Please enter a title or a file
-
-renkanAdmin.renkan_admin = Renkan administration
-renkanAdmin.site_admin = Site administration
-
-renkanAdmin.object = Object
-renkanAdmin.object_list = {0} list
-
-renkanAdmin.space_objects_name = Spaces
-renkanAdmin.space_object_name = Spaces
-
-renkanAdmin.space_add = Add space
-renkanAdmin.space_edit = Edit space
-renkanAdmin.space_delete = Del. space
-renkanIndex.space_url = Url
-renkanAdmin.space_confirm_delete = Do you want to delete the space entitled "{0}" ?
-renkanAdmin.space_proj_count = Nb. Proj.
-
-renkanAdmin.object_name = Name
-renkanAdmin.object_created = Created
-renkanAdmin.object_edit = Edit
-renkanAdmin.object_proj_count = Renkan count
-renkanAdmin.object_delete = Delete
-renkanAdmin.object_edit_link = Edit
-renkanAdmin.object_delete_link = Del.
-
-renkanAdmin.form.title = Title
-renkanAdmin.form.name = Name
-renkanAdmin.form.uri = URI
-renkanAdmin.form.description = Description
-renkanAdmin.form.color = Color
-renkanAdmin.form.space.bin_config = Bin config
-renkanAdmin.form.space.submit = Ok
-renkanAdmin.form.space.cancel = Cancel
-renkanAdmin.form.space.format = Format
-renkanAdmin.form.space.compact = Compact
-
-
-renkanAdmin.user_objects_name = Users
-renkanAdmin.user_add = Add user
-renkanAdmin.user_edit = Edit user
-renkanAdmin.user_delete = Del. user
-renkanIndex.user_url = Url
-renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
-
-renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialsExpirationDate = Cred. exp. date
-renkanAdmin.form.expirationDate = Exp. date
-renkanAdmin.form.email = Email
-renkanAdmin.form.enabled = Enabled
-renkanAdmin.form.locked = Locked
-renkanAdmin.form.password = Password
-renkanAdmin.form.passwordConfirm = Confirm password
-renkanAdmin.form.roles = Roles
-renkanAdmin.form.groups = Groups
-renkanAdmin.form.users = Users
-renkanAdmin.form.user.submit = Ok
-
-
-renkan.error.title.empty = Title must not be empty or null
-renkan.error.name.empty = Name must not be empty or null
-renkan.error.bin_config.json = bin config field must contain a valid json
-renkan.error.password.equals = Password and Password confimation do not match
-renkan.error.password.missing = Password missing
-renkan.error.authorities.bad_value = Bad value for role
-
-
-renkanAuth.log_in = Log in
-renkanAuth.username_label = Username:
-renkanAuth.password_label = Password:
-renkanAuth.renkan_login = Renkan Authentication
-renkanAdmin.site_login = Site Authentication
-renkanAuth.login_error_message = Your login attempt was not successful, try again.
-renkanAuth.login_error_cause = Cause:
-
-renkanHeader.login = login
-renkanHeader.logout = logout
-renkanHeader.admin = administration
-renkanHeader.home = home
-
-renkan.user.roles.ROLE_USER = User
-renkan.user.roles.ROLE_ADMIN = Admin
-renkan.user.roles.ROLE_SPACES_ADMIN = Space admin
-renkan.user.roles.ROLE_GROUPS_ADMIN = Groups admin
-
-
-renkanAdmin.group_objects_name = Groups
-renkanAdmin.group_add = Add group
-renkanAdmin.group_edit = Edit group
-renkanAdmin.group_delete = Del. group
-renkanIndex.group_url = Url
-renkanAdmin.group_confirm_delete = Do you want to delete the group with groupname "{0}" ?
-
--- a/server/renkan-web/src/main/webapp/WEB-INF/i18n/messages_fr.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,129 +0,0 @@
-
-date.format = dd/MM/yyyy HH:mm
-date.date.format = dd/MM/yyyy
-date.date.datePicker.format = dd/mm/yy
-question.yes = oui
-question.no = non
-
-renkanIndex.renkan_exp = Créer un Renkan
-
-renkanIndex.project_list = Liste des projets
-renkanIndex.project_title = Titre
-renkanIndex.project_creation = Creation
-renkanIndex.project_updated = Date màj.
-renkanIndex.project_edit = Edition
-renkanIndex.project_copy = Copier
-renkanIndex.project_delete = Eff.
-renkanIndex.project_render = Consult.
-renkanIndex.project_export = Export.
-renkanIndex.project_commands = Comm.
-renkanIndex.project_edit_link = Editer renkan
-renkanIndex.project_copy_link = Copier renkan
-renkanIndex.project_delete_link = Eff. renkan
-renkanIndex.project_render_link = Consult. renkan
-renkanIndex.project_export_link = Export. renkan
-renkanIndex.project_delete_confirm = Voulez-vous effacer le renkan "<%= title %>" ?
-renkanIndex.project_filter = Filtre titre
-
-renkanIndex.space_exp = Créer un espace
-renkanIndex.renkan_title = Titre
-renkanIndex.renkan_file = Fichier
-renkanIndex.renkan_spaces = Espaces Renkan
-renkanIndex.renkan_space = Espace Renkan
-renkanIndex.space_list = Liste des espaces
-renkanIndex.space_name = Nom
-renkanIndex.space_title = Titre
-renkanIndex.space_creation = Creation
-renkanIndex.space_open = Ouvrir
-renkanIndex.space_open_link = Ouvrir esp.
-renkanIndex.space_proj_count = Nb. proj.
-
-renkanIndex.js.empty_name_error = Veuillez entrer un titre
-renkanIndex.js.empty_form_error = Veuillez entrer un titre ou un fichier
-
-
-renkanAdmin.renkan_admin = Administration Renkan
-renkanAdmin.site_admin = Administration site
-
-renkanAdmin.object = Objet
-renkanAdmin.object_list = Liste de {0}
-
-renkanAdmin.space_objects_name = Espaces
-renkanAdmin.space_add = Nouvel espace
-renkanAdmin.space_edit = Edition espaces
-renkanAdmin.space_delete = Supression espace
-renkanIndex.space_url = Url
-renkanAdmin.space_confirm_delete = Confirmez-vous l'effacement de l'espace intitulé "{0}" ?
-renkanAdmin.space_proj_count = Nb. Proj.
-
-renkanAdmin.object_name = Nom
-renkanAdmin.object_created = Date Crea.
-renkanAdmin.object_proj_count = Nb. renkan
-renkanAdmin.object_edit = Modif.
-renkanAdmin.object_delete = Eff.
-renkanAdmin.object_edit_link = Modif.
-renkanAdmin.object_delete_link = Eff.
-
-renkanAdmin.form.title = Titre
-renkanAdmin.form.name = Nom
-renkanAdmin.form.uri = URI
-renkanAdmin.form.description = Description
-renkanAdmin.form.color = Couleur
-renkanAdmin.form.space.bin_config = Config chutier
-renkanAdmin.form.space.submit = Ok
-renkanAdmin.form.space.cancel = Annuler
-renkanAdmin.form.space.format = Formatter
-renkanAdmin.form.space.compact = Compacter
-
-renkanAdmin.user_objects_name = Utilisateurs
-renkanAdmin.user_add = Ajout utilisateur
-renkanAdmin.user_edit = Edition utilisateur
-renkanAdmin.user_delete = Delete space
-renkanIndex.user_url = Url
-renkanAdmin.user_confirm_delete = Do you want to delete the user with username "{0}" ?
-
-renkanAdmin.form.avatar = Avatar
-renkanAdmin.form.credentialsExpirationDate = Date exp. mdp.
-renkanAdmin.form.expirationDate = Date exp.
-renkanAdmin.form.email = Email
-renkanAdmin.form.enabled = Actif
-renkanAdmin.form.locked = Verrouillé
-renkanAdmin.form.password = Mot de passe
-renkanAdmin.form.passwordConfirm = Conf. mot de passe
-renkanAdmin.form.roles = Rôles
-renkanAdmin.form.groups = Groupes
-renkanAdmin.form.users = Utilisateurs
-renkanAdmin.form.user.submit = Ok
-
-
-renkan.error.title.empty = Le champ titre ne doit pas être vide
-renkan.error.name.empty = Le champ nom ne doit pas être vide
-renkan.error.bin_config.json = le champ bin config doit contenir un json valide
-renkan.error.password.equals = Le mot de passe et sa confimation ne corresponde pas
-renkan.error.password.missing = Mot de passe manquant
-renkan.error.authorities.bad_value = Mauvaise valeur de rôle
-
-renkanAuth.log_in = Connection
-renkanAuth.username = Identifiant :
-renkanAuth.password = Mot de passe :
-renkanAuth.renkan_login = Renkan Authentification
-renkanAdmin.site_login = Site Authentification
-renkanAuth.login_error_message = Votre tentative de connexion a échoué, veuillez recommencer.
-renkanAuth.login_error_cause = Raison :
-
-renkanHeader.login = connexion
-renkanHeader.logout = déconnexion
-renkanHeader.admin = administration
-renkanHeader.home = accueil
-
-renkan.user.roles.ROLE_USER = Utilisateur
-renkan.user.roles.ROLE_ADMIN = Administrateur
-renkan.user.roles.ROLE_SPACES_ADMIN = Admin. espace
-renkan.user.roles.ROLE_GROUPS_ADMIN = Admin. groupes
-
-renkanAdmin.group_objects_name = Groupes
-renkanAdmin.group_add = aj. group
-renkanAdmin.group_edit = Edit. group
-renkanAdmin.group_delete = eff. group
-renkanIndex.group_url = Url
-renkanAdmin.group_confirm_delete = Voulez vous effacer le groupe "{0}" ?
--- a/server/renkan-web/src/main/webapp/WEB-INF/jsp/projectPrompt.jsp Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-<%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Project prompt</title>
-</head>
-<body>
- ${message}
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
-
- <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="${mongodb.db.name}"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-web/src/main/webapp/WEB-INF/renkan.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-mongodb.host.name = localhost
-mongodb.host.port = 27017
-mongodb.db.name = renkan
-
-user.admin.name = admin
-#user.admin.password = admin
-user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
-
-renkan.pagination.size = 2
-renkan.coweb.debug = false
-renkan.coweb.websocket = false
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/spring-security.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:security="http://www.springframework.org/schema/security"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-3.2.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-3.0.xsd"
->
-
- <util:properties id="propsLocations">
- <prop key="servletContextProps">WEB-INF/renkan.properties</prop>
- <prop key="classpathProps">classpath:renkan_run.properties</prop>
- </util:properties>
-
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1000"/>
- <property name="location" value="#{propsLocations.servletContextProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="false"/>
- </bean>
- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="order" value="1"/>
- <property name="location" value="#{propsLocations.classpathProps}"/>
- <property name="ignoreUnresolvablePlaceholders" value="true"/>
- <property name="IgnoreResourceNotFound" value="true"/>
- </bean>
-
- <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
- <constructor-arg name="strength" value="10" type="int"/>
- </bean>
-
- <bean class="org.iri_research.renkan.services.RenkanUserDetailsService" id="renkanUserDetailsService" />
-
- <security:http auto-config="true" use-expressions="true">
- <security:intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
- <security:intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" />
- <security:form-login login-page="/auth/login" authentication-failure-url="/auth/loginfailed" password-parameter="password" username-parameter="username" />
- <security:logout />
- </security:http>
-
- <security:authentication-manager>
- <security:authentication-provider>
- <security:password-encoder hash="sha-256"/>
- <security:user-service>
- <security:user name="${user.admin.name}" password="${user.admin.password}" authorities="ROLE_ADMIN, ROLE_USER"/>
- </security:user-service>
- </security:authentication-provider>
- <security:authentication-provider user-service-ref='renkanUserDetailsService'>
- <security:password-encoder ref="renkanPasswordEncoder" />
- </security:authentication-provider>
- </security:authentication-manager>
- <!--security:authentication-manager>
- <security:authentication-provider user-service-ref='renkanUserDetailsService'>
- <security:password-encoder ref="renkanPasswordEncoder" />
- </security:authentication-provider>
- </security:authentication-manager-->
-
-
-</beans>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/spring-servlet.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
-
- <!-- **************************************************************** -->
- <!-- RESOURCE FOLDERS CONFIGURATION -->
- <!-- Dispatcher configuration for serving static resources -->
- <!-- **************************************************************** -->
- <mvc:resources location="/static/" mapping="/static/**" />
- <mvc:resources location="/lib/" mapping="/lib/**" />
- <mvc:resources location="/_firebug/" mapping="/_firebug/**" />
- <!--mvc:resources location="/css/" mapping="/css/**" /-->
-
- <!-- **************************************************************** -->
- <!-- SPRING ANNOTATION PROCESSING -->
- <!-- **************************************************************** -->
- <mvc:annotation-driven>
- <mvc:argument-resolvers>
- <bean class="org.springframework.data.web.PageableArgumentResolver">
- <property name="prefix" value="p"/>
- </bean>
- </mvc:argument-resolvers>
- </mvc:annotation-driven>
- <mvc:interceptors>
- <bean class="org.iri_research.renkan.controller.VersionHandlerInterceptor"/>
- </mvc:interceptors>
-
- <context:component-scan
- base-package="org.iri_research.renkan.controller" />
-
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.UrlBasedViewResolver">
- <property name="viewClass"
- value="org.springframework.web.servlet.view.JstlView" />
- <property name="prefix" value="/WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- <property name="order" value="2" />
- <property name="redirectHttp10Compatible" value="false" />
- </bean>
-
- <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
- <property name="prefix" value="/WEB-INF/templates/" />
- <property name="suffix" value=".html" />
- <property name="templateMode" value="HTML5" />
- <property name="characterEncoding" value="UTF-8" />
- <property name="cacheable" value="false"/>
- </bean>
-
- <bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
- <property name="templateResolver" ref="templateResolver" />
- <property name="additionalDialects">
- <set>
- <bean class="org.thymeleaf.extras.springsecurity3.dialect.SpringSecurityDialect"/>
- </set>
- </property>
- </bean>
-
- <bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
- <property name="templateEngine" ref="templateEngine" />
- <property name="order" value="1" />
- <!--property name="viewNames" value="*.html,*.xhtml" /-->
- <property name="characterEncoding" value="UTF-8"/>
- <property name="redirectHttp10Compatible" value="false" />
- </bean>
-</beans>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/adminIndex.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
- <head>
- <title>Renkan Admin</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper" th:with="headerTitle=#{renkanAdmin.renkan_admin}">
- <header id="header" th:include="fragment/pageFragment :: headerFragment">
- <h1 th:text="#{renkanAdmin.renkan_admin}">Renkan administration</h1>
- </header>
- <h2 th:text="#{renkanAdmin.site_admin}">Site administration</h2>
- <table id="object_list">
- <thead>
- <tr>
- <th th:text="#{renkanAdmin.object}">Object</th>
- <th> </th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td colspan="2"><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.space_objects_name}">Spaces</a></td>
- </tr>
- <tr>
- <td colspan="2"><a href="usersList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.user_objects_name}">Users</a></td>
- </tr>
- <tr>
- <td colspan="2"><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.group_objects_name}">Groups</a></td>
- </tr>
- </tbody>
- </table>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupDeleteConfirm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - delete group</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">Groups List</a> / <span th:text="#{renkanAdmin.group_delete}">Delete group</span></h2>
- <div id="object-delete-container">
- <div id="object-delete-question" th:text="#{renkanAdmin.group_confirm_delete(${groupObj.title})}">Do you want to Delete group with name</div>
- <div id="object-delete-confirm-buttons"><form action="groupsList.html" th:action="@{'/admin/groups/delete/'+${groupObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="groupsList.html" method="get" th:action="@{/admin/groups}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='groupsList.html'" th:onclick="'window.location.href=\''+@{/admin/groups}+'\''"/></form></div>
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupEdit.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - edit user</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
- <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
- <link href='../../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css' rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
-
- <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js}" ></script>
- <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
- <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="groupsList.html" th:href="@{/admin/groups}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">Groups List</a> / <span th:text="#{renkanAdmin.group_edit}">Edit group</span></h2>
- <div th:include="fragment/groupForm::groupFormFragment" id="inner-container">
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/groupsList.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - Groups</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.group_objects_name})}">List of objects</h2>
- <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
- <div>
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">2</a>
- <a href="#?p.page=3">3</a>
- <span>4</span>
- <a href="#?p.page=5">5</a>
- <a href="#?p.page=6">6</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
- </div>
- </div>
- <div id="objects-content">
- <ul class="object-tools">
- <li><a href="groupEdit.html" th:href="@{/admin/groups/edit/}" th:text="#{renkanAdmin.group_add}">Add group</a></li>
- </ul>
- <table>
- <thead>
- <tr>
- <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Groupname</th>
- <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
- <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
- </tr>
- </thead>
- <tbody>
- <tr th:each="object: ${page.content}" >
- <td th:text="${object.title}" class="object-table-title" >groupname</td>
- <td><a href="groupEdit.html" th:href="@{'/admin/groups/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
- <td><a href="#" th:href="@{'/admin/groups/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a></td>
- </tr>
- </tbody>
- </table>
- </div>
-
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/spaceDeleteConfirm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
- <head>
- <title>Renkan Admin - delete space</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">Spaces List</a> / <span th:text="#{renkanAdmin.space_delete}">Delete space</span></h2>
- <div id="object-delete-container">
- <div id="object-delete-question" th:text="#{renkanAdmin.space_confirm_delete(${spaceObj.title})}">Do you want to delete space with title</div>
- <div id="object-delete-confirm-buttons"><form action="spacesList.html" th:action="@{'/admin/spaces/delete/'+${spaceObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="spacesList.html" method="get" th:action="@{/admin/spaces}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='spacesList.html'" th:onclick="'window.location.href=\''+@{/admin/spaces}+'\''"/></form></div>
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/spaceEdit.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
- <head>
- <title>Renkan Admin - edit space</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
- <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
-
- <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/ace/ace.js" th:src="@{/static/lib/ace/ace.js}" charset="utf-8"></script>
- <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
- <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="spacesList.html" th:href="@{/admin/spaces}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">Spaces List</a> / <span th:text="#{renkanAdmin.space_edit}">Edit space</span></h2>
- <div th:include="fragment/spaceForm::spaceFormFragment" id="inner-container">
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/spacesList.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - Spaces</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.space_objects_name})}">List of objects</h2>
- <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
- <div>
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">2</a>
- <a href="#?p.page=3">3</a>
- <span>4</span>
- <a href="#?p.page=5">5</a>
- <a href="#?p.page=6">6</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
- </div>
- </div>
- <div id="objects-content">
- <ul class="object-tools">
- <li><a href="spaceAdd.html" th:href="@{/admin/spaces/edit/}" th:text="#{renkanAdmin.space_add}">Add space</a></li>
- </ul>
- <table>
- <thead>
- <tr>
- <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Name</th>
- <th th:text="#{renkanAdmin.object_created}" class="object-table-created">Created</th>
- <th th:text="#{renkanAdmin.space_proj_count}" class="object-proj-count">Project count</th>
- <th th:text="#{renkanIndex.space_url}" class="object-url">url</th>
- <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
- <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
- </tr>
- </thead>
- <tbody>
- <tr th:each="object: ${page.content}" th:with="spaceProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
- <td th:text="${object.title}" class="object-table-title" >title</td>
- <td th:text="${object.created}?${#dates.format(object.created, #messages.msg('date.format'))}:'n/a'" class="object-table-created">created</td>
- <td th:text="${spaceProjCount}" class="object-proj-count">nb. proj</td>
- <td class="object-url"><a href="../renkanIndex.html" th:href="@{'/s/'+${object.id}}" th:text="#{renkanIndex.space_url}" >url</a></td>
- <td><a href="spaceEdit.html" th:href="@{'/admin/spaces/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
- <td><a href="#" th:if="${spaceProjCount==0}" th:href="@{'/admin/spaces/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="object-table-actions">Delete</a><span th:if="${spaceProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
- </tr>
- </tbody>
- </table>
- </div>
-
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/userDeleteConfirm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - delete user</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="usersList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a> / <span th:text="#{renkanAdmin.user_delete}">Delete user</span></h2>
- <div id="object-delete-container">
- <div id="object-delete-question" th:text="#{renkanAdmin.user_confirm_delete(${userObj.title})}">Do you want to Delete user with name</div>
- <div id="object-delete-confirm-buttons"><form action="usersList.html" th:action="@{'/admin/users/delete/'+${userObj.id}(key=${key},salt=${salt})}" method="post" id="yes-form"><input type="submit" name="ok" value="yes" th:value="#{question.yes}" id="yes-button"/></form><form action="usersList.html" method="get" th:action="@{/admin/users}" id="no-form" onsubmit="return false"><input type="submit" name="ok" value="no" th:value="#{question.no}" id="no-button" onclick="window.location.href='usersList.html'" th:onclick="'window.location.href=\''+@{/admin/users}+'\''"/></form></div>
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/userEdit.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - edit user</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
- <link href='../../../static/css/spectrum.css' rel="stylesheet" th:href="@{/static/css/spectrum.css}"/>
- <link href='../../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css' rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
-
- <script type="text/javascript" src="../../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
- <script type="text/javascript" src="../../../static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js" th:src="@{/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js}" ></script>
- <script type="text/javascript" src='../../../static/lib/spectrum.js' th:src="@{/static/lib/spectrum.js}"></script>
- <script type="text/javascript" src='../../../static/js/admin_form.js' th:src="@{/static/js/admin_form.js}"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2><a href="userList.html" th:href="@{/admin/users}" th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">Users List</a> / <span th:text="#{renkanAdmin.user_edit}">Edit user</span></h2>
- <div th:include="fragment/userForm::userFormFragment" id="inner-container">
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/admin/usersList.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Admin - Users</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{/admin}" th:text="#{renkanAdmin.renkan_admin}" id="home-link">Renkan administration</a></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <h2 th:text="#{renkanAdmin.object_list(#{renkanAdmin.user_objects_name})}">List of objects</h2>
- <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
- <div>
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">2</a>
- <a href="#?p.page=3">3</a>
- <span>4</span>
- <a href="#?p.page=5">5</a>
- <a href="#?p.page=6">6</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
- </div>
- </div>
- <div id="objects-content">
- <ul class="object-tools">
- <li><a href="userEdit.html" th:href="@{/admin/users/edit/}" th:text="#{renkanAdmin.user_add}">Add user</a></li>
- </ul>
- <table>
- <thead>
- <tr>
- <th th:text="#{renkanAdmin.object_name}" class="object-table-title">Username</th>
- <th th:text="#{renkanAdmin.object_proj_count}" class="object-proj-count">Project count</th>
- <th th:text="#{renkanAdmin.object_edit}" class="object-table-actions">Edit</th>
- <th th:text="#{renkanAdmin.object_delete}" class="object-table-actions">Delete</th>
- </tr>
- </thead>
- <tbody>
- <tr th:each="object: ${page.content}" th:with="userProjCount=${#maps.containsKey(projectsCount, object.id)}? ${projectsCount[object.id]} : 0">
- <td th:text="${object.title}" class="object-table-title" >username</td>
- <td th:text="${userProjCount}" class="object-proj-count">nb. proj</td>
- <td><a href="userEdit.html" th:href="@{'/admin/users/edit/'+${object.id}}" th:text="#{renkanAdmin.object_edit_link}" class="object-table-actions">Edit</a></td>
- <td><a href="#" th:if="${userProjCount==0}" th:href="@{'/admin/users/delete/'+${object.id}}" th:text="#{renkanAdmin.object_delete_link}" class="users-table-actions">Delete</a><span th:if="${userProjCount>0}" class="object-table-actions object-table-actions-disabled" th:text="#{renkanAdmin.object_delete_link}">Delete</span></td>
- </tr>
- </tbody>
- </table>
- </div>
-
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/auth/login.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan Auth Login</title>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <link href="../../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- <script th:remove="all" type="text/javascript" src="../../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../../static/js/thymol.js"></script>
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="../renkanIndex.html" id="home-link" th:href="@{/}" th:text="#{renkanAuth.renkan_login}">Renkan login</a></h1>
- <div id="header-clear"></div>
- </header>
- <h2 th:text="#{renkanAdmin.site_login}">Site login</h2>
- <div id="inner-container">
- <div id="login-errors" th:if="${login_error}">
- <div th:text="#{renkanAuth.login_error_message}">Your login attempt was not successful, try again.</div>
- <div th:if="${session} and ${session.containsKey('SPRING_SECURITY_LAST_EXCEPTION')}"><span th:text="#{renkanAuth.login_error_cause}">Cause: </span> <span th:text="${session['SPRING_SECURITY_LAST_EXCEPTION'].message}">Cause of login error</span></div>
- </div>
- <form action="#" th:action="@{/j_spring_security_check}" method="post" id="login-form">
- <fieldset id="login-fieldset" class="form-fields">
- <div>
- <label for="username" th:text="#{renkanAuth.username_label}">username:</label>
- <input type="text" id="username" name="username"/>
- </div>
- <div>
- <label for="password" th:text="#{renkanAuth.password_label}">password:</label>
- <input type="password" name="password" id="password"/>
- </div>
- <input type="submit" value="log in" th:value="#{renkanAuth.log_in}"/>
- </fieldset>
- </form>
- </div>
- </div>
- <footer id="footer" th:substituteby="fragment/pageFragment::footerFragment">
- <div id="version">© <span class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- </body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/fragment/groupForm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <meta charset="utf-8"/>
- <title>User form</title>
- </head>
-<body>
-<div id="groupForm" th:fragment="groupFormFragment" >
- <script type="text/javascript" th:inline="javascript">
- //<![CDATA[
-
- function groupFormSubmit() {
-
- var errors = {};
- var valid = true;
-
- if(!$('#title').val()) {
- errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
- valid = false;
- }
-
- showformErrors(errors);
-
- return valid;
- }
-
-
- $(function(){
-
- $('#color').spectrum({
- showInput: true,
- showAlpha: true,
- showPalette: true,
- showInitial: true,
- preferredFormat: 'hex'
- });
- $("#model-form").submit(function(e) {
- return groupFormSubmit();
- });
-
- });
- //]]>
- </script>
- <form action="#" th:object="${group}" th:action="@{/admin/groups/save}" method="post" id="model-form">
- <fieldset class="form-fields">
- <input type="hidden" th:field="*{id}" th:if="*{id}" />
- <div>
- <label for="title" th:text="#{renkanAdmin.form.name}">Name: </label>
- <input type="text" th:field="*{title}" />
- <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
- </div>
- <div>
- <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
- <input type="text" th:field="*{uri}" />
- </div>
- <div>
- <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
- <textarea th:field="*{description}"></textarea>
- </div>
- <div>
- <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
- <input type="text" th:field="*{color}" />
- </div>
- <div>
- <label for="avatar" th:text="#{renkanAdmin.form.avatar}">Avatar: </label>
- <input type="text" th:field="*{avatar}" />
- </div>
-<!-- todo: only user managing the group can see that -->
- <div>
- <label for="users" th:text="#{renkanAdmin.form.users}">Groups: </label>
- <select th:field="*{users}" multiple="multiple">
- <option th:each="user: ${allUsers}" th:value="${user.id}" th:text="${user.title}">USER</option>
- </select>
- </div>
- <div class="submit">
- <button type="submit" name="save" th:text="#{renkanAdmin.form.user.submit}">Save</button>
- <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.user.cancel}" th:onclick="location">Cancel</button-->
- </div>
-
- </fieldset>
- </form>
-</div>
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/fragment/pageFragment.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:th="http://www.thymeleaf.org"
- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
- th:lang="${#ctx.getLocale().toLanguageTag()}" >
-<head>
-<meta charset="utf-8" />
-<title>pagination fragment</title>
-</head>
-<body>
- <header id="header" th:fragment="headerFragment" >
- <h1 th:utext="${headerTitle}">Renkan</h1>
- <div id="header-nav" th:fragment="headerNavFragment">
- <div sec:authorize="isAnonymous()" class="header-nav"><a href="auth/login.html" th:href="@{/auth/login}" th:text="#{renkanHeader.login}">login</a></div>
- <div sec:authorize="isAuthenticated()" class="header-nav">
- <img src="../../../static/img/user.png" th:src="@{/static/img/user.png}" id="header-nav-user-avatar"/><span sec:authentication="name">username</span> |
- <span sec:authorize="hasRole('ROLE_USER')"><a href="" th:href="@{/}" th:text="#{renkanHeader.home}">home</a> |</span>
- <span sec:authorize="hasRole('ROLE_ADMIN')"><a href="admin/adminIndex.html" th:href="@{/admin}" th:text="#{renkanHeader.admin}">admin</a> |</span>
- <a href="renkanIndex.html" th:href="@{/j_spring_security_logout}" th:text="#{renkanHeader.logout}">logout</a>
- </div>
- <div id="header-clear"></div>
- </div>
- </header>
- <footer id="footer" th:fragment="footerFragment" >
- <div id="version">© <span th:text="${#dates.year(#dates.createNow())}" class="version-date">2013</span> <a href="http://www.iri.centrepompidou.fr" target="_blank">IRI</a> - Version <span th:text="${version}" class="version-version">0.0a</span></div>
- </footer>
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/fragment/paginationFragment.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
-<head>
-<meta charset="utf-8" />
-<title>pagination fragment</title>
-</head>
-<body>
- <div id="paginationFragment" th:fragment="paginationFragment" >
- <div th:if="${page.totalPages>1}">
- <a th:if="!${page.firstPage}" th:href="@{${baseUrl}(p.page=1)}"><<</a>
- <a th:if="${page.hasPreviousPage()}" th:href="@{${baseUrl}(p.page=${page.number})}"><</a>
- <span th:if="${page.number-2} > 0">...</span>
- <a th:each="i: ${#numbers.sequence(1,2)}" th:if="${page.number-2+i} > 0" th:href="@{${baseUrl}(p.page=${page.number-2+i})}" th:text="${page.number-2+i}"></a>
- <span th:text="${page.number+1}"></span>
- <a th:each="i: ${#numbers.sequence(1,2)}" th:if="${page.number+1+i} < ${page.totalPages+1}" th:href="@{${baseUrl}(p.page=${page.number+1+i})}" th:text="${page.number+1+i}"></a>
- <span th:if="${page.number+3} < ${page.totalPages}">...</span>
- <a th:if="${page.hasNextPage()}" th:href="@{${baseUrl}(p.page=${page.number+2})}">></a>
- <a th:if="!${page.lastPage}" th:href="@{${baseUrl}(p.page=${page.totalPages})}">>></a>
- </div>
- <div th:remove="all">
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">3</a>
- <a href="#?p.page=3">4</a>
- <span>5</span>
- <a href="#?p.page=5">6</a>
- <a href="#?p.page=6">7</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
-</div>
- </div>
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/fragment/spaceForm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,139 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <meta charset="utf-8"/>
- <title>Space form</title>
- </head>
-<body>
-<div id="spaceForm" th:fragment="spaceFormFragment" >
- <script type="text/javascript" th:inline="javascript">
- //<![CDATA[
-
- function spaceFormSubmit() {
- return true;
- var errors = {};
- var valid = true;
-
- if(!$('#title').val()) {
- errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
- valid = false;
- }
-
- if($('#binConfig').val()) {
-
- var editor = ace.edit("binConfigDiv");
- var annotations = editor.getSession().getAnnotations();
- if(annotations.length>0) {
- var error_message = /*[[#{renkan.error.bin_config.json}]]*/"renkan.error.bin_config.json";
- errors['binConfigDiv'] = error_message + ". "+ annotations[0].type + ": (" +(annotations[0].row+1)+","+annotations[0].column+") " + annotations[0].text;
- valid = false;
- }
- }
-
- showformErrors(errors);
-
- return valid;
- }
-
-
- function _setBinConfigStatus(editor) {
- var annotations = editor.getSession().getAnnotations();
- if(annotations.length>0) {
- $('.binConfigButton').attr("disabled", "disabled");
- }
- else {
- $('.binConfigButton').removeAttr("disabled");
- }
- }
-
- $(function(){
- var tabSize = 2;
- var editor = ace.edit("binConfigDiv");
- editor.setTheme("ace/theme/xcode");
- editor.getSession().setMode("ace/mode/json");
- editor.getSession().setTabSize(tabSize);
- editor.getSession().setUseSoftTabs(true);
- _setBinConfigStatus(editor);
- editor.getSession().on('change', function(e) {
- $('#binConfig').val(editor.getValue());
- });
- editor.getSession().on('changeAnnotation', function() {
- _setBinConfigStatus(editor);
- });
-
- $('#binConfigFormatButton').click(function(){
- var jsonText = editor.getValue();
- try {
- editor.setValue(formatJson(jsonText, tabSize),0);
- editor.moveCursorTo(0,0);
- editor.clearSelection();
- } catch (e) {
- //do nothing
- }
- });
-
- $('#binConfigCompactButton').click(function(){
- var jsonText = editor.getValue();
- try {
- editor.setValue(compactJson(jsonText),0);
- editor.moveCursorTo(0,0);
- editor.clearSelection();
- } catch (e) {
- //do nothing
- }
- });
-
- $('#color').spectrum({
- showInput: true,
- showAlpha: true,
- showPalette: true,
- showInitial: true
- });
-
- $("#model-form").submit(function(e) {
- return spaceFormSubmit();
- });
-
- });
- //]]>
- </script>
- <form action="#" th:object="${space}" th:action="@{/admin/spaces/save}" method="post" id="model-form">
- <fieldset class="form-fields">
- <input type="hidden" th:field="*{id}" th:if="*{id}" />
- <input type="hidden" th:field="*{binConfig}"/>
- <div>
- <label for="title" th:text="#{renkanAdmin.form.title}">Title: </label>
- <input type="text" th:field="*{title}" />
- <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
- </div>
- <div>
- <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
- <input type="text" th:field="*{uri}" />
- </div>
- <div>
- <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
- <textarea th:field="*{description}"></textarea>
- </div>
- <div>
- <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
- <input type="text" th:field="*{color}" />
- </div>
- <div>
- <label for="binConfigContainer" th:text="#{renkanAdmin.form.space.bin_config}">Bin config: </label>
- <div id="binConfigContainer">
- <div id="binConfigButtonsDiv"><button type="button" id="binConfigFormatButton" th:text="#{renkanAdmin.form.space.format}" class="binConfigButton">Format</button><button type="button" id="binConfigCompactButton" th:text="#{renkanAdmin.form.space.compact}" class="binConfigButton">Compact</button></div>
- <div id="binConfigDiv" th:text="*{binConfig}"></div>
- </div>
- <div th:if="${#fields.hasErrors('binConfig')}" th:errors="*{binConfig}" class="form-error"></div>
- </div>
-
- <div class="submit">
- <button type="submit" name="save" th:text="#{renkanAdmin.form.space.submit}">Save</button>
- <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.space.cancel}" th:onclick="location">Cancel</button-->
- </div>
-
- </fieldset>
- </form>
-</div>
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/fragment/userForm.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,155 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <meta charset="utf-8"/>
- <title>User form</title>
- </head>
-<body>
-<div id="userForm" th:fragment="userFormFragment" >
- <script type="text/javascript" th:inline="javascript">
- //<![CDATA[
-
- function userFormSubmit() {
-
- var errors = {};
- var valid = true;
-
- if(!$('#title').val()) {
- errors['title'] = /*[[#{renkan.error.title.empty}]]*/"renkan.error.title.empty";
- valid = false;
- }
-
- var password = $('#password').val();
- var passwordConf = $('#passwordConfirm').val();
- var objId = $('#id').val();
-
- if(!objId && !password) {
- errors['password'] = /*[[#{renkan.error.password.missing}]]*/"renkan.error.passwsord.missing";
- valid = false;
- }
- if(valid && password !== passwordConf) {
- errors['password'] = /*[[#{renkan.error.password.equals}]]*/"renkan.error.passwsord.equals";
- valid = false;
- }
-
- showformErrors(errors);
-
- return valid;
- }
-
-
- $(function(){
- var regionalValue = /*[[${#ctx.getLocale().getLanguage()}]]*/"";
- var dateFormat = /*[[#{date.date.datePicker.format}]]*/"yy/mm/dd";
- $.datepicker.setDefaults($.datepicker.regional[ "" ]);
- $('.datepicker').each(function (i,elt) {
- var picker_options = $.extend({showButtonPanel: true},$.datepicker.regional[regionalValue=="en"?"":regionalValue]);
- picker_options.dateFormat = dateFormat;
- picker_options.altFormat = $.datepicker.ISO_8601;
- var elt = $(elt);
- picker_options.altField = '#'+elt.attr('id').replace('-disp', '');
- elt.datepicker(picker_options);
- });
-
- $('#color').spectrum({
- showInput: true,
- showAlpha: true,
- showPalette: true,
- showInitial: true,
- preferredFormat: 'hex'
- });
- $("#model-form").submit(function(e) {
- $('.datepicker').each(function (i,elt) {
- var elt = $(elt);
- elt_val = elt.val();
- console.log(elt.attr('id'),elt_val);
- if(!elt_val) {
- $('#'+elt.attr('id').replace('-disp', '')).val("");
- }
- });
- return userFormSubmit();
- });
-
- });
- //]]>
- </script>
- <form action="#" th:object="${user}" th:action="@{/admin/users/save}" method="post" id="model-form">
- <fieldset class="form-fields">
- <input type="hidden" th:field="*{id}" th:if="*{id}" />
- <div>
- <label for="title" th:text="#{renkanAdmin.form.name}">Name: </label>
- <input type="text" th:field="*{title}" />
- <div th:if="${#fields.hasErrors('title')}" th:errors="*{title}" class="form-error"></div>
- </div>
- <div>
- <label for="uri" th:text="#{renkanAdmin.form.uri}">Uri: </label>
- <input type="text" th:field="*{uri}" />
- </div>
- <div>
- <label for="description" th:text="#{renkanAdmin.form.description}">Description: </label>
- <textarea th:field="*{description}"></textarea>
- </div>
- <div>
- <label for="color" th:text="#{renkanAdmin.form.color}">Color: </label>
- <input type="text" th:field="*{color}" />
- </div>
- <div>
- <label for="avatar" th:text="#{renkanAdmin.form.avatar}">Avatar: </label>
- <input type="text" th:field="*{avatar}" />
- </div>
- <div>
- <label for="password" th:text="#{renkanAdmin.form.password}">Password: </label>
- <input type="password" th:field="*{password}" />
- <div th:if="${#fields.hasErrors('password')}" th:errors="*{password}" class="form-error"></div>
- </div>
- <div>
- <label for="passwordConfirm" th:text="#{renkanAdmin.form.passwordConfirm}">Confirm password: </label>
- <input type="password" th:field="*{passwordConfirm}" />
- <div th:if="${#fields.hasErrors('passwordConfirm')}" th:errors="*{passwordConfirm}" class="form-error"></div>
- </div>
- <div>
- <label for="credentialsExpirationDate" th:text="#{renkanAdmin.form.credentialsExpirationDate}">Credential expiration date: </label>
- <input type="hidden" name="credentialsExpirationDate" th:field="*{credentialsExpirationDate}"/>
- <input type="text" id="credentialsExpirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.credentialsExpirationDate != null}?${user.credentialsExpirationDate.toString(#messages.msg('date.date.format'))}:''"/>
-
- </div>
- <div>
- <label for="expirationDate" th:text="#{renkanAdmin.form.expirationDate}">Expiration date: </label>
- <input type="hidden" name="expirationDate" th:field="*{expirationDate}" />
- <input type="text" id="expirationDate-disp" class="datepicker" value="01/01/1970" th:value="${user.expirationDate != null}?${user.expirationDate.toString(#messages.msg('date.date.format'))}:''"/>
- </div>
- <div>
- <label for="email" th:text="#{renkanAdmin.form.email}">Email: </label>
- <input type="email" th:field="*{email}" />
- </div>
- <div>
- <label for="enabled" th:text="#{renkanAdmin.form.enabled}">Enabled: </label>
- <input type="checkbox" th:field="*{enabled}" />
- </div>
- <div>
- <label for="locked" th:text="#{renkanAdmin.form.locked}">Locked: </label>
- <input type="checkbox" th:field="*{locked}" />
- </div>
-<!-- todo: only user of admin group can see that -->
- <div>
- <label for="groups" th:text="#{renkanAdmin.form.groups}">Groups: </label>
- <select th:field="*{groups}" multiple="multiple">
- <option th:each="group: ${allGroups}" th:value="${group.id}" th:text="${group.title}">GROUP</option>
- </select>
- </div>
- <div>
- <label for="userAuthorities" th:text="#{renkanAdmin.form.roles}">Roles: </label>
- <select th:field="*{userAuthorities}" multiple="multiple">
- <option th:each="role: ${T(org.iri_research.renkan.Constants).USER_ROLES_SELECT}" th:value="${role}" th:text="#{${'renkan.user.roles.'+role}}">USER_ROLE</option>
- </select>
- </div>
- <div class="submit">
- <button type="submit" name="save" th:text="#{renkanAdmin.form.user.submit}">Save</button>
- <!--button type="button" name="cancel" th:text="#{renkanAdmin.form.user.cancel}" th:onclick="location">Cancel</button-->
- </div>
-
- </fieldset>
- </form>
-</div>
-</body>
-</html>
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/projectIndex.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,248 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan</title>
-
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}"/>
-
- <script th:remove="all" type="text/javascript" src="../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../static/js/thymol.js"></script>
-
- <script src="../../static/lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script src="../../static/lib/jquery-ui/jquery-ui.min.js" th:src="@{/static/lib/jquery-ui/jquery-ui.min.js}" ></script>
- <script src="../../static/lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}" ></script>
- <script src="../../static/lib/URI.js" th:src="@{/static/lib/URI.js}" ></script>
-
- <link href="../../static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css" rel="stylesheet" th:href="@{/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css}"/>
- <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
-
- </head>
- <body>
- <div id="container">
- <div id="wrapper">
- <header id="header">
- <h1><a href="renkanIndex.html" th:href="@{'/'}" id="home-link" th:text="#{renkanIndex.renkan_space}">Renkan Space</a>: <span th:text="${space.title}">Titre</span></h1>
- <div id="headerNav" th:include="fragment/pageFragment :: headerNavFragment"></div>
- </header>
- <div id="inner">
- <div id="label" class="translate" th:text="#{renkanIndex.renkan_exp}">Create a Renkan</div>
- <form action="#" id="new-renkan-form">
- <fieldset id="form-fields">
- <div id="title-field"><label th:text="#{renkanIndex.renkan_title}" for="renkantitle">title</label><input type="text" id="renkantitle" autofocus="autofocus" x-webkit-speech="x-webkit-speech"/></div>
- <div id="file-field"><label th:text="#{renkanIndex.renkan_file}" for="renkanfile">file</label><input type="file" id="renkanfile"/></div>
- </fieldset>
- <div id="form-submit"><button type="submit">OK</button></div>
- </form>
- </div>
- <div id="project-list-container">
- <h2 th:text="#{renkanIndex.project_list}">Project list</h2>
- <div id="project-filter-container">
- <form method="get">
- <input type="text" id="project-filter" name="filter" placeholder="filter title" th:placeholder="#{renkanIndex.project_filter}" th:value="${param['filter']}?${param['filter'][0]}:''" />
- <button type="submit">OK</button>
- </form>
- </div>
- <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
- <div>
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">2</a>
- <a href="#?p.page=3">3</a>
- <span>4</span>
- <a href="#?p.page=5">5</a>
- <a href="#?p.page=6">6</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
- </div>
- </div>
- <table th:with="columnSort=${param['p.sort']}?${param['p.sort'][0]}:'updated',sortDir=${param['p.sort.dir']}?${param['p.sort.dir'][0]}:'desc'">
- <thead th:with="sortDirInv=${sortDir}=='desc'?'asc':'desc'">
- <tr>
- <th th:with="sorted=(${columnSort}=='title')"><span th:text="#{renkanIndex.project_name}">Name</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="title"/><input type="hidden" name="p.sort.dir" th:value="${sorted}?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sortable-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
- <th th:with="sorted=(${columnSort}=='updated')"><span th:text="#{renkanIndex.project_updated}">Updated</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="updated"/><input type="hidden" name="p.sort.dir" th:value="(${sorted})?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sort-desc-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
- <th th:with="sorted=(${columnSort}=='created')"><span th:text="#{renkanIndex.project_creation}" >Creation</span><form method="get" class="proj-sort-form"><input type="hidden" name="p.sort" value="created"/><input type="hidden" name="p.sort.dir" th:value="${sorted}?${sortDirInv}:'desc'"/><input th:if="${param['filter']}" name="filter" type="hidden" th:value="${param['filter'][0]}"/><input type="submit" class="proj-sort-asc-col" th:class="${sorted}?'proj-sort-'+${sortDir}+'-col':'proj-sortable-col'" value=""/></form></th>
- <th th:text="#{renkanIndex.project_commands}">Comm.</th>
- </tr>
- </thead>
- <tbody>
- <tr th:each="project: ${page}">
- <th th:text="${project.title}">title</th>
- <td th:text="${project.updated}?${#dates.format(project.updated, #messages.msg('date.format'))}:''">update</td>
- <td th:text="${#dates.format(project.created, #messages.msg('date.format'))}">date</td>
- <td>
- <a href="#" th:href="@{'/p/'+${project.id}(cowebkey=${project.getKey(2)})}" th:title="#{renkanIndex.project_edit_link}"><span class="ui-icon ui-icon-pencil renkan-basic-action"></span></a>
- <a href="#" th:href="@{'/p/pub/'+${project.id}(cowebkey=${project.getKey(1)})}" th:title="#{renkanIndex.project_render_link}"><span class="ui-icon renkan-icon-eye renkan-basic-action"></span></a>
- <span class="ui-icon ui-icon-triangle-1-e renkan-basic-action renkan-action-button" th:id="'renkan-action-button-'+${project.id}" th:attr="data-project_id=${project.id}"></span>
- </td>
- </tr>
- </tbody>
- </table>
- <ul th:each="project: ${page}" class="action-menu" id="action-menu-" th:id="'action-menu-'+${project.id}">
- <li><a href="#" th:href="@{'/p/'+${project.id}(cowebkey=${project.getKey(2)})}"><span class="ui-icon ui-icon-pencil"></span><span th:text="#{renkanIndex.project_edit_link}">Edit project</span></a></li>
- <li><a href="#" th:attr="data-project_id=${project.id}" class="copy-project"><span class="ui-icon ui-icon-copy"></span><span th:text="#{renkanIndex.project_copy_link}">Copy project</span></a></li>
- <li><a href="#" th:attr="data-project_id=${project.id},data-project_title=${project.title}" class="delete-project"><span class="ui-icon ui-icon-trash"></span><span th:text="#{renkanIndex.project_delete_link}">Delete project</span></a></li>
- <li><a href="#" th:href="@{'/p/pub/'+${project.id}(cowebkey=${project.getKey(1)})}"><span class=" ui-icon renkan-icon-eye"></span><span th:text="#{renkanIndex.project_render_link}">View project</span></a></li>
- <li><a href="#" th:href="@{'/p/exp/'+${project.id}}"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span><span th:text="#{renkanIndex.project_export_link}">Export project</span></a></li>
- </ul>
-
- </div>
- </div>
- <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
- <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- <script th:inline="javascript" >
- /*<![CDATA[*/
- 'use strict';
- function go2Title()
- {
- var renkantitle = $("#renkantitle").val(),
- renkanfiles = $("#renkanfile").prop("files");
-
- if(renkantitle.length === 0 && renkanfiles.length === 0) {
- var alert_message = /*[[#{renkanIndex.js.empty_form_error}]]*/"Please enter a title or a file";
- alert(alert_message);
- return false;
- }
- var post_url = /*[[@{/rest/projects/}]]*/"/rest/projects/",
- deferred = $.Deferred();
-
- deferred.done(function(new_renkan) {
- new_renkan.space_id = /*[[${space.id}]]*/"_";
- $.ajax(post_url, {
- data:JSON.stringify(new_renkan),
- type: "POST",
- dataType: "json",
- contentType: "application/json; charset=UTF-8"
- }).done(function(project){
- var uri = new URI(window.location);
- window.location = uri.setSearch("p.sort","created").setSearch("p.sort.dir", "desc").href();
- });
- });
-
- if(renkanfiles.length === 0) {
- deferred.resolve({
- title: renkantitle,
- description: "",
- uri: null,
- });
- }
- else {
- var fr = new FileReader();
- fr.onload = function() {
- var new_renkan = JSON.parse(fr.result);
- if(renkantitle.length > 0) {
- new_renkan.title = renkantitle;
- }
- if(typeof new_renkan.created !== "undefined") {
- delete new_renkan.created;
- }
- if(typeof new_renkan.updated !== "undefined") {
- delete new_renkan.updated;
- }
- deferred.resolve(new_renkan);
- };
- fr.readAsText(renkanfiles[0]);
- }
- }
-
- function copyProject(project_id)
- {
- var post_url = /*[[@{/p/copy}]]*/"#";
- $.post(post_url, {"project_id": project_id})
- .done(function(p){
- window.location.reload();
- });
- }
-
- function deleteProject(project_id, project_title)
- {
- var message = /*[[#{renkanIndex.project_delete_confirm}]]*/"Delete project \"<%= title %>\"";
- if(confirm(_.template(message, {title: project_title}))) {
- var delete_url = /*[[@{/rest/projects}]]*/"#";
- $.ajax(delete_url+"/"+project_id, {
- type: "DELETE"
- }).done(function(){
- window.location.reload();
- });
- }
- }
-
- function createMenuHandler(menu, timeoutCallback) {
- return function(e) {
- menu.toggle();
- $(e.target).toggleClass("ui-icon-triangle-1-e").toggleClass("ui-icon-triangle-1-se");
- $('.renkan-action-button').each(function() {
- if($(this).prop('id') !== $(e.target).prop('id')) {
- $(this).removeClass("ui-icon-triangle-1-se").addClass("ui-icon-triangle-1-e");
- $("#action-menu-"+$(this).data('project_id')).hide();
- var timeout = $("#action-menu-"+$(this).data('project_id')).data('blurtimeout');
- if(typeof timeout !== 'undefined') {
- clearTimeout(menu.data('blurtimeout'));
- menu.removeData('blurtimeout');
- }
- }
- });
- if(menu.is(":visible")) {
- menu.data('blurtimeout', setTimeout( timeoutCallback,5000));
- }
- }
- }
-
- $(function(){
-
- $(".copy-project").click(function(event) {
- var project_id = $(event.currentTarget).data("project_id");
- copyProject(project_id);
- });
-
- $(".delete-project").click(function(event) {
- deleteProject($(event.currentTarget).data("project_id"), $(event.currentTarget).data("project_title"));
- });
-
-
- $("#new-renkan-form").submit(function(e) {
- e.preventDefault();
- go2Title();
- return false;
- });
-
- $("#import-renkan-form").submit(function(e) {
- e.preventDefault();
- console.log("import form event :", e);
- });
-
- $('.renkan-action-button').each(function() {
- var projectId = $(this).data('project_id');
- var menu = $('#action-menu-'+projectId).menu().position({ my: "left top", at: "right top", of: this }).hide();
- var that = this;
-
- var timeoutCallback = function() {
- menu.hide();
- $(that).removeClass("ui-icon-triangle-1-se").addClass("ui-icon-triangle-1-e");
- menu.removeData('blurtimeout');
- };
-
- menu.on('menufocus', function() {
- clearTimeout(menu.data('blurtimeout'));
- menu.removeData('blurtimeout');
- });
- menu.on('menublur',function(e) {
- menu.data('blurtimeout', setTimeout( timeoutCallback,200));
- });
-
- $(this).click(createMenuHandler(menu, timeoutCallback));
- });
- });
-
- /*]]>*/
- </script>
- </body>
-</html>
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/renkanIndex.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}" >
- <head>
- <title>Renkan</title>
-
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta charset="utf-8"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
-
- <link rel="shortcut icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" />
-
- <script th:remove="all" type="text/javascript" src="../../static/lib/jquery.min.js"></script>
- <script th:remove="all" type="text/javascript" src="../../static/js/thymol.js"></script>
-
- <script src="../../lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script src="../../lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}" ></script>
-
- <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../static/css/index.css" rel="stylesheet" th:href="@{/static/css/index.css}"/>
- </head>
- <body>
- <div id="container">
- <div id="wrapper" th:with="headerTitle=#{renkanIndex.renkan_spaces}">
- <header id="header" th:include="fragment/pageFragment :: headerFragment">
- <h1 th:text="#{renkanIndex.renkan_spaces}">Renkan Spaces</h1>
- </header>
- <div id="inner">
- <div id="label" class="translate" th:text="#{renkanIndex.space_exp}">Create a Space</div>
- <form action="#" onsubmit="go2Title();return false;">
- <fieldset id="form-fields">
- <div id="title-field"><label th:text="#{renkanIndex.renkan_title}" for="renkantitle">title</label><input type="text" id="renkantitle" autofocus="autofocus" x-webkit-speech="x-webkit-speech"/></div>
- </fieldset>
- <div id="form-submit"><button type="submit">OK</button></div>
- </form>
- </div>
- <h2 th:text="#{renkanIndex.space_list}">Space list</h2>
- <div th:include="fragment/paginationFragment :: paginationFragment" class="pagination-container">
- <div>
- <a href="#?p.page=1"><<</a>
- <a href="#?p.page=3"><</a>
- <span>...</span>
- <a href="#?p.page=2">2</a>
- <a href="#?p.page=3">3</a>
- <span>4</span>
- <a href="#?p.page=5">5</a>
- <a href="#?p.page=6">6</a>
- <span>...</span>
- <a href="#?p.page=5">></a>
- <a href="#?p.page=7">>></a>
- </div>
- </div>
- <table>
- <thead>
- <tr>
- <th th:text="#{renkanIndex.space_name}">Name</th>
- <th th:text="#{renkanIndex.space_creation}">Creation</th>
- <th th:text="#{renkanIndex.space_proj_count}">Project count</th>
- <th th:text="#{renkanIndex.space_open}">Open</th>
- </tr>
- </thead>
- <tbody>
- <tr th:each="space: ${page.content}">
- <th th:text="${space.title}">title</th>
- <td th:text="${#dates.format(space.created, #messages.msg('date.format'))}">date</td>
- <td th:text="${#maps.containsKey(projectsCount, space.id)}? ${projectsCount[space.id]} : 0">nb. proj</td>
- <td><a href="#" th:href="@{'/s/'+${space.id}}" th:text="#{renkanIndex.space_open_link}">Open space</a></td>
- </tr>
- </tbody>
- </table>
- </div>
- <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
- <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </div>
- <script th:inline="javascript" >
- /*<![CDATA[*/
-
- function go2Title()
- {
- var renkantitle = $("#renkantitle").val();
- if(renkantitle.length == 0) {
- var alert_message = /*[[#{renkanIndex.js.empty_name_error}]]*/"Please enter a title";
- alert(alert_message);
- return false;
- }
-
- new_space = {
- title: renkantitle,
- description: "(empty description)",
- uri: null
- };
-
- var post_url = /*[[@{/rest/spaces/}]]*/"/rest/spaces/";
- $.ajax(post_url, {
- data:JSON.stringify(new_space),
- type: "POST",
- dataType: "json",
- contentType: "application/json; charset=UTF-8"
- }).done(function(space){
- var template_url = /*[[@{'/s/<%=space_id%>'}]]*/"s/<%=space_id%>";
- window.location = _.template(template_url, {space_id: space.id});
- });
-
- //? window.location = "p/" + renkantitle : alert(/*[[#{renkanIndex.js.empty_name_error}]]*/"Please enter a name");
- }
-
- /*]]>*/
- </script>
- </body>
-</html>
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/renkanProjectEdit.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
- <head>
- <meta charset="utf-8" />
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-
- <title>RENKAN</title>
- <meta name="description" content="" />
- <meta name="author" content="Institut de Recherche et d'Innovation" />
- <link rel="icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" type="image/x-icon" />
- <script src="lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script src="lib/jquery.mousewheel.min.js" th:src="@{/static/lib/jquery.mousewheel.min.js}"></script>
- <script src="lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}"></script>
- <script src="lib/backbone.js" th:src="@{/static/lib/backbone.js}"></script>
- <script src="lib/backbone-relational.js" th:src="@{/static/lib/backbone-relational.js}"></script>
- <script src="lib/paper.js" th:src="@{/static/lib/paper.js}"></script>
- <script type="text/javascript" th:inline="javascript">
- /*<![CDATA[*/
- var require = {
- baseUrl: /*[[@{/static/js/}]]*/""
- };
- /*]]>*/
- </script>
- <script src="js/config.js" th:src="@{/static/js/config.js}"></script>
- <script type="text/javascript" th:inline="javascript">
- var cowebConfig = {
- baseUrl: window.location.protocol + '//' + window.location.host,
- adminUrl : dojoConfig.baseUrl+'ocw_admin',
- debug: /*[[${coweb_debug}]]*/false,
- useWebSockets: /*[[${coweb_websockets}]]*/false
- };
- </script>
- <script type="text/javascript" src="lib/dojo/dojo.js" data-dojo-config="isDebug: true, parseOnLoad: true" th:src="@{/static/lib/dojo/dojo.js}"></script>
- <script type="text/javascript" th:inline="javascript">
- /*<![CDATA[*/
- function startRenkan() {
- var renkan_config = {
- static_url : /*[[@{/static/}]]*/ "",
- read_only: true,
- bins: [
- {
- type: "Wikipedia",
- lang: "en",
- search: "Digital Humanities"
- },
- {
- type: "Wikipedia",
- lang: "ja",
- search: "Digital Humanities"
- },
- {
- title: "LDT Project",
- type: "Ldt",
- ldt_type: "Project",
- project_id: "67280b1c-ff30-11e0-a82d-00145ea49a02",
- ldt_platform: "http://ldt.iri.centrepompidou.fr/"
- }
- ],
- search: [
- {
- type: "Wikipedia",
- lang: "fr"
- },
- {
- type: "Wikipedia",
- lang: "en"
- },
- {
- type: "Wikipedia",
- lang: "ja"
- }
- ],
- property_files: [
- /*[[@{/static/data/properties.json}]]*/ "data/properties.json",
- ],
- };
- var space_config = /*[[${space.binConfig}?${space.binConfig}:'{}']]*/"{}";
- space_config = JSON.parse(space_config || "{}");
- var _renkan = new Rkns.Renkan($.extend({}, renkan_config, space_config));
- var corenkanConfig = {
- projectId: /*[[${project.id}]]*/"new_project",
- renkan : _renkan
- };
-
- require({corenkanConfig: corenkanConfig}, ["corenkan"], function(corenkan) {
- corenkan.app.onStatusChange = function(status) {
- };
- });
- }
- /*]]>*/
- </script>
- <script src="js/renkan.js" th:src="@{/static/js/renkan.js}"></script>
- <link rel="stylesheet" href="css/renkan.css" th:href="@{/static/css/renkan.css}"/>
- <link rel="stylesheet" href="../../static/css/style.css" th:href="@{/static/css/style.css}"/>
- <link rel="stylesheet" href="../../static/css/renkanProject.css" th:href="@{/static/css/renkanProject.css}"/>
- </head>
- <body>
- <header><a href="/" th:href="@{/}">RENKAN</a> > <a href=".." th:href="@{'/s/'+${space.id}}">Space</a></header>
- <div id="renkan-wrapper">
- <div id="renkan-container">
- <div id="renkan"></div>
- </div>
- </div>
- <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
- <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </body>
-</html>
--- a/server/renkan-web/src/main/webapp/WEB-INF/templates/renkanProjectPublish.html Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" th:lang="${#ctx.getLocale().toLanguageTag()}">
- <head>
- <meta charset="utf-8" />
- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
- <title>RENKAN</title>
- <link rel="icon" href="../../static/img/favicon.ico" th:href="@{/static/img/favicon.ico}" type="image/x-icon" />
- <meta name="description" content="" />
- <meta name="author" content="Institut de Recherche et d'Innovation" />
- <script src="lib/jquery.min.js" th:src="@{/static/lib/jquery.min.js}" ></script>
- <script src="lib/jquery.mousewheel.min.js" th:src="@{/static/lib/jquery.mousewheel.min.js}"></script>
- <script src="lib/underscore-min.js" th:src="@{/static/lib/underscore-min.js}"></script>
- <script src="lib/backbone.js" th:src="@{/static/lib/backbone.js}"></script>
- <script src="lib/backbone-relational.js" th:src="@{/static/lib/backbone-relational.js}"></script>
- <script src="lib/paper.js" th:src="@{/static/lib/paper.js}"></script>
- <script type="text/javascript" th:inline="javascript">
- /*<![CDATA[*/
- var require = {
- baseUrl: /*[[@{/static/js/}]]*/""
- };
- /*]]>*/
- </script>
- <script src="lib/require.js" th:src="@{/static/lib/require.js}"></script>
- <script src="js/renkan.js" th:src="@{/static/js/renkan.js}"></script>
- <script type="text/javascript" th:inline="javascript">
- /*<![CDATA[*/
- function startRenkan() {
- var _renkan = new Rkns.Renkan({
- static_url:/*[[@{/static/}]]*/ "",
- editor_mode: false,
- show_bins: false,
- url: /*[[@{/rest/projects/}+${project.id}]]*/ "../metadataplayer/json/renkan.json",
- property_files: [
- /*[[@{/static/data/properties.json}]]*/ "data/properties.json",
- ]
- });
- Rkns.jsonIO(_renkan, {
- url: /*[[@{/rest/projects/}+${project.id}]]*/ "../metadataplayer/json/renkan.json"
- });
- }
- /*]]>*/
- </script>
- <link rel="stylesheet" href="css/renkan.css" th:href="@{/static/css/renkan.css}"/>
- <link href="../../static/css/style.css" rel="stylesheet" th:href="@{/static/css/style.css}"/>
- <link href="../../static/css/renkanProject.css" rel="stylesheet" th:href="@{/static/css/renkanProject.css}"/>
- </head>
-
- <body>
- <header><a href="/" th:href="@{/}">RENKAN</a> > <a href=".." th:href="@{'/s/'+${space.id}}">Space</a></header>
- <div id="renkan-wrapper">
- <div id="renkan-container">
- <div id="renkan"></div>
- </div>
- </div>
- <footer id="footer" th:include="fragment/pageFragment :: footerFragment">
- <div id="version">© <span class="version-date">2014</span> <a href="http://www.iri.centrepompidou.fr" target="_blanck">IRI</a> - Version <span class="version-version">0.0</span></div>
- </footer>
- </body>
-</html>
--- a/server/renkan-web/src/main/webapp/WEB-INF/web.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
- version="3.0">
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <listener>
- <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
- </listener>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/applicationContext.xml</param-value>
- </context-param>
- <servlet>
- <servlet-name>cometd</servlet-name>
- <servlet-class>org.cometd.server.CometdServlet</servlet-class>
- <init-param>
- <param-name>logLevel</param-name>
- <param-value>1</param-value>
- </init-param>
- <init-param>
- <param-name>timeout</param-name>
- <param-value>30000</param-value>
- </init-param>
- <init-param>
- <param-name>jsonDebug</param-name>
- <param-value>false</param-value>
- </init-param>
- <init-param>
- <param-name>maxSessionsPerBrowser</param-name>
- <param-value>-1</param-value>
- </init-param>
- <init-param>
- <param-name>transports</param-name>
- <param-value>org.cometd.websocket.server.WebSocketTransport</param-value>
- </init-param>
- <init-param>
- <param-name>ws.bufferSize</param-name>
- <param-value>100000</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>cometd</servlet-name>
- <url-pattern>/cometd/*</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>admin</servlet-name>
- <servlet-class>org.coweb.servlet.AdminServlet</servlet-class>
- <init-param>
- <param-name>ConfigURI</param-name>
- <param-value>/WEB-INF/cowebConfig.json</param-value>
- </init-param>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>admin</servlet-name>
- <url-pattern>/ocw_admin/*</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>restServlet</servlet-name>
- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
- <init-param>
- <param-name>javax.ws.rs.Application</param-name>
- <param-value>org.iri_research.renkan.rest.RestApplication</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>restServlet</servlet-name>
- <url-pattern>/rest/*</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>spring</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>spring</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- <filter>
- <filter-name>springSecurityFilterChain</filter-name>
- <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>springSecurityFilterChain</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>cross-origin</filter-name>
- <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>cross-origin</filter-name>
- <url-pattern>/cometd/*</url-pattern>
- <url-pattern>/rest/*</url-pattern>
- </filter-mapping>
-</web-app>
--- a/server/renkan-web/src/main/webapp/static/css/index.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,490 +0,0 @@
-::-moz-selection {
- background: #a8d1ff;
- color: inherit;
- text-shadow: inherit;
-}
-
-::selection {
- background: #a8d1ff;
- color: inherit;
- text-shadow: inherit;
-}
-
-body, html {
- height: 100%;
-}
-
-body, h1, h2, table, tbody, thead, tr, td, th {
- border: none;
- margin: 0;
- padding: 0;
- text-align: left;
- font-size: 100%;
-}
-
-body {
- margin: 0;
- padding: 0;
- font-family: Arial, Helvetica, sans-serif;
- background: #F6F6F6;
- color: #333333;
-}
-
-h1 {
- margin-bottom: 5px;
- padding: 15px;
- background: #333333;
- color: #ffffff;
- font-weight: bold;
- font-size: 30px;
-}
-
-h2 {
- margin: 12px 15px 2px;
-}
-
-h3 {
- color: #999999;
- font-size: 15px;
- font-weight: bold;
- font-style: italic;
- margin: 5px 30px;
-}
-
-a {
- text-decoration: none;
- color: #3030a0;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-table {
- border-collapse: collapse;
- margin: 5px 15px;
- border: 1px solid #CCCCCC;
-}
-
-th, td {
- padding: 4px 12px 4px 4px;
- border: 1px solid #cccccc;
-}
-
-thead {
- font-size: 16px;
-}
-
-tbody {
- font-size: 14px;
-}
-
-tbody tr:nth-child(even) {
- background: #fafafa;
-}
-
-tbody tr:nth-child(odd) {
- background: #f0f0f0;
-}
-
-thead tr {
- background: #666666;
- color: #f0e0e0;
-}
-
-tbody tr:hover {
- background: #ffffff;
-}
-
-.pagination-container {
- margin: 12px 15px 2px;
- font-size: 14px;
-}
-
-.pagination-container a, .pagination-container span {
- margin: 0 1px 0 1px;
-}
-
-div#container {
- position: relative; /* needed for footer positioning*/
- margin: 0 auto; /* center, not in IE5 */
- height: auto !important; /* real browsers */
- height: 100%; /* IE6: treaded as min-height*/
- min-height: 100%; /* real browsers */
-}
-
-div#wrapper {
- padding-bottom: 1em; /* bottom padding for footer */
-}
-
-header#header {
- border-bottom: 2px solid #ffffff;
- background: #333333;
- color: #ffffff;
- font-weight: bold;
- font-size: 30px;
-}
-
-header h1 {
- float: left;
-}
-
-header #header-clear {
- clear: both;
-}
-
-header .header-nav {
- background: #333333;
- color: #ffffff;
- float: right;
- font-weight: normal;
- font-size: 15px;
- margin-bottom: 5px;
- padding: 15px;
- text-align: right;
-}
-
-header .header-nav a, header .header-nav a:ACTIVE, header .header-nav a:LINK,
- header .header-nav a:VISITED {
- color: #ffffff;
- text-decoration: none;
-}
-
-header .header-nav a:HOVER {
- color: #ffffff;
- text-decoration: underline;
-}
-
-#header-nav-user-avatar {
- margin: 0 5px 2px 0;
-}
-
-footer#footer {
- position: absolute;
- bottom: 0;
- width: 100%;
- font-size: 12px;
-}
-
-footer#footer div {
- float: right;
- margin: 15px 10px 0 0;
-}
-
-#home-link, #home-link:link, #home-link:hover, #home-link:active,
- #home-link:visited {
- text-decoration: none;
- color: #ffffff;
-}
-
-#inner {
- width: 350px;
- height: 170px;
- margin: 10px auto;
-}
-
-#button {
- margin: 0 auto;
- border-radius: 3px;
- text-align: center;
- font: 36px verdana, arial, sans-serif;
- color: white;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, .8);
- height: 70px;
- line-height: 70px;
- background: #555;
- background: -webkit-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
- background: -moz-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
- background: -ms-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
- background: -o-linear-gradient(#5F5F5F, #565656 50%, #4C4C4C 51%, #373737);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.9);
-}
-
-#button:hover {
- cursor: pointer;
- background: #666;
- background: -webkit-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
- background: -moz-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
- background: -ms-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
- background: -o-linear-gradient(#707070, #666666 50%, #5B5B5B 51%, #474747);
-}
-
-#button:active {
- box-shadow: inset 0 1px 12px rgba(0, 0, 0, 0.9);
- background: #444;
-}
-
-#label {
- font: 30px verdana, arial, sans-serif bold;
- text-align: center;
- text-shadow: 0 1px 1px #fff;
- height: 70px;
- line-height: 70px;
- margin: 16px auto 0;
-}
-
-form {
- height: 38px;
- position: relative;
-}
-
-button, input, label {
- font-weight: bold;
- font-size: 15px;
-}
-
-#inner label {
- padding: 5px 10px 5px 0px;
-}
-
-#form-fields {
- float: left;
-}
-
-#form-fields input {
- width: 290px;
-}
-
-
-#inner div {
- /* position: absolute;*/
-
-}
-
-#inner input {
- padding: 5px 10px;
- *padding: 0; /* IE7 hack */
- height: 100%;
- outline: none;
-}
-
-#inner input[type="text"] {
- background: #fff;
- border: 1px solid #bbb;
- border-radius: 3px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
-}
-
-#inner button[type="submit"] {
- position: absolute;
- right: -45px;
- width: 45px;
- height: 38px;
-}
-
-#objects-content {
- float: left;
-}
-
-#objects-content table {
- width: 100%;
-}
-
-.object-tools {
- font-size: 11px;
- font-weight: bold;
- font-family: Arial, Helvetica, sans-serif;
- padding-left: 0;
- float: right;
- position: relative;
- margin: -2.4em -15px -2em 0;
-}
-
-.object-tools li {
- list-style: none;
-}
-
-.object-tools a:link, .object-tools a:visited {
- display: block;
- float: left;
- color: white;
- padding: .1em 8px .1em 8px;
- height: 14px;
- background: #666666;
- text-decoration: none;
-}
-
-.object-table-title {
- width: 250px;
-}
-
-.object-table-created {
- width: 120px;
-}
-
-.object-table-actions {
- width: 40px;
-}
-
-.object-table-actions-disabled, .object-table-actions-disabled:link,
- .object-table-actions-disabled:visited, .object-table-actions-disabled:hover,
- .object-table-actions-disabled:active, .object-table-actions-disabled:focus
- {
- color: gray;
- text-decoration: none;
- cursor: default;
-}
-
-td.object-table-created {
- text-align: center;
-}
-
-.form-fields label, .form-fields input, .form-fields textarea,
- .form-fields #binConfigContainer {
- display: inline-block;
-}
-
-.form-fields label {
- width: 150px;
- float: left;
-}
-
-.form-fields input, .form-fields textarea, .form-fields select {
- width: 200px;
-}
-
-.form-fields div {
- margin-bottom: 12px;
-}
-
-.form-error {
- color: red;
-}
-
-#binConfigDiv {
- position: relative;
- width: 650px;
- height: 150px;
-}
-
-.binConfigButton {
- font-weight: normal;
-}
-
-.binConfigButton[disabled] {
- color: graytext;
-}
-
-#binConfigDiv div {
- margin-bottom: 0;
-}
-
-#object-delete-container {
- margin-left: 12px;
- margin-top: 1em;
-}
-
-#object-delete-confirm-buttons {
- margin-top: 1em;
-}
-
-#object-delete-confirm-buttons form {
- margin: 0;
- padding: 0;
- display: inline;
-}
-
-#object-delete-confirm-buttons input[type=submit] {
- margin-right: 12px;
-}
-
-#project-filter-container {
- margin: 12px 0 0 15px;
-}
-
-#project-filter-container input[type="text"] {
- background: #fff;
- border: 1px solid #bbb;
- border-radius: 3px;
- padding: 2px 10px 3px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- outline: none;
- font-weight: normal;
- font-size: 15px;
-}
-
-#project-filter-container button[type="submit"] {
-
-}
-
-.proj-sort-form {
- float: right;
- height: auto;
-}
-
-.proj-sort-form input[type=submit] {
- width: 16px;
- height: 16px;
- border: 0;
-}
-
-.proj-sort-form input[type=submit]:HOVER {
- opacity: .5;
-}
-
-.proj-sortable-col {
- background: url("../img/sort_arrows.png") 0 0;
-}
-
-.proj-sort-desc-col {
- background: url("../img/sort_arrows.png") 0 -17px;
-}
-
-.proj-sort-asc-col {
- background: url("../img/sort_arrows.png") 0 -33px;
-}
-
-#inner-container {
- margin: 12px 0px 0px 15px;
-}
-
-#login-errors {
- color: #ff0000;
- border: 1px solid #ff0000;
- padding: 8px;
- margin: 16px 16px 32px;
- width: inherit;
- float: left;
-}
-
-#login-form {
- clear: both;
-}
-
-.renkan-icon-eye {
- background-position: -160px -144px;
-}
-
-.renkan-basic-action {
- display: inline-block;
-}
-
-.renkan-action-button {
- cursor: pointer;
-}
-
-.ui-menu {
- width: 180px;
-}
-
-.action-menu {
- position: absolute;
-}
-
-.action-menu a {
- color: #333333;
-}
-
-.action-menu a:ACTIVE {
- color: #333333;
-}
-
-.action-menu a:LINK {
- color: #333333;
-}
-
-.action-menu a:VISITED {
- color: #333333;
-}
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/css/renkanProject.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +0,0 @@
-/* =============================================================================
- Renkan
- ========================================================================== */
-body {
- background-color: #1E1E1E;
-}
-
-header {
- font-size: 12px;
- height: 15px;
- padding: 5px 0 2px 10px;
- color: white;
-}
-
-footer {
- font-size: 10px;
- position:absolute;
- bottom: 0;
- text-align: right;
- width: 100%;
- padding: 2px 0;
- color: white;
-}
-
-a, a:VISITED, a:LINK {
- color: white;
- text-decoration: none;
-}
-
-a:HOVER {
- text-decoration: underline;
-}
-
-
-#renkan-wrapper {
- position:absolute;
- top: 25px;
- left: 0;
- right: 0;
- bottom: 18px;
-}
-
-#renkan-container {
- min-height: 100%;
- position: relative;
- width: 100%;
-}
-
-#version {
- padding-right: 5px;
-}
--- a/server/renkan-web/src/main/webapp/static/css/spectrum.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,481 +0,0 @@
-/***
-Spectrum Colorpicker v1.0.9
-https://github.com/bgrins/spectrum
-Author: Brian Grinstead
-License: MIT
-***/
-
-.sp-container {
- position:absolute;
- top:0;
- left:0;
- display:inline-block;
- *display: inline;
- *zoom: 1;
- z-index: 2147483647;
- overflow: hidden;
-}
-.sp-container.sp-flat {
- position: relative;
-}
-
-/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
-.sp-top {
- position:relative;
- width: 100%;
- display:inline-block;
-}
-.sp-top-inner {
- position:absolute;
- top:0;
- left:0;
- bottom:0;
- right:0;
-}
-.sp-color {
- position: absolute;
- top:0;
- left:0;
- bottom:0;
- right:20%;
-}
-.sp-hue {
- position: absolute;
- top:0;
- right:0;
- bottom:0;
- left:84%;
- height: 100%;
-}
-.sp-fill {
- padding-top: 80%;
-}
-.sp-sat, .sp-val {
- position: absolute;
- top:0;
- left:0;
- right:0;
- bottom:0;
-}
-
-.sp-alpha-enabled .sp-top
-{
- margin-bottom: 18px;
-}
-.sp-alpha-enabled .sp-alpha
-{
- display: block;
-}
-
-.sp-alpha-handle
-{
- position:absolute;
- top:-4px;
- bottom: -4px;
- width: 6px;
- left: 50%;
- cursor: pointer;
- border: 1px solid black;
- background: white;
- opacity: .8;
-}
-
-.sp-alpha
-{
- display: none;
- position: absolute;
- bottom: -14px;
- right: 0;
- left: 0;
- height: 8px;
-}
-.sp-alpha-inner{
- border: solid 1px #333;
-}
-
-/* Don't allow text selection */
-.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
- -webkit-user-select:none;
- -moz-user-select: -moz-none;
- -o-user-select:none;
- user-select: none;
-}
-
-.sp-container.sp-input-disabled .sp-input-container {
- display: none;
-}
-.sp-container.sp-buttons-disabled .sp-button-container {
- display: none;
-}
-.sp-palette-only .sp-picker-container {
- display: none;
-}
-.sp-palette-disabled .sp-palette-container {
- display: none;
-}
-
-.sp-initial-disabled .sp-initial {
- display: none;
-}
-
-
-/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
-.sp-sat {
- background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
- background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
- background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
- background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
- background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
- background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
- -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
- filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
-}
-.sp-val {
- background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
- background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
- background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
- background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
- background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
- background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
- -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
- filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
-}
-
-.sp-hue {
- background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
- background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
- background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
- background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
- background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
-}
-
-/* IE filters do not support multiple color stops.
- Generate 6 divs, line them up, and do two color gradients for each.
- Yes, really.
- */
-
-.sp-1 {
- height:17%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
-}
-.sp-2 {
- height:16%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
-}
-.sp-3 {
- height:17%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
-}
-.sp-4 {
- height:17%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
-}
-.sp-5 {
- height:16%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
-}
-.sp-6 {
- height:17%;
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
-}
-
-.sp-hidden {
- display: none !important;
-}
-
-/* Clearfix hack */
-.sp-cf:before, .sp-cf:after { content: ""; display: table; }
-.sp-cf:after { clear: both; }
-.sp-cf { *zoom: 1; }
-
-/* Mobile devices, make hue slider bigger so it is easier to slide */
-@media (max-device-width: 480px) {
- .sp-color { right: 40%; }
- .sp-hue { left: 63%; }
- .sp-fill { padding-top: 60%; }
-}
-
-.sp-dragger {
- border-radius: 5px;
- height: 5px;
- width: 5px;
- border: 1px solid #fff;
- background: #000;
- cursor: pointer;
- position:absolute;
- top:0;
- left: 0;
-}
-.sp-slider {
- position: absolute;
- top:0;
- cursor:pointer;
- height: 3px;
- left: -1px;
- right: -1px;
- border: 1px solid #000;
- background: white;
- opacity: .8;
-}
-
-/* Basic display options (colors, fonts, global widths) */
-.sp-container {
- border-radius: 0;
- background-color: #ECECEC;
- border: solid 1px #f0c49B;
- padding: 0;
-}
-.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue
-{
- font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- -ms-box-sizing: border-box;
- box-sizing: border-box;
-}
-.sp-top
-{
- margin-bottom: 3px;
-}
-.sp-color, .sp-hue
-{
- border: solid 1px #666;
-}
-
-/* Input */
-.sp-input-container {
- float:right;
- width: 100px;
- margin-bottom: 4px;
-}
-.sp-initial-disabled .sp-input-container {
- width: 100%;
-}
-.sp-input {
- font-size: 12px !important;
- border: 1px inset;
- padding: 4px 5px;
- margin: 0;
- width: 100%;
- background:transparent;
- border-radius: 3px;
- color: #222;
-}
-.sp-input:focus {
- border: 1px solid orange;
-}
-.sp-input.sp-validation-error
-{
- border: 1px solid red;
- background: #fdd;
-}
-.sp-picker-container , .sp-palette-container
-{
- float:left;
- position: relative;
- padding: 10px;
- padding-bottom: 300px;
- margin-bottom: -290px;
-}
-.sp-picker-container
-{
- width: 172px;
- border-left: solid 1px #fff;
-}
-
-/* Palettes */
-.sp-palette-container
-{
- border-right: solid 1px #ccc;
-}
-
-.sp-palette .sp-thumb-el {
- display: block;
- position:relative;
- float:left;
- width: 24px;
- height: 15px;
- margin: 3px;
- cursor: pointer;
- border:solid 2px transparent;
-}
-.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
- border-color: orange;
-}
-.sp-thumb-el
-{
- position:relative;
-}
-
-/* Initial */
-.sp-initial
-{
- float: left;
- border: solid 1px #333;
-}
-.sp-initial span {
- width: 30px;
- height: 25px;
- border:none;
- display:block;
- float:left;
- margin:0;
-}
-
-/* Buttons */
-.sp-button-container {
- float: right;
-}
-
-/* Replacer (the little preview div that shows up instead of the <input>) */
-.sp-replacer {
- margin:0;
- overflow:hidden;
- cursor:pointer;
- padding: 4px;
- display:inline-block;
- *zoom: 1;
- *display: inline;
- border: solid 1px #91765d;
- background: #eee;
- color: #333;
- vertical-align: middle;
-}
-.sp-replacer:hover, .sp-replacer.sp-active {
- border-color: #F0C49B;
- color: #111;
-}
-.sp-replacer.sp-disabled {
- cursor:default;
- border-color: silver;
- color: silver;
-}
-.sp-dd {
- padding: 2px 0;
- height: 16px;
- line-height: 16px;
- float:left;
- font-size:10px;
-}
-.sp-preview
-{
- position:relative;
- width:25px;
- height: 20px;
- border: solid 1px #222;
- margin-right: 5px;
- float:left;
- z-index: 0;
-}
-
-.sp-palette
-{
- *width: 220px;
- max-width: 220px;
-}
-.sp-palette .sp-thumb-el
-{
- width:16px;
- height: 16px;
- margin:2px 1px;
- border: solid 1px #d0d0d0;
-}
-
-.sp-container
-{
- padding-bottom:0;
-}
-
-
-/* Buttons: http://hellohappy.org/css3-buttons/ */
-.sp-container button {
- background-color: #eeeeee;
- background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
- background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
- background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
- background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
- background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
- background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
- border: 1px solid #ccc;
- border-bottom: 1px solid #bbb;
- border-radius: 3px;
- color: #333;
- font-size: 14px;
- line-height: 1;
- padding: 5px 4px;
- text-align: center;
- text-shadow: 0 1px 0 #eee;
- vertical-align: middle;
-}
-.sp-container button:hover {
- background-color: #dddddd;
- background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
- background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
- background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
- background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
- background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
- background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
- border: 1px solid #bbb;
- border-bottom: 1px solid #999;
- cursor: pointer;
- text-shadow: 0 1px 0 #ddd;
-}
-.sp-container button:active {
- border: 1px solid #aaa;
- border-bottom: 1px solid #888;
- -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
- -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
- -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
- -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
- box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-}
-.sp-cancel
-{
- font-size: 11px;
- color: #d93f3f !important;
- margin:0;
- padding:2px;
- margin-right: 5px;
- vertical-align: middle;
- text-decoration:none;
-
-}
-.sp-cancel:hover
-{
- color: #d93f3f !important;
- text-decoration: underline;
-}
-
-
-.sp-palette span:hover, .sp-palette span.sp-thumb-active
-{
- border-color: #000;
-}
-
-.sp-preview, .sp-alpha, .sp-thumb-el
-{
- position:relative;
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
-}
-.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner
-{
- display:block;
- position:absolute;
- top:0;left:0;bottom:0;right:0;
-}
-
-.sp-palette .sp-thumb-inner
-{
- background-position: 50% 50%;
- background-repeat: no-repeat;
-}
-
-.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner
-{
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
-}
-
-.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner
-{
- background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
-}
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/css/style.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/* =============================================================================
- HTML5 Boilerplate CSS: h5bp.com/css
- ========================================================================== */
-
-article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
-audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
-audio:not([controls]) { display: none; }
-[hidden] { display: none; }
-
-html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
-html, button, input, select, textarea { font-family: sans-serif; color: #222; }
-body { margin: 0; font-size: 1em; line-height: 1.4; }
-
-::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
-::selection { background: #fe57a1; color: #fff; text-shadow: none; }
-
-a { color: #00e; }
-a:visited { color: #551a8b; }
-a:hover { color: #06e; }
-a:focus { outline: thin dotted; }
-a:hover, a:active { outline: 0; }
-
-abbr[title] { border-bottom: 1px dotted; }
-b, strong { font-weight: bold; }
-blockquote { margin: 1em 40px; }
-dfn { font-style: italic; }
-hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
-ins { background: #ff9; color: #000; text-decoration: none; }
-mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
-pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
-pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
-q { quotes: none; }
-q:before, q:after { content: ""; content: none; }
-small { font-size: 85%; }
-
-sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
-sup { top: -0.5em; }
-sub { bottom: -0.25em; }
-
-ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
-dd { margin: 0 0 0 40px; }
-nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
-
-img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
-
-svg:not(:root) { overflow: hidden; }
-
-figure { margin: 0; }
-
-form { margin: 0; }
-fieldset { border: 0; margin: 0; padding: 0; }
-label { cursor: pointer; }
-legend { border: 0; *margin-left: -7px; padding: 0; white-space: normal; }
-button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
-button, input { line-height: normal; }
-button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; }
-button[disabled], input[disabled] { cursor: default; }
-input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; *width: 13px; *height: 13px; }
-input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
-input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; }
-button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
-textarea { overflow: auto; vertical-align: top; resize: vertical; }
-input:valid, textarea:valid { }
-input:invalid, textarea:invalid { background-color: #f0dddd; }
-
-table { border-collapse: collapse; border-spacing: 0; }
-td { vertical-align: top; }
-
-.chromeframe { margin: 0.2em 0; background: #ccc; color: black; padding: 0.2em 0; }
-
-
-
-/* ===== Primary Styles ========================================================
- Author:
- ========================================================================== */
-.templates { display: none; }
-
-.project_desc_label { font-weight: bold; }
-
-#project_display {
- background: #9cbc2c;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius: 5px;
- padding: 20px;
- width: 400px;
-}
-
-
-
-/* =============================================================================
- Media Queries
- ========================================================================== */
-
-@media only screen and (min-width: 35em) {
- /* Style adjustments for viewports that meet the condition */
-}
-
-/* =============================================================================
- Non-Semantic Helper Classes
- ========================================================================== */
-
-.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; *line-height: 0; }
-.ir br { display: none; }
-.hidden { display: none !important; visibility: hidden; }
-.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
-.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
-.invisible { visibility: hidden; }
-.clearfix:before, .clearfix:after { content: ""; display: table; }
-.clearfix:after { clear: both; }
-.clearfix { *zoom: 1; }
-
-/* =============================================================================
- Print Styles
- ========================================================================== */
-
-@media print {
- * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */
- a, a:visited { text-decoration: underline; }
- a[href]:after { content: " (" attr(href) ")"; }
- abbr[title]:after { content: " (" attr(title) ")"; }
- .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */
- pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
- thead { display: table-header-group; } /* h5bp.com/t */
- tr, img { page-break-inside: avoid; }
- img { max-width: 100% !important; }
- @page { margin: 0.5cm; }
- p, h2, h3 { orphans: 3; widows: 3; }
- h2, h3 { page-break-after: avoid; }
-}
Binary file server/renkan-web/src/main/webapp/static/img/favicon.ico has changed
Binary file server/renkan-web/src/main/webapp/static/img/sort_arrows.png has changed
Binary file server/renkan-web/src/main/webapp/static/img/user.png has changed
--- a/server/renkan-web/src/main/webapp/static/js/admin_form.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,18 +0,0 @@
-function showformErrors(errors) {
- $(".form-error").remove();
-
- $.each(errors,function(k,v){
- $("#"+k).after('<div class="form-error">'+v+'</div>');
- });
- $(".form-error").effect("highlight", {}, 1500);
-}
-
-
-function formatJson(jsonText, tabSize) {
- var obj = JSON.parse(jsonText);
- return JSON.stringify(obj, undefined, tabSize);
-}
-function compactJson(jsonText) {
- var obj = JSON.parse(jsonText);
- return JSON.stringify(obj);
-}
--- a/server/renkan-web/src/main/webapp/static/js/config.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,26 +0,0 @@
-//
-// Config file. Split out from the app for ease of overlaying a new config
-// without affecting the app controller.
-//
-// Copyright (c) The Dojo Foundation 2011. All Rights Reserved.
-//
-var dojoConfig = {
- baseUrl: '/renkan/',
- async:true,
- paths : {
- coweb : 'lib/coweb',
- cowebx: 'lib/cowebx',
- org : 'lib/org',
- corenkan: 'static/js/corenkan',
- rcolor: 'static/lib/rcolor',
- underscore: 'static/lib/underscore-min',
- jquery: 'static/lib/jquery.min',
- filesaver: 'static/lib/FileSaver',
- },
- packages:[{
- name: 'dojo',
- location:'static/lib/dojo',
- main:'main'
- }],
-};
-
--- a/server/renkan-web/src/main/webapp/static/js/corenkan.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,619 +0,0 @@
-/**
- * TODO: add js header
- */
-
-define([
- "dojo",
- "dojo/cookie",
- "dojo/json",
- "dojo/ready",
- "coweb/main",
- "rcolor",
- ], function(dojo, cookie, json, ready, coweb, RColor) {
-
- 'use strict';
-
- var CoRenkan = function() {
- };
-
- var proto = CoRenkan.prototype;
-
- proto.init = function() {
- console.log("ready callback", dojo.config.corenkanConfig);
-
- this.renkan = dojo.config.corenkanConfig.renkan;
- this.project = dojo.config.corenkanConfig.renkan.project;
-
- this.initCollab(dojo.config.corenkanConfig.projectId);
-
-
- var that = this;
-
- ready(function() {
-
- var sess = coweb.initSession();
- that.session = sess;
-
- sess.prepare({userDefined: {project_id:dojo.config.corenkanConfig.projectId}, collab: true}).then(function(data) {
- console.log("Prepare ok : ", data);
- that.setObjects();
- });
-
- sess.onStatusChange = function(status) {
- console.log(status);
- that.onInternalStatusChange(status);
- if(typeof that.onStatusChange === "function") {
- that.onStatusChange(status);
- }
- };
-
- });
-
- };
-
- proto.initCollab = function(id) {
-
- console.log("init collabbs objects " + "users_" + id + ", " + "renkan_" + id);
-
- this.users_collab = coweb.initCollab({id: "users_" + id});
-
- this.users_collab.subscribeReady(this, "onLocalJoin");
- this.users_collab.subscribeSiteJoin(this, 'onRemoteJoin');
- this.users_collab.subscribeSiteLeave(this, 'onRemoteLeave');
- this.users_collab.subscribeSync("roster", this, "onRemoteRosterChange");
-
- this.users_collab.subscribeStateResponse(this, "onUsersStateResponse");
-
-
- this.collab = coweb.initCollab({id : "renkan_" + id});
-
- this.collab.subscribeSync("project", this, "onRemoteProjectChange");
- this.collab.subscribeSync("user", this, "onRemoteUserChange");
- this.collab.subscribeSync("node", this, "onRemoteNodeChange");
- this.collab.subscribeSync("edge", this, "onRemoteEdgeChange");
- this.collab.subscribeSync("view", this, "onRemoteViewChange");
-
- this.collab.subscribeStateResponse(this, "onStateResponse");
-
- };
-
- proto.onLocalJoin = function(params) {
- console.log("Local join", params);
- this.current_site = params.site;
- if(typeof this.renkan !== "undefined" && this.renkan !== null && typeof this.renkan.current_user !== "undefined") {
- this.renkan.current_user.set("site_id", params.site);
- }
- };
-
-
- proto.onRemoteJoin = function(params) {
- console.log("Remote join", params);
- // do nothing
- };
-
- proto.onRemoteLeave = function(params) {
- console.log("Remote leave", params);
-
- // remove remote site from current_user_list
- if(typeof this.renkan === "undefined" || this.renkan === null || typeof this.renkan.current_user_list === "undefined" || this.renkan.current_user_list === null) {
- return;
- }
- var filtered_user_list = this.renkan.current_user_list.filter(function(u) { return u.get("site_id") == params.site; });
- for ( var user in filtered_user_list) {
- this.renkan.current_user_list.remove(user);
- }
-
- };
-
- proto.onUsersStateResponse = function(state) {
-
- var user_list = json.parse(state);
- console.log("Users State response", user_list);
- _.each(user_list, function(user, i, l) {
- user._id = user.id;
- });
- this.renkan.current_user_list.reset(user_list, {silent: true});
- };
-
- proto.onStateResponse = function(state) {
- var obj = json.parse(state);
- console.log("State response", obj);
- obj._id = obj.id;
- this.project.set(obj, {validate: true});
- this.renkan.renderer.autoScale();
- };
-
- proto.onInternalStatusChange = function(status) {
- if(status == "ready") {
- this.renkan.read_only = false;
- this.renkan.onStatusChange();
- }
- else {
- this.renkan.read_only = true;
- this.renkan.onStatusChange();
- }
- };
-
- function prepareValues(obj,c) {
- var values = {};
- for(var fieldname in c.changes) {
- if(c.changes[fieldname]) {
- values[fieldname] = obj.get(fieldname);
- }
- }
- return values;
- }
-
- proto.addObjectBind = function(type, obj, c, options, collab) {
- console.log("add " + type,obj, c, options);
- if(this.project === null) {
- console.log("null project exiting");
- return;
- }
- var values = obj.toJSON();
- var new_values = {
- id: obj.id,
- _type: type,
- _index: options.index,
- _project_id : obj.get("project").get("_id"),
- _user_id : (this.project.current_user!==null && typeof this.project.current_user !== "undefined")?this.project.current_user.id:null
- };
- for(var k in new_values) {
- values[k] = new_values[k];
- }
- var position = c.indexOf(obj);
- console.log("add position, index, values: ", position, options.index, values);
- collab.sendSync(type, values, "insert", position);
- };
-
- proto.removeObjectBind = function(type, obj, c, options, collab) {
- console.log("delete " + type,obj, c, options);
- var values = {
- id: obj.id,
- _type: type,
- _index: options.index,
- _project_id : obj.get("project").id,
- _user_id : (this.project.current_user!==null)?this.project.current_user.id:null
- };
- collab.sendSync(type, values, "delete", options.index);
- };
-
- proto.updateObjectBind = function(type, obj, options, collab) {
- console.log("change " + type,obj, options);
- if(typeof obj != "undefined" && obj.hasChanged()) {
- var values = {
- id: obj.id,
- _type: type,
- _project_id : obj.get("project").id,
- _user_id : (this.project.current_user!==null)?this.project.current_user.id:null
- };
- _.extend(values,obj.changed);
- collab.sendSync(type, values);
- }
- };
-
- /**
- * Called when an abject is changed
- *
- */
- proto.objectChange = function(event, model, collection, options) {
-
- console.log("project change all ", event, model, collection, options);
- // check that current user is in user list of the project
-
- if(this.project === null || this.project.current_user === null) {
- return;
- }
- var current_user = this.project.current_user;
-
- if(this.project.get("users").get(current_user.id) === null) {
- var props = current_user.toJSON();
- this.project.addUser(props);
- }
-
- };
-
-
- proto.setObjects = function() {
-
- console.log("Cookie BAYEUX_BROWSER : " + cookie("BAYEUX_BROWSER"));
- var renkan = this.renkan;
- var project = renkan.project;
- this.setProject(project);
- this.setRenkan(renkan);
- this.setUser(renkan);
-
- };
-
- proto.setRenkan = function(renkan) {
-
- console.log("Set Renkan");
-
- var that = this;
-
- renkan.current_user_list.bind("add", function(obj, c, options) {
- that.addObjectBind("roster", obj, c, options, that.users_collab);
- });
- //renkan.current_user_list.bind("remove", function(obj, c, options) {
- // that.removeObjectBind("_roster", obj, c, options, that.users_collab);
- //});
- renkan.current_user_list.bind("change", function(obj, options) {
- that.updateObjectBind("roster", obj, options, that.users_collab);
- });
-
- renkan.current_user_list.bind("change", function(obj, options) {
- console.log("update roster",obj, options);
- // get user in project
- var project = obj.get("project");
- if(project === null) {
- console.log("null project return");
- return;
- }
- var user = project.get("users").get(obj.id);
- if(user === null) {
- console.log("user " + obj.id + " not in project. return");
- return;
- }
- var new_val;
- for(var att in obj.changed) {
- new_val = obj.changed[att];
- if(user.get("att") != new_val) {
- user.set(att, new_val);
- }
- }
- });
-
- };
-
- proto.setUser = function(renkan) {
- console.log("set user : " + cookie("BAYEUX_BROWSER"));
-
- if(typeof renkan === "undefined" || typeof renkan.project === "undefined" || renkan.project === null) {
- return;
- }
-
- var user_id = cookie("BAYEUX_BROWSER");
- var project = renkan.project;
-
- var puser = project.get("users").get(user_id);
- var puser_def = null;
- if(puser === null || typeof puser === "undefined") {
- var color = new RColor();
- puser_def = {
- id: user_id,
- title: "anonymous",
- project: project,
- color: color.get(true, 0.5, 0.8),
- site_id: this.current_site
- };
- }
- else {
- puser_def = puser.toJSON();
- puser_def.project = project;
- }
- puser = renkan.current_user_list.push(puser_def);
-
- project.current_user = puser;
- renkan.current_user = puser.id;
-
- var that = this;
-
- project.once("all", function(event, model, collection, options){
- that.objectChange(event, model, collection, options);
- });
- project.get("nodes").once("all", function(event, model, collection, options){
- that.objectChange(event, model, collection, options);
- });
- project.get("edges").once("all", function(event, model, collection, options){
- that.objectChange(event, model, collection, options);
- });
- project.get("views").once("all", function(event, model, collection, options){
- that.objectChange(event, model, collection, options);
- });
-
- };
-
- proto.setProject = function(project) {
-
- console.log("project", project);
-
- var projectFields = ["title", "description", "uri"];
- var that = this;
-
- var bind_field_index = function(fi){
- var field = projectFields[fi];
- project.bind("change:"+field, function(obj, c) {
- console.log(c);
- var values = {
- id: obj.id,
- _type: "project",
- _project_id: obj.id,
- _user_id : (that.project.current_user!==null)?that.project.current_user.id:null
- };
- values[field] = c;
- that.collab.sendSync("project", values);
- });
- };
- for(var fieldIndex in projectFields) {
- bind_field_index(fieldIndex);
- }
-
-
- project.get("nodes").bind("add", function(obj, c, options) {
- that.addObjectBind("node", obj, c, options, that.collab);
- });
-
- project.get("nodes").bind("remove", function(obj, c, options) {
- that.removeObjectBind("node", obj, c, options, that.collab);
- });
-
- project.get("nodes").bind("change", function(obj, options) {
- that.updateObjectBind("node", obj, options, that.collab);
- });
-
- project.get("users").bind("add", function(obj, c, options) {
- that.addObjectBind("user", obj, c, options, that.collab);
- });
-
- project.get("users").bind("remove", function(obj, c, options) {
- that.removeObjectBind("user", obj, c, options, that.collab);
- });
-
- project.get("users").bind("change", function(obj, options) {
- that.updateObjectBind("user", obj, options, that.collab);
- });
-
- project.get("edges").bind("add", function(obj, c, options) {
- that.addObjectBind("edge", obj, c, options, that.collab);
- });
-
- project.get("edges").bind("remove", function(obj, c, options) {
- that.removeObjectBind("edge", obj, c, options, that.collab);
- });
-
- project.get("edges").bind("change", function(obj, options) {
- that.updateObjectBind("edge", obj, options, that.collab);
- });
-
- project.get("views").bind("add", function(obj, c, options) {
- that.addObjectBind("view", obj, c, options, that.collab);
- });
-
- project.get("views").bind("remove", function(obj, c, options) {
- that.removeObjectBind("view", obj, c, options, that.collab);
- });
-
- project.get("views").bind("change", function(obj, options) {
- that.updateObjectBind("view", obj, options, that.collab);
- });
-
-
- };
-
-
- /**
- * Called when a remote data store for project changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * TODO: manage project list change on server
- * @param args Cooperative web event
- */
- proto.onRemoteProjectChange = function(args) {
- console.log("Remote project change", args);
- if (args.type === "update") {
- this.onRemoteProjectUpdate(args.value, args.position);
- }
- };
-
-
- /**
- * Called when a remote data store for nodes changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteObjectChange = function(field, args) {
-
- console.log("Remote "+ field +" change",args);
- if (args.type === "insert") {
- this.onRemoteObjectInsert(field, args.value, args.position);
- } else if (args.type === "update") {
- this.onRemoteObjectUpdate(field, args.value, args.position);
- } else if (args.type === "delete") {
- this.onRemoteObjectDelete(field, args.position);
- }
- };
-
-
- /**
- * Called when a remote data store for nodes changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteNodeChange = function(args) {
- this.onRemoteObjectChange("nodes", args);
- };
-
-
- /**
- * Called when a remote data store for nodes changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteUserChange = function(args) {
- this.onRemoteObjectChange("users", args);
- };
-
- /**
- * Called when a remote data store for nodes changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteEdgeChange = function(args) {
- this.onRemoteObjectChange("edges", args);
- };
-
- /**
- * Called when a remote data store for views changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteViewChange = function(args) {
- this.onRemoteObjectChange("views", args);
- };
-
-
- /**
- * Called when a remote data store for nodes changes in some manner. Dispatches to
- * local methods for insert, update, delete handling.
- * @param args Cooperative web event
- */
- proto.onRemoteRosterChange = function(args) {
- this.onRemoteObjectChange(this.renkan.current_user_list, args);
- };
-
- /**
- * Called when a project attribute changes value in a remote data store.
- * Updates the attribute value of the item with the same id in the local
- * data store.
- *
- * @param value Item data sent by remote data store
- * @param position Which item to update.
- */
- proto.onRemoteProjectUpdate = function(values, position) {
- var project_id = values.id;
- if(typeof(project_id) === "undefined") {
- return;
- }
-
- if(this.project !== null && project_id === this.project.id) {
- for(var fieldname in values) {
- if(fieldname != "id" && fieldname != "type") {
- this.project.set(fieldname, values[fieldname]);
- }
- }
- }
-
- };
-
- /**
- * Called when an object is inserted in a remote data store.
- *
- * @param field_coll A collection or a string for one of the project collection
- * @param value Item data sent by remote data store
- * @param position Which item to update.
- */
- proto.onRemoteObjectInsert = function(field_coll, values, position) {
-
- console.log("Remote ", field_coll ," insert values ", values, "position", position);
-
- var coll = null;
- if(typeof field_coll === "string") {
- coll = this.project.get(field_coll);
- }
- else {
- coll = field_coll;
- }
-
- var object_id = values.id;
-
- var obj = coll.get(object_id);
-
- if(obj !== null && typeof obj !== "undefined") {
- this.onRemoteObjectUpdate(field_coll, values, coll.indexOf(obj));
- }
- else {
- var add_values = {};
- for(var fieldname in values) {
- if(fieldname == "_id" || fieldname[0] !== '_' ) {
- add_values[fieldname] = values[fieldname];
- }
- }
- switch(field_coll) {
- case "nodes":
- this.project.addNode(add_values, {at:position});
- break;
- case "edges":
- this.project.addEdge(add_values, {at:position});
- break;
- case "users":
- this.project.addUser(add_values, {at:position});
- break;
- case "views":
- this.project.addView(add_values, {at:position});
- break;
- default:
- add_values.project = this.project;
- coll.push(add_values, {at:position});
- break;
- }
-
- }
-
- };
-
- /**
- * Called when a object attribute changes value in a remote data store.
- * Updates the attribute value of the item with the same id in the local
- * data store.
- *
- * @param field_coll A collection or a string for one of the project collection
- * @param value Item data sent by remote data store
- * @param position Which item to update.
- */
- proto.onRemoteObjectUpdate = function(field_coll, values, position) {
-
- console.log("Remote ", field_coll ," update values ", values, "position", position);
-
- var coll = null;
- if(typeof field_coll === "string") {
- coll = this.project.get(field_coll);
- }
- else {
- coll = field_coll;
- }
-
- var object_id = values.id;
-
- if(this.project !== null) {
- var obj = coll.get(object_id);
- if(obj !== null && typeof obj !== "undefined") {
- var changed_val = {};
- for(var fieldname in values) {
- if(fieldname != "id" && fieldname != "type" && fieldname != "_id") {
- changed_val[fieldname] = values[fieldname];
- }
- }
- obj.set(changed_val);
- }
- }
- };
-
- /**
- * Called when a object is deleted in a remote data store.
- *
- * @param field_coll A collection or a string for one of the project collection
- * @param position Which item to update.
- */
- proto.onRemoteObjectDelete = function(field_coll, position) {
- console.log("Remote ", field_coll," delete position", position);
- var coll = null;
- if(typeof field_coll === "string") {
- coll = this.project.get(field);
- }
- else {
- coll = field_coll;
- }
-
- coll.remove(coll.at(position));
- };
-
-
- var app = new CoRenkan();
- dojo.ready(function() {
- app.init();
- });
-
-
- return {
- app: app
- };
-});
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/js/thymol.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,376 +0,0 @@
-/*-------------------- Thymol - the flavour of Thymeleaf --------------------*
-
- Thymol version 0.1.2 Copyright 2012 James J. Benson.
- jjbenson .AT. users.sf.net
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" basis,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either expressed or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
- *---------------------------------------------------------------------------*/
-
-var thURL = "http://www.thymeleaf.org";
-var thPrefix = "th";
-var thProtocol = "file:///";
-var thCache = new Object;
-
-$(function() {
- thymol();
-});
-
-var thymol = function() {
-
- var urlParams = {};
- (function() {
- var e, a = /\+/g, r = /([^&=]+)=?([^&]*)/g, d = function(s) {
- return decodeURIComponent(s.replace(a, " "));
- }, f = function(s) {
- return new Param(d(s));
- }, q = window.location.search.substring(1);
- while (e = r.exec(q)) {
- urlParams[d(e[1])] = f(e[2]);
- }
- })();
-
- var debug = getThParam("thDebug",true,false);
- var root = getThParam("thRoot",false,true);
- var path = getThParam("thPath",false,true);
-
- $.ajaxSetup({
- async : false,
- isLocal : true
- });
-
- (function() {
- var htmlTag = $("html")[0];
- $(htmlTag.attributes).each(function() {
- if (thURL == this.value) {
- var nsspec = this.localName.split(":");
- if (nsspec.length > 0) {
- thPrefix = nsspec[nsspec.length - 1];
- return;
- }
- }
- });
- })();
-
- var thIncl = new ThObj("include");
- var thSubs = new ThObj("substituteby");
- var thIf = new ThObj("if");
- var thUnless = new ThObj("unless");
- var thSwitch = new ThObj("switch");
- var thCase = new ThObj("case");
-
- var thFragEscp = "[" + thPrefix + "\\:fragment='";
- var base = new ThNode(document, false, null, null, null, document.nodeName, "::", false, document);
- process(base);
- return;
-
- function process(base) {
- var n = base;
- while (n.thDoc) {
- getChildren(n);
- if (n.firstChild && n.firstChild.thDoc && !n.visited) {
- n.visited = true;
- n = n.firstChild;
- }
- else {
- doReplace(n.isNode, n.element, n.thDoc);
- if (n.nextSibling && n.nextSibling.thDoc) {
- n = n.nextSibling;
- }
- else {
- if (n == base)
- break;
- else {
- n = n.parentDoc;
- }
- }
- }
- }
- }
-
- function getChildren(base) {
- var thIfSpecs = $(thIf.escp, base.thDoc);
- var thUnlessSpecs = $(thUnless.escp, base.thDoc);
- var thSwitchSpecs = $(thSwitch.escp, base.thDoc);
- var ths = $(thIfSpecs).add(thUnlessSpecs).add(thSwitchSpecs);
- ths.each(function() {
- var element = this;
- $(element.attributes).each(function() {
- var thAttr = this;
- if (thIf.name == thAttr.name || thUnless.name == thAttr.name || thSwitch.name == thAttr.name) {
- processConditional(element, base, thAttr);
- }
- });
- });
- var thInclSpecs = $(thIncl.escp, base.thDoc);
- var thSubsSpecs = $(thSubs.escp, base.thDoc);
- ths = $(thInclSpecs).add(thSubsSpecs);
- var count = 0;
- var last = null;
- ths.each(function() {
- var element = this;
- $(element.attributes).each(function() {
- var thAttr = this;
- if (thIncl.name == thAttr.name || thSubs.name == thAttr.name) {
- var child = processImport(element, base, thAttr);
- if( child != null ) {
- if (count == 0) {
- base.firstChild = child;
- }
- else {
- last.nextSibling = child;
- }
- last = child;
- count++;
- }
- }
- });
- });
- }
-
- function processConditional(element, base, attr) {
- var args = attr.value.match(/[$\*#]{(!?.*)}/);
- var processed = false;
- if (args.length > 0) {
- var param = args[1];
- if (thSwitch.name == attr.name) {
- processed = processSwitch(element, base, attr, param);
- }
- else {
- var negate = false;
- if (args[1].charAt(0) == '!') {
- negate = true;
- param = args[1].substring(1);
- }
- if ((!negate && isTrue(param)) || (negate && !isTrue(param))) {
- if (thUnless.name == attr.name) { // true for "if" and
- // false for "unless"
- element.innerHTML = "";
- }
- processed = true;
- }
- else {
- if (thIf.name == attr.name) { // false for "if", true for
- // "unless"
- element.innerHTML = "";
- }
- processed = true;
- }
-
- }
- }
- if (!processed && debug) {
- window.alert("thymol.processConditional cannot process: " + attr.name + "=\"" + attr.value + "\"\n" + element.innerHTML);
- }
- element.removeAttribute(attr.name);
- }
-
- function processSwitch(element, base, attr, param) {
- var matched = false;
- var haveDefault = false;
- var thCaseSpecs = $(thCase.escp, element);
- thCaseSpecs.each(function() {
- var caseClause = this;
- var remove = true;
- $(caseClause.attributes).each(function() {
- var ccAttr = this;
- if (thCase.name == ccAttr.name) {
- if (!matched) {
- var s = urlParams[param];
- if (ccAttr.value == "*" || (s && (s.getStringValue() == ccAttr.value))) {
- matched = true;
- remove = false;
- }
- }
- caseClause.removeAttribute(ccAttr.name);
- }
- });
- if (remove) {
- caseClause.innerHTML = "";
- }
- });
- return matched;
- }
-
- function processImport(element, base, attr) {
- var importNode = null;
- var filePart = null;
- var fragmentPart = "::";
- if (attr.value.indexOf("::") < 0) {
- filePart = getFilePart(attr.value);
- }
- else {
- var names = attr.value.split("::");
- filePart = getFilePart(names[0].trim());
- fragmentPart = substitute(names[1].trim());
- }
- var isNode = (thSubs.name == attr.localName);
- if (thCache[filePart] != null && thCache[filePart][fragmentPart] != null) {
- isNode = ((thSubs.name == attr.localName) || (fragmentPart == "::"));
- importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
- }
- else {
- var fileName = filePart + ".html";
- $.get(fileName, function(content, status) {
- if ("success" == status) {
- if (thCache[filePart] == null) {
- thCache[filePart] = new Object;
- }
- if (fragmentPart == "::") {
- var htmlContent = $("html", content)[0];
- thCache[filePart][fragmentPart] = htmlContent;
- }
- else {
- var fragSpec = thFragEscp + fragmentPart + "']";
- var fragArray = $(fragSpec, content);
- $(fragArray).each(function() {
- thCache[filePart][fragmentPart] = this;
- });
- }
- importNode = new ThNode(thCache[filePart][fragmentPart], false, base, null, null, filePart, fragmentPart, isNode, element);
- }
- else if (debug) {
- window.alert("file read failed: " + filePart + " fragment: " + fragmentPart);
- }
- }, "xml");
- if (importNode == null && debug) {
- window.alert("fragment import failed: " + filePart + " fragment: " + fragmentPart);
- }
- }
- element.removeAttribute(attr.name);
- return importNode;
- }
-
- function getFilePart(part) {
- var result = substitute(part);
- if( result.charAt(0) != '.' ) { // Initial period character indicates a relative path
- if( result.indexOf('/') >= 0 ) { // If it doesn't start with a '.', and there are no path separators, it's also treated as relative
- result = thProtocol + root + path + result;
- }
- }
- return result;
- }
-
- function doReplace(isNode, element, content) {
- if (isNode) {
- element.parentNode.replaceChild(content.cloneNode(true), element);
- }
- else {
- try {
- element.innerHTML = content.innerHTML;
- }
- catch (err) { // Work-around for IE
- while (element.firstChild != null) {
- element.removeChild(element.firstChild);
- }
- for (i = 0; i < content.childNodes.length; i++) {
- element.appendChild(content.childNodes[i].cloneNode(true));
- }
- }
- }
- }
-
- function ThNode(thDoc, visited, parentDoc, firstChild, nextSibling, fileName, fragName, isNode, element) {
- this.thDoc = thDoc;
- this.visited = visited;
- this.parentDoc = parentDoc;
- this.firstChild = firstChild;
- this.nextSibling = nextSibling;
- this.fileName = fileName;
- this.fragName = fragName;
- this.isNode = isNode;
- this.element = element;
- }
-
- function ThObj(suffix) {
- this.name = thPrefix + ":" + suffix;
- this.escp = "[" + thPrefix + "\\:" + suffix + "]";
- }
-
- function Param(valueArg) {
- this.value = valueArg;
- this.getBooleanValue = function() {
- return !(this.value == "false" || this.value == "off" || this.value == "no");
- };
- this.getStringValue = function() {
- return this.value;
- };
- this.getNumericValue = function() {
- return Number(this.value);
- };
- }
-
- function isTrue(arg) {
- var p = urlParams[arg];
- if (p) {
- return p.getBooleanValue();
- }
- return false;
- }
-
- function substitute(argValue) {
- var result = argValue;
- var args = argValue.match(/[$\*#]{(!?.*)}/);
- if (args != null && args.length > 0) {
- var param = args[1];
- if(param) {
- var paramValue = urlParams[param];
- if (paramValue) {
- result = paramValue.value;
- }
- }
- }
- return result;
- }
-
- function getThParam(paramName,isBoolean,isPath) {
- var localValue;
- if( isBoolean ) {
- localValue = false;
- }
- else {
- localValue = "";
- }
- var theParam = urlParams[paramName];
- if (isBoolean && theParam) {
- localValue = theParam.getBooleanValue();
- }
- else {
- var paramValue;
- try {
- paramValue = eval(paramName);
- if( !(typeof paramValue === "undefined") ) {
- if( paramValue != null ) {
- if ( isBoolean ) {
- localValue = (paramValue==true);
- }
- else {
- localValue = paramValue;
- }
- }
- }
- }
- catch (err) {
- if (err instanceof ReferenceError) {
- }
- if (err instanceof EvalError) {
- }
- }
- }
- if( !isBoolean && isPath && localValue.length > 0 && localValue.charAt(localValue.length-1) != '/' ) {
- localValue = localValue + '/';
- }
- return localValue;
- }
-
-};
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/URI.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,93 +0,0 @@
-/*! URI.js v1.13.2 http://medialize.github.io/URI.js/ */
-/* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URITemplate.js, jquery.URI.js, URI.fragmentQuery.js */
-(function(f,g){"object"===typeof exports?module.exports=g():"function"===typeof define&&define.amd?define(g):f.IPv6=g(f)})(this,function(f){var g=f&&f.IPv6;return{best:function(f){f=f.toLowerCase().split(":");var k=f.length,b=8;""===f[0]&&""===f[1]&&""===f[2]?(f.shift(),f.shift()):""===f[0]&&""===f[1]?f.shift():""===f[k-1]&&""===f[k-2]&&f.pop();k=f.length;-1!==f[k-1].indexOf(".")&&(b=7);var g;for(g=0;g<k&&""!==f[g];g++);if(g<b)for(f.splice(g,1,"0000");f.length<b;)f.splice(g,0,"0000");for(g=0;g<b;g++){for(var k=
-f[g].split(""),r=0;3>r;r++)if("0"===k[0]&&1<k.length)k.splice(0,1);else break;f[g]=k.join("")}var k=-1,q=r=0,h=-1,w=!1;for(g=0;g<b;g++)w?"0"===f[g]?q+=1:(w=!1,q>r&&(k=h,r=q)):"0"===f[g]&&(w=!0,h=g,q=1);q>r&&(k=h,r=q);1<r&&f.splice(k,r,"");k=f.length;b="";""===f[0]&&(b=":");for(g=0;g<k;g++){b+=f[g];if(g===k-1)break;b+=":"}""===f[k-1]&&(b+=":");return b},noConflict:function(){f.IPv6===this&&(f.IPv6=g);return this}}});
-(function(f){function g(a){throw RangeError(z[a]);}function s(a,c){for(var d=a.length;d--;)a[d]=c(a[d]);return a}function k(a,c){return s(a.split(p),c).join(".")}function b(a){for(var c=[],d=0,b=a.length,p,e;d<b;)p=a.charCodeAt(d++),55296<=p&&56319>=p&&d<b?(e=a.charCodeAt(d++),56320==(e&64512)?c.push(((p&1023)<<10)+(e&1023)+65536):(c.push(p),d--)):c.push(p);return c}function u(a){return s(a,function(a){var c="";65535<a&&(a-=65536,c+=D(a>>>10&1023|55296),a=56320|a&1023);return c+=D(a)}).join("")}function r(a,
-c){return a+22+75*(26>a)-((0!=c)<<5)}function q(a,c,d){var b=0;a=d?B(a/H):a>>1;for(a+=B(a/c);a>v*y>>1;b+=l)a=B(a/v);return B(b+(v+1)*a/(a+E))}function h(c){var d=[],b=c.length,p,e=0,f=F,z=C,h,m,v,n,k;h=c.lastIndexOf(a);0>h&&(h=0);for(m=0;m<h;++m)128<=c.charCodeAt(m)&&g("not-basic"),d.push(c.charCodeAt(m));for(h=0<h?h+1:0;h<b;){m=e;p=1;for(v=l;;v+=l){h>=b&&g("invalid-input");n=c.charCodeAt(h++);n=10>n-48?n-22:26>n-65?n-65:26>n-97?n-97:l;(n>=l||n>B((t-e)/p))&&g("overflow");e+=n*p;k=v<=z?x:v>=z+y?y:
-v-z;if(n<k)break;n=l-k;p>B(t/n)&&g("overflow");p*=n}p=d.length+1;z=q(e-m,p,0==m);B(e/p)>t-f&&g("overflow");f+=B(e/p);e%=p;d.splice(e++,0,f)}return u(d)}function w(c){var d,p,e,f,z,h,m,n,v,k=[],w,s,A;c=b(c);w=c.length;d=F;p=0;z=C;for(h=0;h<w;++h)v=c[h],128>v&&k.push(D(v));for((e=f=k.length)&&k.push(a);e<w;){m=t;for(h=0;h<w;++h)v=c[h],v>=d&&v<m&&(m=v);s=e+1;m-d>B((t-p)/s)&&g("overflow");p+=(m-d)*s;d=m;for(h=0;h<w;++h)if(v=c[h],v<d&&++p>t&&g("overflow"),v==d){n=p;for(m=l;;m+=l){v=m<=z?x:m>=z+y?y:m-z;
-if(n<v)break;A=n-v;n=l-v;k.push(D(r(v+A%n,0)));n=B(A/n)}k.push(D(r(n,0)));z=q(p,s,e==f);p=0;++e}++p;++d}return k.join("")}var A="object"==typeof exports&&exports,m="object"==typeof module&&module&&module.exports==A&&module,n="object"==typeof global&&global;if(n.global===n||n.window===n)f=n;var e,t=2147483647,l=36,x=1,y=26,E=38,H=700,C=72,F=128,a="-",c=/^xn--/,d=/[^ -~]/,p=/\x2E|\u3002|\uFF0E|\uFF61/g,z={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)",
-"invalid-input":"Invalid input"},v=l-x,B=Math.floor,D=String.fromCharCode,G;e={version:"1.2.3",ucs2:{decode:b,encode:u},decode:h,encode:w,toASCII:function(a){return k(a,function(a){return d.test(a)?"xn--"+w(a):a})},toUnicode:function(a){return k(a,function(a){return c.test(a)?h(a.slice(4).toLowerCase()):a})}};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define(function(){return e});else if(A&&!A.nodeType)if(m)m.exports=e;else for(G in e)e.hasOwnProperty(G)&&(A[G]=e[G]);else f.punycode=
-e})(this);
-(function(f,g){"object"===typeof exports?module.exports=g():"function"===typeof define&&define.amd?define(g):f.SecondLevelDomains=g(f)})(this,function(f){var g=f&&f.SecondLevelDomains,s={list:{ac:" com gov mil net org ",ae:" ac co gov mil name net org pro sch ",af:" com edu gov net org ",al:" com edu gov mil net org ",ao:" co ed gv it og pb ",ar:" com edu gob gov int mil net org tur ",at:" ac co gv or ",au:" asn com csiro edu gov id net org ",ba:" co com edu gov mil net org rs unbi unmo unsa untz unze ",bb:" biz co com edu gov info net org store tv ",
-bh:" biz cc com edu gov info net org ",bn:" com edu gov net org ",bo:" com edu gob gov int mil net org tv ",br:" adm adv agr am arq art ato b bio blog bmd cim cng cnt com coop ecn edu eng esp etc eti far flog fm fnd fot fst g12 ggf gov imb ind inf jor jus lel mat med mil mus net nom not ntr odo org ppg pro psc psi qsl rec slg srv tmp trd tur tv vet vlog wiki zlg ",bs:" com edu gov net org ",bz:" du et om ov rg ",ca:" ab bc mb nb nf nl ns nt nu on pe qc sk yk ",ck:" biz co edu gen gov info net org ",
-cn:" ac ah bj com cq edu fj gd gov gs gx gz ha hb he hi hl hn jl js jx ln mil net nm nx org qh sc sd sh sn sx tj tw xj xz yn zj ",co:" com edu gov mil net nom org ",cr:" ac c co ed fi go or sa ",cy:" ac biz com ekloges gov ltd name net org parliament press pro tm ","do":" art com edu gob gov mil net org sld web ",dz:" art asso com edu gov net org pol ",ec:" com edu fin gov info med mil net org pro ",eg:" com edu eun gov mil name net org sci ",er:" com edu gov ind mil net org rochest w ",es:" com edu gob nom org ",
-et:" biz com edu gov info name net org ",fj:" ac biz com info mil name net org pro ",fk:" ac co gov net nom org ",fr:" asso com f gouv nom prd presse tm ",gg:" co net org ",gh:" com edu gov mil org ",gn:" ac com gov net org ",gr:" com edu gov mil net org ",gt:" com edu gob ind mil net org ",gu:" com edu gov net org ",hk:" com edu gov idv net org ",id:" ac co go mil net or sch web ",il:" ac co gov idf k12 muni net org ","in":" ac co edu ernet firm gen gov i ind mil net nic org res ",iq:" com edu gov i mil net org ",
-ir:" ac co dnssec gov i id net org sch ",it:" edu gov ",je:" co net org ",jo:" com edu gov mil name net org sch ",jp:" ac ad co ed go gr lg ne or ",ke:" ac co go info me mobi ne or sc ",kh:" com edu gov mil net org per ",ki:" biz com de edu gov info mob net org tel ",km:" asso com coop edu gouv k medecin mil nom notaires pharmaciens presse tm veterinaire ",kn:" edu gov net org ",kr:" ac busan chungbuk chungnam co daegu daejeon es gangwon go gwangju gyeongbuk gyeonggi gyeongnam hs incheon jeju jeonbuk jeonnam k kg mil ms ne or pe re sc seoul ulsan ",
-kw:" com edu gov net org ",ky:" com edu gov net org ",kz:" com edu gov mil net org ",lb:" com edu gov net org ",lk:" assn com edu gov grp hotel int ltd net ngo org sch soc web ",lr:" com edu gov net org ",lv:" asn com conf edu gov id mil net org ",ly:" com edu gov id med net org plc sch ",ma:" ac co gov m net org press ",mc:" asso tm ",me:" ac co edu gov its net org priv ",mg:" com edu gov mil nom org prd tm ",mk:" com edu gov inf name net org pro ",ml:" com edu gov net org presse ",mn:" edu gov org ",
-mo:" com edu gov net org ",mt:" com edu gov net org ",mv:" aero biz com coop edu gov info int mil museum name net org pro ",mw:" ac co com coop edu gov int museum net org ",mx:" com edu gob net org ",my:" com edu gov mil name net org sch ",nf:" arts com firm info net other per rec store web ",ng:" biz com edu gov mil mobi name net org sch ",ni:" ac co com edu gob mil net nom org ",np:" com edu gov mil net org ",nr:" biz com edu gov info net org ",om:" ac biz co com edu gov med mil museum net org pro sch ",
-pe:" com edu gob mil net nom org sld ",ph:" com edu gov i mil net ngo org ",pk:" biz com edu fam gob gok gon gop gos gov net org web ",pl:" art bialystok biz com edu gda gdansk gorzow gov info katowice krakow lodz lublin mil net ngo olsztyn org poznan pwr radom slupsk szczecin torun warszawa waw wroc wroclaw zgora ",pr:" ac biz com edu est gov info isla name net org pro prof ",ps:" com edu gov net org plo sec ",pw:" belau co ed go ne or ",ro:" arts com firm info nom nt org rec store tm www ",rs:" ac co edu gov in org ",
-sb:" com edu gov net org ",sc:" com edu gov net org ",sh:" co com edu gov net nom org ",sl:" com edu gov net org ",st:" co com consulado edu embaixada gov mil net org principe saotome store ",sv:" com edu gob org red ",sz:" ac co org ",tr:" av bbs bel biz com dr edu gen gov info k12 name net org pol tel tsk tv web ",tt:" aero biz cat co com coop edu gov info int jobs mil mobi museum name net org pro tel travel ",tw:" club com ebiz edu game gov idv mil net org ",mu:" ac co com gov net or org ",mz:" ac co edu gov org ",
-na:" co com ",nz:" ac co cri geek gen govt health iwi maori mil net org parliament school ",pa:" abo ac com edu gob ing med net nom org sld ",pt:" com edu gov int net nome org publ ",py:" com edu gov mil net org ",qa:" com edu gov mil net org ",re:" asso com nom ",ru:" ac adygeya altai amur arkhangelsk astrakhan bashkiria belgorod bir bryansk buryatia cbg chel chelyabinsk chita chukotka chuvashia com dagestan e-burg edu gov grozny int irkutsk ivanovo izhevsk jar joshkar-ola kalmykia kaluga kamchatka karelia kazan kchr kemerovo khabarovsk khakassia khv kirov koenig komi kostroma kranoyarsk kuban kurgan kursk lipetsk magadan mari mari-el marine mil mordovia mosreg msk murmansk nalchik net nnov nov novosibirsk nsk omsk orenburg org oryol penza perm pp pskov ptz rnd ryazan sakhalin samara saratov simbirsk smolensk spb stavropol stv surgut tambov tatarstan tom tomsk tsaritsyn tsk tula tuva tver tyumen udm udmurtia ulan-ude vladikavkaz vladimir vladivostok volgograd vologda voronezh vrn vyatka yakutia yamal yekaterinburg yuzhno-sakhalinsk ",
-rw:" ac co com edu gouv gov int mil net ",sa:" com edu gov med net org pub sch ",sd:" com edu gov info med net org tv ",se:" a ac b bd c d e f g h i k l m n o org p parti pp press r s t tm u w x y z ",sg:" com edu gov idn net org per ",sn:" art com edu gouv org perso univ ",sy:" com edu gov mil net news org ",th:" ac co go in mi net or ",tj:" ac biz co com edu go gov info int mil name net nic org test web ",tn:" agrinet com defense edunet ens fin gov ind info intl mincom nat net org perso rnrt rns rnu tourism ",
-tz:" ac co go ne or ",ua:" biz cherkassy chernigov chernovtsy ck cn co com crimea cv dn dnepropetrovsk donetsk dp edu gov if in ivano-frankivsk kh kharkov kherson khmelnitskiy kiev kirovograd km kr ks kv lg lugansk lutsk lviv me mk net nikolaev od odessa org pl poltava pp rovno rv sebastopol sumy te ternopil uzhgorod vinnica vn zaporizhzhe zhitomir zp zt ",ug:" ac co go ne or org sc ",uk:" ac bl british-library co cym gov govt icnet jet lea ltd me mil mod national-library-scotland nel net nhs nic nls org orgn parliament plc police sch scot soc ",
-us:" dni fed isa kids nsn ",uy:" com edu gub mil net org ",ve:" co com edu gob info mil net org web ",vi:" co com k12 net org ",vn:" ac biz com edu gov health info int name net org pro ",ye:" co com gov ltd me net org plc ",yu:" ac co edu gov org ",za:" ac agric alt bourse city co cybernet db edu gov grondar iaccess imt inca landesign law mil net ngo nis nom olivetti org pix school tm web ",zm:" ac co com edu gov net org sch "},has:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return!1;
-var g=f.lastIndexOf(".",b-1);if(0>=g||g>=b-1)return!1;var r=s.list[f.slice(b+1)];return r?0<=r.indexOf(" "+f.slice(g+1,b)+" "):!1},is:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1||0<=f.lastIndexOf(".",b-1))return!1;var g=s.list[f.slice(b+1)];return g?0<=g.indexOf(" "+f.slice(0,b)+" "):!1},get:function(f){var b=f.lastIndexOf(".");if(0>=b||b>=f.length-1)return null;var g=f.lastIndexOf(".",b-1);if(0>=g||g>=b-1)return null;var r=s.list[f.slice(b+1)];return!r||0>r.indexOf(" "+f.slice(g+
-1,b)+" ")?null:f.slice(g+1)},noConflict:function(){f.SecondLevelDomains===this&&(f.SecondLevelDomains=g);return this}};return s});
-(function(f,g){"object"===typeof exports?module.exports=g(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],g):f.URI=g(f.punycode,f.IPv6,f.SecondLevelDomains,f)})(this,function(f,g,s,k){function b(a,c){if(!(this instanceof b))return new b(a,c);void 0===a&&(a="undefined"!==typeof location?location.href+"":"");this.href(a);return void 0!==c?this.absoluteTo(c):this}function u(a){return a.replace(/([.*+?^=!:${}()|[\]\/\\])/g,
-"\\$1")}function r(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function q(a){return"Array"===r(a)}function h(a,c){var d,b;if(q(c)){d=0;for(b=c.length;d<b;d++)if(!h(a,c[d]))return!1;return!0}var e=r(c);d=0;for(b=a.length;d<b;d++)if("RegExp"===e){if("string"===typeof a[d]&&a[d].match(c))return!0}else if(a[d]===c)return!0;return!1}function w(a,c){if(!q(a)||!q(c)||a.length!==c.length)return!1;a.sort();c.sort();for(var d=0,b=a.length;d<b;d++)if(a[d]!==c[d])return!1;
-return!0}function A(a){return escape(a)}function m(a){return encodeURIComponent(a).replace(/[!'()*]/g,A).replace(/\*/g,"%2A")}var n=k&&k.URI;b.version="1.13.2";var e=b.prototype,t=Object.prototype.hasOwnProperty;b._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:b.duplicateQueryParameters,escapeQuerySpace:b.escapeQuerySpace}};b.duplicateQueryParameters=!1;b.escapeQuerySpace=!0;b.protocol_expression=
-/^[a-z][a-z0-9.+-]*$/i;b.idn_expression=/[^a-z0-9\.-]/i;b.punycode_expression=/(xn--)/i;b.ip4_expression=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;b.ip6_expression=/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/;
-b.find_uri_expression=/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u2018\u2019]))/ig;b.findUri={start:/\b(?:([a-z][a-z0-9.+-]*:\/\/)|www\.)/gi,end:/[\s\r\n]|$/,trim:/[`!()\[\]{};:'".,<>?\u00ab\u00bb\u201c\u201d\u201e\u2018\u2019]+$/};b.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};b.invalid_hostname_characters=
-/[^a-zA-Z0-9\.-]/;b.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"};b.getDomAttribute=function(a){if(a&&a.nodeName){var c=a.nodeName.toLowerCase();return"input"===c&&"image"!==a.type?void 0:b.domAttributes[c]}};b.encode=m;b.decode=decodeURIComponent;b.iso8859=function(){b.encode=escape;b.decode=unescape};b.unicode=function(){b.encode=m;b.decode=decodeURIComponent};b.characters=
-{pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\/\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}};b.encodeQuery=
-function(a,c){var d=b.encode(a+"");void 0===c&&(c=b.escapeQuerySpace);return c?d.replace(/%20/g,"+"):d};b.decodeQuery=function(a,c){a+="";void 0===c&&(c=b.escapeQuerySpace);try{return b.decode(c?a.replace(/\+/g,"%20"):a)}catch(d){return a}};b.recodePath=function(a){a=(a+"").split("/");for(var c=0,d=a.length;c<d;c++)a[c]=b.encodePathSegment(b.decode(a[c]));return a.join("/")};b.decodePath=function(a){a=(a+"").split("/");for(var c=0,d=a.length;c<d;c++)a[c]=b.decodePathSegment(a[c]);return a.join("/")};
-var l={encode:"encode",decode:"decode"},x,y=function(a,c){return function(d){return b[c](d+"").replace(b.characters[a][c].expression,function(d){return b.characters[a][c].map[d]})}};for(x in l)b[x+"PathSegment"]=y("pathname",l[x]);b.encodeReserved=y("reserved","encode");b.parse=function(a,c){var d;c||(c={});d=a.indexOf("#");-1<d&&(c.fragment=a.substring(d+1)||null,a=a.substring(0,d));d=a.indexOf("?");-1<d&&(c.query=a.substring(d+1)||null,a=a.substring(0,d));"//"===a.substring(0,2)?(c.protocol=null,
-a=a.substring(2),a=b.parseAuthority(a,c)):(d=a.indexOf(":"),-1<d&&(c.protocol=a.substring(0,d)||null,c.protocol&&!c.protocol.match(b.protocol_expression)?c.protocol=void 0:"file"===c.protocol?a=a.substring(d+3):"//"===a.substring(d+1,d+3)?(a=a.substring(d+3),a=b.parseAuthority(a,c)):(a=a.substring(d+1),c.urn=!0)));c.path=a;return c};b.parseHost=function(a,c){var d=a.indexOf("/"),b;-1===d&&(d=a.length);"["===a.charAt(0)?(b=a.indexOf("]"),c.hostname=a.substring(1,b)||null,c.port=a.substring(b+2,d)||
-null,"/"===c.port&&(c.port=null)):a.indexOf(":")!==a.lastIndexOf(":")?(c.hostname=a.substring(0,d)||null,c.port=null):(b=a.substring(0,d).split(":"),c.hostname=b[0]||null,c.port=b[1]||null);c.hostname&&"/"!==a.substring(d).charAt(0)&&(d++,a="/"+a);return a.substring(d)||"/"};b.parseAuthority=function(a,c){a=b.parseUserinfo(a,c);return b.parseHost(a,c)};b.parseUserinfo=function(a,c){var d=a.indexOf("/"),p=-1<d?a.lastIndexOf("@",d):a.indexOf("@");-1<p&&(-1===d||p<d)?(d=a.substring(0,p).split(":"),c.username=
-d[0]?b.decode(d[0]):null,d.shift(),c.password=d[0]?b.decode(d.join(":")):null,a=a.substring(p+1)):(c.username=null,c.password=null);return a};b.parseQuery=function(a,c){if(!a)return{};a=a.replace(/&+/g,"&").replace(/^\?*&*|&+$/g,"");if(!a)return{};for(var d={},p=a.split("&"),e=p.length,f,h,m=0;m<e;m++)f=p[m].split("="),h=b.decodeQuery(f.shift(),c),f=f.length?b.decodeQuery(f.join("="),c):null,d[h]?("string"===typeof d[h]&&(d[h]=[d[h]]),d[h].push(f)):d[h]=f;return d};b.build=function(a){var c="";a.protocol&&
-(c+=a.protocol+":");a.urn||!c&&!a.hostname||(c+="//");c+=b.buildAuthority(a)||"";"string"===typeof a.path&&("/"!==a.path.charAt(0)&&"string"===typeof a.hostname&&(c+="/"),c+=a.path);"string"===typeof a.query&&a.query&&(c+="?"+a.query);"string"===typeof a.fragment&&a.fragment&&(c+="#"+a.fragment);return c};b.buildHost=function(a){var c="";if(a.hostname)c=b.ip6_expression.test(a.hostname)?c+("["+a.hostname+"]"):c+a.hostname;else return"";a.port&&(c+=":"+a.port);return c};b.buildAuthority=function(a){return b.buildUserinfo(a)+
-b.buildHost(a)};b.buildUserinfo=function(a){var c="";a.username&&(c+=b.encode(a.username),a.password&&(c+=":"+b.encode(a.password)),c+="@");return c};b.buildQuery=function(a,c,d){var p="",f,e,h,m;for(e in a)if(t.call(a,e)&&e)if(q(a[e]))for(f={},h=0,m=a[e].length;h<m;h++)void 0!==a[e][h]&&void 0===f[a[e][h]+""]&&(p+="&"+b.buildQueryParameter(e,a[e][h],d),!0!==c&&(f[a[e][h]+""]=!0));else void 0!==a[e]&&(p+="&"+b.buildQueryParameter(e,a[e],d));return p.substring(1)};b.buildQueryParameter=function(a,
-c,d){return b.encodeQuery(a,d)+(null!==c?"="+b.encodeQuery(c,d):"")};b.addQuery=function(a,c,d){if("object"===typeof c)for(var p in c)t.call(c,p)&&b.addQuery(a,p,c[p]);else if("string"===typeof c)void 0===a[c]?a[c]=d:("string"===typeof a[c]&&(a[c]=[a[c]]),q(d)||(d=[d]),a[c]=a[c].concat(d));else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");};b.removeQuery=function(a,c,d){var p;if(q(c))for(d=0,p=c.length;d<p;d++)a[c[d]]=void 0;else if("object"===typeof c)for(p in c)t.call(c,
-p)&&b.removeQuery(a,p,c[p]);else if("string"===typeof c)if(void 0!==d)if(a[c]===d)a[c]=void 0;else{if(q(a[c])){p=a[c];var e={},f,h;if(q(d))for(f=0,h=d.length;f<h;f++)e[d[f]]=!0;else e[d]=!0;f=0;for(h=p.length;f<h;f++)void 0!==e[p[f]]&&(p.splice(f,1),h--,f--);a[c]=p}}else a[c]=void 0;else throw new TypeError("URI.addQuery() accepts an object, string as the first parameter");};b.hasQuery=function(a,c,d,e){if("object"===typeof c){for(var f in c)if(t.call(c,f)&&!b.hasQuery(a,f,c[f]))return!1;return!0}if("string"!==
-typeof c)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");switch(r(d)){case "Undefined":return c in a;case "Boolean":return a=Boolean(q(a[c])?a[c].length:a[c]),d===a;case "Function":return!!d(a[c],c,a);case "Array":return q(a[c])?(e?h:w)(a[c],d):!1;case "RegExp":return q(a[c])?e?h(a[c],d):!1:Boolean(a[c]&&a[c].match(d));case "Number":d=String(d);case "String":return q(a[c])?e?h(a[c],d):!1:a[c]===d;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter");
-}};b.commonPath=function(a,c){var d=Math.min(a.length,c.length),b;for(b=0;b<d;b++)if(a.charAt(b)!==c.charAt(b)){b--;break}if(1>b)return a.charAt(0)===c.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(b)||"/"!==c.charAt(b))b=a.substring(0,b).lastIndexOf("/");return a.substring(0,b+1)};b.withinString=function(a,c,d){d||(d={});var e=d.start||b.findUri.start,f=d.end||b.findUri.end,h=d.trim||b.findUri.trim,m=/[a-z0-9-]=["']?$/i;for(e.lastIndex=0;;){var g=e.exec(a);if(!g)break;g=g.index;if(d.ignoreHtml){var n=
-a.slice(Math.max(g-3,0),g);if(n&&m.test(n))continue}var n=g+a.slice(g).search(f),l=a.slice(g,n).replace(h,"");d.ignore&&d.ignore.test(l)||(n=g+l.length,l=c(l,g,n,a),a=a.slice(0,g)+l+a.slice(n),e.lastIndex=g+l.length)}e.lastIndex=0;return a};b.ensureValidHostname=function(a){if(a.match(b.invalid_hostname_characters)){if(!f)throw new TypeError('Hostname "'+a+'" contains characters other than [A-Z0-9.-] and Punycode.js is not available');if(f.toASCII(a).match(b.invalid_hostname_characters))throw new TypeError('Hostname "'+
-a+'" contains characters other than [A-Z0-9.-]');}};b.noConflict=function(a){if(a)return a={URI:this.noConflict()},k.URITemplate&&"function"===typeof k.URITemplate.noConflict&&(a.URITemplate=k.URITemplate.noConflict()),k.IPv6&&"function"===typeof k.IPv6.noConflict&&(a.IPv6=k.IPv6.noConflict()),k.SecondLevelDomains&&"function"===typeof k.SecondLevelDomains.noConflict&&(a.SecondLevelDomains=k.SecondLevelDomains.noConflict()),a;k.URI===this&&(k.URI=n);return this};e.build=function(a){if(!0===a)this._deferred_build=
-!0;else if(void 0===a||this._deferred_build)this._string=b.build(this._parts),this._deferred_build=!1;return this};e.clone=function(){return new b(this)};e.valueOf=e.toString=function(){return this.build(!1)._string};l={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"};y=function(a){return function(c,d){if(void 0===c)return this._parts[a]||"";this._parts[a]=c||null;this.build(!d);return this}};for(x in l)e[x]=y(l[x]);l={query:"?",fragment:"#"};y=function(a,
-c){return function(d,b){if(void 0===d)return this._parts[a]||"";null!==d&&(d+="",d.charAt(0)===c&&(d=d.substring(1)));this._parts[a]=d;this.build(!b);return this}};for(x in l)e[x]=y(x,l[x]);l={search:["?","query"],hash:["#","fragment"]};y=function(a,c){return function(d,b){var e=this[a](d,b);return"string"===typeof e&&e.length?c+e:e}};for(x in l)e[x]=y(l[x][1],l[x][0]);e.pathname=function(a,c){if(void 0===a||!0===a){var d=this._parts.path||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}this._parts.path=
-a?b.recodePath(a):"/";this.build(!c);return this};e.path=e.pathname;e.href=function(a,c){var d;if(void 0===a)return this.toString();this._string="";this._parts=b._parts();var e=a instanceof b,f="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(f=b.getDomAttribute(a),a=a[f]||"",f=!1);!e&&f&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a)this._parts=b.parse(a,this._parts);else if(e||f)for(d in e=e?a._parts:a,e)t.call(this._parts,d)&&(this._parts[d]=e[d]);else throw new TypeError("invalid input");
-this.build(!c);return this};e.is=function(a){var c=!1,d=!1,e=!1,f=!1,h=!1,m=!1,g=!1,n=!this._parts.urn;this._parts.hostname&&(n=!1,d=b.ip4_expression.test(this._parts.hostname),e=b.ip6_expression.test(this._parts.hostname),c=d||e,h=(f=!c)&&s&&s.has(this._parts.hostname),m=f&&b.idn_expression.test(this._parts.hostname),g=f&&b.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return n;case "absolute":return!n;case "domain":case "name":return f;case "sld":return h;
-case "ip":return c;case "ip4":case "ipv4":case "inet4":return d;case "ip6":case "ipv6":case "inet6":return e;case "idn":return m;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return g}return null};var E=e.protocol,H=e.port,C=e.hostname;e.protocol=function(a,c){if(void 0!==a&&a&&(a=a.replace(/:(\/\/)?$/,""),!a.match(b.protocol_expression)))throw new TypeError('Protocol "'+a+"\" contains characters other than [A-Z0-9.+-] or doesn't start with [A-Z]");return E.call(this,
-a,c)};e.scheme=e.protocol;e.port=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError('Port "'+a+'" contains characters other than [0-9]');return H.call(this,a,c)};e.hostname=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var d={};b.parseHost(a,d);a=d.hostname}return C.call(this,a,c)};e.host=function(a,c){if(this._parts.urn)return void 0===a?"":this;
-if(void 0===a)return this._parts.hostname?b.buildHost(this._parts):"";b.parseHost(a,this._parts);this.build(!c);return this};e.authority=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?b.buildAuthority(this._parts):"";b.parseAuthority(a,this._parts);this.build(!c);return this};e.userinfo=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var d=b.buildUserinfo(this._parts);return d.substring(0,
-d.length-1)}"@"!==a[a.length-1]&&(a+="@");b.parseUserinfo(a,this._parts);this.build(!c);return this};e.resource=function(a,c){var d;if(void 0===a)return this.path()+this.search()+this.hash();d=b.parse(a);this._parts.path=d.path;this._parts.query=d.query;this._parts.fragment=d.fragment;this.build(!c);return this};e.subdomain=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.length-this.domain().length-
-1;return this._parts.hostname.substring(0,d)||""}d=this._parts.hostname.length-this.domain().length;d=this._parts.hostname.substring(0,d);d=new RegExp("^"+u(d));a&&"."!==a.charAt(a.length-1)&&(a+=".");a&&b.ensureValidHostname(a);this._parts.hostname=this._parts.hostname.replace(d,a);this.build(!c);return this};e.domain=function(a,c){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.match(/\./g);
-if(d&&2>d.length)return this._parts.hostname;d=this._parts.hostname.length-this.tld(c).length-1;d=this._parts.hostname.lastIndexOf(".",d-1)+1;return this._parts.hostname.substring(d)||""}if(!a)throw new TypeError("cannot set domain empty");b.ensureValidHostname(a);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(d=new RegExp(u(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a));this.build(!c);return this};e.tld=function(a,c){if(this._parts.urn)return void 0===a?
-"":this;"boolean"===typeof a&&(c=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var d=this._parts.hostname.lastIndexOf("."),d=this._parts.hostname.substring(d+1);return!0!==c&&s&&s.list[d.toLowerCase()]?s.get(this._parts.hostname)||d:d}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(s&&s.is(a))d=new RegExp(u(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(d,a);else throw new TypeError('TLD "'+a+'" contains characters other than [A-Z0-9]');else{if(!this._parts.hostname||
-this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");d=new RegExp(u(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(d,a)}else throw new TypeError("cannot set TLD empty");this.build(!c);return this};e.directory=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var d=this._parts.path.length-this.filename().length-1,d=this._parts.path.substring(0,
-d)||(this._parts.hostname?"/":"");return a?b.decodePath(d):d}d=this._parts.path.length-this.filename().length;d=this._parts.path.substring(0,d);d=new RegExp("^"+u(d));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=b.recodePath(a);this._parts.path=this._parts.path.replace(d,a);this.build(!c);return this};e.filename=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";
-var d=this._parts.path.lastIndexOf("/"),d=this._parts.path.substring(d+1);return a?b.decodePathSegment(d):d}d=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\.?\//)&&(d=!0);var e=new RegExp(u(this.filename())+"$");a=b.recodePath(a);this._parts.path=this._parts.path.replace(e,a);d?this.normalizePath(c):this.build(!c);return this};e.suffix=function(a,c){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var d=this.filename(),
-e=d.lastIndexOf(".");if(-1===e)return"";d=d.substring(e+1);d=/^[a-z0-9%]+$/i.test(d)?d:"";return a?b.decodePathSegment(d):d}"."===a.charAt(0)&&(a=a.substring(1));if(d=this.suffix())e=a?new RegExp(u(d)+"$"):new RegExp(u("."+d)+"$");else{if(!a)return this;this._parts.path+="."+b.recodePath(a)}e&&(a=b.recodePath(a),this._parts.path=this._parts.path.replace(e,a));this.build(!c);return this};e.segment=function(a,c,d){var b=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),e=e.split(b);void 0!==
-a&&"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error('Bad segment "'+a+'", must be 0-based integer');f&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===c)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(q(c)){e=[];a=0;for(var h=c.length;a<h;a++)if(c[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(c[a])}else{if(c||"string"===typeof c)""===e[e.length-1]?e[e.length-1]=c:e.push(c)}else c||"string"===typeof c&&c.length?
-e[a]=c:e.splice(a,1);f&&e.unshift("");return this.path(e.join(b),d)};e.segmentCoded=function(a,c,d){var e,f;"number"!==typeof a&&(d=c,c=a,a=void 0);if(void 0===c){a=this.segment(a,c,d);if(q(a))for(e=0,f=a.length;e<f;e++)a[e]=b.decode(a[e]);else a=void 0!==a?b.decode(a):void 0;return a}if(q(c))for(e=0,f=c.length;e<f;e++)c[e]=b.decode(c[e]);else c="string"===typeof c?b.encode(c):c;return this.segment(a,c,d)};var F=e.query;e.query=function(a,c){if(!0===a)return b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
-if("function"===typeof a){var d=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace),e=a.call(this,d);this._parts.query=b.buildQuery(e||d,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);this.build(!c);return this}return void 0!==a&&"string"!==typeof a?(this._parts.query=b.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!c),this):F.call(this,a,c)};e.setQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
-if("object"===typeof a)for(var f in a)t.call(a,f)&&(e[f]=a[f]);else if("string"===typeof a)e[a]=void 0!==c?c:null;else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.addQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.addQuery(e,a,void 0===c?null:c);this._parts.query=
-b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.removeQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);b.removeQuery(e,a,c);this._parts.query=b.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(d=c);this.build(!d);return this};e.hasQuery=function(a,c,d){var e=b.parseQuery(this._parts.query,this._parts.escapeQuerySpace);
-return b.hasQuery(e,a,c,d)};e.setSearch=e.setQuery;e.addSearch=e.addQuery;e.removeSearch=e.removeQuery;e.hasSearch=e.hasQuery;e.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};e.normalizeProtocol=function(a){"string"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),
-this.build(!a));return this};e.normalizeHostname=function(a){this._parts.hostname&&(this.is("IDN")&&f?this._parts.hostname=f.toASCII(this._parts.hostname):this.is("IPv6")&&g&&(this._parts.hostname=g.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!a));return this};e.normalizePort=function(a){"string"===typeof this._parts.protocol&&this._parts.port===b.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};e.normalizePath=
-function(a){if(this._parts.urn||!this._parts.path||"/"===this._parts.path)return this;var c,d=this._parts.path,e="",f,h;"/"!==d.charAt(0)&&(c=!0,d="/"+d);d=d.replace(/(\/(\.\/)+)|(\/\.$)/g,"/").replace(/\/{2,}/g,"/");c&&(e=d.substring(1).match(/^(\.\.\/)+/)||"")&&(e=e[0]);for(;;){f=d.indexOf("/..");if(-1===f)break;else if(0===f){d=d.substring(3);continue}h=d.substring(0,f).lastIndexOf("/");-1===h&&(h=f);d=d.substring(0,h)+d.substring(f+3)}c&&this.is("relative")&&(d=e+d.substring(1));d=b.recodePath(d);
-this._parts.path=d;this.build(!a);return this};e.normalizePathname=e.normalizePath;e.normalizeQuery=function(a){"string"===typeof this._parts.query&&(this._parts.query.length?this.query(b.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a));return this};e.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};e.normalizeSearch=e.normalizeQuery;e.normalizeHash=e.normalizeFragment;e.iso8859=function(){var a=
-b.encode,c=b.decode;b.encode=escape;b.decode=decodeURIComponent;this.normalize();b.encode=a;b.decode=c;return this};e.unicode=function(){var a=b.encode,c=b.decode;b.encode=m;b.decode=unescape;this.normalize();b.encode=a;b.decode=c;return this};e.readable=function(){var a=this.clone();a.username("").password("").normalize();var c="";a._parts.protocol&&(c+=a._parts.protocol+"://");a._parts.hostname&&(a.is("punycode")&&f?(c+=f.toUnicode(a._parts.hostname),a._parts.port&&(c+=":"+a._parts.port)):c+=a.host());
-a._parts.hostname&&a._parts.path&&"/"!==a._parts.path.charAt(0)&&(c+="/");c+=a.path(!0);if(a._parts.query){for(var d="",e=0,h=a._parts.query.split("&"),m=h.length;e<m;e++){var g=(h[e]||"").split("="),d=d+("&"+b.decodeQuery(g[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"));void 0!==g[1]&&(d+="="+b.decodeQuery(g[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}c+="?"+d.substring(1)}return c+=b.decodeQuery(a.hash(),!0)};e.absoluteTo=function(a){var c=this.clone(),d=["protocol","username",
-"password","hostname","port"],e,f;if(this._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a instanceof b||(a=new b(a));c._parts.protocol||(c._parts.protocol=a._parts.protocol);if(this._parts.hostname)return c;for(e=0;f=d[e];e++)c._parts[f]=a._parts[f];c._parts.path?".."===c._parts.path.substring(-2)&&(c._parts.path+="/"):(c._parts.path=a._parts.path,c._parts.query||(c._parts.query=a._parts.query));"/"!==c.path().charAt(0)&&(a=a.directory(),c._parts.path=(a?
-a+"/":"")+c._parts.path,c.normalizePath());c.build();return c};e.relativeTo=function(a){var c=this.clone().normalize(),d,e,f,h;if(c._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a=(new b(a)).normalize();d=c._parts;e=a._parts;f=c.path();h=a.path();if("/"!==f.charAt(0))throw Error("URI is already relative");if("/"!==h.charAt(0))throw Error("Cannot calculate a URI relative to another relative URI");d.protocol===e.protocol&&(d.protocol=null);if(d.username===
-e.username&&d.password===e.password&&null===d.protocol&&null===d.username&&null===d.password&&d.hostname===e.hostname&&d.port===e.port)d.hostname=null,d.port=null;else return c.build();if(f===h)return d.path="",c.build();a=b.commonPath(c.path(),a.path());if(!a)return c.build();e=e.path.substring(a.length).replace(/[^\/]*$/,"").replace(/.*?\//g,"../");d.path=e+d.path.substring(a.length);return c.build()};e.equals=function(a){var c=this.clone();a=new b(a);var d={},e={},f={},h;c.normalize();a.normalize();
-if(c.toString()===a.toString())return!0;d=c.query();e=a.query();c.query("");a.query("");if(c.toString()!==a.toString()||d.length!==e.length)return!1;d=b.parseQuery(d,this._parts.escapeQuerySpace);e=b.parseQuery(e,this._parts.escapeQuerySpace);for(h in d)if(t.call(d,h)){if(!q(d[h])){if(d[h]!==e[h])return!1}else if(!w(d[h],e[h]))return!1;f[h]=!0}for(h in e)if(t.call(e,h)&&!f[h])return!1;return!0};e.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};e.escapeQuerySpace=
-function(a){this._parts.escapeQuerySpace=!!a;return this};return b});
-(function(f,g){"object"===typeof exports?module.exports=g(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],g):f.URITemplate=g(f.URI,f)})(this,function(f,g){function s(b){if(s._cache[b])return s._cache[b];if(!(this instanceof s))return new s(b);this.expression=b;s._cache[b]=this;return this}function k(b){this.data=b;this.cache={}}var b=g&&g.URITemplate,u=Object.prototype.hasOwnProperty,r=s.prototype,q={"":{prefix:"",separator:",",named:!1,empty_name_separator:!1,encode:"encode"},
-"+":{prefix:"",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},"#":{prefix:"#",separator:",",named:!1,empty_name_separator:!1,encode:"encodeReserved"},".":{prefix:".",separator:".",named:!1,empty_name_separator:!1,encode:"encode"},"/":{prefix:"/",separator:"/",named:!1,empty_name_separator:!1,encode:"encode"},";":{prefix:";",separator:";",named:!0,empty_name_separator:!1,encode:"encode"},"?":{prefix:"?",separator:"&",named:!0,empty_name_separator:!0,encode:"encode"},"&":{prefix:"&",
-separator:"&",named:!0,empty_name_separator:!0,encode:"encode"}};s._cache={};s.EXPRESSION_PATTERN=/\{([^a-zA-Z0-9%_]?)([^\}]+)(\}|$)/g;s.VARIABLE_PATTERN=/^([^*:]+)((\*)|:(\d+))?$/;s.VARIABLE_NAME_PATTERN=/[^a-zA-Z0-9%_]/;s.expand=function(b,f){var g=q[b.operator],m=g.named?"Named":"Unnamed",n=b.variables,e=[],t,l,k;for(k=0;l=n[k];k++)t=f.get(l.name),t.val.length?e.push(s["expand"+m](t,g,l.explode,l.explode&&g.separator||",",l.maxlength,l.name)):t.type&&e.push("");return e.length?g.prefix+e.join(g.separator):
-""};s.expandNamed=function(b,g,k,m,n,e){var t="",l=g.encode;g=g.empty_name_separator;var s=!b[l].length,q=2===b.type?"":f[l](e),r,u,C;u=0;for(C=b.val.length;u<C;u++)n?(r=f[l](b.val[u][1].substring(0,n)),2===b.type&&(q=f[l](b.val[u][0].substring(0,n)))):s?(r=f[l](b.val[u][1]),2===b.type?(q=f[l](b.val[u][0]),b[l].push([q,r])):b[l].push([void 0,r])):(r=b[l][u][1],2===b.type&&(q=b[l][u][0])),t&&(t+=m),k?t+=q+(g||r?"=":"")+r:(u||(t+=f[l](e)+(g||r?"=":"")),2===b.type&&(t+=q+","),t+=r);return t};s.expandUnnamed=
-function(b,g,k,m,n){var e="",t=g.encode;g=g.empty_name_separator;var l=!b[t].length,s,q,r,u;r=0;for(u=b.val.length;r<u;r++)n?q=f[t](b.val[r][1].substring(0,n)):l?(q=f[t](b.val[r][1]),b[t].push([2===b.type?f[t](b.val[r][0]):void 0,q])):q=b[t][r][1],e&&(e+=m),2===b.type&&(s=n?f[t](b.val[r][0].substring(0,n)):b[t][r][0],e+=s,e=k?e+(g||q?"=":""):e+","),e+=q;return e};s.noConflict=function(){g.URITemplate===s&&(g.URITemplate=b);return s};r.expand=function(b){var f="";this.parts&&this.parts.length||this.parse();
-b instanceof k||(b=new k(b));for(var g=0,m=this.parts.length;g<m;g++)f+="string"===typeof this.parts[g]?this.parts[g]:s.expand(this.parts[g],b);return f};r.parse=function(){var b=this.expression,f=s.EXPRESSION_PATTERN,g=s.VARIABLE_PATTERN,m=s.VARIABLE_NAME_PATTERN,n=[],e=0,k,l,r;for(f.lastIndex=0;;){l=f.exec(b);if(null===l){n.push(b.substring(e));break}else n.push(b.substring(e,l.index)),e=l.index+l[0].length;if(!q[l[1]])throw Error('Unknown Operator "'+l[1]+'" in "'+l[0]+'"');if(!l[3])throw Error('Unclosed Expression "'+
-l[0]+'"');k=l[2].split(",");for(var u=0,E=k.length;u<E;u++){r=k[u].match(g);if(null===r)throw Error('Invalid Variable "'+k[u]+'" in "'+l[0]+'"');if(r[1].match(m))throw Error('Invalid Variable Name "'+r[1]+'" in "'+l[0]+'"');k[u]={name:r[1],explode:!!r[3],maxlength:r[4]&&parseInt(r[4],10)}}if(!k.length)throw Error('Expression Missing Variable(s) "'+l[0]+'"');n.push({expression:l[0],operator:l[1],variables:k})}n.length||n.push(b);this.parts=n;return this};k.prototype.get=function(b){var f=this.data,
-g={type:0,val:[],encode:[],encodeReserved:[]},m;if(void 0!==this.cache[b])return this.cache[b];this.cache[b]=g;f="[object Function]"===String(Object.prototype.toString.call(f))?f(b):"[object Function]"===String(Object.prototype.toString.call(f[b]))?f[b](b):f[b];if(void 0!==f&&null!==f)if("[object Array]"===String(Object.prototype.toString.call(f))){m=0;for(b=f.length;m<b;m++)void 0!==f[m]&&null!==f[m]&&g.val.push([void 0,String(f[m])]);g.val.length&&(g.type=3)}else if("[object Object]"===String(Object.prototype.toString.call(f))){for(m in f)u.call(f,
-m)&&void 0!==f[m]&&null!==f[m]&&g.val.push([m,String(f[m])]);g.val.length&&(g.type=2)}else g.type=1,g.val.push([void 0,String(f)]);return g};f.expand=function(b,g){var k=(new s(b)).expand(g);return new f(k)};return s});
-(function(f,g){"object"===typeof exports?module.exports=g(require("jquery","./URI")):"function"===typeof define&&define.amd?define(["jquery","./URI"],g):g(f.jQuery,f.URI)})(this,function(f,g){function s(b){return b.replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")}function k(b){var f=b.nodeName.toLowerCase();return"input"===f&&"image"!==b.type?void 0:g.domAttributes[f]}function b(b){return{get:function(g){return f(g).uri()[b]()},set:function(g,e){f(g).uri()[b](e);return e}}}function u(b,g){var e,h,l;if(!k(b)||
-!g)return!1;e=g.match(A);if(!e||!e[5]&&":"!==e[2]&&!q[e[2]])return!1;l=f(b).uri();if(e[5])return l.is(e[5]);if(":"===e[2])return h=e[1].toLowerCase()+":",q[h]?q[h](l,e[4]):!1;h=e[1].toLowerCase();return r[h]?q[e[2]](l[h](),e[4],h):!1}var r={},q={"=":function(b,f){return b===f},"^=":function(b,f){return!!(b+"").match(new RegExp("^"+s(f),"i"))},"$=":function(b,f){return!!(b+"").match(new RegExp(s(f)+"$","i"))},"*=":function(b,f,e){"directory"===e&&(b+="/");return!!(b+"").match(new RegExp(s(f),"i"))},
-"equals:":function(b,f){return b.equals(f)},"is:":function(b,f){return b.is(f)}};f.each("authority directory domain filename fragment hash host hostname href password path pathname port protocol query resource scheme search subdomain suffix tld username".split(" "),function(g,h){r[h]=!0;f.attrHooks["uri:"+h]=b(h)});var h=function(b,g){return f(b).uri().href(g).toString()};f.each(["src","href","action","uri","cite"],function(b,g){f.attrHooks[g]={set:h}});f.attrHooks.uri.get=function(b){return f(b).uri()};
-f.fn.uri=function(b){var f=this.first(),e=f.get(0),h=k(e);if(!h)throw Error('Element "'+e.nodeName+'" does not have either property: href, src, action, cite');if(void 0!==b){var l=f.data("uri");if(l)return l.href(b);b instanceof g||(b=g(b||""))}else{if(b=f.data("uri"))return b;b=g(f.attr(h)||"")}b._dom_element=e;b._dom_attribute=h;b.normalize();f.data("uri",b);return b};g.prototype.build=function(b){if(this._dom_element)this._string=g.build(this._parts),this._deferred_build=!1,this._dom_element.setAttribute(this._dom_attribute,
-this._string),this._dom_element[this._dom_attribute]=this._string;else if(!0===b)this._deferred_build=!0;else if(void 0===b||this._deferred_build)this._string=g.build(this._parts),this._deferred_build=!1;return this};var w,A=/^([a-zA-Z]+)\s*([\^\$*]?=|:)\s*(['"]?)(.+)\3|^\s*([a-zA-Z0-9]+)\s*$/;w=f.expr.createPseudo?f.expr.createPseudo(function(b){return function(f){return u(f,b)}}):function(b,f,e){return u(b,e[3])};f.expr[":"].uri=w;return f});
-(function(f,g){"object"===typeof exports?module.exports=g(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],g):g(f.URI)})(this,function(f){var g=f.prototype,s=g.fragment;f.fragmentPrefix="?";var k=f._parts;f._parts=function(){var b=k();b.fragmentPrefix=f.fragmentPrefix;return b};g.fragmentPrefix=function(b){this._parts.fragmentPrefix=b;return this};g.fragment=function(b,g){var k=this._parts.fragmentPrefix,q=this._parts.fragment||"";return!0===b?q.substring(0,k.length)!==k?
-{}:f.parseQuery(q.substring(k.length)):void 0!==b&&"string"!==typeof b?(this._parts.fragment=k+f.buildQuery(b),this.build(!g),this):s.call(this,b,g)};g.addFragment=function(b,g,k){var q=this._parts.fragmentPrefix,h=f.parseQuery((this._parts.fragment||"").substring(q.length));f.addQuery(h,b,g);this._parts.fragment=q+f.buildQuery(h);"string"!==typeof b&&(k=g);this.build(!k);return this};g.removeFragment=function(b,g,k){var q=this._parts.fragmentPrefix,h=f.parseQuery((this._parts.fragment||"").substring(q.length));
-f.removeQuery(h,b,g);this._parts.fragment=q+f.buildQuery(h);"string"!==typeof b&&(k=g);this.build(!k);return this};g.addHash=g.addFragment;g.removeHash=g.removeFragment;return f});
--- a/server/renkan-web/src/main/webapp/static/lib/ace/ace.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-(function(){function o(e){var i=function(e,t){return r("",e,t)},s=t;e&&(t[e]||(t[e]={}),s=t[e]);if(!s.define||!s.define.packaged)n.original=s.define,s.define=n,s.define.packaged=!0;if(!s.require||!s.require.packaged)r.original=s.require,s.require=i,s.require.packaged=!0}var e="ace",t=function(){return this}();if(!e&&typeof requirejs!="undefined")return;var n=function(e,t,r){if(typeof e!="string"){n.original?n.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=t),n.modules||(n.modules={}),n.modules[e]=r},r=function(e,t,n){if(Object.prototype.toString.call(t)==="[object Array]"){var i=[];for(var o=0,u=t.length;o<u;++o){var a=s(e,t[o]);if(!a&&r.original)return r.original.apply(window,arguments);i.push(a)}n&&n.apply(null,i)}else{if(typeof t=="string"){var f=s(e,t);return!f&&r.original?r.original.apply(window,arguments):(n&&n(),f)}if(r.original)return r.original.apply(window,arguments)}},i=function(e,t){if(t.indexOf("!")!==-1){var n=t.split("!");return i(e,n[0])+"!"+i(e,n[1])}if(t.charAt(0)=="."){var r=e.split("/").slice(0,-1).join("/");t=r+"/"+t;while(t.indexOf(".")!==-1&&s!=t){var s=t;t=t.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return t},s=function(e,t){t=i(e,t);var s=n.modules[t];if(!s)return null;if(typeof s=="function"){var o={},u={id:t,uri:"",exports:o,packaged:!0},a=function(e,n){return r(t,e,n)},f=s(a,o,u);return o=f||u.exports,n.modules[t]=o,o}return s};o(e)})(),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/multi_select","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/mode/folding/fold_mode","ace/theme/textmate","ace/config"],function(e,t,n){e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer,f=e("./multi_select").MultiSelect;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./mode/folding/fold_mode"),e("./theme/textmate"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e,e=document.getElementById(n);if(!e)throw"ace.edit can't find div #"+n}if(e.env&&e.env.editor instanceof s)return e.env.editor;var o=t.createEditSession(r.getInnerText(e));e.innerHTML="";var u=new s(new a(e));new f(u),u.setSession(o);var l={document:o,editor:u,onResize:u.resize.bind(u,null)};return i.addListener(window,"resize",l.onResize),u.on("destroy",function(){i.removeListener(window,"resize",l.onResize)}),e.env=u.env=l,u},t.createEditSession=function(e,t){var n=new o(e,n);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u}),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(e,t,n){e("./regexp"),e("./es5-shim")}),ace.define("ace/lib/regexp",["require","exports","module"],function(e,t,n){function o(e){return(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":"")}function u(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}var r={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},i=r.exec.call(/()??/,"")[1]===undefined,s=function(){var e=/^/g;return r.test.call(e,""),!e.lastIndex}();if(s&&i)return;RegExp.prototype.exec=function(e){var t=r.exec.apply(this,arguments),n,a;if(typeof e=="string"&&t){!i&&t.length>1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===undefined&&(t[e]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)n=this._xregexp.captureNames[f-1],n&&(t[n]=t[f]);!s&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=u.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),a=e+o,f=a+s-o,l=n-a,c=n-o;if(f<a)for(var h=0;h<l;++h)this[f+h]=this[a+h];else if(f>a)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var v=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?v.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(u.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(t){return a(t)=="[object Array]"});var m=Object("a"),g=m[0]!="a"||!(0 in m);Array.prototype.forEach||(Array.prototype.forEach=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=arguments[1],s=-1,o=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s<o)s in r&&t.call(i,r[s],s,n)}),Array.prototype.map||(Array.prototype.map=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u<i;u++)u in r&&(s[u]=t.call(o,r[u],u,n));return s}),Array.prototype.filter||(Array.prototype.filter=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f<i;f++)f in r&&(o=r[f],t.call(u,o,f,n)&&s.push(o));return s}),Array.prototype.every||(Array.prototype.every=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o<i;o++)if(o in r&&!t.call(s,r[o],o,n))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o<i;o++)if(o in r&&t.call(s,r[o],o,n))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s<i;s++)s in r&&(o=t.call(void 0,o,r[s],s,n));return o}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(t){var n=F(this),r=g&&a(this)=="[object String]"?this.split(""):n,i=r.length>>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i<r;i++)if(i in n&&n[i]===t)return i;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n<r;n++){var i=A[n];f(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var _=" \n\f\r \u2028\u2029";if(!String.prototype.trim||_.trim()){_="["+_+"]";var D=new RegExp("^"+_+_+"*"),P=new RegExp(_+_+"*$");String.prototype.trim=function(){return String(this).replace(D,"").replace(P,"")}}var F=function(e){if(e==null)throw new TypeError("can't convert "+e+" to object");return Object(e)}}),ace.define("ace/lib/dom",["require","exports","module"],function(e,t,n){if(typeof document=="undefined")return;var r="http://www.w3.org/1999/xhtml";t.getDocumentHead=function(e){return e||(e=document),e.head||e.getElementsByTagName("head")[0]||e.documentElement},t.createElement=function(e,t){return document.createElementNS?document.createElementNS(t||r,e):document.createElement(e)},t.hasCssClass=function(e,t){var n=e.className.split(/\s+/g);return n.indexOf(t)!==-1},t.addCssClass=function(e,n){t.hasCssClass(e,n)||(e.className+=" "+n)},t.removeCssClass=function(e,t){var n=e.className.split(/\s+/g);for(;;){var r=n.indexOf(t);if(r==-1)break;n.splice(r,1)}e.className=n.join(" ")},t.toggleCssClass=function(e,t){var n=e.className.split(/\s+/g),r=!0;for(;;){var i=n.indexOf(t);if(i==-1)break;r=!1,n.splice(i,1)}return r&&n.push(t),e.className=n.join(" "),r},t.setCssClass=function(e,n,r){r?t.addCssClass(e,n):t.removeCssClass(e,n)},t.hasCssString=function(e,t){var n=0,r;t=t||document;if(t.createStyleSheet&&(r=t.styleSheets)){while(n<r.length)if(r[n++].owningElement.id===e)return!0}else if(r=t.getElementsByTagName("style"))while(n<r.length)if(r[n++].id===e)return!0;return!1},t.importCssString=function(n,i,s){s=s||document;if(i&&t.hasCssString(i,s))return null;var o;s.createStyleSheet?(o=s.createStyleSheet(),o.cssText=n,i&&(o.owningElement.id=i)):(o=s.createElementNS?s.createElementNS(r,"style"):s.createElement("style"),o.appendChild(s.createTextNode(n)),i&&(o.id=i),t.getDocumentHead(s).appendChild(o))},t.importCssStylsheet=function(e,n){if(n.createStyleSheet)n.createStyleSheet(e);else{var r=t.createElement("link");r.rel="stylesheet",r.href=e,t.getDocumentHead(n).appendChild(r)}},t.getInnerWidth=function(e){return parseInt(t.computedStyle(e,"paddingLeft"),10)+parseInt(t.computedStyle(e,"paddingRight"),10)+e.clientWidth},t.getInnerHeight=function(e){return parseInt(t.computedStyle(e,"paddingTop"),10)+parseInt(t.computedStyle(e,"paddingBottom"),10)+e.clientHeight},window.pageYOffset!==undefined?(t.getPageScrollTop=function(){return window.pageYOffset},t.getPageScrollLeft=function(){return window.pageXOffset}):(t.getPageScrollTop=function(){return document.body.scrollTop},t.getPageScrollLeft=function(){return document.body.scrollLeft}),window.getComputedStyle?t.computedStyle=function(e,t){return t?(window.getComputedStyle(e,"")||{})[t]||"":window.getComputedStyle(e,"")||{}}:t.computedStyle=function(e,t){return t?e.currentStyle[t]:e.currentStyle},t.scrollbarWidth=function(e){var n=t.createElement("ace_inner");n.style.width="100%",n.style.minWidth="0px",n.style.height="200px",n.style.display="block";var r=t.createElement("ace_outer"),i=r.style;i.position="absolute",i.left="-10000px",i.overflow="hidden",i.width="200px",i.minWidth="0px",i.height="150px",i.display="block",r.appendChild(n);var s=e.documentElement;s.appendChild(r);var o=n.offsetWidth;i.overflow="scroll";var u=n.offsetWidth;return o==u&&(u=r.clientWidth),s.removeChild(r),o-u},t.setInnerHtml=function(e,t){var n=e.cloneNode(!1);return n.innerHTML=t,e.parentNode.replaceChild(n,e),n},"textContent"in document.documentElement?(t.setInnerText=function(e,t){e.textContent=t},t.getInnerText=function(e){return e.textContent}):(t.setInnerText=function(e,t){e.innerText=t},t.getInnerText=function(e){return e.innerText}),t.getParentWindow=function(e){return e.defaultView||e.parentWindow}}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent","ace/lib/dom"],function(e,t,n){function o(e,t,n){var s=0;!i.isOpera||"KeyboardEvent"in window||!i.isMac?s=0|(t.ctrlKey?1:0)|(t.altKey?2:0)|(t.shiftKey?4:0)|(t.metaKey?8:0):s=0|(t.metaKey?1:0)|(t.altKey?2:0)|(t.shiftKey?4:0)|(t.ctrlKey?8:0);if(n in r.MODIFIER_KEYS){switch(r.MODIFIER_KEYS[n]){case"Alt":s=2;break;case"Shift":s=4;break;case"Ctrl":s=1;break;default:s=8}n=0}return s&8&&(n==91||n==93)&&(n=0),!!s||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,s,n):!1}var r=e("./keys"),i=e("./useragent"),s=e("./dom");t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n(window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||e.ctrlKey&&i.isMac?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},document.documentElement.setCapture?t.capture=function(e,n,r){function s(o){n(o),i||(i=!0,r(o)),t.removeListener(e,"mousemove",n),t.removeListener(e,"mouseup",s),t.removeListener(e,"losecapture",s),e.releaseCapture()}var i=!1;t.addListener(e,"mousemove",n),t.addListener(e,"mouseup",s),t.addListener(e,"losecapture",s),e.setCapture()}:t.capture=function(e,t,n){function r(e){t&&t(e),n&&n(e),document.removeEventListener("mousemove",t,!0),document.removeEventListener("mouseup",r,!0),e.stopPropagation()}document.addEventListener("mousemove",t,!0),document.addEventListener("mouseup",r,!0)},t.addMouseWheelListener=function(e,n){var r=8,i=function(e){e.wheelDelta!==undefined?e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/r,e.wheelY=-e.wheelDeltaY/r):(e.wheelX=0,e.wheelY=-e.wheelDelta/r):e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)};t.addListener(e,"DOMMouseScroll",i),t.addListener(e,"mousewheel",i)},t.addMultiMouseDownListener=function(e,n,r,s){var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};t.addListener(e,"mousedown",function(e){if(t.getButton(e)!=0)o=0;else{var i=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||i)o=0;o+=1,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600)}o==1&&(u=e.clientX,a=e.clientY),r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}),i.isOldIE&&t.addListener(e,"dblclick",function(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)})},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var s=null;r(e,"keydown",function(e){s=e.keyCode}),r(e,"keypress",function(e){return o(n,e,s)})}else{var u=null;r(e,"keydown",function(e){return u=e.keyIdentifier||e.keyCode,o(n,e,e.keyCode)})}};if(window.postMessage&&!i.isOldIE){var u=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+u;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame,t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(e,t,n){var r=e("./oop"),i=function(){var e={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,meta:8,command:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",188:",",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}};for(var t in e.FUNCTION_KEYS){var n=e.FUNCTION_KEYS[t].toLowerCase();e[n]=parseInt(t,10)}return r.mixin(e,e.MODIFIER_KEYS),r.mixin(e,e.PRINTABLE_KEYS),r.mixin(e,e.FUNCTION_KEYS),e.enter=e["return"],e.escape=e.esc,e.del=e["delete"],e[173]="-",e}();r.mixin(t,i),t.keyCodeToString=function(e){return(i[e]||String.fromCharCode(e)).toLowerCase()}}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){t.inherits=function(){var e=function(){};return function(t,n){e.prototype=n.prototype,t.super_=n.prototype,t.prototype=new e,t.prototype.constructor=t}}(),t.mixin=function(e,t){for(var n in t)e[n]=t[n]},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/lib/useragent",["require","exports","module"],function(e,t,n){t.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},t.getOS=function(){return t.isMac?t.OS.MAC:t.isLinux?t.OS.LINUX:t.OS.WINDOWS};if(typeof navigator!="object")return;var r=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),i=navigator.userAgent;t.isWin=r=="win",t.isMac=r=="mac",t.isLinux=r=="linux",t.isIE=(navigator.appName=="Microsoft Internet Explorer"||navigator.appName.indexOf("MSAppHost")>=0)&&parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\.0-9]+)/)[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=window.controllers&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((navigator.userAgent.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0}),ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config"],function(e,t,n){e("./lib/fixoldbrowsers");var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/useragent"),o=e("./keyboard/textinput").TextInput,u=e("./mouse/mouse_handler").MouseHandler,a=e("./mouse/fold_handler").FoldHandler,f=e("./keyboard/keybinding").KeyBinding,l=e("./edit_session").EditSession,c=e("./search").Search,h=e("./range").Range,p=e("./lib/event_emitter").EventEmitter,d=e("./commands/command_manager").CommandManager,v=e("./commands/default_commands").commands,m=e("./config"),g=function(e,t){var n=e.getContainerElement();this.container=n,this.renderer=e,this.commands=new d(s.isMac?"mac":"win",v),this.textInput=new o(e.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.keyBinding=new f(this),this.$mouseHandler=new u(this),new a(this),this.$blockScrolling=0,this.$search=(new c).set({wrap:!0}),this.setSession(t||new l("")),m.resetOptions(this),m._emit("editor",this)};(function(){r.implement(this,p),this.setKeyboardHandler=function(e){if(typeof e=="string"&&e){this.$keybindingId=e;var t=this;m.loadModule(["keybinding",e],function(n){t.$keybindingId==e&&t.keyBinding.setKeyboardHandler(n&&n.handler)})}else delete this.$keybindingId,this.keyBinding.setKeyboardHandler(e)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;if(this.session){var t=this.session;this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeLeftTop",this.$onScrollLeftChange);var n=this.session.getSelection();n.removeEventListener("changeCursor",this.$onCursorChange),n.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=e,this.$onDocumentChange=this.onDocumentChange.bind(this),e.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull(),this._emit("changeSession",{session:e,oldSession:t})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e){this.renderer.setTheme(e)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.setFontSize=function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.renderer.updateFontSize()},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session.findMatchingBracket(e.getCursorPosition());if(t)var n=new h(t.row,t.column,t.row,t.column+1);else if(e.session.$mode.getMatching)var n=e.session.$mode.getMatching(e.session);n&&(e.session.$bracketHighlight=e.session.addMarker(n,"ace_bracket","text"))},50)},this.focus=function(){var e=this;setTimeout(function(){e.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){if(this.$isFocused)return;this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus")},this.onBlur=function(){if(!this.$isFocused)return;this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur")},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(e){var t=e.data,n=t.range,r;n.start.row==n.end.row&&t.action!="insertLines"&&t.action!="removeLines"?r=n.end.row:r=Infinity,this.renderer.updateLines(n.start.row,r),this._emit("change",e),this.$cursorChange()},this.onTokenizerUpdate=function(e){var t=e.data;this.renderer.updateLines(t.first,t.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.$highlightBrackets(),this.$updateHighlightActiveLine(),this._emit("changeSelection")},this.$updateHighlightActiveLine=function(){var e=this.getSession(),t;this.$highlightActiveLine&&(this.$selectionStyle!="line"||!this.selection.isMultiLine())&&(t=this.getCursorPosition());if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new h(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._emit("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._emit("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getCopyText=function(){var e="";return this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange())),this._emit("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e){if(this.$readOnly)return;this._emit("paste",e),this.insert(e)},this.execCommand=function(e,t){this.commands.exec(e,this,t)},this.insert=function(e){var t=this.session,n=t.getMode(),r=this.getCursorPosition();if(this.getBehavioursEnabled()){var i=n.transformAction(t.getState(r.row),"insertion",this,t,e);i&&(e=i.text)}e=e.replace(" ",this.session.getTabString());if(!this.selection.isEmpty())r=this.session.remove(this.getSelectionRange()),this.clearSelection();else if(this.session.getOverwrite()){var s=new h.fromPoints(r,r);s.end.column+=e.length,this.session.remove(s)}this.clearSelection();var o=r.column,u=t.getState(r.row),a=t.getLine(r.row),f=n.checkOutdent(u,a,e),l=t.insert(r,e);i&&i.selection&&(i.selection.length==2?this.selection.setSelectionRange(new h(r.row,o+i.selection[0],r.row,o+i.selection[1])):this.selection.setSelectionRange(new h(r.row+i.selection[0],i.selection[1],r.row+i.selection[2],i.selection[3])));if(t.getDocument().isNewLine(e)){var c=n.getNextLineIndent(u,a.slice(0,r.column),t.getTabString());this.moveCursorTo(r.row+1,0);var p=t.getTabSize(),d=Number.MAX_VALUE;for(var v=r.row+1;v<=l.row;++v){var m=0;a=t.getLine(v);for(var g=0;g<a.length;++g)if(a.charAt(g)==" ")m+=p;else{if(a.charAt(g)!=" ")break;m+=1}/[^\s]/.test(a)&&(d=Math.min(m,d))}for(var v=r.row+1;v<=l.row;++v){var y=d;a=t.getLine(v);for(var g=0;g<a.length&&y>0;++g)a.charAt(g)==" "?y-=p:a.charAt(g)==" "&&(y-=1);t.remove(new h(v,0,v,g))}t.indentRows(r.row+1,l.row,c)}f&&n.autoOutdent(u,t,r.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;t<n.length?(r=n.charAt(t)+n.charAt(t-1),i=new h(e.row,t-1,e.row,t+1)):(r=n.charAt(t-1)+n.charAt(t-2),i=new h(e.row,t-2,e.row,t)),this.session.replace(i,r)},this.toLowerCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toLowerCase()),this.selection.setSelectionRange(e)},this.toUpperCase=function(){var e=this.getSelectionRange();this.selection.isEmpty()&&this.selection.selectWord();var t=this.getSelectionRange(),n=this.session.getTextRange(t);this.session.replace(t,n.toUpperCase()),this.selection.setSelectionRange(e)},this.indent=function(){var e=this.session,t=this.getSelectionRange();if(!(t.start.row<t.end.row||t.start.column<t.end.column)){var r;if(this.session.getUseSoftTabs()){var s=e.getTabSize(),o=this.getCursorPosition(),u=e.documentToScreenColumn(o.row,o.column),a=s-u%s;r=i.stringRepeat(" ",a)}else r=" ";return this.insert(r)}var n=this.$getSelectedRows();e.indentRows(n.first,n.last," ")},this.blockIndent=function(){var e=this.$getSelectedRows();this.session.indentRows(e.first,e.last," ")},this.blockOutdent=function(){var e=this.session.getSelection();this.session.outdentRows(e.getRange())},this.sortLines=function(){var e=this.$getSelectedRows(),t=this.session,n=[];for(i=e.first;i<=e.last;i++)n.push(t.getLine(i));n.sort(function(e,t){return e.toLowerCase()<t.toLowerCase()?-1:e.toLowerCase()>t.toLowerCase()?1:0});var r=new h(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex<t-1){var i=n.exec(r);if(i.index<=t&&i.index+i[0].length>=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new h(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&n<o?e*=Math.pow(10,s.end-n-1):e*=Math.pow(10,s.end-n),a+=e,a/=Math.pow(10,u);var f=a.toFixed(u),l=new h(t,s.start,t,s.end);this.session.replace(l,f),this.moveCursorTo(t,Math.max(s.start+1,n+f.length-s.value.length))}}},this.removeLines=function(){var e=this.$getSelectedRows(),t;e.first===0||e.last+1<this.session.getLength()?t=new h(e.first,0,e.last+1,0):t=new h(e.first-1,this.session.getLine(e.first-1).length,e.last,this.session.getLine(e.last).length),this.session.remove(t),this.clearSelection()},this.duplicateSelection=function(){var e=this.selection,t=this.session,n=e.getRange();if(n.isEmpty()){var r=n.start.row;t.duplicateLines(r,r)}else{var i=reverse?n.start:n.end,s=t.insert(i,t.getTextRange(n),!1);n.start=i,n.end=s,e.setSelectionRange(n,reverse)}},this.moveLinesDown=function(){this.$moveLines(function(e,t){return this.session.moveLinesDown(e,t)})},this.moveLinesUp=function(){this.$moveLines(function(e,t){return this.session.moveLinesUp(e,t)})},this.moveText=function(e,t){return this.session.moveText(e,t)},this.copyLinesUp=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t),0})},this.copyLinesDown=function(){this.$moveLines(function(e,t){return this.session.duplicateLines(e,t)})},this.$moveLines=function(e){var t=this.selection;if(!t.inMultiSelectMode||this.inVirtualSelectionMode){var n=t.toOrientedRange(),r=this.$getSelectedRows(n),i=e.call(this,r.first,r.last);n.moveBy(i,0),t.fromOrientedRange(n)}else{var s=t.rangeList.ranges;t.rangeList.detach(this.session);for(var o=s.length;o--;){var u=o,r=s[o].collapseRows(),a=r.end.row,f=r.start.row;while(o--){var r=s[o].collapseRows();if(!(f-r.end.row<=1))break;f=r.end.row}o++;var i=e.call(this,f,a);while(u>=o)s[u].moveBy(i,0),u--}t.fromOrientedRange(t.ranges[0]),t.rangeList.attach(this.session)}},this.$getSelectedRows=function(){var e=this.getSelectionRange().collapseRows();return{first:e.start.row,last:e.end.row}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t==1?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t==0&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e){var t=this.getCursorPosition(),n=this.session.getBracketRange(t);if(!n){n=this.find({needle:/[{}()\[\]]/g,preventScroll:!0,start:{row:t.row,column:t.column-1}});if(!n)return;var r=n.start;r.row==t.row&&Math.abs(r.column-t.column)<2&&(n=this.session.getBracketRange(r))}r=n&&n.cursor||r,r&&(e?n&&n.isEqual(this.getSelectionRange())?this.clearSelection():this.selection.selectTo(r.row,r.column):(this.clearSelection(),this.moveCursorTo(r.row,r.column)))},this.gotoLine=function(e,t,n){this.selection.clearSelection(),this.session.unfold({row:e-1,column:t||0}),this.$blockScrolling+=1,this.moveCursorTo(e-1,t||0),this.$blockScrolling-=1,this.isRowFullyVisible(e-1)||this.scrollToLine(e-1,!0,n)},this.navigateTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.navigateUp=function(e){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),e=e||1,this.selection.moveCursorBy(-e,0)},this.navigateDown=function(e){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var t=this.selection.anchor.getPosition();return this.moveCursorToPosition(t)}this.selection.clearSelection(),e=e||1,this.selection.moveCursorBy(e,0)},this.navigateLeft=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().start;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorLeft()}this.clearSelection()},this.navigateRight=function(e){if(!this.selection.isEmpty()){var t=this.getSelectionRange().end;this.moveCursorToPosition(t)}else{e=e||1;while(e--)this.selection.moveCursorRight()}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){var e=this.renderer.scrollTop;this.selection.moveCursorFileEnd(),this.clearSelection(),this.renderer.animateScrolling(e)},this.navigateFileStart=function(){var e=this.renderer.scrollTop;this.selection.moveCursorFileStart(),this.clearSelection(),this.renderer.animateScrolling(e)},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(e,t){t&&this.$search.set(t);var n=this.$search.find(this.session),r=0;return n?(this.$tryReplace(n,e)&&(r=1),n!==null&&(this.selection.setSelectionRange(n),this.renderer.scrollSelectionIntoView(n.start,n.end)),r):r},this.replaceAll=function(e,t){t&&this.$search.set(t);var n=this.$search.findAll(this.session),r=0;if(!n.length)return r;this.$blockScrolling+=1;var i=this.getSelectionRange();this.clearSelection(),this.selection.moveCursorTo(0,0);for(var s=n.length-1;s>=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!=0&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._emit("destroy",this)},this.setAutoScrollEditorIntoView=function(e){if(e===!0)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&n.isFocused()){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.top<o.height&&s.top+t.top+o.lineHeight>window.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e===!1)return;delete this.setAutoScrollEditorIntoView,this.removeEventListener("changeSelection",s),this.renderer.removeEventListener("afterRender",u),this.renderer.removeEventListener("beforeRender",o)}}}).call(g.prototype),m.defineOptions(g.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._emit("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.textInput.setReadOnly(e),this.renderer.$cursorLayer.setBlinking(!e)},initialValue:!1},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",focusTimout:"$mouseHandler",firstLineNumber:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session"}),t.Editor=g}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]=="object"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function(e){if(typeof e!="object")return e;var t=e.constructor();for(var n in e)typeof e[n]=="object"?t[n]=this.deepCopy(e[n]):t[n]=e[n];return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},t.escapeHTML=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)};return i.delay=i,i.schedule=function(e){n==null&&(n=setTimeout(r,e||0))},i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),ace.define("ace/keyboard/textinput",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/dom","ace/lib/lang"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/dom"),o=e("../lib/lang"),u=i.isChrome<18,a=function(e,t){function b(e){if(h)return;if(k)t=0,r=e?0:n.value.length-1;else var t=e?2:1,r=2;try{n.setSelectionRange(t,r)}catch(i){}}function w(){if(h)return;n.value=a,i.isWebKit&&y.schedule()}function F(){setTimeout(function(){p&&(n.style.cssText=p,p=""),t.renderer.$keepTextAreaAtCursor==null&&(t.renderer.$keepTextAreaAtCursor=!0,t.renderer.$moveTextAreaToCursor())},0)}var n=s.createElement("textarea");n.className="ace_text-input",i.isTouchPad&&n.setAttribute("x-palm-disable-auto-cap",!0),n.wrap="off",n.autocorrect="off",n.autocapitalize="off",n.spellcheck=!1,n.style.bottom="2000em",e.insertBefore(n,e.firstChild);var a="",f=!1,l=!1,c=!1,h=!1,p="",d=!0;try{var v=document.activeElement===n}catch(m){}r.addListener(n,"blur",function(){t.onBlur(),v=!1}),r.addListener(n,"focus",function(){v=!0,t.onFocus(),b()}),this.focus=function(){n.focus()},this.blur=function(){n.blur()},this.isFocused=function(){return v};var g=o.delayedCall(function(){v&&b(d)}),y=o.delayedCall(function(){h||(n.value=a,v&&b())});i.isWebKit||t.addEventListener("changeSelection",function(){t.selection.isEmpty()!=d&&(d=!d,g.schedule())}),w(),v&&t.onFocus();var E=function(e){return e.selectionStart===0&&e.selectionEnd===e.value.length};!n.setSelectionRange&&n.createTextRange&&(n.setSelectionRange=function(e,t){var n=this.createTextRange();n.collapse(!0),n.moveStart("character",e),n.moveEnd("character",t),n.select()},E=function(e){try{var t=e.ownerDocument.selection.createRange()}catch(n){}return!t||t.parentElement()!=e?!1:t.text==e.value});if(i.isOldIE){var S=!1,x=function(e){if(S)return;var t=n.value;if(h||!t||t==a)return;if(e&&t==a[0])return T.schedule();L(t),S=!0,w(),S=!1},T=o.delayedCall(x);r.addListener(n,"propertychange",x);var N={13:1,27:1};r.addListener(n,"keyup",function(e){h&&(!n.value||N[e.keyCode])&&setTimeout(B,0);if((n.value.charCodeAt(0)||0)<129)return;h?P():D()})}var C=function(e){f?f=!1:l?l=!1:E(n)?(t.selectAll(),b()):k&&b(t.selection.isEmpty())},k=null;this.setInputHandler=function(e){k=e},this.getInputHandler=function(){return k};var L=function(e){k&&(e=k(e),k=null),c?(b(),e&&t.onPaste(e),c=!1):e==a[0]?Date.now()-H>100&&t.execCommand("del",{source:"ace"}):(e.substring(0,2)==a?e=e.substr(2):e[0]==a[0]?e=e.substr(1):e[e.length-1]==a[0]&&(e=e.slice(0,-1)),e[e.length-1]==a[0]&&(e=e.slice(0,-1)),e&&t.onTextInput(e))},A=function(e){if(h)return;var t=n.value;L(t),w()},O=function(e){var i=t.getCopyText();if(!i){r.preventDefault(e);return}var s=e.clipboardData||window.clipboardData;if(s&&!u){var o=s.setData("Text",i);o&&(t.onCut(),r.preventDefault(e))}o||(f=!0,n.value=i,n.select(),setTimeout(function(){f=!1,w(),b(),t.onCut()}))},M=function(e){var i=t.getCopyText();if(!i){r.preventDefault(e);return}var s=e.clipboardData||window.clipboardData;if(s&&!u){var o=s.setData("Text",i);o&&(t.onCopy(),r.preventDefault(e))}o||(l=!0,n.value=i,n.select(),setTimeout(function(){l=!1,w(),b(),t.onCopy()}))},_=function(e){var s=e.clipboardData||window.clipboardData;if(s){var o=s.getData("Text");o&&t.onPaste(o),i.isIE&&setTimeout(b),r.preventDefault(e)}else n.value="",c=!0};r.addCommandKeyListener(n,t.onCommandKey.bind(t)),r.addListener(n,"select",C),r.addListener(n,"input",A),r.addListener(n,"cut",O),r.addListener(n,"copy",M),r.addListener(n,"paste",_),(!("oncut"in n)||!("oncopy"in n)||!("onpaste"in n))&&r.addListener(e,"keydown",function(e){if(i.isMac&&!e.metaKey||!e.ctrlKey)return;switch(e.keyCode){case 67:M(e);break;case 86:_(e);break;case 88:O(e)}});var D=function(e){h=!0,t.onCompositionStart(),setTimeout(P,0)},P=function(){if(!h)return;t.onCompositionUpdate(n.value)},H=-1,B=function(e){h=!1,t.onCompositionEnd(),H=Date.now()},j=o.delayedCall(P,50);r.addListener(n,"compositionstart",D),r.addListener(n,i.isGecko?"text":"keyup",function(){j.schedule()}),r.addListener(n,"compositionend",B),this.getElement=function(){return n},this.setReadOnly=function(e){n.readOnly=e},this.onContextMenu=function(e){p||(p=n.style.cssText),n.style.cssText="z-index:100000;"+(i.isIE?"opacity:0.1;":""),b(t.selection.isEmpty()),t._emit("nativecontextmenu",{target:t});var o=t.container.getBoundingClientRect(),u=s.computedStyle(t.container),a=o.top+(parseInt(u.borderTopWidth)||0),f=o.left+(parseInt(o.borderLeftWidth)||0),l=o.bottom-a-n.clientHeight,c=function(e){n.style.left=e.clientX-f-2+"px",n.style.top=Math.min(e.clientY-a-2,l)+"px"};c(e);if(e.type!="mousedown")return;t.renderer.$keepTextAreaAtCursor&&(t.renderer.$keepTextAreaAtCursor=null),i.isWin&&r.capture(t.container,c,F)},this.onContextMenuClose=F,i.isGecko||r.addListener(n,"contextmenu",function(e){t.textInput.onContextMenu(e),F()})};t.TextInput=a}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop","ace/config"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop").DragdropHandler,f=e("../config"),l=function(e){this.editor=e,new s(this),new o(this),new a(this),r.addListener(e.container,"mousedown",function(t){return e.focus(),r.preventDefault(t)});var t=e.renderer.getMouseEventTarget();r.addListener(t,"click",this.onMouseEvent.bind(this,"click")),r.addListener(t,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener(t,[300,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel"));var n=e.renderer.$gutter;r.addListener(n,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(n,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(n,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(n,"mousemove",this.onMouseEvent.bind(this,"guttermousemove"))};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){t&&this.setState(t),this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){s.x=e.clientX,s.y=e.clientY},u=function(e){clearInterval(f),a(),s[s.state+"End"]&&s[s.state+"End"](e),s.$clickSelection=null,n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1},a=function(){s[s.state]&&s[s.state]()};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){u(e.domEvent)});r.capture(this.editor.container,o,u);var f=setInterval(a,20)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:1},dragDelay:{initialValue:150},focusTimout:{initialValue:0}}),t.MouseHandler=l}),ace.define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/useragent"],function(e,t,n){function o(e){e.$clickSelection=null;var t=e.editor;t.setDefaultHandler("mousedown",this.onMouseDown.bind(e)),t.setDefaultHandler("dblclick",this.onDoubleClick.bind(e)),t.setDefaultHandler("tripleclick",this.onTripleClick.bind(e)),t.setDefaultHandler("quadclick",this.onQuadClick.bind(e)),t.setDefaultHandler("mousewheel",this.onMouseWheel.bind(e));var n=["select","startSelect","drag","dragEnd","dragWait","dragWaitEnd","startDrag","focusWait"];n.forEach(function(t){e[t]=this[t]},this),e.selectByLines=this.extendSelectionBy.bind(e,"getLineRange"),e.selectByWords=this.extendSelectionBy.bind(e,"getWordRange")}function u(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}function a(e,t){if(e.start.row==e.end.row)var n=2*t.column-e.start.column-e.end.column;else var n=2*t.row-e.start.row-e.end.row;return n<0?{cursor:e.start,anchor:e.end}:{cursor:e.end,anchor:e.start}}var r=e("../lib/dom"),i=e("../lib/useragent"),s=0;(function(){this.onMouseDown=function(e){var t=e.inSelection(),n=e.getDocumentPosition();this.mousedownEvent=e;var r=this.editor,i=e.getButton();if(i!==0){var s=r.getSelectionRange(),o=s.isEmpty();o&&(r.moveCursorToPosition(n),r.selection.clearSelection()),r.textInput.onContextMenu(e.domEvent);return}if(t&&!r.isFocused()){r.focus();if(this.$focusTimout&&!this.$clickSelection&&!r.inMultiSelectMode)return this.setState("focusWait"),this.captureMouse(e),e.preventDefault()}return!t||this.$clickSelection||e.getShiftKey()||r.inMultiSelectMode?this.startSelect(n):t&&(this.mousedownEvent.time=(new Date).getTime(),this.setState("dragWait")),this.captureMouse(e),e.preventDefault()},this.startSelect=function(e){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y),this.mousedownEvent.getShiftKey()?this.editor.selection.selectToPosition(e):this.$clickSelection||(this.editor.moveCursorToPosition(e),this.editor.selection.clearSelection()),this.setState("select")},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=a(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=a(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.renderer.scrollCursorIntoView()},this.startDrag=function(){var e=this.editor;this.setState("drag"),this.dragRange=e.getSelectionRange();var t=e.getSelectionStyle();this.dragSelectionMarker=e.session.addMarker(this.dragRange,"ace_selection",t),e.clearSelection(),r.addCssClass(e.container,"ace_dragging"),this.$dragKeybinding||(this.$dragKeybinding={handleKeyboard:function(e,t,n,r){if(n=="esc")return{command:this.command}},command:{exec:function(e){var t=e.$mouseHandler;t.dragCursor=null,t.dragEnd(),t.startSelect()}}}),e.keyBinding.addKeyboardHandler(this.$dragKeybinding)},this.focusWait=function(){var e=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=(new Date).getTime();(e>s||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.dragWait=function(e){var t=u(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),n=(new Date).getTime(),r=this.editor;t>s?this.startSelect(this.mousedownEvent.getDocumentPosition()):n-this.mousedownEvent.time>r.$mouseHandler.$dragDelay&&this.startDrag()},this.dragWaitEnd=function(e){this.mousedownEvent.domEvent=e,this.startSelect()},this.drag=function(){var e=this.editor;this.dragCursor=e.renderer.screenToTextCoordinates(this.x,this.y),e.moveCursorToPosition(this.dragCursor),e.renderer.scrollCursorIntoView()},this.dragEnd=function(e){var t=this.editor,n=this.dragCursor,i=this.dragRange;r.removeCssClass(t.container,"ace_dragging"),t.session.removeMarker(this.dragSelectionMarker),t.keyBinding.removeKeyboardHandler(this.$dragKeybinding);if(!n)return;t.clearSelection();if(e&&(e.ctrlKey||e.altKey)){var s=t.session,o=i;o.end=s.insert(n,s.getTextRange(i)),o.start=n}else{if(i.contains(n.row,n.column))return;var o=t.moveText(i,n)}if(!o)return;t.selection.setSelectionRange(o)},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);if(i){i.isEmpty()&&(i.start.column--,i.end.column++),this.$clickSelection=i,this.setState("select");return}this.$clickSelection=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines"),this.$clickSelection=n.selection.getLineRange(t.row)},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("null")},this.onMouseWheel=function(e){if(e.getShiftKey()||e.getAccelKey())return;var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(o.prototype),t.DefaultHandlers=o}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/event"],function(e,t,n){function s(e){function f(){u=r.createElement("div"),u.className="ace_gutter-tooltip",u.style.display="none",t.container.appendChild(u)}function l(){u||f();var e=o.getDocumentPosition().row,r=n.$annotations[e];if(!r)return c();var i=t.session.getLength();if(e==i){var s=t.renderer.pixelToScreenCoordinates(0,o.y).row,l=o.$pos;if(s>t.session.documentToScreenRow(l.row,l.column))return c()}if(a==r)return;a=r.text.join("<br/>"),u.style.display="block",u.innerHTML=a,t.on("mousewheel",c),h(o)}function c(){s&&(s=clearTimeout(s)),a&&(u.style.display="none",a=null,t.removeEventListener("mousewheel",c))}function h(e){var n=t.renderer.$gutter.getBoundingClientRect();u.style.left=e.x+15+"px",e.y+3*t.renderer.lineHeight+15<n.bottom?(u.style.bottom="",u.style.top=e.y+15+"px"):(u.style.top="",u.style.bottom=n.bottom-e.y+5+"px")}var t=e.editor,n=t.renderer.$gutterLayer;e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused())return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.captureMouse(r,"selectByLines"),r.preventDefault()});var s,o,u,a;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();a&&h(t),o=t;if(s)return;s=setTimeout(function(){s=null,o&&!e.isMousePressed?l():c()},50)}),i.addListener(t.renderer.$gutter,"mouseout",function(e){o=null;if(!a||s)return;s=setTimeout(function(){s=null,c()},50)})}var r=e("../lib/dom"),i=e("../lib/event");t.GutterHandler=s}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor;if(e.getReadOnly())this.$inSelection=!1;else{var t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop",["require","exports","module","ace/lib/event"],function(e,t,n){var r=e("../lib/event"),i=function(e){function h(){u=t.selection.toOrientedRange(),n=t.session.addMarker(u,"ace_selection",t.getSelectionStyle()),t.clearSelection(),clearInterval(o),o=setInterval(c,20),f=0,r.addListener(document,"mousemove",v)}function p(){clearInterval(o),t.session.removeMarker(n),n=null,t.selection.fromOrientedRange(u),f=0,r.removeListener(document,"mousemove",v)}function v(){d==null&&(d=setTimeout(function(){d!=null&&n&&p()},20))}var t=e.editor,n,i,s,o,u,a,f=0,l=t.container;r.addListener(l,"dragenter",function(e){if(t.getReadOnly())return;var i=e.dataTransfer.types;if(i&&Array.prototype.indexOf.call(i,"text/plain")===-1)return;return n||h(),f++,r.preventDefault(e)}),r.addListener(l,"dragover",function(e){if(t.getReadOnly())return;var n=e.dataTransfer.types;if(n&&Array.prototype.indexOf.call(n,"text/plain")===-1)return;return d!==null&&(d=null),i=e.clientX,s=e.clientY,r.preventDefault(e)});var c=function(){a=t.renderer.screenToTextCoordinates(i,s),t.moveCursorToPosition(a),t.renderer.scrollCursorIntoView()};r.addListener(l,"dragleave",function(e){f--;if(f<=0&&n)return p(),r.preventDefault(e)}),r.addListener(l,"drop",function(e){if(!n)return;return u.end=t.session.insert(a,e.dataTransfer.getData("Text")),u.start=a,p(),t.focus(),r.preventDefault(e)});var d=null};t.DragdropHandler=i}),ace.define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/event_emitter"],function(e,t,n){"no use strict";function f(e){return e.replace(/-(.)/g,function(e,t){return t.toUpperCase()})}var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./lib/net"),o=e("./lib/event_emitter").EventEmitter,u=function(){return this}(),a={packaged:!1,workerPath:null,modePath:null,themePath:null,basePath:"",suffix:".js",$moduleUrls:{}};t.get=function(e){if(!a.hasOwnProperty(e))throw new Error("Unknown config key: "+e);return a[e]},t.set=function(e,t){if(!a.hasOwnProperty(e))throw new Error("Unknown config key: "+e);a[e]=t},t.all=function(){return r.copyObject(a)},i.implement(t,o),t.moduleUrl=function(e,t){if(a.$moduleUrls[e])return a.$moduleUrls[e];var n=e.split("/");t=t||n[n.length-2]||"";var r=n[n.length-1].replace(t,"").replace(/(^[\-_])|([\-_]$)/,"");!r&&n.length>1&&(r=n[n.length-2]);var i=a[t+"Path"];return i==null&&(i=a.basePath),i&&i.slice(-1)!="/"&&(i+="/"),i+t+"-"+r+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i)return r&&r(i);var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e}),r&&r(e)})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=function(){a.packaged=e.packaged||n.packaged||u.define&&define.packaged;if(!u.document)return"";var r={},i="",s=document.getElementsByTagName("script");for(var o=0;o<s.length;o++){var l=s[o],c=l.src||l.getAttribute("src");if(!c)continue;var h=l.attributes;for(var p=0,d=h.length;p<d;p++){var v=h[p];v.name.indexOf("data-ace-")===0&&(r[f(v.name.replace(/^data-ace-/,""))]=v.value)}var m=c.match(/^(.*)\/ace(\-\w+)?\.js(\?|$)/);m&&(i=m[1])}i&&(r.base=r.base||i,r.packaged=!0),r.basePath=r.base,r.workerPath=r.workerPath||r.base,r.modePath=r.modePath||r.base,r.themePath=r.themePath||r.base,delete r.base;for(var g in r)typeof r[g]!="undefined"&&t.set(g,r[g])};var l={setOptions:function(e){Object.keys(e).forEach(function(t){this.setOption(t,e[t])},this)},getOptions:function(e){var t={};return Object.keys(e).forEach(function(e){t[e]=this.getOption(e)},this),t},setOption:function(e,t){if(this["$"+e]===t)return;var n=this.$options[e];if(!n)return undefined;if(n.forwardTo)return this[n.forwardTo]&&this[n.forwardTo].setOption(e,t);n.handlesSet||(this["$"+e]=t),n&&n.set&&n.set.call(this,t)},getOption:function(e){var t=this.$options[e];return t?t.forwardTo?this[t.forwardTo]&&this[t.forwardTo].getOption(e):t&&t.get?t.get.call(this):this["$"+e]:undefined}},c={};t.defineOptions=function(e,t,n){return e.$options||(c[t]=e.$options={}),Object.keys(n).forEach(function(t){var r=n[t];typeof r=="string"&&(r={forwardTo:r}),r.name||(r.name=t),e.$options[r.name]=r,"initialValue"in r&&(e["$"+r.name]=r.initialValue)}),i.implement(e,l),this},t.resetOptions=function(e){Object.keys(e.$options).forEach(function(t){var n=e.$options[t];"value"in n&&e.setOption(t,n.value)})},t.setDefaultValue=function(e,n,r){var i=c[e]||(c[e]={});i[n]&&(i.forwardTo?t.setDefaultValue(i.forwardTo,n,r):i[n].value=r)},t.setDefaultValues=function(e,n){Object.keys(n).forEach(function(r){t.setDefaultValue(e,r,n[r])})}}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),t.target||(t.target=this);for(var o=0;o<n.length;o++){n[o](t);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;for(var r=0;r<n.length;r++)n[r](t)},r.once=function(e,t){var n=this,r=function(){fun&&fun.apply(null,arguments),n.removeEventListener(event,r)};this.addEventListener(event,r)},r.setDefaultHandler=function(e,t){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[e])throw new Error("The default handler for '"+e+"' is already set");this._defaultHandlers[e]=t},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?"unshift":"push"](t),t},r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("guttermousedown",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){var r=o.start.row,u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0),this.$data={editor:this.$editor}},this.setKeyboardHandler=function(e){if(this.$handlers[this.$handlers.length-1]==e)return;while(this.$handlers[1])this.removeKeyboardHandler(this.$handlers[1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=s.passEvent!=1:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&i.stopEvent(r);if(o)break}return o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){var t=this.$callKeyboardHandlers(-1,e);t||this.$editor.commands.exec("insertstring",this.$editor,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./config"),o=e("./lib/event_emitter").EventEmitter,u=e("./selection").Selection,a=e("./mode/text").Mode,f=e("./range").Range,l=e("./document").Document,c=e("./background_tokenizer").BackgroundTokenizer,h=e("./search_highlight").SearchHighlight,p=function(e,t){this.$breakpoints=[],this.$decorations=[],this.$frontMarkers={},this.$backMarkers={},this.$markerId=1,this.$undoSelect=!0,this.$foldData=[],this.$foldData.toString=function(){return this.join("\n")},this.on("changeFold",this.onChangeFold.bind(this)),this.$onChange=this.onChange.bind(this);if(typeof e!="object"||!e.getLine)e=new l(e);this.setDocument(e),this.selection=new u(this),this.setMode(t),s.resetOptions(this),s._emit("session",this)};(function(){function g(e){return e<4352?!1:e>=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t<s))return i;r=i-1}}return n-1},this.resetCaches=function(){this.$modified=!0,this.$wrapData=[],this.$rowLengthCache=[],this.$resetRowCache(0),this.bgTokenizer&&this.bgTokenizer.start(0)},this.onChangeFold=function(e){var t=e.data;this.$resetRowCache(t.start.row)},this.onChange=function(e){var t=e.data;this.$modified=!0,this.$resetRowCache(t.range.start.row);var n=this.$updateInternalDataOnChange(e);!this.$fromUndo&&this.$undoManager&&!t.ignore&&(this.$deltasDoc.push(t),n&&n.length!=0&&this.$deltasFold.push({action:"removeFolds",folds:n}),this.$informUndoManager.schedule()),this.bgTokenizer.$updateOnChange(t),this._emit("change",e)},this.setValue=function(e){this.doc.setValue(e),this.selection.moveCursorTo(0,0),this.selection.clearSelection(),this.$resetRowCache(0),this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.getUndoManager().reset()},this.getValue=this.toString=function(){return this.doc.getValue()},this.getSelection=function(){return this.selection},this.getState=function(e){return this.bgTokenizer.getState(e)},this.getTokens=function(e){return this.bgTokenizer.getTokens(e)},this.getTokenAt=function(e,t){var n=this.bgTokenizer.getTokens(e),r,i=0;if(t==null)s=n.length-1,i=this.getLine(e).length;else for(var s=0;s<n.length;s++){i+=n[s].value.length;if(i>=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t]}),t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize==0},this.$overwrite=!1,this.setOverwrite=function(e){if(this.$overwrite==e)return;this.$overwrite=e,this._emit("changeOverwrite")},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._emit("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._emit("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t<e.length;t++)this.$breakpoints[e[t]]="ace_breakpoint";this._emit("changeBreakpoint",{})},this.clearBreakpoints=function(){this.$breakpoints=[],this._emit("changeBreakpoint",{})},this.setBreakpoint=function(e,t){t===undefined&&(t="ace_breakpoint"),t?this.$breakpoints[e]=t:delete this.$breakpoints[e],this._emit("changeBreakpoint",{})},this.clearBreakpoint=function(e){delete this.$breakpoints[e],this._emit("changeBreakpoint",{})},this.addMarker=function(e,t,n,r){var i=this.$markerId++,s={range:e,type:n||"line",renderer:typeof n=="function"?n:null,clazz:t,inFront:!!r,id:i};return r?(this.$frontMarkers[i]=s,this._emit("changeFrontMarker")):(this.$backMarkers[i]=s,this._emit("changeBackMarker")),i},this.addDynamicMarker=function(e,t){if(!e.update)return;var n=this.$markerId++;return e.id=n,e.inFront=!!t,t?(this.$frontMarkers[n]=e,this._emit("changeFrontMarker")):(this.$backMarkers[n]=e,this._emit("changeBackMarker")),e},this.removeMarker=function(e){var t=this.$frontMarkers[e]||this.$backMarkers[e];if(!t)return;var n=t.inFront?this.$frontMarkers:this.$backMarkers;t&&(delete n[e],this._emit(t.inFront?"changeFrontMarker":"changeBackMarker"))},this.getMarkers=function(e){return e?this.$frontMarkers:this.$backMarkers},this.highlight=function(e){if(!this.$searchHighlight){var t=new h(null,"ace_selected-word","text");this.$searchHighlight=this.addDynamicMarker(t)}this.$searchHighlight.setRegexp(e)},this.highlightLines=function(e,t,n,r){typeof t!="number"&&(n=t,t=e),n||(n="ace_step");var i=new f(e,0,t,Infinity);return i.id=this.addMarker(i,n,"fullLine",r),i},this.setAnnotations=function(e){this.$annotations=e,this._emit("changeAnnotation",{})},this.getAnnotations=function(){return this.$annotations||[]},this.clearAnnotations=function(){this.setAnnotations([])},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r?\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getWordRange=function(e,t){var n=this.getLine(e),r=!1;t>0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(o<n.length&&n.charAt(o).match(i))o++;return new f(e,s,e,o)},this.getAWordRange=function(e,t){var n=this.getWordRange(e,t),r=this.getLine(n.end.row);while(r.charAt(n.end.column).match(/[ \t]/))n.end.column+=1;return n},this.setNewLineMode=function(e){this.doc.setNewLineMode(e)},this.getNewLineMode=function(){return this.doc.getNewLineMode()},this.setUseWorker=function(e){this.setOption("useWorker",e)},this.getUseWorker=function(){return this.$useWorker},this.onReloadTokenizer=function(e){var t=e.data;this.bgTokenizer.start(t.first),this._emit("tokenizerUpdate",e)},this.$modes={},this.$mode=null,this.$modeId=null,this.setMode=function(e){if(e&&typeof e=="object"){if(e.getTokenizer)return this.$onChangeMode(e);var t=e,n=t.path}else n=e||"ace/mode/text";this.$modes["ace/mode/text"]||(this.$modes["ace/mode/text"]=new a);if(this.$modes[n]&&!t)return this.$onChangeMode(this.$modes[n]);this.$modeId=n,s.loadModule(["mode",n],function(e){if(this.$modeId!==n)return;if(this.$modes[n]&&!t)return this.$onChangeMode(this.$modes[n]);e&&e.Mode&&(e=new e.Mode(t),t||(this.$modes[n]=e,e.$id=n),this.$onChangeMode(e))}.bind(this)),this.$mode||this.$onChangeMode(this.$modes["ace/mode/text"],!0)},this.$onChangeMode=function(e,t){if(this.$mode===e)return;this.$mode=e,this.$stopWorker(),this.$useWorker&&this.$startWorker();var n=e.getTokenizer();if(n.addEventListener!==undefined){var r=this.onReloadTokenizer.bind(this);n.addEventListener("update",r)}if(!this.bgTokenizer){this.bgTokenizer=new c(n);var i=this;this.bgTokenizer.addEventListener("update",function(e){i._emit("tokenizerUpdate",e)})}else this.bgTokenizer.setTokenizer(n);this.bgTokenizer.setDocument(this.getDocument()),this.tokenRe=e.tokenRe,this.nonTokenRe=e.nonTokenRe,t||(this.$modeId=e.$id,this.$setFolding(e.foldingRules),this._emit("changeMode"),this.bgTokenizer.start(0))},this.$stopWorker=function(){this.$worker&&this.$worker.terminate(),this.$worker=null},this.$startWorker=function(){if(typeof Worker!="undefined"&&!e.noWorker)try{this.$worker=this.$mode.createWorker(this)}catch(t){console.log("Could not load worker"),console.log(t),this.$worker=null}else this.$worker=null},this.getMode=function(){return this.$mode},this.$scrollTop=0,this.setScrollTop=function(e){e=Math.round(Math.max(0,e));if(this.$scrollTop===e||isNaN(e))return;this.$scrollTop=e,this._signal("changeScrollTop",e)},this.getScrollTop=function(){return this.$scrollTop},this.$scrollLeft=0,this.setScrollLeft=function(e){e=Math.round(Math.max(0,e));if(this.$scrollLeft===e||isNaN(e))return;this.$scrollLeft=e,this._signal("changeScrollLeft",e)},this.getScrollLeft=function(){return this.$scrollLeft},this.getScreenWidth=function(){return this.$computeWidth(),this.screenWidth},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;a<u;a++){if(a>o){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;r<e.length;r++){var i=e[r];i.group=="doc"&&(this.doc.applyDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!1,n))}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.setUndoSelect=function(e){this.$undoSelect=e},this.$getUndoSelection=function(e,t,n){function r(e){var n=e.action==="insertText"||e.action==="insertLines";return t?!n:n}var i=e[0],s,o,u=!1;r(i)?(s=i.range.clone(),u=!0):(s=f.fromPoints(i.range.start,i.range.start),u=!1);for(var a=1;a<e.length;a++)i=e[a],r(i)?(o=i.range.start,s.compare(o.row,o.column)==-1&&s.setStart(i.range.start),o=i.range.end,s.compare(o.row,o.column)==1&&s.setEnd(i.range.end),u=!0):(o=i.range.start,s.compare(o.row,o.column)==-1&&(s=f.fromPoints(i.range.start,i.range.start)),u=!1);if(n!=null){var l=n.compareRange(s);l==1?s.setStart(n.start):l==-1&&s.setEnd(n.end)}return s},this.replace=function(e,t){return this.doc.replace(e,t)},this.moveText=function(e,t,n){var r=this.getTextRange(e),i=this.getFoldsInRange(e),s=f.fromPoints(t,t);if(!n){this.remove(e);var o=e.start.row-e.end.row,u=o?-e.end.column:e.start.column-e.end.column;u&&(s.start.row==e.end.row&&s.start.column>e.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.insert({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o<r;++o)if(s.charAt(o)!=" ")break;o<r&&s.charAt(o)==" "?(n.start.column=o,n.end.column=o+1):(n.start.column=0,n.end.column=o),this.remove(n)}},this.$moveLines=function(e,t,n){e=this.getRowFoldStart(e),t=this.getRowFoldEnd(t);if(n<0){var r=this.getRowFoldStart(e+n);if(r<0)return 0;var i=r-e}else if(n>0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeLines(e,t);return this.doc.insertLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=[];for(var n=0;n<t;n++)this.$wrapData.push([]);this.$updateWrapData(0,t-1)}this._emit("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange.min=e,this.$wrapLimitRange.max=t,this.$modified=!0,this._emit("changeWrapMode")},this.adjustWrapLimit=function(e){var t=this.$constrainWrapLimit(e);return t!=this.$wrapLimit&&t>0?(this.$wrapLimit=t,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._emit("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e){var t=this.$wrapLimitRange.min;t&&(e=Math.max(t,e));var n=this.$wrapLimitRange.max;return n&&(e=Math.min(n,e)),Math.max(1,e)},this.getWrapLimit=function(){return this.$wrapLimit},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n,r=e.data.action,i=e.data.range.start.row,s=e.data.range.end.row,o=e.data.range.start,u=e.data.range.end,a=null;r.indexOf("Lines")!=-1?(r=="insertLines"?s=i+e.data.lines.length:s=i,n=e.data.lines?e.data.lines.length:s-i):n=s-i;if(n!=0)if(r.indexOf("remove")!=-1){this[t?"$wrapData":"$rowLengthCache"].splice(i,n);var f=this.$foldData;a=this.getFoldsInRange(e.data.range),this.removeFolds(a);var l=this.getFoldLine(u.row),c=0;if(l){l.addRemoveChars(u.row,u.column,o.column-u.column),l.shiftRow(-n);var h=this.getFoldLine(i);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=u.row&&l.shiftRow(-n)}s=i}else{var p;if(t){p=[i,0];for(var d=0;d<n;d++)p.push([]);this.$wrapData.splice.apply(this.$wrapData,p)}else p=Array(n),p.unshift(i,0),this.$rowLengthCache.splice.apply(this.$rowLengthCache,p);var f=this.$foldData,l=this.getFoldLine(i),c=0;if(l){var v=l.range.compareInside(o.row,o.column);v==0?(l=l.split(o.row,o.column),l.shiftRow(n),l.addRemoveChars(s,0,u.column-o.column)):v==-1&&(l.addRemoveChars(i,0,u.column-o.column),l.shiftRow(n)),c=f.indexOf(l)+1}for(c;c<f.length;c++){var l=f[c];l.start.row>=i&&l.shiftRow(n)}}else{n=Math.abs(e.data.range.start.column-e.data.range.end.column),r.indexOf("remove")!=-1&&(a=this.getFoldsInRange(e.data.range),this.removeFolds(a),n=-n);var l=this.getFoldLine(i);l&&l.addRemoveChars(i,o.column,n)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),t?this.$updateWrapData(i,s):this.$updateRowLengthCache(i,s),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var n=this.doc.getAllLines(),r=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,c=e;t=Math.min(t,n.length-1);while(c<=t){f=this.getFoldLine(c,f);if(!f)a=this.$getDisplayTokens(i.stringTrimRight(n[c])),s[c]=this.$computeWrapSplits(a,o,r),c++;else{a=[],f.walk(function(e,t,r,i){var s;if(e!=null){s=this.$getDisplayTokens(e,a.length),s[0]=u;for(var o=1;o<s.length;o++)s[o]=l}else s=this.$getDisplayTokens(n[t].substring(i,r),a.length);a=a.concat(s)}.bind(this),f.end.row,n[f.end.row].length+1);while(a.length!=0&&a[a.length-1]>=d)a.pop();s[f.start.row]=this.$computeWrapSplits(a,o,r),c=f.end.row+1}}};var t=1,n=2,u=3,l=4,p=9,d=10,v=11,m=12;this.$computeWrapSplits=function(e,t){function o(t){var r=e.slice(i,t),o=r.length;r.join("").replace(/12/g,function(){o-=1}).replace(/2/g,function(){o-=1}),s+=o,n.push(s),i=t}if(e.length==0)return[];var n=[],r=e.length,i=0,s=0;while(r-i>t){var a=i+t;if(e[a]>=d){while(e[a]>=d)a++;o(a);continue}if(e[a]==u||e[a]==l){for(a;a!=i-1;a--)if(e[a]==u)break;if(a>i){o(a);continue}a=i+t;for(a;a<e.length;a++)if(e[a]!=l)break;if(a==e.length)break;o(a);continue}var f=Math.max(a-10,i-1);while(a>f&&e[a]<u)a--;while(a>f&&e[a]==p)a--;if(a>f){o(++a);continue}a=i+t,o(a)}return n},this.$getDisplayTokens=function(e,r){var i=[],s;r=r||0;for(var o=0;o<e.length;o++){var u=e.charCodeAt(o);if(u==9){s=this.getScreenTabSize(i.length+r),i.push(v);for(var a=1;a<s;a++)i.push(m)}else u==32?i.push(d):u>39&&u<48||u>57&&u<64?i.push(p):u>=4352&&g(u)?i.push(t,n):i.push(t)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i<e.length;i++){r=e.charCodeAt(i),r==9?n+=this.getScreenTabSize(n):r>=4352&&g(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.getRowLength=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getScreenLastRowColumn=function(e){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE);return this.documentToScreenColumn(t.row,t.column)},this.getDocumentLastRowColumn=function(e,t){var n=this.documentToScreenRow(e,t);return this.getScreenLastRowColumn(n)},this.getDocumentLastRowColumnPosition=function(e,t){var n=this.documentToScreenRow(e,t);return this.screenToDocumentPosition(n,Number.MAX_VALUE/10)},this.getRowSplitData=function(e){return this.$useWrapMode?this.$wrapData[e]:undefined},this.getScreenTabSize=function(e){return this.$tabSize-e%this.$tabSize},this.screenToDocumentRow=function(e,t){return this.screenToDocumentPosition(e,t).row},this.screenToDocumentColumn=function(e,t){return this.screenToDocumentPosition(e,t).column},this.screenToDocumentPosition=function(e,t){if(e<0)return{row:0,column:0};var n,r=0,i=0,s,o=0,u=0,a=this.$screenRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u-1>=e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}if(this.$useWrapMode){var v=this.$wrapData[r];v&&(s=v[e-o],e>o&&v.length&&(i=v[e-o-1]||v[v.length-1],n=n.substring(i)))}return i+=this.$getStringScreenWidth(n,t)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u<e){if(u>=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);if(this.$useWrapMode){var v=this.$wrapData[i],m=0;while(d.length>=v[m])r++,m++;d=d.substring(v[m-1]||0,d.length)}return{row:r,column:this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;r<n.length;r++)t=n[r],e-=t.end.row-t.start.row}else{var i=this.$wrapData.length,s=0,r=0,t=this.$foldData[r++],o=t?t.start.row:Infinity;while(s<i)e+=this.$wrapData[s].length+1,s++,s>o&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}return e}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:typeof e=="string"&&(e=parseInt(e,10)||!1);if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setUseWrapMode(!0),this.setWrapLimitRange(t,t)}this.$wrap=e},get:function(){return this.getUseWrapMode()?this.getWrapLimitRange().min||"free":"off"},handlesSet:!0},firstLineNumber:{set:function(){this._emit("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._emit("changeTabSize")},initialValue:4,handlesSet:!0}}),t.EditSession=p}),ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/lang"),s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=function(e){this.session=e,this.doc=e.getDocument(),this.clearSelection(),this.lead=this.selectionLead=this.doc.createAnchor(0,0),this.anchor=this.selectionAnchor=this.doc.createAnchor(0,0);var t=this;this.lead.on("change",function(e){t._emit("changeCursor"),t.$isEmpty||t._emit("changeSelection"),!t.$keepDesiredColumnOnChange&&e.old.column!=e.value.column&&(t.$desiredColumn=null)}),this.selectionAnchor.on("change",function(){t.$isEmpty||t._emit("changeSelection")})};(function(){r.implement(this,s),this.isEmpty=function(){return this.$isEmpty||this.anchor.row==this.lead.row&&this.anchor.column==this.lead.column},this.isMultiLine=function(){return this.isEmpty()?!1:this.getRange().isMultiLine()},this.getCursor=function(){return this.lead.getPosition()},this.setSelectionAnchor=function(e,t){this.anchor.setPosition(e,t),this.$isEmpty&&(this.$isEmpty=!1,this._emit("changeSelection"))},this.getSelectionAnchor=function(){return this.$isEmpty?this.getSelectionLead():this.anchor.getPosition()},this.getSelectionLead=function(){return this.lead.getPosition()},this.shiftSelection=function(e){if(this.$isEmpty){this.moveCursorTo(this.lead.row,this.lead.column+e);return}var t=this.getSelectionAnchor(),n=this.getSelectionLead(),r=this.isBackwards();(!r||t.column!==0)&&this.setSelectionAnchor(t.row,t.column+e),(r||n.column!==0)&&this.$moveSelection(function(){this.moveCursorTo(n.row,n.column+e)})},this.isBackwards=function(){var e=this.anchor,t=this.lead;return e.row>t.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column==0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row<this.doc.getLength()-1&&this.moveCursorTo(this.lead.row+1,0);else{var n=this.session.getTabSize(),e=this.lead;this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column,e.column+n).split(" ").length-1==n?this.moveCursorBy(0,n):this.moveCursorBy(0,1)}},this.moveCursorLineStart=function(){var e=this.lead.row,t=this.lead.column,n=this.session.documentToScreenRow(e,t),r=this.session.screenToDocumentPosition(n,0),i=this.session.getDisplayLine(e,null,r.row,r.column),s=i.match(/^\s*/);s[0].length!=t&&!this.session.$useEmacsStyleLineStart&&(r.column+=s[0].length),this.moveCursorToPosition(r)},this.moveCursorLineEnd=function(){var e=this.lead,t=this.session.getDocumentLastRowColumnPosition(e.row,e.column);if(this.lead.column==t.column){var n=this.session.getLine(t.row);if(t.column==n.length){var r=n.search(/\s+$/);r>0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e<this.doc.getLength()-1&&this.moveCursorWordRight();return}if(i=this.session.tokenRe.exec(r))t+=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.moveCursorLongWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1)){this.moveCursorTo(n.start.row,n.start.column);return}var r=this.session.getFoldStringAt(e,t,-1);r==null&&(r=this.doc.getLine(e).substring(0,t));var s=i.stringReverse(r),o;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;if(o=this.session.nonTokenRe.exec(s))t-=this.session.nonTokenRe.lastIndex,s=s.slice(this.session.nonTokenRe.lastIndex),this.session.nonTokenRe.lastIndex=0;if(t<=0){this.moveCursorTo(e,0),this.moveCursorLeft(),e>0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<=1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e<s&&/^\s*$/.test(r));/^\s+/.test(r)||(r=""),t=0}var o=this.$shortWordEndIndex(r);this.moveCursorTo(e,t+o)},this.moveCursorShortWordLeft=function(){var e=this.lead.row,t=this.lead.column,n;if(n=this.session.getFoldAt(e,t,-1))return this.moveCursorTo(n.start.row,n.start.column);var r=this.session.getLine(e).substring(0,t);if(t==0){do e--,r=this.doc.getLine(e);while(e>0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e}}).call(u.prototype),t.Selection=u}),ace.define("ace/range",["require","exports","module"],function(e,t,n){var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,t.Range=i}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang"],function(e,t,n){var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=function(){this.$tokenizer=new r((new i).getRules()),this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|s])+","g"),this.getTokenizer=function(){return this.$tokenizer},this.toggleCommentLines=function(e,t,n,r){var i=t.doc,s,o;if(!this.lineCommentStart)return!1;Array.isArray(this.lineCommentStart)?(s=this.lineCommentStart.map(u.escapeRegExp).join("|"),o=this.lineCommentStart[0]):(s=u.escapeRegExp(this.lineCommentStart),o=this.lineCommentStart),s=new RegExp("^\\s*(?:"+s+") ?");var a=!0,f=Infinity,l=[];for(var c=n;c<=r;c++){var h=i.getLine(c),p=h.search(/\S|$/);l[c]=p,p<f&&(f=p),a&&!s.test(h)&&(a=!1)}if(a)for(var c=n;c<=r;c++){var h=i.getLine(c),d=h.match(s);i.removeInLine(c,l[c],d[0].length)}else{o+=" ";for(var c=n;c<=r;c++)i.insertInLine({row:c,column:f},o)}},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){if(!this.$embeds)return;this.$modes={};for(var t=0;t<this.$embeds.length;t++)e[this.$embeds[t]]&&(this.$modes[this.$embeds[t]]=new e[this.$embeds[t]]);var n=["toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction"];for(var t=0;t<n.length;t++)(function(e){var r=n[t],i=e[r];e[n[t]]=function(){return this.$delegator(r,arguments,i)}})(this)},this.$delegator=function(e,t,n){var r=t[0];for(var i=0;i<this.$embeds.length;i++){if(!this.$modes[this.$embeds[i]])continue;var s=r.split(this.$embeds[i]);if(!s[0]&&s[1]){t[0]=s[1];var o=this.$modes[this.$embeds[i]];return o[e].apply(o,t)}}var u=n.apply(this,t);return n?u:undefined},this.transformAction=function(e,t,n,r,i){if(this.$behaviour){var s=this.$behaviour.getBehaviours();for(var o in s)if(s[o][t]){var u=s[o][t].apply(this,arguments);if(u)return u}}}}).call(a.prototype),t.Mode=a}),ace.define("ace/tokenizer",["require","exports","module"],function(e,t,n){var r=1e3,i=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g";for(var u=0;u<n.length;u++){var a=n[u];a.defaultToken&&(s.defaultToken=a.defaultToken),a.caseInsensitive&&(o="gi");if(a.regex==null)continue;a.regex instanceof RegExp&&(a.regex=a.regex.toString().slice(1,-1));var f=a.regex,l=(new RegExp("(?:("+f+")|(.))")).exec("a").length-2;Array.isArray(a.token)?a.token.length==1?a.token=a.token[0]:(a.tokenArray=a.token,a.onMatch=this.$arrayTokens):typeof a.token=="function"&&!a.onMatch&&(l>1?a.onMatch=this.$applyToken:a.onMatch=a.token),l>1&&(/\\\d/.test(a.regex)?f=a.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(l=1,f=this.removeCapturingGroups(a.regex)),!a.splitRegex&&typeof a.token!="string"&&(a.splitRegex=this.createSplitterRegexp(a.regex,o))),s[i]=u,i+=l,r.push(f),a.onMatch||(a.onMatch=null),a.__proto__=null}this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;i<s;i++)t[i]&&(r[r.length]={type:n[i],value:t[i]});return r},this.$arrayTokens=function(e){if(!e)return[];var t=this.splitRegex.exec(e),n=[],r=this.tokenArray;if(r.length!=t.length-1)return window.console&&console.error(r,t,e,this.splitRegex,this),[{type:"error.invalid",value:e}];for(var i=0,s=r.length;i<s;i++)t[i+1]&&(n[n.length]={type:r[i],value:t[i+1]});return n},this.removeCapturingGroups=function(e){var t=e.replace(/\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g,function(e,t){return t?"(?:":e});return t},this.createSplitterRegexp=function(e,t){if(e.indexOf("(?=")!=-1){var n=0,r=!1,i={};e.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([])/g,function(e,t,s,o,u,a){return r?r=u!="]":u?r=!0:o?(n==i.stack&&(i.end=a+1),n--):s&&(n++,s.length!=1&&(i.stack=n,i.start=a)),e}),i.end!=null&&/^\)*$/.test(e.substr(i.end))&&(e=e.substring(0,i.start)+e.substr(i.end))}return new RegExp(e,(t||"").replace("g",""))},this.getLineTokens=function(e,t){if(t&&typeof t!="string"){var n=t.slice(0);t=n[0]}else var n=[];var i=t||"start",s=this.states[i],o=this.matchMappings[i],u=this.regExps[i];u.lastIndex=0;var a,f=[],l=0,c={type:null,value:""};while(a=u.exec(e)){var h=o.defaultToken,p=null,d=a[0],v=u.lastIndex;if(v-d.length>l){var m=e.substring(l,v-d.length);c.type==h?c.value+=m:(c.type&&f.push(c),c={type:h,value:m})}for(var g=0;g<a.length-2;g++){if(a[g+1]===undefined)continue;p=s[o[g]],p.onMatch?h=p.onMatch(d,i,n):h=p.token,p.next&&(typeof p.next=="string"?i=p.next:i=p.next(i,n),s=this.states[i],s||(window.console&&console.error&&console.error(i,"doesn't exist"),i="start",s=this.states[i]),o=this.matchMappings[i],l=v,u=this.regExps[i],u.lastIndex=v);break}if(d)if(typeof h=="string")!!p&&p.merge===!1||c.type!==h?(c.type&&f.push(c),c={type:h,value:d}):c.value+=d;else{c.type&&f.push(c),c={type:null,value:""};for(var g=0;g<h.length;g++)f.push(h[g])}if(l==e.length)break;l=v;if(f.length>r){c.value+=e.substr(l),i="start";break}}return c.type&&f.push(c),{tokens:f,state:n.length?n:i}}}).call(i.prototype),t.Tokenizer=i}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){for(var n in e){var r=e[n];for(var i=0;i<r.length;i++){var s=r[i];s.next&&(s.next=t+s.next)}this.$rules[t+n]=r}},this.getRules=function(){return this.$rules},this.embedRules=function(e,t,n,i,s){var o=(new e).getRules();if(i)for(var u=0;u<i.length;u++)i[u]=t+i[u];else{i=[];for(var a in o)i.push(t+a)}this.addRules(o,t);if(n){var f=Array.prototype[s?"push":"unshift"];for(var u=0;u<i.length;u++)f.apply(this.$rules[i[u]],r.deepCopy(n))}this.$embeds||(this.$embeds=[]),this.$embeds.push(t)},this.getEmbeds=function(){return this.$embeds};var e=function(e,t){return e!="start"&&t.unshift(this.nextState,e),this.nextState},t=function(e,t){return t[0]!==e?"start":(t.shift(),t.shift())};this.normalizeRules=function(){function i(s){var o=r[s];o.processed=!0;for(var u=0;u<o.length;u++){var a=o[u];!a.regex&&a.start&&(a.regex=a.start,a.next||(a.next=[]),a.next.push({defaultToken:a.token},{token:a.token+".end",regex:a.end||a.start,next:"pop"}),a.token=a.token+".start",a.push=!0);var f=a.next||a.push;if(f&&Array.isArray(f)){var l=a.stateName||a.token+n++;r[l]=f,a.next=l,i(l)}else f=="pop"&&(a.next=t);a.push&&(a.nextState=a.next||a.push,a.next=e,delete a.push);if(a.rules)for(var c in a.rules)r[c]?r[c].push&&r[c].push.apply(r[c],a.rules[c]):r[c]=a.rules[c];if(a.include||typeof a=="string")var h=a.include||a,p=r[h];else Array.isArray(a)&&(p=a);if(p){var d=[u,1].concat(p);a.noEscape&&(d=d.filter(function(e){return!e.next})),o.splice.apply(o,d),u--,p=null}}}var n=0,r=this.$rules;Object.keys(r).forEach(i)},this.createKeywordMapper=function(e,t,n,r){var i=Object.create(null);return Object.keys(e).forEach(function(t){var s=e[t];n&&(s=s.toLowerCase());var o=s.split(r||"|");for(var u=o.length;u--;)i[o[u]]=t}),e=null,n?function(e){return i[e.toLowerCase()]||t}:function(e){return i[e]||t}},this.getKeywords=function(){return this.$keywords}}).call(i.prototype),t.TextHighlightRules=i}),ace.define("ace/mode/behaviour",["require","exports","module"],function(e,t,n){var r=function(){this.$behaviours={}};(function(){this.add=function(e,t,n){switch(undefined){case this.$behaviours:this.$behaviours={};case this.$behaviours[e]:this.$behaviours[e]={}}this.$behaviours[e][t]=n},this.addBehaviours=function(e){for(var t in e)for(var n in e[t])this.add(t,n,e[t][n])},this.remove=function(e){this.$behaviours&&this.$behaviours[e]&&delete this.$behaviours[e]},this.inherit=function(e,t){if(typeof e=="function")var n=(new e).getBehaviours(t);else var n=e.getBehaviours(t);this.addBehaviours(n)},this.getBehaviours=function(e){if(!e)return this.$behaviours;var t={};for(var n=0;n<e.length;n++)this.$behaviours[e[n]]&&(t[e[n]]=this.$behaviours[e[n]]);return t}}).call(r.prototype),t.Behaviour=r}),ace.define("ace/unicode",["require","exports","module"],function(e,t,n){function r(e){var n=/\w{4}/g;for(var r in e)t.packages[r]=e[r].replace(n,"\\u$&")}t.packages={},r({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A",Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./range").Range,o=e("./anchor").Anchor,u=function(e){this.$lines=[],e.length==0?this.$lines=[""]:Array.isArray(e)?this.insertLines(0,e):this.insert({row:0,column:0},e)};(function(){r.implement(this,i),this.setValue=function(e){var t=this.getLength();this.remove(new s(0,0,t,this.getLine(t-1).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},"aaa".split(/a/).length==0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){if(e.start.row==e.end.row)return this.$lines[e.start.row].substring(e.start.column,e.end.column);var t=this.getLines(e.start.row+1,e.end.row-1);return t.unshift((this.$lines[e.start.row]||"").substring(e.start.column)),t.push((this.$lines[e.end.row]||"").substring(0,e.end.column)),t.join(this.getNewLineCharacter())},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t&&(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length),e},this.insert=function(e,t){if(!t||t.length===0)return e;e=this.$clipPosition(e),this.getLength()<=1&&this.$detectNewLine(t);var n=this.$split(t),r=n.splice(0,1)[0],i=n.length==0?null:n.splice(n.length-1,1)[0];return e=this.insertInLine(e,r),i!==null&&(e=this.insertNewLine(e),e=this.insertLines(e.row,n),e=this.insertInLine(e,i||"")),e},this.insertLines=function(e,t){if(t.length==0)return{row:e,column:0};if(t.length>65535){var n=this.insertLines(e,t.slice(65535));t=t.slice(0,65535)}var r=[e,0];r.push.apply(r,t),this.$lines.splice.apply(this.$lines,r);var i=new s(e,0,e+t.length,0),o={action:"insertLines",range:i,lines:t};return this._emit("change",{data:o}),n||i.end},this.insertNewLine=function(e){e=this.$clipPosition(e);var t=this.$lines[e.row]||"";this.$lines[e.row]=t.substring(0,e.column),this.$lines.splice(e.row+1,0,t.substring(e.column,t.length));var n={row:e.row+1,column:0},r={action:"insertText",range:s.fromPoints(e,n),text:this.getNewLineCharacter()};return this._emit("change",{data:r}),n},this.insertInLine=function(e,t){if(t.length==0)return e;var n=this.$lines[e.row]||"";this.$lines[e.row]=n.substring(0,e.column)+t+n.substring(e.column);var r={row:e.row,column:e.column+t.length},i={action:"insertText",range:s.fromPoints(e,r),text:t};return this._emit("change",{data:i}),r},this.remove=function(e){e.start=this.$clipPosition(e.start),e.end=this.$clipPosition(e.end);if(e.isEmpty())return e.start;var t=e.start.row,n=e.end.row;if(e.isMultiLine()){var r=e.start.column==0?t:t+1,i=n-1;e.end.column>0&&this.removeInLine(n,0,e.end.column),i>=r&&this.removeLines(r,i),r!=t&&(this.removeInLine(t,e.start.column,this.getLine(t).length),this.removeNewLine(e.start.row))}else this.removeInLine(t,e.start.column,e.end.column);return e.start},this.removeInLine=function(e,t,n){if(t==n)return;var r=new s(e,t,e,n),i=this.getLine(e),o=i.substring(t,n),u=i.substring(0,t)+i.substring(n,i.length);this.$lines.splice(e,1,u);var a={action:"removeText",range:r,text:o};return this._emit("change",{data:a}),r.start},this.removeLines=function(e,t){var n=new s(e,0,t+1,0),r=this.$lines.splice(e,t-e+1),i={action:"removeLines",range:n,nl:this.getNewLineCharacter(),lines:r};return this._emit("change",{data:i}),r},this.removeNewLine=function(e){var t=this.getLine(e),n=this.getLine(e+1),r=new s(e,t.length,e+1,0),i=t+n;this.$lines.splice(e,2,i);var o={action:"removeText",range:r,text:this.getNewLineCharacter()};this._emit("change",{data:o})},this.replace=function(e,t){if(t.length==0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);if(t)var n=this.insert(e.start,t);else n=e.start;return n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.insertLines(r.start.row,n.lines):n.action=="insertText"?this.insert(r.start,n.text):n.action=="removeLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="removeText"&&this.remove(r)}},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="insertText"?this.remove(r):n.action=="removeLines"?this.insertLines(r.start.row,n.lines):n.action=="removeText"&&this.insert(r.start,n.text)}},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length;return i+r*o+e.column}}).call(u.prototype),t.Document=u}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.document=e,typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n),this.$onChange=this.onChange.bind(this),e.on("change",this.$onChange)};(function(){r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(e){var t=e.data,n=t.range;if(n.start.row==n.end.row&&n.start.row!=this.row)return;if(n.start.row>this.row)return;if(n.start.row==this.row&&n.start.column>this.column)return;var r=this.row,i=this.column;t.action==="insertText"?n.start.row===r&&n.start.column<=i?n.start.row===n.end.row?i+=n.end.column-n.start.column:(i-=n.start.column,r+=n.end.row-n.start.row):n.start.row!==n.end.row&&n.start.row<r&&(r+=n.end.row-n.start.row):t.action==="insertLines"?n.start.row<=r&&(r+=n.end.row-n.start.row):t.action=="removeText"?n.start.row==r&&n.start.column<i?n.end.column>=i?i=n.start.column:i=Math.max(0,i-(n.end.column-n.start.column)):n.start.row!==n.end.row&&n.start.row<r?(n.end.row==r&&(i=Math.max(0,i-n.end.column)+n.start.column),r-=n.end.row-n.start.row):n.end.row==r&&(r-=n.end.row-n.start.row,i=Math.max(0,i-n.end.column)+n.start.column):t.action=="removeLines"&&n.start.row<=r&&(n.end.row<=r?r-=n.end.row-n.start.row:(r=n.start.row,i=0)),this.setPosition(r,i,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._emit("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=function(e,t){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.tokenizer=e;var n=this;this.$worker=function(){if(!n.running)return;var e=new Date,t=n.currentLine,r=n.doc,i=0,s=r.getLength();while(n.currentLine<s){n.$tokenizeRow(n.currentLine);while(n.lines[n.currentLine])n.currentLine++;i++;if(i%5==0&&new Date-e>20){n.fireUpdateEvent(t,n.currentLine-1),n.running=setTimeout(n.$worker,20);return}}n.running=!1,n.fireUpdateEvent(t,s-1)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._emit("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.$updateOnChange=function(e){var t=e.range,n=t.start.row,r=t.end.row-n;if(r===0)this.lines[n]=null;else if(e.action=="removeText"||e.action=="removeLines")this.lines.splice(n,r+1,null),this.states.splice(n,r+1,null);else{var i=Array(r+1);i.unshift(n,1),this.lines.splice.apply(this.lines,i),this.states.splice.apply(this.states,i)}this.currentLine=Math.min(n,this.currentLine,this.doc.getLength()),this.stop(),this.running=setTimeout(this.$worker,700)},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i,null,this.type)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(e,t,n){function u(){this.getFoldAt=function(e,t,n){var r=this.getFoldLine(e);if(!r)return null;var i=r.folds;for(var s=0;s<i.length;s++){var o=i[s];if(o.range.contains(e,t)){if(n==1&&o.range.isEnd(e,t))continue;if(n==-1&&o.range.isStart(e,t))continue;return o}}},this.getFoldsInRange=function(e){var t=e.start,n=e.end,r=this.$foldData,i=[];t.column+=1,n.column-=1;for(var s=0;s<r.length;s++){var o=r[s].range.compareRange(e);if(o==2)continue;if(o==-2)break;var u=r[s].folds;for(var a=0;a<u.length;a++){var f=u[a];o=f.range.compareRange(e);if(o==-2)break;if(o==2)continue;if(o==42)break;i.push(f)}}return t.column-=1,n.column+=1,i},this.getAllFolds=function(){function n(t){e.push(t)}var e=[],t=this.$foldData;for(var r=0;r<t.length;r++)for(var i=0;i<t[r].folds.length;i++)n(t[r].folds[i]);return e},this.getFoldStringAt=function(e,t,n,r){r=r||this.getFoldLine(e);if(!r)return null;var i={end:{column:0}},s,o;for(var u=0;u<r.folds.length;u++){o=r.folds[u];var a=o.range.compareEnd(e,t);if(a==-1){s=this.getLine(o.start.row).substring(i.end.column,o.start.column);break}if(a===0)return null;i=o}return s||(s=this.getLine(o.start.row).substring(i.end.column)),n==-1?s.substring(0,t-i.end.column):n==1?s.substring(t-i.end.column):s},this.getFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.start.row<=e&&i.end.row>=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r<n.length;r++){var i=n[r];if(i.end.row>=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i<n.length;i++){var s=n[i],o=s.end.row,u=s.start.row;if(o>=t){u<t&&(u>=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u==f&&l-a<2)throw"The range has to be at least 2 characters width";var c=this.getFoldAt(u,a,1),h=this.getFoldAt(f,l,-1);if(c&&h==c)return c.addSubFold(o);if(c&&!c.range.isStart(u,a)||h&&!h.range.isEnd(f,l))throw"A fold can't intersect already existing fold"+o.range+c.range;var p=this.getFoldsInRange(o.range);p.length>0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d<n.length;d++){var v=n[d];if(f==v.start.row){v.addFold(o),r=!0;break}if(u==v.end.row){v.addFold(o),r=!0;if(!o.sameRow){var m=n[d+1];if(m&&m.start.row==f){v.merge(m);break}}break}if(f<=v.start.row)break}return r||(v=this.$addFoldLine(new i(this.$foldData,o))),this.$useWrapMode?this.$updateWrapData(v.start.row,v.start.row):this.$updateRowLengthCache(v.start.row,v.start.row),this.$modified=!0,this._emit("changeFold",{data:o}),o},this.addFolds=function(e){e.forEach(function(e){this.addFold(e)},this)},this.removeFold=function(e){var t=e.foldLine,n=t.start.row,r=t.end.row,i=this.$foldData,s=t.folds;if(s.length==1)i.splice(i.indexOf(t),1);else if(t.range.isEnd(e.end.row,e.end.column))s.pop(),t.end.row=s[s.length-1].end.row,t.end.column=s[s.length-1].end.column;else if(t.range.isStart(e.start.row,e.start.column))s.shift(),t.start.row=s[0].start.row,t.start.column=s[0].start.column;else if(e.sameRow)s.splice(s.indexOf(e),1);else{var o=t.split(e.start.row,e.start.column);s=o.folds,s.shift(),o.start.row=s[0].start.row,o.start.column=s[0].start.column}this.$useWrapMode?this.$updateWrapData(n,r):this.$updateRowLengthCache(n,r),this.$modified=!0,this._emit("changeFold",{data:e})},this.removeFolds=function(e){var t=[];for(var n=0;n<e.length;n++)t.push(e[n]);t.forEach(function(e){this.removeFold(e)},this),this.$modified=!0},this.expandFold=function(e){this.removeFold(e),e.subFolds.forEach(function(t){e.restoreRange(t),this.addFold(t)},this),e.collapseChildren>0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRange(n);if(t)this.removeFolds(i);else while(i.length)this.expandFolds(i),i=this.getFoldsInRange(n)},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row,i=0),t==null&&(t=e.end.row,n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t<r)return;if(t==r){if(n<i)return;u=Math.max(i,u)}e!=null?o+=e:o+=s.getLine(t).substring(u,n)},t,n),o},this.getDisplayLine=function(e,t,n,r){var i=this.getFoldLine(e);if(!i){var s;return s=this.doc.getLine(e),s.substring(r||0,t||s.length)}return this.getFoldDisplayLine(i,e,t,n,r)},this.$cloneFoldData=function(){var e=[];return e=this.$foldData.map(function(t){var n=t.folds.map(function(e){return e.clone()});return new i(e,n)}),e},this.toggleFold=function(e){var t=this.selection,n=t.getRange(),r,i;if(n.isEmpty()){var s=n.start;r=this.getFoldAt(s.row,s.column);if(r){this.expandFold(r);return}(i=this.findMatchingBracket(s))?n.comparePoint(i)==1?n.end=i:(n.start=i,n.start.column++,n.end.column--):(i=this.findMatchingBracket({row:s.row,column:s.column+1}))?(n.comparePoint(i)==1?n.end=i:n.start=i,n.start.column++):n=this.getCommentFoldRange(s.row,s.column)||n}else{var o=this.getFoldsInRange(n);if(e&&o.length){this.expandFolds(o);return}o.length==1&&(r=o[0])}r||(r=this.getFoldAt(n.start.row,n.start.column));if(r&&r.range.toString()==n.toString()){this.expandFold(r);return}var u="...";if(!n.isMultiLine()){u=this.getTextRange(n);if(u.length<4)return;u=u.trim().substring(0,2)+".."}this.addFold(u,n)},this.getCommentFoldRange=function(e,t,n){var i=new o(this,e,t),s=i.getCurrentToken();if(s&&/^comment|string/.test(s.type)){var u=new r,a=new RegExp(s.type.replace(/\..*/,"\\."));if(n!=1){do s=i.stepBackward();while(s&&a.test(s.type));i.stepForward()}u.start.row=i.getCurrentTokenRow(),u.start.column=i.getCurrentTokenColumn()+2,i=new o(this,e,t);if(n!=-1){do s=i.stepForward();while(s&&a.test(s.type));s=i.stepBackward()}else s=i.getCurrentToken();return u.end.row=i.getCurrentTokenRow(),u.end.column=i.getCurrentTokenColumn()+s.value.length-2,u}},this.foldAll=function(e,t,n){n==undefined&&(n=1e5);var r=this.foldWidgets;t=t||this.getLength();for(var i=e||0;i<t;i++){r[i]==null&&(r[i]=this.getFoldWidget(i));if(r[i]!="start")continue;var s=this.getFoldWidgetRange(i);if(s&&s.end.row<=t)try{var o=this.addFold("...",s);o.collapseChildren=n}catch(u){}i=s.end.row}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.removeListener("change",this.$updateFoldWidgets),this._emit("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){var n=this.getFoldWidget(e),r=this.getLine(e);t=t.domEvent;var i=t.shiftKey,s=t.ctrlKey||t.metaKey,o=t.altKey,u=n==="end"?-1:1,a=this.getFoldAt(e,u===-1?0:r.length,u);if(a){i||s?this.removeFold(a):this.expandFold(a);return}var f=this.getFoldWidgetRange(e);if(f&&!f.isMultiLine()){a=this.getFoldAt(f.start.row,f.start.column,1);if(a&&f.isEqual(a.range)){this.removeFold(a);return}}if(o){var l=this.getParentFoldRangeData(e);if(l.range)var c=l.range.start.row+1,h=l.range.end.row;this.foldAll(c,h,s?1e4:0)}else if(i){var h=f?f.end.row:this.getLength();this.foldAll(e+1,f.end.row,s?1e4:0)}else f&&(s&&(f.collapseChildren=1e4),this.addFold("...",f));f||((t.target||t.srcElement).className+=" ace_invalid")},this.updateFoldWidgets=function(e){var t=e.data,n=t.range,r=n.start.row,i=n.end.row-r;if(i===0)this.foldWidgets[r]=null;else if(t.action=="removeText"||t.action=="removeLines")this.foldWidgets.splice(r,i+1,null);else{var s=Array(i+1);s.unshift(r,1),this.foldWidgets.splice.apply(this.foldWidgets,s)}}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.row<this.startRow||e.endRow>this.endRow)throw"Can't add a fold to this FoldLine as it has no connection";this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw"Trying to add fold to FoldRow that doesn't have a matching row";this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f<i.length;f++){s=i[f],o=s.range.compareStart(t,n);if(o==-1){e(null,t,n,r,a);return}u=e(null,s.start.row,s.start.column,r,a),u=!u&&e(s.placeholder,s.start.row,s.start.column,r);if(u||o==0)return;a=!s.sameRow,r=s.end.column}e(null,t,n,r,a)},this.getNextFoldTo=function(e,t){var n,r;for(var i=0;i<this.folds.length;i++){n=this.folds[i],r=n.range.compareEnd(e,t);if(r==-1)return{fold:n,kind:"after"};if(r==0)return{fold:n,kind:"inside"}}return null},this.addRemoveChars=function(e,t,n){var r=this.getNextFoldTo(e,t),i,s;if(r){i=r.fold;if(r.kind=="inside"&&i.start.column!=t&&i.start.row!=e)window.console&&window.console.log(e,t,i);else if(i.start.row==e){s=this.folds;var o=s.indexOf(i);o==0&&(this.start.column+=n);for(o;o<s.length;o++){i=s[o],i.start.column+=n;if(!i.sameRow)return;i.end.column+=n}this.end.column+=n}}},this.split=function(e,t){var n=this.getNextFoldTo(e,t).fold,r=this.folds,s=this.foldData;if(!n)return null;var o=r.indexOf(n),u=r[o-1];this.end.row=u.end.row,this.end.column=u.end.column,r=r.splice(o,r.length-o);var a=new i(s,r);return s.splice(s.indexOf(this)+1,0,a),a},this.merge=function(e){var t=e.folds;for(var n=0;n<t.length;n++)this.addFold(t[n]);var r=this.foldData;r.splice(r.indexOf(e),1)},this.toString=function(){var e=[this.range.toString()+": ["];return this.folds.forEach(function(t){e.push(" "+t.toString())}),e.push("]"),e.join("\n")},this.idxToPosition=function(e){var t=0,n;for(var r=0;r<this.folds.length;r++){var n=this.folds[r];e-=n.start.column-t;if(e<0)return{row:n.start.row,column:n.start.column+e};e-=n.placeholder.length;if(e<0)return n.start;t=n.end.column}return{row:this.end.row,column:this.end.column+e}}}).call(i.prototype),t.FoldLine=i}),ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"],function(e,t,n){function u(e,t){e.row-=t.row,e.row==0&&(e.column-=t.column)}function a(e,t){u(e.start,t),u(e.end,t)}function f(e,t){e.row==0&&(e.column+=t.column),e.row+=t.row}function l(e,t){f(e.start,t),f(e.end,t)}var r=e("../range").Range,i=e("../range_list").RangeList,s=e("../lib/oop"),o=t.Fold=function(e,t){this.foldLine=null,this.placeholder=t,this.range=e,this.start=e.start,this.end=e.end,this.sameRow=e.start.row==e.end.row,this.subFolds=this.ranges=[]};s.inherits(o,i),function(){this.toString=function(){return'"'+this.placeholder+'" '+this.range.toString()},this.setFoldLine=function(e){this.foldLine=e,this.subFolds.forEach(function(t){t.setFoldLine(e)})},this.clone=function(){var e=this.range.clone(),t=new o(e,this.placeholder);return this.subFolds.forEach(function(e){t.subFolds.push(e.clone())}),t.collapseChildren=this.collapseChildren,t},this.addSubFold=function(e){if(this.range.isEqual(e))return;if(!this.range.containsRange(e))throw"A fold can't intersect already existing fold"+e.range+this.range;a(e,this.start);var t=e.start.row,n=e.start.column;for(var r=0,i=-1;r<this.subFolds.length;r++){i=this.subFolds[r].range.compare(t,n);if(i!=1)break}var s=this.subFolds[r];if(i==0)return s.addSubFold(e);var t=e.range.end.row,n=e.range.end.column;for(var o=r,i=-1;o<this.subFolds.length;o++){i=this.subFolds[o].range.compare(t,n);if(i!=1)break}var u=this.subFolds[o];if(i==0)throw"A fold can't intersect already existing fold"+e.range+this.range;var f=this.subFolds.splice(r,o-r,e);return e.setFoldLine(this.foldLine),e},this.restoreRange=function(e){return l(e,this.start)}}.call(o.prototype)}),ace.define("ace/range_list",["require","exports","module","ace/range"],function(e,t,n){var r=e("./range").Range,i=r.comparePoints,s=function(){this.ranges=[]};(function(){this.comparePoints=i,this.pointIndex=function(e,t,n){var r=this.ranges;for(var s=n||0;s<r.length;s++){var o=r[s],u=i(e,o.end);if(u>0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.call(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s<t.length;s++){r=n,n=t[s];var o=i(r.end,n.start);if(o<0)continue;if(o==0&&!r.isEmpty()&&!n.isEmpty())continue;i(r.end,n.end)<0&&(r.end.row=n.end.row,r.end.column=n.end.column),t.splice(s,1),e.push(n),n=r,s--}return this.ranges=t,e},this.contains=function(e,t){return this.pointIndex({row:e,column:t})>=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.row<e)return[];var r=this.pointIndex({row:e,column:0});r<0&&(r=-r-1);var i=this.pointIndex({row:t,column:0},r);i<0&&(i=-i-1);var s=[];for(var o=r;o<i;o++)s.push(n[o]);return s},this.removeAll=function(){return this.ranges.splice(0,this.ranges.length)},this.attach=function(e){this.session&&this.detach(),this.session=e,this.onChange=this.$onChange.bind(this),this.session.on("change",this.onChange)},this.detach=function(){if(!this.session)return;this.session.removeListener("change",this.onChange),this.session=null},this.$onChange=function(e){var t=e.data.range;if(e.data.action[0]=="i")var n=t.start,r=t.end;else var r=t.start,n=t.end;var i=n.row,s=r.row,o=s-i,u=-n.column+r.column,a=this.ranges;for(var f=0,l=a.length;f<l;f++){var c=a[f];if(c.end.row<i)continue;if(c.start.row>i)break;c.start.row==i&&c.start.column>=n.column&&(c.start.column+=u,c.start.row+=o),c.end.row==i&&c.end.column>=n.column&&(c.end.column==n.column&&u>0&&f<l-1&&c.end.column>c.start.column&&c.end.column==a[f+1].start.column&&(c.end.column-=u),c.end.column+=u,c.end.row+=o)}if(o!=0&&f<l)for(;f<l;f++){var c=a[f];c.start.row+=o,c.end.row+=o}}}).call(s.prototype),t.RangeList=s}),ace.define("ace/token_iterator",["require","exports","module"],function(e,t,n){var r=function(e,t,n){this.$session=e,this.$row=t,this.$rowTokens=e.getTokens(t);var r=e.getTokenAt(t,n);this.$tokenIndex=r?r.index:-1};(function(){this.stepBackward=function(){this.$tokenIndex-=1;while(this.$tokenIndex<0){this.$row-=1;if(this.$row<0)return this.$row=0,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=this.$rowTokens.length-1}return this.$rowTokens[this.$tokenIndex]},this.stepForward=function(){this.$tokenIndex+=1;var e;while(this.$tokenIndex>=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a<l){var c=f.charAt(a);if(c==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else c==e&&(s+=1);a+=1}do u=o.stepForward();while(u&&!n.test(u.type));if(u==null)break;a=0}return null}}var r=e("../token_iterator").TokenIterator,i=e("../range").Range;t.BracketMatch=s}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$matchIterator(e,this.$options);if(!t)return!1;var n=null;return t.forEach(function(e,t,r){if(!e.start){var i=e.offset+(r||0);n=new s(t,i,t,i+e.length)}else n=e;return!0}),n},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a;for(var l=u.offset||0;l<=f;l++){for(var c=0;c<a;c++)if(i[l+c].search(u[c])==-1)break;var h=i[l],p=i[l+a-1],d=h.match(u[0])[0].length,v=p.match(u[a-1])[0].length;o.push(new s(l,h.length-d,l+a-1,v))}}else for(var m=0;m<i.length;m++){var g=r.getMatchOffsets(i[m],u);for(var c=0;c<g.length;c++){var y=g[c];o.push(new s(m,y.offset,m,y.offset+y.length))}}if(n){var b=n.start.column,w=n.start.column,m=0,c=o.length-1;while(m<c&&o[m].start.column<b&&o[m].start.row==n.start.row)m++;while(m<c&&o[c].end.column>w&&o[c].end.row==n.end.row)c--;return o.slice(m,c+1)}return o},this.replace=function(e,t){var n=this.$options,r=this.$assembleRegExp(n);if(n.$isMultiLine)return t;if(!r)return;var i=r.exec(e);if(!i||i[0].length!=e.length)return null;t=e.replace(r,t);if(n.preserveCase){t=t.split("");for(var s=Math.min(e.length,e.length);s--;){var o=e[s];o&&o.toLowerCase()!=o?t[s]=t[s].toUpperCase():t[s]=t[s].toLowerCase()}t=t.join("")}return t},this.$matchIterator=function(e,t){var n=this.$assembleRegExp(t);if(!n)return!1;var i=this,o,u=t.backwards;if(t.$isMultiLine)var a=n.length,f=function(t,r,i){var u=t.search(n[0]);if(u==-1)return;for(var f=1;f<a;f++){t=e.getLine(r+f);if(t.search(n[f])==-1)return}var l=t.match(n[a-1])[0].length,c=new s(r,u,r+a-1,l);n.offset==1?(c.start.row--,c.start.column=Number.MAX_VALUE):i&&(c.start.column+=i);if(o(c))return!0};else if(u)var f=function(e,t,i){var s=r.getMatchOffsets(e,n);for(var u=s.length-1;u>=0;u--)if(o(s[u],t,i))return!0};else var f=function(e,t,i){var s=r.getMatchOffsets(e,n);for(var u=0;u<s.length;u++)if(o(s[u],t,i))return!0};return{forEach:function(n){o=n,i.$lineIterator(e,t).forEach(f)}}},this.$assembleRegExp=function(e){if(e.needle instanceof RegExp)return e.re=e.needle;var t=e.needle;if(!e.needle)return e.re=!1;e.regExp||(t=r.escapeRegExp(t)),e.wholeWord&&(t="\\b"+t+"\\b");var n=e.caseSensitive?"g":"gi";e.$isMultiLine=/[\n\r]/.test(t);if(e.$isMultiLine)return e.re=this.$assembleMultilineRegExp(t,n);try{var i=new RegExp(t,n)}catch(s){i=!1}return e.re=i},this.$assembleMultilineRegExp=function(e,t){var n=e.replace(/\r\n|\r|\n/g,"$\n^").split("\n"),r=[];for(var i=0;i<n.length;i++)try{r.push(new RegExp(n[i],t))}catch(s){return!1}return n[0]==""?(r.shift(),r.offset=1):r.offset=0,r},this.$lineIterator=function(e,t){var n=t.backwards==1,r=t.skipCurrent!=0,i=t.range,s=t.start;s||(s=i?i[n?"end":"start"]:e.selection.getRange()),s.start&&(s=s[r!=n?"end":"start"]);var o=i?i.start.row:0,u=i?i.end.row:e.getLength()-1,a=n?function(n){var r=s.row,i=e.getLine(r).substring(0,s.column);if(n(i,r))return;for(r--;r>=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../keyboard/hash_handler").HashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){this.platform=e,this.commands=this.byName={},this.commmandKeyBinding={},this.addCommands(t),this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var r={editor:t,command:e,args:n},i=this._emit("exec",r);return this._signal("afterExec",r),i===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys"],function(e,t,n){function i(e,t){this.platform=t,this.commands={},this.commmandKeyBinding={},this.addCommands(e)}var r=e("../lib/keys");(function(){this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e){var t=typeof e=="string"?e:e.name;e=this.commands[t],delete this.commands[t];var n=this.commmandKeyBinding;for(var r in n)for(var i in n[r])n[r][i]==e&&delete n[r][i]},this.bindKey=function(e,t){if(!e)return;if(typeof t=="function"){this.addCommand({exec:t,bindKey:e,name:t.name||e});return}var n=this.commmandKeyBinding;e.split("|").forEach(function(e){var r=this.parseKeys(e,t),i=r.hashId;(n[i]||(n[i]={}))[r.key]=t},this)},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n}),n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){var t=e.bindKey;if(!t)return;var n=typeof t=="string"?t:t[this.platform];this.bindKey(n,e)},this.parseKeys=function(e){e.indexOf(" ")!=-1&&(e=e.split(/\s+/).pop());var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=this.commmandKeyBinding;return r[t]&&r[t][n]},this.handleKeyboard=function(e,t,n,r){return{command:this.findKeyCommand(t,n)}}}).call(i.prototype),t.HashHandler=i}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config"],function(e,t,n){function s(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config");t.commands=[{name:"selectall",bindKey:s("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:s(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:s("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:s("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},readOnly:!0},{name:"unfold",bindKey:s("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},readOnly:!0},{name:"foldall",bindKey:s("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll()},readOnly:!0},{name:"unfoldall",bindKey:s("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},readOnly:!0},{name:"findnext",bindKey:s("Ctrl-K","Command-G"),exec:function(e){e.findNext()},readOnly:!0},{name:"findprevious",bindKey:s("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},readOnly:!0},{name:"find",bindKey:s("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:s("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotostart",bindKey:s("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectup",bindKey:s("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:!0},{name:"golineup",bindKey:s("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selecttoend",bindKey:s("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoend",bindKey:s("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectdown",bindKey:s("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",readOnly:!0},{name:"golinedown",bindKey:s("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordleft",bindKey:s("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordleft",bindKey:s("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolinestart",bindKey:s("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolinestart",bindKey:s("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectleft",bindKey:s("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoleft",bindKey:s("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectwordright",bindKey:s("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotowordright",bindKey:s("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttolineend",bindKey:s("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"gotolineend",bindKey:s("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"selectright",bindKey:s("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",readOnly:!0},{name:"gotoright",bindKey:s("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:s(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:s("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:s(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:s("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:s("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",readOnly:!0},{name:"togglerecording",bindKey:s("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:s("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:s("Ctrl-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttomatching",bindKey:s("Ctrl-Shift-P",null),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},multiSelectAction:"forEach"},{name:"removeline",bindKey:s("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:s("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},multiSelectAction:"forEach"},{name:"sortlines",bindKey:s("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:s("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine"},{name:"modifyNumberUp",bindKey:s("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:s("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},multiSelectAction:"forEach"},{name:"replace",bindKey:s("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:s("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:s("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:s("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()}},{name:"movelinesup",bindKey:s("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()}},{name:"copylinesdown",bindKey:s("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()}},{name:"movelinesdown",bindKey:s("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()}},{name:"del",bindKey:s("Delete","Delete|Ctrl-D"),exec:function(e){e.remove("right")},multiSelectAction:"forEach"},{name:"backspace",bindKey:s("Command-Backspace|Option-Backspace|Shift-Backspace|Backspace","Ctrl-Backspace|Command-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach"},{name:"removetolinestart",bindKey:s("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach"},{name:"removetolineend",bindKey:s("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach"},{name:"removewordleft",bindKey:s("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach"},{name:"removewordright",bindKey:s("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach"},{name:"outdent",bindKey:s("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach"},{name:"indent",bindKey:s("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach"},{name:"blockoutdent",bindKey:s("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine"},{name:"blockindent",bindKey:s("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach"},{name:"splitline",bindKey:s(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach"},{name:"transposeletters",bindKey:s("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)}},{name:"touppercase",bindKey:s("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach"},{name:"tolowercase",bindKey:s("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach"}]}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){var r=function(){this.reset()};(function(){this.execute=function(e){var t=e.args[0];this.$doc=e.args[1],this.$undoStack.push(t),this.$redoStack=[]},this.undo=function(e){var t=this.$undoStack.pop(),n=null;return t&&(n=this.$doc.undoChanges(t,e),this.$redoStack.push(t)),n},this.redo=function(e){var t=this.$redoStack.pop(),n=null;return t&&(n=this.$doc.redoChanges(t,e),this.$undoStack.push(t)),n},this.reset=function(){this.$undoStack=[],this.$redoStack=[]},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/useragent","ace/config","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/useragent"),u=e("./config"),a=e("./layer/gutter").Gutter,f=e("./layer/marker").Marker,l=e("./layer/text").Text,c=e("./layer/cursor").Cursor,h=e("./scrollbar").ScrollBar,p=e("./renderloop").RenderLoop,d=e("./lib/event_emitter").EventEmitter,v=".ace_editor {position: relative;overflow: hidden;font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;font-size: 12px;line-height: normal;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url(\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\");}.ace_scrollbar {position: absolute;overflow-x: hidden;overflow-y: scroll;right: 0;top: 0;bottom: 0;}.ace_scrollbar-inner {position: absolute;width: 1px;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;border: solid lightgray 1px;margin: -1px;padding: 0 1px;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: nowrap;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {color: black;font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_cursor[style*=\"opacity: 0\"]{-ms-filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_line {white-space: nowrap;}.ace_marker-layer .ace_step {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\"),url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat, repeat-x;background-position: center center, top left;}.ace_editor.ace_dragging .ace_content {cursor: move;}.ace_gutter-tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: inline-block;max-width: 500px;padding: 4px;position: fixed;z-index: 300;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre-line;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: inline-block;width: 11px;vertical-align: top;background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;}.ace_fold-widget.ace_end {background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\");}.ace_fold-widget.ace_closed {background-image: url(\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");}.ace_dark .ace_fold-widget.ace_end {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget.ace_closed {background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}";i.importCssString(v,"ace_editor");var m=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new a(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new f(this.content);var r=this.$textLayer=new l(this.content);this.canvas=r.element,this.$markerFront=new f(this.content),this.$cursorLayer=new c(this.content),this.$horizScroll=!1,this.$horizScrollAlwaysVisible=!1,this.scrollBar=new h(this.container),this.scrollBar.addEventListener("scroll",function(e){n.$inScrollAnimation||n.session.setScrollTop(e.data)}),this.scrollTop=0,this.scrollLeft=0,s.addListener(this.scroller,"scroll",function(){var e=n.scroller.scrollLeft;n.scrollLeft=e,n.session.setScrollLeft(e)}),this.cursorPos={row:0,column:0},this.$textLayer.addEventListener("changeCharacterSize",function(){n.updateCharacterSize(),n.onResize(!0)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:1,characterWidth:1,minHeight:1,maxHeight:1,offset:0,height:1},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),u.resetOptions(this),u._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,d),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.characterWidth=this.$textLayer.getCharacterWidth(),this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session=e,this.scroller.className="ace_scroller",this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),this.$loop.schedule(this.CHANGE_FULL)},this.updateLines=function(e,t){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRow<t&&(this.$changedLines.lastRow=t)):this.$changedLines={firstRow:e,lastRow:t};if(this.$changedLines.firstRow>this.layerConfig.lastRow||this.$changedLines.lastRow<this.layerConfig.firstRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.onResize=function(e,t,n,r){var s=0,o=this.$size;if(this.resizing>2)return;this.resizing>1?this.resizing++:this.resizing=e?1:0,r||(r=i.getInnerHeight(this.container)),r&&(e||o.height!=r)&&(o.height=r,s=this.CHANGE_SIZE,o.scrollerHeight=this.scroller.clientHeight,o.scrollerHeight||(o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBar.getWidth())),this.scrollBar.setHeight(o.scrollerHeight),this.session&&(this.session.setScrollTop(this.getScrollTop()),s|=this.CHANGE_FULL)),n||(n=i.getInnerWidth(this.container));if(n&&(e||this.resizing>1||o.width!=n)){s=this.CHANGE_SIZE,o.width=n;var t=this.$showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=t+"px",o.scrollerWidth=Math.max(0,n-t-this.scrollBar.getWidth()),this.scroller.style.right=this.scrollBar.getWidth()+"px";if(this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)s|=this.CHANGE_FULL}e?this.$renderChanges(s,!0):this.$loop.schedule(s),e&&(this.$gutterLayer.$padding=null),e&&delete this.resizing},this.onGutterResize=function(){var e=this.$size.width,t=this.$showGutter?this.$gutter.offsetWidth:0;this.scroller.style.left=t+"px",this.$size.scrollerWidth=Math.max(0,e-t-this.scrollBar.getWidth()),this.session.getUseWrapMode()&&this.adjustWrapLimit()&&this.$loop.schedule(this.CHANGE_FULL)},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden"},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;if(t<0||t>e.height-this.lineHeight)return;var r=this.characterWidth;if(this.$composition){var i=this.textarea.value.replace(/^\x01+/,"");r*=this.session.$getStringScreenWidth(i)[0]}n-=this.scrollLeft,n>this.$size.scrollerWidth-r&&(n=this.$size.scrollerWidth-r),n-=this.scrollBar.width,this.textarea.style.height=this.lineHeight+"px",this.textarea.style.width=r+"px",this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-n-r)+"px",this.textarea.style.bottom=Math.max(0,this.$size.height-t-this.lineHeight)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+e},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.getHScrollBarAlwaysVisible=function(){return this.$horizScrollAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.$horizScrollAlwaysVisible!=e&&(this.$horizScrollAlwaysVisible=e,(!this.$horizScrollAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL))},this.$updateScrollBar=function(){this.scrollBar.setInnerHeight(this.layerConfig.maxHeight),this.scrollBar.setScrollTop(this.scrollTop)},this.$renderChanges=function(e,t){if(!t&&(!e||!this.session||!this.container.offsetWidth))return;this._signal("beforeRender"),(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL)&&this.$computeLayerConfig();if(e&this.CHANGE_H_SCROLL){this.scroller.scrollLeft=this.scrollLeft;var n=this.scroller.scrollLeft;this.scrollLeft=n,this.session.setScrollLeft(n),this.scroller.className=this.scrollLeft==0?"ace_scroller":"ace_scroller ace_scroll-left"}if(e&this.CHANGE_FULL){this.$textLayer.checkForSizeChanges(),this.$updateScrollBar(),this.$textLayer.update(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(this.layerConfig):this.$textLayer.scrollLines(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig),this.$markerBack.update(this.layerConfig),this.$markerFront.update(this.layerConfig),this.$cursorLayer.update(this.layerConfig),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this.$updateScrollBar(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(this.layerConfig),this.$showGutter&&this.$gutterLayer.update(this.layerConfig)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(this.layerConfig):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(this.layerConfig),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(this.layerConfig),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(this.layerConfig),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(this.layerConfig),e&this.CHANGE_SIZE&&this.$updateScrollBar(),this._signal("afterRender")},this.$computeLayerConfig=function(){if(!this.$size.scrollerHeight)return this.onResize(!0);var e=this.session,t=this.scrollTop%this.lineHeight,n=this.$size.scrollerHeight+this.lineHeight,r=this.$getLongestLine(),i=this.$horizScrollAlwaysVisible||this.$size.scrollerWidth-r<0,s=this.$horizScroll!==i;this.$horizScroll=i,s&&(this.scroller.style.overflowX=i?"scroll":"hidden",i||this.session.setScrollLeft(0));var o=this.session.getScreenLength()*this.lineHeight;this.session.setScrollTop(Math.max(0,Math.min(this.scrollTop,o-this.$size.scrollerHeight)));var u=Math.ceil(n/this.lineHeight)-1,a=Math.max(0,Math.round((this.scrollTop-t)/this.lineHeight)),f=a+u,l,c,h=this.lineHeight;a=e.screenToDocumentRow(a,0);var p=e.getFoldLine(a);p&&(a=p.start.row),l=e.documentToScreenRow(a,0),c=e.getRowLength(a)*h,f=Math.min(e.screenToDocumentRow(f,0),e.getLength()-1),n=this.$size.scrollerHeight+e.getRowLength(f)*h+c,t=this.scrollTop-l*h,this.layerConfig={width:r,padding:this.$padding,firstRow:a,firstRowScreen:l,lastRow:f,lineHeight:h,characterWidth:this.characterWidth,minHeight:n,maxHeight:o,offset:t,height:this.$size.scrollerHeight},this.$gutterLayer.element.style.marginTop=-t+"px",this.content.style.marginTop=-t+"px",this.content.style.width=r+2*this.$padding+"px",this.content.style.height=n+"px",s&&this.onResize(!0)},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(t<n.firstRow)return;if(t===Infinity){this.$showGutter&&this.$gutterLayer.update(n),this.$textLayer.update(n);return}return this.$textLayer.updateLines(n,e,t),!0},this.$getLongestLine=function(){var e=this.session.getScreenWidth();return this.$textLayer.showInvisibles&&(e+=1),Math.max(this.$size.scrollerWidth-2*this.$padding,Math.round(e*this.characterWidth))},this.updateFrontMarkers=function(){this.$markerFront.setMarkers(this.session.getMarkers(!0)),this.$loop.schedule(this.CHANGE_MARKER_FRONT)},this.updateBackMarkers=function(){this.$markerBack.setMarkers(this.session.getMarkers()),this.$loop.schedule(this.CHANGE_MARKER_BACK)},this.addGutterDecoration=function(e,t){this.$gutterLayer.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){this.$gutterLayer.removeGutterDecoration(e,t)},this.updateBreakpoints=function(e){this.$loop.schedule(this.CHANGE_GUTTER)},this.setAnnotations=function(e){this.$gutterLayer.setAnnotations(e),this.$loop.schedule(this.CHANGE_GUTTER)},this.updateCursor=function(){this.$loop.schedule(this.CHANGE_CURSOR)},this.hideCursor=function(){this.$cursorLayer.hideCursor()},this.showCursor=function(){this.$cursorLayer.showCursor()},this.scrollSelectionIntoView=function(e,t,n){this.scrollCursorIntoView(e,n),this.scrollCursorIntoView(t,n)},this.scrollCursorIntoView=function(e,t){if(this.$size.scrollerHeight===0)return;var n=this.$cursorLayer.getPixelPosition(e),r=n.left,i=n.top;this.scrollTop>i?(t&&(i-=t*this.$size.scrollerHeight),this.session.setScrollTop(i)):this.scrollTop+this.$size.scrollerHeight<i+this.lineHeight&&(t&&(i+=t*this.$size.scrollerHeight),this.session.setScrollTop(i+this.lineHeight-this.$size.scrollerHeight));var s=this.scrollLeft;s>r?(r<this.$padding+2*this.layerConfig.characterWidth&&(r=0),this.session.setScrollLeft(r)):s+this.$size.scrollerWidth<r+this.characterWidth&&this.session.setScrollLeft(Math.round(r+this.characterWidth-this.$size.scrollerWidth))},this.getScrollTop=function(){return this.session.getScrollTop()},this.getScrollLeft=function(){return this.session.getScrollLeft()},this.getScrollTopRow=function(){return this.scrollTop/this.lineHeight},this.getScrollBottomRow=function(){return Math.max(0,Math.floor((this.scrollTop+this.$size.scrollerHeight)/this.lineHeight)-1)},this.scrollToRow=function(e){this.session.setScrollTop(e*this.lineHeight)},this.alignCursor=function(e,t){typeof e=="number"&&(e={row:e,column:0});var n=this.$cursorLayer.getPixelPosition(e),r=this.$size.scrollerHeight-this.lineHeight,i=n.top-r*(t||0);return this.session.setScrollTop(i),i},this.STEPS=8,this.$calcSteps=function(e,t){var n=0,r=this.STEPS,i=[],s=function(e,t,n){return n*(Math.pow(e-1,3)+1)+t};for(n=0;n<r;++n)i.push(s(n/this.STEPS,e,t-e));return i},this.scrollToLine=function(e,t,n,r){var i=this.$cursorLayer.getPixelPosition({row:e,column:0}),s=i.top;t&&(s-=this.$size.scrollerHeight/2);var o=this.scrollTop;this.session.setScrollTop(s),n!==!1&&this.animateScrolling(o,r)},this.animateScrolling=function(e,t){var n=this.scrollTop;if(this.$animatedScroll&&Math.abs(e-n)<1e5){var r=this,i=r.$calcSteps(e,n);this.$inScrollAnimation=!0,clearInterval(this.$timer),r.session.setScrollTop(i.shift()),this.$timer=setInterval(function(){i.length?(r.session.setScrollTop(i.shift()),r.session.$scrollTop=n):n!=null?(r.session.$scrollTop=-1,r.session.setScrollTop(n),n=null):(r.$timer=clearInterval(r.$timer),r.$inScrollAnimation=!1,t&&t())},10)}},this.scrollToY=function(e){this.scrollTop!==e&&(this.$loop.schedule(this.CHANGE_SCROLL),this.scrollTop=e)},this.scrollToX=function(e){e<0&&(e=0),this.scrollLeft!==e&&(this.scrollLeft=e),this.$loop.schedule(this.CHANGE_H_SCROLL)},this.scrollBy=function(e,t){t&&this.session.setScrollTop(this.session.getScrollTop()+t),e&&this.session.setScrollLeft(this.session.getScrollLeft()+e)},this.isScrollableBy=function(e,t){if(t<0&&this.session.getScrollTop()>=1)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight);return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e){function r(e){i.importCssString(e.cssText,e.cssClass,t.container.ownerDocument),t.theme&&i.removeCssClass(t.container,t.theme.cssClass),t.$theme=e.cssClass,t.theme=e,i.addCssClass(t.container,e.cssClass),i.setCssClass(t.container,"ace_dark",e.isDark);var n=e.padding||4;t.$padding&&n!=t.$padding&&t.setPadding(n),t.$size&&(t.$size.width=0,t.onResize()),t._dispatchEvent("themeLoaded",{theme:e})}var t=this;this.$themeValue=e,t._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var n=e||"ace/theme/textmate";u.loadModule(["theme",n],r)}else r(e)},this.getTheme=function(){return this.$themeValue},this.setStyle=function(t,n){i.setCssClass(this.container,t,n!=0)},this.unsetStyle=function(t){i.removeCssClass(this.container,t)},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(m.prototype),u.defineOptions(m.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0}}),t.VirtualRenderer=m}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this)};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];var t,n;for(var r=0;r<e.length;r++){var i=e[r],n=i.row,t=this.$annotations[n];t||(t=this.$annotations[n]={text:[]});var o=i.text;o=o?s.escapeHTML(o):i.html||"",t.text.indexOf(o)===-1&&t.text.push(o);var u=i.type;u=="error"?t.className=" ace_error":u=="warning"&&t.className!=" ace_error"?t.className=" ace_warning":u=="info"&&!t.className&&(t.className=" ace_info")}},this.$updateAnnotations=function(e){if(!this.$annotations.length)return;var t=e.data,n=t.range,r=n.start.row,i=n.end.row-r;if(i!==0)if(t.action=="removeText"||t.action=="removeLines")this.$annotations.splice(r,i+1,null);else{var s=Array(i+1);s.unshift(r,1),this.$annotations.splice.apply(this.$annotations,s)}},this.update=function(e){var t={className:""},n=[],i=e.firstRow,s=e.lastRow,o=this.session.getNextFoldLine(i),u=o?o.start.row:Infinity,a=this.$showFoldWidgets&&this.session.foldWidgets,f=this.session.$breakpoints,l=this.session.$decorations,c=this.session.$firstLineNumber,h=0;for(;;){i>u&&(i=o.end.row+1,o=this.session.getNextFoldLine(i,o),u=o?o.start.row:Infinity);if(i>s)break;var p=this.$annotations[i]||t;n.push("<div class='ace_gutter-cell ",f[i]||"",l[i]||"",p.className,"' style='height:",this.session.getRowLength(i)*e.lineHeight,"px;'>",h=i+c);if(a){var d=a[i];d==null&&(d=a[i]=this.session.getFoldWidget(i)),d&&n.push("<span class='ace_fold-widget ace_",d,d=="start"&&i==u&&i<o.end.row?" ace_closed":" ace_open","' style='height:",e.lineHeight,"px","'></span>")}n.push("</div>"),i++}this.element=r.setInnerHtml(this.element,n.join("")),this.element.style.height=e.minHeight+"px",this.session.$useWrapMode&&(h=this.session.getLength());var v=(""+h).length*e.characterWidth,m=this.$padding||this.$computePadding();v+=m.left+m.right,v!==this.gutterWidth&&(this.gutterWidth=v,this.element.style.width=Math.ceil(this.gutterWidth)+"px",this._emit("changeGutterWidth",v))},this.$showFoldWidgets=!0,this.setShowFoldWidgets=function(e){e?r.addCssClass(this.element,"ace_folding-enabled"):r.removeCssClass(this.element,"ace_folding-enabled"),this.$showFoldWidgets=e,this.$padding=null},this.getShowFoldWidgets=function(){return this.$showFoldWidgets},this.$computePadding=function(){if(!this.element.firstChild)return{left:0,right:0};var e=r.computedStyle(this.element.firstChild);return this.$padding={},this.$padding.left=parseInt(e.paddingLeft)+1,this.$padding.right=parseInt(e.paddingRight),this.$padding},this.getRegion=function(e){var t=this.$padding||this.$computePadding(),n=this.element.getBoundingClientRect();if(e.x<t.left+n.left)return"markers";if(this.$showFoldWidgets&&e.x>n.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var s=r.range.clipRows(e.firstRow,e.lastRow);if(s.isEmpty())continue;s=s.toScreenRange(this.session);if(r.renderer){var o=this.$getTop(s.start.row,e),u=this.$padding+s.start.column*e.characterWidth;r.renderer(t,s,u,o,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,s,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,s,r.clazz,e):s.isMultiLine()?r.type=="text"?this.drawTextMarker(t,s,r.clazz,e):this.drawMultiLineMarker(t,s,r.clazz,e):this.drawSingleLineMarker(t,s,r.clazz+" ace_start",e)}this.element=i.setInnerHtml(this.element,t.join(""))},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(e,t,n,i){var s=t.start.row,o=new r(s,t.start.column,s,this.session.getScreenLastRowColumn(s));this.drawSingleLineMarker(e,o,n+" ace_start",i,1,"text"),s=t.end.row,o=new r(s,0,s,t.end.column),this.drawSingleLineMarker(e,o,n,i,0,"text");for(s=t.start.row+1;s<t.end.row;s++)o.start.row=s,o.end.row=s,o.end.column=this.session.getScreenLastRowColumn(s),this.drawSingleLineMarker(e,o,n,i,1,"text")},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;e.push("<div class='",n," ace_start' style='","height:",o,"px;","right:0;","top:",u,"px;","left:",a,"px;'></div>"),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("<div class='",n,"' style='","height:",o,"px;","width:",f,"px;","top:",u,"px;","left:",s,"px;'></div>"),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<0)return;u=this.$getTop(t.start.row+1,r),e.push("<div class='",n,"' style='","height:",o,"px;","right:0;","top:",u,"px;","left:",s,"px;'></div>")},this.drawSingleLineMarker=function(e,t,n,r,i){var s=r.lineHeight,o=(t.end.column+(i||0)-t.start.column)*r.characterWidth,u=this.$getTop(t.start.row,r),a=this.$padding+t.start.column*r.characterWidth;e.push("<div class='",n,"' style='","height:",s,"px;","width:",o,"px;","top:",u,"px;","left:",a,"px;'></div>")},this.drawFullLineMarker=function(e,t,n,r){var i=this.$getTop(t.start.row,r),s=r.lineHeight;t.start.row!=t.end.row&&(s+=this.$getTop(t.end.row,r)-i),e.push("<div class='",n,"' style='","height:",s,"px;","top:",i,"px;","left:0;right:0;'></div>")},this.drawScreenLineMarker=function(e,t,n,r){var i=this.$getTop(t.start.row,r),s=r.lineHeight;e.push("<div class='",n,"' style='","height:",s,"px;","top:",i,"px;","left:0;right:0;'></div>")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$characterSize={width:0,height:0},this.checkForSizeChanges(),this.$pollSizeChanges()};(function(){r.implement(this,u),this.EOF_CHAR="¶",this.EOL_CHAR="¬",this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$characterSize.height||1},this.getCharacterWidth=function(){return this.$characterSize.width||1},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){var e=this;this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.$fontStyles={fontFamily:1,fontSize:1,fontWeight:1,fontStyle:1,lineHeight:1},this.$measureSizes=o.isIE||o.isOldGecko?function(){var e=1e3;if(!this.$measureNode){var t=this.$measureNode=i.createElement("div"),n=t.style;n.width=n.height="auto",n.left=n.top=-e*40+"px",n.visibility="hidden",n.position="fixed",n.overflow="visible",n.whiteSpace="nowrap",t.innerHTML=s.stringRepeat("Xy",e);if(this.element.ownerDocument.body)this.element.ownerDocument.body.appendChild(t);else{var r=this.element.parentNode;while(!i.hasCssClass(r,"ace_editor"))r=r.parentNode;r.appendChild(t)}}if(!this.element.offsetWidth)return null;var n=this.$measureNode.style,o=i.computedStyle(this.element);for(var u in this.$fontStyles)n[u]=o[u];var a={height:this.$measureNode.offsetHeight,width:this.$measureNode.offsetWidth/(e*2)};return a.width==0||a.height==0?null:a}:function(){if(!this.$measureNode){var e=this.$measureNode=i.createElement("div"),t=e.style;t.width=t.height="auto",t.left=t.top="-100px",t.visibility="hidden",t.position="fixed",t.overflow="visible",t.whiteSpace="nowrap",e.innerHTML="X";var n=this.element.parentNode;while(n&&!i.hasCssClass(n,"ace_editor"))n=n.parentNode;if(!n)return this.$measureNode=null;n.appendChild(e)}var r=this.$measureNode.getBoundingClientRect(),s={height:r.height,width:r.width};return s.width==0||s.height==0?null:s},this.setSession=function(e){this.session=e,this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n<e+1;n++)this.showInvisibles?t.push("<span class='ace_invisible'>"+this.TAB_CHAR+s.stringRepeat(" ",n-1)+"</span>"):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide";if(this.showInvisibles){r+=" ace_invisible";var i=s.stringRepeat(this.SPACE_CHAR,this.tabSize),o=this.TAB_CHAR+s.stringRepeat(" ",this.tabSize-1)}else var i=s.stringRepeat(" ",this.tabSize),o=i;this.$tabStrings[" "]="<span class='"+r+"'>"+i+"</span>",this.$tabStrings[" "]="<span class='"+r+"'>"+o+"</span>"}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),s=Math.min(n,e.lastRow),o=this.element.childNodes,u=0;for(var a=e.firstRow;a<r;a++){var f=this.session.getFoldLine(a);if(f){if(f.containsRow(r)){r=f.start.row;break}a=f.end.row}u++}var a=r,f=this.session.getNextFoldLine(a),l=f?f.start.row:Infinity;for(;;){a>l&&(a=f.end.row+1,f=this.session.getNextFoldLine(a,f),l=f?f.start.row:Infinity);if(a>s)break;var c=o[u++];if(c){var h=[];this.$renderLine(h,a,!this.$useLineGroups(),a==l?f:!1),i.setInnerHtml(c,h.join(""))}a++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow<e.firstRow)return this.update(e);if(e.lastRow<t.firstRow)return this.update(e);var n=this.element;if(t.firstRow<e.firstRow)for(var r=this.session.getFoldedRowCount(t.firstRow,e.firstRow-1);r>0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRow<t.firstRow){var i=this.$renderLinesFragment(e,e.firstRow,t.firstRow-1);n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i)}if(e.lastRow>t.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a);else{var l=a.childNodes;while(l.length)r.appendChild(l[0])}s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,s=n,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>r)break;this.$useLineGroups()&&t.push("<div class='ace_line_group'>"),this.$renderLine(t,s,!1,s==u?o:!1),this.$useLineGroups()&&t.push("</div>"),s++}this.element=i.setInnerHtml(this.element,t.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?"<span class='ace_invisible'>"+s.stringRepeat(i.SPACE_CHAR,e.length)+"</span>":s.stringRepeat(" ",e.length);if(e=="&")return"&";if(e=="<")return"<";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e==" "){var f=i.showInvisibles?"ace_cjk ace_invisible":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,"<span class='"+f+"' style='width:"+i.config.characterWidth*2+"px'>"+l+"</span>"}return r?"<span class='ace_invisible ace_invalid'>"+i.SPACE_CHAR+"</span>":(t+=1,"<span class='ace_cjk' style='width:"+i.config.characterWidth*2+"px'>"+e+"</span>")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("<span class='",f,"'",l,">",a,"</span>")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t){var n=t.search(this.$indentGuideRe);return n<=0?t:t[0]==" "?(n-=n%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],n/this.tabSize)),t.substr(n)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],n)),t.substr(n)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,s=0,o=n[0],u=0;for(var a=0;a<t.length;a++){var f=t[a],l=f.value;if(a==0&&this.displayIndentGuides){i=l.length,l=this.renderIndentGuide(e,l);if(!l)continue;i-=l.length}if(i+l.length<o)u=this.$renderToken(e,u,f,l),i+=l.length;else{while(i+l.length>=o)u=this.$renderToken(e,u,f,l.substring(0,o-i)),l=l.substring(o-i),i=o,r||e.push("</div>","<div class='ace_line' style='height:",this.config.lineHeight,"px'>"),s++,u=0,o=n[s]||Number.MAX_VALUE;l.length!=0&&(i+=l.length,u=this.$renderToken(e,u,f,l))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s<t.length;s++)r=t[s],i=r.value,n=this.$renderToken(e,n,r,i)},this.$renderLine=function(e,t,n,r){!r&&r!=0&&(r=this.session.getFoldLine(t));if(r)var i=this.$getFoldLineTokens(t,r);else var i=this.session.getTokens(t);n||e.push("<div class='ace_line' style='height:",this.config.lineHeight,"px'>");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("<span class='ace_invisible'>",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"</span>")),n||e.push("</div>")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.length<t){s+=e[i].value.length,i++;if(i==e.length)return}if(s!=t){var o=e[i].value.substring(t-s);o.length>n-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(s<n&&i<e.length){var o=e[i].value;o.length+s>n?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){var r=e("../lib/dom"),i=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors")};(function(){this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&(this.smoothBlinking=e,e?r.addCssClass(this.element,"ace_smooth-blinking"):r.removeCssClass(this.element,"ace_smooth-blinking"),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking");for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity="";if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity=0}.bind(this),.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){for(var e=this.cursors.length;e--;)this.cursors[e].style.opacity="";t()}.bind(this),this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;n<i;n++){var s=this.getPixelPosition(t[n].cursor,!0);if((s.top>e.height+e.offset||s.top<-e.offset)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px"}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(i.prototype),t.Cursor=i}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar",this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.width=i.scrollbarWidth(e.ownerDocument),this.element.style.width=(this.width||15)+5+"px",s.addListener(this.element,"scroll",this.onScroll.bind(this))};(function(){r.implement(this,o),this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.width},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}).call(u.prototype),t.ScrollBar=u}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor"],function(e,t,n){function h(e,t,n){return c.$options.wrap=!0,c.$options.needle=t,c.$options.backwards=n==-1,c.find(e)}function v(e,t){return e.row==t.row&&e.column==t.column}function m(e){e.$onAddRange=e.$onAddRange.bind(e),e.$onRemoveRange=e.$onRemoveRange.bind(e),e.$onMultiSelect=e.$onMultiSelect.bind(e),e.$onSingleSelect=e.$onSingleSelect.bind(e),t.onSessionChange.call(e,e),e.on("changeSession",t.onSessionChange.bind(e)),e.on("mousedown",o),e.commands.addCommands(f.defaultCommands),g(e)}function g(e){function i(){n&&(r.style.cursor="",n=!1)}var t=e.textInput.getElement(),n=!1,r=e.renderer.content;u.addListener(t,"keydown",function(e){e.keyCode==18&&!(e.ctrlKey||e.shiftKey||e.metaKey)?n||(r.style.cursor="crosshair",n=!0):n&&(r.style.cursor="")}),u.addListener(t,"keyup",i),u.addListener(t,"blur",i)}var r=e("./range_list").RangeList,i=e("./range").Range,s=e("./selection").Selection,o=e("./mouse/multi_select_handler").onMouseDown,u=e("./lib/event"),a=e("./lib/lang"),f=e("./commands/multi_select_commands");t.commands=f.defaultCommands.concat(f.multiSelectCommands);var l=e("./search").Search,c=new l,p=e("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(p.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(e,t){if(!e)return;if(!this.inMultiSelectMode&&this.rangeCount==0){var n=this.toOrientedRange();this.rangeList.add(n),this.rangeList.add(e);if(this.rangeList.ranges.length!=2)return this.rangeList.removeAll(),t||this.fromOrientedRange(e);this.rangeList.removeAll(),this.rangeList.add(n),this.$onAddRange(n)}e.cursor||(e.cursor=e.end);var r=this.rangeList.add(e);return this.$onAddRange(e),r.length&&this.$onRemoveRange(r),this.rangeCount>1&&!this.inMultiSelectMode&&(this._emit("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._emit("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._emit("removeRange",{ranges:e}),this.rangeCount==0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._emit("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeList.ranges.concat()},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c<o;c++)f.push(this.getLineRange(c,!0));l=this.getLineRange(o,!0),l.end.column=n.end.column,f.push(l),f.forEach(this.addRange,this)}},this.toggleBlockSelection=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column<t.column;if(s)var o=e.column,u=t.column;else var o=t.column,u=e.column;var a=e.row<t.row;if(a)var f=e.row,l=t.row;else var f=t.row,l=e.row;o<0&&(o=0),f<0&&(f=0),f==l&&(n=!0);for(var c=f;c<=l;c++){var h=i.fromPoints(this.session.screenToDocumentPosition(c,o),this.session.screenToDocumentPosition(c,u));if(h.isEmpty()){if(p&&v(h.end,p))break;var p=h.end}h.cursor=s?h.start:h.end,r.push(h)}a&&r.reverse();if(!n){var d=r.length-1;while(r[d].isEmpty()&&d>0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.on("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeEventListener("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;t.multiSelectAction?t.multiSelectAction=="forEach"?n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),t.exec(n,e.args||{})):t.multiSelectAction(n,e.args||{}):(t.exec(n,e.args||{}),n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()),e.preventDefault()},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=this.session,i=this.selection,o=i.rangeList,u=i._eventRegistry;i._eventRegistry={};var a=new s(r);this.inVirtualSelectionMode=!0;for(var f=o.ranges.length;f--;){if(n)while(f>0&&o.ranges[f].start.row==o.ranges[f-1].end.row)f--;a.fromOrientedRange(o.ranges[f]),this.selection=r.selection=a,e.exec(this,t||{}),a.toOrientedRange(o.ranges[f])}a.detach(),this.selection=r.selection=i,this.inVirtualSelectionMode=!1,i._eventRegistry=u,i.mergeOverlappingRanges(),this.onCursorChange(),this.onSelectionChange()},this.exitMultiSelectMode=function(){if(this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getCopyText=function(){var e="";if(this.inMultiSelectMode){var t=this.multiSelect.rangeList.ranges;e=[];for(var n=0;n<t.length;n++)e.push(this.session.getTextRange(t[n]));e=e.join(this.session.getDocument().getNewLineCharacter())}else this.selection.isEmpty()||(e=this.session.getTextRange(this.getSelectionRange()));return e},this.onPaste=function(e){if(this.$readOnly)return;this._signal("paste",e);if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return this.insert(e);var t=e.split(/\r\n|\r|\n/),n=this.selection.rangeList.ranges;if(t.length>n.length||t.length<=2||!t[1])return this.commands.exec("insertstring",this,e);for(var r=n.length;r--;){var i=n[r];i.isEmpty()||this.session.remove(i),this.session.insert(i.start,t[r])}},this.findAll=function(e,t,n){t=t||{},t.needle=e||t.needle,this.$search.set(t);var r=this.$search.findAll(this.session);if(!r.length)return 0;this.$blockScrolling+=1;var i=this.multiSelect;n||i.toSingleRange(r[0]);for(var s=r.length;s--;)i.addRange(r[s],!0);return this.$blockScrolling-=1,r.length},this.selectMoreLines=function(e,t){var n=this.selection.toOrientedRange(),r=n.cursor==n.end,s=this.session.documentToScreenPosition(n.cursor);this.selection.$desiredColumn&&(s.column=this.selection.$desiredColumn);var o=this.session.screenToDocumentPosition(s.row+e,s.column);if(!n.isEmpty())var u=this.session.documentToScreenPosition(r?n.end:n.start),a=this.session.screenToDocumentPosition(u.row+e,u.column);else var a=o;if(r){var f=i.fromPoints(o,a);f.cursor=f.start}else{var f=i.fromPoints(a,o);f.cursor=f.end}f.desiredColumn=s.column;if(!this.selection.inMultiSelectMode)this.selection.addRange(n);else if(t)var l=n.cursor;this.selection.addRange(f),l&&this.selection.substractPoint(l)},this.transposeSelections=function(e){var t=this.session,n=t.multiSelect,r=n.ranges;for(var i=r.length;i--;){var s=r[i];if(s.isEmpty()){var o=t.getWordRange(s.start.row,s.start.column);s.start.row=o.start.row,s.start.column=o.start.column,s.end.row=o.end.row,s.end.column=o.end.column}}n.mergeOverlappingRanges();var u=[];for(var i=r.length;i--;){var s=r[i];u.unshift(t.getTextRange(s))}e<0?u.unshift(u.pop()):u.push(u.shift());for(var i=r.length;i--;){var s=r[i],o=s.clone();t.replace(s,u[i]),s.start.row=o.start.row,s.start.column=o.start.column}},this.selectMore=function(e,t){var n=this.session,r=n.multiSelect,i=r.toOrientedRange();if(i.isEmpty()){var i=n.getWordRange(i.start.row,i.start.column);i.cursor=i.end,this.multiSelect.addRange(i)}var s=n.getTextRange(i),o=h(n,s,e);o&&(o.cursor=e==-1?o.start:o.end,this.multiSelect.addRange(o)),t&&this.multiSelect.substractPoint(i.cursor)},this.alignCursors=function(){var e=this.session,t=e.multiSelect,n=t.ranges;if(!n.length){var r=this.selection.getRange(),s=r.start.row,o=r.end.row,u=this.session.doc.removeLines(s,o);u=this.$reAlignText(u),this.session.doc.insertLines(s,u),r.start.column=0,r.end.column=u[u.length-1].length,this.selection.setRange(r)}else{var f=-1,l=n.filter(function(e){if(e.cursor.row==f)return!0;f=e.cursor.row});t.$onRemoveRange(l);var c=0,h=Infinity,p=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>c&&(c=n.column),i<h&&(h=i),i});n.forEach(function(t,n){var r=t.cursor,s=c-r.column,o=p[n]-h;s>o?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=c,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e){function o(e){return a.stringRepeat(" ",e)}function u(e){return e[2]?o(r)+e[2]+o(i-e[2].length+s)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function f(e){return e[2]?o(r+i-e[2].length)+e[2]+o(s," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?o(r)+e[2]+o(s)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var t=!0,n=!0,r,i,s;return e.map(function(e){var o=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return o?r==null?(r=o[1].length,i=o[2].length,s=o[3].length,o):(r+i+s!=o[1].length+o[2].length+o[3].length&&(n=!1),r!=o[1].length&&(t=!1),r>o[1].length&&(r=o[1].length),i<o[2].length&&(i=o[2].length),s>o[3].length&&(s=o[3].length),o):[e]}).map(t?n?f:u:l)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t.multiSelect||(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t.multiSelect;var n=e.oldSession;n&&(n.multiSelect&&n.multiSelect.editor==this&&(n.multiSelect.editor=null),t.multiSelect.removeEventListener("addRange",this.$onAddRange),t.multiSelect.removeEventListener("removeRange",this.$onRemoveRange),t.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect),t.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)),t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m}),ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(e,t,n){function i(e,t){return e.row==t.row&&e.column==t.column}function s(e){var t=e.domEvent,n=t.altKey,s=t.shiftKey,o=e.getAccelKey(),u=e.getButton();if(e.editor.inMultiSelectMode&&u==2){e.editor.textInput.onContextMenu(e.domEvent);return}if(!o&&!n){u==0&&e.editor.inMultiSelectMode&&e.editor.exitMultiSelectMode();return}var a=e.editor,f=a.selection,l=a.inMultiSelectMode,c=e.getDocumentPosition(),h=f.getCursor(),p=e.inSelection()||f.isEmpty()&&i(c,h),d=e.x,v=e.y,m=function(e){d=e.clientX,v=e.clientY},g=function(){var e=a.renderer.pixelToScreenCoordinates(d,v),t=y.screenToDocumentPosition(e.row,e.column);if(i(w,e)&&i(t,f.selectionLead))return;w=e,a.selection.moveCursorToPosition(t),a.selection.clearSelection(),a.renderer.scrollCursorIntoView(),a.removeSelectionMarkers(x),x=f.rectangularRangeBlock(w,b),x.forEach(a.addSelectionMarker,a),a.updateSelectionMarkers()},y=a.session,b=a.renderer.pixelToScreenCoordinates(d,v),w=b;if(o&&!s&&!n&&u==0){if(!l&&p)return;if(!l){var E=f.toOrientedRange();a.addSelectionMarker(E)}var S=f.rangeList.rangeAtPoint(c);r.capture(a.container,function(){},function(){var e=f.toOrientedRange();S&&e.isEmpty()&&i(S.cursor,e.cursor)?f.substractPoint(e.cursor):(E&&(a.removeSelectionMarker(E),f.addRange(E)),f.addRange(e))})}else if(n&&u==0){e.stop(),l&&!o?f.toSingleRange():!l&&o&&f.addRange();var x=[];s?(b=y.documentToScreenPosition(f.lead),g()):(f.moveCursorToPosition(c),f.clearSelection());var T=function(e){clearInterval(C),a.removeSelectionMarkers(x);for(var t=0;t<x.length;t++)f.addRange(x[t])},N=g;r.capture(a.container,m,T);var C=setInterval(function(){N()},20);return e.preventDefault()}}var r=e("../lib/event");t.onMouseDown=s}),ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"],function(e,t,n){t.defaultCommands=[{name:"addCursorAbove",exec:function(e){e.selectMoreLines(-1)},bindKey:{win:"Ctrl-Alt-Up",mac:"Ctrl-Alt-Up"},readonly:!0},{name:"addCursorBelow",exec:function(e){e.selectMoreLines(1)},bindKey:{win:"Ctrl-Alt-Down",mac:"Ctrl-Alt-Down"},readonly:!0},{name:"addCursorAboveSkipCurrent",exec:function(e){e.selectMoreLines(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Up",mac:"Ctrl-Alt-Shift-Up"},readonly:!0},{name:"addCursorBelowSkipCurrent",exec:function(e){e.selectMoreLines(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Down",mac:"Ctrl-Alt-Shift-Down"},readonly:!0},{name:"selectMoreBefore",exec:function(e){e.selectMore(-1)},bindKey:{win:"Ctrl-Alt-Left",mac:"Ctrl-Alt-Left"},readonly:!0},{name:"selectMoreAfter",exec:function(e){e.selectMore(1)},bindKey:{win:"Ctrl-Alt-Right",mac:"Ctrl-Alt-Right"},readonly:!0},{name:"selectNextBefore",exec:function(e){e.selectMore(-1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Left",mac:"Ctrl-Alt-Shift-Left"},readonly:!0},{name:"selectNextAfter",exec:function(e){e.selectMore(1,!0)},bindKey:{win:"Ctrl-Alt-Shift-Right",mac:"Ctrl-Alt-Shift-Right"},readonly:!0},{name:"splitIntoLines",exec:function(e){e.multiSelect.splitIntoLines()},bindKey:{win:"Ctrl-Alt-L",mac:"Ctrl-Alt-L"},readonly:!0},{name:"alignCursors",exec:function(e){e.alignCursors()},bindKey:{win:"Ctrl-Alt-A",mac:"Ctrl-Alt-A"}}],t.multiSelectCommands=[{name:"singleSelection",bindKey:"esc",exec:function(e){e.exitMultiSelectMode()},readonly:!0,isAvailable:function(e){return e&&e.inMultiSelectMode}}];var r=e("../keyboard/hash_handler").HashHandler;t.keyboardHandler=new r(t.multiSelectCommands)}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/config"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/event_emitter").EventEmitter,s=e("../config"),o=function(t,n,r){this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),this.onError=this.onError.bind(this);var i;if(s.get("packaged"))i=s.moduleUrl(n,"worker");else{var o=this.$normalizePath;typeof e.supports!="undefined"&&e.supports.indexOf("ucjs2-pinf-0")>=0?i=e.nameToUrl("ace/worker/worker_sourcemint"):(e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),i=o(e.toUrl("ace/worker/worker",null,"_")));var u={};t.forEach(function(t){u[t]=o(e.toUrl(t,null,"_").replace(/.js(\?.*)?$/,""))})}this.$worker=new Worker(i),this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onerror=this.onError,this.$worker.onmessage=this.onMessage};(function(){r.implement(this,i),this.onError=function(e){throw window.console&&console.log&&console.log(e),e},this.onMessage=function(e){var t=e.data;switch(t.type){case"log":window.console&&console.log&&console.log.apply(console,t.data);break;case"event":this._emit(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id])}},this.$normalizePath=function(e){return location.host?(e=e.replace(/^[a-z]+:\/\/[^\/]+/,""),e=location.protocol+"//"+location.host+(e.charAt(0)=="/"?"":location.pathname.replace(/\/[^\/]*$/,""))+"/"+e.replace(/^[\/]+/,""),e):e},this.terminate=function(){this._emit("terminate",{}),this.$worker.terminate(),this.$worker=null,this.$doc.removeEventListener("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){e.range={start:e.data.range.start,end:e.data.range.end},this.emit("change",e)}}).call(o.prototype);var u=function(e,t,n){this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,o=Object.create(i),u=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){u.messageBuffer.push(e),r&&setTimeout(a)};var a=function(){var e=u.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&o._emit(e.event,e.data)};o.postMessage=function(e){u.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},s.loadModule(["worker",t],function(e){r=new e[n](o);while(u.messageBuffer.length)a()})};u.prototype=o.prototype,t.UIWorkerClient=u,t.WorkerClient=o}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session,i=this.$pos;this.pos=t.createAnchor(i.row,i.column),this.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.pos.on("change",function(t){n.removeMarker(e.markerId),e.markerId=n.addMarker(new r(t.value.row,t.value.column,t.value.row,t.value.column+e.length),e.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1),n.on("change",function(i){e.removeMarker(n.markerId),n.markerId=e.addMarker(new r(i.value.row,i.value.column,i.value.row,i.value.column+t.length),t.othersClass,null,!1)})})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e<this.others.length;e++)this.session.removeMarker(this.others[e].markerId)},this.onUpdate=function(e){var t=e.data,n=t.range;if(n.start.row!==n.end.row)return;if(n.start.row!==this.pos.row)return;if(this.$updating)return;this.$updating=!0;var i=t.action==="insertText"?n.end.column-n.start.column:n.start.column-n.end.column;if(n.start.column>=this.pos.column&&n.start.column<=this.pos.column+this.length+1){var s=n.start.column-this.pos.column;this.length+=i;if(!this.session.$fromUndo){if(t.action==="insertText")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.insert(a,t.text)}else if(t.action==="removeText")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};u.row===n.start.row&&n.start.column<u.column&&(a.column+=i),this.doc.remove(new r(a.row,a.column,a.row,a.column-i))}n.start.column===this.pos.column&&t.action==="insertText"?setTimeout(function(){this.pos.setPosition(this.pos.row,this.pos.column-i);for(var e=0;e<this.others.length;e++){var t=this.others[e],r={row:t.row,column:t.column-i};t.row===n.start.row&&n.start.column<t.column&&(r.column+=i),t.setPosition(r.row,r.column)}}.bind(this),0):n.start.column===this.pos.column&&t.action==="removeText"&&setTimeout(function(){for(var e=0;e<this.others.length;e++){var t=this.others[e];t.row===n.start.row&&n.start.column<t.column&&t.setPosition(t.row,t.column-i)}}.bind(this),0)}this.pos._emit("change",{value:this.pos});for(var o=0;o<this.others.length;o++)this.others[o]._emit("change",{value:this.others[o]})}this.$updating=!1},this.onCursorChange=function(e){if(this.$updating)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.pos.detach();for(var e=0;e<this.others.length;e++)this.others[e].detach();this.session.setUndoSelect(!0)},this.cancel=function(){if(this.$undoStackDepth===-1)throw Error("Canceling placeholders only supported with undo manager attached to session.");var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n<t;n++)e.undo(!0)}}).call(o.prototype),t.PlaceHolder=o}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++t<a){var c=e.getLine(t).search(i);if(c==-1)continue;if(c<=o)break;l=t}if(l>f){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=this.getFoldWidget(e,u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm .ace_scroller {background-color: #FFFFFF;}.ace-tm .ace_cursor {border-left: 2px solid black;}.ace-tm .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_markup.ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)});
- (function() {
- ace.require(["ace/ace"], function(a) {
- a && a.config.init();
- if (!window.ace)
- window.ace = {};
- for (var key in a) if (a.hasOwnProperty(key))
- ace[key] = a[key];
- });
- })();
-
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/ace/ext-textarea.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-ace.define("ace/ext/textarea",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/lib/net","ace/ace","ace/theme/textmate","ace/mode/text"],function(e,t,n){function a(e,t){for(var n in t)e.style[n]=t[n]}function f(e,t){if(e.type!="textarea")throw"Textarea required!";var n=e.parentNode,i=document.createElement("div"),s=function(){var t="position:relative;";["margin-top","margin-left","margin-right","margin-bottom"].forEach(function(n){t+=n+":"+u(e,i,n)+";"});var n=u(e,i,"width")||e.clientWidth+"px",r=u(e,i,"height")||e.clientHeight+"px";t+="height:"+r+";width:"+n+";",t+="display:inline-block;",i.setAttribute("style",t)};r.addListener(window,"resize",s),s(),n.insertBefore(i,e.nextSibling);while(n!==document){if(n.tagName.toUpperCase()==="FORM"){var o=n.onsubmit;n.onsubmit=function(n){e.value=t(),o&&o.call(this,n)};break}n=n.parentNode}return i}function l(t,n,r){s.loadScript(t,function(){e([n],r)})}function c(n,r,i,s,o,u){function c(e){return e==="true"||e==1}var a=n.getSession(),f=n.renderer;u=u||l,n.setDisplaySettings=function(e){e==null&&(e=i.style.display=="none"),e?(i.style.display="block",i.hideButton.focus(),n.on("focus",function t(){n.removeListener("focus",t),i.style.display="none"})):n.focus()},n.setOption=function(t,i){if(o[t]==i)return;switch(t){case"gutter":f.setShowGutter(c(i));break;case"mode":i!="text"?u("mode-"+i+".js","ace/mode/"+i,function(){var t=e("../mode/"+i).Mode;a.setMode(new t)}):a.setMode(new(e("../mode/text").Mode));break;case"theme":i!="textmate"?u("theme-"+i+".js","ace/theme/"+i,function(){n.setTheme("ace/theme/"+i)}):n.setTheme("ace/theme/textmate");break;case"fontSize":r.style.fontSize=i;break;case"keybindings":switch(i){case"vim":n.setKeyboardHandler("ace/keyboard/vim");break;case"emacs":n.setKeyboardHandler("ace/keyboard/emacs");break;default:n.setKeyboardHandler(null)}break;case"softWrap":switch(i){case"off":a.setUseWrapMode(!1),f.setPrintMarginColumn(80);break;case"40":a.setUseWrapMode(!0),a.setWrapLimitRange(40,40),f.setPrintMarginColumn(40);break;case"80":a.setUseWrapMode(!0),a.setWrapLimitRange(80,80),f.setPrintMarginColumn(80);break;case"free":a.setUseWrapMode(!0),a.setWrapLimitRange(null,null),f.setPrintMarginColumn(80)}break;case"useSoftTabs":a.setUseSoftTabs(c(i));break;case"showPrintMargin":f.setShowPrintMargin(c(i));break;case"showInvisibles":n.setShowInvisibles(c(i))}o[t]=i},n.getOption=function(e){return o[e]},n.getOptions=function(){return o};for(var h in t.options)n.setOption(h,t.options[h]);return n}function h(e,t,n,i){function f(e,t,n,r){if(!n){e.push("<input type='checkbox' title='",t,"' ",r=="true"?"checked='true'":"","'></input>");return}e.push("<select title='"+t+"'>");for(var i in n)e.push("<option value='"+i+"' "),r==i&&e.push(" selected "),e.push(">",n[i],"</option>");e.push("</select>")}var s=null,o={mode:"Mode:",gutter:"Display Gutter:",theme:"Theme:",fontSize:"Font Size:",softWrap:"Soft Wrap:",keybindings:"Keyboard",showPrintMargin:"Show Print Margin:",useSoftTabs:"Use Soft Tabs:",showInvisibles:"Show Invisibles"},u={mode:{text:"Plain",javascript:"JavaScript",xml:"XML",html:"HTML",css:"CSS",scss:"SCSS",python:"Python",php:"PHP",java:"Java",ruby:"Ruby",c_cpp:"C/C++",coffee:"CoffeeScript",json:"json",perl:"Perl",clojure:"Clojure",ocaml:"OCaml",csharp:"C#",haxe:"haXe",svg:"SVG",textile:"Textile",groovy:"Groovy",liquid:"Liquid",Scala:"Scala"},theme:{clouds:"Clouds",clouds_midnight:"Clouds Midnight",cobalt:"Cobalt",crimson_editor:"Crimson Editor",dawn:"Dawn",eclipse:"Eclipse",idle_fingers:"Idle Fingers",kr_theme:"Kr Theme",merbivore:"Merbivore",merbivore_soft:"Merbivore Soft",mono_industrial:"Mono Industrial",monokai:"Monokai",pastel_on_dark:"Pastel On Dark",solarized_dark:"Solarized Dark",solarized_light:"Solarized Light",textmate:"Textmate",twilight:"Twilight",vibrant_ink:"Vibrant Ink"},gutter:s,fontSize:{"10px":"10px","11px":"11px","12px":"12px","14px":"14px","16px":"16px"},softWrap:{off:"Off",40:"40",80:"80",free:"Free"},keybindings:{ace:"ace",vim:"vim",emacs:"emacs"},showPrintMargin:s,useSoftTabs:s,showInvisibles:s},a=[];a.push("<table><tr><th>Setting</th><th>Value</th></tr>");for(var l in i)a.push("<tr><td>",o[l],"</td>"),a.push("<td>"),f(a,l,u[l],i[l]),a.push("</td></tr>");a.push("</table>"),e.innerHTML=a.join("");var c=function(e){var t=e.currentTarget;n.setOption(t.title,t.value)},h=function(e){var t=e.currentTarget;n.setOption(t.title,t.checked)},p=e.getElementsByTagName("select");for(var d=0;d<p.length;d++)p[d].onchange=c;var v=e.getElementsByTagName("input");for(var d=0;d<v.length;d++)v[d].onclick=h;var m=document.createElement("input");m.type="button",m.value="Hide",r.addListener(m,"click",function(){n.setDisplaySettings(!1)}),e.appendChild(m),e.hideButton=m}var r=e("../lib/event"),i=e("../lib/useragent"),s=e("../lib/net"),o=e("../ace");e("../theme/textmate"),n.exports=t=o;var u=function(e,t,n){var r=e.style[n];r||(window.getComputedStyle?r=window.getComputedStyle(e,"").getPropertyValue(n):r=e.currentStyle[n]);if(!r||r=="auto"||r=="intrinsic")r=t.style[n];return r};t.transformTextarea=function(e,t){var n,s=f(e,function(){return n.getValue()});e.style.display="none",s.style.background="white";var u=document.createElement("div");a(u,{top:"0px",left:"0px",right:"0px",bottom:"0px",border:"1px solid gray",position:"absolute"}),s.appendChild(u);var l=document.createElement("div");a(l,{position:"absolute",right:"0px",bottom:"0px",background:"red",cursor:"nw-resize",borderStyle:"solid",borderWidth:"9px 8px 10px 9px",width:"2px",borderColor:"lightblue gray gray lightblue",zIndex:101});var p=document.createElement("div"),d={top:"0px",left:"20%",right:"0px",bottom:"0px",position:"absolute",padding:"5px",zIndex:100,color:"white",display:"none",overflow:"auto",fontSize:"14px",boxShadow:"-5px 2px 3px gray"};i.isOldIE?d.backgroundColor="#333":d.backgroundColor="rgba(0, 0, 0, 0.6)",a(p,d),s.appendChild(p);var v={},m=o.edit(u);n=m.getSession(),n.setValue(e.value||e.innerHTML),m.focus(),s.appendChild(l),c(m,u,p,o,v,t),h(p,l,m,v);var g="";return r.addListener(l,"mousemove",function(e){var t=this.getBoundingClientRect(),n=e.clientX-t.left,r=e.clientY-t.top;n+r<(t.width+t.height)/2?(this.style.cursor="pointer",g="toggle"):(g="resize",this.style.cursor="nw-resize")}),r.addListener(l,"mousedown",function(e){if(g=="toggle"){m.setDisplaySettings();return}s.style.zIndex=1e5;var t=s.getBoundingClientRect(),n=t.width+t.left-e.clientX,i=t.height+t.top-e.clientY;r.capture(l,function(e){s.style.width=e.clientX-t.left+n+"px",s.style.height=e.clientY-t.top+i+"px",m.resize()},function(){})}),m},t.options={mode:"text",theme:"textmate",gutter:"false",fontSize:"12px",softWrap:"off",keybindings:"ace",showPrintMargin:"false",useSoftTabs:"true",showInvisibles:"false"}})
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/ace/mode-json.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/tokenizer","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){var r=e("../lib/oop"),i=e("./text").Mode,s=e("../tokenizer").Tokenizer,o=e("./json_highlight_rules").JsonHighlightRules,u=e("./matching_brace_outdent").MatchingBraceOutdent,a=e("./behaviour/cstyle").CstyleBehaviour,f=e("./folding/cstyle").FoldMode,l=e("../worker/worker_client").WorkerClient,c=function(){this.$tokenizer=new s((new o).getRules()),this.$outdent=new u,this.$behaviour=new a,this.foldingRules=new f};r.inherits(c,i),function(){this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t);if(e=="start"){var i=t.match(/^.*[\{\(\[]\s*$/);i&&(r+=n)}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new l(["ace"],"ace/mode/json_worker","JsonWorker");return t.attachToDocument(e.getDocument()),t.on("error",function(t){e.setAnnotations([t.data])}),t.on("ok",function(){e.clearAnnotations()}),t}}.call(c.prototype),t.Mode=c}),ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"invalid.illegal",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"invalid.illegal",regex:"\\/\\/.*$"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'[^"\\\\]+'},{token:"string",regex:'"',next:"start"},{token:"string",regex:"",next:"start"}]}};r.inherits(s,i),t.JsonHighlightRules=s}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f=0,l=-1,c="",h=0,p=-1,d="",v="",m=function(){m.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},m.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},m.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,c[0])||(f=0),l=r.row,c=n+i.substr(r.column),f++},m.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(h=0),p=r.row,d=i.substr(0,r.column)+n,v=i.substr(r.column),h++},m.isAutoInsertedClosing=function(e,t,n){return f>0&&e.row===l&&n===c[0]&&t.substr(e.column)===c},m.isMaybeInsertedClosing=function(e,t){return h>0&&e.row===p&&t.substr(e.column)===v&&t.substr(0,e.column)==d},m.popAutoInsertedClosing=function(){c=c.substr(1),f--},m.clearMaybeInsertedClosing=function(){h=0,p=-1},this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){var a=n.getSelectionRange(),f=r.doc.getTextRange(a);if(f!==""&&f!=="{"&&n.getWrapBehavioursEnabled())return{text:"{"+f+"}",selection:!1};if(m.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])?(m.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(m.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){var l=u.substring(s.column,s.column+1);if(l=="}"){var c=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(c!==null&&m.isAutoInsertedClosing(s,u,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else if(i=="\n"||i=="\r\n"){var p="";m.isMaybeInsertedClosing(s,u)&&(p=o.stringRepeat("}",h),m.clearMaybeInsertedClosing());var l=u.substring(s.column,s.column+1);if(l=="}"||p!==""){var d=r.findMatchingBracket({row:s.row,column:s.column},"}");if(!d)return null;var v=this.getNextLineIndent(e,u.substring(0,s.column),r.getTabString()),g=this.$getIndent(u);return{text:"\n"+v+"\n"+g+p,selection:[1,v.length,1,v.length]}}}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;h--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return{text:"("+o+")",selection:!1};if(m.isSaneInsertion(n,r))return m.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&m.isAutoInsertedClosing(u,a,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return{text:"["+o+"]",selection:!1};if(m.isSaneInsertion(n,r))return m.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&m.isAutoInsertedClosing(u,a,i))return m.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return{text:s+u+s,selection:!1};var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column);if(l=="\\")return null;var c=r.getTokens(o.start.row),h=0,p,d=-1;for(var v=0;v<c.length;v++){p=c[v],p.type=="string"?d=-1:d<0&&(d=p.value.indexOf(s));if(p.value.length+h>o.start.column)break;h+=c[v].value.length}if(!p||d<0&&p.type!=="comment"&&(p.type!=="string"||o.start.column!==p.value.length+h-1&&p.value.lastIndexOf(s)===p.value.length-1)){if(!m.isSaneInsertion(n,r))return;return{text:s+s,selection:[1,1]}}if(p&&p.type==="string"){var g=f.substring(a.column,a.column+1);if(g==s)return{text:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};r.inherits(m,i),t.CstyleBehaviour=m}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.getFoldWidgetRange=function(e,t,n){var r=e.getLine(n),i=r.match(this.foldingStartMarker);if(i){var s=i.index;return i[1]?this.openingBracketBlock(e,i[1],n,s):e.getCommentFoldRange(n,s+i[0].length,1)}if(t!=="markbeginend")return;var i=r.match(this.foldingStopMarker);if(i){var s=i.index+i[0].length;return i[1]?this.closingBracketBlock(e,i[1],n,s):e.getCommentFoldRange(n,s,-1)}}}.call(o.prototype)})
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/ace/theme-twilight.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-ace.define("ace/theme/twilight",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!0,t.cssClass="ace-twilight",t.cssText=".ace-twilight .ace_gutter {background: #232323;color: #E2E2E2}.ace-twilight .ace_print-margin {width: 1px;background: #232323}.ace-twilight .ace_scroller {background-color: #141414}.ace-twilight .ace_text-layer {color: #F8F8F8}.ace-twilight .ace_cursor {border-left: 2px solid #A7A7A7}.ace-twilight .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #A7A7A7}.ace-twilight .ace_marker-layer .ace_selection {background: rgba(221, 240, 255, 0.20)}.ace-twilight.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #141414;border-radius: 2px}.ace-twilight .ace_marker-layer .ace_step {background: rgb(102, 82, 0)}.ace-twilight .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgba(255, 255, 255, 0.25)}.ace-twilight .ace_marker-layer .ace_active-line {background: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_gutter-active-line {background-color: rgba(255, 255, 255, 0.031)}.ace-twilight .ace_marker-layer .ace_selected-word {border: 1px solid rgba(221, 240, 255, 0.20)}.ace-twilight .ace_invisible {color: rgba(255, 255, 255, 0.25)}.ace-twilight .ace_keyword,.ace-twilight .ace_meta {color: #CDA869}.ace-twilight .ace_constant,.ace-twilight .ace_constant.ace_character,.ace-twilight .ace_constant.ace_character.ace_escape,.ace-twilight .ace_constant.ace_other,.ace-twilight .ace_markup.ace_heading,.ace-twilight .ace_support.ace_constant {color: #CF6A4C}.ace-twilight .ace_invalid.ace_illegal {color: #F8F8F8;background-color: rgba(86, 45, 86, 0.75)}.ace-twilight .ace_invalid.ace_deprecated {text-decoration: underline;font-style: italic;color: #D2A8A1}.ace-twilight .ace_support {color: #9B859D}.ace-twilight .ace_fold {background-color: #AC885B;border-color: #F8F8F8}.ace-twilight .ace_support.ace_function {color: #DAD085}.ace-twilight .ace_markup.ace_list,.ace-twilight .ace_storage {color: #F9EE98}.ace-twilight .ace_entity.ace_name.ace_function,.ace-twilight .ace_meta.ace_tag,.ace-twilight .ace_variable {color: #AC885B}.ace-twilight .ace_string {color: #8F9D6A}.ace-twilight .ace_string.ace_regexp {color: #E9C062}.ace-twilight .ace_comment {font-style: italic;color: #5F5A60}.ace-twilight .ace_variable {color: #7587A6}.ace-twilight .ace_xml-pe {color: #494949}.ace-twilight .ace_markup.ace_underline {text-decoration: underline}.ace-twilight .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERH5zzBz5sz/AA5EBAYqeZXWAAAAAElFTkSuQmCC) right repeat-y}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/ace/theme-xcode.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-ace.define("ace/theme/xcode",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-xcode",t.cssText="/* THIS THEME WAS AUTOGENERATED BY Theme.tmpl.css (UUID: EE3AD170-2B7F-4DE1-B724-C75F13FE0085) */.ace-xcode .ace_gutter {background: #e8e8e8;color: #333}.ace-xcode .ace_print-margin {width: 1px;background: #e8e8e8}.ace-xcode .ace_scroller {background-color: #FFFFFF}.ace-xcode .ace_text-layer {color: #000000}.ace-xcode .ace_cursor {border-left: 2px solid #000000}.ace-xcode .ace_overwrite-cursors .ace_cursor {border-left: 0px;border-bottom: 1px solid #000000}.ace-xcode .ace_marker-layer .ace_selection {background: #B5D5FF}.ace-xcode.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px #FFFFFF;border-radius: 2px}.ace-xcode .ace_marker-layer .ace_step {background: rgb(198, 219, 174)}.ace-xcode .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid #BFBFBF}.ace-xcode .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_gutter-active-line {background-color: rgba(0, 0, 0, 0.071)}.ace-xcode .ace_marker-layer .ace_selected-word {border: 1px solid #B5D5FF}.ace-xcode .ace_constant.ace_language,.ace-xcode .ace_keyword,.ace-xcode .ace_meta,.ace-xcode .ace_variable.ace_language {color: #C800A4}.ace-xcode .ace_invisible {color: #BFBFBF}.ace-xcode .ace_constant.ace_character,.ace-xcode .ace_constant.ace_other {color: #275A5E}.ace-xcode .ace_constant.ace_numeric {color: #3A00DC}.ace-xcode .ace_entity.ace_other.ace_attribute-name,.ace-xcode .ace_support.ace_constant,.ace-xcode .ace_support.ace_function {color: #450084}.ace-xcode .ace_fold {background-color: #C800A4;border-color: #000000}.ace-xcode .ace_entity.ace_name.ace_tag,.ace-xcode .ace_support.ace_class,.ace-xcode .ace_support.ace_type {color: #790EAD}.ace-xcode .ace_storage {color: #C900A4}.ace-xcode .ace_string {color: #DF0002}.ace-xcode .ace_comment {color: #008E00}.ace-xcode .ace_indent-guide {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y;}";var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)})
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/ace/worker-json.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-"no use strict";(function(e){if(typeof e.window!="undefined"&&e.document)return;e.console={log:function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},error:function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})}},e.window=e,e.ace=e,e.normalizeModule=function(e,t){if(t.indexOf("!")!==-1){var n=t.split("!");return normalizeModule(e,n[0])+"!"+normalizeModule(e,n[1])}if(t.charAt(0)=="."){var r=e.split("/").slice(0,-1).join("/");t=r+"/"+t;while(t.indexOf(".")!==-1&&i!=t){var i=t;t=t.replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return t},e.require=function(e,t){if(!t.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");t=normalizeModule(e,t);var n=require.modules[t];if(n)return n.initialized||(n.initialized=!0,n.exports=n.factory().exports),n.exports;var r=t.split("/");r[0]=require.tlns[r[0]]||r[0];var i=r.join("/")+".js";return require.id=t,importScripts(i),require(e,t)},require.modules={},require.tlns={},e.define=function(e,t,n){arguments.length==2?(n=t,typeof e!="string"&&(t=e,e=require.id)):arguments.length==1&&(n=e,e=require.id);if(e.indexOf("text!")===0)return;var r=function(t,n){return require(e,t,n)};require.modules[e]={factory:function(){var e={exports:{}},t=n(r,e.exports,e);return t&&(e.exports=t),e}}},e.initBaseUrls=function(t){require.tlns=t},e.initSender=function(){var t=require(null,"ace/lib/event_emitter").EventEmitter,n=require(null,"ace/lib/oop"),r=function(){};return function(){n.implement(this,t),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(r.prototype),new r},e.main=null,e.sender=null,e.onmessage=function(e){var t=e.data;if(t.command){if(!main[t.command])throw new Error("Unknown command:"+t.command);main[t.command].apply(main,t.args)}else if(t.init){initBaseUrls(t.tlns),require(null,"ace/lib/fixoldbrowsers"),sender=initSender();var n=require(null,t.module)[t.classname];main=new n(sender)}else t.event&&sender&&sender._emit(t.event,t.data)}})(this),ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"],function(e,t,n){e("./regexp"),e("./es5-shim")}),ace.define("ace/lib/regexp",["require","exports","module"],function(e,t,n){function r(e){return(e.global?"g":"")+(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.extended?"x":"")+(e.sticky?"y":"")}function i(e,t,n){if(Array.prototype.indexOf)return e.indexOf(t,n);for(var r=n||0;r<e.length;r++)if(e[r]===t)return r;return-1}var s={exec:RegExp.prototype.exec,test:RegExp.prototype.test,match:String.prototype.match,replace:String.prototype.replace,split:String.prototype.split},o=s.exec.call(/()??/,"")[1]===undefined,u=function(){var e=/^/g;return s.test.call(e,""),!e.lastIndex}();if(u&&o)return;RegExp.prototype.exec=function(e){var t=s.exec.apply(this,arguments),n,a;if(typeof e=="string"&&t){!o&&t.length>1&&i(t,"")>-1&&(a=RegExp(this.source,s.replace.call(r(this),"g","")),s.replace.call(e.slice(t.index),a,function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===undefined&&(t[e]=undefined)}));if(this._xregexp&&this._xregexp.captureNames)for(var f=1;f<t.length;f++)n=this._xregexp.captureNames[f-1],n&&(t[n]=t[f]);!u&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--}return t},u||(RegExp.prototype.test=function(e){var t=s.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function i(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function s(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function o(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function u(e){var t,n,r;if(o(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(o(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(o(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if(typeof t!="function")throw new TypeError("Function.prototype.bind called on incompatible "+t);var n=c.call(arguments,1),i=function(){if(this instanceof i){var r=t.apply(this,n.concat(c.call(arguments)));return Object(r)===r?r:this}return t.apply(e,n.concat(c.call(arguments)))};return t.prototype&&(r.prototype=t.prototype,i.prototype=new r,r.prototype=null),i});var a=Function.prototype.call,f=Array.prototype,l=Object.prototype,c=f.slice,h=a.bind(l.toString),p=a.bind(l.hasOwnProperty),d,v,m,g,y;if(y=p(l,"__defineGetter__"))d=a.bind(l.__defineGetter__),v=a.bind(l.__defineSetter__),m=a.bind(l.__lookupGetter__),g=a.bind(l.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+t<n||(t=n-e);var r=this.slice(e,e+t),i=c.call(arguments,2),s=i.length;if(e===n)s&&this.push.apply(this,i);else{var o=Math.min(t,n-e),u=e+o,a=u+s-o,f=n-u,l=n-o;if(a<u)for(var h=0;h<f;++h)this[a+h]=this[u+h];else if(a>u)for(h=f;h--;)this[a+h]=this[u+h];if(s&&e===l)this.length=l,this.push.apply(this,i);else{this.length=l+s;for(h=0;h<s;++h)this[e+h]=i[h]}}return r};else{var b=Array.prototype.splice;Array.prototype.splice=function(e,t){return arguments.length?b.apply(this,[e===void 0?0:e,t===void 0?this.length-e:t].concat(c.call(arguments,2))):[]}}Array.isArray||(Array.isArray=function(e){return h(e)=="[object Array]"});var w=Object("a"),E=w[0]!="a"||!(0 in w);Array.prototype.forEach||(Array.prototype.forEach=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=arguments[1],i=-1,s=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError;while(++i<s)i in n&&e.call(r,n[i],i,t)}),Array.prototype.map||(Array.prototype.map=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=Array(r),s=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var o=0;o<r;o++)o in n&&(i[o]=e.call(s,n[o],o,t));return i}),Array.prototype.filter||(Array.prototype.filter=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=[],s,o=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var u=0;u<r;u++)u in n&&(s=n[u],e.call(o,s,u,t)&&i.push(s));return i}),Array.prototype.every||(Array.prototype.every=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var s=0;s<r;s++)if(s in n&&!e.call(i,n[s],s,t))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0,i=arguments[1];if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");for(var s=0;s<r;s++)if(s in n&&e.call(i,n[s],s,t))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");if(!r&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var i=0,s;if(arguments.length>=2)s=arguments[1];else do{if(i in n){s=n[i++];break}if(++i>=r)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;i<r;i++)i in n&&(s=e.call(void 0,s,n[i],i,t));return s}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(e){var t=F(this),n=E&&h(this)=="[object String]"?this.split(""):t,r=n.length>>>0;if(h(e)!="[object Function]")throw new TypeError(e+" is not a function");if(!r&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var i,s=r-1;if(arguments.length>=2)i=arguments[1];else do{if(s in n){i=n[s--];break}if(--s<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do s in this&&(i=e.call(void 0,i,n[s],s,t));while(s--);return i});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(e){var t=E&&h(this)=="[object String]"?this.split(""):F(this),n=t.length>>>0;if(!n)return-1;var r=0;arguments.length>1&&(r=s(arguments[1])),r=r>=0?r:Math.max(0,n+r);for(;r<n;r++)if(r in t&&t[r]===e)return r;return-1};if(!Array.prototype.lastIndexOf||[0,1].lastIndexOf(0,-3)!=-1)Array.prototype.lastIndexOf=function(e){var t=E&&h(this)=="[object String]"?this.split(""):F(this),n=t.length>>>0;if(!n)return-1;var r=n-1;arguments.length>1&&(r=Math.min(r,s(arguments[1]))),r=r>=0?r:n-Math.abs(r);for(;r>=0;r--)if(r in t&&e===t[r])return r;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(e){return e.__proto__||(e.constructor?e.constructor.prototype:l)});if(!Object.getOwnPropertyDescriptor){var S="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(e,t){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError(S+e);if(!p(e,t))return;var n,r,i;n={enumerable:!0,configurable:!0};if(y){var s=e.__proto__;e.__proto__=l;var r=m(e,t),i=g(e,t);e.__proto__=s;if(r||i)return r&&(n.get=r),i&&(n.set=i),n}return n.value=e[t],n}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(e){return Object.keys(e)});if(!Object.create){var x;Object.prototype.__proto__===null?x=function(){return{__proto__:null}}:x=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(e,t){var n;if(e===null)n=x();else{if(typeof e!="object")throw new TypeError("typeof prototype["+typeof e+"] != 'object'");var r=function(){};r.prototype=e,n=new r,n.__proto__=e}return t!==void 0&&Object.defineProperties(n,t),n}}if(Object.defineProperty){var T=i({}),N=typeof document=="undefined"||i(document.createElement("div"));if(!T||!N)var C=Object.defineProperty}if(!Object.defineProperty||C){var k="Property description must be an object: ",L="Object.defineProperty called on non-object: ",A="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(e,t,n){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError(L+e);if(typeof n!="object"&&typeof n!="function"||n===null)throw new TypeError(k+n);if(C)try{return C.call(Object,e,t,n)}catch(r){}if(p(n,"value"))if(y&&(m(e,t)||g(e,t))){var i=e.__proto__;e.__proto__=l,delete e[t],e[t]=n.value,e.__proto__=i}else e[t]=n.value;else{if(!y)throw new TypeError(A);p(n,"get")&&d(e,t,n.get),p(n,"set")&&v(e,t,n.set)}return e}}Object.defineProperties||(Object.defineProperties=function(e,t){for(var n in t)p(t,n)&&Object.defineProperty(e,n,t[n]);return e}),Object.seal||(Object.seal=function(e){return e}),Object.freeze||(Object.freeze=function(e){return e});try{Object.freeze(function(){})}catch(O){Object.freeze=function(e){return function(t){return typeof t=="function"?t:e(t)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(e){return e}),Object.isSealed||(Object.isSealed=function(e){return!1}),Object.isFrozen||(Object.isFrozen=function(e){return!1}),Object.isExtensible||(Object.isExtensible=function(e){if(Object(e)===e)throw new TypeError;var t="";while(p(e,t))t+="?";e[t]=!0;var n=p(e,t);return delete e[t],n});if(!Object.keys){var M=!0,_=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],D=_.length;for(var P in{toString:null})M=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)p(e,t)&&I.push(t);if(M)for(var n=0,r=D;n<r;n++){var i=_[n];p(e,i)&&I.push(i)}return I}}Date.now||(Date.now=function(){return(new Date).getTime()});var H=" \n\f\r \u2028\u2029";if(!String.prototype.trim||H.trim()){H="["+H+"]";var B=new RegExp("^"+H+H+"*"),j=new RegExp(H+H+"*$");String.prototype.trim=function(){return String(this).replace(B,"").replace(j,"")}}var F=function(e){if(e==null)throw new TypeError("can't convert "+e+" to object");return Object(e)}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),t.target||(t.target=this);for(var o=0;o<n.length;o++){n[o](t);if(t.propagationStopped)break}if(r&&!t.defaultPrevented)return r(t)},r._signal=function(e,t){var n=(this._eventRegistry||{})[e];if(!n)return;for(var r=0;r<n.length;r++)n[r](t)},r.once=function(e,t){var n=this,r=function(){fun&&fun.apply(null,arguments),n.removeEventListener(event,r)};this.addEventListener(event,r)},r.setDefaultHandler=function(e,t){this._defaultHandlers=this._defaultHandlers||{};if(this._defaultHandlers[e])throw new Error("The default handler for '"+e+"' is already set");this._defaultHandlers[e]=t},r.on=r.addEventListener=function(e,t,n){this._eventRegistry=this._eventRegistry||{};var r=this._eventRegistry[e];return r||(r=this._eventRegistry[e]=[]),r.indexOf(t)==-1&&r[n?"unshift":"push"](t),t},r.removeListener=r.removeEventListener=function(e,t){this._eventRegistry=this._eventRegistry||{};var n=this._eventRegistry[e];if(!n)return;var r=n.indexOf(t);r!==-1&&n.splice(r,1)},r.removeAllListeners=function(e){this._eventRegistry&&(this._eventRegistry[e]=[])},t.EventEmitter=r}),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){t.inherits=function(){var e=function(){};return function(t,n){e.prototype=n.prototype,t.super_=n.prototype,t.prototype=new e,t.prototype.constructor=t}}(),t.mixin=function(e,t){for(var n in t)e[n]=t[n]},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"],function(e,t,n){var r=e("../lib/oop"),i=e("../worker/mirror").Mirror,s=e("./json/json_parse"),o=t.JsonWorker=function(e){i.call(this,e),this.setTimeout(200)};r.inherits(o,i),function(){this.onUpdate=function(){var e=this.doc.getValue();try{var t=s(e)}catch(n){var r=this.doc.indexToPosition(n.at-1);this.sender.emit("error",{row:r.row,column:r.column,text:n.message,type:"error"});return}this.sender.emit("ok")}}.call(o.prototype)}),ace.define("ace/worker/mirror",["require","exports","module","ace/document","ace/lib/lang"],function(e,t,n){var r=e("../document").Document,i=e("../lib/lang"),s=t.Mirror=function(e){this.sender=e;var t=this.doc=new r(""),n=this.deferredUpdate=i.delayedCall(this.onUpdate.bind(this)),s=this;e.on("change",function(e){t.applyDeltas([e.data]),n.schedule(s.$timeout)})};(function(){this.$timeout=500,this.setTimeout=function(e){this.$timeout=e},this.setValue=function(e){this.doc.setValue(e),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(e){this.sender.callback(this.doc.getValue(),e)},this.onUpdate=function(){}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=e("./range").Range,o=e("./anchor").Anchor,u=function(e){this.$lines=[],e.length==0?this.$lines=[""]:Array.isArray(e)?this.insertLines(0,e):this.insert({row:0,column:0},e)};(function(){r.implement(this,i),this.setValue=function(e){var t=this.getLength();this.remove(new s(0,0,t,this.getLine(t-1).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new o(this,e,t)},"aaa".split(/a/).length==0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);t?this.$autoNewLine=t[1]:this.$autoNewLine="\n"},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine}},this.$autoNewLine="\n",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){if(e.start.row==e.end.row)return this.$lines[e.start.row].substring(e.start.column,e.end.column);var t=this.getLines(e.start.row+1,e.end.row-1);return t.unshift((this.$lines[e.start.row]||"").substring(e.start.column)),t.push((this.$lines[e.end.row]||"").substring(0,e.end.column)),t.join(this.getNewLineCharacter())},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t&&(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length),e},this.insert=function(e,t){if(!t||t.length===0)return e;e=this.$clipPosition(e),this.getLength()<=1&&this.$detectNewLine(t);var n=this.$split(t),r=n.splice(0,1)[0],i=n.length==0?null:n.splice(n.length-1,1)[0];return e=this.insertInLine(e,r),i!==null&&(e=this.insertNewLine(e),e=this.insertLines(e.row,n),e=this.insertInLine(e,i||"")),e},this.insertLines=function(e,t){if(t.length==0)return{row:e,column:0};if(t.length>65535){var n=this.insertLines(e,t.slice(65535));t=t.slice(0,65535)}var r=[e,0];r.push.apply(r,t),this.$lines.splice.apply(this.$lines,r);var i=new s(e,0,e+t.length,0),o={action:"insertLines",range:i,lines:t};return this._emit("change",{data:o}),n||i.end},this.insertNewLine=function(e){e=this.$clipPosition(e);var t=this.$lines[e.row]||"";this.$lines[e.row]=t.substring(0,e.column),this.$lines.splice(e.row+1,0,t.substring(e.column,t.length));var n={row:e.row+1,column:0},r={action:"insertText",range:s.fromPoints(e,n),text:this.getNewLineCharacter()};return this._emit("change",{data:r}),n},this.insertInLine=function(e,t){if(t.length==0)return e;var n=this.$lines[e.row]||"";this.$lines[e.row]=n.substring(0,e.column)+t+n.substring(e.column);var r={row:e.row,column:e.column+t.length},i={action:"insertText",range:s.fromPoints(e,r),text:t};return this._emit("change",{data:i}),r},this.remove=function(e){e.start=this.$clipPosition(e.start),e.end=this.$clipPosition(e.end);if(e.isEmpty())return e.start;var t=e.start.row,n=e.end.row;if(e.isMultiLine()){var r=e.start.column==0?t:t+1,i=n-1;e.end.column>0&&this.removeInLine(n,0,e.end.column),i>=r&&this.removeLines(r,i),r!=t&&(this.removeInLine(t,e.start.column,this.getLine(t).length),this.removeNewLine(e.start.row))}else this.removeInLine(t,e.start.column,e.end.column);return e.start},this.removeInLine=function(e,t,n){if(t==n)return;var r=new s(e,t,e,n),i=this.getLine(e),o=i.substring(t,n),u=i.substring(0,t)+i.substring(n,i.length);this.$lines.splice(e,1,u);var a={action:"removeText",range:r,text:o};return this._emit("change",{data:a}),r.start},this.removeLines=function(e,t){var n=new s(e,0,t+1,0),r=this.$lines.splice(e,t-e+1),i={action:"removeLines",range:n,nl:this.getNewLineCharacter(),lines:r};return this._emit("change",{data:i}),r},this.removeNewLine=function(e){var t=this.getLine(e),n=this.getLine(e+1),r=new s(e,t.length,e+1,0),i=t+n;this.$lines.splice(e,2,i);var o={action:"removeText",range:r,text:this.getNewLineCharacter()};this._emit("change",{data:o})},this.replace=function(e,t){if(t.length==0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);if(t)var n=this.insert(e.start,t);else n=e.start;return n},this.applyDeltas=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.insertLines(r.start.row,n.lines):n.action=="insertText"?this.insert(r.start,n.text):n.action=="removeLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="removeText"&&this.remove(r)}},this.revertDeltas=function(e){for(var t=e.length-1;t>=0;t--){var n=e[t],r=s.fromPoints(n.range.start,n.range.end);n.action=="insertLines"?this.removeLines(r.start.row,r.end.row-1):n.action=="insertText"?this.remove(r):n.action=="removeLines"?this.insertLines(r.start.row,n.lines):n.action=="removeText"&&this.insert(r.start,n.text)}},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i<s;i++){e-=n[i].length+r;if(e<0)return{row:i,column:e+n[i].length+r}}return{row:s-1,column:n[s-1].length}},this.positionToIndex=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length,i=0,s=Math.min(e.row,n.length);for(var o=t||0;o<s;++o)i+=n[o].length;return i+r*o+e.column}}).call(u.prototype),t.Document=u}),ace.define("ace/range",["require","exports","module"],function(e,t,n){var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?t<this.start.column?-1:t>this.end.column?1:0:e<this.start.row?-1:e>this.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.row<e)var n={row:e,column:0};if(this.start.row>t)var r={row:t+1,column:0};else if(this.start.row<e)var r={row:e,column:0};return i.fromPoints(r||this.start,n||this.end)},this.extend=function(e,t){var n=this.compare(e,t);if(n==0)return this;if(n==-1)var r={row:e,column:t};else var s={row:e,column:t};return i.fromPoints(r||this.start,s||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return i.fromPoints(this.start,this.end)},this.collapseRows=function(){return this.end.column==0?new i(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new i(this.start.row,0,this.end.row,0)},this.toScreenRange=function(e){var t=e.documentToScreenPosition(this.start),n=e.documentToScreenPosition(this.end);return new i(t.row,t.column,n.row,n.column)},this.moveBy=function(e,t){this.start.row+=e,this.start.column+=t,this.end.row+=e,this.end.column+=t}}).call(i.prototype),i.fromPoints=function(e,t){return new i(e.row,e.column,t.row,t.column)},i.comparePoints=r,t.Range=i}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.document=e,typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n),this.$onChange=this.onChange.bind(this),e.on("change",this.$onChange)};(function(){r.implement(this,i),this.getPosition=function(){return this.$clipPositionToDocument(this.row,this.column)},this.getDocument=function(){return this.document},this.onChange=function(e){var t=e.data,n=t.range;if(n.start.row==n.end.row&&n.start.row!=this.row)return;if(n.start.row>this.row)return;if(n.start.row==this.row&&n.start.column>this.column)return;var r=this.row,i=this.column;t.action==="insertText"?n.start.row===r&&n.start.column<=i?n.start.row===n.end.row?i+=n.end.column-n.start.column:(i-=n.start.column,r+=n.end.row-n.start.row):n.start.row!==n.end.row&&n.start.row<r&&(r+=n.end.row-n.start.row):t.action==="insertLines"?n.start.row<=r&&(r+=n.end.row-n.start.row):t.action=="removeText"?n.start.row==r&&n.start.column<i?n.end.column>=i?i=n.start.column:i=Math.max(0,i-(n.end.column-n.start.column)):n.start.row!==n.end.row&&n.start.row<r?(n.end.row==r&&(i=Math.max(0,i-n.end.column)+n.start.column),r-=n.end.row-n.start.row):n.end.row==r&&(r-=n.end.row-n.start.row,i=Math.max(0,i-n.end.column)+n.start.column):t.action=="removeLines"&&n.start.row<=r&&(n.end.row<=r?r-=n.end.row-n.start.row:(r=n.start.row,i=0)),this.setPosition(r,i,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._emit("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n<r;n++)e[n]&&typeof e[n]=="object"?t[n]=this.copyObject(e[n]):t[n]=e[n];return t},t.deepCopy=function(e){if(typeof e!="object")return e;var t=e.constructor();for(var n in e)typeof e[n]=="object"?t[n]=this.deepCopy(e[n]):t[n]=e[n];return t},t.arrayToMap=function(e){var t={};for(var n=0;n<e.length;n++)t[e[n]]=1;return t},t.createMap=function(e){var t=Object.create(null);for(var n in e)t[n]=e[n];return t},t.arrayRemove=function(e,t){for(var n=0;n<=e.length;n++)t===e[n]&&e.splice(n,1)},t.escapeRegExp=function(e){return e.replace(/([.*+?^${}()|[\]\/\\])/g,"\\$1")},t.escapeHTML=function(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<")},t.getMatchOffsets=function(e,t){var n=[];return e.replace(t,function(e){n.push({offset:arguments[arguments.length-2],length:e.length})}),n},t.deferredCall=function(e){var t=null,n=function(){t=null,e()},r=function(e){return r.cancel(),t=setTimeout(n,e||0),r};return r.schedule=r,r.call=function(){return this.cancel(),e(),r},r.cancel=function(){return clearTimeout(t),t=null,r},r},t.delayedCall=function(e,t){var n=null,r=function(){n=null,e()},i=function(e){n&&clearTimeout(n),n=setTimeout(r,e||t)};return i.delay=i,i.schedule=function(e){n==null&&(n=setTimeout(r,e||0))},i.call=function(){this.cancel(),e()},i.cancel=function(){n&&clearTimeout(n),n=null},i.isPending=function(){return n},i}}),ace.define("ace/mode/json/json_parse",["require","exports","module"],function(e,t,n){var r,i,s={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:"\n",r:"\r",t:" "},o,u=function(e){throw{name:"SyntaxError",message:e,at:r,text:o}},a=function(e){return e&&e!==i&&u("Expected '"+e+"' instead of '"+i+"'"),i=o.charAt(r),r+=1,i},f=function(){var e,t="";i==="-"&&(t="-",a("-"));while(i>="0"&&i<="9")t+=i,a();if(i==="."){t+=".";while(a()&&i>="0"&&i<="9")t+=i}if(i==="e"||i==="E"){t+=i,a();if(i==="-"||i==="+")t+=i,a();while(i>="0"&&i<="9")t+=i,a()}e=+t;if(!isNaN(e))return e;u("Bad number")},l=function(){var e,t,n="",r;if(i==='"')while(a()){if(i==='"')return a(),n;if(i==="\\"){a();if(i==="u"){r=0;for(t=0;t<4;t+=1){e=parseInt(a(),16);if(!isFinite(e))break;r=r*16+e}n+=String.fromCharCode(r)}else{if(typeof s[i]!="string")break;n+=s[i]}}else n+=i}u("Bad string")},c=function(){while(i&&i<=" ")a()},h=function(){switch(i){case"t":return a("t"),a("r"),a("u"),a("e"),!0;case"f":return a("f"),a("a"),a("l"),a("s"),a("e"),!1;case"n":return a("n"),a("u"),a("l"),a("l"),null}u("Unexpected '"+i+"'")},p,d=function(){var e=[];if(i==="["){a("["),c();if(i==="]")return a("]"),e;while(i){e.push(p()),c();if(i==="]")return a("]"),e;a(","),c()}}u("Bad array")},v=function(){var e,t={};if(i==="{"){a("{"),c();if(i==="}")return a("}"),t;while(i){e=l(),c(),a(":"),Object.hasOwnProperty.call(t,e)&&u('Duplicate key "'+e+'"'),t[e]=p(),c();if(i==="}")return a("}"),t;a(","),c()}}u("Bad object")};return p=function(){c();switch(i){case"{":return v();case"[":return d();case'"':return l();case"-":return f();default:return i>="0"&&i<="9"?f():h()}},function(e,t){var n;return o=e,r=0,i=" ",n=p(),c(),i&&u("Syntax error"),typeof t=="function"?function s(e,n){var r,i,o=e[n];if(o&&typeof o=="object")for(r in o)Object.hasOwnProperty.call(o,r)&&(i=s(o,r),i!==undefined?o[r]=i:delete o[r]);return t.call(e,n,o)}({"":n},""):n}})
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/LICENSE Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,37 +0,0 @@
-License Disclaimer:
-
-All contents of this directory are Copyright (c) the Dojo Foundation, with the
-following exceptions:
--------------------------------------------------------------------------------
-
-firebug.html, firebug.js, errIcon.png, infoIcon.png, warningIcon.png:
- * Copyright (c) 2006-2007, Joe Hewitt, All rights reserved.
- Distributed under the terms of the BSD License (see below)
-
--------------------------------------------------------------------------------
-
-Copyright (c) 2006-2007, Joe Hewitt
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name of the Dojo Foundation nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/errorIcon.png has changed
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,208 +0,0 @@
-.firebug {
- margin: 0;
- background:#fff;
- font-family: Lucida Grande, Tahoma, sans-serif;
- font-size: 11px;
- overflow: hidden;
- border: 1px solid black;
- position: relative;
-}
-.firebug a {
- text-decoration: none;
-}
-.firebug a:hover {
- text-decoration: underline;
-}
-.firebug a:visited{
- color:#0000FF;
-}
-.firebug #firebugToolbar {
- height: 18px;
- line-height:18px;
- border-top: 1px solid ThreeDHighlight;
- border-bottom: 1px solid ThreeDShadow;
- padding: 2px 6px;
-
- background:#f0f0f0;
-}
-.firebug #firebugLog, .firebug #objectLog {
- overflow: auto;
- position: absolute;
- left: 0;
- width: 100%;
-}
-#objectLog{
- overflow:scroll;
- height:258px;
-}
-.firebug #firebugCommandLine {
- position: absolute;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 18px;
- border: none;
- border-top: 1px solid ThreeDShadow;
-}
-.firebug .logRow {
- position: relative;
- border-bottom: 1px solid #D7D7D7;
- padding: 2px 4px 1px 6px;
- background-color: #FFFFFF;
-}
-.firebug .logRow-command {
- font-family: Monaco, monospace;
- color: blue;
-}
-.firebug .objectBox-null {
- padding: 0 2px;
- border: 1px solid #666666;
- background-color: #888888;
- color: #FFFFFF;
-}
-.firebug .objectBox-string {
- font-family: Monaco, monospace;
- color: red;
- white-space: pre;
-}
-.firebug .objectBox-number {
- color: #000088;
-}
-.firebug .objectBox-function {
- font-family: Monaco, monospace;
- color: DarkGreen;
-}
-.firebug .objectBox-object {
- color: DarkGreen;
- font-weight: bold;
-}
-.firebug .logRow-info,
-.firebug .logRow-error,
-.firebug .logRow-warning
- {
- background: #00FFFF no-repeat 2px 2px;
- padding-left: 20px;
- padding-bottom: 3px;
-}
-.firebug .logRow-info {
- background: #FFF url(infoIcon.png) no-repeat 2px 2px;
- padding-left: 20px;
- padding-bottom: 3px;
-}
-.firebug .logRow-warning {
-
- background: #00FFFF url(warningIcon.png) no-repeat 2px 2px;
- padding-left: 20px;
- padding-bottom: 3px;
-}
-.firebug .logRow-error {
- background: LightYellow url(errorIcon.png) no-repeat 2px 2px;
- padding-left: 20px;
- padding-bottom: 3px;
-}
-.firebug .errorMessage {
- vertical-align: top;
- color: #FF0000;
-}
-.firebug .objectBox-sourceLink {
- position: absolute;
- right: 4px;
- top: 2px;
- padding-left: 8px;
- font-family: Lucida Grande, sans-serif;
- font-weight: bold;
- color: #0000FF;
-}
-.firebug .logRow-group {
- background: #EEEEEE;
- border-bottom: none;
-}
-.firebug .logGroup {
- background: #EEEEEE;
-}
-.firebug .logGroupBox {
- margin-left: 24px;
- border-top: 1px solid #D7D7D7;
- border-left: 1px solid #D7D7D7;
-}
-.firebug .selectorTag,
-.firebug .selectorId,
-.firebug .selectorClass {
- font-family: Monaco, monospace;
- font-weight: normal;
-}
-.firebug .selectorTag {
- color: #0000FF;
-}
-.firebug .selectorId {
- color: DarkBlue;
-}
-.firebug .selectorClass {
- color: red;
-}
-.firebug .objectBox-element {
- font-family: Monaco, monospace;
- color: #000088;
-}
-.firebug .nodeChildren {
- margin-left: 16px;
-}
-.firebug .nodeTag {
- color: blue;
-}
-.firebug .nodeValue {
- color: #FF0000;
- font-weight: normal;
-}
-.firebug .nodeText,
-.firebug .nodeComment {
- margin: 0 2px;
- vertical-align: top;
-}
-.firebug .nodeText {
- color: #333333;
-}
-.firebug .nodeComment {
- color: DarkGreen;
-}
-.firebug .propertyNameCell {
- vertical-align: top;
-}
-.firebug .propertyName {
- font-weight: bold;
-}
-#firebugToolbar ul.tabs{
- margin:0 !important;
- padding:0;
-}
-#firebugToolbar ul.tabs li{
- list-style:none;
- background:transparent url(tab_lft_norm.png) no-repeat left;
- line-height:18px;
- float:left;
- margin-left:5px;
-}
-#firebugToolbar ul.tabs li.right{
- float:right;
- margin-right:5px;
- margin-left:0;
-}
-#firebugToolbar ul.tabs li.gap{
- margin-left:20px;
-}
-#firebugToolbar .tabs a{
- text-decoration:none;
- background:transparent url(tab_rgt_norm.png) no-repeat right;
- line-height:18px;
- padding:3px 9px 4px 0px;
- margin-left:9px;
- color:#333333;
-}
-#firebugToolbar .tabs li:hover{
- background:transparent url(tab_lft_over.png) no-repeat left;
-}
-#firebugToolbar .tabs a:hover{
- text-decoration:none;
- background:transparent url(tab_rgt_over.png) no-repeat right;
- color:#FFFFFF;
-}
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,898 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-//>>built
-define("dojo/_firebug/firebug",["../_base/kernel","require","../_base/html","../sniff","../_base/array","../_base/lang","../_base/event","../_base/unload"],function(_1,_2,_3,_4){
-var _5=(/Trident/.test(window.navigator.userAgent));
-if(_5){
-var _6=["log","info","debug","warn","error"];
-for(var i=0;i<_6.length;i++){
-var m=_6[i];
-if(!console[m]||console[m]._fake){
-continue;
-}
-var n="_"+_6[i];
-console[n]=console[m];
-console[m]=(function(){
-var _7=n;
-return function(){
-console[_7](Array.prototype.join.call(arguments," "));
-};
-})();
-}
-try{
-console.clear();
-}
-catch(e){
-}
-}
-if(_4("ff")||_4("chrome")||_4("safari")||_5||window.firebug||(typeof console!="undefined"&&console.firebug)||_1.config.useCustomLogger||_4("air")){
-return;
-}
-try{
-if(window!=window.parent){
-if(window.parent["console"]){
-window.console=window.parent.console;
-}
-return;
-}
-}
-catch(e){
-}
-var _8=document;
-var _9=window;
-var _a=0;
-var _b=null;
-var _c=null;
-var _d=null;
-var _e=null;
-var _f=null;
-var _10=null;
-var _11=false;
-var _12=[];
-var _13=[];
-var _14={};
-var _15={};
-var _16=null;
-var _17;
-var _18;
-var _19=false;
-var _1a=null;
-var _1b=document.createElement("div");
-var _1c;
-var _1d;
-window.console={_connects:[],log:function(){
-_1e(arguments,"");
-},debug:function(){
-_1e(arguments,"debug");
-},info:function(){
-_1e(arguments,"info");
-},warn:function(){
-_1e(arguments,"warning");
-},error:function(){
-_1e(arguments,"error");
-},assert:function(_1f,_20){
-if(!_1f){
-var _21=[];
-for(var i=1;i<arguments.length;++i){
-_21.push(arguments[i]);
-}
-_1e(_21.length?_21:["Assertion Failure"],"error");
-throw _20?_20:"Assertion Failure";
-}
-},dir:function(obj){
-var str=_22(obj);
-str=str.replace(/\n/g,"<br />");
-str=str.replace(/\t/g," ");
-_23([str],"dir");
-},dirxml:function(_24){
-var _25=[];
-_26(_24,_25);
-_23(_25,"dirxml");
-},group:function(){
-_23(arguments,"group",_27);
-},groupEnd:function(){
-_23(arguments,"",_28);
-},time:function(_29){
-_14[_29]=new Date().getTime();
-},timeEnd:function(_2a){
-if(_2a in _14){
-var _2b=(new Date()).getTime()-_14[_2a];
-_1e([_2a+":",_2b+"ms"]);
-delete _14[_2a];
-}
-},count:function(_2c){
-if(!_15[_2c]){
-_15[_2c]=0;
-}
-_15[_2c]++;
-_1e([_2c+": "+_15[_2c]]);
-},trace:function(_2d){
-var _2e=_2d||3;
-var f=console.trace.caller;
-for(var i=0;i<_2e;i++){
-var _2f=f.toString();
-var _30=[];
-for(var a=0;a<f.arguments.length;a++){
-_30.push(f.arguments[a]);
-}
-if(f.arguments.length){
-}else{
-}
-f=f.caller;
-}
-},profile:function(){
-this.warn(["profile() not supported."]);
-},profileEnd:function(){
-},clear:function(){
-if(_c){
-while(_c.childNodes.length){
-_1.destroy(_c.firstChild);
-}
-}
-_1.forEach(this._connects,_1.disconnect);
-},open:function(){
-_31(true);
-},close:function(){
-if(_11){
-_31();
-}
-},_restoreBorder:function(){
-if(_1c){
-_1c.style.border=_1d;
-}
-},openDomInspector:function(){
-_19=true;
-_c.style.display="none";
-_16.style.display="block";
-_d.style.display="none";
-document.body.style.cursor="pointer";
-_17=_1.connect(document,"mousemove",function(evt){
-if(!_19){
-return;
-}
-if(!_1a){
-_1a=setTimeout(function(){
-_1a=null;
-},50);
-}else{
-return;
-}
-var _32=evt.target;
-if(_32&&(_1c!==_32)){
-var _33=true;
-console._restoreBorder();
-var _34=[];
-_26(_32,_34);
-_16.innerHTML=_34.join("");
-_1c=_32;
-_1d=_1c.style.border;
-_1c.style.border="#0000FF 1px solid";
-}
-});
-setTimeout(function(){
-_18=_1.connect(document,"click",function(evt){
-document.body.style.cursor="";
-_19=!_19;
-_1.disconnect(_18);
-});
-},30);
-},_closeDomInspector:function(){
-document.body.style.cursor="";
-_1.disconnect(_17);
-_1.disconnect(_18);
-_19=false;
-console._restoreBorder();
-},openConsole:function(){
-_c.style.display="block";
-_16.style.display="none";
-_d.style.display="none";
-console._closeDomInspector();
-},openObjectInspector:function(){
-_c.style.display="none";
-_16.style.display="none";
-_d.style.display="block";
-console._closeDomInspector();
-},recss:function(){
-var i,a,s;
-a=document.getElementsByTagName("link");
-for(i=0;i<a.length;i++){
-s=a[i];
-if(s.rel.toLowerCase().indexOf("stylesheet")>=0&&s.href){
-var h=s.href.replace(/(&|%5C?)forceReload=\d+/,"");
-s.href=h+(h.indexOf("?")>=0?"&":"?")+"forceReload="+new Date().valueOf();
-}
-}
-}};
-function _31(_35){
-_11=_35||!_11;
-if(_b){
-_b.style.display=_11?"block":"none";
-}
-};
-function _36(){
-_31(true);
-if(_f){
-_f.focus();
-}
-};
-function _37(x,y,w,h){
-var win=window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
-if(!win){
-var msg="Firebug Lite could not open a pop-up window, most likely because of a blocker.\n"+"Either enable pop-ups for this domain, or change the djConfig to popup=false.";
-alert(msg);
-}
-_38(win);
-var _39=win.document;
-var _3a="<html style=\"height:100%;\"><head><title>Firebug Lite</title></head>\n"+"<body bgColor=\"#ccc\" style=\"height:97%;\" onresize=\"opener.onFirebugResize()\">\n"+"<div id=\"fb\"></div>"+"</body></html>";
-_39.write(_3a);
-_39.close();
-return win;
-};
-function _38(wn){
-var d=new Date();
-d.setTime(d.getTime()+(60*24*60*60*1000));
-d=d.toUTCString();
-var dc=wn.document,_3b;
-if(wn.innerWidth){
-_3b=function(){
-return {w:wn.innerWidth,h:wn.innerHeight};
-};
-}else{
-if(dc.documentElement&&dc.documentElement.clientWidth){
-_3b=function(){
-return {w:dc.documentElement.clientWidth,h:dc.documentElement.clientHeight};
-};
-}else{
-if(dc.body){
-_3b=function(){
-return {w:dc.body.clientWidth,h:dc.body.clientHeight};
-};
-}
-}
-}
-window.onFirebugResize=function(){
-_49(_3b().h);
-clearInterval(wn._firebugWin_resize);
-wn._firebugWin_resize=setTimeout(function(){
-var x=wn.screenLeft,y=wn.screenTop,w=wn.outerWidth||wn.document.body.offsetWidth,h=wn.outerHeight||wn.document.body.offsetHeight;
-document.cookie="_firebugPosition="+[x,y,w,h].join(",")+"; expires="+d+"; path=/";
-},5000);
-};
-};
-function _3c(){
-if(_b){
-return;
-}
-_31(true);
-if(_1.config.popup){
-var _3d="100%";
-var _3e=document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
-var p=_3e?_3e[1].split(","):[2,2,320,480];
-_9=_37(p[0],p[1],p[2],p[3]);
-_8=_9.document;
-_1.config.debugContainerId="fb";
-_9.console=window.console;
-_9.dojo=window.dojo;
-}else{
-_8=document;
-_3d=(_1.config.debugHeight||300)+"px";
-}
-var _3f=_8.createElement("link");
-_3f.href=_2.toUrl("./firebug.css");
-_3f.rel="stylesheet";
-_3f.type="text/css";
-var _40=_8.getElementsByTagName("head");
-if(_40){
-_40=_40[0];
-}
-if(!_40){
-_40=_8.getElementsByTagName("html")[0];
-}
-if(_4("ie")){
-window.setTimeout(function(){
-_40.appendChild(_3f);
-},0);
-}else{
-_40.appendChild(_3f);
-}
-if(_1.config.debugContainerId){
-_b=_8.getElementById(_1.config.debugContainerId);
-}
-if(!_b){
-_b=_8.createElement("div");
-_8.body.appendChild(_b);
-}
-_b.className+=" firebug";
-_b.id="firebug";
-_b.style.height=_3d;
-_b.style.display=(_11?"block":"none");
-var _41=function(_42,_43,_44,_45){
-return "<li class=\""+_45+"\"><a href=\"javascript:void(0);\" onclick=\"console."+_44+"(); return false;\" title=\""+_43+"\">"+_42+"</a></li>";
-};
-_b.innerHTML="<div id=\"firebugToolbar\">"+" <ul id=\"fireBugTabs\" class=\"tabs\">"+_41("Clear","Remove All Console Logs","clear","")+_41("ReCSS","Refresh CSS without reloading page","recss","")+_41("Console","Show Console Logs","openConsole","gap")+_41("DOM","Show DOM Inspector","openDomInspector","")+_41("Object","Show Object Inspector","openObjectInspector","")+((_1.config.popup)?"":_41("Close","Close the console","close","gap"))+"\t</ul>"+"</div>"+"<input type=\"text\" id=\"firebugCommandLine\" />"+"<div id=\"firebugLog\"></div>"+"<div id=\"objectLog\" style=\"display:none;\">Click on an object in the Log display</div>"+"<div id=\"domInspect\" style=\"display:none;\">Hover over HTML elements in the main page. Click to hold selection.</div>";
-_10=_8.getElementById("firebugToolbar");
-_f=_8.getElementById("firebugCommandLine");
-_46(_f,"keydown",_47);
-_46(_8,_4("ie")||_4("safari")?"keydown":"keypress",_48);
-_c=_8.getElementById("firebugLog");
-_d=_8.getElementById("objectLog");
-_16=_8.getElementById("domInspect");
-_e=_8.getElementById("fireBugTabs");
-_49();
-_4a();
-};
-_1.addOnLoad(_3c);
-function _4b(){
-_8=null;
-if(_9.console){
-_9.console.clear();
-}
-_9=null;
-_b=null;
-_c=null;
-_d=null;
-_16=null;
-_f=null;
-_12=[];
-_13=[];
-_14={};
-};
-function _4c(){
-var _4d=_f.value;
-_f.value="";
-_23(["> ",_4d],"command");
-var _4e;
-try{
-_4e=eval(_4d);
-}
-catch(e){
-}
-};
-function _49(h){
-var _4f=25;
-var _50=h?h-(_4f+_f.offsetHeight+25+(h*0.01))+"px":(_b.offsetHeight-_4f-_f.offsetHeight)+"px";
-_c.style.top=_4f+"px";
-_c.style.height=_50;
-_d.style.height=_50;
-_d.style.top=_4f+"px";
-_16.style.height=_50;
-_16.style.top=_4f+"px";
-_f.style.bottom=0;
-_1.addOnWindowUnload(_4b);
-};
-function _23(_51,_52,_53){
-if(_c){
-_54(_51,_52,_53);
-}else{
-_12.push([_51,_52,_53]);
-}
-};
-function _4a(){
-var _55=_12;
-_12=[];
-for(var i=0;i<_55.length;++i){
-_54(_55[i][0],_55[i][1],_55[i][2]);
-}
-};
-function _54(_56,_57,_58){
-var _59=_c.scrollTop+_c.offsetHeight>=_c.scrollHeight;
-_58=_58||_5a;
-_58(_56,_57);
-if(_59){
-_c.scrollTop=_c.scrollHeight-_c.offsetHeight;
-}
-};
-function _5b(row){
-var _5c=_13.length?_13[_13.length-1]:_c;
-_5c.appendChild(row);
-};
-function _5a(_5d,_5e){
-var row=_c.ownerDocument.createElement("div");
-row.className="logRow"+(_5e?" logRow-"+_5e:"");
-row.innerHTML=_5d.join("");
-_5b(row);
-};
-function _27(_5f,_60){
-_1e(_5f,_60);
-var _61=_c.ownerDocument.createElement("div");
-_61.className="logGroupBox";
-_5b(_61);
-_13.push(_61);
-};
-function _28(){
-_13.pop();
-};
-function _1e(_62,_63){
-var _64=[];
-var _65=_62[0];
-var _66=0;
-if(typeof (_65)!="string"){
-_65="";
-_66=-1;
-}
-var _67=_68(_65);
-for(var i=0;i<_67.length;++i){
-var _69=_67[i];
-if(_69&&typeof _69=="object"){
-_69.appender(_62[++_66],_64);
-}else{
-_6a(_69,_64);
-}
-}
-var ids=[];
-var obs=[];
-for(i=_66+1;i<_62.length;++i){
-_6a(" ",_64);
-var _6b=_62[i];
-if(_6b===undefined||_6b===null){
-_6c(_6b,_64);
-}else{
-if(typeof (_6b)=="string"){
-_6a(_6b,_64);
-}else{
-if(_6b instanceof Date){
-_6a(_6b.toString(),_64);
-}else{
-if(_6b.nodeType==9){
-_6a("[ XmlDoc ]",_64);
-}else{
-var id="_a"+_a++;
-ids.push(id);
-obs.push(_6b);
-var str="<a id=\""+id+"\" href=\"javascript:void(0);\">"+_6d(_6b)+"</a>";
-_6e(str,_64);
-}
-}
-}
-}
-}
-_23(_64,_63);
-for(i=0;i<ids.length;i++){
-var btn=_8.getElementById(ids[i]);
-if(!btn){
-continue;
-}
-btn.obj=obs[i];
-_9.console._connects.push(_1.connect(btn,"onclick",function(){
-console.openObjectInspector();
-try{
-_22(this.obj);
-}
-catch(e){
-this.obj=e;
-}
-_d.innerHTML="<pre>"+_22(this.obj)+"</pre>";
-}));
-}
-};
-function _68(_6f){
-var _70=[];
-var reg=/((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
-var _71={s:_6a,d:_72,i:_72,f:_73};
-for(var m=reg.exec(_6f);m;m=reg.exec(_6f)){
-var _74=m[8]?m[8]:m[5];
-var _75=_74 in _71?_71[_74]:_76;
-var _77=m[3]?parseInt(m[3]):(m[4]=="."?-1:0);
-_70.push(_6f.substr(0,m[0][0]=="%"?m.index:m.index+1));
-_70.push({appender:_75,precision:_77});
-_6f=_6f.substr(m.index+m[0].length);
-}
-_70.push(_6f);
-return _70;
-};
-function _78(_79){
-function _7a(ch){
-switch(ch){
-case "<":
-return "<";
-case ">":
-return ">";
-case "&":
-return "&";
-case "'":
-return "'";
-case "\"":
-return """;
-}
-return "?";
-};
-return String(_79).replace(/[<>&"']/g,_7a);
-};
-function _7b(_7c){
-try{
-return _7c+"";
-}
-catch(e){
-return null;
-}
-};
-function _6e(_7d,_7e){
-_7e.push(_7b(_7d));
-};
-function _6a(_7f,_80){
-_80.push(_78(_7b(_7f)));
-};
-function _6c(_81,_82){
-_82.push("<span class=\"objectBox-null\">",_78(_7b(_81)),"</span>");
-};
-function _83(_84,_85){
-_85.push("<span class=\"objectBox-string\">"",_78(_7b(_84)),""</span>");
-};
-function _72(_86,_87){
-_87.push("<span class=\"objectBox-number\">",_78(_7b(_86)),"</span>");
-};
-function _73(_88,_89){
-_89.push("<span class=\"objectBox-number\">",_78(_7b(_88)),"</span>");
-};
-function _8a(_8b,_8c){
-_8c.push("<span class=\"objectBox-function\">",_6d(_8b),"</span>");
-};
-function _76(_8d,_8e){
-try{
-if(_8d===undefined){
-_6c("undefined",_8e);
-}else{
-if(_8d===null){
-_6c("null",_8e);
-}else{
-if(typeof _8d=="string"){
-_83(_8d,_8e);
-}else{
-if(typeof _8d=="number"){
-_72(_8d,_8e);
-}else{
-if(typeof _8d=="function"){
-_8a(_8d,_8e);
-}else{
-if(_8d.nodeType==1){
-_8f(_8d,_8e);
-}else{
-if(typeof _8d=="object"){
-_90(_8d,_8e);
-}else{
-_6a(_8d,_8e);
-}
-}
-}
-}
-}
-}
-}
-}
-catch(e){
-}
-};
-function _90(_91,_92){
-var _93=_7b(_91);
-var _94=/\[object (.*?)\]/;
-var m=_94.exec(_93);
-_92.push("<span class=\"objectBox-object\">",m?m[1]:_93,"</span>");
-};
-function _8f(_95,_96){
-_96.push("<span class=\"objectBox-selector\">");
-_96.push("<span class=\"selectorTag\">",_78(_95.nodeName.toLowerCase()),"</span>");
-if(_95.id){
-_96.push("<span class=\"selectorId\">#",_78(_95.id),"</span>");
-}
-if(_95.className){
-_96.push("<span class=\"selectorClass\">.",_78(_95.className),"</span>");
-}
-_96.push("</span>");
-};
-function _26(_97,_98){
-if(_97.nodeType==1){
-_98.push("<div class=\"objectBox-element\">","<<span class=\"nodeTag\">",_97.nodeName.toLowerCase(),"</span>");
-for(var i=0;i<_97.attributes.length;++i){
-var _99=_97.attributes[i];
-if(!_99.specified){
-continue;
-}
-_98.push(" <span class=\"nodeName\">",_99.nodeName.toLowerCase(),"</span>="<span class=\"nodeValue\">",_78(_99.nodeValue),"</span>"");
-}
-if(_97.firstChild){
-_98.push("></div><div class=\"nodeChildren\">");
-for(var _9a=_97.firstChild;_9a;_9a=_9a.nextSibling){
-_26(_9a,_98);
-}
-_98.push("</div><div class=\"objectBox-element\"></<span class=\"nodeTag\">",_97.nodeName.toLowerCase(),"></span></div>");
-}else{
-_98.push("/></div>");
-}
-}else{
-if(_97.nodeType==3){
-_98.push("<div class=\"nodeText\">",_78(_97.nodeValue),"</div>");
-}
-}
-};
-function _46(_9b,_9c,_9d){
-if(document.all){
-_9b.attachEvent("on"+_9c,_9d);
-}else{
-_9b.addEventListener(_9c,_9d,false);
-}
-};
-function _9e(_9f,_a0,_a1){
-if(document.all){
-_9f.detachEvent("on"+_a0,_a1);
-}else{
-_9f.removeEventListener(_a0,_a1,false);
-}
-};
-function _a2(_a3){
-if(document.all){
-_a3.cancelBubble=true;
-}else{
-_a3.stopPropagation();
-}
-};
-function _a4(msg,_a5,_a6){
-var _a7=_a5.lastIndexOf("/");
-var _a8=_a7==-1?_a5:_a5.substr(_a7+1);
-var _a9=["<span class=\"errorMessage\">",msg,"</span>","<div class=\"objectBox-sourceLink\">",_a8," (line ",_a6,")</div>"];
-_23(_a9,"error");
-};
-var _aa=new Date().getTime();
-function _48(_ab){
-var _ac=(new Date()).getTime();
-if(_ac>_aa+200){
-_ab=_1.fixEvent(_ab);
-var _ad=_1.keys;
-var ekc=_ab.keyCode;
-_aa=_ac;
-if(ekc==_ad.F12){
-_31();
-}else{
-if((ekc==_ad.NUMPAD_ENTER||ekc==76)&&_ab.shiftKey&&(_ab.metaKey||_ab.ctrlKey)){
-_36();
-}else{
-return;
-}
-}
-_a2(_ab);
-}
-};
-function _47(e){
-var dk=_1.keys;
-if(e.keyCode==13&&_f.value){
-_ae(_f.value);
-_4c();
-}else{
-if(e.keyCode==27){
-_f.value="";
-}else{
-if(e.keyCode==dk.UP_ARROW||e.charCode==dk.UP_ARROW){
-_af("older");
-}else{
-if(e.keyCode==dk.DOWN_ARROW||e.charCode==dk.DOWN_ARROW){
-_af("newer");
-}else{
-if(e.keyCode==dk.HOME||e.charCode==dk.HOME){
-_b0=1;
-_af("older");
-}else{
-if(e.keyCode==dk.END||e.charCode==dk.END){
-_b0=999999;
-_af("newer");
-}
-}
-}
-}
-}
-}
-};
-var _b0=-1;
-var _b1=null;
-function _ae(_b2){
-var _b3=_b4("firebug_history");
-_b3=(_b3)?_1.fromJson(_b3):[];
-var pos=_1.indexOf(_b3,_b2);
-if(pos!=-1){
-_b3.splice(pos,1);
-}
-_b3.push(_b2);
-_b4("firebug_history",_1.toJson(_b3),30);
-while(_b3.length&&!_b4("firebug_history")){
-_b3.shift();
-_b4("firebug_history",_1.toJson(_b3),30);
-}
-_b1=null;
-_b0=-1;
-};
-function _af(_b5){
-var _b6=_b4("firebug_history");
-_b6=(_b6)?_1.fromJson(_b6):[];
-if(!_b6.length){
-return;
-}
-if(_b1===null){
-_b1=_f.value;
-}
-if(_b0==-1){
-_b0=_b6.length;
-}
-if(_b5=="older"){
---_b0;
-if(_b0<0){
-_b0=0;
-}
-}else{
-if(_b5=="newer"){
-++_b0;
-if(_b0>_b6.length){
-_b0=_b6.length;
-}
-}
-}
-if(_b0==_b6.length){
-_f.value=_b1;
-_b1=null;
-}else{
-_f.value=_b6[_b0];
-}
-};
-function _b4(_b7,_b8){
-var c=document.cookie;
-if(arguments.length==1){
-var _b9=c.match(new RegExp("(?:^|; )"+_b7+"=([^;]*)"));
-return _b9?decodeURIComponent(_b9[1]):undefined;
-}else{
-var d=new Date();
-d.setMonth(d.getMonth()+1);
-document.cookie=_b7+"="+encodeURIComponent(_b8)+((d.toUtcString)?"; expires="+d.toUTCString():"");
-}
-};
-function _ba(it){
-return it&&it instanceof Array||typeof it=="array";
-};
-function _bb(o){
-var cnt=0;
-for(var nm in o){
-cnt++;
-}
-return cnt;
-};
-function _22(o,i,txt,_bc){
-var ind=" \t";
-txt=txt||"";
-i=i||ind;
-_bc=_bc||[];
-var _bd;
-if(o&&o.nodeType==1){
-var _be=[];
-_26(o,_be);
-return _be.join("");
-}
-var br=",\n",cnt=0,_bf=_bb(o);
-if(o instanceof Date){
-return i+o.toString()+br;
-}
-looking:
-for(var nm in o){
-cnt++;
-if(cnt==_bf){
-br="\n";
-}
-if(o[nm]===window||o[nm]===document){
-}else{
-if(o[nm]===null){
-txt+=i+nm+" : NULL"+br;
-}else{
-if(o[nm]&&o[nm].nodeType){
-if(o[nm].nodeType==1){
-}else{
-if(o[nm].nodeType==3){
-txt+=i+nm+" : [ TextNode "+o[nm].data+" ]"+br;
-}
-}
-}else{
-if(typeof o[nm]=="object"&&(o[nm] instanceof String||o[nm] instanceof Number||o[nm] instanceof Boolean)){
-txt+=i+nm+" : "+o[nm]+","+br;
-}else{
-if(o[nm] instanceof Date){
-txt+=i+nm+" : "+o[nm].toString()+br;
-}else{
-if(typeof (o[nm])=="object"&&o[nm]){
-for(var j=0,_c0;_c0=_bc[j];j++){
-if(o[nm]===_c0){
-txt+=i+nm+" : RECURSION"+br;
-continue looking;
-}
-}
-_bc.push(o[nm]);
-_bd=(_ba(o[nm]))?["[","]"]:["{","}"];
-txt+=i+nm+" : "+_bd[0]+"\n";
-txt+=_22(o[nm],i+ind,"",_bc);
-txt+=i+_bd[1]+br;
-}else{
-if(typeof o[nm]=="undefined"){
-txt+=i+nm+" : undefined"+br;
-}else{
-if(nm=="toString"&&typeof o[nm]=="function"){
-var _c1=o[nm]();
-if(typeof _c1=="string"&&_c1.match(/function ?(.*?)\(/)){
-_c1=_78(_6d(o[nm]));
-}
-txt+=i+nm+" : "+_c1+br;
-}else{
-txt+=i+nm+" : "+_78(_6d(o[nm]))+br;
-}
-}
-}
-}
-}
-}
-}
-}
-}
-return txt;
-};
-function _6d(obj){
-var _c2=(obj instanceof Error);
-if(obj.nodeType==1){
-return _78("< "+obj.tagName.toLowerCase()+" id=\""+obj.id+"\" />");
-}
-if(obj.nodeType==3){
-return _78("[TextNode: \""+obj.nodeValue+"\"]");
-}
-var nm=(obj&&(obj.id||obj.name||obj.ObjectID||obj.widgetId));
-if(!_c2&&nm){
-return "{"+nm+"}";
-}
-var _c3=2;
-var _c4=4;
-var cnt=0;
-if(_c2){
-nm="[ Error: "+(obj.message||obj.description||obj)+" ]";
-}else{
-if(_ba(obj)){
-nm="["+obj.slice(0,_c4).join(",");
-if(obj.length>_c4){
-nm+=" ... ("+obj.length+" items)";
-}
-nm+="]";
-}else{
-if(typeof obj=="function"){
-nm=obj+"";
-var reg=/function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
-var m=reg.exec(nm);
-if(m){
-if(!m[1]){
-m[1]="function";
-}
-nm=m[1]+m[2];
-}else{
-nm="function()";
-}
-}else{
-if(typeof obj!="object"||typeof obj=="string"){
-nm=obj+"";
-}else{
-nm="{";
-for(var i in obj){
-cnt++;
-if(cnt>_c3){
-break;
-}
-nm+=i+":"+_78(obj[i])+" ";
-}
-nm+="}";
-}
-}
-}
-}
-return nm;
-};
-_46(document,_4("ie")||_4("safari")?"keydown":"keypress",_48);
-if((document.documentElement.getAttribute("debug")=="true")||(_1.config.isDebug)){
-_31(true);
-}
-_1.addOnWindowUnload(function(){
-_9e(document,_4("ie")||_4("safari")?"keydown":"keypress",_48);
-window.onFirebugResize=null;
-window.console=null;
-});
-});
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/firebug.js.uncompressed.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1191 +0,0 @@
-define("dojo/_firebug/firebug", [
- "../_base/kernel",
- "require",
- "../_base/html",
- "../sniff",
- "../_base/array",
- "../_base/lang",
- "../_base/event",
- "../_base/unload"], function(dojo, require, html, has){
-
- // module:
- // dojo/_firebug/firebug
- // summary:
- // Firebug Lite, the baby brother to Joe Hewitt's Firebug for Mozilla Firefox
- // description:
- // Opens a console for logging, debugging, and error messages.
- // Contains partial functionality to Firebug. See function list below.
- //
- // NOTE:
- // Firebug is a Firefox extension created by Joe Hewitt (see license). You do not need Dojo to run Firebug.
- // Firebug Lite is included in Dojo by permission from Joe Hewitt
- // If you are new to Firebug, or used to the Dojo 0.4 dojo.debug, you can learn Firebug
- // functionality by reading the function comments below or visiting http://www.getfirebug.com/docs.html
- //
- // NOTE:
- // To test Firebug Lite in Firefox:
- //
- // - FF2: set "console = null" before loading dojo and set djConfig.isDebug=true
- // - FF3: disable Firebug and set djConfig.isDebug=true
- //
- // example:
- // Supports inline objects in object inspector window (only simple trace of dom nodes, however)
- // | console.log("my object", {foo:"bar"})
- // example:
- // Option for console to open in popup window
- // | var djConfig = {isDebug: true, popup:true };
- // example:
- // Option for console height (ignored for popup)
- // | var djConfig = {isDebug: true, debugHeight:100 }
-
-
- var isNewIE = (/Trident/.test(window.navigator.userAgent));
- if(isNewIE){
- // Fixing IE's console
- // IE doesn't insert space between arguments. How annoying.
- var calls = ["log", "info", "debug", "warn", "error"];
- for(var i=0;i<calls.length;i++){
- var m = calls[i];
- if(!console[m] ||console[m]._fake){
- // IE9 doesn't have console.debug method, a fake one is added later
- continue;
- }
- var n = "_"+calls[i];
- console[n] = console[m];
- console[m] = (function(){
- var type = n;
- return function(){
- console[type](Array.prototype.join.call(arguments, " "));
- };
- })();
- }
- // clear the console on load. This is more than a convenience - too many logs crashes it.
- // If closed it throws an error
- try{ console.clear(); }catch(e){}
- }
-
- if(
- has("ff") || // Firefox has Firebug
- has("chrome") || // Chrome 3+ has a console
- has("safari") || // Safari 4 has a console
- isNewIE || // Has the new IE console
- window.firebug || // Testing for mozilla firebug lite
- (typeof console != "undefined" && console.firebug) || //The firebug console
- dojo.config.useCustomLogger || // Allow custom loggers
- has("air") // isDebug triggers AIRInsector, not Firebug
- ){
- return;
- }
-
- // don't build firebug in iframes
- try{
- if(window != window.parent){
- // but if we've got a parent logger, connect to it
- if(window.parent["console"]){
- window.console = window.parent.console;
- }
- return;
- }
- }catch(e){/*squelch*/}
-
- // ***************************************************************************
- // Placing these variables before the functions that use them to avoid a
- // shrinksafe bug where variable renaming does not happen correctly otherwise.
-
- // most of the objects in this script are run anonomously
- var _firebugDoc = document;
- var _firebugWin = window;
- var __consoleAnchorId__ = 0;
-
- var consoleFrame = null;
- var consoleBody = null;
- var consoleObjectInspector = null;
- var fireBugTabs = null;
- var commandLine = null;
- var consoleToolbar = null;
-
- var frameVisible = false;
- var messageQueue = [];
- var groupStack = [];
- var timeMap = {};
- var countMap = {};
-
- var consoleDomInspector = null;
- var _inspectionMoveConnection;
- var _inspectionClickConnection;
- var _inspectionEnabled = false;
- var _inspectionTimer = null;
- var _inspectTempNode = document.createElement("div");
-
-
- var _inspectCurrentNode;
- var _restoreBorderStyle;
-
- // ***************************************************************************
-
- window.console = {
- _connects: [],
- log: function(){
- // summary:
- // Sends arguments to console.
- logFormatted(arguments, "");
- },
-
- debug: function(){
- // summary:
- // Sends arguments to console. Missing finctionality to show script line of trace.
- logFormatted(arguments, "debug");
- },
-
- info: function(){
- // summary:
- // Sends arguments to console, highlighted with (I) icon.
- logFormatted(arguments, "info");
- },
-
- warn: function(){
- // summary:
- // Sends warning arguments to console, highlighted with (!) icon and blue style.
- logFormatted(arguments, "warning");
- },
-
- error: function(){
- // summary:
- // Sends error arguments (object) to console, highlighted with (X) icon and yellow style
- // NEW: error object now displays in object inspector
- logFormatted(arguments, "error");
- },
-
- assert: function(truth, message){
- // summary:
- // Tests for true. Throws exception if false.
- if(!truth){
- var args = [];
- for(var i = 1; i < arguments.length; ++i){
- args.push(arguments[i]);
- }
-
- logFormatted(args.length ? args : ["Assertion Failure"], "error");
- throw message ? message : "Assertion Failure";
- }
- },
-
- dir: function(obj){
- var str = printObject( obj );
- str = str.replace(/\n/g, "<br />");
- str = str.replace(/\t/g, " ");
- logRow([str], "dir");
- },
-
- dirxml: function(node){
- var html = [];
- appendNode(node, html);
- logRow(html, "dirxml");
- },
-
- group: function(){
- // summary:
- // collects log messages into a group, starting with this call and ending with
- // groupEnd(). Missing collapse functionality
- logRow(arguments, "group", pushGroup);
- },
-
- groupEnd: function(){
- // summary:
- // Closes group. See above
- logRow(arguments, "", popGroup);
- },
-
- time: function(name){
- // summary:
- // Starts timers assigned to name given in argument. Timer stops and displays on timeEnd(title);
- // example:
- // | console.time("load");
- // | console.time("myFunction");
- // | console.timeEnd("load");
- // | console.timeEnd("myFunction");
- timeMap[name] = new Date().getTime();
- },
-
- timeEnd: function(name){
- // summary:
- // See above.
- if(name in timeMap){
- var delta = (new Date()).getTime() - timeMap[name];
- logFormatted([name+ ":", delta+"ms"]);
- delete timeMap[name];
- }
- },
-
- count: function(name){
- // summary:
- // Not supported
- if(!countMap[name]) countMap[name] = 0;
- countMap[name]++;
- logFormatted([name+": "+countMap[name]]);
- },
-
- trace: function(_value){
- var stackAmt = _value || 3;
- var f = console.trace.caller; //function that called trace
- console.log(">>> console.trace(stack)");
- for(var i=0;i<stackAmt;i++){
- var func = f.toString();
- var args=[];
- for (var a = 0; a < f.arguments.length; a++){
- args.push(f.arguments[a]);
- }
- if(f.arguments.length){
- console.dir({"function":func, "arguments":args});
- }else{
- console.dir({"function":func});
- }
-
- f = f.caller;
- }
- },
-
- profile: function(){
- // summary:
- // Not supported
- this.warn(["profile() not supported."]);
- },
-
- profileEnd: function(){ },
-
- clear: function(){
- // summary:
- // Clears message console. Do not call this directly
- if(consoleBody){
- while(consoleBody.childNodes.length){
- dojo.destroy(consoleBody.firstChild);
- }
- }
- dojo.forEach(this._connects,dojo.disconnect);
- },
-
- open: function(){
- // summary:
- // Opens message console. Do not call this directly
- toggleConsole(true);
- },
-
- close: function(){
- // summary:
- // Closes message console. Do not call this directly
- if(frameVisible){
- toggleConsole();
- }
- },
- _restoreBorder: function(){
- if(_inspectCurrentNode){
- _inspectCurrentNode.style.border = _restoreBorderStyle;
- }
- },
- openDomInspector: function(){
- _inspectionEnabled = true;
- consoleBody.style.display = "none";
- consoleDomInspector.style.display = "block";
- consoleObjectInspector.style.display = "none";
- document.body.style.cursor = "pointer";
- _inspectionMoveConnection = dojo.connect(document, "mousemove", function(evt){
- if(!_inspectionEnabled){ return; }
- if(!_inspectionTimer){
- _inspectionTimer = setTimeout(function(){ _inspectionTimer = null; }, 50);
- }else{
- return;
- }
- var node = evt.target;
- if(node && (_inspectCurrentNode !== node)){
- var parent = true;
-
- console._restoreBorder();
- var html = [];
- appendNode(node, html);
- consoleDomInspector.innerHTML = html.join("");
-
- _inspectCurrentNode = node;
- _restoreBorderStyle = _inspectCurrentNode.style.border;
- _inspectCurrentNode.style.border = "#0000FF 1px solid";
- }
- });
- setTimeout(function(){
- _inspectionClickConnection = dojo.connect(document, "click", function(evt){
- document.body.style.cursor = "";
- _inspectionEnabled = !_inspectionEnabled;
- dojo.disconnect(_inspectionClickConnection);
- // console._restoreBorder();
- });
- }, 30);
- },
- _closeDomInspector: function(){
- document.body.style.cursor = "";
- dojo.disconnect(_inspectionMoveConnection);
- dojo.disconnect(_inspectionClickConnection);
- _inspectionEnabled = false;
- console._restoreBorder();
- },
- openConsole:function(){
- // summary:
- // Closes object inspector and opens message console. Do not call this directly
- consoleBody.style.display = "block";
- consoleDomInspector.style.display = "none";
- consoleObjectInspector.style.display = "none";
- console._closeDomInspector();
- },
- openObjectInspector:function(){
- consoleBody.style.display = "none";
- consoleDomInspector.style.display = "none";
- consoleObjectInspector.style.display = "block";
- console._closeDomInspector();
- },
- recss: function(){
- // this is placed in dojo since the console is most likely
- // in another window and dojo is easilly accessible
- var i,a,s;a=document.getElementsByTagName('link');
- for(i=0;i<a.length;i++){
- s=a[i];
- if(s.rel.toLowerCase().indexOf('stylesheet')>=0&&s.href){
- var h=s.href.replace(/(&|%5C?)forceReload=\d+/,'');
- s.href=h+(h.indexOf('?')>=0?'&':'?')+'forceReload='+new Date().valueOf();
- }
- }
- }
- };
-
- // ***************************************************************************
-
- function toggleConsole(forceOpen){
- frameVisible = forceOpen || !frameVisible;
- if(consoleFrame){
- consoleFrame.style.display = frameVisible ? "block" : "none";
- }
- }
-
- function focusCommandLine(){
- toggleConsole(true);
- if(commandLine){
- commandLine.focus();
- }
- }
-
- function openWin(x,y,w,h){
- var win = window.open("","_firebug","status=0,menubar=0,resizable=1,top="+y+",left="+x+",width="+w+",height="+h+",scrollbars=1,addressbar=0");
- if(!win){
- var msg = "Firebug Lite could not open a pop-up window, most likely because of a blocker.\n" +
- "Either enable pop-ups for this domain, or change the djConfig to popup=false.";
- alert(msg);
- }
- createResizeHandler(win);
- var newDoc=win.document;
- //Safari needs an HTML height
- var HTMLstring= '<html style="height:100%;"><head><title>Firebug Lite</title></head>\n' +
- '<body bgColor="#ccc" style="height:97%;" onresize="opener.onFirebugResize()">\n' +
- '<div id="fb"></div>' +
- '</body></html>';
-
- newDoc.write(HTMLstring);
- newDoc.close();
- return win;
- }
-
- function createResizeHandler(wn){
- // summary:
- // Creates handle for onresize window. Called from script in popup's body tag (so that it will work with IE).
- //
-
- var d = new Date();
- d.setTime(d.getTime()+(60*24*60*60*1000)); // 60 days
- d = d.toUTCString();
-
- var dc = wn.document,
- getViewport;
-
- if (wn.innerWidth){
- getViewport = function(){
- return{w:wn.innerWidth, h:wn.innerHeight};
- };
- }else if (dc.documentElement && dc.documentElement.clientWidth){
- getViewport = function(){
- return{w:dc.documentElement.clientWidth, h:dc.documentElement.clientHeight};
- };
- }else if (dc.body){
- getViewport = function(){
- return{w:dc.body.clientWidth, h:dc.body.clientHeight};
- };
- }
-
-
- window.onFirebugResize = function(){
-
- //resize the height of the console log body
- layout(getViewport().h);
-
- clearInterval(wn._firebugWin_resize);
- wn._firebugWin_resize = setTimeout(function(){
- var x = wn.screenLeft,
- y = wn.screenTop,
- w = wn.outerWidth || wn.document.body.offsetWidth,
- h = wn.outerHeight || wn.document.body.offsetHeight;
-
- document.cookie = "_firebugPosition=" + [x,y,w,h].join(",") + "; expires="+d+"; path=/";
-
- }, 5000); //can't capture window.onMove - long timeout gives better chance of capturing a resize, then the move
-
- };
- }
-
-
- /*****************************************************************************/
-
-
- function createFrame(){
- if(consoleFrame){
- return;
- }
- toggleConsole(true);
- if(dojo.config.popup){
- var containerHeight = "100%";
- var cookieMatch = document.cookie.match(/(?:^|; )_firebugPosition=([^;]*)/);
- var p = cookieMatch ? cookieMatch[1].split(",") : [2,2,320,480];
-
- _firebugWin = openWin(p[0],p[1],p[2],p[3]); // global
- _firebugDoc = _firebugWin.document; // global
-
- dojo.config.debugContainerId = 'fb';
-
- // connecting popup
- _firebugWin.console = window.console;
- _firebugWin.dojo = window.dojo;
- }else{
- _firebugDoc = document;
- containerHeight = (dojo.config.debugHeight || 300) + "px";
- }
-
- var styleElement = _firebugDoc.createElement("link");
- styleElement.href = require.toUrl("./firebug.css");
- styleElement.rel = "stylesheet";
- styleElement.type = "text/css";
- var styleParent = _firebugDoc.getElementsByTagName("head");
- if(styleParent){
- styleParent = styleParent[0];
- }
- if(!styleParent){
- styleParent = _firebugDoc.getElementsByTagName("html")[0];
- }
- if(has("ie")){
- window.setTimeout(function(){ styleParent.appendChild(styleElement); }, 0);
- }else{
- styleParent.appendChild(styleElement);
- }
-
- if(dojo.config.debugContainerId){
- consoleFrame = _firebugDoc.getElementById(dojo.config.debugContainerId);
- }
- if(!consoleFrame){
- consoleFrame = _firebugDoc.createElement("div");
- _firebugDoc.body.appendChild(consoleFrame);
- }
- consoleFrame.className += " firebug";
- consoleFrame.id = "firebug";
- consoleFrame.style.height = containerHeight;
- consoleFrame.style.display = (frameVisible ? "block" : "none");
-
- var buildLink = function(label, title, method, _class){
- return '<li class="'+_class+'"><a href="javascript:void(0);" onclick="console.'+ method +'(); return false;" title="'+title+'">'+label+'</a></li>';
- };
- consoleFrame.innerHTML =
- '<div id="firebugToolbar">'
- + ' <ul id="fireBugTabs" class="tabs">'
-
- + buildLink("Clear", "Remove All Console Logs", "clear", "")
- + buildLink("ReCSS", "Refresh CSS without reloading page", "recss", "")
-
- + buildLink("Console", "Show Console Logs", "openConsole", "gap")
- + buildLink("DOM", "Show DOM Inspector", "openDomInspector", "")
- + buildLink("Object", "Show Object Inspector", "openObjectInspector", "")
- + ((dojo.config.popup) ? "" : buildLink("Close", "Close the console", "close", "gap"))
-
- + ' </ul>'
- + '</div>'
- + '<input type="text" id="firebugCommandLine" />'
- + '<div id="firebugLog"></div>'
- + '<div id="objectLog" style="display:none;">Click on an object in the Log display</div>'
- + '<div id="domInspect" style="display:none;">Hover over HTML elements in the main page. Click to hold selection.</div>';
-
-
- consoleToolbar = _firebugDoc.getElementById("firebugToolbar");
-
- commandLine = _firebugDoc.getElementById("firebugCommandLine");
- addEvent(commandLine, "keydown", onCommandLineKeyDown);
-
- addEvent(_firebugDoc, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
-
- consoleBody = _firebugDoc.getElementById("firebugLog");
- consoleObjectInspector = _firebugDoc.getElementById("objectLog");
- consoleDomInspector = _firebugDoc.getElementById("domInspect");
- fireBugTabs = _firebugDoc.getElementById("fireBugTabs");
- layout();
- flush();
- }
-
- dojo.addOnLoad(createFrame);
-
- function clearFrame(){
- _firebugDoc = null;
-
- if(_firebugWin.console){
- _firebugWin.console.clear();
- }
- _firebugWin = null;
- consoleFrame = null;
- consoleBody = null;
- consoleObjectInspector = null;
- consoleDomInspector = null;
- commandLine = null;
- messageQueue = [];
- groupStack = [];
- timeMap = {};
- }
-
-
- function evalCommandLine(){
- var text = commandLine.value;
- commandLine.value = "";
-
- logRow(["> ", text], "command");
-
- var value;
- try{
- value = eval(text);
- }catch(e){
- console.debug(e); // put exception on the console
- }
-
- console.log(value);
- }
-
- function layout(h){
- var tHeight = 25; //consoleToolbar.offsetHeight; // tab style not ready on load - throws off layout
- var height = h ?
- h - (tHeight + commandLine.offsetHeight +25 + (h*.01)) + "px" :
- (consoleFrame.offsetHeight - tHeight - commandLine.offsetHeight) + "px";
-
- consoleBody.style.top = tHeight + "px";
- consoleBody.style.height = height;
- consoleObjectInspector.style.height = height;
- consoleObjectInspector.style.top = tHeight + "px";
- consoleDomInspector.style.height = height;
- consoleDomInspector.style.top = tHeight + "px";
- commandLine.style.bottom = 0;
-
- dojo.addOnWindowUnload(clearFrame);
- }
-
- function logRow(message, className, handler){
- if(consoleBody){
- writeMessage(message, className, handler);
- }else{
- messageQueue.push([message, className, handler]);
- }
- }
-
- function flush(){
- var queue = messageQueue;
- messageQueue = [];
-
- for(var i = 0; i < queue.length; ++i){
- writeMessage(queue[i][0], queue[i][1], queue[i][2]);
- }
- }
-
- function writeMessage(message, className, handler){
- var isScrolledToBottom =
- consoleBody.scrollTop + consoleBody.offsetHeight >= consoleBody.scrollHeight;
-
- handler = handler||writeRow;
-
- handler(message, className);
-
- if(isScrolledToBottom){
- consoleBody.scrollTop = consoleBody.scrollHeight - consoleBody.offsetHeight;
- }
- }
-
- function appendRow(row){
- var container = groupStack.length ? groupStack[groupStack.length-1] : consoleBody;
- container.appendChild(row);
- }
-
- function writeRow(message, className){
- var row = consoleBody.ownerDocument.createElement("div");
- row.className = "logRow" + (className ? " logRow-"+className : "");
- row.innerHTML = message.join("");
- appendRow(row);
- }
-
- function pushGroup(message, className){
- logFormatted(message, className);
-
- //var groupRow = consoleBody.ownerDocument.createElement("div");
- //groupRow.className = "logGroup";
- var groupRowBox = consoleBody.ownerDocument.createElement("div");
- groupRowBox.className = "logGroupBox";
- //groupRow.appendChild(groupRowBox);
- appendRow(groupRowBox);
- groupStack.push(groupRowBox);
- }
-
- function popGroup(){
- groupStack.pop();
- }
-
- // ***************************************************************************
-
- function logFormatted(objects, className){
- var html = [];
-
- var format = objects[0];
- var objIndex = 0;
-
- if(typeof(format) != "string"){
- format = "";
- objIndex = -1;
- }
-
- var parts = parseFormat(format);
-
- for(var i = 0; i < parts.length; ++i){
- var part = parts[i];
- if(part && typeof part == "object"){
- part.appender(objects[++objIndex], html);
- }else{
- appendText(part, html);
- }
- }
-
-
- var ids = [];
- var obs = [];
- for(i = objIndex+1; i < objects.length; ++i){
- appendText(" ", html);
-
- var object = objects[i];
- if(object === undefined || object === null ){
- appendNull(object, html);
-
- }else if(typeof(object) == "string"){
- appendText(object, html);
-
- }else if(object instanceof Date){
- appendText(object.toString(), html);
-
- }else if(object.nodeType == 9){
- appendText("[ XmlDoc ]", html);
-
- }else{
- // Create link for object inspector
- // need to create an ID for this link, since it is currently text
- var id = "_a" + __consoleAnchorId__++;
- ids.push(id);
- // need to save the object, so the arrays line up
- obs.push(object);
- var str = '<a id="'+id+'" href="javascript:void(0);">'+getObjectAbbr(object)+'</a>';
-
- appendLink( str , html);
- }
- }
-
- logRow(html, className);
-
- // Now that the row is inserted in the DOM, loop through all of the links that were just created
- for(i=0; i<ids.length; i++){
- var btn = _firebugDoc.getElementById(ids[i]);
- if(!btn){ continue; }
-
- // store the object in the dom btn for reference later
- // avoid parsing these objects unless necessary
- btn.obj = obs[i];
-
- _firebugWin.console._connects.push(dojo.connect(btn, "onclick", function(){
-
- console.openObjectInspector();
-
- try{
- printObject(this.obj);
- }catch(e){
- this.obj = e;
- }
- consoleObjectInspector.innerHTML = "<pre>" + printObject( this.obj ) + "</pre>";
- }));
- }
- }
-
- function parseFormat(format){
- var parts = [];
-
- var reg = /((^%|[^\\]%)(\d+)?(\.)([a-zA-Z]))|((^%|[^\\]%)([a-zA-Z]))/;
- var appenderMap = {s: appendText, d: appendInteger, i: appendInteger, f: appendFloat};
-
- for(var m = reg.exec(format); m; m = reg.exec(format)){
- var type = m[8] ? m[8] : m[5];
- var appender = type in appenderMap ? appenderMap[type] : appendObject;
- var precision = m[3] ? parseInt(m[3]) : (m[4] == "." ? -1 : 0);
-
- parts.push(format.substr(0, m[0][0] == "%" ? m.index : m.index+1));
- parts.push({appender: appender, precision: precision});
-
- format = format.substr(m.index+m[0].length);
- }
-
- parts.push(format);
-
- return parts;
- }
-
- function escapeHTML(value){
- function replaceChars(ch){
- switch(ch){
- case "<":
- return "<";
- case ">":
- return ">";
- case "&":
- return "&";
- case "'":
- return "'";
- case '"':
- return """;
- }
- return "?";
- }
- return String(value).replace(/[<>&"']/g, replaceChars);
- }
-
- function objectToString(object){
- try{
- return object+"";
- }catch(e){
- return null;
- }
- }
-
- // ***************************************************************************
- function appendLink(object, html){
- // needed for object links - no HTML escaping
- html.push( objectToString(object) );
- }
-
- function appendText(object, html){
- html.push(escapeHTML(objectToString(object)));
- }
-
- function appendNull(object, html){
- html.push('<span class="objectBox-null">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendString(object, html){
- html.push('<span class="objectBox-string">"', escapeHTML(objectToString(object)),
- '"</span>');
- }
-
- function appendInteger(object, html){
- html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendFloat(object, html){
- html.push('<span class="objectBox-number">', escapeHTML(objectToString(object)), '</span>');
- }
-
- function appendFunction(object, html){
- html.push('<span class="objectBox-function">', getObjectAbbr(object), '</span>');
- }
-
- function appendObject(object, html){
- try{
- if(object === undefined){
- appendNull("undefined", html);
- }else if(object === null){
- appendNull("null", html);
- }else if(typeof object == "string"){
- appendString(object, html);
- }else if(typeof object == "number"){
- appendInteger(object, html);
- }else if(typeof object == "function"){
- appendFunction(object, html);
- }else if(object.nodeType == 1){
- appendSelector(object, html);
- }else if(typeof object == "object"){
- appendObjectFormatted(object, html);
- }else{
- appendText(object, html);
- }
- }catch(e){
- /* squelch */
- }
- }
-
- function appendObjectFormatted(object, html){
- var text = objectToString(object);
- var reObject = /\[object (.*?)\]/;
-
- var m = reObject.exec(text);
- html.push('<span class="objectBox-object">', m ? m[1] : text, '</span>');
- }
-
- function appendSelector(object, html){
- html.push('<span class="objectBox-selector">');
-
- html.push('<span class="selectorTag">', escapeHTML(object.nodeName.toLowerCase()), '</span>');
- if(object.id){
- html.push('<span class="selectorId">#', escapeHTML(object.id), '</span>');
- }
- if(object.className){
- html.push('<span class="selectorClass">.', escapeHTML(object.className), '</span>');
- }
-
- html.push('</span>');
- }
-
- function appendNode(node, html){
- if(node.nodeType == 1){
- html.push(
- '<div class="objectBox-element">',
- '<<span class="nodeTag">', node.nodeName.toLowerCase(), '</span>');
-
- for(var i = 0; i < node.attributes.length; ++i){
- var attr = node.attributes[i];
- if(!attr.specified){ continue; }
-
- html.push(' <span class="nodeName">', attr.nodeName.toLowerCase(),
- '</span>="<span class="nodeValue">', escapeHTML(attr.nodeValue),
- '</span>"');
- }
-
- if(node.firstChild){
- html.push('></div><div class="nodeChildren">');
-
- for(var child = node.firstChild; child; child = child.nextSibling){
- appendNode(child, html);
- }
-
- html.push('</div><div class="objectBox-element"></<span class="nodeTag">',
- node.nodeName.toLowerCase(), '></span></div>');
- }else{
- html.push('/></div>');
- }
- }else if (node.nodeType == 3){
- html.push('<div class="nodeText">', escapeHTML(node.nodeValue),
- '</div>');
- }
- }
-
- // ***************************************************************************
-
- function addEvent(object, name, handler){
- if(document.all){
- object.attachEvent("on"+name, handler);
- }else{
- object.addEventListener(name, handler, false);
- }
- }
-
- function removeEvent(object, name, handler){
- if(document.all){
- object.detachEvent("on"+name, handler);
- }else{
- object.removeEventListener(name, handler, false);
- }
- }
-
- function cancelEvent(event){
- if(document.all){
- event.cancelBubble = true;
- }else{
- event.stopPropagation();
- }
- }
-
- function onError(msg, href, lineNo){
- var lastSlash = href.lastIndexOf("/");
- var fileName = lastSlash == -1 ? href : href.substr(lastSlash+1);
-
- var html = [
- '<span class="errorMessage">', msg, '</span>',
- '<div class="objectBox-sourceLink">', fileName, ' (line ', lineNo, ')</div>'
- ];
-
- logRow(html, "error");
- }
-
-
- //After converting to div instead of iframe, now getting two keydowns right away in IE 6.
- //Make sure there is a little bit of delay.
- var onKeyDownTime = new Date().getTime();
-
- function onKeyDown(event){
- var timestamp = (new Date()).getTime();
- if(timestamp > onKeyDownTime + 200){
- event = dojo.fixEvent(event);
- var keys = dojo.keys;
- var ekc = event.keyCode;
- onKeyDownTime = timestamp;
- if(ekc == keys.F12){
- toggleConsole();
- }else if(
- (ekc == keys.NUMPAD_ENTER || ekc == 76) &&
- event.shiftKey &&
- (event.metaKey || event.ctrlKey)
- ){
- focusCommandLine();
- }else{
- return;
- }
- cancelEvent(event);
- }
- }
-
- function onCommandLineKeyDown(e){
- var dk = dojo.keys;
- if(e.keyCode == 13 && commandLine.value){
- addToHistory(commandLine.value);
- evalCommandLine();
- }else if(e.keyCode == 27){
- commandLine.value = "";
- }else if(e.keyCode == dk.UP_ARROW || e.charCode == dk.UP_ARROW){
- navigateHistory("older");
- }else if(e.keyCode == dk.DOWN_ARROW || e.charCode == dk.DOWN_ARROW){
- navigateHistory("newer");
- }else if(e.keyCode == dk.HOME || e.charCode == dk.HOME){
- historyPosition = 1;
- navigateHistory("older");
- }else if(e.keyCode == dk.END || e.charCode == dk.END){
- historyPosition = 999999;
- navigateHistory("newer");
- }
- }
-
- var historyPosition = -1;
- var historyCommandLine = null;
-
- function addToHistory(value){
- var history = cookie("firebug_history");
- history = (history) ? dojo.fromJson(history) : [];
- var pos = dojo.indexOf(history, value);
- if (pos != -1){
- history.splice(pos, 1);
- }
- history.push(value);
- cookie("firebug_history", dojo.toJson(history), 30);
- while(history.length && !cookie("firebug_history")){
- history.shift();
- cookie("firebug_history", dojo.toJson(history), 30);
- }
- historyCommandLine = null;
- historyPosition = -1;
- }
-
- function navigateHistory(direction){
- var history = cookie("firebug_history");
- history = (history) ? dojo.fromJson(history) : [];
- if(!history.length){
- return;
- }
-
- if(historyCommandLine === null){
- historyCommandLine = commandLine.value;
- }
-
- if(historyPosition == -1){
- historyPosition = history.length;
- }
-
- if(direction == "older"){
- --historyPosition;
- if(historyPosition < 0){
- historyPosition = 0;
- }
- }else if(direction == "newer"){
- ++historyPosition;
- if(historyPosition > history.length){
- historyPosition = history.length;
- }
- }
-
- if(historyPosition == history.length){
- commandLine.value = historyCommandLine;
- historyCommandLine = null;
- }else{
- commandLine.value = history[historyPosition];
- }
- }
-
- function cookie(name, value){
- var c = document.cookie;
- if(arguments.length == 1){
- var matches = c.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
- return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined
- }else{
- var d = new Date();
- d.setMonth(d.getMonth()+1);
- document.cookie = name + "=" + encodeURIComponent(value) + ((d.toUtcString) ? "; expires=" + d.toUTCString() : "");
- }
- }
-
- function isArray(it){
- return it && it instanceof Array || typeof it == "array";
- }
-
- //***************************************************************************************************
- // Print Object Helpers
- function objectLength(o){
- var cnt = 0;
- for(var nm in o){
- cnt++;
- }
- return cnt;
- }
-
- function printObject(o, i, txt, used){
- // Recursively trace object, indenting to represent depth for display in object inspector
- var ind = " \t";
- txt = txt || "";
- i = i || ind;
- used = used || [];
- var opnCls;
-
- if(o && o.nodeType == 1){
- var html = [];
- appendNode(o, html);
- return html.join("");
- }
-
- var br=",\n", cnt = 0, length = objectLength(o);
-
- if(o instanceof Date){
- return i + o.toString() + br;
- }
- looking:
- for(var nm in o){
- cnt++;
- if(cnt==length){br = "\n";}
- if(o[nm] === window || o[nm] === document){
- // do nothing
- }else if(o[nm] === null){
- txt += i+nm + " : NULL" + br;
- }else if(o[nm] && o[nm].nodeType){
- if(o[nm].nodeType == 1){
- //txt += i+nm + " : < "+o[nm].tagName+" id=\""+ o[nm].id+"\" />" + br;
- }else if(o[nm].nodeType == 3){
- txt += i+nm + " : [ TextNode "+o[nm].data + " ]" + br;
- }
-
- }else if(typeof o[nm] == "object" && (o[nm] instanceof String || o[nm] instanceof Number || o[nm] instanceof Boolean)){
- txt += i+nm + " : " + o[nm] + "," + br;
-
- }else if(o[nm] instanceof Date){
- txt += i+nm + " : " + o[nm].toString() + br;
-
- }else if(typeof(o[nm]) == "object" && o[nm]){
- for(var j = 0, seen; seen = used[j]; j++){
- if(o[nm] === seen){
- txt += i+nm + " : RECURSION" + br;
- continue looking;
- }
- }
- used.push(o[nm]);
-
- opnCls = (isArray(o[nm]))?["[","]"]:["{","}"];
- txt += i+nm +" : " + opnCls[0] + "\n";//non-standard break, (no comma)
- txt += printObject(o[nm], i+ind, "", used);
- txt += i + opnCls[1] + br;
-
- }else if(typeof o[nm] == "undefined"){
- txt += i+nm + " : undefined" + br;
- }else if(nm == "toString" && typeof o[nm] == "function"){
- var toString = o[nm]();
- if(typeof toString == "string" && toString.match(/function ?(.*?)\(/)){
- toString = escapeHTML(getObjectAbbr(o[nm]));
- }
- txt += i+nm +" : " + toString + br;
- }else{
- txt += i+nm +" : "+ escapeHTML(getObjectAbbr(o[nm])) + br;
- }
- }
- return txt;
- }
-
- function getObjectAbbr(obj){
- // Gets an abbreviation of an object for display in log
- // X items in object, including id
- // X items in an array
- // TODO: Firebug Sr. actually goes by char count
- var isError = (obj instanceof Error);
- if(obj.nodeType == 1){
- return escapeHTML('< '+obj.tagName.toLowerCase()+' id=\"'+ obj.id+ '\" />');
- }
- if(obj.nodeType == 3){
- return escapeHTML('[TextNode: "'+obj.nodeValue+'"]');
- }
- var nm = (obj && (obj.id || obj.name || obj.ObjectID || obj.widgetId));
- if(!isError && nm){ return "{"+nm+"}"; }
-
- var obCnt = 2;
- var arCnt = 4;
- var cnt = 0;
-
- if(isError){
- nm = "[ Error: "+(obj.message || obj.description || obj)+" ]";
- }else if(isArray(obj)){
- nm = "[" + obj.slice(0,arCnt).join(",");
- if(obj.length > arCnt){
- nm += " ... ("+obj.length+" items)";
- }
- nm += "]";
- }else if(typeof obj == "function"){
- nm = obj + "";
- var reg = /function\s*([^\(]*)(\([^\)]*\))[^\{]*\{/;
- var m = reg.exec(nm);
- if(m){
- if(!m[1]){
- m[1] = "function";
- }
- nm = m[1] + m[2];
- }else{
- nm = "function()";
- }
- }else if(typeof obj != "object" || typeof obj == "string"){
- nm = obj + "";
- }else{
- nm = "{";
- for(var i in obj){
- cnt++;
- if(cnt > obCnt){ break; }
- nm += i+":"+escapeHTML(obj[i])+" ";
- }
- nm+="}";
- }
-
- return nm;
- }
-
- //*************************************************************************************
-
- //window.onerror = onError;
-
- addEvent(document, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
-
- if( (document.documentElement.getAttribute("debug") == "true")||
- (dojo.config.isDebug)
- ){
- toggleConsole(true);
- }
-
- dojo.addOnWindowUnload(function(){
- // Erase the globals and event handlers I created, to prevent spurious leak warnings
- removeEvent(document, has("ie") || has("safari") ? "keydown" : "keypress", onKeyDown);
- window.onFirebugResize = null;
- window.console = null;
- });
-
-});
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/infoIcon.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_lft_norm.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_lft_over.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_rgt_norm.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/tab_rgt_over.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/dojo/_firebug/warningIcon.png has changed
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/cookie.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-//>>built
-define("dojo/cookie",["./_base/kernel","./regexp"],function(_1,_2){
-_1.cookie=function(_3,_4,_5){
-var c=document.cookie,_6;
-if(arguments.length==1){
-var _7=c.match(new RegExp("(?:^|; )"+_2.escapeString(_3)+"=([^;]*)"));
-_6=_7?decodeURIComponent(_7[1]):undefined;
-}else{
-_5=_5||{};
-var _8=_5.expires;
-if(typeof _8=="number"){
-var d=new Date();
-d.setTime(d.getTime()+_8*24*60*60*1000);
-_8=_5.expires=d;
-}
-if(_8&&_8.toUTCString){
-_5.expires=_8.toUTCString();
-}
-_4=encodeURIComponent(_4);
-var _9=_3+"="+_4,_a;
-for(_a in _5){
-_9+="; "+_a;
-var _b=_5[_a];
-if(_b!==true){
-_9+="="+_b;
-}
-}
-document.cookie=_9;
-}
-return _6;
-};
-_1.cookie.isSupported=function(){
-if(!("cookieEnabled" in navigator)){
-this("__djCookieTest__","CookiesAllowed");
-navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";
-if(navigator.cookieEnabled){
-this("__djCookieTest__","",{expires:-1});
-}
-}
-return navigator.cookieEnabled;
-};
-return _1.cookie;
-});
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/dojo.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-/*
- This is an optimized version of Dojo, built for deployment and not for
- development. To get sources and documentation, please visit:
-
- http://dojotoolkit.org
-*/
-
-//>>built
-(function(_1,_2){var _3=function(){},_4=function(it){for(var p in it){return 0;}return 1;},_5={}.toString,_6=function(it){return _5.call(it)=="[object Function]";},_7=function(it){return _5.call(it)=="[object String]";},_8=function(it){return _5.call(it)=="[object Array]";},_9=function(_a,_b){if(_a){for(var i=0;i<_a.length;){_b(_a[i++]);}}},_c=function(_d,_e){for(var p in _e){_d[p]=_e[p];}return _d;},_f=function(_10,_11){return _c(new Error(_10),{src:"dojoLoader",info:_11});},_12=1,uid=function(){return "_"+_12++;},req=function(_13,_14,_15){return _16(_13,_14,_15,0,req);},_17=this,doc=_17.document,_18=doc&&doc.createElement("DiV"),has=req.has=function(_19){return _6(_1a[_19])?(_1a[_19]=_1a[_19](_17,doc,_18)):_1a[_19];},_1a=has.cache=_2.hasCache;has.add=function(_1b,_1c,now,_1d){(_1a[_1b]===undefined||_1d)&&(_1a[_1b]=_1c);return now&&has(_1b);};0&&has.add("host-node",_1.has&&"host-node" in _1.has?_1.has["host-node"]:(typeof process=="object"&&process.versions&&process.versions.node&&process.versions.v8));if(0){require("./_base/configNode.js").config(_2);_2.loaderPatch.nodeRequire=require;}0&&has.add("host-rhino",_1.has&&"host-rhino" in _1.has?_1.has["host-rhino"]:(typeof load=="function"&&(typeof Packages=="function"||typeof Packages=="object")));if(0){for(var _1e=_1.baseUrl||".",arg,_1f=this.arguments,i=0;i<_1f.length;){arg=(_1f[i++]+"").split("=");if(arg[0]=="baseUrl"){_1e=arg[1];break;}}load(_1e+"/_base/configRhino.js");rhinoDojoConfig(_2,_1e,_1f);}for(var p in _1.has){has.add(p,_1.has[p],0,1);}var _20=1,_21=2,_22=3,_23=4,_24=5;if(0){_20="requested";_21="arrived";_22="not-a-module";_23="executing";_24="executed";}var _25=0,_26="sync",xd="xd",_27=[],_28=0,_29=_3,_2a=_3,_2b;if(1){req.isXdUrl=_3;req.initSyncLoader=function(_2c,_2d,_2e){if(!_28){_28=_2c;_29=_2d;_2a=_2e;}return {sync:_26,requested:_20,arrived:_21,nonmodule:_22,executing:_23,executed:_24,syncExecStack:_27,modules:_2f,execQ:_30,getModule:_31,injectModule:_32,setArrived:_33,signal:_34,finishExec:_35,execModule:_36,dojoRequirePlugin:_28,getLegacyMode:function(){return _25;},guardCheckComplete:_37};};if(1){var _38=location.protocol,_39=location.host;req.isXdUrl=function(url){if(/^\./.test(url)){return false;}if(/^\/\//.test(url)){return true;}var _3a=url.match(/^([^\/\:]+\:)\/+([^\/]+)/);return _3a&&(_3a[1]!=_38||(_39&&_3a[2]!=_39));};1||has.add("dojo-xhr-factory",1);has.add("dojo-force-activex-xhr",1&&!doc.addEventListener&&window.location.protocol=="file:");has.add("native-xhr",typeof XMLHttpRequest!="undefined");if(has("native-xhr")&&!has("dojo-force-activex-xhr")){_2b=function(){return new XMLHttpRequest();};}else{for(var _3b=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],_3c,i=0;i<3;){try{_3c=_3b[i++];if(new ActiveXObject(_3c)){break;}}catch(e){}}_2b=function(){return new ActiveXObject(_3c);};}req.getXhr=_2b;has.add("dojo-gettext-api",1);req.getText=function(url,_3d,_3e){var xhr=_2b();xhr.open("GET",_3f(url),false);xhr.send(null);if(xhr.status==200||(!location.host&&!xhr.status)){if(_3e){_3e(xhr.responseText,_3d);}}else{throw _f("xhrFailed",xhr.status);}return xhr.responseText;};}}else{req.async=1;}var _40=new Function("return eval(arguments[0]);");req.eval=function(_41,_42){return _40(_41+"\r\n////@ sourceURL="+_42);};var _43={},_44="error",_34=req.signal=function(_45,_46){var _47=_43[_45];_9(_47&&_47.slice(0),function(_48){_48.apply(null,_8(_46)?_46:[_46]);});},on=req.on=function(_49,_4a){var _4b=_43[_49]||(_43[_49]=[]);_4b.push(_4a);return {remove:function(){for(var i=0;i<_4b.length;i++){if(_4b[i]===_4a){_4b.splice(i,1);return;}}}};};var _4c=[],_4d={},_4e=[],_4f={},map=req.map={},_50=[],_2f={},_51="",_52={},_53="url:",_54={},_55={},_56=0;if(1){var _57=function(_58){var p,_59,_5a,now,m;for(p in _54){_59=_54[p];_5a=p.match(/^url\:(.+)/);if(_5a){_52[_53+_5b(_5a[1],_58)]=_59;}else{if(p=="*now"){now=_59;}else{if(p!="*noref"){m=_5c(p,_58,true);_52[m.mid]=_52[_53+m.url]=_59;}}}}if(now){now(_5d(_58));}_54={};},_5e=function(s){return s.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(c){return "\\"+c;});},_5f=function(map,_60){_60.splice(0,_60.length);for(var p in map){_60.push([p,map[p],new RegExp("^"+_5e(p)+"(/|$)"),p.length]);}_60.sort(function(lhs,rhs){return rhs[3]-lhs[3];});return _60;},_61=function(_62,_63){_9(_62,function(_64){_63.push([_7(_64[0])?new RegExp("^"+_5e(_64[0])+"$"):_64[0],_64[1]]);});},_65=function(_66){var _67=_66.name;if(!_67){_67=_66;_66={name:_67};}_66=_c({main:"main"},_66);_66.location=_66.location?_66.location:_67;if(_66.packageMap){map[_67]=_66.packageMap;}if(!_66.main.indexOf("./")){_66.main=_66.main.substring(2);}_4f[_67]=_66;},_68=[],_69=function(_6a,_6b,_6c){for(var p in _6a){if(p=="waitSeconds"){req.waitms=(_6a[p]||0)*1000;}if(p=="cacheBust"){_51=_6a[p]?(_7(_6a[p])?_6a[p]:(new Date()).getTime()+""):"";}if(p=="baseUrl"||p=="combo"){req[p]=_6a[p];}if(1&&p=="async"){var _6d=_6a[p];req.legacyMode=_25=(_7(_6d)&&/sync|legacyAsync/.test(_6d)?_6d:(!_6d?_26:false));req.async=!_25;}if(_6a[p]!==_1a){req.rawConfig[p]=_6a[p];p!="has"&&has.add("config-"+p,_6a[p],0,_6b);}}if(!req.baseUrl){req.baseUrl="./";}if(!/\/$/.test(req.baseUrl)){req.baseUrl+="/";}for(p in _6a.has){has.add(p,_6a.has[p],0,_6b);}_9(_6a.packages,_65);for(_1e in _6a.packagePaths){_9(_6a.packagePaths[_1e],function(_6e){var _6f=_1e+"/"+_6e;if(_7(_6e)){_6e={name:_6e};}_6e.location=_6f;_65(_6e);});}_5f(_c(map,_6a.map),_50);_9(_50,function(_70){_70[1]=_5f(_70[1],[]);if(_70[0]=="*"){_50.star=_70;}});_5f(_c(_4d,_6a.paths),_4e);_61(_6a.aliases,_4c);if(_6b){_68.push({config:_6a.config});}else{for(p in _6a.config){var _71=_31(p,_6c);_71.config=_c(_71.config||{},_6a.config[p]);}}if(_6a.cache){_57();_54=_6a.cache;if(_6a.cache["*noref"]){_57();}}_34("config",[_6a,req.rawConfig]);};if(has("dojo-cdn")||1){var _72=doc.getElementsByTagName("script"),i=0,_73,_74,src,_75;while(i<_72.length){_73=_72[i++];if((src=_73.getAttribute("src"))&&(_75=src.match(/(((.*)\/)|^)dojo\.js(\W|$)/i))){_74=_75[3]||"";_2.baseUrl=_2.baseUrl||_74;_56=_73;}if((src=(_73.getAttribute("data-dojo-config")||_73.getAttribute("djConfig")))){_55=req.eval("({ "+src+" })","data-dojo-config");_56=_73;}if(0){if((src=_73.getAttribute("data-main"))){_55.deps=_55.deps||[src];}}}}if(0){try{if(window.parent!=window&&window.parent.require){var doh=window.parent.require("doh");doh&&_c(_55,doh.testConfig);}}catch(e){}}req.rawConfig={};_69(_2,1);if(has("dojo-cdn")){_4f.dojo.location=_74;if(_74){_74+="/";}_4f.dijit.location=_74+"../dijit/";_4f.dojox.location=_74+"../dojox/";}_69(_1,1);_69(_55,1);}else{_4d=_2.paths;_4e=_2.pathsMapProg;_4f=_2.packs;_4c=_2.aliases;_50=_2.mapProgs;_2f=_2.modules;_52=_2.cache;_51=_2.cacheBust;req.rawConfig=_2;}if(0){req.combo=req.combo||{add:_3};var _76=0,_77=[],_78=null;}var _79=function(_7a){_37(function(){_9(_7a.deps,_32);if(0&&_76&&!_78){_78=setTimeout(function(){_76=0;_78=null;req.combo.done(function(_7b,url){var _7c=function(){_7d(0,_7b);_7e();};_77.push(_7b);_7f=_7b;req.injectUrl(url,_7c,_7b);_7f=0;},req);},0);}});},_16=function(a1,a2,a3,_80,_81){var _82,_83;if(_7(a1)){_82=_31(a1,_80,true);if(_82&&_82.executed){return _82.result;}throw _f("undefinedModule",a1);}if(!_8(a1)){_69(a1,0,_80);a1=a2;a2=a3;}if(_8(a1)){if(!a1.length){a2&&a2();}else{_83="require*"+uid();for(var mid,_84=[],i=0;i<a1.length;){mid=a1[i++];_84.push(_31(mid,_80));}_82=_c(_85("",_83,0,""),{injected:_21,deps:_84,def:a2||_3,require:_80?_80.require:req,gc:1});_2f[_82.mid]=_82;_79(_82);var _86=_87&&_25!=_26;_37(function(){_36(_82,_86);});if(!_82.executed){_30.push(_82);}_7e();}}return _81;},_5d=function(_88){if(!_88){return req;}var _89=_88.require;if(!_89){_89=function(a1,a2,a3){return _16(a1,a2,a3,_88,_89);};_88.require=_c(_89,req);_89.module=_88;_89.toUrl=function(_8a){return _5b(_8a,_88);};_89.toAbsMid=function(mid){return _b8(mid,_88);};if(0){_89.undef=function(mid){req.undef(mid,_88);};}if(1){_89.syncLoadNls=function(mid){var _8b=_5c(mid,_88),_8c=_2f[_8b.mid];if(!_8c||!_8c.executed){_8d=_52[_8b.mid]||_52[_53+_8b.url];if(_8d){_8e(_8d);_8c=_2f[_8b.mid];}}return _8c&&_8c.executed&&_8c.result;};}}return _89;},_30=[],_8f=[],_90={},_91=function(_92){_92.injected=_20;_90[_92.mid]=1;if(_92.url){_90[_92.url]=_92.pack||1;}_93();},_33=function(_94){_94.injected=_21;delete _90[_94.mid];if(_94.url){delete _90[_94.url];}if(_4(_90)){_95();1&&_25==xd&&(_25=_26);}},_96=req.idle=function(){return !_8f.length&&_4(_90)&&!_30.length&&!_87;},_97=function(_98,map){if(map){for(var i=0;i<map.length;i++){if(map[i][2].test(_98)){return map[i];}}}return 0;},_99=function(_9a){var _9b=[],_9c,_9d;_9a=_9a.replace(/\\/g,"/").split("/");while(_9a.length){_9c=_9a.shift();if(_9c==".."&&_9b.length&&_9d!=".."){_9b.pop();_9d=_9b[_9b.length-1];}else{if(_9c!="."){_9b.push(_9d=_9c);}}}return _9b.join("/");},_85=function(pid,mid,_9e,url){if(1){var xd=req.isXdUrl(url);return {pid:pid,mid:mid,pack:_9e,url:url,executed:0,def:0,isXd:xd,isAmd:!!(xd||(_4f[pid]&&_4f[pid].isAmd))};}else{return {pid:pid,mid:mid,pack:_9e,url:url,executed:0,def:0};}},_9f=function(mid,_a0,_a1,_a2,_a3,_a4,_a5,_a6,_a7){var pid,_a8,_a9,_aa,url,_ab,_ac,_ad;_ad=mid;_ac=/^\./.test(mid);if(/(^\/)|(\:)|(\.js$)/.test(mid)||(_ac&&!_a0)){return _85(0,mid,0,mid);}else{mid=_99(_ac?(_a0.mid+"/../"+mid):mid);if(/^\./.test(mid)){throw _f("irrationalPath",mid);}if(_a0){_aa=_97(_a0.mid,_a4);}_aa=_aa||_a4.star;_aa=_aa&&_97(mid,_aa[1]);if(_aa){mid=_aa[1]+mid.substring(_aa[3]);}_75=mid.match(/^([^\/]+)(\/(.+))?$/);pid=_75?_75[1]:"";if((_a8=_a1[pid])){mid=pid+"/"+(_a9=(_75[3]||_a8.main));}else{pid="";}var _ae=0,_af=0;_9(_a6,function(_b0){var _b1=mid.match(_b0[0]);if(_b1&&_b1.length>_ae){_af=_6(_b0[1])?mid.replace(_b0[0],_b0[1]):_b0[1];}});if(_af){return _9f(_af,0,_a1,_a2,_a3,_a4,_a5,_a6,_a7);}_ab=_a2[mid];if(_ab){return _a7?_85(_ab.pid,_ab.mid,_ab.pack,_ab.url):_a2[mid];}}_aa=_97(mid,_a5);if(_aa){url=_aa[1]+mid.substring(_aa[3]);}else{if(pid){url=_a8.location+"/"+_a9;}else{if(has("config-tlmSiblingOfDojo")){url="../"+mid;}else{url=mid;}}}if(!(/(^\/)|(\:)/.test(url))){url=_a3+url;}url+=".js";return _85(pid,mid,_a8,_99(url));},_5c=function(mid,_b2,_b3){return _9f(mid,_b2,_4f,_2f,req.baseUrl,_b3?[]:_50,_b3?[]:_4e,_b3?[]:_4c);},_b4=function(_b5,_b6,_b7){return _b5.normalize?_b5.normalize(_b6,function(mid){return _b8(mid,_b7);}):_b8(_b6,_b7);},_b9=0,_31=function(mid,_ba,_bb){var _bc,_bd,_be,_bf;_bc=mid.match(/^(.+?)\!(.*)$/);if(_bc){_bd=_31(_bc[1],_ba,_bb);if(1&&_25==_26&&!_bd.executed){_32(_bd);if(_bd.injected===_21&&!_bd.executed){_37(function(){_36(_bd);});}if(_bd.executed){_c0(_bd);}else{_30.unshift(_bd);}}if(_bd.executed===_24&&!_bd.load){_c0(_bd);}if(_bd.load){_be=_b4(_bd,_bc[2],_ba);mid=(_bd.mid+"!"+(_bd.dynamic?++_b9+"!":"")+_be);}else{_be=_bc[2];mid=_bd.mid+"!"+(++_b9)+"!waitingForPlugin";}_bf={plugin:_bd,mid:mid,req:_5d(_ba),prid:_be};}else{_bf=_5c(mid,_ba);}return _2f[_bf.mid]||(!_bb&&(_2f[_bf.mid]=_bf));},_b8=req.toAbsMid=function(mid,_c1){return _5c(mid,_c1).mid;},_5b=req.toUrl=function(_c2,_c3){var _c4=_5c(_c2+"/x",_c3),url=_c4.url;return _3f(_c4.pid===0?_c2:url.substring(0,url.length-5));},_c5={injected:_21,executed:_24,def:_22,result:_22},_c6=function(mid){return _2f[mid]=_c({mid:mid},_c5);},_c7=_c6("require"),_c8=_c6("exports"),_c9=_c6("module"),_ca=function(_cb,_cc){req.trace("loader-run-factory",[_cb.mid]);var _cd=_cb.def,_ce;1&&_27.unshift(_cb);if(has("config-dojo-loader-catches")){try{_ce=_6(_cd)?_cd.apply(null,_cc):_cd;}catch(e){_34(_44,_cb.result=_f("factoryThrew",[_cb,e]));}}else{_ce=_6(_cd)?_cd.apply(null,_cc):_cd;}_cb.result=_ce===undefined&&_cb.cjs?_cb.cjs.exports:_ce;1&&_27.shift(_cb);},_cf={},_d0=0,_c0=function(_d1){var _d2=_d1.result;_d1.dynamic=_d2.dynamic;_d1.normalize=_d2.normalize;_d1.load=_d2.load;return _d1;},_d3=function(_d4){var map={};_9(_d4.loadQ,function(_d5){var _d6=_b4(_d4,_d5.prid,_d5.req.module),mid=_d4.dynamic?_d5.mid.replace(/waitingForPlugin$/,_d6):(_d4.mid+"!"+_d6),_d7=_c(_c({},_d5),{mid:mid,prid:_d6,injected:0});if(!_2f[mid]){_e9(_2f[mid]=_d7);}map[_d5.mid]=_2f[mid];_33(_d5);delete _2f[_d5.mid];});_d4.loadQ=0;var _d8=function(_d9){for(var _da,_db=_d9.deps||[],i=0;i<_db.length;i++){_da=map[_db[i].mid];if(_da){_db[i]=_da;}}};for(var p in _2f){_d8(_2f[p]);}_9(_30,_d8);},_35=function(_dc){req.trace("loader-finish-exec",[_dc.mid]);_dc.executed=_24;_dc.defOrder=_d0++;1&&_9(_dc.provides,function(cb){cb();});if(_dc.loadQ){_c0(_dc);_d3(_dc);}for(i=0;i<_30.length;){if(_30[i]===_dc){_30.splice(i,1);}else{i++;}}if(/^require\*/.test(_dc.mid)){delete _2f[_dc.mid];}},_dd=[],_36=function(_de,_df){if(_de.executed===_23){req.trace("loader-circular-dependency",[_dd.concat(_de.mid).join("->")]);return (!_de.def||_df)?_cf:(_de.cjs&&_de.cjs.exports);}if(!_de.executed){if(!_de.def){return _cf;}var mid=_de.mid,_e0=_de.deps||[],arg,_e1,_e2=[],i=0;if(0){_dd.push(mid);req.trace("loader-exec-module",["exec",_dd.length,mid]);}_de.executed=_23;while((arg=_e0[i++])){_e1=((arg===_c7)?_5d(_de):((arg===_c8)?_de.cjs.exports:((arg===_c9)?_de.cjs:_36(arg,_df))));if(_e1===_cf){_de.executed=0;req.trace("loader-exec-module",["abort",mid]);0&&_dd.pop();return _cf;}_e2.push(_e1);}_ca(_de,_e2);_35(_de);0&&_dd.pop();}return _de.result;},_87=0,_37=function(_e3){try{_87++;_e3();}finally{_87--;}if(_96()){_34("idle",[]);}},_7e=function(){if(_87){return;}_37(function(){_29();for(var _e4,_e5,i=0;i<_30.length;){_e4=_d0;_e5=_30[i];_36(_e5);if(_e4!=_d0){_29();i=0;}else{i++;}}});};if(0){req.undef=function(_e6,_e7){var _e8=_31(_e6,_e7);_33(_e8);_c(_e8,{def:0,executed:0,injected:0,node:0});};}if(1){if(has("dojo-loader-eval-hint-url")===undefined){has.add("dojo-loader-eval-hint-url",1);}var _3f=function(url){url+="";return url+(_51?((/\?/.test(url)?"&":"?")+_51):"");},_e9=function(_ea){var _eb=_ea.plugin;if(_eb.executed===_24&&!_eb.load){_c0(_eb);}var _ec=function(def){_ea.result=def;_33(_ea);_35(_ea);_7e();};if(_eb.load){_eb.load(_ea.prid,_ea.req,_ec);}else{if(_eb.loadQ){_eb.loadQ.push(_ea);}else{_eb.loadQ=[_ea];_30.unshift(_eb);_32(_eb);}}},_8d=0,_7f=0,_ed=0,_8e=function(_ee,_ef){if(has("config-stripStrict")){_ee=_ee.replace(/"use strict"/g,"");}_ed=1;if(has("config-dojo-loader-catches")){try{if(_ee===_8d){_8d.call(null);}else{req.eval(_ee,has("dojo-loader-eval-hint-url")?_ef.url:_ef.mid);}}catch(e){_34(_44,_f("evalModuleThrew",_ef));}}else{if(_ee===_8d){_8d.call(null);}else{req.eval(_ee,has("dojo-loader-eval-hint-url")?_ef.url:_ef.mid);}}_ed=0;},_32=function(_f0){var mid=_f0.mid,url=_f0.url;if(_f0.executed||_f0.injected||_90[mid]||(_f0.url&&((_f0.pack&&_90[_f0.url]===_f0.pack)||_90[_f0.url]==1))){return;}_91(_f0);if(0){var _f1=0;if(_f0.plugin&&_f0.plugin.isCombo){req.combo.add(_f0.plugin.mid,_f0.prid,0,req);_f1=1;}else{if(!_f0.plugin){_f1=req.combo.add(0,_f0.mid,_f0.url,req);}}if(_f1){_76=1;return;}}if(_f0.plugin){_e9(_f0);return;}var _f2=function(){_7d(_f0);if(_f0.injected!==_21){if(has("dojo-enforceDefine")){_34(_44,_f("noDefine",_f0));return;}_33(_f0);_c(_f0,_c5);req.trace("loader-define-nonmodule",[_f0.url]);}if(1&&_25){!_27.length&&_7e();}else{_7e();}};_8d=_52[mid]||_52[_53+_f0.url];if(_8d){req.trace("loader-inject",["cache",_f0.mid,url]);_8e(_8d,_f0);_f2();return;}if(1&&_25){if(_f0.isXd){_25==_26&&(_25=xd);}else{if(_f0.isAmd&&_25!=_26){}else{var _f3=function(_f4){if(_25==_26){_27.unshift(_f0);_8e(_f4,_f0);_27.shift();_7d(_f0);if(!_f0.cjs){_33(_f0);_35(_f0);}if(_f0.finish){var _f5=mid+"*finish",_f6=_f0.finish;delete _f0.finish;def(_f5,["dojo",("dojo/require!"+_f6.join(",")).replace(/\./g,"/")],function(_f7){_9(_f6,function(mid){_f7.require(mid);});});_30.unshift(_31(_f5));}_f2();}else{_f4=_2a(_f0,_f4);if(_f4){_8e(_f4,_f0);_f2();}else{_7f=_f0;req.injectUrl(_3f(url),_f2,_f0);_7f=0;}}};req.trace("loader-inject",["xhr",_f0.mid,url,_25!=_26]);if(has("config-dojo-loader-catches")){try{req.getText(url,_25!=_26,_f3);}catch(e){_34(_44,_f("xhrInjectFailed",[_f0,e]));}}else{req.getText(url,_25!=_26,_f3);}return;}}}req.trace("loader-inject",["script",_f0.mid,url]);_7f=_f0;req.injectUrl(_3f(url),_f2,_f0);_7f=0;},_f8=function(_f9,_fa,def){req.trace("loader-define-module",[_f9.mid,_fa]);if(0&&_f9.plugin&&_f9.plugin.isCombo){_f9.result=_6(def)?def():def;_33(_f9);_35(_f9);return _f9;}var mid=_f9.mid;if(_f9.injected===_21){_34(_44,_f("multipleDefine",_f9));return _f9;}_c(_f9,{deps:_fa,def:def,cjs:{id:_f9.mid,uri:_f9.url,exports:(_f9.result={}),setExports:function(_fb){_f9.cjs.exports=_fb;},config:function(){return _f9.config;}}});for(var i=0;_fa[i];i++){_fa[i]=_31(_fa[i],_f9);}if(1&&_25&&!_90[mid]){_79(_f9);_30.push(_f9);_7e();}_33(_f9);if(!_6(def)&&!_fa.length){_f9.result=def;_35(_f9);}return _f9;},_7d=function(_fc,_fd){var _fe=[],_ff,args;while(_8f.length){args=_8f.shift();_fd&&(args[0]=_fd.shift());_ff=(args[0]&&_31(args[0]))||_fc;_fe.push([_ff,args[1],args[2]]);}_57(_fc);_9(_fe,function(args){_79(_f8.apply(null,args));});};}var _100=0,_95=_3,_93=_3;if(1){_95=function(){_100&&clearTimeout(_100);_100=0;};_93=function(){_95();if(req.waitms){_100=window.setTimeout(function(){_95();_34(_44,_f("timeout",_90));},req.waitms);}};}if(1){has.add("ie-event-behavior",doc.attachEvent&&typeof Windows==="undefined"&&(typeof opera==="undefined"||opera.toString()!="[object Opera]"));}if(1&&(1||1)){var _101=function(node,_102,_103,_104){if(!has("ie-event-behavior")){node.addEventListener(_102,_104,false);return function(){node.removeEventListener(_102,_104,false);};}else{node.attachEvent(_103,_104);return function(){node.detachEvent(_103,_104);};}},_105=_101(window,"load","onload",function(){req.pageLoaded=1;doc.readyState!="complete"&&(doc.readyState="complete");_105();});if(1){var _72=doc.getElementsByTagName("script"),i=0,_73;while(!_56){if(!/^dojo/.test((_73=_72[i++])&&_73.type)){_56=_73;}}req.injectUrl=function(url,_106,_107){var node=_107.node=doc.createElement("script"),_108=function(e){e=e||window.event;var node=e.target||e.srcElement;if(e.type==="load"||/complete|loaded/.test(node.readyState)){_109();_10a();_106&&_106();}},_109=_101(node,"load","onreadystatechange",_108),_10a=_101(node,"error","onerror",function(e){_109();_10a();_34(_44,_f("scriptError",[url,e]));});node.type="text/javascript";node.charset="utf-8";node.src=url;_56.parentNode.insertBefore(node,_56);return node;};}}if(1){req.log=function(){try{for(var i=0;i<arguments.length;i++){}}catch(e){}};}else{req.log=_3;}if(0){var _10b=req.trace=function(_10c,args){if(_10b.on&&_10b.group[_10c]){_34("trace",[_10c,args]);for(var arg,dump=[],text="trace:"+_10c+(args.length?(":"+args[0]):""),i=1;i<args.length;){arg=args[i++];if(_7(arg)){text+=", "+arg;}else{dump.push(arg);}}req.log(text);dump.length&&dump.push(".");req.log.apply(req,dump);}};_c(_10b,{on:1,group:{},set:function(_10d,_10e){if(_7(_10d)){_10b.group[_10d]=_10e;}else{_c(_10b.group,_10d);}}});_10b.set(_c(_c(_c({},_2.trace),_1.trace),_55.trace));on("config",function(_10f){_10f.trace&&_10b.set(_10f.trace);});}else{req.trace=_3;}var def=function(mid,_110,_111){var _112=arguments.length,_113=["require","exports","module"],args=[0,mid,_110];if(_112==1){args=[0,(_6(mid)?_113:[]),mid];}else{if(_112==2&&_7(mid)){args=[mid,(_6(_110)?_113:[]),_110];}else{if(_112==3){args=[mid,_110,_111];}}}if(0&&args[1]===_113){args[2].toString().replace(/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,"").replace(/require\(["']([\w\!\-_\.\/]+)["']\)/g,function(_114,dep){args[1].push(dep);});}req.trace("loader-define",args.slice(0,2));var _115=args[0]&&_31(args[0]),_116;if(_115&&!_90[_115.mid]){_79(_f8(_115,args[1],args[2]));}else{if(!has("ie-event-behavior")||!1||_ed){_8f.push(args);}else{_115=_115||_7f;if(!_115){for(mid in _90){_116=_2f[mid];if(_116&&_116.node&&_116.node.readyState==="interactive"){_115=_116;break;}}if(0&&!_115){for(var i=0;i<_77.length;i++){_115=_77[i];if(_115.node&&_115.node.readyState==="interactive"){break;}_115=0;}}}if(0&&_8(_115)){_79(_f8(_31(_115.shift()),args[1],args[2]));if(!_115.length){_77.splice(i,1);}}else{if(_115){_57(_115);_79(_f8(_115,args[1],args[2]));}else{_34(_44,_f("ieDefineFailed",args[0]));}}_7e();}}};def.amd={vendor:"dojotoolkit.org"};if(0){req.def=def;}_c(_c(req,_2.loaderPatch),_1.loaderPatch);on(_44,function(arg){try{console.error(arg);if(arg instanceof Error){for(var p in arg){}}}catch(e){}});_c(req,{uid:uid,cache:_52,packs:_4f});if(0){_c(req,{paths:_4d,aliases:_4c,modules:_2f,legacyMode:_25,execQ:_30,defQ:_8f,waiting:_90,packs:_4f,mapProgs:_50,pathsMapProg:_4e,listenerQueues:_43,computeMapProg:_5f,computeAliases:_61,runMapProg:_97,compactPath:_99,getModuleInfo:_9f});}if(_17.define){if(1){_34(_44,_f("defineAlreadyDefined",0));}return;}else{_17.define=def;_17.require=req;if(0){require=req;}}if(0&&req.combo&&req.combo.plugins){var _117=req.combo.plugins,_118;for(_118 in _117){_c(_c(_31(_118),_117[_118]),{isCombo:1,executed:"executed",load:1});}}if(1){_9(_68,function(c){_69(c);});var _119=_55.deps||_1.deps||_2.deps,_11a=_55.callback||_1.callback||_2.callback;req.boot=(_119||_11a)?[_119||[],_11a]:0;}if(!1){!req.async&&req(["dojo"]);req.boot&&req.apply(null,req.boot);}})(this.dojoConfig||this.djConfig||this.require||{},{async:0,hasCache:{"config-selectorEngine":"acme","config-tlmSiblingOfDojo":1,"dojo-built":1,"dojo-loader":1,dom:1,"host-browser":1},packages:[{location:"../dijit",name:"dijit"},{location:"../dojox",name:"dojox"},{location:".",name:"dojo"}]});require({cache:{"dojo/request/default":function(){define(["exports","require","../has"],function(_11b,_11c,has){var _11d=has("config-requestProvider"),_11e;if(1){_11e="./xhr";}else{if(0){_11e="./node";}}if(!_11d){_11d=_11e;}_11b.getPlatformDefaultId=function(){return _11e;};_11b.load=function(id,_11f,_120,_121){_11c([id=="platform"?_11e:_11d],function(_122){_120(_122);});};});},"dojo/_base/fx":function(){define(["./kernel","./config","./lang","../Evented","./Color","../aspect","../sniff","../dom","../dom-style"],function(dojo,_123,lang,_124,_125,_126,has,dom,_127){var _128=lang.mixin;var _129={};var _12a=_129._Line=function(_12b,end){this.start=_12b;this.end=end;};_12a.prototype.getValue=function(n){return ((this.end-this.start)*n)+this.start;};var _12c=_129.Animation=function(args){_128(this,args);if(lang.isArray(this.curve)){this.curve=new _12a(this.curve[0],this.curve[1]);}};_12c.prototype=new _124();lang.extend(_12c,{duration:350,repeat:0,rate:20,_percent:0,_startRepeatCount:0,_getStep:function(){var _12d=this._percent,_12e=this.easing;return _12e?_12e(_12d):_12d;},_fire:function(evt,args){var a=args||[];if(this[evt]){if(_123.debugAtAllCosts){this[evt].apply(this,a);}else{try{this[evt].apply(this,a);}catch(e){console.error("exception in animation handler for:",evt);console.error(e);}}}return this;},play:function(_12f,_130){var _131=this;if(_131._delayTimer){_131._clearTimer();}if(_130){_131._stopTimer();_131._active=_131._paused=false;_131._percent=0;}else{if(_131._active&&!_131._paused){return _131;}}_131._fire("beforeBegin",[_131.node]);var de=_12f||_131.delay,_132=lang.hitch(_131,"_play",_130);if(de>0){_131._delayTimer=setTimeout(_132,de);return _131;}_132();return _131;},_play:function(_133){var _134=this;if(_134._delayTimer){_134._clearTimer();}_134._startTime=new Date().valueOf();if(_134._paused){_134._startTime-=_134.duration*_134._percent;}_134._active=true;_134._paused=false;var _135=_134.curve.getValue(_134._getStep());if(!_134._percent){if(!_134._startRepeatCount){_134._startRepeatCount=_134.repeat;}_134._fire("onBegin",[_135]);}_134._fire("onPlay",[_135]);_134._cycle();return _134;},pause:function(){var _136=this;if(_136._delayTimer){_136._clearTimer();}_136._stopTimer();if(!_136._active){return _136;}_136._paused=true;_136._fire("onPause",[_136.curve.getValue(_136._getStep())]);return _136;},gotoPercent:function(_137,_138){var _139=this;_139._stopTimer();_139._active=_139._paused=true;_139._percent=_137;if(_138){_139.play();}return _139;},stop:function(_13a){var _13b=this;if(_13b._delayTimer){_13b._clearTimer();}if(!_13b._timer){return _13b;}_13b._stopTimer();if(_13a){_13b._percent=1;}_13b._fire("onStop",[_13b.curve.getValue(_13b._getStep())]);_13b._active=_13b._paused=false;return _13b;},status:function(){if(this._active){return this._paused?"paused":"playing";}return "stopped";},_cycle:function(){var _13c=this;if(_13c._active){var curr=new Date().valueOf();var step=_13c.duration===0?1:(curr-_13c._startTime)/(_13c.duration);if(step>=1){step=1;}_13c._percent=step;if(_13c.easing){step=_13c.easing(step);}_13c._fire("onAnimate",[_13c.curve.getValue(step)]);if(_13c._percent<1){_13c._startTimer();}else{_13c._active=false;if(_13c.repeat>0){_13c.repeat--;_13c.play(null,true);}else{if(_13c.repeat==-1){_13c.play(null,true);}else{if(_13c._startRepeatCount){_13c.repeat=_13c._startRepeatCount;_13c._startRepeatCount=0;}}}_13c._percent=0;_13c._fire("onEnd",[_13c.node]);!_13c.repeat&&_13c._stopTimer();}}return _13c;},_clearTimer:function(){clearTimeout(this._delayTimer);delete this._delayTimer;}});var ctr=0,_13d=null,_13e={run:function(){}};lang.extend(_12c,{_startTimer:function(){if(!this._timer){this._timer=_126.after(_13e,"run",lang.hitch(this,"_cycle"),true);ctr++;}if(!_13d){_13d=setInterval(lang.hitch(_13e,"run"),this.rate);}},_stopTimer:function(){if(this._timer){this._timer.remove();this._timer=null;ctr--;}if(ctr<=0){clearInterval(_13d);_13d=null;ctr=0;}}});var _13f=has("ie")?function(node){var ns=node.style;if(!ns.width.length&&_127.get(node,"width")=="auto"){ns.width="auto";}}:function(){};_129._fade=function(args){args.node=dom.byId(args.node);var _140=_128({properties:{}},args),_141=(_140.properties.opacity={});_141.start=!("start" in _140)?function(){return +_127.get(_140.node,"opacity")||0;}:_140.start;_141.end=_140.end;var anim=_129.animateProperty(_140);_126.after(anim,"beforeBegin",lang.partial(_13f,_140.node),true);return anim;};_129.fadeIn=function(args){return _129._fade(_128({end:1},args));};_129.fadeOut=function(args){return _129._fade(_128({end:0},args));};_129._defaultEasing=function(n){return 0.5+((Math.sin((n+1.5)*Math.PI))/2);};var _142=function(_143){this._properties=_143;for(var p in _143){var prop=_143[p];if(prop.start instanceof _125){prop.tempColor=new _125();}}};_142.prototype.getValue=function(r){var ret={};for(var p in this._properties){var prop=this._properties[p],_144=prop.start;if(_144 instanceof _125){ret[p]=_125.blendColors(_144,prop.end,r,prop.tempColor).toCss();}else{if(!lang.isArray(_144)){ret[p]=((prop.end-_144)*r)+_144+(p!="opacity"?prop.units||"px":0);}}}return ret;};_129.animateProperty=function(args){var n=args.node=dom.byId(args.node);if(!args.easing){args.easing=dojo._defaultEasing;}var anim=new _12c(args);_126.after(anim,"beforeBegin",lang.hitch(anim,function(){var pm={};for(var p in this.properties){if(p=="width"||p=="height"){this.node.display="block";}var prop=this.properties[p];if(lang.isFunction(prop)){prop=prop(n);}prop=pm[p]=_128({},(lang.isObject(prop)?prop:{end:prop}));if(lang.isFunction(prop.start)){prop.start=prop.start(n);}if(lang.isFunction(prop.end)){prop.end=prop.end(n);}var _145=(p.toLowerCase().indexOf("color")>=0);function _146(node,p){var v={height:node.offsetHeight,width:node.offsetWidth}[p];if(v!==undefined){return v;}v=_127.get(node,p);return (p=="opacity")?+v:(_145?v:parseFloat(v));};if(!("end" in prop)){prop.end=_146(n,p);}else{if(!("start" in prop)){prop.start=_146(n,p);}}if(_145){prop.start=new _125(prop.start);prop.end=new _125(prop.end);}else{prop.start=(p=="opacity")?+prop.start:parseFloat(prop.start);}}this.curve=new _142(pm);}),true);_126.after(anim,"onAnimate",lang.hitch(_127,"set",anim.node),true);return anim;};_129.anim=function(node,_147,_148,_149,_14a,_14b){return _129.animateProperty({node:node,duration:_148||_12c.prototype.duration,properties:_147,easing:_149,onEnd:_14a}).play(_14b||0);};if(1){_128(dojo,_129);dojo._Animation=_12c;}return _129;});},"dojo/dom-form":function(){define(["./_base/lang","./dom","./io-query","./json"],function(lang,dom,ioq,json){function _14c(obj,name,_14d){if(_14d===null){return;}var val=obj[name];if(typeof val=="string"){obj[name]=[val,_14d];}else{if(lang.isArray(val)){val.push(_14d);}else{obj[name]=_14d;}}};var _14e="file|submit|image|reset|button";var form={fieldToObject:function fieldToObject(_14f){var ret=null;_14f=dom.byId(_14f);if(_14f){var _150=_14f.name,type=(_14f.type||"").toLowerCase();if(_150&&type&&!_14f.disabled){if(type=="radio"||type=="checkbox"){if(_14f.checked){ret=_14f.value;}}else{if(_14f.multiple){ret=[];var _151=[_14f.firstChild];while(_151.length){for(var node=_151.pop();node;node=node.nextSibling){if(node.nodeType==1&&node.tagName.toLowerCase()=="option"){if(node.selected){ret.push(node.value);}}else{if(node.nextSibling){_151.push(node.nextSibling);}if(node.firstChild){_151.push(node.firstChild);}break;}}}}else{ret=_14f.value;}}}}return ret;},toObject:function formToObject(_152){var ret={},_153=dom.byId(_152).elements;for(var i=0,l=_153.length;i<l;++i){var item=_153[i],_154=item.name,type=(item.type||"").toLowerCase();if(_154&&type&&_14e.indexOf(type)<0&&!item.disabled){_14c(ret,_154,form.fieldToObject(item));if(type=="image"){ret[_154+".x"]=ret[_154+".y"]=ret[_154].x=ret[_154].y=0;}}}return ret;},toQuery:function formToQuery(_155){return ioq.objectToQuery(form.toObject(_155));},toJson:function formToJson(_156,_157){return json.stringify(form.toObject(_156),null,_157?4:0);}};return form;});},"dojo/i18n":function(){define(["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json","module"],function(dojo,_158,has,_159,_15a,lang,xhr,json,_15b){has.add("dojo-preload-i18n-Api",1);1||has.add("dojo-v1x-i18n-Api",1);var _15c=dojo.i18n={},_15d=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_15e=function(root,_15f,_160,_161){for(var _162=[_160+_161],_163=_15f.split("-"),_164="",i=0;i<_163.length;i++){_164+=(_164?"-":"")+_163[i];if(!root||root[_164]){_162.push(_160+_164+"/"+_161);_162.specificity=_164;}}return _162;},_165={},_166=function(_167,_168,_169){_169=_169?_169.toLowerCase():dojo.locale;_167=_167.replace(/\./g,"/");_168=_168.replace(/\./g,"/");return (/root/i.test(_169))?(_167+"/nls/"+_168):(_167+"/nls/"+_169+"/"+_168);},_16a=dojo.getL10nName=function(_16b,_16c,_16d){return _16b=_15b.id+"!"+_166(_16b,_16c,_16d);},_16e=function(_16f,_170,_171,_172,_173,load){_16f([_170],function(root){var _174=lang.clone(root.root||root.ROOT),_175=_15e(!root._v1x&&root,_173,_171,_172);_16f(_175,function(){for(var i=1;i<_175.length;i++){_174=lang.mixin(lang.clone(_174),arguments[i]);}var _176=_170+"/"+_173;_165[_176]=_174;_174.$locale=_175.specificity;load();});});},_177=function(id,_178){return /^\./.test(id)?_178(id):id;},_179=function(_17a){var list=_15a.extraLocale||[];list=lang.isArray(list)?list:[list];list.push(_17a);return list;},load=function(id,_17b,load){if(has("dojo-preload-i18n-Api")){var _17c=id.split("*"),_17d=_17c[1]=="preload";if(_17d){if(!_165[id]){_165[id]=1;_17e(_17c[2],json.parse(_17c[3]),1,_17b);}load(1);}if(_17d||_17f(id,_17b,load)){return;}}var _180=_15d.exec(id),_181=_180[1]+"/",_182=_180[5]||_180[4],_183=_181+_182,_184=(_180[5]&&_180[4]),_185=_184||dojo.locale||"",_186=_183+"/"+_185,_187=_184?[_185]:_179(_185),_188=_187.length,_189=function(){if(!--_188){load(lang.delegate(_165[_186]));}};_159.forEach(_187,function(_18a){var _18b=_183+"/"+_18a;if(has("dojo-preload-i18n-Api")){_18c(_18b);}if(!_165[_18b]){_16e(_17b,_183,_181,_182,_18a,_189);}else{_189();}});};if(has("dojo-unit-tests")){var _18d=_15c.unitTests=[];}if(has("dojo-preload-i18n-Api")||1){var _18e=_15c.normalizeLocale=function(_18f){var _190=_18f?_18f.toLowerCase():dojo.locale;return _190=="root"?"ROOT":_190;},isXd=function(mid,_191){return (1&&1)?_191.isXdUrl(_158.toUrl(mid+".js")):true;},_192=0,_193=[],_17e=_15c._preloadLocalizations=function(_194,_195,_196,_197){_197=_197||_158;function _198(mid,_199){if(isXd(mid,_197)||_196){_197([mid],_199);}else{_1b3([mid],_199,_197);}};function _19a(_19b,func){var _19c=_19b.split("-");while(_19c.length){if(func(_19c.join("-"))){return;}_19c.pop();}func("ROOT");};function _19d(){_192++;};function _19e(){--_192;while(!_192&&_193.length){load.apply(null,_193.shift());}};function _19f(path,name,loc,_1a0){return _1a0.toAbsMid(path+name+"/"+loc);};function _1a1(_1a2){_1a2=_18e(_1a2);_19a(_1a2,function(loc){if(_159.indexOf(_195,loc)>=0){var mid=_194.replace(/\./g,"/")+"_"+loc;_19d();_198(mid,function(_1a3){for(var p in _1a3){var _1a4=_1a3[p],_1a5=p.match(/(.+)\/([^\/]+)$/),_1a6,_1a7;if(!_1a5){continue;}_1a6=_1a5[2];_1a7=_1a5[1]+"/";_1a4._localized=_1a4._localized||{};var _1a8;if(loc==="ROOT"){var root=_1a8=_1a4._localized;delete _1a4._localized;root.root=_1a4;_165[_158.toAbsMid(p)]=root;}else{_1a8=_1a4._localized;_165[_19f(_1a7,_1a6,loc,_158)]=_1a4;}if(loc!==_1a2){function _1a9(_1aa,_1ab,_1ac,_1ad){var _1ae=[],_1af=[];_19a(_1a2,function(loc){if(_1ad[loc]){_1ae.push(_158.toAbsMid(_1aa+loc+"/"+_1ab));_1af.push(_19f(_1aa,_1ab,loc,_158));}});if(_1ae.length){_19d();_197(_1ae,function(){for(var i=0;i<_1ae.length;i++){_1ac=lang.mixin(lang.clone(_1ac),arguments[i]);_165[_1af[i]]=_1ac;}_165[_19f(_1aa,_1ab,_1a2,_158)]=lang.clone(_1ac);_19e();});}else{_165[_19f(_1aa,_1ab,_1a2,_158)]=_1ac;}};_1a9(_1a7,_1a6,_1a4,_1a8);}}_19e();});return true;}return false;});};_1a1();_159.forEach(dojo.config.extraLocale,_1a1);},_17f=function(id,_1b0,load){if(_192){_193.push([id,_1b0,load]);}return _192;},_18c=function(){};}if(1){var _1b1={},_1b2=new Function("__bundle","__checkForLegacyModules","__mid","__amdValue","var define = function(mid, factory){define.called = 1; __amdValue.result = factory || mid;},"+"\t require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return __amdValue;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_1b3=function(deps,_1b4,_1b5){var _1b6=[];_159.forEach(deps,function(mid){var url=_1b5.toUrl(mid+".js");function load(text){var _1b7=_1b2(text,_18c,mid,_1b1);if(_1b7===_1b1){_1b6.push(_165[url]=_1b1.result);}else{if(_1b7 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_1b7);_1b7={};}_1b6.push(_165[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_1b7:{root:_1b7,_v1x:1}));}};if(_165[url]){_1b6.push(_165[url]);}else{var _1b8=_1b5.syncLoadNls(mid);if(_1b8){_1b6.push(_1b8);}else{if(!xhr){try{_1b5.getText(url,true,load);}catch(e){_1b6.push(_165[url]={});}}else{xhr.get({url:url,sync:true,load:load,error:function(){_1b6.push(_165[url]={});}});}}}});_1b4&&_1b4.apply(null,_1b6);};_18c=function(_1b9){for(var _1ba,_1bb=_1b9.split("/"),_1bc=dojo.global[_1bb[0]],i=1;_1bc&&i<_1bb.length-1;_1bc=_1bc[_1bb[i++]]){}if(_1bc){_1ba=_1bc[_1bb[i]];if(!_1ba){_1ba=_1bc[_1bb[i].replace(/-/g,"_")];}if(_1ba){_165[_1b9]=_1ba;}}return _1ba;};_15c.getLocalization=function(_1bd,_1be,_1bf){var _1c0,_1c1=_166(_1bd,_1be,_1bf);load(_1c1,(!isXd(_1c1,_158)?function(deps,_1c2){_1b3(deps,_1c2,_158);}:_158),function(_1c3){_1c0=_1c3;});return _1c0;};if(has("dojo-unit-tests")){_18d.push(function(doh){doh.register("tests.i18n.unit",function(t){var _1c4;_1c4=_1b2("{prop:1}",_18c,"nonsense",_1b1);t.is({prop:1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("({prop:1})",_18c,"nonsense",_1b1);t.is({prop:1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("{'prop-x':1}",_18c,"nonsense",_1b1);t.is({"prop-x":1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("({'prop-x':1})",_18c,"nonsense",_1b1);t.is({"prop-x":1},_1c4);t.is(undefined,_1c4[1]);_1c4=_1b2("define({'prop-x':1})",_18c,"nonsense",_1b1);t.is(_1b1,_1c4);t.is({"prop-x":1},_1b1.result);_1c4=_1b2("define('some/module', {'prop-x':1})",_18c,"nonsense",_1b1);t.is(_1b1,_1c4);t.is({"prop-x":1},_1b1.result);_1c4=_1b2("this is total nonsense and should throw an error",_18c,"nonsense",_1b1);t.is(_1c4 instanceof Error,true);});});}}return lang.mixin(_15c,{dynamic:true,normalize:_177,load:load,cache:_165,getL10nName:_16a});});},"dojo/promise/tracer":function(){define(["../_base/lang","./Promise","../Evented"],function(lang,_1c5,_1c6){"use strict";var _1c7=new _1c6;var emit=_1c7.emit;_1c7.emit=null;function _1c8(args){setTimeout(function(){emit.apply(_1c7,args);},0);};_1c5.prototype.trace=function(){var args=lang._toArray(arguments);this.then(function(_1c9){_1c8(["resolved",_1c9].concat(args));},function(_1ca){_1c8(["rejected",_1ca].concat(args));},function(_1cb){_1c8(["progress",_1cb].concat(args));});return this;};_1c5.prototype.traceRejected=function(){var args=lang._toArray(arguments);this.otherwise(function(_1cc){_1c8(["rejected",_1cc].concat(args));});return this;};return _1c7;});},"dojo/errors/RequestError":function(){define(["./create"],function(_1cd){return _1cd("RequestError",function(_1ce,_1cf){this.response=_1cf;});});},"dojo/_base/html":function(){define(["./kernel","../dom","../dom-style","../dom-attr","../dom-prop","../dom-class","../dom-construct","../dom-geometry"],function(dojo,dom,_1d0,attr,prop,cls,ctr,geom){dojo.byId=dom.byId;dojo.isDescendant=dom.isDescendant;dojo.setSelectable=dom.setSelectable;dojo.getAttr=attr.get;dojo.setAttr=attr.set;dojo.hasAttr=attr.has;dojo.removeAttr=attr.remove;dojo.getNodeProp=attr.getNodeProp;dojo.attr=function(node,name,_1d1){if(arguments.length==2){return attr[typeof name=="string"?"get":"set"](node,name);}return attr.set(node,name,_1d1);};dojo.hasClass=cls.contains;dojo.addClass=cls.add;dojo.removeClass=cls.remove;dojo.toggleClass=cls.toggle;dojo.replaceClass=cls.replace;dojo._toDom=dojo.toDom=ctr.toDom;dojo.place=ctr.place;dojo.create=ctr.create;dojo.empty=function(node){ctr.empty(node);};dojo._destroyElement=dojo.destroy=function(node){ctr.destroy(node);};dojo._getPadExtents=dojo.getPadExtents=geom.getPadExtents;dojo._getBorderExtents=dojo.getBorderExtents=geom.getBorderExtents;dojo._getPadBorderExtents=dojo.getPadBorderExtents=geom.getPadBorderExtents;dojo._getMarginExtents=dojo.getMarginExtents=geom.getMarginExtents;dojo._getMarginSize=dojo.getMarginSize=geom.getMarginSize;dojo._getMarginBox=dojo.getMarginBox=geom.getMarginBox;dojo.setMarginBox=geom.setMarginBox;dojo._getContentBox=dojo.getContentBox=geom.getContentBox;dojo.setContentSize=geom.setContentSize;dojo._isBodyLtr=dojo.isBodyLtr=geom.isBodyLtr;dojo._docScroll=dojo.docScroll=geom.docScroll;dojo._getIeDocumentElementOffset=dojo.getIeDocumentElementOffset=geom.getIeDocumentElementOffset;dojo._fixIeBiDiScrollLeft=dojo.fixIeBiDiScrollLeft=geom.fixIeBiDiScrollLeft;dojo.position=geom.position;dojo.marginBox=function marginBox(node,box){return box?geom.setMarginBox(node,box):geom.getMarginBox(node);};dojo.contentBox=function contentBox(node,box){return box?geom.setContentSize(node,box):geom.getContentBox(node);};dojo.coords=function(node,_1d2){dojo.deprecated("dojo.coords()","Use dojo.position() or dojo.marginBox().");node=dom.byId(node);var s=_1d0.getComputedStyle(node),mb=geom.getMarginBox(node,s);var abs=geom.position(node,_1d2);mb.x=abs.x;mb.y=abs.y;return mb;};dojo.getProp=prop.get;dojo.setProp=prop.set;dojo.prop=function(node,name,_1d3){if(arguments.length==2){return prop[typeof name=="string"?"get":"set"](node,name);}return prop.set(node,name,_1d3);};dojo.getStyle=_1d0.get;dojo.setStyle=_1d0.set;dojo.getComputedStyle=_1d0.getComputedStyle;dojo.__toPixelValue=dojo.toPixelValue=_1d0.toPixelValue;dojo.style=function(node,name,_1d4){switch(arguments.length){case 1:return _1d0.get(node);case 2:return _1d0[typeof name=="string"?"get":"set"](node,name);}return _1d0.set(node,name,_1d4);};return dojo;});},"dojo/_base/kernel":function(){define(["../has","./config","require","module"],function(has,_1d5,_1d6,_1d7){var i,p,_1d8={},_1d9={},dojo={config:_1d5,global:this,dijit:_1d8,dojox:_1d9};var _1da={dojo:["dojo",dojo],dijit:["dijit",_1d8],dojox:["dojox",_1d9]},_1db=(_1d6.map&&_1d6.map[_1d7.id.match(/[^\/]+/)[0]]),item;for(p in _1db){if(_1da[p]){_1da[p][0]=_1db[p];}else{_1da[p]=[_1db[p],{}];}}for(p in _1da){item=_1da[p];item[1]._scopeName=item[0];if(!_1d5.noGlobals){this[item[0]]=item[1];}}dojo.scopeMap=_1da;dojo.baseUrl=dojo.config.baseUrl=_1d6.baseUrl;dojo.isAsync=!1||_1d6.async;dojo.locale=_1d5.locale;var rev="$Rev: fd52c96 $".match(/[0-9a-f]{7,}/);dojo.version={major:1,minor:9,patch:3,flag:"",revision:rev?rev[0]:NaN,toString:function(){var v=dojo.version;return v.major+"."+v.minor+"."+v.patch+v.flag+" ("+v.revision+")";}};1||has.add("extend-dojo",1);(Function("d","d.eval = function(){return d.global.eval ? d.global.eval(arguments[0]) : eval(arguments[0]);}"))(dojo);if(0){dojo.exit=function(_1dc){quit(_1dc);};}else{dojo.exit=function(){};}1||has.add("dojo-guarantee-console",1);if(1){typeof console!="undefined"||(console={});var cn=["assert","count","debug","dir","dirxml","error","group","groupEnd","info","profile","profileEnd","time","timeEnd","trace","warn","log"];var tn;i=0;while((tn=cn[i++])){if(!console[tn]){(function(){var tcn=tn+"";console[tcn]=("log" in console)?function(){var a=Array.apply({},arguments);a.unshift(tcn+":");console["log"](a.join(" "));}:function(){};console[tcn]._fake=true;})();}}}has.add("dojo-debug-messages",!!_1d5.isDebug);dojo.deprecated=dojo.experimental=function(){};if(has("dojo-debug-messages")){dojo.deprecated=function(_1dd,_1de,_1df){var _1e0="DEPRECATED: "+_1dd;if(_1de){_1e0+=" "+_1de;}if(_1df){_1e0+=" -- will be removed in version: "+_1df;}console.warn(_1e0);};dojo.experimental=function(_1e1,_1e2){var _1e3="EXPERIMENTAL: "+_1e1+" -- APIs subject to change without notice.";if(_1e2){_1e3+=" "+_1e2;}console.warn(_1e3);};}1||has.add("dojo-modulePaths",1);if(1){if(_1d5.modulePaths){dojo.deprecated("dojo.modulePaths","use paths configuration");var _1e4={};for(p in _1d5.modulePaths){_1e4[p.replace(/\./g,"/")]=_1d5.modulePaths[p];}_1d6({paths:_1e4});}}1||has.add("dojo-moduleUrl",1);if(1){dojo.moduleUrl=function(_1e5,url){dojo.deprecated("dojo.moduleUrl()","use require.toUrl","2.0");var _1e6=null;if(_1e5){_1e6=_1d6.toUrl(_1e5.replace(/\./g,"/")+(url?("/"+url):"")+"/*.*").replace(/\/\*\.\*/,"")+(url?"":"/");}return _1e6;};}dojo._hasResource={};return dojo;});},"dojo/io-query":function(){define(["./_base/lang"],function(lang){var _1e7={};return {objectToQuery:function objectToQuery(map){var enc=encodeURIComponent,_1e8=[];for(var name in map){var _1e9=map[name];if(_1e9!=_1e7[name]){var _1ea=enc(name)+"=";if(lang.isArray(_1e9)){for(var i=0,l=_1e9.length;i<l;++i){_1e8.push(_1ea+enc(_1e9[i]));}}else{_1e8.push(_1ea+enc(_1e9));}}}return _1e8.join("&");},queryToObject:function queryToObject(str){var dec=decodeURIComponent,qp=str.split("&"),ret={},name,val;for(var i=0,l=qp.length,item;i<l;++i){item=qp[i];if(item.length){var s=item.indexOf("=");if(s<0){name=dec(item);val="";}else{name=dec(item.slice(0,s));val=dec(item.slice(s+1));}if(typeof ret[name]=="string"){ret[name]=[ret[name]];}if(lang.isArray(ret[name])){ret[name].push(val);}else{ret[name]=val;}}}return ret;}};});},"dojo/_base/Deferred":function(){define(["./kernel","../Deferred","../promise/Promise","../errors/CancelError","../has","./lang","../when"],function(dojo,_1eb,_1ec,_1ed,has,lang,when){var _1ee=function(){};var _1ef=Object.freeze||function(){};var _1f0=dojo.Deferred=function(_1f1){var _1f2,_1f3,_1f4,_1f5,_1f6,head,_1f7;var _1f8=(this.promise=new _1ec());function _1f9(_1fa){if(_1f3){throw new Error("This deferred has already been resolved");}_1f2=_1fa;_1f3=true;_1fb();};function _1fb(){var _1fc;while(!_1fc&&_1f7){var _1fd=_1f7;_1f7=_1f7.next;if((_1fc=(_1fd.progress==_1ee))){_1f3=false;}var func=(_1f6?_1fd.error:_1fd.resolved);if(has("config-useDeferredInstrumentation")){if(_1f6&&_1eb.instrumentRejected){_1eb.instrumentRejected(_1f2,!!func);}}if(func){try{var _1fe=func(_1f2);if(_1fe&&typeof _1fe.then==="function"){_1fe.then(lang.hitch(_1fd.deferred,"resolve"),lang.hitch(_1fd.deferred,"reject"),lang.hitch(_1fd.deferred,"progress"));continue;}var _1ff=_1fc&&_1fe===undefined;if(_1fc&&!_1ff){_1f6=_1fe instanceof Error;}_1fd.deferred[_1ff&&_1f6?"reject":"resolve"](_1ff?_1f2:_1fe);}catch(e){_1fd.deferred.reject(e);}}else{if(_1f6){_1fd.deferred.reject(_1f2);}else{_1fd.deferred.resolve(_1f2);}}}};this.isResolved=_1f8.isResolved=function(){return _1f5==0;};this.isRejected=_1f8.isRejected=function(){return _1f5==1;};this.isFulfilled=_1f8.isFulfilled=function(){return _1f5>=0;};this.isCanceled=_1f8.isCanceled=function(){return _1f4;};this.resolve=this.callback=function(_200){this.fired=_1f5=0;this.results=[_200,null];_1f9(_200);};this.reject=this.errback=function(_201){_1f6=true;this.fired=_1f5=1;if(has("config-useDeferredInstrumentation")){if(_1eb.instrumentRejected){_1eb.instrumentRejected(_201,!!_1f7);}}_1f9(_201);this.results=[null,_201];};this.progress=function(_202){var _203=_1f7;while(_203){var _204=_203.progress;_204&&_204(_202);_203=_203.next;}};this.addCallbacks=function(_205,_206){this.then(_205,_206,_1ee);return this;};_1f8.then=this.then=function(_207,_208,_209){var _20a=_209==_1ee?this:new _1f0(_1f8.cancel);var _20b={resolved:_207,error:_208,progress:_209,deferred:_20a};if(_1f7){head=head.next=_20b;}else{_1f7=head=_20b;}if(_1f3){_1fb();}return _20a.promise;};var _20c=this;_1f8.cancel=this.cancel=function(){if(!_1f3){var _20d=_1f1&&_1f1(_20c);if(!_1f3){if(!(_20d instanceof Error)){_20d=new _1ed(_20d);}_20d.log=false;_20c.reject(_20d);}}_1f4=true;};_1ef(_1f8);};lang.extend(_1f0,{addCallback:function(_20e){return this.addCallbacks(lang.hitch.apply(dojo,arguments));},addErrback:function(_20f){return this.addCallbacks(null,lang.hitch.apply(dojo,arguments));},addBoth:function(_210){var _211=lang.hitch.apply(dojo,arguments);return this.addCallbacks(_211,_211);},fired:-1});_1f0.when=dojo.when=when;return _1f0;});},"dojo/NodeList-dom":function(){define(["./_base/kernel","./query","./_base/array","./_base/lang","./dom-class","./dom-construct","./dom-geometry","./dom-attr","./dom-style"],function(dojo,_212,_213,lang,_214,_215,_216,_217,_218){var _219=function(a){return a.length==1&&(typeof a[0]=="string");};var _21a=function(node){var p=node.parentNode;if(p){p.removeChild(node);}};var _21b=_212.NodeList,awc=_21b._adaptWithCondition,aafe=_21b._adaptAsForEach,aam=_21b._adaptAsMap;function _21c(_21d){return function(node,name,_21e){if(arguments.length==2){return _21d[typeof name=="string"?"get":"set"](node,name);}return _21d.set(node,name,_21e);};};lang.extend(_21b,{_normalize:function(_21f,_220){var _221=_21f.parse===true;if(typeof _21f.template=="string"){var _222=_21f.templateFunc||(dojo.string&&dojo.string.substitute);_21f=_222?_222(_21f.template,_21f):_21f;}var type=(typeof _21f);if(type=="string"||type=="number"){_21f=_215.toDom(_21f,(_220&&_220.ownerDocument));if(_21f.nodeType==11){_21f=lang._toArray(_21f.childNodes);}else{_21f=[_21f];}}else{if(!lang.isArrayLike(_21f)){_21f=[_21f];}else{if(!lang.isArray(_21f)){_21f=lang._toArray(_21f);}}}if(_221){_21f._runParse=true;}return _21f;},_cloneNode:function(node){return node.cloneNode(true);},_place:function(ary,_223,_224,_225){if(_223.nodeType!=1&&_224=="only"){return;}var _226=_223,_227;var _228=ary.length;for(var i=_228-1;i>=0;i--){var node=(_225?this._cloneNode(ary[i]):ary[i]);if(ary._runParse&&dojo.parser&&dojo.parser.parse){if(!_227){_227=_226.ownerDocument.createElement("div");}_227.appendChild(node);dojo.parser.parse(_227);node=_227.firstChild;while(_227.firstChild){_227.removeChild(_227.firstChild);}}if(i==_228-1){_215.place(node,_226,_224);}else{_226.parentNode.insertBefore(node,_226);}_226=node;}},position:aam(_216.position),attr:awc(_21c(_217),_219),style:awc(_21c(_218),_219),addClass:aafe(_214.add),removeClass:aafe(_214.remove),toggleClass:aafe(_214.toggle),replaceClass:aafe(_214.replace),empty:aafe(_215.empty),removeAttr:aafe(_217.remove),marginBox:aam(_216.getMarginBox),place:function(_229,_22a){var item=_212(_229)[0];return this.forEach(function(node){_215.place(node,item,_22a);});},orphan:function(_22b){return (_22b?_212._filterResult(this,_22b):this).forEach(_21a);},adopt:function(_22c,_22d){return _212(_22c).place(this[0],_22d)._stash(this);},query:function(_22e){if(!_22e){return this;}var ret=new _21b;this.map(function(node){_212(_22e,node).forEach(function(_22f){if(_22f!==undefined){ret.push(_22f);}});});return ret._stash(this);},filter:function(_230){var a=arguments,_231=this,_232=0;if(typeof _230=="string"){_231=_212._filterResult(this,a[0]);if(a.length==1){return _231._stash(this);}_232=1;}return this._wrap(_213.filter(_231,a[_232],a[_232+1]),this);},addContent:function(_233,_234){_233=this._normalize(_233,this[0]);for(var i=0,node;(node=this[i]);i++){if(_233.length){this._place(_233,node,_234,i>0);}else{_215.empty(node);}}return this;}});return _21b;});},"dojo/query":function(){define(["./_base/kernel","./has","./dom","./on","./_base/array","./_base/lang","./selector/_loader","./selector/_loader!default"],function(dojo,has,dom,on,_235,lang,_236,_237){"use strict";has.add("array-extensible",function(){return lang.delegate([],{length:1}).length==1&&!has("bug-for-in-skips-shadowed");});var ap=Array.prototype,aps=ap.slice,apc=ap.concat,_238=_235.forEach;var tnl=function(a,_239,_23a){var _23b=new (_23a||this._NodeListCtor||nl)(a);return _239?_23b._stash(_239):_23b;};var _23c=function(f,a,o){a=[0].concat(aps.call(a,0));o=o||dojo.global;return function(node){a[0]=node;return f.apply(o,a);};};var _23d=function(f,o){return function(){this.forEach(_23c(f,arguments,o));return this;};};var _23e=function(f,o){return function(){return this.map(_23c(f,arguments,o));};};var _23f=function(f,o){return function(){return this.filter(_23c(f,arguments,o));};};var _240=function(f,g,o){return function(){var a=arguments,body=_23c(f,a,o);if(g.call(o||dojo.global,a)){return this.map(body);}this.forEach(body);return this;};};var _241=function(_242){var _243=this instanceof nl&&has("array-extensible");if(typeof _242=="number"){_242=Array(_242);}var _244=(_242&&"length" in _242)?_242:arguments;if(_243||!_244.sort){var _245=_243?this:[],l=_245.length=_244.length;for(var i=0;i<l;i++){_245[i]=_244[i];}if(_243){return _245;}_244=_245;}lang._mixin(_244,nlp);_244._NodeListCtor=function(_246){return nl(_246);};return _244;};var nl=_241,nlp=nl.prototype=has("array-extensible")?[]:{};nl._wrap=nlp._wrap=tnl;nl._adaptAsMap=_23e;nl._adaptAsForEach=_23d;nl._adaptAsFilter=_23f;nl._adaptWithCondition=_240;_238(["slice","splice"],function(name){var f=ap[name];nlp[name]=function(){return this._wrap(f.apply(this,arguments),name=="slice"?this:null);};});_238(["indexOf","lastIndexOf","every","some"],function(name){var f=_235[name];nlp[name]=function(){return f.apply(dojo,[this].concat(aps.call(arguments,0)));};});lang.extend(_241,{constructor:nl,_NodeListCtor:nl,toString:function(){return this.join(",");},_stash:function(_247){this._parent=_247;return this;},on:function(_248,_249){var _24a=this.map(function(node){return on(node,_248,_249);});_24a.remove=function(){for(var i=0;i<_24a.length;i++){_24a[i].remove();}};return _24a;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor(0);}},concat:function(item){var t=aps.call(this,0),m=_235.map(arguments,function(a){return aps.call(a,0);});return this._wrap(apc.apply(t,m),this);},map:function(func,obj){return this._wrap(_235.map(this,func,obj),this);},forEach:function(_24b,_24c){_238(this,_24b,_24c);return this;},filter:function(_24d){var a=arguments,_24e=this,_24f=0;if(typeof _24d=="string"){_24e=_250._filterResult(this,a[0]);if(a.length==1){return _24e._stash(this);}_24f=1;}return this._wrap(_235.filter(_24e,a[_24f],a[_24f+1]),this);},instantiate:function(_251,_252){var c=lang.isFunction(_251)?_251:lang.getObject(_251);_252=_252||{};return this.forEach(function(node){new c(_252,node);});},at:function(){var t=new this._NodeListCtor(0);_238(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});function _253(_254,_255){var _256=function(_257,root){if(typeof root=="string"){root=dom.byId(root);if(!root){return new _255([]);}}var _258=typeof _257=="string"?_254(_257,root):_257?(_257.end&&_257.on)?_257:[_257]:[];if(_258.end&&_258.on){return _258;}return new _255(_258);};_256.matches=_254.match||function(node,_259,root){return _256.filter([node],_259,root).length>0;};_256.filter=_254.filter||function(_25a,_25b,root){return _256(_25b,root).filter(function(node){return _235.indexOf(_25a,node)>-1;});};if(typeof _254!="function"){var _25c=_254.search;_254=function(_25d,root){return _25c(root||document,_25d);};}return _256;};var _250=_253(_237,_241);dojo.query=_253(_237,function(_25e){return _241(_25e);});_250.load=function(id,_25f,_260){_236.load(id,_25f,function(_261){_260(_253(_261,_241));});};dojo._filterQueryResult=_250._filterResult=function(_262,_263,root){return new _241(_250.filter(_262,_263,root));};dojo.NodeList=_250.NodeList=_241;return _250;});},"dojo/has":function(){define(["require","module"],function(_264,_265){var has=_264.has||function(){};if(!1){var _266=typeof window!="undefined"&&typeof location!="undefined"&&typeof document!="undefined"&&window.location==location&&window.document==document,_267=this,doc=_266&&document,_268=doc&&doc.createElement("DiV"),_269=(_265.config&&_265.config())||{};has=function(name){return typeof _269[name]=="function"?(_269[name]=_269[name](_267,doc,_268)):_269[name];};has.cache=_269;has.add=function(name,test,now,_26a){(typeof _269[name]=="undefined"||_26a)&&(_269[name]=test);return now&&has(name);};1||has.add("host-browser",_266);0&&has.add("host-node",(typeof process=="object"&&process.versions&&process.versions.node&&process.versions.v8));0&&has.add("host-rhino",(typeof load=="function"&&(typeof Packages=="function"||typeof Packages=="object")));1||has.add("dom",_266);1||has.add("dojo-dom-ready-api",1);1||has.add("dojo-sniff",1);}if(1){has.add("dom-addeventlistener",!!document.addEventListener);has.add("touch","ontouchstart" in document||window.navigator.msMaxTouchPoints>0);has.add("device-width",screen.availWidth||innerWidth);var form=document.createElement("form");has.add("dom-attributes-explicit",form.attributes.length==0);has.add("dom-attributes-specified-flag",form.attributes.length>0&&form.attributes.length<40);}has.clearElement=function(_26b){_26b.innerHTML="";return _26b;};has.normalize=function(id,_26c){var _26d=id.match(/[\?:]|[^:\?]*/g),i=0,get=function(skip){var term=_26d[i++];if(term==":"){return 0;}else{if(_26d[i++]=="?"){if(!skip&&has(term)){return get();}else{get(true);return get(skip);}}return term||0;}};id=get();return id&&_26c(id);};has.load=function(id,_26e,_26f){if(id){_26e([id],_26f);}else{_26f();}};return has;});},"dojo/_base/loader":function(){define(["./kernel","../has","require","module","../json","./lang","./array"],function(dojo,has,_270,_271,json,lang,_272){if(!1){console.error("cannot load the Dojo v1.x loader with a foreign loader");return 0;}1||has.add("dojo-fast-sync-require",1);var _273=function(id){return {src:_271.id,id:id};},_274=function(name){return name.replace(/\./g,"/");},_275=/\/\/>>built/,_276=[],_277=[],_278=function(mid,_279,_27a){_276.push(_27a);_272.forEach(mid.split(","),function(mid){var _27b=_27c(mid,_279.module);_277.push(_27b);_27d(_27b);});_27e();},_27e=(1?function(){var _27f,mid;for(mid in _280){_27f=_280[mid];if(_27f.noReqPluginCheck===undefined){_27f.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(!_27f.executed&&!_27f.noReqPluginCheck&&_27f.injected==_281){return;}}_282(function(){var _283=_276;_276=[];_272.forEach(_283,function(cb){cb(1);});});}:(function(){var _284,_285=function(m){_284[m.mid]=1;for(var t,_286,deps=m.deps||[],i=0;i<deps.length;i++){_286=deps[i];if(!(t=_284[_286.mid])){if(t===0||!_285(_286)){_284[m.mid]=0;return false;}}}return true;};return function(){var _287,mid;_284={};for(mid in _280){_287=_280[mid];if(_287.executed||_287.noReqPluginCheck){_284[mid]=1;}else{if(_287.noReqPluginCheck!==0){_287.noReqPluginCheck=/loadInit\!/.test(mid)||/require\!/.test(mid)?1:0;}if(_287.noReqPluginCheck){_284[mid]=1;}else{if(_287.injected!==_2b3){_284[mid]=0;}}}}for(var t,i=0,end=_277.length;i<end;i++){_287=_277[i];if(!(t=_284[_287.mid])){if(t===0||!_285(_287)){return;}}}_282(function(){var _288=_276;_276=[];_272.forEach(_288,function(cb){cb(1);});});};})()),_289=function(mid,_28a,_28b){_28a([mid],function(_28c){_28a(_28c.names,function(){for(var _28d="",args=[],i=0;i<arguments.length;i++){_28d+="var "+_28c.names[i]+"= arguments["+i+"]; ";args.push(arguments[i]);}eval(_28d);var _28e=_28a.module,_28f=[],_290,_291={provide:function(_292){_292=_274(_292);var _293=_27c(_292,_28e);if(_293!==_28e){_2b9(_293);}},require:function(_294,_295){_294=_274(_294);_295&&(_27c(_294,_28e).result=_2b4);_28f.push(_294);},requireLocalization:function(_296,_297,_298){if(!_290){_290=["dojo/i18n"];}_298=(_298||dojo.locale).toLowerCase();_296=_274(_296)+"/nls/"+(/root/i.test(_298)?"":_298+"/")+_274(_297);if(_27c(_296,_28e).isXd){_290.push("dojo/i18n!"+_296);}},loadInit:function(f){f();}},hold={},p;try{for(p in _291){hold[p]=dojo[p];dojo[p]=_291[p];}_28c.def.apply(null,args);}catch(e){_299("error",[_273("failedDojoLoadInit"),e]);}finally{for(p in _291){dojo[p]=hold[p];}}if(_290){_28f=_28f.concat(_290);}if(_28f.length){_278(_28f.join(","),_28a,_28b);}else{_28b();}});});},_29a=function(text,_29b,_29c){var _29d=/\(|\)/g,_29e=1,_29f;_29d.lastIndex=_29b;while((_29f=_29d.exec(text))){if(_29f[0]==")"){_29e-=1;}else{_29e+=1;}if(_29e==0){break;}}if(_29e!=0){throw "unmatched paren around character "+_29d.lastIndex+" in: "+text;}return [dojo.trim(text.substring(_29c,_29d.lastIndex))+";\n",_29d.lastIndex];},_2a0=/(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg,_2a1=/(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg,_2a2=/(^|\s)(require|define)\s*\(/m,_2a3=function(text,_2a4){var _2a5,_2a6,_2a7,_2a8,_2a9=[],_2aa=[],_2ab=[];_2a4=_2a4||text.replace(_2a0,function(_2ac){_2a1.lastIndex=_2a2.lastIndex=0;return (_2a1.test(_2ac)||_2a2.test(_2ac))?"":_2ac;});while((_2a5=_2a1.exec(_2a4))){_2a6=_2a1.lastIndex;_2a7=_2a6-_2a5[0].length;_2a8=_29a(_2a4,_2a6,_2a7);if(_2a5[2]=="loadInit"){_2a9.push(_2a8[0]);}else{_2aa.push(_2a8[0]);}_2a1.lastIndex=_2a8[1];}_2ab=_2a9.concat(_2aa);if(_2ab.length||!_2a2.test(_2a4)){return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g,"\n0 && dojo.loadInit("),_2ab.join(""),_2ab];}else{return 0;}},_2ad=function(_2ae,text){var _2af,id,_2b0=[],_2b1=[];if(_275.test(text)||!(_2af=_2a3(text))){return 0;}id=_2ae.mid+"-*loadInit";for(var p in _27c("dojo",_2ae).result.scopeMap){_2b0.push(p);_2b1.push("\""+p+"\"");}return "// xdomain rewrite of "+_2ae.mid+"\n"+"define('"+id+"',{\n"+"\tnames:"+json.stringify(_2b0)+",\n"+"\tdef:function("+_2b0.join(",")+"){"+_2af[1]+"}"+"});\n\n"+"define("+json.stringify(_2b0.concat(["dojo/loadInit!"+id]))+", function("+_2b0.join(",")+"){\n"+_2af[0]+"});";},_2b2=_270.initSyncLoader(_278,_27e,_2ad),sync=_2b2.sync,_281=_2b2.requested,_2b3=_2b2.arrived,_2b4=_2b2.nonmodule,_2b5=_2b2.executing,_2b6=_2b2.executed,_2b7=_2b2.syncExecStack,_280=_2b2.modules,_2b8=_2b2.execQ,_27c=_2b2.getModule,_27d=_2b2.injectModule,_2b9=_2b2.setArrived,_299=_2b2.signal,_2ba=_2b2.finishExec,_2bb=_2b2.execModule,_2bc=_2b2.getLegacyMode,_282=_2b2.guardCheckComplete;_278=_2b2.dojoRequirePlugin;dojo.provide=function(mid){var _2bd=_2b7[0],_2be=lang.mixin(_27c(_274(mid),_270.module),{executed:_2b5,result:lang.getObject(mid,true)});_2b9(_2be);if(_2bd){(_2bd.provides||(_2bd.provides=[])).push(function(){_2be.result=lang.getObject(mid);delete _2be.provides;_2be.executed!==_2b6&&_2ba(_2be);});}return _2be.result;};has.add("config-publishRequireResult",1,0,0);dojo.require=function(_2bf,_2c0){function _2c1(mid,_2c2){var _2c3=_27c(_274(mid),_270.module);if(_2b7.length&&_2b7[0].finish){_2b7[0].finish.push(mid);return undefined;}if(_2c3.executed){return _2c3.result;}_2c2&&(_2c3.result=_2b4);var _2c4=_2bc();_27d(_2c3);_2c4=_2bc();if(_2c3.executed!==_2b6&&_2c3.injected===_2b3){_2b2.guardCheckComplete(function(){_2bb(_2c3);});}if(_2c3.executed){return _2c3.result;}if(_2c4==sync){if(_2c3.cjs){_2b8.unshift(_2c3);}else{_2b7.length&&(_2b7[0].finish=[mid]);}}else{_2b8.push(_2c3);}return undefined;};var _2c5=_2c1(_2bf,_2c0);if(has("config-publishRequireResult")&&!lang.exists(_2bf)&&_2c5!==undefined){lang.setObject(_2bf,_2c5);}return _2c5;};dojo.loadInit=function(f){f();};dojo.registerModulePath=function(_2c6,_2c7){var _2c8={};_2c8[_2c6.replace(/\./g,"/")]=_2c7;_270({paths:_2c8});};dojo.platformRequire=function(_2c9){var _2ca=(_2c9.common||[]).concat(_2c9[dojo._name]||_2c9["default"]||[]),temp;while(_2ca.length){if(lang.isArray(temp=_2ca.shift())){dojo.require.apply(dojo,temp);}else{dojo.require(temp);}}};dojo.requireIf=dojo.requireAfterIf=function(_2cb,_2cc,_2cd){if(_2cb){dojo.require(_2cc,_2cd);}};dojo.requireLocalization=function(_2ce,_2cf,_2d0){_270(["../i18n"],function(i18n){i18n.getLocalization(_2ce,_2cf,_2d0);});};return {extractLegacyApiApplications:_2a3,require:_278,loadInit:_289};});},"dojo/json":function(){define(["./has"],function(has){"use strict";var _2d1=typeof JSON!="undefined";has.add("json-parse",_2d1);has.add("json-stringify",_2d1&&JSON.stringify({a:0},function(k,v){return v||1;})=="{\"a\":1}");if(has("json-stringify")){return JSON;}else{var _2d2=function(str){return ("\""+str.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};return {parse:has("json-parse")?JSON.parse:function(str,_2d3){if(_2d3&&!/^([\s\[\{]*(?:"(?:\\.|[^"])*"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){throw new SyntaxError("Invalid characters in JSON");}return eval("("+str+")");},stringify:function(_2d4,_2d5,_2d6){var _2d7;if(typeof _2d5=="string"){_2d6=_2d5;_2d5=null;}function _2d8(it,_2d9,key){if(_2d5){it=_2d5(key,it);}var val,_2da=typeof it;if(_2da=="number"){return isFinite(it)?it+"":"null";}if(_2da=="boolean"){return it+"";}if(it===null){return "null";}if(typeof it=="string"){return _2d2(it);}if(_2da=="function"||_2da=="undefined"){return _2d7;}if(typeof it.toJSON=="function"){return _2d8(it.toJSON(key),_2d9,key);}if(it instanceof Date){return "\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"".replace(/\{(\w+)(\+)?\}/g,function(t,prop,plus){var num=it["getUTC"+prop]()+(plus?1:0);return num<10?"0"+num:num;});}if(it.valueOf()!==it){return _2d8(it.valueOf(),_2d9,key);}var _2db=_2d6?(_2d9+_2d6):"";var sep=_2d6?" ":"";var _2dc=_2d6?"\n":"";if(it instanceof Array){var itl=it.length,res=[];for(key=0;key<itl;key++){var obj=it[key];val=_2d8(obj,_2db,key);if(typeof val!="string"){val="null";}res.push(_2dc+_2db+val);}return "["+res.join(",")+_2dc+_2d9+"]";}var _2dd=[];for(key in it){var _2de;if(it.hasOwnProperty(key)){if(typeof key=="number"){_2de="\""+key+"\"";}else{if(typeof key=="string"){_2de=_2d2(key);}else{continue;}}val=_2d8(it[key],_2db,key);if(typeof val!="string"){continue;}_2dd.push(_2dc+_2db+_2de+":"+sep+val);}}return "{"+_2dd.join(",")+_2dc+_2d9+"}";};return _2d8(_2d4,"","");}};}});},"dojo/_base/declare":function(){define(["./kernel","../has","./lang"],function(dojo,has,lang){var mix=lang.mixin,op=Object.prototype,opts=op.toString,xtor=new Function,_2df=0,_2e0="constructor";function err(msg,cls){throw new Error("declare"+(cls?" "+cls:"")+": "+msg);};function _2e1(_2e2,_2e3){var _2e4=[],_2e5=[{cls:0,refs:[]}],_2e6={},_2e7=1,l=_2e2.length,i=0,j,lin,base,top,_2e8,rec,name,refs;for(;i<l;++i){base=_2e2[i];if(!base){err("mixin #"+i+" is unknown. Did you use dojo.require to pull it in?",_2e3);}else{if(opts.call(base)!="[object Function]"){err("mixin #"+i+" is not a callable constructor.",_2e3);}}lin=base._meta?base._meta.bases:[base];top=0;for(j=lin.length-1;j>=0;--j){_2e8=lin[j].prototype;if(!_2e8.hasOwnProperty("declaredClass")){_2e8.declaredClass="uniqName_"+(_2df++);}name=_2e8.declaredClass;if(!_2e6.hasOwnProperty(name)){_2e6[name]={count:0,refs:[],cls:lin[j]};++_2e7;}rec=_2e6[name];if(top&&top!==rec){rec.refs.push(top);++top.count;}top=rec;}++top.count;_2e5[0].refs.push(top);}while(_2e5.length){top=_2e5.pop();_2e4.push(top.cls);--_2e7;while(refs=top.refs,refs.length==1){top=refs[0];if(!top||--top.count){top=0;break;}_2e4.push(top.cls);--_2e7;}if(top){for(i=0,l=refs.length;i<l;++i){top=refs[i];if(!--top.count){_2e5.push(top);}}}}if(_2e7){err("can't build consistent linearization",_2e3);}base=_2e2[0];_2e4[0]=base?base._meta&&base===_2e4[_2e4.length-base._meta.bases.length]?base._meta.bases.length:1:0;return _2e4;};function _2e9(args,a,f){var name,_2ea,_2eb,_2ec,meta,base,_2ed,opf,pos,_2ee=this._inherited=this._inherited||{};if(typeof args=="string"){name=args;args=a;a=f;}f=0;_2ec=args.callee;name=name||_2ec.nom;if(!name){err("can't deduce a name to call inherited()",this.declaredClass);}meta=this.constructor._meta;_2eb=meta.bases;pos=_2ee.p;if(name!=_2e0){if(_2ee.c!==_2ec){pos=0;base=_2eb[0];meta=base._meta;if(meta.hidden[name]!==_2ec){_2ea=meta.chains;if(_2ea&&typeof _2ea[name]=="string"){err("calling chained method with inherited: "+name,this.declaredClass);}do{meta=base._meta;_2ed=base.prototype;if(meta&&(_2ed[name]===_2ec&&_2ed.hasOwnProperty(name)||meta.hidden[name]===_2ec)){break;}}while(base=_2eb[++pos]);pos=base?pos:-1;}}base=_2eb[++pos];if(base){_2ed=base.prototype;if(base._meta&&_2ed.hasOwnProperty(name)){f=_2ed[name];}else{opf=op[name];do{_2ed=base.prototype;f=_2ed[name];if(f&&(base._meta?_2ed.hasOwnProperty(name):f!==opf)){break;}}while(base=_2eb[++pos]);}}f=base&&f||op[name];}else{if(_2ee.c!==_2ec){pos=0;meta=_2eb[0]._meta;if(meta&&meta.ctor!==_2ec){_2ea=meta.chains;if(!_2ea||_2ea.constructor!=="manual"){err("calling chained constructor with inherited",this.declaredClass);}while(base=_2eb[++pos]){meta=base._meta;if(meta&&meta.ctor===_2ec){break;}}pos=base?pos:-1;}}while(base=_2eb[++pos]){meta=base._meta;f=meta?meta.ctor:base;if(f){break;}}f=base&&f;}_2ee.c=f;_2ee.p=pos;if(f){return a===true?f:f.apply(this,a||args);}};function _2ef(name,args){if(typeof name=="string"){return this.__inherited(name,args,true);}return this.__inherited(name,true);};function _2f0(args,a1,a2){var f=this.getInherited(args,a1);if(f){return f.apply(this,a2||a1||args);}};var _2f1=dojo.config.isDebug?_2f0:_2e9;function _2f2(cls){var _2f3=this.constructor._meta.bases;for(var i=0,l=_2f3.length;i<l;++i){if(_2f3[i]===cls){return true;}}return this instanceof cls;};function _2f4(_2f5,_2f6){for(var name in _2f6){if(name!=_2e0&&_2f6.hasOwnProperty(name)){_2f5[name]=_2f6[name];}}if(has("bug-for-in-skips-shadowed")){for(var _2f7=lang._extraNames,i=_2f7.length;i;){name=_2f7[--i];if(name!=_2e0&&_2f6.hasOwnProperty(name)){_2f5[name]=_2f6[name];}}}};function _2f8(_2f9,_2fa){var name,t;for(name in _2fa){t=_2fa[name];if((t!==op[name]||!(name in op))&&name!=_2e0){if(opts.call(t)=="[object Function]"){t.nom=name;}_2f9[name]=t;}}if(has("bug-for-in-skips-shadowed")){for(var _2fb=lang._extraNames,i=_2fb.length;i;){name=_2fb[--i];t=_2fa[name];if((t!==op[name]||!(name in op))&&name!=_2e0){if(opts.call(t)=="[object Function]"){t.nom=name;}_2f9[name]=t;}}}return _2f9;};function _2fc(_2fd){_2fe.safeMixin(this.prototype,_2fd);return this;};function _2ff(_300,_301){return _2fe([this].concat(_300),_301||{});};function _302(_303,_304){return function(){var a=arguments,args=a,a0=a[0],f,i,m,l=_303.length,_305;if(!(this instanceof a.callee)){return _306(a);}if(_304&&(a0&&a0.preamble||this.preamble)){_305=new Array(_303.length);_305[0]=a;for(i=0;;){a0=a[0];if(a0){f=a0.preamble;if(f){a=f.apply(this,a)||a;}}f=_303[i].prototype;f=f.hasOwnProperty("preamble")&&f.preamble;if(f){a=f.apply(this,a)||a;}if(++i==l){break;}_305[i]=a;}}for(i=l-1;i>=0;--i){f=_303[i];m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,_305?_305[i]:a);}}f=this.postscript;if(f){f.apply(this,args);}};};function _307(ctor,_308){return function(){var a=arguments,t=a,a0=a[0],f;if(!(this instanceof a.callee)){return _306(a);}if(_308){if(a0){f=a0.preamble;if(f){t=f.apply(this,t)||t;}}f=this.preamble;if(f){f.apply(this,t);}}if(ctor){ctor.apply(this,a);}f=this.postscript;if(f){f.apply(this,a);}};};function _309(_30a){return function(){var a=arguments,i=0,f,m;if(!(this instanceof a.callee)){return _306(a);}for(;f=_30a[i];++i){m=f._meta;f=m?m.ctor:f;if(f){f.apply(this,a);break;}}f=this.postscript;if(f){f.apply(this,a);}};};function _30b(name,_30c,_30d){return function(){var b,m,f,i=0,step=1;if(_30d){i=_30c.length-1;step=-1;}for(;b=_30c[i];i+=step){m=b._meta;f=(m?m.hidden:b.prototype)[name];if(f){f.apply(this,arguments);}}};};function _30e(ctor){xtor.prototype=ctor.prototype;var t=new xtor;xtor.prototype=null;return t;};function _306(args){var ctor=args.callee,t=_30e(ctor);ctor.apply(t,args);return t;};function _2fe(_30f,_310,_311){if(typeof _30f!="string"){_311=_310;_310=_30f;_30f="";}_311=_311||{};var _312,i,t,ctor,name,_313,_314,_315=1,_316=_310;if(opts.call(_310)=="[object Array]"){_313=_2e1(_310,_30f);t=_313[0];_315=_313.length-t;_310=_313[_315];}else{_313=[0];if(_310){if(opts.call(_310)=="[object Function]"){t=_310._meta;_313=_313.concat(t?t.bases:_310);}else{err("base class is not a callable constructor.",_30f);}}else{if(_310!==null){err("unknown base class. Did you use dojo.require to pull it in?",_30f);}}}if(_310){for(i=_315-1;;--i){_312=_30e(_310);if(!i){break;}t=_313[i];(t._meta?_2f4:mix)(_312,t.prototype);ctor=new Function;ctor.superclass=_310;ctor.prototype=_312;_310=_312.constructor=ctor;}}else{_312={};}_2fe.safeMixin(_312,_311);t=_311.constructor;if(t!==op.constructor){t.nom=_2e0;_312.constructor=t;}for(i=_315-1;i;--i){t=_313[i]._meta;if(t&&t.chains){_314=mix(_314||{},t.chains);}}if(_312["-chains-"]){_314=mix(_314||{},_312["-chains-"]);}t=!_314||!_314.hasOwnProperty(_2e0);_313[0]=ctor=(_314&&_314.constructor==="manual")?_309(_313):(_313.length==1?_307(_311.constructor,t):_302(_313,t));ctor._meta={bases:_313,hidden:_311,chains:_314,parents:_316,ctor:_311.constructor};ctor.superclass=_310&&_310.prototype;ctor.extend=_2fc;ctor.createSubclass=_2ff;ctor.prototype=_312;_312.constructor=ctor;_312.getInherited=_2ef;_312.isInstanceOf=_2f2;_312.inherited=_2f1;_312.__inherited=_2e9;if(_30f){_312.declaredClass=_30f;lang.setObject(_30f,ctor);}if(_314){for(name in _314){if(_312[name]&&typeof _314[name]=="string"&&name!=_2e0){t=_312[name]=_30b(name,_313,_314[name]==="after");t.nom=name;}}}return ctor;};dojo.safeMixin=_2fe.safeMixin=_2f8;dojo.declare=_2fe;return _2fe;});},"dojo/dom":function(){define(["./sniff","./_base/window"],function(has,win){if(has("ie")<=7){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}}var dom={};if(has("ie")){dom.byId=function(id,doc){if(typeof id!="string"){return id;}var _317=doc||win.doc,te=id&&_317.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var eles=_317.all[id];if(!eles||eles.nodeName){eles=[eles];}var i=0;while((te=eles[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{dom.byId=function(id,doc){return ((typeof id=="string")?(doc||win.doc).getElementById(id):id)||null;};}dom.isDescendant=function(node,_318){try{node=dom.byId(node);_318=dom.byId(_318);while(node){if(node==_318){return true;}node=node.parentNode;}}catch(e){}return false;};has.add("css-user-select",function(_319,doc,_31a){if(!_31a){return false;}var _31b=_31a.style;var _31c=["Khtml","O","ms","Moz","Webkit"],i=_31c.length,name="userSelect",_31d;do{if(typeof _31b[name]!=="undefined"){return name;}}while(i--&&(name=_31c[i]+"UserSelect"));return false;});var _31e=has("css-user-select");dom.setSelectable=_31e?function(node,_31f){dom.byId(node).style[_31e]=_31f?"":"none";}:function(node,_320){node=dom.byId(node);var _321=node.getElementsByTagName("*"),i=_321.length;if(_320){node.removeAttribute("unselectable");while(i--){_321[i].removeAttribute("unselectable");}}else{node.setAttribute("unselectable","on");while(i--){_321[i].setAttribute("unselectable","on");}}};return dom;});},"dojo/_base/browser":function(){if(require.has){require.has.add("config-selectorEngine","acme");}define(["../ready","./kernel","./connect","./unload","./window","./event","./html","./NodeList","../query","./xhr","./fx"],function(dojo){return dojo;});},"dojo/selector/acme":function(){define(["../dom","../sniff","../_base/array","../_base/lang","../_base/window"],function(dom,has,_322,lang,win){var trim=lang.trim;var each=_322.forEach;var _323=function(){return win.doc;};var _324=(_323().compatMode)=="BackCompat";var _325=">~+";var _326=false;var _327=function(){return true;};var _328=function(_329){if(_325.indexOf(_329.slice(-1))>=0){_329+=" * ";}else{_329+=" ";}var ts=function(s,e){return trim(_329.slice(s,e));};var _32a=[];var _32b=-1,_32c=-1,_32d=-1,_32e=-1,_32f=-1,inId=-1,_330=-1,_331,lc="",cc="",_332;var x=0,ql=_329.length,_333=null,_334=null;var _335=function(){if(_330>=0){var tv=(_330==x)?null:ts(_330,x);_333[(_325.indexOf(tv)<0)?"tag":"oper"]=tv;_330=-1;}};var _336=function(){if(inId>=0){_333.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _337=function(){if(_32f>=0){_333.classes.push(ts(_32f+1,x).replace(/\\/g,""));_32f=-1;}};var _338=function(){_336();_335();_337();};var _339=function(){_338();if(_32e>=0){_333.pseudos.push({name:ts(_32e+1,x)});}_333.loops=(_333.pseudos.length||_333.attrs.length||_333.classes.length);_333.oquery=_333.query=ts(_332,x);_333.otag=_333.tag=(_333["oper"])?null:(_333.tag||"*");if(_333.tag){_333.tag=_333.tag.toUpperCase();}if(_32a.length&&(_32a[_32a.length-1].oper)){_333.infixOper=_32a.pop();_333.query=_333.infixOper.query+" "+_333.query;}_32a.push(_333);_333=null;};for(;lc=cc,cc=_329.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_333){_332=x;_333={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return _326?this.otag:this.tag;}};_330=x;}if(_331){if(cc==_331){_331=null;}continue;}else{if(cc=="'"||cc=="\""){_331=cc;continue;}}if(_32b>=0){if(cc=="]"){if(!_334.attr){_334.attr=ts(_32b+1,x);}else{_334.matchFor=ts((_32d||_32b+1),x);}var cmf=_334.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_334.matchFor=cmf.slice(1,-1);}}if(_334.matchFor){_334.matchFor=_334.matchFor.replace(/\\/g,"");}_333.attrs.push(_334);_334=null;_32b=_32d=-1;}else{if(cc=="="){var _33a=("|~^$*".indexOf(lc)>=0)?lc:"";_334.type=_33a+cc;_334.attr=ts(_32b+1,x-_33a.length);_32d=x+1;}}}else{if(_32c>=0){if(cc==")"){if(_32e>=0){_334.value=ts(_32c+1,x);}_32e=_32c=-1;}}else{if(cc=="#"){_338();inId=x+1;}else{if(cc=="."){_338();_32f=x;}else{if(cc==":"){_338();_32e=x;}else{if(cc=="["){_338();_32b=x;_334={};}else{if(cc=="("){if(_32e>=0){_334={name:ts(_32e+1,x),value:null};_333.pseudos.push(_334);}_32c=x;}else{if((cc==" ")&&(lc!=cc)){_339();}}}}}}}}}return _32a;};var _33b=function(_33c,_33d){if(!_33c){return _33d;}if(!_33d){return _33c;}return function(){return _33c.apply(window,arguments)&&_33d.apply(window,arguments);};};var _33e=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _33f=function(n){return (1==n.nodeType);};var _340="";var _341=function(elem,attr){if(!elem){return _340;}if(attr=="class"){return elem.className||_340;}if(attr=="for"){return elem.htmlFor||_340;}if(attr=="style"){return elem.style.cssText||_340;}return (_326?elem.getAttribute(attr):elem.getAttribute(attr,2))||_340;};var _342={"*=":function(attr,_343){return function(elem){return (_341(elem,attr).indexOf(_343)>=0);};},"^=":function(attr,_344){return function(elem){return (_341(elem,attr).indexOf(_344)==0);};},"$=":function(attr,_345){return function(elem){var ea=" "+_341(elem,attr);var _346=ea.lastIndexOf(_345);return _346>-1&&(_346==(ea.length-_345.length));};},"~=":function(attr,_347){var tval=" "+_347+" ";return function(elem){var ea=" "+_341(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_348){var _349=_348+"-";return function(elem){var ea=_341(elem,attr);return ((ea==_348)||(ea.indexOf(_349)==0));};},"=":function(attr,_34a){return function(elem){return (_341(elem,attr)==_34a);};}};var _34b=(typeof _323().firstChild.nextElementSibling=="undefined");var _34c=!_34b?"nextElementSibling":"nextSibling";var _34d=!_34b?"previousElementSibling":"previousSibling";var _34e=(_34b?_33f:_327);var _34f=function(node){while(node=node[_34d]){if(_34e(node)){return false;}}return true;};var _350=function(node){while(node=node[_34c]){if(_34e(node)){return false;}}return true;};var _351=function(node){var root=node.parentNode;root=root.nodeType!=7?root:root.nextSibling;var i=0,tret=root.children||root.childNodes,ci=(node["_i"]||node.getAttribute("_i")||-1),cl=(root["_l"]||(typeof root.getAttribute!=="undefined"?root.getAttribute("_l"):-1));if(!tret){return -1;}var l=tret.length;if(cl==l&&ci>=0&&cl>=0){return ci;}if(has("ie")&&typeof root.setAttribute!=="undefined"){root.setAttribute("_l",l);}else{root["_l"]=l;}ci=-1;for(var te=root["firstElementChild"]||root["firstChild"];te;te=te[_34c]){if(_34e(te)){if(has("ie")){te.setAttribute("_i",++i);}else{te["_i"]=++i;}if(node===te){ci=i;}}}return ci;};var _352=function(elem){return !((_351(elem))%2);};var _353=function(elem){return ((_351(elem))%2);};var _354={"checked":function(name,_355){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"disabled":function(name,_356){return function(elem){return elem.disabled;};},"enabled":function(name,_357){return function(elem){return !elem.disabled;};},"first-child":function(){return _34f;},"last-child":function(){return _350;},"only-child":function(name,_358){return function(node){return _34f(node)&&_350(node);};},"empty":function(name,_359){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(name,_35a){var cz=_35a.charAt(0);if(cz=="\""||cz=="'"){_35a=_35a.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_35a)>=0);};},"not":function(name,_35b){var p=_328(_35b)[0];var _35c={el:1};if(p.tag!="*"){_35c.tag=1;}if(!p.classes.length){_35c.classes=1;}var ntf=_35d(p,_35c);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_35e){var pi=parseInt;if(_35e=="odd"){return _353;}else{if(_35e=="even"){return _352;}}if(_35e.indexOf("n")!=-1){var _35f=_35e.split("n",2);var pred=_35f[0]?((_35f[0]=="-")?-1:pi(_35f[0])):1;var idx=_35f[1]?pi(_35f[1]):0;var lb=0,ub=-1;if(pred>0){if(idx<0){idx=(idx%pred)&&(pred+(idx%pred));}else{if(idx>0){if(idx>=pred){lb=idx-idx%pred;}idx=idx%pred;}}}else{if(pred<0){pred*=-1;if(idx>0){ub=idx;idx=idx%pred;}}}if(pred>0){return function(elem){var i=_351(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_35e=idx;}}var _360=pi(_35e);return function(elem){return (_351(elem)==_360);};}};var _361=(has("ie")<9||has("ie")==9&&has("quirks"))?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_326?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _35d=function(_362,_363){if(!_362){return _327;}_363=_363||{};var ff=null;if(!("el" in _363)){ff=_33b(ff,_33f);}if(!("tag" in _363)){if(_362.tag!="*"){ff=_33b(ff,function(elem){return (elem&&((_326?elem.tagName:elem.tagName.toUpperCase())==_362.getTag()));});}}if(!("classes" in _363)){each(_362.classes,function(_364,idx,arr){var re=new RegExp("(?:^|\\s)"+_364+"(?:\\s|$)");ff=_33b(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _363)){each(_362.pseudos,function(_365){var pn=_365.name;if(_354[pn]){ff=_33b(ff,_354[pn](pn,_365.value));}});}if(!("attrs" in _363)){each(_362.attrs,function(attr){var _366;var a=attr.attr;if(attr.type&&_342[attr.type]){_366=_342[attr.type](a,attr.matchFor);}else{if(a.length){_366=_361(a);}}if(_366){ff=_33b(ff,_366);}});}if(!("id" in _363)){if(_362.id){ff=_33b(ff,function(elem){return (!!elem&&(elem.id==_362.id));});}}if(!ff){if(!("default" in _363)){ff=_327;}}return ff;};var _367=function(_368){return function(node,ret,bag){while(node=node[_34c]){if(_34b&&(!_33f(node))){continue;}if((!bag||_369(node,bag))&&_368(node)){ret.push(node);}break;}return ret;};};var _36a=function(_36b){return function(root,ret,bag){var te=root[_34c];while(te){if(_34e(te)){if(bag&&!_369(te,bag)){break;}if(_36b(te)){ret.push(te);}}te=te[_34c];}return ret;};};var _36c=function(_36d){_36d=_36d||_327;return function(root,ret,bag){var te,x=0,tret=root.children||root.childNodes;while(te=tret[x++]){if(_34e(te)&&(!bag||_369(te,bag))&&(_36d(te,x))){ret.push(te);}}return ret;};};var _36e=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _36f={};var _370=function(_371){var _372=_36f[_371.query];if(_372){return _372;}var io=_371.infixOper;var oper=(io?io.oper:"");var _373=_35d(_371,{el:1});var qt=_371.tag;var _374=("*"==qt);var ecs=_323()["getElementsByClassName"];if(!oper){if(_371.id){_373=(!_371.loops&&_374)?_327:_35d(_371,{el:1,id:1});_372=function(root,arr){var te=dom.byId(_371.id,(root.ownerDocument||root));if(!te||!_373(te)){return;}if(9==root.nodeType){return _33e(te,arr);}else{if(_36e(te,root)){return _33e(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_371.classes.length&&!_324){_373=_35d(_371,{el:1,classes:1,id:1});var _375=_371.classes.join(" ");_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tret=root.getElementsByClassName(_375);while((te=tret[x++])){if(_373(te,root)&&_369(te,bag)){ret.push(te);}}return ret;};}else{if(!_374&&!_371.loops){_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tag=_371.getTag(),tret=tag?root.getElementsByTagName(tag):[];while((te=tret[x++])){if(_369(te,bag)){ret.push(te);}}return ret;};}else{_373=_35d(_371,{el:1,tag:1,id:1});_372=function(root,arr,bag){var ret=_33e(0,arr),te,x=0;var tag=_371.getTag(),tret=tag?root.getElementsByTagName(tag):[];while((te=tret[x++])){if(_373(te,root)&&_369(te,bag)){ret.push(te);}}return ret;};}}}}else{var _376={el:1};if(_374){_376.tag=1;}_373=_35d(_371,_376);if("+"==oper){_372=_367(_373);}else{if("~"==oper){_372=_36a(_373);}else{if(">"==oper){_372=_36c(_373);}}}}return _36f[_371.query]=_372;};var _377=function(root,_378){var _379=_33e(root),qp,x,te,qpl=_378.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_378[i];x=_379.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_370(qp);for(var j=0;(te=_379[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_379=ret;}return ret;};var _37a={},_37b={};var _37c=function(_37d){var _37e=_328(trim(_37d));if(_37e.length==1){var tef=_370(_37e[0]);return function(root){var r=tef(root,[]);if(r){r.nozip=true;}return r;};}return function(root){return _377(root,_37e);};};var _37f=has("ie")?"commentStrip":"nozip";var qsa="querySelectorAll";var _380=!!_323()[qsa];var _381=/\\[>~+]|n\+\d|([^ \\])?([>~+])([^ =])?/g;var _382=function(_383,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_383;};var _384=/([^[]*)([^\]]*])?/g;var _385=function(_386,_387,att){return _387.replace(_381,_382)+(att||"");};var _388=function(_389,_38a){_389=_389.replace(_384,_385);if(_380){var _38b=_37b[_389];if(_38b&&!_38a){return _38b;}}var _38c=_37a[_389];if(_38c){return _38c;}var qcz=_389.charAt(0);var _38d=(-1==_389.indexOf(" "));if((_389.indexOf("#")>=0)&&(_38d)){_38a=true;}var _38e=(_380&&(!_38a)&&(_325.indexOf(qcz)==-1)&&(!has("ie")||(_389.indexOf(":")==-1))&&(!(_324&&(_389.indexOf(".")>=0)))&&(_389.indexOf(":contains")==-1)&&(_389.indexOf(":checked")==-1)&&(_389.indexOf("|=")==-1));if(_38e){var tq=(_325.indexOf(_389.charAt(_389.length-1))>=0)?(_389+" *"):_389;return _37b[_389]=function(root){try{if(!((9==root.nodeType)||_38d)){throw "";}var r=root[qsa](tq);r[_37f]=true;return r;}catch(e){return _388(_389,true)(root);}};}else{var _38f=_389.match(/([^\s,](?:"(?:\\.|[^"])+"|'(?:\\.|[^'])+'|[^,])*)/g);return _37a[_389]=((_38f.length<2)?_37c(_389):function(root){var _390=0,ret=[],tp;while((tp=_38f[_390++])){ret=ret.concat(_37c(tp)(root));}return ret;});}};var _391=0;var _392=has("ie")?function(node){if(_326){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_391)||_391);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_391));};var _369=function(node,bag){if(!bag){return 1;}var id=_392(node);if(!bag[id]){return bag[id]=1;}return 0;};var _393="_zipIdx";var _394=function(arr){if(arr&&arr.nozip){return arr;}if(!arr||!arr.length){return [];}if(arr.length<2){return [arr[0]];}var ret=[];_391++;var x,te;if(has("ie")&&_326){var _395=_391+"";for(x=0;x<arr.length;x++){if((te=arr[x])&&te.getAttribute(_393)!=_395){ret.push(te);te.setAttribute(_393,_395);}}}else{if(has("ie")&&arr.commentStrip){try{for(x=0;x<arr.length;x++){if((te=arr[x])&&_33f(te)){ret.push(te);}}}catch(e){}}else{for(x=0;x<arr.length;x++){if((te=arr[x])&&te[_393]!=_391){ret.push(te);te[_393]=_391;}}}}return ret;};var _396=function(_397,root){root=root||_323();var od=root.ownerDocument||root;_326=(od.createElement("div").tagName==="div");var r=_388(_397)(root);if(r&&r.nozip){return r;}return _394(r);};_396.filter=function(_398,_399,root){var _39a=[],_39b=_328(_399),_39c=(_39b.length==1&&!/[^\w#\.]/.test(_399))?_35d(_39b[0]):function(node){return _322.indexOf(_396(_399,dom.byId(root)),node)!=-1;};for(var x=0,te;te=_398[x];x++){if(_39c(te)){_39a.push(te);}}return _39a;};return _396;});},"dojo/errors/RequestTimeoutError":function(){define(["./create","./RequestError"],function(_39d,_39e){return _39d("RequestTimeoutError",null,_39e,{dojoType:"timeout"});});},"dojo/dom-style":function(){define(["./sniff","./dom"],function(has,dom){var _39f,_3a0={};if(has("webkit")){_39f=function(node){var s;if(node.nodeType==1){var dv=node.ownerDocument.defaultView;s=dv.getComputedStyle(node,null);if(!s&&node.style){node.style.display="";s=dv.getComputedStyle(node,null);}}return s||{};};}else{if(has("ie")&&(has("ie")<9||has("quirks"))){_39f=function(node){return node.nodeType==1&&node.currentStyle?node.currentStyle:{};};}else{_39f=function(node){return node.nodeType==1?node.ownerDocument.defaultView.getComputedStyle(node,null):{};};}}_3a0.getComputedStyle=_39f;var _3a1;if(!has("ie")){_3a1=function(_3a2,_3a3){return parseFloat(_3a3)||0;};}else{_3a1=function(_3a4,_3a5){if(!_3a5){return 0;}if(_3a5=="medium"){return 4;}if(_3a5.slice&&_3a5.slice(-2)=="px"){return parseFloat(_3a5);}var s=_3a4.style,rs=_3a4.runtimeStyle,cs=_3a4.currentStyle,_3a6=s.left,_3a7=rs.left;rs.left=cs.left;try{s.left=_3a5;_3a5=s.pixelLeft;}catch(e){_3a5=0;}s.left=_3a6;rs.left=_3a7;return _3a5;};}_3a0.toPixelValue=_3a1;var astr="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(astr);}catch(e){return f?{}:null;}};var _3a8=has("ie")<9||(has("ie")<10&&has("quirks"))?function(node){try{return af(node).Opacity/100;}catch(e){return 1;}}:function(node){return _39f(node).opacity;};var _3a9=has("ie")<9||(has("ie")<10&&has("quirks"))?function(node,_3aa){if(_3aa===""){_3aa=1;}var ov=_3aa*100,_3ab=_3aa===1;if(_3ab){node.style.zoom="";if(af(node)){node.style.filter=node.style.filter.replace(new RegExp("\\s*progid:"+astr+"\\([^\\)]+?\\)","i"),"");}}else{node.style.zoom=1;if(af(node)){af(node,1).Opacity=ov;}else{node.style.filter+=" progid:"+astr+"(Opacity="+ov+")";}af(node,1).Enabled=true;}if(node.tagName.toLowerCase()=="tr"){for(var td=node.firstChild;td;td=td.nextSibling){if(td.tagName.toLowerCase()=="td"){_3a9(td,_3aa);}}}return _3aa;}:function(node,_3ac){return node.style.opacity=_3ac;};var _3ad={left:true,top:true};var _3ae=/margin|padding|width|height|max|min|offset/;function _3af(node,type,_3b0){type=type.toLowerCase();if(has("ie")){if(_3b0=="auto"){if(type=="height"){return node.offsetHeight;}if(type=="width"){return node.offsetWidth;}}if(type=="fontweight"){switch(_3b0){case 700:return "bold";case 400:default:return "normal";}}}if(!(type in _3ad)){_3ad[type]=_3ae.test(type);}return _3ad[type]?_3a1(node,_3b0):_3b0;};var _3b1={cssFloat:1,styleFloat:1,"float":1};_3a0.get=function getStyle(node,name){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");if(l==2&&op){return _3a8(n);}name=_3b1[name]?"cssFloat" in n.style?"cssFloat":"styleFloat":name;var s=_3a0.getComputedStyle(n);return (l==1)?s:_3af(n,name,s[name]||n.style[name]);};_3a0.set=function setStyle(node,name,_3b2){var n=dom.byId(node),l=arguments.length,op=(name=="opacity");name=_3b1[name]?"cssFloat" in n.style?"cssFloat":"styleFloat":name;if(l==3){return op?_3a9(n,_3b2):n.style[name]=_3b2;}for(var x in name){_3a0.set(node,x,name[x]);}return _3a0.getComputedStyle(n);};return _3a0;});},"dojo/dom-geometry":function(){define(["./sniff","./_base/window","./dom","./dom-style"],function(has,win,dom,_3b3){var geom={};geom.boxModel="content-box";if(has("ie")){geom.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}geom.getPadExtents=function getPadExtents(node,_3b4){node=dom.byId(node);var s=_3b4||_3b3.getComputedStyle(node),px=_3b3.toPixelValue,l=px(node,s.paddingLeft),t=px(node,s.paddingTop),r=px(node,s.paddingRight),b=px(node,s.paddingBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};var none="none";geom.getBorderExtents=function getBorderExtents(node,_3b5){node=dom.byId(node);var px=_3b3.toPixelValue,s=_3b5||_3b3.getComputedStyle(node),l=s.borderLeftStyle!=none?px(node,s.borderLeftWidth):0,t=s.borderTopStyle!=none?px(node,s.borderTopWidth):0,r=s.borderRightStyle!=none?px(node,s.borderRightWidth):0,b=s.borderBottomStyle!=none?px(node,s.borderBottomWidth):0;return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getPadBorderExtents=function getPadBorderExtents(node,_3b6){node=dom.byId(node);var s=_3b6||_3b3.getComputedStyle(node),p=geom.getPadExtents(node,s),b=geom.getBorderExtents(node,s);return {l:p.l+b.l,t:p.t+b.t,r:p.r+b.r,b:p.b+b.b,w:p.w+b.w,h:p.h+b.h};};geom.getMarginExtents=function getMarginExtents(node,_3b7){node=dom.byId(node);var s=_3b7||_3b3.getComputedStyle(node),px=_3b3.toPixelValue,l=px(node,s.marginLeft),t=px(node,s.marginTop),r=px(node,s.marginRight),b=px(node,s.marginBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};geom.getMarginBox=function getMarginBox(node,_3b8){node=dom.byId(node);var s=_3b8||_3b3.getComputedStyle(node),me=geom.getMarginExtents(node,s),l=node.offsetLeft-me.l,t=node.offsetTop-me.t,p=node.parentNode,px=_3b3.toPixelValue,pcs;if(has("mozilla")){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl;t=st;}else{if(p&&p.style){pcs=_3b3.getComputedStyle(p);if(pcs.overflow!="visible"){l+=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t+=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}}else{if(has("opera")||(has("ie")==8&&!has("quirks"))){if(p){pcs=_3b3.getComputedStyle(p);l-=pcs.borderLeftStyle!=none?px(node,pcs.borderLeftWidth):0;t-=pcs.borderTopStyle!=none?px(node,pcs.borderTopWidth):0;}}}return {l:l,t:t,w:node.offsetWidth+me.w,h:node.offsetHeight+me.h};};geom.getContentBox=function getContentBox(node,_3b9){node=dom.byId(node);var s=_3b9||_3b3.getComputedStyle(node),w=node.clientWidth,h,pe=geom.getPadExtents(node,s),be=geom.getBorderExtents(node,s);if(!w){w=node.offsetWidth;h=node.offsetHeight;}else{h=node.clientHeight;be.w=be.h=0;}if(has("opera")){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};function _3ba(node,l,t,w,h,u){u=u||"px";var s=node.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};function _3bb(node){return node.tagName.toLowerCase()=="button"||node.tagName.toLowerCase()=="input"&&(node.getAttribute("type")||"").toLowerCase()=="button";};function _3bc(node){return geom.boxModel=="border-box"||node.tagName.toLowerCase()=="table"||_3bb(node);};geom.setContentSize=function setContentSize(node,box,_3bd){node=dom.byId(node);var w=box.w,h=box.h;if(_3bc(node)){var pb=geom.getPadBorderExtents(node,_3bd);if(w>=0){w+=pb.w;}if(h>=0){h+=pb.h;}}_3ba(node,NaN,NaN,w,h);};var _3be={l:0,t:0,w:0,h:0};geom.setMarginBox=function setMarginBox(node,box,_3bf){node=dom.byId(node);var s=_3bf||_3b3.getComputedStyle(node),w=box.w,h=box.h,pb=_3bc(node)?_3be:geom.getPadBorderExtents(node,s),mb=geom.getMarginExtents(node,s);if(has("webkit")){if(_3bb(node)){var ns=node.style;if(w>=0&&!ns.width){ns.width="4px";}if(h>=0&&!ns.height){ns.height="4px";}}}if(w>=0){w=Math.max(w-pb.w-mb.w,0);}if(h>=0){h=Math.max(h-pb.h-mb.h,0);}_3ba(node,box.l,box.t,w,h);};geom.isBodyLtr=function isBodyLtr(doc){doc=doc||win.doc;return (win.body(doc).dir||doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};geom.docScroll=function docScroll(doc){doc=doc||win.doc;var node=win.doc.parentWindow||win.doc.defaultView;return "pageXOffset" in node?{x:node.pageXOffset,y:node.pageYOffset}:(node=has("quirks")?win.body(doc):doc.documentElement)&&{x:geom.fixIeBiDiScrollLeft(node.scrollLeft||0,doc),y:node.scrollTop||0};};if(has("ie")){geom.getIeDocumentElementOffset=function getIeDocumentElementOffset(doc){doc=doc||win.doc;var de=doc.documentElement;if(has("ie")<8){var r=de.getBoundingClientRect(),l=r.left,t=r.top;if(has("ie")<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};}geom.fixIeBiDiScrollLeft=function fixIeBiDiScrollLeft(_3c0,doc){doc=doc||win.doc;var ie=has("ie");if(ie&&!geom.isBodyLtr(doc)){var qk=has("quirks"),de=qk?win.body(doc):doc.documentElement,pwin=win.global;if(ie==6&&!qk&&pwin.frameElement&&de.scrollHeight>de.clientHeight){_3c0+=de.clientLeft;}return (ie<8||qk)?(_3c0+de.clientWidth-de.scrollWidth):-_3c0;}return _3c0;};geom.position=function(node,_3c1){node=dom.byId(node);var db=win.body(node.ownerDocument),ret=node.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(has("ie")<9){var _3c2=geom.getIeDocumentElementOffset(node.ownerDocument);ret.x-=_3c2.x+(has("quirks")?db.clientLeft+db.offsetLeft:0);ret.y-=_3c2.y+(has("quirks")?db.clientTop+db.offsetTop:0);}if(_3c1){var _3c3=geom.docScroll(node.ownerDocument);ret.x+=_3c3.x;ret.y+=_3c3.y;}return ret;};geom.getMarginSize=function getMarginSize(node,_3c4){node=dom.byId(node);var me=geom.getMarginExtents(node,_3c4||_3b3.getComputedStyle(node));var size=node.getBoundingClientRect();return {w:(size.right-size.left)+me.w,h:(size.bottom-size.top)+me.h};};geom.normalizeEvent=function(_3c5){if(!("layerX" in _3c5)){_3c5.layerX=_3c5.offsetX;_3c5.layerY=_3c5.offsetY;}if(!has("dom-addeventlistener")){var se=_3c5.target;var doc=(se&&se.ownerDocument)||document;var _3c6=has("quirks")?doc.body:doc.documentElement;var _3c7=geom.getIeDocumentElementOffset(doc);_3c5.pageX=_3c5.clientX+geom.fixIeBiDiScrollLeft(_3c6.scrollLeft||0,doc)-_3c7.x;_3c5.pageY=_3c5.clientY+(_3c6.scrollTop||0)-_3c7.y;}};return geom;});},"dojo/dom-prop":function(){define(["exports","./_base/kernel","./sniff","./_base/lang","./dom","./dom-style","./dom-construct","./_base/connect"],function(_3c8,dojo,has,lang,dom,_3c9,ctr,conn){var _3ca={},_3cb=0,_3cc=dojo._scopeName+"attrid";_3c8.names={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"};_3c8.get=function getProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3cd=_3c8.names[lc]||name;return node[_3cd];};_3c8.set=function setProp(node,name,_3ce){node=dom.byId(node);var l=arguments.length;if(l==2&&typeof name!="string"){for(var x in name){_3c8.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_3cf=_3c8.names[lc]||name;if(_3cf=="style"&&typeof _3ce!="string"){_3c9.set(node,_3ce);return node;}if(_3cf=="innerHTML"){if(has("ie")&&node.tagName.toLowerCase() in {col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1}){ctr.empty(node);node.appendChild(ctr.toDom(_3ce,node.ownerDocument));}else{node[_3cf]=_3ce;}return node;}if(lang.isFunction(_3ce)){var _3d0=node[_3cc];if(!_3d0){_3d0=_3cb++;node[_3cc]=_3d0;}if(!_3ca[_3d0]){_3ca[_3d0]={};}var h=_3ca[_3d0][_3cf];if(h){conn.disconnect(h);}else{try{delete node[_3cf];}catch(e){}}if(_3ce){_3ca[_3d0][_3cf]=conn.connect(node,_3cf,_3ce);}else{node[_3cf]=null;}return node;}node[_3cf]=_3ce;return node;};});},"dojo/when":function(){define(["./Deferred","./promise/Promise"],function(_3d1,_3d2){"use strict";return function when(_3d3,_3d4,_3d5,_3d6){var _3d7=_3d3&&typeof _3d3.then==="function";var _3d8=_3d7&&_3d3 instanceof _3d2;if(!_3d7){if(arguments.length>1){return _3d4?_3d4(_3d3):_3d3;}else{return new _3d1().resolve(_3d3);}}else{if(!_3d8){var _3d9=new _3d1(_3d3.cancel);_3d3.then(_3d9.resolve,_3d9.reject,_3d9.progress);_3d3=_3d9.promise;}}if(_3d4||_3d5||_3d6){return _3d3.then(_3d4,_3d5,_3d6);}return _3d3;};});},"dojo/dom-attr":function(){define(["exports","./sniff","./_base/lang","./dom","./dom-style","./dom-prop"],function(_3da,has,lang,dom,_3db,prop){var _3dc={innerHTML:1,className:1,htmlFor:has("ie"),value:1},_3dd={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"};function _3de(node,name){var attr=node.getAttributeNode&&node.getAttributeNode(name);return attr&&attr.specified;};_3da.has=function hasAttr(node,name){var lc=name.toLowerCase();return _3dc[prop.names[lc]||name]||_3de(dom.byId(node),_3dd[lc]||name);};_3da.get=function getAttr(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3df=prop.names[lc]||name,_3e0=_3dc[_3df],_3e1=node[_3df];if(_3e0&&typeof _3e1!="undefined"){return _3e1;}if(_3df!="href"&&(typeof _3e1=="boolean"||lang.isFunction(_3e1))){return _3e1;}var _3e2=_3dd[lc]||name;return _3de(node,_3e2)?node.getAttribute(_3e2):null;};_3da.set=function setAttr(node,name,_3e3){node=dom.byId(node);if(arguments.length==2){for(var x in name){_3da.set(node,x,name[x]);}return node;}var lc=name.toLowerCase(),_3e4=prop.names[lc]||name,_3e5=_3dc[_3e4];if(_3e4=="style"&&typeof _3e3!="string"){_3db.set(node,_3e3);return node;}if(_3e5||typeof _3e3=="boolean"||lang.isFunction(_3e3)){return prop.set(node,name,_3e3);}node.setAttribute(_3dd[lc]||name,_3e3);return node;};_3da.remove=function removeAttr(node,name){dom.byId(node).removeAttribute(_3dd[name.toLowerCase()]||name);};_3da.getNodeProp=function getNodeProp(node,name){node=dom.byId(node);var lc=name.toLowerCase(),_3e6=prop.names[lc]||name;if((_3e6 in node)&&_3e6!="href"){return node[_3e6];}var _3e7=_3dd[lc]||name;return _3de(node,_3e7)?node.getAttribute(_3e7):null;};});},"dojo/dom-construct":function(){define(["exports","./_base/kernel","./sniff","./_base/window","./dom","./dom-attr"],function(_3e8,dojo,has,win,dom,attr){var _3e9={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_3ea=/<\s*([\w\:]+)/,_3eb={},_3ec=0,_3ed="__"+dojo._scopeName+"ToDomId";for(var _3ee in _3e9){if(_3e9.hasOwnProperty(_3ee)){var tw=_3e9[_3ee];tw.pre=_3ee=="option"?"<select multiple=\"multiple\">":"<"+tw.join("><")+">";tw.post="</"+tw.reverse().join("></")+">";}}var _3ef;if(has("ie")<=8){_3ef=function(doc){doc.__dojo_html5_tested="yes";var div=_3f0("div",{innerHTML:"<nav>a</nav>",style:{visibility:"hidden"}},doc.body);if(div.childNodes.length!==1){("abbr article aside audio canvas details figcaption figure footer header "+"hgroup mark meter nav output progress section summary time video").replace(/\b\w+\b/g,function(n){doc.createElement(n);});}_3f1(div);};}function _3f2(node,ref){var _3f3=ref.parentNode;if(_3f3){_3f3.insertBefore(node,ref);}};function _3f4(node,ref){var _3f5=ref.parentNode;if(_3f5){if(_3f5.lastChild==ref){_3f5.appendChild(node);}else{_3f5.insertBefore(node,ref.nextSibling);}}};_3e8.toDom=function toDom(frag,doc){doc=doc||win.doc;var _3f6=doc[_3ed];if(!_3f6){doc[_3ed]=_3f6=++_3ec+"";_3eb[_3f6]=doc.createElement("div");}if(has("ie")<=8){if(!doc.__dojo_html5_tested&&doc.body){_3ef(doc);}}frag+="";var _3f7=frag.match(_3ea),tag=_3f7?_3f7[1].toLowerCase():"",_3f8=_3eb[_3f6],wrap,i,fc,df;if(_3f7&&_3e9[tag]){wrap=_3e9[tag];_3f8.innerHTML=wrap.pre+frag+wrap.post;for(i=wrap.length;i;--i){_3f8=_3f8.firstChild;}}else{_3f8.innerHTML=frag;}if(_3f8.childNodes.length==1){return _3f8.removeChild(_3f8.firstChild);}df=doc.createDocumentFragment();while((fc=_3f8.firstChild)){df.appendChild(fc);}return df;};_3e8.place=function place(node,_3f9,_3fa){_3f9=dom.byId(_3f9);if(typeof node=="string"){node=/^\s*</.test(node)?_3e8.toDom(node,_3f9.ownerDocument):dom.byId(node);}if(typeof _3fa=="number"){var cn=_3f9.childNodes;if(!cn.length||cn.length<=_3fa){_3f9.appendChild(node);}else{_3f2(node,cn[_3fa<0?0:_3fa]);}}else{switch(_3fa){case "before":_3f2(node,_3f9);break;case "after":_3f4(node,_3f9);break;case "replace":_3f9.parentNode.replaceChild(node,_3f9);break;case "only":_3e8.empty(_3f9);_3f9.appendChild(node);break;case "first":if(_3f9.firstChild){_3f2(node,_3f9.firstChild);break;}default:_3f9.appendChild(node);}}return node;};var _3f0=_3e8.create=function _3f0(tag,_3fb,_3fc,pos){var doc=win.doc;if(_3fc){_3fc=dom.byId(_3fc);doc=_3fc.ownerDocument;}if(typeof tag=="string"){tag=doc.createElement(tag);}if(_3fb){attr.set(tag,_3fb);}if(_3fc){_3e8.place(tag,_3fc,pos);}return tag;};function _3fd(node){if(node.canHaveChildren){try{node.innerHTML="";return;}catch(e){}}for(var c;c=node.lastChild;){_3fe(c,node);}};_3e8.empty=function empty(node){_3fd(dom.byId(node));};function _3fe(node,_3ff){if(node.firstChild){_3fd(node);}if(_3ff){has("ie")&&_3ff.canHaveChildren&&"removeNode" in node?node.removeNode(false):_3ff.removeChild(node);}};var _3f1=_3e8.destroy=function _3f1(node){node=dom.byId(node);if(!node){return;}_3fe(node,node.parentNode);};});},"dojo/request/xhr":function(){define(["../errors/RequestError","./watch","./handlers","./util","../has"],function(_400,_401,_402,util,has){has.add("native-xhr",function(){return typeof XMLHttpRequest!=="undefined";});has.add("dojo-force-activex-xhr",function(){return has("activex")&&!document.addEventListener&&window.location.protocol==="file:";});has.add("native-xhr2",function(){if(!has("native-xhr")){return;}var x=new XMLHttpRequest();return typeof x["addEventListener"]!=="undefined"&&(typeof opera==="undefined"||typeof x["upload"]!=="undefined");});has.add("native-formdata",function(){return typeof FormData==="function";});function _403(_404,_405){var _406=_404.xhr;_404.status=_404.xhr.status;_404.text=_406.responseText;if(_404.options.handleAs==="xml"){_404.data=_406.responseXML;}if(!_405){try{_402(_404);}catch(e){_405=e;}}if(_405){this.reject(_405);}else{if(util.checkStatus(_406.status)){this.resolve(_404);}else{_405=new _400("Unable to load "+_404.url+" status: "+_406.status,_404);this.reject(_405);}}};var _407,_408,_409,_40a;if(has("native-xhr2")){_407=function(_40b){return !this.isFulfilled();};_40a=function(dfd,_40c){_40c.xhr.abort();};_409=function(_40d,dfd,_40e){function _40f(evt){dfd.handleResponse(_40e);};function _410(evt){var _411=evt.target;var _412=new _400("Unable to load "+_40e.url+" status: "+_411.status,_40e);dfd.handleResponse(_40e,_412);};function _413(evt){if(evt.lengthComputable){_40e.loaded=evt.loaded;_40e.total=evt.total;dfd.progress(_40e);}};_40d.addEventListener("load",_40f,false);_40d.addEventListener("error",_410,false);_40d.addEventListener("progress",_413,false);return function(){_40d.removeEventListener("load",_40f,false);_40d.removeEventListener("error",_410,false);_40d.removeEventListener("progress",_413,false);_40d=null;};};}else{_407=function(_414){return _414.xhr.readyState;};_408=function(_415){return 4===_415.xhr.readyState;};_40a=function(dfd,_416){var xhr=_416.xhr;var _417=typeof xhr.abort;if(_417==="function"||_417==="object"||_417==="unknown"){xhr.abort();}};}function _418(_419){return this.xhr.getResponseHeader(_419);};var _41a,_41b={data:null,query:null,sync:false,method:"GET"};function xhr(url,_41c,_41d){var _41e=util.parseArgs(url,util.deepCreate(_41b,_41c),has("native-formdata")&&_41c&&_41c.data&&_41c.data instanceof FormData);url=_41e.url;_41c=_41e.options;var _41f,last=function(){_41f&&_41f();};var dfd=util.deferred(_41e,_40a,_407,_408,_403,last);var _420=_41e.xhr=xhr._create();if(!_420){dfd.cancel(new _400("XHR was not created"));return _41d?dfd:dfd.promise;}_41e.getHeader=_418;if(_409){_41f=_409(_420,dfd,_41e);}var data=_41c.data,_421=!_41c.sync,_422=_41c.method;try{_420.open(_422,url,_421,_41c.user||_41a,_41c.password||_41a);if(_41c.withCredentials){_420.withCredentials=_41c.withCredentials;}var _423=_41c.headers,_424="application/x-www-form-urlencoded";if(_423){for(var hdr in _423){if(hdr.toLowerCase()==="content-type"){_424=_423[hdr];}else{if(_423[hdr]){_420.setRequestHeader(hdr,_423[hdr]);}}}}if(_424&&_424!==false){_420.setRequestHeader("Content-Type",_424);}if(!_423||!("X-Requested-With" in _423)){_420.setRequestHeader("X-Requested-With","XMLHttpRequest");}if(util.notify){util.notify.emit("send",_41e,dfd.promise.cancel);}_420.send(data);}catch(e){dfd.reject(e);}_401(dfd);_420=null;return _41d?dfd:dfd.promise;};xhr._create=function(){throw new Error("XMLHTTP not available");};if(has("native-xhr")&&!has("dojo-force-activex-xhr")){xhr._create=function(){return new XMLHttpRequest();};}else{if(has("activex")){try{new ActiveXObject("Msxml2.XMLHTTP");xhr._create=function(){return new ActiveXObject("Msxml2.XMLHTTP");};}catch(e){try{new ActiveXObject("Microsoft.XMLHTTP");xhr._create=function(){return new ActiveXObject("Microsoft.XMLHTTP");};}catch(e){}}}}util.addCommonMethods(xhr);return xhr;});},"dojo/text":function(){define(["./_base/kernel","require","./has","./request"],function(dojo,_425,has,_426){var _427;if(1){_427=function(url,sync,load){_426(url,{sync:!!sync}).then(load);};}else{if(_425.getText){_427=_425.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _428={},_429=function(text){if(text){text=text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _42a=text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_42a){text=_42a[1];}}else{text="";}return text;},_42b={},_42c={};dojo.cache=function(_42d,url,_42e){var key;if(typeof _42d=="string"){if(/\//.test(_42d)){key=_42d;_42e=url;}else{key=_425.toUrl(_42d.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_42d+"";_42e=url;}var val=(_42e!=undefined&&typeof _42e!="string")?_42e.value:_42e,_42f=_42e&&_42e.sanitize;if(typeof val=="string"){_428[key]=val;return _42f?_429(val):val;}else{if(val===null){delete _428[key];return null;}else{if(!(key in _428)){_427(key,true,function(text){_428[key]=text;});}return _42f?_429(_428[key]):_428[key];}}};return {dynamic:true,normalize:function(id,_430){var _431=id.split("!"),url=_431[0];return (/^\./.test(url)?_430(url):url)+(_431[1]?"!"+_431[1]:"");},load:function(id,_432,load){var _433=id.split("!"),_434=_433.length>1,_435=_433[0],url=_432.toUrl(_433[0]),_436="url:"+url,text=_42b,_437=function(text){load(_434?_429(text):text);};if(_435 in _428){text=_428[_435];}else{if(_432.cache&&_436 in _432.cache){text=_432.cache[_436];}else{if(url in _428){text=_428[url];}}}if(text===_42b){if(_42c[url]){_42c[url].push(_437);}else{var _438=_42c[url]=[_437];_427(url,!_432.async,function(text){_428[_435]=_428[url]=text;for(var i=0;i<_438.length;){_438[i++](text);}delete _42c[url];});}}else{_437(text);}}};});},"dojo/keys":function(){define(["./_base/kernel","./sniff"],function(dojo,has){return dojo.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:has("webkit")?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,UP_DPAD:175,DOWN_DPAD:176,LEFT_DPAD:177,RIGHT_DPAD:178,copyKey:has("mac")&&!has("air")?(has("safari")?91:224):17};});},"dojo/domReady":function(){define(["./has"],function(has){var _439=this,doc=document,_43a={"loaded":1,"complete":1},_43b=typeof doc.readyState!="string",_43c=!!_43a[doc.readyState],_43d=[],_43e;function _43f(_440){_43d.push(_440);if(_43c){_441();}};_43f.load=function(id,req,load){_43f(load);};_43f._Q=_43d;_43f._onQEmpty=function(){};if(_43b){doc.readyState="loading";}function _441(){if(_43e){return;}_43e=true;while(_43d.length){try{(_43d.shift())(doc);}catch(err){}}_43e=false;_43f._onQEmpty();};if(!_43c){var _442=[],_443=function(evt){evt=evt||_439.event;if(_43c||(evt.type=="readystatechange"&&!_43a[doc.readyState])){return;}if(_43b){doc.readyState="complete";}_43c=1;_441();},on=function(node,_444){node.addEventListener(_444,_443,false);_43d.push(function(){node.removeEventListener(_444,_443,false);});};if(!has("dom-addeventlistener")){on=function(node,_445){_445="on"+_445;node.attachEvent(_445,_443);_43d.push(function(){node.detachEvent(_445,_443);});};var div=doc.createElement("div");try{if(div.doScroll&&_439.frameElement===null){_442.push(function(){try{div.doScroll("left");return 1;}catch(e){}});}}catch(e){}}on(doc,"DOMContentLoaded");on(_439,"load");if("onreadystatechange" in doc){on(doc,"readystatechange");}else{if(!_43b){_442.push(function(){return _43a[doc.readyState];});}}if(_442.length){var _446=function(){if(_43c){return;}var i=_442.length;while(i--){if(_442[i]()){_443("poller");return;}}setTimeout(_446,30);};_446();}}return _43f;});},"dojo/_base/lang":function(){define(["./kernel","../has","../sniff"],function(dojo,has){has.add("bug-for-in-skips-shadowed",function(){for(var i in {toString:1}){return 0;}return 1;});var _447=has("bug-for-in-skips-shadowed")?"hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split("."):[],_448=_447.length,_449=function(_44a,_44b,_44c){var p,i=0,_44d=dojo.global;if(!_44c){if(!_44a.length){return _44d;}else{p=_44a[i++];try{_44c=dojo.scopeMap[p]&&dojo.scopeMap[p][1];}catch(e){}_44c=_44c||(p in _44d?_44d[p]:(_44b?_44d[p]={}:undefined));}}while(_44c&&(p=_44a[i++])){_44c=(p in _44c?_44c[p]:(_44b?_44c[p]={}:undefined));}return _44c;},opts=Object.prototype.toString,_44e=function(obj,_44f,_450){return (_450||[]).concat(Array.prototype.slice.call(obj,_44f||0));},_451=/\{([^\}]+)\}/g;var lang={_extraNames:_447,_mixin:function(dest,_452,_453){var name,s,i,_454={};for(name in _452){s=_452[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _454)||_454[name]!==s))){dest[name]=_453?_453(s):s;}}if(has("bug-for-in-skips-shadowed")){if(_452){for(i=0;i<_448;++i){name=_447[i];s=_452[name];if(!(name in dest)||(dest[name]!==s&&(!(name in _454)||_454[name]!==s))){dest[name]=_453?_453(s):s;}}}}return dest;},mixin:function(dest,_455){if(!dest){dest={};}for(var i=1,l=arguments.length;i<l;i++){lang._mixin(dest,arguments[i]);}return dest;},setObject:function(name,_456,_457){var _458=name.split("."),p=_458.pop(),obj=_449(_458,true,_457);return obj&&p?(obj[p]=_456):undefined;},getObject:function(name,_459,_45a){return _449(name.split("."),_459,_45a);},exists:function(name,obj){return lang.getObject(name,false,obj)!==undefined;},isString:function(it){return (typeof it=="string"||it instanceof String);},isArray:function(it){return it&&(it instanceof Array||typeof it=="array");},isFunction:function(it){return opts.call(it)==="[object Function]";},isObject:function(it){return it!==undefined&&(it===null||typeof it=="object"||lang.isArray(it)||lang.isFunction(it));},isArrayLike:function(it){return it&&it!==undefined&&!lang.isString(it)&&!lang.isFunction(it)&&!(it.tagName&&it.tagName.toLowerCase()=="form")&&(lang.isArray(it)||isFinite(it.length));},isAlien:function(it){return it&&!lang.isFunction(it)&&/\{\s*\[native code\]\s*\}/.test(String(it));},extend:function(ctor,_45b){for(var i=1,l=arguments.length;i<l;i++){lang._mixin(ctor.prototype,arguments[i]);}return ctor;},_hitchArgs:function(_45c,_45d){var pre=lang._toArray(arguments,2);var _45e=lang.isString(_45d);return function(){var args=lang._toArray(arguments);var f=_45e?(_45c||dojo.global)[_45d]:_45d;return f&&f.apply(_45c||this,pre.concat(args));};},hitch:function(_45f,_460){if(arguments.length>2){return lang._hitchArgs.apply(dojo,arguments);}if(!_460){_460=_45f;_45f=null;}if(lang.isString(_460)){_45f=_45f||dojo.global;if(!_45f[_460]){throw (["lang.hitch: scope[\"",_460,"\"] is null (scope=\"",_45f,"\")"].join(""));}return function(){return _45f[_460].apply(_45f,arguments||[]);};}return !_45f?_460:function(){return _460.apply(_45f,arguments||[]);};},delegate:(function(){function TMP(){};return function(obj,_461){TMP.prototype=obj;var tmp=new TMP();TMP.prototype=null;if(_461){lang._mixin(tmp,_461);}return tmp;};})(),_toArray:has("ie")?(function(){function slow(obj,_462,_463){var arr=_463||[];for(var x=_462||0;x<obj.length;x++){arr.push(obj[x]);}return arr;};return function(obj){return ((obj.item)?slow:_44e).apply(this,arguments);};})():_44e,partial:function(_464){var arr=[null];return lang.hitch.apply(dojo,arr.concat(lang._toArray(arguments)));},clone:function(src){if(!src||typeof src!="object"||lang.isFunction(src)){return src;}if(src.nodeType&&"cloneNode" in src){return src.cloneNode(true);}if(src instanceof Date){return new Date(src.getTime());}if(src instanceof RegExp){return new RegExp(src);}var r,i,l;if(lang.isArray(src)){r=[];for(i=0,l=src.length;i<l;++i){if(i in src){r.push(lang.clone(src[i]));}}}else{r=src.constructor?new src.constructor():{};}return lang._mixin(r,src,lang.clone);},trim:String.prototype.trim?function(str){return str.trim();}:function(str){return str.replace(/^\s\s*/,"").replace(/\s\s*$/,"");},replace:function(tmpl,map,_465){return tmpl.replace(_465||_451,lang.isFunction(map)?map:function(_466,k){return lang.getObject(k,false,map);});}};1&&lang.mixin(dojo,lang);return lang;});},"dojo/request/util":function(){define(["exports","../errors/RequestError","../errors/CancelError","../Deferred","../io-query","../_base/array","../_base/lang","../promise/Promise"],function(_467,_468,_469,_46a,_46b,_46c,lang,_46d){_467.deepCopy=function deepCopy(_46e,_46f){for(var name in _46f){var tval=_46e[name],sval=_46f[name];if(tval!==sval){if(tval&&typeof tval==="object"&&sval&&typeof sval==="object"){_467.deepCopy(tval,sval);}else{_46e[name]=sval;}}}return _46e;};_467.deepCreate=function deepCreate(_470,_471){_471=_471||{};var _472=lang.delegate(_470),name,_473;for(name in _470){_473=_470[name];if(_473&&typeof _473==="object"){_472[name]=_467.deepCreate(_473,_471[name]);}}return _467.deepCopy(_472,_471);};var _474=Object.freeze||function(obj){return obj;};function _475(_476){return _474(_476);};function _477(_478){return _478.data||_478.text;};_467.deferred=function deferred(_479,_47a,_47b,_47c,_47d,last){var def=new _46a(function(_47e){_47a&&_47a(def,_479);if(!_47e||!(_47e instanceof _468)&&!(_47e instanceof _469)){return new _469("Request canceled",_479);}return _47e;});def.response=_479;def.isValid=_47b;def.isReady=_47c;def.handleResponse=_47d;function _47f(_480){_480.response=_479;throw _480;};var _481=def.then(_475).otherwise(_47f);if(_467.notify){_481.then(lang.hitch(_467.notify,"emit","load"),lang.hitch(_467.notify,"emit","error"));}var _482=_481.then(_477);var _483=new _46d();for(var prop in _482){if(_482.hasOwnProperty(prop)){_483[prop]=_482[prop];}}_483.response=_481;_474(_483);if(last){def.then(function(_484){last.call(def,_484);},function(_485){last.call(def,_479,_485);});}def.promise=_483;def.then=_483.then;return def;};_467.addCommonMethods=function addCommonMethods(_486,_487){_46c.forEach(_487||["GET","POST","PUT","DELETE"],function(_488){_486[(_488==="DELETE"?"DEL":_488).toLowerCase()]=function(url,_489){_489=lang.delegate(_489||{});_489.method=_488;return _486(url,_489);};});};_467.parseArgs=function parseArgs(url,_48a,_48b){var data=_48a.data,_48c=_48a.query;if(data&&!_48b){if(typeof data==="object"){_48a.data=_46b.objectToQuery(data);}}if(_48c){if(typeof _48c==="object"){_48c=_46b.objectToQuery(_48c);}if(_48a.preventCache){_48c+=(_48c?"&":"")+"request.preventCache="+(+(new Date));}}else{if(_48a.preventCache){_48c="request.preventCache="+(+(new Date));}}if(url&&_48c){url+=(~url.indexOf("?")?"&":"?")+_48c;}return {url:url,options:_48a,getHeader:function(_48d){return null;}};};_467.checkStatus=function(stat){stat=stat||0;return (stat>=200&&stat<300)||stat===304||stat===1223||!stat;};});},"dojo/Evented":function(){define(["./aspect","./on"],function(_48e,on){"use strict";var _48f=_48e.after;function _490(){};_490.prototype={on:function(type,_491){return on.parse(this,type,_491,function(_492,type){return _48f(_492,"on"+type,_491,true);});},emit:function(type,_493){var args=[this];args.push.apply(args,arguments);return on.emit.apply(on,args);}};return _490;});},"dojo/mouse":function(){define(["./_base/kernel","./on","./has","./dom","./_base/window"],function(dojo,on,has,dom,win){has.add("dom-quirks",win.doc&&win.doc.compatMode=="BackCompat");has.add("events-mouseenter",win.doc&&"onmouseenter" in win.doc.createElement("div"));has.add("events-mousewheel",win.doc&&"onmousewheel" in win.doc);var _494;if((has("dom-quirks")&&has("ie"))||!has("dom-addeventlistener")){_494={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_495){return e.button&_495;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{_494={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_496){return e.button==_496;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}dojo.mouseButtons=_494;function _497(type,_498){var _499=function(node,_49a){return on(node,type,function(evt){if(_498){return _498(evt,_49a);}if(!dom.isDescendant(evt.relatedTarget,node)){return _49a.call(this,evt);}});};_499.bubble=function(_49b){return _497(type,function(evt,_49c){var _49d=_49b(evt.target);var _49e=evt.relatedTarget;if(_49d&&(_49d!=(_49e&&_49e.nodeType==1&&_49b(_49e)))){return _49c.call(_49d,evt);}});};return _499;};var _49f;if(has("events-mousewheel")){_49f="mousewheel";}else{_49f=function(node,_4a0){return on(node,"DOMMouseScroll",function(evt){evt.wheelDelta=-evt.detail;_4a0.call(this,evt);});};}return {_eventHandler:_497,enter:_497("mouseover"),leave:_497("mouseout"),wheel:_49f,isLeft:_494.isLeft,isMiddle:_494.isMiddle,isRight:_494.isRight};});},"dojo/_base/xhr":function(){define(["./kernel","./sniff","require","../io-query","../dom","../dom-form","./Deferred","./config","./json","./lang","./array","../on","../aspect","../request/watch","../request/xhr","../request/util"],function(dojo,has,_4a1,ioq,dom,_4a2,_4a3,_4a4,json,lang,_4a5,on,_4a6,_4a7,_4a8,util){dojo._xhrObj=_4a8._create;var cfg=dojo.config;dojo.objectToQuery=ioq.objectToQuery;dojo.queryToObject=ioq.queryToObject;dojo.fieldToObject=_4a2.fieldToObject;dojo.formToObject=_4a2.toObject;dojo.formToQuery=_4a2.toQuery;dojo.formToJson=_4a2.toJson;dojo._blockAsync=false;var _4a9=dojo._contentHandlers=dojo.contentHandlers={"text":function(xhr){return xhr.responseText;},"json":function(xhr){return json.fromJson(xhr.responseText||null);},"json-comment-filtered":function(xhr){if(!_4a4.useCommentedJson){console.warn("Consider using the standard mimetype:application/json."+" json-commenting can introduce security issues. To"+" decrease the chances of hijacking, use the standard the 'json' handler and"+" prefix your json with: {}&&\n"+"Use djConfig.useCommentedJson=true to turn off this message.");}var _4aa=xhr.responseText;var _4ab=_4aa.indexOf("/*");var _4ac=_4aa.lastIndexOf("*/");if(_4ab==-1||_4ac==-1){throw new Error("JSON was not comment filtered");}return json.fromJson(_4aa.substring(_4ab+2,_4ac));},"javascript":function(xhr){return dojo.eval(xhr.responseText);},"xml":function(xhr){var _4ad=xhr.responseXML;if(_4ad&&has("dom-qsa2.1")&&!_4ad.querySelectorAll&&has("dom-parser")){_4ad=new DOMParser().parseFromString(xhr.responseText,"application/xml");}if(has("ie")){if((!_4ad||!_4ad.documentElement)){var ms=function(n){return "MSXML"+n+".DOMDocument";};var dp=["Microsoft.XMLDOM",ms(6),ms(4),ms(3),ms(2)];_4a5.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(xhr.responseText);_4ad=dom;}catch(e){return false;}return true;});}}return _4ad;},"json-comment-optional":function(xhr){if(xhr.responseText&&/^[^{\[]*\/\*/.test(xhr.responseText)){return _4a9["json-comment-filtered"](xhr);}else{return _4a9["json"](xhr);}}};dojo._ioSetArgs=function(args,_4ae,_4af,_4b0){var _4b1={args:args,url:args.url};var _4b2=null;if(args.form){var form=dom.byId(args.form);var _4b3=form.getAttributeNode("action");_4b1.url=_4b1.url||(_4b3?_4b3.value:null);_4b2=_4a2.toObject(form);}var _4b4=[{}];if(_4b2){_4b4.push(_4b2);}if(args.content){_4b4.push(args.content);}if(args.preventCache){_4b4.push({"dojo.preventCache":new Date().valueOf()});}_4b1.query=ioq.objectToQuery(lang.mixin.apply(null,_4b4));_4b1.handleAs=args.handleAs||"text";var d=new _4a3(function(dfd){dfd.canceled=true;_4ae&&_4ae(dfd);var err=dfd.ioArgs.error;if(!err){err=new Error("request cancelled");err.dojoType="cancel";dfd.ioArgs.error=err;}return err;});d.addCallback(_4af);var ld=args.load;if(ld&&lang.isFunction(ld)){d.addCallback(function(_4b5){return ld.call(args,_4b5,_4b1);});}var err=args.error;if(err&&lang.isFunction(err)){d.addErrback(function(_4b6){return err.call(args,_4b6,_4b1);});}var _4b7=args.handle;if(_4b7&&lang.isFunction(_4b7)){d.addBoth(function(_4b8){return _4b7.call(args,_4b8,_4b1);});}d.addErrback(function(_4b9){return _4b0(_4b9,d);});if(cfg.ioPublish&&dojo.publish&&_4b1.args.ioPublish!==false){d.addCallbacks(function(res){dojo.publish("/dojo/io/load",[d,res]);return res;},function(res){dojo.publish("/dojo/io/error",[d,res]);return res;});d.addBoth(function(res){dojo.publish("/dojo/io/done",[d,res]);return res;});}d.ioArgs=_4b1;return d;};var _4ba=function(dfd){var ret=_4a9[dfd.ioArgs.handleAs](dfd.ioArgs.xhr);return ret===undefined?null:ret;};var _4bb=function(_4bc,dfd){if(!dfd.ioArgs.args.failOk){console.error(_4bc);}return _4bc;};var _4bd=function(dfd){if(_4be<=0){_4be=0;if(cfg.ioPublish&&dojo.publish&&(!dfd||dfd&&dfd.ioArgs.args.ioPublish!==false)){dojo.publish("/dojo/io/stop");}}};var _4be=0;_4a6.after(_4a7,"_onAction",function(){_4be-=1;});_4a6.after(_4a7,"_onInFlight",_4bd);dojo._ioCancelAll=_4a7.cancelAll;dojo._ioNotifyStart=function(dfd){if(cfg.ioPublish&&dojo.publish&&dfd.ioArgs.args.ioPublish!==false){if(!_4be){dojo.publish("/dojo/io/start");}_4be+=1;dojo.publish("/dojo/io/send",[dfd]);}};dojo._ioWatch=function(dfd,_4bf,_4c0,_4c1){var args=dfd.ioArgs.options=dfd.ioArgs.args;lang.mixin(dfd,{response:dfd.ioArgs,isValid:function(_4c2){return _4bf(dfd);},isReady:function(_4c3){return _4c0(dfd);},handleResponse:function(_4c4){return _4c1(dfd);}});_4a7(dfd);_4bd(dfd);};var _4c5="application/x-www-form-urlencoded";dojo._ioAddQueryToUrl=function(_4c6){if(_4c6.query.length){_4c6.url+=(_4c6.url.indexOf("?")==-1?"?":"&")+_4c6.query;_4c6.query=null;}};dojo.xhr=function(_4c7,args,_4c8){var rDfd;var dfd=dojo._ioSetArgs(args,function(dfd){rDfd&&rDfd.cancel();},_4ba,_4bb);var _4c9=dfd.ioArgs;if("postData" in args){_4c9.query=args.postData;}else{if("putData" in args){_4c9.query=args.putData;}else{if("rawBody" in args){_4c9.query=args.rawBody;}else{if((arguments.length>2&&!_4c8)||"POST|PUT".indexOf(_4c7.toUpperCase())===-1){dojo._ioAddQueryToUrl(_4c9);}}}}var _4ca={method:_4c7,handleAs:"text",timeout:args.timeout,withCredentials:args.withCredentials,ioArgs:_4c9};if(typeof args.headers!=="undefined"){_4ca.headers=args.headers;}if(typeof args.contentType!=="undefined"){if(!_4ca.headers){_4ca.headers={};}_4ca.headers["Content-Type"]=args.contentType;}if(typeof _4c9.query!=="undefined"){_4ca.data=_4c9.query;}if(typeof args.sync!=="undefined"){_4ca.sync=args.sync;}dojo._ioNotifyStart(dfd);try{rDfd=_4a8(_4c9.url,_4ca,true);}catch(e){dfd.cancel();return dfd;}dfd.ioArgs.xhr=rDfd.response.xhr;rDfd.then(function(){dfd.resolve(dfd);}).otherwise(function(_4cb){_4c9.error=_4cb;if(_4cb.response){_4cb.status=_4cb.response.status;_4cb.responseText=_4cb.response.text;_4cb.xhr=_4cb.response.xhr;}dfd.reject(_4cb);});return dfd;};dojo.xhrGet=function(args){return dojo.xhr("GET",args);};dojo.rawXhrPost=dojo.xhrPost=function(args){return dojo.xhr("POST",args,true);};dojo.rawXhrPut=dojo.xhrPut=function(args){return dojo.xhr("PUT",args,true);};dojo.xhrDelete=function(args){return dojo.xhr("DELETE",args);};dojo._isDocumentOk=function(x){return util.checkStatus(x.status);};dojo._getText=function(url){var _4cc;dojo.xhrGet({url:url,sync:true,load:function(text){_4cc=text;}});return _4cc;};lang.mixin(dojo.xhr,{_xhrObj:dojo._xhrObj,fieldToObject:_4a2.fieldToObject,formToObject:_4a2.toObject,objectToQuery:ioq.objectToQuery,formToQuery:_4a2.toQuery,formToJson:_4a2.toJson,queryToObject:ioq.queryToObject,contentHandlers:_4a9,_ioSetArgs:dojo._ioSetArgs,_ioCancelAll:dojo._ioCancelAll,_ioNotifyStart:dojo._ioNotifyStart,_ioWatch:dojo._ioWatch,_ioAddQueryToUrl:dojo._ioAddQueryToUrl,_isDocumentOk:dojo._isDocumentOk,_getText:dojo._getText,get:dojo.xhrGet,post:dojo.xhrPost,put:dojo.xhrPut,del:dojo.xhrDelete});return dojo.xhr;});},"dojo/topic":function(){define(["./Evented"],function(_4cd){var hub=new _4cd;return {publish:function(_4ce,_4cf){return hub.emit.apply(hub,arguments);},subscribe:function(_4d0,_4d1){return hub.on.apply(hub,arguments);}};});},"dojo/loadInit":function(){define(["./_base/loader"],function(_4d2){return {dynamic:0,normalize:function(id){return id;},load:_4d2.loadInit};});},"dojo/_base/unload":function(){define(["./kernel","./lang","../on"],function(dojo,lang,on){var win=window;var _4d3={addOnWindowUnload:function(obj,_4d4){if(!dojo.windowUnloaded){on(win,"unload",(dojo.windowUnloaded=function(){}));}on(win,"unload",lang.hitch(obj,_4d4));},addOnUnload:function(obj,_4d5){on(win,"beforeunload",lang.hitch(obj,_4d5));}};dojo.addOnWindowUnload=_4d3.addOnWindowUnload;dojo.addOnUnload=_4d3.addOnUnload;return _4d3;});},"dojo/Deferred":function(){define(["./has","./_base/lang","./errors/CancelError","./promise/Promise","./promise/instrumentation"],function(has,lang,_4d6,_4d7,_4d8){"use strict";var _4d9=0,_4da=1,_4db=2;var _4dc="This deferred has already been fulfilled.";var _4dd=Object.freeze||function(){};var _4de=function(_4df,type,_4e0,_4e1,_4e2){if(1){if(type===_4db&&_4e3.instrumentRejected&&_4df.length===0){_4e3.instrumentRejected(_4e0,false,_4e1,_4e2);}}for(var i=0;i<_4df.length;i++){_4e4(_4df[i],type,_4e0,_4e1);}};var _4e4=function(_4e5,type,_4e6,_4e7){var func=_4e5[type];var _4e8=_4e5.deferred;if(func){try{var _4e9=func(_4e6);if(type===_4d9){if(typeof _4e9!=="undefined"){_4ea(_4e8,type,_4e9);}}else{if(_4e9&&typeof _4e9.then==="function"){_4e5.cancel=_4e9.cancel;_4e9.then(_4eb(_4e8,_4da),_4eb(_4e8,_4db),_4eb(_4e8,_4d9));return;}_4ea(_4e8,_4da,_4e9);}}catch(error){_4ea(_4e8,_4db,error);}}else{_4ea(_4e8,type,_4e6);}if(1){if(type===_4db&&_4e3.instrumentRejected){_4e3.instrumentRejected(_4e6,!!func,_4e7,_4e8.promise);}}};var _4eb=function(_4ec,type){return function(_4ed){_4ea(_4ec,type,_4ed);};};var _4ea=function(_4ee,type,_4ef){if(!_4ee.isCanceled()){switch(type){case _4d9:_4ee.progress(_4ef);break;case _4da:_4ee.resolve(_4ef);break;case _4db:_4ee.reject(_4ef);break;}}};var _4e3=function(_4f0){var _4f1=this.promise=new _4d7();var _4f2=this;var _4f3,_4f4,_4f5;var _4f6=false;var _4f7=[];if(1&&Error.captureStackTrace){Error.captureStackTrace(_4f2,_4e3);Error.captureStackTrace(_4f1,_4e3);}this.isResolved=_4f1.isResolved=function(){return _4f3===_4da;};this.isRejected=_4f1.isRejected=function(){return _4f3===_4db;};this.isFulfilled=_4f1.isFulfilled=function(){return !!_4f3;};this.isCanceled=_4f1.isCanceled=function(){return _4f6;};this.progress=function(_4f8,_4f9){if(!_4f3){_4de(_4f7,_4d9,_4f8,null,_4f2);return _4f1;}else{if(_4f9===true){throw new Error(_4dc);}else{return _4f1;}}};this.resolve=function(_4fa,_4fb){if(!_4f3){_4de(_4f7,_4f3=_4da,_4f4=_4fa,null,_4f2);_4f7=null;return _4f1;}else{if(_4fb===true){throw new Error(_4dc);}else{return _4f1;}}};var _4fc=this.reject=function(_4fd,_4fe){if(!_4f3){if(1&&Error.captureStackTrace){Error.captureStackTrace(_4f5={},_4fc);}_4de(_4f7,_4f3=_4db,_4f4=_4fd,_4f5,_4f2);_4f7=null;return _4f1;}else{if(_4fe===true){throw new Error(_4dc);}else{return _4f1;}}};this.then=_4f1.then=function(_4ff,_500,_501){var _502=[_501,_4ff,_500];_502.cancel=_4f1.cancel;_502.deferred=new _4e3(function(_503){return _502.cancel&&_502.cancel(_503);});if(_4f3&&!_4f7){_4e4(_502,_4f3,_4f4,_4f5);}else{_4f7.push(_502);}return _502.deferred.promise;};this.cancel=_4f1.cancel=function(_504,_505){if(!_4f3){if(_4f0){var _506=_4f0(_504);_504=typeof _506==="undefined"?_504:_506;}_4f6=true;if(!_4f3){if(typeof _504==="undefined"){_504=new _4d6();}_4fc(_504);return _504;}else{if(_4f3===_4db&&_4f4===_504){return _504;}}}else{if(_505===true){throw new Error(_4dc);}}};_4dd(_4f1);};_4e3.prototype.toString=function(){return "[object Deferred]";};if(_4d8){_4d8(_4e3);}return _4e3;});},"dojo/_base/NodeList":function(){define(["./kernel","../query","./array","./html","../NodeList-dom"],function(dojo,_507,_508){var _509=_507.NodeList,nlp=_509.prototype;nlp.connect=_509._adaptAsForEach(function(){return dojo.connect.apply(this,arguments);});nlp.coords=_509._adaptAsMap(dojo.coords);_509.events=["blur","focus","change","click","error","keydown","keypress","keyup","load","mousedown","mouseenter","mouseleave","mousemove","mouseout","mouseover","mouseup","submit"];_508.forEach(_509.events,function(evt){var _50a="on"+evt;nlp[_50a]=function(a,b){return this.connect(_50a,a,b);};});dojo.NodeList=_509;return _509;});},"dojo/request":function(){define(["./request/default!"],function(_50b){return _50b;});},"dojo/_base/Color":function(){define(["./kernel","./lang","./array","./config"],function(dojo,lang,_50c,_50d){var _50e=dojo.Color=function(_50f){if(_50f){this.setColor(_50f);}};_50e.named={"black":[0,0,0],"silver":[192,192,192],"gray":[128,128,128],"white":[255,255,255],"maroon":[128,0,0],"red":[255,0,0],"purple":[128,0,128],"fuchsia":[255,0,255],"green":[0,128,0],"lime":[0,255,0],"olive":[128,128,0],"yellow":[255,255,0],"navy":[0,0,128],"blue":[0,0,255],"teal":[0,128,128],"aqua":[0,255,255],"transparent":_50d.transparentColor||[0,0,0,0]};lang.extend(_50e,{r:255,g:255,b:255,a:1,_set:function(r,g,b,a){var t=this;t.r=r;t.g=g;t.b=b;t.a=a;},setColor:function(_510){if(lang.isString(_510)){_50e.fromString(_510,this);}else{if(lang.isArray(_510)){_50e.fromArray(_510,this);}else{this._set(_510.r,_510.g,_510.b,_510.a);if(!(_510 instanceof _50e)){this.sanitize();}}}return this;},sanitize:function(){return this;},toRgb:function(){var t=this;return [t.r,t.g,t.b];},toRgba:function(){var t=this;return [t.r,t.g,t.b,t.a];},toHex:function(){var arr=_50c.map(["r","g","b"],function(x){var s=this[x].toString(16);return s.length<2?"0"+s:s;},this);return "#"+arr.join("");},toCss:function(_511){var t=this,rgb=t.r+", "+t.g+", "+t.b;return (_511?"rgba("+rgb+", "+t.a:"rgb("+rgb)+")";},toString:function(){return this.toCss(true);}});_50e.blendColors=dojo.blendColors=function(_512,end,_513,obj){var t=obj||new _50e();_50c.forEach(["r","g","b","a"],function(x){t[x]=_512[x]+(end[x]-_512[x])*_513;if(x!="a"){t[x]=Math.round(t[x]);}});return t.sanitize();};_50e.fromRgb=dojo.colorFromRgb=function(_514,obj){var m=_514.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/);return m&&_50e.fromArray(m[1].split(/\s*,\s*/),obj);};_50e.fromHex=dojo.colorFromHex=function(_515,obj){var t=obj||new _50e(),bits=(_515.length==4)?4:8,mask=(1<<bits)-1;_515=Number("0x"+_515.substr(1));if(isNaN(_515)){return null;}_50c.forEach(["b","g","r"],function(x){var c=_515&mask;_515>>=bits;t[x]=bits==4?17*c:c;});t.a=1;return t;};_50e.fromArray=dojo.colorFromArray=function(a,obj){var t=obj||new _50e();t._set(Number(a[0]),Number(a[1]),Number(a[2]),Number(a[3]));if(isNaN(t.a)){t.a=1;}return t.sanitize();};_50e.fromString=dojo.colorFromString=function(str,obj){var a=_50e.named[str];return a&&_50e.fromArray(a,obj)||_50e.fromRgb(str,obj)||_50e.fromHex(str,obj);};return _50e;});},"dojo/promise/instrumentation":function(){define(["./tracer","../has","../_base/lang","../_base/array"],function(_516,has,lang,_517){function _518(_519,_51a,_51b){var _51c="";if(_519&&_519.stack){_51c+=_519.stack;}if(_51a&&_51a.stack){_51c+="\n ----------------------------------------\n rejected"+_51a.stack.split("\n").slice(1).join("\n").replace(/^\s+/," ");}if(_51b&&_51b.stack){_51c+="\n ----------------------------------------\n"+_51b.stack;}console.error(_519,_51c);};function _51d(_51e,_51f,_520,_521){if(!_51f){_518(_51e,_520,_521);}};var _522=[];var _523=false;var _524=1000;function _525(_526,_527,_528,_529){if(_527){_517.some(_522,function(obj,ix){if(obj.error===_526){_522.splice(ix,1);return true;}});}else{if(!_517.some(_522,function(obj){return obj.error===_526;})){_522.push({error:_526,rejection:_528,deferred:_529,timestamp:new Date().getTime()});}}if(!_523){_523=setTimeout(_52a,_524);}};function _52a(){var now=new Date().getTime();var _52b=now-_524;_522=_517.filter(_522,function(obj){if(obj.timestamp<_52b){_518(obj.error,obj.rejection,obj.deferred);return false;}return true;});if(_522.length){_523=setTimeout(_52a,_522[0].timestamp+_524-now);}else{_523=false;}};return function(_52c){var _52d=has("config-useDeferredInstrumentation");if(_52d){_516.on("resolved",lang.hitch(console,"log","resolved"));_516.on("rejected",lang.hitch(console,"log","rejected"));_516.on("progress",lang.hitch(console,"log","progress"));var args=[];if(typeof _52d==="string"){args=_52d.split(",");_52d=args.shift();}if(_52d==="report-rejections"){_52c.instrumentRejected=_51d;}else{if(_52d==="report-unhandled-rejections"||_52d===true||_52d===1){_52c.instrumentRejected=_525;_524=parseInt(args[0],10)||_524;}else{throw new Error("Unsupported instrumentation usage <"+_52d+">");}}}};});},"dojo/selector/_loader":function(){define(["../has","require"],function(has,_52e){"use strict";var _52f=document.createElement("div");has.add("dom-qsa2.1",!!_52f.querySelectorAll);has.add("dom-qsa3",function(){try{_52f.innerHTML="<p class='TEST'></p>";return _52f.querySelectorAll(".TEST:empty").length==1;}catch(e){}});var _530;var acme="./acme",lite="./lite";return {load:function(id,_531,_532,_533){var req=_52e;id=id=="default"?has("config-selectorEngine")||"css3":id;id=id=="css2"||id=="lite"?lite:id=="css2.1"?has("dom-qsa2.1")?lite:acme:id=="css3"?has("dom-qsa3")?lite:acme:id=="acme"?acme:(req=_531)&&id;if(id.charAt(id.length-1)=="?"){id=id.substring(0,id.length-1);var _534=true;}if(_534&&(has("dom-compliant-qsa")||_530)){return _532(_530);}req([id],function(_535){if(id!="./lite"){_530=_535;}_532(_535);});}};});},"dojo/promise/Promise":function(){define(["../_base/lang"],function(lang){"use strict";function _536(){throw new TypeError("abstract");};return lang.extend(function Promise(){},{then:function(_537,_538,_539){_536();},cancel:function(_53a,_53b){_536();},isResolved:function(){_536();},isRejected:function(){_536();},isFulfilled:function(){_536();},isCanceled:function(){_536();},always:function(_53c){return this.then(_53c,_53c);},otherwise:function(_53d){return this.then(null,_53d);},trace:function(){return this;},traceRejected:function(){return this;},toString:function(){return "[object Promise]";}});});},"dojo/request/watch":function(){define(["./util","../errors/RequestTimeoutError","../errors/CancelError","../_base/array","../_base/window","../has!host-browser?dom-addeventlistener?:../on:"],function(util,_53e,_53f,_540,win,on){var _541=null,_542=[];function _543(){var now=+(new Date);for(var i=0,dfd;i<_542.length&&(dfd=_542[i]);i++){var _544=dfd.response,_545=_544.options;if((dfd.isCanceled&&dfd.isCanceled())||(dfd.isValid&&!dfd.isValid(_544))){_542.splice(i--,1);_546._onAction&&_546._onAction();}else{if(dfd.isReady&&dfd.isReady(_544)){_542.splice(i--,1);dfd.handleResponse(_544);_546._onAction&&_546._onAction();}else{if(dfd.startTime){if(dfd.startTime+(_545.timeout||0)<now){_542.splice(i--,1);dfd.cancel(new _53e("Timeout exceeded",_544));_546._onAction&&_546._onAction();}}}}}_546._onInFlight&&_546._onInFlight(dfd);if(!_542.length){clearInterval(_541);_541=null;}};function _546(dfd){if(dfd.response.options.timeout){dfd.startTime=+(new Date);}if(dfd.isFulfilled()){return;}_542.push(dfd);if(!_541){_541=setInterval(_543,50);}if(dfd.response.options.sync){_543();}};_546.cancelAll=function cancelAll(){try{_540.forEach(_542,function(dfd){try{dfd.cancel(new _53f("All requests canceled."));}catch(e){}});}catch(e){}};if(win&&on&&win.doc.attachEvent){on(win.global,"unload",function(){_546.cancelAll();});}return _546;});},"dojo/on":function(){define(["./has!dom-addeventlistener?:./aspect","./_base/kernel","./sniff"],function(_547,dojo,has){"use strict";if(1){var _548=window.ScriptEngineMajorVersion;has.add("jscript",_548&&(_548()+ScriptEngineMinorVersion()/10));has.add("event-orientationchange",has("touch")&&!has("android"));has.add("event-stopimmediatepropagation",window.Event&&!!window.Event.prototype&&!!window.Event.prototype.stopImmediatePropagation);has.add("event-focusin",function(_549,doc,_54a){return "onfocusin" in _54a;});}var on=function(_54b,type,_54c,_54d){if(typeof _54b.on=="function"&&typeof type!="function"&&!_54b.nodeType){return _54b.on(type,_54c);}return on.parse(_54b,type,_54c,_54e,_54d,this);};on.pausable=function(_54f,type,_550,_551){var _552;var _553=on(_54f,type,function(){if(!_552){return _550.apply(this,arguments);}},_551);_553.pause=function(){_552=true;};_553.resume=function(){_552=false;};return _553;};on.once=function(_554,type,_555,_556){var _557=on(_554,type,function(){_557.remove();return _555.apply(this,arguments);});return _557;};on.parse=function(_558,type,_559,_55a,_55b,_55c){if(type.call){return type.call(_55c,_558,_559);}if(type.indexOf(",")>-1){var _55d=type.split(/\s*,\s*/);var _55e=[];var i=0;var _55f;while(_55f=_55d[i++]){_55e.push(_55a(_558,_55f,_559,_55b,_55c));}_55e.remove=function(){for(var i=0;i<_55e.length;i++){_55e[i].remove();}};return _55e;}return _55a(_558,type,_559,_55b,_55c);};var _560=/^touch/;function _54e(_561,type,_562,_563,_564){var _565=type.match(/(.*):(.*)/);if(_565){type=_565[2];_565=_565[1];return on.selector(_565,type).call(_564,_561,_562);}if(has("touch")){if(_560.test(type)){_562=_566(_562);}if(!has("event-orientationchange")&&(type=="orientationchange")){type="resize";_561=window;_562=_566(_562);}}if(_567){_562=_567(_562);}if(_561.addEventListener){var _568=type in _569,_56a=_568?_569[type]:type;_561.addEventListener(_56a,_562,_568);return {remove:function(){_561.removeEventListener(_56a,_562,_568);}};}type="on"+type;if(_56b&&_561.attachEvent){return _56b(_561,type,_562);}throw new Error("Target must be an event emitter");};on.selector=function(_56c,_56d,_56e){return function(_56f,_570){var _571=typeof _56c=="function"?{matches:_56c}:this,_572=_56d.bubble;function _573(_574){_571=_571&&_571.matches?_571:dojo.query;while(!_571.matches(_574,_56c,_56f)){if(_574==_56f||_56e===false||!(_574=_574.parentNode)||_574.nodeType!=1){return;}}return _574;};if(_572){return on(_56f,_572(_573),_570);}return on(_56f,_56d,function(_575){var _576=_573(_575.target);return _576&&_570.call(_576,_575);});};};function _577(){this.cancelable=false;this.defaultPrevented=true;};function _578(){this.bubbles=false;};var _579=[].slice,_57a=on.emit=function(_57b,type,_57c){var args=_579.call(arguments,2);var _57d="on"+type;if("parentNode" in _57b){var _57e=args[0]={};for(var i in _57c){_57e[i]=_57c[i];}_57e.preventDefault=_577;_57e.stopPropagation=_578;_57e.target=_57b;_57e.type=type;_57c=_57e;}do{_57b[_57d]&&_57b[_57d].apply(_57b,args);}while(_57c&&_57c.bubbles&&(_57b=_57b.parentNode));return _57c&&_57c.cancelable&&_57c;};var _569=has("event-focusin")?{}:{focusin:"focus",focusout:"blur"};if(!has("event-stopimmediatepropagation")){var _57f=function(){this.immediatelyStopped=true;this.modified=true;};var _567=function(_580){return function(_581){if(!_581.immediatelyStopped){_581.stopImmediatePropagation=_57f;return _580.apply(this,arguments);}};};}if(has("dom-addeventlistener")){on.emit=function(_582,type,_583){if(_582.dispatchEvent&&document.createEvent){var _584=_582.ownerDocument||document;var _585=_584.createEvent("HTMLEvents");_585.initEvent(type,!!_583.bubbles,!!_583.cancelable);for(var i in _583){if(!(i in _585)){_585[i]=_583[i];}}return _582.dispatchEvent(_585)&&_585;}return _57a.apply(on,arguments);};}else{on._fixEvent=function(evt,_586){if(!evt){var w=_586&&(_586.ownerDocument||_586.document||_586).parentWindow||window;evt=w.event;}if(!evt){return evt;}try{if(_587&&evt.type==_587.type&&evt.srcElement==_587.target){evt=_587;}}catch(e){}if(!evt.target){evt.target=evt.srcElement;evt.currentTarget=(_586||evt.srcElement);if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(!evt.stopPropagation){evt.stopPropagation=_588;evt.preventDefault=_589;}switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;_58a(evt);break;}}return evt;};var _587,_58b=function(_58c){this.handle=_58c;};_58b.prototype.remove=function(){delete _dojoIEListeners_[this.handle];};var _58d=function(_58e){return function(evt){evt=on._fixEvent(evt,this);var _58f=_58e.call(this,evt);if(evt.modified){if(!_587){setTimeout(function(){_587=null;});}_587=evt;}return _58f;};};var _56b=function(_590,type,_591){_591=_58d(_591);if(((_590.ownerDocument?_590.ownerDocument.parentWindow:_590.parentWindow||_590.window||window)!=top||has("jscript")<5.8)&&!has("config-_allow_leaks")){if(typeof _dojoIEListeners_=="undefined"){_dojoIEListeners_=[];}var _592=_590[type];if(!_592||!_592.listeners){var _593=_592;_592=Function("event","var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}");_592.listeners=[];_590[type]=_592;_592.global=this;if(_593){_592.listeners.push(_dojoIEListeners_.push(_593)-1);}}var _594;_592.listeners.push(_594=(_592.global._dojoIEListeners_.push(_591)-1));return new _58b(_594);}return _547.after(_590,type,_591,true);};var _58a=function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _588=function(){this.cancelBubble=true;};var _589=on._preventDefault=function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){try{this.keyCode=0;}catch(e){}}this.defaultPrevented=true;this.returnValue=false;this.modified=true;};}if(has("touch")){var _595=function(){};var _596=window.orientation;var _566=function(_597){return function(_598){var _599=_598.corrected;if(!_599){var type=_598.type;try{delete _598.type;}catch(e){}if(_598.type){if(has("mozilla")){var _599={};for(var name in _598){_599[name]=_598[name];}}else{_595.prototype=_598;var _599=new _595;}_599.preventDefault=function(){_598.preventDefault();};_599.stopPropagation=function(){_598.stopPropagation();};}else{_599=_598;_599.type=type;}_598.corrected=_599;if(type=="resize"){if(_596==window.orientation){return null;}_596=window.orientation;_599.type="orientationchange";return _597.call(this,_599);}if(!("rotation" in _599)){_599.rotation=0;_599.scale=1;}var _59a=_599.changedTouches[0];for(var i in _59a){delete _599[i];_599[i]=_59a[i];}}return _597.call(this,_599);};};}return on;});},"dojo/_base/sniff":function(){define(["./kernel","./lang","../sniff"],function(dojo,lang,has){if(!1){return has;}dojo._name="browser";lang.mixin(dojo,{isBrowser:true,isFF:has("ff"),isIE:has("ie"),isKhtml:has("khtml"),isWebKit:has("webkit"),isMozilla:has("mozilla"),isMoz:has("mozilla"),isOpera:has("opera"),isSafari:has("safari"),isChrome:has("chrome"),isMac:has("mac"),isIos:has("ios"),isAndroid:has("android"),isWii:has("wii"),isQuirks:has("quirks"),isAir:has("air")});return has;});},"dojo/errors/create":function(){define(["../_base/lang"],function(lang){return function(name,ctor,base,_59b){base=base||Error;var _59c=function(_59d){if(base===Error){if(Error.captureStackTrace){Error.captureStackTrace(this,_59c);}var err=Error.call(this,_59d),prop;for(prop in err){if(err.hasOwnProperty(prop)){this[prop]=err[prop];}}this.message=_59d;this.stack=err.stack;}else{base.apply(this,arguments);}if(ctor){ctor.apply(this,arguments);}};_59c.prototype=lang.delegate(base.prototype,_59b);_59c.prototype.name=name;_59c.prototype.constructor=_59c;return _59c;};});},"dojo/_base/array":function(){define(["./kernel","../has","./lang"],function(dojo,has,lang){var _59e={},u;function _59f(fn){return _59e[fn]=new Function("item","index","array",fn);};function _5a0(some){var _5a1=!some;return function(a,fn,o){var i=0,l=a&&a.length||0,_5a2;if(l&&typeof a=="string"){a=a.split("");}if(typeof fn=="string"){fn=_59e[fn]||_59f(fn);}if(o){for(;i<l;++i){_5a2=!fn.call(o,a[i],i,a);if(some^_5a2){return !_5a2;}}}else{for(;i<l;++i){_5a2=!fn(a[i],i,a);if(some^_5a2){return !_5a2;}}}return _5a1;};};function _5a3(up){var _5a4=1,_5a5=0,_5a6=0;if(!up){_5a4=_5a5=_5a6=-1;}return function(a,x,from,last){if(last&&_5a4>0){return _5a7.lastIndexOf(a,x,from);}var l=a&&a.length||0,end=up?l+_5a6:_5a5,i;if(from===u){i=up?_5a5:l+_5a6;}else{if(from<0){i=l+from;if(i<0){i=_5a5;}}else{i=from>=l?l+_5a6:from;}}if(l&&typeof a=="string"){a=a.split("");}for(;i!=end;i+=_5a4){if(a[i]==x){return i;}}return -1;};};var _5a7={every:_5a0(false),some:_5a0(true),indexOf:_5a3(true),lastIndexOf:_5a3(false),forEach:function(arr,_5a8,_5a9){var i=0,l=arr&&arr.length||0;if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5a8=="string"){_5a8=_59e[_5a8]||_59f(_5a8);}if(_5a9){for(;i<l;++i){_5a8.call(_5a9,arr[i],i,arr);}}else{for(;i<l;++i){_5a8(arr[i],i,arr);}}},map:function(arr,_5aa,_5ab,Ctr){var i=0,l=arr&&arr.length||0,out=new (Ctr||Array)(l);if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5aa=="string"){_5aa=_59e[_5aa]||_59f(_5aa);}if(_5ab){for(;i<l;++i){out[i]=_5aa.call(_5ab,arr[i],i,arr);}}else{for(;i<l;++i){out[i]=_5aa(arr[i],i,arr);}}return out;},filter:function(arr,_5ac,_5ad){var i=0,l=arr&&arr.length||0,out=[],_5ae;if(l&&typeof arr=="string"){arr=arr.split("");}if(typeof _5ac=="string"){_5ac=_59e[_5ac]||_59f(_5ac);}if(_5ad){for(;i<l;++i){_5ae=arr[i];if(_5ac.call(_5ad,_5ae,i,arr)){out.push(_5ae);}}}else{for(;i<l;++i){_5ae=arr[i];if(_5ac(_5ae,i,arr)){out.push(_5ae);}}}return out;},clearCache:function(){_59e={};}};1&&lang.mixin(dojo,_5a7);return _5a7;});},"dojo/_base/json":function(){define(["./kernel","../json"],function(dojo,json){dojo.fromJson=function(js){return eval("("+js+")");};dojo._escapeString=json.stringify;dojo.toJsonIndentStr="\t";dojo.toJson=function(it,_5af){return json.stringify(it,function(key,_5b0){if(_5b0){var tf=_5b0.__json__||_5b0.json;if(typeof tf=="function"){return tf.call(_5b0);}}return _5b0;},_5af&&dojo.toJsonIndentStr);};return dojo;});},"dojo/_base/window":function(){define(["./kernel","./lang","../sniff"],function(dojo,lang,has){var ret={global:dojo.global,doc:this["document"]||null,body:function(doc){doc=doc||dojo.doc;return doc.body||doc.getElementsByTagName("body")[0];},setContext:function(_5b1,_5b2){dojo.global=ret.global=_5b1;dojo.doc=ret.doc=_5b2;},withGlobal:function(_5b3,_5b4,_5b5,_5b6){var _5b7=dojo.global;try{dojo.global=ret.global=_5b3;return ret.withDoc.call(null,_5b3.document,_5b4,_5b5,_5b6);}finally{dojo.global=ret.global=_5b7;}},withDoc:function(_5b8,_5b9,_5ba,_5bb){var _5bc=ret.doc,oldQ=has("quirks"),_5bd=has("ie"),isIE,mode,pwin;try{dojo.doc=ret.doc=_5b8;dojo.isQuirks=has.add("quirks",dojo.doc.compatMode=="BackCompat",true,true);if(has("ie")){if((pwin=_5b8.parentWindow)&&pwin.navigator){isIE=parseFloat(pwin.navigator.appVersion.split("MSIE ")[1])||undefined;mode=_5b8.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}dojo.isIE=has.add("ie",isIE,true,true);}}if(_5ba&&typeof _5b9=="string"){_5b9=_5ba[_5b9];}return _5b9.apply(_5ba,_5bb||[]);}finally{dojo.doc=ret.doc=_5bc;dojo.isQuirks=has.add("quirks",oldQ,true,true);dojo.isIE=has.add("ie",_5bd,true,true);}}};1&&lang.mixin(dojo,ret);return ret;});},"dojo/dom-class":function(){define(["./_base/lang","./_base/array","./dom"],function(lang,_5be,dom){var _5bf="className";var cls,_5c0=/\s+/,a1=[""];function _5c1(s){if(typeof s=="string"||s instanceof String){if(s&&!_5c0.test(s)){a1[0]=s;return a1;}var a=s.split(_5c0);if(a.length&&!a[0]){a.shift();}if(a.length&&!a[a.length-1]){a.pop();}return a;}if(!s){return [];}return _5be.filter(s,function(x){return x;});};var _5c2={};cls={contains:function containsClass(node,_5c3){return ((" "+dom.byId(node)[_5bf]+" ").indexOf(" "+_5c3+" ")>=0);},add:function addClass(node,_5c4){node=dom.byId(node);_5c4=_5c1(_5c4);var cls=node[_5bf],_5c5;cls=cls?" "+cls+" ":" ";_5c5=cls.length;for(var i=0,len=_5c4.length,c;i<len;++i){c=_5c4[i];if(c&&cls.indexOf(" "+c+" ")<0){cls+=c+" ";}}if(_5c5<cls.length){node[_5bf]=cls.substr(1,cls.length-2);}},remove:function removeClass(node,_5c6){node=dom.byId(node);var cls;if(_5c6!==undefined){_5c6=_5c1(_5c6);cls=" "+node[_5bf]+" ";for(var i=0,len=_5c6.length;i<len;++i){cls=cls.replace(" "+_5c6[i]+" "," ");}cls=lang.trim(cls);}else{cls="";}if(node[_5bf]!=cls){node[_5bf]=cls;}},replace:function replaceClass(node,_5c7,_5c8){node=dom.byId(node);_5c2[_5bf]=node[_5bf];cls.remove(_5c2,_5c8);cls.add(_5c2,_5c7);if(node[_5bf]!==_5c2[_5bf]){node[_5bf]=_5c2[_5bf];}},toggle:function toggleClass(node,_5c9,_5ca){node=dom.byId(node);if(_5ca===undefined){_5c9=_5c1(_5c9);for(var i=0,len=_5c9.length,c;i<len;++i){c=_5c9[i];cls[cls.contains(node,c)?"remove":"add"](node,c);}}else{cls[_5ca?"add":"remove"](node,_5c9);}return _5ca;}};return cls;});},"dojo/_base/config":function(){define(["../has","require"],function(has,_5cb){var _5cc={};if(1){var src=_5cb.rawConfig,p;for(p in src){_5cc[p]=src[p];}}else{var _5cd=function(_5ce,_5cf,_5d0){for(p in _5ce){p!="has"&&has.add(_5cf+p,_5ce[p],0,_5d0);}};_5cc=1?_5cb.rawConfig:this.dojoConfig||this.djConfig||{};_5cd(_5cc,"config",1);_5cd(_5cc.has,"",1);}if(!_5cc.locale&&typeof navigator!="undefined"){_5cc.locale=(navigator.language||navigator.userLanguage).toLowerCase();}return _5cc;});},"dojo/main":function(){define(["./_base/kernel","./has","require","./sniff","./_base/lang","./_base/array","./_base/config","./ready","./_base/declare","./_base/connect","./_base/Deferred","./_base/json","./_base/Color","./has!dojo-firebug?./_firebug/firebug","./_base/browser","./_base/loader"],function(_5d1,has,_5d2,_5d3,lang,_5d4,_5d5,_5d6){if(_5d5.isDebug){_5d2(["./_firebug/firebug"]);}1||has.add("dojo-config-require",1);if(1){var deps=_5d5.require;if(deps){deps=_5d4.map(lang.isArray(deps)?deps:[deps],function(item){return item.replace(/\./g,"/");});if(_5d1.isAsync){_5d2(deps);}else{_5d6(1,function(){_5d2(deps);});}}}return _5d1;});},"dojo/_base/event":function(){define(["./kernel","../on","../has","../dom-geometry"],function(dojo,on,has,dom){if(on._fixEvent){var _5d7=on._fixEvent;on._fixEvent=function(evt,se){evt=_5d7(evt,se);if(evt){dom.normalizeEvent(evt);}return evt;};}var ret={fix:function(evt,_5d8){if(on._fixEvent){return on._fixEvent(evt,_5d8);}return evt;},stop:function(evt){if(has("dom-addeventlistener")||(evt&&evt.preventDefault)){evt.preventDefault();evt.stopPropagation();}else{evt=evt||window.event;evt.cancelBubble=true;on._preventDefault.call(evt);}}};if(1){dojo.fixEvent=ret.fix;dojo.stopEvent=ret.stop;}return ret;});},"dojo/sniff":function(){define(["./has"],function(has){if(1){var n=navigator,dua=n.userAgent,dav=n.appVersion,tv=parseFloat(dav);has.add("air",dua.indexOf("AdobeAIR")>=0);has.add("msapp",parseFloat(dua.split("MSAppHost/")[1])||undefined);has.add("khtml",dav.indexOf("Konqueror")>=0?tv:undefined);has.add("webkit",parseFloat(dua.split("WebKit/")[1])||undefined);has.add("chrome",parseFloat(dua.split("Chrome/")[1])||undefined);has.add("safari",dav.indexOf("Safari")>=0&&!has("chrome")?parseFloat(dav.split("Version/")[1]):undefined);has.add("mac",dav.indexOf("Macintosh")>=0);has.add("quirks",document.compatMode=="BackCompat");if(dua.match(/(iPhone|iPod|iPad)/)){var p=RegExp.$1.replace(/P/,"p");var v=dua.match(/OS ([\d_]+)/)?RegExp.$1:"1";var os=parseFloat(v.replace(/_/,".").replace(/_/g,""));has.add(p,os);has.add("ios",os);}has.add("android",parseFloat(dua.split("Android ")[1])||undefined);has.add("bb",(dua.indexOf("BlackBerry")>=0||dua.indexOf("BB10")>=0)&&parseFloat(dua.split("Version/")[1])||undefined);has.add("trident",parseFloat(dav.split("Trident/")[1])||undefined);has.add("svg",typeof SVGAngle!=="undefined");if(!has("webkit")){if(dua.indexOf("Opera")>=0){has.add("opera",tv>=9.8?parseFloat(dua.split("Version/")[1])||tv:tv);}if(dua.indexOf("Gecko")>=0&&!has("khtml")&&!has("webkit")&&!has("trident")){has.add("mozilla",tv);}if(has("mozilla")){has.add("ff",parseFloat(dua.split("Firefox/")[1]||dua.split("Minefield/")[1])||undefined);}if(document.all&&!has("opera")){var isIE=parseFloat(dav.split("MSIE ")[1])||undefined;var mode=document.documentMode;if(mode&&mode!=5&&Math.floor(isIE)!=mode){isIE=mode;}has.add("ie",isIE);}has.add("wii",typeof opera!="undefined"&&opera.wiiremote);}}return has;});},"dojo/request/handlers":function(){define(["../json","../_base/kernel","../_base/array","../has","../selector/_loader"],function(JSON,_5d9,_5da,has){has.add("activex",typeof ActiveXObject!=="undefined");has.add("dom-parser",function(_5db){return "DOMParser" in _5db;});var _5dc;if(has("activex")){var dp=["Msxml2.DOMDocument.6.0","Msxml2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML.DOMDocument"];_5dc=function(_5dd){var _5de=_5dd.data;if(_5de&&has("dom-qsa2.1")&&!_5de.querySelectorAll&&has("dom-parser")){_5de=new DOMParser().parseFromString(_5dd.text,"application/xml");}if(!_5de||!_5de.documentElement){var text=_5dd.text;_5da.some(dp,function(p){try{var dom=new ActiveXObject(p);dom.async=false;dom.loadXML(text);_5de=dom;}catch(e){return false;}return true;});}return _5de;};}var _5df={"javascript":function(_5e0){return _5d9.eval(_5e0.text||"");},"json":function(_5e1){return JSON.parse(_5e1.text||null);},"xml":_5dc};function _5e2(_5e3){var _5e4=_5df[_5e3.options.handleAs];_5e3.data=_5e4?_5e4(_5e3):(_5e3.data||_5e3.text);return _5e3;};_5e2.register=function(name,_5e5){_5df[name]=_5e5;};return _5e2;});},"dojo/aspect":function(){define([],function(){"use strict";var _5e6,_5e7=0;function _5e8(_5e9,type,_5ea,_5eb){var _5ec=_5e9[type];var _5ed=type=="around";var _5ee;if(_5ed){var _5ef=_5ea(function(){return _5ec.advice(this,arguments);});_5ee={remove:function(){if(_5ef){_5ef=_5e9=_5ea=null;}},advice:function(_5f0,args){return _5ef?_5ef.apply(_5f0,args):_5ec.advice(_5f0,args);}};}else{_5ee={remove:function(){if(_5ee.advice){var _5f1=_5ee.previous;var next=_5ee.next;if(!next&&!_5f1){delete _5e9[type];}else{if(_5f1){_5f1.next=next;}else{_5e9[type]=next;}if(next){next.previous=_5f1;}}_5e9=_5ea=_5ee.advice=null;}},id:_5e7++,advice:_5ea,receiveArguments:_5eb};}if(_5ec&&!_5ed){if(type=="after"){while(_5ec.next&&(_5ec=_5ec.next)){}_5ec.next=_5ee;_5ee.previous=_5ec;}else{if(type=="before"){_5e9[type]=_5ee;_5ee.next=_5ec;_5ec.previous=_5ee;}}}else{_5e9[type]=_5ee;}return _5ee;};function _5f2(type){return function(_5f3,_5f4,_5f5,_5f6){var _5f7=_5f3[_5f4],_5f8;if(!_5f7||_5f7.target!=_5f3){_5f3[_5f4]=_5f8=function(){var _5f9=_5e7;var args=arguments;var _5fa=_5f8.before;while(_5fa){args=_5fa.advice.apply(this,args)||args;_5fa=_5fa.next;}if(_5f8.around){var _5fb=_5f8.around.advice(this,args);}var _5fc=_5f8.after;while(_5fc&&_5fc.id<_5f9){if(_5fc.receiveArguments){var _5fd=_5fc.advice.apply(this,args);_5fb=_5fd===_5e6?_5fb:_5fd;}else{_5fb=_5fc.advice.call(this,_5fb,args);}_5fc=_5fc.next;}return _5fb;};if(_5f7){_5f8.around={advice:function(_5fe,args){return _5f7.apply(_5fe,args);}};}_5f8.target=_5f3;}var _5ff=_5e8((_5f8||_5f7),type,_5f5,_5f6);_5f5=null;return _5ff;};};var _600=_5f2("after");var _601=_5f2("before");var _602=_5f2("around");return {before:_601,around:_602,after:_600};});},"dojo/ready":function(){define(["./_base/kernel","./has","require","./domReady","./_base/lang"],function(dojo,has,_603,_604,lang){var _605=0,_606=[],_607=0,_608=function(){_605=1;dojo._postLoad=dojo.config.afterOnLoad=true;_609();},_609=function(){if(_607){return;}_607=1;while(_605&&(!_604||_604._Q.length==0)&&(_603.idle?_603.idle():true)&&_606.length){var f=_606.shift();try{f();}catch(e){e.info=e.message;if(_603.signal){_603.signal("error",e);}else{throw e;}}}_607=0;};_603.on&&_603.on("idle",_609);if(_604){_604._onQEmpty=_609;}var _60a=dojo.ready=dojo.addOnLoad=function(_60b,_60c,_60d){var _60e=lang._toArray(arguments);if(typeof _60b!="number"){_60d=_60c;_60c=_60b;_60b=1000;}else{_60e.shift();}_60d=_60d?lang.hitch.apply(dojo,_60e):function(){_60c();};_60d.priority=_60b;for(var i=0;i<_606.length&&_60b>=_606[i].priority;i++){}_606.splice(i,0,_60d);_609();};1||has.add("dojo-config-addOnLoad",1);if(1){var dca=dojo.config.addOnLoad;if(dca){_60a[(lang.isArray(dca)?"apply":"call")](dojo,dca);}}if(1&&dojo.config.parseOnLoad&&!dojo.isAsync){_60a(99,function(){if(!dojo.parser){dojo.deprecated("Add explicit require(['dojo/parser']);","","2.0");_603(["dojo/parser"]);}});}if(_604){_604(_608);}else{_608();}return _60a;});},"dojo/_base/connect":function(){define(["./kernel","../on","../topic","../aspect","./event","../mouse","./sniff","./lang","../keys"],function(dojo,on,hub,_60f,_610,_611,has,lang){has.add("events-keypress-typed",function(){var _612={charCode:0};try{_612=document.createEvent("KeyboardEvent");(_612.initKeyboardEvent||_612.initKeyEvent).call(_612,"keypress",true,true,null,false,false,false,false,9,3);}catch(e){}return _612.charCode==0&&!has("opera");});function _613(obj,_614,_615,_616,_617){_616=lang.hitch(_615,_616);if(!obj||!(obj.addEventListener||obj.attachEvent)){return _60f.after(obj||dojo.global,_614,_616,true);}if(typeof _614=="string"&&_614.substring(0,2)=="on"){_614=_614.substring(2);}if(!obj){obj=dojo.global;}if(!_617){switch(_614){case "keypress":_614=_618;break;case "mouseenter":_614=_611.enter;break;case "mouseleave":_614=_611.leave;break;}}return on(obj,_614,_616,_617);};var _619={106:42,111:47,186:59,187:43,188:44,189:45,190:46,191:47,192:96,219:91,220:92,221:93,222:39,229:113};var _61a=has("mac")?"metaKey":"ctrlKey";var _61b=function(evt,_61c){var faux=lang.mixin({},evt,_61c);_61d(faux);faux.preventDefault=function(){evt.preventDefault();};faux.stopPropagation=function(){evt.stopPropagation();};return faux;};function _61d(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _618;if(has("events-keypress-typed")){var _61e=function(e,code){try{return (e.keyCode=code);}catch(e){return 0;}};_618=function(_61f,_620){var _621=on(_61f,"keydown",function(evt){var k=evt.keyCode;var _622=(k!=13)&&k!=32&&(k!=27||!has("ie"))&&(k<48||k>90)&&(k<96||k>111)&&(k<186||k>192)&&(k<219||k>222)&&k!=229;if(_622||evt.ctrlKey){var c=_622?0:k;if(evt.ctrlKey){if(k==3||k==13){return _620.call(evt.currentTarget,evt);}else{if(c>95&&c<106){c-=48;}else{if((!evt.shiftKey)&&(c>=65&&c<=90)){c+=32;}else{c=_619[c]||c;}}}}var faux=_61b(evt,{type:"keypress",faux:true,charCode:c});_620.call(evt.currentTarget,faux);if(has("ie")){_61e(evt,faux.keyCode);}}});var _623=on(_61f,"keypress",function(evt){var c=evt.charCode;c=c>=32?c:0;evt=_61b(evt,{charCode:c,faux:true});return _620.call(this,evt);});return {remove:function(){_621.remove();_623.remove();}};};}else{if(has("opera")){_618=function(_624,_625){return on(_624,"keypress",function(evt){var c=evt.which;if(c==3){c=99;}c=c<32&&!evt.shiftKey?0:c;if(evt.ctrlKey&&!evt.shiftKey&&c>=65&&c<=90){c+=32;}return _625.call(this,_61b(evt,{charCode:c}));});};}else{_618=function(_626,_627){return on(_626,"keypress",function(evt){_61d(evt);return _627.call(this,evt);});};}}var _628={_keypress:_618,connect:function(obj,_629,_62a,_62b,_62c){var a=arguments,args=[],i=0;args.push(typeof a[0]=="string"?null:a[i++],a[i++]);var a1=a[i+1];args.push(typeof a1=="string"||typeof a1=="function"?a[i++]:null,a[i++]);for(var l=a.length;i<l;i++){args.push(a[i]);}return _613.apply(this,args);},disconnect:function(_62d){if(_62d){_62d.remove();}},subscribe:function(_62e,_62f,_630){return hub.subscribe(_62e,lang.hitch(_62f,_630));},publish:function(_631,args){return hub.publish.apply(hub,[_631].concat(args));},connectPublisher:function(_632,obj,_633){var pf=function(){_628.publish(_632,arguments);};return _633?_628.connect(obj,_633,pf):_628.connect(obj,pf);},isCopyKey:function(e){return e[_61a];}};_628.unsubscribe=_628.disconnect;1&&lang.mixin(dojo,_628);return _628;});},"dojo/errors/CancelError":function(){define(["./create"],function(_634){return _634("CancelError",null,null,{dojoType:"cancel"});});}}});(function(){var _635=this.require;_635({cache:{}});!_635.async&&_635(["dojo"]);_635.boot&&_635.apply(null,_635.boot);})();
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/dojo/regexp.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-//>>built
-define("dojo/regexp",["./_base/kernel","./_base/lang"],function(_1,_2){
-var _3={};
-_2.setObject("dojo.regexp",_3);
-_3.escapeString=function(_4,_5){
-return _4.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){
-if(_5&&_5.indexOf(ch)!=-1){
-return ch;
-}
-return "\\"+ch;
-});
-};
-_3.buildGroupRE=function(_6,re,_7){
-if(!(_6 instanceof Array)){
-return re(_6);
-}
-var b=[];
-for(var i=0;i<_6.length;i++){
-b.push(re(_6[i]));
-}
-return _3.group(b.join("|"),_7);
-};
-_3.group=function(_8,_9){
-return "("+(_9?"?:":"")+_8+")";
-};
-return _3;
-});
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/animated-overlay.gif has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_222222_256x240.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_228ef1_256x240.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ef8c08_256x240.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ffd27a_256x240.png has changed
Binary file server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/images/ui-icons_ffffff_256x240.png has changed
--- a/server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/jquery-ui.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1177 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-10-19
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden {
- display: none;
-}
-.ui-helper-hidden-accessible {
- border: 0;
- clip: rect(0 0 0 0);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0;
- position: absolute;
- width: 1px;
-}
-.ui-helper-reset {
- margin: 0;
- padding: 0;
- border: 0;
- outline: 0;
- line-height: 1.3;
- text-decoration: none;
- font-size: 100%;
- list-style: none;
-}
-.ui-helper-clearfix:before,
-.ui-helper-clearfix:after {
- content: "";
- display: table;
- border-collapse: collapse;
-}
-.ui-helper-clearfix:after {
- clear: both;
-}
-.ui-helper-clearfix {
- min-height: 0; /* support: IE7 */
-}
-.ui-helper-zfix {
- width: 100%;
- height: 100%;
- top: 0;
- left: 0;
- position: absolute;
- opacity: 0;
- filter:Alpha(Opacity=0);
-}
-
-.ui-front {
- z-index: 100;
-}
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled {
- cursor: default !important;
-}
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- display: block;
- text-indent: -99999px;
- overflow: hidden;
- background-repeat: no-repeat;
-}
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay {
- position: fixed;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
-.ui-resizable {
- position: relative;
-}
-.ui-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
-}
-.ui-resizable-disabled .ui-resizable-handle,
-.ui-resizable-autohide .ui-resizable-handle {
- display: none;
-}
-.ui-resizable-n {
- cursor: n-resize;
- height: 7px;
- width: 100%;
- top: -5px;
- left: 0;
-}
-.ui-resizable-s {
- cursor: s-resize;
- height: 7px;
- width: 100%;
- bottom: -5px;
- left: 0;
-}
-.ui-resizable-e {
- cursor: e-resize;
- width: 7px;
- right: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-w {
- cursor: w-resize;
- width: 7px;
- left: -5px;
- top: 0;
- height: 100%;
-}
-.ui-resizable-se {
- cursor: se-resize;
- width: 12px;
- height: 12px;
- right: 1px;
- bottom: 1px;
-}
-.ui-resizable-sw {
- cursor: sw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- bottom: -5px;
-}
-.ui-resizable-nw {
- cursor: nw-resize;
- width: 9px;
- height: 9px;
- left: -5px;
- top: -5px;
-}
-.ui-resizable-ne {
- cursor: ne-resize;
- width: 9px;
- height: 9px;
- right: -5px;
- top: -5px;
-}
-.ui-selectable-helper {
- position: absolute;
- z-index: 100;
- border: 1px dotted black;
-}
-.ui-accordion .ui-accordion-header {
- display: block;
- cursor: pointer;
- position: relative;
- margin-top: 2px;
- padding: .5em .5em .5em .7em;
- min-height: 0; /* support: IE7 */
-}
-.ui-accordion .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-noicons {
- padding-left: .7em;
-}
-.ui-accordion .ui-accordion-icons .ui-accordion-icons {
- padding-left: 2.2em;
-}
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
- position: absolute;
- left: .5em;
- top: 50%;
- margin-top: -8px;
-}
-.ui-accordion .ui-accordion-content {
- padding: 1em 2.2em;
- border-top: 0;
- overflow: auto;
-}
-.ui-autocomplete {
- position: absolute;
- top: 0;
- left: 0;
- cursor: default;
-}
-.ui-button {
- display: inline-block;
- position: relative;
- padding: 0;
- line-height: normal;
- margin-right: .1em;
- cursor: pointer;
- vertical-align: middle;
- text-align: center;
- overflow: visible; /* removes extra width in IE */
-}
-.ui-button,
-.ui-button:link,
-.ui-button:visited,
-.ui-button:hover,
-.ui-button:active {
- text-decoration: none;
-}
-/* to make room for the icon, a width needs to be set here */
-.ui-button-icon-only {
- width: 2.2em;
-}
-/* button elements seem to need a little more width */
-button.ui-button-icon-only {
- width: 2.4em;
-}
-.ui-button-icons-only {
- width: 3.4em;
-}
-button.ui-button-icons-only {
- width: 3.7em;
-}
-
-/* button text element */
-.ui-button .ui-button-text {
- display: block;
- line-height: normal;
-}
-.ui-button-text-only .ui-button-text {
- padding: .4em 1em;
-}
-.ui-button-icon-only .ui-button-text,
-.ui-button-icons-only .ui-button-text {
- padding: .4em;
- text-indent: -9999999px;
-}
-.ui-button-text-icon-primary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 1em .4em 2.1em;
-}
-.ui-button-text-icon-secondary .ui-button-text,
-.ui-button-text-icons .ui-button-text {
- padding: .4em 2.1em .4em 1em;
-}
-.ui-button-text-icons .ui-button-text {
- padding-left: 2.1em;
- padding-right: 2.1em;
-}
-/* no icon support for input elements, provide padding by default */
-input.ui-button {
- padding: .4em 1em;
-}
-
-/* button icon element(s) */
-.ui-button-icon-only .ui-icon,
-.ui-button-text-icon-primary .ui-icon,
-.ui-button-text-icon-secondary .ui-icon,
-.ui-button-text-icons .ui-icon,
-.ui-button-icons-only .ui-icon {
- position: absolute;
- top: 50%;
- margin-top: -8px;
-}
-.ui-button-icon-only .ui-icon {
- left: 50%;
- margin-left: -8px;
-}
-.ui-button-text-icon-primary .ui-button-icon-primary,
-.ui-button-text-icons .ui-button-icon-primary,
-.ui-button-icons-only .ui-button-icon-primary {
- left: .5em;
-}
-.ui-button-text-icon-secondary .ui-button-icon-secondary,
-.ui-button-text-icons .ui-button-icon-secondary,
-.ui-button-icons-only .ui-button-icon-secondary {
- right: .5em;
-}
-
-/* button sets */
-.ui-buttonset {
- margin-right: 7px;
-}
-.ui-buttonset .ui-button {
- margin-left: 0;
- margin-right: -.3em;
-}
-
-/* workarounds */
-/* reset extra padding in Firefox, see h5bp.com/l */
-input.ui-button::-moz-focus-inner,
-button.ui-button::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-.ui-datepicker {
- width: 17em;
- padding: .2em .2em 0;
- display: none;
-}
-.ui-datepicker .ui-datepicker-header {
- position: relative;
- padding: .2em 0;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
- position: absolute;
- top: 2px;
- width: 1.8em;
- height: 1.8em;
-}
-.ui-datepicker .ui-datepicker-prev-hover,
-.ui-datepicker .ui-datepicker-next-hover {
- top: 1px;
-}
-.ui-datepicker .ui-datepicker-prev {
- left: 2px;
-}
-.ui-datepicker .ui-datepicker-next {
- right: 2px;
-}
-.ui-datepicker .ui-datepicker-prev-hover {
- left: 1px;
-}
-.ui-datepicker .ui-datepicker-next-hover {
- right: 1px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
- display: block;
- position: absolute;
- left: 50%;
- margin-left: -8px;
- top: 50%;
- margin-top: -8px;
-}
-.ui-datepicker .ui-datepicker-title {
- margin: 0 2.3em;
- line-height: 1.8em;
- text-align: center;
-}
-.ui-datepicker .ui-datepicker-title select {
- font-size: 1em;
- margin: 1px 0;
-}
-.ui-datepicker select.ui-datepicker-month-year {
- width: 100%;
-}
-.ui-datepicker select.ui-datepicker-month,
-.ui-datepicker select.ui-datepicker-year {
- width: 49%;
-}
-.ui-datepicker table {
- width: 100%;
- font-size: .9em;
- border-collapse: collapse;
- margin: 0 0 .4em;
-}
-.ui-datepicker th {
- padding: .7em .3em;
- text-align: center;
- font-weight: bold;
- border: 0;
-}
-.ui-datepicker td {
- border: 0;
- padding: 1px;
-}
-.ui-datepicker td span,
-.ui-datepicker td a {
- display: block;
- padding: .2em;
- text-align: right;
- text-decoration: none;
-}
-.ui-datepicker .ui-datepicker-buttonpane {
- background-image: none;
- margin: .7em 0 0 0;
- padding: 0 .2em;
- border-left: 0;
- border-right: 0;
- border-bottom: 0;
-}
-.ui-datepicker .ui-datepicker-buttonpane button {
- float: right;
- margin: .5em .2em .4em;
- cursor: pointer;
- padding: .2em .6em .3em .6em;
- width: auto;
- overflow: visible;
-}
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
- float: left;
-}
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi {
- width: auto;
-}
-.ui-datepicker-multi .ui-datepicker-group {
- float: left;
-}
-.ui-datepicker-multi .ui-datepicker-group table {
- width: 95%;
- margin: 0 auto .4em;
-}
-.ui-datepicker-multi-2 .ui-datepicker-group {
- width: 50%;
-}
-.ui-datepicker-multi-3 .ui-datepicker-group {
- width: 33.3%;
-}
-.ui-datepicker-multi-4 .ui-datepicker-group {
- width: 25%;
-}
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
- border-left-width: 0;
-}
-.ui-datepicker-multi .ui-datepicker-buttonpane {
- clear: left;
-}
-.ui-datepicker-row-break {
- clear: both;
- width: 100%;
- font-size: 0;
-}
-
-/* RTL support */
-.ui-datepicker-rtl {
- direction: rtl;
-}
-.ui-datepicker-rtl .ui-datepicker-prev {
- right: 2px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next {
- left: 2px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-prev:hover {
- right: 1px;
- left: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-next:hover {
- left: 1px;
- right: auto;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane {
- clear: right;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button {
- float: left;
-}
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
-.ui-datepicker-rtl .ui-datepicker-group {
- float: right;
-}
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
- border-right-width: 0;
- border-left-width: 1px;
-}
-.ui-dialog {
- position: absolute;
- top: 0;
- left: 0;
- padding: .2em;
- outline: 0;
-}
-.ui-dialog .ui-dialog-titlebar {
- padding: .4em 1em;
- position: relative;
-}
-.ui-dialog .ui-dialog-title {
- float: left;
- margin: .1em 0;
- white-space: nowrap;
- width: 90%;
- overflow: hidden;
- text-overflow: ellipsis;
-}
-.ui-dialog .ui-dialog-titlebar-close {
- position: absolute;
- right: .3em;
- top: 50%;
- width: 21px;
- margin: -10px 0 0 0;
- padding: 1px;
- height: 20px;
-}
-.ui-dialog .ui-dialog-content {
- position: relative;
- border: 0;
- padding: .5em 1em;
- background: none;
- overflow: auto;
-}
-.ui-dialog .ui-dialog-buttonpane {
- text-align: left;
- border-width: 1px 0 0 0;
- background-image: none;
- margin-top: .5em;
- padding: .3em 1em .5em .4em;
-}
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
- float: right;
-}
-.ui-dialog .ui-dialog-buttonpane button {
- margin: .5em .4em .5em 0;
- cursor: pointer;
-}
-.ui-dialog .ui-resizable-se {
- width: 12px;
- height: 12px;
- right: -5px;
- bottom: -5px;
- background-position: 16px 16px;
-}
-.ui-draggable .ui-dialog-titlebar {
- cursor: move;
-}
-.ui-menu {
- list-style: none;
- padding: 2px;
- margin: 0;
- display: block;
- outline: none;
-}
-.ui-menu .ui-menu {
- margin-top: -3px;
- position: absolute;
-}
-.ui-menu .ui-menu-item {
- margin: 0;
- padding: 0;
- width: 100%;
- /* support: IE10, see #8844 */
- list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
-}
-.ui-menu .ui-menu-divider {
- margin: 5px -2px 5px -2px;
- height: 0;
- font-size: 0;
- line-height: 0;
- border-width: 1px 0 0 0;
-}
-.ui-menu .ui-menu-item a {
- text-decoration: none;
- display: block;
- padding: 2px .4em;
- line-height: 1.5;
- min-height: 0; /* support: IE7 */
- font-weight: normal;
-}
-.ui-menu .ui-menu-item a.ui-state-focus,
-.ui-menu .ui-menu-item a.ui-state-active {
- font-weight: normal;
- margin: -1px;
-}
-
-.ui-menu .ui-state-disabled {
- font-weight: normal;
- margin: .4em 0 .2em;
- line-height: 1.5;
-}
-.ui-menu .ui-state-disabled a {
- cursor: default;
-}
-
-/* icon support */
-.ui-menu-icons {
- position: relative;
-}
-.ui-menu-icons .ui-menu-item a {
- position: relative;
- padding-left: 2em;
-}
-
-/* left-aligned */
-.ui-menu .ui-icon {
- position: absolute;
- top: .2em;
- left: .2em;
-}
-
-/* right-aligned */
-.ui-menu .ui-menu-icon {
- position: static;
- float: right;
-}
-.ui-progressbar {
- height: 2em;
- text-align: left;
- overflow: hidden;
-}
-.ui-progressbar .ui-progressbar-value {
- margin: -1px;
- height: 100%;
-}
-.ui-progressbar .ui-progressbar-overlay {
- background: url("images/animated-overlay.gif");
- height: 100%;
- filter: alpha(opacity=25);
- opacity: 0.25;
-}
-.ui-progressbar-indeterminate .ui-progressbar-value {
- background-image: none;
-}
-.ui-slider {
- position: relative;
- text-align: left;
-}
-.ui-slider .ui-slider-handle {
- position: absolute;
- z-index: 2;
- width: 1.2em;
- height: 1.2em;
- cursor: default;
-}
-.ui-slider .ui-slider-range {
- position: absolute;
- z-index: 1;
- font-size: .7em;
- display: block;
- border: 0;
- background-position: 0 0;
-}
-
-/* For IE8 - See #6727 */
-.ui-slider.ui-state-disabled .ui-slider-handle,
-.ui-slider.ui-state-disabled .ui-slider-range {
- filter: inherit;
-}
-
-.ui-slider-horizontal {
- height: .8em;
-}
-.ui-slider-horizontal .ui-slider-handle {
- top: -.3em;
- margin-left: -.6em;
-}
-.ui-slider-horizontal .ui-slider-range {
- top: 0;
- height: 100%;
-}
-.ui-slider-horizontal .ui-slider-range-min {
- left: 0;
-}
-.ui-slider-horizontal .ui-slider-range-max {
- right: 0;
-}
-
-.ui-slider-vertical {
- width: .8em;
- height: 100px;
-}
-.ui-slider-vertical .ui-slider-handle {
- left: -.3em;
- margin-left: 0;
- margin-bottom: -.6em;
-}
-.ui-slider-vertical .ui-slider-range {
- left: 0;
- width: 100%;
-}
-.ui-slider-vertical .ui-slider-range-min {
- bottom: 0;
-}
-.ui-slider-vertical .ui-slider-range-max {
- top: 0;
-}
-.ui-spinner {
- position: relative;
- display: inline-block;
- overflow: hidden;
- padding: 0;
- vertical-align: middle;
-}
-.ui-spinner-input {
- border: none;
- background: none;
- color: inherit;
- padding: 0;
- margin: .2em 0;
- vertical-align: middle;
- margin-left: .4em;
- margin-right: 22px;
-}
-.ui-spinner-button {
- width: 16px;
- height: 50%;
- font-size: .5em;
- padding: 0;
- margin: 0;
- text-align: center;
- position: absolute;
- cursor: default;
- display: block;
- overflow: hidden;
- right: 0;
-}
-/* more specificity required here to overide default borders */
-.ui-spinner a.ui-spinner-button {
- border-top: none;
- border-bottom: none;
- border-right: none;
-}
-/* vertical centre icon */
-.ui-spinner .ui-icon {
- position: absolute;
- margin-top: -8px;
- top: 50%;
- left: 0;
-}
-.ui-spinner-up {
- top: 0;
-}
-.ui-spinner-down {
- bottom: 0;
-}
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
- /* need to fix icons sprite */
- background-position: -65px -16px;
-}
-.ui-tabs {
- position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
- padding: .2em;
-}
-.ui-tabs .ui-tabs-nav {
- margin: 0;
- padding: .2em .2em 0;
-}
-.ui-tabs .ui-tabs-nav li {
- list-style: none;
- float: left;
- position: relative;
- top: 0;
- margin: 1px .2em 0 0;
- border-bottom-width: 0;
- padding: 0;
- white-space: nowrap;
-}
-.ui-tabs .ui-tabs-nav li a {
- float: left;
- padding: .5em 1em;
- text-decoration: none;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active {
- margin-bottom: -1px;
- padding-bottom: 1px;
-}
-.ui-tabs .ui-tabs-nav li.ui-tabs-active a,
-.ui-tabs .ui-tabs-nav li.ui-state-disabled a,
-.ui-tabs .ui-tabs-nav li.ui-tabs-loading a {
- cursor: text;
-}
-.ui-tabs .ui-tabs-nav li a, /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a {
- cursor: pointer;
-}
-.ui-tabs .ui-tabs-panel {
- display: block;
- border-width: 0;
- padding: 1em 1.4em;
- background: none;
-}
-.ui-tooltip {
- padding: 8px;
- position: absolute;
- z-index: 9999;
- max-width: 300px;
- -webkit-box-shadow: 0 0 5px #aaa;
- box-shadow: 0 0 5px #aaa;
-}
-body .ui-tooltip {
- border-width: 2px;
-}
-
-/* Component containers
-----------------------------------*/
-.ui-widget {
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1.1em;
-}
-.ui-widget .ui-widget {
- font-size: 1em;
-}
-.ui-widget input,
-.ui-widget select,
-.ui-widget textarea,
-.ui-widget button {
- font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
- font-size: 1em;
-}
-.ui-widget-content {
- border: 1px solid #dddddd;
- background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;
- color: #333333;
-}
-.ui-widget-content a {
- color: #333333;
-}
-.ui-widget-header {
- border: 1px solid #e78f08;
- background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;
- color: #ffffff;
- font-weight: bold;
-}
-.ui-widget-header a {
- color: #ffffff;
-}
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
- border: 1px solid #cccccc;
- background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;
- font-weight: bold;
- color: #1c94c4;
-}
-.ui-state-default a,
-.ui-state-default a:link,
-.ui-state-default a:visited {
- color: #1c94c4;
- text-decoration: none;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
- border: 1px solid #fbcb09;
- background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;
- font-weight: bold;
- color: #c77405;
-}
-.ui-state-hover a,
-.ui-state-hover a:hover,
-.ui-state-hover a:link,
-.ui-state-hover a:visited {
- color: #c77405;
- text-decoration: none;
-}
-.ui-state-active,
-.ui-widget-content .ui-state-active,
-.ui-widget-header .ui-state-active {
- border: 1px solid #fbd850;
- background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
- font-weight: bold;
- color: #eb8f00;
-}
-.ui-state-active a,
-.ui-state-active a:link,
-.ui-state-active a:visited {
- color: #eb8f00;
- text-decoration: none;
-}
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight,
-.ui-widget-content .ui-state-highlight,
-.ui-widget-header .ui-state-highlight {
- border: 1px solid #fed22f;
- background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;
- color: #363636;
-}
-.ui-state-highlight a,
-.ui-widget-content .ui-state-highlight a,
-.ui-widget-header .ui-state-highlight a {
- color: #363636;
-}
-.ui-state-error,
-.ui-widget-content .ui-state-error,
-.ui-widget-header .ui-state-error {
- border: 1px solid #cd0a0a;
- background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;
- color: #ffffff;
-}
-.ui-state-error a,
-.ui-widget-content .ui-state-error a,
-.ui-widget-header .ui-state-error a {
- color: #ffffff;
-}
-.ui-state-error-text,
-.ui-widget-content .ui-state-error-text,
-.ui-widget-header .ui-state-error-text {
- color: #ffffff;
-}
-.ui-priority-primary,
-.ui-widget-content .ui-priority-primary,
-.ui-widget-header .ui-priority-primary {
- font-weight: bold;
-}
-.ui-priority-secondary,
-.ui-widget-content .ui-priority-secondary,
-.ui-widget-header .ui-priority-secondary {
- opacity: .7;
- filter:Alpha(Opacity=70);
- font-weight: normal;
-}
-.ui-state-disabled,
-.ui-widget-content .ui-state-disabled,
-.ui-widget-header .ui-state-disabled {
- opacity: .35;
- filter:Alpha(Opacity=35);
- background-image: none;
-}
-.ui-state-disabled .ui-icon {
- filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
-}
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon {
- width: 16px;
- height: 16px;
-}
-.ui-icon,
-.ui-widget-content .ui-icon {
- background-image: url(images/ui-icons_222222_256x240.png);
-}
-.ui-widget-header .ui-icon {
- background-image: url(images/ui-icons_ffffff_256x240.png);
-}
-.ui-state-default .ui-icon {
- background-image: url(images/ui-icons_ef8c08_256x240.png);
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
- background-image: url(images/ui-icons_ef8c08_256x240.png);
-}
-.ui-state-active .ui-icon {
- background-image: url(images/ui-icons_ef8c08_256x240.png);
-}
-.ui-state-highlight .ui-icon {
- background-image: url(images/ui-icons_228ef1_256x240.png);
-}
-.ui-state-error .ui-icon,
-.ui-state-error-text .ui-icon {
- background-image: url(images/ui-icons_ffd27a_256x240.png);
-}
-
-/* positioning */
-.ui-icon-blank { background-position: 16px 16px; }
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-left,
-.ui-corner-tl {
- border-top-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-top,
-.ui-corner-right,
-.ui-corner-tr {
- border-top-right-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-left,
-.ui-corner-bl {
- border-bottom-left-radius: 4px;
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
- border-bottom-right-radius: 4px;
-}
-
-/* Overlays */
-.ui-widget-overlay {
- background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;
- opacity: .5;
- filter: Alpha(Opacity=50);
-}
-.ui-widget-shadow {
- margin: -5px 0 0 -5px;
- padding: 5px;
- background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;
- opacity: .2;
- filter: Alpha(Opacity=20);
- border-radius: 5px;
-}
--- a/server/renkan-web/src/main/webapp/static/lib/jquery-ui/css/ui-lightness/jquery-ui.min.css Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-10-19
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-
-.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/jquery-ui/i18n/jquery-ui-i18n.min.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-05-03
-* http://jqueryui.com
-* Includes: jquery.ui.datepicker-af.js, jquery.ui.datepicker-ar-DZ.js, jquery.ui.datepicker-ar.js, jquery.ui.datepicker-az.js, jquery.ui.datepicker-be.js, jquery.ui.datepicker-bg.js, jquery.ui.datepicker-bs.js, jquery.ui.datepicker-ca.js, jquery.ui.datepicker-cs.js, jquery.ui.datepicker-cy-GB.js, jquery.ui.datepicker-da.js, jquery.ui.datepicker-de.js, jquery.ui.datepicker-el.js, jquery.ui.datepicker-en-AU.js, jquery.ui.datepicker-en-GB.js, jquery.ui.datepicker-en-NZ.js, jquery.ui.datepicker-eo.js, jquery.ui.datepicker-es.js, jquery.ui.datepicker-et.js, jquery.ui.datepicker-eu.js, jquery.ui.datepicker-fa.js, jquery.ui.datepicker-fi.js, jquery.ui.datepicker-fo.js, jquery.ui.datepicker-fr-CA.js, jquery.ui.datepicker-fr-CH.js, jquery.ui.datepicker-fr.js, jquery.ui.datepicker-gl.js, jquery.ui.datepicker-he.js, jquery.ui.datepicker-hi.js, jquery.ui.datepicker-hr.js, jquery.ui.datepicker-hu.js, jquery.ui.datepicker-hy.js, jquery.ui.datepicker-id.js, jquery.ui.datepicker-is.js, jquery.ui.datepicker-it.js, jquery.ui.datepicker-ja.js, jquery.ui.datepicker-ka.js, jquery.ui.datepicker-kk.js, jquery.ui.datepicker-km.js, jquery.ui.datepicker-ko.js, jquery.ui.datepicker-ky.js, jquery.ui.datepicker-lb.js, jquery.ui.datepicker-lt.js, jquery.ui.datepicker-lv.js, jquery.ui.datepicker-mk.js, jquery.ui.datepicker-ml.js, jquery.ui.datepicker-ms.js, jquery.ui.datepicker-nb.js, jquery.ui.datepicker-nl-BE.js, jquery.ui.datepicker-nl.js, jquery.ui.datepicker-nn.js, jquery.ui.datepicker-no.js, jquery.ui.datepicker-pl.js, jquery.ui.datepicker-pt-BR.js, jquery.ui.datepicker-pt.js, jquery.ui.datepicker-rm.js, jquery.ui.datepicker-ro.js, jquery.ui.datepicker-ru.js, jquery.ui.datepicker-sk.js, jquery.ui.datepicker-sl.js, jquery.ui.datepicker-sq.js, jquery.ui.datepicker-sr-SR.js, jquery.ui.datepicker-sr.js, jquery.ui.datepicker-sv.js, jquery.ui.datepicker-ta.js, jquery.ui.datepicker-th.js, jquery.ui.datepicker-tj.js, jquery.ui.datepicker-tr.js, jquery.ui.datepicker-uk.js, jquery.ui.datepicker-vi.js, jquery.ui.datepicker-zh-CN.js, jquery.ui.datepicker-zh-HK.js, jquery.ui.datepicker-zh-TW.js
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-jQuery(function(e){e.datepicker.regional.af={closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.af)}),jQuery(function(e){e.datepicker.regional["ar-DZ"]={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["ar-DZ"])}),jQuery(function(e){e.datepicker.regional.ar={closeText:"إغلاق",prevText:"<السابق",nextText:"التالي>",currentText:"اليوم",monthNames:["كانون الثاني","شباط","آذار","نيسان","مايو","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ar)}),jQuery(function(e){e.datepicker.regional.az={closeText:"Bağla",prevText:"<Geri",nextText:"İrəli>",currentText:"Bugün",monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avqust","Sentyabr","Oktyabr","Noyabr","Dekabr"],monthNamesShort:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avq","Sen","Okt","Noy","Dek"],dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],dayNamesShort:["B","Be","Ça","Ç","Ca","C","Ş"],dayNamesMin:["B","B","Ç","С","Ç","C","Ş"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.az)}),jQuery(function(e){e.datepicker.regional.be={closeText:"Зачыніць",prevText:"←Папяр.",nextText:"Наст.→",currentText:"Сёньня",monthNames:["Студзень","Люты","Сакавік","Красавік","Травень","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Сьнежань"],monthNamesShort:["Сту","Лют","Сак","Кра","Тра","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сьн"],dayNames:["нядзеля","панядзелак","аўторак","серада","чацьвер","пятніца","субота"],dayNamesShort:["ндз","пнд","аўт","срд","чцв","птн","сбт"],dayNamesMin:["Нд","Пн","Аў","Ср","Чц","Пт","Сб"],weekHeader:"Тд",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.be)}),jQuery(function(e){e.datepicker.regional.bg={closeText:"затвори",prevText:"<назад",nextText:"напред>",nextBigText:">>",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bg)}),jQuery(function(e){e.datepicker.regional.bs={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.bs)}),jQuery(function(e){e.datepicker.regional.ca={closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ca)}),jQuery(function(e){e.datepicker.regional.cs={closeText:"Zavřít",prevText:"<Dříve",nextText:"Později>",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.cs)}),jQuery(function(e){e.datepicker.regional["cy-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],monthNamesShort:["Ion","Chw","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tac","Rha"],dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],dayNamesShort:["Sul","Llu","Maw","Mer","Iau","Gwe","Sad"],dayNamesMin:["Su","Ll","Ma","Me","Ia","Gw","Sa"],weekHeader:"Wy",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["cy-GB"])}),jQuery(function(e){e.datepicker.regional.da={closeText:"Luk",prevText:"<Forrige",nextText:"Næste>",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.da)}),jQuery(function(e){e.datepicker.regional.de={closeText:"Schließen",prevText:"<Zurück",nextText:"Vor>",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.de)}),jQuery(function(e){e.datepicker.regional.el={closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Τρέχων Μήνας",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.el)}),jQuery(function(e){e.datepicker.regional["en-AU"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-AU"])}),jQuery(function(e){e.datepicker.regional["en-GB"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-GB"])}),jQuery(function(e){e.datepicker.regional["en-NZ"]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["en-NZ"])}),jQuery(function(e){e.datepicker.regional.eo={closeText:"Fermi",prevText:"<Anta",nextText:"Sekv>",currentText:"Nuna",monthNames:["Januaro","Februaro","Marto","Aprilo","Majo","Junio","Julio","Aŭgusto","Septembro","Oktobro","Novembro","Decembro"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aŭg","Sep","Okt","Nov","Dec"],dayNames:["Dimanĉo","Lundo","Mardo","Merkredo","Ĵaŭdo","Vendredo","Sabato"],dayNamesShort:["Dim","Lun","Mar","Mer","Ĵaŭ","Ven","Sab"],dayNamesMin:["Di","Lu","Ma","Me","Ĵa","Ve","Sa"],weekHeader:"Sb",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eo)}),jQuery(function(e){e.datepicker.regional.es={closeText:"Cerrar",prevText:"<Ant",nextText:"Sig>",currentText:"Hoy",monthNames:["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"],monthNamesShort:["Ene","Feb","Mar","Abr","May","Jun","Jul","Ago","Sep","Oct","Nov","Dic"],dayNames:["Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mié","Juv","Vie","Sáb"],dayNamesMin:["Do","Lu","Ma","Mi","Ju","Vi","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.es)}),jQuery(function(e){e.datepicker.regional.et={closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.et)}),jQuery(function(e){e.datepicker.regional.eu={closeText:"Egina",prevText:"<Aur",nextText:"Hur>",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.eu)}),jQuery(function(e){e.datepicker.regional.fa={closeText:"بستن",prevText:"<قبلی",nextText:"بعدی>",currentText:"امروز",monthNames:["فروردين","ارديبهشت","خرداد","تير","مرداد","شهريور","مهر","آبان","آذر","دی","بهمن","اسفند"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سهشنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fa)}),jQuery(function(e){e.datepicker.regional.fi={closeText:"Sulje",prevText:"«Edellinen",nextText:"Seuraava»",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fi)}),jQuery(function(e){e.datepicker.regional.fo={closeText:"Lat aftur",prevText:"<Fyrra",nextText:"Næsta>",currentText:"Í dag",monthNames:["Januar","Februar","Mars","Apríl","Mei","Juni","Juli","August","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sunnudagur","Mánadagur","Týsdagur","Mikudagur","Hósdagur","Fríggjadagur","Leyardagur"],dayNamesShort:["Sun","Mán","Týs","Mik","Hós","Frí","Ley"],dayNamesMin:["Su","Má","Tý","Mi","Hó","Fr","Le"],weekHeader:"Vk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fo)}),jQuery(function(e){e.datepicker.regional["fr-CA"]={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CA"])}),jQuery(function(e){e.datepicker.regional["fr-CH"]={closeText:"Fermer",prevText:"<Préc",nextText:"Suiv>",currentText:"Courant",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Jan","Fév","Mar","Avr","Mai","Jun","Jul","Aoû","Sep","Oct","Nov","Déc"],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim","Lun","Mar","Mer","Jeu","Ven","Sam"],dayNamesMin:["Di","Lu","Ma","Me","Je","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["fr-CH"])}),jQuery(function(e){e.datepicker.regional.fr={closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre"],monthNamesShort:["Janv.","Févr.","Mars","Avril","Mai","Juin","Juil.","Août","Sept.","Oct.","Nov.","Déc."],dayNames:["Dimanche","Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi"],dayNamesShort:["Dim.","Lun.","Mar.","Mer.","Jeu.","Ven.","Sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.fr)}),jQuery(function(e){e.datepicker.regional.gl={closeText:"Pechar",prevText:"<Ant",nextText:"Seg>",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.gl)}),jQuery(function(e){e.datepicker.regional.he={closeText:"סגור",prevText:"<הקודם",nextText:"הבא>",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.he)}),jQuery(function(e){e.datepicker.regional.hi={closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hi)}),jQuery(function(e){e.datepicker.regional.hr={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hr)}),jQuery(function(e){e.datepicker.regional.hu={closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hu)}),jQuery(function(e){e.datepicker.regional.hy={closeText:"Փակել",prevText:"<Նախ.",nextText:"Հաջ.>",currentText:"Այսօր",monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],monthNamesShort:["Հունվ","Փետր","Մարտ","Ապր","Մայիս","Հունիս","Հուլ","Օգս","Սեպ","Հոկ","Նոյ","Դեկ"],dayNames:["կիրակի","եկուշաբթի","երեքշաբթի","չորեքշաբթի","հինգշաբթի","ուրբաթ","շաբաթ"],dayNamesShort:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],dayNamesMin:["կիր","երկ","երք","չրք","հնգ","ուրբ","շբթ"],weekHeader:"ՇԲՏ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.hy)}),jQuery(function(e){e.datepicker.regional.id={closeText:"Tutup",prevText:"<mundur",nextText:"maju>",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.id)}),jQuery(function(e){e.datepicker.regional.is={closeText:"Loka",prevText:"< Fyrri",nextText:"Næsti >",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.is)}),jQuery(function(e){e.datepicker.regional.it={closeText:"Chiudi",prevText:"<Prec",nextText:"Succ>",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.it)}),jQuery(function(e){e.datepicker.regional.ja={closeText:"閉じる",prevText:"<前",nextText:"次>",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional.ja)}),jQuery(function(e){e.datepicker.regional.ka={closeText:"დახურვა",prevText:"< წინა",nextText:"შემდეგი >",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],weekHeader:"კვირა",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ka)}),jQuery(function(e){e.datepicker.regional.kk={closeText:"Жабу",prevText:"<Алдыңғы",nextText:"Келесі>",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.kk)}),jQuery(function(e){e.datepicker.regional.km={closeText:"ធ្វើរួច",prevText:"មុន",nextText:"បន្ទាប់",currentText:"ថ្ងៃនេះ",monthNames:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],monthNamesShort:["មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា","កញ្ញា","តុលា","វិច្ឆិកា","ធ្នូ"],dayNames:["អាទិត្យ","ចន្ទ","អង្គារ","ពុធ","ព្រហស្បតិ៍","សុក្រ","សៅរ៍"],dayNamesShort:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],dayNamesMin:["អា","ច","អ","ពុ","ព្រហ","សុ","សៅ"],weekHeader:"សប្ដាហ៍",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.km)}),jQuery(function(e){e.datepicker.regional.ko={closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"},e.datepicker.setDefaults(e.datepicker.regional.ko)}),jQuery(function(e){e.datepicker.regional.ky={closeText:"Жабуу",prevText:"<Мур",nextText:"Кий>",currentText:"Бүгүн",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["жекшемби","дүйшөмбү","шейшемби","шаршемби","бейшемби","жума","ишемби"],dayNamesShort:["жек","дүй","шей","шар","бей","жум","ише"],dayNamesMin:["Жк","Дш","Шш","Шр","Бш","Жм","Иш"],weekHeader:"Жум",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ky)}),jQuery(function(e){e.datepicker.regional.lb={closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lb)}),jQuery(function(e){e.datepicker.regional.lt={closeText:"Uždaryti",prevText:"<Atgal",nextText:"Pirmyn>",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"Wk",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lt)}),jQuery(function(e){e.datepicker.regional.lv={closeText:"Aizvērt",prevText:"Iepr",nextText:"Nāka",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Nav",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.lv)}),jQuery(function(e){e.datepicker.regional.mk={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.mk)}),jQuery(function(e){e.datepicker.regional.ml={closeText:"ശരി",prevText:"മുന്നത്തെ",nextText:"അടുത്തത് ",currentText:"ഇന്ന്",monthNames:["ജനുവരി","ഫെബ്രുവരി","മാര്ച്ച്","ഏപ്രില്","മേയ്","ജൂണ്","ജൂലൈ","ആഗസ്റ്റ്","സെപ്റ്റംബര്","ഒക്ടോബര്","നവംബര്","ഡിസംബര്"],monthNamesShort:["ജനു","ഫെബ്","മാര്","ഏപ്രി","മേയ്","ജൂണ്","ജൂലാ","ആഗ","സെപ്","ഒക്ടോ","നവം","ഡിസ"],dayNames:["ഞായര്","തിങ്കള്","ചൊവ്വ","ബുധന്","വ്യാഴം","വെള്ളി","ശനി"],dayNamesShort:["ഞായ","തിങ്ക","ചൊവ്വ","ബുധ","വ്യാഴം","വെള്ളി","ശനി"],dayNamesMin:["ഞാ","തി","ചൊ","ബു","വ്യാ","വെ","ശ"],weekHeader:"ആ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ml)}),jQuery(function(e){e.datepicker.regional.ms={closeText:"Tutup",prevText:"<Sebelum",nextText:"Selepas>",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ms)}),jQuery(function(e){e.datepicker.regional.nb={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nb)
-}),jQuery(function(e){e.datepicker.regional["nl-BE"]={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["nl-BE"])}),jQuery(function(e){e.datepicker.regional.nl={closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nl)}),jQuery(function(e){e.datepicker.regional.nn={closeText:"Lukk",prevText:"«Førre",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.nn)}),jQuery(function(e){e.datepicker.regional.no={closeText:"Lukk",prevText:"«Forrige",nextText:"Neste»",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.no)}),jQuery(function(e){e.datepicker.regional.pl={closeText:"Zamknij",prevText:"<Poprzedni",nextText:"Następny>",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pl)}),jQuery(function(e){e.datepicker.regional["pt-BR"]={closeText:"Fechar",prevText:"<Anterior",nextText:"Próximo>",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["pt-BR"])}),jQuery(function(e){e.datepicker.regional.pt={closeText:"Fechar",prevText:"<Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.pt)}),jQuery(function(e){e.datepicker.regional.rm={closeText:"Serrar",prevText:"<Suandant",nextText:"Precedent>",currentText:"Actual",monthNames:["Schaner","Favrer","Mars","Avrigl","Matg","Zercladur","Fanadur","Avust","Settember","October","November","December"],monthNamesShort:["Scha","Fev","Mar","Avr","Matg","Zer","Fan","Avu","Sett","Oct","Nov","Dec"],dayNames:["Dumengia","Glindesdi","Mardi","Mesemna","Gievgia","Venderdi","Sonda"],dayNamesShort:["Dum","Gli","Mar","Mes","Gie","Ven","Som"],dayNamesMin:["Du","Gl","Ma","Me","Gi","Ve","So"],weekHeader:"emna",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.rm)}),jQuery(function(e){e.datepicker.regional.ro={closeText:"Închide",prevText:"« Luna precedentă",nextText:"Luna următoare »",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ro)}),jQuery(function(e){e.datepicker.regional.ru={closeText:"Закрыть",prevText:"<Пред",nextText:"След>",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ru)}),jQuery(function(e){e.datepicker.regional.sk={closeText:"Zavrieť",prevText:"<Predchádzajúci",nextText:"Nasledujúci>",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sk)}),jQuery(function(e){e.datepicker.regional.sl={closeText:"Zapri",prevText:"<Prejšnji",nextText:"Naslednji>",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sl)}),jQuery(function(e){e.datepicker.regional.sq={closeText:"mbylle",prevText:"<mbrapa",nextText:"Përpara>",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sq)}),jQuery(function(e){e.datepicker.regional["sr-SR"]={closeText:"Zatvori",prevText:"<",nextText:">",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional["sr-SR"])}),jQuery(function(e){e.datepicker.regional.sr={closeText:"Затвори",prevText:"<",nextText:">",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sr)}),jQuery(function(e){e.datepicker.regional.sv={closeText:"Stäng",prevText:"«Förra",nextText:"Nästa»",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.sv)}),jQuery(function(e){e.datepicker.regional.ta={closeText:"மூடு",prevText:"முன்னையது",nextText:"அடுத்தது",currentText:"இன்று",monthNames:["தை","மாசி","பங்குனி","சித்திரை","வைகாசி","ஆனி","ஆடி","ஆவணி","புரட்டாசி","ஐப்பசி","கார்த்திகை","மார்கழி"],monthNamesShort:["தை","மாசி","பங்","சித்","வைகா","ஆனி","ஆடி","ஆவ","புர","ஐப்","கார்","மார்"],dayNames:["ஞாயிற்றுக்கிழமை","திங்கட்கிழமை","செவ்வாய்க்கிழமை","புதன்கிழமை","வியாழக்கிழமை","வெள்ளிக்கிழமை","சனிக்கிழமை"],dayNamesShort:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],dayNamesMin:["ஞா","தி","செ","பு","வி","வெ","ச"],weekHeader:"Не",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.ta)}),jQuery(function(e){e.datepicker.regional.th={closeText:"ปิด",prevText:"« ย้อน",nextText:"ถัดไป »",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.th)}),jQuery(function(e){e.datepicker.regional.tj={closeText:"Идома",prevText:"<Қафо",nextText:"Пеш>",currentText:"Имрӯз",monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["якшанбе","душанбе","сешанбе","чоршанбе","панҷшанбе","ҷумъа","шанбе"],dayNamesShort:["якш","душ","сеш","чор","пан","ҷум","шан"],dayNamesMin:["Як","Дш","Сш","Чш","Пш","Ҷм","Шн"],weekHeader:"Хф",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tj)}),jQuery(function(e){e.datepicker.regional.tr={closeText:"kapat",prevText:"<geri",nextText:"ileri>",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.tr)}),jQuery(function(e){e.datepicker.regional.uk={closeText:"Закрити",prevText:"<",nextText:">",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.uk)}),jQuery(function(e){e.datepicker.regional.vi={closeText:"Đóng",prevText:"<Trước",nextText:"Tiếp>",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},e.datepicker.setDefaults(e.datepicker.regional.vi)}),jQuery(function(e){e.datepicker.regional["zh-CN"]={closeText:"关闭",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-CN"])}),jQuery(function(e){e.datepicker.regional["zh-HK"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"dd-mm-yy",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-HK"])}),jQuery(function(e){e.datepicker.regional["zh-TW"]={closeText:"關閉",prevText:"<上月",nextText:"下月>",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"},e.datepicker.setDefaults(e.datepicker.regional["zh-TW"])});
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/jquery-ui/jquery-ui.min.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-05-03
-* http://jqueryui.com
-* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
-* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
-(function(t,e){function i(e,i){var n,o,a,r=e.nodeName.toLowerCase();return"area"===r?(n=e.parentNode,o=n.name,e.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap=#"+o+"]")[0],!!a&&s(a)):!1):(/input|select|textarea|button|object/.test(r)?!e.disabled:"a"===r?e.href||i:i)&&s(e)}function s(e){return t.expr.filters.visible(e)&&!t(e).parents().addBack().filter(function(){return"hidden"===t.css(this,"visibility")}).length}var n=0,o=/^ui-id-\d+$/;t.ui=t.ui||{},t.extend(t.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),t.fn.extend({focus:function(e){return function(i,s){return"number"==typeof i?this.each(function(){var e=this;setTimeout(function(){t(e).focus(),s&&s.call(e)},i)}):e.apply(this,arguments)}}(t.fn.focus),scrollParent:function(){var e;return e=t.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(t.css(this,"position"))&&/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(t.css(this,"overflow")+t.css(this,"overflow-y")+t.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!e.length?t(document):e},zIndex:function(i){if(i!==e)return this.css("zIndex",i);if(this.length)for(var s,n,o=t(this[0]);o.length&&o[0]!==document;){if(s=o.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(n=parseInt(o.css("zIndex"),10),!isNaN(n)&&0!==n))return n;o=o.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){o.test(this.id)&&t(this).removeAttr("id")})}}),t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])},focusable:function(e){return i(e,!isNaN(t.attr(e,"tabindex")))},tabbable:function(e){var s=t.attr(e,"tabindex"),n=isNaN(s);return(n||s>=0)&&i(e,!n)}}),t("<a>").outerWidth(1).jquery||t.each(["Width","Height"],function(i,s){function n(e,i,s,n){return t.each(o,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),n&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var o="Width"===s?["Left","Right"]:["Top","Bottom"],a=s.toLowerCase(),r={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+s]=function(i){return i===e?r["inner"+s].call(this):this.each(function(){t(this).css(a,n(this,i)+"px")})},t.fn["outer"+s]=function(e,i){return"number"!=typeof e?r["outer"+s].call(this,e):this.each(function(){t(this).css(a,n(this,e,!0,i)+"px")})}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(t.fn.removeData=function(e){return function(i){return arguments.length?e.call(this,t.camelCase(i)):e.call(this)}}(t.fn.removeData)),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),t.support.selectstart="onselectstart"in document.createElement("div"),t.fn.extend({disableSelection:function(){return this.bind((t.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(t){t.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),t.extend(t.ui,{plugin:{add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i){var s,n=t.plugins[e];if(n&&t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType)for(s=0;n.length>s;s++)t.options[n[s][0]]&&n[s][1].apply(t.element,i)}},hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)}})})(jQuery),function(t,e){var i=0,s=Array.prototype.slice,n=t.cleanData;t.cleanData=function(e){for(var i,s=0;null!=(i=e[s]);s++)try{t(i).triggerHandler("remove")}catch(o){}n(e)},t.widget=function(i,s,n){var o,a,r,h,l={},c=i.split(".")[0];i=i.split(".")[1],o=c+"-"+i,n||(n=s,s=t.Widget),t.expr[":"][o.toLowerCase()]=function(e){return!!t.data(e,o)},t[c]=t[c]||{},a=t[c][i],r=t[c][i]=function(t,i){return this._createWidget?(arguments.length&&this._createWidget(t,i),e):new r(t,i)},t.extend(r,a,{version:n.version,_proto:t.extend({},n),_childConstructors:[]}),h=new s,h.options=t.widget.extend({},h.options),t.each(n,function(i,n){return t.isFunction(n)?(l[i]=function(){var t=function(){return s.prototype[i].apply(this,arguments)},e=function(t){return s.prototype[i].apply(this,t)};return function(){var i,s=this._super,o=this._superApply;return this._super=t,this._superApply=e,i=n.apply(this,arguments),this._super=s,this._superApply=o,i}}(),e):(l[i]=n,e)}),r.prototype=t.widget.extend(h,{widgetEventPrefix:a?h.widgetEventPrefix:i},l,{constructor:r,namespace:c,widgetName:i,widgetFullName:o}),a?(t.each(a._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,r,i._proto)}),delete a._childConstructors):s._childConstructors.push(r),t.widget.bridge(i,r)},t.widget.extend=function(i){for(var n,o,a=s.call(arguments,1),r=0,h=a.length;h>r;r++)for(n in a[r])o=a[r][n],a[r].hasOwnProperty(n)&&o!==e&&(i[n]=t.isPlainObject(o)?t.isPlainObject(i[n])?t.widget.extend({},i[n],o):t.widget.extend({},o):o);return i},t.widget.bridge=function(i,n){var o=n.prototype.widgetFullName||i;t.fn[i]=function(a){var r="string"==typeof a,h=s.call(arguments,1),l=this;return a=!r&&h.length?t.widget.extend.apply(null,[a].concat(h)):a,r?this.each(function(){var s,n=t.data(this,o);return n?t.isFunction(n[a])&&"_"!==a.charAt(0)?(s=n[a].apply(n,h),s!==n&&s!==e?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):e):t.error("no such method '"+a+"' for "+i+" widget instance"):t.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+a+"'")}):this.each(function(){var e=t.data(this,o);e?e.option(a||{})._init():t.data(this,o,new n(a,this))}),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this.bindings=t(),this.hoverable=t(),this.focusable=t(),s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:t.noop,_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(t.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:t.noop,widget:function(){return this.element},option:function(i,s){var n,o,a,r=i;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof i)if(r={},n=i.split("."),i=n.shift(),n.length){for(o=r[i]=t.widget.extend({},this.options[i]),a=0;n.length-1>a;a++)o[n[a]]=o[n[a]]||{},o=o[n[a]];if(i=n.pop(),s===e)return o[i]===e?null:o[i];o[i]=s}else{if(s===e)return this.options[i]===e?null:this.options[i];r[i]=s}return this._setOptions(r),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return this.options[t]=e,"disabled"===t&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!e).attr("aria-disabled",e),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var o,a=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=o=t(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,o=this.widget()),t.each(n,function(n,r){function h(){return i||a.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof r?a[r]:r).apply(a,arguments):e}"string"!=typeof r&&(h.guid=r.guid=r.guid||h.guid||t.guid++);var l=n.match(/^(\w+)\s*(.*)$/),c=l[1]+a.eventNamespace,u=l[2];u?o.delegate(u,c,h):s.bind(c,h)})},_off:function(t,e){e=(e||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(e).undelegate(e)},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){t(e.currentTarget).addClass("ui-state-hover")},mouseleave:function(e){t(e.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){t(e.currentTarget).addClass("ui-state-focus")},focusout:function(e){t(e.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}})}(jQuery),function(t){var e=!1;t(document).mouseup(function(){e=!1}),t.widget("ui.mouse",{version:"1.10.3",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.bind("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).bind("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!e){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,o="string"==typeof this.options.cancel&&i.target.nodeName?t(i.target).closest(this.options.cancel).length:!1;return n&&!o&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===t.data(i.target,this.widgetName+".preventClickEvent")&&t.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return s._mouseMove(t)},this._mouseUpDelegate=function(t){return s._mouseUp(t)},t(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),e=!0,!0)):!0}},_mouseMove:function(e){return t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button?this._mouseUp(e):this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){return t(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),!1},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})}(jQuery),function(t){t.widget("ui.draggable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"!==this.options.helper||/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(e){var i=this.options;return this.helper||i.disabled||t(e.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(e),this.handle?(t(i.iframeFix===!0?"iframe":i.iframeFix).each(function(){t("<div class='ui-draggable-iframeFix' style='background: #fff;'></div>").css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(t(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(e){var i=this.options;return this.helper=this._createHelper(e),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),t.ui.ddmanager&&(t.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offsetParent=this.helper.offsetParent(),this.offsetParentCssPosition=this.offsetParent.css("position"),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},this.offset.scroll=!1,t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",e)===!1?(this._clear(),!1):(this._cacheHelperProportions(),t.ui.ddmanager&&!i.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this._mouseDrag(e,!0),t.ui.ddmanager&&t.ui.ddmanager.dragStart(this,e),!0)},_mouseDrag:function(e,i){if("fixed"===this.offsetParentCssPosition&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",e,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),!1},_mouseStop:function(e){var i=this,s=!1;return t.ui.ddmanager&&!this.options.dropBehaviour&&(s=t.ui.ddmanager.drop(this,e)),this.dropped&&(s=this.dropped,this.dropped=!1),"original"!==this.options.helper||t.contains(this.element[0].ownerDocument,this.element[0])?("invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||t.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?t(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",e)!==!1&&i._clear()}):this._trigger("stop",e)!==!1&&this._clear(),!1):!1},_mouseUp:function(e){return t("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),t.ui.ddmanager&&t.ui.ddmanager.dragStop(this,e),t.ui.mouse.prototype._mouseUp.call(this,e)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(e){return this.options.handle?!!t(e.target).closest(this.element.find(this.options.handle)).length:!0},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return s.parents("body").length||s.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s[0]===this.element[0]||/(fixed|absolute)/.test(s.css("position"))||s.css("position","absolute"),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.element.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;return n.containment?"window"===n.containment?(this.containment=[t(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,t(window).scrollLeft()+t(window).width()-this.helperProportions.width-this.margins.left,t(window).scrollTop()+(t(window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):"document"===n.containment?(this.containment=[0,0,t(document).width()-this.helperProportions.width-this.margins.left,(t(document).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],undefined):n.containment.constructor===Array?(this.containment=n.containment,undefined):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=t(n.containment),s=i[0],s&&(e="hidden"!==i.css("overflow"),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(e?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(e?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=i),undefined):(this.containment=null,undefined)},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent;return this.offset.scroll||(this.offset.scroll={top:n.scrollTop(),left:n.scrollLeft()}),{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top)*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)*s}},_generatePosition:function(e){var i,s,n,o,a=this.options,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=e.pageX,l=e.pageY;return this.offset.scroll||(this.offset.scroll={top:r.scrollTop(),left:r.scrollLeft()}),this.originalPosition&&(this.containment&&(this.relative_container?(s=this.relative_container.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),a.grid&&(n=a.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/a.grid[1])*a.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-a.grid[1]:n+a.grid[1]:n,o=a.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/a.grid[0])*a.grid[0]:this.originalPageX,h=i?o-this.offset.click.left>=i[0]||o-this.offset.click.left>i[2]?o:o-this.offset.click.left>=i[0]?o-a.grid[0]:o+a.grid[0]:o)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(e,i,s){return s=s||this._uiHash(),t.ui.plugin.call(this,e,[i,s]),"drag"===e&&(this.positionAbs=this._convertPositionTo("absolute")),t.Widget.prototype._trigger.call(this,e,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),t.ui.plugin.add("draggable","connectToSortable",{start:function(e,i){var s=t(this).data("ui-draggable"),n=s.options,o=t.extend({},i,{item:s.element});s.sortables=[],t(n.connectToSortable).each(function(){var i=t.data(this,"ui-sortable");i&&!i.options.disabled&&(s.sortables.push({instance:i,shouldRevert:i.options.revert}),i.refreshPositions(),i._trigger("activate",e,o))})},stop:function(e,i){var s=t(this).data("ui-draggable"),n=t.extend({},i,{item:s.element});t.each(s.sortables,function(){this.instance.isOver?(this.instance.isOver=0,s.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=this.shouldRevert),this.instance._mouseStop(e),this.instance.options.helper=this.instance.options._helper,"original"===s.options.helper&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",e,n))})},drag:function(e,i){var s=t(this).data("ui-draggable"),n=this;t.each(s.sortables,function(){var o=!1,a=this;this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this.instance._intersectsWith(this.instance.containerCache)&&(o=!0,t.each(s.sortables,function(){return this.instance.positionAbs=s.positionAbs,this.instance.helperProportions=s.helperProportions,this.instance.offset.click=s.offset.click,this!==a&&this.instance._intersectsWith(this.instance.containerCache)&&t.contains(a.instance.element[0],this.instance.element[0])&&(o=!1),o})),o?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=t(n).clone().removeAttr("id").appendTo(this.instance.element).data("ui-sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return i.helper[0]},e.target=this.instance.currentItem[0],this.instance._mouseCapture(e,!0),this.instance._mouseStart(e,!0,!0),this.instance.offset.click.top=s.offset.click.top,this.instance.offset.click.left=s.offset.click.left,this.instance.offset.parent.left-=s.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=s.offset.parent.top-this.instance.offset.parent.top,s._trigger("toSortable",e),s.dropped=this.instance.element,s.currentItem=s.element,this.instance.fromOutside=s),this.instance.currentItem&&this.instance._mouseDrag(e)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",e,this.instance._uiHash(this.instance)),this.instance._mouseStop(e,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),s._trigger("fromSortable",e),s.dropped=!1)})}}),t.ui.plugin.add("draggable","cursor",{start:function(){var e=t("body"),i=t(this).data("ui-draggable").options;e.css("cursor")&&(i._cursor=e.css("cursor")),e.css("cursor",i.cursor)},stop:function(){var e=t(this).data("ui-draggable").options;e._cursor&&t("body").css("cursor",e._cursor)}}),t.ui.plugin.add("draggable","opacity",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("opacity")&&(n._opacity=s.css("opacity")),s.css("opacity",n.opacity)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._opacity&&t(i.helper).css("opacity",s._opacity)}}),t.ui.plugin.add("draggable","scroll",{start:function(){var e=t(this).data("ui-draggable");e.scrollParent[0]!==document&&"HTML"!==e.scrollParent[0].tagName&&(e.overflowOffset=e.scrollParent.offset())},drag:function(e){var i=t(this).data("ui-draggable"),s=i.options,n=!1;i.scrollParent[0]!==document&&"HTML"!==i.scrollParent[0].tagName?(s.axis&&"x"===s.axis||(i.overflowOffset.top+i.scrollParent[0].offsetHeight-e.pageY<s.scrollSensitivity?i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop+s.scrollSpeed:e.pageY-i.overflowOffset.top<s.scrollSensitivity&&(i.scrollParent[0].scrollTop=n=i.scrollParent[0].scrollTop-s.scrollSpeed)),s.axis&&"y"===s.axis||(i.overflowOffset.left+i.scrollParent[0].offsetWidth-e.pageX<s.scrollSensitivity?i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft+s.scrollSpeed:e.pageX-i.overflowOffset.left<s.scrollSensitivity&&(i.scrollParent[0].scrollLeft=n=i.scrollParent[0].scrollLeft-s.scrollSpeed))):(s.axis&&"x"===s.axis||(e.pageY-t(document).scrollTop()<s.scrollSensitivity?n=t(document).scrollTop(t(document).scrollTop()-s.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<s.scrollSensitivity&&(n=t(document).scrollTop(t(document).scrollTop()+s.scrollSpeed))),s.axis&&"y"===s.axis||(e.pageX-t(document).scrollLeft()<s.scrollSensitivity?n=t(document).scrollLeft(t(document).scrollLeft()-s.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<s.scrollSensitivity&&(n=t(document).scrollLeft(t(document).scrollLeft()+s.scrollSpeed)))),n!==!1&&t.ui.ddmanager&&!s.dropBehaviour&&t.ui.ddmanager.prepareOffsets(i,e)}}),t.ui.plugin.add("draggable","snap",{start:function(){var e=t(this).data("ui-draggable"),i=e.options;e.snapElements=[],t(i.snap.constructor!==String?i.snap.items||":data(ui-draggable)":i.snap).each(function(){var i=t(this),s=i.offset();this!==e.element[0]&&e.snapElements.push({item:this,width:i.outerWidth(),height:i.outerHeight(),top:s.top,left:s.left})})},drag:function(e,i){var s,n,o,a,r,h,l,c,u,d,p=t(this).data("ui-draggable"),f=p.options,g=f.snapTolerance,m=i.offset.left,v=m+p.helperProportions.width,_=i.offset.top,b=_+p.helperProportions.height;for(u=p.snapElements.length-1;u>=0;u--)r=p.snapElements[u].left,h=r+p.snapElements[u].width,l=p.snapElements[u].top,c=l+p.snapElements[u].height,r-g>v||m>h+g||l-g>b||_>c+g||!t.contains(p.snapElements[u].item.ownerDocument,p.snapElements[u].item)?(p.snapElements[u].snapping&&p.options.snap.release&&p.options.snap.release.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=!1):("inner"!==f.snapMode&&(s=g>=Math.abs(l-b),n=g>=Math.abs(c-_),o=g>=Math.abs(r-v),a=g>=Math.abs(h-m),s&&(i.position.top=p._convertPositionTo("relative",{top:l-p.helperProportions.height,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r-p.helperProportions.width}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h}).left-p.margins.left)),d=s||n||o||a,"outer"!==f.snapMode&&(s=g>=Math.abs(l-_),n=g>=Math.abs(c-b),o=g>=Math.abs(r-m),a=g>=Math.abs(h-v),s&&(i.position.top=p._convertPositionTo("relative",{top:l,left:0}).top-p.margins.top),n&&(i.position.top=p._convertPositionTo("relative",{top:c-p.helperProportions.height,left:0}).top-p.margins.top),o&&(i.position.left=p._convertPositionTo("relative",{top:0,left:r}).left-p.margins.left),a&&(i.position.left=p._convertPositionTo("relative",{top:0,left:h-p.helperProportions.width}).left-p.margins.left)),!p.snapElements[u].snapping&&(s||n||o||a||d)&&p.options.snap.snap&&p.options.snap.snap.call(p.element,e,t.extend(p._uiHash(),{snapItem:p.snapElements[u].item})),p.snapElements[u].snapping=s||n||o||a||d)}}),t.ui.plugin.add("draggable","stack",{start:function(){var e,i=this.data("ui-draggable").options,s=t.makeArray(t(i.stack)).sort(function(e,i){return(parseInt(t(e).css("zIndex"),10)||0)-(parseInt(t(i).css("zIndex"),10)||0)});s.length&&(e=parseInt(t(s[0]).css("zIndex"),10)||0,t(s).each(function(i){t(this).css("zIndex",e+i)}),this.css("zIndex",e+s.length))}}),t.ui.plugin.add("draggable","zIndex",{start:function(e,i){var s=t(i.helper),n=t(this).data("ui-draggable").options;s.css("zIndex")&&(n._zIndex=s.css("zIndex")),s.css("zIndex",n.zIndex)},stop:function(e,i){var s=t(this).data("ui-draggable").options;s._zIndex&&t(i.helper).css("zIndex",s._zIndex)}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}t.widget("ui.droppable",{version:"1.10.3",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var e=this.options,i=e.accept;this.isover=!1,this.isout=!0,this.accept=t.isFunction(i)?i:function(t){return t.is(i)
-},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},t.ui.ddmanager.droppables[e.scope]=t.ui.ddmanager.droppables[e.scope]||[],t.ui.ddmanager.droppables[e.scope].push(this),e.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){for(var e=0,i=t.ui.ddmanager.droppables[this.options.scope];i.length>e;e++)i[e]===this&&i.splice(e,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(e,i){"accept"===e&&(this.accept=t.isFunction(i)?i:function(t){return t.is(i)}),t.Widget.prototype._setOption.apply(this,arguments)},_activate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",e,this.ui(i))},_deactivate:function(e){var i=t.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",e,this.ui(i))},_over:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",e,this.ui(i)))},_out:function(e){var i=t.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",e,this.ui(i)))},_drop:function(e,i){var s=i||t.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var e=t.data(this,"ui-droppable");return e.options.greedy&&!e.options.disabled&&e.options.scope===s.options.scope&&e.accept.call(e.element[0],s.currentItem||s.element)&&t.ui.intersect(s,t.extend(e,{offset:e.element.offset()}),e.options.tolerance)?(n=!0,!1):undefined}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",e,this.ui(s)),this.element):!1):!1},ui:function(t){return{draggable:t.currentItem||t.element,helper:t.helper,position:t.position,offset:t.positionAbs}}}),t.ui.intersect=function(t,i,s){if(!i.offset)return!1;var n,o,a=(t.positionAbs||t.position.absolute).left,r=a+t.helperProportions.width,h=(t.positionAbs||t.position.absolute).top,l=h+t.helperProportions.height,c=i.offset.left,u=c+i.proportions.width,d=i.offset.top,p=d+i.proportions.height;switch(s){case"fit":return a>=c&&u>=r&&h>=d&&p>=l;case"intersect":return a+t.helperProportions.width/2>c&&u>r-t.helperProportions.width/2&&h+t.helperProportions.height/2>d&&p>l-t.helperProportions.height/2;case"pointer":return n=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,o=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,e(o,d,i.proportions.height)&&e(n,c,i.proportions.width);case"touch":return(h>=d&&p>=h||l>=d&&p>=l||d>h&&l>p)&&(a>=c&&u>=a||r>=c&&u>=r||c>a&&r>u);default:return!1}},t.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,i){var s,n,o=t.ui.ddmanager.droppables[e.options.scope]||[],a=i?i.type:null,r=(e.currentItem||e.element).find(":data(ui-droppable)").addBack();t:for(s=0;o.length>s;s++)if(!(o[s].options.disabled||e&&!o[s].accept.call(o[s].element[0],e.currentItem||e.element))){for(n=0;r.length>n;n++)if(r[n]===o[s].element[0]){o[s].proportions.height=0;continue t}o[s].visible="none"!==o[s].element.css("display"),o[s].visible&&("mousedown"===a&&o[s]._activate.call(o[s],i),o[s].offset=o[s].element.offset(),o[s].proportions={width:o[s].element[0].offsetWidth,height:o[s].element[0].offsetHeight})}},drop:function(e,i){var s=!1;return t.each((t.ui.ddmanager.droppables[e.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&t.ui.intersect(e,this,this.options.tolerance)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],e.currentItem||e.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(e,i){e.element.parentsUntil("body").bind("scroll.droppable",function(){e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)})},drag:function(e,i){e.options.refreshPositions&&t.ui.ddmanager.prepareOffsets(e,i),t.each(t.ui.ddmanager.droppables[e.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,o,a=t.ui.intersect(e,this,this.options.tolerance),r=!a&&this.isover?"isout":a&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,o=this.element.parents(":data(ui-droppable)").filter(function(){return t.data(this,"ui-droppable").options.scope===n}),o.length&&(s=t.data(o[0],"ui-droppable"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(e,i){e.element.parentsUntil("body").unbind("scroll.droppable"),e.options.refreshPositions||t.ui.ddmanager.prepareOffsets(e,i)}}}(jQuery),function(t){function e(t){return parseInt(t,10)||0}function i(t){return!isNaN(parseInt(t,10))}t.widget("ui.resizable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_create:function(){var e,i,s,n,o,a=this,r=this.options;if(this.element.addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.data("ui-resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),e=this.handles.split(","),this.handles={},i=0;e.length>i;i++)s=t.trim(e[i]),o="ui-resizable-"+s,n=t("<div class='ui-resizable-handle "+o+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String&&(this.handles[i]=t(this.handles[i],this.element).show()),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),t(this.handles[i]).length},this._renderAxis(this.element),this._handles=t(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){a.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),a.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),t(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(t(this).removeClass("ui-resizable-autohide"),a._handles.show())}).mouseleave(function(){r.disabled||a.resizing||(t(this).addClass("ui-resizable-autohide"),a._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(i){var s,n,o,a=this.options,r=this.element.position(),h=this.element;return this.resizing=!0,/absolute/.test(h.css("position"))?h.css({position:"absolute",top:h.css("top"),left:h.css("left")}):h.is(".ui-draggable")&&h.css({position:"absolute",top:r.top,left:r.left}),this._renderProxy(),s=e(this.helper.css("left")),n=e(this.helper.css("top")),a.containment&&(s+=t(a.containment).scrollLeft()||0,n+=t(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:s,top:n},this.size=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalSize=this._helper?{width:h.outerWidth(),height:h.outerHeight()}:{width:h.width(),height:h.height()},this.originalPosition={left:s,top:n},this.sizeDiff={width:h.outerWidth()-h.width(),height:h.outerHeight()-h.height()},this.originalMousePosition={left:i.pageX,top:i.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,o=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===o?this.axis+"-resize":o),h.addClass("ui-resizable-resizing"),this._propagate("start",i),!0},_mouseDrag:function(e){var i,s=this.helper,n={},o=this.originalMousePosition,a=this.axis,r=this.position.top,h=this.position.left,l=this.size.width,c=this.size.height,u=e.pageX-o.left||0,d=e.pageY-o.top||0,p=this._change[a];return p?(i=p.apply(this,[e,u,d]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),this.position.top!==r&&(n.top=this.position.top+"px"),this.position.left!==h&&(n.left=this.position.left+"px"),this.size.width!==l&&(n.width=this.size.width+"px"),this.size.height!==c&&(n.height=this.size.height+"px"),s.css(n),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(n)||this._trigger("resize",e,this.ui()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&t.ui.hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null,h=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(t){var e,s,n,o,a,r=this.options;a={minWidth:i(r.minWidth)?r.minWidth:0,maxWidth:i(r.maxWidth)?r.maxWidth:1/0,minHeight:i(r.minHeight)?r.minHeight:0,maxHeight:i(r.maxHeight)?r.maxHeight:1/0},(this._aspectRatio||t)&&(e=a.minHeight*this.aspectRatio,n=a.minWidth/this.aspectRatio,s=a.maxHeight*this.aspectRatio,o=a.maxWidth/this.aspectRatio,e>a.minWidth&&(a.minWidth=e),n>a.minHeight&&(a.minHeight=n),a.maxWidth>s&&(a.maxWidth=s),a.maxHeight>o&&(a.maxHeight=o)),this._vBoundaries=a},_updateCache:function(t){this.offset=this.helper.offset(),i(t.left)&&(this.position.left=t.left),i(t.top)&&(this.position.top=t.top),i(t.height)&&(this.size.height=t.height),i(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,s=this.size,n=this.axis;return i(t.height)?t.width=t.height*this.aspectRatio:i(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===n&&(t.left=e.left+(s.width-t.width),t.top=null),"nw"===n&&(t.top=e.top+(s.height-t.height),t.left=e.left+(s.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,s=this.axis,n=i(t.width)&&e.maxWidth&&e.maxWidth<t.width,o=i(t.height)&&e.maxHeight&&e.maxHeight<t.height,a=i(t.width)&&e.minWidth&&e.minWidth>t.width,r=i(t.height)&&e.minHeight&&e.minHeight>t.height,h=this.originalPosition.left+this.originalSize.width,l=this.position.top+this.size.height,c=/sw|nw|w/.test(s),u=/nw|ne|n/.test(s);return a&&(t.width=e.minWidth),r&&(t.height=e.minHeight),n&&(t.width=e.maxWidth),o&&(t.height=e.maxHeight),a&&c&&(t.left=h-e.minWidth),n&&c&&(t.left=h-e.maxWidth),r&&u&&(t.top=l-e.minHeight),o&&u&&(t.top=l-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_proportionallyResize:function(){if(this._proportionallyResizeElements.length){var t,e,i,s,n,o=this.helper||this.element;for(t=0;this._proportionallyResizeElements.length>t;t++){if(n=this._proportionallyResizeElements[t],!this.borderDif)for(this.borderDif=[],i=[n.css("borderTopWidth"),n.css("borderRightWidth"),n.css("borderBottomWidth"),n.css("borderLeftWidth")],s=[n.css("paddingTop"),n.css("paddingRight"),n.css("paddingBottom"),n.css("paddingLeft")],e=0;i.length>e;e++)this.borderDif[e]=(parseInt(i[e],10)||0)+(parseInt(s[e],10)||0);n.css({height:o.height()-this.borderDif[0]-this.borderDif[2]||0,width:o.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).data("ui-resizable"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&t.ui.hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,c=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var i,s,n,o,a,r,h,l=t(this).data("ui-resizable"),c=l.options,u=l.element,d=c.containment,p=d instanceof t?d.get(0):/parent/.test(d)?u.parent().get(0):d;p&&(l.containerElement=t(p),/document/.test(d)||d===document?(l.containerOffset={left:0,top:0},l.containerPosition={left:0,top:0},l.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(i=t(p),s=[],t(["Top","Right","Left","Bottom"]).each(function(t,n){s[t]=e(i.css("padding"+n))}),l.containerOffset=i.offset(),l.containerPosition=i.position(),l.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},n=l.containerOffset,o=l.containerSize.height,a=l.containerSize.width,r=t.ui.hasScroll(p,"left")?p.scrollWidth:a,h=t.ui.hasScroll(p)?p.scrollHeight:o,l.parentData={element:p,left:n.left,top:n.top,width:r,height:h}))},resize:function(e){var i,s,n,o,a=t(this).data("ui-resizable"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio),a.position.top=a._helper?h.top:0),a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top,i=Math.abs((a._helper?a.offset.left-u.left:a.offset.left-u.left)+a.sizeDiff.width),s=Math.abs((a._helper?a.offset.top-u.top:a.offset.top-h.top)+a.sizeDiff.height),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o&&(i-=a.parentData.left),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio))},stop:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=function(e){t(e).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseInt(e.width(),10),height:parseInt(e.height(),10),left:parseInt(e.css("left"),10),top:parseInt(e.css("top"),10)})})};"object"!=typeof i.alsoResize||i.alsoResize.parentNode?s(i.alsoResize):i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):t.each(i.alsoResize,function(t){s(t)})},resize:function(e,i){var s=t(this).data("ui-resizable"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0},h=function(e,s){t(e).each(function(){var e=t(this),n=t(this).data("ui-resizable-alsoresize"),o={},a=s&&s.length?s:e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(a,function(t,e){var i=(n[e]||0)+(r[e]||0);i&&i>=0&&(o[e]=i||null)}),e.css(o)})};"object"!=typeof n.alsoResize||n.alsoResize.nodeType?h(n.alsoResize):t.each(n.alsoResize,function(t,e){h(t,e)})},stop:function(){t(this).removeData("resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).data("ui-resizable");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).data("ui-resizable");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e=t(this).data("ui-resizable"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,a=e.axis,r="number"==typeof i.grid?[i.grid,i.grid]:i.grid,h=r[0]||1,l=r[1]||1,c=Math.round((s.width-n.width)/h)*h,u=Math.round((s.height-n.height)/l)*l,d=n.width+c,p=n.height+u,f=i.maxWidth&&d>i.maxWidth,g=i.maxHeight&&p>i.maxHeight,m=i.minWidth&&i.minWidth>d,v=i.minHeight&&i.minHeight>p;i.grid=r,m&&(d+=h),v&&(p+=l),f&&(d-=h),g&&(p-=l),/^(se|s|e)$/.test(a)?(e.size.width=d,e.size.height=p):/^(ne)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.top=o.top-u):/^(sw)$/.test(a)?(e.size.width=d,e.size.height=p,e.position.left=o.left-c):(e.size.width=d,e.size.height=p,e.position.top=o.top-u,e.position.left=o.left-c)}})}(jQuery),function(t){t.widget("ui.selectable",t.ui.mouse,{version:"1.10.3",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var e,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){e=t(i.options.filter,i.element[0]),e.addClass("ui-selectee"),e.each(function(){var e=t(this),i=e.offset();t.data(this,"selectable-item",{element:this,$element:e,left:i.left,top:i.top,right:i.left+e.outerWidth(),bottom:i.top+e.outerHeight(),startselected:!1,selected:e.hasClass("ui-selected"),selecting:e.hasClass("ui-selecting"),unselecting:e.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=e.addClass("ui-selectee"),this._mouseInit(),this.helper=t("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(e){var i=this,s=this.options;this.opos=[e.pageX,e.pageY],this.options.disabled||(this.selectees=t(s.filter,this.element[0]),this._trigger("start",e),t(s.appendTo).append(this.helper),this.helper.css({left:e.pageX,top:e.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=t.data(this,"selectable-item");s.startselected=!0,e.metaKey||e.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",e,{unselecting:s.element}))}),t(e.target).parents().addBack().each(function(){var s,n=t.data(this,"selectable-item");return n?(s=!e.metaKey&&!e.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",e,{selecting:n.element}):i._trigger("unselecting",e,{unselecting:n.element}),!1):undefined}))},_mouseDrag:function(e){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,o=this.opos[0],a=this.opos[1],r=e.pageX,h=e.pageY;return o>r&&(i=r,r=o,o=i),a>h&&(i=h,h=a,a=i),this.helper.css({left:o,top:a,width:r-o,height:h-a}),this.selectees.each(function(){var i=t.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||o>i.right||i.top>h||a>i.bottom):"fit"===n.tolerance&&(l=i.left>o&&r>i.right&&i.top>a&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",e,{selecting:i.element}))):(i.selecting&&((e.metaKey||e.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",e,{unselecting:i.element}))),i.selected&&(e.metaKey||e.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",e,{unselecting:i.element})))))}),!1}},_mouseStop:function(e){var i=this;return this.dragged=!1,t(".ui-unselecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",e,{unselected:s.element})}),t(".ui-selecting",this.element[0]).each(function(){var s=t.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",e,{selected:s.element})}),this._trigger("stop",e),this.helper.remove(),!1}})}(jQuery),function(t){function e(t,e,i){return t>e&&e+i>t}function i(t){return/left|right/.test(t.css("float"))||/inline|table-cell/.test(t.css("display"))}t.widget("ui.sortable",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_create:function(){var t=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===t.axis||i(this.items[0].item):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var t=this.items.length-1;t>=0;t--)this.items[t].item.removeData(this.widgetName+"-item");return this},_setOption:function(e,i){"disabled"===e?(this.options[e]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):t.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(e,i){var s=null,n=!1,o=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(e),t(e.target).parents().each(function(){return t.data(this,o.widgetName+"-item")===o?(s=t(this),!1):undefined}),t.data(e.target,o.widgetName+"-item")===o&&(s=t(e.target)),s?!this.options.handle||i||(t(this.options.handle,s).find("*").addBack().each(function(){this===e.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(e,i,s){var n,o,a=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(e),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},t.extend(this.offset,{click:{left:e.pageX-this.offset.left,top:e.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(e),this.originalPageX=e.pageX,this.originalPageY=e.pageY,a.cursorAt&&this._adjustOffsetFromHelper(a.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),a.containment&&this._setContainment(),a.cursor&&"auto"!==a.cursor&&(o=this.document.find("body"),this.storedCursor=o.css("cursor"),o.css("cursor",a.cursor),this.storedStylesheet=t("<style>*{ cursor: "+a.cursor+" !important; }</style>").appendTo(o)),a.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",a.opacity)),a.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",a.zIndex)),this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",e,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",e,this._uiHash(this));return t.ui.ddmanager&&(t.ui.ddmanager.current=this),t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(e),!0},_mouseDrag:function(e){var i,s,n,o,a=this.options,r=!1;for(this.position=this._generatePosition(e),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==document&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-e.pageY<a.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+a.scrollSpeed:e.pageY-this.overflowOffset.top<a.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-a.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-e.pageX<a.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+a.scrollSpeed:e.pageX-this.overflowOffset.left<a.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-a.scrollSpeed)):(e.pageY-t(document).scrollTop()<a.scrollSensitivity?r=t(document).scrollTop(t(document).scrollTop()-a.scrollSpeed):t(window).height()-(e.pageY-t(document).scrollTop())<a.scrollSensitivity&&(r=t(document).scrollTop(t(document).scrollTop()+a.scrollSpeed)),e.pageX-t(document).scrollLeft()<a.scrollSensitivity?r=t(document).scrollLeft(t(document).scrollLeft()-a.scrollSpeed):t(window).width()-(e.pageX-t(document).scrollLeft())<a.scrollSensitivity&&(r=t(document).scrollLeft(t(document).scrollLeft()+a.scrollSpeed))),r!==!1&&t.ui.ddmanager&&!a.dropBehaviour&&t.ui.ddmanager.prepareOffsets(this,e)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],o=this._intersectsWithPointer(s),o&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===o?"next":"prev"]()[0]!==n&&!t.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!t.contains(this.element[0],n):!0)){if(this.direction=1===o?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;
-this._rearrange(e,s),this._trigger("change",e,this._uiHash());break}return this._contactContainers(e),t.ui.ddmanager&&t.ui.ddmanager.drag(this,e),this._trigger("sort",e,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(e,i){if(e){if(t.ui.ddmanager&&!this.options.dropBehaviour&&t.ui.ddmanager.drop(this,e),this.options.revert){var s=this,n=this.placeholder.offset(),o=this.options.axis,a={};o&&"x"!==o||(a.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollLeft)),o&&"y"!==o||(a.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===document.body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,t(this.helper).animate(a,parseInt(this.options.revert,10)||500,function(){s._clear(e)})}else this._clear(e,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var e=this.containers.length-1;e>=0;e--)this.containers[e]._trigger("deactivate",null,this._uiHash(this)),this.containers[e].containerCache.over&&(this.containers[e]._trigger("out",null,this._uiHash(this)),this.containers[e].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),t.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?t(this.domPosition.prev).after(this.currentItem):t(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},t(i).each(function(){var i=(t(e.item||this).attr(e.attribute||"id")||"").match(e.expression||/(.+)[\-=_](.+)/);i&&s.push((e.key||i[1]+"[]")+"="+(e.key&&e.expression?i[1]:i[2]))}),!s.length&&e.key&&s.push(e.key+"="),s.join("&")},toArray:function(e){var i=this._getItemsAsjQuery(e&&e.connected),s=[];return e=e||{},i.each(function(){s.push(t(e.item||this).attr(e.attribute||"id")||"")}),s},_intersectsWith:function(t){var e=this.positionAbs.left,i=e+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,o=t.left,a=o+t.width,r=t.top,h=r+t.height,l=this.offset.click.top,c=this.offset.click.left,u="x"===this.options.axis||s+l>r&&h>s+l,d="y"===this.options.axis||e+c>o&&a>e+c,p=u&&d;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>t[this.floating?"width":"height"]?p:e+this.helperProportions.width/2>o&&a>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,o=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return n?this.floating?a&&"right"===a||"down"===o?2:1:o&&("down"===o?2:1):!1},_intersectsWithSides:function(t){var i=e(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return this.floating&&o?"right"===o&&s||"left"===o&&!s:n&&("down"===n&&i||"up"===n&&!i)},_getDragVerticalDirection:function(){var t=this.positionAbs.top-this.lastPositionAbs.top;return 0!==t&&(t>0?"down":"up")},_getDragHorizontalDirection:function(){var t=this.positionAbs.left-this.lastPositionAbs.left;return 0!==t&&(t>0?"right":"left")},refresh:function(t){return this._refreshItems(t),this.refreshPositions(),this},_connectWith:function(){var t=this.options;return t.connectWith.constructor===String?[t.connectWith]:t.connectWith},_getItemsAsjQuery:function(e){var i,s,n,o,a=[],r=[],h=this._connectWith();if(h&&e)for(i=h.length-1;i>=0;i--)for(n=t(h[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&r.push([t.isFunction(o.options.items)?o.options.items.call(o.element):t(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(r.push([t.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):t(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),i=r.length-1;i>=0;i--)r[i][0].each(function(){a.push(this)});return t(a)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=t.grep(this.items,function(t){for(var i=0;e.length>i;i++)if(e[i]===t.item[0])return!1;return!0})},_refreshItems:function(e){this.items=[],this.containers=[this];var i,s,n,o,a,r,h,l,c=this.items,u=[[t.isFunction(this.options.items)?this.options.items.call(this.element[0],e,{item:this.currentItem}):t(this.options.items,this.element),this]],d=this._connectWith();if(d&&this.ready)for(i=d.length-1;i>=0;i--)for(n=t(d[i]),s=n.length-1;s>=0;s--)o=t.data(n[s],this.widgetFullName),o&&o!==this&&!o.options.disabled&&(u.push([t.isFunction(o.options.items)?o.options.items.call(o.element[0],e,{item:this.currentItem}):t(o.options.items,o.element),o]),this.containers.push(o));for(i=u.length-1;i>=0;i--)for(a=u[i][1],r=u[i][0],s=0,l=r.length;l>s;s++)h=t(r[s]),h.data(this.widgetName+"-item",a),c.push({item:h,instance:a,width:0,height:0,left:0,top:0})},refreshPositions:function(e){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,o;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?t(this.options.toleranceElement,s.item):s.item,e||(s.width=n.outerWidth(),s.height=n.outerHeight()),o=n.offset(),s.left=o.left,s.top=o.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)o=this.containers[i].element.offset(),this.containers[i].containerCache.left=o.left,this.containers[i].containerCache.top=o.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(e){e=e||this;var i,s=e.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=e.currentItem[0].nodeName.toLowerCase(),n=t("<"+s+">",e.document[0]).addClass(i||e.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tr"===s?e.currentItem.children().each(function(){t("<td> </td>",e.document[0]).attr("colspan",t(this).attr("colspan")||1).appendTo(n)}):"img"===s&&n.attr("src",e.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(t,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(e.currentItem.innerHeight()-parseInt(e.currentItem.css("paddingTop")||0,10)-parseInt(e.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(e.currentItem.innerWidth()-parseInt(e.currentItem.css("paddingLeft")||0,10)-parseInt(e.currentItem.css("paddingRight")||0,10)))}}),e.placeholder=t(s.placeholder.element.call(e.element,e.currentItem)),e.currentItem.after(e.placeholder),s.placeholder.update(e,e.placeholder)},_contactContainers:function(s){var n,o,a,r,h,l,c,u,d,p,f=null,g=null;for(n=this.containers.length-1;n>=0;n--)if(!t.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(f&&t.contains(this.containers[n].element[0],f.element[0]))continue;f=this.containers[n],g=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",s,this._uiHash(this)),this.containers[n].containerCache.over=0);if(f)if(1===this.containers.length)this.containers[g].containerCache.over||(this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1);else{for(a=1e4,r=null,p=f.floating||i(this.currentItem),h=p?"left":"top",l=p?"width":"height",c=this.positionAbs[h]+this.offset.click[h],o=this.items.length-1;o>=0;o--)t.contains(this.containers[g].element[0],this.items[o].item[0])&&this.items[o].item[0]!==this.currentItem[0]&&(!p||e(this.positionAbs.top+this.offset.click.top,this.items[o].top,this.items[o].height))&&(u=this.items[o].item.offset()[h],d=!1,Math.abs(u-c)>Math.abs(u+this.items[o][l]-c)&&(d=!0,u+=this.items[o][l]),a>Math.abs(u-c)&&(a=Math.abs(u-c),r=this.items[o],this.direction=d?"up":"down"));if(!r&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[g])return;r?this._rearrange(s,r,null,!0):this._rearrange(s,null,this.containers[g].element,!0),this._trigger("change",s,this._uiHash()),this.containers[g]._trigger("change",s,this._uiHash(this)),this.currentContainer=this.containers[g],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[g]._trigger("over",s,this._uiHash(this)),this.containers[g].containerCache.over=1}},_createHelper:function(e){var i=this.options,s=t.isFunction(i.helper)?t(i.helper.apply(this.element[0],[e,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||t("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(e){"string"==typeof e&&(e=e.split(" ")),t.isArray(e)&&(e={left:+e[0],top:+e[1]||0}),"left"in e&&(this.offset.click.left=e.left+this.margins.left),"right"in e&&(this.offset.click.left=this.helperProportions.width-e.right+this.margins.left),"top"in e&&(this.offset.click.top=e.top+this.margins.top),"bottom"in e&&(this.offset.click.top=this.helperProportions.height-e.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var e=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])&&(e.left+=this.scrollParent.scrollLeft(),e.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===document.body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&t.ui.ie)&&(e={top:0,left:0}),{top:e.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:e.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var t=this.currentItem.position();return{top:t.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:t.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,t("document"===n.containment?document:window).width()-this.helperProportions.width-this.margins.left,(t("document"===n.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(e=t(n.containment)[0],i=t(n.containment).offset(),s="hidden"!==t(e).css("overflow"),this.containment=[i.left+(parseInt(t(e).css("borderLeftWidth"),10)||0)+(parseInt(t(e).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(t(e).css("borderTopWidth"),10)||0)+(parseInt(t(e).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(e.scrollWidth,e.offsetWidth):e.offsetWidth)-(parseInt(t(e).css("borderLeftWidth"),10)||0)-(parseInt(t(e).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(e.scrollHeight,e.offsetHeight):e.offsetHeight)-(parseInt(t(e).css("borderTopWidth"),10)||0)-(parseInt(t(e).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(e,i){i||(i=this.position);var s="absolute"===e?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():o?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():o?0:n.scrollLeft())*s}},_generatePosition:function(e){var i,s,n=this.options,o=e.pageX,a=e.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==document&&t.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==document&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(e.pageX-this.offset.click.left<this.containment[0]&&(o=this.containment[0]+this.offset.click.left),e.pageY-this.offset.click.top<this.containment[1]&&(a=this.containment[1]+this.offset.click.top),e.pageX-this.offset.click.left>this.containment[2]&&(o=this.containment[2]+this.offset.click.left),e.pageY-this.offset.click.top>this.containment[3]&&(a=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((a-this.originalPageY)/n.grid[1])*n.grid[1],a=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((o-this.originalPageX)/n.grid[0])*n.grid[0],o=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:a-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:o-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(t,e,i,s){i?i[0].appendChild(this.placeholder[0]):e.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?e.item[0]:e.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(t,e){this.reverting=!1;var i,s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(i in this._storedCSS)("auto"===this._storedCSS[i]||"static"===this._storedCSS[i])&&(this._storedCSS[i]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!e&&s.push(function(t){this._trigger("receive",t,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||e||s.push(function(t){this._trigger("update",t,this._uiHash())}),this!==this.currentContainer&&(e||(s.push(function(t){this._trigger("remove",t,this._uiHash())}),s.push(function(t){return function(e){t._trigger("receive",e,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(t){return function(e){t._trigger("update",e,this._uiHash(this))}}.call(this,this.currentContainer)))),i=this.containers.length-1;i>=0;i--)e||s.push(function(t){return function(e){t._trigger("deactivate",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(s.push(function(t){return function(e){t._trigger("out",e,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!e){for(this._trigger("beforeStop",t,this._uiHash()),i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(e||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null,!e){for(i=0;s.length>i;i++)s[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){t.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(e){var i=e||this;return{helper:i.helper,placeholder:i.placeholder||t([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:e?e.element:null}}})}(jQuery),function(t,e){var i="ui-effects-";t.effects={effect:{}},function(t,e){function i(t,e,i){var s=u[e.type]||{};return null==t?i||!e.def?null:e.def:(t=s.floor?~~t:parseFloat(t),isNaN(t)?e.def:s.mod?(t+s.mod)%s.mod:0>t?0:t>s.max?s.max:t)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(t,o){var a,r=o.re.exec(i),h=r&&o.parse(r),l=o.space||"rgba";return h?(a=s[l](h),s[c[l].cache]=a[c[l].cache],n=s._rgba=a._rgba,!1):e}),n.length?("0,0,0,0"===n.join()&&t.extend(n,o.transparent),s):o[i]}function n(t,e,i){return i=(i+1)%1,1>6*i?t+6*(e-t)*i:1>2*i?e:2>3*i?t+6*(e-t)*(2/3-i):t}var o,a="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[t[1],t[2],t[3],t[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(t){return[2.55*t[1],2.55*t[2],2.55*t[3],t[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(t){return[t[1],t[2]/100,t[3]/100,t[4]]}}],l=t.Color=function(e,i,s,n){return new t.Color.fn.parse(e,i,s,n)},c={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},u={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=t("<p>")[0],f=t.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(c,function(t,e){e.cache="_"+t,e.props.alpha={idx:3,type:"percent",def:1}}),l.fn=t.extend(l.prototype,{parse:function(n,a,r,h){if(n===e)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=t(n).css(a),a=e);var u=this,d=t.type(n),p=this._rgba=[];return a!==e&&(n=[n,a,r,h],d="array"),"string"===d?this.parse(s(n)||o._default):"array"===d?(f(c.rgba.props,function(t,e){p[e.idx]=i(n[e.idx],e)}),this):"object"===d?(n instanceof l?f(c,function(t,e){n[e.cache]&&(u[e.cache]=n[e.cache].slice())}):f(c,function(e,s){var o=s.cache;f(s.props,function(t,e){if(!u[o]&&s.to){if("alpha"===t||null==n[t])return;u[o]=s.to(u._rgba)}u[o][e.idx]=i(n[t],e,!0)}),u[o]&&0>t.inArray(null,u[o].slice(0,3))&&(u[o][3]=1,s.from&&(u._rgba=s.from(u[o])))}),this):e},is:function(t){var i=l(t),s=!0,n=this;return f(c,function(t,o){var a,r=i[o.cache];return r&&(a=n[o.cache]||o.to&&o.to(n._rgba)||[],f(o.props,function(t,i){return null!=r[i.idx]?s=r[i.idx]===a[i.idx]:e})),s}),s},_space:function(){var t=[],e=this;return f(c,function(i,s){e[s.cache]&&t.push(i)}),t.pop()},transition:function(t,e){var s=l(t),n=s._space(),o=c[n],a=0===this.alpha()?l("transparent"):this,r=a[o.cache]||o.to(a._rgba),h=r.slice();return s=s[o.cache],f(o.props,function(t,n){var o=n.idx,a=r[o],l=s[o],c=u[n.type]||{};null!==l&&(null===a?h[o]=l:(c.mod&&(l-a>c.mod/2?a+=c.mod:a-l>c.mod/2&&(a-=c.mod)),h[o]=i((l-a)*e+a,n)))}),this[n](h)},blend:function(e){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(e)._rgba;return l(t.map(i,function(t,e){return(1-s)*n[e]+s*t}))},toRgbaString:function(){var e="rgba(",i=t.map(this._rgba,function(t,e){return null==t?e>2?1:0:t});return 1===i[3]&&(i.pop(),e="rgb("),e+i.join()+")"},toHslaString:function(){var e="hsla(",i=t.map(this.hsla(),function(t,e){return null==t&&(t=e>2?1:0),e&&3>e&&(t=Math.round(100*t)+"%"),t});return 1===i[3]&&(i.pop(),e="hsl("),e+i.join()+")"},toHexString:function(e){var i=this._rgba.slice(),s=i.pop();return e&&i.push(~~(255*s)),"#"+t.map(i,function(t){return t=(t||0).toString(16),1===t.length?"0"+t:t}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,c.hsla.to=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e,i,s=t[0]/255,n=t[1]/255,o=t[2]/255,a=t[3],r=Math.max(s,n,o),h=Math.min(s,n,o),l=r-h,c=r+h,u=.5*c;return e=h===r?0:s===r?60*(n-o)/l+360:n===r?60*(o-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=u?l/c:l/(2-c),[Math.round(e)%360,i,u,null==a?1:a]},c.hsla.from=function(t){if(null==t[0]||null==t[1]||null==t[2])return[null,null,null,t[3]];var e=t[0]/360,i=t[1],s=t[2],o=t[3],a=.5>=s?s*(1+i):s+i-s*i,r=2*s-a;return[Math.round(255*n(r,a,e+1/3)),Math.round(255*n(r,a,e)),Math.round(255*n(r,a,e-1/3)),o]},f(c,function(s,n){var o=n.props,a=n.cache,h=n.to,c=n.from;l.fn[s]=function(s){if(h&&!this[a]&&(this[a]=h(this._rgba)),s===e)return this[a].slice();var n,r=t.type(s),u="array"===r||"object"===r?s:arguments,d=this[a].slice();return f(o,function(t,e){var s=u["object"===r?t:e.idx];null==s&&(s=d[e.idx]),d[e.idx]=i(s,e)}),c?(n=l(c(d)),n[a]=d,n):l(d)},f(o,function(e,i){l.fn[e]||(l.fn[e]=function(n){var o,a=t.type(n),h="alpha"===e?this._hsla?"hsla":"rgba":s,l=this[h](),c=l[i.idx];return"undefined"===a?c:("function"===a&&(n=n.call(this,c),a=t.type(n)),null==n&&i.empty?this:("string"===a&&(o=r.exec(n),o&&(n=c+parseFloat(o[2])*("+"===o[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(e){var i=e.split(" ");f(i,function(e,i){t.cssHooks[i]={set:function(e,n){var o,a,r="";if("transparent"!==n&&("string"!==t.type(n)||(o=s(n)))){if(n=l(o||n),!d.rgba&&1!==n._rgba[3]){for(a="backgroundColor"===i?e.parentNode:e;(""===r||"transparent"===r)&&a&&a.style;)try{r=t.css(a,"backgroundColor"),a=a.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{e.style[i]=n}catch(h){}}},t.fx.step[i]=function(e){e.colorInit||(e.start=l(e.elem,i),e.end=l(e.end),e.colorInit=!0),t.cssHooks[i].set(e.elem,e.start.transition(e.end,e.pos))}})},l.hook(a),t.cssHooks.borderColor={expand:function(t){var e={};return f(["Top","Right","Bottom","Left"],function(i,s){e["border"+s+"Color"]=t}),e}},o=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(e){var i,s,n=e.ownerDocument.defaultView?e.ownerDocument.defaultView.getComputedStyle(e,null):e.currentStyle,o={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(o[t.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(o[i]=n[i]);return o}function s(e,i){var s,n,a={};for(s in i)n=i[s],e[s]!==n&&(o[s]||(t.fx.step[s]||!isNaN(parseFloat(n)))&&(a[s]=n));return a}var n=["add","remove","toggle"],o={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};t.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(e,i){t.fx.step[i]=function(t){("none"!==t.end&&!t.setAttr||1===t.pos&&!t.setAttr)&&(jQuery.style(t.elem,i,t.end),t.setAttr=!0)}}),t.fn.addBack||(t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.effects.animateClass=function(e,o,a,r){var h=t.speed(o,a,r);return this.queue(function(){var o,a=t(this),r=a.attr("class")||"",l=h.children?a.find("*").addBack():a;l=l.map(function(){var e=t(this);return{el:e,start:i(this)}}),o=function(){t.each(n,function(t,i){e[i]&&a[i+"Class"](e[i])})},o(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),a.attr("class",r),l=l.map(function(){var e=this,i=t.Deferred(),s=t.extend({},h,{queue:!1,complete:function(){i.resolve(e)}});return this.el.animate(this.diff,s),i.promise()}),t.when.apply(t,l.get()).done(function(){o(),t.each(arguments,function(){var e=this.el;t.each(this.diff,function(t){e.css(t,"")})}),h.complete.call(a[0])})})},t.fn.extend({addClass:function(e){return function(i,s,n,o){return s?t.effects.animateClass.call(this,{add:i},s,n,o):e.apply(this,arguments)}}(t.fn.addClass),removeClass:function(e){return function(i,s,n,o){return arguments.length>1?t.effects.animateClass.call(this,{remove:i},s,n,o):e.apply(this,arguments)}}(t.fn.removeClass),toggleClass:function(i){return function(s,n,o,a,r){return"boolean"==typeof n||n===e?o?t.effects.animateClass.call(this,n?{add:s}:{remove:s},o,a,r):i.apply(this,arguments):t.effects.animateClass.call(this,{toggle:s},n,o,a)}}(t.fn.toggleClass),switchClass:function(e,i,s,n,o){return t.effects.animateClass.call(this,{add:i,remove:e},s,n,o)}})}(),function(){function s(e,i,s,n){return t.isPlainObject(e)&&(i=e,e=e.effect),e={effect:e},null==i&&(i={}),t.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||t.fx.speeds[i])&&(n=s,s=i,i={}),t.isFunction(s)&&(n=s,s=null),i&&t.extend(e,i),s=s||i.duration,e.duration=t.fx.off?0:"number"==typeof s?s:s in t.fx.speeds?t.fx.speeds[s]:t.fx.speeds._default,e.complete=n||i.complete,e}function n(e){return!e||"number"==typeof e||t.fx.speeds[e]?!0:"string"!=typeof e||t.effects.effect[e]?t.isFunction(e)?!0:"object"!=typeof e||e.effect?!1:!0:!0}t.extend(t.effects,{version:"1.10.3",save:function(t,e){for(var s=0;e.length>s;s++)null!==e[s]&&t.data(i+e[s],t[0].style[e[s]])},restore:function(t,s){var n,o;for(o=0;s.length>o;o++)null!==s[o]&&(n=t.data(i+s[o]),n===e&&(n=""),t.css(s[o],n))},setMode:function(t,e){return"toggle"===e&&(e=t.is(":hidden")?"show":"hide"),e},getBaseline:function(t,e){var i,s;switch(t[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=t[0]/e.height}switch(t[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=t[1]/e.width}return{x:s,y:i}},createWrapper:function(e){if(e.parent().is(".ui-effects-wrapper"))return e.parent();var i={width:e.outerWidth(!0),height:e.outerHeight(!0),"float":e.css("float")},s=t("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:e.width(),height:e.height()},o=document.activeElement;try{o.id}catch(a){o=document.body}return e.wrap(s),(e[0]===o||t.contains(e[0],o))&&t(o).focus(),s=e.parent(),"static"===e.css("position")?(s.css({position:"relative"}),e.css({position:"relative"})):(t.extend(i,{position:e.css("position"),zIndex:e.css("z-index")}),t.each(["top","left","bottom","right"],function(t,s){i[s]=e.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),e.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),e.css(n),s.css(i).show()},removeWrapper:function(e){var i=document.activeElement;return e.parent().is(".ui-effects-wrapper")&&(e.parent().replaceWith(e),(e[0]===i||t.contains(e[0],i))&&t(i).focus()),e},setTransition:function(e,i,s,n){return n=n||{},t.each(i,function(t,i){var o=e.cssUnit(i);o[0]>0&&(n[i]=o[0]*s+o[1])}),n}}),t.fn.extend({effect:function(){function e(e){function s(){t.isFunction(o)&&o.call(n[0]),t.isFunction(e)&&e()}var n=t(this),o=i.complete,r=i.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),s()):a.call(n[0],i,s)}var i=s.apply(this,arguments),n=i.mode,o=i.queue,a=t.effects.effect[i.effect];return t.fx.off||!a?n?this[n](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):o===!1?this.each(e):this.queue(o||"fx",e)},show:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(t.fn.show),hide:function(t){return function(e){if(n(e))return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(t.fn.hide),toggle:function(t){return function(e){if(n(e)||"boolean"==typeof e)return t.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(t.fn.toggle),cssUnit:function(e){var i=this.css(e),s=[];return t.each(["em","px","%","pt"],function(t,e){i.indexOf(e)>0&&(s=[parseFloat(i),e])}),s}})}(),function(){var e={};t.each(["Quad","Cubic","Quart","Quint","Expo"],function(t,i){e[i]=function(e){return Math.pow(e,t+2)}}),t.extend(e,{Sine:function(t){return 1-Math.cos(t*Math.PI/2)},Circ:function(t){return 1-Math.sqrt(1-t*t)},Elastic:function(t){return 0===t||1===t?t:-Math.pow(2,8*(t-1))*Math.sin((80*(t-1)-7.5)*Math.PI/15)},Back:function(t){return t*t*(3*t-2)},Bounce:function(t){for(var e,i=4;((e=Math.pow(2,--i))-1)/11>t;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*e-2)/22-t,2)}}),t.each(e,function(e,i){t.easing["easeIn"+e]=i,t.easing["easeOut"+e]=function(t){return 1-i(1-t)},t.easing["easeInOut"+e]=function(t){return.5>t?i(2*t)/2:1-i(-2*t+2)/2}})}()}(jQuery),function(t){var e=0,i={},s={};i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="hide",s.height=s.paddingTop=s.paddingBottom=s.borderTopWidth=s.borderBottomWidth="show",t.widget("ui.accordion",{version:"1.10.3",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var e=this.options;this.prevShow=this.prevHide=t(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),e.collapsible||e.active!==!1&&null!=e.active||(e.active=0),this._processPanels(),0>e.active&&(e.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():t(),content:this.active.length?this.active.next():t()}},_createIcons:function(){var e=this.options.icons;e&&(t("<span>").addClass("ui-accordion-header-icon ui-icon "+e.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(e.header).addClass(e.activeHeader),this.headers.addClass("ui-accordion-icons"))
-},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var t;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),t=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),"content"!==this.options.heightStyle&&t.css("height","")},_setOption:function(t,e){return"active"===t?(this._activate(e),undefined):("event"===t&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(e)),this._super(t,e),"collapsible"!==t||e||this.options.active!==!1||this._activate(0),"icons"===t&&(this._destroyIcons(),e&&this._createIcons()),"disabled"===t&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!e),undefined)},_keydown:function(e){if(!e.altKey&&!e.ctrlKey){var i=t.ui.keyCode,s=this.headers.length,n=this.headers.index(e.target),o=!1;switch(e.keyCode){case i.RIGHT:case i.DOWN:o=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:o=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(e);break;case i.HOME:o=this.headers[0];break;case i.END:o=this.headers[s-1]}o&&(t(e.target).attr("tabIndex",-1),t(o).attr("tabIndex",0),o.focus(),e.preventDefault())}},_panelKeyDown:function(e){e.keyCode===t.ui.keyCode.UP&&e.ctrlKey&&t(e.currentTarget).prev().focus()},refresh:function(){var e=this.options;this._processPanels(),e.active===!1&&e.collapsible===!0||!this.headers.length?(e.active=!1,this.active=t()):e.active===!1?this._activate(0):this.active.length&&!t.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(e.active=!1,this.active=t()):this._activate(Math.max(0,e.active-1)):e.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide()},_refresh:function(){var i,s=this.options,n=s.heightStyle,o=this.element.parent(),a=this.accordionId="ui-accordion-"+(this.element.attr("id")||++e);this.active=this._findActive(s.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(e){var i=t(this),s=i.attr("id"),n=i.next(),o=n.attr("id");s||(s=a+"-header-"+e,i.attr("id",s)),o||(o=a+"-panel-"+e,n.attr("id",o)),i.attr("aria-controls",o),n.attr("aria-labelledby",s)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(s.event),"fill"===n?(i=o.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.headers.each(function(){i-=t(this).outerHeight(!0)}),this.headers.next().each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===n&&(i=0,this.headers.next().each(function(){i=Math.max(i,t(this).css("height","").height())}).height(i))},_activate:function(e){var i=this._findActive(e)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return"number"==typeof e?this.headers.eq(e):t()},_setupEvents:function(e){var i={keydown:"_keydown"};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n[0]===s[0],a=o&&i.collapsible,r=a?t():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:a?t():n,newPanel:r};e.preventDefault(),o&&!i.collapsible||this._trigger("beforeActivate",e,l)===!1||(i.active=a?!1:this.headers.index(n),this.active=o?t():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),o||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(e){var i=e.newPanel,s=this.prevShow.length?this.prevShow:e.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,e):(s.hide(),i.show(),this._toggleComplete(e)),s.attr({"aria-expanded":"false","aria-hidden":"true"}),s.prev().attr("aria-selected","false"),i.length&&s.length?s.prev().attr("tabIndex",-1):i.length&&this.headers.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(t,e,n){var o,a,r,h=this,l=0,c=t.length&&(!e.length||t.index()<e.index()),u=this.options.animate||{},d=c&&u.down||u,p=function(){h._toggleComplete(n)};return"number"==typeof d&&(r=d),"string"==typeof d&&(a=d),a=a||d.easing||u.easing,r=r||d.duration||u.duration,e.length?t.length?(o=t.show().outerHeight(),e.animate(i,{duration:r,easing:a,step:function(t,e){e.now=Math.round(t)}}),t.hide().animate(s,{duration:r,easing:a,complete:p,step:function(t,i){i.now=Math.round(t),"height"!==i.prop?l+=i.now:"content"!==h.options.heightStyle&&(i.now=Math.round(o-e.outerHeight()-l),l=0)}}),undefined):e.animate(i,r,a,p):t.animate(s,r,a,p)},_toggleComplete:function(t){var e=t.oldPanel;e.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),e.length&&(e.parent()[0].className=e.parent()[0].className),this._trigger("activate",null,t)}})}(jQuery),function(t){var e=0;t.widget("ui.autocomplete",{version:"1.10.3",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o?!0:a?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,undefined;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:case o.NUMPAD_ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),undefined;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),undefined):(this._searchTimeout(t),undefined)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,undefined):(clearTimeout(this.searching),this.close(t),this._change(t),undefined)}}),this._initSource(),this.menu=t("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().data("ui-menu"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];t(e.target).closest(".ui-menu-item").length||this._delay(function(){var e=this;this.document.one("mousedown",function(s){s.target===e.element[0]||s.target===i||t.contains(i,s.target)||e.close()})})},menufocus:function(e,i){if(this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type)))return this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),undefined;var s=i.item.data("ui-autocomplete-item");!1!==this._trigger("focus",e,{item:s})?e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(s.value):this.liveRegion.text(s.value)},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=t("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertBefore(this.element),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e||(e=this.element.closest(".ui-front")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length<this.options.minLength?this.close(e):this._trigger("search",e)!==!1?this._search(t):undefined},_search:function(t){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:t},this._response())},_response:function(){var t=this,i=++e;return function(s){i===e&&t.__response(s),t.pending--,t.pending||t.element.removeClass("ui-autocomplete-loading")}},__response:function(t){t&&(t=this._normalize(t)),this._trigger("response",null,{content:t}),!this.options.disabled&&t&&t.length&&!this.cancelSearch?(this._suggest(t),this._trigger("open")):this._close()},close:function(t){this.cancelSearch=!0,this._close(t)},_close:function(t){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",t))},_change:function(t){this.previous!==this._value()&&this._trigger("change",t,{item:this.selectedItem})},_normalize:function(e){return e.length&&e[0].label&&e[0].value?e:t.map(e,function(e){return"string"==typeof e?{label:e,value:e}:t.extend({label:e.label||e.value,value:e.value||e.label},e)})},_suggest:function(e){var i=this.menu.element.empty();this._renderMenu(i,e),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(t.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var t=this.menu.element;t.outerWidth(Math.max(t.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(e,i){var s=this;t.each(i,function(t,i){s._renderItemData(e,i)})},_renderItemData:function(t,e){return this._renderItem(t,e).data("ui-autocomplete-item",e)},_renderItem:function(e,i){return t("<li>").append(t("<a>").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this._value(this.term),this.menu.blur(),undefined):(this.menu[t](e),undefined):(this.search(null,e),undefined)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var e;this._superApply(arguments),this.options.disabled||this.cancelSearch||(e=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.text(e))}})}(jQuery),function(t){var e,i,s,n,o="ui-button ui-widget ui-state-default ui-corner-all",a="ui-state-hover ui-state-active ",r="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",h=function(){var e=t(this);setTimeout(function(){e.find(":ui-button").button("refresh")},1)},l=function(e){var i=e.name,s=e.form,n=t([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?t(s).find("[name='"+i+"']"):t("[name='"+i+"']",e.ownerDocument).filter(function(){return!this.form})),n};t.widget("ui.button",{version:"1.10.3",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,h),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var a=this,r=this.options,c="checkbox"===this.type||"radio"===this.type,u=c?"":"ui-state-active",d="ui-state-focus";null===r.label&&(r.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){r.disabled||this===e&&t(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){r.disabled||t(this).removeClass(u)}).bind("click"+this.eventNamespace,function(t){r.disabled&&(t.preventDefault(),t.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){a.buttonElement.addClass(d)}).bind("blur"+this.eventNamespace,function(){a.buttonElement.removeClass(d)}),c&&(this.element.bind("change"+this.eventNamespace,function(){n||a.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(t){r.disabled||(n=!1,i=t.pageX,s=t.pageY)}).bind("mouseup"+this.eventNamespace,function(t){r.disabled||(i!==t.pageX||s!==t.pageY)&&(n=!0)})),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return r.disabled||n?!1:undefined}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(r.disabled||n)return!1;t(this).addClass("ui-state-active"),a.buttonElement.attr("aria-pressed","true");var e=a.element[0];l(e).not(e).map(function(){return t(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return r.disabled?!1:(t(this).addClass("ui-state-active"),e=this,a.document.one("mouseup",function(){e=null}),undefined)}).bind("mouseup"+this.eventNamespace,function(){return r.disabled?!1:(t(this).removeClass("ui-state-active"),undefined)}).bind("keydown"+this.eventNamespace,function(e){return r.disabled?!1:((e.keyCode===t.ui.keyCode.SPACE||e.keyCode===t.ui.keyCode.ENTER)&&t(this).addClass("ui-state-active"),undefined)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){t(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(e){e.keyCode===t.ui.keyCode.SPACE&&t(this).click()})),this._setOption("disabled",r.disabled),this._resetButton()},_determineButtonType:function(){var t,e,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(t=this.element.parents().last(),e="label[for='"+this.element.attr("id")+"']",this.buttonElement=t.find(e),this.buttonElement.length||(t=t.length?t.siblings():this.element.siblings(),this.buttonElement=t.filter(e),this.buttonElement.length||(this.buttonElement=t.find(e))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+a+" "+r).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(t,e){return this._super(t,e),"disabled"===t?(e?this.element.prop("disabled",!0):this.element.prop("disabled",!1),undefined):(this._resetButton(),undefined)},refresh:function(){var e=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");e!==this.options.disabled&&this._setOption("disabled",e),"radio"===this.type?l(this.element[0]).each(function(){t(this).is(":checked")?t(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):t(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),undefined;var e=this.buttonElement.removeClass(r),i=t("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(e.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,o=[];s.primary||s.secondary?(this.options.text&&o.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&e.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&e.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(o.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||e.attr("title",t.trim(i)))):o.push("ui-button-text-only"),e.addClass(o.join(" "))}}),t.widget("ui.buttonset",{version:"1.10.3",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(t,e){"disabled"===t&&this.buttons.button("option",t,e),this._super(t,e)},refresh:function(){var e="rtl"===this.element.css("direction");this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(e?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(e?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return t(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})}(jQuery),function(t,e){function i(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},t.extend(this._defaults,this.regional[""]),this.dpDiv=s(t("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function s(e){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(i,"mouseout",function(){t(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",function(){t.datepicker._isDisabledDatepicker(o.inline?e.parent()[0]:o.input[0])||(t(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),t(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&t(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&t(this).addClass("ui-datepicker-next-hover"))})}function n(e,i){t.extend(e,i);for(var s in i)null==i[s]&&(e[s]=i[s]);return e}t.extend(t.ui,{datepicker:{version:"1.10.3"}});var o,a="datepicker";t.extend(i.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(t){return n(this._defaults,t||{}),this},_attachDatepicker:function(e,i){var s,n,o;s=e.nodeName.toLowerCase(),n="div"===s||"span"===s,e.id||(this.uuid+=1,e.id="dp"+this.uuid),o=this._newInst(t(e),n),o.settings=t.extend({},i||{}),"input"===s?this._connectDatepicker(e,o):n&&this._inlineDatepicker(e,o)},_newInst:function(e,i){var n=e[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?s(t("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(e,i){var s=t(e);i.append=t([]),i.trigger=t([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),t.data(e,a,i),i.settings.disabled&&this._disableDatepicker(e))},_attachments:function(e,i){var s,n,o,a=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),a&&(i.append=t("<span class='"+this._appendClass+"'>"+a+"</span>"),e[r?"before":"after"](i.append)),e.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&e.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),o=this._get(i,"buttonImage"),i.trigger=t(this._get(i,"buttonImageOnly")?t("<img/>").addClass(this._triggerClass).attr({src:o,alt:n,title:n}):t("<button type='button'></button>").addClass(this._triggerClass).html(o?t("<img/>").attr({src:o,alt:n,title:n}):n)),e[r?"before":"after"](i.trigger),i.trigger.click(function(){return t.datepicker._datepickerShowing&&t.datepicker._lastInput===e[0]?t.datepicker._hideDatepicker():t.datepicker._datepickerShowing&&t.datepicker._lastInput!==e[0]?(t.datepicker._hideDatepicker(),t.datepicker._showDatepicker(e[0])):t.datepicker._showDatepicker(e[0]),!1}))},_autoSize:function(t){if(this._get(t,"autoSize")&&!t.inline){var e,i,s,n,o=new Date(2009,11,20),a=this._get(t,"dateFormat");a.match(/[DM]/)&&(e=function(t){for(i=0,s=0,n=0;t.length>n;n++)t[n].length>i&&(i=t[n].length,s=n);return s},o.setMonth(e(this._get(t,a.match(/MM/)?"monthNames":"monthNamesShort"))),o.setDate(e(this._get(t,a.match(/DD/)?"dayNames":"dayNamesShort"))+20-o.getDay())),t.input.attr("size",this._formatDate(t,o).length)}},_inlineDatepicker:function(e,i){var s=t(e);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),t.data(e,a,i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(e),i.dpDiv.css("display","block"))},_dialogDatepicker:function(e,i,s,o,r){var h,l,c,u,d,p=this._dialogInst;return p||(this.uuid+=1,h="dp"+this.uuid,this._dialogInput=t("<input type='text' id='"+h+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),t("body").append(this._dialogInput),p=this._dialogInst=this._newInst(this._dialogInput,!1),p.settings={},t.data(this._dialogInput[0],a,p)),n(p.settings,o||{}),i=i&&i.constructor===Date?this._formatDate(p,i):i,this._dialogInput.val(i),this._pos=r?r.length?r:[r.pageX,r.pageY]:null,this._pos||(l=document.documentElement.clientWidth,c=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[l/2-100+u,c/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),p.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),t.blockUI&&t.blockUI(this.dpDiv),t.data(this._dialogInput[0],a,p),this},_destroyDatepicker:function(e){var i,s=t(e),n=t.data(e,a);s.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),t.removeData(e,a),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty())},_enableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!1,o.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}))},_disableDatepicker:function(e){var i,s,n=t(e),o=t.data(e,a);n.hasClass(this.markerClassName)&&(i=e.nodeName.toLowerCase(),"input"===i?(e.disabled=!0,o.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=t.map(this._disabledInputs,function(t){return t===e?null:t}),this._disabledInputs[this._disabledInputs.length]=e)},_isDisabledDatepicker:function(t){if(!t)return!1;for(var e=0;this._disabledInputs.length>e;e++)if(this._disabledInputs[e]===t)return!0;return!1},_getInst:function(e){try{return t.data(e,a)}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(i,s,o){var a,r,h,l,c=this._getInst(i);return 2===arguments.length&&"string"==typeof s?"defaults"===s?t.extend({},t.datepicker._defaults):c?"all"===s?t.extend({},c.settings):this._get(c,s):null:(a=s||{},"string"==typeof s&&(a={},a[s]=o),c&&(this._curInst===c&&this._hideDatepicker(),r=this._getDateDatepicker(i,!0),h=this._getMinMaxDate(c,"min"),l=this._getMinMaxDate(c,"max"),n(c.settings,a),null!==h&&a.dateFormat!==e&&a.minDate===e&&(c.settings.minDate=this._formatDate(c,h)),null!==l&&a.dateFormat!==e&&a.maxDate===e&&(c.settings.maxDate=this._formatDate(c,l)),"disabled"in a&&(a.disabled?this._disableDatepicker(i):this._enableDatepicker(i)),this._attachments(t(i),c),this._autoSize(c),this._setDate(c,r),this._updateAlternate(c),this._updateDatepicker(c)),e)},_changeDatepicker:function(t,e,i){this._optionDatepicker(t,e,i)},_refreshDatepicker:function(t){var e=this._getInst(t);e&&this._updateDatepicker(e)},_setDateDatepicker:function(t,e){var i=this._getInst(t);i&&(this._setDate(i,e),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(t,e){var i=this._getInst(t);return i&&!i.inline&&this._setDateFromField(i,e),i?this._getDate(i):null},_doKeyDown:function(e){var i,s,n,o=t.datepicker._getInst(e.target),a=!0,r=o.dpDiv.is(".ui-datepicker-rtl");if(o._keyEvent=!0,t.datepicker._datepickerShowing)switch(e.keyCode){case 9:t.datepicker._hideDatepicker(),a=!1;break;case 13:return n=t("td."+t.datepicker._dayOverClass+":not(."+t.datepicker._currentClass+")",o.dpDiv),n[0]&&t.datepicker._selectDay(e.target,o.selectedMonth,o.selectedYear,n[0]),i=t.datepicker._get(o,"onSelect"),i?(s=t.datepicker._formatDate(o),i.apply(o.input?o.input[0]:null,[s,o])):t.datepicker._hideDatepicker(),!1;
-case 27:t.datepicker._hideDatepicker();break;case 33:t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 34:t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&t.datepicker._clearDate(e.target),a=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&t.datepicker._gotoToday(e.target),a=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?1:-1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?-t.datepicker._get(o,"stepBigMonths"):-t.datepicker._get(o,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,-7,"D"),a=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,r?-1:1,"D"),a=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&t.datepicker._adjustDate(e.target,e.ctrlKey?+t.datepicker._get(o,"stepBigMonths"):+t.datepicker._get(o,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&t.datepicker._adjustDate(e.target,7,"D"),a=e.ctrlKey||e.metaKey;break;default:a=!1}else 36===e.keyCode&&e.ctrlKey?t.datepicker._showDatepicker(this):a=!1;a&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(i){var s,n,o=t.datepicker._getInst(i.target);return t.datepicker._get(o,"constrainInput")?(s=t.datepicker._possibleChars(t.datepicker._get(o,"dateFormat")),n=String.fromCharCode(null==i.charCode?i.keyCode:i.charCode),i.ctrlKey||i.metaKey||" ">n||!s||s.indexOf(n)>-1):e},_doKeyUp:function(e){var i,s=t.datepicker._getInst(e.target);if(s.input.val()!==s.lastVal)try{i=t.datepicker.parseDate(t.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,t.datepicker._getFormatConfig(s)),i&&(t.datepicker._setDateFromField(s),t.datepicker._updateAlternate(s),t.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(e){if(e=e.target||e,"input"!==e.nodeName.toLowerCase()&&(e=t("input",e.parentNode)[0]),!t.datepicker._isDisabledDatepicker(e)&&t.datepicker._lastInput!==e){var i,s,o,a,r,h,l;i=t.datepicker._getInst(e),t.datepicker._curInst&&t.datepicker._curInst!==i&&(t.datepicker._curInst.dpDiv.stop(!0,!0),i&&t.datepicker._datepickerShowing&&t.datepicker._hideDatepicker(t.datepicker._curInst.input[0])),s=t.datepicker._get(i,"beforeShow"),o=s?s.apply(e,[e,i]):{},o!==!1&&(n(i.settings,o),i.lastVal=null,t.datepicker._lastInput=e,t.datepicker._setDateFromField(i),t.datepicker._inDialog&&(e.value=""),t.datepicker._pos||(t.datepicker._pos=t.datepicker._findPos(e),t.datepicker._pos[1]+=e.offsetHeight),a=!1,t(e).parents().each(function(){return a|="fixed"===t(this).css("position"),!a}),r={left:t.datepicker._pos[0],top:t.datepicker._pos[1]},t.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),t.datepicker._updateDatepicker(i),r=t.datepicker._checkOffset(i,r,a),i.dpDiv.css({position:t.datepicker._inDialog&&t.blockUI?"static":a?"fixed":"absolute",display:"none",left:r.left+"px",top:r.top+"px"}),i.inline||(h=t.datepicker._get(i,"showAnim"),l=t.datepicker._get(i,"duration"),i.dpDiv.zIndex(t(e).zIndex()+1),t.datepicker._datepickerShowing=!0,t.effects&&t.effects.effect[h]?i.dpDiv.show(h,t.datepicker._get(i,"showOptions"),l):i.dpDiv[h||"show"](h?l:null),t.datepicker._shouldFocusInput(i)&&i.input.focus(),t.datepicker._curInst=i))}},_updateDatepicker:function(e){this.maxRows=4,o=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var i,s=this._getNumberOfMonths(e),n=s[1],a=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&e.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),e.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e===t.datepicker._curInst&&t.datepicker._datepickerShowing&&t.datepicker._shouldFocusInput(e)&&e.input.focus(),e.yearshtml&&(i=e.yearshtml,setTimeout(function(){i===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),i=e.yearshtml=null},0))},_shouldFocusInput:function(t){return t.input&&t.input.is(":visible")&&!t.input.is(":disabled")&&!t.input.is(":focus")},_checkOffset:function(e,i,s){var n=e.dpDiv.outerWidth(),o=e.dpDiv.outerHeight(),a=e.input?e.input.outerWidth():0,r=e.input?e.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:t(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:t(document).scrollTop());return i.left-=this._get(e,"isRTL")?n-a:0,i.left-=s&&i.left===e.input.offset().left?t(document).scrollLeft():0,i.top-=s&&i.top===e.input.offset().top+r?t(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+o>l&&l>o?Math.abs(o+r):0),i},_findPos:function(e){for(var i,s=this._getInst(e),n=this._get(s,"isRTL");e&&("hidden"===e.type||1!==e.nodeType||t.expr.filters.hidden(e));)e=e[n?"previousSibling":"nextSibling"];return i=t(e).offset(),[i.left,i.top]},_hideDatepicker:function(e){var i,s,n,o,r=this._curInst;!r||e&&r!==t.data(e,a)||this._datepickerShowing&&(i=this._get(r,"showAnim"),s=this._get(r,"duration"),n=function(){t.datepicker._tidyDialog(r)},t.effects&&(t.effects.effect[i]||t.effects[i])?r.dpDiv.hide(i,t.datepicker._get(r,"showOptions"),s,n):r.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,o=this._get(r,"onClose"),o&&o.apply(r.input?r.input[0]:null,[r.input?r.input.val():"",r]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),t.blockUI&&(t.unblockUI(),t("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(t){t.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(t.datepicker._curInst){var i=t(e.target),s=t.datepicker._getInst(i[0]);(i[0].id!==t.datepicker._mainDivId&&0===i.parents("#"+t.datepicker._mainDivId).length&&!i.hasClass(t.datepicker.markerClassName)&&!i.closest("."+t.datepicker._triggerClass).length&&t.datepicker._datepickerShowing&&(!t.datepicker._inDialog||!t.blockUI)||i.hasClass(t.datepicker.markerClassName)&&t.datepicker._curInst!==s)&&t.datepicker._hideDatepicker()}},_adjustDate:function(e,i,s){var n=t(e),o=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(o,i+("M"===s?this._get(o,"showCurrentAtPos"):0),s),this._updateDatepicker(o))},_gotoToday:function(e){var i,s=t(e),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(e,i,s){var n=t(e),o=this._getInst(n[0]);o["selected"+("M"===s?"Month":"Year")]=o["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(o),this._adjustDate(n)},_selectDay:function(e,i,s,n){var o,a=t(e);t(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(a[0])||(o=this._getInst(a[0]),o.selectedDay=o.currentDay=t("a",n).html(),o.selectedMonth=o.currentMonth=i,o.selectedYear=o.currentYear=s,this._selectDate(e,this._formatDate(o,o.currentDay,o.currentMonth,o.currentYear)))},_clearDate:function(e){var i=t(e);this._selectDate(i,"")},_selectDate:function(e,i){var s,n=t(e),o=this._getInst(n[0]);i=null!=i?i:this._formatDate(o),o.input&&o.input.val(i),this._updateAlternate(o),s=this._get(o,"onSelect"),s?s.apply(o.input?o.input[0]:null,[i,o]):o.input&&o.input.trigger("change"),o.inline?this._updateDatepicker(o):(this._hideDatepicker(),this._lastInput=o.input[0],"object"!=typeof o.input[0]&&o.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var i,s,n,o=this._get(e,"altField");o&&(i=this._get(e,"altFormat")||this._get(e,"dateFormat"),s=this._getDate(e),n=this.formatDate(i,s,this._getFormatConfig(e)),t(o).each(function(){t(this).val(n)}))},noWeekends:function(t){var e=t.getDay();return[e>0&&6>e,""]},iso8601Week:function(t){var e,i=new Date(t.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),e=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((e-i)/864e5)/7)+1},parseDate:function(i,s,n){if(null==i||null==s)throw"Invalid arguments";if(s="object"==typeof s?""+s:s+"",""===s)return null;var o,a,r,h,l=0,c=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof c?c:(new Date).getFullYear()%100+parseInt(c,10),d=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,p=(n?n.dayNames:null)||this._defaults.dayNames,f=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,g=(n?n.monthNames:null)||this._defaults.monthNames,m=-1,v=-1,_=-1,b=-1,y=!1,w=function(t){var e=i.length>o+1&&i.charAt(o+1)===t;return e&&o++,e},k=function(t){var e=w(t),i="@"===t?14:"!"===t?20:"y"===t&&e?4:"o"===t?3:2,n=RegExp("^\\d{1,"+i+"}"),o=s.substring(l).match(n);if(!o)throw"Missing number at position "+l;return l+=o[0].length,parseInt(o[0],10)},x=function(i,n,o){var a=-1,r=t.map(w(i)?o:n,function(t,e){return[[e,t]]}).sort(function(t,e){return-(t[1].length-e[1].length)});if(t.each(r,function(t,i){var n=i[1];return s.substr(l,n.length).toLowerCase()===n.toLowerCase()?(a=i[0],l+=n.length,!1):e}),-1!==a)return a+1;throw"Unknown name at position "+l},D=function(){if(s.charAt(l)!==i.charAt(o))throw"Unexpected literal at position "+l;l++};for(o=0;i.length>o;o++)if(y)"'"!==i.charAt(o)||w("'")?D():y=!1;else switch(i.charAt(o)){case"d":_=k("d");break;case"D":x("D",d,p);break;case"o":b=k("o");break;case"m":v=k("m");break;case"M":v=x("M",f,g);break;case"y":m=k("y");break;case"@":h=new Date(k("@")),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"!":h=new Date((k("!")-this._ticksTo1970)/1e4),m=h.getFullYear(),v=h.getMonth()+1,_=h.getDate();break;case"'":w("'")?D():y=!0;break;default:D()}if(s.length>l&&(r=s.substr(l),!/^\s+/.test(r)))throw"Extra/unparsed characters found in date: "+r;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),b>-1)for(v=1,_=b;;){if(a=this._getDaysInMonth(m,v-1),a>=_)break;v++,_-=a}if(h=this._daylightSavingAdjust(new Date(m,v-1,_)),h.getFullYear()!==m||h.getMonth()+1!==v||h.getDate()!==_)throw"Invalid date";return h},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(t,e,i){if(!e)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,o=(i?i.dayNames:null)||this._defaults.dayNames,a=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(e){var i=t.length>s+1&&t.charAt(s+1)===e;return i&&s++,i},l=function(t,e,i){var s=""+e;if(h(t))for(;i>s.length;)s="0"+s;return s},c=function(t,e,i,s){return h(t)?s[e]:i[e]},u="",d=!1;if(e)for(s=0;t.length>s;s++)if(d)"'"!==t.charAt(s)||h("'")?u+=t.charAt(s):d=!1;else switch(t.charAt(s)){case"d":u+=l("d",e.getDate(),2);break;case"D":u+=c("D",e.getDay(),n,o);break;case"o":u+=l("o",Math.round((new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime()-new Date(e.getFullYear(),0,0).getTime())/864e5),3);break;case"m":u+=l("m",e.getMonth()+1,2);break;case"M":u+=c("M",e.getMonth(),a,r);break;case"y":u+=h("y")?e.getFullYear():(10>e.getYear()%100?"0":"")+e.getYear()%100;break;case"@":u+=e.getTime();break;case"!":u+=1e4*e.getTime()+this._ticksTo1970;break;case"'":h("'")?u+="'":d=!0;break;default:u+=t.charAt(s)}return u},_possibleChars:function(t){var e,i="",s=!1,n=function(i){var s=t.length>e+1&&t.charAt(e+1)===i;return s&&e++,s};for(e=0;t.length>e;e++)if(s)"'"!==t.charAt(e)||n("'")?i+=t.charAt(e):s=!1;else switch(t.charAt(e)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=t.charAt(e)}return i},_get:function(t,i){return t.settings[i]!==e?t.settings[i]:this._defaults[i]},_setDateFromField:function(t,e){if(t.input.val()!==t.lastVal){var i=this._get(t,"dateFormat"),s=t.lastVal=t.input?t.input.val():null,n=this._getDefaultDate(t),o=n,a=this._getFormatConfig(t);try{o=this.parseDate(i,s,a)||n}catch(r){s=e?"":s}t.selectedDay=o.getDate(),t.drawMonth=t.selectedMonth=o.getMonth(),t.drawYear=t.selectedYear=o.getFullYear(),t.currentDay=s?o.getDate():0,t.currentMonth=s?o.getMonth():0,t.currentYear=s?o.getFullYear():0,this._adjustInstDate(t)}},_getDefaultDate:function(t){return this._restrictMinMax(t,this._determineDate(t,this._get(t,"defaultDate"),new Date))},_determineDate:function(e,i,s){var n=function(t){var e=new Date;return e.setDate(e.getDate()+t),e},o=function(i){try{return t.datepicker.parseDate(t.datepicker._get(e,"dateFormat"),i,t.datepicker._getFormatConfig(e))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?t.datepicker._getDate(e):null)||new Date,o=n.getFullYear(),a=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":a+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a));break;case"y":case"Y":o+=parseInt(l[1],10),r=Math.min(r,t.datepicker._getDaysInMonth(o,a))}l=h.exec(i)}return new Date(o,a,r)},a=null==i||""===i?s:"string"==typeof i?o(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return a=a&&"Invalid Date"==""+a?s:a,a&&(a.setHours(0),a.setMinutes(0),a.setSeconds(0),a.setMilliseconds(0)),this._daylightSavingAdjust(a)},_daylightSavingAdjust:function(t){return t?(t.setHours(t.getHours()>12?t.getHours()+2:0),t):null},_setDate:function(t,e,i){var s=!e,n=t.selectedMonth,o=t.selectedYear,a=this._restrictMinMax(t,this._determineDate(t,e,new Date));t.selectedDay=t.currentDay=a.getDate(),t.drawMonth=t.selectedMonth=t.currentMonth=a.getMonth(),t.drawYear=t.selectedYear=t.currentYear=a.getFullYear(),n===t.selectedMonth&&o===t.selectedYear||i||this._notifyChange(t),this._adjustInstDate(t),t.input&&t.input.val(s?"":this._formatDate(t))},_getDate:function(t){var e=!t.currentYear||t.input&&""===t.input.val()?null:this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return e},_attachHandlers:function(e){var i=this._get(e,"stepMonths"),s="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){t.datepicker._adjustDate(s,-i,"M")},next:function(){t.datepicker._adjustDate(s,+i,"M")},hide:function(){t.datepicker._hideDatepicker()},today:function(){t.datepicker._gotoToday(s)},selectDay:function(){return t.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return t.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return t.datepicker._selectMonthYear(s,this,"Y"),!1}};t(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(t){var e,i,s,n,o,a,r,h,l,c,u,d,p,f,g,m,v,_,b,y,w,k,x,D,C,I,P,T,M,S,z,A,H,E,N,W,O,F,R,L=new Date,j=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(t,"isRTL"),B=this._get(t,"showButtonPanel"),V=this._get(t,"hideIfNoPrevNext"),K=this._get(t,"navigationAsDateFormat"),U=this._getNumberOfMonths(t),q=this._get(t,"showCurrentAtPos"),Q=this._get(t,"stepMonths"),X=1!==U[0]||1!==U[1],$=this._daylightSavingAdjust(t.currentDay?new Date(t.currentYear,t.currentMonth,t.currentDay):new Date(9999,9,9)),G=this._getMinMaxDate(t,"min"),J=this._getMinMaxDate(t,"max"),Z=t.drawMonth-q,te=t.drawYear;if(0>Z&&(Z+=12,te--),J)for(e=this._daylightSavingAdjust(new Date(J.getFullYear(),J.getMonth()-U[0]*U[1]+1,J.getDate())),e=G&&G>e?G:e;this._daylightSavingAdjust(new Date(te,Z,1))>e;)Z--,0>Z&&(Z=11,te--);for(t.drawMonth=Z,t.drawYear=te,i=this._get(t,"prevText"),i=K?this.formatDate(i,this._daylightSavingAdjust(new Date(te,Z-Q,1)),this._getFormatConfig(t)):i,s=this._canAdjustMonth(t,-1,te,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":V?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(t,"nextText"),n=K?this.formatDate(n,this._daylightSavingAdjust(new Date(te,Z+Q,1)),this._getFormatConfig(t)):n,o=this._canAdjustMonth(t,1,te,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":V?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",a=this._get(t,"currentText"),r=this._get(t,"gotoCurrent")&&t.currentDay?$:j,a=K?this.formatDate(a,r,this._getFormatConfig(t)):a,h=t.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(t,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(t,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+a+"</button>":"")+(Y?"":h)+"</div>":"",c=parseInt(this._get(t,"firstDay"),10),c=isNaN(c)?0:c,u=this._get(t,"showWeek"),d=this._get(t,"dayNames"),p=this._get(t,"dayNamesMin"),f=this._get(t,"monthNames"),g=this._get(t,"monthNamesShort"),m=this._get(t,"beforeShowDay"),v=this._get(t,"showOtherMonths"),_=this._get(t,"selectOtherMonths"),b=this._getDefaultDate(t),y="",k=0;U[0]>k;k++){for(x="",this.maxRows=4,D=0;U[1]>D;D++){if(C=this._daylightSavingAdjust(new Date(te,Z,t.selectedDay)),I=" ui-corner-all",P="",X){if(P+="<div class='ui-datepicker-group",U[1]>1)switch(D){case 0:P+=" ui-datepicker-group-first",I=" ui-corner-"+(Y?"right":"left");break;case U[1]-1:P+=" ui-datepicker-group-last",I=" ui-corner-"+(Y?"left":"right");break;default:P+=" ui-datepicker-group-middle",I=""}P+="'>"}for(P+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+I+"'>"+(/all|left/.test(I)&&0===k?Y?o:s:"")+(/all|right/.test(I)&&0===k?Y?s:o:"")+this._generateMonthYearHeader(t,Z,te,G,J,k>0||D>0,f,g)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",T=u?"<th class='ui-datepicker-week-col'>"+this._get(t,"weekHeader")+"</th>":"",w=0;7>w;w++)M=(w+c)%7,T+="<th"+((w+c+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+d[M]+"'>"+p[M]+"</span></th>";for(P+=T+"</tr></thead><tbody>",S=this._getDaysInMonth(te,Z),te===t.selectedYear&&Z===t.selectedMonth&&(t.selectedDay=Math.min(t.selectedDay,S)),z=(this._getFirstDayOfMonth(te,Z)-c+7)%7,A=Math.ceil((z+S)/7),H=X?this.maxRows>A?this.maxRows:A:A,this.maxRows=H,E=this._daylightSavingAdjust(new Date(te,Z,1-z)),N=0;H>N;N++){for(P+="<tr>",W=u?"<td class='ui-datepicker-week-col'>"+this._get(t,"calculateWeek")(E)+"</td>":"",w=0;7>w;w++)O=m?m.apply(t.input?t.input[0]:null,[E]):[!0,""],F=E.getMonth()!==Z,R=F&&!_||!O[0]||G&&G>E||J&&E>J,W+="<td class='"+((w+c+6)%7>=5?" ui-datepicker-week-end":"")+(F?" ui-datepicker-other-month":"")+(E.getTime()===C.getTime()&&Z===t.selectedMonth&&t._keyEvent||b.getTime()===E.getTime()&&b.getTime()===C.getTime()?" "+this._dayOverClass:"")+(R?" "+this._unselectableClass+" ui-state-disabled":"")+(F&&!v?"":" "+O[1]+(E.getTime()===$.getTime()?" "+this._currentClass:"")+(E.getTime()===j.getTime()?" ui-datepicker-today":""))+"'"+(F&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"'")+"'")+(R?"":" data-handler='selectDay' data-event='click' data-month='"+E.getMonth()+"' data-year='"+E.getFullYear()+"'")+">"+(F&&!v?" ":R?"<span class='ui-state-default'>"+E.getDate()+"</span>":"<a class='ui-state-default"+(E.getTime()===j.getTime()?" ui-state-highlight":"")+(E.getTime()===$.getTime()?" ui-state-active":"")+(F?" ui-priority-secondary":"")+"' href='#'>"+E.getDate()+"</a>")+"</td>",E.setDate(E.getDate()+1),E=this._daylightSavingAdjust(E);P+=W+"</tr>"}Z++,Z>11&&(Z=0,te++),P+="</tbody></table>"+(X?"</div>"+(U[0]>0&&D===U[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),x+=P}y+=x}return y+=l,t._keyEvent=!1,y},_generateMonthYearHeader:function(t,e,i,s,n,o,a,r){var h,l,c,u,d,p,f,g,m=this._get(t,"changeMonth"),v=this._get(t,"changeYear"),_=this._get(t,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",y="";if(o||!m)y+="<span class='ui-datepicker-month'>"+a[e]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,y+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",c=0;12>c;c++)(!h||c>=s.getMonth())&&(!l||n.getMonth()>=c)&&(y+="<option value='"+c+"'"+(c===e?" selected='selected'":"")+">"+r[c]+"</option>");y+="</select>"}if(_||(b+=y+(!o&&m&&v?"":" ")),!t.yearshtml)if(t.yearshtml="",o||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(u=this._get(t,"yearRange").split(":"),d=(new Date).getFullYear(),p=function(t){var e=t.match(/c[+\-].*/)?i+parseInt(t.substring(1),10):t.match(/[+\-].*/)?d+parseInt(t,10):parseInt(t,10);return isNaN(e)?d:e},f=p(u[0]),g=Math.max(f,p(u[1]||"")),f=s?Math.max(f,s.getFullYear()):f,g=n?Math.min(g,n.getFullYear()):g,t.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";g>=f;f++)t.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";t.yearshtml+="</select>",b+=t.yearshtml,t.yearshtml=null}return b+=this._get(t,"yearSuffix"),_&&(b+=(!o&&m&&v?"":" ")+y),b+="</div>"},_adjustInstDate:function(t,e,i){var s=t.drawYear+("Y"===i?e:0),n=t.drawMonth+("M"===i?e:0),o=Math.min(t.selectedDay,this._getDaysInMonth(s,n))+("D"===i?e:0),a=this._restrictMinMax(t,this._daylightSavingAdjust(new Date(s,n,o)));t.selectedDay=a.getDate(),t.drawMonth=t.selectedMonth=a.getMonth(),t.drawYear=t.selectedYear=a.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(t)},_restrictMinMax:function(t,e){var i=this._getMinMaxDate(t,"min"),s=this._getMinMaxDate(t,"max"),n=i&&i>e?i:e;return s&&n>s?s:n},_notifyChange:function(t){var e=this._get(t,"onChangeMonthYear");e&&e.apply(t.input?t.input[0]:null,[t.selectedYear,t.selectedMonth+1,t])},_getNumberOfMonths:function(t){var e=this._get(t,"numberOfMonths");return null==e?[1,1]:"number"==typeof e?[1,e]:e},_getMinMaxDate:function(t,e){return this._determineDate(t,this._get(t,e+"Date"),null)},_getDaysInMonth:function(t,e){return 32-this._daylightSavingAdjust(new Date(t,e,32)).getDate()},_getFirstDayOfMonth:function(t,e){return new Date(t,e,1).getDay()},_canAdjustMonth:function(t,e,i,s){var n=this._getNumberOfMonths(t),o=this._daylightSavingAdjust(new Date(i,s+(0>e?e:n[0]*n[1]),1));return 0>e&&o.setDate(this._getDaysInMonth(o.getFullYear(),o.getMonth())),this._isInRange(t,o)},_isInRange:function(t,e){var i,s,n=this._getMinMaxDate(t,"min"),o=this._getMinMaxDate(t,"max"),a=null,r=null,h=this._get(t,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),a=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(a+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||e.getTime()>=n.getTime())&&(!o||e.getTime()<=o.getTime())&&(!a||e.getFullYear()>=a)&&(!r||r>=e.getFullYear())},_getFormatConfig:function(t){var e=this._get(t,"shortYearCutoff");return e="string"!=typeof e?e:(new Date).getFullYear()%100+parseInt(e,10),{shortYearCutoff:e,dayNamesShort:this._get(t,"dayNamesShort"),dayNames:this._get(t,"dayNames"),monthNamesShort:this._get(t,"monthNamesShort"),monthNames:this._get(t,"monthNames")}},_formatDate:function(t,e,i,s){e||(t.currentDay=t.selectedDay,t.currentMonth=t.selectedMonth,t.currentYear=t.selectedYear);var n=e?"object"==typeof e?e:this._daylightSavingAdjust(new Date(s,i,e)):this._daylightSavingAdjust(new Date(t.currentYear,t.currentMonth,t.currentDay));return this.formatDate(this._get(t,"dateFormat"),n,this._getFormatConfig(t))}}),t.fn.datepicker=function(e){if(!this.length)return this;t.datepicker.initialized||(t(document).mousedown(t.datepicker._checkExternalClick),t.datepicker.initialized=!0),0===t("#"+t.datepicker._mainDivId).length&&t("body").append(t.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof e||"isDisabled"!==e&&"getDate"!==e&&"widget"!==e?"option"===e&&2===arguments.length&&"string"==typeof arguments[1]?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof e?t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this].concat(i)):t.datepicker._attachDatepicker(this,e)}):t.datepicker["_"+e+"Datepicker"].apply(t.datepicker,[this[0]].concat(i))},t.datepicker=new i,t.datepicker.initialized=!1,t.datepicker.uuid=(new Date).getTime(),t.datepicker.version="1.10.3"}(jQuery),function(t){var e={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};t.widget("ui.dialog",{version:"1.10.3",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(e){var i=t(this).css(e).offset().top;0>i&&t(this).css("top",e.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&t.fn.draggable&&this._makeDraggable(),this.options.resizable&&t.fn.resizable&&this._makeResizable(),this._isOpen=!1},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var e=this.options.appendTo;return e&&(e.jquery||e.nodeType)?t(e):this.document.find(e||"body").eq(0)},_destroy:function(){var t,e=this.originalPosition;this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),t=e.parent.children().eq(e.index),t.length&&t[0]!==this.element[0]?t.before(this.element):e.parent.append(this.element)},widget:function(){return this.uiDialog},disable:t.noop,enable:t.noop,close:function(e){var i=this;this._isOpen&&this._trigger("beforeClose",e)!==!1&&(this._isOpen=!1,this._destroyOverlay(),this.opener.filter(":focusable").focus().length||t(this.document[0].activeElement).blur(),this._hide(this.uiDialog,this.options.hide,function(){i._trigger("close",e)}))},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,e){var i=!!this.uiDialog.nextAll(":visible").insertBefore(this.uiDialog).length;return i&&!e&&this._trigger("focus",t),i},open:function(){var e=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),undefined):(this._isOpen=!0,this.opener=t(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this._show(this.uiDialog,this.options.show,function(){e._focusTabbable(),e._trigger("focus")}),this._trigger("open"),undefined)},_focusTabbable:function(){var t=this.element.find("[autofocus]");t.length||(t=this.element.find(":tabbable")),t.length||(t=this.uiDialogButtonPane.find(":tabbable")),t.length||(t=this.uiDialogTitlebarClose.filter(":tabbable")),t.length||(t=this.uiDialog),t.eq(0).focus()},_keepFocus:function(e){function i(){var e=this.document[0].activeElement,i=this.uiDialog[0]===e||t.contains(this.uiDialog[0],e);i||this._focusTabbable()}e.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=t("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(e){if(this.options.closeOnEscape&&!e.isDefaultPrevented()&&e.keyCode&&e.keyCode===t.ui.keyCode.ESCAPE)return e.preventDefault(),this.close(e),undefined;if(e.keyCode===t.ui.keyCode.TAB){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");e.target!==n[0]&&e.target!==this.uiDialog[0]||e.shiftKey?e.target!==s[0]&&e.target!==this.uiDialog[0]||!e.shiftKey||(n.focus(1),e.preventDefault()):(s.focus(1),e.preventDefault())}},mousedown:function(t){this._moveToTop(t)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var e;this.uiDialogTitlebar=t("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(e){t(e.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=t("<button></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(t){t.preventDefault(),this.close(t)}}),e=t("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(e),this.uiDialog.attr({"aria-labelledby":e.attr("id")})},_title:function(t){this.options.title||t.html(" "),t.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=t("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=t("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var e=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),t.isEmptyObject(i)||t.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),undefined):(t.each(i,function(i,s){var n,o;s=t.isFunction(s)?{click:s,text:i}:s,s=t.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(e.element[0],arguments)},o={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,t("<button></button>",s).button(o).appendTo(e.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),undefined)},_makeDraggable:function(){function e(t){return{position:t.position,offset:t.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){t(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,e(n))},drag:function(t,s){i._trigger("drag",t,e(s))},stop:function(n,o){s.position=[o.position.left-i.document.scrollLeft(),o.position.top-i.document.scrollTop()],t(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,e(o))}})},_makeResizable:function(){function e(t){return{originalPosition:t.originalPosition,originalSize:t.originalSize,position:t.position,size:t.size}
-}var i=this,s=this.options,n=s.resizable,o=this.uiDialog.css("position"),a="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:a,start:function(s,n){t(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,e(n))},resize:function(t,s){i._trigger("resize",t,e(s))},stop:function(n,o){s.height=t(this).height(),s.width=t(this).width(),t(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,e(o))}}).css("position",o)},_minHeight:function(){var t=this.options;return"auto"===t.height?t.minHeight:Math.min(t.minHeight,t.height)},_position:function(){var t=this.uiDialog.is(":visible");t||this.uiDialog.show(),this.uiDialog.position(this.options.position),t||this.uiDialog.hide()},_setOptions:function(s){var n=this,o=!1,a={};t.each(s,function(t,s){n._setOption(t,s),t in e&&(o=!0),t in i&&(a[t]=s)}),o&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",a)},_setOption:function(t,e){var i,s,n=this.uiDialog;"dialogClass"===t&&n.removeClass(this.options.dialogClass).addClass(e),"disabled"!==t&&(this._super(t,e),"appendTo"===t&&this.uiDialog.appendTo(this._appendTo()),"buttons"===t&&this._createButtons(),"closeText"===t&&this.uiDialogTitlebarClose.button({label:""+e}),"draggable"===t&&(i=n.is(":data(ui-draggable)"),i&&!e&&n.draggable("destroy"),!i&&e&&this._makeDraggable()),"position"===t&&this._position(),"resizable"===t&&(s=n.is(":data(ui-resizable)"),s&&!e&&n.resizable("destroy"),s&&"string"==typeof e&&n.resizable("option","handles",e),s||e===!1||this._makeResizable()),"title"===t&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var t,e,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),t=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),e=Math.max(0,s.minHeight-t),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-t):"none","auto"===s.height?this.element.css({minHeight:e,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-t)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var e=t(this);return t("<div>").css({position:"absolute",width:e.outerWidth(),height:e.outerHeight()}).appendTo(e.parent()).offset(e.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(e){return t(e.target).closest(".ui-dialog").length?!0:!!t(e.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var e=this,i=this.widgetFullName;t.ui.dialog.overlayInstances||this._delay(function(){t.ui.dialog.overlayInstances&&this.document.bind("focusin.dialog",function(s){e._allowInteraction(s)||(s.preventDefault(),t(".ui-dialog:visible:last .ui-dialog-content").data(i)._focusTabbable())})}),this.overlay=t("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),t.ui.dialog.overlayInstances++}},_destroyOverlay:function(){this.options.modal&&this.overlay&&(t.ui.dialog.overlayInstances--,t.ui.dialog.overlayInstances||this.document.unbind("focusin.dialog"),this.overlay.remove(),this.overlay=null)}}),t.ui.dialog.overlayInstances=0,t.uiBackCompat!==!1&&t.widget("ui.dialog",t.ui.dialog,{_position:function(){var e,i=this.options.position,s=[],n=[0,0];i?(("string"==typeof i||"object"==typeof i&&"0"in i)&&(s=i.split?i.split(" "):[i[0],i[1]],1===s.length&&(s[1]=s[0]),t.each(["left","top"],function(t,e){+s[t]===s[t]&&(n[t]=s[t],s[t]=e)}),i={my:s[0]+(0>n[0]?n[0]:"+"+n[0])+" "+s[1]+(0>n[1]?n[1]:"+"+n[1]),at:s.join(" ")}),i=t.extend({},t.ui.dialog.prototype.options.position,i)):i=t.ui.dialog.prototype.options.position,e=this.uiDialog.is(":visible"),e||this.uiDialog.show(),this.uiDialog.position(i),e||this.uiDialog.hide()}})}(jQuery),function(t){var e=/up|down|vertical/,i=/up|left|vertical|horizontal/;t.effects.effect.blind=function(s,n){var o,a,r,h=t(this),l=["position","top","bottom","left","right","height","width"],c=t.effects.setMode(h,s.mode||"hide"),u=s.direction||"up",d=e.test(u),p=d?"height":"width",f=d?"top":"left",g=i.test(u),m={},v="show"===c;h.parent().is(".ui-effects-wrapper")?t.effects.save(h.parent(),l):t.effects.save(h,l),h.show(),o=t.effects.createWrapper(h).css({overflow:"hidden"}),a=o[p](),r=parseFloat(o.css(f))||0,m[p]=v?a:0,g||(h.css(d?"bottom":"right",0).css(d?"top":"left","auto").css({position:"absolute"}),m[f]=v?r:a+r),v&&(o.css(p,0),g||o.css(f,r+a)),o.animate(m,{duration:s.duration,easing:s.easing,queue:!1,complete:function(){"hide"===c&&h.hide(),t.effects.restore(h,l),t.effects.removeWrapper(h),n()}})}}(jQuery),function(t){t.effects.effect.bounce=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"effect"),l="hide"===h,c="show"===h,u=e.direction||"up",d=e.distance,p=e.times||5,f=2*p+(c||l?1:0),g=e.duration/f,m=e.easing,v="up"===u||"down"===u?"top":"left",_="up"===u||"left"===u,b=a.queue(),y=b.length;for((c||l)&&r.push("opacity"),t.effects.save(a,r),a.show(),t.effects.createWrapper(a),d||(d=a["top"===v?"outerHeight":"outerWidth"]()/3),c&&(o={opacity:1},o[v]=0,a.css("opacity",0).css(v,_?2*-d:2*d).animate(o,g,m)),l&&(d/=Math.pow(2,p-1)),o={},o[v]=0,s=0;p>s;s++)n={},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m).animate(o,g,m),d=l?2*d:d/2;l&&(n={opacity:0},n[v]=(_?"-=":"+=")+d,a.animate(n,g,m)),a.queue(function(){l&&a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}),y>1&&b.splice.apply(b,[1,0].concat(b.splice(y,f+1))),a.dequeue()}}(jQuery),function(t){t.effects.effect.clip=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","height","width"],h=t.effects.setMode(a,e.mode||"hide"),l="show"===h,c=e.direction||"vertical",u="vertical"===c,d=u?"height":"width",p=u?"top":"left",f={};t.effects.save(a,r),a.show(),s=t.effects.createWrapper(a).css({overflow:"hidden"}),n="IMG"===a[0].tagName?s:a,o=n[d](),l&&(n.css(d,0),n.css(p,o/2)),f[d]=l?o:0,f[p]=l?0:o/2,n.animate(f,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){l||a.hide(),t.effects.restore(a,r),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.drop=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","opacity","height","width"],a=t.effects.setMode(n,e.mode||"hide"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h?"pos":"neg",u={opacity:r?1:0};t.effects.save(n,o),n.show(),t.effects.createWrapper(n),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===c?-s:s),u[l]=(r?"pos"===c?"+=":"-=":"pos"===c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.explode=function(e,i){function s(){b.push(this),b.length===u*d&&n()}function n(){p.css({visibility:"visible"}),t(b).remove(),g||p.hide(),i()}var o,a,r,h,l,c,u=e.pieces?Math.round(Math.sqrt(e.pieces)):3,d=u,p=t(this),f=t.effects.setMode(p,e.mode||"hide"),g="show"===f,m=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/d),_=Math.ceil(p.outerHeight()/u),b=[];for(o=0;u>o;o++)for(h=m.top+o*_,c=o-(u-1)/2,a=0;d>a;a++)r=m.left+a*v,l=a-(d-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-a*v,top:-o*_}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:_,left:r+(g?l*v:0),top:h+(g?c*_:0),opacity:g?0:1}).animate({left:r+(g?0:l*v),top:h+(g?0:c*_),opacity:g?1:0},e.duration||500,e.easing,s)}}(jQuery),function(t){t.effects.effect.fade=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:e.duration,easing:e.easing,complete:i})}}(jQuery),function(t){t.effects.effect.fold=function(e,i){var s,n,o=t(this),a=["position","top","bottom","left","right","height","width"],r=t.effects.setMode(o,e.mode||"hide"),h="show"===r,l="hide"===r,c=e.size||15,u=/([0-9]+)%/.exec(c),d=!!e.horizFirst,p=h!==d,f=p?["width","height"]:["height","width"],g=e.duration/2,m={},v={};t.effects.save(o,a),o.show(),s=t.effects.createWrapper(o).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],u&&(c=parseInt(u[1],10)/100*n[l?0:1]),h&&s.css(d?{height:0,width:c}:{height:c,width:0}),m[f[0]]=h?n[0]:c,v[f[1]]=h?n[1]:0,s.animate(m,g,e.easing).animate(v,g,e.easing,function(){l&&o.hide(),t.effects.restore(o,a),t.effects.removeWrapper(o),i()})}}(jQuery),function(t){t.effects.effect.highlight=function(e,i){var s=t(this),n=["backgroundImage","backgroundColor","opacity"],o=t.effects.setMode(s,e.mode||"show"),a={backgroundColor:s.css("backgroundColor")};"hide"===o&&(a.opacity=0),t.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:e.color||"#ffff99"}).animate(a,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===o&&s.hide(),t.effects.restore(s,n),i()}})}}(jQuery),function(t){t.effects.effect.pulsate=function(e,i){var s,n=t(this),o=t.effects.setMode(n,e.mode||"show"),a="show"===o,r="hide"===o,h=a||"hide"===o,l=2*(e.times||5)+(h?1:0),c=e.duration/l,u=0,d=n.queue(),p=d.length;for((a||!n.is(":visible"))&&(n.css("opacity",0).show(),u=1),s=1;l>s;s++)n.animate({opacity:u},c,e.easing),u=1-u;n.animate({opacity:u},c,e.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&d.splice.apply(d,[1,0].concat(d.splice(p,l+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.puff=function(e,i){var s=t(this),n=t.effects.setMode(s,e.mode||"hide"),o="hide"===n,a=parseInt(e.percent,10)||150,r=a/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};t.extend(e,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:o?a:100,from:o?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(e)},t.effects.effect.scale=function(e,i){var s=t(this),n=t.extend(!0,{},e),o=t.effects.setMode(s,e.mode||"effect"),a=parseInt(e.percent,10)||(0===parseInt(e.percent,10)?0:"hide"===o?0:100),r=e.direction||"both",h=e.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},c={y:"horizontal"!==r?a/100:1,x:"vertical"!==r?a/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==o&&(n.origin=h||["middle","center"],n.restore=!0),n.from=e.from||("show"===o?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*c.y,width:l.width*c.x,outerHeight:l.outerHeight*c.y,outerWidth:l.outerWidth*c.x},n.fade&&("show"===o&&(n.from.opacity=0,n.to.opacity=1),"hide"===o&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},t.effects.effect.size=function(e,i){var s,n,o,a=t(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],c=["fontSize"],u=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],d=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=t.effects.setMode(a,e.mode||"effect"),f=e.restore||"effect"!==p,g=e.scale||"both",m=e.origin||["middle","center"],v=a.css("position"),_=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&a.show(),s={height:a.height(),width:a.width(),outerHeight:a.outerHeight(),outerWidth:a.outerWidth()},"toggle"===e.mode&&"show"===p?(a.from=e.to||b,a.to=e.from||s):(a.from=e.from||("show"===p?b:s),a.to=e.to||("hide"===p?b:s)),o={from:{y:a.from.height/s.height,x:a.from.width/s.width},to:{y:a.to.height/s.height,x:a.to.width/s.width}},("box"===g||"both"===g)&&(o.from.y!==o.to.y&&(_=_.concat(u),a.from=t.effects.setTransition(a,u,o.from.y,a.from),a.to=t.effects.setTransition(a,u,o.to.y,a.to)),o.from.x!==o.to.x&&(_=_.concat(d),a.from=t.effects.setTransition(a,d,o.from.x,a.from),a.to=t.effects.setTransition(a,d,o.to.x,a.to))),("content"===g||"both"===g)&&o.from.y!==o.to.y&&(_=_.concat(c).concat(l),a.from=t.effects.setTransition(a,c,o.from.y,a.from),a.to=t.effects.setTransition(a,c,o.to.y,a.to)),t.effects.save(a,_),a.show(),t.effects.createWrapper(a),a.css("overflow","hidden").css(a.from),m&&(n=t.effects.getBaseline(m,s),a.from.top=(s.outerHeight-a.outerHeight())*n.y,a.from.left=(s.outerWidth-a.outerWidth())*n.x,a.to.top=(s.outerHeight-a.to.outerHeight)*n.y,a.to.left=(s.outerWidth-a.to.outerWidth)*n.x),a.css(a.from),("content"===g||"both"===g)&&(u=u.concat(["marginTop","marginBottom"]).concat(c),d=d.concat(["marginLeft","marginRight"]),l=r.concat(u).concat(d),a.find("*[width]").each(function(){var i=t(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&t.effects.save(i,l),i.from={height:s.height*o.from.y,width:s.width*o.from.x,outerHeight:s.outerHeight*o.from.y,outerWidth:s.outerWidth*o.from.x},i.to={height:s.height*o.to.y,width:s.width*o.to.x,outerHeight:s.height*o.to.y,outerWidth:s.width*o.to.x},o.from.y!==o.to.y&&(i.from=t.effects.setTransition(i,u,o.from.y,i.from),i.to=t.effects.setTransition(i,u,o.to.y,i.to)),o.from.x!==o.to.x&&(i.from=t.effects.setTransition(i,d,o.from.x,i.from),i.to=t.effects.setTransition(i,d,o.to.x,i.to)),i.css(i.from),i.animate(i.to,e.duration,e.easing,function(){f&&t.effects.restore(i,l)})})),a.animate(a.to,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){0===a.to.opacity&&a.css("opacity",a.from.opacity),"hide"===p&&a.hide(),t.effects.restore(a,_),f||("static"===v?a.css({position:"relative",top:a.to.top,left:a.to.left}):t.each(["top","left"],function(t,e){a.css(e,function(e,i){var s=parseInt(i,10),n=t?a.to.left:a.to.top;return"auto"===i?n+"px":s+n+"px"})})),t.effects.removeWrapper(a),i()}})}}(jQuery),function(t){t.effects.effect.shake=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","height","width"],a=t.effects.setMode(n,e.mode||"effect"),r=e.direction||"left",h=e.distance||20,l=e.times||3,c=2*l+1,u=Math.round(e.duration/c),d="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},g={},m={},v=n.queue(),_=v.length;for(t.effects.save(n,o),n.show(),t.effects.createWrapper(n),f[d]=(p?"-=":"+=")+h,g[d]=(p?"+=":"-=")+2*h,m[d]=(p?"-=":"+=")+2*h,n.animate(f,u,e.easing),s=1;l>s;s++)n.animate(g,u,e.easing).animate(m,u,e.easing);n.animate(g,u,e.easing).animate(f,u/2,e.easing).queue(function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}),_>1&&v.splice.apply(v,[1,0].concat(v.splice(_,c+1))),n.dequeue()}}(jQuery),function(t){t.effects.effect.slide=function(e,i){var s,n=t(this),o=["position","top","bottom","left","right","width","height"],a=t.effects.setMode(n,e.mode||"show"),r="show"===a,h=e.direction||"left",l="up"===h||"down"===h?"top":"left",c="up"===h||"left"===h,u={};t.effects.save(n,o),n.show(),s=e.distance||n["top"===l?"outerHeight":"outerWidth"](!0),t.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,c?isNaN(s)?"-"+s:-s:s),u[l]=(r?c?"+=":"-=":c?"-=":"+=")+s,n.animate(u,{queue:!1,duration:e.duration,easing:e.easing,complete:function(){"hide"===a&&n.hide(),t.effects.restore(n,o),t.effects.removeWrapper(n),i()}})}}(jQuery),function(t){t.effects.effect.transfer=function(e,i){var s=t(this),n=t(e.to),o="fixed"===n.css("position"),a=t("body"),r=o?a.scrollTop():0,h=o?a.scrollLeft():0,l=n.offset(),c={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},u=s.offset(),d=t("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(e.className).css({top:u.top-r,left:u.left-h,height:s.innerHeight(),width:s.innerWidth(),position:o?"fixed":"absolute"}).animate(c,e.duration,e.easing,function(){d.remove(),i()})}}(jQuery),function(t){t.widget("ui.menu",{version:"1.10.3",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,t.proxy(function(t){this.options.disabled&&t.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(t){t.preventDefault()},"click .ui-state-disabled > a":function(t){t.preventDefault()},"click .ui-menu-item:has(a)":function(e){var i=t(e.target).closest(".ui-menu-item");!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.mouseHandled=!0,this.select(e),i.has(".ui-menu").length?this.expand(e):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){var i=t(e.currentTarget);i.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(e,i)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.children(".ui-menu-item").eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){t.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){t(e.target).closest(".ui-menu").length||this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var e=t(this);e.data("ui-menu-submenu-carat")&&e.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(e){function i(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var s,n,o,a,r,h=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:h=!1,n=this.previousFilter||"",o=String.fromCharCode(e.keyCode),a=!1,clearTimeout(this.filterTimer),o===n?a=!0:o=n+o,r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())}),s=a&&-1!==s.index(this.active.next())?this.active.nextAll(".ui-menu-item"):s,s.length||(o=String.fromCharCode(e.keyCode),r=RegExp("^"+i(o),"i"),s=this.activeMenu.children(".ui-menu-item").filter(function(){return r.test(t(this).children("a").text())})),s.length?(this.focus(e,s),s.length>1?(this.previousFilter=o,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}h&&e.preventDefault()},_activate:function(t){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i=this.options.icons.submenu,s=this.element.find(this.options.menus);s.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),s=e.prev("a"),n=t("<span>").addClass("ui-menu-icon ui-icon "+i).data("ui-menu-submenu-carat",!0);s.attr("aria-haspopup","true").prepend(n),e.attr("aria-labelledby",s.attr("id"))}),e=s.add(this.element),e.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),e.children(":not(.ui-menu-item)").each(function(){var e=t(this);/[^\-\u2014\u2013\s]/.test(e.text())||e.addClass("ui-widget-content ui-menu-divider")}),e.children(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){"icons"===t&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(e.submenu),this._super(t,e)},focus:function(t,e){var i,s;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.height(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",t,{item:this.active}))},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.children(".ui-menu-item")[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())),undefined):(this.next(e),undefined)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.children(".ui-menu-item").first())),undefined):(this.next(e),undefined)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(e){this.active=this.active||t(e.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(e,!0),this._trigger("select",e,i)}})}(jQuery),function(t,e){function i(t,e,i){return[parseFloat(t[0])*(p.test(t[0])?e/100:1),parseFloat(t[1])*(p.test(t[1])?i/100:1)]}function s(e,i){return parseInt(t.css(e,i),10)||0}function n(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}t.ui=t.ui||{};var o,a=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,c=/top|center|bottom/,u=/[\+\-]\d+(\.[\d]+)?%?/,d=/^\w+/,p=/%$/,f=t.fn.position;t.position={scrollbarWidth:function(){if(o!==e)return o;var i,s,n=t("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=n.children()[0];return t("body").append(n),i=a.offsetWidth,n.css("overflow","scroll"),s=a.offsetWidth,i===s&&(s=n[0].clientWidth),n.remove(),o=i-s},getScrollInfo:function(e){var i=e.isWindow?"":e.element.css("overflow-x"),s=e.isWindow?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]);return{element:i,isWindow:s,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s?i.width():i.outerWidth(),height:s?i.height():i.outerHeight()}}},t.fn.position=function(e){if(!e||!e.of)return f.apply(this,arguments);e=t.extend({},e);var o,p,g,m,v,_,b=t(e.of),y=t.position.getWithinInfo(e.within),w=t.position.getScrollInfo(y),k=(e.collision||"flip").split(" "),x={};return _=n(b),b[0].preventDefault&&(e.at="left top"),p=_.width,g=_.height,m=_.offset,v=t.extend({},m),t.each(["my","at"],function(){var t,i,s=(e[this]||"").split(" ");1===s.length&&(s=l.test(s[0])?s.concat(["center"]):c.test(s[0])?["center"].concat(s):["center","center"]),s[0]=l.test(s[0])?s[0]:"center",s[1]=c.test(s[1])?s[1]:"center",t=u.exec(s[0]),i=u.exec(s[1]),x[this]=[t?t[0]:0,i?i[0]:0],e[this]=[d.exec(s[0])[0],d.exec(s[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===e.at[0]?v.left+=p:"center"===e.at[0]&&(v.left+=p/2),"bottom"===e.at[1]?v.top+=g:"center"===e.at[1]&&(v.top+=g/2),o=i(x.at,p,g),v.left+=o[0],v.top+=o[1],this.each(function(){var n,l,c=t(this),u=c.outerWidth(),d=c.outerHeight(),f=s(this,"marginLeft"),_=s(this,"marginTop"),D=u+f+s(this,"marginRight")+w.width,C=d+_+s(this,"marginBottom")+w.height,I=t.extend({},v),P=i(x.my,c.outerWidth(),c.outerHeight());"right"===e.my[0]?I.left-=u:"center"===e.my[0]&&(I.left-=u/2),"bottom"===e.my[1]?I.top-=d:"center"===e.my[1]&&(I.top-=d/2),I.left+=P[0],I.top+=P[1],t.support.offsetFractions||(I.left=h(I.left),I.top=h(I.top)),n={marginLeft:f,marginTop:_},t.each(["left","top"],function(i,s){t.ui.position[k[i]]&&t.ui.position[k[i]][s](I,{targetWidth:p,targetHeight:g,elemWidth:u,elemHeight:d,collisionPosition:n,collisionWidth:D,collisionHeight:C,offset:[o[0]+P[0],o[1]+P[1]],my:e.my,at:e.at,within:y,elem:c})}),e.using&&(l=function(t){var i=m.left-I.left,s=i+p-u,n=m.top-I.top,o=n+g-d,h={target:{element:b,left:m.left,top:m.top,width:p,height:g},element:{element:c,left:I.left,top:I.top,width:u,height:d},horizontal:0>s?"left":i>0?"right":"center",vertical:0>o?"top":n>0?"bottom":"middle"};u>p&&p>r(i+s)&&(h.horizontal="center"),d>g&&g>r(n+o)&&(h.vertical="middle"),h.important=a(r(i),r(s))>a(r(n),r(o))?"horizontal":"vertical",e.using.call(this,t,h)}),c.offset(t.extend(I,{using:l}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,o=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-o-n;e.collisionWidth>o?h>0&&0>=l?(i=t.left+h+e.collisionWidth-o-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+o-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=a(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,o=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-o-n;e.collisionHeight>o?h>0&&0>=l?(i=t.top+h+e.collisionHeight-o-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+o-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=a(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,a=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-a-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-a-o,(0>i||r(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>r(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,a=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-a-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-a-o,t.top+p+f+g>c&&(0>s||r(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-h,t.top+p+f+g>u&&(i>0||u>r(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}},function(){var e,i,s,n,o,a=document.getElementsByTagName("body")[0],r=document.createElement("div");e=document.createElement(a?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},a&&t.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)e.style[o]=s[o];e.appendChild(r),i=a||document.documentElement,i.insertBefore(e,i.firstChild),r.style.cssText="position: absolute; left: 10.7432222px;",n=t(r).offset().left,t.support.offsetFractions=n>10&&11>n,e.innerHTML="",i.removeChild(e)}()}(jQuery),function(t,e){t.widget("ui.progressbar",{version:"1.10.3",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=t("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()
-},value:function(t){return t===e?this.options.value:(this.options.value=this._constrainedValue(t),this._refreshValue(),e)},_constrainedValue:function(t){return t===e&&(t=this.options.value),this.indeterminate=t===!1,"number"!=typeof t&&(t=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,t))},_setOptions:function(t){var e=t.value;delete t.value,this._super(t),this.options.value=this._constrainedValue(e),this._refreshValue()},_setOption:function(t,e){"max"===t&&(e=Math.max(this.min,e)),this._super(t,e)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var e=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=t("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":e}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),e===this.options.max&&this._trigger("complete")}})}(jQuery),function(t){var e=5;t.widget("ui.slider",t.ui.mouse,{version:"1.10.3",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var e,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),o="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",a=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),e=n.length;i>e;e++)a.push(o);this.handles=n.add(t(a.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(e){t(this).data("ui-slider-handle-index",e)})},_createRange:function(){var e=this.options,i="";e.range?(e.range===!0&&(e.values?e.values.length&&2!==e.values.length?e.values=[e.values[0],e.values[0]]:t.isArray(e.values)&&(e.values=e.values.slice(0)):e.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=t("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===e.range||"max"===e.range?" ui-slider-range-"+e.range:""))):this.range=t([])},_setupEvents:function(){var t=this.handles.add(this.range).filter("a");this._off(t),this._on(t,this._handleEvents),this._hoverable(t),this._focusable(t)},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(e){var i,s,n,o,a,r,h,l,c=this,u=this.options;return u.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:e.pageX,y:e.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(e){var i=Math.abs(s-c.values(e));(n>i||n===i&&(e===c._lastChangedValue||c.values(e)===u.min))&&(n=i,o=t(this),a=e)}),r=this._start(e,a),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=a,o.addClass("ui-state-active").focus(),h=o.offset(),l=!t(e.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:e.pageX-h.left-o.width()/2,top:e.pageY-h.top-o.height()/2-(parseInt(o.css("borderTopWidth"),10)||0)-(parseInt(o.css("borderBottomWidth"),10)||0)+(parseInt(o.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(e,a,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(t){var e={x:t.pageX,y:t.pageY},i=this._normValueFromMouse(e);return this._slide(t,this._handleIndex,i),!1},_mouseStop:function(t){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(t,this._handleIndex),this._change(t,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(t){var e,i,s,n,o;return"horizontal"===this.orientation?(e=this.elementSize.width,i=t.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(e=this.elementSize.height,i=t.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/e,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),o=this._valueMin()+s*n,this._trimAlignValue(o)},_start:function(t,e){var i={handle:this.handles[e],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("start",t,i)},_slide:function(t,e,i){var s,n,o;this.options.values&&this.options.values.length?(s=this.values(e?0:1),2===this.options.values.length&&this.options.range===!0&&(0===e&&i>s||1===e&&s>i)&&(i=s),i!==this.values(e)&&(n=this.values(),n[e]=i,o=this._trigger("slide",t,{handle:this.handles[e],value:i,values:n}),s=this.values(e?0:1),o!==!1&&this.values(e,i,!0))):i!==this.value()&&(o=this._trigger("slide",t,{handle:this.handles[e],value:i}),o!==!1&&this.value(i))},_stop:function(t,e){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._trigger("stop",t,i)},_change:function(t,e){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[e],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(e),i.values=this.values()),this._lastChangedValue=e,this._trigger("change",t,i)}},value:function(t){return arguments.length?(this.options.value=this._trimAlignValue(t),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(e,i){var s,n,o;if(arguments.length>1)return this.options.values[e]=this._trimAlignValue(i),this._refreshValue(),this._change(null,e),undefined;if(!arguments.length)return this._values();if(!t.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(e):this.value();for(s=this.options.values,n=arguments[0],o=0;s.length>o;o+=1)s[o]=this._trimAlignValue(n[o]),this._change(null,o);this._refreshValue()},_setOption:function(e,i){var s,n=0;switch("range"===e&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),t.isArray(this.options.values)&&(n=this.options.values.length),t.Widget.prototype._setOption.apply(this,arguments),e){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var t=this.options.value;return t=this._trimAlignValue(t)},_values:function(t){var e,i,s;if(arguments.length)return e=this.options.values[t],e=this._trimAlignValue(e);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(t){if(this._valueMin()>=t)return this._valueMin();if(t>=this._valueMax())return this._valueMax();var e=this.options.step>0?this.options.step:1,i=(t-this._valueMin())%e,s=t-i;return 2*Math.abs(i)>=e&&(s+=i>0?e:-e),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var e,i,s,n,o,a=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,c={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),c["horizontal"===h.orientation?"left":"bottom"]=i+"%",t(this).stop(1,1)[l?"animate":"css"](c,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-e+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-e+"%"},{queue:!1,duration:r.animate}))),e=i}):(s=this.value(),n=this._valueMin(),o=this._valueMax(),i=o!==n?100*((s-n)/(o-n)):0,c["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](c,r.animate),"min"===a&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===a&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===a&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===a&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(i){var s,n,o,a,r=t(i.target).data("ui-slider-handle-index");switch(i.keyCode){case t.ui.keyCode.HOME:case t.ui.keyCode.END:case t.ui.keyCode.PAGE_UP:case t.ui.keyCode.PAGE_DOWN:case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,t(i.target).addClass("ui-state-active"),s=this._start(i,r),s===!1))return}switch(a=this.options.step,n=o=this.options.values&&this.options.values.length?this.values(r):this.value(),i.keyCode){case t.ui.keyCode.HOME:o=this._valueMin();break;case t.ui.keyCode.END:o=this._valueMax();break;case t.ui.keyCode.PAGE_UP:o=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.PAGE_DOWN:o=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/e);break;case t.ui.keyCode.UP:case t.ui.keyCode.RIGHT:if(n===this._valueMax())return;o=this._trimAlignValue(n+a);break;case t.ui.keyCode.DOWN:case t.ui.keyCode.LEFT:if(n===this._valueMin())return;o=this._trimAlignValue(n-a)}this._slide(i,r,o)},click:function(t){t.preventDefault()},keyup:function(e){var i=t(e.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(e,i),this._change(e,i),t(e.target).removeClass("ui-state-active"))}}})}(jQuery),function(t){function e(t){return function(){var e=this.element.val();t.apply(this,arguments),this._refresh(),e!==this.element.val()&&this._trigger("change")}}t.widget("ui.spinner",{version:"1.10.3",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var e={},i=this.element;return t.each(["min","max","step"],function(t,s){var n=i.attr(s);void 0!==n&&n.length&&(e[s]=n)}),e},_events:{keydown:function(t){this._start(t)&&this._keydown(t)&&t.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",t),void 0)},mousewheel:function(t,e){if(e){if(!this.spinning&&!this._start(t))return!1;this._spin((e>0?1:-1)*this.options.step,t),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(t)},100),t.preventDefault()}},"mousedown .ui-spinner-button":function(e){function i(){var t=this.element[0]===this.document[0].activeElement;t||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),e.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(e)!==!1&&this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(e){return t(e.currentTarget).hasClass("ui-state-active")?this._start(e)===!1?!1:(this._repeat(null,t(e.currentTarget).hasClass("ui-spinner-up")?1:-1,e),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var t=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=t.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*t.height())&&t.height()>0&&t.height(t.height()),this.options.disabled&&this.disable()},_keydown:function(e){var i=this.options,s=t.ui.keyCode;switch(e.keyCode){case s.UP:return this._repeat(null,1,e),!0;case s.DOWN:return this._repeat(null,-1,e),!0;case s.PAGE_UP:return this._repeat(null,i.page,e),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,e),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>▲</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>▼</span>"+"</a>"},_start:function(t){return this.spinning||this._trigger("start",t)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(t,e,i){t=t||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,e,i)},t),this._spin(e*this.options.step,i)},_spin:function(t,e){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+t*this._increment(this.counter)),this.spinning&&this._trigger("spin",e,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(e){var i=this.options.incremental;return i?t.isFunction(i)?i(e):Math.floor(e*e*e/5e4-e*e/500+17*e/200+1):1},_precision:function(){var t=this._precisionOf(this.options.step);return null!==this.options.min&&(t=Math.max(t,this._precisionOf(this.options.min))),t},_precisionOf:function(t){var e=""+t,i=e.indexOf(".");return-1===i?0:e.length-i-1},_adjustValue:function(t){var e,i,s=this.options;return e=null!==s.min?s.min:0,i=t-e,i=Math.round(i/s.step)*s.step,t=e+i,t=parseFloat(t.toFixed(this._precision())),null!==s.max&&t>s.max?s.max:null!==s.min&&s.min>t?s.min:t},_stop:function(t){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",t))},_setOption:function(t,e){if("culture"===t||"numberFormat"===t){var i=this._parse(this.element.val());return this.options[t]=e,this.element.val(this._format(i)),void 0}("max"===t||"min"===t||"step"===t)&&"string"==typeof e&&(e=this._parse(e)),"icons"===t&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(e.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(e.down)),this._super(t,e),"disabled"===t&&(e?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:e(function(t){this._super(t),this._value(this.element.val())}),_parse:function(t){return"string"==typeof t&&""!==t&&(t=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(t,10,this.options.culture):+t),""===t||isNaN(t)?null:t},_format:function(t){return""===t?"":window.Globalize&&this.options.numberFormat?Globalize.format(t,this.options.numberFormat,this.options.culture):t},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(t,e){var i;""!==t&&(i=this._parse(t),null!==i&&(e||(i=this._adjustValue(i)),t=this._format(i))),this.element.val(t),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:e(function(t){this._stepUp(t)}),_stepUp:function(t){this._start()&&(this._spin((t||1)*this.options.step),this._stop())},stepDown:e(function(t){this._stepDown(t)}),_stepDown:function(t){this._start()&&(this._spin((t||1)*-this.options.step),this._stop())},pageUp:e(function(t){this._stepUp((t||1)*this.options.page)}),pageDown:e(function(t){this._stepDown((t||1)*this.options.page)}),value:function(t){return arguments.length?(e(this._value).call(this,t),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}})}(jQuery),function(t,e){function i(){return++n}function s(t){return t.hash.length>1&&decodeURIComponent(t.href.replace(o,""))===decodeURIComponent(location.href.replace(o,""))}var n=0,o=/#.*$/;t.widget("ui.tabs",{version:"1.10.3",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var e=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(e){t(this).is(".ui-state-disabled")&&e.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){t(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs(),i.active=this._initialActive(),t.isArray(i.disabled)&&(i.disabled=t.unique(i.disabled.concat(t.map(this.tabs.filter(".ui-state-disabled"),function(t){return e.tabs.index(t)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):t(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var i=this.options.active,s=this.options.collapsible,n=location.hash.substring(1);return null===i&&(n&&this.tabs.each(function(s,o){return t(o).attr("aria-controls")===n?(i=s,!1):e}),null===i&&(i=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===i||-1===i)&&(i=this.tabs.length?0:!1)),i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),-1===i&&(i=s?!1:0)),!s&&i===!1&&this.anchors.length&&(i=0),i},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):t()}},_tabKeydown:function(i){var s=t(this.document[0].activeElement).closest("li"),n=this.tabs.index(s),o=!0;if(!this._handlePageNav(i)){switch(i.keyCode){case t.ui.keyCode.RIGHT:case t.ui.keyCode.DOWN:n++;break;case t.ui.keyCode.UP:case t.ui.keyCode.LEFT:o=!1,n--;break;case t.ui.keyCode.END:n=this.anchors.length-1;break;case t.ui.keyCode.HOME:n=0;break;case t.ui.keyCode.SPACE:return i.preventDefault(),clearTimeout(this.activating),this._activate(n),e;case t.ui.keyCode.ENTER:return i.preventDefault(),clearTimeout(this.activating),this._activate(n===this.options.active?!1:n),e;default:return}i.preventDefault(),clearTimeout(this.activating),n=this._focusNextTab(n,o),i.ctrlKey||(s.attr("aria-selected","false"),this.tabs.eq(n).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",n)},this.delay))}},_panelKeydown:function(e){this._handlePageNav(e)||e.ctrlKey&&e.keyCode===t.ui.keyCode.UP&&(e.preventDefault(),this.active.focus())},_handlePageNav:function(i){return i.altKey&&i.keyCode===t.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):i.altKey&&i.keyCode===t.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):e},_findNextTab:function(e,i){function s(){return e>n&&(e=0),0>e&&(e=n),e}for(var n=this.tabs.length-1;-1!==t.inArray(s(),this.options.disabled);)e=i?e+1:e-1;return e},_focusNextTab:function(t,e){return t=this._findNextTab(t,e),this.tabs.eq(t).focus(),t},_setOption:function(t,i){return"active"===t?(this._activate(i),e):"disabled"===t?(this._setupDisabled(i),e):(this._super(t,i),"collapsible"===t&&(this.element.toggleClass("ui-tabs-collapsible",i),i||this.options.active!==!1||this._activate(0)),"event"===t&&this._setupEvents(i),"heightStyle"===t&&this._setupHeightStyle(i),e)},_tabId:function(t){return t.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(t){return t?t.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var e=this.options,i=this.tablist.children(":has(a[href])");e.disabled=t.map(i.filter(".ui-state-disabled"),function(t){return i.index(t)}),this._processTabs(),e.active!==!1&&this.anchors.length?this.active.length&&!t.contains(this.tablist[0],this.active[0])?this.tabs.length===e.disabled.length?(e.active=!1,this.active=t()):this._activate(this._findNextTab(Math.max(0,e.active-1),!1)):e.active=this.tabs.index(this.active):(e.active=!1,this.active=t()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var e=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return t("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=t(),this.anchors.each(function(i,n){var o,a,r,h=t(n).uniqueId().attr("id"),l=t(n).closest("li"),c=l.attr("aria-controls");s(n)?(o=n.hash,a=e.element.find(e._sanitizeSelector(o))):(r=e._tabId(l),o="#"+r,a=e.element.find(o),a.length||(a=e._createPanel(r),a.insertAfter(e.panels[i-1]||e.tablist)),a.attr("aria-live","polite")),a.length&&(e.panels=e.panels.add(a)),c&&l.data("ui-tabs-aria-controls",c),l.attr({"aria-controls":o.substring(1),"aria-labelledby":h}),a.attr("aria-labelledby",h)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(e){return t("<div>").attr("id",e).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(e){t.isArray(e)&&(e.length?e.length===this.anchors.length&&(e=!0):e=!1);for(var i,s=0;i=this.tabs[s];s++)e===!0||-1!==t.inArray(s,e)?t(i).addClass("ui-state-disabled").attr("aria-disabled","true"):t(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=e},_setupEvents:function(e){var i={click:function(t){t.preventDefault()}};e&&t.each(e.split(" "),function(t,e){i[e]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(e){var i,s=this.element.parent();"fill"===e?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var e=t(this),s=e.css("position");"absolute"!==s&&"fixed"!==s&&(i-=e.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=t(this).outerHeight(!0)}),this.panels.each(function(){t(this).height(Math.max(0,i-t(this).innerHeight()+t(this).height()))}).css("overflow","auto")):"auto"===e&&(i=0,this.panels.each(function(){i=Math.max(i,t(this).height("").height())}).height(i))},_eventHandler:function(e){var i=this.options,s=this.active,n=t(e.currentTarget),o=n.closest("li"),a=o[0]===s[0],r=a&&i.collapsible,h=r?t():this._getPanelForTab(o),l=s.length?this._getPanelForTab(s):t(),c={oldTab:s,oldPanel:l,newTab:r?t():o,newPanel:h};e.preventDefault(),o.hasClass("ui-state-disabled")||o.hasClass("ui-tabs-loading")||this.running||a&&!i.collapsible||this._trigger("beforeActivate",e,c)===!1||(i.active=r?!1:this.tabs.index(o),this.active=a?t():o,this.xhr&&this.xhr.abort(),l.length||h.length||t.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(o),e),this._toggle(e,c))},_toggle:function(e,i){function s(){o.running=!1,o._trigger("activate",e,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),a.length&&o.options.show?o._show(a,o.options.show,s):(a.show(),s())}var o=this,a=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr({"aria-expanded":"false","aria-hidden":"true"}),i.oldTab.attr("aria-selected","false"),a.length&&r.length?i.oldTab.attr("tabIndex",-1):a.length&&this.tabs.filter(function(){return 0===t(this).attr("tabIndex")}).attr("tabIndex",-1),a.attr({"aria-expanded":"true","aria-hidden":"false"}),i.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(e){var i,s=this._findActive(e);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:t.noop}))},_findActive:function(e){return e===!1?t():this.tabs.eq(e)},_getIndex:function(t){return"string"==typeof t&&(t=this.anchors.index(this.anchors.filter("[href$='"+t+"']"))),t},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tabs.add(this.panels).each(function(){t.data(this,"ui-tabs-destroy")?t(this).remove():t(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var e=t(this),i=e.data("ui-tabs-aria-controls");i?e.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):e.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(i){var s=this.options.disabled;s!==!1&&(i===e?s=!1:(i=this._getIndex(i),s=t.isArray(s)?t.map(s,function(t){return t!==i?t:null}):t.map(this.tabs,function(t,e){return e!==i?e:null})),this._setupDisabled(s))},disable:function(i){var s=this.options.disabled;if(s!==!0){if(i===e)s=!0;else{if(i=this._getIndex(i),-1!==t.inArray(i,s))return;s=t.isArray(s)?t.merge([i],s).sort():[i]}this._setupDisabled(s)}},load:function(e,i){e=this._getIndex(e);var n=this,o=this.tabs.eq(e),a=o.find(".ui-tabs-anchor"),r=this._getPanelForTab(o),h={tab:o,panel:r};s(a[0])||(this.xhr=t.ajax(this._ajaxSettings(a,i,h)),this.xhr&&"canceled"!==this.xhr.statusText&&(o.addClass("ui-tabs-loading"),r.attr("aria-busy","true"),this.xhr.success(function(t){setTimeout(function(){r.html(t),n._trigger("load",i,h)},1)}).complete(function(t,e){setTimeout(function(){"abort"===e&&n.panels.stop(!1,!0),o.removeClass("ui-tabs-loading"),r.removeAttr("aria-busy"),t===n.xhr&&delete n.xhr},1)})))},_ajaxSettings:function(e,i,s){var n=this;return{url:e.attr("href"),beforeSend:function(e,o){return n._trigger("beforeLoad",i,t.extend({jqXHR:e,ajaxSettings:o},s))}}},_getPanelForTab:function(e){var i=t(e).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}})}(jQuery),function(t){function e(e,i){var s=(e.attr("aria-describedby")||"").split(/\s+/);s.push(i),e.data("ui-tooltip-id",i).attr("aria-describedby",t.trim(s.join(" ")))}function i(e){var i=e.data("ui-tooltip-id"),s=(e.attr("aria-describedby")||"").split(/\s+/),n=t.inArray(i,s);-1!==n&&s.splice(n,1),e.removeData("ui-tooltip-id"),s=t.trim(s.join(" ")),s?e.attr("aria-describedby",s):e.removeAttr("aria-describedby")}var s=0;t.widget("ui.tooltip",{version:"1.10.3",options:{content:function(){var e=t(this).attr("title")||"";return t("<a>").text(e).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable()},_setOption:function(e,i){var s=this;return"disabled"===e?(this[i?"_disable":"_enable"](),this.options[e]=i,void 0):(this._super(e,i),"content"===e&&t.each(this.tooltips,function(t,e){s._updateContent(e)}),void 0)},_disable:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.is("[title]")&&e.data("ui-tooltip-title",e.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var e=t(this);e.data("ui-tooltip-title")&&e.attr("title",e.data("ui-tooltip-title"))})},open:function(e){var i=this,s=t(e?e.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),e&&"mouseover"===e.type&&s.parents().each(function(){var e,s=t(this);s.data("ui-tooltip-open")&&(e=t.Event("blur"),e.target=e.currentTarget=this,i.close(e,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._updateContent(s,e))},_updateContent:function(t,e){var i,s=this.options.content,n=this,o=e?e.type:null;return"string"==typeof s?this._open(e,t,s):(i=s.call(t[0],function(i){t.data("ui-tooltip-open")&&n._delay(function(){e&&(e.type=o),this._open(e,t,i)})}),i&&this._open(e,t,i),void 0)},_open:function(i,s,n){function o(t){l.of=t,a.is(":hidden")||a.position(l)}var a,r,h,l=t.extend({},this.options.position);
-if(n){if(a=this._find(s),a.length)return a.find(".ui-tooltip-content").html(n),void 0;s.is("[title]")&&(i&&"mouseover"===i.type?s.attr("title",""):s.removeAttr("title")),a=this._tooltip(s),e(s,a.attr("id")),a.find(".ui-tooltip-content").html(n),this.options.track&&i&&/^mouse/.test(i.type)?(this._on(this.document,{mousemove:o}),o(i)):a.position(t.extend({of:s},this.options.position)),a.hide(),this._show(a,this.options.show),this.options.show&&this.options.show.delay&&(h=this.delayedShow=setInterval(function(){a.is(":visible")&&(o(l.of),clearInterval(h))},t.fx.interval)),this._trigger("open",i,{tooltip:a}),r={keyup:function(e){if(e.keyCode===t.ui.keyCode.ESCAPE){var i=t.Event(e);i.currentTarget=s[0],this.close(i,!0)}},remove:function(){this._removeTooltip(a)}},i&&"mouseover"!==i.type||(r.mouseleave="close"),i&&"focusin"!==i.type||(r.focusout="close"),this._on(!0,s,r)}},close:function(e){var s=this,n=t(e?e.currentTarget:this.element),o=this._find(n);this.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&n.attr("title",n.data("ui-tooltip-title")),i(n),o.stop(!0),this._hide(o,this.options.hide,function(){s._removeTooltip(t(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),e&&"mouseleave"===e.type&&t.each(this.parents,function(e,i){t(i.element).attr("title",i.title),delete s.parents[e]}),this.closing=!0,this._trigger("close",e,{tooltip:o}),this.closing=!1)},_tooltip:function(e){var i="ui-tooltip-"+s++,n=t("<div>").attr({id:i,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return t("<div>").addClass("ui-tooltip-content").appendTo(n),n.appendTo(this.document[0].body),this.tooltips[i]=e,n},_find:function(e){var i=e.data("ui-tooltip-id");return i?t("#"+i):t()},_removeTooltip:function(t){t.remove(),delete this.tooltips[t.attr("id")]},_destroy:function(){var e=this;t.each(this.tooltips,function(i,s){var n=t.Event("blur");n.target=n.currentTarget=s[0],e.close(n,!0),t("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))})}})}(jQuery);
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/rcolor.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,55 +0,0 @@
-// Free to use & distribute under the MIT license
-// Wes Johnson (@SterlingWes)
-//
-// inspired by http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
-
-(function (root, factory) {
- if (typeof exports === 'object') {
- module.exports = factory;
- } else if (typeof define === 'function' && define.amd) {
- define(factory);
- } else {
- root.RColor = factory();
- }
-}(this, function () {
-
- var RColor = function() {
- this.hue = Math.random(),
- this.goldenRatio = 0.618033988749895;
- };
-
- RColor.prototype.hsvToRgb = function (h,s,v) {
- var h_i = Math.floor(h*6),
- f = h*6 - h_i,
- p = v * (1-s),
- q = v * (1-f*s),
- t = v * (1-(1-f)*s),
- r = 255,
- g = 255,
- b = 255;
- switch(h_i) {
- case 0: r = v, g = t, b = p; break;
- case 1: r = q, g = v, b = p; break;
- case 2: r = p, g = v, b = t; break;
- case 3: r = p, g = q, b = v; break;
- case 4: r = t, g = p, b = v; break;
- case 5: r = v, g = p, b = q; break;
- }
- return [Math.floor(r*256),Math.floor(g*256),Math.floor(b*256)];
- };
-
- RColor.prototype.get = function(hex,saturation,value) {
- this.hue += this.goldenRatio;
- this.hue %= 1;
- if(typeof saturation !== "number") saturation = 0.5;
- if(typeof value !== "number") value = 0.95;
- var rgb = this.hsvToRgb(this.hue,saturation,value);
- if(hex)
- return "#"+rgb[0].toString(16)+rgb[1].toString(16)+rgb[2].toString(16);
- else
- return rgb;
- };
-
- return RColor;
-
-}));
\ No newline at end of file
--- a/server/renkan-web/src/main/webapp/static/lib/spectrum.js Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1767 +0,0 @@
-// Spectrum Colorpicker v1.0.9
-// https://github.com/bgrins/spectrum
-// Author: Brian Grinstead
-// License: MIT
-
-(function (window, $, undefined) {
- var defaultOpts = {
-
- // Callbacks
- beforeShow: noop,
- move: noop,
- change: noop,
- show: noop,
- hide: noop,
-
- // Options
- color: false,
- flat: false,
- showInput: false,
- showButtons: true,
- clickoutFiresChange: false,
- showInitial: false,
- showPalette: false,
- showPaletteOnly: false,
- showSelectionPalette: true,
- localStorageKey: false,
- maxSelectionSize: 7,
- cancelText: "cancel",
- chooseText: "choose",
- preferredFormat: false,
- className: "",
- showAlpha: false,
- theme: "sp-light",
- palette: ['fff', '000'],
- selectionPalette: [],
- disabled: false
- },
- spectrums = [],
- IE = !!/msie/i.exec( window.navigator.userAgent ),
- rgbaSupport = (function() {
- function contains( str, substr ) {
- return !!~('' + str).indexOf(substr);
- }
-
- var elem = document.createElement('div');
- var style = elem.style;
- style.cssText = 'background-color:rgba(0,0,0,.5)';
- return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');
- })(),
- replaceInput = [
- "<div class='sp-replacer'>",
- "<div class='sp-preview'><div class='sp-preview-inner'></div></div>",
- "<div class='sp-dd'>▼</div>",
- "</div>"
- ].join(''),
- markup = (function () {
-
- // IE does not support gradients with multiple stops, so we need to simulate
- // that for the rainbow slider with 8 divs that each have a single gradient
- var gradientFix = "";
- if (IE) {
- for (var i = 1; i <= 6; i++) {
- gradientFix += "<div class='sp-" + i + "'></div>";
- }
- }
-
- return [
- "<div class='sp-container sp-hidden'>",
- "<div class='sp-palette-container'>",
- "<div class='sp-palette sp-thumb sp-cf'></div>",
- "</div>",
- "<div class='sp-picker-container'>",
- "<div class='sp-top sp-cf'>",
- "<div class='sp-fill'></div>",
- "<div class='sp-top-inner'>",
- "<div class='sp-color'>",
- "<div class='sp-sat'>",
- "<div class='sp-val'>",
- "<div class='sp-dragger'></div>",
- "</div>",
- "</div>",
- "</div>",
- "<div class='sp-hue'>",
- "<div class='sp-slider'></div>",
- gradientFix,
- "</div>",
- "</div>",
- "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
- "</div>",
- "<div class='sp-input-container sp-cf'>",
- "<input class='sp-input' type='text' spellcheck='false' />",
- "</div>",
- "<div class='sp-initial sp-thumb sp-cf'></div>",
- "<div class='sp-button-container sp-cf'>",
- "<a class='sp-cancel' href='#'></a>",
- "<button class='sp-choose'></button>",
- "</div>",
- "</div>",
- "</div>"
- ].join("");
- })();
-
- function paletteTemplate (p, color, className) {
- var html = [];
- for (var i = 0; i < p.length; i++) {
- var tiny = tinycolor(p[i]);
- var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light";
- c += (tinycolor.equals(color, p[i])) ? " sp-thumb-active" : "";
-
- var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter();
- html.push('<span title="' + tiny.toRgbString() + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';" /></span>');
- }
- return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>";
- }
-
- function hideAll() {
- for (var i = 0; i < spectrums.length; i++) {
- if (spectrums[i]) {
- spectrums[i].hide();
- }
- }
- }
-
- function instanceOptions(o, callbackContext) {
- var opts = $.extend({}, defaultOpts, o);
- opts.callbacks = {
- 'move': bind(opts.move, callbackContext),
- 'change': bind(opts.change, callbackContext),
- 'show': bind(opts.show, callbackContext),
- 'hide': bind(opts.hide, callbackContext),
- 'beforeShow': bind(opts.beforeShow, callbackContext)
- };
-
- return opts;
- }
-
- function spectrum(element, o) {
-
- var opts = instanceOptions(o, element),
- flat = opts.flat,
- showSelectionPalette = opts.showSelectionPalette,
- localStorageKey = opts.localStorageKey,
- theme = opts.theme,
- callbacks = opts.callbacks,
- resize = throttle(reflow, 10),
- visible = false,
- dragWidth = 0,
- dragHeight = 0,
- dragHelperHeight = 0,
- slideHeight = 0,
- slideWidth = 0,
- alphaWidth = 0,
- alphaSlideHelperWidth = 0,
- slideHelperHeight = 0,
- currentHue = 0,
- currentSaturation = 0,
- currentValue = 0,
- currentAlpha = 1,
- palette = opts.palette.slice(0),
- paletteArray = $.isArray(palette[0]) ? palette : [palette],
- selectionPalette = opts.selectionPalette.slice(0),
- maxSelectionSize = opts.maxSelectionSize,
- draggingClass = "sp-dragging";
-
- var doc = element.ownerDocument,
- body = doc.body,
- boundElement = $(element),
- disabled = false,
- container = $(markup, doc).addClass(theme),
- dragger = container.find(".sp-color"),
- dragHelper = container.find(".sp-dragger"),
- slider = container.find(".sp-hue"),
- slideHelper = container.find(".sp-slider"),
- alphaSliderInner = container.find(".sp-alpha-inner"),
- alphaSlider = container.find(".sp-alpha"),
- alphaSlideHelper = container.find(".sp-alpha-handle"),
- textInput = container.find(".sp-input"),
- paletteContainer = container.find(".sp-palette"),
- initialColorContainer = container.find(".sp-initial"),
- cancelButton = container.find(".sp-cancel"),
- chooseButton = container.find(".sp-choose"),
- isInput = boundElement.is("input"),
- shouldReplace = isInput && !flat,
- replacer = (shouldReplace) ? $(replaceInput).addClass(theme) : $([]),
- offsetElement = (shouldReplace) ? replacer : boundElement,
- previewElement = replacer.find(".sp-preview-inner"),
- initialColor = opts.color || (isInput && boundElement.val()),
- colorOnShow = false,
- preferredFormat = opts.preferredFormat,
- currentPreferredFormat = preferredFormat,
- clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange;
-
-
- function applyOptions() {
-
- container.toggleClass("sp-flat", flat);
- container.toggleClass("sp-input-disabled", !opts.showInput);
- container.toggleClass("sp-alpha-enabled", opts.showAlpha);
- container.toggleClass("sp-buttons-disabled", !opts.showButtons || flat);
- container.toggleClass("sp-palette-disabled", !opts.showPalette);
- container.toggleClass("sp-palette-only", opts.showPaletteOnly);
- container.toggleClass("sp-initial-disabled", !opts.showInitial);
- container.addClass(opts.className);
-
- reflow();
- }
-
- function initialize() {
-
- if (IE) {
- container.find("*:not(input)").attr("unselectable", "on");
- }
-
- applyOptions();
-
- if (shouldReplace) {
- boundElement.hide().after(replacer);
- }
-
- if (flat) {
- boundElement.after(container).hide();
- }
- else {
- $(body).append(container);
- }
-
- if (localStorageKey && window.localStorage) {
-
- // Migrate old palettes over to new format. May want to remove this eventually.
- try {
- var oldPalette = window.localStorage[localStorageKey].split(",#");
- if (oldPalette.length > 1) {
- delete window.localStorage[localStorageKey];
- $.each(oldPalette, function(i, c) {
- addColorToSelectionPalette(c);
- });
- }
- }
- catch(e) { }
-
- try {
- selectionPalette = window.localStorage[localStorageKey].split(";");
- }
- catch (e) { }
- }
-
- offsetElement.bind("click.spectrum touchstart.spectrum", function (e) {
- if (!disabled) {
- toggle();
- }
-
- e.stopPropagation();
-
- if (!$(e.target).is("input")) {
- e.preventDefault();
- }
- });
-
- if(boundElement.is(":disabled") || (opts.disabled === true)) {
- disable();
- }
-
- // Prevent clicks from bubbling up to document. This would cause it to be hidden.
- container.click(stopPropagation);
-
- // Handle user typed input
- textInput.change(setFromTextInput);
- textInput.bind("paste", function () {
- setTimeout(setFromTextInput, 1);
- });
- textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });
-
- cancelButton.text(opts.cancelText);
- cancelButton.bind("click.spectrum", function (e) {
- e.stopPropagation();
- e.preventDefault();
- hide("cancel");
- });
-
- chooseButton.text(opts.chooseText);
- chooseButton.bind("click.spectrum", function (e) {
- e.stopPropagation();
- e.preventDefault();
-
- if (isValid()) {
- updateOriginalInput(true);
- hide();
- }
- });
-
- draggable(alphaSlider, function (dragX, dragY, e) {
- currentAlpha = (dragX / alphaWidth);
- if (e.shiftKey) {
- currentAlpha = Math.round(currentAlpha * 10) / 10;
- }
-
- move();
- });
-
- draggable(slider, function (dragX, dragY) {
- currentHue = parseFloat(dragY / slideHeight);
- move();
- }, dragStart, dragStop);
-
- draggable(dragger, function (dragX, dragY) {
- currentSaturation = parseFloat(dragX / dragWidth);
- currentValue = parseFloat((dragHeight - dragY) / dragHeight);
- move();
- }, dragStart, dragStop);
-
- if (!!initialColor) {
- set(initialColor);
-
- // In case color was black - update the preview UI and set the format
- // since the set function will not run (default color is black).
- updateUI();
- currentPreferredFormat = preferredFormat || tinycolor(initialColor).format;
-
- addColorToSelectionPalette(initialColor);
- }
- else {
- updateUI();
- }
-
- if (flat) {
- show();
- }
-
- function palletElementClick(e) {
- if (e.data && e.data.ignore) {
- set($(this).data("color"));
- move();
- }
- else {
- set($(this).data("color"));
- updateOriginalInput(true);
- move();
- hide();
- }
-
- return false;
- }
-
- var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum";
- paletteContainer.delegate(".sp-thumb-el", paletteEvent, palletElementClick);
- initialColorContainer.delegate(".sp-thumb-el:nth-child(1)", paletteEvent, { ignore: true }, palletElementClick);
- }
-
- function addColorToSelectionPalette(color) {
- if (showSelectionPalette) {
- var colorRgb = tinycolor(color).toRgbString();
- if ($.inArray(colorRgb, selectionPalette) === -1) {
- selectionPalette.push(colorRgb);
- while(selectionPalette.length > maxSelectionSize) {
- selectionPalette.shift();
- }
- }
-
- if (localStorageKey && window.localStorage) {
- try {
- window.localStorage[localStorageKey] = selectionPalette.join(";");
- }
- catch(e) { }
- }
- }
- }
-
- function getUniqueSelectionPalette() {
- var unique = [];
- var p = selectionPalette;
- var paletteLookup = {};
- var rgb;
-
- if (opts.showPalette) {
-
- for (var i = 0; i < paletteArray.length; i++) {
- for (var j = 0; j < paletteArray[i].length; j++) {
- rgb = tinycolor(paletteArray[i][j]).toRgbString();
- paletteLookup[rgb] = true;
- }
- }
-
- for (i = 0; i < p.length; i++) {
- rgb = tinycolor(p[i]).toRgbString();
-
- if (!paletteLookup.hasOwnProperty(rgb)) {
- unique.push(p[i]);
- paletteLookup[rgb] = true;
- }
- }
- }
-
- return unique.reverse().slice(0, opts.maxSelectionSize);
- }
-
- function drawPalette() {
-
- var currentColor = get();
-
- var html = $.map(paletteArray, function (palette, i) {
- return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i);
- });
-
- if (selectionPalette) {
- html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection"));
- }
-
- paletteContainer.html(html.join(""));
- }
-
- function drawInitial() {
- if (opts.showInitial) {
- var initial = colorOnShow;
- var current = get();
- initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial"));
- }
- }
-
- function dragStart() {
- if (dragHeight === 0 || dragWidth === 0 || slideHeight === 0) {
- reflow();
- }
- container.addClass(draggingClass);
- }
-
- function dragStop() {
- container.removeClass(draggingClass);
- }
-
- function setFromTextInput() {
- var tiny = tinycolor(textInput.val());
- if (tiny.ok) {
- set(tiny);
- }
- else {
- textInput.addClass("sp-validation-error");
- }
- }
-
- function toggle() {
- if (visible) {
- hide();
- }
- else {
- show();
- }
- }
-
- function show() {
- var event = $.Event('beforeShow.spectrum');
-
- if (visible) {
- reflow();
- return;
- }
-
- boundElement.trigger(event, [ get() ]);
-
- if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) {
- return;
- }
-
- hideAll();
- visible = true;
-
- $(doc).bind("click.spectrum", hide);
- $(window).bind("resize.spectrum", resize);
- replacer.addClass("sp-active");
- container.removeClass("sp-hidden");
-
- if (opts.showPalette) {
- drawPalette();
- }
- reflow();
- updateUI();
-
- colorOnShow = get();
-
- drawInitial();
- callbacks.show(colorOnShow);
- boundElement.trigger('show.spectrum', [ colorOnShow ]);
- }
-
- function hide(e) {
-
- // Return on right click
- if (e && e.type == "click" && e.button == 2) { return; }
-
- // Return if hiding is unnecessary
- if (!visible || flat) { return; }
- visible = false;
-
- $(doc).unbind("click.spectrum", hide);
- $(window).unbind("resize.spectrum", resize);
-
- replacer.removeClass("sp-active");
- container.addClass("sp-hidden");
-
- var colorHasChanged = !tinycolor.equals(get(), colorOnShow);
-
- if (colorHasChanged) {
- if (clickoutFiresChange && e !== "cancel") {
- updateOriginalInput(true);
- }
- else {
- revert();
- }
- }
-
- callbacks.hide(get());
- boundElement.trigger('hide.spectrum', [ get() ]);
- }
-
- function revert() {
- set(colorOnShow, true);
- }
-
- function set(color, ignoreFormatChange) {
- if (tinycolor.equals(color, get())) {
- return;
- }
-
- var newColor = tinycolor(color);
- var newHsv = newColor.toHsv();
-
- currentHue = newHsv.h;
- currentSaturation = newHsv.s;
- currentValue = newHsv.v;
- currentAlpha = newHsv.a;
-
- updateUI();
-
- if (newColor.ok && !ignoreFormatChange) {
- currentPreferredFormat = preferredFormat || newColor.format;
- }
- }
-
- function get() {
- return tinycolor.fromRatio({ h: currentHue, s: currentSaturation, v: currentValue, a: Math.round(currentAlpha * 100) / 100 });
- }
-
- function isValid() {
- return !textInput.hasClass("sp-validation-error");
- }
-
- function move() {
- updateUI();
-
- callbacks.move(get());
- boundElement.trigger('move.spectrum', [ get() ]);
- }
-
- function updateUI() {
-
- textInput.removeClass("sp-validation-error");
-
- updateHelperLocations();
-
- // Update dragger background color (gradients take care of saturation and value).
- var flatColor = tinycolor({ h: currentHue, s: "1.0", v: "1.0" });
- dragger.css("background-color", flatColor.toHexString());
-
- // Get a format that alpha will be included in (hex and names ignore alpha)
- var format = currentPreferredFormat;
- if (currentAlpha < 1) {
- if (format === "hex" || format === "name") {
- format = "rgb";
- }
- }
-
- var realColor = get(),
- realHex = realColor.toHexString(),
- realRgb = realColor.toRgbString();
-
-
- // Update the replaced elements background color (with actual selected color)
- if (rgbaSupport || realColor.alpha === 1) {
- previewElement.css("background-color", realRgb);
- }
- else {
- previewElement.css("background-color", "transparent");
- previewElement.css("filter", realColor.toFilter());
- }
-
- if (opts.showAlpha) {
- var rgb = realColor.toRgb();
- rgb.a = 0;
- var realAlpha = tinycolor(rgb).toRgbString();
- var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")";
-
- if (IE) {
- alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex));
- }
- else {
- alphaSliderInner.css("background", "-webkit-" + gradient);
- alphaSliderInner.css("background", "-moz-" + gradient);
- alphaSliderInner.css("background", "-ms-" + gradient);
- alphaSliderInner.css("background", gradient);
- }
- }
-
-
- // Update the text entry input as it changes happen
- if (opts.showInput) {
- if (currentAlpha < 1) {
- if (format === "hex" || format === "name") {
- format = "rgb";
- }
- }
- textInput.val(realColor.toString(format));
- }
-
- if (opts.showPalette) {
- drawPalette();
- }
-
- drawInitial();
- }
-
- function updateHelperLocations() {
- var s = currentSaturation;
- var v = currentValue;
-
- // Where to show the little circle in that displays your current selected color
- var dragX = s * dragWidth;
- var dragY = dragHeight - (v * dragHeight);
- dragX = Math.max(
- -dragHelperHeight,
- Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight)
- );
- dragY = Math.max(
- -dragHelperHeight,
- Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)
- );
- dragHelper.css({
- "top": dragY,
- "left": dragX
- });
-
- var alphaX = currentAlpha * alphaWidth;
- alphaSlideHelper.css({
- "left": alphaX - (alphaSlideHelperWidth / 2)
- });
-
- // Where to show the bar that displays your current selected hue
- var slideY = (currentHue) * slideHeight;
- slideHelper.css({
- "top": slideY - slideHelperHeight
- });
- }
-
- function updateOriginalInput(fireCallback) {
- var color = get();
-
- if (isInput) {
- boundElement.val(color.toString(currentPreferredFormat)).change();
- }
-
- var hasChanged = !tinycolor.equals(color, colorOnShow);
- colorOnShow = color;
-
- // Update the selection palette with the current color
- addColorToSelectionPalette(color);
- if (fireCallback && hasChanged) {
- callbacks.change(color);
- boundElement.trigger('change.spectrum', [ color ]);
- }
- }
-
- function reflow() {
- dragWidth = dragger.width();
- dragHeight = dragger.height();
- dragHelperHeight = dragHelper.height();
- slideWidth = slider.width();
- slideHeight = slider.height();
- slideHelperHeight = slideHelper.height();
- alphaWidth = alphaSlider.width();
- alphaSlideHelperWidth = alphaSlideHelper.width();
-
- if (!flat) {
- container.offset(getOffset(container, offsetElement));
- }
-
- updateHelperLocations();
- }
-
- function destroy() {
- boundElement.show();
- offsetElement.unbind("click.spectrum touchstart.spectrum");
- container.remove();
- replacer.remove();
- spectrums[spect.id] = null;
- }
-
- function option(optionName, optionValue) {
- if (optionName === undefined) {
- return $.extend({}, opts);
- }
- if (optionValue === undefined) {
- return opts[optionName];
- }
-
- opts[optionName] = optionValue;
- applyOptions();
- }
-
- function enable() {
- disabled = false;
- boundElement.attr("disabled", false);
- offsetElement.removeClass("sp-disabled");
- }
-
- function disable() {
- hide();
- disabled = true;
- boundElement.attr("disabled", true);
- offsetElement.addClass("sp-disabled");
- }
-
- initialize();
-
- var spect = {
- show: show,
- hide: hide,
- toggle: toggle,
- reflow: reflow,
- option: option,
- enable: enable,
- disable: disable,
- set: function (c) {
- set(c);
- updateOriginalInput();
- },
- get: get,
- destroy: destroy,
- container: container
- };
-
- spect.id = spectrums.push(spect) - 1;
-
- return spect;
- }
-
- /**
- * checkOffset - get the offset below/above and left/right element depending on screen position
- * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
- */
- function getOffset(picker, input) {
- var extraY = 0;
- var dpWidth = picker.outerWidth();
- var dpHeight = picker.outerHeight();
- var inputHeight = input.outerHeight();
- var doc = picker[0].ownerDocument;
- var docElem = doc.documentElement;
- var viewWidth = docElem.clientWidth + $(doc).scrollLeft();
- var viewHeight = docElem.clientHeight + $(doc).scrollTop();
- var offset = input.offset();
- offset.top += inputHeight;
-
- offset.left -=
- Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
- Math.abs(offset.left + dpWidth - viewWidth) : 0);
-
- offset.top -=
- Math.min(offset.top, ((offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
- Math.abs(dpHeight + inputHeight - extraY) : extraY));
-
- return offset;
- }
-
- /**
- * noop - do nothing
- */
- function noop() {
-
- }
-
- /**
- * stopPropagation - makes the code only doing this a little easier to read in line
- */
- function stopPropagation(e) {
- e.stopPropagation();
- }
-
- /**
- * Create a function bound to a given object
- * Thanks to underscore.js
- */
- function bind(func, obj) {
- var slice = Array.prototype.slice;
- var args = slice.call(arguments, 2);
- return function () {
- return func.apply(obj, args.concat(slice.call(arguments)));
- };
- }
-
- /**
- * Lightweight drag helper. Handles containment within the element, so that
- * when dragging, the x is within [0,element.width] and y is within [0,element.height]
- */
- function draggable(element, onmove, onstart, onstop) {
- onmove = onmove || function () { };
- onstart = onstart || function () { };
- onstop = onstop || function () { };
- var doc = element.ownerDocument || document;
- var dragging = false;
- var offset = {};
- var maxHeight = 0;
- var maxWidth = 0;
- var hasTouch = ('ontouchstart' in window);
-
- var duringDragEvents = {};
- duringDragEvents["selectstart"] = prevent;
- duringDragEvents["dragstart"] = prevent;
- duringDragEvents[(hasTouch ? "touchmove" : "mousemove")] = move;
- duringDragEvents[(hasTouch ? "touchend" : "mouseup")] = stop;
-
- function prevent(e) {
- if (e.stopPropagation) {
- e.stopPropagation();
- }
- if (e.preventDefault) {
- e.preventDefault();
- }
- e.returnValue = false;
- }
-
- function move(e) {
- if (dragging) {
- // Mouseup happened outside of window
- if (IE && document.documentMode < 9 && !e.button) {
- return stop();
- }
-
- var touches = e.originalEvent.touches;
- var pageX = touches ? touches[0].pageX : e.pageX;
- var pageY = touches ? touches[0].pageY : e.pageY;
-
- var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
- var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
-
- if (hasTouch) {
- // Stop scrolling in iOS
- prevent(e);
- }
-
- onmove.apply(element, [dragX, dragY, e]);
- }
- }
- function start(e) {
- var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
- var touches = e.originalEvent.touches;
-
- if (!rightclick && !dragging) {
- if (onstart.apply(element, arguments) !== false) {
- dragging = true;
- maxHeight = $(element).height();
- maxWidth = $(element).width();
- offset = $(element).offset();
-
- $(doc).bind(duringDragEvents);
- $(doc.body).addClass("sp-dragging");
-
- if (!hasTouch) {
- move(e);
- }
-
- prevent(e);
- }
- }
- }
- function stop() {
- if (dragging) {
- $(doc).unbind(duringDragEvents);
- $(doc.body).removeClass("sp-dragging");
- onstop.apply(element, arguments);
- }
- dragging = false;
- }
-
- $(element).bind(hasTouch ? "touchstart" : "mousedown", start);
- }
-
- function throttle(func, wait, debounce) {
- var timeout;
- return function () {
- var context = this, args = arguments;
- var throttler = function () {
- timeout = null;
- func.apply(context, args);
- };
- if (debounce) clearTimeout(timeout);
- if (debounce || !timeout) timeout = setTimeout(throttler, wait);
- };
- }
-
-
- /**
- * Define a jQuery plugin
- */
- var dataID = "spectrum.id";
- $.fn.spectrum = function (opts, extra) {
-
- if (typeof opts == "string") {
-
- var returnValue = this;
- var args = Array.prototype.slice.call( arguments, 1 );
-
- this.each(function () {
- var spect = spectrums[$(this).data(dataID)];
- if (spect) {
-
- var method = spect[opts];
- if (!method) {
- throw new Error( "Spectrum: no such method: '" + opts + "'" );
- }
-
- if (opts == "get") {
- returnValue = spect.get();
- }
- else if (opts == "container") {
- returnValue = spect.container;
- }
- else if (opts == "option") {
- returnValue = spect.option.apply(spect, args);
- }
- else if (opts == "destroy") {
- spect.destroy();
- $(this).removeData(dataID);
- }
- else {
- method.apply(spect, args);
- }
- }
- });
-
- return returnValue;
- }
-
- // Initializing a new instance of spectrum
- return this.spectrum("destroy").each(function () {
- var spect = spectrum(this, opts);
- $(this).data(dataID, spect.id);
- });
- };
-
- $.fn.spectrum.load = true;
- $.fn.spectrum.loadOpts = {};
- $.fn.spectrum.draggable = draggable;
- $.fn.spectrum.defaults = defaultOpts;
-
- $.spectrum = { };
- $.spectrum.localization = { };
- $.spectrum.palettes = { };
-
- $.fn.spectrum.processNativeColorInputs = function () {
- var colorInput = $("<input type='color' value='!' />")[0];
- var supportsColor = colorInput.type === "color" && colorInput.value != "!";
-
- if (!supportsColor) {
- $("input[type=color]").spectrum({
- preferredFormat: "hex6"
- });
- }
- };
-
- // TinyColor.js - <https://github.com/bgrins/TinyColor> - 2011 Brian Grinstead - v0.5
-
- (function (window) {
-
- var trimLeft = /^[\s,#]+/,
- trimRight = /\s+$/,
- tinyCounter = 0,
- math = Math,
- mathRound = math.round,
- mathMin = math.min,
- mathMax = math.max,
- mathRandom = math.random,
- parseFloat = window.parseFloat;
-
- function tinycolor(color, opts) {
-
- // If input is already a tinycolor, return itself
- if (typeof color == "object" && color.hasOwnProperty("_tc_id")) {
- return color;
- }
-
- var rgb = inputToRGB(color);
- var r = rgb.r, g = rgb.g, b = rgb.b, a = parseFloat(rgb.a), format = rgb.format;
-
- return {
- ok: rgb.ok,
- format: format,
- _tc_id: tinyCounter++,
- alpha: a,
- toHsv: function () {
- var hsv = rgbToHsv(r, g, b);
- return { h: hsv.h, s: hsv.s, v: hsv.v, a: a };
- },
- toHsvString: function () {
- var hsv = rgbToHsv(r, g, b);
- var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
- return (a == 1) ?
- "hsv(" + h + ", " + s + "%, " + v + "%)" :
- "hsva(" + h + ", " + s + "%, " + v + "%, " + a + ")";
- },
- toHsl: function () {
- var hsl = rgbToHsl(r, g, b);
- return { h: hsl.h, s: hsl.s, l: hsl.l, a: a };
- },
- toHslString: function () {
- var hsl = rgbToHsl(r, g, b);
- var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
- return (a == 1) ?
- "hsl(" + h + ", " + s + "%, " + l + "%)" :
- "hsla(" + h + ", " + s + "%, " + l + "%, " + a + ")";
- },
- toHex: function () {
- return rgbToHex(r, g, b);
- },
- toHexString: function (force6Char) {
- return '#' + rgbToHex(r, g, b, force6Char);
- },
- toRgb: function () {
- return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a };
- },
- toRgbString: function () {
- return (a == 1) ?
- "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" :
- "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + a + ")";
- },
- toName: function () {
- return hexNames[rgbToHex(r, g, b)] || false;
- },
- toFilter: function (opts, secondColor) {
-
- var hex = rgbToHex(r, g, b, true);
- var secondHex = hex;
- var alphaHex = Math.round(parseFloat(a) * 255).toString(16);
- var secondAlphaHex = alphaHex;
- var gradientType = opts && opts.gradientType ? "GradientType = 1, " : "";
-
- if (secondColor) {
- var s = tinycolor(secondColor);
- secondHex = s.toHex();
- secondAlphaHex = Math.round(parseFloat(s.alpha) * 255).toString(16);
- }
-
- return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr=#" + pad2(alphaHex) + hex + ",endColorstr=#" + pad2(secondAlphaHex) + secondHex + ")";
- },
- toString: function (format) {
- format = format || this.format;
- var formattedString = false;
- if (format === "rgb") {
- formattedString = this.toRgbString();
- }
- if (format === "hex") {
- formattedString = this.toHexString();
- }
- if (format === "hex6") {
- formattedString = this.toHexString(true);
- }
- if (format === "name") {
- formattedString = this.toName();
- }
- if (format === "hsl") {
- formattedString = this.toHslString();
- }
- if (format === "hsv") {
- formattedString = this.toHsvString();
- }
-
- return formattedString || this.toHexString(true);
- }
- };
- }
-
- // If input is an object, force 1 into "1.0" to handle ratios properly
- // String input requires "1.0" as input, so 1 will be treated as 1
- tinycolor.fromRatio = function (color) {
-
- if (typeof color == "object") {
- for (var i in color) {
- if (color[i] === 1) {
- color[i] = "1.0";
- }
- }
- }
-
- return tinycolor(color);
-
- };
-
- // Given a string or object, convert that input to RGB
- // Possible string inputs:
- //
- // "red"
- // "#f00" or "f00"
- // "#ff0000" or "ff0000"
- // "rgb 255 0 0" or "rgb (255, 0, 0)"
- // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
- // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
- // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
- // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
- // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
- // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
- //
- function inputToRGB(color) {
-
- var rgb = { r: 0, g: 0, b: 0 };
- var a = 1;
- var ok = false;
- var format = false;
-
- if (typeof color == "string") {
- color = stringInputToObject(color);
- }
-
- if (typeof color == "object") {
- if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
- rgb = rgbToRgb(color.r, color.g, color.b);
- ok = true;
- format = "rgb";
- }
- else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
- rgb = hsvToRgb(color.h, color.s, color.v);
- ok = true;
- format = "hsv";
- }
- else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
- rgb = hslToRgb(color.h, color.s, color.l);
- ok = true;
- format = "hsl";
- }
-
- if (color.hasOwnProperty("a")) {
- a = color.a;
- }
- }
-
- rgb.r = mathMin(255, mathMax(rgb.r, 0));
- rgb.g = mathMin(255, mathMax(rgb.g, 0));
- rgb.b = mathMin(255, mathMax(rgb.b, 0));
-
-
- // Don't let the range of [0,255] come back in [0,1].
- // Potentially lose a little bit of precision here, but will fix issues where
- // .5 gets interpreted as half of the total, instead of half of 1.
- // If it was supposed to be 128, this was already taken care of in the conversion function
- if (rgb.r < 1) { rgb.r = mathRound(rgb.r); }
- if (rgb.g < 1) { rgb.g = mathRound(rgb.g); }
- if (rgb.b < 1) { rgb.b = mathRound(rgb.b); }
-
- return {
- ok: ok,
- format: (color && color.format) || format,
- r: rgb.r,
- g: rgb.g,
- b: rgb.b,
- a: a
- };
- }
-
-
-
- // Conversion Functions
- // --------------------
-
- // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
- // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
-
- // `rgbToRgb`
- // Handle bounds / percentage checking to conform to CSS color spec
- // <http://www.w3.org/TR/css3-color/>
- // *Assumes:* r, g, b in [0, 255] or [0, 1]
- // *Returns:* { r, g, b } in [0, 255]
- function rgbToRgb(r, g, b) {
- return {
- r: bound01(r, 255) * 255,
- g: bound01(g, 255) * 255,
- b: bound01(b, 255) * 255
- };
- }
-
- // `rgbToHsl`
- // Converts an RGB color value to HSL.
- // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
- // *Returns:* { h, s, l } in [0,1]
- function rgbToHsl(r, g, b) {
-
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
-
- var max = mathMax(r, g, b), min = mathMin(r, g, b);
- var h, s, l = (max + min) / 2;
-
- if (max == min) {
- h = s = 0; // achromatic
- }
- else {
- var d = max - min;
- s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- }
-
- h /= 6;
- }
-
- return { h: h, s: s, l: l };
- }
-
- // `hslToRgb`
- // Converts an HSL color value to RGB.
- // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
- // *Returns:* { r, g, b } in the set [0, 255]
- function hslToRgb(h, s, l) {
- var r, g, b;
-
- h = bound01(h, 360);
- s = bound01(s, 100);
- l = bound01(l, 100);
-
- function hue2rgb(p, q, t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- }
-
- if (s === 0) {
- r = g = b = l; // achromatic
- }
- else {
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3);
- }
-
- return { r: r * 255, g: g * 255, b: b * 255 };
- }
-
- // `rgbToHsv`
- // Converts an RGB color value to HSV
- // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
- // *Returns:* { h, s, v } in [0,1]
- function rgbToHsv(r, g, b) {
-
- r = bound01(r, 255);
- g = bound01(g, 255);
- b = bound01(b, 255);
-
- var max = mathMax(r, g, b), min = mathMin(r, g, b);
- var h, s, v = max;
-
- var d = max - min;
- s = max === 0 ? 0 : d / max;
-
- if (max == min) {
- h = 0; // achromatic
- }
- else {
- switch (max) {
- case r: h = (g - b) / d + (g < b ? 6 : 0); break;
- case g: h = (b - r) / d + 2; break;
- case b: h = (r - g) / d + 4; break;
- }
- h /= 6;
- }
- return { h: h, s: s, v: v };
- }
-
- // `hsvToRgb`
- // Converts an HSV color value to RGB.
- // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
- // *Returns:* { r, g, b } in the set [0, 255]
- function hsvToRgb(h, s, v) {
- h = bound01(h, 360) * 6;
- s = bound01(s, 100);
- v = bound01(v, 100);
-
- var i = math.floor(h),
- f = h - i,
- p = v * (1 - s),
- q = v * (1 - f * s),
- t = v * (1 - (1 - f) * s),
- mod = i % 6,
- r = [v, q, p, p, t, v][mod],
- g = [t, v, v, q, p, p][mod],
- b = [p, p, t, v, v, q][mod];
-
- return { r: r * 255, g: g * 255, b: b * 255 };
- }
-
- // `rgbToHex`
- // Converts an RGB color to hex
- // Assumes r, g, and b are contained in the set [0, 255]
- // Returns a 3 or 6 character hex
- function rgbToHex(r, g, b, force6Char) {
-
- var hex = [
- pad2(mathRound(r).toString(16)),
- pad2(mathRound(g).toString(16)),
- pad2(mathRound(b).toString(16))
- ];
-
- // Return a 3 character hex if possible
- if (!force6Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
- return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
- }
-
- return hex.join("");
- }
-
- // `equals`
- // Can be called with any tinycolor input
- tinycolor.equals = function (color1, color2) {
- if (!color1 || !color2) { return false; }
- return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
- };
- tinycolor.random = function () {
- return tinycolor.fromRatio({
- r: mathRandom(),
- g: mathRandom(),
- b: mathRandom()
- });
- };
-
-
- // Modification Functions
- // ----------------------
- // Thanks to less.js for some of the basics here
- // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
-
-
- tinycolor.desaturate = function (color, amount) {
- var hsl = tinycolor(color).toHsl();
- hsl.s -= ((amount || 10) / 100);
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
- };
- tinycolor.saturate = function (color, amount) {
- var hsl = tinycolor(color).toHsl();
- hsl.s += ((amount || 10) / 100);
- hsl.s = clamp01(hsl.s);
- return tinycolor(hsl);
- };
- tinycolor.greyscale = function (color) {
- return tinycolor.desaturate(color, 100);
- };
- tinycolor.lighten = function (color, amount) {
- var hsl = tinycolor(color).toHsl();
- hsl.l += ((amount || 10) / 100);
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
- };
- tinycolor.darken = function (color, amount) {
- var hsl = tinycolor(color).toHsl();
- hsl.l -= ((amount || 10) / 100);
- hsl.l = clamp01(hsl.l);
- return tinycolor(hsl);
- };
- tinycolor.complement = function (color) {
- var hsl = tinycolor(color).toHsl();
- hsl.h = (hsl.h + 0.5) % 1;
- return tinycolor(hsl);
- };
-
-
- // Combination Functions
- // ---------------------
- // Thanks to jQuery xColor for some of the ideas behind these
- // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
-
- tinycolor.triad = function (color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h * 360;
- return [
- tinycolor(color),
- tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
- tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
- ];
- };
- tinycolor.tetrad = function (color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h * 360;
- return [
- tinycolor(color),
- tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
- tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
- tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
- ];
- };
- tinycolor.splitcomplement = function (color) {
- var hsl = tinycolor(color).toHsl();
- var h = hsl.h * 360;
- return [
- tinycolor(color),
- tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),
- tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l })
- ];
- };
- tinycolor.analogous = function (color, results, slices) {
- results = results || 6;
- slices = slices || 30;
-
- var hsl = tinycolor(color).toHsl();
- var part = 360 / slices;
- var ret = [tinycolor(color)];
-
- hsl.h *= 360;
-
- for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
- hsl.h = (hsl.h + part) % 360;
- ret.push(tinycolor(hsl));
- }
- return ret;
- };
- tinycolor.monochromatic = function (color, results) {
- results = results || 6;
- var hsv = tinycolor(color).toHsv();
- var h = hsv.h, s = hsv.s, v = hsv.v;
- var ret = [];
- var modification = 1 / results;
-
- while (results--) {
- ret.push(tinycolor({ h: h, s: s, v: v }));
- v = (v + modification) % 1;
- }
-
- return ret;
- };
- tinycolor.readable = function (color1, color2) {
- var a = tinycolor(color1).toRgb(), b = tinycolor(color2).toRgb();
- return (
- (b.r - a.r) * (b.r - a.r) +
- (b.g - a.g) * (b.g - a.g) +
- (b.b - a.b) * (b.b - a.b)
- ) > 0x28A4;
- };
-
- // Big List of Colors
- // ---------
- // <http://www.w3.org/TR/css3-color/#svg-color>
- var names = tinycolor.names = {
- aliceblue: "f0f8ff",
- antiquewhite: "faebd7",
- aqua: "0ff",
- aquamarine: "7fffd4",
- azure: "f0ffff",
- beige: "f5f5dc",
- bisque: "ffe4c4",
- black: "000",
- blanchedalmond: "ffebcd",
- blue: "00f",
- blueviolet: "8a2be2",
- brown: "a52a2a",
- burlywood: "deb887",
- burntsienna: "ea7e5d",
- cadetblue: "5f9ea0",
- chartreuse: "7fff00",
- chocolate: "d2691e",
- coral: "ff7f50",
- cornflowerblue: "6495ed",
- cornsilk: "fff8dc",
- crimson: "dc143c",
- cyan: "0ff",
- darkblue: "00008b",
- darkcyan: "008b8b",
- darkgoldenrod: "b8860b",
- darkgray: "a9a9a9",
- darkgreen: "006400",
- darkgrey: "a9a9a9",
- darkkhaki: "bdb76b",
- darkmagenta: "8b008b",
- darkolivegreen: "556b2f",
- darkorange: "ff8c00",
- darkorchid: "9932cc",
- darkred: "8b0000",
- darksalmon: "e9967a",
- darkseagreen: "8fbc8f",
- darkslateblue: "483d8b",
- darkslategray: "2f4f4f",
- darkslategrey: "2f4f4f",
- darkturquoise: "00ced1",
- darkviolet: "9400d3",
- deeppink: "ff1493",
- deepskyblue: "00bfff",
- dimgray: "696969",
- dimgrey: "696969",
- dodgerblue: "1e90ff",
- firebrick: "b22222",
- floralwhite: "fffaf0",
- forestgreen: "228b22",
- fuchsia: "f0f",
- gainsboro: "dcdcdc",
- ghostwhite: "f8f8ff",
- gold: "ffd700",
- goldenrod: "daa520",
- gray: "808080",
- green: "008000",
- greenyellow: "adff2f",
- grey: "808080",
- honeydew: "f0fff0",
- hotpink: "ff69b4",
- indianred: "cd5c5c",
- indigo: "4b0082",
- ivory: "fffff0",
- khaki: "f0e68c",
- lavender: "e6e6fa",
- lavenderblush: "fff0f5",
- lawngreen: "7cfc00",
- lemonchiffon: "fffacd",
- lightblue: "add8e6",
- lightcoral: "f08080",
- lightcyan: "e0ffff",
- lightgoldenrodyellow: "fafad2",
- lightgray: "d3d3d3",
- lightgreen: "90ee90",
- lightgrey: "d3d3d3",
- lightpink: "ffb6c1",
- lightsalmon: "ffa07a",
- lightseagreen: "20b2aa",
- lightskyblue: "87cefa",
- lightslategray: "789",
- lightslategrey: "789",
- lightsteelblue: "b0c4de",
- lightyellow: "ffffe0",
- lime: "0f0",
- limegreen: "32cd32",
- linen: "faf0e6",
- magenta: "f0f",
- maroon: "800000",
- mediumaquamarine: "66cdaa",
- mediumblue: "0000cd",
- mediumorchid: "ba55d3",
- mediumpurple: "9370db",
- mediumseagreen: "3cb371",
- mediumslateblue: "7b68ee",
- mediumspringgreen: "00fa9a",
- mediumturquoise: "48d1cc",
- mediumvioletred: "c71585",
- midnightblue: "191970",
- mintcream: "f5fffa",
- mistyrose: "ffe4e1",
- moccasin: "ffe4b5",
- navajowhite: "ffdead",
- navy: "000080",
- oldlace: "fdf5e6",
- olive: "808000",
- olivedrab: "6b8e23",
- orange: "ffa500",
- orangered: "ff4500",
- orchid: "da70d6",
- palegoldenrod: "eee8aa",
- palegreen: "98fb98",
- paleturquoise: "afeeee",
- palevioletred: "db7093",
- papayawhip: "ffefd5",
- peachpuff: "ffdab9",
- peru: "cd853f",
- pink: "ffc0cb",
- plum: "dda0dd",
- powderblue: "b0e0e6",
- purple: "800080",
- red: "f00",
- rosybrown: "bc8f8f",
- royalblue: "4169e1",
- saddlebrown: "8b4513",
- salmon: "fa8072",
- sandybrown: "f4a460",
- seagreen: "2e8b57",
- seashell: "fff5ee",
- sienna: "a0522d",
- silver: "c0c0c0",
- skyblue: "87ceeb",
- slateblue: "6a5acd",
- slategray: "708090",
- slategrey: "708090",
- snow: "fffafa",
- springgreen: "00ff7f",
- steelblue: "4682b4",
- tan: "d2b48c",
- teal: "008080",
- thistle: "d8bfd8",
- tomato: "ff6347",
- turquoise: "40e0d0",
- violet: "ee82ee",
- wheat: "f5deb3",
- white: "fff",
- whitesmoke: "f5f5f5",
- yellow: "ff0",
- yellowgreen: "9acd32"
- };
-
- // Make it easy to access colors via `hexNames[hex]`
- var hexNames = tinycolor.hexNames = flip(names);
-
-
- // Utilities
- // ---------
-
- // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
- function flip(o) {
- var flipped = {};
- for (var i in o) {
- if (o.hasOwnProperty(i)) {
- flipped[o[i]] = i;
- }
- }
- return flipped;
- }
-
- // Take input from [0, n] and return it as [0, 1]
- function bound01(n, max) {
- if (isOnePointZero(n)) { n = "100%"; }
-
- var processPercent = isPercentage(n);
- n = mathMin(max, mathMax(0, parseFloat(n)));
-
- // Automatically convert percentage into number
- if (processPercent) {
- n = n * (max / 100);
- }
-
- // Handle floating point rounding errors
- if (math.abs(n - max) < 0.000001) {
- return 1;
- }
- else if (n >= 1) {
- return (n % max) / parseFloat(max);
- }
- return n;
- }
-
- // Force a number between 0 and 1
- function clamp01(val) {
- return mathMin(1, mathMax(0, val));
- }
-
- // Parse an integer into hex
- function parseHex(val) {
- return parseInt(val, 16);
- }
-
- // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
- // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
- function isOnePointZero(n) {
- return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
- }
-
- // Check to see if string passed in is a percentage
- function isPercentage(n) {
- return typeof n === "string" && n.indexOf('%') != -1;
- }
-
- // Force a hex value to have 2 characters
- function pad2(c) {
- return c.length == 1 ? '0' + c : '' + c;
- }
-
- var matchers = (function () {
-
- // <http://www.w3.org/TR/css3-values/#integers>
- var CSS_INTEGER = "[-\\+]?\\d+%?";
-
- // <http://www.w3.org/TR/css3-values/#number-value>
- var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
-
- // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
- var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
-
- // Actual matching.
- // Parentheses and commas are optional, but not required.
- // Whitespace can take the place of commas or opening paren
- var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
- var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
-
- return {
- rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
- rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
- hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
- hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
- hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
- hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
- hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
- };
- })();
-
- // `stringInputToObject`
- // Permissive string parsing. Take in a number of formats, and output an object
- // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
- function stringInputToObject(color) {
-
- color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
- var named = false;
- if (names[color]) {
- color = names[color];
- named = true;
- }
- else if (color == 'transparent') {
- return { r: 0, g: 0, b: 0, a: 0 };
- }
-
- // Try to match string input using regular expressions.
- // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
- // Just return an object and let the conversion functions handle that.
- // This way the result will be the same whether the tinycolor is initialized with string or object.
- var match;
- if ((match = matchers.rgb.exec(color))) {
- return { r: match[1], g: match[2], b: match[3] };
- }
- if ((match = matchers.rgba.exec(color))) {
- return { r: match[1], g: match[2], b: match[3], a: match[4] };
- }
- if ((match = matchers.hsl.exec(color))) {
- return { h: match[1], s: match[2], l: match[3] };
- }
- if ((match = matchers.hsla.exec(color))) {
- return { h: match[1], s: match[2], l: match[3], a: match[4] };
- }
- if ((match = matchers.hsv.exec(color))) {
- return { h: match[1], s: match[2], v: match[3] };
- }
- if ((match = matchers.hex6.exec(color))) {
- return {
- r: parseHex(match[1]),
- g: parseHex(match[2]),
- b: parseHex(match[3]),
- format: named ? "name" : "hex"
- };
- }
- if ((match = matchers.hex3.exec(color))) {
- return {
- r: parseHex(match[1] + '' + match[1]),
- g: parseHex(match[2] + '' + match[2]),
- b: parseHex(match[3] + '' + match[3]),
- format: named ? "name" : "hex"
- };
- }
-
- return false;
- }
-
- // Everything is ready, expose to window
- window.tinycolor = tinycolor;
-
- })(this);
-
- $(function () {
- if ($.fn.spectrum.load) {
- $.fn.spectrum.processNativeColorInputs();
- }
- });
-
-
- function log(){window.console&&(log=Function.prototype.bind?Function.prototype.bind.call(console.log,console):function(){Function.prototype.apply.call(console.log,console,arguments)},log.apply(this,arguments))};
-
-
-})(window, jQuery);
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/controller/AdminControllerTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,114 +0,0 @@
-package org.iri_research.renkan.test.controller;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.context.WebApplicationContext;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = { "controller-context.xml",
- "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
-public class AdminControllerTest {
-
- private final static int SPACE_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(AdminControllerTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
-
- @Autowired
- private WebApplicationContext context;
- private MockMvc mvc;
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
-
- ArrayList<Project> pl = new ArrayList<Project>();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- pl.add(new Project(testSpace.getId(), UUID.randomUUID()
- .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
- "desc" + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1), creationDate));
- }
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
- this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- }
-
- @Test
- public void testContext() throws Exception {
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/");
- MvcResult res = this.mvc.perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
-
- logger.debug("testContext resp : "
- + res.getResponse().getContentAsString());
-
- }
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/controller/GroupsAdminControllerTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,484 +0,0 @@
-package org.iri_research.renkan.test.controller;
-
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.util.NestedServletException;
-
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = { "controller-context.xml",
- "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
-public class GroupsAdminControllerTest {
-
- private final static int SPACE_NB = 3;
- private final static int USER_NB = 3;
- private final static int GROUP_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(GroupsAdminControllerTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
- @Autowired
- private UsersRepository usersRepository;
- @Autowired
- private GroupsRepository groupsRepository;
-
-
-
- @Autowired
- private PasswordEncoder renkanPasswordEncoder;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
-
- private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
- private List<String> usersUuids = new ArrayList<>(USER_NB);
-
- private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
- private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
-
-
-
- @Autowired
- private WebApplicationContext context;
- private MockMvc mvc;
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- usersRepository.deleteAll();
- groupsRepository.deleteAll();
-
- for(int i=0; i < USER_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
- user.setLocked(false);
- user.setEnabled(true);
- user.setAvatar("A pretty picture");
- user.setExpirationDate(new LocalDate());
- user.setCredentialsExpirationDate(new LocalDate());
- user.setEmail(String.format("user%d@mail.com", i));
- user = usersRepository.save(user);
- this.usersUuids.add(uuid);
- this.usersList.put(uuid, user);
- }
-
-
- for(int i=0; i < GROUP_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
- group.setAvatar("A pretty group picture " + i);
- group = groupsRepository.save(group);
- this.groupsUuids.add(uuid);
- this.groupsList.put(uuid, group);
- }
-
- ArrayList<Project> pl = new ArrayList<Project>();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- Project p = new Project(testSpace.getId(), UUID.randomUUID()
- .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
- "desc" + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1), creationDate);
- p.addUser(this.usersList.get(this.usersUuids.get(0)));
- pl.add(p);
- }
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
-
-
- this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- usersRepository.deleteAll();
- groupsRepository.deleteAll();
-
- }
-
- @Test
- public void testGroupPostUpdate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/save");
- post = post.param("id", this.groupsUuids.get(0));
- post = post.param("title", "New name");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
-
- Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
-
- Assert.assertNotNull("Should find space", group);
- Assert.assertEquals("Title equals", "New name", group.getTitle());
- Assert.assertEquals("Description equals", "New description",
- group.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
- Assert.assertEquals("Color equals", "#ffffff", group.getColor());
- }
-
- @Test
- public void testGroupPostCreate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/save")
- .param("title", "New name")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("avatar", "A pretty avatar");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
-
- Assert.assertEquals("Must have one more group", GROUP_NB + 1,
- this.groupsRepository.count());
-
- for (Group group : this.groupsRepository.findAll()) {
- if (this.groupsList.containsKey(group.getId())) {
- continue;
- }
- else {
- Assert.assertNotNull("Should find group", group);
- Assert.assertEquals("Title equals", "New name", group.getTitle());
- Assert.assertEquals("Description equals", "New description",
- group.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
- Assert.assertEquals("Color equals", "#ffffff", group.getColor());
- Assert.assertEquals("Avatar equals", "A pretty avatar", group.getAvatar());
- Assert.assertTrue(
- "id sould match uuid regex",
- group.getId()
- .matches(
- "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
- }
- }
- }
-
- @Test
- public void testGroupPostUpdateEmptyTitle() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/save")
- .param("id", this.groupsUuids.get(0))
- .param("title", "")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("avatar", "A pretty avatar");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/groupEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("group"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("group", "title"));
-
- Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
-
- Assert.assertNotNull("Should find group", group);
- Assert.assertEquals("name equals", "group0", group.getTitle());
-
- Assert.assertEquals("name equals", "Group nb 0", group.getDescription());
-
- }
-
- @Test
- public void testGroupPostCreateEmptyName() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/save")
- .param("title", "")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("avatar", "A pretty avatar");
-
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/groupEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("group"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("group", "title"));
-
- Assert.assertEquals("Must not have one more group", GROUP_NB,this.groupsRepository.count());
-
- }
-
- @Test
- public void testUserPostCreateBadPassword() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save")
- .param("title", "user")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("expirationDate","2007-11-24")
- .param("credentialsExpirationDate","2009-11-29")
- .param("password", "test")
- .param("passwordConfirm", "test2");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "password"));
-
- Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
-
- }
-
-
- @Test
- public void testDeleteGroup() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/groups/delete/"
- + this.groupsUuids.get(GROUP_NB - 1));
-
- MvcResult res = this.mvc
- .perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(
- MockMvcResultMatchers.view().name(
- "admin/groupDeleteConfirm"))
- .andExpect(
- MockMvcResultMatchers.model().attributeExists(
- "groupObj", "key", "salt")).andReturn();
-
- Map<String, Object> model = res.getModelAndView().getModel();
-
- Group group = (Group) model.get("groupObj");
- Assert.assertNotNull("Group is not null", group);
- Assert.assertEquals("Must be first group id",
- this.groupsUuids.get(GROUP_NB - 1), group.getId());
-
- String key = (String) model.get("key");
- Assert.assertNotNull("key is not null", key);
-
- String salt = (String) model.get("salt");
- Assert.assertNotNull("salt is not null", salt);
-
- Assert.assertTrue("Key must be checked", group.checkKey(key, salt));
-
- }
-
- @Test
- public void testDeleteFakeGroup() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/groups/delete/" + UUID.randomUUID().toString());
-
- try {
- this.mvc.perform(get).andExpect(
- MockMvcResultMatchers.status().isNotFound());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.NOT_FOUND,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- }
-
- @Test
- public void testDoDeleteGroupNoKey() throws Exception {
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/delete/"
- + this.spacesUuids.get(GROUP_NB - 1));
-
- try {
- this.mvc.perform(post).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- Assert.assertEquals("Must have same nb of group", GROUP_NB,
- this.groupsRepository.count());
-
- }
-
- @Test
- public void testDoDeleteGroup() throws Exception {
-
- Group group = this.groupsList.get(this.groupsUuids.get(GROUP_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = group.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/groups/delete/%s?key=%s&salt=%s",
- this.groupsUuids.get(GROUP_NB - 1), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
-
- Assert.assertEquals("Must have one less space", GROUP_NB - 1,
- this.groupsRepository.count());
-
- group = this.groupsRepository.findOne(this.groupsUuids
- .get(GROUP_NB - 1));
-
- Assert.assertNull("Group " + this.groupsUuids.get(GROUP_NB - 1)
- + " deleted", group);
-
- }
-
- @Test
- public void testDoDeleteGroupFake() throws Exception {
-
- Group group = this.groupsList.get(this.groupsUuids.get(GROUP_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = group.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/groups/delete/%s?key=%s&salt=%s",
- UUID.randomUUID(), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
-
- Assert.assertEquals("Must have the same nb of group", GROUP_NB,
- this.groupsRepository.count());
-
- }
-
- @Test
- public void testUpdateUserGroups() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/groups/save");
- post = post.param("id", this.groupsUuids.get(0));
- post = post.param("title", "New name");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("users", this.usersUuids.toArray(new String[GroupsAdminControllerTest.GROUP_NB]));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/groups?version=NULL"));
-
- Group group = this.groupsRepository.findOne(this.groupsUuids.get(0));
-
- Assert.assertNotNull("Should find group", group);
- Assert.assertEquals("Title equals", "New name", group.getTitle());
- Assert.assertEquals("Description equals", "New description",
- group.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", group.getUri());
- Assert.assertEquals("Color equals", "#ffffff", group.getColor());
-
- Assert.assertNotNull("Users must be set", group.getUsers());
- Assert.assertEquals("all users must be set", USER_NB, group.getUsers().size());
- Assert.assertTrue("users list must contains all users", this.usersUuids.containsAll(group.getUsers()));
-
- }
-
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/controller/RenkanControllerTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-package org.iri_research.renkan.test.controller;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.http.MediaType;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.context.WebApplicationContext;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = { "controller-context.xml",
- "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
-public class RenkanControllerTest {
-
- private final static int SPACE_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(RenkanControllerTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
- @Autowired
- private NodesRepository nodesRepository;
- @Autowired
- private EdgesRepository edgesRepository;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- private ArrayList<Project> testProjects = new ArrayList<>();
- private ArrayList<Node> testNodes = new ArrayList<>();
- private ArrayList<Edge> testEdges = new ArrayList<>();
-
- @Autowired
- private WebApplicationContext context;
- private MockMvc mvc;
-
- private void clean() {
- edgesRepository.deleteAll();
- nodesRepository.deleteAll();
- projectsRepository.deleteAll();
- spacesRepository.deleteAll();
- }
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- this.clean();
-
- ArrayList<Project> pl = new ArrayList<Project>();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- pl.add(new Project(testSpace.getId(), UUID.randomUUID()
- .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
- "desc" + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1), creationDate));
- }
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- Project testProject = pl.get(0);
-
- for (int i = 0; i < 3; i++) {
- Node node = new Node("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/nodes/node" + i, "#ffff0" + i,
- "test_user", new Point(0, i),
- "http://renkan.org/images/node" + i, i, testProject.getId());
- node = this.nodesRepository.save(node);
- testProject.getNodes().add(node);
- this.testNodes.add(node);
- }
-
- for (int i = 0; i < 3; i++) {
- Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/edges/edge" + i, "#ffff0" + i,
- this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
- "test_user", testProject.getId());
- edge = this.edgesRepository.save(edge);
- testProject.getEdges().add(edge);
- this.testEdges.add(edge);
- }
-
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
- this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
- }
-
-
- @After
- public void teardown() {
- this.clean();
- }
-
- @Test
- public void testExportProject() throws Exception {
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
- MvcResult res = this.mvc.perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
- .andReturn();
-
- logger.debug("testExportProject resp : "
- + res.getResponse().getContentAsString());
- }
-
- @Test
- public void testExportProjectContent() throws Exception {
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
- MvcResult res = this.mvc.perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
- .andExpect(MockMvcResultMatchers.jsonPath("title").exists())
- .andExpect(MockMvcResultMatchers.jsonPath("title").value("test1"))
- .andExpect(MockMvcResultMatchers.jsonPath("description").exists())
- .andExpect(MockMvcResultMatchers.jsonPath("description").value("desc1"))
- .andExpect(MockMvcResultMatchers.jsonPath("nodes").isArray())
- .andExpect(MockMvcResultMatchers.jsonPath("edges").isArray())
- .andReturn();
-
- logger.debug("testExportProjectContent resp : "
- + res.getResponse().getContentAsString());
- }
-
-
- @Test
- public void testExportProjectExclude() throws Exception {
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders.get("/p/exp/"+this.testProjects.get(0).getId());
- MvcResult res = this.mvc.perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON))
- .andExpect(MockMvcResultMatchers.jsonPath("id").doesNotExist())
- .andExpect(MockMvcResultMatchers.jsonPath("nodes[*].id").doesNotExist())
- .andExpect(MockMvcResultMatchers.jsonPath("nodes[*].@id").exists())
- .andExpect(MockMvcResultMatchers.jsonPath("edges[*].id").doesNotExist())
- .andReturn();
-
- logger.debug("testExportProjectContentExclude resp : "
- + res.getResponse().getContentAsString());
- }
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/controller/SpacesAdminControllerTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,557 +0,0 @@
-package org.iri_research.renkan.test.controller;
-
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.joda.time.DateTime;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.util.NestedServletException;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = { "controller-context.xml",
- "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
-public class SpacesAdminControllerTest {
-
- private final static int SPACE_NB = 3;
-
- private Logger logger = LoggerFactory.getLogger(SpacesAdminControllerTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
-
- @Autowired
- private WebApplicationContext context;
- private MockMvc mvc;
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
-
- ArrayList<Project> pl = new ArrayList<Project>();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- pl.add(new Project(testSpace.getId(), UUID.randomUUID()
- .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
- "desc" + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1), creationDate));
- }
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
- this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- }
-
- @Test
- public void testSpacePostUpdate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("id", this.spacesUuids.get(0));
- post = post.param("title", "New title");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
-
- Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
-
- Assert.assertNotNull("Should find space", sp);
- Assert.assertEquals("Title equals", "New title", sp.getTitle());
- Assert.assertEquals("Description equals", "New description",
- sp.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri());
- Assert.assertEquals("Color equals", "#ffffff", sp.getColor());
- Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig());
-
- }
-
- @Test
- public void testSpacePostCreate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("title", "New title");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
-
- Assert.assertEquals("Must have one more space", SPACE_NB + 1,
- this.spacesRepository.count());
-
- for (Space sp : this.spacesRepository.findAll()) {
- if (this.spacesList.containsKey(sp.getId())) {
- continue;
- } else {
- Assert.assertNotNull("Should find space", sp);
- Assert.assertEquals("Title equals", "New title", sp.getTitle());
- Assert.assertEquals("Description equals", "New description",
- sp.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", sp.getUri());
- Assert.assertEquals("Color equals", "#ffffff", sp.getColor());
- Assert.assertEquals("BinConfig equals", "{}", sp.getBinConfig());
- Assert.assertTrue(
- "id sould match uuid regex",
- sp.getId()
- .matches(
- "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
- Assert.assertNotNull("Date created should be not null",
- sp.getCreated());
- }
- }
- }
-
- @Test
- public void testSpacePostUpdateEmptyTitle() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("id", this.spacesUuids.get(0));
- post = post.param("title", "");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "title"));
-
- Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
-
- Assert.assertNotNull("Should find space", sp);
- Assert.assertEquals("Title equals", "test 0", sp.getTitle());
-
- }
-
- @Test
- public void testSpacePostCreateEmptyTitle() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("title", "");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "title"));
-
- Assert.assertEquals("Must not have one more space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
- @Test
- public void testSpacePostUpdateBadJson() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("id", this.spacesUuids.get(0));
- post = post.param("title", "New Title");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "binConfig"));
-
- Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
-
- Assert.assertNotNull("Should find space", sp);
- Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig());
-
- }
-
- @Test
- public void testSpacePostCreateBadJson() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("title", "New Title");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "binConfig"));
-
- Assert.assertEquals("Must not have one more space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
- @Test
- public void testSpacePostUpdateAllErrors() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("id", this.spacesUuids.get(0));
- post = post.param("title", "");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "{");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(2))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "title"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "binConfig"));
-
- Space sp = this.spacesRepository.findOne(this.spacesUuids.get(0));
-
- Assert.assertNotNull("Should find space", sp);
- Assert.assertEquals("Bin config equals", "{}", sp.getBinConfig());
- Assert.assertEquals("title equals", "test 0", sp.getTitle());
-
- }
-
- @Test
- public void testSpacePostCreateAllErrors() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/save");
- post = post.param("title", "");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("binConfig", "}");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/spaceEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(2))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasErrors(
- "space"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "title"))
- .andExpect(
- MockMvcResultMatchers.model().attributeHasFieldErrors(
- "space", "binConfig"));
-
- Assert.assertEquals("Must not have one more space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
- @Test
- public void testDeleteSpace() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/spaces/delete/"
- + this.spacesUuids.get(SPACE_NB - 1));
-
- MvcResult res = this.mvc
- .perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(
- MockMvcResultMatchers.view().name(
- "admin/spaceDeleteConfirm"))
- .andExpect(
- MockMvcResultMatchers.model().attributeExists(
- "spaceObj", "key", "salt")).andReturn();
-
- Map<String, Object> model = res.getModelAndView().getModel();
-
- Space space = (Space) model.get("spaceObj");
- Assert.assertNotNull("Space is not null", space);
- Assert.assertEquals("Must be first space id",
- this.spacesUuids.get(SPACE_NB - 1), space.getId());
-
- String key = (String) model.get("key");
- Assert.assertNotNull("key is not null", key);
-
- String salt = (String) model.get("salt");
- Assert.assertNotNull("salt is not null", salt);
-
- Assert.assertTrue("Key must be checked", space.checkKey(key, salt));
-
- }
-
- @Test
- public void testDeleteFakeSpace() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/spaces/delete/" + UUID.randomUUID().toString());
-
- try {
- this.mvc.perform(get).andExpect(
- MockMvcResultMatchers.status().isNotFound());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.NOT_FOUND,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- }
-
- @Test
- public void testDeleteSpaceProject() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/spaces/delete/" + this.spacesUuids.get(0));
-
- try {
- this.mvc.perform(get).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- }
-
- @Test
- public void testDoDeleteSpaceNoKey() throws Exception {
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/spaces/delete/"
- + this.spacesUuids.get(SPACE_NB - 1));
-
- try {
- this.mvc.perform(post).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- Assert.assertEquals("Must have same nb of space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
- @Test
- public void testDoDeleteSpace() throws Exception {
-
- Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = space.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/spaces/delete/%s?key=%s&salt=%s",
- this.spacesUuids.get(SPACE_NB - 1), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
-
- Assert.assertEquals("Must have one less space", SPACE_NB - 1,
- this.spacesRepository.count());
-
- space = this.spacesRepository.findOne(this.spacesUuids
- .get(SPACE_NB - 1));
-
- Assert.assertNull("Space " + this.spacesUuids.get(SPACE_NB - 1)
- + " deleted", space);
-
- }
-
- @Test
- public void testDoDeleteSpaceFake() throws Exception {
-
- Space space = this.spacesList.get(this.spacesUuids.get(SPACE_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = space.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/spaces/delete/%s?key=%s&salt=%s",
- UUID.randomUUID(), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/spaces?version=NULL"));
-
- Assert.assertEquals("Must have the same nb of space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
- @Test
- public void testDoDeleteSpaceProject() throws Exception {
-
- Space space = this.spacesList.get(this.spacesUuids.get(0));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = space.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/spaces/delete/%s?key=%s&salt=%s",
- this.spacesUuids.get(0), key, salt));
-
- try {
- this.mvc.perform(post).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- Assert.assertEquals("Must have the same nb of space", SPACE_NB,
- this.spacesRepository.count());
-
- }
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/controller/UsersAdminControllerTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,549 +0,0 @@
-package org.iri_research.renkan.test.controller;
-
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import org.apache.commons.codec.binary.Hex;
-import org.iri_research.renkan.models.Group;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.models.User;
-import org.iri_research.renkan.repositories.GroupsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.repositories.UsersRepository;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.springframework.test.web.servlet.MockMvc;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.util.NestedServletException;
-
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@WebAppConfiguration
-@ContextConfiguration(locations = { "controller-context.xml",
- "file:src/main/webapp/WEB-INF/spring-servlet.xml" })
-public class UsersAdminControllerTest {
-
- private final static int SPACE_NB = 3;
- private final static int USER_NB = 3;
- private final static int GROUP_NB = 4;
-
- private Logger logger = LoggerFactory.getLogger(UsersAdminControllerTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
- @Autowired
- private ProjectsRepository projectsRepository;
- @Autowired
- private UsersRepository usersRepository;
- @Autowired
- private GroupsRepository groupsRepository;
-
-
- @Autowired
- private PasswordEncoder renkanPasswordEncoder;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>(SPACE_NB);
- private List<String> spacesUuids = new ArrayList<>(SPACE_NB);
-
- private ArrayList<Project> testProjects = new ArrayList<Project>();
-
- private Map<String, User> usersList = new HashMap<String, User>(USER_NB);
- private List<String> usersUuids = new ArrayList<>(USER_NB);
-
- private Map<String, Group> groupsList = new HashMap<String, Group>(GROUP_NB);
- private List<String> groupsUuids = new ArrayList<>(GROUP_NB);
-
- @Autowired
- private WebApplicationContext context;
- private MockMvc mvc;
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- usersRepository.deleteAll();
-
- for(int i=0; i < USER_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- User user = new User(uuid, "user" + i, "User nb " + i, "http://www.iri.centrepompidou.fr", "#ababab");
- user.setLocked(false);
- user.setEnabled(true);
- user.setAvatar("A pretty picture");
- user.setExpirationDate(new LocalDate());
- user.setCredentialsExpirationDate(new LocalDate());
- user.setEmail(String.format("user%d@mail.com", i));
- user = usersRepository.save(user);
- this.usersUuids.add(uuid);
- this.usersList.put(uuid, user);
- }
-
- for(int i=0; i < GROUP_NB; i++) {
- String uuid = UUID.randomUUID().toString();
- Group group = new Group(uuid, "group" + i, "Group nb " + i, "http://www.iri.centrepompidou.fr/group/"+uuid, "#ababab");
- group.setAvatar("A pretty group picture " + i);
- group = groupsRepository.save(group);
- this.groupsUuids.add(uuid);
- this.groupsList.put(uuid, group);
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- }
-
- ArrayList<Project> pl = new ArrayList<Project>();
- for (int i = 0; i < SPACE_NB; i++) {
- DateTime creationDate = new DateTime();
- String uuid = UUID.randomUUID().toString();
- spacesUuids.add(uuid);
- Space testSpace = new Space(uuid, "test " + i, "Test space " + 1,
- "{}", "http://ldt.iri.centrepompidou.fr", "#ababab",
- "test_user", "http://ldt.iri.centrepompidou.fr",
- creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(uuid, testSpace);
- for (int j = 0; j < SPACE_NB - 1 - i; j++) {
- Project p = new Project(testSpace.getId(), UUID.randomUUID()
- .toString(), "test" + ((SPACE_NB - 1) * i + j + 1),
- "desc" + ((SPACE_NB - 1) * i + j + 1),
- "http://localhost:8080/rest/projects/id"
- + ((SPACE_NB - 1) * i + j + 1), creationDate);
- p.addUser(this.usersList.get(this.usersUuids.get(0)));
- pl.add(p);
- }
- try {
- Thread.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
- for (Project p : projectsRepository.save(pl)) {
- this.testProjects.add(p);
- }
-
-
-
- this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- projectsRepository.deleteAll();
- usersRepository.deleteAll();
- }
-
- @Test
- public void testUserPostUpdate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save");
- post = post.param("id", this.usersUuids.get(0));
- post = post.param("title", "New name");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
-
- User user = this.usersRepository.findOne(this.usersUuids.get(0));
-
- Assert.assertNotNull("Should find user", user);
- Assert.assertEquals("Title equals", "New name", user.getTitle());
- Assert.assertEquals("Description equals", "New description",
- user.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
- Assert.assertEquals("Color equals", "#ffffff", user.getColor());
- }
-
- @Test
- public void testUserPostCreate() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save")
- .param("title", "New name")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("expirationDate","2007-11-24")
- .param("credentialsExpirationDate","2009-11-29")
- .param("password", "test")
- .param("passwordConfirm", "test");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
-
- Assert.assertEquals("Must have one more space", USER_NB + 1,
- this.usersRepository.count());
-
- for (User user : this.usersRepository.findAll()) {
- if (this.usersList.containsKey(user.getId())) {
- continue;
- }
- else {
- Assert.assertNotNull("Should find user", user);
- Assert.assertEquals("Title equals", "New name", user.getTitle());
- Assert.assertEquals("Description equals", "New description",
- user.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
- Assert.assertEquals("Color equals", "#ffffff", user.getColor());
- Assert.assertTrue(
- "id sould match uuid regex",
- user.getId()
- .matches(
- "[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}"));
- Assert.assertTrue("password must match \"test\"", renkanPasswordEncoder.matches("test", user.getPassword()));
- Assert.assertEquals(new LocalDate(2007, 11, 24), user.getExpirationDate());
- }
- }
- }
-
- @Test
- public void testUserPostUpdateEmptyTitle() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save")
- .param("id", this.usersUuids.get(0))
- .param("title", "")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("expirationDate","2007-11-24")
- .param("credentialsExpirationDate","2009-11-29")
- .param("password", "test")
- .param("passwordConfirm", "test");
-
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "title"));
-
- User user = this.usersRepository.findOne(this.usersUuids.get(0));
-
- Assert.assertNotNull("Should find user", user);
- Assert.assertEquals("name equals", "user0", user.getTitle());
-
- Assert.assertEquals("name equals", "User nb 0", user.getDescription());
-
- }
-
- @Test
- public void testUserPostCreateEmptyName() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save")
- .param("title", "")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("expirationDate","2007-11-24")
- .param("credentialsExpirationDate","2009-11-29")
- .param("password", "test")
- .param("passwordConfirm", "test");
-
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "title"));
-
- Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
-
- }
-
- @Test
- public void testUserPostCreateBadPassword() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save")
- .param("title", "user")
- .param("description", "New description")
- .param("uri", "http://ldt.iri.centrepompidou.fr/new/uri")
- .param("color", "#ffffff")
- .param("expirationDate","2007-11-24")
- .param("credentialsExpirationDate","2009-11-29")
- .param("password", "test")
- .param("passwordConfirm", "test2");
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(MockMvcResultMatchers.view().name("admin/userEdit"))
- .andExpect(MockMvcResultMatchers.model().hasErrors())
- .andExpect(MockMvcResultMatchers.model().errorCount(1))
- .andExpect(MockMvcResultMatchers.model().attributeHasErrors("user"))
- .andExpect(MockMvcResultMatchers.model().attributeHasFieldErrors("user", "password"));
-
- Assert.assertEquals("Must not have one more user", USER_NB,this.usersRepository.count());
-
- }
-
- @Test
- public void testDeleteUser() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/users/delete/"
- + this.usersUuids.get(USER_NB - 1));
-
- MvcResult res = this.mvc
- .perform(get)
- .andExpect(MockMvcResultMatchers.status().isOk())
- .andExpect(
- MockMvcResultMatchers.view().name(
- "admin/userDeleteConfirm"))
- .andExpect(
- MockMvcResultMatchers.model().attributeExists(
- "userObj", "key", "salt")).andReturn();
-
- Map<String, Object> model = res.getModelAndView().getModel();
-
- User user = (User) model.get("userObj");
- Assert.assertNotNull("User is not null", user);
- Assert.assertEquals("Must be first user id",
- this.usersUuids.get(USER_NB - 1), user.getId());
-
- String key = (String) model.get("key");
- Assert.assertNotNull("key is not null", key);
-
- String salt = (String) model.get("salt");
- Assert.assertNotNull("salt is not null", salt);
-
- Assert.assertTrue("Key must be checked", user.checkKey(key, salt));
-
- }
-
- @Test
- public void testDeleteFakeUser() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/users/delete/" + UUID.randomUUID().toString());
-
- try {
- this.mvc.perform(get).andExpect(
- MockMvcResultMatchers.status().isNotFound());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.NOT_FOUND,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- }
-
- @Test
- public void testDeleteUserProject() throws Exception {
-
- MockHttpServletRequestBuilder get = MockMvcRequestBuilders
- .get("/admin/users/delete/" + this.usersUuids.get(0));
-
- try {
- this.mvc.perform(get).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- }
-
- @Test
- public void testDoDeleteUserNoKey() throws Exception {
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/delete/"
- + this.usersUuids.get(USER_NB - 1));
-
- try {
- this.mvc.perform(post).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- Assert.assertEquals("Must have same nb of user", USER_NB,
- this.usersRepository.count());
-
- }
-
- @Test
- public void testDoDeleteUser() throws Exception {
-
- User user = this.usersList.get(this.usersUuids.get(USER_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = user.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/users/delete/%s?key=%s&salt=%s",
- this.usersUuids.get(USER_NB - 1), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
-
- Assert.assertEquals("Must have one less user", USER_NB - 1,
- this.usersRepository.count());
-
- user = this.usersRepository.findOne(this.usersUuids
- .get(USER_NB - 1));
-
- Assert.assertNull("User " + this.usersUuids.get(USER_NB - 1)
- + " deleted", user);
-
- }
-
- @Test
- public void testDoDeleteSpaceFake() throws Exception {
-
- User user = this.usersList.get(this.usersUuids.get(USER_NB - 1));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = user.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/users/delete/%s?key=%s&salt=%s",
- UUID.randomUUID(), key, salt));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
-
- Assert.assertEquals("Must have the same nb of user", USER_NB,
- this.usersRepository.count());
-
- }
-
- @Test
- public void testDoDeleteUserProject() throws Exception {
-
- User user = this.usersList.get(this.usersUuids.get(0));
-
- SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
- rand.setSeed(System.currentTimeMillis());
- byte[] rawSalt = new byte[50];
- rand.nextBytes(rawSalt);
- String salt = Hex.encodeHexString(rawSalt);
- String key = user.getKey(salt);
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders.post(String
- .format("/admin/users/delete/%s?key=%s&salt=%s",
- this.usersUuids.get(0), key, salt));
-
- try {
- this.mvc.perform(post).andExpect(
- MockMvcResultMatchers.status().isBadRequest());
- } catch (NestedServletException e) {
- Assert.assertNotNull("Nested exception must not be null",
- e.getCause());
- Assert.assertEquals(
- "Inner exception must be a HttpClientErrorException",
- HttpClientErrorException.class, e.getCause().getClass());
- Assert.assertEquals("Exception error status must be not found",
- HttpStatus.BAD_REQUEST,
- ((HttpClientErrorException) e.getCause()).getStatusCode());
- }
-
- Assert.assertEquals("Must have the same nb of user", USER_NB,
- this.usersRepository.count());
-
- }
-
- @Test
- public void testUpdateUserGroups() throws Exception {
-
- MockHttpServletRequestBuilder post = MockMvcRequestBuilders
- .post("/admin/users/save");
- post = post.param("id", this.usersUuids.get(0));
- post = post.param("title", "New name");
- post = post.param("description", "New description");
- post = post.param("uri", "http://ldt.iri.centrepompidou.fr/new/uri");
- post = post.param("color", "#ffffff");
- post = post.param("groups", this.groupsUuids.toArray(new String[UsersAdminControllerTest.GROUP_NB]));
-
- this.mvc.perform(post)
- .andExpect(MockMvcResultMatchers.status().isSeeOther())
- .andExpect(MockMvcResultMatchers.redirectedUrl("/admin/users?version=NULL"));
-
- User user = this.usersRepository.findOne(this.usersUuids.get(0));
-
- Assert.assertNotNull("Should find user", user);
- Assert.assertEquals("Title equals", "New name", user.getTitle());
- Assert.assertEquals("Description equals", "New description",
- user.getDescription());
- Assert.assertEquals("Uri equals",
- "http://ldt.iri.centrepompidou.fr/new/uri", user.getUri());
- Assert.assertEquals("Color equals", "#ffffff", user.getColor());
-
- Assert.assertNotNull("Groups must be set", user.getGroups());
- Assert.assertEquals("all users must be set", GROUP_NB, user.getGroups().size());
- Assert.assertTrue("users list must contains all users", this.groupsUuids.containsAll(user.getGroups()));
-
- }
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/rest/DeserializationTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-package org.iri_research.renkan.test.rest;
-
-import java.io.IOException;
-
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.rest.ObjectMapperProvider;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("models-context.xml")
-public class DeserializationTest {
-
- private Logger logger = LoggerFactory.getLogger(DeserializationTest.class);
-
- @Autowired
- private ObjectMapperProvider objectMapperProvider;
-
- private String testJSON = "{\n" +
- " \"users\": [],\n" +
- " \"nodes\": [\n" +
- " {\n" +
- " \"title\": \"node0\",\n" +
- " \"uri\": \"\",\n" +
- " \"description\": \"This is node 0\",\n" +
- " \"position\": {\n" +
- " \"x\": -90.5,\n" +
- " \"y\": 235\n" +
- " },\n" +
- " \"image\": null,\n" +
- " \"color\": null,\n" +
- " \"created_by\": null,\n" +
- " \"size\": 0,\n" +
- " \"@id\": \"224d9578-d2a2-4d7d-ae04-9a674a0ecd08\"\n" +
- " },\n" +
- " {\n" +
- " \"title\": \"node1\",\n" +
- " \"uri\": \"\",\n" +
- " \"description\": \"This is node 1\",\n" +
- " \"position\": {\n" +
- " \"x\": -429.5984204131227,\n" +
- " \"y\": 98.65856622114218\n" +
- " },\n" +
- " \"image\": null,\n" +
- " \"color\": null,\n" +
- " \"created_by\": null,\n" +
- " \"size\": 0,\n" +
- " \"@id\": \"1b73ea10-e557-443e-b73d-dc00fb63d60c\"\n" +
- " },\n" +
- " {\n" +
- " \"title\": \"node2\",\n" +
- " \"uri\": \"\",\n" +
- " \"description\": \"This is node 2\",\n" +
- " \"position\": {\n" +
- " \"x\": -496.5,\n" +
- " \"y\": -86\n" +
- " },\n" +
- " \"image\": null,\n" +
- " \"color\": null,\n" +
- " \"created_by\": null,\n" +
- " \"size\": 0,\n" +
- " \"@id\": \"af5e97b0-2692-4dd2-8726-75a02cf40dff\"\n" +
- " }\n" +
- " ],\n" +
- " \"edges\": [\n" +
- " {\n" +
- " \"title\": \"edge0\",\n" +
- " \"uri\": \"\",\n" +
- " \"description\": \"This is edge 0\",\n" +
- " \"from\": \"af5e97b0-2692-4dd2-8726-75a02cf40dff\",\n" +
- " \"to\": \"1b73ea10-e557-443e-b73d-dc00fb63d60c\",\n" +
- " \"color\": null,\n" +
- " \"created_by\": null\n" +
- " }\n" +
- " ],\n" +
- " \"title\": \"Test Deserialization\",\n" +
- " \"description\": \"Description test deserialization.\",\n" +
- " \"uri\": null,\n" +
- " \"color\": \"#ffff01\",\n" +
- " \"revCounter\": 94,\n" +
- " \"created\": 1385377361448,\n" +
- " \"updated\": 1400568565070\n" +
- "}";
-
- @Before
- public void setup() {
- logger.debug("Setup");
- }
-
- @Test
- public void testDeserialization() throws JsonParseException, JsonMappingException, IOException {
-
- ObjectMapper mapper = this.objectMapperProvider.getContext(ObjectMapper.class);
-
- Project p = mapper.readValue(testJSON, Project.class);
-
- Assert.assertNotNull(p);
- Assert.assertEquals("Title must be the same", "Test Deserialization", p.getTitle());
- Assert.assertEquals("Description must be the same", "Description test deserialization.", p.getDescription());
-
- Assert.assertEquals("Must have 3 nodes", 3, p.getNodes().size());
- Assert.assertEquals("Must have 1 edge", 1, p.getEdges().size());
-
- Assert.assertEquals("Edge goes from node node2", "node2", p.getEdges().get(0).getFromNode().getTitle() );
- Assert.assertEquals("Edge goes to node node1", "node1", p.getEdges().get(0).getToNode().getTitle() );
- }
-
- @Test
- public void testDeserializationId() throws JsonParseException, JsonMappingException, IOException {
-
- ObjectMapper mapper = this.objectMapperProvider.getContext(ObjectMapper.class);
-
- Project p = mapper.readValue(testJSON, Project.class);
-
- Assert.assertNotNull("Project is null",p);
- Assert.assertNotNull("Project Id is null", p.getId());
-
- for (Node n : p.getNodes()) {
- Assert.assertNotNull("Id of node must not be null", n.getId());
- }
- for (Edge e : p.getEdges()) {
- Assert.assertNotNull("Id of edge must not be null", e.getId());
- }
- }
-
- @After
- public void teardown() {
- }
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/rest/ProjectRestTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,317 +0,0 @@
-package org.iri_research.renkan.test.rest;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.commons.io.IOUtils;
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.test.JerseyTest;
-import org.iri_research.renkan.models.Edge;
-import org.iri_research.renkan.models.Node;
-import org.iri_research.renkan.models.Project;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.EdgesRepository;
-import org.iri_research.renkan.repositories.NodesRepository;
-import org.iri_research.renkan.repositories.ProjectRevisionsRepository;
-import org.iri_research.renkan.repositories.ProjectsRepository;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.rest.RestApplication;
-import org.joda.time.DateTime;
-import org.joda.time.format.ISODateTimeFormat;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.mongodb.core.MongoTemplate;
-import org.springframework.data.mongodb.core.geo.Point;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-import com.mongodb.BasicDBObject;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-
-//import com.sun.jersey.spi.spring.container.servlet.SpringServlet;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("rest-context.xml")
-public class ProjectRestTest extends JerseyTest {
-
- private Logger logger = LoggerFactory.getLogger(ProjectRestTest.class);
-
- @Autowired
- private ProjectsRepository projectsRepository;
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- @Autowired
- private NodesRepository nodesRepository;
-
- @Autowired
- private EdgesRepository edgesRepository;
-
- @Autowired
- private ProjectRevisionsRepository projectRevisionsRepository;
-
- @Autowired
- private MongoTemplate mongoTemplate;
-
- private Project testProject;
- private List<Node> testNodes = new ArrayList<Node>();
- private List<Edge> testEdges = new ArrayList<>();
-
- private DateTime creationDate = new DateTime();
-
- private String spaceId = UUID.randomUUID().toString();
- private String projectId = UUID.randomUUID().toString();
-
- private File tempFile = null;
-
- private ObjectMapper getObjectMapper() {
- ObjectMapper mapper = new ObjectMapper();
- mapper.registerModule(new JodaModule());
- return mapper;
- }
-
- public ProjectRestTest() {
- }
-
- // @Override
- // protected AppDescriptor configure() {
- // return new WebAppDescriptor.Builder("org.iri_research.renkan.rest")
- // .contextPath("rest")
- // .contextParam("contextConfigLocation",
- // "classpath:/org/iri_research/renkan/test/rest/rest-context.xml")
- // .initParam("com.sun.jersey.config.property.packages",
- // "org.iri_research.renkan.rest")
- // .servletClass(SpringServlet.class)
- // .contextListenerClass(ContextLoaderListener.class)
- // .build();
- // };
-
- @Override
- protected Application configure() {
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- ResourceConfig rc = new RestApplication()
- .property("contextConfigLocation",
- "classpath:/org/iri_research/renkan/test/rest/rest-context.xml");
- rc.setApplicationName("rest");
- return rc;
- };
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- Space testSpace = new Space(this.spaceId, "test space", "Test space",
- null, null, null, "test_user", null, this.creationDate);
- testSpace = spacesRepository.save(testSpace);
- testProject = new Project(testSpace.getId(), this.projectId, "test", "desc",
- "http://localhost:8080/rest/projects/id", this.creationDate);
-
- for (int i = 0; i < 3; i++) {
- Node node = new Node("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/nodes/node" + i, "#ffff0" + i,
- "test_user", new Point(0, i),
- "http://renkan.org/images/node" + i, i, testProject.getId());
- node = this.nodesRepository.save(node);
- testProject.getNodes().add(node);
- this.testNodes.add(node);
- }
-
- for (int i = 0; i < 3; i++) {
- Edge edge = new Edge("Node" + i, "Node" + i, "Node " + i,
- "http://renkan.org/edges/edge" + i, "#ffff0" + i,
- this.testNodes.get((i + 2) % 3), this.testNodes.get(i),
- "test_user", testProject.getId());
- edge = this.edgesRepository.save(edge);
- testProject.getEdges().add(edge);
- this.testEdges.add(edge);
- }
-
- this.projectsRepository.save(testProject);
- try {
- this.tempFile = File.createTempFile("export_json", ".json");
- }
- catch (IOException e) {
- e.printStackTrace();
- }
-
- }
-
- @After
- public void teardown() {
- logger.debug("Teardown");
- edgesRepository.deleteAll();
- nodesRepository.deleteAll();
- projectRevisionsRepository.deleteAll();
- projectsRepository.deleteAll();
- spacesRepository.deleteAll();
- if(this.tempFile != null) {
- this.tempFile.deleteOnExit();
- }
- }
-
- @Test
- public void testGetProject() throws JsonProcessingException, IOException {
- WebTarget webResource = this.target();
- String respString = webResource.path("projects")
- .path(testProject.getId()).request().acceptEncoding("UTF-8").accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
- Assert.assertNotNull("get resp String not empty", respString);
- Assert.assertFalse("get resp String non empty", respString.isEmpty());
-
- PrintWriter writer = new PrintWriter(this.tempFile, "UTF-8");
- writer.write(respString);
- writer.close();
-
- logger.debug("Test get Project : respString : " + respString);
-
- ObjectMapper mapper = this.getObjectMapper();
-
- JsonNode projectNode = mapper.readTree(respString);
-
- Assert.assertNotNull("project node not null", projectNode);
-
- Assert.assertNotNull("Must have an id", projectNode.get("id"));
- Assert.assertEquals("id must match", this.projectId, projectNode.get("id").asText());
- Assert.assertNotNull("Must have a created date", projectNode.get("created"));
- Assert.assertEquals("creation date must match", this.creationDate.toString(ISODateTimeFormat.dateTime()), projectNode.get("created").asText());
- }
-
- @Test
- public void testDeleteProject() {
-
- List<Node> nodes = testProject.getNodes();
- List<Edge> edges = testProject.getEdges();
-
- WebTarget webResource = this.target();
- String respString = webResource.path("projects")
- .path(testProject.getId()).request().delete(String.class);
-
- Assert.assertTrue("Response text must contain deleted",
- respString.contains("deleted"));
- Assert.assertTrue("Response text must contain id",
- respString.contains(this.testProject.getId()));
-
- DBObject filter = new BasicDBObject();
- filter.put("_id", testProject.getId());
-
- DBCollection coll = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Project.class));
- DBCursor resFind = coll.find(filter);
-
- Assert.assertEquals("The project must not be found", 0, resFind.count());
-
- filter = new BasicDBObject();
- filter.put("project_id", testProject.getId());
-
- DBCollection nodesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Node.class));
- resFind = nodesColl.find(filter);
-
- Assert.assertEquals("no nodes left", 0, resFind.count());
-
- for (Node n : nodes) {
- DBObject nobj = nodesColl.findOne(n.getId());
- Assert.assertNull("node should be deleted", nobj);
- }
-
- DBCollection edgesColl = mongoTemplate.getCollection(mongoTemplate
- .getCollectionName(Edge.class));
- resFind = edgesColl.find(filter);
-
- Assert.assertEquals("no edges left", 0, resFind.count());
-
- for (Edge e : edges) {
- DBObject eobj = edgesColl.findOne(e.getId());
- Assert.assertNull("edge should be deleted", eobj);
- }
-
- }
-
- @Test
- public void testPostProject() throws IOException {
- InputStream in = this.getClass().getResourceAsStream("/org/iri_research/renkan/test/rest/test-project.json");
- StringWriter sw = new StringWriter();
- IOUtils.copy(in, sw, "utf-8");
-
- String jsonStr = sw.toString().replaceAll("\\<space_id\\>", this.spaceId);
-
- WebTarget webResource = this.target();
- Response resp = webResource.path("projects").request(MediaType.APPLICATION_JSON).post(Entity.entity(jsonStr, MediaType.APPLICATION_JSON), Response.class);
-
- Assert.assertEquals("Status must be OK", 201, resp.getStatus());
-
- ObjectMapper mapper = new ObjectMapper();
- JsonNode node = mapper.readTree(resp.readEntity(String.class));
-
- Assert.assertNotNull("Must have a project in response", node);
-
- JsonNode idNode = node.findValue("id");
- Assert.assertNotNull("Project must have an id", idNode);
- String id = idNode.asText();
- Assert.assertNotNull("Project must have an id not null", id);
- Assert.assertNotEquals("Project must have an id not empty", "", id);
-
- Iterator<JsonNode> edges = node.get("edges").elements();
- int totalEdges = 0;
- while(edges.hasNext()) {
- ObjectNode edgeNode = (ObjectNode) edges.next();
- totalEdges++;
- JsonNode edgeIdNode = edgeNode.get("id");
- Assert.assertNotNull("Edge must have an id", edgeIdNode);
- String edgeId = edgeIdNode.asText();
- Assert.assertNotNull("Edge must have an id not null",edgeId);
- Assert.assertNotEquals("Edge must have an id not empty", "", edgeId);
- JsonNode projIdNode = edgeNode.findValue("project_id");
- Assert.assertNotNull("Edge project id node not null",projIdNode);
- Assert.assertNotNull("Edge project id not null",projIdNode.asText());
- Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText());
- }
- Assert.assertEquals("Must have one edge", 1, totalEdges);
-
- Iterator<JsonNode> nodes = node.get("nodes").elements();
- int totalNodes = 0;
- while(nodes.hasNext()) {
- ObjectNode nodeNode = (ObjectNode) nodes.next();
- totalNodes++;
- JsonNode nodeIdNode = nodeNode.get("id");
- Assert.assertNotNull("Edge must have an id", nodeIdNode);
- String nodeId = nodeIdNode.asText();
- Assert.assertNotNull("Edge must have an id not null",nodeId);
- Assert.assertNotEquals("Edge must have an id not empty", "", nodeId);
- JsonNode projIdNode = nodeNode.findValue("project_id");
- Assert.assertNotNull("Edge project id node not null",projIdNode);
- Assert.assertNotNull("Edge project id not null",projIdNode.asText());
- Assert.assertEquals("Edge project id must be" + id, id, projIdNode.asText());
- }
- Assert.assertEquals("Must have 2 nodes", 2, totalNodes);
-
- }
-
-}
--- a/server/renkan-web/src/test/java/org/iri_research/renkan/test/rest/SpaceRestTest.java Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,890 +0,0 @@
-package org.iri_research.renkan.test.rest;
-
-import java.io.IOException;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.UUID;
-
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.Application;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.Status;
-
-import org.glassfish.jersey.server.ResourceConfig;
-import org.glassfish.jersey.server.model.Resource;
-import org.glassfish.jersey.test.JerseyTest;
-import org.iri_research.renkan.models.Space;
-import org.iri_research.renkan.repositories.SpacesRepository;
-import org.iri_research.renkan.rest.RestApplication;
-import org.iri_research.renkan.rest.SpacesResource;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormatter;
-import org.joda.time.format.ISODateTimeFormat;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.datatype.joda.JodaModule;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration("rest-context.xml")
-public class SpaceRestTest extends JerseyTest {
-
- private Logger logger = LoggerFactory.getLogger(SpaceRestTest.class);
-
- @Autowired
- private SpacesRepository spacesRepository;
-
- private Map<String, Space> spacesList = new HashMap<String, Space>();
- private String firstSpaceUUID = null;
-
- public SpaceRestTest() {
- }
-
- // @Override
- // protected AppDescriptor configure() {
- // return new WebAppDescriptor.Builder("org.iri_research.renkan.rest")
- // .contextPath("rest")
- // .contextParam("contextConfigLocation",
- // "classpath:/org/iri_research/renkan/test/rest/rest-context.xml")
- // .initParam("com.sun.jersey.config.property.packages",
- // "org.iri_research.renkan.rest")
- // .servletClass(SpringServlet.class)
- // .contextListenerClass(ContextLoaderListener.class)
- // .build();
- // };
-
- @Override
- protected Application configure() {
- TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
- ResourceConfig rc = new RestApplication()
- .property("contextConfigLocation",
- "classpath:/org/iri_research/renkan/test/rest/rest-context.xml");
- rc.setApplicationName("rest");
- return rc;
- };
-
- @Before
- public void setup() {
-
- logger.debug("Setup");
- spacesRepository.deleteAll();
- DateTime creationDate = new DateTime();
- this.firstSpaceUUID = UUID.randomUUID().toString();
- Space testSpace = new Space(firstSpaceUUID, "test", "Test space", "{}",
- "http://ldt.iri.centrepompidou.fr", "#ababab", "test_user",
- "http://ldt.iri.centrepompidou.fr", creationDate);
- testSpace = spacesRepository.save(testSpace);
- this.spacesList.put(firstSpaceUUID, testSpace);
-
- Resource resource = Resource.builder(SpacesResource.class).build();
- String baseUri = resource.getPath();
- logger.debug("Path is " + baseUri);
- for (Resource cres : resource.getChildResources()) {
- logger.debug(cres.getAllMethods().toString() + " at " + baseUri
- + "/" + cres.getPath());
- }
-
- }
-
- @After
- public void teardown() {
- spacesRepository.deleteAll();
- }
-
- @Test
- public void testSetup() throws JsonProcessingException, IOException {
-
- WebTarget webTarget = this.target("spaces");
- String respString = webTarget.request().get(String.class);
-
- Assert.assertNotNull(
- "The response string for the list of spaces must not be null",
- respString);
-
- logger.debug("RESPONSE : " + respString);
-
- Assert.assertTrue(
- "The length of the space list resp. string must be > 0",
- respString.length() > 0);
-
- ObjectMapper mapper = getObjectMapper();
-
- JsonNode spacesList = mapper.readTree(respString);
-
- Assert.assertTrue("The spaceList must be an array",
- spacesList.isArray());
- Assert.assertEquals(
- "The spaceList length must be = " + this.spacesList.size(),
- this.spacesList.size(), spacesList.size());
-
- for (JsonNode jsonNode : spacesList) {
- Assert.assertTrue("the space must have an id",
- jsonNode.hasNonNull("id"));
- String id = jsonNode.get("id").asText();
- Assert.assertTrue("The id must be in the spacesList",
- this.spacesList.containsKey(id));
- Space space = this.spacesList.get(id);
- Assert.assertNotNull(
- "The object must in the spacesList must not be null", space);
-
- }
-
- }
-
- @Test
- public void testTitle() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("_id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a title",
- jsonNode.hasNonNull("title"));
- String title = jsonNode.get("title").asText();
- Assert.assertEquals(
- "space title must be equals to " + space.getTitle(),
- space.getTitle(), title);
- }
-
- }
-
- @Test
- public void testDescription() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a description",
- jsonNode.hasNonNull("description"));
- String description = jsonNode.get("description").asText();
- Assert.assertEquals(
- "space description must be equals to "
- + space.getDescription(), space.getDescription(),
- description);
- }
-
- }
-
- @Test
- public void testUri() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a uri",
- jsonNode.hasNonNull("uri"));
- String uri = jsonNode.get("uri").asText();
- Assert.assertEquals(
- "space uri must be equals to " + space.getUri(),
- space.getUri(), uri);
- }
-
- }
-
- @Test
- public void testColor() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- mapper.registerModule(new JodaModule());
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a color",
- jsonNode.hasNonNull("color"));
- String color = jsonNode.get("color").asText();
- Assert.assertEquals(
- "space color must be equals to " + space.getColor(),
- space.getColor(), color);
- }
-
- }
-
- @Test
- public void testBinConfig() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
-
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a bin_config",
- jsonNode.hasNonNull("bin_config"));
- String binConfig = jsonNode.get("bin_config").asText();
- Assert.assertEquals(
- "space bin_config must be equals to "
- + space.getBinConfig(), space.getBinConfig(),
- binConfig);
- }
-
- }
-
- private ObjectMapper getObjectMapper() {
- ObjectMapper mapper = new ObjectMapper();
- mapper.registerModule(new JodaModule());
- return mapper;
- }
-
- @Test
- public void testCreatedBy() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a created_by",
- jsonNode.hasNonNull("created_by"));
- String createdBy = jsonNode.get("created_by").asText();
- Assert.assertEquals(
- "space created_by must be equals to "
- + space.getCreatedBy(), space.getCreatedBy(),
- createdBy);
- }
-
- }
-
- @Test
- public void testCreated() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a created",
- jsonNode.hasNonNull("created"));
-
- String dateStr = jsonNode.get("created").asText();
-
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime date = fmt.parseDateTime(dateStr);
-
- Assert.assertEquals("Created date must be the same",
- space.getCreated(), date);
-
- }
-
- }
-
- @Test
- public void testImage() throws JsonProcessingException, IOException {
-
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").request()
- .get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode spacesList = mapper.readTree(respString);
-
- for (JsonNode jsonNode : spacesList) {
- String id = jsonNode.get("id").asText();
- Space space = this.spacesList.get(id);
-
- Assert.assertTrue("the space must have a image",
- jsonNode.hasNonNull("image"));
- String image = jsonNode.get("image").asText();
- Assert.assertEquals(
- "space image must be equals to " + space.getImage(),
- space.getImage(), image);
- }
-
- }
-
- @Test
- public void testSingleCreated() throws JsonProcessingException, IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- String id = jsonNode.get("id").asText();
- Assert.assertEquals("id must be equals", space.getId(), id);
-
- Assert.assertTrue("the space must have a created",
- jsonNode.hasNonNull("created"));
-
- String dateStr = jsonNode.get("created").asText();
-
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime date = fmt.parseDateTime(dateStr);
-
- Assert.assertEquals("Created date must be the same",
- space.getCreated(), date);
-
- }
-
- @Test
- public void testSingleTitle() throws JsonProcessingException, IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a title",
- jsonNode.hasNonNull("title"));
- String title = jsonNode.get("title").asText();
- Assert.assertEquals(
- "space title must be equals to " + space.getTitle(),
- space.getTitle(), title);
- }
-
- @Test
- public void testSingleDescription() throws JsonProcessingException,
- IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a description",
- jsonNode.hasNonNull("description"));
- String description = jsonNode.get("description").asText();
- Assert.assertEquals(
- "space description must be equals to " + space.getDescription(),
- space.getDescription(), description);
- }
-
- @Test
- public void testSingleUri() throws JsonProcessingException, IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a uri",
- jsonNode.hasNonNull("uri"));
- String uri = jsonNode.get("uri").asText();
- Assert.assertEquals("space uri must be equals to " + space.getUri(),
- space.getUri(), uri);
- }
-
- @Test
- public void testSingleColor() throws JsonProcessingException, IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a color",
- jsonNode.hasNonNull("color"));
- String color = jsonNode.get("color").asText();
- Assert.assertEquals(
- "space color must be equals to " + space.getColor(),
- space.getColor(), color);
- }
-
- @Test
- public void testSingleBinConfig() throws JsonProcessingException,
- IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a bin_config",
- jsonNode.hasNonNull("bin_config"));
- String binConfig = jsonNode.get("bin_config").asText();
- Assert.assertEquals(
- "space bin_config must be equals to " + space.getBinConfig(),
- space.getBinConfig(), binConfig);
- }
-
- @Test
- public void testSingleCreatedBy() throws JsonProcessingException,
- IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a created_by",
- jsonNode.hasNonNull("created_by"));
- String createdBy = jsonNode.get("created_by").asText();
- Assert.assertEquals(
- "space created_by must be equals to " + space.getCreatedBy(),
- space.getCreatedBy(), createdBy);
- }
-
- @Test
- public void testSingleImage() throws JsonProcessingException, IOException {
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
- WebTarget WebTarget = this.target();
- String respString = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON).get(String.class);
- logger.debug("RESPONSE : " + respString);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(respString);
-
- Assert.assertTrue("the space must have a image",
- jsonNode.hasNonNull("image"));
- String image = jsonNode.get("image").asText();
- Assert.assertEquals(
- "space image must be equals to " + space.getImage(),
- space.getImage(), image);
- }
-
- @Test
- public void testPost() throws JsonProcessingException, IOException {
-
- String title = "test_post";
- String description = "test space post";
- String uri = "http://ldt.iri.centrepompidou.fr/test_post";
- String color = "#bcbcbc";
- String image = "http://ldt.iri.centrepompidou.fr/test_post/image";
- String created = "2013-01-01T01:01:01.001+0000";
- String expectedCreated = "2013-01-01T01:01:01.001Z";
- String bin_config = "{name: 'test_post_config'}";
- String created_by = "test_user_post";
-
- String spaceJson = String.format("{" + "\"title\":\"%s\","
- + "\"description\":\"%s\"," + "\"uri\":\"%s\","
- + "\"color\":\"%s\"," + "\"image\":\"%s\","
- + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
- + "\"created_by\":\"%s\"" + "}", title, description, uri,
- color, image, created, bin_config, created_by);
-
- WebTarget webTarget = this.target();
- Response resp = webTarget.path("spaces").request()
- .accept(MediaType.APPLICATION_JSON)
- .post(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertEquals("Resp status = created : " + respStr,
- Status.CREATED.getStatusCode(), resp.getStatus());
- Assert.assertTrue("Resp must be application/json", resp.getMediaType()
- .isCompatible(MediaType.APPLICATION_JSON_TYPE));
-
- ObjectMapper mapper = getObjectMapper();
- JsonNode objNode = mapper.readTree(respStr);
-
- Assert.assertTrue("the space must have an id", objNode.hasNonNull("id"));
- String idStr = objNode.get("id").asText();
- Assert.assertFalse("The id str must not be empty", idStr.length() == 0);
-
- Assert.assertTrue("the space must have a title",
- objNode.hasNonNull("title"));
- String titleStr = objNode.get("title").asText();
- Assert.assertEquals("space title must be equals to " + title, title,
- titleStr);
-
- Assert.assertTrue("the space must have a description",
- objNode.hasNonNull("description"));
- String descriptionStr = objNode.get("description").asText();
- Assert.assertEquals("space description must be equals to "
- + description, description, descriptionStr);
-
- Assert.assertTrue("the space must have a uri",
- objNode.hasNonNull("uri"));
- String uriStr = objNode.get("uri").asText();
- Assert.assertEquals("space uri must be equals to " + uri, uri, uriStr);
-
- Assert.assertTrue("the space must have a color",
- objNode.hasNonNull("color"));
- String colorStr = objNode.get("color").asText();
- Assert.assertEquals("space color must be equals to " + color, color,
- colorStr);
-
- Assert.assertTrue("the space must have a bin_config",
- objNode.hasNonNull("bin_config"));
- String bin_configStr = objNode.get("bin_config").asText();
- Assert.assertEquals("space bin_config must be equals to " + bin_config,
- bin_config, bin_configStr);
-
- Assert.assertTrue("the space must have a created_by",
- objNode.hasNonNull("created_by"));
- String created_byStr = objNode.get("created_by").asText();
- Assert.assertEquals("space created_by must be equals to " + created_by,
- created_by, created_byStr);
-
- Assert.assertTrue("the space must have a created",
- objNode.hasNonNull("created"));
- String createdStr = objNode.get("created").asText();
- Assert.assertEquals("space created must be equals to " + expectedCreated,
- expectedCreated, createdStr);
-
- // object must be created
- Space sp = this.spacesRepository.findOne(idStr);
-
- Assert.assertNotNull("Space object must be in rep", sp);
-
- Assert.assertEquals("space title must be equals to " + title, title,
- sp.getTitle());
- Assert.assertEquals("space description must be equals to "
- + description, description, sp.getDescription());
- Assert.assertEquals("space uri must be equals to " + uri, uri,
- sp.getUri());
- Assert.assertEquals("space color must be equals to " + color, color,
- sp.getColor());
- Assert.assertEquals("space bin_config must be equals to " + bin_config,
- bin_config, sp.getBinConfig());
- Assert.assertEquals("space created_by must be equals to " + created_by,
- created_by, sp.getCreatedBy());
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime created_date = fmt.parseDateTime(created);
- Assert.assertEquals("space created must be equals to " + created,
- created_date, sp.getCreated());
-
- }
-
- @Test
- public void testPostWithId() {
-
- String id = UUID.randomUUID().toString();
- String title = "test_post";
- String description = "test space post";
- String uri = "http://ldt.iri.centrepompidou.fr/test_post";
- String color = "#bcbcbc";
- String image = "http://ldt.iri.centrepompidou.fr/test_post/image";
- String created = "2013-01-01T01:01:01.001+0000";
- String bin_config = "{name: 'test_post_config'}";
- String created_by = "test_user_post";
-
- String spaceJson = String.format("{" + "\"id\":\"%s\","
- + "\"title\":\"%s\"," + "\"description\":\"%s\","
- + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
- + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
- + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
- color, image, created, bin_config, created_by);
-
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").request()
- .accept(MediaType.APPLICATION_JSON)
- .post(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertEquals("Resp status = Bad Request : " + respStr,
- Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
- Assert.assertEquals("Error message", "Id in JSON must not be set", respStr);
-
- }
-
- @Test
- public void testPut() throws JsonProcessingException, IOException {
-
- String id = this.firstSpaceUUID;
- String title = "test_post";
- String description = "test space put";
- String uri = "http://ldt.iri.centrepompidou.fr/test_put";
- String color = "#bcbcbc";
- String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
- String created = "2013-01-01T01:01:01.001+0000";
- String bin_config = "{name: 'test_put_config'}";
- String created_by = "test_user_put";
-
- String spaceJson = String.format("{" + "\"id\":\"%s\","
- + "\"title\":\"%s\"," + "\"description\":\"%s\","
- + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
- + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
- + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
- color, image, created, bin_config, created_by);
-
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request()// type(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON)// .entity(spaceJson)
- .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
-
- String respStr = "";
-
- if (resp.getStatus() != 204) {
- respStr = resp.readEntity(String.class);
- }
-
- Assert.assertEquals("Resp status = created : " + respStr,
- Status.NO_CONTENT.getStatusCode(), resp.getStatus());
- Assert.assertNull("Resp type must be null", resp.getMediaType());
-
- // object must be updated
- Space sp = this.spacesRepository.findOne(id);
-
- Assert.assertNotNull("Space object must be in rep", sp);
-
- Assert.assertEquals("space title must be equals to " + title, title,
- sp.getTitle());
- Assert.assertEquals("space description must be equals to "
- + description, description, sp.getDescription());
- Assert.assertEquals("space uri must be equals to " + uri, uri,
- sp.getUri());
- Assert.assertEquals("space color must be equals to " + color, color,
- sp.getColor());
- Assert.assertEquals("space bin_config must be equals to " + bin_config,
- bin_config, sp.getBinConfig());
- Assert.assertEquals("space created_by must be equals to " + created_by,
- created_by, sp.getCreatedBy());
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime created_date = fmt.parseDateTime(created);
- Assert.assertEquals("space created must be equals to " + created,
- created_date, sp.getCreated());
-
- }
-
- @Test
- public void testPutWithoutId() {
-
- String title = "test_put";
- String description = "test space put";
- String uri = "http://ldt.iri.centrepompidou.fr/test_put";
- String color = "#bcbcbc";
- String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
- String created = "2013-01-01T01:01:01.001+0000";
- String bin_config = "{name: 'test_put_config'}";
- String created_by = "test_user_put";
-
- String spaceJson = String.format("{" + "\"title\":\"%s\","
- + "\"description\":\"%s\"," + "\"uri\":\"%s\","
- + "\"color\":\"%s\"," + "\"image\":\"%s\","
- + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
- + "\"created_by\":\"%s\"" + "}", title, description, uri,
- color, image, created, bin_config, created_by);
-
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.APPLICATION_JSON)
- .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertEquals("Resp status = Bad Request : " + respStr,
- Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
- Assert.assertEquals("Error message",
- "Id parameter and id in JSON do not match", respStr);
- }
-
- @Test
- public void testPutBadId() {
-
- String id = UUID.randomUUID().toString();
- String title = "test_post";
- String description = "test space put";
- String uri = "http://ldt.iri.centrepompidou.fr/test_put";
- String color = "#bcbcbc";
- String image = "http://ldt.iri.centrepompidou.fr/test_put/image";
- String created = "2013-01-01T01:01:01.001+0000";
- String bin_config = "{name: 'test_put_config'}";
- String created_by = "test_user_put";
-
- String spaceJson = String.format("{" + "\"id\":\"%s\","
- + "\"title\":\"%s\"," + "\"description\":\"%s\","
- + "\"uri\":\"%s\"," + "\"color\":\"%s\"," + "\"image\":\"%s\","
- + "\"created\":\"%s\"," + "\"bin_config\":\"%s\","
- + "\"created_by\":\"%s\"" + "}", id, title, description, uri,
- color, image, created, bin_config, created_by);
-
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(id)
- .request(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON)
- .put(Entity.entity(spaceJson, MediaType.APPLICATION_JSON));
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertEquals("Resp status = Bad Request : " + respStr,
- Status.NOT_FOUND.getStatusCode(), resp.getStatus());
-
- }
-
- @Test
- public void testDelete() {
-
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .request().accept(MediaType.TEXT_PLAIN).delete();
-
- String respStr = resp.readEntity(String.class);
- URI reqUri = WebTarget.getUriBuilder().path("spaces")
- .path(this.firstSpaceUUID).build();
-
- Assert.assertEquals("Status must be deleted : " + respStr,
- Status.OK.getStatusCode(), resp.getStatus());
- Assert.assertEquals(
- String.format("Message must be \"%s deleted\"", reqUri),
- String.format("%s deleted", reqUri), respStr);
-
- // object must be updated
- Space sp = this.spacesRepository.findOne(this.firstSpaceUUID);
-
- Assert.assertNull("Space object must be in rep", sp);
-
- }
-
- @Test
- public void testSingleGetJsonp() throws JsonProcessingException,
- IOException {
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .queryParam("callback", "callback_func").request()
- .accept("application/javascript").get();
- Assert.assertEquals("return type must be application/javascript",
- "application/javascript", resp.getMediaType().toString());
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertTrue("resp must start with callback call",
- respStr.startsWith("callback_func("));
- Assert.assertTrue("resp must start with callback call",
- respStr.endsWith(")"));
-
- String jsonStr = respStr.substring("callback_func(".length(),
- respStr.length() - 1);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(jsonStr);
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
-
- String id = jsonNode.get("id").asText();
- Assert.assertEquals("id must be equals", space.getId(), id);
-
- Assert.assertTrue("the space must have a created",
- jsonNode.hasNonNull("created"));
-
- String dateStr = jsonNode.get("created").asText();
-
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime date = fmt.parseDateTime(dateStr);
-
- Assert.assertEquals("Created date must be the same",
- space.getCreated(), date);
-
- Assert.assertEquals("title must be the same", space.getTitle(),
- jsonNode.get("title").asText());
-
- }
-
- @Test
- public void testSingleGetJsonpAcceptAll() throws JsonProcessingException,
- IOException {
- WebTarget WebTarget = this.target();
- Response resp = WebTarget.path("spaces").path(this.firstSpaceUUID)
- .queryParam("callback", "callback_func").request()
- .accept("*/*").get();
- Assert.assertEquals("return type must be application/javascript",
- "application/javascript", resp.getMediaType().toString());
-
- String respStr = resp.readEntity(String.class);
-
- Assert.assertTrue("resp must start with callback call",
- respStr.startsWith("callback_func("));
- Assert.assertTrue("resp must start with callback call",
- respStr.endsWith(")"));
-
- String jsonStr = respStr.substring("callback_func(".length(),
- respStr.length() - 1);
- ObjectMapper mapper = getObjectMapper();
- JsonNode jsonNode = mapper.readTree(jsonStr);
-
- Space space = this.spacesList.get(this.firstSpaceUUID);
-
- String id = jsonNode.get("id").asText();
- Assert.assertEquals("id must be equals", space.getId(), id);
-
- Assert.assertTrue("the space must have a created",
- jsonNode.hasNonNull("created"));
-
- String dateStr = jsonNode.get("created").asText();
-
- DateTimeFormatter fmt = ISODateTimeFormat.dateTime();
- DateTime date = fmt.parseDateTime(dateStr);
-
- Assert.assertEquals("Created date must be the same",
- space.getCreated(), date);
-
- Assert.assertEquals("title must be the same", space.getTitle(),
- jsonNode.get("title").asText());
-
- }
-}
--- a/server/renkan-web/src/test/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration >
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.test">
- <level value="DEBUG" />
- </logger>
- <logger name="org.springframework.data.mongodb">
- <level value="DEBUG" />
- </logger>
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
- <constructor-arg name="strength" value="10" type="int"/>
- </bean>
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
-
- <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
- <property name="basenames">
- <list>
- <value>WEB-INF/i18n/messages</value>
- <value>classpath:org/springframework/security/messages</value>
- </list>
- </property>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="fallbackToSystemLocale" value="true" />
- </bean>
-
-</beans>
\ No newline at end of file
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/controller/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_controller_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/models-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.rest" />
-
-</beans>
\ No newline at end of file
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_rest_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/rest-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
-
-</beans>
\ No newline at end of file
--- a/server/renkan-web/src/test/resources/org/iri_research/renkan/test/rest/test-project.json Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-{
- "title" : "Project Rest Post Test",
- "description" : "",
- "uri" : null,
- "color" : null,
- "revCounter" : 6,
- "nodes" : [ {
- "@id" : "f286bae5-4303-49c1-8534-43520e117940",
- "title" : "storytelling",
- "description" : "Tag 'storytelling'",
- "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/search/?search=storytelling&field=all",
- "color" : null,
- "position" : {
- "x" : 7.5,
- "y" : -76.0
- },
- "image" : "http://localhost:8080/renkan/static/img/ldt-tag.png",
- "size" : 0,
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- }, {
- "@id" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
- "title" : "Introduction générale par Hidetaka Ishida",
- "description" : "石田英敬によるイントロダクション (langue française フランス語)",
- "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/e328e188-ff2f-11e0-b9e1-00145ea49a02/#id=s_A91AB45B-AB6B-EFCA-4A08-40B2F74F294F",
- "color" : null,
- "position" : {
- "x" : -283.5,
- "y" : 39.0
- },
- "image" : "http://localhost:8080/renkan/static/img/ldt-segment.png",
- "size" : 0,
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- } ],
- "edges" : [ {
- "@id" : "15cedd4c-99be-4d83-b849-3ee7d9d26a2c",
- "title" : "",
- "description" : "",
- "uri" : "",
- "color" : null,
- "from" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
- "to" : "f286bae5-4303-49c1-8534-43520e117940",
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- } ],
- "views" : [ ],
- "users" : [ ],
- "space_id" : "<space_id>"
-}
\ No newline at end of file
--- a/server/settings.gradle Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,8 +0,0 @@
-rootProject.name = 'renkan'
-include ':renkan-core'
-include ':renkan-web'
-include ':renkan-management'
-
-project(':renkan-core').projectDir = "$rootDir/renkan-core" as File
-project(':renkan-web').projectDir = "$rootDir/renkan-web" as File
-project(':renkan-management').projectDir = "$rootDir/renkan-management" as File
\ No newline at end of file
--- a/server/src/main/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration>
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.beans.factory">
- <level value="INFO" />
- </logger>
- <!--logger name="org.cometd">
- <level value="DEBUG" />
- </logger-->
- <!--logger name="org.coweb">
- <level value="DEBUG" />
- </logger-->
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/src/main/webapp/WEB-INF/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo-1.2.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd">
-
- <context:property-placeholder order="1000" ignore-unresolvable="true" ignore-resource-not-found="false" location="WEB-INF/renkan.properties"/>
- <context:property-placeholder order="1" ignore-unresolvable="true" ignore-resource-not-found="true" location="classpath:renkan_run.properties"/>
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="${mongodb.host.name}" port="${mongodb.host.port}" />
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="${mongodb.db.name}"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/src/main/webapp/WEB-INF/renkan.properties Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,11 +0,0 @@
-mongodb.host.name = localhost
-mongodb.host.port = 27017
-mongodb.db.name = renkan
-
-user.admin.name = admin
-#user.admin.password = admin
-user.admin.password = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
-
-renkan.pagination.size = 2
-renkan.coweb.debug = false
-renkan.coweb.websocket = true
\ No newline at end of file
--- a/server/src/test/resources/log4j.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone='no' ?>
-<!DOCTYPE log4j:configuration >
-
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
- <appender name="console" class="org.apache.log4j.ConsoleAppender">
- <param name="Target" value="System.out"/>
- <layout class="org.apache.log4j.PatternLayout">
- <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n"/>
- </layout>
- </appender>
- <logger name="org.iri_research.renkan">
- <level value="DEBUG" />
- </logger>
- <logger name="org.eclipse.jetty.util.log">
- <level value="INFO" />
- </logger>
- <logger name="org.springframework.test">
- <level value="DEBUG" />
- </logger>
- <logger name="org.springframework.data.mongodb">
- <level value="DEBUG" />
- </logger>
- <root>
- <priority value ="WARN" />
- <appender-ref ref="console" />
- </root>
-
-</log4j:configuration>
-
--- a/server/src/test/resources/org/iri_research/renkan/test/controller/controller-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <bean class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" id="renkanPasswordEncoder">
- <constructor-arg name="strength" value="10" type="int"/>
- </bean>
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
-
- <bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
- <property name="basenames">
- <list>
- <value>WEB-INF/i18n/messages</value>
- <value>classpath:org/springframework/security/messages</value>
- </list>
- </property>
- <property name="defaultEncoding" value="UTF-8"/>
- <property name="fallbackToSystemLocale" value="true" />
- </bean>
-
-</beans>
\ No newline at end of file
--- a/server/src/test/resources/org/iri_research/renkan/test/controller/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_controller_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/src/test/resources/org/iri_research/renkan/test/models/models-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.models" />
- <context:component-scan base-package="org.iri_research.renkan.rest" />
-
-</beans>
\ No newline at end of file
--- a/server/src/test/resources/org/iri_research/renkan/test/models/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_models_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/src/test/resources/org/iri_research/renkan/test/repositories/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_repo_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/src/test/resources/org/iri_research/renkan/test/rest/mongo-config.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:mongo="http://www.springframework.org/schema/data/mongo"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jpa="http://www.springframework.org/schema/data/jpa"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/data/mongo
- http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
- <!-- Default bean name is 'mongo' -->
- <mongo:mongo host="localhost" port="27017"/>
-
- <!-- Offers convenience methods and automatic mapping between MongoDB JSON documents and your domain classes. -->
- <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
- <constructor-arg ref="mongo"/>
- <constructor-arg value="renkan_rest_test"/>
- <property name="writeResultChecking" value="EXCEPTION"/>
- </bean>
-
- <mongo:repositories base-package="org.iri_research.renkan" factory-class="org.iri_research.renkan.repositories.RenkanRepositoryFactoryBean" />
-
-</beans>
--- a/server/src/test/resources/org/iri_research/renkan/test/rest/rest-context.xml Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.2.xsd">
-
- <!-- Activates various annotations to be detected in bean classes -->
- <context:annotation-config />
-
- <!-- Configures the annotation-driven Spring MVC Controller programming model.
- Note that, with Spring 3.0, this tag works in Servlet MVC only! -->
-
- <!-- Loads MongoDB configuraton -->
- <import resource="mongo-config.xml"/>
-
- <bean id="springConfigurer"
- class="org.iri_research.renkan.coweb.SpringConfigurer"
- factory-method="getInstance" />
-
- <!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
- For example @Controller and @Service. Make sure to set the correct base-package-->
- <context:component-scan base-package="org.iri_research.renkan.rest" />
- <context:component-scan base-package="org.iri_research.renkan.coweb" />
-
-</beans>
\ No newline at end of file
--- a/server/src/test/resources/org/iri_research/renkan/test/rest/test-project.json Wed Jul 09 12:15:53 2014 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-{
- "title" : "Project Rest Post Test",
- "description" : "",
- "uri" : null,
- "color" : null,
- "revCounter" : 6,
- "nodes" : [ {
- "@id" : "f286bae5-4303-49c1-8534-43520e117940",
- "title" : "storytelling",
- "description" : "Tag 'storytelling'",
- "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/search/?search=storytelling&field=all",
- "color" : null,
- "position" : {
- "x" : 7.5,
- "y" : -76.0
- },
- "image" : "http://localhost:8080/renkan/static/img/ldt-tag.png",
- "size" : 0,
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- }, {
- "@id" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
- "title" : "Introduction générale par Hidetaka Ishida",
- "description" : "石田英敬によるイントロダクション (langue française フランス語)",
- "uri" : "http://ldt.iri.centrepompidou.fr/ldtplatform/ldt/front/player/e328e188-ff2f-11e0-b9e1-00145ea49a02/#id=s_A91AB45B-AB6B-EFCA-4A08-40B2F74F294F",
- "color" : null,
- "position" : {
- "x" : -283.5,
- "y" : 39.0
- },
- "image" : "http://localhost:8080/renkan/static/img/ldt-segment.png",
- "size" : 0,
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- } ],
- "edges" : [ {
- "@id" : "15cedd4c-99be-4d83-b849-3ee7d9d26a2c",
- "title" : "",
- "description" : "",
- "uri" : "",
- "color" : null,
- "from" : "b49ee549-d98a-4b54-b6f0-73ef84a2eccb",
- "to" : "f286bae5-4303-49c1-8534-43520e117940",
- "created_by" : "roster_user-084bccad-8030-4dcf-96a0-d7acc32a1503"
- } ],
- "views" : [ ],
- "users" : [ ],
- "space_id" : "<space_id>"
-}
\ No newline at end of file