changeset 2:a64ece32a01a draft default tip

"planemo upload for repository https://github.com/ImmPortDB/immport-galaxy-tools/tree/master/flowtools/cs_overview commit a46097db0b6056e1125237393eb6974cfd51eb41"
author azomics
date Tue, 28 Jul 2020 08:32:36 -0400
parents bca68066a957
children
files crossSampleOverview.py crossSampleOverview.xml css/parallelCoordinates.css images/barssm.png js/Editor-1.5.6/css/dataTables.editor.css js/Editor-1.5.6/css/editor.bootstrap.css js/Editor-1.5.6/css/editor.bootstrap.min.css js/Editor-1.5.6/css/editor.dataTables.css js/Editor-1.5.6/css/editor.dataTables.min.css js/Editor-1.5.6/css/editor.foundation.css js/Editor-1.5.6/css/editor.foundation.min.css js/Editor-1.5.6/css/editor.jqueryui.css js/Editor-1.5.6/css/editor.jqueryui.min.css js/Editor-1.5.6/css/scss/bubble.scss js/Editor-1.5.6/css/scss/datatable.scss js/Editor-1.5.6/css/scss/datetime.scss js/Editor-1.5.6/css/scss/envelope.scss js/Editor-1.5.6/css/scss/fields.scss js/Editor-1.5.6/css/scss/inline.scss js/Editor-1.5.6/css/scss/lightbox.scss js/Editor-1.5.6/css/scss/main.scss js/Editor-1.5.6/css/scss/mixins.scss js/Editor-1.5.6/css/scss/upload.scss js/Editor-1.5.6/images/ajax-loader-small.gif js/Editor-1.5.6/images/ajax-loader.gif js/Editor-1.5.6/images/calender.png js/Editor-1.5.6/images/close.png js/Editor-1.5.6/images/shadow_left.png js/Editor-1.5.6/images/shadow_right.png js/Editor-1.5.6/js/dataTables.editor.js js/Editor-1.5.6/js/dataTables.editor.min.js js/Editor-1.5.6/js/editor.bootstrap.js js/Editor-1.5.6/js/editor.bootstrap.min.js js/Editor-1.5.6/js/editor.foundation.js js/Editor-1.5.6/js/editor.foundation.min.js js/Editor-1.5.6/js/editor.jqueryui.js js/Editor-1.5.6/js/editor.jqueryui.min.js js/boxplots.js js/color_palette.js js/crossSamplePlots.js js/csOverview.js js/pCoordCSstats.js js/pCoordMFIstats.js templates/csOverview.template test-data/csBoxplotData.json test-data/out.html
diffstat 45 files changed, 17194 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crossSampleOverview.py	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+
+# version 1.1 -- August 2017
+# added checks for consistency between input files
+# and upper limit on nb of cluster to look at
+
+from __future__ import print_function
+import sys
+import os
+import logging
+import fileinput
+import pandas as pd
+from argparse import ArgumentParser
+from jinja2 import Environment, FileSystemLoader
+from shutil import copyfile
+from collections import defaultdict
+
+
+def check_pops(mfi_file, stat1):
+    df = pd.read_table(mfi_file)
+    df1 = pd.read_table(stat1)
+    nb_pop = len(set(df.Population))
+    nb_pop1 = len(df1.columns) - 2
+    if (nb_pop > 40):
+        sys.stderr.write("There are " + str(nb_pop) + " in the input file.")
+        sys.exit(1)
+    if (nb_pop != nb_pop1):
+        sys.exit(2)
+
+
+def panel_to_json_string(df):
+    # from http://stackoverflow.com/questions/28078118/merge-many-json-strings-with-python-pandas-inputs
+    def __merge_stream(key, stream):
+        return '"' + key + '"' + ': ' + stream + ', '
+    try:
+        if 'Unnamed: 0' in df.columns:
+            df = df.drop(['Unnamed: 0'], axis=1)
+        stream = '{'
+        for index, subdf in df.groupby(level=0):
+            stream += __merge_stream(index, df.loc[index, :, :].droplevel(0).to_json())
+        # take out extra last comma
+        stream = stream[:-2]
+        # add the final paren
+        stream += '}'
+    except:
+        logging.exception('Panel Encoding did not work')
+    return stream
+
+
+def get_outliers(group, upper, lower):
+    cat = group.name
+    out = {}
+    for marker in group:
+        # skip population since upper and lower don't contain it, since it was made after a group by Population
+        if marker != 'Population':
+            out[marker] = group[(group[marker] > upper.loc[cat][marker]) | (group[marker] < lower.loc[cat][marker])][marker]
+    return out
+
+
+def get_boxplot_stats(all_data, mfi_file, output_json):
+    # modified code from http://bokeh.pydata.org/en/latest/docs/gallery/boxplot.html
+    # Get initial MFI values
+    mfi = pd.read_table(mfi_file)
+    mfi = mfi.set_index('Population')
+
+    df = pd.read_table(all_data)
+    # check if ever some pops not in cs_files
+    missing_pop = [x for x in mfi.index if x not in set(df.Population)]
+
+    if (missing_pop):
+        zeros = {}
+        for m in df.columns:
+            zeros[m] = [0 for x in missing_pop]
+        tmpdf = pd.DataFrame(zeros)
+        tmpdf.Population = missing_pop
+        df = df.append(tmpdf)
+
+    pops = df.groupby('Population')
+    q1 = pops.quantile(q=0.25)
+    q2 = pops.quantile(q=0.5)
+    q3 = pops.quantile(q=0.75)
+    iqr = q3 - q1
+    upper = q3 + 1.5*iqr
+    lower = q1 - 1.5*iqr
+    resampled = False
+    # get outliers
+    out = pops.apply(get_outliers, upper, lower).dropna()
+    outliers = defaultdict(dict)
+    for population in set(df.Population):
+        for marker in df.columns:
+            if marker != 'Population':
+                tmp_outliers = list(out[population][marker])
+                if (len(list(out[population][marker])) > 100):
+                    tmp_outliers = list(out[population][marker].sample(n=100))
+                    resampled = True
+                outliers[population][marker] = tmp_outliers
+    outdf = pd.DataFrame(outliers)
+
+    data = pd.concat({'q1': q1,
+            'q2': q2,
+            'q3': q3,
+            'upper': upper,
+            'lower': lower,
+            'outliers': outdf.T,
+            'mfi': mfi}, keys=['q1','q2','q3','upper','lower','outliers','mfi'])
+
+    with open(output_json, "w") as js_all:
+        js_all.write(panel_to_json_string(data))
+
+    return resampled
+
+
+def cs_overview(input_file, input_mfi, init_mfi, output_file, output_dir, tools_dir, cs_files):
+    os.mkdir(output_dir)
+
+    env = Environment(loader=FileSystemLoader(tools_dir + "/templates"))
+    template = env.get_template("csOverview.template")
+
+    real_directory = output_dir.replace("/job_working_directory", "")
+    context = {'outputDirectory': real_directory}
+    overview = template.render(**context)
+    with open(output_file, "w") as outf:
+        outf.write(overview)
+
+    cs_overview_file = output_dir + "/csOverview.tsv"
+    copyfile(input_file, cs_overview_file)
+
+    cs_overview_mfis = output_dir + "/csAllMFIs.tsv"
+    copyfile(input_mfi, cs_overview_mfis)
+
+    # Get all the data to calculate quantiles, IRC and outliers.
+    tmp_all_data = "csAllData.tsv"
+    with open(tmp_all_data, "a") as alldata:
+        # assumes that the files have ran through flock and CS and therefore have the same headers
+        df1 = pd.read_table(cs_files[0])
+        df1.to_csv(alldata, sep="\t", header=True, index=False)
+        for i in range(1, len(cs_files)):
+            df = pd.read_table(cs_files[i])
+            df.to_csv(alldata, sep="\t", header=False, index=False)
+
+    cs_boxplot_data = output_dir + "/csBoxplotData.json"
+    resampled = get_boxplot_stats(tmp_all_data, init_mfi, cs_boxplot_data)
+    if resampled:
+        to_find = '<div id="outlierWarning" style="display:none;">'
+        to_replace = '<div id="outlierWarning">'
+        ## yay python 2.7
+        ro = fileinput.input(output_file, inplace=True, backup=".bak")
+        for roline in ro:
+            print(roline.replace(to_find, to_replace), end='')
+        ro.close()
+
+    return
+
+
+if __name__ == "__main__":
+    parser = ArgumentParser(
+             prog="csOverview",
+             description="Generate an overview plot of crossSample results.")
+
+    parser.add_argument(
+            '-i',
+            dest="input_file",
+            required=True,
+            help="File location for the summary statistics from CrossSample.")
+
+    parser.add_argument(
+            '-I',
+            dest="input_mfi",
+            required=True,
+            help="File location for the MFI summary statistics from CrossSample.")
+
+    parser.add_argument(
+            '-s',
+            dest="cs_outputs",
+            required=True,
+            action='append',
+            help="File location for the CrossSample output files.")
+
+    parser.add_argument(
+            '-o',
+            dest="output_file",
+            required=True,
+            help="File location for the HTML output file.")
+
+    parser.add_argument(
+            '-m',
+            dest="mfi",
+            required=True,
+            help="File location for the MFI from FLOCK.")
+
+    parser.add_argument(
+            '-d',
+            dest="output_directory",
+            required=True,
+            help="Directory location for the html supporting files.")
+
+    parser.add_argument(
+            '-t',
+            dest="tool_directory",
+            required=True,
+            help="Location of the Tool Directory.")
+
+    args = parser.parse_args()
+
+    cs_files = [f for f in args.cs_outputs]
+    check_pops(args.mfi, args.input_file)
+    cs_overview(args.input_file, args.input_mfi, args.mfi, args.output_file, args.output_directory, args.tool_directory, cs_files)
--- a/crossSampleOverview.xml	Wed May 20 16:04:43 2020 -0400
+++ b/crossSampleOverview.xml	Tue Jul 28 08:32:36 2020 -0400
@@ -1,25 +1,23 @@
-<tool id="cross_sample_overview" name="Generate overview information" version="1.1+galaxy0">
+<tool id="cross_sample_overview" name="Generate overview information" version="1.1+galaxy1">
   <description>of a multi-sample analysis.</description>
   <requirements>
-    <requirement type="package" version="2.0.2">ig-flowtools</requirement>
+    <requirement type="package" version="1.0.5">pandas</requirement>
+    <requirement type="package" version="2.11.2">jinja2</requirement>
   </requirements>
   <stdio>
     <exit_code range="1" level="fatal" description="There are too many populations in the input files. The maximum number of populations is 40." />
     <exit_code range="2" level="fatal" description="There are populations inconsistencies between provided inputs." />
+    <exit_code range="3:"/>
   </stdio>
   <command><![CDATA[
-    mkdir templates &&
-    mkdir -p static/flowtools &&
-    mkdir -p static/images/flowtools &&
-    export FLOWTOOL='which crossSampleOverview.py' &&
-    FLOWTOOLDIR=\$(dirname $FLOWTOOL) &&
-    cp $FLOWTOOLDIR/../share/templates/* templates/ &&
-    cp -r $FLOWTOOLDIR/../share/static/flowtools/* static/flowtools/ &&
-    cp $FLOWTOOLDIR/../share/static/images/flowtools/* static/images/flowtools/ &&
-    crossSampleOverview.py -i '${input}' -I '${inputmfi}' -o '${html_file}' -m '${mfi}' -d '${html_file.files_path}' -t 'templates/'
+    python '$__tool_directory__/crossSampleOverview.py' -i '${input}' -I '${inputmfi}' -o '${html_file}' -m '${mfi}' -d '${html_file.files_path}' -t '$__tool_directory__'
     #for $f in $cs_outputs
        -s $f
     #end for
+    ;
+    cp -r '$__tool_directory__'/js '${html_file.files_path}/';
+    cp -r '$__tool_directory__'/css '${html_file.files_path}/';
+    cp -r '$__tool_directory__'/images '${html_file.files_path}/';
   ]]>
   </command>
   <inputs>
@@ -47,7 +45,7 @@
       <output name="html_file" file="out.html" compare="sim_size">
         <extra_files type="file" name="csAllMFIs.tsv" value="csAllMFIs.tsv"/>
         <extra_files type="file" name="csOverview.tsv" value="csOverview.tsv"/>
-        <extra_files type="file" name="csBoxplotData.json" value="csBoxplotData.json" compare="contains"/>
+        <extra_files type="file" name="csBoxplotData.json" value="csBoxplotData.json" compare="sim_size"/>
       </output>
     </test>
   </tests>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/css/parallelCoordinates.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,170 @@
+/*Chart*/
+.chartDiv {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    margin-left: 10px;
+    margin-right: 10px;
+    background-color: #ffffff;
+}
+/*This for stacked / bar plot*/
+.optionButtons{
+    padding-bottom: 8px;
+}
+.igbtn {
+    border-radius: 4px;
+    color: white;
+    background-color: #0E3163;
+    border:1px;
+    font-size: 14px;
+    font-weight: bold;
+    border-color: #0E3163;
+    padding: 6px 12px;
+    background: -webkit-linear-gradient(#0E3163, #3e6db0);
+    background: -o-linear-gradient(#0E3163, #3e6db0);
+    background: -moz-linear-gradient(#0E3163, #3e6db0);
+    background: linear-gradient(#0E3163, #3e6db0);
+}
+ #togglePlot {
+    display: block;
+    margin-left: auto;
+    margin-right: auto;
+    height: 60px;
+    width: 90px;
+    padding: 4px 8px 8px 4px;
+}
+/*DataTables config*/
+div.dt-buttons {
+    float: right;
+}
+th {
+    background-color:#3965A4;
+    color:#fff;
+    border-radius: 2px;
+    padding:6px 12px;
+    font-size:14px;
+    text-align: center;
+}
+.igtable th {
+  background: -webkit-linear-gradient(#0E3163, #3e6db0);
+  background: -o-linear-gradient(#0E3163, #3e6db0);
+  background: -moz-linear-gradient(#0E3163, #3e6db0);
+  background: linear-gradient(#0E3163, #3e6db0)
+}
+body td {
+    max-width: 50px;
+    font-size: 14px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+.pctable td {
+    max-width: 100px;
+}
+.dtable td {
+    max-width: 50px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+.popt thead {
+    display:none;
+}
+.popt td {
+    max-width: 40px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+div.dataTables_wrapper {
+    width: 95%;
+    margin: 0 auto;
+}
+/*Opacity widget*/
+.widget {
+  margin-top: 4px;
+  padding: 4px 4px 8px 4px;
+  margin-bottom: 10px
+  height: 36px;
+  line-height: 12px;
+  font-size: 12px;
+  text-align: center;
+ // float: right;
+}
+/*This section for coordinates plot*/
+.table th {
+    text-align: center;
+    padding: 10px;
+}
+.table {
+    width:100%;
+    border:0px solid;
+    border-collapse:collapse;
+    text-align:center;
+    font-size: 14px;
+}
+svg {
+  font: 10px sans-serif;
+}
+.background path {
+  fill: none;
+  stroke: #F0F0F0;
+  shape-rendering: crispEdges;
+}
+.foreground path {
+  fill: none;
+  stroke-opacity: .8;
+}
+.brush .extent {
+  fill-opacity: .3;
+  stroke: #fff;
+  shape-rendering: crispEdges;
+}
+.axis line,
+.axis path {
+  fill: none;
+  stroke: #000;
+  stroke-width: 2;
+  shape-rendering: crispEdges;
+}
+.axis text {
+  text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
+}
+.xlabel {
+  font-size: 14px;
+  fill: #808080;
+}
+.ylabel {
+  font-size: 16px;
+  fill: #808080;
+}
+/*This section for boxplots*/
+.box {
+  font: 10px sans-serif;
+}
+.box line,
+.box rect,
+.box circle {
+   fill: red;
+  stroke: #000;
+  stroke-width: 1px;
+}
+.box .center {
+  stroke-dasharray: 3,3;
+}
+.box .outlier {
+  fill: none;
+  stroke: #000;
+}
+.axisbp path,
+.axisbp line {
+  stroke-width: 1px;
+  fill:
+}
+.y.axisbp path {
+  stroke-width: 2;
+  stroke: #000;
+  fill: none;
+}
+.x.axisbp path {
+  fill: none;
+  stroke: #C8C8C8;
+  stroke-width: 0px;
+  shape-rendering: crispEdges;
+}
Binary file images/barssm.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.bootstrap.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,590 @@
+div.DTE div.DTE_Form_Error {
+  display: none;
+  color: #b11f1f;
+}
+
+div.DTE_Field div.multi-value,
+div.DTE_Field div.multi-restore {
+  display: none;
+  cursor: pointer;
+}
+div.DTE_Field div.multi-value span,
+div.DTE_Field div.multi-restore span {
+  display: block;
+  color: #666;
+}
+div.DTE_Field div.multi-value:hover,
+div.DTE_Field div.multi-restore:hover {
+  background-color: #f1f1f1;
+}
+div.DTE_Field div.multi-restore {
+  margin-top: 0.5em;
+  font-size: 0.8em;
+  line-height: 1.25em;
+}
+div.DTE_Field:after {
+  display: block;
+  content: ".";
+  height: 0;
+  line-height: 0;
+  clear: both;
+  visibility: hidden;
+}
+
+div.DTE_Inline {
+  position: relative;
+  display: table;
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field,
+div.DTE_Inline div.DTE_Inline_Buttons {
+  display: table-cell;
+  vertical-align: middle;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field {
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field > label,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field > label {
+  display: none;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input {
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button {
+  margin: -6px 0 -6px 4px;
+  padding: 5px;
+}
+div.DTE_Inline div.DTE_Field input[type="color"],
+div.DTE_Inline div.DTE_Field input[type="date"],
+div.DTE_Inline div.DTE_Field input[type="datetime"],
+div.DTE_Inline div.DTE_Field input[type="datetime-local"],
+div.DTE_Inline div.DTE_Field input[type="email"],
+div.DTE_Inline div.DTE_Field input[type="month"],
+div.DTE_Inline div.DTE_Field input[type="number"],
+div.DTE_Inline div.DTE_Field input[type="password"],
+div.DTE_Inline div.DTE_Field input[type="search"],
+div.DTE_Inline div.DTE_Field input[type="tel"],
+div.DTE_Inline div.DTE_Field input[type="text"],
+div.DTE_Inline div.DTE_Field input[type="time"],
+div.DTE_Inline div.DTE_Field input[type="url"],
+div.DTE_Inline div.DTE_Field input[type="week"] {
+  margin: -6px 0;
+}
+div.DTE_Inline.DTE_Processing:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 4px;
+  right: 10px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+
+span.dtr-data div.DTE_Inline {
+  display: inline-table;
+}
+
+div.DTE_Inline div.DTE_Field {
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Field > div {
+  width: 100%;
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Field input.form-control {
+  height: 30px;
+}
+div.DTE_Inline div.DTE_Field div.help-block {
+  display: none;
+}
+div.DTE_Inline.DTE_Processing:after {
+  top: 5px;
+}
+
+div.DTE_Field_Type_checkbox div.controls,
+div.DTE_Field_Type_radio div.controls {
+  margin-top: 0.4em;
+}
+div.DTE_Field_Type_checkbox div.controls label,
+div.DTE_Field_Type_radio div.controls label {
+  margin-left: 0.75em;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+}
+
+div.DTE_Bubble {
+  position: absolute;
+  z-index: 11;
+  margin-top: -6px;
+  opacity: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  position: absolute;
+  bottom: 0;
+  border: 1px solid black;
+  width: 300px;
+  margin-left: -150px;
+  background-color: white;
+  box-shadow: 2px 2px 7px #555;
+  border-radius: 5px;
+  border: 2px solid #444;
+  padding: 1em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table {
+  display: table;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form {
+  display: table-cell;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content {
+  padding: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons {
+  display: table-cell;
+  vertical-align: bottom;
+  padding: 0 0 0 0.75em;
+  width: 1%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Form_Info,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Bubble_Table {
+  padding-top: 42px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error {
+  float: none;
+  display: none;
+  padding: 0;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close {
+  position: absolute;
+  top: -11px;
+  right: -11px;
+  width: 22px;
+  height: 22px;
+  border: 2px solid white;
+  background-color: black;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+  z-index: 12;
+  box-shadow: 2px 2px 6px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  content: '\00d7';
+  color: white;
+  font-weight: bold;
+  font-size: 18px;
+  line-height: 22px;
+  font-family: 'Courier New', Courier, monospace;
+  padding-left: 1px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover {
+  background-color: #092079;
+  box-shadow: 2px 2px 9px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Triangle {
+  position: absolute;
+  height: 10px;
+  width: 10px;
+  top: -6px;
+  background-color: white;
+  border: 2px solid #444;
+  border-top: none;
+  border-right: none;
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 12px;
+  right: 18px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Liner {
+  top: 10px;
+  bottom: auto;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Triangle {
+  top: 4px;
+  -webkit-transform: rotate(135deg);
+  -moz-transform: rotate(135deg);
+  -ms-transform: rotate(135deg);
+  -o-transform: rotate(135deg);
+  transform: rotate(135deg);
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 10;
+}
+div.DTE_Bubble_Background > div {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+}
+div.DTE_Bubble_Background > div:not([dummy]) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+}
+
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  padding: 0 0 0.5em 0;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field label,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field > div {
+  width: 100%;
+  float: none;
+  clear: both;
+  text-align: left;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field label {
+  padding-bottom: 4px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  font-size: 14px;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  margin-top: -2px;
+  display: block;
+}
+div.DTE_Bubble div.DTE_Bubble_Triangle {
+  border: 1px solid rgba(0, 0, 0, 0.2);
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 10;
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+div.DTE div.editor_upload {
+  padding-top: 4px;
+}
+div.DTE div.editor_upload div.eu_table {
+  display: table;
+  width: 100%;
+}
+div.DTE div.editor_upload div.row {
+  display: table-row;
+}
+div.DTE div.editor_upload div.cell {
+  display: table-cell;
+  position: relative;
+  width: 50%;
+  vertical-align: top;
+}
+div.DTE div.editor_upload div.cell + div.cell {
+  padding-left: 10px;
+}
+div.DTE div.editor_upload div.row + div.row div.cell {
+  padding-top: 10px;
+}
+div.DTE div.editor_upload button.btn,
+div.DTE div.editor_upload input[type=file] {
+  width: 100%;
+  height: 2.3em;
+  font-size: 0.8em;
+  text-align: center;
+  line-height: 1em;
+}
+div.DTE div.editor_upload input[type=file] {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  opacity: 0;
+}
+div.DTE div.editor_upload div.drop {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  border: 3px dashed #ccc;
+  border-radius: 6px;
+  min-height: 4em;
+  color: #999;
+  padding-top: 3px;
+  text-align: center;
+}
+div.DTE div.editor_upload div.drop.over {
+  border: 3px dashed #111;
+  color: #111;
+}
+div.DTE div.editor_upload div.drop span {
+  max-width: 75%;
+  font-size: 0.85em;
+  line-height: 1em;
+}
+div.DTE div.editor_upload div.rendered img {
+  max-width: 8em;
+  margin: 0 auto;
+}
+div.DTE div.editor_upload.noDrop div.drop {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.row.second {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.rendered {
+  margin-top: 10px;
+}
+div.DTE div.editor_upload.noClear div.clearValue button {
+  display: none;
+}
+div.DTE div.editor_upload.multi div.cell {
+  display: block;
+  width: 100%;
+}
+div.DTE div.editor_upload.multi div.cell div.drop {
+  min-height: 0;
+  padding-bottom: 5px;
+}
+div.DTE div.editor_upload.multi div.clearValue {
+  display: none;
+}
+div.DTE div.editor_upload.multi ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+div.DTE div.editor_upload.multi ul li {
+  position: relative;
+  margin-top: 0.5em;
+}
+div.DTE div.editor_upload.multi ul li:first-child {
+  margin-top: 0;
+}
+div.DTE div.editor_upload.multi ul li img {
+  vertical-align: middle;
+}
+div.DTE div.editor_upload.multi ul li button {
+  position: absolute;
+  width: 40px;
+  right: 0;
+  top: 50%;
+  margin-top: -1.5em;
+}
+
+div.DTE div.editor_upload button.btn,
+div.DTE div.editor_upload input[type=file] {
+  height: auto;
+}
+div.DTE div.editor_upload ul li button {
+  padding-bottom: 8px;
+}
+
+div.editor-datetime {
+  position: absolute;
+  background-color: white;
+  z-index: 2050;
+  border: 1px solid #ccc;
+  box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5);
+  padding-bottom: 5px;
+}
+div.editor-datetime div.editor-datetime-title {
+  text-align: center;
+  padding: 5px 0px 3px;
+}
+div.editor-datetime table {
+  border-spacing: 0;
+  margin: 6px 13px;
+}
+div.editor-datetime table th {
+  font-size: 0.8em;
+  color: #777;
+  font-weight: normal;
+  width: 14.285714286%;
+  padding: 0 0 4px 0;
+  text-align: center;
+}
+div.editor-datetime table td {
+  font-size: 0.9em;
+  color: #444;
+  padding: 0;
+}
+div.editor-datetime table td.day {
+  text-align: right;
+  background: #f5f5f5;
+}
+div.editor-datetime table td.day.disabled {
+  color: #aaa;
+  background: white;
+}
+div.editor-datetime table td.day.today {
+  background-color: #ddd;
+}
+div.editor-datetime table td.day.today button {
+  font-weight: bold;
+}
+div.editor-datetime table td.day.selected button {
+  background: #337ab7;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.day button:hover {
+  background: #ff8000;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.editor-datetime-week {
+  font-size: 0.7em;
+}
+div.editor-datetime table button {
+  width: 100%;
+  box-sizing: border-box;
+  border: none;
+  background: transparent;
+  font-size: inherit;
+  color: inherit;
+  text-align: inherit;
+  padding: 5px 9px;
+  cursor: pointer;
+  margin: 0;
+}
+div.editor-datetime table.weekNumber th {
+  width: 12.5%;
+}
+div.editor-datetime div.editor-datetime-label {
+  position: relative;
+  display: inline-block;
+  height: 30px;
+  padding: 5px 6px;
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-label:hover {
+  border: 1px solid #ddd;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+div.editor-datetime div.editor-datetime-label select {
+  position: absolute;
+  top: 6px;
+  left: 0;
+  cursor: pointer;
+  opacity: 0;
+  -ms-filter: "alpha(opacity=0)";
+}
+div.editor-datetime div.editor-datetime-time {
+  text-align: center;
+}
+div.editor-datetime div.editor-datetime-time > span {
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock {
+  display: inline-block;
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-iconLeft,
+div.editor-datetime div.editor-datetime-iconRight,
+div.editor-datetime div.editor-datetime-iconUp,
+div.editor-datetime div.editor-datetime-iconDown {
+  width: 30px;
+  height: 30px;
+  background-position: center;
+  background-repeat: no-repeat;
+  opacity: 0.3;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+div.editor-datetime div.editor-datetime-iconLeft:hover,
+div.editor-datetime div.editor-datetime-iconRight:hover,
+div.editor-datetime div.editor-datetime-iconUp:hover,
+div.editor-datetime div.editor-datetime-iconDown:hover {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background-color: #f0f0f0;
+  opacity: 0.6;
+}
+div.editor-datetime div.editor-datetime-iconLeft button,
+div.editor-datetime div.editor-datetime-iconRight button,
+div.editor-datetime div.editor-datetime-iconUp button,
+div.editor-datetime div.editor-datetime-iconDown button {
+  border: none;
+  background: transparent;
+  text-indent: 30px;
+  height: 100%;
+  width: 100%;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-iconLeft {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+}
+div.editor-datetime div.editor-datetime-iconRight {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconUp {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconDown {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.bootstrap.min.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,1 @@
+div.DTE div.DTE_Form_Error{display:none;color:#b11f1f}div.DTE_Field div.multi-value,div.DTE_Field div.multi-restore{display:none;cursor:pointer}div.DTE_Field div.multi-value span,div.DTE_Field div.multi-restore span{display:block;color:#666}div.DTE_Field div.multi-value:hover,div.DTE_Field div.multi-restore:hover{background-color:#f1f1f1}div.DTE_Field div.multi-restore{margin-top:0.5em;font-size:0.8em;line-height:1.25em}div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input{width:100%}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline.DTE_Processing:after{position:absolute;content:' ';display:block;top:4px;right:10px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}span.dtr-data div.DTE_Inline{display:inline-table}div.DTE_Inline div.DTE_Field{width:100%}div.DTE_Inline div.DTE_Field>div{width:100%;padding:0}div.DTE_Inline div.DTE_Field input.form-control{height:30px}div.DTE_Inline div.DTE_Field div.help-block{display:none}div.DTE_Inline.DTE_Processing:after{top:5px}div.DTE_Field_Type_checkbox div.controls,div.DTE_Field_Type_radio div.controls{margin-top:0.4em}div.DTE_Field_Type_checkbox div.controls label,div.DTE_Field_Type_radio div.controls label{margin-left:0.75em;margin-bottom:0;vertical-align:middle;font-weight:normal}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after{position:absolute;content:' ';display:block;top:12px;right:18px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Bubble div.DTE_Bubble_Liner{box-shadow:0 5px 10px rgba(0,0,0,0.2);border-radius:6px;padding:0 0 0.5em 0;border:1px solid rgba(0,0,0,0.2)}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field label,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field>div{width:100%;float:none;clear:both;text-align:left}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field label{padding-bottom:4px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;font-size:14px;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{margin-top:-2px;display:block}div.DTE_Bubble div.DTE_Bubble_Triangle{border:1px solid rgba(0,0,0,0.2)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10;background-color:rgba(0,0,0,0.05)}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{height:auto}div.DTE div.editor_upload ul li button{padding-bottom:8px}div.editor-datetime{position:absolute;background-color:white;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5);padding-bottom:5px}div.editor-datetime div.editor-datetime-title{text-align:center;padding:5px 0px 3px}div.editor-datetime table{border-spacing:0;margin:6px 13px}div.editor-datetime table th{font-size:0.8em;color:#777;font-weight:normal;width:14.285714286%;padding:0 0 4px 0;text-align:center}div.editor-datetime table td{font-size:0.9em;color:#444;padding:0}div.editor-datetime table td.day{text-align:right;background:#f5f5f5}div.editor-datetime table td.day.disabled{color:#aaa;background:white}div.editor-datetime table td.day.today{background-color:#ddd}div.editor-datetime table td.day.today button{font-weight:bold}div.editor-datetime table td.day.selected button{background:#337ab7;color:white;border-radius:2px}div.editor-datetime table td.day button:hover{background:#ff8000;color:white;border-radius:2px}div.editor-datetime table td.editor-datetime-week{font-size:0.7em}div.editor-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:inherit;padding:5px 9px;cursor:pointer;margin:0}div.editor-datetime table.weekNumber th{width:12.5%}div.editor-datetime div.editor-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.editor-datetime div.editor-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.editor-datetime div.editor-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0;-ms-filter:"alpha(opacity=0)"}div.editor-datetime div.editor-datetime-time{text-align:center}div.editor-datetime div.editor-datetime-time>span{vertical-align:middle}div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock{display:inline-block;vertical-align:middle}div.editor-datetime div.editor-datetime-iconLeft,div.editor-datetime div.editor-datetime-iconRight,div.editor-datetime div.editor-datetime-iconUp,div.editor-datetime div.editor-datetime-iconDown{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:0.3;overflow:hidden;box-sizing:border-box}div.editor-datetime div.editor-datetime-iconLeft:hover,div.editor-datetime div.editor-datetime-iconRight:hover,div.editor-datetime div.editor-datetime-iconUp:hover,div.editor-datetime div.editor-datetime-iconDown:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:0.6}div.editor-datetime div.editor-datetime-iconLeft button,div.editor-datetime div.editor-datetime-iconRight button,div.editor-datetime div.editor-datetime-iconUp button,div.editor-datetime div.editor-datetime-iconDown button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.editor-datetime div.editor-datetime-iconLeft{position:absolute;top:5px;left:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==")}div.editor-datetime div.editor-datetime-iconRight{position:absolute;top:5px;right:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconUp{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconDown{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC")}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.dataTables.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,1266 @@
+div.DTE {
+  position: relative;
+}
+div.DTE div.DTE_Processing_Indicator {
+  position: absolute;
+  top: 10px;
+  right: 13px;
+  height: 32px;
+  width: 32px;
+  background: url("../images/ajax-loader.gif") no-repeat top left;
+  display: none;
+  z-index: 20;
+}
+div.DTE div.DTE_Header {
+  position: absolute;
+  top: 0;
+  left: 0;
+  height: 50px;
+  width: 100%;
+  background-color: #f3f3f3;
+  border-bottom: 1px solid #ddd;
+  padding: 16px 10px 2px 16px;
+  font-size: 1.3em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE div.DTE_Footer {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  height: 50px;
+  width: 100%;
+  background-color: #f3f3f3;
+  border-top: 1px solid #ddd;
+  padding: 10px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE div.DTE_Form_Info {
+  margin-bottom: 0.5em;
+  display: none;
+}
+div.DTE div.DTE_Form_Content {
+  position: relative;
+  padding: 10px;
+}
+div.DTE div.DTE_Form_Error {
+  float: left;
+  padding: 5px;
+  display: none;
+  color: #b11f1f;
+}
+div.DTE button.btn,
+div.DTE div.DTE_Form_Buttons button {
+  position: relative;
+  text-align: center;
+  display: block;
+  margin-top: 0;
+  padding: 5px 15px;
+  cursor: pointer;
+  float: right;
+  margin-left: 0.75em;
+  font-size: 14px;
+  text-shadow: 0 1px 0 white;
+  border: 1px solid #999;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  -ms-border-radius: 4px;
+  -o-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 1px 1px 3px #ccc;
+  -moz-box-shadow: 1px 1px 3px #ccc;
+  box-shadow: 1px 1px 3px #ccc;
+  background-color: #f9f9f9 100%;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #ffffff 0%, #eee 65%, #f9f9f9 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #ffffff 0%, #eee 65%, #f9f9f9 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #ffffff 0%, #eee 65%, #f9f9f9 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #ffffff 0%, #eee 65%, #f9f9f9 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #ffffff 0%, #eee 65%, #f9f9f9 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9');
+}
+div.DTE button.btn:hover,
+div.DTE div.DTE_Form_Buttons button:hover {
+  border: 1px solid #666;
+  -webkit-box-shadow: 1px 1px 3px #999;
+  -moz-box-shadow: 1px 1px 3px #999;
+  box-shadow: 1px 1px 3px #999;
+  background-color: #f4f4f4 100%;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#f4f4f4');
+}
+div.DTE button.btn:active,
+div.DTE div.DTE_Form_Buttons button:active {
+  -webkit-box-shadow: inset 1px 1px 3px #999;
+  -moz-box-shadow: inset 1px 1px 3px #999;
+  box-shadow: inset 1px 1px 3px #999;
+}
+div.DTE button.btn:focus,
+div.DTE div.DTE_Form_Buttons button:focus {
+  border: 1px solid #426c9e;
+  text-shadow: 0 1px 0 #c4def1;
+  background-color: #a3d0ef 100%;
+  /* Fallback */
+  background-image: -webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
+  /* Chrome 10+, Saf5.1+, iOS 5+ */
+  background-image: -moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
+  /* FF3.6 */
+  background-image: -ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
+  /* IE10 */
+  background-image: -o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
+  /* Opera 11.10+ */
+  background-image: linear-gradient(to bottom, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');
+  outline: none;
+}
+div.DTE button.btn:focus:after,
+div.DTE div.DTE_Form_Buttons button:focus:after {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: white;
+  display: block;
+  content: " ";
+  -webkit-animation-duration: 1s;
+  -webkit-animation-name: buttonPulse;
+  -webkit-animation-fill-mode: forwards;
+  -webkit-animation-iteration-count: infinite;
+  -webkit-animation-timing-function: linear;
+  -webkit-animation-direction: alternate;
+  -moz-animation-duration: 1s;
+  -moz-animation-name: buttonPulse;
+  -moz-animation-fill-mode: forwards;
+  -moz-animation-iteration-count: infinite;
+  -moz-animation-timing-function: linear;
+  -moz-animation-direction: alternate;
+  -o-animation-duration: 1s;
+  -o-animation-name: buttonPulse;
+  -o-animation-fill-mode: forwards;
+  -o-animation-iteration-count: infinite;
+  -o-animation-timing-function: linear;
+  -o-animation-direction: alternate;
+  animation-duration: 1s;
+  animation-name: buttonPulse;
+  animation-fill-mode: forwards;
+  animation-iteration-count: infinite;
+  animation-timing-function: linear;
+  animation-direction: alternate;
+}
+div.DTE.DTE_Action_Remove div.DTE_Body_Content {
+  text-align: center;
+  padding: 20px 0;
+}
+
+@-webkit-keyframes buttonPulse {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 0.2;
+  }
+}
+@-moz-keyframes buttonPulse {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 0.2;
+  }
+}
+@-o-keyframes buttonPulse {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 0.2;
+  }
+}
+@keyframes buttonPulse {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 0.2;
+  }
+}
+div.DTTT_container {
+  float: left;
+}
+
+div.DTE_Field input,
+div.DTE_Field textarea {
+  box-sizing: border-box;
+  background-color: white;
+  -webkit-transition: background-color ease-in-out .15s;
+  transition: background-color ease-in-out .15s;
+}
+div.DTE_Field input:focus,
+div.DTE_Field textarea:focus {
+  background-color: #ffffee;
+}
+div.DTE_Field input[type="color"],
+div.DTE_Field input[type="date"],
+div.DTE_Field input[type="datetime"],
+div.DTE_Field input[type="datetime-local"],
+div.DTE_Field input[type="email"],
+div.DTE_Field input[type="month"],
+div.DTE_Field input[type="number"],
+div.DTE_Field input[type="password"],
+div.DTE_Field input[type="search"],
+div.DTE_Field input[type="tel"],
+div.DTE_Field input[type="text"],
+div.DTE_Field input[type="time"],
+div.DTE_Field input[type="url"],
+div.DTE_Field input[type="week"] {
+  padding: 6px 4px;
+  width: 100%;
+}
+div.DTE_Field div.DTE_Field_Info,
+div.DTE_Field div.DTE_Field_Message {
+  font-size: 11px;
+  line-height: 1em;
+}
+div.DTE_Field div.DTE_Field_Error {
+  font-size: 11px;
+  line-height: 1em;
+  display: none;
+  color: red;
+  margin-top: 5px;
+}
+div.DTE_Field div.multi-value {
+  display: none;
+  border: 1px dotted #666;
+  border-radius: 3px;
+  padding: 5px;
+  background-color: #fafafa;
+  cursor: pointer;
+}
+div.DTE_Field div.multi-value span {
+  font-size: 0.8em;
+  line-height: 1.25em;
+  display: block;
+  color: #666;
+}
+div.DTE_Field div.multi-value:hover {
+  background-color: #f1f1f1;
+}
+div.DTE_Field div.multi-restore {
+  display: none;
+  margin-top: 0.5em;
+  font-size: 0.8em;
+  line-height: 1.25em;
+  color: #3879d9;
+}
+div.DTE_Field div.multi-restore:hover {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+div.DTE_Field_Type_textarea textarea {
+  padding: 3px;
+  width: 100%;
+  height: 80px;
+}
+
+div.DTE_Field.DTE_Field_Type_date img {
+  vertical-align: middle;
+  cursor: pointer;
+  *cursor: hand;
+}
+div.DTE_Field.DTE_Field_Type_date input.jqueryui {
+  width: 87%;
+  margin-right: 6px;
+}
+
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div {
+  margin-bottom: 0.25em;
+}
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div:last-child,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div label,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div label {
+  margin-left: 0.75em;
+  vertical-align: middle;
+}
+
+div.DTE_Field_Type_select div.DTE_Field_Input {
+  padding-top: 4px;
+}
+
+div.DTE_Body {
+  padding: 50px 0;
+}
+div.DTE_Body div.DTE_Body_Content {
+  position: relative;
+  overflow: auto;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info {
+  padding: 1em 1em 0 1em;
+  margin: 0;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  clear: both;
+  padding: 5px 20%;
+  border: 1px solid transparent;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field:after {
+  display: block;
+  content: ".";
+  height: 0;
+  line-height: 0;
+  clear: both;
+  visibility: hidden;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover {
+  background-color: #f9f9f9;
+  border: 1px solid #f3f3f3;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+  float: left;
+  width: 40%;
+  padding-top: 6px;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+  float: right;
+  width: 60%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+  padding: 5px 0 5px 20%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+  width: 30%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+  width: 70%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+  float: none;
+  clear: both;
+  width: 100%;
+}
+
+html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+  float: right;
+}
+html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+  float: left;
+}
+html[dir="rtl"] div.DTE div.DTE_Form_Buttons button {
+  float: left;
+}
+
+@media only screen and (max-width: 768px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    padding: 5px 10%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+    padding: 5px 0 5px 10%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+    width: 35.5%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+    width: 64.5%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+@media only screen and (max-width: 640px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+    padding: 5px 0%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+    width: 40%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+    width: 60%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+@media only screen and (max-width: 580px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    position: relative;
+    zoom: 1;
+    clear: both;
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+    float: none;
+    width: auto;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full, div.DTE_Body div.DTE_Body_Content div.DTE_Field.block {
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label,
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input, div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > label,
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+div.DTE_Bubble {
+  position: absolute;
+  z-index: 11;
+  margin-top: -6px;
+  opacity: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  position: absolute;
+  bottom: 0;
+  border: 1px solid black;
+  width: 300px;
+  margin-left: -150px;
+  background-color: white;
+  box-shadow: 2px 2px 7px #555;
+  border-radius: 5px;
+  border: 2px solid #444;
+  padding: 1em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table {
+  display: table;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form {
+  display: table-cell;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content {
+  padding: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons {
+  display: table-cell;
+  vertical-align: bottom;
+  padding: 0 0 0 0.75em;
+  width: 1%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Form_Info,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Bubble_Table {
+  padding-top: 42px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error {
+  float: none;
+  display: none;
+  padding: 0;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close {
+  position: absolute;
+  top: -11px;
+  right: -11px;
+  width: 22px;
+  height: 22px;
+  border: 2px solid white;
+  background-color: black;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+  z-index: 12;
+  box-shadow: 2px 2px 6px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  content: '\00d7';
+  color: white;
+  font-weight: bold;
+  font-size: 18px;
+  line-height: 22px;
+  font-family: 'Courier New', Courier, monospace;
+  padding-left: 1px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover {
+  background-color: #092079;
+  box-shadow: 2px 2px 9px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Triangle {
+  position: absolute;
+  height: 10px;
+  width: 10px;
+  top: -6px;
+  background-color: white;
+  border: 2px solid #444;
+  border-top: none;
+  border-right: none;
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 12px;
+  right: 18px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Liner {
+  top: 10px;
+  bottom: auto;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Triangle {
+  top: 4px;
+  -webkit-transform: rotate(135deg);
+  -moz-transform: rotate(135deg);
+  -ms-transform: rotate(135deg);
+  -o-transform: rotate(135deg);
+  transform: rotate(135deg);
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 10;
+}
+div.DTE_Bubble_Background > div {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+}
+div.DTE_Bubble_Background > div:not([dummy]) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+}
+
+div.DTE_Inline {
+  position: relative;
+  display: table;
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field,
+div.DTE_Inline div.DTE_Inline_Buttons {
+  display: table-cell;
+  vertical-align: middle;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field {
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field > label,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field > label {
+  display: none;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input {
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button {
+  margin: -6px 0 -6px 4px;
+  padding: 5px;
+}
+div.DTE_Inline div.DTE_Field input[type="color"],
+div.DTE_Inline div.DTE_Field input[type="date"],
+div.DTE_Inline div.DTE_Field input[type="datetime"],
+div.DTE_Inline div.DTE_Field input[type="datetime-local"],
+div.DTE_Inline div.DTE_Field input[type="email"],
+div.DTE_Inline div.DTE_Field input[type="month"],
+div.DTE_Inline div.DTE_Field input[type="number"],
+div.DTE_Inline div.DTE_Field input[type="password"],
+div.DTE_Inline div.DTE_Field input[type="search"],
+div.DTE_Inline div.DTE_Field input[type="tel"],
+div.DTE_Inline div.DTE_Field input[type="text"],
+div.DTE_Inline div.DTE_Field input[type="time"],
+div.DTE_Inline div.DTE_Field input[type="url"],
+div.DTE_Inline div.DTE_Field input[type="week"] {
+  margin: -6px 0;
+}
+div.DTE_Inline.DTE_Processing:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 4px;
+  right: 10px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+
+span.dtr-data div.DTE_Inline {
+  display: inline-table;
+}
+
+div.DTED_Lightbox_Wrapper {
+  position: fixed;
+  top: 0;
+  left: 50%;
+  margin-left: -390px;
+  width: 780px;
+  height: 100%;
+  z-index: 11;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container {
+  *position: absolute;
+  /* IE6 */
+  *top: 50%;
+  #position: absolute;
+  /* IE7 */
+  #top: 50%;
+  display: table;
+  height: 100%;
+  width: 100%;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper {
+  *position: relative;
+  /* IE6 */
+  #position: relative;
+  /* IE7 */
+  display: table-cell;
+  vertical-align: middle;
+  width: 100%;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content {
+  *top: -50%;
+  /* IE6 */
+  #top: -50%;
+  /* IE7 */
+  position: relative;
+  border: 7px solid rgba(220, 220, 220, 0.5);
+  box-shadow: 2px 2px 10px #555;
+  border-radius: 10px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE {
+  background: white;
+  border-radius: 6px;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header {
+  top: 2px;
+  left: 2px;
+  right: 2px;
+  width: auto;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer {
+  bottom: 2px;
+  left: 2px;
+  right: 2px;
+  width: auto;
+  border-bottom-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close {
+  position: absolute;
+  top: -11px;
+  right: -11px;
+  width: 22px;
+  height: 22px;
+  border: 2px solid white;
+  background-color: black;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+  z-index: 12;
+  box-shadow: 2px 2px 6px #111;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:after {
+  content: '\00d7';
+  color: white;
+  font-weight: bold;
+  font-size: 18px;
+  line-height: 22px;
+  font-family: 'Courier New', Courier, monospace;
+  padding-left: 1px;
+}
+div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:hover {
+  background-color: #092079;
+  box-shadow: 2px 2px 9px #111;
+}
+
+div.DTED_Lightbox_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 10;
+}
+div.DTED_Lightbox_Background > div {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+}
+div.DTED_Lightbox_Background > div:not([dummy]) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+}
+
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Background {
+  height: 0;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Shown {
+  display: none;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper {
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  right: 0px;
+  bottom: 0px;
+  width: auto;
+  height: auto;
+  margin-left: 0;
+  -webkit-overflow-scrolling: touch;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container {
+  display: block;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper {
+  display: block;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content {
+  border: 4px solid rgba(220, 220, 220, 0.5);
+  border-radius: 0;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE {
+  border-radius: 0;
+  box-shadow: 0 0 5px #555;
+  border: 2px solid #444;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer {
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0;
+}
+body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close {
+  top: 11px;
+  right: 15px;
+}
+
+@media only screen and (max-width: 780px) {
+  div.DTED_Lightbox_Wrapper {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100%;
+    margin-left: 0;
+  }
+}
+/*
+ * Namespace: DTED - DataTables Editor Display - Envelope
+ */
+div.DTED_Envelope_Wrapper {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 50%;
+  height: 100%;
+  z-index: 11;
+  display: none;
+  overflow: hidden;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowLeft {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 50%;
+  height: 9px;
+  background: url("../images/shadow_left.png") no-repeat top left;
+  z-index: 10;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowRight {
+  position: absolute;
+  top: 0;
+  right: 0;
+  width: 50%;
+  height: 9px;
+  background: url("../images/shadow_right.png") no-repeat top right;
+  z-index: 10;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_Container {
+  position: absolute;
+  top: 0;
+  left: 5%;
+  width: 90%;
+  border-left: 1px solid #777;
+  border-right: 1px solid #777;
+  border-bottom: 1px solid #777;
+  box-shadow: 3px 3px 10px #555;
+  border-bottom-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+  background-color: white;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Processing_Indicator {
+  right: 36px;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Footer {
+  border-bottom-left-radius: 5px;
+  border-bottom-right-radius: 5px;
+}
+div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTED_Envelope_Close {
+  position: absolute;
+  top: 16px;
+  right: 10px;
+  width: 18px;
+  height: 18px;
+  cursor: pointer;
+  *cursor: hand;
+  z-index: 12;
+  text-align: center;
+  font-size: 12px;
+  background: #F8F8F8;
+  background: -webkit-gradient(linear, center bottom, center top, from(#CCC), to(white));
+  background: -moz-linear-gradient(top, white, #CCC);
+  background: linear-gradient(to bottom, white, #CCC);
+  text-shadow: 0 1px 0 white;
+  border: 1px solid #999;
+  border-radius: 2px;
+  -moz-border-radius: 2px;
+  -webkit-border-radius: 2px;
+  box-shadow: 0px 0px 1px #999;
+  -moz-box-shadow: 0px 0px 1px #999;
+  -webkit-box-shadow: 0px 0px 1px #999;
+}
+
+div.DTED_Envelope_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 10;
+  background: rgba(0, 0, 0, 0.4);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.4) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.4) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.4) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.1)), color-stop(1, rgba(0, 0, 0, 0.4)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.4) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.4) 100%);
+  /* W3C Markup, IE10 Release Preview */
+}
+
+table.dataTable tbody tr.highlight {
+  background-color: #FFFBCC !important;
+}
+table.dataTable tbody tr.highlight,
+table.dataTable tbody tr.noHighlight,
+table.dataTable tbody tr.highlight td,
+table.dataTable tbody tr.noHighlight td {
+  -webkit-transition: background-color 500ms linear;
+  -moz-transition: background-color 500ms linear;
+  -ms-transition: background-color 500ms linear;
+  -o-transition: background-color 500ms linear;
+  transition: background-color 500ms linear;
+}
+table.dataTable.stripe tbody tr.odd.highlight, table.dataTable.display tbody tr.odd.highlight {
+  background-color: #f9f5c7;
+}
+table.dataTable.hover tbody tr:hover.highlight,
+table.dataTable.hover tbody tr.odd:hover.highlight,
+table.dataTable.hover tbody tr.even:hover.highlight, table.dataTable.display tbody tr:hover.highlight,
+table.dataTable.display tbody tr.odd:hover.highlight,
+table.dataTable.display tbody tr.even:hover.highlight {
+  background-color: #f6f2c5;
+}
+table.dataTable.order-column tbody tr.highlight > .sorting_1,
+table.dataTable.order-column tbody tr.highlight > .sorting_2,
+table.dataTable.order-column tbody tr.highlight > .sorting_3, table.dataTable.display tbody tr.highlight > .sorting_1,
+table.dataTable.display tbody tr.highlight > .sorting_2,
+table.dataTable.display tbody tr.highlight > .sorting_3 {
+  background-color: #faf6c8;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_1 {
+  background-color: #f1edc1;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_2 {
+  background-color: #f3efc2;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_3 {
+  background-color: #f5f1c4;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_1 {
+  background-color: #faf6c8;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_2 {
+  background-color: #fcf8ca;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_3 {
+  background-color: #fefacb;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_1,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_1 {
+  background-color: #eae6bb;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_2,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_2 {
+  background-color: #ece8bd;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_3,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_3 {
+  background-color: #efebbf;
+}
+
+div.DTE div.editor_upload {
+  padding-top: 4px;
+}
+div.DTE div.editor_upload div.eu_table {
+  display: table;
+  width: 100%;
+}
+div.DTE div.editor_upload div.row {
+  display: table-row;
+}
+div.DTE div.editor_upload div.cell {
+  display: table-cell;
+  position: relative;
+  width: 50%;
+  vertical-align: top;
+}
+div.DTE div.editor_upload div.cell + div.cell {
+  padding-left: 10px;
+}
+div.DTE div.editor_upload div.row + div.row div.cell {
+  padding-top: 10px;
+}
+div.DTE div.editor_upload button.btn,
+div.DTE div.editor_upload input[type=file] {
+  width: 100%;
+  height: 2.3em;
+  font-size: 0.8em;
+  text-align: center;
+  line-height: 1em;
+}
+div.DTE div.editor_upload input[type=file] {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  opacity: 0;
+}
+div.DTE div.editor_upload div.drop {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  border: 3px dashed #ccc;
+  border-radius: 6px;
+  min-height: 4em;
+  color: #999;
+  padding-top: 3px;
+  text-align: center;
+}
+div.DTE div.editor_upload div.drop.over {
+  border: 3px dashed #111;
+  color: #111;
+}
+div.DTE div.editor_upload div.drop span {
+  max-width: 75%;
+  font-size: 0.85em;
+  line-height: 1em;
+}
+div.DTE div.editor_upload div.rendered img {
+  max-width: 8em;
+  margin: 0 auto;
+}
+div.DTE div.editor_upload.noDrop div.drop {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.row.second {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.rendered {
+  margin-top: 10px;
+}
+div.DTE div.editor_upload.noClear div.clearValue button {
+  display: none;
+}
+div.DTE div.editor_upload.multi div.cell {
+  display: block;
+  width: 100%;
+}
+div.DTE div.editor_upload.multi div.cell div.drop {
+  min-height: 0;
+  padding-bottom: 5px;
+}
+div.DTE div.editor_upload.multi div.clearValue {
+  display: none;
+}
+div.DTE div.editor_upload.multi ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+div.DTE div.editor_upload.multi ul li {
+  position: relative;
+  margin-top: 0.5em;
+}
+div.DTE div.editor_upload.multi ul li:first-child {
+  margin-top: 0;
+}
+div.DTE div.editor_upload.multi ul li img {
+  vertical-align: middle;
+}
+div.DTE div.editor_upload.multi ul li button {
+  position: absolute;
+  width: 40px;
+  right: 0;
+  top: 50%;
+  margin-top: -1.5em;
+}
+
+div.editor-datetime {
+  position: absolute;
+  background-color: white;
+  z-index: 2050;
+  border: 1px solid #ccc;
+  box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5);
+  padding-bottom: 5px;
+}
+div.editor-datetime div.editor-datetime-title {
+  text-align: center;
+  padding: 5px 0px 3px;
+}
+div.editor-datetime table {
+  border-spacing: 0;
+  margin: 6px 13px;
+}
+div.editor-datetime table th {
+  font-size: 0.8em;
+  color: #777;
+  font-weight: normal;
+  width: 14.285714286%;
+  padding: 0 0 4px 0;
+  text-align: center;
+}
+div.editor-datetime table td {
+  font-size: 0.9em;
+  color: #444;
+  padding: 0;
+}
+div.editor-datetime table td.day {
+  text-align: right;
+  background: #f5f5f5;
+}
+div.editor-datetime table td.day.disabled {
+  color: #aaa;
+  background: white;
+}
+div.editor-datetime table td.day.today {
+  background-color: #ddd;
+}
+div.editor-datetime table td.day.today button {
+  font-weight: bold;
+}
+div.editor-datetime table td.day.selected button {
+  background: #4E6CA3;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.day button:hover {
+  background: #ff8000;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.editor-datetime-week {
+  font-size: 0.7em;
+}
+div.editor-datetime table button {
+  width: 100%;
+  box-sizing: border-box;
+  border: none;
+  background: transparent;
+  font-size: inherit;
+  color: inherit;
+  text-align: inherit;
+  padding: 5px 9px;
+  cursor: pointer;
+  margin: 0;
+}
+div.editor-datetime table.weekNumber th {
+  width: 12.5%;
+}
+div.editor-datetime div.editor-datetime-label {
+  position: relative;
+  display: inline-block;
+  height: 30px;
+  padding: 5px 6px;
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-label:hover {
+  border: 1px solid #ddd;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+div.editor-datetime div.editor-datetime-label select {
+  position: absolute;
+  top: 6px;
+  left: 0;
+  cursor: pointer;
+  opacity: 0;
+  -ms-filter: "alpha(opacity=0)";
+}
+div.editor-datetime div.editor-datetime-time {
+  text-align: center;
+}
+div.editor-datetime div.editor-datetime-time > span {
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock {
+  display: inline-block;
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-iconLeft,
+div.editor-datetime div.editor-datetime-iconRight,
+div.editor-datetime div.editor-datetime-iconUp,
+div.editor-datetime div.editor-datetime-iconDown {
+  width: 30px;
+  height: 30px;
+  background-position: center;
+  background-repeat: no-repeat;
+  opacity: 0.3;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+div.editor-datetime div.editor-datetime-iconLeft:hover,
+div.editor-datetime div.editor-datetime-iconRight:hover,
+div.editor-datetime div.editor-datetime-iconUp:hover,
+div.editor-datetime div.editor-datetime-iconDown:hover {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background-color: #f0f0f0;
+  opacity: 0.6;
+}
+div.editor-datetime div.editor-datetime-iconLeft button,
+div.editor-datetime div.editor-datetime-iconRight button,
+div.editor-datetime div.editor-datetime-iconUp button,
+div.editor-datetime div.editor-datetime-iconDown button {
+  border: none;
+  background: transparent;
+  text-indent: 30px;
+  height: 100%;
+  width: 100%;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-iconLeft {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+}
+div.editor-datetime div.editor-datetime-iconRight {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconUp {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconDown {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.dataTables.min.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,1 @@
+div.DTE{position:relative}div.DTE div.DTE_Processing_Indicator{position:absolute;top:10px;right:13px;height:32px;width:32px;background:url("../images/ajax-loader.gif") no-repeat top left;display:none;z-index:20}div.DTE div.DTE_Header{position:absolute;top:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-bottom:1px solid #ddd;padding:16px 10px 2px 16px;font-size:1.3em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Footer{position:absolute;bottom:0;left:0;height:50px;width:100%;background-color:#f3f3f3;border-top:1px solid #ddd;padding:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE div.DTE_Form_Info{margin-bottom:0.5em;display:none}div.DTE div.DTE_Form_Content{position:relative;padding:10px}div.DTE div.DTE_Form_Error{float:left;padding:5px;display:none;color:#b11f1f}div.DTE button.btn,div.DTE div.DTE_Form_Buttons button{position:relative;text-align:center;display:block;margin-top:0;padding:5px 15px;cursor:pointer;float:right;margin-left:0.75em;font-size:14px;text-shadow:0 1px 0 white;border:1px solid #999;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px;-webkit-box-shadow:1px 1px 3px #ccc;-moz-box-shadow:1px 1px 3px #ccc;box-shadow:1px 1px 3px #ccc;background-color:#f9f9f9 100%;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-moz-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-ms-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:-o-linear-gradient(top, #fff 0%, #eee 65%, #f9f9f9 100%);background-image:linear-gradient(to bottom, #fff 0%, #eee 65%, #f9f9f9 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9')}div.DTE button.btn:hover,div.DTE div.DTE_Form_Buttons button:hover{border:1px solid #666;-webkit-box-shadow:1px 1px 3px #999;-moz-box-shadow:1px 1px 3px #999;box-shadow:1px 1px 3px #999;background-color:#f4f4f4 100%;background-image:-webkit-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-moz-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-ms-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:-o-linear-gradient(top, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);background-image:linear-gradient(to bottom, #f3f3f3 0%, #dbdbdb 65%, #f4f4f4 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#f4f4f4')}div.DTE button.btn:active,div.DTE div.DTE_Form_Buttons button:active{-webkit-box-shadow:inset 1px 1px 3px #999;-moz-box-shadow:inset 1px 1px 3px #999;box-shadow:inset 1px 1px 3px #999}div.DTE button.btn:focus,div.DTE div.DTE_Form_Buttons button:focus{border:1px solid #426c9e;text-shadow:0 1px 0 #c4def1;background-color:#a3d0ef 100%;background-image:-webkit-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-moz-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-ms-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:-o-linear-gradient(top, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);background-image:linear-gradient(to bottom, #a3d0ef 0%, #79ace9 65%, #a3d0ef 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#a3d0ef', EndColorStr='#a3d0ef');outline:none}div.DTE button.btn:focus:after,div.DTE div.DTE_Form_Buttons button:focus:after{position:absolute;top:0;left:0;right:0;bottom:0;background:white;display:block;content:" ";-webkit-animation-duration:1s;-webkit-animation-name:buttonPulse;-webkit-animation-fill-mode:forwards;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear;-webkit-animation-direction:alternate;-moz-animation-duration:1s;-moz-animation-name:buttonPulse;-moz-animation-fill-mode:forwards;-moz-animation-iteration-count:infinite;-moz-animation-timing-function:linear;-moz-animation-direction:alternate;-o-animation-duration:1s;-o-animation-name:buttonPulse;-o-animation-fill-mode:forwards;-o-animation-iteration-count:infinite;-o-animation-timing-function:linear;-o-animation-direction:alternate;animation-duration:1s;animation-name:buttonPulse;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-timing-function:linear;animation-direction:alternate}div.DTE.DTE_Action_Remove div.DTE_Body_Content{text-align:center;padding:20px 0}@-webkit-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-moz-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@-o-keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}@keyframes buttonPulse{0%{opacity:0}100%{opacity:0.2}}div.DTTT_container{float:left}div.DTE_Field input,div.DTE_Field textarea{box-sizing:border-box;background-color:white;-webkit-transition:background-color ease-in-out .15s;transition:background-color ease-in-out .15s}div.DTE_Field input:focus,div.DTE_Field textarea:focus{background-color:#ffffee}div.DTE_Field input[type="color"],div.DTE_Field input[type="date"],div.DTE_Field input[type="datetime"],div.DTE_Field input[type="datetime-local"],div.DTE_Field input[type="email"],div.DTE_Field input[type="month"],div.DTE_Field input[type="number"],div.DTE_Field input[type="password"],div.DTE_Field input[type="search"],div.DTE_Field input[type="tel"],div.DTE_Field input[type="text"],div.DTE_Field input[type="time"],div.DTE_Field input[type="url"],div.DTE_Field input[type="week"]{padding:6px 4px;width:100%}div.DTE_Field div.DTE_Field_Info,div.DTE_Field div.DTE_Field_Message{font-size:11px;line-height:1em}div.DTE_Field div.DTE_Field_Error{font-size:11px;line-height:1em;display:none;color:red;margin-top:5px}div.DTE_Field div.multi-value{display:none;border:1px dotted #666;border-radius:3px;padding:5px;background-color:#fafafa;cursor:pointer}div.DTE_Field div.multi-value span{font-size:0.8em;line-height:1.25em;display:block;color:#666}div.DTE_Field div.multi-value:hover{background-color:#f1f1f1}div.DTE_Field div.multi-restore{display:none;margin-top:0.5em;font-size:0.8em;line-height:1.25em;color:#3879d9}div.DTE_Field div.multi-restore:hover{text-decoration:underline;cursor:pointer}div.DTE_Field_Type_textarea textarea{padding:3px;width:100%;height:80px}div.DTE_Field.DTE_Field_Type_date img{vertical-align:middle;cursor:pointer;*cursor:hand}div.DTE_Field.DTE_Field_Type_date input.jqueryui{width:87%;margin-right:6px}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div{margin-bottom:0.25em}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div:last-child,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div:last-child{margin-bottom:0}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div label,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div label{margin-left:0.75em;vertical-align:middle}div.DTE_Field_Type_select div.DTE_Field_Input{padding-top:4px}div.DTE_Body{padding:50px 0}div.DTE_Body div.DTE_Body_Content{position:relative;overflow:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info{padding:1em 1em 0 1em;margin:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 20%;border:1px solid transparent}div.DTE_Body div.DTE_Body_Content div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover{background-color:#f9f9f9;border:1px solid #f3f3f3}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:left;width:40%;padding-top:6px}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:right;width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 20%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:30%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:70%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{float:none;clear:both;width:100%}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:right}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:left}html[dir="rtl"] div.DTE div.DTE_Form_Buttons button{float:left}@media only screen and (max-width: 768px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:35.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:64.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 640px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:40%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 580px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:none;width:auto;padding-top:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:none;width:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after{position:absolute;content:' ';display:block;top:12px;right:18px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input{width:100%}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline.DTE_Processing:after{position:absolute;content:' ';display:block;top:4px;right:10px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}span.dtr-data div.DTE_Inline{display:inline-table}div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:50%;margin-left:-390px;width:780px;height:100%;z-index:11}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{*position:absolute;*top:50%;#position:absolute;#top:50%;display:table;height:100%;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{*position:relative;#position:relative;display:table-cell;vertical-align:middle;width:100%}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{*top:-50%;#top:-50%;position:relative;border:7px solid rgba(220,220,220,0.5);box-shadow:2px 2px 10px #555;border-radius:10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{background:white;border-radius:6px;box-shadow:0 0 5px #555;border:2px solid #444;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{top:2px;left:2px;right:2px;width:auto;border-top-left-radius:5px;border-top-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{bottom:2px;left:2px;right:2px;width:auto;border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTED_Lightbox_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTED_Lightbox_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTED_Lightbox_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Background{height:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Shown{display:none}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper{position:absolute;top:0px;left:0px;right:0px;bottom:0px;width:auto;height:auto;margin-left:0;-webkit-overflow-scrolling:touch}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper{display:block}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content{border:4px solid rgba(220,220,220,0.5);border-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE{border-radius:0;box-shadow:0 0 5px #555;border:2px solid #444}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Header{border-top-left-radius:0;border-top-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTE div.DTE_Footer{border-bottom-left-radius:0;border-bottom-right-radius:0}body.DTED_Lightbox_Mobile div.DTED_Lightbox_Wrapper div.DTED_Lightbox_Container div.DTED_Lightbox_Content_Wrapper div.DTED_Lightbox_Content div.DTED_Lightbox_Close{top:11px;right:15px}@media only screen and (max-width: 780px){div.DTED_Lightbox_Wrapper{position:fixed;top:0;left:0;width:100%;margin-left:0}}div.DTED_Envelope_Wrapper{position:absolute;top:0;bottom:0;left:50%;height:100%;z-index:11;display:none;overflow:hidden}div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowLeft{position:absolute;top:0;left:0;width:50%;height:9px;background:url("../images/shadow_left.png") no-repeat top left;z-index:10}div.DTED_Envelope_Wrapper div.DTED_Envelope_ShadowRight{position:absolute;top:0;right:0;width:50%;height:9px;background:url("../images/shadow_right.png") no-repeat top right;z-index:10}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container{position:absolute;top:0;left:5%;width:90%;border-left:1px solid #777;border-right:1px solid #777;border-bottom:1px solid #777;box-shadow:3px 3px 10px #555;border-bottom-left-radius:5px;border-bottom-right-radius:5px;background-color:white}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Processing_Indicator{right:36px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTE_Footer{border-bottom-left-radius:5px;border-bottom-right-radius:5px}div.DTED_Envelope_Wrapper div.DTED_Envelope_Container div.DTED_Envelope_Close{position:absolute;top:16px;right:10px;width:18px;height:18px;cursor:pointer;*cursor:hand;z-index:12;text-align:center;font-size:12px;background:#F8F8F8;background:-webkit-gradient(linear, center bottom, center top, from(#CCC), to(#fff));background:-moz-linear-gradient(top, #fff, #CCC);background:linear-gradient(to bottom, #fff, #CCC);text-shadow:0 1px 0 white;border:1px solid #999;border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;box-shadow:0px 0px 1px #999;-moz-box-shadow:0px 0px 1px #999;-webkit-box-shadow:0px 0px 1px #999}div.DTED_Envelope_Background{position:fixed;top:0;left:0;width:100%;height:100%;z-index:10;background:rgba(0,0,0,0.4);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.1)), color-stop(1, rgba(0,0,0,0.4)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.4) 100%)}table.dataTable tbody tr.highlight{background-color:#FFFBCC !important}table.dataTable tbody tr.highlight,table.dataTable tbody tr.noHighlight,table.dataTable tbody tr.highlight td,table.dataTable tbody tr.noHighlight td{-webkit-transition:background-color 500ms linear;-moz-transition:background-color 500ms linear;-ms-transition:background-color 500ms linear;-o-transition:background-color 500ms linear;transition:background-color 500ms linear}table.dataTable.stripe tbody tr.odd.highlight,table.dataTable.display tbody tr.odd.highlight{background-color:#f9f5c7}table.dataTable.hover tbody tr:hover.highlight,table.dataTable.hover tbody tr.odd:hover.highlight,table.dataTable.hover tbody tr.even:hover.highlight,table.dataTable.display tbody tr:hover.highlight,table.dataTable.display tbody tr.odd:hover.highlight,table.dataTable.display tbody tr.even:hover.highlight{background-color:#f6f2c5}table.dataTable.order-column tbody tr.highlight>.sorting_1,table.dataTable.order-column tbody tr.highlight>.sorting_2,table.dataTable.order-column tbody tr.highlight>.sorting_3,table.dataTable.display tbody tr.highlight>.sorting_1,table.dataTable.display tbody tr.highlight>.sorting_2,table.dataTable.display tbody tr.highlight>.sorting_3{background-color:#faf6c8}table.dataTable.display tbody tr.odd.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_1{background-color:#f1edc1}table.dataTable.display tbody tr.odd.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_2{background-color:#f3efc2}table.dataTable.display tbody tr.odd.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_3{background-color:#f5f1c4}table.dataTable.display tbody tr.even.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_1{background-color:#faf6c8}table.dataTable.display tbody tr.even.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_2{background-color:#fcf8ca}table.dataTable.display tbody tr.even.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_3{background-color:#fefacb}table.dataTable.display tbody tr:hover.highlight>.sorting_1,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.display tbody tr.even:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_1{background-color:#eae6bb}table.dataTable.display tbody tr:hover.highlight>.sorting_2,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.display tbody tr.even:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_2{background-color:#ece8bd}table.dataTable.display tbody tr:hover.highlight>.sorting_3,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.display tbody tr.even:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_3{background-color:#efebbf}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em}div.editor-datetime{position:absolute;background-color:white;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5);padding-bottom:5px}div.editor-datetime div.editor-datetime-title{text-align:center;padding:5px 0px 3px}div.editor-datetime table{border-spacing:0;margin:6px 13px}div.editor-datetime table th{font-size:0.8em;color:#777;font-weight:normal;width:14.285714286%;padding:0 0 4px 0;text-align:center}div.editor-datetime table td{font-size:0.9em;color:#444;padding:0}div.editor-datetime table td.day{text-align:right;background:#f5f5f5}div.editor-datetime table td.day.disabled{color:#aaa;background:white}div.editor-datetime table td.day.today{background-color:#ddd}div.editor-datetime table td.day.today button{font-weight:bold}div.editor-datetime table td.day.selected button{background:#4E6CA3;color:white;border-radius:2px}div.editor-datetime table td.day button:hover{background:#ff8000;color:white;border-radius:2px}div.editor-datetime table td.editor-datetime-week{font-size:0.7em}div.editor-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:inherit;padding:5px 9px;cursor:pointer;margin:0}div.editor-datetime table.weekNumber th{width:12.5%}div.editor-datetime div.editor-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.editor-datetime div.editor-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.editor-datetime div.editor-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0;-ms-filter:"alpha(opacity=0)"}div.editor-datetime div.editor-datetime-time{text-align:center}div.editor-datetime div.editor-datetime-time>span{vertical-align:middle}div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock{display:inline-block;vertical-align:middle}div.editor-datetime div.editor-datetime-iconLeft,div.editor-datetime div.editor-datetime-iconRight,div.editor-datetime div.editor-datetime-iconUp,div.editor-datetime div.editor-datetime-iconDown{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:0.3;overflow:hidden;box-sizing:border-box}div.editor-datetime div.editor-datetime-iconLeft:hover,div.editor-datetime div.editor-datetime-iconRight:hover,div.editor-datetime div.editor-datetime-iconUp:hover,div.editor-datetime div.editor-datetime-iconDown:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:0.6}div.editor-datetime div.editor-datetime-iconLeft button,div.editor-datetime div.editor-datetime-iconRight button,div.editor-datetime div.editor-datetime-iconUp button,div.editor-datetime div.editor-datetime-iconDown button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.editor-datetime div.editor-datetime-iconLeft{position:absolute;top:5px;left:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==")}div.editor-datetime div.editor-datetime-iconRight{position:absolute;top:5px;right:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconUp{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconDown{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC")}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.foundation.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,612 @@
+div.DTE div.DTE_Form_Error {
+  display: none;
+  color: #b11f1f;
+}
+
+div.DTE_Field div.multi-value,
+div.DTE_Field div.multi-restore {
+  display: none;
+  cursor: pointer;
+  padding: 0.75rem;
+}
+div.DTE_Field div.multi-value span,
+div.DTE_Field div.multi-restore span {
+  display: block;
+  color: #666;
+  font-size: 0.8em;
+  line-height: 1.25em;
+}
+div.DTE_Field div.multi-value:hover,
+div.DTE_Field div.multi-restore:hover {
+  background-color: #e5e5e5;
+}
+div.DTE_Field div.multi-restore {
+  margin-top: 0.5em;
+  font-size: 0.8em;
+  line-height: 1.25em;
+  padding: 0.5rem 0.75rem;
+}
+div.DTE_Field div.label {
+  margin-top: 0.5rem;
+  margin-bottom: 0.5rem;
+}
+div.DTE_Field div.label:empty {
+  padding: 0;
+  margin: 0;
+}
+div.DTE_Field:after {
+  display: block;
+  content: ".";
+  height: 0;
+  line-height: 0;
+  clear: both;
+  visibility: hidden;
+}
+
+div.reveal-modal button.close {
+  position: absolute;
+  top: -1.5em;
+  right: -2.5em;
+}
+div.reveal-modal button.close.close-button {
+  right: 1rem;
+  top: .5rem;
+  z-index: 100;
+}
+div.reveal-modal div.DTE_Header {
+  position: relative;
+  top: -0.5em;
+  font-size: 2.05556rem;
+  line-height: 1.4;
+}
+div.reveal-modal div.DTE_Form_Content {
+  width: 75%;
+  margin: 0 auto;
+}
+div.reveal-modal div.DTE_Footer {
+  position: relative;
+  bottom: -0.5em;
+  float: right;
+}
+div.reveal-modal div.DTE_Footer button {
+  margin-bottom: 0;
+}
+
+div.DTE_Inline {
+  position: relative;
+  display: table;
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field,
+div.DTE_Inline div.DTE_Inline_Buttons {
+  display: table-cell;
+  vertical-align: middle;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field {
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field > label,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field > label {
+  display: none;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input {
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button {
+  margin: -6px 0 -6px 4px;
+  padding: 5px;
+}
+div.DTE_Inline div.DTE_Field input[type="color"],
+div.DTE_Inline div.DTE_Field input[type="date"],
+div.DTE_Inline div.DTE_Field input[type="datetime"],
+div.DTE_Inline div.DTE_Field input[type="datetime-local"],
+div.DTE_Inline div.DTE_Field input[type="email"],
+div.DTE_Inline div.DTE_Field input[type="month"],
+div.DTE_Inline div.DTE_Field input[type="number"],
+div.DTE_Inline div.DTE_Field input[type="password"],
+div.DTE_Inline div.DTE_Field input[type="search"],
+div.DTE_Inline div.DTE_Field input[type="tel"],
+div.DTE_Inline div.DTE_Field input[type="text"],
+div.DTE_Inline div.DTE_Field input[type="time"],
+div.DTE_Inline div.DTE_Field input[type="url"],
+div.DTE_Inline div.DTE_Field input[type="week"] {
+  margin: -6px 0;
+}
+div.DTE_Inline.DTE_Processing:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 4px;
+  right: 10px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+
+span.dtr-data div.DTE_Inline {
+  display: inline-table;
+}
+
+div.DTE_Inline div.DTE_Field > div {
+  width: 100%;
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Field input {
+  height: 30px;
+  margin-bottom: 0;
+}
+div.DTE_Inline div.DTE_Field div.label:empty {
+  display: none;
+}
+
+div.DTE_Bubble {
+  position: absolute;
+  z-index: 11;
+  margin-top: -6px;
+  opacity: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  position: absolute;
+  bottom: 0;
+  border: 1px solid black;
+  width: 300px;
+  margin-left: -150px;
+  background-color: white;
+  box-shadow: 2px 2px 7px #555;
+  border-radius: 5px;
+  border: 2px solid #444;
+  padding: 1em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table {
+  display: table;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form {
+  display: table-cell;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content {
+  padding: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons {
+  display: table-cell;
+  vertical-align: bottom;
+  padding: 0 0 0 0.75em;
+  width: 1%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Form_Info,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Bubble_Table {
+  padding-top: 42px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error {
+  float: none;
+  display: none;
+  padding: 0;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close {
+  position: absolute;
+  top: -11px;
+  right: -11px;
+  width: 22px;
+  height: 22px;
+  border: 2px solid white;
+  background-color: black;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+  z-index: 12;
+  box-shadow: 2px 2px 6px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  content: '\00d7';
+  color: white;
+  font-weight: bold;
+  font-size: 18px;
+  line-height: 22px;
+  font-family: 'Courier New', Courier, monospace;
+  padding-left: 1px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover {
+  background-color: #092079;
+  box-shadow: 2px 2px 9px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Triangle {
+  position: absolute;
+  height: 10px;
+  width: 10px;
+  top: -6px;
+  background-color: white;
+  border: 2px solid #444;
+  border-top: none;
+  border-right: none;
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 12px;
+  right: 18px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Liner {
+  top: 10px;
+  bottom: auto;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Triangle {
+  top: 4px;
+  -webkit-transform: rotate(135deg);
+  -moz-transform: rotate(135deg);
+  -ms-transform: rotate(135deg);
+  -o-transform: rotate(135deg);
+  transform: rotate(135deg);
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 10;
+}
+div.DTE_Bubble_Background > div {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+}
+div.DTE_Bubble_Background > div:not([dummy]) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+}
+
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  border-radius: 6px;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field label,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field > div {
+  width: 100%;
+  float: none;
+  clear: both;
+  text-align: left;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field label {
+  padding-bottom: 4px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  font-size: 14px;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  margin-top: -2px;
+  display: block;
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  z-index: 10;
+  background-color: rgba(0, 0, 0, 0.05);
+}
+
+div.DTE div.editor_upload {
+  padding-top: 4px;
+}
+div.DTE div.editor_upload div.eu_table {
+  display: table;
+  width: 100%;
+}
+div.DTE div.editor_upload div.row {
+  display: table-row;
+}
+div.DTE div.editor_upload div.cell {
+  display: table-cell;
+  position: relative;
+  width: 50%;
+  vertical-align: top;
+}
+div.DTE div.editor_upload div.cell + div.cell {
+  padding-left: 10px;
+}
+div.DTE div.editor_upload div.row + div.row div.cell {
+  padding-top: 10px;
+}
+div.DTE div.editor_upload button.btn,
+div.DTE div.editor_upload input[type=file] {
+  width: 100%;
+  height: 2.3em;
+  font-size: 0.8em;
+  text-align: center;
+  line-height: 1em;
+}
+div.DTE div.editor_upload input[type=file] {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  opacity: 0;
+}
+div.DTE div.editor_upload div.drop {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  border: 3px dashed #ccc;
+  border-radius: 6px;
+  min-height: 4em;
+  color: #999;
+  padding-top: 3px;
+  text-align: center;
+}
+div.DTE div.editor_upload div.drop.over {
+  border: 3px dashed #111;
+  color: #111;
+}
+div.DTE div.editor_upload div.drop span {
+  max-width: 75%;
+  font-size: 0.85em;
+  line-height: 1em;
+}
+div.DTE div.editor_upload div.rendered img {
+  max-width: 8em;
+  margin: 0 auto;
+}
+div.DTE div.editor_upload.noDrop div.drop {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.row.second {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.rendered {
+  margin-top: 10px;
+}
+div.DTE div.editor_upload.noClear div.clearValue button {
+  display: none;
+}
+div.DTE div.editor_upload.multi div.cell {
+  display: block;
+  width: 100%;
+}
+div.DTE div.editor_upload.multi div.cell div.drop {
+  min-height: 0;
+  padding-bottom: 5px;
+}
+div.DTE div.editor_upload.multi div.clearValue {
+  display: none;
+}
+div.DTE div.editor_upload.multi ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+div.DTE div.editor_upload.multi ul li {
+  position: relative;
+  margin-top: 0.5em;
+}
+div.DTE div.editor_upload.multi ul li:first-child {
+  margin-top: 0;
+}
+div.DTE div.editor_upload.multi ul li img {
+  vertical-align: middle;
+}
+div.DTE div.editor_upload.multi ul li button {
+  position: absolute;
+  width: 40px;
+  right: 0;
+  top: 50%;
+  margin-top: -1.5em;
+}
+
+div.DTE div.editor_upload button.button,
+div.DTE div.editor_upload input[type=file] {
+  width: 100%;
+  font-size: 0.8em;
+  margin-bottom: 0;
+}
+div.DTE div.editor_upload ul li button {
+  width: 63px;
+}
+
+div.editor-datetime {
+  position: absolute;
+  background-color: white;
+  z-index: 2050;
+  border: 1px solid #ccc;
+  box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5);
+  padding-bottom: 5px;
+}
+div.editor-datetime div.editor-datetime-title {
+  text-align: center;
+  padding: 5px 0px 3px;
+}
+div.editor-datetime table {
+  border-spacing: 0;
+  margin: 6px 13px;
+}
+div.editor-datetime table th {
+  font-size: 0.8em;
+  color: #777;
+  font-weight: normal;
+  width: 14.285714286%;
+  padding: 0 0 4px 0;
+  text-align: center;
+}
+div.editor-datetime table td {
+  font-size: 0.9em;
+  color: #444;
+  padding: 0;
+}
+div.editor-datetime table td.day {
+  text-align: right;
+  background: #f5f5f5;
+}
+div.editor-datetime table td.day.disabled {
+  color: #aaa;
+  background: white;
+}
+div.editor-datetime table td.day.today {
+  background-color: #ddd;
+}
+div.editor-datetime table td.day.today button {
+  font-weight: bold;
+}
+div.editor-datetime table td.day.selected button {
+  background: #008CBA;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.day button:hover {
+  background: #ff8000;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.editor-datetime-week {
+  font-size: 0.7em;
+}
+div.editor-datetime table button {
+  width: 100%;
+  box-sizing: border-box;
+  border: none;
+  background: transparent;
+  font-size: inherit;
+  color: inherit;
+  text-align: inherit;
+  padding: 5px 9px;
+  cursor: pointer;
+  margin: 0;
+}
+div.editor-datetime table.weekNumber th {
+  width: 12.5%;
+}
+div.editor-datetime div.editor-datetime-label {
+  position: relative;
+  display: inline-block;
+  height: 30px;
+  padding: 5px 6px;
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-label:hover {
+  border: 1px solid #ddd;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+div.editor-datetime div.editor-datetime-label select {
+  position: absolute;
+  top: 6px;
+  left: 0;
+  cursor: pointer;
+  opacity: 0;
+  -ms-filter: "alpha(opacity=0)";
+}
+div.editor-datetime div.editor-datetime-time {
+  text-align: center;
+}
+div.editor-datetime div.editor-datetime-time > span {
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock {
+  display: inline-block;
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-iconLeft,
+div.editor-datetime div.editor-datetime-iconRight,
+div.editor-datetime div.editor-datetime-iconUp,
+div.editor-datetime div.editor-datetime-iconDown {
+  width: 30px;
+  height: 30px;
+  background-position: center;
+  background-repeat: no-repeat;
+  opacity: 0.3;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+div.editor-datetime div.editor-datetime-iconLeft:hover,
+div.editor-datetime div.editor-datetime-iconRight:hover,
+div.editor-datetime div.editor-datetime-iconUp:hover,
+div.editor-datetime div.editor-datetime-iconDown:hover {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background-color: #f0f0f0;
+  opacity: 0.6;
+}
+div.editor-datetime div.editor-datetime-iconLeft button,
+div.editor-datetime div.editor-datetime-iconRight button,
+div.editor-datetime div.editor-datetime-iconUp button,
+div.editor-datetime div.editor-datetime-iconDown button {
+  border: none;
+  background: transparent;
+  text-indent: 30px;
+  height: 100%;
+  width: 100%;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-iconLeft {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+}
+div.editor-datetime div.editor-datetime-iconRight {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconUp {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconDown {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC");
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.foundation.min.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,1 @@
+div.DTE div.DTE_Form_Error{display:none;color:#b11f1f}div.DTE_Field div.multi-value,div.DTE_Field div.multi-restore{display:none;cursor:pointer;padding:0.75rem}div.DTE_Field div.multi-value span,div.DTE_Field div.multi-restore span{display:block;color:#666;font-size:0.8em;line-height:1.25em}div.DTE_Field div.multi-value:hover,div.DTE_Field div.multi-restore:hover{background-color:#e5e5e5}div.DTE_Field div.multi-restore{margin-top:0.5em;font-size:0.8em;line-height:1.25em;padding:0.5rem 0.75rem}div.DTE_Field div.label{margin-top:0.5rem;margin-bottom:0.5rem}div.DTE_Field div.label:empty{padding:0;margin:0}div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.reveal-modal button.close{position:absolute;top:-1.5em;right:-2.5em}div.reveal-modal button.close.close-button{right:1rem;top:.5rem;z-index:100}div.reveal-modal div.DTE_Header{position:relative;top:-0.5em;font-size:2.05556rem;line-height:1.4}div.reveal-modal div.DTE_Form_Content{width:75%;margin:0 auto}div.reveal-modal div.DTE_Footer{position:relative;bottom:-0.5em;float:right}div.reveal-modal div.DTE_Footer button{margin-bottom:0}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input{width:100%}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline.DTE_Processing:after{position:absolute;content:' ';display:block;top:4px;right:10px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}span.dtr-data div.DTE_Inline{display:inline-table}div.DTE_Inline div.DTE_Field>div{width:100%;padding:0}div.DTE_Inline div.DTE_Field input{height:30px;margin-bottom:0}div.DTE_Inline div.DTE_Field div.label:empty{display:none}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after{position:absolute;content:' ';display:block;top:12px;right:18px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Bubble div.DTE_Bubble_Liner{box-shadow:0 5px 10px rgba(0,0,0,0.2);border-radius:6px;border:1px solid rgba(0,0,0,0.2)}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field label,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field>div{width:100%;float:none;clear:both;text-align:left}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field label{padding-bottom:4px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;font-size:14px;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{margin-top:-2px;display:block}div.DTE_Bubble_Background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:10;background-color:rgba(0,0,0,0.05)}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em}div.DTE div.editor_upload button.button,div.DTE div.editor_upload input[type=file]{width:100%;font-size:0.8em;margin-bottom:0}div.DTE div.editor_upload ul li button{width:63px}div.editor-datetime{position:absolute;background-color:white;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5);padding-bottom:5px}div.editor-datetime div.editor-datetime-title{text-align:center;padding:5px 0px 3px}div.editor-datetime table{border-spacing:0;margin:6px 13px}div.editor-datetime table th{font-size:0.8em;color:#777;font-weight:normal;width:14.285714286%;padding:0 0 4px 0;text-align:center}div.editor-datetime table td{font-size:0.9em;color:#444;padding:0}div.editor-datetime table td.day{text-align:right;background:#f5f5f5}div.editor-datetime table td.day.disabled{color:#aaa;background:white}div.editor-datetime table td.day.today{background-color:#ddd}div.editor-datetime table td.day.today button{font-weight:bold}div.editor-datetime table td.day.selected button{background:#008CBA;color:white;border-radius:2px}div.editor-datetime table td.day button:hover{background:#ff8000;color:white;border-radius:2px}div.editor-datetime table td.editor-datetime-week{font-size:0.7em}div.editor-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:inherit;padding:5px 9px;cursor:pointer;margin:0}div.editor-datetime table.weekNumber th{width:12.5%}div.editor-datetime div.editor-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.editor-datetime div.editor-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.editor-datetime div.editor-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0;-ms-filter:"alpha(opacity=0)"}div.editor-datetime div.editor-datetime-time{text-align:center}div.editor-datetime div.editor-datetime-time>span{vertical-align:middle}div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock{display:inline-block;vertical-align:middle}div.editor-datetime div.editor-datetime-iconLeft,div.editor-datetime div.editor-datetime-iconRight,div.editor-datetime div.editor-datetime-iconUp,div.editor-datetime div.editor-datetime-iconDown{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:0.3;overflow:hidden;box-sizing:border-box}div.editor-datetime div.editor-datetime-iconLeft:hover,div.editor-datetime div.editor-datetime-iconRight:hover,div.editor-datetime div.editor-datetime-iconUp:hover,div.editor-datetime div.editor-datetime-iconDown:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:0.6}div.editor-datetime div.editor-datetime-iconLeft button,div.editor-datetime div.editor-datetime-iconRight button,div.editor-datetime div.editor-datetime-iconUp button,div.editor-datetime div.editor-datetime-iconDown button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.editor-datetime div.editor-datetime-iconLeft{position:absolute;top:5px;left:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==")}div.editor-datetime div.editor-datetime-iconRight{position:absolute;top:5px;right:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconUp{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconDown{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC")}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.jqueryui.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,801 @@
+div.DTE_Field input,
+div.DTE_Field textarea {
+  box-sizing: border-box;
+  background-color: white;
+  -webkit-transition: background-color ease-in-out .15s;
+  transition: background-color ease-in-out .15s;
+}
+div.DTE_Field input:focus,
+div.DTE_Field textarea:focus {
+  background-color: #ffffee;
+}
+div.DTE_Field input[type="color"],
+div.DTE_Field input[type="date"],
+div.DTE_Field input[type="datetime"],
+div.DTE_Field input[type="datetime-local"],
+div.DTE_Field input[type="email"],
+div.DTE_Field input[type="month"],
+div.DTE_Field input[type="number"],
+div.DTE_Field input[type="password"],
+div.DTE_Field input[type="search"],
+div.DTE_Field input[type="tel"],
+div.DTE_Field input[type="text"],
+div.DTE_Field input[type="time"],
+div.DTE_Field input[type="url"],
+div.DTE_Field input[type="week"] {
+  padding: 6px 4px;
+  width: 100%;
+}
+div.DTE_Field div.DTE_Field_Info,
+div.DTE_Field div.DTE_Field_Message {
+  font-size: 11px;
+  line-height: 1em;
+}
+div.DTE_Field div.DTE_Field_Error {
+  font-size: 11px;
+  line-height: 1em;
+  display: none;
+  color: red;
+  margin-top: 5px;
+}
+div.DTE_Field div.multi-value {
+  display: none;
+  border: 1px dotted #666;
+  border-radius: 3px;
+  padding: 5px;
+  background-color: #fafafa;
+  cursor: pointer;
+}
+div.DTE_Field div.multi-value span {
+  font-size: 0.8em;
+  line-height: 1.25em;
+  display: block;
+  color: #666;
+}
+div.DTE_Field div.multi-value:hover {
+  background-color: #f1f1f1;
+}
+div.DTE_Field div.multi-restore {
+  display: none;
+  margin-top: 0.5em;
+  font-size: 0.8em;
+  line-height: 1.25em;
+  color: #3879d9;
+}
+div.DTE_Field div.multi-restore:hover {
+  text-decoration: underline;
+  cursor: pointer;
+}
+
+div.DTE_Field_Type_textarea textarea {
+  padding: 3px;
+  width: 100%;
+  height: 80px;
+}
+
+div.DTE_Field.DTE_Field_Type_date img {
+  vertical-align: middle;
+  cursor: pointer;
+  *cursor: hand;
+}
+div.DTE_Field.DTE_Field_Type_date input.jqueryui {
+  width: 87%;
+  margin-right: 6px;
+}
+
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div {
+  margin-bottom: 0.25em;
+}
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div:last-child,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Field_Type_checkbox div.DTE_Field_Input > div > div label,
+div.DTE_Field_Type_radio div.DTE_Field_Input > div > div label {
+  margin-left: 0.75em;
+  vertical-align: middle;
+}
+
+div.DTE_Field_Type_select div.DTE_Field_Input {
+  padding-top: 4px;
+}
+
+div.DTE_Body {
+  padding: 50px 0;
+}
+div.DTE_Body div.DTE_Body_Content {
+  position: relative;
+  overflow: auto;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info {
+  padding: 1em 1em 0 1em;
+  margin: 0;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  clear: both;
+  padding: 5px 20%;
+  border: 1px solid transparent;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field:after {
+  display: block;
+  content: ".";
+  height: 0;
+  line-height: 0;
+  clear: both;
+  visibility: hidden;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover {
+  background-color: #f9f9f9;
+  border: 1px solid #f3f3f3;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+  float: left;
+  width: 40%;
+  padding-top: 6px;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+  float: right;
+  width: 60%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+  padding: 5px 0 5px 20%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+  width: 30%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+  width: 70%;
+}
+div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+  float: none;
+  clear: both;
+  width: 100%;
+}
+
+html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+  float: right;
+}
+html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+  float: left;
+}
+html[dir="rtl"] div.DTE div.DTE_Form_Buttons button {
+  float: left;
+}
+
+@media only screen and (max-width: 768px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    padding: 5px 10%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+    padding: 5px 0 5px 10%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+    width: 35.5%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+    width: 64.5%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+@media only screen and (max-width: 640px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full {
+    padding: 5px 0%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label {
+    width: 40%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input {
+    width: 60%;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+@media only screen and (max-width: 580px) {
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+    position: relative;
+    zoom: 1;
+    clear: both;
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field > div.DTE_Field_Input {
+    float: none;
+    width: auto;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full, div.DTE_Body div.DTE_Body_Content div.DTE_Field.block {
+    padding: 5px 0;
+  }
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > label,
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.full > div.DTE_Field_Input, div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > label,
+  div.DTE_Body div.DTE_Body_Content div.DTE_Field.block > div.DTE_Field_Input {
+    width: 100%;
+  }
+}
+div.DTE_Bubble {
+  position: absolute;
+  z-index: 11;
+  margin-top: -6px;
+  opacity: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner {
+  position: absolute;
+  bottom: 0;
+  border: 1px solid black;
+  width: 300px;
+  margin-left: -150px;
+  background-color: white;
+  box-shadow: 2px 2px 7px #555;
+  border-radius: 5px;
+  border: 2px solid #444;
+  padding: 1em;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table {
+  display: table;
+  width: 100%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form {
+  display: table-cell;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content {
+  padding: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field {
+  position: relative;
+  zoom: 1;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table > form div.DTE_Form_Content div.DTE_Field:last-child {
+  margin-bottom: 0;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons {
+  display: table-cell;
+  vertical-align: bottom;
+  padding: 0 0 0 0.75em;
+  width: 1%;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header {
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Form_Info,
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header + div.DTE_Bubble_Table {
+  padding-top: 42px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error {
+  float: none;
+  display: none;
+  padding: 0;
+  margin-bottom: 0.5em;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close {
+  position: absolute;
+  top: -11px;
+  right: -11px;
+  width: 22px;
+  height: 22px;
+  border: 2px solid white;
+  background-color: black;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+  z-index: 12;
+  box-shadow: 2px 2px 6px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after {
+  content: '\00d7';
+  color: white;
+  font-weight: bold;
+  font-size: 18px;
+  line-height: 22px;
+  font-family: 'Courier New', Courier, monospace;
+  padding-left: 1px;
+}
+div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover {
+  background-color: #092079;
+  box-shadow: 2px 2px 9px #111;
+}
+div.DTE_Bubble div.DTE_Bubble_Triangle {
+  position: absolute;
+  height: 10px;
+  width: 10px;
+  top: -6px;
+  background-color: white;
+  border: 2px solid #444;
+  border-top: none;
+  border-right: none;
+  -webkit-transform: rotate(-45deg);
+  -moz-transform: rotate(-45deg);
+  -ms-transform: rotate(-45deg);
+  -o-transform: rotate(-45deg);
+  transform: rotate(-45deg);
+}
+div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 12px;
+  right: 18px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Liner {
+  top: 10px;
+  bottom: auto;
+}
+div.DTE_Bubble.below div.DTE_Bubble_Triangle {
+  top: 4px;
+  -webkit-transform: rotate(135deg);
+  -moz-transform: rotate(135deg);
+  -ms-transform: rotate(135deg);
+  -o-transform: rotate(135deg);
+  transform: rotate(135deg);
+}
+
+div.DTE_Bubble_Background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background: rgba(0, 0, 0, 0.7);
+  /* Fallback */
+  background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* IE10 Consumer Preview */
+  background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Firefox */
+  background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Opera */
+  background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7)));
+  /* Webkit (Safari/Chrome 10) */
+  background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* Webkit (Chrome 11+) */
+  background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%);
+  /* W3C Markup, IE10 Release Preview */
+  z-index: 10;
+}
+div.DTE_Bubble_Background > div {
+  position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  bottom: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+}
+div.DTE_Bubble_Background > div:not([dummy]) {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+}
+
+div.DTE_Inline {
+  position: relative;
+  display: table;
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field,
+div.DTE_Inline div.DTE_Inline_Buttons {
+  display: table-cell;
+  vertical-align: middle;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field {
+  padding: 0;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field > label,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field > label {
+  display: none;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input {
+  width: 100%;
+}
+div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,
+div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button {
+  margin: -6px 0 -6px 4px;
+  padding: 5px;
+}
+div.DTE_Inline div.DTE_Field input[type="color"],
+div.DTE_Inline div.DTE_Field input[type="date"],
+div.DTE_Inline div.DTE_Field input[type="datetime"],
+div.DTE_Inline div.DTE_Field input[type="datetime-local"],
+div.DTE_Inline div.DTE_Field input[type="email"],
+div.DTE_Inline div.DTE_Field input[type="month"],
+div.DTE_Inline div.DTE_Field input[type="number"],
+div.DTE_Inline div.DTE_Field input[type="password"],
+div.DTE_Inline div.DTE_Field input[type="search"],
+div.DTE_Inline div.DTE_Field input[type="tel"],
+div.DTE_Inline div.DTE_Field input[type="text"],
+div.DTE_Inline div.DTE_Field input[type="time"],
+div.DTE_Inline div.DTE_Field input[type="url"],
+div.DTE_Inline div.DTE_Field input[type="week"] {
+  margin: -6px 0;
+}
+div.DTE_Inline.DTE_Processing:after {
+  position: absolute;
+  content: ' ';
+  display: block;
+  top: 4px;
+  right: 10px;
+  height: 12px;
+  width: 17px;
+  background: url("../images/ajax-loader-small.gif") no-repeat top left;
+}
+
+span.dtr-data div.DTE_Inline {
+  display: inline-table;
+}
+
+table.dataTable tbody tr.highlight {
+  background-color: #FFFBCC !important;
+}
+table.dataTable tbody tr.highlight,
+table.dataTable tbody tr.noHighlight,
+table.dataTable tbody tr.highlight td,
+table.dataTable tbody tr.noHighlight td {
+  -webkit-transition: background-color 500ms linear;
+  -moz-transition: background-color 500ms linear;
+  -ms-transition: background-color 500ms linear;
+  -o-transition: background-color 500ms linear;
+  transition: background-color 500ms linear;
+}
+table.dataTable.stripe tbody tr.odd.highlight, table.dataTable.display tbody tr.odd.highlight {
+  background-color: #f9f5c7;
+}
+table.dataTable.hover tbody tr:hover.highlight,
+table.dataTable.hover tbody tr.odd:hover.highlight,
+table.dataTable.hover tbody tr.even:hover.highlight, table.dataTable.display tbody tr:hover.highlight,
+table.dataTable.display tbody tr.odd:hover.highlight,
+table.dataTable.display tbody tr.even:hover.highlight {
+  background-color: #f6f2c5;
+}
+table.dataTable.order-column tbody tr.highlight > .sorting_1,
+table.dataTable.order-column tbody tr.highlight > .sorting_2,
+table.dataTable.order-column tbody tr.highlight > .sorting_3, table.dataTable.display tbody tr.highlight > .sorting_1,
+table.dataTable.display tbody tr.highlight > .sorting_2,
+table.dataTable.display tbody tr.highlight > .sorting_3 {
+  background-color: #faf6c8;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_1 {
+  background-color: #f1edc1;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_2 {
+  background-color: #f3efc2;
+}
+table.dataTable.display tbody tr.odd.highlight > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.highlight > .sorting_3 {
+  background-color: #f5f1c4;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_1 {
+  background-color: #faf6c8;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_2 {
+  background-color: #fcf8ca;
+}
+table.dataTable.display tbody tr.even.highlight > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.highlight > .sorting_3 {
+  background-color: #fefacb;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_1,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_1 {
+  background-color: #eae6bb;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_2,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_2 {
+  background-color: #ece8bd;
+}
+table.dataTable.display tbody tr:hover.highlight > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.highlight > .sorting_3,
+table.dataTable.display tbody tr.even:hover.highlight > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.highlight > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.highlight > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.highlight > .sorting_3 {
+  background-color: #efebbf;
+}
+
+div.DTE div.editor_upload {
+  padding-top: 4px;
+}
+div.DTE div.editor_upload div.eu_table {
+  display: table;
+  width: 100%;
+}
+div.DTE div.editor_upload div.row {
+  display: table-row;
+}
+div.DTE div.editor_upload div.cell {
+  display: table-cell;
+  position: relative;
+  width: 50%;
+  vertical-align: top;
+}
+div.DTE div.editor_upload div.cell + div.cell {
+  padding-left: 10px;
+}
+div.DTE div.editor_upload div.row + div.row div.cell {
+  padding-top: 10px;
+}
+div.DTE div.editor_upload button.btn,
+div.DTE div.editor_upload input[type=file] {
+  width: 100%;
+  height: 2.3em;
+  font-size: 0.8em;
+  text-align: center;
+  line-height: 1em;
+}
+div.DTE div.editor_upload input[type=file] {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  opacity: 0;
+}
+div.DTE div.editor_upload div.drop {
+  position: relative;
+  box-sizing: border-box;
+  width: 100%;
+  height: 100%;
+  border: 3px dashed #ccc;
+  border-radius: 6px;
+  min-height: 4em;
+  color: #999;
+  padding-top: 3px;
+  text-align: center;
+}
+div.DTE div.editor_upload div.drop.over {
+  border: 3px dashed #111;
+  color: #111;
+}
+div.DTE div.editor_upload div.drop span {
+  max-width: 75%;
+  font-size: 0.85em;
+  line-height: 1em;
+}
+div.DTE div.editor_upload div.rendered img {
+  max-width: 8em;
+  margin: 0 auto;
+}
+div.DTE div.editor_upload.noDrop div.drop {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.row.second {
+  display: none;
+}
+div.DTE div.editor_upload.noDrop div.rendered {
+  margin-top: 10px;
+}
+div.DTE div.editor_upload.noClear div.clearValue button {
+  display: none;
+}
+div.DTE div.editor_upload.multi div.cell {
+  display: block;
+  width: 100%;
+}
+div.DTE div.editor_upload.multi div.cell div.drop {
+  min-height: 0;
+  padding-bottom: 5px;
+}
+div.DTE div.editor_upload.multi div.clearValue {
+  display: none;
+}
+div.DTE div.editor_upload.multi ul {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+}
+div.DTE div.editor_upload.multi ul li {
+  position: relative;
+  margin-top: 0.5em;
+}
+div.DTE div.editor_upload.multi ul li:first-child {
+  margin-top: 0;
+}
+div.DTE div.editor_upload.multi ul li img {
+  vertical-align: middle;
+}
+div.DTE div.editor_upload.multi ul li button {
+  position: absolute;
+  width: 40px;
+  right: 0;
+  top: 50%;
+  margin-top: -1.5em;
+}
+
+div.editor-datetime {
+  position: absolute;
+  background-color: white;
+  z-index: 2050;
+  border: 1px solid #ccc;
+  box-shadow: 0 5px 15px -5px rgba(0, 0, 0, 0.5);
+  padding-bottom: 5px;
+}
+div.editor-datetime div.editor-datetime-title {
+  text-align: center;
+  padding: 5px 0px 3px;
+}
+div.editor-datetime table {
+  border-spacing: 0;
+  margin: 6px 13px;
+}
+div.editor-datetime table th {
+  font-size: 0.8em;
+  color: #777;
+  font-weight: normal;
+  width: 14.285714286%;
+  padding: 0 0 4px 0;
+  text-align: center;
+}
+div.editor-datetime table td {
+  font-size: 0.9em;
+  color: #444;
+  padding: 0;
+}
+div.editor-datetime table td.day {
+  text-align: right;
+  background: #f5f5f5;
+}
+div.editor-datetime table td.day.disabled {
+  color: #aaa;
+  background: white;
+}
+div.editor-datetime table td.day.today {
+  background-color: #ddd;
+}
+div.editor-datetime table td.day.today button {
+  font-weight: bold;
+}
+div.editor-datetime table td.day.selected button {
+  background: #4E6CA3;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.day button:hover {
+  background: #ff8000;
+  color: white;
+  border-radius: 2px;
+}
+div.editor-datetime table td.editor-datetime-week {
+  font-size: 0.7em;
+}
+div.editor-datetime table button {
+  width: 100%;
+  box-sizing: border-box;
+  border: none;
+  background: transparent;
+  font-size: inherit;
+  color: inherit;
+  text-align: inherit;
+  padding: 5px 9px;
+  cursor: pointer;
+  margin: 0;
+}
+div.editor-datetime table.weekNumber th {
+  width: 12.5%;
+}
+div.editor-datetime div.editor-datetime-label {
+  position: relative;
+  display: inline-block;
+  height: 30px;
+  padding: 5px 6px;
+  border: 1px solid transparent;
+  box-sizing: border-box;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-label:hover {
+  border: 1px solid #ddd;
+  border-radius: 2px;
+  background-color: #f5f5f5;
+}
+div.editor-datetime div.editor-datetime-label select {
+  position: absolute;
+  top: 6px;
+  left: 0;
+  cursor: pointer;
+  opacity: 0;
+  -ms-filter: "alpha(opacity=0)";
+}
+div.editor-datetime div.editor-datetime-time {
+  text-align: center;
+}
+div.editor-datetime div.editor-datetime-time > span {
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock {
+  display: inline-block;
+  vertical-align: middle;
+}
+div.editor-datetime div.editor-datetime-iconLeft,
+div.editor-datetime div.editor-datetime-iconRight,
+div.editor-datetime div.editor-datetime-iconUp,
+div.editor-datetime div.editor-datetime-iconDown {
+  width: 30px;
+  height: 30px;
+  background-position: center;
+  background-repeat: no-repeat;
+  opacity: 0.3;
+  overflow: hidden;
+  box-sizing: border-box;
+}
+div.editor-datetime div.editor-datetime-iconLeft:hover,
+div.editor-datetime div.editor-datetime-iconRight:hover,
+div.editor-datetime div.editor-datetime-iconUp:hover,
+div.editor-datetime div.editor-datetime-iconDown:hover {
+  border: 1px solid #ccc;
+  border-radius: 2px;
+  background-color: #f0f0f0;
+  opacity: 0.6;
+}
+div.editor-datetime div.editor-datetime-iconLeft button,
+div.editor-datetime div.editor-datetime-iconRight button,
+div.editor-datetime div.editor-datetime-iconUp button,
+div.editor-datetime div.editor-datetime-iconDown button {
+  border: none;
+  background: transparent;
+  text-indent: 30px;
+  height: 100%;
+  width: 100%;
+  cursor: pointer;
+}
+div.editor-datetime div.editor-datetime-iconLeft {
+  position: absolute;
+  top: 5px;
+  left: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==");
+}
+div.editor-datetime div.editor-datetime-iconRight {
+  position: absolute;
+  top: 5px;
+  right: 5px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconUp {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=");
+}
+div.editor-datetime div.editor-datetime-iconDown {
+  height: 20px;
+  background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC");
+}
+
+div.DTE {
+  font-size: 0.91em;
+}
+div.DTE div.DTE_Header {
+  display: none;
+}
+div.DTE div.DTE_Body {
+  padding: 0;
+}
+div.DTE div.DTE_Body div.DTE_Body_Content {
+  overflow: hidden;
+}
+div.DTE div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+  padding: 5px 5%;
+}
+div.DTE div.DTE_Footer {
+  display: none;
+}
+div.DTE div.DTE_Form_Error {
+  padding-top: 1em;
+  color: red;
+  display: none;
+  color: #b11f1f;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/editor.jqueryui.min.css	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,1 @@
+div.DTE_Field input,div.DTE_Field textarea{box-sizing:border-box;background-color:white;-webkit-transition:background-color ease-in-out .15s;transition:background-color ease-in-out .15s}div.DTE_Field input:focus,div.DTE_Field textarea:focus{background-color:#ffffee}div.DTE_Field input[type="color"],div.DTE_Field input[type="date"],div.DTE_Field input[type="datetime"],div.DTE_Field input[type="datetime-local"],div.DTE_Field input[type="email"],div.DTE_Field input[type="month"],div.DTE_Field input[type="number"],div.DTE_Field input[type="password"],div.DTE_Field input[type="search"],div.DTE_Field input[type="tel"],div.DTE_Field input[type="text"],div.DTE_Field input[type="time"],div.DTE_Field input[type="url"],div.DTE_Field input[type="week"]{padding:6px 4px;width:100%}div.DTE_Field div.DTE_Field_Info,div.DTE_Field div.DTE_Field_Message{font-size:11px;line-height:1em}div.DTE_Field div.DTE_Field_Error{font-size:11px;line-height:1em;display:none;color:red;margin-top:5px}div.DTE_Field div.multi-value{display:none;border:1px dotted #666;border-radius:3px;padding:5px;background-color:#fafafa;cursor:pointer}div.DTE_Field div.multi-value span{font-size:0.8em;line-height:1.25em;display:block;color:#666}div.DTE_Field div.multi-value:hover{background-color:#f1f1f1}div.DTE_Field div.multi-restore{display:none;margin-top:0.5em;font-size:0.8em;line-height:1.25em;color:#3879d9}div.DTE_Field div.multi-restore:hover{text-decoration:underline;cursor:pointer}div.DTE_Field_Type_textarea textarea{padding:3px;width:100%;height:80px}div.DTE_Field.DTE_Field_Type_date img{vertical-align:middle;cursor:pointer;*cursor:hand}div.DTE_Field.DTE_Field_Type_date input.jqueryui{width:87%;margin-right:6px}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div{margin-bottom:0.25em}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div:last-child,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div:last-child{margin-bottom:0}div.DTE_Field_Type_checkbox div.DTE_Field_Input>div>div label,div.DTE_Field_Type_radio div.DTE_Field_Input>div>div label{margin-left:0.75em;vertical-align:middle}div.DTE_Field_Type_select div.DTE_Field_Input{padding-top:4px}div.DTE_Body{padding:50px 0}div.DTE_Body div.DTE_Body_Content{position:relative;overflow:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Form_Info{padding:1em 1em 0 1em;margin:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 20%;border:1px solid transparent}div.DTE_Body div.DTE_Body_Content div.DTE_Field:after{display:block;content:".";height:0;line-height:0;clear:both;visibility:hidden}div.DTE_Body div.DTE_Body_Content div.DTE_Field:hover{background-color:#f9f9f9;border:1px solid #f3f3f3}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:left;width:40%;padding-top:6px}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:right;width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 20%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:30%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:70%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{float:none;clear:both;width:100%}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:right}html[dir="rtl"] div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:left}html[dir="rtl"] div.DTE div.DTE_Form_Buttons button{float:left}@media only screen and (max-width: 768px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0 5px 10%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:35.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:64.5%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 640px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full{padding:5px 0%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label{width:40%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input{width:60%}div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}@media only screen and (max-width: 580px){div.DTE_Body div.DTE_Body_Content div.DTE_Field{position:relative;zoom:1;clear:both;padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>label{float:none;width:auto;padding-top:0}div.DTE_Body div.DTE_Body_Content div.DTE_Field>div.DTE_Field_Input{float:none;width:auto}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block{padding:5px 0}div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.full>div.DTE_Field_Input,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>label,div.DTE_Body div.DTE_Body_Content div.DTE_Field.block>div.DTE_Field_Input{width:100%}}div.DTE_Bubble{position:absolute;z-index:11;margin-top:-6px;opacity:0}div.DTE_Bubble div.DTE_Bubble_Liner{position:absolute;bottom:0;border:1px solid black;width:300px;margin-left:-150px;background-color:white;box-shadow:2px 2px 7px #555;border-radius:5px;border:2px solid #444;padding:1em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table{display:table;width:100%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form{display:table-cell}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content{padding:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field{position:relative;zoom:1;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table>form div.DTE_Form_Content div.DTE_Field:last-child{margin-bottom:0}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Table div.DTE_Form_Buttons{display:table-cell;vertical-align:bottom;padding:0 0 0 0.75em;width:1%}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header{border-top-left-radius:5px;border-top-right-radius:5px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Form_Info,div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Header+div.DTE_Bubble_Table{padding-top:42px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Form_Error{float:none;display:none;padding:0;margin-bottom:0.5em}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close{position:absolute;top:-11px;right:-11px;width:22px;height:22px;border:2px solid white;background-color:black;text-align:center;border-radius:15px;cursor:pointer;z-index:12;box-shadow:2px 2px 6px #111}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:after{content:'\00d7';color:white;font-weight:bold;font-size:18px;line-height:22px;font-family:'Courier New', Courier, monospace;padding-left:1px}div.DTE_Bubble div.DTE_Bubble_Liner div.DTE_Bubble_Close:hover{background-color:#092079;box-shadow:2px 2px 9px #111}div.DTE_Bubble div.DTE_Bubble_Triangle{position:absolute;height:10px;width:10px;top:-6px;background-color:white;border:2px solid #444;border-top:none;border-right:none;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}div.DTE_Bubble.DTE_Processing div.DTE_Bubble_Liner:after{position:absolute;content:' ';display:block;top:12px;right:18px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}div.DTE_Bubble.below div.DTE_Bubble_Liner{top:10px;bottom:auto}div.DTE_Bubble.below div.DTE_Bubble_Triangle{top:4px;-webkit-transform:rotate(135deg);-moz-transform:rotate(135deg);-ms-transform:rotate(135deg);-o-transform:rotate(135deg);transform:rotate(135deg)}div.DTE_Bubble_Background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:10}div.DTE_Bubble_Background>div{position:absolute;top:0;right:0;left:0;bottom:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"}div.DTE_Bubble_Background>div:not([dummy]){filter:progid:DXImageTransform.Microsoft.gradient(enabled='false')}div.DTE_Inline{position:relative;display:table;width:100%}div.DTE_Inline div.DTE_Inline_Field,div.DTE_Inline div.DTE_Inline_Buttons{display:table-cell;vertical-align:middle}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field{padding:0}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field>label,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field>label{display:none}div.DTE_Inline div.DTE_Inline_Field div.DTE_Field input,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Field input{width:100%}div.DTE_Inline div.DTE_Inline_Field div.DTE_Form_Buttons button,div.DTE_Inline div.DTE_Inline_Buttons div.DTE_Form_Buttons button{margin:-6px 0 -6px 4px;padding:5px}div.DTE_Inline div.DTE_Field input[type="color"],div.DTE_Inline div.DTE_Field input[type="date"],div.DTE_Inline div.DTE_Field input[type="datetime"],div.DTE_Inline div.DTE_Field input[type="datetime-local"],div.DTE_Inline div.DTE_Field input[type="email"],div.DTE_Inline div.DTE_Field input[type="month"],div.DTE_Inline div.DTE_Field input[type="number"],div.DTE_Inline div.DTE_Field input[type="password"],div.DTE_Inline div.DTE_Field input[type="search"],div.DTE_Inline div.DTE_Field input[type="tel"],div.DTE_Inline div.DTE_Field input[type="text"],div.DTE_Inline div.DTE_Field input[type="time"],div.DTE_Inline div.DTE_Field input[type="url"],div.DTE_Inline div.DTE_Field input[type="week"]{margin:-6px 0}div.DTE_Inline.DTE_Processing:after{position:absolute;content:' ';display:block;top:4px;right:10px;height:12px;width:17px;background:url("../images/ajax-loader-small.gif") no-repeat top left}span.dtr-data div.DTE_Inline{display:inline-table}table.dataTable tbody tr.highlight{background-color:#FFFBCC !important}table.dataTable tbody tr.highlight,table.dataTable tbody tr.noHighlight,table.dataTable tbody tr.highlight td,table.dataTable tbody tr.noHighlight td{-webkit-transition:background-color 500ms linear;-moz-transition:background-color 500ms linear;-ms-transition:background-color 500ms linear;-o-transition:background-color 500ms linear;transition:background-color 500ms linear}table.dataTable.stripe tbody tr.odd.highlight,table.dataTable.display tbody tr.odd.highlight{background-color:#f9f5c7}table.dataTable.hover tbody tr:hover.highlight,table.dataTable.hover tbody tr.odd:hover.highlight,table.dataTable.hover tbody tr.even:hover.highlight,table.dataTable.display tbody tr:hover.highlight,table.dataTable.display tbody tr.odd:hover.highlight,table.dataTable.display tbody tr.even:hover.highlight{background-color:#f6f2c5}table.dataTable.order-column tbody tr.highlight>.sorting_1,table.dataTable.order-column tbody tr.highlight>.sorting_2,table.dataTable.order-column tbody tr.highlight>.sorting_3,table.dataTable.display tbody tr.highlight>.sorting_1,table.dataTable.display tbody tr.highlight>.sorting_2,table.dataTable.display tbody tr.highlight>.sorting_3{background-color:#faf6c8}table.dataTable.display tbody tr.odd.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_1{background-color:#f1edc1}table.dataTable.display tbody tr.odd.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_2{background-color:#f3efc2}table.dataTable.display tbody tr.odd.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.highlight>.sorting_3{background-color:#f5f1c4}table.dataTable.display tbody tr.even.highlight>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_1{background-color:#faf6c8}table.dataTable.display tbody tr.even.highlight>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_2{background-color:#fcf8ca}table.dataTable.display tbody tr.even.highlight>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.highlight>.sorting_3{background-color:#fefacb}table.dataTable.display tbody tr:hover.highlight>.sorting_1,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.display tbody tr.even:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_1{background-color:#eae6bb}table.dataTable.display tbody tr:hover.highlight>.sorting_2,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.display tbody tr.even:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_2{background-color:#ece8bd}table.dataTable.display tbody tr:hover.highlight>.sorting_3,table.dataTable.display tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.display tbody tr.even:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.highlight>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.highlight>.sorting_3{background-color:#efebbf}div.DTE div.editor_upload{padding-top:4px}div.DTE div.editor_upload div.eu_table{display:table;width:100%}div.DTE div.editor_upload div.row{display:table-row}div.DTE div.editor_upload div.cell{display:table-cell;position:relative;width:50%;vertical-align:top}div.DTE div.editor_upload div.cell+div.cell{padding-left:10px}div.DTE div.editor_upload div.row+div.row div.cell{padding-top:10px}div.DTE div.editor_upload button.btn,div.DTE div.editor_upload input[type=file]{width:100%;height:2.3em;font-size:0.8em;text-align:center;line-height:1em}div.DTE div.editor_upload input[type=file]{position:absolute;top:0;left:0;width:100%;opacity:0}div.DTE div.editor_upload div.drop{position:relative;box-sizing:border-box;width:100%;height:100%;border:3px dashed #ccc;border-radius:6px;min-height:4em;color:#999;padding-top:3px;text-align:center}div.DTE div.editor_upload div.drop.over{border:3px dashed #111;color:#111}div.DTE div.editor_upload div.drop span{max-width:75%;font-size:0.85em;line-height:1em}div.DTE div.editor_upload div.rendered img{max-width:8em;margin:0 auto}div.DTE div.editor_upload.noDrop div.drop{display:none}div.DTE div.editor_upload.noDrop div.row.second{display:none}div.DTE div.editor_upload.noDrop div.rendered{margin-top:10px}div.DTE div.editor_upload.noClear div.clearValue button{display:none}div.DTE div.editor_upload.multi div.cell{display:block;width:100%}div.DTE div.editor_upload.multi div.cell div.drop{min-height:0;padding-bottom:5px}div.DTE div.editor_upload.multi div.clearValue{display:none}div.DTE div.editor_upload.multi ul{list-style-type:none;margin:0;padding:0}div.DTE div.editor_upload.multi ul li{position:relative;margin-top:0.5em}div.DTE div.editor_upload.multi ul li:first-child{margin-top:0}div.DTE div.editor_upload.multi ul li img{vertical-align:middle}div.DTE div.editor_upload.multi ul li button{position:absolute;width:40px;right:0;top:50%;margin-top:-1.5em}div.editor-datetime{position:absolute;background-color:white;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px rgba(0,0,0,0.5);padding-bottom:5px}div.editor-datetime div.editor-datetime-title{text-align:center;padding:5px 0px 3px}div.editor-datetime table{border-spacing:0;margin:6px 13px}div.editor-datetime table th{font-size:0.8em;color:#777;font-weight:normal;width:14.285714286%;padding:0 0 4px 0;text-align:center}div.editor-datetime table td{font-size:0.9em;color:#444;padding:0}div.editor-datetime table td.day{text-align:right;background:#f5f5f5}div.editor-datetime table td.day.disabled{color:#aaa;background:white}div.editor-datetime table td.day.today{background-color:#ddd}div.editor-datetime table td.day.today button{font-weight:bold}div.editor-datetime table td.day.selected button{background:#4E6CA3;color:white;border-radius:2px}div.editor-datetime table td.day button:hover{background:#ff8000;color:white;border-radius:2px}div.editor-datetime table td.editor-datetime-week{font-size:0.7em}div.editor-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:inherit;padding:5px 9px;cursor:pointer;margin:0}div.editor-datetime table.weekNumber th{width:12.5%}div.editor-datetime div.editor-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.editor-datetime div.editor-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.editor-datetime div.editor-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0;-ms-filter:"alpha(opacity=0)"}div.editor-datetime div.editor-datetime-time{text-align:center}div.editor-datetime div.editor-datetime-time>span{vertical-align:middle}div.editor-datetime div.editor-datetime-time div.editor-datetime-timeblock{display:inline-block;vertical-align:middle}div.editor-datetime div.editor-datetime-iconLeft,div.editor-datetime div.editor-datetime-iconRight,div.editor-datetime div.editor-datetime-iconUp,div.editor-datetime div.editor-datetime-iconDown{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:0.3;overflow:hidden;box-sizing:border-box}div.editor-datetime div.editor-datetime-iconLeft:hover,div.editor-datetime div.editor-datetime-iconRight:hover,div.editor-datetime div.editor-datetime-iconUp:hover,div.editor-datetime div.editor-datetime-iconDown:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:0.6}div.editor-datetime div.editor-datetime-iconLeft button,div.editor-datetime div.editor-datetime-iconRight button,div.editor-datetime div.editor-datetime-iconUp button,div.editor-datetime div.editor-datetime-iconDown button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.editor-datetime div.editor-datetime-iconLeft{position:absolute;top:5px;left:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==")}div.editor-datetime div.editor-datetime-iconRight{position:absolute;top:5px;right:5px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconUp{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=")}div.editor-datetime div.editor-datetime-iconDown{height:20px;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC")}div.DTE{font-size:0.91em}div.DTE div.DTE_Header{display:none}div.DTE div.DTE_Body{padding:0}div.DTE div.DTE_Body div.DTE_Body_Content{overflow:hidden}div.DTE div.DTE_Body div.DTE_Body_Content div.DTE_Field{padding:5px 5%}div.DTE div.DTE_Footer{display:none}div.DTE div.DTE_Form_Error{padding-top:1em;color:red;display:none;color:#b11f1f}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/bubble.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,130 @@
+
+// Bubble form editing
+// Very similar to the main form, but attached to a particular node and the
+// form layout is slightly different with the fields container and buttons
+// making up a table of a single row and two columns. This allows the buttons
+// to be removed from the display and under this condition the fields will
+// take up the full width available.
+div.DTE_Bubble {
+	position: absolute;
+	z-index: 11;
+	margin-top: -6px;
+	opacity: 0;
+
+	div.DTE_Bubble_Liner {
+		position: absolute;
+		bottom: 0;
+		border: 1px solid black;
+		width: 300px;
+		margin-left: -150px;
+		background-color: white;
+		box-shadow: 2px 2px 7px #555;
+		border-radius: 5px;
+		border: 2px solid #444;
+		padding: 1em;
+		@include box-sizing(border-box);
+
+		div.DTE_Bubble_Table {
+			display: table;
+			width: 100%;
+
+			> form {
+				display: table-cell;
+
+				div.DTE_Form_Content {
+					padding: 0;
+
+					div.DTE_Field {
+						position: relative;
+						zoom: 1;
+						margin-bottom: 0.5em;
+
+						&:last-child {
+							margin-bottom: 0;
+						}
+					}
+				}
+			}
+
+			div.DTE_Form_Buttons {
+				display: table-cell;
+				vertical-align: bottom;
+				padding: 0 0 0 0.75em;
+				width: 1%; // browser will resize to a min width
+			}
+		}
+
+		div.DTE_Header {
+			border-top-left-radius: 5px;
+			border-top-right-radius: 5px;
+		}
+
+		div.DTE_Header + div.DTE_Form_Info,
+		div.DTE_Header + div.DTE_Bubble_Table {
+			padding-top: 42px;
+		}
+
+
+		div.DTE_Form_Error {
+			float: none;
+			display: none;
+			padding: 0;
+			margin-bottom: 0.5em;
+		}
+
+		div.DTE_Bubble_Close {
+			@include close-icon();
+		}
+	}
+
+	div.DTE_Bubble_Triangle {
+		position: absolute;
+		height: 10px;
+		width: 10px;
+		top: -6px;
+		background-color: white;
+		border: 2px solid #444;
+		border-top: none;
+		border-right: none;
+
+		-webkit-transform: rotate(-45deg);
+		   -moz-transform: rotate(-45deg);
+		    -ms-transform: rotate(-45deg);
+		     -o-transform: rotate(-45deg);
+		        transform: rotate(-45deg);
+	}
+
+	&.DTE_Processing {
+		div.DTE_Bubble_Liner:after {
+			position: absolute;
+			content: ' ';
+			display: block;
+			top: 12px;
+			right: 18px;
+			height: 12px;
+			width: 17px;
+			background: url('../images/ajax-loader-small.gif') no-repeat top left;
+		}
+	}
+
+	&.below {
+		div.DTE_Bubble_Liner {
+			top: 10px;
+			bottom: auto;
+		}
+
+		div.DTE_Bubble_Triangle {
+			top: 4px;
+			-webkit-transform: rotate(135deg);
+			   -moz-transform: rotate(135deg);
+			    -ms-transform: rotate(135deg);
+			     -o-transform: rotate(135deg);
+			        transform: rotate(135deg);
+		}
+	}
+}
+
+div.DTE_Bubble_Background {
+	@include overlay-background();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/datatable.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,93 @@
+
+// Row highlighting on edit styles
+//
+// To change the colour of the highlight, simply modify the variable below and
+// recompile the SCSS stylesheet (if you don't have SASS installed, you can use
+// the online service at http://sassmeister.com/ .
+//
+// The DataTables styles below match the default DataTables stylesheet:
+// http://next.datatables.net/manual/styling/classes so you can retain the full
+// benefits of the DataTables styling options.
+
+$table-row-highlight: #FFFBCC;
+
+table.dataTable {
+	tbody {
+		tr.highlight {
+			background-color: $table-row-highlight !important;
+		}
+
+		tr.highlight,
+		tr.noHighlight,
+		tr.highlight td,
+		tr.noHighlight td {
+			@include background-transision();
+		}
+	}
+
+	&.stripe tbody,
+	&.display tbody {
+		tr.odd {
+			&.highlight {
+				background-color: shade($table-row-highlight, 2.35%);
+			}
+		}
+	}
+
+	// Hover classes - add "hover" class to the table to activate
+	&.hover tbody,
+	&.display tbody {
+		tr:hover,
+		tr.odd:hover,
+		tr.even:hover {
+			&.highlight {
+				background-color: shade($table-row-highlight, 3.6%);
+			}
+		}
+	}
+
+
+	// Sort column highlighting - add "hover" class to the table to activate
+	&.order-column,
+	&.display {
+		tbody {
+			tr.highlight>.sorting_1,
+			tr.highlight>.sorting_2,
+			tr.highlight>.sorting_3 {
+				background-color: shade($table-row-highlight, 2%);
+			}
+		}
+	}
+
+	&.display tbody,
+	&.order-column.stripe tbody {
+		tr.odd {
+			&.highlight {
+				>.sorting_1 { background-color: shade($table-row-highlight, 5.4%);}
+				>.sorting_2 { background-color: shade($table-row-highlight, 4.7%);}
+				>.sorting_3 { background-color: shade($table-row-highlight, 3.9%);}
+			}
+		}
+
+		tr.even {
+			&.highlight {
+				>.sorting_1 { background-color: shade($table-row-highlight, 2%); }
+				>.sorting_2 { background-color: shade($table-row-highlight, 1.2%); }
+				>.sorting_3 { background-color: shade($table-row-highlight, 0.4%); }
+			}
+		}
+	}
+
+	&.display tbody,
+	&.order-column.hover tbody {
+		tr:hover,
+		tr.odd:hover,
+		tr.even:hover {
+			&.highlight {
+				>.sorting_1 { background-color: shade($table-row-highlight, 8.2%); }
+				>.sorting_2 { background-color: shade($table-row-highlight, 7.5%); }
+				>.sorting_3 { background-color: shade($table-row-highlight, 6.3%); }
+			}
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/datetime.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,184 @@
+
+$editor-datetime-selected: #4E6CA3 !default;
+
+div.editor-datetime {
+	position: absolute;
+	background-color: white;
+	z-index: 2050;
+    border: 1px solid #ccc;
+	box-shadow: 0 5px 15px -5px rgba(0,0,0,.5);
+	padding-bottom: 5px;
+
+	div.editor-datetime-title {
+		text-align: center;
+	    padding: 5px 0px 3px;
+	}
+
+	table {
+		border-spacing: 0;
+		margin: 6px 13px;
+
+		th {
+			font-size: 0.8em;
+			color: #777;
+			font-weight: normal;
+			width: 14.285714286%;
+			padding: 0 0 4px 0;
+			text-align: center;
+		}
+
+		td {
+			font-size: 0.9em;
+			color: #444;
+			padding: 0;
+		}
+
+		td.day {
+			text-align: right;
+			background: #f5f5f5;
+
+			&.disabled {
+				color: #aaa;
+				background: white;
+			}
+
+			&.today {
+				background-color: #ddd;
+				
+				button {
+					font-weight: bold;
+				}
+			}
+
+			&.selected button {
+				background: $editor-datetime-selected;
+				color: white;
+				border-radius: 2px;
+			}
+
+			button:hover {
+				background: #ff8000;
+				color: white;
+				border-radius: 2px;
+			}
+		}
+
+		td.editor-datetime-week {
+			font-size: 0.7em;
+		}
+
+		button {
+			width: 100%;
+			box-sizing: border-box;
+			border: none;
+			background: transparent;
+			font-size: inherit;
+			color: inherit;
+			text-align: inherit;
+			padding: 5px 9px;
+			cursor: pointer;
+			margin: 0;
+		}
+
+		&.weekNumber th {
+			width: 12.5%;
+		}
+	}
+
+	div.editor-datetime-label {
+		position: relative;
+		display: inline-block;
+		height: 30px;
+		padding: 5px 6px;
+		border: 1px solid transparent;
+		box-sizing: border-box;
+		cursor: pointer;
+
+		&:hover {
+			border: 1px solid #ddd;
+			border-radius: 2px;
+			background-color: #f5f5f5;
+		}
+
+		span {
+
+		}
+
+		select {
+			position: absolute;
+			top: 6px;
+			left: 0;
+			cursor: pointer;
+			opacity: 0;
+			-ms-filter: "alpha(opacity=0)";
+		}
+	}
+
+	div.editor-datetime-time {
+		text-align: center;
+
+		> span {
+			vertical-align: middle;
+		}
+
+		div.editor-datetime-timeblock {
+			display: inline-block;
+			vertical-align: middle;
+		}
+	}
+
+
+	div.editor-datetime-iconLeft,
+	div.editor-datetime-iconRight,
+	div.editor-datetime-iconUp,
+	div.editor-datetime-iconDown {
+		width: 30px;
+		height: 30px;
+		background-position: center;
+		background-repeat: no-repeat;
+		opacity: 0.3;
+		overflow: hidden;
+		box-sizing: border-box;
+
+		&:hover {
+			border: 1px solid #ccc;
+			border-radius: 2px;
+			background-color: #f0f0f0;
+			opacity: 0.6;
+		}
+
+		button {
+			border: none;
+			background: transparent;
+			text-indent: 30px;
+			height: 100%;
+			width: 100%;
+			cursor: pointer;
+		}
+	}
+
+	div.editor-datetime-iconLeft {
+		position: absolute;
+		top: 5px;
+		left: 5px;
+		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==');
+	}
+
+	div.editor-datetime-iconRight {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=');
+	}
+
+	div.editor-datetime-iconUp {
+		height: 20px;
+		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAL0lEQVR4AWOgJmBhxCvLyopHnpmVjY2VCadeoCxIHrcsWJ4RlyxCHlMWCTBRJxwAjrIBDMWSiM0AAAAASUVORK5CYII=');
+	}
+
+	div.editor-datetime-iconDown {
+		height: 20px;
+		background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAALCAMAAABf9c24AAAAFVBMVEX///99fX1+fn57e3t6enoAAAAAAAC73bqPAAAABnRSTlMAYmJkZt92bnysAAAAMElEQVR4AWOgDmBiRQIsmPKMrGxQgJDFlEfIYpoPk8Utz8qM232MYFfhkQfKUg8AANefAQxecJ58AAAAAElFTkSuQmCC');
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/envelope.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,102 @@
+
+/*
+ * Namespace: DTED - DataTables Editor Display - Envelope
+ */
+
+div.DTED_Envelope_Wrapper {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 50%;
+	height: 100%;
+	z-index: 11;
+	display: none;
+	overflow: hidden;
+
+	// Create a shadow display at the top of the evelope to make it look like it has
+	// come from under the element that it is attached to/ Left and right to give a
+	// slight fade and the two ends
+	div.DTED_Envelope_ShadowLeft {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 50%;
+		height: 9px;
+		background: url('../images/shadow_left.png') no-repeat top left;
+		z-index: 10;
+	}
+
+	div.DTED_Envelope_ShadowRight {
+		position: absolute;
+		top: 0;
+		right: 0;
+		width: 50%;
+		height: 9px;
+		background: url('../images/shadow_right.png') no-repeat top right;
+		z-index: 10;
+	}
+
+
+	div.DTED_Envelope_Container {
+		position: absolute;
+		top: 0;
+		left: 5%;
+		width: 90%;
+
+		border-left: 1px solid #777;
+		border-right: 1px solid #777;
+		border-bottom: 1px solid #777;
+		box-shadow: 3px 3px 10px #555;
+		border-bottom-left-radius: 5px;
+		border-bottom-right-radius: 5px;
+		background-color: white;
+
+		div.DTE_Processing_Indicator {
+			right: 36px;
+		}
+
+		div.DTE_Footer {
+			border-bottom-left-radius: 5px;
+			border-bottom-right-radius: 5px;
+		}
+
+		div.DTED_Envelope_Close {
+			position: absolute;
+			top: 16px;
+			right: 10px;
+			width: 18px;
+			height: 18px;
+			cursor: pointer;
+			*cursor: hand;
+			z-index: 12;
+			text-align: center;
+			font-size: 12px;
+
+			background: #F8F8F8;
+			background: -webkit-gradient(linear, center bottom, center top, from(#CCC), to(white));
+			background: -moz-linear-gradient(top, white, #CCC);
+			background: linear-gradient(to bottom, white, #CCC);
+			text-shadow: 0 1px 0 white;
+			border: 1px solid #999;
+			border-radius: 2px;
+			-moz-border-radius: 2px;
+			-webkit-border-radius: 2px;
+			box-shadow: 0px 0px 1px #999;
+			-moz-box-shadow: 0px 0px 1px #999;
+			-webkit-box-shadow: 0px 0px 1px #999;
+		}
+	}
+}
+
+
+div.DTED_Envelope_Background {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	z-index: 10;
+	@include radial-gradient( rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4) );
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/fields.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,128 @@
+
+
+// Generic field styling
+div.DTE_Field {
+	input,
+	textarea {
+		box-sizing: border-box;
+		background-color: white;
+		-webkit-transition: background-color ease-in-out .15s;
+		        transition: background-color ease-in-out .15s;
+	}
+
+	input:focus,
+	textarea:focus {
+		background-color: #ffffee; 
+	}
+
+	input[type="color"],
+	input[type="date"],
+	input[type="datetime"],
+	input[type="datetime-local"],
+	input[type="email"],
+	input[type="month"],
+	input[type="number"],
+	input[type="password"],
+	input[type="search"],
+	input[type="tel"],
+	input[type="text"],
+	input[type="time"],
+	input[type="url"],
+	input[type="week"] {
+		padding: 6px 4px;
+		width: 100%;
+	}
+
+
+	div.DTE_Field_Info,
+	div.DTE_Field_Message {
+		font-size: 11px;
+		line-height: 1em;
+	}
+
+	div.DTE_Field_Error {
+		font-size: 11px;
+		line-height: 1em;
+		display: none;
+		color: red;
+		margin-top: 5px;
+	}
+
+	div.multi-value {
+		display: none;
+		border: 1px dotted #666;
+		border-radius: 3px;
+		padding: 5px;
+		background-color: #fafafa;
+		cursor: pointer;
+
+		span {
+			font-size: 0.8em;
+			line-height: 1.25em;
+			display: block;
+			color: #666;
+		}
+
+		&:hover {
+			background-color: #f1f1f1;
+		}
+	}
+
+	div.multi-restore {
+		display: none;
+		margin-top: 0.5em;
+		font-size: 0.8em;
+		line-height: 1.25em;
+		color: #3879d9;
+
+		&:hover {
+			text-decoration: underline;
+			cursor: pointer;
+		}
+	}
+}
+
+// Specific field type styling
+div.DTE_Field_Type_textarea {
+	textarea {
+		padding: 3px;
+		width: 100%;
+		height: 80px;
+	}
+}
+
+div.DTE_Field.DTE_Field_Type_date {
+	img {
+		vertical-align: middle;
+		cursor: pointer;
+		*cursor: hand;
+	}
+
+	input.jqueryui {
+		width: 87%;
+		margin-right: 6px;
+	}
+}
+
+div.DTE_Field_Type_checkbox,
+div.DTE_Field_Type_radio {
+	div.DTE_Field_Input > div > div {
+		margin-bottom: 0.25em;
+
+		&:last-child {
+			margin-bottom: 0;
+		}
+
+		input {
+		}
+
+		label {
+			margin-left: 0.75em;
+			vertical-align: middle;
+		}
+	}
+}
+
+div.DTE_Field_Type_select div.DTE_Field_Input {
+	padding-top: 4px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/inline.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,65 @@
+
+// Inline form editing
+// Hide the label and allow the field to take the full width
+div.DTE_Inline {
+	position: relative;
+	display: table;
+	width: 100%;
+
+	div.DTE_Inline_Field,
+	div.DTE_Inline_Buttons {
+		display: table-cell;
+		vertical-align: middle;
+
+		div.DTE_Field {
+			padding: 0;
+
+			>label {
+				display: none;
+			}
+
+			input {
+				width: 100%;
+			}
+		}
+
+		div.DTE_Form_Buttons button {
+			margin: -6px 0 -6px 4px;
+			padding: 5px;
+		}
+	}
+
+	// Have the input types take up full space, taking into account the cell padding
+	div.DTE_Field input[type="color"],
+	div.DTE_Field input[type="date"],
+	div.DTE_Field input[type="datetime"],
+	div.DTE_Field input[type="datetime-local"],
+	div.DTE_Field input[type="email"],
+	div.DTE_Field input[type="month"],
+	div.DTE_Field input[type="number"],
+	div.DTE_Field input[type="password"],
+	div.DTE_Field input[type="search"],
+	div.DTE_Field input[type="tel"],
+	div.DTE_Field input[type="text"],
+	div.DTE_Field input[type="time"],
+	div.DTE_Field input[type="url"],
+	div.DTE_Field input[type="week"] {
+		margin: -6px 0;
+	}
+
+	&.DTE_Processing:after {
+		position: absolute;
+		content: ' ';
+		display: block;
+		top: 4px;
+		right: 10px;
+		height: 12px;
+		width: 17px;
+		background: url('../images/ajax-loader-small.gif') no-repeat top left;
+	}
+}
+
+// Responsive integration
+span.dtr-data div.DTE_Inline {
+	display: inline-table;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/lightbox.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,147 @@
+
+
+div.DTED_Lightbox_Wrapper {
+	position: fixed;
+	top: 0;
+	left: 50%;
+	margin-left: -390px;
+	width: 780px;
+	height: 100%;
+	z-index: 11;
+
+	div.DTED_Lightbox_Container {
+		*position: absolute; /* IE6 */
+		*top: 50%;
+		#position: absolute; /* IE7 */
+		#top: 50%;
+		display: table;
+		height: 100%;
+		width: 100%;
+
+		div.DTED_Lightbox_Content_Wrapper {
+			*position: relative; /* IE6 */
+			#position: relative; /* IE7 */
+			display: table-cell;
+			vertical-align: middle;
+			width: 100%;
+
+			div.DTED_Lightbox_Content {
+				*top: -50%; /* IE6 */
+				#top: -50%; /* IE7 */
+				position: relative;
+				border: 7px solid rgba(220, 220, 220, 0.5);
+				box-shadow: 2px 2px 10px #555;
+				border-radius: 10px;
+				@include box-sizing(border-box);
+
+				div.DTE {
+					background: white;
+					border-radius: 6px;
+					box-shadow: 0 0 5px #555;
+					border: 2px solid #444;
+					@include box-sizing(border-box);
+
+					div.DTE_Header {
+						top: 2px;
+						left: 2px;
+						right: 2px;
+						width: auto;
+						border-top-left-radius: 5px;
+						border-top-right-radius: 5px;
+					}
+
+					div.DTE_Footer {
+						bottom: 2px;
+						left: 2px;
+						right: 2px;
+						width: auto;
+						border-bottom-left-radius: 5px;
+						border-bottom-right-radius: 5px;
+					}
+				}
+
+				div.DTED_Lightbox_Close {
+					@include close-icon();
+				}
+			}
+		}
+	}
+}
+
+
+div.DTED_Lightbox_Background {
+	@include overlay-background();
+}
+
+
+body.DTED_Lightbox_Mobile {
+	div.DTED_Lightbox_Background {
+		height: 0;
+	}
+
+	div.DTED_Lightbox_Shown {
+		display: none;
+	}
+
+	div.DTED_Lightbox_Wrapper {
+		position: absolute;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		bottom: 0px;
+		width: auto;
+		height: auto;
+		margin-left: 0;
+		-webkit-overflow-scrolling: touch;
+
+		div.DTED_Lightbox_Container {
+			display: block;
+
+			div.DTED_Lightbox_Content_Wrapper {
+				display: block;
+
+				div.DTED_Lightbox_Content {
+					border: 4px solid rgba(220, 220, 220, 0.5);
+					border-radius: 0;
+
+					div.DTE {
+						border-radius: 0;
+						box-shadow: 0 0 5px #555;
+						border: 2px solid #444;
+
+						div.DTE_Header {
+							border-top-left-radius: 0;
+							border-top-right-radius: 0;
+						}
+
+						div.DTE_Footer {
+							border-bottom-left-radius: 0;
+							border-bottom-right-radius: 0;
+						}
+					}
+
+					div.DTED_Lightbox_Close {
+						top: 11px;
+						right: 15px;
+					}
+				}
+			}
+		}
+	}
+}
+
+@media only screen 
+and (max-width: 780px) {
+	div.DTED_Lightbox_Wrapper {
+		position: fixed;
+		top: 0;
+		left: 0;
+		width: 100%;
+		margin-left: 0;
+	}
+}
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/main.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,188 @@
+
+
+// The main form.
+// Most of the styles for display of the main form come from the display
+// controller (lightbox and envelope are the two built in options).
+div.DTE_Body {
+	padding: 50px 0; // space for hte header and footer which are position: absolute
+	
+	div.DTE_Body_Content {
+		position: relative;
+		overflow: auto;
+
+		div.DTE_Form_Info {
+			padding: 1em 1em 0 1em;
+			margin: 0;
+		}
+
+		div.DTE_Field {
+			position: relative;
+			zoom: 1;
+			
+			clear: both;
+			padding: 5px 20%;
+			border: 1px solid transparent;
+
+			&:after {
+				display: block;
+				content: ".";
+				height: 0;
+				line-height: 0;
+				clear: both;
+				visibility: hidden;
+			}
+
+			&:hover {
+				background-color: #f9f9f9;
+				border: 1px solid #f3f3f3;
+			}
+
+			>label {
+				float: left;
+				width: 40%;
+				padding-top: 6px;
+			}
+
+			>div.DTE_Field_Input {
+				float: right;
+				width: 60%;
+			}
+
+			// Field in error state
+			&.DTE_Field_StateError { }
+
+			&.full {
+				padding: 5px 0 5px 20%;
+
+				>label {
+					width: 30%;
+				}
+
+				>div.DTE_Field_Input {
+					width: 70%;
+				}
+			}
+
+			&.block {
+				>div.DTE_Field_Input {
+					float: none;
+					clear: both;
+					width: 100%;
+				}
+			}
+		}
+	}
+}
+
+html[dir="rtl"] {
+	div.DTE_Body div.DTE_Body_Content div.DTE_Field {
+		> label {
+			float: right;
+		}
+
+		>div.DTE_Field_Input {
+			float: left;
+		}
+	}
+	
+	div.DTE div.DTE_Form_Buttons button {
+		float: left;
+	}
+}
+
+// iPad in portrait 
+@media only screen 
+and (max-width : 768px) {
+	div.DTE_Body {
+		div.DTE_Body_Content {
+			div.DTE_Field {
+				padding: 5px 10%;
+
+				&.full {
+					padding: 5px 0 5px 10%;
+
+					>label {
+						width: 35.5%;
+					}
+
+					>div.DTE_Field_Input {
+						width: 64.5%;
+					}
+				}
+
+				&.block {
+					>div.DTE_Field_Input {
+						width: 100%;
+					}
+				}
+			}
+		}
+	}
+}
+
+@media only screen 
+and (max-width : 640px) {
+	div.DTE_Body {
+		div.DTE_Body_Content {
+			div.DTE_Field {
+				padding: 5px 0;
+
+				&.full {
+					padding: 5px 0%;
+
+					>label {
+						width: 40%;
+					}
+
+					>div.DTE_Field_Input {
+						width: 60%;
+					}
+				}
+
+				&.block {
+					>div.DTE_Field_Input {
+						width: 100%;
+					}
+				}
+			}
+		}
+	}
+}
+
+// For devices with smaller screens, the fields should be shown stacked
+@media only screen 
+and (max-width : 580px) {
+	div.DTE_Body {
+		div.DTE_Body_Content {
+			div.DTE_Field {
+				position: relative;
+				zoom: 1;
+				
+				clear: both;
+				padding: 5px 0;
+
+				>label {
+					float: none;
+					width: auto;
+					padding-top: 0;
+				}
+
+				>div.DTE_Field_Input {
+					float: none;
+					width: auto;
+				}
+
+				&.full,
+				&.block {
+					padding: 5px 0;
+
+					>label,
+					>div.DTE_Field_Input {
+						width: 100%;
+					}
+				}
+			}
+		}
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/mixins.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,176 @@
+
+
+@function tint( $color, $percent ) {
+	@return mix(white, $color, $percent);
+}
+
+@function shade( $color, $percent ) {
+	@return mix(black, $color, $percent);
+}
+
+
+@mixin border-radius ( $radius ) {
+	-webkit-border-radius: $radius;
+	   -moz-border-radius: $radius;
+	    -ms-border-radius: $radius;
+	     -o-border-radius: $radius;
+	        border-radius: $radius;
+}
+
+@mixin box-sizing($box-model) {
+  -webkit-box-sizing: $box-model; // Safari <= 5
+     -moz-box-sizing: $box-model; // Firefox <= 19
+          box-sizing: $box-model;
+}
+
+@mixin box-shadow($top, $left, $blur, $color, $inset: false) {
+  @if $inset {
+    -webkit-box-shadow:inset $top $left $blur $color;
+    -moz-box-shadow:inset $top $left $blur $color;
+    box-shadow:inset $top $left $blur $color;
+  } @else {
+    -webkit-box-shadow: $top $left $blur $color;
+    -moz-box-shadow: $top $left $blur $color;
+    box-shadow: $top $left $blur $color;
+  }
+}
+
+@mixin three-stop-gradient($fromColor, $middleColor, $toColor) {
+	background-color: $toColor; /* Fallback */
+	background-image: -webkit-linear-gradient(top, $fromColor, $middleColor, $toColor); /* Chrome 10+, Saf5.1+, iOS 5+ */
+	background-image:    -moz-linear-gradient(top, $fromColor, $middleColor, $toColor); /* FF3.6 */
+	background-image:     -ms-linear-gradient(top, $fromColor, $middleColor, $toColor); /* IE10 */
+	background-image:      -o-linear-gradient(top, $fromColor, $middleColor, $toColor); /* Opera 11.10+ */
+	background-image:         linear-gradient(to bottom, $fromColor, $middleColor, $toColor);
+	filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#{nth( $fromColor, 1 )}', EndColorStr='#{nth( $toColor, 1 )}');
+}
+
+@mixin radial-gradient ($fromColor, $toColor ) {
+	background: $toColor; /* Fallback */
+	background:     -ms-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* IE10 Consumer Preview */ 
+	background:    -moz-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Firefox */ 
+	background:      -o-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Opera */ 
+	background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, $fromColor), color-stop(1, $toColor)); /* Webkit (Safari/Chrome 10) */ 
+	background: -webkit-radial-gradient(center, ellipse farthest-corner, $fromColor 0%, $toColor 100%); /* Webkit (Chrome 11+) */ 
+	background: radial-gradient(ellipse farthest-corner at center, $fromColor 0%, $toColor 100%); /* W3C Markup, IE10 Release Preview */ 
+}
+
+@mixin keyframe ($animation_name) {
+    @-webkit-keyframes #{$animation_name} {
+        @content;
+    }
+ 
+    @-moz-keyframes #{$animation_name} {
+        @content;
+    }
+ 
+    @-o-keyframes #{$animation_name} {
+        @content;
+    }
+ 
+    @keyframes #{$animation_name} {
+        @content;
+    }
+}
+
+@mixin animation ($duration, $animation) {
+	-webkit-animation-duration: $duration;
+	-webkit-animation-name: $animation;
+	-webkit-animation-fill-mode: forwards;
+	-webkit-animation-iteration-count: infinite;
+	-webkit-animation-timing-function: linear;
+	-webkit-animation-direction: alternate;
+
+	-moz-animation-duration: $duration;
+	-moz-animation-name: $animation;
+	-moz-animation-fill-mode: forwards;
+	-moz-animation-iteration-count: infinite;
+	-moz-animation-timing-function: linear;
+	-moz-animation-direction: alternate;
+	
+	-o-animation-duration: $duration;
+	-o-animation-name: $animation;
+	-o-animation-fill-mode: forwards;
+	-o-animation-iteration-count: infinite;
+	-o-animation-timing-function: linear;
+	-o-animation-direction: alternate;
+	
+	animation-duration: $duration;
+	animation-name: $animation;
+	animation-fill-mode: forwards;
+	animation-iteration-count: infinite;
+	animation-timing-function: linear;
+	animation-direction: alternate;
+}
+
+@mixin close-icon () {
+	position: absolute;
+	top: -11px;
+	right: -11px;
+	width: 22px;
+	height: 22px;
+	border: 2px solid white;
+	background-color: black;
+	text-align: center;
+	border-radius: 15px;
+	cursor: pointer;
+	z-index: 12;
+	box-shadow: 2px 2px 6px #111;
+
+	&:after {
+		content: '\00d7';
+		color: white;
+		font-weight: bold;
+		font-size: 18px;
+		line-height: 22px;
+		font-family: 'Courier New', Courier, monospace;
+		padding-left: 1px;
+	}
+
+	&:hover {
+		background-color: #092079;
+		box-shadow: 2px 2px 9px #111;
+	}
+}
+
+@mixin overlay-background () {
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+
+	@include radial-gradient( rgba(0, 0, 0, 0.3), rgba(0, 0, 0, 0.7) );
+
+	z-index: 10;
+
+	// IE8- doesn't support RGBA and jQuery uses `filter:` for the fade-in
+	// animation, so we need a child element that is used just for the display
+	>div {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		bottom: 0;
+
+		// IE7-
+		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);
+		
+		// IE8
+		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";
+	}
+
+	// IE9 has both filter and rgba support, so we need a hack to disable the filter
+	>div:not([dummy]) {
+		filter: progid:DXImageTransform.Microsoft.gradient(enabled='false');
+	}
+}
+
+@mixin background-transision () {
+	-webkit-transition: background-color 500ms linear;
+	   -moz-transition: background-color 500ms linear;
+	    -ms-transition: background-color 500ms linear;
+	     -o-transition: background-color 500ms linear;
+	transition: background-color 500ms linear;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/css/scss/upload.scss	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,142 @@
+
+div.DTE div.editor_upload {
+	padding-top: 4px;
+
+	div.eu_table {
+		display: table;
+		width: 100%;
+	}
+
+	div.row {
+		display: table-row;
+	}
+
+	div.cell {
+		display: table-cell;
+		position: relative;
+		width: 50%;
+		vertical-align: top;
+	}
+
+	div.cell + div.cell {
+		padding-left: 10px;
+	}
+
+	div.row + div.row {
+		div.cell {
+			padding-top: 10px;
+		}
+	}
+
+	button.btn,
+	input[type=file] {
+		width: 100%;
+		height: 2.3em;
+		font-size: 0.8em;
+		text-align: center;
+		line-height: 1em;
+	}
+
+	input[type=file] {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		opacity: 0;
+	}
+
+	div.drop {
+		position: relative;
+		box-sizing: border-box;
+		width: 100%;
+		height: 100%;
+		border: 3px dashed #ccc;
+		border-radius: 6px;
+		min-height: 4em;
+		color: #999;
+		padding-top: 3px;
+		text-align: center;
+
+		&.over {
+			border: 3px dashed #111;
+			color: #111;
+		}
+
+		span {
+			max-width: 75%;
+			font-size: 0.85em;
+			line-height: 1em;
+		}
+	}
+
+	div.rendered {
+		img {
+			max-width: 8em;
+			margin: 0 auto;
+		}
+	}
+
+	&.noDrop {
+		div.drop {
+			display: none;
+		}
+
+		div.row.second {
+			display: none;
+		}
+
+		div.rendered {
+			margin-top: 10px;
+		}
+	}
+
+	&.noClear {
+		div.clearValue button {
+			display: none;
+		}
+	}
+
+	&.multi {
+		div.cell {
+			display: block;
+			width: 100%;
+
+			div.drop {
+				min-height: 0;
+				padding-bottom: 5px;
+			}
+		}
+
+		div.clearValue {
+			display: none;
+		}
+
+		ul {
+			list-style-type: none;
+			margin: 0;
+			padding: 0;
+
+			li {
+				position: relative;
+				margin-top: 0.5em;
+
+				&:first-child {
+					margin-top: 0;
+				}
+
+				img {
+					vertical-align: middle;
+				}
+
+				button {
+					position: absolute;
+					width: 40px;
+					right: 0;
+					top: 50%;
+					margin-top: -1.5em;
+				}
+			}
+		}
+	}
+}
+
Binary file js/Editor-1.5.6/images/ajax-loader-small.gif has changed
Binary file js/Editor-1.5.6/images/ajax-loader.gif has changed
Binary file js/Editor-1.5.6/images/calender.png has changed
Binary file js/Editor-1.5.6/images/close.png has changed
Binary file js/Editor-1.5.6/images/shadow_left.png has changed
Binary file js/Editor-1.5.6/images/shadow_right.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/dataTables.editor.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,8844 @@
+/*! DataTables Editor v1.5.6
+ *
+ * ©2012-2016 SpryMedia Ltd, all rights reserved.
+ * License: editor.datatables.net/license
+ */
+
+/**
+ * @summary     DataTables Editor
+ * @description Table editing library for DataTables
+ * @version     1.5.6
+ * @file        dataTables.editor.js
+ * @author      SpryMedia Ltd
+ * @contact     www.datatables.net/contact
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals jQuery,alert,console */
+
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net')(root, $).$;
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+if ( ! DataTable || ! DataTable.versionCheck || ! DataTable.versionCheck('1.10.7') ) {
+	throw 'Editor requires DataTables 1.10.7 or newer';
+}
+
+/**
+ * Editor is a plug-in for <a href="http://datatables.net">DataTables</a> which
+ * provides an interface for creating, reading, editing and deleting and entries
+ * (a CRUD interface) in a DataTable. The documentation presented here is
+ * primarily focused on presenting the API for Editor. For a full list of
+ * features, examples and the server interface protocol, please refer to the <a
+ * href="http://editor.datatables.net">Editor web-site</a>.
+ *
+ * Note that in this documentation, for brevity, the `DataTable` refers to the
+ * jQuery parameter `jQuery.fn.dataTable` through which it may be  accessed.
+ * Therefore, when creating a new Editor instance, use `jQuery.fn.Editor` as
+ * shown in the examples below.
+ *
+ *  @class
+ *  @param {object} [oInit={}] Configuration object for Editor. Options
+ *    are defined by {@link Editor.defaults}.
+ *  @requires jQuery 1.7+
+ *  @requires DataTables 1.10+
+ */
+var Editor = function ( opts )
+{
+	if ( ! this instanceof Editor ) {
+		alert( "DataTables Editor must be initialised as a 'new' instance'" );
+	}
+
+	this._constructor( opts );
+};
+
+// Export Editor as a DataTables property
+DataTable.Editor = Editor;
+$.fn.DataTable.Editor = Editor;
+
+// Internal methods
+
+
+/**
+ * Get an Editor node based on the data-dte-e (element) attribute and return it
+ * as a jQuery object.
+ *  @param {string} dis The data-dte-e attribute name to match for the element
+ *  @param {node} [ctx=document] The context for the search - recommended this
+ *    parameter is included for performance.
+ *  @returns {jQuery} jQuery object of found node(s).
+ *  @private
+ */
+var _editor_el = function ( dis, ctx )
+{
+	if ( ctx === undefined ) {
+		ctx = document;
+	}
+
+	return $('*[data-dte-e="'+dis+'"]', ctx);
+};
+
+
+/** @internal Counter for unique event namespaces in the inline control */
+var __inlineCounter = 0;
+
+var _pluck = function ( a, prop )
+{
+	var out = [];
+
+	$.each( a, function ( idx, el ) {
+		out.push( el[ prop ] );
+	} );
+
+	return out;
+};
+
+// Field class
+
+
+Editor.Field = function ( opts, classes, host ) {
+	var that = this;
+	var multiI18n = host.i18n.multi;
+
+	opts = $.extend( true, {}, Editor.Field.defaults, opts );
+	
+	if ( ! Editor.fieldTypes[ opts.type ] ) {
+		throw "Error adding field - unknown field type "+opts.type;
+	}
+
+	this.s = $.extend( {}, Editor.Field.settings, { // has to be a shallow copy!
+		type:       Editor.fieldTypes[ opts.type ],
+		name:       opts.name,
+		classes:    classes,
+		host:       host,
+		opts:       opts,
+		multiValue: false
+	} );
+
+	// No id, so assign one to have the label reference work
+	if ( ! opts.id ) {
+		opts.id = 'DTE_Field_'+opts.name;
+	}
+
+	// Backwards compatibility
+	if ( opts.dataProp ) {
+		opts.data = opts.dataProp;
+	}
+
+	// If no `data` option is given, then we use the name from the field as the
+	// data prop to read data for the field from DataTables
+	if ( opts.data === '' ) {
+		opts.data = opts.name;
+	}
+
+	// Get and set functions in the data object for the record
+	var dtPrivateApi = DataTable.ext.oApi;
+	this.valFromData = function ( d ) { // get val from data
+		// wrapper to automatically pass `editor` as the type
+		return dtPrivateApi._fnGetObjectDataFn( opts.data )( d, 'editor' );
+	};
+	this.valToData = dtPrivateApi._fnSetObjectDataFn( opts.data ); // set val to data
+
+	// Field HTML structure
+	var template = $(
+		'<div class="'+classes.wrapper+' '+classes.typePrefix+opts.type+' '+classes.namePrefix+opts.name+' '+opts.className+'">'+
+			'<label data-dte-e="label" class="'+classes.label+'" for="'+opts.id+'">'+
+				opts.label+
+				'<div data-dte-e="msg-label" class="'+classes['msg-label']+'">'+opts.labelInfo+'</div>'+
+			'</label>'+
+			'<div data-dte-e="input" class="'+classes.input+'">'+
+				// Field specific HTML is added here if there is any
+				'<div data-dte-e="input-control" class="'+classes.inputControl+'"/>'+
+				'<div data-dte-e="multi-value" class="'+classes.multiValue+'">'+
+					multiI18n.title+
+					'<span data-dte-e="multi-info" class="'+classes.multiInfo+'">'+
+						multiI18n.info+
+					'</span>'+
+				'</div>'+
+				'<div data-dte-e="msg-multi" class="'+classes.multiRestore+'">'+
+					multiI18n.restore+
+				'</div>'+
+				'<div data-dte-e="msg-error" class="'+classes['msg-error']+'"></div>'+
+				'<div data-dte-e="msg-message" class="'+classes['msg-message']+'"></div>'+
+				'<div data-dte-e="msg-info" class="'+classes['msg-info']+'">'+opts.fieldInfo+'</div>'+
+			'</div>'+
+		'</div>');
+
+	var input = this._typeFn( 'create', opts );
+	if ( input !== null ) {
+		_editor_el('input-control', template).prepend( input );
+	}
+	else {
+		template.css('display', "none");
+	}
+
+	this.dom = $.extend( true, {}, Editor.Field.models.dom, {
+		container:    template,
+		inputControl: _editor_el('input-control', template),
+		label:        _editor_el('label', template),
+		fieldInfo:    _editor_el('msg-info', template),
+		labelInfo:    _editor_el('msg-label', template),
+		fieldError:   _editor_el('msg-error', template),
+		fieldMessage: _editor_el('msg-message', template),
+		multi:        _editor_el('multi-value', template),
+		multiReturn:  _editor_el('msg-multi', template),
+		multiInfo:    _editor_el('multi-info', template)
+	} );
+
+	// On click - set a common value for the field
+	this.dom.multi.on( 'click', function () {
+		that.val('');
+	} );
+
+	this.dom.multiReturn.on( 'click', function () {
+		that.s.multiValue = true;
+		that._multiValueCheck();
+	} );
+
+	// Field type extension methods - add a method to the field for the public
+	// methods that each field type defines beyond the default ones that already
+	// exist as part of this instance
+	$.each( this.s.type, function ( name, fn ) {
+		if ( typeof fn === 'function' && that[name] === undefined ) {
+			that[ name ] = function () {
+				var args = Array.prototype.slice.call( arguments );
+
+				args.unshift( name );
+				var ret = that._typeFn.apply( that, args );
+
+				// Return the given value if there is one, or the field instance
+				// for chaining if there is no value
+				return ret === undefined ?
+					that :
+					ret;
+			};
+		}
+	} );
+};
+
+
+Editor.Field.prototype = {
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public
+	 */
+	def: function ( set ) {
+		var opts = this.s.opts;
+
+		if ( set === undefined ) {
+			// Backwards compat
+			var def = opts['default'] !== undefined ?
+				opts['default'] :
+				opts.def;
+
+			return $.isFunction( def ) ?
+				def() :
+				def;
+		}
+
+		opts.def = set;
+		return this;
+	},
+
+	disable: function () {
+		this._typeFn( 'disable' );
+		return this;
+	},
+
+	displayed: function () {
+		var container = this.dom.container;
+
+		return container.parents('body').length && container.css('display') != 'none' ?
+			true :
+			false;
+	},
+
+	enable: function () {
+		this._typeFn( 'enable' );
+		return this;
+	},
+
+	error: function ( msg, fn ) {
+		var classes = this.s.classes;
+
+		// Add or remove the error class
+		if ( msg ) {
+			this.dom.container.addClass( classes.error );
+		}
+		else {
+			this.dom.container.removeClass( classes.error );
+		}
+
+		return this._msg( this.dom.fieldError, msg, fn );
+	},
+
+	isMultiValue: function () {
+		return this.s.multiValue;
+	},
+
+	inError: function () {
+		return this.dom.container.hasClass( this.s.classes.error );
+	},
+
+	input: function () {
+		return this.s.type.input ?
+			this._typeFn( 'input' ) :
+			$('input, select, textarea', this.dom.container);
+	},
+
+	focus: function () {
+		if ( this.s.type.focus ) {
+			this._typeFn( 'focus' );
+		}
+		else {
+			$('input, select, textarea', this.dom.container).focus();
+		}
+
+		return this;
+	},
+
+	get: function () {
+		// When multi-value a single get is undefined
+		if ( this.isMultiValue() ) {
+			return undefined;
+		}
+
+		var val = this._typeFn( 'get' );
+		return val !== undefined ?
+			val :
+			this.def();
+	},
+
+	hide: function ( animate ) {
+		var el = this.dom.container;
+
+		if ( animate === undefined ) {
+			animate = true;
+		}
+
+		if ( this.s.host.display() && animate ) {
+			el.slideUp();
+		}
+		else {
+			el.css( 'display', 'none' );
+		}
+		return this;
+	},
+
+	label: function ( str ) {
+		var label = this.dom.label;
+
+		if ( str === undefined ) {
+			return label.html();
+		}
+
+		label.html( str );
+		return this;
+	},
+
+	message: function ( msg, fn ) {
+		return this._msg( this.dom.fieldMessage, msg, fn );
+	},
+
+	// There is no `multiVal()` as its arguments could be ambiguous
+	// id is an idSrc value _only_
+	multiGet: function ( id ) {
+		var value;
+		var multiValues = this.s.multiValues;
+		var multiIds = this.s.multiIds;
+
+		if ( id === undefined ) {
+			// Get an object with the values for each item being edited
+			value = {};
+
+			for ( var i=0 ; i<multiIds.length ; i++ ) {
+				value[ multiIds[i] ] = this.isMultiValue() ?
+					multiValues[ multiIds[i] ] :
+					this.val();
+			}
+		}
+		else if ( this.isMultiValue() ) {
+			// Individual value
+			value = multiValues[ id ];
+		}
+		else {
+			// Common value
+			value = this.val();
+		}
+
+		return value;
+	},
+
+	multiSet: function ( id, val )
+	{
+		var multiValues = this.s.multiValues;
+		var multiIds = this.s.multiIds;
+
+		if ( val === undefined ) {
+			val = id;
+			id = undefined;
+		}
+
+		// Set
+		var set = function ( idSrc, val ) {
+			// Get an individual item's value - add the id to the edit ids if
+			// it isn't already in the set.
+			if ( $.inArray( multiIds ) === -1 ) {
+				multiIds.push( idSrc );
+			}
+
+			multiValues[ idSrc ] = val;
+		};
+
+		if ( $.isPlainObject( val ) && id === undefined ) {
+			// idSrc / value pairs passed in
+			$.each( val, function ( idSrc, innerVal ) {
+				set( idSrc, innerVal );
+			} );
+		}
+		else if ( id === undefined ) {
+			// Set same value for all existing ids
+			$.each( multiIds, function ( i, idSrc ) {
+				set( idSrc, val );
+			} );
+		}
+		else {
+			// Setting an individual property
+			set( id, val );
+		}
+
+		this.s.multiValue = true;
+		this._multiValueCheck();
+
+		return this;
+	},
+
+	name: function () {
+		return this.s.opts.name;
+	},
+
+	node: function () {
+		return this.dom.container[0];
+	},
+
+	set: function ( val ) {
+		var decodeFn = function ( d ) {
+			return typeof d !== 'string' ?
+				d :
+				d
+					.replace(/&gt;/g, '>')
+					.replace(/&lt;/g, '<')
+					.replace(/&amp;/g, '&')
+					.replace(/&quot;/g, '"')
+					.replace(/&#39;/g, '\'')
+					.replace(/&#10;/g, '\n');
+		};
+
+		this.s.multiValue = false;
+
+		var decode = this.s.opts.entityDecode;
+		if ( decode === undefined || decode === true ) {
+			if ( $.isArray( val ) ) {
+				for ( var i=0, ien=val.length ; i<ien ; i++ ) {
+					val[i] = decodeFn( val[i] );
+				}
+			}
+			else {
+				val = decodeFn( val );
+			}
+		}
+
+		this._typeFn( 'set', val );
+
+		this._multiValueCheck();
+
+		return this;
+	},
+
+	show: function ( animate ) {
+		var el = this.dom.container;
+
+		if ( animate === undefined ) {
+			animate = true;
+		}
+
+		if ( this.s.host.display() && animate ) {
+			el.slideDown();
+		}
+		else {
+			el.css( 'display', 'block' );
+		}
+		return this;
+	},
+
+	val: function ( val ) {
+		return val === undefined ?
+			this.get() :
+			this.set( val );
+	},
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Internal - Called from Editor only and are not publicly documented -
+	 * these APIs can change!
+	 */
+	dataSrc: function () {
+		return this.s.opts.data;
+	},
+
+	destroy: function () {
+		// remove element
+		this.dom.container.remove();
+
+		// field's own destroy method if there is one
+		this._typeFn( 'destroy' );
+		return this;
+	},
+
+	multiIds: function () {
+		return this.s.multiIds;
+	},
+
+	multiInfoShown: function ( show ) {
+		this.dom.multiInfo.css( { display: show ? 'block' : 'none' } );
+	},
+
+	multiReset: function () {
+		this.s.multiIds = [];
+		this.s.multiValues = {};
+	},
+
+	valFromData: null,
+
+	valToData: null,
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private
+	 */
+	_errorNode: function () {
+		return this.dom.fieldError;
+	},
+
+	_msg: function ( el, msg, fn ) {
+		if ( typeof msg === 'function' ) {
+			var editor = this.s.host;
+			msg = msg( editor, new DataTable.Api( editor.s.table ) );
+		}
+
+		if ( el.parent().is(":visible") ) {
+			el.html( msg );
+
+			if ( msg ) {
+				el.slideDown( fn ); // fn can be undefined - so jQuery won't execute it
+			}
+			else {
+				el.slideUp( fn );
+			}
+		}
+		else {
+			// Not visible, so immediately set, or blank out the element
+			el
+				.html( msg || '' )
+				.css( 'display', msg ? 'block' : 'none' );
+
+			if ( fn ) {
+				fn();
+			}
+		}
+
+		return this;
+	},
+
+	_multiValueCheck: function () {
+		var last;
+		var ids = this.s.multiIds;
+		var values = this.s.multiValues;
+		var val;
+		var different = false;
+
+		if ( ids ) {
+			for ( var i=0 ; i<ids.length ; i++ ) {
+				val = values[ ids[i] ];
+
+				if ( i > 0 && val !== last ) {
+					different = true;
+					break;
+				}
+
+				last = val;
+			}
+		}
+
+		if ( different && this.s.multiValue ) {
+			// Different values
+			this.dom.inputControl.css( { display: 'none' } );
+			this.dom.multi.css( { display: 'block' } );
+		}
+		else {
+			// All the same value
+			this.dom.inputControl.css( { display: 'block' } );
+			this.dom.multi.css( { display: 'none' } );
+
+			if ( this.s.multiValue ) {
+				this.val( last );
+			}
+		}
+
+		this.dom.multiReturn.css( {
+			display: ids && ids.length > 1 && different && ! this.s.multiValue ?
+				'block' :
+				'none'
+		} );
+
+		this.s.host._multiInfo();
+
+		return true;
+	},
+
+	_typeFn: function ( name /*, ... */ ) {
+		// Remove the name from the arguments list, so the rest can be passed
+		// straight into the field type
+		var args = Array.prototype.slice.call( arguments );
+		args.shift();
+
+		// Insert the options as the first parameter - all field type methods
+		// take the field's configuration object as the first parameter
+		args.unshift( this.s.opts );
+
+		var fn = this.s.type[ name ];
+		if ( fn ) {
+			return fn.apply( this.s.host, args );
+		}
+	}
+};
+
+
+Editor.Field.models = {};
+
+
+/**
+ * Initialisation options that can be given to Editor.Field at initialisation
+ * time.
+ *  @namespace
+ */
+Editor.Field.defaults = {
+	/**
+	 * Class name to assign to the field's container element (in addition to the other
+	 * classes that Editor assigns by default).
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 */
+	"className": "",
+
+	/**
+	 * The data property (`mData` in DataTables terminology) that is used to
+	 * read from and write to the table. If not given then it will take the same
+	 * value as the `name` that is given in the field object. Note that `data`
+	 * can be given as null, which will result in Editor not using a DataTables
+	 * row property for the value of the field for either getting or setting
+	 * data.
+	 *
+	 * In previous versions of Editor (1.2-) this was called `dataProp`. The old
+	 * name can still be used for backwards compatibility, but the new form is
+	 * preferred.
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 */
+	"data": "",
+
+	/**
+	 * The default value for the field. Used when creating new rows (editing will
+	 * use the currently set value). If given as a function the function will be
+	 * executed and the returned value used as the default
+	 *
+	 * In Editor 1.2 and earlier this field was called `default` - however
+	 * `default` is a reserved word in Javascript, so it couldn't be used
+	 * unquoted. `default` will still work with Editor 1.3, but the new property
+	 * name of `def` is preferred.
+	 *  @type string|function
+	 *  @default <i>Empty string</i>
+	 */
+	"def": "",
+
+	/**
+	 * Helpful information text about the field that is shown below the input control.
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 */
+	"fieldInfo": "",
+
+	/**
+	 * The ID of the field. This is used by the `label` HTML tag as the "for" attribute 
+	 * improved accessibility. Although this using this parameter is not mandatory,
+	 * it is a good idea to assign the ID to the DOM element that is the input for the
+	 * field (if this is applicable).
+	 *  @type string
+	 *  @default <i>Calculated</i>
+	 */
+	"id": "",
+
+	/**
+	 * The label to display for the field input (i.e. the name that is visually 
+	 * assigned to the field).
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 */
+	"label": "",
+
+	/**
+	 * Helpful information text about the field that is shown below the field label.
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 */
+	"labelInfo": "",
+
+	/**
+	 * The name for the field that is submitted to the server. This is the only
+	 * mandatory parameter in the field description object.
+	 *  @type string
+	 *  @default <i>null</i>
+	 */
+	"name": null,
+
+	/**
+	 * The input control that is presented to the end user. The options available 
+	 * are defined by {@link Editor.fieldTypes} and any extensions made 
+	 * to that object.
+	 *  @type string
+	 *  @default text
+	 */
+	"type": "text"
+};
+
+
+
+/**
+ * 
+ *  @namespace
+ */
+Editor.Field.models.settings = {
+	type: null,
+	name: null,
+	classes: null,
+	opts: null,
+	host: null
+};
+
+
+
+/**
+ * 
+ *  @namespace
+ */
+Editor.Field.models.dom = {
+	container: null,
+	label: null,
+	labelInfo: null,
+	fieldInfo: null,
+	fieldError: null,
+	fieldMessage: null
+};
+
+
+/*
+ * Models
+ */
+
+/**
+ * Object models container, for the various models that DataTables has available
+ * to it. These models define the objects that are used to hold the active state
+ * and configuration of the table.
+ *  @namespace
+ */
+Editor.models = {};
+
+
+/**
+ * Editor makes very few assumptions about how its form will actually be
+ * displayed to the end user (where in the DOM, interaction etc), instead
+ * focusing on providing form interaction controls only. To actually display
+ * a form in the browser we need to use a display controller, and then select
+ * which one we want to use at initialisation time using the `display`
+ * option. For example a display controller could display the form in a
+ * lightbox (as the default display controller does), it could completely
+ * empty the document and put only the form in place, ir could work with
+ * DataTables to use `fnOpen` / `fnClose` to show the form in a "details" row
+ * and so on.
+ *
+ * Editor has two built-in display controllers ('lightbox' and 'envelope'),
+ * but others can readily be created and installed for use as plug-ins. When
+ * creating a display controller plug-in you **must** implement the methods
+ * in this control. Additionally when closing the display internally you
+ * **must** trigger a `requestClose` event which Editor will listen
+ * for and act upon (this allows Editor to ask the user if they are sure
+ * they want to close the form, for example).
+ *  @namespace
+ */
+Editor.models.displayController = {
+	/**
+	 * Initialisation method, called by Editor when itself, initialises.
+	 *  @param {object} dte The DataTables Editor instance that has requested
+	 *    the action - this allows access to the Editor API if required.
+	 *  @returns {object} The object that Editor will use to run the 'open'
+	 *    and 'close' methods against. If static methods are used then
+	 *    just return the object that holds the init, open and close methods,
+	 *    however, this allows the display to be created with a 'new'
+	 *    instance of an object is the display controller calls for that.
+	 *  @type function
+	 */
+	"init": function ( dte ) {},
+
+	/**
+	 * Display the form (add it to the visual display in the document)
+	 *  @param {object} dte The DataTables Editor instance that has requested
+	 *    the action - this allows access to the Editor API if required.
+	 *  @param {element} append The DOM node that contains the form to be
+	 *    displayed
+	 *  @param {function} [fn] Callback function that is to be executed when
+	 *    the form has been displayed. Note that this parameter is optional.
+	 */
+	"open": function ( dte, append, fn ) {},
+
+	/**
+	 * Hide the form (remove it form the visual display in the document)
+	 *  @param {object} dte The DataTables Editor instance that has requested
+	 *    the action - this allows access to the Editor API if required.
+	 *  @param {function} [fn] Callback function that is to be executed when
+	 *    the form has been hidden. Note that this parameter is optional.
+	 */
+	"close": function ( dte, fn ) {}
+};
+
+
+
+/**
+ * Model object for input types which are available to fields (assigned to
+ * {@link Editor.fieldTypes}). Any plug-ins which add additional
+ * input types to Editor **must** implement the methods in this object 
+ * (dummy functions are given in the model so they can be used as defaults
+ * if extending this object).
+ *
+ * All functions in the model are executed in the Editor's instance scope,
+ * so you have full access to the settings object and the API methods if
+ * required.
+ *  @namespace
+ *  @example
+ *    // Add a simple text input (the 'text' type that is built into Editor
+ *    // does this, so you wouldn't implement this exactly as show, but it
+ *    // it is a good example.
+ *
+ *    var Editor = $.fn.Editor;
+ *
+ *    Editor.fieldTypes.myInput = $.extend( true, {}, Editor.models.type, {
+ *      "create": function ( conf ) {
+ *        // We store the 'input' element in the configuration object so
+ *        // we can easily access it again in future.
+ *        conf._input = document.createElement('input');
+ *        conf._input.id = conf.id;
+ *        return conf._input;
+ *      },
+ *    
+ *      "get": function ( conf ) {
+ *        return conf._input.value;
+ *      },
+ *    
+ *      "set": function ( conf, val ) {
+ *        conf._input.value = val;
+ *      },
+ *    
+ *      "enable": function ( conf ) {
+ *        conf._input.disabled = false;
+ *      },
+ *    
+ *      "disable": function ( conf ) {
+ *        conf._input.disabled = true;
+ *      }
+ *    } );
+ */
+Editor.models.fieldType = {
+	/**
+	 * Create the field - this is called when the field is added to the form.
+	 * Note that this is called at initialisation time, or when the 
+	 * {@link Editor#add} API method is called, not when the form is displayed. 
+	 * If you need to know when the form is shown, you can use the API to listen 
+	 * for the `open` event.
+	 *  @param {object} conf The configuration object for the field in question:
+	 *    {@link Editor.models.field}.
+	 *  @returns {element|null} The input element (or a wrapping element if a more
+	 *    complex input is required) or null if nothing is to be added to the
+	 *    DOM for this input type.
+	 *  @type function
+	 */
+	"create": function ( conf ) {},
+
+	/**
+	 * Get the value from the field
+	 *  @param {object} conf The configuration object for the field in question:
+	 *    {@link Editor.models.field}.
+	 *  @returns {*} The value from the field - the exact value will depend on the
+	 *    formatting required by the input type control.
+	 *  @type function
+	 */
+	"get": function ( conf ) {},
+
+	/**
+	 * Set the value for a field
+	 *  @param {object} conf The configuration object for the field in question:
+	 *    {@link Editor.models.field}.
+	 *  @param {*} val The value to set the field to - the exact value will
+	 *    depend on the formatting required by the input type control.
+	 *  @type function
+	 */
+	"set": function ( conf, val ) {},
+
+	/**
+	 * Enable the field - i.e. allow user interface
+	 *  @param {object} conf The configuration object for the field in question:
+	 *    {@link Editor.models.field}.
+	 *  @type function
+	 */
+	"enable": function ( conf ) {},
+
+	/**
+	 * Disable the field - i.e. disallow user interface
+	 *  @param {object} conf The configuration object for the field in question:
+	 *    {@link Editor.models.field}.
+	 *  @type function
+	 */
+	"disable": function ( conf ) {}
+};
+
+
+
+/**
+ * Settings object for Editor - this provides the state for each instance of
+ * Editor and can be accessed through the instance's `s` property. Note that the
+ * settings object is considered to be "private" and thus is liable to change
+ * between versions. As such if you do read any of the setting parameters,
+ * please keep this in mind when upgrading!
+ *  @namespace
+ */
+Editor.models.settings = {
+	/**
+	 * URL to submit Ajax data to.
+	 * This is directly set by the initialisation parameter / default of the same name.
+	 *  @type string
+	 *  @default null
+	 */
+	"ajaxUrl": null,
+
+	/**
+	 * Ajax submit function.
+	 * This is directly set by the initialisation parameter / default of the same name.
+	 *  @type function
+	 *  @default null
+	 */
+	"ajax": null,
+
+	/**
+	 * Data source for get and set data actions. This allows Editor to perform
+	 * as an Editor for virtually any data source simply by defining additional
+	 * data sources.
+	 *  @type object
+	 *  @default null
+	 */
+	"dataSource": null,
+
+	/**
+	 * DataTable selector, can be anything that the Api supports
+	 * This is directly set by the initialisation parameter / default of the same name.
+	 *  @type string
+	 *  @default null
+	 */
+	"domTable": null,
+
+	/**
+	 * The initialisation object that was given by the user - stored for future reference.
+	 * This is directly set by the initialisation parameter / default of the same name.
+	 *  @type string
+	 *  @default null
+	 */
+	"opts": null,
+
+	/**
+	 * The display controller object for the Form.
+	 * This is directly set by the initialisation parameter / default of the same name.
+	 *  @type string
+	 *  @default null
+	 */
+	"displayController": null,
+
+	/**
+	 * The form fields - see {@link Editor.models.field} for details of the 
+	 * objects held in this array.
+	 *  @type object
+	 *  @default null
+	 */
+	"fields": {},
+
+	/**
+	 * Field order - order that the fields will appear in on the form. Array of strings,
+	 * the names of the fields.
+	 *  @type array
+	 *  @default null
+	 */
+	"order": [],
+
+	/**
+	 * The ID of the row being edited (set to -1 on create and remove actions)
+	 *  @type string
+	 *  @default null
+	 */
+	"id": -1,
+
+	/**
+	 * Flag to indicate if the form is currently displayed (true) or not (false)
+	 *  @type string
+	 *  @default null
+	 */
+	"displayed": false,
+
+	/**
+	 * Flag to indicate if the form is current in a processing state (true) or not (false)
+	 *  @type string
+	 *  @default null
+	 */
+	"processing": false,
+
+	/**
+	 * Developer provided identifier for the elements to be edited (i.e. at
+	 * `dt-type row-selector` to select rows to edit or delete.
+	 *  @type array
+	 *  @default null
+	 */
+	"modifier": null,
+
+	/**
+	 * The current form action - 'create', 'edit' or 'remove'. If no current action then
+	 * it is set to null.
+	 *  @type string
+	 *  @default null
+	 */
+	"action": null,
+
+	/**
+	 * JSON property from which to read / write the row's ID property.
+	 *  @type string
+	 *  @default null
+	 */
+	"idSrc": null
+};
+
+
+
+/**
+ * Model of the buttons that can be used with the {@link Editor#buttons}
+ * method for creating and displaying buttons (also the {@link Editor#button}
+ * argument option for the {@link Editor#create}, {@link Editor#edit} and 
+ * {@link Editor#remove} methods). Although you don't need to extend this object,
+ * it is available for reference to show the options available.
+ *  @namespace
+ */
+Editor.models.button = {
+	/**
+	 * The text to put into the button. This can be any HTML string you wish as 
+	 * it will be rendered as HTML (allowing images etc to be shown inside the
+	 * button).
+	 *  @type string
+	 *  @default null
+	 */
+	"label": null,
+
+	/**
+	 * Callback function which the button is activated. For example for a 'submit' 
+	 * button you would call the {@link Editor#submit} API method, while for a cancel button
+	 * you would call the {@link Editor#close} API method. Note that the function is executed 
+	 * in the scope of the Editor instance, so you can call the Editor's API methods 
+	 * using the `this` keyword.
+	 *  @type function
+	 *  @default null
+	 */
+	"fn": null,
+
+	/**
+	 * The CSS class(es) to apply to the button which can be useful for styling buttons 
+	 * which preform different functions each with a distinctive visual appearance.
+	 *  @type string
+	 *  @default null
+	 */
+	"className": null
+};
+
+
+
+/**
+ * This is really an internal namespace
+ *
+ *  @namespace
+ */
+Editor.models.formOptions = {
+	/**
+	 * Action to take when the return key is pressed when focused in a form
+	 * element. Cam be `submit` or `none`. Could also be `blur` or `close`, but
+	 * why would you ever want that. Replaces `submitOnReturn` from 1.4.
+	 * 
+	 * @type string
+	 */
+	onReturn: 'submit',
+
+	/**
+	 * Action to take on blur. Can be `close`, `submit` or `none`. Replaces
+	 * `submitOnBlur` from 1.4
+	 * 
+	 * @type string
+	 */
+	onBlur: 'close',
+
+	/**
+	 * Action to take when the lightbox background is clicked - can be `close`,
+	 * `submit`, `blur` or `none`. Replaces `blurOnBackground` from 1.4
+	 * 
+	 * @type string
+	 */
+	onBackground: 'blur',
+
+	/**
+	 * Close for at the end of the Ajax request. Can be `close` or `none`.
+	 * Replaces `closeOnComplete` from 1.4.
+	 * 
+	 * @type string
+	 */
+	onComplete: 'close',
+
+	/**
+	 * Action to take when the `esc` key is pressed when focused in the form -
+	 * can be `close`, `submit`, `blur` or `none`
+	 * 
+	 * @type string
+	 */
+	onEsc: 'close',
+
+	/**
+	 * Data to submit to the server when submitting a form. If an option is
+	 * selected that results in no data being submitted, the Ajax request will
+	 * not be made Can be `all`, `changed` or `allIfChanged`. This effects the
+	 * edit action only.
+	 *
+	 * @type string
+	 */
+	submit: 'all',
+
+	/**
+	 * Field identifier to focus on
+	 * 
+	 * @type null|integer|string
+	 */
+	focus: 0,
+
+	/**
+	 * Buttons to show in the form
+	 * 
+	 * @type string|boolean|array|object
+	 */
+	buttons: true,
+
+	/**
+	 * Form title
+	 * 
+	 * @type string|boolean
+	 */
+	title: true,
+
+	/**
+	 * Form message
+	 * 
+	 * @type string|boolean
+	 */
+	message: true,
+
+	/**
+	 * DataTables redraw option
+	 * 
+	 * @type string|boolean
+	 */
+	drawType: false
+};
+
+
+/*
+ * Display controllers
+ */
+
+/**
+ * Display controllers. See {@link Editor.models.displayController} for
+ * full information about the display controller options for Editor. The display
+ * controllers given in this object can be utilised by specifying the
+ * {@link Editor.defaults.display} option.
+ *  @namespace
+ */
+Editor.display = {};
+
+
+(function(window, document, $, DataTable) {
+
+
+var self;
+
+Editor.display.lightbox = $.extend( true, {}, Editor.models.displayController, {
+	/*
+	 * API methods
+	 */
+	"init": function ( dte ) {
+		self._init();
+		return self;
+	},
+
+	"open": function ( dte, append, callback ) {
+		if ( self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		self._dte = dte;
+
+		var content = self._dom.content;
+		content.children().detach();
+		content
+			.append( append )
+			.append( self._dom.close );
+
+		self._shown = true;
+		self._show( callback );
+	},
+
+	"close": function ( dte, callback ) {
+		if ( !self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		self._dte = dte;
+		self._hide( callback );
+
+		self._shown = false;
+	},
+
+	node: function ( dte ) {
+		return self._dom.wrapper[0];
+	},
+
+
+	/*
+	 * Private methods
+	 */
+	"_init": function () {
+		if ( self._ready ) {
+			return;
+		}
+
+		var dom = self._dom;
+		dom.content = $('div.DTED_Lightbox_Content', self._dom.wrapper);
+
+		dom.wrapper.css( 'opacity', 0 );
+		dom.background.css( 'opacity', 0 );
+	},
+
+
+	"_show": function ( callback ) {
+		var that = this;
+		var dom = self._dom;
+
+		// Mobiles have very poor position fixed abilities, so we need to know
+		// when using mobile A media query isn't good enough
+		if ( window.orientation !== undefined ) {
+			$('body').addClass( 'DTED_Lightbox_Mobile' );
+		}
+
+		// Adjust size for the content
+		dom.content.css( 'height', 'auto' );
+		dom.wrapper.css( {
+			top: -self.conf.offsetAni
+		} );
+
+		$('body')
+			.append( self._dom.background )
+			.append( self._dom.wrapper );
+
+		self._heightCalc();
+
+		dom.wrapper
+			.stop()
+				.animate( {
+				opacity: 1,
+				top: 0
+			}, callback );
+
+		dom.background
+			.stop()
+			.animate( {
+				opacity: 1
+			} );
+
+		// Event handlers - assign on show (and unbind on hide) rather than init
+		// since we might need to refer to different editor instances - 12563
+		dom.close.bind( 'click.DTED_Lightbox', function (e) {
+			self._dte.close();
+		} );
+
+		dom.background.bind( 'click.DTED_Lightbox', function (e) {
+			self._dte.background();
+		} );
+
+		$('div.DTED_Lightbox_Content_Wrapper', dom.wrapper).bind( 'click.DTED_Lightbox', function (e) {
+			if ( $(e.target).hasClass('DTED_Lightbox_Content_Wrapper') ) {
+				self._dte.background();
+			}
+		} );
+
+		$(window).bind( 'resize.DTED_Lightbox', function () {
+			self._heightCalc();
+		} );
+
+		self._scrollTop = $('body').scrollTop();
+
+		// For smaller screens we need to hide the other elements in the
+		// document since iOS and Android both mess up display:fixed when
+		// the virtual keyboard is shown
+		if ( window.orientation !== undefined ) {
+			var kids = $('body').children().not( dom.background ).not( dom.wrapper );
+			$('body').append( '<div class="DTED_Lightbox_Shown"/>' );
+			$('div.DTED_Lightbox_Shown').append( kids );
+		}
+	},
+
+
+	"_heightCalc": function () {
+		// Set the max-height for the form content
+		var dom = self._dom;
+		var maxHeight = $(window).height() - (self.conf.windowPadding*2) -
+			$('div.DTE_Header', dom.wrapper).outerHeight() -
+			$('div.DTE_Footer', dom.wrapper).outerHeight();
+
+		$('div.DTE_Body_Content', dom.wrapper).css(
+			'maxHeight',
+			maxHeight
+		);
+	},
+
+
+	"_hide": function ( callback ) {
+		var dom = self._dom;
+
+		if ( !callback ) {
+			callback = function () {};
+		}
+
+		if ( window.orientation !== undefined  ) {
+			var show = $('div.DTED_Lightbox_Shown');
+			show.children().appendTo('body');
+			show.remove();
+		}
+
+		// Restore scroll state
+		$('body')
+			.removeClass( 'DTED_Lightbox_Mobile' )
+			.scrollTop( self._scrollTop );
+
+		dom.wrapper
+			.stop()
+			.animate( {
+				opacity: 0,
+				top: self.conf.offsetAni
+			}, function () {
+				$(this).detach();
+				callback();
+			} );
+
+		dom.background
+			.stop()
+			.animate( {
+				opacity: 0
+			}, function () {
+				$(this).detach();
+			} );
+
+		// Event handlers
+		dom.close.unbind( 'click.DTED_Lightbox' );
+		dom.background.unbind( 'click.DTED_Lightbox' );
+		$('div.DTED_Lightbox_Content_Wrapper', dom.wrapper).unbind( 'click.DTED_Lightbox' );
+		$(window).unbind( 'resize.DTED_Lightbox' );
+	},
+
+
+	/*
+	 * Private properties
+	 */
+	"_dte": null,
+	"_ready": false,
+	"_shown": false,
+	"_dom": {
+		"wrapper": $(
+			'<div class="DTED DTED_Lightbox_Wrapper">'+
+				'<div class="DTED_Lightbox_Container">'+
+					'<div class="DTED_Lightbox_Content_Wrapper">'+
+						'<div class="DTED_Lightbox_Content">'+
+						'</div>'+
+					'</div>'+
+				'</div>'+
+			'</div>'
+		),
+
+		"background": $(
+			'<div class="DTED_Lightbox_Background"><div/></div>'
+		),
+
+		"close": $(
+			'<div class="DTED_Lightbox_Close"></div>'
+		),
+
+		"content": null
+	}
+} );
+
+self = Editor.display.lightbox;
+
+self.conf = {
+	"offsetAni": 25,
+	"windowPadding": 25
+};
+
+
+}(window, document, jQuery, jQuery.fn.dataTable));
+
+
+
+(function(window, document, $, DataTable) {
+
+
+var self;
+
+Editor.display.envelope = $.extend( true, {}, Editor.models.displayController, {
+	/*
+	 * API methods
+	 */
+	"init": function ( dte ) {
+		self._dte = dte;
+		self._init();
+		return self;
+	},
+
+
+	"open": function ( dte, append, callback ) {
+		self._dte = dte;
+		$(self._dom.content).children().detach();
+		self._dom.content.appendChild( append );
+		self._dom.content.appendChild( self._dom.close );
+
+		self._show( callback );
+	},
+
+
+	"close": function ( dte, callback ) {
+		self._dte = dte;
+		self._hide( callback );
+	},
+
+	node: function ( dte ) {
+		return self._dom.wrapper[0];
+	},
+
+
+	/*
+	 * Private methods
+	 */
+	"_init": function () {
+		if ( self._ready ) {
+			return;
+		}
+
+		self._dom.content = $('div.DTED_Envelope_Container', self._dom.wrapper)[0];
+
+		document.body.appendChild( self._dom.background );
+		document.body.appendChild( self._dom.wrapper );
+
+		// For IE6-8 we need to make it a block element to read the opacity...
+		self._dom.background.style.visbility = 'hidden';
+		self._dom.background.style.display = 'block';
+		self._cssBackgroundOpacity = $(self._dom.background).css('opacity');
+		self._dom.background.style.display = 'none';
+		self._dom.background.style.visbility = 'visible';
+	},
+
+
+	"_show": function ( callback ) {
+		var that = this;
+		var formHeight;
+
+		if ( !callback ) {
+			callback = function () {};
+		}
+
+		// Adjust size for the content
+		self._dom.content.style.height = 'auto';
+
+		var style = self._dom.wrapper.style;
+		style.opacity = 0;
+		style.display = 'block';
+
+		var targetRow = self._findAttachRow();
+		var height = self._heightCalc();
+		var width = targetRow.offsetWidth;
+
+		style.display = 'none';
+		style.opacity = 1;
+
+		// Prep the display
+		self._dom.wrapper.style.width = width+"px";
+		self._dom.wrapper.style.marginLeft = -(width/2)+"px";
+		self._dom.wrapper.style.top = ($(targetRow).offset().top + targetRow.offsetHeight)+"px";
+		self._dom.content.style.top = ((-1 * height) - 20)+"px";
+
+		// Start animating in the background
+		self._dom.background.style.opacity = 0;
+		self._dom.background.style.display = 'block';
+		$(self._dom.background).animate( {
+			'opacity': self._cssBackgroundOpacity
+		}, 'normal' );
+
+		// Animate in the display
+		$(self._dom.wrapper).fadeIn();
+
+		// Slide the slider down to 'open' the view
+		if ( self.conf.windowScroll ) {
+			// Scroll the window so we can see the editor first
+			$('html,body').animate( {
+				"scrollTop": $(targetRow).offset().top + targetRow.offsetHeight - self.conf.windowPadding
+			}, function () {
+				// Now open the editor
+				$(self._dom.content).animate( {
+					"top": 0
+				}, 600, callback );
+			} );
+		}
+		else {
+			// Just open the editor without moving the document position
+			$(self._dom.content).animate( {
+				"top": 0
+			}, 600, callback );
+		}
+
+		// Event handlers
+		$(self._dom.close).bind( 'click.DTED_Envelope', function (e) {
+			self._dte.close();
+		} );
+
+		$(self._dom.background).bind( 'click.DTED_Envelope', function (e) {
+			self._dte.background();
+		} );
+
+		$('div.DTED_Lightbox_Content_Wrapper', self._dom.wrapper).bind( 'click.DTED_Envelope', function (e) {
+			if ( $(e.target).hasClass('DTED_Envelope_Content_Wrapper') ) {
+				self._dte.background();
+			}
+		} );
+
+		$(window).bind( 'resize.DTED_Envelope', function () {
+			self._heightCalc();
+		} );
+	},
+
+
+	"_heightCalc": function () {
+		var formHeight;
+
+		formHeight = self.conf.heightCalc ?
+			self.conf.heightCalc( self._dom.wrapper ) :
+			$(self._dom.content).children().height();
+
+		// Set the max-height for the form content
+		var maxHeight = $(window).height() - (self.conf.windowPadding*2) -
+			$('div.DTE_Header', self._dom.wrapper).outerHeight() -
+			$('div.DTE_Footer', self._dom.wrapper).outerHeight();
+
+		$('div.DTE_Body_Content', self._dom.wrapper).css('maxHeight', maxHeight);
+
+		return $(self._dte.dom.wrapper).outerHeight();
+	},
+
+
+	"_hide": function ( callback ) {
+		if ( !callback ) {
+			callback = function () {};
+		}
+
+		$(self._dom.content).animate( {
+			"top": -(self._dom.content.offsetHeight+50)
+		}, 600, function () {
+			$([self._dom.wrapper, self._dom.background]).fadeOut( 'normal', callback );
+		} );
+
+		// Event handlers
+		$(self._dom.close).unbind( 'click.DTED_Lightbox' );
+		$(self._dom.background).unbind( 'click.DTED_Lightbox' );
+		$('div.DTED_Lightbox_Content_Wrapper', self._dom.wrapper).unbind( 'click.DTED_Lightbox' );
+		$(window).unbind( 'resize.DTED_Lightbox' );
+	},
+
+
+	"_findAttachRow": function () {
+		var dt = $(self._dte.s.table).DataTable();
+
+		// Figure out where we want to put the form display
+		if ( self.conf.attach === 'head' ) {
+			return dt.table().header();
+		}
+		else if ( self._dte.s.action === 'create' ) {
+			return dt.table().header();
+		}
+		else {
+			return dt.row( self._dte.s.modifier ).node();
+		}
+	},
+
+
+	/*
+	 * Private properties
+	 */
+	"_dte": null,
+	"_ready": false,
+	"_cssBackgroundOpacity": 1, // read from the CSS dynamically, but stored for future reference
+
+
+	"_dom": {
+		"wrapper": $(
+			'<div class="DTED DTED_Envelope_Wrapper">'+
+				'<div class="DTED_Envelope_ShadowLeft"></div>'+
+				'<div class="DTED_Envelope_ShadowRight"></div>'+
+				'<div class="DTED_Envelope_Container"></div>'+
+			'</div>'
+		)[0],
+
+		"background": $(
+			'<div class="DTED_Envelope_Background"><div/></div>'
+		)[0],
+
+		"close": $(
+			'<div class="DTED_Envelope_Close">&times;</div>'
+		)[0],
+
+		"content": null
+	}
+} );
+
+
+// Assign to 'self' for easy referencing of our own object!
+self = Editor.display.envelope;
+
+
+// Configuration object - can be accessed globally using 
+// $.fn.Editor.display.envelope.conf (!)
+self.conf = {
+	"windowPadding": 50,
+	"heightCalc": null,
+	"attach": "row",
+	"windowScroll": true
+};
+
+
+}(window, document, jQuery, jQuery.fn.dataTable));
+
+
+/*
+ * Prototype includes
+ */
+
+
+/**
+ * Add a new field to the from. This is the method that is called automatically when
+ * fields are given in the initialisation objects as {@link Editor.defaults.fields}.
+ *  @memberOf Editor
+ *  @param {object|array} field The object that describes the field (the full
+ *    object is described by {@link Editor.model.field}. Note that multiple
+ *    fields can be given by passing in an array of field definitions.
+ *  @param {string} [after] Existing field to insert the new field after. This
+ *    can be `undefined` (insert at end), `null` (insert at start) or `string`
+ *    the field name to insert after.
+ */
+Editor.prototype.add = function ( cfg, after )
+{
+	// Allow multiple fields to be added at the same time
+	if ( $.isArray( cfg ) ) {
+		for ( var i=0, iLen=cfg.length ; i<iLen ; i++ ) {
+			this.add( cfg[i] );
+		}
+	}
+	else {
+		var name = cfg.name;
+
+		if ( name === undefined ) {
+			throw "Error adding field. The field requires a `name` option";
+		}
+
+		if ( this.s.fields[ name ] ) {
+			throw "Error adding field '"+name+"'. A field already exists with this name";
+		}
+
+		// Allow the data source to add / modify the field properties
+		// Dev: would this be better as an event `preAddField`? And have the
+		// data sources init only once, but can listen for such events? More
+		// complexity, but probably more flexible...
+		this._dataSource( 'initField', cfg );
+
+		this.s.fields[ name ] = new Editor.Field( cfg, this.classes.field, this );
+
+		if ( after === undefined ) {
+			this.s.order.push( name );
+		}
+		else if ( after === null ) {
+			this.s.order.unshift( name );
+		}
+		else {
+			var idx = $.inArray( after, this.s.order );
+			this.s.order.splice( idx+1, 0, name );
+		}
+
+	}
+
+	this._displayReorder( this.order() );
+
+	return this;
+};
+
+
+/**
+ * Perform background activation tasks.
+ * 
+ * This is NOT publicly documented on the Editor web-site, but rather can be
+ * used by display controller plug-ins to perform the required task on
+ * background activation.
+ *
+ * @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.background = function ()
+{
+	var onBackground = this.s.editOpts.onBackground;
+
+	if ( onBackground === 'blur' ) {
+		this.blur();
+	}
+	else if ( onBackground === 'close' ) {
+		this.close();
+	}
+	else if ( onBackground === 'submit' ) {
+		this.submit();
+	}
+
+	return this;
+};
+
+
+/**
+ * Blur the currently displayed editor.
+ *
+ * A blur is different from a `close()` in that it might cause either a close or
+ * the form to be submitted. A typical example of a blur would be clicking on
+ * the background of the bubble or main editing forms - i.e. it might be a
+ * close, or it might submit depending upon the configuration, while a click on
+ * the close box is a very definite close.
+ *
+ * @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.blur = function ()
+{
+	this._blur();
+
+	return this;
+};
+
+
+
+Editor.prototype.bubble = function ( cells, fieldNames, show, opts )
+{
+	var that = this;
+
+	// Some other field in inline edit mode?
+	if ( this._tidy( function () { that.bubble( cells, fieldNames, opts ); } ) ) {
+		return this;
+	}
+
+	// Argument shifting
+	if ( $.isPlainObject( fieldNames ) ) {
+		opts = fieldNames;
+		fieldNames = undefined;
+		show = true;
+	}
+	else if ( typeof fieldNames === 'boolean' ) {
+		show = fieldNames;
+		fieldNames = undefined;
+		opts = undefined;
+	}
+
+	if ( $.isPlainObject( show ) ) {
+		opts = show;
+		show = true;
+	}
+
+	if ( show === undefined ) {
+		show = true;
+	}
+
+	opts = $.extend( {}, this.s.formOptions.bubble, opts );
+
+	var editFields = this._dataSource( 'individual', cells, fieldNames );
+
+	this._edit( cells, editFields, 'bubble' );
+
+	var ret = this._preopen( 'bubble' );
+	if ( ! ret ) {
+		return this;
+	}
+
+	// Keep the bubble in position on resize
+	var namespace = this._formOptions( opts );
+	$(window).on( 'resize.'+namespace, function () {
+		that.bubblePosition();
+	} );
+
+	// Store the nodes that are being used so the bubble can be positioned
+	var nodes = [];
+	this.s.bubbleNodes = nodes.concat.apply( nodes, _pluck( editFields, 'attach' ) );
+
+	// Create container display
+	var classes = this.classes.bubble;
+	var background = $( '<div class="'+classes.bg+'"><div/></div>' );
+	var container = $(
+			'<div class="'+classes.wrapper+'">'+
+				'<div class="'+classes.liner+'">'+
+					'<div class="'+classes.table+'">'+
+						'<div class="'+classes.close+'" />'+
+					'</div>'+
+				'</div>'+
+				'<div class="'+classes.pointer+'" />'+
+			'</div>'
+		);
+
+	if ( show ) {
+		container.appendTo( 'body' );
+		background.appendTo( 'body' );
+	}
+
+	var liner = container.children().eq(0);
+	var table = liner.children();
+	var close = table.children();
+	liner.append( this.dom.formError );
+	table.prepend( this.dom.form );
+
+	if ( opts.message ) {
+		liner.prepend( this.dom.formInfo );
+	}
+
+	if ( opts.title ) {
+		liner.prepend( this.dom.header );
+	}
+
+	if ( opts.buttons ) {
+		table.append( this.dom.buttons );
+	}
+
+	var pair = $().add( container ).add( background );
+	this._closeReg( function ( submitComplete ) {
+		pair.animate(
+			{ opacity: 0 },
+			function () {
+				pair.detach();
+
+				$(window).off( 'resize.'+namespace );
+
+				// Clear error messages "offline"
+				that._clearDynamicInfo();
+			}
+		);
+	} );
+
+	// Close event handlers
+	background.click( function () {
+		that.blur();
+	} );
+
+	close.click( function () {
+		that._close();
+	} );
+
+	this.bubblePosition();
+
+	pair.animate( { opacity: 1 } );
+
+	this._focus( this.s.includeFields, opts.focus );
+	this._postopen( 'bubble' );
+
+	return this;
+};
+
+
+/**
+ * Reposition the editing bubble (`bubble()`) when it is visible. This can be
+ * used to update the bubble position if other elements on the page change
+ * position. Editor will automatically call this method on window resize.
+ *
+ * @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.bubblePosition = function ()
+{
+	var
+		wrapper = $('div.DTE_Bubble'),
+		liner = $('div.DTE_Bubble_Liner'),
+		nodes = this.s.bubbleNodes;
+
+	// Average the node positions to insert the container
+	var position = { top: 0, left: 0, right: 0, bottom: 0 };
+
+	$.each( nodes, function (i, node) {
+		var pos = $(node).offset();
+
+		position.top += pos.top;
+		position.left += pos.left;
+		position.right += pos.left + node.offsetWidth;
+		position.bottom += pos.top + node.offsetHeight;
+	} );
+
+	position.top /= nodes.length;
+	position.left /= nodes.length;
+	position.right /= nodes.length;
+	position.bottom /= nodes.length;
+
+	var
+		top = position.top,
+		left = (position.left + position.right) / 2,
+		width = liner.outerWidth(),
+		visLeft = left - (width / 2),
+		visRight = visLeft + width,
+		docWidth = $(window).width(),
+		padding = 15,
+		classes = this.classes.bubble;
+
+	wrapper.css( {
+		top: top,
+		left: left
+	} );
+
+	// Correct for overflow from the top of the document by positioning below
+	// the field if needed
+	if ( liner.length && liner.offset().top < 0 ) {
+		wrapper
+			.css( 'top', position.bottom )
+			.addClass( 'below' );
+	}
+	else {
+		wrapper.removeClass( 'below' );
+	}
+
+	// Attempt to correct for overflow to the right of the document
+	if ( visRight+padding > docWidth ) {
+		var diff = visRight - docWidth;
+
+		// If left overflowing, that takes priority
+		liner.css( 'left', visLeft < padding ?
+			-(visLeft-padding) :
+			-(diff+padding)
+		);
+	}
+	else {
+		// Correct overflow to the left
+		liner.css( 'left', visLeft < padding ? -(visLeft-padding) : 0 );
+	}
+
+	return this;
+};
+
+
+/**
+ * Setup the buttons that will be shown in the footer of the form - calling this
+ * method will replace any buttons which are currently shown in the form.
+ *  @param {array|object} buttons A single button definition to add to the form or
+ *    an array of objects with the button definitions to add more than one button.
+ *    The options for the button definitions are fully defined by the
+ *    {@link Editor.models.button} object.
+ *  @param {string} buttons.label The text to put into the button. This can be any
+ *    HTML string you wish as it will be rendered as HTML (allowing images etc to 
+ *    be shown inside the button).
+ *  @param {function} [buttons.fn] Callback function which the button is activated.
+ *    For example for a 'submit' button you would call the {@link Editor#submit} method,
+ *    while for a cancel button you would call the {@link Editor#close} method. Note that
+ *    the function is executed in the scope of the Editor instance, so you can call
+ *    the Editor's API methods using the `this` keyword.
+ *  @param {string} [buttons.className] The CSS class(es) to apply to the button
+ *    which can be useful for styling buttons which preform different functions
+ *    each with a distinctive visual appearance.
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.buttons = function ( buttons )
+{
+	var that = this;
+
+	if ( buttons === '_basic' ) {
+		// Special string to create a basic button - undocumented
+		buttons = [ {
+			label: this.i18n[ this.s.action ].submit,
+			fn: function () { this.submit(); }
+		} ];
+	}
+	else if ( ! $.isArray( buttons ) ) {
+		// Allow a single button to be passed in as an object with an array
+		buttons = [ buttons ];
+	}
+
+	$(this.dom.buttons).empty();
+
+	$.each( buttons, function ( i, btn ) {
+		if ( typeof btn === 'string' ) {
+			btn = {
+				label: btn,
+				fn: function () { this.submit(); }
+			};
+		}
+
+		$( '<button/>', {
+				'class': that.classes.form.button+(btn.className ? ' '+btn.className : '')
+			} )
+			.html( typeof btn.label === 'function' ?
+				btn.label( that ) :
+				btn.label || ''
+			)
+			.attr( 'tabindex', 0 )
+			.on( 'keyup', function (e) {
+				if ( e.keyCode === 13 && btn.fn ) {
+					btn.fn.call( that );
+				}
+			} )
+			.on( 'keypress', function (e) {
+				// Stop the browser activating the click event - if we don't
+				// have this and the Ajax return is fast, the keyup in
+				// `_formOptions()` might trigger another submit
+				if ( e.keyCode === 13 ) {
+					e.preventDefault();
+				}
+			} )
+			.on( 'click', function (e) {
+				e.preventDefault();
+
+				if ( btn.fn ) {
+					btn.fn.call( that );
+				}
+			} )
+			.appendTo( that.dom.buttons );
+	} );
+
+	return this;
+};
+
+
+/**
+ * Remove fields from the form (fields are those that have been added using the
+ * {@link Editor#add} method or the `fields` initialisation option). A single,
+ * multiple or all fields can be removed at a time based on the passed parameter.
+ * Fields are identified by the `name` property that was given to each field
+ * when added to the form.
+ *  @param {string|array} [fieldName] Field or fields to remove from the form. If
+ *    not given then all fields are removed from the form. If given as a string
+ *    then the single matching field will be removed. If given as an array of
+ *    strings, then all matching fields will be removed.
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Clear the form of current fields and then add a new field 
+ *    // before displaying a 'create' display
+ *    editor.clear();
+ *    editor.add( {
+ *      "label": "User name",
+ *      "name": "username"
+ *    } );
+ *    editor.create( "Create user" );
+ *
+ *  @example
+ *    // Remove an individual field
+ *    editor.clear( "username" );
+ *
+ *  @example
+ *    // Remove multiple fields
+ *    editor.clear( [ "first_name", "last_name" ] );
+ */
+Editor.prototype.clear = function ( fieldName )
+{
+	var that = this;
+	var fields = this.s.fields;
+
+	if ( typeof fieldName === 'string' ) {
+		// Remove an individual form element
+		fields[ fieldName ].destroy();
+		delete fields[ fieldName ];
+
+		var orderIdx = $.inArray( fieldName, this.s.order );
+		this.s.order.splice( orderIdx, 1 );
+	}
+	else {
+		$.each( this._fieldNames( fieldName ), function (i, name) {
+			that.clear( name );
+		} );
+	}
+
+	return this;
+};
+
+
+/**
+ * Close the form display.
+ * 
+ * Note that `close()` will close any of the three Editor form types (main,
+ * bubble and inline).
+ *
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.close = function ()
+{
+	this._close( false );
+
+	return this;
+};
+
+
+/**
+ * Create a new record - show the form that allows the user to enter information
+ * for a new row and then subsequently submit that data.
+ *  @param {boolean} [show=true] Show the form or not.
+ * 
+ *  @example
+ *    // Show the create form with a submit button
+ *    editor
+ *      .title( 'Add new record' )
+ *      .buttons( {
+ *        "label": "Save",
+ *        "fn": function () {
+ *          this.submit();
+ *        }
+ *      } )
+ *      .create();
+ * 
+ *  @example
+ *    // Don't show the form and automatically submit it after programatically 
+ *    // setting the values of fields (and using the field defaults)
+ *    editor
+ *      create()
+ *      set( 'name',   'Test user' )
+ *      set( 'access', 'Read only' )
+ *      submit();
+ */
+Editor.prototype.create = function ( arg1, arg2, arg3, arg4 )
+{
+	var that = this;
+	var fields = this.s.fields;
+	var count = 1;
+
+	// Some other field in inline edit mode?
+	if ( this._tidy( function () { that.create( arg1, arg2, arg3, arg4 ); } ) ) {
+		return this;
+	}
+
+	// Multi-row creation support (only supported by the 1.3+ style of calling
+	// this method, so a max of three arguments
+	if ( typeof arg1 === 'number' ) {
+		count = arg1;
+		arg1 = arg2;
+		arg2 = arg3;
+	}
+
+	// Set up the edit fields for submission
+	this.s.editFields = {};
+	for ( var i=0 ; i<count ; i++ ) {
+		this.s.editFields[ i ] = {
+			fields: this.s.fields
+		};
+	}
+
+	var argOpts = this._crudArgs( arg1, arg2, arg3, arg4 );
+
+	this.s.action = "create";
+	this.s.modifier = null;
+	this.dom.form.style.display = 'block';
+
+	this._actionClass();
+
+	// Allow all fields to be displayed for the create form
+	this._displayReorder( this.fields() );
+
+	// Set the default for the fields
+	$.each( fields, function ( name, field ) {
+		field.multiReset();
+		field.set( field.def() );
+	} );
+
+	this._event( 'initCreate' );
+	this._assembleMain();
+	this._formOptions( argOpts.opts );
+
+	argOpts.maybeOpen();
+
+	return this;
+};
+
+/**
+ * Create a dependent link between two or more fields. This method is used to
+ * listen for a change in a field's value which will trigger updating of the
+ * form. This update can consist of updating an options list, changing values
+ * or making fields hidden / visible.
+ *
+ * @param {string} parent The name of the field to listen to changes from
+ * @param {string|object|function} url Callback definition. This can be:
+ *   * A string, which will be used as a URL to submit the request for update to
+ *   * An object, which is used to extend an Ajax object for the request. The
+ *     `url` parameter must be specified.
+ *   * A function, which is used as a callback, allowing non-ajax updates.
+ * @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.dependent = function ( parent, url, opts ) {
+	if ( $.isArray( parent ) ) {
+		for ( var i=0, ien=parent.length ; i<ien ; i++ ) {
+			this.dependent( parent[i], url, opts );
+		}
+
+		return this;
+	}
+
+	var that = this;
+	var field = this.field( parent );
+	var ajaxOpts = {
+		type: 'POST',
+		dataType: 'json'
+	};
+
+	opts = $.extend( {
+		event: 'change',
+		data: null,
+		preUpdate: null,
+		postUpdate: null
+	}, opts );
+
+	var update = function ( json ) {
+		if ( opts.preUpdate ) {
+			opts.preUpdate( json );
+		}
+
+		// Field specific
+		$.each( {
+			labels:   'label',
+			options:  'update',
+			values:   'val',
+			messages: 'message',
+			errors:   'error'
+		}, function ( jsonProp, fieldFn ) {
+			if ( json[ jsonProp ] ) {
+				$.each( json[ jsonProp ], function ( field, val ) {
+					that.field( field )[ fieldFn ]( val );
+				} );
+			}
+		} );
+
+		// Form level
+		$.each( [ 'hide', 'show', 'enable', 'disable' ], function ( i, key ) {
+			if ( json[ key ] ) {
+				that[ key ]( json[ key ] );
+			}
+		} );
+
+		if ( opts.postUpdate ) {
+			opts.postUpdate( json );
+		}
+	};
+
+	// Use a delegate handler to account for field elements which are added and
+	// removed after `depenedent` has been called
+	$(field.node()).on( opts.event, function (e) {
+		// Make sure that it was one of the input elements that triggered the ev
+		if ( $.inArray( e.target, field.input().toArray() ) === -1 ) {
+			return;
+		}
+
+		var data = {};
+		data.rows = that.s.editFields ?
+			_pluck( that.s.editFields, 'data' ) :
+			null;
+		data.row = data.rows ?
+			data.rows[0] :
+			null;
+		data.values = that.val();
+
+		if ( opts.data ) {
+			var ret = opts.data( data );
+
+			if ( ret ) {
+				opts.data = ret;
+			}
+		}
+
+		if ( typeof url === 'function' ) {
+			var o = url( field.val(), data, update );
+
+			if ( o ) {
+				update( o );
+			}
+		}
+		else {
+			if ( $.isPlainObject( url ) ) {
+				$.extend( ajaxOpts, url );
+			}
+			else {
+				ajaxOpts.url = url;
+			}
+
+			$.ajax( $.extend( ajaxOpts, {
+				url: url,
+				data: data,
+				success: update
+			} ) );
+		}
+	} );
+
+	return this;
+};
+
+
+/**
+ * Disable one or more field inputs, disallowing subsequent user interaction with the 
+ * fields until they are re-enabled.
+ *  @param {string|array} name The field name (from the `name` parameter given when
+ *   originally setting up the field) to disable, or an array of field names to disable
+ *   multiple fields with a single call.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show a 'create' record form, but with a field disabled
+ *    editor.disable( 'account_type' );
+ *    editor.create( 'Add new user', {
+ *      "label": "Save",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ * 
+ *  @example
+ *    // Disable multiple fields by using an array of field names
+ *    editor.disable( ['account_type', 'access_level'] );
+ */
+Editor.prototype.disable = function ( name )
+{
+	var fields = this.s.fields;
+
+	$.each( this._fieldNames( name ), function ( i, n ) {
+		fields[ n ].disable();
+	} );
+
+	return this;
+};
+
+
+/**
+ * Display, or remove the editing form from the display
+ *  @param {boolean} show Show (`true`) or hide (`false`)
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.display = function ( show )
+{
+	if ( show === undefined ) {
+		return this.s.displayed;
+	}
+	return this[ show ? 'open' : 'close' ]();
+};
+
+
+/**
+ * Fields which are currently displayed
+ *  @return {string[]} Field names that are shown
+ */
+Editor.prototype.displayed = function ()
+{
+	return $.map( this.s.fields, function ( field, name ) {
+		return field.displayed() ? name : null;
+	} );
+};
+
+
+/**
+ * Get display controller node
+ *
+ *  @return {node} Display controller host element
+ */
+Editor.prototype.displayNode = function ()
+{
+	return this.s.displayController.node( this );
+};
+
+
+/**
+ * Edit a record - show the form, pre-populated with the data that is in the given 
+ * DataTables row, that allows the user to enter information for the row to be modified
+ * and then subsequently submit that data.
+ *  @param {node} items The TR element from the DataTable that is to be edited
+ *  @param {boolean} [show=true] Show the form or not.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show the edit form for the first row in the DataTable with a submit button
+ *    editor.edit( $('#example tbody tr:eq(0)')[0], 'Edit record', {
+ *      "label": "Update",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *
+ *  @example
+ *    // Use the title and buttons API methods to show an edit form (this provides
+ *    // the same result as example above, but is a different way of achieving it
+ *    editor.title( 'Edit record' );
+ *    editor.buttons( {
+ *      "label": "Update",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *    editor.edit( $('#example tbody tr:eq(0)')[0] );
+ * 
+ *  @example
+ *    // Automatically submit an edit without showing the user the form
+ *    editor.edit( TRnode, null, null, false );
+ *    editor.set( 'name', 'Updated name' );
+ *    editor.set( 'access', 'Read only' );
+ *    editor.submit();
+ */
+Editor.prototype.edit = function ( items, arg1, arg2, arg3, arg4 )
+{
+	var that = this;
+
+	// Some other field in inline edit mode?
+	if ( this._tidy( function () { that.edit( items, arg1, arg2, arg3, arg4 ); } ) ) {
+		return this;
+	}
+
+	var fields = this.s.fields;
+	var argOpts = this._crudArgs( arg1, arg2, arg3, arg4 );
+
+	this._edit( items, this._dataSource( 'fields', items ), 'main' );
+	this._assembleMain();
+	this._formOptions( argOpts.opts );
+
+	argOpts.maybeOpen();
+
+	return this;
+};
+
+
+/**
+ * Enable one or more field inputs, restoring user interaction with the fields.
+ *  @param {string|array} name The field name (from the `name` parameter given when
+ *   originally setting up the field) to enable, or an array of field names to enable
+ *   multiple fields with a single call.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show a 'create' form with buttons which will enable and disable certain fields
+ *    editor.create( 'Add new user', [
+ *      {
+ *        "label": "User name only",
+ *        "fn": function () {
+ *          this.enable('username');
+ *          this.disable( ['first_name', 'last_name'] );
+ *        }
+ *      }, {
+ *        "label": "Name based",
+ *        "fn": function () {
+ *          this.disable('username');
+ *          this.enable( ['first_name', 'last_name'] );
+ *        }
+ *      }, {
+ *        "label": "Submit",
+ *        "fn": function () { this.submit(); }
+ *      }
+ *    );
+ */
+Editor.prototype.enable = function ( name )
+{
+	var fields = this.s.fields;
+
+	$.each( this._fieldNames( name ), function ( i, n ) {
+		fields[ n ].enable();
+	} );
+
+	return this;
+};
+
+
+/**
+ * Show that a field, or the form globally, is in an error state. Note that
+ * errors are cleared on each submission of the form.
+ *  @param {string} [name] The name of the field that is in error. If not
+ *    given then the global form error display is used.
+ *  @param {string} msg The error message to show
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show an error if the field is required
+ *    editor.create( 'Add new user', {
+ *      "label": "Submit",
+ *      "fn": function () {
+ *        if ( this.get('username') === '' ) {
+ *          this.error( 'username', 'A user name is required' );
+ *          return;
+ *        }
+ *        this.submit();
+ *      }
+ *    } );
+ * 
+ *  @example
+ *    // Show a field and a global error for a required field
+ *    editor.create( 'Add new user', {
+ *      "label": "Submit",
+ *      "fn": function () {
+ *        if ( this.get('username') === '' ) {
+ *          this.error( 'username', 'A user name is required' );
+ *          this.error( 'The data could not be saved because it is incomplete' );
+ *          return;
+ *        }
+ *        this.submit();
+ *      }
+ *    } );
+ */
+Editor.prototype.error = function ( name, msg )
+{
+	if ( msg === undefined ) {
+		// Global error
+		this._message( this.dom.formError, name );
+	}
+	else {
+		// Field error
+		this.s.fields[ name ].error( msg );
+	}
+
+	return this;
+};
+
+
+/**
+ * Get a field object, configured for a named field, which can then be
+ * manipulated through its API. This function effectively acts as a
+ * proxy to the field extensions, allowing easy access to the methods
+ * for a named field. The methods that are available depend upon the field
+ * type plug-in for Editor.
+ *
+ *   @param {string} name Field name to be obtained
+ *   @return {Editor.Field} Field instance
+ *
+ *   @example
+ *     // Update the values available in a select list
+ *     editor.field('island').update( [
+ *       'Lewis and Harris',
+ *       'South Uist',
+ *       'North Uist',
+ *       'Benbecula',
+ *       'Barra'
+ *     ] );
+ *
+ *   @example
+ *     // Equivalent calls
+ *     editor.field('name').set('John Smith');
+ *
+ *     // results in the same action as:
+ *     editor.set('John Smith');
+ */
+Editor.prototype.field = function ( name )
+{
+	return this.s.fields[ name ];
+};
+
+
+/**
+ * Get a list of the fields that are used by the Editor instance.
+ *  @returns {string[]} Array of field names
+ * 
+ *  @example
+ *    // Get current fields and move first item to the end
+ *    var fields = editor.fields();
+ *    var first = fields.shift();
+ *    fields.push( first );
+ *    editor.order( fields );
+ */
+Editor.prototype.fields = function ()
+{
+	return $.map( this.s.fields, function ( field, name ) {
+		return name;
+	} );
+};
+
+
+/**
+ * Get the value of a field
+ *  @param {string|array} [name] The field name (from the `name` parameter given
+ *    when originally setting up the field) to disable. If not given, then an
+ *    object of fields is returned, with the value of each field from the
+ *    instance represented in the array (the object properties are the field
+ *    names). Also an array of field names can be given to get a collection of
+ *    data from the form.
+ *  @returns {*|object} Value from the named field
+ * 
+ *  @example
+ *    // Client-side validation - check that a field has been given a value 
+ *    // before submitting the form
+ *    editor.create( 'Add new user', {
+ *      "label": "Submit",
+ *      "fn": function () {
+ *        if ( this.get('username') === '' ) {
+ *          this.error( 'username', 'A user name is required' );
+ *          return;
+ *        }
+ *        this.submit();
+ *      }
+ *    } );
+ */
+Editor.prototype.get = function ( name )
+{
+	var fields = this.s.fields;
+
+	if ( ! name ) {
+		name = this.fields();
+	}
+
+	if ( $.isArray( name ) ) {
+		var out = {};
+
+		$.each( name, function (i, n) {
+			out[n] = fields[n].get();
+		} );
+
+		return out;
+	}
+
+	return fields[ name ].get();
+};
+
+
+/**
+ * Remove a field from the form display. Note that the field will still be submitted
+ * with the other fields in the form, but it simply won't be visible to the user.
+ *  @param {string|array} [name] The field name (from the `name` parameter given when
+ *   originally setting up the field) to hide or an array of names. If not given then all 
+ *   fields are hidden.
+ *  @param {boolean} [animate=true] Animate if visible
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show a 'create' record form, but with some fields hidden
+ *    editor.hide( 'account_type' );
+ *    editor.hide( 'access_level' );
+ *    editor.create( 'Add new user', {
+ *      "label": "Save",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *
+ *  @example
+ *    // Show a single field by hiding all and then showing one
+ *    editor.hide();
+ *    editor.show('access_type');
+ */
+Editor.prototype.hide = function ( names, animate )
+{
+	var fields = this.s.fields;
+
+	$.each( this._fieldNames( names ), function (i, n) {
+		fields[ n ].hide( animate );
+	} );
+
+	return this;
+};
+
+
+/**
+ * Determine if there is an error state in the form, either the form's global
+ * error message, or one or more fields.
+ *
+ * @param {string|array|undefined} [inNames] The field names to check. All
+ *   fields checked if undefined.
+ * @return {boolean} `true` if there is an error in the form
+ */
+Editor.prototype.inError = function ( inNames )
+{
+	// Is there a global error?
+	if ( $(this.dom.formError).is(':visible') ) {
+		return true;
+	}
+
+	// Field specific
+	var fields = this.s.fields;
+	var names = this._fieldNames( inNames );
+
+	for ( var i=0, ien=names.length ; i<ien ; i++ ) {
+		if ( fields[ names[i] ].inError() ) {
+			return true;
+		}
+	}
+
+	return false;
+};
+
+
+/**
+ * Inline editing for a single field. This method provides a method to allow
+ * end users to very quickly edit fields in place. For example, a user could
+ * simply click on a cell in a table, the contents of which would be replaced
+ * with the editing input field for that cell.
+ *
+ * @param {string|node|DataTables.Api|cell-selector} cell The cell or field to
+ *   be edited (note that for table editing this must be a cell - for standalone
+ *   editing it can also be the field name to edit).
+ * @param {string} [fieldName] The field name to be edited. This parameter is
+ *   optional. If not provided, Editor will attempt to resolve the correct field
+ *   from the cell / element given as the first parameter. If it is unable to do
+ *   so, it will throw an error.
+ * @param {object} [opts] Inline editing options - see the `form-options` type
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.inline = function ( cell, fieldName, opts )
+{
+	var that = this;
+
+	// Argument shifting
+	if ( $.isPlainObject( fieldName ) ) {
+		opts = fieldName;
+		fieldName = undefined;
+	}
+
+	opts = $.extend( {}, this.s.formOptions.inline, opts );
+
+	var editFields = this._dataSource( 'individual', cell, fieldName );
+	var node, field;
+	var countOuter=0, countInner;
+	var closed=false;
+
+	// Read the individual cell information from the editFields object
+	$.each( editFields, function ( i, editField ) {
+		// Only a single row
+		if ( countOuter > 0 ) {
+			throw 'Cannot edit more than one row inline at a time';
+		}
+
+		node = $(editField.attach[0]);
+
+		// Only a single item in that row
+		countInner = 0;
+		$.each( editField.displayFields, function ( j, f ) {
+			if ( countInner > 0 ) {
+				throw 'Cannot edit more than one field inline at a time';
+			}
+
+			field = f;
+			countInner++;
+		} );
+
+		countOuter++;
+
+		// If only changed values are to be submitted, then only allow the
+		// individual field that we are editing to be edited.
+		// This is currently disabled, as I'm not convinced that it is actually
+		// useful!
+		// if ( opts.submit === 'changed' ) {
+		// 	editField.fields = editField.displayFields;
+		// }
+	} );
+	
+	// Already in edit mode for this cell?
+	if ( $('div.DTE_Field', node).length ) {
+		return this;
+	}
+
+	// Some other field in inline edit mode?
+	if ( this._tidy( function () { that.inline( cell, fieldName, opts ); } ) ) {
+		return this;
+	}
+
+	// Start a full row edit, but don't display - we will be showing the field
+	this._edit( cell, editFields, 'inline' );
+	var namespace = this._formOptions( opts );
+
+	var ret = this._preopen( 'inline' );
+	if ( ! ret ) {
+		return this;
+	}
+
+	// Remove from DOM, keeping event handlers, and include text nodes in remove
+	var children = node.contents().detach();
+
+	node.append( $(
+		'<div class="DTE DTE_Inline">'+
+			'<div class="DTE_Inline_Field"/>'+
+			'<div class="DTE_Inline_Buttons"/>'+
+		'</div>'
+	) );
+
+	node.find('div.DTE_Inline_Field').append( field.node() );
+
+	if ( opts.buttons ) {
+		// Use prepend for the CSS, so we can float the buttons right
+		node.find('div.DTE_Inline_Buttons').append( this.dom.buttons );
+	}
+
+	this._closeReg( function ( submitComplete ) {
+		// Mark that this specific inline edit has closed
+		closed = true;
+
+		$(document).off( 'click'+namespace );
+
+		// If there was no submit, we need to put the DOM back as it was. If
+		// there was a submit, the write of the new value will set the DOM to
+		// how it should be
+		if ( ! submitComplete ) {
+			node.contents().detach();
+			node.append( children );
+		}
+
+		// Clear error messages "offline"
+		that._clearDynamicInfo();
+	} );
+
+	// Submit and blur actions
+	setTimeout( function () {
+		// If already closed, possibly due to some other aspect of the event
+		// that triggered the inline call, don't add the event listener - it
+		// isn't needed (and is dangerous)
+		if ( closed ) {
+			return;
+		}
+
+		$(document).on( 'click'+namespace, function ( e ) {
+			// Was the click inside or owned by the editing node? If not, then
+			// come out of editing mode.
+
+			// andSelf is deprecated in jQ1.8, but we want 1.7 compat
+			var back = $.fn.addBack ? 'addBack' : 'andSelf';
+
+			if ( ! field._typeFn( 'owns', e.target ) && 
+				 $.inArray( node[0], $(e.target).parents()[ back ]() ) === -1 )
+			{
+				that.blur();
+			}
+		} );
+	}, 0 );
+
+	this._focus( [ field ], opts.focus );
+	this._postopen( 'inline' );
+
+	return this;
+};
+
+
+/**
+ * Show an information message for the form as a whole, or for an individual
+ * field. This can be used to provide helpful information to a user about an
+ * individual field, or more typically the form (for example when deleting
+ * a record and asking for confirmation).
+ *  @param {string} [name] The name of the field to show the message for. If not
+ *    given then a global message is shown for the form
+ *  @param {string|function} msg The message to show
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Show a global message for a 'create' form
+ *    editor.message( 'Add a new user to the database by completing the fields below' );
+ *    editor.create( 'Add new user', {
+ *      "label": "Submit",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ * 
+ *  @example
+ *    // Show a message for an individual field when a 'help' icon is clicked on
+ *    $('#user_help').click( function () {
+ *      editor.message( 'user', 'The user name is what the system user will login with' );
+ *    } );
+ */
+Editor.prototype.message = function ( name, msg )
+{
+	if ( msg === undefined ) {
+		// Global message
+		this._message( this.dom.formInfo, name );
+	}
+	else {
+		// Field message
+		this.s.fields[ name ].message( msg );
+	}
+
+	return this;
+};
+
+
+/**
+ * Get which mode of operation the Editor form is in
+ *  @return {string} `create`, `edit`, `remove` or `null` if no active state.
+ */
+Editor.prototype.mode = function ()
+{
+	return this.s.action;
+};
+
+
+/**
+ * Get the modifier that was used to trigger the edit or delete action.
+ *  @return {*} The identifier that was used for the editing / remove method
+ *    called.
+ */
+Editor.prototype.modifier = function ()
+{
+	return this.s.modifier;
+};
+
+
+/**
+ * Get the values from one or more fields, taking into account multiple data
+ * points being edited at the same time.
+ *
+ * @param  {string|array} fieldNames A single field name or an array of field
+ *   names.
+ * @return {object} If a string is given as the first parameter an object that
+ *   contains the value for each row being edited is returned. If an array is
+ *   given, then the object has the field names as the parameter name and the
+ *   value is the value object with values for each row being edited.
+ */
+Editor.prototype.multiGet = function ( fieldNames )
+{
+	var fields = this.s.fields;
+
+	if ( fieldNames === undefined ) {
+		fieldNames = this.fields();
+	}
+
+	if ( $.isArray( fieldNames ) ) {
+		var out = {};
+
+		$.each( fieldNames, function ( i, name ) {
+			out[ name ] = fields[ name ].multiGet();
+		} );
+
+		return out;
+	}
+
+	return fields[ fieldNames ].multiGet();
+};
+
+
+/**
+ * Set the values for one or more fields, taking into account multiple data
+ * points being edited at the same time.
+ *
+ * @param  {object|string} fieldNames The name of the field to set, or an object
+ *   with the field names as the parameters that contains the value object to
+ *   set for each field.
+ * @param  {*} [val] Value to set if first parameter is given as a string.
+ *   Otherwise it is ignored.
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.multiSet = function ( fieldNames, val )
+{
+	var fields = this.s.fields;
+
+	if ( $.isPlainObject( fieldNames ) && val === undefined ) {
+		$.each( fieldNames, function ( name, value ) {
+			fields[ name ].multiSet( value );
+		} );
+	}
+	else {
+		fields[ fieldNames ].multiSet( val );
+	}
+
+	return this;
+};
+
+
+/**
+ * Get the container node for an individual field.
+ *  @param {string|array} name The field name (from the `name` parameter given
+ *   when originally setting up the field) to get the DOM node for.
+ *  @return {node|array} Field container node
+ * 
+ *  @example
+ *    // Dynamically add a class to a field's container
+ *    $(editor.node( 'account_type' )).addClass( 'account' );
+ */
+Editor.prototype.node = function ( name )
+{
+	var fields = this.s.fields;
+
+	if ( ! name ) {
+		name = this.order();
+	}
+
+	return $.isArray( name ) ?
+		$.map( name, function (n) {
+			return fields[ n ].node();
+		} ) :
+		fields[ name ].node();
+};
+
+
+/**
+ * Remove a bound event listener to the editor instance. This method provides a 
+ * shorthand way of binding jQuery events that would be the same as writing 
+ * `$(editor).off(...)` for convenience.
+ *  @param {string} name Event name to remove the listeners for - event names are
+ *    defined by {@link Editor}.
+ *  @param {function} [fn] The function to remove. If not given, all functions which
+ *    are assigned to the given event name will be removed.
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Add an event to alert when the form is shown and then remove the listener
+ *    // so it will only fire once
+ *    editor.on( 'open', function () {
+ *      alert('Form displayed!');
+ *      editor.off( 'open' );
+ *    } );
+ */
+Editor.prototype.off = function ( name, fn )
+{
+	$(this).off( this._eventName( name ), fn );
+
+	return this;
+};
+
+
+/**
+ * Listen for an event which is fired off by Editor when it performs certain
+ * actions. This method provides a shorthand way of binding jQuery events that
+ * would be the same as writing  `$(editor).on(...)` for convenience.
+ *  @param {string} name Event name to add the listener for - event names are
+ *    defined by {@link Editor}.
+ *  @param {function} fn The function to run when the event is triggered.
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Log events on the console when they occur
+ *    editor.on( 'open', function () { console.log( 'Form opened' ); } );
+ *    editor.on( 'close', function () { console.log( 'Form closed' ); } );
+ *    editor.on( 'submit', function () { console.log( 'Form submitted' ); } );
+ */
+Editor.prototype.on = function ( name, fn )
+{
+	$(this).on( this._eventName( name ), fn );
+
+	return this;
+};
+
+
+/**
+ * Listen for a single event event which is fired off by Editor when it performs
+ * certain actions. This method provides a shorthand way of binding jQuery
+ * events that would be the same as writing  `$(editor).one(...)` for
+ * convenience.
+ *  @param {string} name Event name to add the listener for - event names are
+ *    defined by {@link Editor}.
+ *  @param {function} fn The function to run when the event is triggered.
+ *  @return {Editor} Editor instance, for chaining
+ */
+Editor.prototype.one = function ( name, fn )
+{
+	$(this).one( this._eventName( name ), fn );
+
+	return this;
+};
+
+
+/**
+ * Display the main form editor to the end user in the web-browser.
+ * 
+ * Note that the `close()` method will close any of the three Editor form types
+ * (main, bubble and inline), but this method will open only the main type.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Build a 'create' form, but don't display it until some values have
+ *    // been set. When done, then display the form.
+ *    editor.create( 'Create user', {
+ *      "label": "Submit",
+ *      "fn": function () { this.submit(); }
+ *    }, false );
+ *    editor.set( 'name', 'Test user' );
+ *    editor.set( 'access', 'Read only' );
+ *    editor.open();
+ */
+Editor.prototype.open = function ()
+{
+	var that = this;
+
+	// Insert the display elements in order
+	this._displayReorder();
+
+	// Define how to do a close
+	this._closeReg( function ( submitComplete ) {
+		that.s.displayController.close( that, function () {
+			that._clearDynamicInfo();
+		} );
+	} );
+
+	// Run the standard open with common events
+	var ret = this._preopen( 'main' );
+	if ( ! ret ) {
+		return this;
+	}
+
+	this.s.displayController.open( this, this.dom.wrapper );
+	this._focus(
+		$.map( this.s.order, function (name) {
+			return that.s.fields[ name ];
+		} ),
+		this.s.editOpts.focus
+	);
+	this._postopen( 'main' );
+
+	return this;
+};
+
+
+/**
+ * Get or set the ordering of fields, as they are displayed in the form. When used as
+ * a getter, the field names are returned in an array, in their current order, and when
+ * used as a setting you can alter the field ordering by passing in an array with all
+ * field names in their new order.
+ * 
+ * Note that all fields *must* be included when reordering, and no additional fields can 
+ * be added here (use {@link Editor#add} to add more fields). Finally, for setting the 
+ * order, you can pass an array of the field names, or give the field names as individual
+ * parameters (see examples below).
+ *  @param {array|string} [set] Field order to set.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Get field ordering
+ *    var order = editor.order();
+ * 
+ *  @example
+ *    // Set the field order
+ *    var order = editor.order();
+ *    order.unshift( order.pop() ); // move the last field into the first position
+ *    editor.order( order );
+ * 
+ *  @example
+ *    // Set the field order as arguments
+ *    editor.order( "pupil", "grade", "dept", "exam-board" );
+ *
+ */
+Editor.prototype.order = function ( set /*, ... */ )
+{
+	if ( !set ) {
+		return this.s.order;
+	}
+
+	// Allow new layout to be passed in as arguments
+	if ( arguments.length && ! $.isArray( set ) ) {
+		set = Array.prototype.slice.call(arguments);
+	}
+
+	// Sanity check - array must exactly match the fields we have available
+	if ( this.s.order.slice().sort().join('-') !== set.slice().sort().join('-') ) {
+		throw "All fields, and no additional fields, must be provided for ordering.";
+	}
+
+	// Copy the new array into the order (so the reference is maintained)
+	$.extend( this.s.order, set );
+
+	this._displayReorder();
+
+	return this;
+};
+
+
+/**
+ * Remove (delete) entries from the table. The rows to remove are given as
+ * either a single DOM node or an array of DOM nodes (including a jQuery
+ * object).
+ *  @param {node|array} items The row, or array of nodes, to delete
+ *  @param {boolean} [show=true] Show the form or not.
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Delete a given row with a message to let the user know exactly what is
+ *    // happening
+ *    editor.message( "Are you sure you want to remove this row?" );
+ *    editor.remove( row_to_delete, 'Delete row', {
+ *      "label": "Confirm",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ * 
+ *  @example
+ *    // Delete the first row in a table without asking the user for confirmation
+ *    editor.remove( '', $('#example tbody tr:eq(0)')[0], null, false );
+ *    editor.submit();
+ * 
+ *  @example
+ *    // Delete all rows in a table with a submit button
+ *    editor.remove( $('#example tbody tr'), 'Delete all rows', {
+ *      "label": "Delete all",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ */
+Editor.prototype.remove = function ( items, arg1, arg2, arg3, arg4 )
+{
+	var that = this;
+
+	// Some other field in inline edit mode?
+	if ( this._tidy( function () { that.remove( items, arg1, arg2, arg3, arg4 ); } ) ) {
+		return this;
+	}
+
+	// Allow a single row node to be passed in to remove, Can't use $.isArray
+	// as we also allow array like objects to be passed in (API, jQuery)
+	if ( items.length === undefined ) {
+		items = [ items ];
+	}
+
+	var argOpts = this._crudArgs( arg1, arg2, arg3, arg4 );
+	var editFields = this._dataSource( 'fields', items );
+
+	this.s.action = "remove";
+	this.s.modifier = items;
+	this.s.editFields = editFields;
+	this.dom.form.style.display = 'none';
+
+	this._actionClass();
+
+	this._event( 'initRemove', [
+		_pluck( editFields, 'node' ),
+		_pluck( editFields, 'data' ),
+		items
+	] );
+
+	this._event( 'initMultiRemove', [
+		editFields,
+		items
+	] );
+
+	this._assembleMain();
+	this._formOptions( argOpts.opts );
+
+	argOpts.maybeOpen();
+
+	var opts = this.s.editOpts;
+	if ( opts.focus !== null ) {
+		$('button', this.dom.buttons).eq( opts.focus ).focus();
+	}
+
+	return this;
+};
+
+
+/**
+ * Set the value of a field
+ *  @param {string|object} name The field name (from the `name` parameter given
+ *    when originally setting up the field) to set the value of. If given as an
+ *    object the object parameter name will be the value of the field to set and
+ *    the value the value to set for the field.
+ *  @param {*} [val] The value to set the field to. The format of the value will
+ *    depend upon the field type. Not required if the first parameter is given
+ *    as an object.
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Set the values of a few fields before then automatically submitting the form
+ *    editor.create( null, null, false );
+ *    editor.set( 'name', 'Test user' );
+ *    editor.set( 'access', 'Read only' );
+ *    editor.submit();
+ */
+Editor.prototype.set = function ( set, val )
+{
+	var fields = this.s.fields;
+
+	if ( ! $.isPlainObject( set ) ) {
+		var o = {};
+		o[ set ] = val;
+		set = o;
+	}
+
+	$.each( set, function (n, v) {
+		fields[ n ].set( v );
+	} );
+
+	return this;
+};
+
+
+/**
+ * Show a field in the display that was previously hidden.
+ *  @param {string|array} [names] The field name (from the `name` parameter
+ *   given when originally setting up the field) to make visible, or an array of
+ *   field names to make visible. If not given all fields are shown.
+ *  @param {boolean} [animate=true] Animate if visible
+ *  @return {Editor} Editor instance, for chaining
+ * 
+ *  @example
+ *    // Shuffle the fields that are visible, hiding one field and making two
+ *    // others visible before then showing the {@link Editor#create} record form.
+ *    editor.hide( 'username' );
+ *    editor.show( 'account_type' );
+ *    editor.show( 'access_level' );
+ *    editor.create( 'Add new user', {
+ *      "label": "Save",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *
+ *  @example
+ *    // Show all fields
+ *    editor.show();
+ */
+Editor.prototype.show = function ( names, animate )
+{
+	var fields = this.s.fields;
+
+	$.each( this._fieldNames( names ), function (i, n) {
+		fields[ n ].show( animate );
+	} );
+
+	return this;
+};
+
+
+/**
+ * Submit a form to the server for processing. The exact action performed will depend
+ * on which of the methods {@link Editor#create}, {@link Editor#edit} or 
+ * {@link Editor#remove} were called to prepare the form - regardless of which one is 
+ * used, you call this method to submit data.
+ *  @param {function} [successCallback] Callback function that is executed once the
+ *    form has been successfully submitted to the server and no errors occurred.
+ *  @param {function} [errorCallback] Callback function that is executed if the
+ *    server reports an error due to the submission (this includes a JSON formatting
+ *    error should the error return invalid JSON).
+ *  @param {function} [formatdata] Callback function that is passed in the data
+ *    that will be submitted to the server, allowing pre-formatting of the data,
+ *    removal of data or adding of extra fields.
+ *  @param {boolean} [hide=true] When the form is successfully submitted, by default
+ *    the form display will be hidden - this option allows that to be overridden.
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Submit data from a form button
+ *    editor.create( 'Add new record', {
+ *      "label": "Save",
+ *      "fn": function () {
+ *        this.submit();
+ *      }
+ *    } );
+ *
+ *  @example
+ *    // Submit without showing the user the form
+ *    editor.create( null, null, false );
+ *    editor.submit();
+ *
+ *  @example
+ *    // Provide success and error callback methods
+ *    editor.create( 'Add new record', {
+ *      "label": "Save",
+ *      "fn": function () {
+ *        this.submit( function () {
+ *            alert( 'Form successfully submitted!' );
+ *          }, function () {
+ *            alert( 'Form  encountered an error :-(' );
+ *          }
+ *        );
+ *      }
+ *    } );
+ *  
+ *  @example
+ *    // Add an extra field to the data
+ *    editor.create( 'Add new record', {
+ *      "label": "Save",
+ *      "fn": function () {
+ *        this.submit( null, null, function (data) {
+ *          data.extra = "Extra information";
+ *        } );
+ *      }
+ *    } );
+ *
+ *  @example
+ *    // Don't hide the form immediately - change the title and then close the form
+ *    // after a small amount of time
+ *    editor.create( 'Add new record', {
+ *      "label": "Save",
+ *      "fn": function () {
+ *        this.submit( 
+ *          function () {
+ *            var that = this;
+ *            this.title( 'Data successfully added!' );
+ *            setTimeout( function () {
+ *              that.close();
+ *            }, 1000 );
+ *          },
+ *          null,
+ *          null,
+ *          false
+ *        );
+ *      }
+ *    } );
+ *    
+ */
+Editor.prototype.submit = function ( successCallback, errorCallback, formatdata, hide )
+{
+	var
+		that = this,
+		fields = this.s.fields,
+		errorFields = [],
+		errorReady = 0,
+		sent = false;
+
+	if ( this.s.processing || ! this.s.action ) {
+		return this;
+	}
+	this._processing( true );
+
+	// If there are fields in error, we want to wait for the error notification
+	// to be cleared before the form is submitted - errorFields tracks the
+	// fields which are in the error state, while errorReady tracks those which
+	// are ready to submit
+	var send = function () {
+		if ( errorFields.length !== errorReady || sent ) {
+			return;
+		}
+
+		sent = true;
+		that._submit( successCallback, errorCallback, formatdata, hide );
+	};
+
+	// Remove the global error (don't know if the form is still in an error
+	// state!)
+	this.error();
+
+	// Count how many fields are in error
+	$.each( fields, function ( name, field ) {
+		if ( field.inError() ) {
+			errorFields.push( name );
+		}
+	} );
+
+	// Remove the error display
+	$.each( errorFields, function ( i, name ) {
+		fields[ name ].error('', function () {
+			errorReady++;
+			send();
+		} );
+	} );
+
+	send();
+
+	return this;
+};
+
+
+/**
+ * Set the title of the form
+ *  @param {string|function} title The title to give to the form
+ *  @return {Editor} Editor instance, for chaining
+ *
+ *  @example
+ *    // Create an edit display used the title, buttons and edit methods (note that
+ *    // this is just an example, typically you would use the parameters of the edit
+ *    // method to achieve this.
+ *    editor.title( 'Edit record' );
+ *    editor.buttons( {
+ *      "label": "Update",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *    editor.edit( TR_to_edit );
+ *
+ *  @example
+ *    // Show a create form, with a timer for the duration that the form is open
+ *    editor.create( 'Add new record - time on form: 0s', {
+ *      "label": "Save",
+ *      "fn": function () { this.submit(); }
+ *    } );
+ *    
+ *    // Add an event to the editor to stop the timer when the display is removed
+ *    var runTimer = true;
+ *    var timer = 0;
+ *    editor.on( 'close', function () {
+ *      runTimer = false;
+ *      editor.off( 'close' );
+ *    } );
+ *    // Start the timer running
+ *    updateTitle();
+ *
+ *    // Local function to update the title once per second
+ *    function updateTitle() {
+ *      editor.title( 'Add new record - time on form: '+timer+'s' );
+ *      timer++;
+ *      if ( runTimer ) {
+ *        setTimeout( function() {
+ *          updateTitle();
+ *        }, 1000 );
+ *      }
+ *    }
+ */
+Editor.prototype.title = function ( title )
+{
+	var header = $(this.dom.header).children( 'div.'+this.classes.header.content );
+
+	if ( title === undefined ) {
+		return header.html();
+	}
+
+	if ( typeof title === 'function' ) {
+		title = title( this, new DataTable.Api(this.s.table) );
+	}
+
+	header.html( title );
+
+	return this;
+};
+
+
+/**
+ * Get or set the value of a specific field, or get the value of all fields in
+ * the form.
+ *
+ * @param {string|array} [names] The field name(s) to get or set the value of.
+ *   If not given, then the value of all fields will be obtained.
+ * @param {*} [value] Value to set
+ * @return {Editor|object|*} Editor instance, for chaining if used as a setter,
+ *   an object containing the values of the requested fields if used as a
+ *   getter with multiple fields requested, or the value of the requested field
+ *   if a single field is requested.
+ */
+Editor.prototype.val = function ( field, value )
+{
+	if ( value === undefined ) {
+		return this.get( field ); // field can be undefined to get all
+	}
+
+	return this.set( field, value );
+};
+
+
+/*
+ * DataTables 1.10 API integration. Provides the ability to control basic Editor
+ * aspects from the DataTables API. Full control does of course require use of
+ * the Editor API though.
+ */
+var apiRegister = DataTable.Api.register;
+
+
+function __getInst( api ) {
+	var ctx = api.context[0];
+	return ctx.oInit.editor || ctx._editor;
+}
+
+// Set sensible defaults for the editing options
+function __setBasic( inst, opts, type, plural ) {
+	if ( ! opts ) {
+		opts = {};
+	}
+
+	if ( opts.buttons === undefined ) {
+		opts.buttons = '_basic';
+	}
+
+	if ( opts.title === undefined ) {
+		opts.title = inst.i18n[ type ].title;
+	}
+
+	if ( opts.message === undefined ) {
+		if ( type === 'remove' ) {
+			var confirm = inst.i18n[ type ].confirm;
+			opts.message = plural!==1 ? confirm._.replace(/%d/, plural) : confirm['1'];
+		}
+		else {
+			opts.message = '';
+		}
+	}
+
+	return opts;
+}
+
+
+apiRegister( 'editor()', function () {
+	return __getInst( this );
+} );
+
+// Row editing
+apiRegister( 'row.create()', function ( opts ) {
+	// main
+	var inst = __getInst( this );
+	inst.create( __setBasic( inst, opts, 'create' ) );
+	return this;
+} );
+
+apiRegister( 'row().edit()', function ( opts ) {
+	// main
+	var inst = __getInst( this );
+	inst.edit( this[0][0], __setBasic( inst, opts, 'edit' ) );
+	return this;
+} );
+
+apiRegister( 'rows().edit()', function ( opts ) {
+	// main
+	var inst = __getInst( this );
+	inst.edit( this[0], __setBasic( inst, opts, 'edit' ) );
+	return this;
+} );
+
+apiRegister( 'row().delete()', function ( opts ) {
+	// main
+	var inst = __getInst( this );
+	inst.remove( this[0][0], __setBasic( inst, opts, 'remove', 1 ) );
+	return this;
+} );
+
+apiRegister( 'rows().delete()', function ( opts ) {
+	// main
+	var inst = __getInst( this );
+	inst.remove( this[0], __setBasic( inst, opts, 'remove', this[0].length ) );
+	return this;
+} );
+
+apiRegister( 'cell().edit()', function ( type, opts ) {
+	// inline or bubble
+	if ( ! type ) {
+		type = 'inline';
+	}
+	else if ( $.isPlainObject( type ) ) {
+		opts = type;
+		type = 'inline';
+	}
+
+	__getInst( this )[ type ]( this[0][0], opts );
+	return this;
+} );
+
+apiRegister( 'cells().edit()', function ( opts ) {
+	// bubble only at the moment
+	__getInst( this ).bubble( this[0], opts );
+	return this;
+} );
+
+apiRegister( 'file()', function ( name, id ) {
+	return Editor.files[ name ][ id ];
+} );
+
+apiRegister( 'files()', function ( name, value ) {
+	if ( ! name ) {
+		return Editor.files;
+	}
+
+	if ( ! value ) {
+		return Editor.files[ name ];
+	}
+
+	// The setter option of this method is not publicly documented
+	Editor.files[ name ] = value;
+
+	return this;
+} );
+
+// Global listener for file information updates via DataTables' Ajax JSON
+$(document).on( 'xhr.dt', function (e, ctx, json) {
+	if ( e.namespace !== 'dt' ) {
+		return;
+	}
+
+	if ( json && json.files ) {
+		$.each( json.files, function ( name, files ) {
+			Editor.files[ name ] = files;
+		} );
+	}
+} );
+
+
+/**
+ * Common error message emitter. This method is not (yet) publicly documented on
+ * the Editor site. It might be in future.
+ *
+ * @param  {string} msg Error message
+ * @param  {int}    tn  Tech note link
+ */
+Editor.error = function ( msg, tn )
+{
+	throw tn ?
+		msg +' For more information, please refer to https://datatables.net/tn/'+tn :
+		msg;
+};
+
+
+/**
+ * Obtain label / value pairs of data from a data source, be it an array or
+ * object, for use in an input that requires label / value pairs such as
+ * `select`, `radio` and `checkbox` inputs.
+ *
+ * A callback function is triggered for each label / value pair found, so the
+ * caller can add it to the input as required.
+ *
+ * @static
+ * @param {object|array} An object or array of data to iterate over getting the
+ *     label / value pairs.
+ * @param {object} props When an array of objects is passed in as the data
+ *     source by default the label will be read from the `label` property and
+ *     the value from the `value` property of the object. This option can alter
+ *     that behaviour.
+ * @param {function} fn Callback function. Takes three parameters: the label,
+ *      the value and the iterator index.
+ */
+Editor.pairs = function ( data, props, fn )
+{
+	var i, ien, dataPoint;
+
+	// Define default properties to read the data from if using an object.
+	// The passed in `props` object and override.
+	props = $.extend( {
+		label: 'label',
+		value: 'value'
+	}, props );
+
+	if ( $.isArray( data ) ) {
+		// As an array, we iterate each item which can be an object or value
+		for ( i=0, ien=data.length ; i<ien ; i++ ) {
+			dataPoint = data[i];
+
+			if ( $.isPlainObject( dataPoint ) ) {
+				fn( 
+					dataPoint[ props.value ] === undefined ?
+						dataPoint[ props.label ] :
+						dataPoint[ props.value ],
+					dataPoint[ props.label ],
+					i
+				);
+			}
+			else {
+				fn( dataPoint, dataPoint, i );
+			}
+		}
+	}
+	else {
+		// As an object the key is the label and the value is the value
+		i = 0;
+
+		$.each( data, function ( key, val ) {
+			fn( val, key, i );
+			i++;
+		} );
+	}
+};
+
+
+/**
+ * Make a string safe to use as a DOM ID. This is primarily for use by field
+ * plug-in authors.
+ *
+ * @static
+ * @param {string} String to make safe
+ * @param {string} Safe string
+ */
+Editor.safeId = function ( id )
+{
+	return id.replace(/\./g, '-');
+};
+
+
+/**
+ * Field specific upload method. This can be used to upload a file to the Editor
+ * libraries. This method is not (yet) publicly documented on the Editor site.
+ * It might be in future.
+ *
+ * @static
+ * @param {Editor} editor The Editor instance operating on
+ * @param {object} conf Field configuration object
+ * @param {Files} files The file(s) to upload
+ * @param {function} progressCallback Upload progress callback
+ * @param {function} completeCallback Callback function for once the file has
+ *     been uploaded
+ */
+Editor.upload = function ( editor, conf, files, progressCallback, completeCallback )
+{
+	var reader = new FileReader();
+	var counter = 0;
+	var ids = [];
+	var generalError = 'A server error occurred while uploading the file';
+
+	// Clear any existing errors, as the new upload might not be in error
+	editor.error( conf.name, '' );
+
+	progressCallback( conf, conf.fileReadText || "<i>Uploading file</i>" );
+
+	reader.onload = function ( e ) {
+		var data = new FormData();
+		var ajax;
+
+		data.append( 'action', 'upload' );
+		data.append( 'uploadField', conf.name );
+		data.append( 'upload', files[ counter ] );
+
+		if ( conf.ajaxData ) {
+			conf.ajaxData( data );
+		}
+
+		if ( conf.ajax ) {
+			ajax = conf.ajax;
+		}
+		else if ( typeof editor.s.ajax === 'string' || $.isPlainObject( editor.s.ajax ) ) {
+			ajax = editor.s.ajax;
+		}
+
+		if ( ! ajax ) {
+			throw 'No Ajax option specified for upload plug-in';
+		}
+
+		if ( typeof ajax === 'string' ) {
+			ajax = { url: ajax };
+		}
+
+		// Use preSubmit to stop form submission during an upload, since the
+		// value won't be known until that point.
+		var submit = false;
+		editor
+			.on( 'preSubmit.DTE_Upload', function () {
+				submit = true;
+				return false;
+			} );
+
+		$.ajax( $.extend( {}, ajax, {
+			type: 'post',
+			data: data,
+			dataType: 'json',
+			contentType: false,
+			processData: false,
+			xhr: function () {
+				var xhr = $.ajaxSettings.xhr();
+
+				if ( xhr.upload ) {
+					xhr.upload.onprogress = function ( e ) {
+						if ( e.lengthComputable ) {
+							var percent = (e.loaded/e.total*100).toFixed(0)+"%";
+
+							progressCallback( conf, files.length === 1 ?
+								percent :
+								counter+':'+files.length+' '+percent
+							);
+						}
+					};
+					xhr.upload.onloadend = function ( e ) {
+						progressCallback( conf );
+					};
+				}
+
+				return xhr;
+			},
+			success: function ( json ) {
+				editor.off( 'preSubmit.DTE_Upload' );
+
+				if ( json.fieldErrors && json.fieldErrors.length ) {
+					var errors = json.fieldErrors;
+
+					for ( var i=0, ien=errors.length ; i<ien ; i++ ) {
+						editor.error( errors[i].name, errors[i].status );
+					}
+				}
+				else if ( json.error ) {
+					editor.error( json.error );
+				}
+				else if ( ! json.upload || ! json.upload.id ) {
+					editor.error( conf.name, generalError );
+				}
+				else {
+					if ( json.files ) {
+						$.each( json.files, function ( name, value ) {
+							Editor.files[ name ] = value;
+						} );
+					}
+
+					ids.push( json.upload.id );
+
+					if ( counter < files.length-1 ) {
+						counter++;
+						reader.readAsDataURL( files[counter] );
+					}
+					else {
+						completeCallback.call( editor, ids );
+						
+						if ( submit ) {
+							editor.submit();
+						}
+					}
+				}
+			},
+			error: function () {
+				editor.error( conf.name, generalError );
+			}
+		} ) );
+	};
+
+	reader.readAsDataURL( files[0] );
+};
+
+
+/**
+ * Editor constructor - take the developer configuration and apply it to the instance.
+ *  @param {object} init The initialisation options provided by the developer - see
+ *    {@link Editor.defaults} for a full list of options.
+ *  @private
+ */
+Editor.prototype._constructor = function ( init )
+{
+	init = $.extend( true, {}, Editor.defaults, init );
+	this.s = $.extend( true, {}, Editor.models.settings, {
+		table:      init.domTable || init.table,
+		dbTable:    init.dbTable || null, // legacy
+		ajaxUrl:    init.ajaxUrl,
+		ajax:       init.ajax,
+		idSrc:      init.idSrc,
+		dataSource: init.domTable || init.table ?
+			Editor.dataSources.dataTable :
+			Editor.dataSources.html,
+		formOptions: init.formOptions,
+		legacyAjax:  init.legacyAjax
+	} );
+	this.classes = $.extend( true, {}, Editor.classes );
+	this.i18n = init.i18n;
+
+	var that = this;
+	var classes = this.classes;
+
+	this.dom = {
+		"wrapper": $(
+			'<div class="'+classes.wrapper+'">'+
+				'<div data-dte-e="processing" class="'+classes.processing.indicator+'"></div>'+
+				'<div data-dte-e="body" class="'+classes.body.wrapper+'">'+
+					'<div data-dte-e="body_content" class="'+classes.body.content+'"/>'+
+				'</div>'+
+				'<div data-dte-e="foot" class="'+classes.footer.wrapper+'">'+
+					'<div class="'+classes.footer.content+'"/>'+
+				'</div>'+
+			'</div>'
+		)[0],
+		"form": $(
+			'<form data-dte-e="form" class="'+classes.form.tag+'">'+
+				'<div data-dte-e="form_content" class="'+classes.form.content+'"/>'+
+			'</form>'
+		)[0],
+		"formError":   $('<div data-dte-e="form_error" class="'+classes.form.error+'"/>')[0],
+		"formInfo":    $('<div data-dte-e="form_info" class="'+classes.form.info+'"/>')[0],
+		"header":      $('<div data-dte-e="head" class="'+classes.header.wrapper+'"><div class="'+classes.header.content+'"/></div>')[0],
+		"buttons":     $('<div data-dte-e="form_buttons" class="'+classes.form.buttons+'"/>')[0]
+	};
+
+	// Customise the TableTools buttons with the i18n settings - worth noting that
+	// this could easily be done outside the Editor instance, but this makes things
+	// a bit easier to understand and more cohesive. Also worth noting that when
+	// there are two or more Editor instances, the init sequence should be
+	// Editor / DataTables, Editor / DataTables etc, since the value of these button
+	// instances matter when you create the TableTools buttons for the DataTable.
+	if ( $.fn.dataTable.TableTools ) {
+		var ttButtons = $.fn.dataTable.TableTools.BUTTONS;
+		var i18n = this.i18n;
+
+		$.each(['create', 'edit', 'remove'], function (i, val) {
+			ttButtons['editor_'+val].sButtonText = i18n[val].button;
+		} );
+	}
+
+	// Bind callback methods
+	$.each( init.events, function (evt, fn) {
+		that.on( evt, function () {
+			// When giving events in the constructor the event argument was not
+			// given in 1.2-, so we remove it here. This is solely for
+			// backwards compatibility as the events in the initialisation are
+			// not documented in 1.3+.
+			var args = Array.prototype.slice.call(arguments);
+			args.shift();
+			fn.apply( that, args );
+		} );
+	} );
+
+	// Cache the DOM nodes
+	var dom = this.dom;
+	var wrapper = dom.wrapper;
+	dom.formContent   = _editor_el('form_content', dom.form)[0];
+	dom.footer        = _editor_el('foot', wrapper)[0];
+	dom.body          = _editor_el('body', wrapper)[0];
+	dom.bodyContent   = _editor_el('body_content', wrapper)[0];
+	dom.processing    = _editor_el('processing', wrapper)[0];
+
+	// Add any fields which are given on initialisation
+	if ( init.fields ) {
+		this.add( init.fields );
+	}
+
+	$(document)
+		.on( 'init.dt.dte', function (e, settings, json) {
+			// Attempt to attach to a DataTable automatically when the table is
+			// initialised
+			if ( that.s.table && settings.nTable === $(that.s.table).get(0) ) {
+				settings._editor = that;
+			}
+		} )
+		.on( 'xhr.dt', function (e, settings, json) {
+			// Automatically update fields which have a field name defined in
+			// the returned json - saves an `initComplete` for the user
+			if ( json && that.s.table && settings.nTable === $(that.s.table).get(0) ) {
+				that._optionsUpdate( json );
+			}
+		} );
+
+	// Prep the display controller
+	this.s.displayController = Editor.display[init.display].init( this );
+
+	this._event( 'initComplete', [] );
+};
+
+/*global __inlineCounter*/
+
+/**
+ * Set the class on the form to relate to the action that is being performed.
+ * This allows styling to be applied to the form to reflect the state that
+ * it is in.
+ *
+ * @private
+ */
+Editor.prototype._actionClass = function ()
+{
+	var classesActions = this.classes.actions;
+	var action = this.s.action;
+	var wrapper = $(this.dom.wrapper);
+
+	wrapper.removeClass( [classesActions.create, classesActions.edit, classesActions.remove].join(' ') );
+
+	if ( action === "create" ) {
+		wrapper.addClass( classesActions.create );
+	}
+	else if ( action === "edit" ) {
+		wrapper.addClass( classesActions.edit );
+	}
+	else if ( action === "remove" ) {
+		wrapper.addClass( classesActions.remove );
+	}
+};
+
+
+/**
+ * Create an Ajax request in the same style as DataTables 1.10, with full
+ * backwards compatibility for Editor 1.2.
+ *
+ * @param  {object} data Data to submit
+ * @param  {function} success Success callback
+ * @param  {function} error Error callback
+ * @private
+ */
+Editor.prototype._ajax = function ( data, success, error )
+{
+	var opts = {
+		type:     'POST',
+		dataType: 'json',
+		data:     null,
+		error:    error,
+		success:  function ( json, status, xhr ) {
+			if ( xhr.status === 204 ) {
+				json = {};
+			}
+			success( json );
+		}
+	};
+	var a;
+	var action = this.s.action;
+	var ajaxSrc = this.s.ajax || this.s.ajaxUrl;
+	var id = action === 'edit' || action === 'remove' ?
+		_pluck( this.s.editFields, 'idSrc' ) :
+		null;
+
+	if ( $.isArray( id ) ) {
+		id = id.join(',');
+	}
+
+	// Get the correct object for rest style
+	if ( $.isPlainObject( ajaxSrc ) && ajaxSrc[ action ] ) {
+		ajaxSrc = ajaxSrc[ action ];
+	}
+
+	if ( $.isFunction( ajaxSrc ) ) {
+		// As a function, execute it, passing in the required parameters
+		var uri = null;
+		var method = null;
+
+		// If the old style ajaxSrc is given, we need to process it for
+		// backwards compatibility with 1.2-. Unfortunate otherwise this would
+		// be a very simply function!
+		if ( this.s.ajaxUrl ) {
+			var url = this.s.ajaxUrl;
+
+			if ( url.create ) {
+				uri = url[ action ];
+			}
+
+			if ( uri.indexOf(' ') !== -1 ) {
+				a = uri.split(' ');
+				method = a[0];
+				uri = a[1];
+			}
+
+			uri = uri.replace( /_id_/, id );
+		}
+		
+		ajaxSrc( method, uri, data, success, error );
+		return;
+	}
+	else if ( typeof ajaxSrc === 'string' ) {
+		// As a string it gives the URL. For backwards compatibility it can also
+		// give the method.
+		if ( ajaxSrc.indexOf(' ') !== -1 ) {
+			a = ajaxSrc.split(' ');
+			opts.type = a[0];
+			opts.url = a[1];
+		}
+		else {
+			opts.url = ajaxSrc;
+		}
+	}
+	else {
+		// As an object, we extend the defaults
+		opts = $.extend( {}, opts, ajaxSrc || {} );
+	}
+
+	// URL macros
+	opts.url = opts.url.replace( /_id_/, id );
+
+	// Data processing option like in DataTables
+	if ( opts.data ) {
+		var newData = $.isFunction( opts.data ) ?
+			opts.data( data ) :  // fn can manipulate data or return an object
+			opts.data;           // object or array to merge
+
+		// If the function returned something, use that alone
+		data = $.isFunction( opts.data ) && newData ?
+			newData :
+			$.extend( true, data, newData );
+	}
+
+	opts.data = data;
+
+	// If a DELETE method is used there are a number of servers which will
+	// reject the request if it has a body. So we need to append to the URL.
+	//
+	// http://stackoverflow.com/questions/15088955
+	// http://bugs.jquery.com/ticket/11586
+	if ( opts.type === 'DELETE' ) {
+		var params = $.param( opts.data );
+
+		opts.url += opts.url.indexOf('?') === -1 ?
+			'?'+params :
+			'&'+params;
+
+		delete opts.data;
+	}
+
+	// Finally, make the ajax call
+	$.ajax( opts );
+};
+
+
+/**
+ * Create the DOM structure from the source elements for the main form.
+ * This is required since the elements can be moved around for other form types
+ * (bubble).
+ *
+ * @private
+ */
+Editor.prototype._assembleMain = function ()
+{
+	var dom = this.dom;
+
+	$(dom.wrapper)
+		.prepend( dom.header );
+
+	$(dom.footer)
+		.append( dom.formError )
+		.append( dom.buttons );
+
+	$(dom.bodyContent)
+		.append( dom.formInfo )
+		.append( dom.form );
+};
+
+
+/**
+ * Blur the editing window. A blur is different from a close in that it might
+ * cause either a close or the form to be submitted. A typical example of a
+ * blur would be clicking on the background of the bubble or main editing forms
+ * - i.e. it might be a close, or it might submit depending upon the
+ * configuration, while a click on the close box is a very definite close.
+ *
+ * @private
+ */
+Editor.prototype._blur = function ()
+{
+	var opts = this.s.editOpts;
+
+	if ( this._event( 'preBlur' ) === false ) {
+		return;
+	}
+
+	if ( opts.onBlur === 'submit' ) {
+		this.submit();
+	}
+	else if ( opts.onBlur === 'close' ) {
+		this._close();
+	}
+};
+
+
+/**
+ * Clear all of the information that might have been dynamically set while
+ * the form was visible - specifically errors and dynamic messages
+ *
+ * @private
+ */
+Editor.prototype._clearDynamicInfo = function ()
+{
+	var errorClass = this.classes.field.error;
+	var fields = this.s.fields;
+
+	$('div.'+errorClass, this.dom.wrapper).removeClass( errorClass );
+
+	$.each( fields, function (name, field) {
+		field
+			.error('')
+			.message('');
+	} );
+
+	this
+		.error('')
+		.message('');
+};
+
+
+/**
+ * Close an editing display, firing callbacks and events as needed
+ *
+ * @param  {function} submitComplete Function to call after the preClose event
+ * @private
+ */
+Editor.prototype._close = function ( submitComplete )
+{
+	// Allow preClose event to cancel the opening of the display
+	if ( this._event( 'preClose' ) === false ) {
+		return;
+	}
+
+	if ( this.s.closeCb ) {
+		this.s.closeCb( submitComplete );
+		this.s.closeCb = null;
+	}
+
+	if ( this.s.closeIcb ) {
+		this.s.closeIcb();
+		this.s.closeIcb = null;
+	}
+
+	// Remove focus control
+	$('body').off( 'focus.editor-focus' );
+
+	this.s.displayed = false;
+	this._event( 'close' );
+};
+
+
+/**
+ * Register a function to be called when the editing display is closed. This is
+ * used by function that create the editing display to tidy up the display on
+ * close - for example removing event handlers to prevent memory leaks.
+ *
+ * @param  {function} fn Function to call on close
+ * @private
+ */
+Editor.prototype._closeReg = function ( fn )
+{
+	this.s.closeCb = fn;
+};
+
+
+/**
+ * Argument shifting for the create(), edit() and remove() methods. In Editor
+ * 1.3 the preferred form of calling those three methods is with just two
+ * parameters (one in the case of create() - the id and the show flag), while in
+ * previous versions four / three parameters could be passed in, including the
+ * buttons and title options. In 1.3 the chaining API is preferred, but we want
+ * to support the old form as well, so this function is provided to perform
+ * that argument shifting, common to all three.
+ *
+ * @private
+ */
+Editor.prototype._crudArgs = function ( arg1, arg2, arg3, arg4 )
+{
+	var that = this;
+	var title;
+	var buttons;
+	var show;
+	var opts;
+
+	if ( $.isPlainObject( arg1 ) ) {
+		// Form options passed in as the first option
+		opts = arg1;
+	}
+	else if ( typeof arg1 === 'boolean' ) {
+		// Show / hide passed in as the first option - form options second
+		show = arg1;
+		opts = arg2; // can be undefined
+	}
+	else {
+		// Old style arguments
+		title = arg1; // can be undefined
+		buttons = arg2; // can be undefined
+		show = arg3; // can be undefined
+		opts = arg4; // can be undefined
+	}
+
+	// If all undefined, then fall into here
+	if ( show === undefined ) {
+		show = true;
+	}
+
+	if ( title ) {
+		that.title( title );
+	}
+
+	if ( buttons ) {
+		that.buttons( buttons );
+	}
+
+	return {
+		opts: $.extend( {}, this.s.formOptions.main, opts ),
+		maybeOpen: function () {
+			if ( show ) {
+				that.open();
+			}
+		}
+	};
+};
+
+
+/**
+ * Execute the data source abstraction layer functions. This is simply a case
+ * of executing the function with the Editor scope, passing in the remaining
+ * parameters.
+ *
+ * @param {string) name Function name to execute
+ * @private
+ */
+Editor.prototype._dataSource = function ( name /*, ... */ )
+{
+	// Remove the name from the arguments list, so the rest can be passed
+	// straight into the field type
+	var args = Array.prototype.slice.call( arguments );
+	args.shift();
+
+	var fn = this.s.dataSource[ name ];
+	if ( fn ) {
+		return fn.apply( this, args );
+	}
+};
+
+
+/**
+ * Insert the fields into the DOM, in the correct order
+ *
+ * @private
+ */
+Editor.prototype._displayReorder = function ( includeFields )
+{
+	var formContent = $(this.dom.formContent);
+	var fields = this.s.fields;
+	var order = this.s.order;
+
+	if ( includeFields ) {
+		this.s.includeFields = includeFields;
+	}
+	else {
+		includeFields = this.s.includeFields;
+	}
+
+	// Empty before adding in the required fields
+	formContent.children().detach();
+
+	$.each( order, function (i, fieldOrName) {
+		var name = fieldOrName instanceof Editor.Field ?
+			fieldOrName.name() :
+			fieldOrName;
+
+		if ( $.inArray( name, includeFields ) !== -1 ) {
+			formContent.append( fields[ name ].node() );
+		}
+	} );
+
+	this._event( 'displayOrder', [
+		this.s.displayed,
+		this.s.action,
+		formContent
+	] );
+};
+
+
+/**
+ * Generic editing handler. This can be called by the three editing modes (main,
+ * bubble and inline) to configure Editor for a row edit, and fire the required
+ * events to ensure that the editing interfaces all provide a common API.
+ *
+ * @param {*} rows Identifier for the item(s) to be edited
+ * @param {string} type Editing type - for the initEdit event
+ * @private
+ */
+Editor.prototype._edit = function ( items, editFields, type )
+{
+	var that = this;
+	var fields = this.s.fields;
+	var usedFields = [];
+	var includeInOrder;
+
+	this.s.editFields = editFields;
+	this.s.modifier = items;
+	this.s.action = "edit";
+	this.dom.form.style.display = 'block';
+
+	this._actionClass();
+
+	// Setup the field values for editing
+	$.each( fields, function ( name, field ) {
+		field.multiReset();
+		includeInOrder = true;
+
+		$.each( editFields, function ( idSrc, edit ) {
+			if ( edit.fields[ name ] ) {
+				var val = field.valFromData( edit.data );
+
+				field.multiSet( idSrc, val !== undefined ?
+					val :
+					field.def()
+				);
+
+				// If there is an displayFields object, we need to know if this
+				// field is present in it or not. If not, then the field isn't
+				// displayed
+				if ( edit.displayFields && ! edit.displayFields[ name ] ) {
+					includeInOrder = false;
+				}
+			}
+		} );
+
+		// If the field is used, then add it to the fields to be shown
+		if ( field.multiIds().length !== 0 && includeInOrder ) {
+			usedFields.push( name );
+		}
+	} );
+
+	// Remove the fields that are not required from the display
+	var currOrder = this.order().slice();
+
+	for ( var i=currOrder.length ; i >= 0 ; i-- ) {
+		if ( $.inArray( currOrder[i], usedFields ) === -1 ) {
+			currOrder.splice( i, 1 );
+		}
+	}
+
+	this._displayReorder( currOrder );
+
+	// Save the set data values so we can decided in submit if data has changed
+	this.s.editData = $.extend( true, {}, this.multiGet() );
+
+	// Events
+	this._event( 'initEdit', [
+		_pluck( editFields, 'node' )[0],
+		_pluck( editFields, 'data' )[0],
+		items,
+		type
+	] );
+
+	this._event( 'initMultiEdit', [
+		editFields,
+		items,
+		type
+	] );
+};
+
+
+/**
+ * Fire callback functions and trigger events.
+ *
+ * @param {string|array} trigger Name(s) of the jQuery custom event to trigger
+ * @param {array) args Array of arguments to pass to the triggered event
+ * @return {*} Return from the event
+ * @private
+ */
+Editor.prototype._event = function ( trigger, args )
+{
+	if ( ! args ) {
+		args = [];
+	}
+
+	// Allow an array to be passed in for the trigger to fire multiple events
+	if ( $.isArray( trigger ) ) {
+		for ( var i=0, ien=trigger.length ; i<ien ; i++ ) {
+			this._event( trigger[i], args );
+		}
+	}
+	else {
+		var e = $.Event( trigger );
+
+		$(this).triggerHandler( e, args );
+
+		return e.result;
+	}
+};
+
+
+/**
+ * 'Modernise' event names, from the old style `on[A-Z]` names to camelCase.
+ * This is done to provide backwards compatibility with Editor 1.2- event names.
+ * The names themselves were updated for consistency with DataTables.
+ *
+ * @param {string} Event name to modernise
+ * @return {string} String with new event name structure
+ * @private
+ */
+Editor.prototype._eventName = function ( input )
+{
+	var name;
+	var names = input.split( ' ' );
+
+	for ( var i=0, ien=names.length ; i<ien ; i++ ) {
+		name = names[i];
+
+		// Strip the 'on' part and lowercase the first character
+		var onStyle = name.match(/^on([A-Z])/);
+		if ( onStyle ) {
+			name = onStyle[1].toLowerCase() + name.substring( 3 );
+		}
+
+		names[i] = name;
+	}
+
+	return names.join( ' ' );
+};
+
+
+/**
+ * Convert a field name input parameter to an array of field names.
+ *
+ * Many of the API methods provide the ability to pass `undefined` a string or
+ * array of strings to identify fields. This method harmonises that.
+ *
+ * @param  {array|string} [fieldNames] Field names to get
+ * @return {array}                     Field names
+ * @private
+ */
+Editor.prototype._fieldNames = function ( fieldNames )
+{
+	if ( fieldNames === undefined ) {
+		return this.fields();
+	}
+	else if ( ! $.isArray( fieldNames ) ) {
+		return [ fieldNames ];
+	}
+
+	return fieldNames;
+};
+
+
+/**
+ * Focus on a field. Providing the logic to allow complex focus expressions
+ *
+ * @param {array} fields Array of Field instances or field names for the fields
+ *     that are shown
+ * @param {null|string|integer} focus Field identifier to focus on
+ * @private
+ */
+Editor.prototype._focus = function ( fieldsIn, focus )
+{
+	var that = this;
+	var field;
+	var fields = $.map( fieldsIn, function ( fieldOrName ) {
+		return typeof fieldOrName === 'string' ?
+			that.s.fields[ fieldOrName ] :
+			fieldOrName;
+	} );
+
+	if ( typeof focus === 'number' ) {
+		field = fields[ focus ];
+	}
+	else if ( focus ) {
+		if ( focus.indexOf( 'jq:' ) === 0 ) {
+			field = $('div.DTE '+focus.replace(/^jq:/, ''));
+		}
+		else {
+			field = this.s.fields[ focus ];
+		}
+	}
+
+	this.s.setFocus = field;
+
+	if ( field ) {
+		field.focus();
+	}
+};
+
+
+/**
+ * Form options - common function so all editing methods can provide the same
+ * basic options, DRY.
+ *
+ * @param {object} opts Editing options. See model.formOptions
+ * @private
+ */
+Editor.prototype._formOptions = function ( opts )
+{
+	var that = this;
+	var inlineCount = __inlineCounter++;
+	var namespace = '.dteInline'+inlineCount;
+
+	// Backwards compatibility with 1.4
+	if ( opts.closeOnComplete !== undefined ) {
+		opts.onComplete = opts.closeOnComplete ? 'close' : 'none';
+	}
+
+	if ( opts.submitOnBlur !== undefined ) {
+		opts.onBlur = opts.submitOnBlur ? 'submit' : 'close';
+	}
+
+	if ( opts.submitOnReturn !== undefined ) {
+		opts.onReturn = opts.submitOnReturn ? 'submit' : 'none';
+	}
+
+	if ( opts.blurOnBackground !== undefined ) {
+		opts.onBackground = opts.blurOnBackground ? 'blur' : 'none';
+	}
+
+	this.s.editOpts = opts;
+
+	// When submitting by Ajax we don't want to close a form that has been
+	// opened during the ajax request, so we keep a count of the form opening
+	this.s.editCount = inlineCount;
+
+	if ( typeof opts.title === 'string' || typeof opts.title === 'function' ) {
+		this.title( opts.title );
+		opts.title = true;
+	}
+
+	if ( typeof opts.message === 'string' || typeof opts.message === 'function' ) {
+		this.message( opts.message );
+		opts.message = true;
+	}
+
+	if ( typeof opts.buttons !== 'boolean' ) {
+		this.buttons( opts.buttons );
+		opts.buttons = true;
+	}
+
+	$(document).on( 'keydown'+namespace, function ( e ) {
+		var el = $(document.activeElement);
+		var name = el.length ? el[0].nodeName.toLowerCase() : null;
+		var type = $(el).attr('type');
+		var returnFriendlyNode = name === 'input';
+
+		if ( that.s.displayed && opts.onReturn === 'submit' && e.keyCode === 13 && returnFriendlyNode ) { // return
+			e.preventDefault();
+			that.submit();
+		}
+		else if ( e.keyCode === 27 ) { // esc
+			e.preventDefault();
+
+			switch( opts.onEsc ) {
+				case 'blur':
+					that.blur();
+					break;
+
+				case 'close':
+					that.close();
+					break;
+
+				case 'submit':
+					that.submit();
+					break;
+
+				default: // 'none' - no action
+					break;
+			}
+		}
+		else if ( el.parents('.DTE_Form_Buttons').length ) {
+			if ( e.keyCode === 37 ) { // left
+				el.prev( 'button' ).focus();
+			}
+			else if ( e.keyCode === 39 ) { // right
+				el.next( 'button' ).focus();
+			}
+		}
+	} );
+
+	this.s.closeIcb = function () {
+		$(document).off( 'keydown'+namespace );
+	};
+
+	return namespace;
+};
+
+
+/**
+ * Convert from the 1.5+ data interchange format to the 1.4- format if suitable.
+ *
+ * @param  {string} direction 'send' or 'receive'
+ * @param  {string} action    CRUD action
+ * @param  {object} data      Data object to transform
+ * @private
+ */
+Editor.prototype._legacyAjax = function ( direction, action, data )
+{
+	if ( ! this.s.legacyAjax ) {
+		return;
+	}
+
+	if ( direction === 'send' ) {
+		if ( action === 'create' || action === 'edit' ) {
+			var id;
+
+			$.each( data.data, function ( rowId, values ) {
+				if ( id !== undefined ) {
+					throw 'Editor: Multi-row editing is not supported by the legacy Ajax data format';
+				}
+
+				id = rowId;
+			} );
+
+			data.data = data.data[ id ];
+
+			if ( action === 'edit' ) {
+				data.id = id;
+			}
+		}
+		else {
+			data.id = $.map( data.data, function ( values, id ) {
+				return id;
+			} );
+
+			delete data.data;
+		}
+	}
+	else {
+		if ( ! data.data && data.row ) {
+			// 1.4 libraries retuned data in the `row` property
+			data.data = [ data.row ];
+		}
+		else {
+			// 1.4- allowed data not to be returned - 1.5 requires it
+			data.data = [];
+		}
+	}
+};
+
+
+/**
+ * Update the field options from a JSON data source
+ *
+ * @param  {object} json JSON object from the server
+ * @private
+ */
+Editor.prototype._optionsUpdate = function ( json )
+{
+	var that = this;
+
+	if ( json.options ) {
+		$.each( this.s.fields, function (name, field) {
+			if ( json.options[ name ] !== undefined ) {
+				var fieldInst = that.field( name );
+
+				if ( fieldInst && fieldInst.update ) {
+					fieldInst.update( json.options[ name ] );
+				}
+			}
+		} );
+	}
+};
+
+
+/**
+ * Show a message in the form. This can be used for error messages or dynamic
+ * messages (information display) as the structure for each is basically the
+ * same. This method will take into account if the form is visible or not - if
+ * so then the message is shown with an effect for the end user, otherwise
+ * it is just set immediately.
+ *
+ * @param {element} el The field display node to use
+ * @param {string|function} msg The message to show
+ * @private
+ */
+Editor.prototype._message = function ( el, msg )
+{
+	if ( typeof msg === 'function' ) {
+		msg = msg( this, new DataTable.Api(this.s.table) );
+	}
+
+	el = $(el);
+
+	if ( ! msg && this.s.displayed ) {
+		// Clear the message with visual effect since the form is visible
+		el
+			.stop()
+			.fadeOut( function () {
+				el.html( '' );
+			} );
+	}
+	else if ( ! msg ) {
+		// Clear the message without visual effect
+		el
+			.html( '' )
+			.css('display', 'none');
+	}
+	else if ( this.s.displayed ) {
+		// Show the message with visual effect
+		el
+			.stop()
+			.html( msg )
+			.fadeIn();
+	}
+	else {
+		// Show the message without visual effect
+		el
+			.html( msg )
+			.css('display', 'block');
+	}
+};
+
+
+/**
+ * Update the multi-value information display to not show redundant information
+ *
+ * @private
+ */
+Editor.prototype._multiInfo = function ()
+{
+	var fields = this.s.fields;
+	var include = this.s.includeFields;
+	var show = true;
+
+	if ( ! include ) {
+		return;
+	}
+
+	for ( var i=0, ien=include.length ; i<ien ; i++ ) {
+		var field = fields[ include[i] ];
+
+		if ( field.isMultiValue() && show ) {
+			fields[ include[i] ].multiInfoShown( show );
+			show = false;
+		}
+		else {
+			fields[ include[i] ].multiInfoShown( false );
+		}
+	}
+};
+
+
+/**
+ * Common display editing form method called by all editing methods after the
+ * form has been configured and displayed. This is to ensure all fire the same
+ * events.
+ *
+ * @param  {string} Editing type
+ * @return {boolean} `true`
+ * @private
+ */
+Editor.prototype._postopen = function ( type )
+{
+	var that = this;
+	var focusCapture = this.s.displayController.captureFocus;
+	if ( focusCapture === undefined ) {
+		focusCapture = true;
+	}
+
+	$(this.dom.form)
+		.off( 'submit.editor-internal' )
+		.on( 'submit.editor-internal', function (e) {
+			e.preventDefault();
+		} );
+
+	// Focus capture - when the Editor form is shown we capture the browser's
+	// focus action. Without doing this is would result in the user being able
+	// to control items under the Editor display - triggering actions that
+	// shouldn't be possible while the editing is shown.
+	if ( focusCapture && (type === 'main' || type === 'bubble') ) {
+		$('body').on( 'focus.editor-focus', function () {
+			if ( $(document.activeElement).parents('.DTE').length === 0 &&
+			     $(document.activeElement).parents('.DTED').length === 0
+			) {
+				if ( that.s.setFocus ) {
+					that.s.setFocus.focus();
+				}
+			}
+		} );
+	}
+
+	this._multiInfo();
+
+	this._event( 'open', [type, this.s.action] );
+
+	return true;
+};
+
+
+/**
+ * Common display editing form method called by all editing methods before the
+ * form has been configured and displayed. This is to ensure all fire the same
+ * events.
+ *
+ * @param  {string} Editing type
+ * @return {boolean} `false` if the open is cancelled by the preOpen event,
+ *   otherwise `true`
+ * @private
+ */
+Editor.prototype._preopen = function ( type )
+{
+	// Allow preOpen event to cancel the opening of the display
+	if ( this._event( 'preOpen', [type, this.s.action] ) === false ) {
+		// Tidy- this would normally be done on close, but we never get that far
+		this._clearDynamicInfo();
+
+		return false;
+	}
+
+	this.s.displayed = type;
+
+	return true;
+};
+
+
+/**
+ * Set the form into processing mode or take it out of processing mode. In
+ * processing mode a processing indicator is shown and user interaction with the
+ * form buttons is blocked
+ *
+ * @param {boolean} processing true if to go into processing mode and false if
+ *   to come out of processing mode
+ * @private
+ */
+Editor.prototype._processing = function ( processing )
+{
+	var wrapper = $(this.dom.wrapper);
+	var procStyle = this.dom.processing.style;
+	var procClass = this.classes.processing.active;
+
+	if ( processing ) {
+		procStyle.display = 'block';
+		wrapper.addClass( procClass );
+		$('div.DTE').addClass( procClass );
+	}
+	else {
+		procStyle.display = 'none';
+		wrapper.removeClass( procClass );
+		$('div.DTE').removeClass( procClass );
+	}
+
+	this.s.processing = processing;
+
+	this._event( 'processing', [processing] );
+};
+
+
+/**
+ * Submit a form to the server for processing. This is the private method that is used
+ * by the 'submit' API method, which should always be called in preference to calling
+ * this method directly.
+ *
+ * @param {function} [successCallback] Callback function that is executed once the
+ *   form has been successfully submitted to the server and no errors occurred.
+ * @param {function} [errorCallback] Callback function that is executed if the
+ *   server reports an error due to the submission (this includes a JSON formatting
+ *   error should the error return invalid JSON).
+ * @param {function} [formatdata] Callback function that is passed in the data
+ *   that will be submitted to the server, allowing pre-formatting of the data,
+ *   removal of data or adding of extra fields.
+ * @param {boolean} [hide=true] When the form is successfully submitted, by default
+ *   the form display will be hidden - this option allows that to be overridden.
+ * @private
+ */
+Editor.prototype._submit = function ( successCallback, errorCallback, formatdata, hide )
+{
+	var that = this;
+	var i, iLen, eventRet, errorNodes;
+	var changed = false, allData = {}, changedData = {};
+	var setBuilder =  DataTable.ext.oApi._fnSetObjectDataFn;
+	var dataSource = this.s.dataSource;
+	var fields = this.s.fields;
+	var action = this.s.action;
+	var editCount = this.s.editCount;
+	var modifier = this.s.modifier;
+	var editFields = this.s.editFields;
+	var editData = this.s.editData;
+	var opts = this.s.editOpts;
+	var changedSubmit = opts.submit;
+	var submitParams = {
+		"action": this.s.action,
+		"data": {}
+	};
+	var submitParamsLocal;
+
+	// For backwards compatibility
+	if ( this.s.dbTable ) {
+		submitParams.table = this.s.dbTable;
+	}
+
+	// Gather the data that is to be submitted
+	if ( action === "create" || action === "edit" ) {
+		$.each( editFields, function ( idSrc, edit ) {
+			var allRowData = {};
+			var changedRowData = {};
+
+			$.each( fields, function (name, field) {
+				if ( edit.fields[ name ] ) {
+					var value = field.multiGet( idSrc );
+					var builder = setBuilder( name );
+					var manyBuilder = $.isArray( value ) && name.indexOf('[]') !== -1 ?
+						setBuilder( name.replace(/\[.*$/,'')+'-many-count' ) :
+						null;
+
+					builder( allRowData, value );
+
+					// We need to tell the server-side if an array submission
+					// actually has no elements so it knows if the array was
+					// being submitted or not (since otherwise it doesn't know
+					// if the array was empty, or just not being submitted)
+					if ( manyBuilder ) {
+						manyBuilder( allRowData, value.length );
+					}
+
+					// Build a changed object for if that is the selected data
+					// type
+					if ( action === 'edit' && value !== editData[ name ][ idSrc ] ) {
+						builder( changedRowData, value );
+						changed = true;
+
+						if ( manyBuilder ) {
+							manyBuilder( changedRowData, value.length );
+						}
+					}
+				}
+			} );
+
+			if ( ! $.isEmptyObject( allRowData ) ) {
+				allData[ idSrc ] = allRowData;
+			}
+
+			if ( ! $.isEmptyObject( changedRowData ) ) {
+				changedData[ idSrc ] = changedRowData;
+			}
+		} );
+
+		// Decide what data to submit to the server for edit (create is all, always)
+		if ( action === 'create' || changedSubmit === 'all' || (changedSubmit === 'allIfChanged' && changed) ) {
+			submitParams.data = allData;
+		}
+		else if ( changedSubmit === 'changed' && changed ) {
+			submitParams.data = changedData;
+		}
+		else {
+			// Nothing to submit
+			this.s.action = null;
+
+			if ( opts.onComplete === 'close' && (hide === undefined || hide) ) {
+				this._close( false );
+			}
+
+			if ( successCallback ) {
+				successCallback.call( this );
+			}
+
+			this._processing( false );
+			this._event( 'submitComplete' );
+			return;
+		}
+	}
+	else if ( action === "remove" ) {
+		$.each( editFields, function ( idSrc, edit ) {
+			submitParams.data[ idSrc ] = edit.data;
+		} );
+	}
+
+	this._legacyAjax( 'send', action, submitParams );
+
+	// Local copy of the submit parameters, needed for the data lib prep since
+	// the preSubmit can modify the format and we need to know what the format is
+	submitParamsLocal = $.extend( true, {}, submitParams );
+
+	// Allow the data to be submitted to the server to be preprocessed by callback
+	// and event functions
+	if ( formatdata ) {
+		formatdata( submitParams );
+	}
+	if ( this._event( 'preSubmit', [submitParams, action] ) === false ) {
+		this._processing( false );
+		return;
+	}
+
+	// Submit to the server (or whatever method is defined in the settings)
+	this._ajax(
+		submitParams,
+		function (json) {
+			var setData;
+			that._legacyAjax( 'receive', action, json );
+			that._event( 'postSubmit', [json, submitParams, action] );
+
+			if ( !json.error ) {
+				json.error = "";
+			}
+			if ( !json.fieldErrors ) {
+				json.fieldErrors = [];
+			}
+
+			if ( json.error || json.fieldErrors.length ) {
+				// Global form error
+				that.error( json.error );
+
+				// Field specific errors
+				$.each( json.fieldErrors, function (i, err) {
+					var field = fields[ err.name ];
+
+					field.error( err.status || "Error" );
+
+					if ( i === 0 ) {
+						// Scroll the display to the first error and focus
+						$(that.dom.bodyContent, that.s.wrapper).animate( {
+							"scrollTop": $(field.node()).position().top
+						}, 500 );
+
+						field.focus();
+					}
+				} );
+
+				if ( errorCallback ) {
+					errorCallback.call( that, json );
+				}
+			}
+			else {
+				// Create a data store that the data source can use, which is
+				// unique to this action
+				var store = {};
+				that._dataSource( 'prep', action, modifier, submitParamsLocal, json.data, store );
+
+				if ( action === "create"  || action === "edit" ) {
+					for ( i=0 ; i<json.data.length ; i++ ) {
+						setData = json.data[ i ];
+						that._event( 'setData', [json, setData, action] );
+
+						if ( action === "create" ) {
+							// New row was created to add it to the DT
+							that._event( 'preCreate', [json, setData] );
+							that._dataSource( 'create', fields, setData, store );
+							that._event( ['create', 'postCreate'], [json, setData] );
+						}
+						else if ( action === "edit" ) {
+							// Row was updated, so tell the DT
+							that._event( 'preEdit', [json, setData] );
+							that._dataSource( 'edit', modifier, fields, setData, store );
+							that._event( ['edit', 'postEdit'], [json, setData] );
+						}
+					}
+				}
+				else if ( action === "remove" ) {
+					// Remove the rows given and then redraw the table
+					that._event( 'preRemove', [json] );
+					that._dataSource( 'remove', modifier, fields, store );
+					that._event( ['remove', 'postRemove'], [json] );
+				}
+
+				that._dataSource( 'commit', action, modifier, json.data, store );
+
+				// Submission complete
+				if ( editCount === that.s.editCount ) {
+					that.s.action = null;
+
+					if ( opts.onComplete === 'close' && (hide === undefined || hide) ) {
+						that._close( true );
+					}
+				}
+
+				// All done - fire off the callbacks and events
+				if ( successCallback ) {
+					successCallback.call( that, json );
+				}
+				that._event( 'submitSuccess', [json, setData] );
+			}
+
+			that._processing( false );
+			that._event( 'submitComplete', [json, setData] );
+		},
+		function (xhr, err, thrown) {
+			that._event( 'postSubmit', [xhr, err, thrown, submitParams] );
+
+			that.error( that.i18n.error.system );
+			that._processing( false );
+
+			if ( errorCallback ) {
+				errorCallback.call( that, xhr, err, thrown );
+			}
+
+			that._event( ['submitError', 'submitComplete'], [xhr, err, thrown, submitParams] );
+		}
+	); // /ajax submit
+};
+
+
+/**
+ * Check to see if the form needs to be tidied before a new action can be performed.
+ * This includes if the from is currently processing an old action and if it
+ * is inline editing.
+ *
+ * @param {function} fn Callback function
+ * @returns {boolean} `true` if was in inline mode, `false` otherwise
+ * @private
+ */
+Editor.prototype._tidy = function ( fn )
+{
+	var that = this;
+	var dt = this.s.table ?
+		new $.fn.dataTable.Api( this.s.table ) :
+		null;
+
+	var ssp = false;
+	if ( dt ) {
+		ssp = dt.settings()[0].oFeatures.bServerSide;
+	}
+
+	if ( this.s.processing ) {
+		// If currently processing, wait until the action is complete
+		this.one( 'submitComplete', function () {
+			// If server-side processing is being used in DataTables, first
+			// check that we are still processing (might not be if nothing was
+			// submitted) and then wait for the draw to finished
+			if ( ssp ) {
+				dt.one( 'draw', fn );
+			}
+			else {
+				setTimeout( function () {
+					fn();
+				}, 10 );
+			}
+		} );
+
+		return true;
+	}
+	else if ( this.display() === 'inline' || this.display() === 'bubble' ) {
+		// If there is an inline edit box, it needs to be tidied
+		this
+			.one( 'close', function () {
+				// On close if processing then we need to wait for the submit to
+				// complete before running the callback as onBlur was set to
+				// submit
+				if ( ! that.s.processing ) {
+					// IE needs a small timeout, otherwise it may not focus on a
+					// field if one already has focus
+					setTimeout( function () {
+						fn();
+					}, 10 );
+				}
+				else {
+					// Need to wait for the submit to finish
+					that.one( 'submitComplete', function ( e, json ) {
+						// If SSP then need to wait for the draw
+						if ( ssp && json ) {
+							dt.one( 'draw', fn );
+						}
+						else {
+							setTimeout( function () {
+								fn();
+							}, 10 );
+						}
+					} );
+				}
+			} )
+			.blur();
+
+		return true;
+	}
+
+	return false;
+};
+
+
+/*
+ * Defaults
+ */
+
+
+// Dev node - although this file is held in the models directory (because it
+// really is a model, it is assigned to Editor.defaults for easy
+// and sensible access to set the defaults for Editor.
+
+/**
+ * Initialisation options that can be given to Editor at initialisation time.
+ *  @namespace
+ */
+Editor.defaults = {
+	/**
+	 * jQuery selector that can be used to identify the table you wish to apply
+	 * this editor instance to.
+	 *
+	 * In previous versions of Editor (1.2 and earlier), this parameter was
+	 * called `table`. The name has been altered in 1.3+ to simplify the
+	 * initialisation. This is a backwards compatible change - if you pass in
+	 * a `table` option it will be used.
+	 *  @type string
+	 *  @default <i>Empty string</i>
+	 *
+	 *  @example
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": "php/index.php",
+	 *        "table": "#example"
+	 *      } );
+	 *    } );
+	 */
+	"table": null,
+
+	/**
+	 * The URL, or collection of URLs when using a REST interface, which will accept 
+	 * the data for the create, edit and remove functions. The target script / program
+	 * must accept data in the format defined by Editor and return the expected JSON as
+	 * required by Editor. When given as an object, the `create`, `edit` and `remove`
+	 * properties should be defined, each being the URL to send the data to for that
+	 * action. When used as an object, the string `_id_` will be replaced for the edit
+	 * and remove actions, allowing a URL to be dynamically created for those actions.
+	 *  @type string|object
+	 *  @default <i>Empty string</i>
+	 *  @deprecated This option has been deprecated in favour of the `ajax` option.
+	 *    It can still be used, but it is recommended that you use the `ajax` option
+	 *    which provides all of the abilities of this old option and more.
+	 */
+	"ajaxUrl": null,
+
+	/**
+	 * Fields to initialise the form with - see {@link Editor.models.field} for
+	 * a full list of the options available to each field. Note that if fields are not 
+	 * added to the form at initialisation time using this option, they can be added using
+	 * the {@link Editor#add} API method.
+	 *  @type array
+	 *  @default []
+	 *
+	 *  @example
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": "php/index.php",
+	 *        "table": "#example",
+	 *        "fields": [ {
+	 *            "label": "User name:",
+	 *            "name": "username"
+	 *          }
+	 *          // More fields would typically be added here!
+	 *        } ]
+	 *      } );
+	 *    } );
+	 */
+	"fields": [],
+
+	/**
+	 * The display controller for the form. The form itself is just a collection of
+	 * DOM elements which require a display container. This display controller allows
+	 * the visual appearance of the form to be significantly altered without major
+	 * alterations to the Editor code. There are two display controllers built into
+	 * Editor *lightbox* and *envelope*. The value of this property will
+	 * be used to access the display controller defined in {@link Editor.display}
+	 * for the given name. Additional display controllers can be added by adding objects
+	 * to that object, through extending the displayController model:
+	 * {@link Editor.models.displayController}.
+	 *  @type string
+	 *  @default lightbox
+	 *
+	 *  @example
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": "php/index.php",
+	 *        "table": "#example",
+	 *        "display": 'envelope'
+	 *      } );
+	 *    } );
+	 */
+	"display": 'lightbox',
+
+	/**
+	 * Control how the Ajax call to update data on the server.
+	 *
+	 * This option matches the `dt-init ajax` option in that is can be provided
+	 * in one of three different ways:
+	 *
+	 * * string - As a string, the value given is used as the url to target
+	 *   the Ajax request to, using the default Editor Ajax options. Note that
+	 *   for backwards compatibility you can use the form "METHOD URL" - for
+	 *   example: `"PUT api/users"`, although it is recommended you use the
+	 *   object form described below.
+	 * * object - As an object, the `ajax` property has two forms:
+	 *   * Used to extend and override the default Ajax options that Editor
+	 *     uses. This can be very useful for adding extra data for example, or
+	 *     changing the HTTP request type.
+	 *   * With `create`, `edit` and `remove` properties, Editor will use the
+	 *     option for the action that it is taking, which can be useful for
+	 *     REST style interfaces. The value of each property can be a string,
+	 *     object or function, using exactly the same options as the main `ajax`
+	 *     option. All three options must be defined if this form is to be used.
+	 * * function - As a function this gives complete control over the method
+	 *   used to update the server (if indeed a server is being used!). For
+	 *   example, you could use a different data store such as localStorage,
+	 *   Firebase or route the data through a web-socket.
+	 *
+	 *  @example
+	 *    // As a string - all actions are submitted to this URI as POST requests
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": 'php/index.php',
+	 *        "table": "#example"
+	 *      } );
+	 *    } );
+	 *
+	 *  @example
+	 *    // As an object - using GET rather than POST
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": {
+	 *          "type": 'GET',
+	 *          "url": 'php/index.php
+	 *        },
+	 *        "table": "#example"
+	 *      } );
+	 *    } );
+	 *
+	 *  @example
+	 *    // As an object - each action is submitted to a different URI as POST requests
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": {
+	 *          "create": "/rest/user/create",
+	 *          "edit":   "/rest/user/_id_/edit",
+	 *          "remove": "/rest/user/_id_/delete"
+	 *        },
+	 *        "table": "#example"
+	 *      } );
+	 *    } );
+	 *
+	 *  @example
+	 *    // As an object - with different HTTP methods for each action
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": {
+	 *          "create": {
+	 *          	type: 'POST',
+	 *          	url:  '/rest/user/create'
+	 *          },
+	 *          "edit": {
+	 *          	type: 'PUT',
+	 *          	url:  '/rest/user/edit/_id_'
+	 *          },
+	 *          "remove": {
+	 *          	type: 'DELETE',
+	 *          	url:  '/rest/user/delete'
+	 *          }
+	 *        },
+	 *        "table": "#example"
+	 *      } );
+	 *    } );
+	 *
+	 *    // As a function - Making a custom `$.ajax` call
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": "php/index.php",
+	 *        "table": "#example",
+	 *        "ajax": function ( method, url, data, successCallback, errorCallback ) {
+	 *          $.ajax( {
+	 *            "type": method,
+	 *            "url":  url,
+	 *            "data": data,
+	 *            "dataType": "json",
+	 *            "success": function (json) {
+	 *              successCallback( json );
+	 *            },
+	 *            "error": function (xhr, error, thrown) {
+	 *              errorCallback( xhr, error, thrown );
+	 *            }
+	 *          } );
+	 *        }
+	 *      } );
+	 *    } );
+	 */
+	"ajax": null,
+
+	/**
+	 * JSON property from which to read / write the row's ID property (i.e. its
+	 * unique column index that identifies the row to the database). By default
+	 * Editor will use the `DT_RowId` property from the data source object
+	 * (DataTable's magic property to set the DOM id for the row).
+	 *
+	 * If you want to read a parameter from the data source object instead of
+	 * using `DT_RowId`, set this option to the property name to use.
+	 *
+	 * Like other data source options the `srcId` option can be given in dotted
+	 * object notation to read nested objects.
+	 *  @type null|string
+	 *  @default DT_RowId
+	 *
+	 *  @example
+	 *    // Using a data source such as:
+	 *    // { "id":12, "browser":"Chrome", ... }
+	 *    $(document).ready(function() {
+	 *      var editor = new $.fn.Editor( {
+	 *        "ajax": "php/index.php",
+	 *        "table": "#example",
+	 *        "idSrc": "id"
+	 *      } );
+	 *    } );
+	 */
+	"idSrc": 'DT_RowId',
+
+	/**
+	 * Events / callbacks - event handlers can be assigned as an individual function
+	 * during initialisation using the parameters in this name space. The names, and
+	 * the parameters passed to each callback match their event equivalent in the
+	 * {@link Editor} object.
+	 *  @namespace
+	 *  @deprecated Since 1.3. Use the `on()` API method instead. Note that events
+	 *    passed in do still operate as they did in 1.2- but are no longer
+	 *    individually documented.
+	 */
+	"events": {},
+
+	/**
+	 * Internationalisation options for Editor. All client-side strings that the
+	 * end user can see in the interface presented by Editor can be modified here.
+	 *
+	 * You may also wish to refer to the <a href="http://datatables.net/usage/i18n">
+	 * DataTables internationalisation options</a> to provide a fully language 
+	 * customised table interface.
+	 *  @namespace
+	 *
+	 *  @example
+	 *    // Set the 'create' button text. All other strings used are the
+	 *    // default values.
+	 *    var editor = new $.fn.Editor( {
+	 *      "ajax": "data/source",
+	 *      "table": "#example",
+	 *      "i18n": {
+	 *        "create": {
+	 *          "button": "New user"
+	 *        }
+	 *      }
+	 *    } );
+	 *
+	 *  @example
+	 *    // Set the submit text for all three actions
+	 *    var editor = new $.fn.Editor( {
+	 *      "ajax": "data/source",
+	 *      "table": "#example",
+	 *      "i18n": {
+	 *        "create": {
+	 *          "submit": "Create new user"
+	 *        },
+	 *        "edit": {
+	 *          "submit": "Update user"
+	 *        },
+	 *        "remove": {
+	 *          "submit": "Remove user"
+	 *        }
+	 *      }
+	 *    } );
+	 */
+	"i18n": {
+		/**
+		 * Strings used when working with the Editor 'create' action (creating new
+		 * records).
+		 *  @namespace
+		 */
+		"create": {
+			/**
+			 * TableTools button text
+			 *  @type string
+			 *  @default New
+			 */
+			"button": "New",
+
+			/**
+			 * Display container title (when showing the editor display)
+			 *  @type string
+			 *  @default Create new entry
+			 */
+			"title":  "Create new entry",
+
+			/**
+			 * Submit button text
+			 *  @type string
+			 *  @default Create
+			 */
+			"submit": "Create"
+		},
+
+		/**
+		 * Strings used when working with the Editor 'edit' action (editing existing
+		 * records).
+		 *  @namespace
+		 */
+		"edit": {
+			/**
+			 * TableTools button text
+			 *  @type string
+			 *  @default Edit
+			 */
+			"button": "Edit",
+
+			/**
+			 * Display container title (when showing the editor display)
+			 *  @type string
+			 *  @default Edit entry
+			 */
+			"title":  "Edit entry",
+
+			/**
+			 * Submit button text
+			 *  @type string
+			 *  @default Update
+			 */
+			"submit": "Update"
+		},
+
+		/**
+		 * Strings used when working with the Editor 'delete' action (deleting 
+		 * existing records).
+		 *  @namespace
+		 */
+		"remove": {
+			/**
+			 * TableTools button text
+			 *  @type string
+			 *  @default Delete
+			 */
+			"button": "Delete",
+
+			/**
+			 * Display container title (when showing the editor display)
+			 *  @type string
+			 *  @default Delete
+			 */
+			"title":  "Delete",
+
+			/**
+			 * Submit button text
+			 *  @type string
+			 *  @default Delete
+			 */
+			"submit": "Delete",
+
+			/**
+			 * Deletion confirmation message.
+			 *
+			 * As Editor has the ability to delete either a single or multiple rows
+			 * at a time, this option can be given as either a string (which will be
+			 * used regardless of how many records are selected) or as an object 
+			 * where the property "_" will be used (with %d substituted for the number
+			 * of records to be deleted) as the delete message, unless there is a
+			 * key with the number of records to be deleted. This allows Editor
+			 * to consider the different pluralisation characteristics of different
+			 * languages.
+			 *  @type object|string
+			 *  @default Are you sure you wish to delete %d rows?
+			 *
+			 *  @example
+			 *    // String - no plural consideration
+			 *    var editor = new $.fn.Editor( {
+			 *      "ajax": "data/source",
+			 *      "table": "#example",
+			 *      "i18n": {
+			 *        "remove": {
+			 *          "confirm": "Are you sure you wish to delete %d record(s)?"
+			 *        }
+			 *      }
+			 *    } );
+			 *
+			 *  @example
+			 *    // Basic 1 (singular) or _ (plural)
+			 *    var editor = new $.fn.Editor( {
+			 *      "ajax": "data/source",
+			 *      "table": "#example",
+			 *      "i18n": {
+			 *        "remove": {
+			 *          "confirm": {
+			 *            "_": "Confirm deletion of %d records.",
+			 *            "1": "Confirm deletion of record."
+			 *        }
+			 *      }
+			 *    } );
+			 *
+			 *  @example
+			 *    // Singular, dual and plural
+			 *    var editor = new $.fn.Editor( {
+			 *      "ajax": "data/source",
+			 *      "table": "#example",
+			 *      "i18n": {
+			 *        "remove": {
+			 *          "confirm": {
+			 *            "_": "Confirm deletion of %d records.",
+			 *            "1": "Confirm deletion of record.",
+			 *            "2": "Confirm deletion of both record."
+			 *        }
+			 *      }
+			 *    } );
+			 *        
+			 */
+			"confirm": {
+				"_": "Are you sure you wish to delete %d rows?",
+				"1": "Are you sure you wish to delete 1 row?"
+			}
+		},
+
+		/**
+		 * Strings used for error conditions.
+		 *  @namespace
+		 */
+		"error": {
+			/**
+			 * Generic server error message
+			 *  @type string
+			 *  @default A system error has occurred (<a target=\"_blank\" href=\"//datatables.net/tn/12\">More information</a>)
+			 */
+			"system": "A system error has occurred (<a target=\"_blank\" href=\"//datatables.net/tn/12\">More information</a>)."
+		},
+
+		/**
+		 * Strings used for multi-value editing
+		 *  @namespace
+		 */
+		"multi": {
+			/**
+			 * Shown in place of the field value when a field has multiple values
+			 */
+			"title": "Multiple values",
+
+			/**
+			 * Shown below the multi title text, although only the first
+			 * instance of this text is shown in the form to reduce redundancy
+			 */
+			"info": "The selected items contain different values for this input. To edit and set all items for this input to the same value, click or tap here, otherwise they will retain their individual values.",
+
+			/**
+			 * Shown below the field input when group editing a value to allow
+			 * the user to return to the original multiple values
+			 */
+			"restore": "Undo changes"
+		},
+
+		"datetime": {
+			previous: 'Previous',
+			next:     'Next',
+			months:   [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
+			weekdays: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
+			amPm:     [ 'am', 'pm' ],
+			unknown:  '-'
+		}
+	},
+
+	formOptions: {
+		bubble: $.extend( {}, Editor.models.formOptions, {
+			title: false,
+			message: false,
+			buttons: '_basic',
+			submit: 'changed'
+		} ),
+
+		inline: $.extend( {}, Editor.models.formOptions, {
+			buttons: false,
+			submit: 'changed'
+		} ),
+
+		main: $.extend( {}, Editor.models.formOptions )
+	},
+
+	/**
+	 * Submit data to the server in the 1.4- data format (`true`) or in the 1.5+
+	 * data format (`false` - default).
+	 *
+	 * @type Boolean
+	 */
+	legacyAjax: false
+};
+
+
+/*
+ * Extensions
+ */
+
+(function(){
+
+
+var __dataSources = Editor.dataSources = {};
+
+
+/* -  -  -  -  -  -  -  -  -  -
+ * DataTables editor interface
+ */
+
+var __dtIsSsp = function ( dt, editor ) {
+	// If the draw type is `none`, then we still need to use the DT API to
+	// update the display with the new data
+	return dt.settings()[0].oFeatures.bServerSide &&
+		editor.s.editOpts.drawType !== 'none';
+};
+
+var __dtApi = function ( table ) {
+	return $(table).DataTable();
+};
+
+var __dtHighlight = function ( node ) {
+	// Highlight a row using CSS transitions. The timeouts need to match the
+	// transition duration from the CSS
+	node = $(node);
+
+	setTimeout( function () {
+		node.addClass( 'highlight' );
+
+		setTimeout( function () {
+			node
+				.addClass( 'noHighlight' )
+				.removeClass( 'highlight' );
+
+			setTimeout( function () {
+				node.removeClass( 'noHighlight' );
+			}, 550 );
+		}, 500 );
+	}, 20 );
+};
+
+var __dtRowSelector = function ( out, dt, identifier, fields, idFn )
+{
+	dt.rows( identifier ).indexes().each( function ( idx ) {
+		var row = dt.row( idx );
+		var data = row.data();
+		var idSrc = idFn( data );
+
+		if ( idSrc === undefined ) {
+			Editor.error( 'Unable to find row identifier', 14 );
+		}
+
+		out[ idSrc ] = {
+			idSrc:  idSrc,
+			data:   data,
+			node:   row.node(),
+			fields: fields,
+			type:   'row'
+		};
+	} );
+};
+
+var __dtColumnSelector = function ( out, dt, identifier, fields, idFn )
+{
+	dt.cells( null, identifier ).indexes().each( function ( idx ) {
+		__dtCellSelector( out, dt, idx, fields, idFn );
+	} );
+};
+
+var __dtCellSelector = function ( out, dt, identifier, allFields, idFn, forceFields )
+{
+	dt.cells( identifier ).indexes().each( function ( idx ) {
+		var cell = dt.cell( idx );
+		var row = dt.row( idx.row );
+		var data = row.data();
+		var idSrc = idFn( data );
+		var fields = forceFields || __dtFieldsFromIdx( dt, allFields, idx.column );
+
+		// Use the row selector to get the row information
+		__dtRowSelector(out, dt, idx.row, allFields, idFn);
+
+		out[ idSrc ].attach = typeof identifier === 'object' && identifier.nodeName ?
+			[ identifier ] :
+			[ cell.node() ];
+		out[ idSrc ].displayFields = fields; // all fields are edited, but only
+		                                     // these are actually displayed
+	} );
+};
+
+var __dtFieldsFromIdx = function ( dt, fields, idx )
+{
+	var field;
+	var col = dt.settings()[0].aoColumns[ idx ];
+	var dataSrc = col.editField !== undefined ?
+		col.editField :
+		col.mData;
+	var resolvedFields = {};
+	var run = function ( field, dataSrc ) {
+		if ( field.dataSrc() === dataSrc ) {
+			resolvedFields[ field.name() ] = field;
+		}
+	};
+
+	$.each( fields, function ( name, fieldInst ) {
+		if ( $.isArray( dataSrc ) ) {
+			for ( var i=0 ; i<dataSrc.length ; i++ ) {
+				run( fieldInst, dataSrc[i] );
+			}
+		}
+		else {
+			run( fieldInst, dataSrc );
+		}
+	} );
+
+	if ( $.isEmptyObject( resolvedFields ) ) {
+		Editor.error('Unable to automatically determine field from source. Please specify the field name.', 11);
+	}
+
+	return resolvedFields;
+};
+
+
+
+__dataSources.dataTable = {
+	individual: function ( identifier, fieldNames ) {
+		var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+		var dt = __dtApi( this.s.table );
+		var fields = this.s.fields;
+		var out = {};
+		var forceFields;
+		var responsiveNode;
+
+		// Responsive field - this isn't really needed as of DT 1.10.11. To be
+		// removed in Editor 1.6
+		if ( identifier.nodeName && $(identifier).hasClass( 'dtr-data' ) ) {
+			responsiveNode = identifier;
+
+			// Overwrite the selector so that DataTables will select based on
+			// the cell that Responsive is showing data for
+			identifier = dt.responsive.index( $(identifier).closest('li') );
+		}
+
+		if ( fieldNames ) {
+			if ( ! $.isArray( fieldNames ) ) {
+				fieldNames = [ fieldNames ];
+			}
+
+			forceFields = {};
+
+			$.each( fieldNames, function ( i, name ) {
+				forceFields[ name ] = fields[ name ];
+			} );
+		}
+
+		__dtCellSelector( out, dt, identifier, fields, idFn, forceFields );
+
+		// If Responsive, we want it to attach the editor to the element that
+		// was clicked on
+		if ( responsiveNode ) {
+			$.each( out, function ( i, val ) {
+				val.attach = [ responsiveNode ];
+			} );
+		}
+
+		return out;
+	},
+
+	// get idSrc, fields to edit, data and node for each item
+	fields: function ( identifier )
+	{
+		var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+		var dt = __dtApi( this.s.table );
+		var fields = this.s.fields;
+		var out = {};
+
+		if ( $.isPlainObject( identifier ) && ( identifier.rows !== undefined || identifier.columns !== undefined || identifier.cells !== undefined ) ) {
+			// Multi-item type selector
+			if ( identifier.rows !== undefined ) {
+				__dtRowSelector( out, dt, identifier.rows, fields, idFn );
+			}
+
+			if ( identifier.columns !== undefined ) {
+				__dtColumnSelector( out, dt, identifier.columns, fields, idFn );
+			}
+			
+			if ( identifier.cells !== undefined ) {
+				__dtCellSelector( out, dt, identifier.cells, fields, idFn );
+			}
+		}
+		else {
+			// Just a rows selector
+			__dtRowSelector( out, dt, identifier, fields, idFn );
+		}
+
+		return out;
+	},
+
+	create: function ( fields, data ) {
+		var dt = __dtApi( this.s.table );
+
+		if ( ! __dtIsSsp( dt, this ) ) {
+			var row = dt.row.add( data );
+			__dtHighlight( row.node() );
+		}
+	},
+
+	edit: function ( identifier, fields, data, store ) {
+		var dt = __dtApi( this.s.table );
+
+		// No point in doing anything when server-side processing - the commit
+		// will redraw the table
+		if ( ! __dtIsSsp( dt, this ) ) {
+			// The identifier can select one or more rows, but the data will
+			// refer to just a single row. We need to determine which row from
+			// the set is the one to operator on.
+			var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+			var rowId = idFn( data );
+			var row;
+
+			// Find the row to edit - attempt to do an id look up first for speed
+			row = dt.row( '#'+rowId );
+
+			// If not found, then we need to do it the slow way
+			if ( ! row.any() ) {
+				row = dt.row( function ( rowIdx, rowData, rowNode ) {
+					return rowId == idFn( rowData );
+				} );
+			}
+
+			if ( row.any() ) {
+				row.data( data );
+
+				// Remove the item from the list of indexes now that is has been
+				// updated
+				var idx = $.inArray( rowId, store.rowIds );
+				store.rowIds.splice( idx, 1 );
+			}
+			else {
+				// If not found, then its a new row (change in pkey possibly)
+				row = dt.row.add( data );
+			}
+
+			__dtHighlight( row.node() );
+		}
+	},
+
+	remove: function ( identifier, fields ) {
+		// No confirmation from the server 
+		var dt = __dtApi( this.s.table );
+
+		if ( ! __dtIsSsp( dt, this ) ) {
+			dt.rows( identifier ).remove();
+		}
+	},
+
+	prep: function ( action, identifier, submit, data, store ) {
+		// On edit we store the ids of the rows that are being edited
+		if ( action === 'edit' ) {
+			store.rowIds = $.map( submit.data, function ( val, key ) {
+				if ( ! $.isEmptyObject( submit.data[ key ] ) ) {
+					return key;
+				}
+			} );
+		}
+	},
+
+	commit: function ( action, identifier, data, store ) {
+		// Updates complete - redraw
+		var dt = __dtApi( this.s.table );
+
+		// On edit, if there are any rows left in the `store.rowIds`, then they
+		// were not returned by the server and should be removed (they might not
+		// meet filtering requirements any more for example)
+		if ( action === 'edit' && store.rowIds.length ) {
+			var ids = store.rowIds;
+			var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+			var row;
+
+			for ( var i=0, ien=ids.length ; i<ien ; i++ ) {
+				// Find the row to edit - attempt to do an id look up first for speed
+				row = dt.row( '#'+ids[i] );
+
+				// If not found, then we need to do it the slow way
+				if ( ! row.any() ) {
+					row = dt.row( function ( rowIdx, rowData, rowNode ) {
+						return ids[i] === idFn( rowData );
+					} );
+				}
+
+				if ( row.any() ) {
+					row.remove();
+				}
+			}
+		}
+
+		var drawType = this.s.editOpts.drawType;
+		if ( drawType !== 'none' ) {
+			dt.draw( drawType );
+		}
+	}
+};
+
+
+
+/* -  -  -  -  -  -  -  -
+ * HTML editor interface
+ */
+
+function __html_set( identifier, fields, data ) {
+	$.each( fields, function ( name, field ) {
+		var val = field.valFromData( data );
+
+		if ( val !== undefined ) {
+			__html_el( identifier, field.dataSrc() )
+				.each( function () {
+					// This is very frustrating, but in IE if you just write directly
+					// to innerHTML, and elements that are overwritten are GC'ed,
+					// even if there is a reference to them elsewhere
+					while ( this.childNodes.length ) {
+						this.removeChild( this.firstChild );
+					}
+				} )
+				.html( val );
+		}
+	} );
+}
+
+function __html_els ( identifier, names ) {
+	var out = $();
+
+	for ( var i=0, ien=names.length ; i<ien ; i++ ) {
+		out = out.add( __html_el( identifier, names[i] ) );
+	}
+
+	return out;
+}
+
+function __html_el ( identifier, name ) {
+	var context = identifier === 'keyless' ?
+		document :
+		$('[data-editor-id="'+identifier+'"]');
+
+	return $('[data-editor-field="'+name+'"]', context);
+}
+
+
+
+__dataSources.html = {
+	initField: function ( cfg ) {
+		// This is before the field has been initialised so can't use it API
+		var label = $('[data-editor-label="'+(cfg.data || cfg.name)+'"]');
+		if ( ! cfg.label && label.length ) {
+			cfg.label = label.html();
+		}
+	},
+
+	individual: function ( identifier, fieldNames ) {
+		// Auto detection of the field name and id
+		if ( identifier instanceof $ || identifier.nodeName ) {
+			if ( ! fieldNames ) {
+				fieldNames = [ $( identifier ).attr('data-editor-field') ];
+			}
+
+			identifier = $( identifier ).parents('[data-editor-id]').data('editor-id');
+		}
+
+		// no id given and none found
+		if ( ! identifier ) {
+			identifier = 'keyless';
+		}
+
+		// no field name - cannot continue
+		if ( fieldNames && ! $.isArray( fieldNames ) ) {
+			fieldNames = [ fieldNames ];
+		}
+
+		if ( ! fieldNames || fieldNames.length === 0 ) {
+			throw 'Cannot automatically determine field name from data source';
+		}
+
+		var out = __dataSources.html.fields.call( this, identifier );
+		var fields = this.s.fields;
+		var forceFields = {};
+
+		$.each( fieldNames, function ( i, name ) {
+			forceFields[ name ] = fields[ name ];
+		} );
+
+		$.each( out, function ( id, set ) {
+			set.type = 'cell';
+			set.attach = __html_els( identifier, fieldNames ).toArray();
+			set.fields = fields;
+			set.displayFields = forceFields;
+		} );
+
+		return out;
+	},
+
+	// get idSrc, fields to edit, data and node for each item
+	fields: function ( identifier )
+	{
+		var out = {};
+		var data = {};
+		var fields = this.s.fields;
+
+		if ( ! identifier ) {
+			identifier = 'keyless';
+		}
+
+		$.each( fields, function ( name, field ) {
+			var val = __html_el( identifier, field.dataSrc() ).html();
+
+			// If no HTML element is present, jQuery returns null. We want undefined
+			field.valToData( data, val === null ? undefined : val );
+		} );
+
+		out[ identifier ] = {
+			idSrc: identifier,
+			data: data,
+			node: document,
+			fields: fields,
+			type: 'row'
+		};
+
+		return out;
+	},
+
+	create: function ( fields, data ) {
+		// If there is an element with the id that has been created, then use it
+		// to assign the values
+		if ( data ) {
+			var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+			var id = idFn( data );
+
+			if ( $('[data-editor-id="'+id+'"]').length ) {
+				__html_set( id, fields, data );
+			}
+		}
+	},
+
+	edit: function ( identifier, fields, data ) {
+		// Get the ids from the returned data or `keyless` if not found
+		var idFn = DataTable.ext.oApi._fnGetObjectDataFn( this.s.idSrc );
+		var id = idFn( data ) || 'keyless';
+
+		__html_set( id, fields, data );
+	},
+
+	remove: function ( identifier, fields ) {
+		// If there is an element with an ID property matching the identifier,
+		// remove it
+		$('[data-editor-id="'+identifier+'"]').remove();
+	}
+};
+
+
+}());
+
+
+
+/**
+ * Class names that are used by Editor for its various display components.
+ * A copy of this object is taken when an Editor instance is initialised, thus
+ * allowing different classes to be used in different instances if required.
+ * Class name changes can be useful for easy integration with CSS frameworks,
+ * for example Twitter Bootstrap.
+ *  @namespace
+ */
+Editor.classes = {
+	/**
+	 * Applied to the base DIV element that contains all other Editor elements
+	 */
+	"wrapper": "DTE",
+
+	/**
+	 * Processing classes
+	 *  @namespace
+	 */
+	"processing": {
+		/**
+		 * Processing indicator element
+		 */
+		"indicator": "DTE_Processing_Indicator",
+
+		/**
+		 * Added to the base element ("wrapper") when the form is "processing"
+		 */
+		"active": "DTE_Processing"
+	},
+
+	/**
+	 * Display header classes
+	 *  @namespace
+	 */
+	"header": {
+		/**
+		 * Container for the header elements
+		 */
+		"wrapper": "DTE_Header",
+
+		/**
+		 * Liner for the header content
+		 */
+		"content": "DTE_Header_Content"
+	},
+
+	/**
+	 * Display body classes
+	 *  @namespace
+	 */
+	"body": {
+		/**
+		 * Container for the body elements
+		 */
+		"wrapper": "DTE_Body",
+
+		/**
+		 * Liner for the body content
+		 */
+		"content": "DTE_Body_Content"
+	},
+
+	/**
+	 * Display footer classes
+	 *  @namespace
+	 */
+	"footer": {
+		/**
+		 * Container for the footer elements
+		 */
+		"wrapper": "DTE_Footer",
+		
+		/**
+		 * Liner for the footer content
+		 */
+		"content": "DTE_Footer_Content"
+	},
+
+	/**
+	 * Form classes
+	 *  @namespace
+	 */
+	"form": {
+		/**
+		 * Container for the form elements
+		 */
+		"wrapper": "DTE_Form",
+
+		/**
+		 * Liner for the form content
+		 */
+		"content": "DTE_Form_Content",
+
+		/**
+		 * Applied to the <form> tag
+		 */
+		"tag":     "",
+
+		/**
+		 * Global form information
+		 */
+		"info":    "DTE_Form_Info",
+
+		/**
+		 * Global error imformation
+		 */
+		"error":   "DTE_Form_Error",
+
+		/**
+		 * Buttons container
+		 */
+		"buttons": "DTE_Form_Buttons",
+
+		/**
+		 * Buttons container
+		 */
+		"button": "btn"
+	},
+
+	/**
+	 * Field classes
+	 *  @namespace
+	 */
+	"field": {
+		/**
+		 * Container for each field
+		 */
+		"wrapper":     "DTE_Field",
+
+		/**
+		 * Class prefix for the field type - field type is added to the end allowing
+		 * styling based on field type.
+		 */
+		"typePrefix":  "DTE_Field_Type_",
+
+		/**
+		 * Class prefix for the field name - field name is added to the end allowing
+		 * styling based on field name.
+		 */
+		"namePrefix":  "DTE_Field_Name_",
+
+		/**
+		 * Field label
+		 */
+		"label":       "DTE_Label",
+
+		/**
+		 * Field input container
+		 */
+		"input":       "DTE_Field_Input",
+
+		/**
+		 * Input elements wrapper
+		 */
+		"inputControl": "DTE_Field_InputControl",
+
+		/**
+		 * Field error state (added to the field.wrapper element when in error state
+		 */
+		"error":       "DTE_Field_StateError",
+
+		/**
+		 * Label information text
+		 */
+		"msg-label":   "DTE_Label_Info",
+
+		/**
+		 * Error information text
+		 */
+		"msg-error":   "DTE_Field_Error",
+
+		/**
+		 * Live messaging (API) information text
+		 */
+		"msg-message": "DTE_Field_Message",
+
+		/**
+		 * General information text
+		 */
+		"msg-info":    "DTE_Field_Info",
+
+		/**
+		 * Multi-value information display wrapper
+		 */
+		"multiValue":  "multi-value",
+
+		/**
+		 * Multi-value information descriptive text
+		 */
+		"multiInfo":  "multi-info",
+
+		/**
+		 * Multi-value information display
+		 */
+		"multiRestore":  "multi-restore"
+	},
+
+	/**
+	 * Action classes - these are added to the Editor base element ("wrapper")
+	 * and allows styling based on the type of form view that is being employed.
+	 *  @namespace
+	 */
+	"actions": {
+		/**
+		 * Editor is in 'create' state
+		 */
+		"create": "DTE_Action_Create",
+
+		/**
+		 * Editor is in 'edit' state
+		 */
+		"edit":   "DTE_Action_Edit",
+
+		/**
+		 * Editor is in 'remove' state
+		 */
+		"remove": "DTE_Action_Remove"
+	},
+
+	/**
+	 * Bubble editing classes - these are used to display the bubble editor
+	 *  @namespace
+	 */
+	"bubble": {
+		/**
+		 * Bubble container element
+		 */
+		"wrapper": "DTE DTE_Bubble",
+
+		/**
+		 * Bubble content liner
+		 */
+		"liner": "DTE_Bubble_Liner",
+
+		/**
+		 * Bubble table display wrapper, so the buttons and form can be shown
+		 * as table cells (via css)
+		 */
+		"table": "DTE_Bubble_Table",
+
+		/**
+		 * Close button
+		 */
+		"close": "DTE_Bubble_Close",
+
+		/**
+		 * Pointer shown which node is being edited
+		 */
+		"pointer": "DTE_Bubble_Triangle",
+
+		/**
+		 * Fixed background
+		 */
+		"bg": "DTE_Bubble_Background"
+	}
+};
+
+
+
+/*
+ * Add helpful TableTool buttons to make life easier
+ *
+ * Note that the values that require a string to make any sense (the button text
+ * for example) are set by Editor when Editor is initialised through the i18n
+ * options.
+ */
+if ( DataTable.TableTools ) {
+	var ttButtons = DataTable.TableTools.BUTTONS;
+	var ttButtonBase = {
+		sButtonText: null,
+		editor:      null,
+		formTitle:   null
+	};
+
+	ttButtons.editor_create = $.extend( true, ttButtons.text, ttButtonBase, {
+		formButtons: [ {
+			label: null,
+			fn: function (e) { this.submit(); }
+		} ],
+
+		fnClick: function( button, config ) {
+			var editor = config.editor;
+			var i18nCreate = editor.i18n.create;
+			var buttons = config.formButtons;
+
+			if ( ! buttons[0].label ) {
+				buttons[0].label = i18nCreate.submit;
+			}
+
+			editor.create( {
+				title: i18nCreate.title,
+				buttons: buttons
+			} );
+		}
+	} );
+
+
+	ttButtons.editor_edit = $.extend( true, ttButtons.select_single, ttButtonBase, {
+		formButtons: [ {
+			label: null,
+			fn: function (e) { this.submit(); }
+		} ],
+
+		fnClick: function( button, config ) {
+			var selected = this.fnGetSelectedIndexes();
+			if ( selected.length !== 1 ) {
+				return;
+			}
+
+			var editor = config.editor;
+			var i18nEdit = editor.i18n.edit;
+			var buttons = config.formButtons;
+
+			if ( ! buttons[0].label ) {
+				buttons[0].label = i18nEdit.submit;
+			}
+
+			editor.edit( selected[0], {
+				title: i18nEdit.title,
+				buttons: buttons
+			} );
+		}
+	} );
+
+
+	ttButtons.editor_remove = $.extend( true, ttButtons.select, ttButtonBase, {
+		question: null,
+
+		formButtons: [
+			{
+				label: null,
+				fn: function (e) {
+					// Executed in the Form instance's scope
+					var that = this;
+					this.submit( function ( json ) {
+						var tt = $.fn.dataTable.TableTools.fnGetInstance(
+							$(that.s.table).DataTable().table().node()
+						);
+						tt.fnSelectNone();
+					} );
+				}
+			}
+		],
+
+		fnClick: function( button, config ) {
+			var rows = this.fnGetSelectedIndexes();
+			if ( rows.length === 0 ) {
+				return;
+			}
+
+			var editor = config.editor;
+			var i18nRemove = editor.i18n.remove;
+			var buttons = config.formButtons;
+			var question = typeof i18nRemove.confirm === 'string' ?
+				i18nRemove.confirm :
+				i18nRemove.confirm[rows.length] ?
+					i18nRemove.confirm[rows.length] : i18nRemove.confirm._;
+
+			if ( ! buttons[0].label ) {
+				buttons[0].label = i18nRemove.submit;
+			}
+
+			editor.remove( rows, {
+				message: question.replace( /%d/g, rows.length ),
+				title: i18nRemove.title,
+				buttons: buttons
+			} );
+		}
+	} );
+}
+
+
+$.extend( DataTable.ext.buttons, {
+	create: {
+		text: function ( dt, node, config ) {
+			return dt.i18n( 'buttons.create', config.editor.i18n.create.button );
+		},
+		className: 'buttons-create',
+		editor: null,
+		formButtons: {
+			label: function ( editor ) {
+				return editor.i18n.create.submit;
+			},
+			fn: function (e) {
+				this.submit();
+			}
+		},
+		formMessage: null,
+		formTitle: null,
+		action: function( e, dt, node, config ) {
+			var editor = config.editor;
+			var buttons = config.formButtons;
+
+			editor.create( {
+				buttons: config.formButtons,
+				message: config.formMessage,
+				title:   config.formTitle || editor.i18n.create.title
+			} );
+		}
+	},
+
+	edit: {
+		extend: 'selected',
+		text: function ( dt, node, config ) {
+			return dt.i18n( 'buttons.edit', config.editor.i18n.edit.button );
+		},
+		className: 'buttons-edit',
+		editor: null,
+		formButtons: {
+			label: function ( editor ) {
+				return editor.i18n.edit.submit;
+			},
+			fn: function (e) {
+				this.submit();
+			}
+		},
+		formMessage: null,
+		formTitle: null,
+		action: function( e, dt, node, config ) {
+			var editor = config.editor;
+			var rows = dt.rows( { selected: true } ).indexes();
+			var columns = dt.columns( { selected: true } ).indexes();
+			var cells = dt.cells( { selected: true } ).indexes();
+
+			var items = columns.length || cells.length ?
+				{
+					rows: rows,
+					columns: columns,
+					cells: cells
+				} :
+				rows;
+
+			editor.edit( items, {
+				message: config.formMessage,
+				buttons: config.formButtons,
+				title:   config.formTitle || editor.i18n.edit.title
+			} );
+		}
+	},
+
+	remove: {
+		extend: 'selected',
+		text: function ( dt, node, config ) {
+			return dt.i18n( 'buttons.remove', config.editor.i18n.remove.button );
+		},
+		className: 'buttons-remove',
+		editor: null,
+		formButtons: {
+			label: function ( editor ) {
+				return editor.i18n.remove.submit;
+			},
+			fn: function (e) {
+				this.submit();
+			}
+		},
+		formMessage: function ( editor, dt ) {
+			var rows = dt.rows( { selected: true } ).indexes();
+			var i18n = editor.i18n.remove;
+			var question = typeof i18n.confirm === 'string' ?
+				i18n.confirm :
+				i18n.confirm[rows.length] ?
+					i18n.confirm[rows.length] : i18n.confirm._;
+
+			return question.replace( /%d/g, rows.length );
+		},
+		formTitle: null,
+		action: function( e, dt, node, config ) {
+			var editor = config.editor;
+
+			editor.remove( dt.rows( { selected: true } ).indexes(), {
+				buttons: config.formButtons,
+				message: config.formMessage,
+				title:   config.formTitle || editor.i18n.remove.title
+			} );
+		}
+	}
+} );
+
+/**
+ * Field types array - this can be used to add field types or modify the pre-
+ * defined options. See the online Editor documentation for information about
+ * the built in field types.
+ *
+ * Note that we use a DataTables ext object to allow plug-ins to be loaded
+ * before Editor itself. This is useful for the online DataTables download
+ * builder.
+ *
+ *  @namespace
+ */
+Editor.fieldTypes = {};
+/*
+ * This file provides a DateTime GUI picker (calender and time input). Only the
+ * format YYYY-MM-DD is supported without additional software, but the end user
+ * experience can be greatly enhanced by including the momentjs library which
+ * provides date / time parsing and formatting options.
+ *
+ * This functionality is required because the HTML5 date and datetime input
+ * types are not widely supported in desktop browsers.
+ *
+ * Constructed by using:
+ *
+ *     new Editor.DateTime( input, opts )
+ *
+ * where `input` is the HTML input element to use and `opts` is an object of
+ * options based on the `Editor.DateTime.defaults` object.
+ */
+
+Editor.DateTime = function ( input, opts ) {
+	this.c = $.extend( true, {}, Editor.DateTime.defaults, opts );
+	var classPrefix = this.c.classPrefix;
+	var i18n = this.c.i18n;
+
+	// Only IS8601 dates are supported without moment
+	if ( ! window.moment && this.c.format !== 'YYYY-MM-DD' ) {
+		throw "Editor datetime: Without momentjs only the format 'YYYY-MM-DD' can be used";
+	}
+
+	var timeBlock = function ( type ) {
+		return '<div class="'+classPrefix+'-timeblock">'+
+				'<div class="'+classPrefix+'-iconUp">'+
+					'<button>'+i18n.previous+'</button>'+
+				'</div>'+
+				'<div class="'+classPrefix+'-label">'+
+					'<span/>'+
+					'<select class="'+classPrefix+'-'+type+'"/>'+
+				'</div>'+
+				'<div class="'+classPrefix+'-iconDown">'+
+					'<button>'+i18n.next+'</button>'+
+				'</div>'+
+			'</div>';
+	};
+
+	var gap = function () {
+		return '<span>:</span>';
+	};
+
+	// DOM structure
+	var structure = $(
+		'<div class="'+classPrefix+'">'+
+			'<div class="'+classPrefix+'-date">'+
+				'<div class="'+classPrefix+'-title">'+
+					'<div class="'+classPrefix+'-iconLeft">'+
+						'<button>'+i18n.previous+'</button>'+
+					'</div>'+
+					'<div class="'+classPrefix+'-iconRight">'+
+						'<button>'+i18n.next+'</button>'+
+					'</div>'+
+					'<div class="'+classPrefix+'-label">'+
+						'<span/>'+
+						'<select class="'+classPrefix+'-month"/>'+
+					'</div>'+
+					'<div class="'+classPrefix+'-label">'+
+						'<span/>'+
+						'<select class="'+classPrefix+'-year"/>'+
+					'</div>'+
+				'</div>'+
+				'<div class="'+classPrefix+'-calendar"/>'+
+			'</div>'+
+			'<div class="'+classPrefix+'-time">'+
+				timeBlock( 'hours' )+
+				gap()+
+				timeBlock( 'minutes' )+
+				gap()+
+				timeBlock( 'seconds' )+
+				timeBlock( 'ampm' )+
+			'</div>'+
+		'</div>'
+	);
+
+	this.dom = {
+		container: structure,
+		date:      structure.find( '.'+classPrefix+'-date' ),
+		title:     structure.find( '.'+classPrefix+'-title' ),
+		calendar:  structure.find( '.'+classPrefix+'-calendar' ),
+		time:      structure.find( '.'+classPrefix+'-time' ),
+		input:     $(input)
+	};
+
+	this.s = {
+		/** @type {Date} Date value that the picker has currently selected */
+		d: null,
+
+		/** @type {Date} Date of the calender - might not match the value */
+		display: null,
+
+		/** @type {String} Unique namespace string for this instance */
+		namespace: 'editor-dateime-'+(Editor.DateTime._instance++),
+
+		/** @type {Object} Parts of the picker that should be shown */
+		parts: {
+			date:    this.c.format.match( /[YMD]/ ) !== null,
+			time:    this.c.format.match( /[Hhm]/ ) !== null,
+			seconds: this.c.format.indexOf( 's' )   !== -1,
+			hours12: this.c.format.match( /[haA]/ ) !== null
+		}
+	};
+
+	this.dom.container
+		.append( this.dom.date )
+		.append( this.dom.time );
+
+	this.dom.date
+		.append( this.dom.title )
+		.append( this.dom.calendar );
+
+	this._constructor();
+};
+
+$.extend( Editor.DateTime.prototype, {
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public
+	 */
+	
+	/**
+	 * Destroy the control
+	 */
+	destroy: function () {
+		this._hide();
+		this.dom.container().off('').empty();
+		this.dom.input.off('.editor-datetime');
+	},
+
+	max: function ( date ) {
+		this.c.maxDate = date;
+
+		this._optionsTitle();
+		this._setCalander();
+	},
+
+	min: function ( date ) {
+		this.c.minDate = date;
+
+		this._optionsTitle();
+		this._setCalander();
+	},
+
+	/**
+	 * Check if an element belongs to this control
+	 *
+	 * @param  {node} node Element to check
+	 * @return {boolean}   true if owned by this control, false otherwise
+	 */
+	owns: function ( node ) {
+		return $(node).parents().filter( this.dom.container ).length > 0;
+	},
+
+	/**
+	 * Get / set the value
+	 *
+	 * @param  {string|Date} set   Value to set
+	 * @param  {boolean} [write=true] Flag to indicate if the formatted value
+	 *   should be written into the input element
+	 */
+	val: function ( set, write ) {
+		if ( set === undefined ) {
+			return this.s.d;
+		}
+
+		if ( set instanceof Date ) {
+			this.s.d = this._dateToUtc( set );
+		}
+		else if ( set === null || set === '' ) {
+			this.s.d = null;
+		}
+		else if ( typeof set === 'string' ) {
+			if ( window.moment ) {
+				// Use moment if possible (even for ISO8601 strings, since it
+				// will correctly handle 0000-00-00 and the like)
+				var m = window.moment.utc( set, this.c.format, this.c.momentLocale, this.c.momentStrict );
+				this.s.d = m.isValid() ? m.toDate() : null;
+			}
+			else {
+				// Else must be using ISO8601 without moment (constructor would
+				// have thrown an error otherwise)
+				var match = set.match(/(\d{4})\-(\d{2})\-(\d{2})/ );
+				this.s.d = match ?
+					new Date( Date.UTC(match[1], match[2]-1, match[3]) ) :
+					null;
+			}
+		}
+
+		if ( write || write === undefined ) {
+			if ( this.s.d ) {
+				this._writeOutput();
+			}
+			else {
+				// The input value was not valid...
+				this.dom.input.val( set );
+			}
+		}
+
+		// We need a date to be able to display the calendar at all
+		if ( ! this.s.d ) {
+			this.s.d = this._dateToUtc( new Date() );
+		}
+
+		this.s.display = new Date( this.s.d.toString() );
+
+		// Update the display elements for the new value
+		this._setTitle();
+		this._setCalander();
+		this._setTime();
+	},
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Constructor
+	 */
+	
+	/**
+	 * Build the control and assign initial event handlers
+	 *
+	 * @private
+	 */
+	_constructor: function () {
+		var that = this;
+		var classPrefix = this.c.classPrefix;
+		var container = this.dom.container;
+		var i18n = this.c.i18n;
+
+		if ( ! this.s.parts.date ) {
+			this.dom.date.css( 'display', 'none' );
+		}
+
+		if ( ! this.s.parts.time ) {
+			this.dom.time.css( 'display', 'none' );
+		}
+
+		if ( ! this.s.parts.seconds ) {
+			this.dom.time.children('div.editor-datetime-timeblock').eq(2).remove();
+			this.dom.time.children('span').eq(1).remove();
+		}
+
+		if ( ! this.s.parts.hours12 ) {
+			this.dom.time.children('div.editor-datetime-timeblock').last().remove();
+		}
+
+		// Render the options
+		this._optionsTitle();
+		this._optionsTime( 'hours', this.s.parts.hours12 ? 12 : 24, 1 );
+		this._optionsTime( 'minutes', 60, this.c.minutesIncrement );
+		this._optionsTime( 'seconds', 60, this.c.secondsIncrement );
+		this._options( 'ampm', [ 'am', 'pm' ], i18n.amPm );
+
+		// Trigger the display of the widget when clicking or focusing on the
+		// input element
+		this.dom.input
+			.on('focus.editor-datetime click.editor-datetime', function () {
+				// If already visible - don't do anything
+				if ( that.dom.container.is(':visible') || that.dom.input.is(':disabled') ) {
+					return;
+				}
+
+				// In case the value has changed by text
+				that.val( that.dom.input.val(), false );
+
+				that._show();
+			} )
+			.on('keyup.editor-datetime', function () {
+				// Update the calender's displayed value as the user types
+				if ( that.dom.container.is(':visible') ) {
+					that.val( that.dom.input.val(), false );
+				}
+			} );
+
+		// Main event handlers for input in the widget
+		this.dom.container
+			.on( 'change', 'select', function () {
+				var select = $(this);
+				var val = select.val();
+
+				if ( select.hasClass(classPrefix+'-month') ) {
+					// Month select
+					that._correctMonth( that.s.display, val );
+					that._setTitle();
+					that._setCalander();
+				}
+				else if ( select.hasClass(classPrefix+'-year') ) {
+					// Year select
+					that.s.display.setUTCFullYear( val );
+					that._setTitle();
+					that._setCalander();
+				}
+				else if ( select.hasClass(classPrefix+'-hours') || select.hasClass(classPrefix+'-ampm') ) {
+					// Hours - need to take account of AM/PM input if present
+					if ( that.s.parts.hours12 ) {
+						var hours = $(that.dom.container).find('.'+classPrefix+'-hours').val() * 1;
+						var pm = $(that.dom.container).find('.'+classPrefix+'-ampm').val() === 'pm';
+
+						that.s.d.setUTCHours( hours === 12 && !pm ?
+							0 :
+							pm && hours !== 12 ?
+								hours + 12 :
+								hours
+						);
+					}
+					else {
+						that.s.d.setUTCHours( val );
+					}
+
+					that._setTime();
+					that._writeOutput( true );
+				}
+				else if ( select.hasClass(classPrefix+'-minutes') ) {
+					// Minutes select
+					that.s.d.setUTCMinutes( val );
+					that._setTime();
+					that._writeOutput( true );
+				}
+				else if ( select.hasClass(classPrefix+'-seconds') ) {
+					// Seconds select
+					that.s.d.setSeconds( val );
+					that._setTime();
+					that._writeOutput( true );
+				}
+
+				that.dom.input.focus();
+				that._position();
+			} )
+			.on( 'click', function (e) {
+				var nodeName = e.target.nodeName.toLowerCase();
+
+				if ( nodeName === 'select' ) {
+					return;
+				}
+
+				e.stopPropagation();
+
+				if ( nodeName === 'button' ) {
+					var button = $(e.target);
+					var parent = button.parent();
+					var select;
+
+					if ( parent.hasClass('disabled') ) {
+						return;
+					}
+
+					if ( parent.hasClass(classPrefix+'-iconLeft') ) {
+						// Previous month
+						that.s.display.setUTCMonth( that.s.display.getUTCMonth()-1 );
+						that._setTitle();
+						that._setCalander();
+
+						that.dom.input.focus();
+					}
+					else if ( parent.hasClass(classPrefix+'-iconRight') ) {
+						// Next month
+						that._correctMonth( that.s.display, that.s.display.getUTCMonth()+1 );
+						that._setTitle();
+						that._setCalander();
+
+						that.dom.input.focus();
+					}
+					else if ( parent.hasClass(classPrefix+'-iconUp') ) {
+						// Value increase - common to all time selects
+						select = parent.parent().find('select')[0];
+						select.selectedIndex = select.selectedIndex !== select.options.length - 1 ?
+							select.selectedIndex+1 :
+							0;
+						$(select).change();
+					}
+					else if ( parent.hasClass(classPrefix+'-iconDown') ) {
+						// Value decrease - common to all time selects
+						select = parent.parent().find('select')[0];
+						select.selectedIndex = select.selectedIndex === 0 ?
+							select.options.length - 1 :
+							select.selectedIndex-1;
+						$(select).change();
+					}
+					else {
+						// Calender click
+						if ( ! that.s.d ) {
+							that.s.d = that._dateToUtc( new Date() );
+						}
+
+						that.s.d.setUTCFullYear( button.data('year') );
+						that.s.d.setUTCMonth( button.data('month') );
+						that.s.d.setUTCDate( button.data('day') );
+
+						that._writeOutput( true );
+
+						// This is annoying but IE has some kind of async
+						// behaviour with focus and the focus from the above
+						// write would occur after this hide - resulting in the
+						// calender opening immediately
+						setTimeout( function () {
+							that._hide();
+						}, 10 );
+					}
+				}
+				else {
+					// Click anywhere else in the widget - return focus to the
+					// input element
+					that.dom.input.focus();
+				}
+			} );
+	},
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private
+	 */
+
+	/**
+	 * Compare the date part only of two dates - this is made super easy by the
+	 * toDateString method!
+	 *
+	 * @param  {Date} a Date 1
+	 * @param  {Date} b Date 2
+	 * @private
+	 */
+	_compareDates: function( a, b ) {
+		// Can't use toDateString as that converts to local time
+		return this._dateToUtcString(a) === this._dateToUtcString(b);
+	},
+
+	/**
+	 * When changing month, take account of the fact that some months don't have
+	 * the same number of days. For example going from January to February you
+	 * can have the 31st of Jan selected and just add a month since the date
+	 * would still be 31, and thus drop you into March.
+	 *
+	 * @param  {Date} date  Date - will be modified
+	 * @param  {integer} month Month to set
+	 * @private
+	 */
+	_correctMonth: function ( date, month ) {
+		var days = this._daysInMonth( date.getUTCFullYear(), month );
+		var correctDays = date.getUTCDate() > days;
+
+		date.setUTCMonth( month );
+
+		if ( correctDays ) {
+			date.setUTCDate( days );
+			date.setUTCMonth( month );
+		}
+	},
+
+	/**
+	 * Get the number of days in a method. Based on
+	 * http://stackoverflow.com/a/4881951 by Matti Virkkunen
+	 *
+	 * @param  {integer} year  Year
+	 * @param  {integer} month Month (starting at 0)
+	 * @private
+	 */
+	_daysInMonth: function ( year, month ) {
+		// 
+		var isLeap = ((year % 4) === 0 && ((year % 100) !== 0 || (year % 400) === 0));
+		var months = [31, (isLeap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+		return months[month];
+	},
+
+	/**
+	 * Create a new date object which has the UTC values set to the local time.
+	 * This allows the local time to be used directly for the library which
+	 * always bases its calculations and display on UTC.
+	 *
+	 * @param  {Date} s Date to "convert"
+	 * @return {Date}   Shifted date
+	 */
+	_dateToUtc: function ( s ) {
+		return new Date( Date.UTC(
+			s.getFullYear(), s.getMonth(), s.getDate(),
+			s.getHours(), s.getMinutes(), s.getSeconds()
+		) );
+	},
+
+	/**
+	 * Create a UTC ISO8601 date part from a date object
+	 *
+	 * @param  {Date} d Date to "convert"
+	 * @return {string} ISO formatted date
+	 */
+	_dateToUtcString: function ( d ) {
+		return d.getUTCFullYear()+'-'+
+			this._pad(d.getUTCMonth()+1)+'-'+
+			this._pad(d.getUTCDate());
+	},
+
+	/**
+	 * Hide the control and remove events related to its display
+	 *
+	 * @private
+	 */
+	_hide: function () {
+		var namespace = this.s.namespace;
+
+		this.dom.container.detach();
+
+		$(window).off( '.'+namespace );
+		$(document).off( 'keydown.'+namespace );
+		$('div.DTE_Body_Content').off( 'scroll.'+namespace );
+		$('body').off( 'click.'+namespace );
+	},
+
+	/**
+	 * Convert a 24 hour value to a 12 hour value
+	 *
+	 * @param  {integer} val 24 hour value
+	 * @return {integer}     12 hour value
+	 * @private
+	 */
+	_hours24To12: function ( val ) {
+		return val === 0 ?
+			12 :
+			val > 12 ?
+				val - 12 :
+				val;
+	},
+
+	/**
+	 * Generate the HTML for a single day in the calender - this is basically
+	 * and HTML cell with a button that has data attributes so we know what was
+	 * clicked on (if it is clicked on) and a bunch of classes for styling.
+	 *
+	 * @param  {object} day Day object from the `_htmlMonth` method
+	 * @return {string}     HTML cell
+	 */
+	_htmlDay: function( day )
+	{
+		if ( day.empty ) {
+			return '<td class="empty"></td>';
+		}
+
+		var classes = [ 'day' ];
+		var classPrefix = this.c.classPrefix;
+
+		if ( day.disabled ) {
+			classes.push( 'disabled' );
+		}
+
+		if ( day.today ) {
+			classes.push( 'today' );
+		}
+
+		if ( day.selected ) {
+			classes.push( 'selected' );
+		}
+
+		return '<td data-day="' + day.day + '" class="' + classes.join(' ') + '">' +
+				'<button class="'+classPrefix+'-button '+classPrefix+'-day" type="button" ' +'data-year="' + day.year + '" data-month="' + day.month + '" data-day="' + day.day + '">' +
+						day.day +
+				'</button>' +
+			'</td>';
+	},
+
+
+	/**
+	 * Create the HTML for a month to be displayed in the calender table.
+	 * 
+	 * Based upon the logic used in Pikaday - MIT licensed
+	 * Copyright (c) 2014 David Bushell
+	 * https://github.com/dbushell/Pikaday
+	 *
+	 * @param  {integer} year  Year
+	 * @param  {integer} month Month (starting at 0)
+	 * @return {string} Calender month HTML
+	 * @private
+	 */
+	_htmlMonth: function ( year, month ) {
+		var now    = new Date(),
+			days   = this._daysInMonth( year, month ),
+			before = new Date( Date.UTC(year, month, 1) ).getUTCDay(),
+			data   = [],
+			row    = [];
+
+		if ( this.c.firstDay > 0 ) {
+			before -= this.c.firstDay;
+
+			if (before < 0) {
+				before += 7;
+			}
+		}
+
+		var cells = days + before,
+			after = cells;
+
+		while ( after > 7 ) {
+			after -= 7;
+		}
+
+		cells += 7 - after;
+
+		var minDate = this.c.minDate;
+		var maxDate = this.c.maxDate;
+
+		if ( minDate ) {
+			minDate.setUTCHours(0);
+			minDate.setUTCMinutes(0);
+			minDate.setSeconds(0);
+		}
+
+		if ( maxDate ) {
+			maxDate.setUTCHours(23);
+			maxDate.setUTCMinutes(59);
+			maxDate.setSeconds(59);
+		}
+
+		for ( var i=0, r=0 ; i<cells ; i++ ) {
+			var day      = new Date( Date.UTC(year, month, 1 + (i - before)) ),
+				selected = this.s.d ? this._compareDates(day, this.s.d) : false,
+				today    = this._compareDates(day, now),
+				empty    = i < before || i >= (days + before),
+				disabled = (minDate && day < minDate) ||
+				           (maxDate && day > maxDate);
+
+			var disableDays = this.c.disableDays;
+			if ( $.isArray( disableDays ) && $.inArray( day.getUTCDay(), disableDays ) !== -1 ) {
+				disabled = true;
+			}
+			else if ( typeof disableDays === 'function' && disableDays( day ) === true ) {
+				disabled = true;
+			}
+
+			var dayConfig = {
+				day:      1 + (i - before),
+				month:    month,
+				year:     year,
+				selected: selected,
+				today:    today,
+				disabled: disabled,
+				empty:    empty
+			};
+
+			row.push( this._htmlDay(dayConfig) );
+
+			if ( ++r === 7 ) {
+				if ( this.c.showWeekNumber ) {
+					row.unshift( this._htmlWeekOfYear(i - before, month, year) );
+				}
+
+				data.push( '<tr>'+row.join('')+'</tr>' );
+				row = [];
+				r = 0;
+			}
+		}
+
+		var className = this.c.classPrefix+'-table';
+		if ( this.c.showWeekNumber ) {
+			className += ' weekNumber';
+		}
+
+		return '<table class="'+className+'">' +
+				'<thead>'+
+					this._htmlMonthHead() +
+				'</thead>'+
+				'<tbody>'+
+					data.join('') +
+				'</tbody>'+
+			'</table>';
+	},
+
+	/**
+	 * Create the calender table's header (week days)
+	 *
+	 * @return {string} HTML cells for the row
+	 * @private
+	 */
+	_htmlMonthHead: function () {
+		var a = [];
+		var firstDay = this.c.firstDay;
+		var i18n = this.c.i18n;
+
+		// Take account of the first day shift
+		var dayName = function ( day ) {
+			day += firstDay;
+
+			while (day >= 7) {
+				day -= 7;
+			}
+
+			return i18n.weekdays[day];
+		};
+		
+		// Empty cell in the header
+		if ( this.c.showWeekNumber ) {
+			a.push( '<th></th>' );
+		}
+
+		for ( var i=0 ; i<7 ; i++ ) {
+			a.push( '<th>'+dayName( i )+'</th>' );
+		}
+
+		return a.join('');
+	},
+
+	/**
+	 * Create a cell that contains week of the year - ISO style
+	 *
+	 * Based on http://javascript.about.com/library/blweekyear.htm
+	 *
+	 * @param  {integer} d Day of month
+	 * @param  {integer} m Month of year (zero index)
+	 * @param  {integer} y Year
+	 * @return {string}   
+	 * @private
+	 */
+	_htmlWeekOfYear: function ( d, m, y ) {
+		var onejan = new Date(y, 0, 1),
+			weekNum = Math.ceil((((new Date(y, m, d) - onejan) / 86400000) + onejan.getUTCDay()+1)/7);
+
+		return '<td class="'+this.c.classPrefix+'-week">' + weekNum + '</td>';
+	},
+
+	/**
+	 * Create option elements from a range in an array
+	 *
+	 * @param  {string} selector Class name unique to the select element to use
+	 * @param  {array} values   Array of values
+	 * @param  {array} [labels] Array of labels. If given must be the same
+	 *   length as the values parameter.
+	 * @private
+	 */
+	_options: function ( selector, values, labels ) {
+		if ( ! labels ) {
+			labels = values;
+		}
+
+		var select = this.dom.container.find('select.'+this.c.classPrefix+'-'+selector);
+		select.empty();
+
+		for ( var i=0, ien=values.length ; i<ien ; i++ ) {
+			select.append( '<option value="'+values[i]+'">'+labels[i]+'</option>' );
+		}
+	},
+
+	/**
+	 * Set an option and update the option's span pair (since the select element
+	 * has opacity 0 for styling)
+	 *
+	 * @param  {string} selector Class name unique to the select element to use
+	 * @param  {*}      val      Value to set
+	 * @private
+	 */
+	_optionSet: function ( selector, val ) {
+		var select = this.dom.container.find('select.'+this.c.classPrefix+'-'+selector);
+		var span = select.parent().children('span');
+
+		select.val( val );
+
+		var selected = select.find('option:selected');
+		span.html( selected.length !== 0 ?
+			selected.text() :
+			this.c.i18n.unknown
+		);
+	},
+
+	/**
+	 * Create time option list. Can't just use `_options` for the time as the
+	 * hours can be a little complex and we want to be able to control the
+	 * increment option for the minutes and seconds.
+	 *
+	 * @param  {jQuery} select Select element to operate on
+	 * @param  {integer} count  Value to loop to
+	 * @param  {integer} inc    Increment value
+	 * @private
+	 */
+	_optionsTime: function ( select, count, inc ) {
+		var classPrefix = this.c.classPrefix;
+		var sel = this.dom.container.find('select.'+classPrefix+'-'+select);
+		var start=0, end=count;
+		var render = count === 12 ?
+			function (i) { return i; } :
+			this._pad;
+
+		if ( count === 12 ) {
+			start = 1;
+			end = 13;
+		}
+
+		for ( var i=start ; i<end ; i+=inc ) {
+			sel.append( '<option value="'+i+'">'+render(i)+'</option>' );
+		}
+	},
+
+	/**
+	 * Create the options for the month and year
+	 *
+	 * @param  {integer} year  Year
+	 * @param  {integer} month Month (starting at 0)
+	 * @private
+	 */
+	_optionsTitle: function ( year, month ) {
+		var classPrefix = this.c.classPrefix;
+		var i18n = this.c.i18n;
+		var min = this.c.minDate;
+		var max = this.c.maxDate;
+		var minYear = min ? min.getFullYear() : null;
+		var maxYear = max ? max.getFullYear() : null;
+
+		var i = minYear !== null ? minYear : new Date().getFullYear() - this.c.yearRange;
+		var j = maxYear !== null ? maxYear : new Date().getFullYear() + this.c.yearRange;
+
+		this._options( 'month', this._range( 0, 11 ), i18n.months );
+		this._options( 'year', this._range( i, j ) );
+	},
+
+	/**
+	 * Simple two digit pad
+	 *
+	 * @param  {integer} i      Value that might need padding
+	 * @return {string|integer} Padded value
+	 * @private
+	 */
+	_pad: function ( i ) {
+		return i<10 ? '0'+i : i;
+	},
+
+	/**
+	 * Position the calender to look attached to the input element
+	 * @private
+	 */
+	_position: function () {
+		var offset = this.dom.input.offset();
+		var container = this.dom.container;
+		var inputHeight = this.dom.input.outerHeight();
+
+		container
+			.css( {
+				top: offset.top + inputHeight,
+				left: offset.left
+			} )
+			.appendTo( 'body' );
+
+		var calHeight = container.outerHeight();
+		var scrollTop = $('body').scrollTop();
+
+		if ( offset.top + inputHeight + calHeight - scrollTop > $(window).height() ) {
+			var newTop = offset.top - calHeight;
+
+			container.css( 'top', newTop < 0 ? 0 : newTop );
+		}
+	},
+
+	/**
+	 * Create a simple array with a range of values
+	 *
+	 * @param  {integer} start Start value (inclusive)
+	 * @param  {integer} end   End value (inclusive)
+	 * @return {array}         Created array
+	 * @private
+	 */
+	_range: function ( start, end ) {
+		var a = [];
+
+		for ( var i=start ; i<=end ; i++ ) {
+			a.push( i );
+		}
+
+		return a;
+	},
+
+	/**
+	 * Redraw the calender based on the display date - this is a destructive
+	 * operation
+	 *
+	 * @private
+	 */
+	_setCalander: function () {
+		this.dom.calendar
+			.empty()
+			.append( this._htmlMonth(
+				this.s.display.getUTCFullYear(),
+				this.s.display.getUTCMonth()
+			) );
+	},
+
+	/**
+	 * Set the month and year for the calender based on the current display date
+	 *
+	 * @private
+	 */
+	_setTitle: function () {
+		this._optionSet( 'month', this.s.display.getUTCMonth() );
+		this._optionSet( 'year', this.s.display.getUTCFullYear() );
+	},
+
+	/**
+	 * Set the time based on the current value of the widget
+	 *
+	 * @private
+	 */
+	_setTime: function () {
+		var d = this.s.d;
+		var hours = d ? d.getUTCHours() : 0;
+
+		if ( this.s.parts.hours12 ) {
+			this._optionSet( 'hours', this._hours24To12( hours ) );
+			this._optionSet( 'ampm', hours < 12 ? 'am' : 'pm' );
+		}
+		else {
+			this._optionSet( 'hours', hours );
+		}
+
+		this._optionSet( 'minutes', d ? d.getUTCMinutes() : 0 );
+		this._optionSet( 'seconds', d ? d.getSeconds() : 0 );
+	},
+
+	/**
+	 * Show the widget and add events to the document required only while it
+	 * is displayed
+	 * 
+	 * @private
+	 */
+	_show: function () {
+		var that = this;
+		var namespace = this.s.namespace;
+
+		this._position();
+
+		// Need to reposition on scroll
+		$(window).on( 'scroll.'+namespace+' resize.'+namespace, function () {
+			that._position();
+		} );
+
+		$('div.DTE_Body_Content').on( 'scroll.'+namespace, function () {
+			that._position();
+		} );
+
+		// On tab focus will move to a different field (no keyboard navigation
+		// in the date picker - this might need to be changed).
+		// On esc the Editor might close. Even if it doesn't the date picker
+		// should
+		$(document).on( 'keydown.'+namespace, function (e) {
+			if (
+				e.keyCode === 9  || // tab
+				e.keyCode === 27 || // esc
+				e.keyCode === 13    // return
+			) {
+				that._hide();
+			}
+		} );
+
+		// Hide if clicking outside of the widget - but in a different click
+		// event from the one that was used to trigger the show (bubble and
+		// inline)
+		setTimeout( function () {
+			$('body').on( 'click.'+namespace, function (e) {
+				var parents = $(e.target).parents();
+
+				if ( ! parents.filter( that.dom.container ).length && e.target !== that.dom.input[0] ) {
+					that._hide();
+				}
+			} );
+		}, 10 );
+	},
+
+	/**
+	 * Write the formatted string to the input element this control is attached
+	 * to
+	 *
+	 * @private
+	 */
+	_writeOutput: function ( focus ) {
+		var date = this.s.d;
+
+		// Use moment if possible - otherwise it must be ISO8601 (or the
+		// constructor would have thrown an error)
+		var out = window.moment ?
+			window.moment.utc( date, undefined, this.c.momentLocale, this.c.momentStrict ).format( this.c.format ) :
+			date.getUTCFullYear() +'-'+
+	            this._pad(date.getUTCMonth() + 1) +'-'+
+	            this._pad(date.getUTCDate());
+		
+		this.dom.input.val( out );
+
+		if ( focus ) {
+			this.dom.input.focus();
+		}
+	}
+} );
+
+
+/**
+ * For generating unique namespaces
+ *
+ * @type {Number}
+ * @private
+ */
+Editor.DateTime._instance = 0;
+
+/**
+ * Defaults for the date time picker
+ *
+ * @type {Object}
+ */
+Editor.DateTime.defaults = {
+	// Not documented - could be an internal property
+	classPrefix: 'editor-datetime',
+
+	// function or array of ints
+	disableDays: null,
+
+	// first day of the week (0: Sunday, 1: Monday, etc)
+	firstDay: 1,
+
+	format: 'YYYY-MM-DD',
+
+	// Not documented as i18n is done by the Editor.defaults.i18n obj
+	i18n: Editor.defaults.i18n.datetime,
+
+	maxDate: null,
+
+	minDate: null,
+
+	minutesIncrement: 1,
+
+	momentStrict: true,
+
+	momentLocale: 'en',
+
+	secondsIncrement: 1,
+
+	// show the ISO week number at the head of the row
+	showWeekNumber: false,
+
+	// overruled by max / min date
+	yearRange: 10
+};
+
+
+
+(function() {
+
+var fieldTypes = Editor.fieldTypes;
+
+// Upload private helper method
+function _buttonText ( conf, text )
+{
+	if ( text === null || text === undefined ) {
+		text = conf.uploadText || "Choose file...";
+	}
+
+	conf._input.find('div.upload button').html( text );
+}
+
+function _commonUpload ( editor, conf, dropCallback )
+{
+	var btnClass = editor.classes.form.button;
+	var container = $(
+		'<div class="editor_upload">'+
+			'<div class="eu_table">'+
+				'<div class="row">'+
+					'<div class="cell upload">'+
+						'<button class="'+btnClass+'" />'+
+						'<input type="file"/>'+
+					'</div>'+
+					'<div class="cell clearValue">'+
+						'<button class="'+btnClass+'" />'+
+					'</div>'+
+				'</div>'+
+				'<div class="row second">'+
+					'<div class="cell">'+
+						'<div class="drop"><span/></div>'+
+					'</div>'+
+					'<div class="cell">'+
+						'<div class="rendered"/>'+
+					'</div>'+
+				'</div>'+
+			'</div>'+
+		'</div>'
+	);
+
+	conf._input = container;
+	conf._enabled = true;
+
+	_buttonText( conf );
+
+	if ( window.FileReader && conf.dragDrop !== false ) {
+		container.find('div.drop span').text(
+			conf.dragDropText || "Drag and drop a file here to upload"
+		);
+
+		var dragDrop = container.find('div.drop');
+		dragDrop
+			.on( 'drop', function (e) {
+				if ( conf._enabled ) {
+					Editor.upload( editor, conf, e.originalEvent.dataTransfer.files, _buttonText, dropCallback );
+					dragDrop.removeClass('over');
+				}
+				return false;
+			} )
+			.on( 'dragleave dragexit', function (e) {
+				if ( conf._enabled ) {
+					dragDrop.removeClass('over');
+				}
+				return false;
+			} )
+			.on( 'dragover', function (e) {
+				if ( conf._enabled ) {
+					dragDrop.addClass('over');
+				}
+				return false;
+			} );
+
+		// When an Editor is open with a file upload input there is a
+		// reasonable chance that the user will miss the drop point when
+		// dragging and dropping. Rather than loading the file in the browser,
+		// we want nothing to happen, otherwise the form will be lost.
+		editor
+			.on( 'open', function () {
+				$('body').on( 'dragover.DTE_Upload drop.DTE_Upload', function (e) {
+					return false;
+				} );
+			} )
+			.on( 'close', function () {
+				$('body').off( 'dragover.DTE_Upload drop.DTE_Upload' );
+			} );
+	}
+	else {
+		container.addClass( 'noDrop' );
+		container.append( container.find('div.rendered') );
+	}
+
+	container.find('div.clearValue button').on( 'click', function () {
+		Editor.fieldTypes.upload.set.call( editor, conf, '' );
+	} );
+
+	container.find('input[type=file]').on('change', function () {
+		Editor.upload( editor, conf, this.files, _buttonText, function (ids) {
+			dropCallback.call( editor, ids );
+
+			// Clear the value so change will happen on the next file select,
+			// even if it is the same file
+			container.find('input[type=file]').val('');
+		} );
+	} );
+
+	return container;
+}
+
+// Typically a change event caused by the end user will be added to a queue that
+// the browser will handle when no other script is running. However, using
+// `$().trigger()` will cause it to happen immediately, so in order to simulate
+// the standard browser behaviour we use setTimeout. This also means that
+// `dependent()` and other change event listeners will trigger when the field
+// values have all been set, rather than as they are being set - 31594
+function _triggerChange ( input ) {
+	setTimeout( function () {
+		input.trigger( 'change', {editor: true, editorSet: true} ); // editorSet legacy
+	}, 0 );
+}
+
+
+// A number of the fields in this file use the same get, set, enable and disable
+// methods (specifically the text based controls), so in order to reduce the code
+// size, we just define them once here in our own local base model for the field
+// types.
+var baseFieldType = $.extend( true, {}, Editor.models.fieldType, {
+	get: function ( conf ) {
+		return conf._input.val();
+	},
+
+	set: function ( conf, val ) {
+		conf._input.val( val );
+		_triggerChange( conf._input );
+	},
+
+	enable: function ( conf ) {
+		conf._input.prop( 'disabled', false );
+	},
+
+	disable: function ( conf ) {
+		conf._input.prop( 'disabled', true );
+	}
+} );
+
+
+
+fieldTypes.hidden = {
+	create: function ( conf ) {
+		conf._val = conf.value;
+		return null;
+	},
+
+	get: function ( conf ) {
+		return conf._val;
+	},
+
+	set: function ( conf, val ) {
+		conf._val = val;
+	}
+};
+
+
+fieldTypes.readonly = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<input/>').attr( $.extend( {
+			id: Editor.safeId( conf.id ),
+			type: 'text',
+			readonly: 'readonly'
+		}, conf.attr || {} ) );
+
+		return conf._input[0];
+	}
+} );
+
+
+fieldTypes.text = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<input/>').attr( $.extend( {
+			id: Editor.safeId( conf.id ),
+			type: 'text'
+		}, conf.attr || {} ) );
+
+		return conf._input[0];
+	}
+} );
+
+
+fieldTypes.password = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<input/>').attr( $.extend( {
+			id: Editor.safeId( conf.id ),
+			type: 'password'
+		}, conf.attr || {} ) );
+
+		return conf._input[0];
+	}
+} );
+
+fieldTypes.textarea = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<textarea/>').attr( $.extend( {
+			id: Editor.safeId( conf.id )
+		}, conf.attr || {} ) );
+		return conf._input[0];
+	}
+} );
+
+
+fieldTypes.select = $.extend( true, {}, baseFieldType, {
+	// Locally "private" function that can be reused for the create and update methods
+	_addOptions: function ( conf, opts ) {
+		var elOpts = conf._input[0].options;
+		var countOffset = 0;
+
+		elOpts.length = 0;
+
+		if ( conf.placeholder !== undefined ) {
+			countOffset += 1;
+			elOpts[0] = new Option( conf.placeholder, conf.placeholderValue !== undefined ?
+				conf.placeholderValue :
+				''
+			);
+
+			var disabled = conf.placeholderDisabled !== undefined ?
+				conf.placeholderDisabled :
+				true;
+
+			elOpts[0].hidden = disabled; // can't be hidden if not disabled!
+			elOpts[0].disabled = disabled;
+		}
+
+		if ( opts ) {
+			Editor.pairs( opts, conf.optionsPair, function ( val, label, i ) {
+				elOpts[ i+countOffset ] = new Option( label, val );
+				elOpts[ i+countOffset ]._editor_val = val;
+			} );
+		}
+	},
+
+	create: function ( conf ) {
+		conf._input = $('<select/>')
+			.attr( $.extend( {
+				id: Editor.safeId( conf.id ),
+				multiple: conf.multiple === true
+			}, conf.attr || {} ) )
+			.on( 'change.dte', function (e, d) {
+				// On change, get the user selected value and store it as the
+				// last set, so `update` can reflect it. This way `_lastSet`
+				// always gives the intended value, be it set via the API or by
+				// the end user.
+				if ( ! d || ! d.editor ) {
+					conf._lastSet = fieldTypes.select.get( conf );
+				}
+			} );
+
+		fieldTypes.select._addOptions( conf, conf.options || conf.ipOpts );
+
+		return conf._input[0];
+	},
+
+	update: function ( conf, options ) {
+		fieldTypes.select._addOptions( conf, options );
+
+		// Attempt to set the last selected value (set by the API or the end
+		// user, they get equal priority)
+		var lastSet = conf._lastSet;
+
+		if ( lastSet !== undefined ) {
+			fieldTypes.select.set( conf, lastSet, true );
+		}
+
+		_triggerChange( conf._input );
+	},
+
+	get: function ( conf ) {
+		var val = conf._input.find('option:selected').map( function () {
+			return this._editor_val;
+		} ).toArray();
+
+		if ( conf.multiple ) {
+			return conf.separator ?
+				val.join( conf.separator ) :
+				val;
+		}
+
+		return val.length ? val[0] : null;
+	},
+
+	set: function ( conf, val, localUpdate ) {
+		if ( ! localUpdate ) {
+			conf._lastSet = val;
+		}
+
+		// Can't just use `$().val()` because it won't work with strong types
+		if ( conf.multiple && conf.separator && ! $.isArray( val ) ) {
+			val = val.split( conf.separator );
+		}
+		else if ( ! $.isArray( val ) ) {
+			val = [ val ];
+		}
+
+		var i, len=val.length, found, allFound = false;
+		var options = conf._input.find('option');
+
+		conf._input.find('option').each( function () {
+			found = false;
+
+			for ( i=0 ; i<len ; i++ ) {
+				// Weak typing
+				if ( this._editor_val == val[i] ) {
+					found = true;
+					allFound = true;
+					break;
+				}
+			}
+
+			this.selected = found;
+		} );
+
+		// If there is a placeholder, we might need to select it if nothing else
+		// was selected. It doesn't make sense to select when multi is enabled
+		if ( conf.placeholder && ! allFound && ! conf.multiple && options.length ) {
+			options[0].selected = true;
+		}
+
+		// Update will call change itself, otherwise multiple might be called
+		if ( ! localUpdate ) {
+			_triggerChange( conf._input );
+		}
+
+		return allFound;
+	},
+
+	destroy: function ( conf ) {
+		conf._input.off( 'change.dte' );
+	}
+} );
+
+
+fieldTypes.checkbox = $.extend( true, {}, baseFieldType, {
+	// Locally "private" function that can be reused for the create and update methods
+	_addOptions: function ( conf, opts ) {
+		var val, label;
+		var elOpts = conf._input[0].options;
+		var jqInput = conf._input.empty();
+
+		if ( opts ) {
+			Editor.pairs( opts, conf.optionsPair, function ( val, label, i ) {
+				jqInput.append(
+					'<div>'+
+						'<input id="'+Editor.safeId( conf.id )+'_'+i+'" type="checkbox" />'+
+						'<label for="'+Editor.safeId( conf.id )+'_'+i+'">'+label+'</label>'+
+					'</div>'
+				);
+				$('input:last', jqInput).attr('value', val)[0]._editor_val = val;
+			} );
+		}
+	},
+
+
+	create: function ( conf ) {
+		conf._input = $('<div />');
+		fieldTypes.checkbox._addOptions( conf, conf.options || conf.ipOpts );
+
+		return conf._input[0];
+	},
+
+	get: function ( conf ) {
+		var out = [];
+		conf._input.find('input:checked').each( function () {
+			out.push( this._editor_val );
+		} );
+		return ! conf.separator ?
+			out :
+			out.length === 1 ?
+				out[0] :
+				out.join(conf.separator);
+	},
+
+	set: function ( conf, val ) {
+		var jqInputs = conf._input.find('input');
+		if ( ! $.isArray(val) && typeof val === 'string' ) {
+			val = val.split( conf.separator || '|' );
+		}
+		else if ( ! $.isArray(val) ) {
+			val = [ val ];
+		}
+
+		var i, len=val.length, found;
+
+		jqInputs.each( function () {
+			found = false;
+
+			for ( i=0 ; i<len ; i++ ) {
+				if ( this._editor_val == val[i] ) {
+					found = true;
+					break;
+				}
+			}
+
+			this.checked = found;
+		} );
+
+		_triggerChange( jqInputs );
+	},
+
+	enable: function ( conf ) {
+		conf._input.find('input').prop('disabled', false);
+	},
+
+	disable: function ( conf ) {
+		conf._input.find('input').prop('disabled', true);
+	},
+
+	update: function ( conf, options ) {
+		// Get the current value
+		var checkbox = fieldTypes.checkbox;
+		var currVal = checkbox.get( conf );
+
+		checkbox._addOptions( conf, options );
+		checkbox.set( conf, currVal );
+	}
+} );
+
+
+fieldTypes.radio = $.extend( true, {}, baseFieldType, {
+	// Locally "private" function that can be reused for the create and update methods
+	_addOptions: function ( conf, opts ) {
+		var val, label;
+		var elOpts = conf._input[0].options;
+		var jqInput = conf._input.empty();
+
+		if ( opts ) {
+			Editor.pairs( opts, conf.optionsPair, function ( val, label, i ) {
+				jqInput.append(
+					'<div>'+
+						'<input id="'+Editor.safeId( conf.id )+'_'+i+'" type="radio" name="'+conf.name+'" />'+
+						'<label for="'+Editor.safeId( conf.id )+'_'+i+'">'+label+'</label>'+
+					'</div>'
+				);
+				$('input:last', jqInput).attr('value', val)[0]._editor_val = val;
+			} );
+		}
+	},
+
+
+	create: function ( conf ) {
+		conf._input = $('<div />');
+		fieldTypes.radio._addOptions( conf, conf.options || conf.ipOpts );
+
+		// this is ugly, but IE6/7 has a problem with radio elements that are created
+		// and checked before being added to the DOM! Basically it doesn't check them. As
+		// such we use the _preChecked property to set cache the checked button and then
+		// check it again when the display is shown. This has no effect on other browsers
+		// other than to cook a few clock cycles.
+		this.on('open', function () {
+			conf._input.find('input').each( function () {
+				if ( this._preChecked ) {
+					this.checked = true;
+				}
+			} );
+		} );
+
+		return conf._input[0];
+	},
+
+	get: function ( conf ) {
+		var el = conf._input.find('input:checked');
+		return el.length ? el[0]._editor_val : undefined;
+	},
+
+	set: function ( conf, val ) {
+		var that  = this;
+
+		conf._input.find('input').each( function () {
+			this._preChecked = false;
+
+			if ( this._editor_val == val ) {
+				this.checked = true;
+				this._preChecked = true;
+			}
+			else {
+				// In a detached DOM tree, there is no relationship between the
+				// input elements, so we need to uncheck any element that does
+				// not match the value
+				this.checked = false;
+				this._preChecked = false;
+			}
+		} );
+
+		_triggerChange( conf._input.find('input:checked') );
+	},
+
+	enable: function ( conf ) {
+		conf._input.find('input').prop('disabled', false);
+	},
+
+	disable: function ( conf ) {
+		conf._input.find('input').prop('disabled', true);
+	},
+
+	update: function ( conf, options ) {
+		var radio = fieldTypes.radio;
+		var currVal = radio.get( conf );
+
+		radio._addOptions( conf, options );
+
+		// Select the current value if it exists in the new data set, otherwise
+		// select the first radio input so there is always a value selected
+		var inputs = conf._input.find('input');
+		radio.set( conf, inputs.filter('[value="'+currVal+'"]').length ?
+			currVal :
+			inputs.eq(0).attr('value')
+		);
+	}
+} );
+
+
+fieldTypes.date = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<input />').attr( $.extend( {
+			id: Editor.safeId( conf.id ),
+			type: 'text'
+		}, conf.attr ) );
+
+		if ( $.datepicker ) {
+			// jQuery UI date picker
+			conf._input.addClass( 'jqueryui' );
+
+			if ( ! conf.dateFormat ) {
+				conf.dateFormat = $.datepicker.RFC_2822;
+			}
+
+			if ( conf.dateImage === undefined ) {
+				conf.dateImage = "../../images/calender.png";
+			}
+
+			// Allow the element to be attached to the DOM
+			setTimeout( function () {
+				$( conf._input ).datepicker( $.extend( {
+					showOn: "both",
+					dateFormat: conf.dateFormat,
+					buttonImage: conf.dateImage,
+					buttonImageOnly: true
+				}, conf.opts ) );
+
+				$('#ui-datepicker-div').css('display','none');
+			}, 10 );
+		}
+		else {
+			// HTML5 (only Chrome and Edge on the desktop support this atm)
+			conf._input.attr( 'type', 'date' );
+		}
+
+		return conf._input[0];
+	},
+
+	// use default get method as will work for all
+
+	set: function ( conf, val ) {
+		if ( $.datepicker && conf._input.hasClass('hasDatepicker') ) {
+			// Due to the async init of the control it is possible that we might
+			// try to set a value before it has been initialised!
+			conf._input.datepicker( "setDate" , val ).change();
+		}
+		else {
+			$(conf._input).val( val );
+		}
+	},
+
+	enable: function ( conf ) {
+		$.datepicker ?
+			conf._input.datepicker( "enable" ) :
+			$(conf._input).prop( 'disabled', false );
+	},
+
+	disable: function ( conf ) {
+		$.datepicker ?
+			conf._input.datepicker( "disable" ) :
+			$(conf._input).prop( 'disabled', true );
+	},
+
+	owns: function ( conf, node ) {
+		return $(node).parents('div.ui-datepicker').length || $(node).parents('div.ui-datepicker-header').length ?
+			true :
+			false;
+	}
+} );
+
+
+fieldTypes.datetime = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		conf._input = $('<input />').attr( $.extend( true, {
+			id:   Editor.safeId( conf.id ),
+			type: 'text'
+		}, conf.attr ) );
+
+		conf._picker = new Editor.DateTime( conf._input, $.extend( {
+			format: conf.format, // can be undefined
+			i18n: this.i18n.datetime
+		}, conf.opts ) );
+
+		return conf._input[0];
+	},
+
+	// default get, disable and enable options are okay
+
+	set: function ( conf, val ) {
+		conf._picker.val( val );
+
+		_triggerChange( conf._input );
+	},
+
+	owns: function ( conf, node ) {
+		return conf._picker.owns( node );
+	},
+
+	destroy: function ( conf ) {
+		conf._picker.destroy();
+	},
+
+	minDate: function ( conf, min ) {
+		conf._picker.min( min );
+	},
+
+	maxDate: function ( conf, max ) {
+		conf._picker.max( max );
+	}
+} );
+
+
+fieldTypes.upload = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		var editor = this;
+		var container = _commonUpload( editor, conf, function ( val ) {
+			Editor.fieldTypes.upload.set.call( editor, conf, val[0] );
+		} );
+
+		return container;
+	},
+
+	get: function ( conf ) {
+		return conf._val;
+	},
+
+	set: function ( conf, val ) {
+		conf._val = val;
+
+		var container = conf._input;
+
+		if ( conf.display ) {
+			var rendered = container.find('div.rendered');
+
+			if ( conf._val ) {
+				rendered.html( conf.display( conf._val ) );
+			}
+			else {
+				rendered
+					.empty()
+					.append( '<span>'+( conf.noFileText || 'No file' )+'</span>' );
+			}
+		}
+
+		var button = container.find('div.clearValue button');
+		if ( val && conf.clearText ) {
+			button.html( conf.clearText );
+			container.removeClass( 'noClear' );
+		}
+		else {
+			container.addClass( 'noClear' );
+		}
+
+		conf._input.find('input').triggerHandler( 'upload.editor', [ conf._val ] );
+	},
+
+	enable: function ( conf ) {
+		conf._input.find('input').prop('disabled', false);
+		conf._enabled = true;
+	},
+
+	disable: function ( conf ) {
+		conf._input.find('input').prop('disabled', true);
+		conf._enabled = false;
+	}
+} );
+
+
+fieldTypes.uploadMany = $.extend( true, {}, baseFieldType, {
+	create: function ( conf ) {
+		var editor = this;
+		var container = _commonUpload( editor, conf, function ( val ) {
+			conf._val = conf._val.concat( val );
+			Editor.fieldTypes.uploadMany.set.call( editor, conf, conf._val );
+		} );
+
+		container
+			.addClass( 'multi' )
+			.on( 'click', 'button.remove', function (e) {
+				e.stopPropagation();
+
+				var idx = $(this).data('idx');
+
+				conf._val.splice( idx, 1 );
+				Editor.fieldTypes.uploadMany.set.call( editor, conf, conf._val );
+			} );
+
+		return container;
+	},
+
+	get: function ( conf ) {
+		return conf._val;
+	},
+
+	set: function ( conf, val ) {
+		// Default value for fields is an empty string, whereas we want []
+		if ( ! val ) {
+			val = [];
+		}
+
+		if ( ! $.isArray( val ) ) {
+			throw 'Upload collections must have an array as a value';
+		}
+
+		conf._val = val;
+
+		var that = this;
+		var container = conf._input;
+
+		if ( conf.display ) {
+			var rendered = container.find('div.rendered').empty();
+			
+			if ( val.length ) {
+				var list = $('<ul/>').appendTo( rendered );
+
+				$.each( val, function ( i, file ) {
+					list.append(
+						'<li>'+
+							conf.display( file, i )+
+							' <button class="'+that.classes.form.button+' remove" data-idx="'+i+'">&times;</button>'+
+						'</li>'
+					);
+				} );
+			}
+			else {
+				rendered.append( '<span>'+( conf.noFileText || 'No files' )+'</span>' );
+			}
+		}
+
+		conf._input.find('input').triggerHandler( 'upload.editor', [ conf._val ] );
+	},
+
+	enable: function ( conf ) {
+		conf._input.find('input').prop('disabled', false);
+		conf._enabled = true;
+	},
+
+	disable: function ( conf ) {
+		conf._input.find('input').prop('disabled', true);
+		conf._enabled = false;
+	}
+} );
+
+
+}());
+
+
+// If there are field types available on DataTables we copy them in (after the
+// built in ones to allow overrides) and then expose the field types object.
+if ( DataTable.ext.editorFields ) {
+	$.extend( Editor.fieldTypes, DataTable.ext.editorFields );
+}
+
+DataTable.ext.editorFields = Editor.fieldTypes;
+
+
+/**
+ * File information for uploads
+ */
+Editor.files = {};
+
+
+/**
+ * Name of this class
+ *  @constant CLASS
+ *  @type     String
+ *  @default  Editor
+ */
+Editor.prototype.CLASS = "Editor";
+
+
+/**
+ * DataTables Editor version
+ *  @constant  Editor.VERSION
+ *  @type      String
+ *  @default   See code
+ *  @static
+ */
+Editor.version = "1.5.6";
+
+
+// Event documentation for JSDoc
+/**
+ * Processing event, fired when Editor submits data to the server for processing.
+ * This can be used to provide your own processing indicator if your UI framework
+ * already has one.
+ *  @name Editor#processing
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {boolean} processing Flag for if the processing is running (true) or
+ *    not (false).
+ */
+
+/**
+ * Form displayed event, fired when the form is made available in the DOM. This
+ * can be useful for fields that require height and width calculations to be
+ * performed since the element is not available in the document until the
+ * form is displayed.
+ *  @name Editor#open
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {string} type Editing type
+ */
+
+/**
+ * Before a form is displayed, this event is fired. It allows the open action to be
+ * cancelled by returning false from the function.
+ *  @name Editor#preOpen
+ *  @event
+ *  @param {event} e jQuery event object
+ */
+
+/**
+ * Form hidden event, fired when the form is removed from the document. The
+ * of the compliment `open` event.
+ *  @name Editor#close
+ *  @event
+ *  @param {event} e jQuery event object
+ */
+
+/**
+ * Before a form is closed, this event is fired. It allows the close action to be
+ * cancelled by returning false from the function. This can be useful for confirming
+ * that the user actually wants to close the display (if they have unsaved changes
+ * for example).
+ *  @name Editor#preClose
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {string} trigger Action that caused the close event - can be undefined.
+ *    Typically defined by the display controller.
+ */
+
+/**
+ * Emitted before a form blur occurs. A form blur is similar to a close, but
+ * is triggered by a user, typically, clicking on the background, while a close
+ * occurs due to a click on the close button. A blur can precede a close.
+ *  @name Editor#preBlur
+ *  @event
+ *  @param {event} e jQuery event object
+ */
+
+/**
+ * Pre-submit event for the form, fired just before the data is submitted to
+ * the server. This event allows you to modify the data that will be submitted
+ * to the server. Note that this event runs after the 'formatdata' callback
+ * function of the {@link Editor#submit} API method.
+ *  @name Editor#preSubmit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} data The data object that will be submitted to the server
+ *  @param {string} action The action type for this submit - `create`, `edit` or
+ *    `remove`.
+ */
+
+/**
+ * Post-submit event for the form, fired immediately after the data has been
+ * loaded by the Ajax call, allowing modification or any other interception
+ * of the data returned form the server.
+ *  @name Editor#postSubmit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data object that was be submitted to the server
+ *  @param {string} action The action type for this submit - `create`, `edit` or
+ *    `remove`.
+ */
+
+/**
+ * Submission complete event, fired when data has been submitted to the server and
+ * after any of the return handling code has been run (updating the DataTable
+ * for example). Note that unlike `submitSuccess` and `submitError`, `submitComplete`
+ * will be fired for both a successful submission and an error. Additionally this
+ * event will be fired after `submitSuccess` or `submitError`.
+ *  @name Editor#submitComplete
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * Submission complete and successful event, fired when data has been successfully
+ * submitted to the server and all actions required by the returned data (inserting
+ * or updating a row) have been completed.
+ *  @name Editor#submitSuccess
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * Submission complete, but in error event, fired when data has been submitted to
+ * the server but an error occurred on the server (typically a JSON formatting error)
+ *  @name Editor#submitError
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} xhr The Ajax object
+ *  @param {string} err The error message from jQuery
+ *  @param {object} thrown The exception thrown by jQuery
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * Create method activated event, fired when the create API method has been called,
+ * just prior to the form being shown. Useful for manipulating the form specifically
+ * for the create state.
+ *  @name Editor#initCreate
+ *  @event
+ *  @param {event} e jQuery event object
+ */
+
+/**
+ * Pre-create new row event, fired just before DataTables calls the fnAddData method
+ * to add new data to the DataTable, allowing modification of the data that will be
+ * used to insert into the table.
+ *  @name Editor#preCreate
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that will be used to update the DataTable
+ */
+
+/**
+ * Create new row event, fired when a new row has been created in the DataTable by
+ * a form submission. This is called just after the fnAddData call to the DataTable.
+ *  @name Editor#create
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * As per the `create` event - included for naming consistency.
+ *  @name Editor#postCreate
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * Edit method activated event, fired when the edit API method has been called,
+ * just prior to the form being shown. Useful for manipulating the form specifically
+ * for the edit state.
+ *  @name Editor#initEdit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {node} tr TR element of the row to be edited
+ *  @param {array|object} data Data source array / object for the row to be
+ *    edited
+ */
+
+/**
+ * Pre-edit row event, fired just before DataTables calls the fnUpdate method
+ * to edit data in a DataTables row, allowing modification of the data that will be
+ * used to update the table.
+ *  @name Editor#preEdit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that will be used to update the DataTable
+ */
+
+/**
+ * Edit row event, fired when a row has been edited in the DataTable by a form
+ * submission. This is called just after the fnUpdate call to the DataTable.
+ *  @name Editor#edit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * As per the `edit` event - included for naming consistency.
+ *  @name Editor#postEdit
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that was used to update the DataTable
+ */
+
+/**
+ * Remove method activated event, fired when the remove API method has been
+ * called, just prior to the form being shown. Useful for manipulating the form
+ * specifically for the remove state.
+ *  @name Editor#initRemove
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {array} trs Array of the TR elements for the removed to be deleted
+ *  @param {array} data Array of the data source array / objects for the rows to
+ *    be deleted. This is in the same index order as the TR nodes in the second
+ *    parameter.
+ */
+
+/**
+ * Pre-remove row event, fired just before DataTables calls the fnDeleteRow method
+ * to delete a DataTables row.
+ *  @name Editor#preRemove
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ */
+
+/**
+ * Row removed event, fired when a row has been removed in the DataTable by a form
+ * submission. This is called just after the fnDeleteRow call to the DataTable.
+ *  @name Editor#remove
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ */
+
+/**
+ * As per the `postRemove` event - included for naming consistency.
+ *  @name Editor#postRemove
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ */
+
+/**
+ * Set data event, fired when the data is gathered from the form to be used
+ * to update the DataTable. This is a "global" version of `preCreate`, `preEdit`
+ * and `preRemove` and can be used to manipulate the data that will be added
+ * to the DataTable for all three actions
+ *  @name Editor#setData
+ *  @event
+ *  @param {event} e jQuery event object
+ *  @param {object} json The JSON object returned from the server
+ *  @param {object} data The data that will be used to update the DataTable
+ *  @param {string} action The action being performed by the form - 'create',
+ *    'edit' or 'remove'.
+ */
+
+/**
+ * Initialisation of the Editor instance has been completed.
+ *  @name Editor#initComplete
+ *  @event
+ *  @param {event} e jQuery event object
+ */
+
+
+return Editor;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/dataTables.editor.min.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,140 @@
+/*!
+ DataTables Editor v1.5.6
+
+ ©2012-2016 SpryMedia Ltd, all rights reserved.
+ License: editor.datatables.net/license
+*/
+(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(j){return d(j,window,document)}):"object"===typeof exports?module.exports=function(j,q){j||(j=window);if(!q||!q.fn.dataTable)q=require("datatables.net")(j,q).$;return d(q,j,j.document)}:d(jQuery,window,document)})(function(d,j,q,h){function v(a){a=a.context[0];return a.oInit.editor||a._editor}function B(a,b,c,e){b||(b={});b.buttons===h&&(b.buttons="_basic");b.title===h&&(b.title=a.i18n[c].title);b.message===
+h&&("remove"===c?(a=a.i18n[c].confirm,b.message=1!==e?a._.replace(/%d/,e):a["1"]):b.message="");return b}var r=d.fn.dataTable;if(!r||!r.versionCheck||!r.versionCheck("1.10.7"))throw"Editor requires DataTables 1.10.7 or newer";var f=function(a){!this instanceof f&&alert("DataTables Editor must be initialised as a 'new' instance'");this._constructor(a)};r.Editor=f;d.fn.DataTable.Editor=f;var t=function(a,b){b===h&&(b=q);return d('*[data-dte-e="'+a+'"]',b)},N=0,y=function(a,b){var c=[];d.each(a,function(a,
+d){c.push(d[b])});return c};f.Field=function(a,b,c){var e=this,l=c.i18n.multi,a=d.extend(!0,{},f.Field.defaults,a);if(!f.fieldTypes[a.type])throw"Error adding field - unknown field type "+a.type;this.s=d.extend({},f.Field.settings,{type:f.fieldTypes[a.type],name:a.name,classes:b,host:c,opts:a,multiValue:!1});a.id||(a.id="DTE_Field_"+a.name);a.dataProp&&(a.data=a.dataProp);""===a.data&&(a.data=a.name);var k=r.ext.oApi;this.valFromData=function(b){return k._fnGetObjectDataFn(a.data)(b,"editor")};this.valToData=
+k._fnSetObjectDataFn(a.data);b=d('<div class="'+b.wrapper+" "+b.typePrefix+a.type+" "+b.namePrefix+a.name+" "+a.className+'"><label data-dte-e="label" class="'+b.label+'" for="'+a.id+'">'+a.label+'<div data-dte-e="msg-label" class="'+b["msg-label"]+'">'+a.labelInfo+'</div></label><div data-dte-e="input" class="'+b.input+'"><div data-dte-e="input-control" class="'+b.inputControl+'"/><div data-dte-e="multi-value" class="'+b.multiValue+'">'+l.title+'<span data-dte-e="multi-info" class="'+b.multiInfo+
+'">'+l.info+'</span></div><div data-dte-e="msg-multi" class="'+b.multiRestore+'">'+l.restore+'</div><div data-dte-e="msg-error" class="'+b["msg-error"]+'"></div><div data-dte-e="msg-message" class="'+b["msg-message"]+'"></div><div data-dte-e="msg-info" class="'+b["msg-info"]+'">'+a.fieldInfo+"</div></div></div>");c=this._typeFn("create",a);null!==c?t("input-control",b).prepend(c):b.css("display","none");this.dom=d.extend(!0,{},f.Field.models.dom,{container:b,inputControl:t("input-control",b),label:t("label",
+b),fieldInfo:t("msg-info",b),labelInfo:t("msg-label",b),fieldError:t("msg-error",b),fieldMessage:t("msg-message",b),multi:t("multi-value",b),multiReturn:t("msg-multi",b),multiInfo:t("multi-info",b)});this.dom.multi.on("click",function(){e.val("")});this.dom.multiReturn.on("click",function(){e.s.multiValue=true;e._multiValueCheck()});d.each(this.s.type,function(a,b){typeof b==="function"&&e[a]===h&&(e[a]=function(){var b=Array.prototype.slice.call(arguments);b.unshift(a);b=e._typeFn.apply(e,b);return b===
+h?e:b})})};f.Field.prototype={def:function(a){var b=this.s.opts;if(a===h)return a=b["default"]!==h?b["default"]:b.def,d.isFunction(a)?a():a;b.def=a;return this},disable:function(){this._typeFn("disable");return this},displayed:function(){var a=this.dom.container;return a.parents("body").length&&"none"!=a.css("display")?!0:!1},enable:function(){this._typeFn("enable");return this},error:function(a,b){var c=this.s.classes;a?this.dom.container.addClass(c.error):this.dom.container.removeClass(c.error);
+return this._msg(this.dom.fieldError,a,b)},isMultiValue:function(){return this.s.multiValue},inError:function(){return this.dom.container.hasClass(this.s.classes.error)},input:function(){return this.s.type.input?this._typeFn("input"):d("input, select, textarea",this.dom.container)},focus:function(){this.s.type.focus?this._typeFn("focus"):d("input, select, textarea",this.dom.container).focus();return this},get:function(){if(this.isMultiValue())return h;var a=this._typeFn("get");return a!==h?a:this.def()},
+hide:function(a){var b=this.dom.container;a===h&&(a=!0);this.s.host.display()&&a?b.slideUp():b.css("display","none");return this},label:function(a){var b=this.dom.label;if(a===h)return b.html();b.html(a);return this},message:function(a,b){return this._msg(this.dom.fieldMessage,a,b)},multiGet:function(a){var b=this.s.multiValues,c=this.s.multiIds;if(a===h)for(var a={},e=0;e<c.length;e++)a[c[e]]=this.isMultiValue()?b[c[e]]:this.val();else a=this.isMultiValue()?b[a]:this.val();return a},multiSet:function(a,
+b){var c=this.s.multiValues,e=this.s.multiIds;b===h&&(b=a,a=h);var l=function(a,b){d.inArray(e)===-1&&e.push(a);c[a]=b};d.isPlainObject(b)&&a===h?d.each(b,function(a,b){l(a,b)}):a===h?d.each(e,function(a,c){l(c,b)}):l(a,b);this.s.multiValue=!0;this._multiValueCheck();return this},name:function(){return this.s.opts.name},node:function(){return this.dom.container[0]},set:function(a){var b=function(a){return"string"!==typeof a?a:a.replace(/&gt;/g,">").replace(/&lt;/g,"<").replace(/&amp;/g,"&").replace(/&quot;/g,
+'"').replace(/&#39;/g,"'").replace(/&#10;/g,"\n")};this.s.multiValue=!1;var c=this.s.opts.entityDecode;if(c===h||!0===c)if(d.isArray(a))for(var c=0,e=a.length;c<e;c++)a[c]=b(a[c]);else a=b(a);this._typeFn("set",a);this._multiValueCheck();return this},show:function(a){var b=this.dom.container;a===h&&(a=!0);this.s.host.display()&&a?b.slideDown():b.css("display","block");return this},val:function(a){return a===h?this.get():this.set(a)},dataSrc:function(){return this.s.opts.data},destroy:function(){this.dom.container.remove();
+this._typeFn("destroy");return this},multiIds:function(){return this.s.multiIds},multiInfoShown:function(a){this.dom.multiInfo.css({display:a?"block":"none"})},multiReset:function(){this.s.multiIds=[];this.s.multiValues={}},valFromData:null,valToData:null,_errorNode:function(){return this.dom.fieldError},_msg:function(a,b,c){if("function"===typeof b)var e=this.s.host,b=b(e,new r.Api(e.s.table));a.parent().is(":visible")?(a.html(b),b?a.slideDown(c):a.slideUp(c)):(a.html(b||"").css("display",b?"block":
+"none"),c&&c());return this},_multiValueCheck:function(){var a,b=this.s.multiIds,c=this.s.multiValues,e,d=!1;if(b)for(var k=0;k<b.length;k++){e=c[b[k]];if(0<k&&e!==a){d=!0;break}a=e}d&&this.s.multiValue?(this.dom.inputControl.css({display:"none"}),this.dom.multi.css({display:"block"})):(this.dom.inputControl.css({display:"block"}),this.dom.multi.css({display:"none"}),this.s.multiValue&&this.val(a));this.dom.multiReturn.css({display:b&&1<b.length&&d&&!this.s.multiValue?"block":"none"});this.s.host._multiInfo();
+return!0},_typeFn:function(a){var b=Array.prototype.slice.call(arguments);b.shift();b.unshift(this.s.opts);var c=this.s.type[a];if(c)return c.apply(this.s.host,b)}};f.Field.models={};f.Field.defaults={className:"",data:"",def:"",fieldInfo:"",id:"",label:"",labelInfo:"",name:null,type:"text"};f.Field.models.settings={type:null,name:null,classes:null,opts:null,host:null};f.Field.models.dom={container:null,label:null,labelInfo:null,fieldInfo:null,fieldError:null,fieldMessage:null};f.models={};f.models.displayController=
+{init:function(){},open:function(){},close:function(){}};f.models.fieldType={create:function(){},get:function(){},set:function(){},enable:function(){},disable:function(){}};f.models.settings={ajaxUrl:null,ajax:null,dataSource:null,domTable:null,opts:null,displayController:null,fields:{},order:[],id:-1,displayed:!1,processing:!1,modifier:null,action:null,idSrc:null};f.models.button={label:null,fn:null,className:null};f.models.formOptions={onReturn:"submit",onBlur:"close",onBackground:"blur",onComplete:"close",
+onEsc:"close",submit:"all",focus:0,buttons:!0,title:!0,message:!0,drawType:!1};f.display={};var o=jQuery,n;f.display.lightbox=o.extend(!0,{},f.models.displayController,{init:function(){n._init();return n},open:function(a,b,c){if(n._shown)c&&c();else{n._dte=a;a=n._dom.content;a.children().detach();a.append(b).append(n._dom.close);n._shown=true;n._show(c)}},close:function(a,b){if(n._shown){n._dte=a;n._hide(b);n._shown=false}else b&&b()},node:function(){return n._dom.wrapper[0]},_init:function(){if(!n._ready){var a=
+n._dom;a.content=o("div.DTED_Lightbox_Content",n._dom.wrapper);a.wrapper.css("opacity",0);a.background.css("opacity",0)}},_show:function(a){var b=n._dom;j.orientation!==h&&o("body").addClass("DTED_Lightbox_Mobile");b.content.css("height","auto");b.wrapper.css({top:-n.conf.offsetAni});o("body").append(n._dom.background).append(n._dom.wrapper);n._heightCalc();b.wrapper.stop().animate({opacity:1,top:0},a);b.background.stop().animate({opacity:1});b.close.bind("click.DTED_Lightbox",function(){n._dte.close()});
+b.background.bind("click.DTED_Lightbox",function(){n._dte.background()});o("div.DTED_Lightbox_Content_Wrapper",b.wrapper).bind("click.DTED_Lightbox",function(a){o(a.target).hasClass("DTED_Lightbox_Content_Wrapper")&&n._dte.background()});o(j).bind("resize.DTED_Lightbox",function(){n._heightCalc()});n._scrollTop=o("body").scrollTop();if(j.orientation!==h){a=o("body").children().not(b.background).not(b.wrapper);o("body").append('<div class="DTED_Lightbox_Shown"/>');o("div.DTED_Lightbox_Shown").append(a)}},
+_heightCalc:function(){var a=n._dom,b=o(j).height()-n.conf.windowPadding*2-o("div.DTE_Header",a.wrapper).outerHeight()-o("div.DTE_Footer",a.wrapper).outerHeight();o("div.DTE_Body_Content",a.wrapper).css("maxHeight",b)},_hide:function(a){var b=n._dom;a||(a=function(){});if(j.orientation!==h){var c=o("div.DTED_Lightbox_Shown");c.children().appendTo("body");c.remove()}o("body").removeClass("DTED_Lightbox_Mobile").scrollTop(n._scrollTop);b.wrapper.stop().animate({opacity:0,top:n.conf.offsetAni},function(){o(this).detach();
+a()});b.background.stop().animate({opacity:0},function(){o(this).detach()});b.close.unbind("click.DTED_Lightbox");b.background.unbind("click.DTED_Lightbox");o("div.DTED_Lightbox_Content_Wrapper",b.wrapper).unbind("click.DTED_Lightbox");o(j).unbind("resize.DTED_Lightbox")},_dte:null,_ready:!1,_shown:!1,_dom:{wrapper:o('<div class="DTED DTED_Lightbox_Wrapper"><div class="DTED_Lightbox_Container"><div class="DTED_Lightbox_Content_Wrapper"><div class="DTED_Lightbox_Content"></div></div></div></div>'),
+background:o('<div class="DTED_Lightbox_Background"><div/></div>'),close:o('<div class="DTED_Lightbox_Close"></div>'),content:null}});n=f.display.lightbox;n.conf={offsetAni:25,windowPadding:25};var m=jQuery,g;f.display.envelope=m.extend(!0,{},f.models.displayController,{init:function(a){g._dte=a;g._init();return g},open:function(a,b,c){g._dte=a;m(g._dom.content).children().detach();g._dom.content.appendChild(b);g._dom.content.appendChild(g._dom.close);g._show(c)},close:function(a,b){g._dte=a;g._hide(b)},
+node:function(){return g._dom.wrapper[0]},_init:function(){if(!g._ready){g._dom.content=m("div.DTED_Envelope_Container",g._dom.wrapper)[0];q.body.appendChild(g._dom.background);q.body.appendChild(g._dom.wrapper);g._dom.background.style.visbility="hidden";g._dom.background.style.display="block";g._cssBackgroundOpacity=m(g._dom.background).css("opacity");g._dom.background.style.display="none";g._dom.background.style.visbility="visible"}},_show:function(a){a||(a=function(){});g._dom.content.style.height=
+"auto";var b=g._dom.wrapper.style;b.opacity=0;b.display="block";var c=g._findAttachRow(),e=g._heightCalc(),d=c.offsetWidth;b.display="none";b.opacity=1;g._dom.wrapper.style.width=d+"px";g._dom.wrapper.style.marginLeft=-(d/2)+"px";g._dom.wrapper.style.top=m(c).offset().top+c.offsetHeight+"px";g._dom.content.style.top=-1*e-20+"px";g._dom.background.style.opacity=0;g._dom.background.style.display="block";m(g._dom.background).animate({opacity:g._cssBackgroundOpacity},"normal");m(g._dom.wrapper).fadeIn();
+g.conf.windowScroll?m("html,body").animate({scrollTop:m(c).offset().top+c.offsetHeight-g.conf.windowPadding},function(){m(g._dom.content).animate({top:0},600,a)}):m(g._dom.content).animate({top:0},600,a);m(g._dom.close).bind("click.DTED_Envelope",function(){g._dte.close()});m(g._dom.background).bind("click.DTED_Envelope",function(){g._dte.background()});m("div.DTED_Lightbox_Content_Wrapper",g._dom.wrapper).bind("click.DTED_Envelope",function(a){m(a.target).hasClass("DTED_Envelope_Content_Wrapper")&&
+g._dte.background()});m(j).bind("resize.DTED_Envelope",function(){g._heightCalc()})},_heightCalc:function(){g.conf.heightCalc?g.conf.heightCalc(g._dom.wrapper):m(g._dom.content).children().height();var a=m(j).height()-g.conf.windowPadding*2-m("div.DTE_Header",g._dom.wrapper).outerHeight()-m("div.DTE_Footer",g._dom.wrapper).outerHeight();m("div.DTE_Body_Content",g._dom.wrapper).css("maxHeight",a);return m(g._dte.dom.wrapper).outerHeight()},_hide:function(a){a||(a=function(){});m(g._dom.content).animate({top:-(g._dom.content.offsetHeight+
+50)},600,function(){m([g._dom.wrapper,g._dom.background]).fadeOut("normal",a)});m(g._dom.close).unbind("click.DTED_Lightbox");m(g._dom.background).unbind("click.DTED_Lightbox");m("div.DTED_Lightbox_Content_Wrapper",g._dom.wrapper).unbind("click.DTED_Lightbox");m(j).unbind("resize.DTED_Lightbox")},_findAttachRow:function(){var a=m(g._dte.s.table).DataTable();return g.conf.attach==="head"?a.table().header():g._dte.s.action==="create"?a.table().header():a.row(g._dte.s.modifier).node()},_dte:null,_ready:!1,
+_cssBackgroundOpacity:1,_dom:{wrapper:m('<div class="DTED DTED_Envelope_Wrapper"><div class="DTED_Envelope_ShadowLeft"></div><div class="DTED_Envelope_ShadowRight"></div><div class="DTED_Envelope_Container"></div></div>')[0],background:m('<div class="DTED_Envelope_Background"><div/></div>')[0],close:m('<div class="DTED_Envelope_Close">&times;</div>')[0],content:null}});g=f.display.envelope;g.conf={windowPadding:50,heightCalc:null,attach:"row",windowScroll:!0};f.prototype.add=function(a,b){if(d.isArray(a))for(var c=
+0,e=a.length;c<e;c++)this.add(a[c]);else{c=a.name;if(c===h)throw"Error adding field. The field requires a `name` option";if(this.s.fields[c])throw"Error adding field '"+c+"'. A field already exists with this name";this._dataSource("initField",a);this.s.fields[c]=new f.Field(a,this.classes.field,this);b===h?this.s.order.push(c):null===b?this.s.order.unshift(c):(e=d.inArray(b,this.s.order),this.s.order.splice(e+1,0,c))}this._displayReorder(this.order());return this};f.prototype.background=function(){var a=
+this.s.editOpts.onBackground;"blur"===a?this.blur():"close"===a?this.close():"submit"===a&&this.submit();return this};f.prototype.blur=function(){this._blur();return this};f.prototype.bubble=function(a,b,c,e){var l=this;if(this._tidy(function(){l.bubble(a,b,e)}))return this;d.isPlainObject(b)?(e=b,b=h,c=!0):"boolean"===typeof b&&(c=b,e=b=h);d.isPlainObject(c)&&(e=c,c=!0);c===h&&(c=!0);var e=d.extend({},this.s.formOptions.bubble,e),k=this._dataSource("individual",a,b);this._edit(a,k,"bubble");if(!this._preopen("bubble"))return this;
+var f=this._formOptions(e);d(j).on("resize."+f,function(){l.bubblePosition()});var i=[];this.s.bubbleNodes=i.concat.apply(i,y(k,"attach"));i=this.classes.bubble;k=d('<div class="'+i.bg+'"><div/></div>');i=d('<div class="'+i.wrapper+'"><div class="'+i.liner+'"><div class="'+i.table+'"><div class="'+i.close+'" /></div></div><div class="'+i.pointer+'" /></div>');c&&(i.appendTo("body"),k.appendTo("body"));var c=i.children().eq(0),g=c.children(),u=g.children();c.append(this.dom.formError);g.prepend(this.dom.form);
+e.message&&c.prepend(this.dom.formInfo);e.title&&c.prepend(this.dom.header);e.buttons&&g.append(this.dom.buttons);var z=d().add(i).add(k);this._closeReg(function(){z.animate({opacity:0},function(){z.detach();d(j).off("resize."+f);l._clearDynamicInfo()})});k.click(function(){l.blur()});u.click(function(){l._close()});this.bubblePosition();z.animate({opacity:1});this._focus(this.s.includeFields,e.focus);this._postopen("bubble");return this};f.prototype.bubblePosition=function(){var a=d("div.DTE_Bubble"),
+b=d("div.DTE_Bubble_Liner"),c=this.s.bubbleNodes,e=0,l=0,k=0,f=0;d.each(c,function(a,b){var c=d(b).offset();e+=c.top;l+=c.left;k+=c.left+b.offsetWidth;f+=c.top+b.offsetHeight});var e=e/c.length,l=l/c.length,k=k/c.length,f=f/c.length,c=e,i=(l+k)/2,g=b.outerWidth(),u=i-g/2,g=u+g,h=d(j).width();a.css({top:c,left:i});b.length&&0>b.offset().top?a.css("top",f).addClass("below"):a.removeClass("below");g+15>h?b.css("left",15>u?-(u-15):-(g-h+15)):b.css("left",15>u?-(u-15):0);return this};f.prototype.buttons=
+function(a){var b=this;"_basic"===a?a=[{label:this.i18n[this.s.action].submit,fn:function(){this.submit()}}]:d.isArray(a)||(a=[a]);d(this.dom.buttons).empty();d.each(a,function(a,e){"string"===typeof e&&(e={label:e,fn:function(){this.submit()}});d("<button/>",{"class":b.classes.form.button+(e.className?" "+e.className:"")}).html("function"===typeof e.label?e.label(b):e.label||"").attr("tabindex",0).on("keyup",function(a){13===a.keyCode&&e.fn&&e.fn.call(b)}).on("keypress",function(a){13===a.keyCode&&
+a.preventDefault()}).on("click",function(a){a.preventDefault();e.fn&&e.fn.call(b)}).appendTo(b.dom.buttons)});return this};f.prototype.clear=function(a){var b=this,c=this.s.fields;"string"===typeof a?(c[a].destroy(),delete c[a],a=d.inArray(a,this.s.order),this.s.order.splice(a,1)):d.each(this._fieldNames(a),function(a,c){b.clear(c)});return this};f.prototype.close=function(){this._close(!1);return this};f.prototype.create=function(a,b,c,e){var l=this,k=this.s.fields,f=1;if(this._tidy(function(){l.create(a,
+b,c,e)}))return this;"number"===typeof a&&(f=a,a=b,b=c);this.s.editFields={};for(var i=0;i<f;i++)this.s.editFields[i]={fields:this.s.fields};f=this._crudArgs(a,b,c,e);this.s.action="create";this.s.modifier=null;this.dom.form.style.display="block";this._actionClass();this._displayReorder(this.fields());d.each(k,function(a,b){b.multiReset();b.set(b.def())});this._event("initCreate");this._assembleMain();this._formOptions(f.opts);f.maybeOpen();return this};f.prototype.dependent=function(a,b,c){if(d.isArray(a)){for(var e=
+0,l=a.length;e<l;e++)this.dependent(a[e],b,c);return this}var k=this,f=this.field(a),i={type:"POST",dataType:"json"},c=d.extend({event:"change",data:null,preUpdate:null,postUpdate:null},c),g=function(a){c.preUpdate&&c.preUpdate(a);d.each({labels:"label",options:"update",values:"val",messages:"message",errors:"error"},function(b,c){a[b]&&d.each(a[b],function(a,b){k.field(a)[c](b)})});d.each(["hide","show","enable","disable"],function(b,c){if(a[c])k[c](a[c])});c.postUpdate&&c.postUpdate(a)};d(f.node()).on(c.event,
+function(a){if(-1!==d.inArray(a.target,f.input().toArray())){a={};a.rows=k.s.editFields?y(k.s.editFields,"data"):null;a.row=a.rows?a.rows[0]:null;a.values=k.val();if(c.data){var e=c.data(a);e&&(c.data=e)}"function"===typeof b?(a=b(f.val(),a,g))&&g(a):(d.isPlainObject(b)?d.extend(i,b):i.url=b,d.ajax(d.extend(i,{url:b,data:a,success:g})))}});return this};f.prototype.disable=function(a){var b=this.s.fields;d.each(this._fieldNames(a),function(a,e){b[e].disable()});return this};f.prototype.display=function(a){return a===
+h?this.s.displayed:this[a?"open":"close"]()};f.prototype.displayed=function(){return d.map(this.s.fields,function(a,b){return a.displayed()?b:null})};f.prototype.displayNode=function(){return this.s.displayController.node(this)};f.prototype.edit=function(a,b,c,e,d){var k=this;if(this._tidy(function(){k.edit(a,b,c,e,d)}))return this;var f=this._crudArgs(b,c,e,d);this._edit(a,this._dataSource("fields",a),"main");this._assembleMain();this._formOptions(f.opts);f.maybeOpen();return this};f.prototype.enable=
+function(a){var b=this.s.fields;d.each(this._fieldNames(a),function(a,e){b[e].enable()});return this};f.prototype.error=function(a,b){b===h?this._message(this.dom.formError,a):this.s.fields[a].error(b);return this};f.prototype.field=function(a){return this.s.fields[a]};f.prototype.fields=function(){return d.map(this.s.fields,function(a,b){return b})};f.prototype.get=function(a){var b=this.s.fields;a||(a=this.fields());if(d.isArray(a)){var c={};d.each(a,function(a,d){c[d]=b[d].get()});return c}return b[a].get()};
+f.prototype.hide=function(a,b){var c=this.s.fields;d.each(this._fieldNames(a),function(a,d){c[d].hide(b)});return this};f.prototype.inError=function(a){if(d(this.dom.formError).is(":visible"))return!0;for(var b=this.s.fields,a=this._fieldNames(a),c=0,e=a.length;c<e;c++)if(b[a[c]].inError())return!0;return!1};f.prototype.inline=function(a,b,c){var e=this;d.isPlainObject(b)&&(c=b,b=h);var c=d.extend({},this.s.formOptions.inline,c),l=this._dataSource("individual",a,b),k,f,i=0,g,u=!1;d.each(l,function(a,
+b){if(i>0)throw"Cannot edit more than one row inline at a time";k=d(b.attach[0]);g=0;d.each(b.displayFields,function(a,b){if(g>0)throw"Cannot edit more than one field inline at a time";f=b;g++});i++});if(d("div.DTE_Field",k).length||this._tidy(function(){e.inline(a,b,c)}))return this;this._edit(a,l,"inline");var z=this._formOptions(c);if(!this._preopen("inline"))return this;var O=k.contents().detach();k.append(d('<div class="DTE DTE_Inline"><div class="DTE_Inline_Field"/><div class="DTE_Inline_Buttons"/></div>'));
+k.find("div.DTE_Inline_Field").append(f.node());c.buttons&&k.find("div.DTE_Inline_Buttons").append(this.dom.buttons);this._closeReg(function(a){u=true;d(q).off("click"+z);if(!a){k.contents().detach();k.append(O)}e._clearDynamicInfo()});setTimeout(function(){if(!u)d(q).on("click"+z,function(a){var b=d.fn.addBack?"addBack":"andSelf";!f._typeFn("owns",a.target)&&d.inArray(k[0],d(a.target).parents()[b]())===-1&&e.blur()})},0);this._focus([f],c.focus);this._postopen("inline");return this};f.prototype.message=
+function(a,b){b===h?this._message(this.dom.formInfo,a):this.s.fields[a].message(b);return this};f.prototype.mode=function(){return this.s.action};f.prototype.modifier=function(){return this.s.modifier};f.prototype.multiGet=function(a){var b=this.s.fields;a===h&&(a=this.fields());if(d.isArray(a)){var c={};d.each(a,function(a,d){c[d]=b[d].multiGet()});return c}return b[a].multiGet()};f.prototype.multiSet=function(a,b){var c=this.s.fields;d.isPlainObject(a)&&b===h?d.each(a,function(a,b){c[a].multiSet(b)}):
+c[a].multiSet(b);return this};f.prototype.node=function(a){var b=this.s.fields;a||(a=this.order());return d.isArray(a)?d.map(a,function(a){return b[a].node()}):b[a].node()};f.prototype.off=function(a,b){d(this).off(this._eventName(a),b);return this};f.prototype.on=function(a,b){d(this).on(this._eventName(a),b);return this};f.prototype.one=function(a,b){d(this).one(this._eventName(a),b);return this};f.prototype.open=function(){var a=this;this._displayReorder();this._closeReg(function(){a.s.displayController.close(a,
+function(){a._clearDynamicInfo()})});if(!this._preopen("main"))return this;this.s.displayController.open(this,this.dom.wrapper);this._focus(d.map(this.s.order,function(b){return a.s.fields[b]}),this.s.editOpts.focus);this._postopen("main");return this};f.prototype.order=function(a){if(!a)return this.s.order;arguments.length&&!d.isArray(a)&&(a=Array.prototype.slice.call(arguments));if(this.s.order.slice().sort().join("-")!==a.slice().sort().join("-"))throw"All fields, and no additional fields, must be provided for ordering.";
+d.extend(this.s.order,a);this._displayReorder();return this};f.prototype.remove=function(a,b,c,e,l){var k=this;if(this._tidy(function(){k.remove(a,b,c,e,l)}))return this;a.length===h&&(a=[a]);var f=this._crudArgs(b,c,e,l),i=this._dataSource("fields",a);this.s.action="remove";this.s.modifier=a;this.s.editFields=i;this.dom.form.style.display="none";this._actionClass();this._event("initRemove",[y(i,"node"),y(i,"data"),a]);this._event("initMultiRemove",[i,a]);this._assembleMain();this._formOptions(f.opts);
+f.maybeOpen();f=this.s.editOpts;null!==f.focus&&d("button",this.dom.buttons).eq(f.focus).focus();return this};f.prototype.set=function(a,b){var c=this.s.fields;if(!d.isPlainObject(a)){var e={};e[a]=b;a=e}d.each(a,function(a,b){c[a].set(b)});return this};f.prototype.show=function(a,b){var c=this.s.fields;d.each(this._fieldNames(a),function(a,d){c[d].show(b)});return this};f.prototype.submit=function(a,b,c,e){var l=this,f=this.s.fields,w=[],i=0,g=!1;if(this.s.processing||!this.s.action)return this;
+this._processing(!0);var h=function(){w.length!==i||g||(g=!0,l._submit(a,b,c,e))};this.error();d.each(f,function(a,b){b.inError()&&w.push(a)});d.each(w,function(a,b){f[b].error("",function(){i++;h()})});h();return this};f.prototype.title=function(a){var b=d(this.dom.header).children("div."+this.classes.header.content);if(a===h)return b.html();"function"===typeof a&&(a=a(this,new r.Api(this.s.table)));b.html(a);return this};f.prototype.val=function(a,b){return b===h?this.get(a):this.set(a,b)};var p=
+r.Api.register;p("editor()",function(){return v(this)});p("row.create()",function(a){var b=v(this);b.create(B(b,a,"create"));return this});p("row().edit()",function(a){var b=v(this);b.edit(this[0][0],B(b,a,"edit"));return this});p("rows().edit()",function(a){var b=v(this);b.edit(this[0],B(b,a,"edit"));return this});p("row().delete()",function(a){var b=v(this);b.remove(this[0][0],B(b,a,"remove",1));return this});p("rows().delete()",function(a){var b=v(this);b.remove(this[0],B(b,a,"remove",this[0].length));
+return this});p("cell().edit()",function(a,b){a?d.isPlainObject(a)&&(b=a,a="inline"):a="inline";v(this)[a](this[0][0],b);return this});p("cells().edit()",function(a){v(this).bubble(this[0],a);return this});p("file()",function(a,b){return f.files[a][b]});p("files()",function(a,b){if(!a)return f.files;if(!b)return f.files[a];f.files[a]=b;return this});d(q).on("xhr.dt",function(a,b,c){"dt"===a.namespace&&c&&c.files&&d.each(c.files,function(a,b){f.files[a]=b})});f.error=function(a,b){throw b?a+" For more information, please refer to https://datatables.net/tn/"+
+b:a;};f.pairs=function(a,b,c){var e,l,f,b=d.extend({label:"label",value:"value"},b);if(d.isArray(a)){e=0;for(l=a.length;e<l;e++)f=a[e],d.isPlainObject(f)?c(f[b.value]===h?f[b.label]:f[b.value],f[b.label],e):c(f,f,e)}else e=0,d.each(a,function(a,b){c(b,a,e);e++})};f.safeId=function(a){return a.replace(/\./g,"-")};f.upload=function(a,b,c,e,l){var k=new FileReader,w=0,i=[];a.error(b.name,"");e(b,b.fileReadText||"<i>Uploading file</i>");k.onload=function(){var g=new FormData,h;g.append("action","upload");
+g.append("uploadField",b.name);g.append("upload",c[w]);b.ajaxData&&b.ajaxData(g);if(b.ajax)h=b.ajax;else if("string"===typeof a.s.ajax||d.isPlainObject(a.s.ajax))h=a.s.ajax;if(!h)throw"No Ajax option specified for upload plug-in";"string"===typeof h&&(h={url:h});var z=!1;a.on("preSubmit.DTE_Upload",function(){z=!0;return!1});d.ajax(d.extend({},h,{type:"post",data:g,dataType:"json",contentType:!1,processData:!1,xhr:function(){var a=d.ajaxSettings.xhr();a.upload&&(a.upload.onprogress=function(a){a.lengthComputable&&
+(a=(100*(a.loaded/a.total)).toFixed(0)+"%",e(b,1===c.length?a:w+":"+c.length+" "+a))},a.upload.onloadend=function(){e(b)});return a},success:function(e){a.off("preSubmit.DTE_Upload");if(e.fieldErrors&&e.fieldErrors.length)for(var e=e.fieldErrors,g=0,h=e.length;g<h;g++)a.error(e[g].name,e[g].status);else e.error?a.error(e.error):!e.upload||!e.upload.id?a.error(b.name,"A server error occurred while uploading the file"):(e.files&&d.each(e.files,function(a,b){f.files[a]=b}),i.push(e.upload.id),w<c.length-
+1?(w++,k.readAsDataURL(c[w])):(l.call(a,i),z&&a.submit()))},error:function(){a.error(b.name,"A server error occurred while uploading the file")}}))};k.readAsDataURL(c[0])};f.prototype._constructor=function(a){a=d.extend(!0,{},f.defaults,a);this.s=d.extend(!0,{},f.models.settings,{table:a.domTable||a.table,dbTable:a.dbTable||null,ajaxUrl:a.ajaxUrl,ajax:a.ajax,idSrc:a.idSrc,dataSource:a.domTable||a.table?f.dataSources.dataTable:f.dataSources.html,formOptions:a.formOptions,legacyAjax:a.legacyAjax});
+this.classes=d.extend(!0,{},f.classes);this.i18n=a.i18n;var b=this,c=this.classes;this.dom={wrapper:d('<div class="'+c.wrapper+'"><div data-dte-e="processing" class="'+c.processing.indicator+'"></div><div data-dte-e="body" class="'+c.body.wrapper+'"><div data-dte-e="body_content" class="'+c.body.content+'"/></div><div data-dte-e="foot" class="'+c.footer.wrapper+'"><div class="'+c.footer.content+'"/></div></div>')[0],form:d('<form data-dte-e="form" class="'+c.form.tag+'"><div data-dte-e="form_content" class="'+
+c.form.content+'"/></form>')[0],formError:d('<div data-dte-e="form_error" class="'+c.form.error+'"/>')[0],formInfo:d('<div data-dte-e="form_info" class="'+c.form.info+'"/>')[0],header:d('<div data-dte-e="head" class="'+c.header.wrapper+'"><div class="'+c.header.content+'"/></div>')[0],buttons:d('<div data-dte-e="form_buttons" class="'+c.form.buttons+'"/>')[0]};if(d.fn.dataTable.TableTools){var e=d.fn.dataTable.TableTools.BUTTONS,l=this.i18n;d.each(["create","edit","remove"],function(a,b){e["editor_"+
+b].sButtonText=l[b].button})}d.each(a.events,function(a,c){b.on(a,function(){var a=Array.prototype.slice.call(arguments);a.shift();c.apply(b,a)})});var c=this.dom,k=c.wrapper;c.formContent=t("form_content",c.form)[0];c.footer=t("foot",k)[0];c.body=t("body",k)[0];c.bodyContent=t("body_content",k)[0];c.processing=t("processing",k)[0];a.fields&&this.add(a.fields);d(q).on("init.dt.dte",function(a,c){b.s.table&&c.nTable===d(b.s.table).get(0)&&(c._editor=b)}).on("xhr.dt",function(a,c,e){e&&(b.s.table&&
+c.nTable===d(b.s.table).get(0))&&b._optionsUpdate(e)});this.s.displayController=f.display[a.display].init(this);this._event("initComplete",[])};f.prototype._actionClass=function(){var a=this.classes.actions,b=this.s.action,c=d(this.dom.wrapper);c.removeClass([a.create,a.edit,a.remove].join(" "));"create"===b?c.addClass(a.create):"edit"===b?c.addClass(a.edit):"remove"===b&&c.addClass(a.remove)};f.prototype._ajax=function(a,b,c){var e={type:"POST",dataType:"json",data:null,error:c,success:function(a,
+c,e){204===e.status&&(a={});b(a)}},l;l=this.s.action;var f=this.s.ajax||this.s.ajaxUrl,g="edit"===l||"remove"===l?y(this.s.editFields,"idSrc"):null;d.isArray(g)&&(g=g.join(","));d.isPlainObject(f)&&f[l]&&(f=f[l]);if(d.isFunction(f)){var h=null,e=null;if(this.s.ajaxUrl){var J=this.s.ajaxUrl;J.create&&(h=J[l]);-1!==h.indexOf(" ")&&(l=h.split(" "),e=l[0],h=l[1]);h=h.replace(/_id_/,g)}f(e,h,a,b,c)}else"string"===typeof f?-1!==f.indexOf(" ")?(l=f.split(" "),e.type=l[0],e.url=l[1]):e.url=f:e=d.extend({},
+e,f||{}),e.url=e.url.replace(/_id_/,g),e.data&&(c=d.isFunction(e.data)?e.data(a):e.data,a=d.isFunction(e.data)&&c?c:d.extend(!0,a,c)),e.data=a,"DELETE"===e.type&&(a=d.param(e.data),e.url+=-1===e.url.indexOf("?")?"?"+a:"&"+a,delete e.data),d.ajax(e)};f.prototype._assembleMain=function(){var a=this.dom;d(a.wrapper).prepend(a.header);d(a.footer).append(a.formError).append(a.buttons);d(a.bodyContent).append(a.formInfo).append(a.form)};f.prototype._blur=function(){var a=this.s.editOpts;!1!==this._event("preBlur")&&
+("submit"===a.onBlur?this.submit():"close"===a.onBlur&&this._close())};f.prototype._clearDynamicInfo=function(){var a=this.classes.field.error,b=this.s.fields;d("div."+a,this.dom.wrapper).removeClass(a);d.each(b,function(a,b){b.error("").message("")});this.error("").message("")};f.prototype._close=function(a){!1!==this._event("preClose")&&(this.s.closeCb&&(this.s.closeCb(a),this.s.closeCb=null),this.s.closeIcb&&(this.s.closeIcb(),this.s.closeIcb=null),d("body").off("focus.editor-focus"),this.s.displayed=
+!1,this._event("close"))};f.prototype._closeReg=function(a){this.s.closeCb=a};f.prototype._crudArgs=function(a,b,c,e){var l=this,f,g,i;d.isPlainObject(a)||("boolean"===typeof a?(i=a,a=b):(f=a,g=b,i=c,a=e));i===h&&(i=!0);f&&l.title(f);g&&l.buttons(g);return{opts:d.extend({},this.s.formOptions.main,a),maybeOpen:function(){i&&l.open()}}};f.prototype._dataSource=function(a){var b=Array.prototype.slice.call(arguments);b.shift();var c=this.s.dataSource[a];if(c)return c.apply(this,b)};f.prototype._displayReorder=
+function(a){var b=d(this.dom.formContent),c=this.s.fields,e=this.s.order;a?this.s.includeFields=a:a=this.s.includeFields;b.children().detach();d.each(e,function(e,k){var g=k instanceof f.Field?k.name():k;-1!==d.inArray(g,a)&&b.append(c[g].node())});this._event("displayOrder",[this.s.displayed,this.s.action,b])};f.prototype._edit=function(a,b,c){var e=this.s.fields,l=[],f;this.s.editFields=b;this.s.modifier=a;this.s.action="edit";this.dom.form.style.display="block";this._actionClass();d.each(e,function(a,
+c){c.multiReset();f=!0;d.each(b,function(b,e){if(e.fields[a]){var d=c.valFromData(e.data);c.multiSet(b,d!==h?d:c.def());e.displayFields&&!e.displayFields[a]&&(f=!1)}});0!==c.multiIds().length&&f&&l.push(a)});for(var e=this.order().slice(),g=e.length;0<=g;g--)-1===d.inArray(e[g],l)&&e.splice(g,1);this._displayReorder(e);this.s.editData=d.extend(!0,{},this.multiGet());this._event("initEdit",[y(b,"node")[0],y(b,"data")[0],a,c]);this._event("initMultiEdit",[b,a,c])};f.prototype._event=function(a,b){b||
+(b=[]);if(d.isArray(a))for(var c=0,e=a.length;c<e;c++)this._event(a[c],b);else return c=d.Event(a),d(this).triggerHandler(c,b),c.result};f.prototype._eventName=function(a){for(var b=a.split(" "),c=0,e=b.length;c<e;c++){var a=b[c],d=a.match(/^on([A-Z])/);d&&(a=d[1].toLowerCase()+a.substring(3));b[c]=a}return b.join(" ")};f.prototype._fieldNames=function(a){return a===h?this.fields():!d.isArray(a)?[a]:a};f.prototype._focus=function(a,b){var c=this,e,l=d.map(a,function(a){return"string"===typeof a?c.s.fields[a]:
+a});"number"===typeof b?e=l[b]:b&&(e=0===b.indexOf("jq:")?d("div.DTE "+b.replace(/^jq:/,"")):this.s.fields[b]);(this.s.setFocus=e)&&e.focus()};f.prototype._formOptions=function(a){var b=this,c=N++,e=".dteInline"+c;a.closeOnComplete!==h&&(a.onComplete=a.closeOnComplete?"close":"none");a.submitOnBlur!==h&&(a.onBlur=a.submitOnBlur?"submit":"close");a.submitOnReturn!==h&&(a.onReturn=a.submitOnReturn?"submit":"none");a.blurOnBackground!==h&&(a.onBackground=a.blurOnBackground?"blur":"none");this.s.editOpts=
+a;this.s.editCount=c;if("string"===typeof a.title||"function"===typeof a.title)this.title(a.title),a.title=!0;if("string"===typeof a.message||"function"===typeof a.message)this.message(a.message),a.message=!0;"boolean"!==typeof a.buttons&&(this.buttons(a.buttons),a.buttons=!0);d(q).on("keydown"+e,function(c){var e=d(q.activeElement),f=e.length?e[0].nodeName.toLowerCase():null;d(e).attr("type");if(b.s.displayed&&a.onReturn==="submit"&&c.keyCode===13&&f==="input"){c.preventDefault();b.submit()}else if(c.keyCode===
+27){c.preventDefault();switch(a.onEsc){case "blur":b.blur();break;case "close":b.close();break;case "submit":b.submit()}}else e.parents(".DTE_Form_Buttons").length&&(c.keyCode===37?e.prev("button").focus():c.keyCode===39&&e.next("button").focus())});this.s.closeIcb=function(){d(q).off("keydown"+e)};return e};f.prototype._legacyAjax=function(a,b,c){if(this.s.legacyAjax)if("send"===a)if("create"===b||"edit"===b){var e;d.each(c.data,function(a){if(e!==h)throw"Editor: Multi-row editing is not supported by the legacy Ajax data format";
+e=a});c.data=c.data[e];"edit"===b&&(c.id=e)}else c.id=d.map(c.data,function(a,b){return b}),delete c.data;else c.data=!c.data&&c.row?[c.row]:[]};f.prototype._optionsUpdate=function(a){var b=this;a.options&&d.each(this.s.fields,function(c){if(a.options[c]!==h){var e=b.field(c);e&&e.update&&e.update(a.options[c])}})};f.prototype._message=function(a,b){"function"===typeof b&&(b=b(this,new r.Api(this.s.table)));a=d(a);!b&&this.s.displayed?a.stop().fadeOut(function(){a.html("")}):b?this.s.displayed?a.stop().html(b).fadeIn():
+a.html(b).css("display","block"):a.html("").css("display","none")};f.prototype._multiInfo=function(){var a=this.s.fields,b=this.s.includeFields,c=!0;if(b)for(var e=0,d=b.length;e<d;e++)a[b[e]].isMultiValue()&&c?(a[b[e]].multiInfoShown(c),c=!1):a[b[e]].multiInfoShown(!1)};f.prototype._postopen=function(a){var b=this,c=this.s.displayController.captureFocus;c===h&&(c=!0);d(this.dom.form).off("submit.editor-internal").on("submit.editor-internal",function(a){a.preventDefault()});if(c&&("main"===a||"bubble"===
+a))d("body").on("focus.editor-focus",function(){0===d(q.activeElement).parents(".DTE").length&&0===d(q.activeElement).parents(".DTED").length&&b.s.setFocus&&b.s.setFocus.focus()});this._multiInfo();this._event("open",[a,this.s.action]);return!0};f.prototype._preopen=function(a){if(!1===this._event("preOpen",[a,this.s.action]))return this._clearDynamicInfo(),!1;this.s.displayed=a;return!0};f.prototype._processing=function(a){var b=d(this.dom.wrapper),c=this.dom.processing.style,e=this.classes.processing.active;
+a?(c.display="block",b.addClass(e),d("div.DTE").addClass(e)):(c.display="none",b.removeClass(e),d("div.DTE").removeClass(e));this.s.processing=a;this._event("processing",[a])};f.prototype._submit=function(a,b,c,e){var f=this,k,g=!1,i={},n={},u=r.ext.oApi._fnSetObjectDataFn,m=this.s.fields,j=this.s.action,p=this.s.editCount,o=this.s.modifier,q=this.s.editFields,s=this.s.editData,t=this.s.editOpts,v=t.submit,x={action:this.s.action,data:{}},y;this.s.dbTable&&(x.table=this.s.dbTable);if("create"===j||
+"edit"===j)if(d.each(q,function(a,b){var c={},e={};d.each(m,function(f,l){if(b.fields[f]){var k=l.multiGet(a),h=u(f),i=d.isArray(k)&&f.indexOf("[]")!==-1?u(f.replace(/\[.*$/,"")+"-many-count"):null;h(c,k);i&&i(c,k.length);if(j==="edit"&&k!==s[f][a]){h(e,k);g=true;i&&i(e,k.length)}}});d.isEmptyObject(c)||(i[a]=c);d.isEmptyObject(e)||(n[a]=e)}),"create"===j||"all"===v||"allIfChanged"===v&&g)x.data=i;else if("changed"===v&&g)x.data=n;else{this.s.action=null;"close"===t.onComplete&&(e===h||e)&&this._close(!1);
+a&&a.call(this);this._processing(!1);this._event("submitComplete");return}else"remove"===j&&d.each(q,function(a,b){x.data[a]=b.data});this._legacyAjax("send",j,x);y=d.extend(!0,{},x);c&&c(x);!1===this._event("preSubmit",[x,j])?this._processing(!1):this._ajax(x,function(c){var g;f._legacyAjax("receive",j,c);f._event("postSubmit",[c,x,j]);if(!c.error)c.error="";if(!c.fieldErrors)c.fieldErrors=[];if(c.error||c.fieldErrors.length){f.error(c.error);d.each(c.fieldErrors,function(a,b){var c=m[b.name];c.error(b.status||
+"Error");if(a===0){d(f.dom.bodyContent,f.s.wrapper).animate({scrollTop:d(c.node()).position().top},500);c.focus()}});b&&b.call(f,c)}else{var i={};f._dataSource("prep",j,o,y,c.data,i);if(j==="create"||j==="edit")for(k=0;k<c.data.length;k++){g=c.data[k];f._event("setData",[c,g,j]);if(j==="create"){f._event("preCreate",[c,g]);f._dataSource("create",m,g,i);f._event(["create","postCreate"],[c,g])}else if(j==="edit"){f._event("preEdit",[c,g]);f._dataSource("edit",o,m,g,i);f._event(["edit","postEdit"],[c,
+g])}}else if(j==="remove"){f._event("preRemove",[c]);f._dataSource("remove",o,m,i);f._event(["remove","postRemove"],[c])}f._dataSource("commit",j,o,c.data,i);if(p===f.s.editCount){f.s.action=null;t.onComplete==="close"&&(e===h||e)&&f._close(true)}a&&a.call(f,c);f._event("submitSuccess",[c,g])}f._processing(false);f._event("submitComplete",[c,g])},function(a,c,e){f._event("postSubmit",[a,c,e,x]);f.error(f.i18n.error.system);f._processing(false);b&&b.call(f,a,c,e);f._event(["submitError","submitComplete"],
+[a,c,e,x])})};f.prototype._tidy=function(a){var b=this,c=this.s.table?new d.fn.dataTable.Api(this.s.table):null,e=!1;c&&(e=c.settings()[0].oFeatures.bServerSide);return this.s.processing?(this.one("submitComplete",function(){if(e)c.one("draw",a);else setTimeout(function(){a()},10)}),!0):"inline"===this.display()||"bubble"===this.display()?(this.one("close",function(){if(b.s.processing)b.one("submitComplete",function(b,d){if(e&&d)c.one("draw",a);else setTimeout(function(){a()},10)});else setTimeout(function(){a()},
+10)}).blur(),!0):!1};f.defaults={table:null,ajaxUrl:null,fields:[],display:"lightbox",ajax:null,idSrc:"DT_RowId",events:{},i18n:{create:{button:"New",title:"Create new entry",submit:"Create"},edit:{button:"Edit",title:"Edit entry",submit:"Update"},remove:{button:"Delete",title:"Delete",submit:"Delete",confirm:{_:"Are you sure you wish to delete %d rows?",1:"Are you sure you wish to delete 1 row?"}},error:{system:'A system error has occurred (<a target="_blank" href="//datatables.net/tn/12">More information</a>).'},
+multi:{title:"Multiple values",info:"The selected items contain different values for this input. To edit and set all items for this input to the same value, click or tap here, otherwise they will retain their individual values.",restore:"Undo changes"},datetime:{previous:"Previous",next:"Next",months:"January February March April May June July August September October November December".split(" "),weekdays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),amPm:["am","pm"],unknown:"-"}},formOptions:{bubble:d.extend({},
+f.models.formOptions,{title:!1,message:!1,buttons:"_basic",submit:"changed"}),inline:d.extend({},f.models.formOptions,{buttons:!1,submit:"changed"}),main:d.extend({},f.models.formOptions)},legacyAjax:!1};var K=function(a,b,c){d.each(b,function(b,d){var f=d.valFromData(c);f!==h&&C(a,d.dataSrc()).each(function(){for(;this.childNodes.length;)this.removeChild(this.firstChild)}).html(f)})},C=function(a,b){var c="keyless"===a?q:d('[data-editor-id="'+a+'"]');return d('[data-editor-field="'+b+'"]',c)},D=
+f.dataSources={},E=function(a,b){return a.settings()[0].oFeatures.bServerSide&&"none"!==b.s.editOpts.drawType},L=function(a){a=d(a);setTimeout(function(){a.addClass("highlight");setTimeout(function(){a.addClass("noHighlight").removeClass("highlight");setTimeout(function(){a.removeClass("noHighlight")},550)},500)},20)},F=function(a,b,c,e,d){b.rows(c).indexes().each(function(c){var c=b.row(c),g=c.data(),i=d(g);i===h&&f.error("Unable to find row identifier",14);a[i]={idSrc:i,data:g,node:c.node(),fields:e,
+type:"row"}})},G=function(a,b,c,e,l,g){b.cells(c).indexes().each(function(w){var i=b.cell(w),j=b.row(w.row).data(),j=l(j),u;if(!(u=g)){u=w.column;u=b.settings()[0].aoColumns[u];var m=u.editField!==h?u.editField:u.mData,n={};d.each(e,function(a,b){if(d.isArray(m))for(var c=0;c<m.length;c++){var e=b,f=m[c];e.dataSrc()===f&&(n[e.name()]=e)}else b.dataSrc()===m&&(n[b.name()]=b)});d.isEmptyObject(n)&&f.error("Unable to automatically determine field from source. Please specify the field name.",11);u=n}F(a,
+b,w.row,e,l);a[j].attach="object"===typeof c&&c.nodeName?[c]:[i.node()];a[j].displayFields=u})};D.dataTable={individual:function(a,b){var c=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc),e=d(this.s.table).DataTable(),f=this.s.fields,g={},h,i;a.nodeName&&d(a).hasClass("dtr-data")&&(i=a,a=e.responsive.index(d(a).closest("li")));b&&(d.isArray(b)||(b=[b]),h={},d.each(b,function(a,b){h[b]=f[b]}));G(g,e,a,f,c,h);i&&d.each(g,function(a,b){b.attach=[i]});return g},fields:function(a){var b=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc),
+c=d(this.s.table).DataTable(),e=this.s.fields,f={};d.isPlainObject(a)&&(a.rows!==h||a.columns!==h||a.cells!==h)?(a.rows!==h&&F(f,c,a.rows,e,b),a.columns!==h&&c.cells(null,a.columns).indexes().each(function(a){G(f,c,a,e,b)}),a.cells!==h&&G(f,c,a.cells,e,b)):F(f,c,a,e,b);return f},create:function(a,b){var c=d(this.s.table).DataTable();E(c,this)||(c=c.row.add(b),L(c.node()))},edit:function(a,b,c,e){b=d(this.s.table).DataTable();if(!E(b,this)){var f=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc),g=f(c),
+a=b.row("#"+g);a.any()||(a=b.row(function(a,b){return g==f(b)}));a.any()?(a.data(c),c=d.inArray(g,e.rowIds),e.rowIds.splice(c,1)):a=b.row.add(c);L(a.node())}},remove:function(a){var b=d(this.s.table).DataTable();E(b,this)||b.rows(a).remove()},prep:function(a,b,c,e,f){"edit"===a&&(f.rowIds=d.map(c.data,function(a,b){if(!d.isEmptyObject(c.data[b]))return b}))},commit:function(a,b,c,e){b=d(this.s.table).DataTable();if("edit"===a&&e.rowIds.length)for(var f=e.rowIds,g=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc),
+h=0,e=f.length;h<e;h++)a=b.row("#"+f[h]),a.any()||(a=b.row(function(a,b){return f[h]===g(b)})),a.any()&&a.remove();a=this.s.editOpts.drawType;"none"!==a&&b.draw(a)}};D.html={initField:function(a){var b=d('[data-editor-label="'+(a.data||a.name)+'"]');!a.label&&b.length&&(a.label=b.html())},individual:function(a,b){if(a instanceof d||a.nodeName)b||(b=[d(a).attr("data-editor-field")]),a=d(a).parents("[data-editor-id]").data("editor-id");a||(a="keyless");b&&!d.isArray(b)&&(b=[b]);if(!b||0===b.length)throw"Cannot automatically determine field name from data source";
+var c=D.html.fields.call(this,a),e=this.s.fields,f={};d.each(b,function(a,b){f[b]=e[b]});d.each(c,function(c,g){g.type="cell";for(var h=a,j=b,m=d(),n=0,p=j.length;n<p;n++)m=m.add(C(h,j[n]));g.attach=m.toArray();g.fields=e;g.displayFields=f});return c},fields:function(a){var b={},c={},e=this.s.fields;a||(a="keyless");d.each(e,function(b,e){var d=C(a,e.dataSrc()).html();e.valToData(c,null===d?h:d)});b[a]={idSrc:a,data:c,node:q,fields:e,type:"row"};return b},create:function(a,b){if(b){var c=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc)(b);
+d('[data-editor-id="'+c+'"]').length&&K(c,a,b)}},edit:function(a,b,c){a=r.ext.oApi._fnGetObjectDataFn(this.s.idSrc)(c)||"keyless";K(a,b,c)},remove:function(a){d('[data-editor-id="'+a+'"]').remove()}};f.classes={wrapper:"DTE",processing:{indicator:"DTE_Processing_Indicator",active:"DTE_Processing"},header:{wrapper:"DTE_Header",content:"DTE_Header_Content"},body:{wrapper:"DTE_Body",content:"DTE_Body_Content"},footer:{wrapper:"DTE_Footer",content:"DTE_Footer_Content"},form:{wrapper:"DTE_Form",content:"DTE_Form_Content",
+tag:"",info:"DTE_Form_Info",error:"DTE_Form_Error",buttons:"DTE_Form_Buttons",button:"btn"},field:{wrapper:"DTE_Field",typePrefix:"DTE_Field_Type_",namePrefix:"DTE_Field_Name_",label:"DTE_Label",input:"DTE_Field_Input",inputControl:"DTE_Field_InputControl",error:"DTE_Field_StateError","msg-label":"DTE_Label_Info","msg-error":"DTE_Field_Error","msg-message":"DTE_Field_Message","msg-info":"DTE_Field_Info",multiValue:"multi-value",multiInfo:"multi-info",multiRestore:"multi-restore"},actions:{create:"DTE_Action_Create",
+edit:"DTE_Action_Edit",remove:"DTE_Action_Remove"},bubble:{wrapper:"DTE DTE_Bubble",liner:"DTE_Bubble_Liner",table:"DTE_Bubble_Table",close:"DTE_Bubble_Close",pointer:"DTE_Bubble_Triangle",bg:"DTE_Bubble_Background"}};if(r.TableTools){var p=r.TableTools.BUTTONS,H={sButtonText:null,editor:null,formTitle:null};p.editor_create=d.extend(!0,p.text,H,{formButtons:[{label:null,fn:function(){this.submit()}}],fnClick:function(a,b){var c=b.editor,e=c.i18n.create,d=b.formButtons;if(!d[0].label)d[0].label=e.submit;
+c.create({title:e.title,buttons:d})}});p.editor_edit=d.extend(!0,p.select_single,H,{formButtons:[{label:null,fn:function(){this.submit()}}],fnClick:function(a,b){var c=this.fnGetSelectedIndexes();if(c.length===1){var e=b.editor,d=e.i18n.edit,f=b.formButtons;if(!f[0].label)f[0].label=d.submit;e.edit(c[0],{title:d.title,buttons:f})}}});p.editor_remove=d.extend(!0,p.select,H,{question:null,formButtons:[{label:null,fn:function(){var a=this;this.submit(function(){d.fn.dataTable.TableTools.fnGetInstance(d(a.s.table).DataTable().table().node()).fnSelectNone()})}}],
+fnClick:function(a,b){var c=this.fnGetSelectedIndexes();if(c.length!==0){var e=b.editor,d=e.i18n.remove,f=b.formButtons,g=typeof d.confirm==="string"?d.confirm:d.confirm[c.length]?d.confirm[c.length]:d.confirm._;if(!f[0].label)f[0].label=d.submit;e.remove(c,{message:g.replace(/%d/g,c.length),title:d.title,buttons:f})}}})}d.extend(r.ext.buttons,{create:{text:function(a,b,c){return a.i18n("buttons.create",c.editor.i18n.create.button)},className:"buttons-create",editor:null,formButtons:{label:function(a){return a.i18n.create.submit},
+fn:function(){this.submit()}},formMessage:null,formTitle:null,action:function(a,b,c,e){a=e.editor;a.create({buttons:e.formButtons,message:e.formMessage,title:e.formTitle||a.i18n.create.title})}},edit:{extend:"selected",text:function(a,b,c){return a.i18n("buttons.edit",c.editor.i18n.edit.button)},className:"buttons-edit",editor:null,formButtons:{label:function(a){return a.i18n.edit.submit},fn:function(){this.submit()}},formMessage:null,formTitle:null,action:function(a,b,c,e){var a=e.editor,c=b.rows({selected:!0}).indexes(),
+d=b.columns({selected:!0}).indexes(),b=b.cells({selected:!0}).indexes();a.edit(d.length||b.length?{rows:c,columns:d,cells:b}:c,{message:e.formMessage,buttons:e.formButtons,title:e.formTitle||a.i18n.edit.title})}},remove:{extend:"selected",text:function(a,b,c){return a.i18n("buttons.remove",c.editor.i18n.remove.button)},className:"buttons-remove",editor:null,formButtons:{label:function(a){return a.i18n.remove.submit},fn:function(){this.submit()}},formMessage:function(a,b){var c=b.rows({selected:!0}).indexes(),
+e=a.i18n.remove;return("string"===typeof e.confirm?e.confirm:e.confirm[c.length]?e.confirm[c.length]:e.confirm._).replace(/%d/g,c.length)},formTitle:null,action:function(a,b,c,e){a=e.editor;a.remove(b.rows({selected:!0}).indexes(),{buttons:e.formButtons,message:e.formMessage,title:e.formTitle||a.i18n.remove.title})}}});f.fieldTypes={};f.DateTime=function(a,b){this.c=d.extend(!0,{},f.DateTime.defaults,b);var c=this.c.classPrefix,e=this.c.i18n;if(!j.moment&&"YYYY-MM-DD"!==this.c.format)throw"Editor datetime: Without momentjs only the format 'YYYY-MM-DD' can be used";
+var g=function(a){return'<div class="'+c+'-timeblock"><div class="'+c+'-iconUp"><button>'+e.previous+'</button></div><div class="'+c+'-label"><span/><select class="'+c+"-"+a+'"/></div><div class="'+c+'-iconDown"><button>'+e.next+"</button></div></div>"},g=d('<div class="'+c+'"><div class="'+c+'-date"><div class="'+c+'-title"><div class="'+c+'-iconLeft"><button>'+e.previous+'</button></div><div class="'+c+'-iconRight"><button>'+e.next+'</button></div><div class="'+c+'-label"><span/><select class="'+
+c+'-month"/></div><div class="'+c+'-label"><span/><select class="'+c+'-year"/></div></div><div class="'+c+'-calendar"/></div><div class="'+c+'-time">'+g("hours")+"<span>:</span>"+g("minutes")+"<span>:</span>"+g("seconds")+g("ampm")+"</div></div>");this.dom={container:g,date:g.find("."+c+"-date"),title:g.find("."+c+"-title"),calendar:g.find("."+c+"-calendar"),time:g.find("."+c+"-time"),input:d(a)};this.s={d:null,display:null,namespace:"editor-dateime-"+f.DateTime._instance++,parts:{date:null!==this.c.format.match(/[YMD]/),
+time:null!==this.c.format.match(/[Hhm]/),seconds:-1!==this.c.format.indexOf("s"),hours12:null!==this.c.format.match(/[haA]/)}};this.dom.container.append(this.dom.date).append(this.dom.time);this.dom.date.append(this.dom.title).append(this.dom.calendar);this._constructor()};d.extend(f.DateTime.prototype,{destroy:function(){this._hide();this.dom.container().off("").empty();this.dom.input.off(".editor-datetime")},max:function(a){this.c.maxDate=a;this._optionsTitle();this._setCalander()},min:function(a){this.c.minDate=
+a;this._optionsTitle();this._setCalander()},owns:function(a){return 0<d(a).parents().filter(this.dom.container).length},val:function(a,b){if(a===h)return this.s.d;if(a instanceof Date)this.s.d=this._dateToUtc(a);else if(null===a||""===a)this.s.d=null;else if("string"===typeof a)if(j.moment){var c=j.moment.utc(a,this.c.format,this.c.momentLocale,this.c.momentStrict);this.s.d=c.isValid()?c.toDate():null}else c=a.match(/(\d{4})\-(\d{2})\-(\d{2})/),this.s.d=c?new Date(Date.UTC(c[1],c[2]-1,c[3])):null;
+if(b||b===h)this.s.d?this._writeOutput():this.dom.input.val(a);this.s.d||(this.s.d=this._dateToUtc(new Date));this.s.display=new Date(this.s.d.toString());this._setTitle();this._setCalander();this._setTime()},_constructor:function(){var a=this,b=this.c.classPrefix,c=this.c.i18n;this.s.parts.date||this.dom.date.css("display","none");this.s.parts.time||this.dom.time.css("display","none");this.s.parts.seconds||(this.dom.time.children("div.editor-datetime-timeblock").eq(2).remove(),this.dom.time.children("span").eq(1).remove());
+this.s.parts.hours12||this.dom.time.children("div.editor-datetime-timeblock").last().remove();this._optionsTitle();this._optionsTime("hours",this.s.parts.hours12?12:24,1);this._optionsTime("minutes",60,this.c.minutesIncrement);this._optionsTime("seconds",60,this.c.secondsIncrement);this._options("ampm",["am","pm"],c.amPm);this.dom.input.on("focus.editor-datetime click.editor-datetime",function(){if(!a.dom.container.is(":visible")&&!a.dom.input.is(":disabled")){a.val(a.dom.input.val(),false);a._show()}}).on("keyup.editor-datetime",
+function(){a.dom.container.is(":visible")&&a.val(a.dom.input.val(),false)});this.dom.container.on("change","select",function(){var c=d(this),f=c.val();if(c.hasClass(b+"-month")){a._correctMonth(a.s.display,f);a._setTitle();a._setCalander()}else if(c.hasClass(b+"-year")){a.s.display.setUTCFullYear(f);a._setTitle();a._setCalander()}else if(c.hasClass(b+"-hours")||c.hasClass(b+"-ampm")){if(a.s.parts.hours12){c=d(a.dom.container).find("."+b+"-hours").val()*1;f=d(a.dom.container).find("."+b+"-ampm").val()===
+"pm";a.s.d.setUTCHours(c===12&&!f?0:f&&c!==12?c+12:c)}else a.s.d.setUTCHours(f);a._setTime();a._writeOutput(true)}else if(c.hasClass(b+"-minutes")){a.s.d.setUTCMinutes(f);a._setTime();a._writeOutput(true)}else if(c.hasClass(b+"-seconds")){a.s.d.setSeconds(f);a._setTime();a._writeOutput(true)}a.dom.input.focus();a._position()}).on("click",function(c){var f=c.target.nodeName.toLowerCase();if(f!=="select"){c.stopPropagation();if(f==="button"){c=d(c.target);f=c.parent();if(!f.hasClass("disabled"))if(f.hasClass(b+
+"-iconLeft")){a.s.display.setUTCMonth(a.s.display.getUTCMonth()-1);a._setTitle();a._setCalander();a.dom.input.focus()}else if(f.hasClass(b+"-iconRight")){a._correctMonth(a.s.display,a.s.display.getUTCMonth()+1);a._setTitle();a._setCalander();a.dom.input.focus()}else if(f.hasClass(b+"-iconUp")){c=f.parent().find("select")[0];c.selectedIndex=c.selectedIndex!==c.options.length-1?c.selectedIndex+1:0;d(c).change()}else if(f.hasClass(b+"-iconDown")){c=f.parent().find("select")[0];c.selectedIndex=c.selectedIndex===
+0?c.options.length-1:c.selectedIndex-1;d(c).change()}else{if(!a.s.d)a.s.d=a._dateToUtc(new Date);a.s.d.setUTCFullYear(c.data("year"));a.s.d.setUTCMonth(c.data("month"));a.s.d.setUTCDate(c.data("day"));a._writeOutput(true);setTimeout(function(){a._hide()},10)}}else a.dom.input.focus()}})},_compareDates:function(a,b){return this._dateToUtcString(a)===this._dateToUtcString(b)},_correctMonth:function(a,b){var c=this._daysInMonth(a.getUTCFullYear(),b),e=a.getUTCDate()>c;a.setUTCMonth(b);e&&(a.setUTCDate(c),
+a.setUTCMonth(b))},_daysInMonth:function(a,b){return[31,0===a%4&&(0!==a%100||0===a%400)?29:28,31,30,31,30,31,31,30,31,30,31][b]},_dateToUtc:function(a){return new Date(Date.UTC(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes(),a.getSeconds()))},_dateToUtcString:function(a){return a.getUTCFullYear()+"-"+this._pad(a.getUTCMonth()+1)+"-"+this._pad(a.getUTCDate())},_hide:function(){var a=this.s.namespace;this.dom.container.detach();d(j).off("."+a);d(q).off("keydown."+a);d("div.DTE_Body_Content").off("scroll."+
+a);d("body").off("click."+a)},_hours24To12:function(a){return 0===a?12:12<a?a-12:a},_htmlDay:function(a){if(a.empty)return'<td class="empty"></td>';var b=["day"],c=this.c.classPrefix;a.disabled&&b.push("disabled");a.today&&b.push("today");a.selected&&b.push("selected");return'<td data-day="'+a.day+'" class="'+b.join(" ")+'"><button class="'+c+"-button "+c+'-day" type="button" data-year="'+a.year+'" data-month="'+a.month+'" data-day="'+a.day+'">'+a.day+"</button></td>"},_htmlMonth:function(a,b){var c=
+new Date,e=this._daysInMonth(a,b),f=(new Date(Date.UTC(a,b,1))).getUTCDay(),g=[],h=[];0<this.c.firstDay&&(f-=this.c.firstDay,0>f&&(f+=7));for(var i=e+f,j=i;7<j;)j-=7;var i=i+(7-j),j=this.c.minDate,m=this.c.maxDate;j&&(j.setUTCHours(0),j.setUTCMinutes(0),j.setSeconds(0));m&&(m.setUTCHours(23),m.setUTCMinutes(59),m.setSeconds(59));for(var n=0,p=0;n<i;n++){var o=new Date(Date.UTC(a,b,1+(n-f))),q=this.s.d?this._compareDates(o,this.s.d):!1,r=this._compareDates(o,c),s=n<f||n>=e+f,t=j&&o<j||m&&o>m,v=this.c.disableDays;
+d.isArray(v)&&-1!==d.inArray(o.getUTCDay(),v)?t=!0:"function"===typeof v&&!0===v(o)&&(t=!0);h.push(this._htmlDay({day:1+(n-f),month:b,year:a,selected:q,today:r,disabled:t,empty:s}));7===++p&&(this.c.showWeekNumber&&h.unshift(this._htmlWeekOfYear(n-f,b,a)),g.push("<tr>"+h.join("")+"</tr>"),h=[],p=0)}c=this.c.classPrefix+"-table";this.c.showWeekNumber&&(c+=" weekNumber");return'<table class="'+c+'"><thead>'+this._htmlMonthHead()+"</thead><tbody>"+g.join("")+"</tbody></table>"},_htmlMonthHead:function(){var a=
+[],b=this.c.firstDay,c=this.c.i18n,e=function(a){for(a+=b;7<=a;)a-=7;return c.weekdays[a]};this.c.showWeekNumber&&a.push("<th></th>");for(var d=0;7>d;d++)a.push("<th>"+e(d)+"</th>");return a.join("")},_htmlWeekOfYear:function(a,b,c){var e=new Date(c,0,1),a=Math.ceil(((new Date(c,b,a)-e)/864E5+e.getUTCDay()+1)/7);return'<td class="'+this.c.classPrefix+'-week">'+a+"</td>"},_options:function(a,b,c){c||(c=b);a=this.dom.container.find("select."+this.c.classPrefix+"-"+a);a.empty();for(var e=0,d=b.length;e<
+d;e++)a.append('<option value="'+b[e]+'">'+c[e]+"</option>")},_optionSet:function(a,b){var c=this.dom.container.find("select."+this.c.classPrefix+"-"+a),e=c.parent().children("span");c.val(b);c=c.find("option:selected");e.html(0!==c.length?c.text():this.c.i18n.unknown)},_optionsTime:function(a,b,c){var a=this.dom.container.find("select."+this.c.classPrefix+"-"+a),e=0,d=b,f=12===b?function(a){return a}:this._pad;12===b&&(e=1,d=13);for(b=e;b<d;b+=c)a.append('<option value="'+b+'">'+f(b)+"</option>")},
+_optionsTitle:function(){var a=this.c.i18n,b=this.c.minDate,c=this.c.maxDate,b=b?b.getFullYear():null,c=c?c.getFullYear():null,b=null!==b?b:(new Date).getFullYear()-this.c.yearRange,c=null!==c?c:(new Date).getFullYear()+this.c.yearRange;this._options("month",this._range(0,11),a.months);this._options("year",this._range(b,c))},_pad:function(a){return 10>a?"0"+a:a},_position:function(){var a=this.dom.input.offset(),b=this.dom.container,c=this.dom.input.outerHeight();b.css({top:a.top+c,left:a.left}).appendTo("body");
+var e=b.outerHeight(),f=d("body").scrollTop();a.top+c+e-f>d(j).height()&&(a=a.top-e,b.css("top",0>a?0:a))},_range:function(a,b){for(var c=[],e=a;e<=b;e++)c.push(e);return c},_setCalander:function(){this.dom.calendar.empty().append(this._htmlMonth(this.s.display.getUTCFullYear(),this.s.display.getUTCMonth()))},_setTitle:function(){this._optionSet("month",this.s.display.getUTCMonth());this._optionSet("year",this.s.display.getUTCFullYear())},_setTime:function(){var a=this.s.d,b=a?a.getUTCHours():0;this.s.parts.hours12?
+(this._optionSet("hours",this._hours24To12(b)),this._optionSet("ampm",12>b?"am":"pm")):this._optionSet("hours",b);this._optionSet("minutes",a?a.getUTCMinutes():0);this._optionSet("seconds",a?a.getSeconds():0)},_show:function(){var a=this,b=this.s.namespace;this._position();d(j).on("scroll."+b+" resize."+b,function(){a._position()});d("div.DTE_Body_Content").on("scroll."+b,function(){a._position()});d(q).on("keydown."+b,function(b){(9===b.keyCode||27===b.keyCode||13===b.keyCode)&&a._hide()});setTimeout(function(){d("body").on("click."+
+b,function(b){!d(b.target).parents().filter(a.dom.container).length&&b.target!==a.dom.input[0]&&a._hide()})},10)},_writeOutput:function(a){var b=this.s.d,b=j.moment?j.moment.utc(b,h,this.c.momentLocale,this.c.momentStrict).format(this.c.format):b.getUTCFullYear()+"-"+this._pad(b.getUTCMonth()+1)+"-"+this._pad(b.getUTCDate());this.dom.input.val(b);a&&this.dom.input.focus()}});f.DateTime._instance=0;f.DateTime.defaults={classPrefix:"editor-datetime",disableDays:null,firstDay:1,format:"YYYY-MM-DD",i18n:f.defaults.i18n.datetime,
+maxDate:null,minDate:null,minutesIncrement:1,momentStrict:!0,momentLocale:"en",secondsIncrement:1,showWeekNumber:!1,yearRange:10};var I=function(a,b){if(null===b||b===h)b=a.uploadText||"Choose file...";a._input.find("div.upload button").html(b)},M=function(a,b,c){var e=a.classes.form.button,g=d('<div class="editor_upload"><div class="eu_table"><div class="row"><div class="cell upload"><button class="'+e+'" /><input type="file"/></div><div class="cell clearValue"><button class="'+e+'" /></div></div><div class="row second"><div class="cell"><div class="drop"><span/></div></div><div class="cell"><div class="rendered"/></div></div></div></div>');
+b._input=g;b._enabled=!0;I(b);if(j.FileReader&&!1!==b.dragDrop){g.find("div.drop span").text(b.dragDropText||"Drag and drop a file here to upload");var h=g.find("div.drop");h.on("drop",function(e){b._enabled&&(f.upload(a,b,e.originalEvent.dataTransfer.files,I,c),h.removeClass("over"));return!1}).on("dragleave dragexit",function(){b._enabled&&h.removeClass("over");return!1}).on("dragover",function(){b._enabled&&h.addClass("over");return!1});a.on("open",function(){d("body").on("dragover.DTE_Upload drop.DTE_Upload",
+function(){return!1})}).on("close",function(){d("body").off("dragover.DTE_Upload drop.DTE_Upload")})}else g.addClass("noDrop"),g.append(g.find("div.rendered"));g.find("div.clearValue button").on("click",function(){f.fieldTypes.upload.set.call(a,b,"")});g.find("input[type=file]").on("change",function(){f.upload(a,b,this.files,I,function(b){c.call(a,b);g.find("input[type=file]").val("")})});return g},A=function(a){setTimeout(function(){a.trigger("change",{editor:!0,editorSet:!0})},0)},s=f.fieldTypes,
+p=d.extend(!0,{},f.models.fieldType,{get:function(a){return a._input.val()},set:function(a,b){a._input.val(b);A(a._input)},enable:function(a){a._input.prop("disabled",false)},disable:function(a){a._input.prop("disabled",true)}});s.hidden={create:function(a){a._val=a.value;return null},get:function(a){return a._val},set:function(a,b){a._val=b}};s.readonly=d.extend(!0,{},p,{create:function(a){a._input=d("<input/>").attr(d.extend({id:f.safeId(a.id),type:"text",readonly:"readonly"},a.attr||{}));return a._input[0]}});
+s.text=d.extend(!0,{},p,{create:function(a){a._input=d("<input/>").attr(d.extend({id:f.safeId(a.id),type:"text"},a.attr||{}));return a._input[0]}});s.password=d.extend(!0,{},p,{create:function(a){a._input=d("<input/>").attr(d.extend({id:f.safeId(a.id),type:"password"},a.attr||{}));return a._input[0]}});s.textarea=d.extend(!0,{},p,{create:function(a){a._input=d("<textarea/>").attr(d.extend({id:f.safeId(a.id)},a.attr||{}));return a._input[0]}});s.select=d.extend(!0,{},p,{_addOptions:function(a,b){var c=
+a._input[0].options,e=0;c.length=0;if(a.placeholder!==h){e=e+1;c[0]=new Option(a.placeholder,a.placeholderValue!==h?a.placeholderValue:"");var d=a.placeholderDisabled!==h?a.placeholderDisabled:true;c[0].hidden=d;c[0].disabled=d}b&&f.pairs(b,a.optionsPair,function(a,b,d){c[d+e]=new Option(b,a);c[d+e]._editor_val=a})},create:function(a){a._input=d("<select/>").attr(d.extend({id:f.safeId(a.id),multiple:a.multiple===true},a.attr||{})).on("change.dte",function(b,c){if(!c||!c.editor)a._lastSet=s.select.get(a)});
+s.select._addOptions(a,a.options||a.ipOpts);return a._input[0]},update:function(a,b){s.select._addOptions(a,b);var c=a._lastSet;c!==h&&s.select.set(a,c,true);A(a._input)},get:function(a){var b=a._input.find("option:selected").map(function(){return this._editor_val}).toArray();return a.multiple?a.separator?b.join(a.separator):b:b.length?b[0]:null},set:function(a,b,c){if(!c)a._lastSet=b;a.multiple&&a.separator&&!d.isArray(b)?b=b.split(a.separator):d.isArray(b)||(b=[b]);var e,f=b.length,g,h=false,i=
+a._input.find("option");a._input.find("option").each(function(){g=false;for(e=0;e<f;e++)if(this._editor_val==b[e]){h=g=true;break}this.selected=g});if(a.placeholder&&!h&&!a.multiple&&i.length)i[0].selected=true;c||A(a._input);return h},destroy:function(a){a._input.off("change.dte")}});s.checkbox=d.extend(!0,{},p,{_addOptions:function(a,b){var c=a._input.empty();b&&f.pairs(b,a.optionsPair,function(b,g,h){c.append('<div><input id="'+f.safeId(a.id)+"_"+h+'" type="checkbox" /><label for="'+f.safeId(a.id)+
+"_"+h+'">'+g+"</label></div>");d("input:last",c).attr("value",b)[0]._editor_val=b})},create:function(a){a._input=d("<div />");s.checkbox._addOptions(a,a.options||a.ipOpts);return a._input[0]},get:function(a){var b=[];a._input.find("input:checked").each(function(){b.push(this._editor_val)});return!a.separator?b:b.length===1?b[0]:b.join(a.separator)},set:function(a,b){var c=a._input.find("input");!d.isArray(b)&&typeof b==="string"?b=b.split(a.separator||"|"):d.isArray(b)||(b=[b]);var e,f=b.length,g;
+c.each(function(){g=false;for(e=0;e<f;e++)if(this._editor_val==b[e]){g=true;break}this.checked=g});A(c)},enable:function(a){a._input.find("input").prop("disabled",false)},disable:function(a){a._input.find("input").prop("disabled",true)},update:function(a,b){var c=s.checkbox,d=c.get(a);c._addOptions(a,b);c.set(a,d)}});s.radio=d.extend(!0,{},p,{_addOptions:function(a,b){var c=a._input.empty();b&&f.pairs(b,a.optionsPair,function(b,g,h){c.append('<div><input id="'+f.safeId(a.id)+"_"+h+'" type="radio" name="'+
+a.name+'" /><label for="'+f.safeId(a.id)+"_"+h+'">'+g+"</label></div>");d("input:last",c).attr("value",b)[0]._editor_val=b})},create:function(a){a._input=d("<div />");s.radio._addOptions(a,a.options||a.ipOpts);this.on("open",function(){a._input.find("input").each(function(){if(this._preChecked)this.checked=true})});return a._input[0]},get:function(a){a=a._input.find("input:checked");return a.length?a[0]._editor_val:h},set:function(a,b){a._input.find("input").each(function(){this._preChecked=false;
+if(this._editor_val==b)this._preChecked=this.checked=true;else this._preChecked=this.checked=false});A(a._input.find("input:checked"))},enable:function(a){a._input.find("input").prop("disabled",false)},disable:function(a){a._input.find("input").prop("disabled",true)},update:function(a,b){var c=s.radio,d=c.get(a);c._addOptions(a,b);var f=a._input.find("input");c.set(a,f.filter('[value="'+d+'"]').length?d:f.eq(0).attr("value"))}});s.date=d.extend(!0,{},p,{create:function(a){a._input=d("<input />").attr(d.extend({id:f.safeId(a.id),
+type:"text"},a.attr));if(d.datepicker){a._input.addClass("jqueryui");if(!a.dateFormat)a.dateFormat=d.datepicker.RFC_2822;if(a.dateImage===h)a.dateImage="../../images/calender.png";setTimeout(function(){d(a._input).datepicker(d.extend({showOn:"both",dateFormat:a.dateFormat,buttonImage:a.dateImage,buttonImageOnly:true},a.opts));d("#ui-datepicker-div").css("display","none")},10)}else a._input.attr("type","date");return a._input[0]},set:function(a,b){d.datepicker&&a._input.hasClass("hasDatepicker")?a._input.datepicker("setDate",
+b).change():d(a._input).val(b)},enable:function(a){d.datepicker?a._input.datepicker("enable"):d(a._input).prop("disabled",false)},disable:function(a){d.datepicker?a._input.datepicker("disable"):d(a._input).prop("disabled",true)},owns:function(a,b){return d(b).parents("div.ui-datepicker").length||d(b).parents("div.ui-datepicker-header").length?true:false}});s.datetime=d.extend(!0,{},p,{create:function(a){a._input=d("<input />").attr(d.extend(true,{id:f.safeId(a.id),type:"text"},a.attr));a._picker=
+new f.DateTime(a._input,d.extend({format:a.format,i18n:this.i18n.datetime},a.opts));return a._input[0]},set:function(a,b){a._picker.val(b);A(a._input)},owns:function(a,b){return a._picker.owns(b)},destroy:function(a){a._picker.destroy()},minDate:function(a,b){a._picker.min(b)},maxDate:function(a,b){a._picker.max(b)}});s.upload=d.extend(!0,{},p,{create:function(a){var b=this;return M(b,a,function(c){f.fieldTypes.upload.set.call(b,a,c[0])})},get:function(a){return a._val},set:function(a,b){a._val=b;
+var c=a._input;if(a.display){var d=c.find("div.rendered");a._val?d.html(a.display(a._val)):d.empty().append("<span>"+(a.noFileText||"No file")+"</span>")}d=c.find("div.clearValue button");if(b&&a.clearText){d.html(a.clearText);c.removeClass("noClear")}else c.addClass("noClear");a._input.find("input").triggerHandler("upload.editor",[a._val])},enable:function(a){a._input.find("input").prop("disabled",false);a._enabled=true},disable:function(a){a._input.find("input").prop("disabled",true);a._enabled=
+false}});s.uploadMany=d.extend(!0,{},p,{create:function(a){var b=this,c=M(b,a,function(c){a._val=a._val.concat(c);f.fieldTypes.uploadMany.set.call(b,a,a._val)});c.addClass("multi").on("click","button.remove",function(c){c.stopPropagation();c=d(this).data("idx");a._val.splice(c,1);f.fieldTypes.uploadMany.set.call(b,a,a._val)});return c},get:function(a){return a._val},set:function(a,b){b||(b=[]);if(!d.isArray(b))throw"Upload collections must have an array as a value";a._val=b;var c=this,e=a._input;
+if(a.display){e=e.find("div.rendered").empty();if(b.length){var f=d("<ul/>").appendTo(e);d.each(b,function(b,d){f.append("<li>"+a.display(d,b)+' <button class="'+c.classes.form.button+' remove" data-idx="'+b+'">&times;</button></li>')})}else e.append("<span>"+(a.noFileText||"No files")+"</span>")}a._input.find("input").triggerHandler("upload.editor",[a._val])},enable:function(a){a._input.find("input").prop("disabled",false);a._enabled=true},disable:function(a){a._input.find("input").prop("disabled",
+true);a._enabled=false}});r.ext.editorFields&&d.extend(f.fieldTypes,r.ext.editorFields);r.ext.editorFields=f.fieldTypes;f.files={};f.prototype.CLASS="Editor";f.version="1.5.6";return f});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.bootstrap.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,220 @@
+/*! Bootstrap integration for DataTables' Editor
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net-bs', 'datatables.net-editor'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net-bs')(root, $).$;
+			}
+
+			if ( ! $.fn.dataTable.Editor ) {
+				require('datatables.net-editor')(root, $);
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/*
+ * Set the default display controller to be our bootstrap control 
+ */
+DataTable.Editor.defaults.display = "bootstrap";
+
+
+/*
+ * Alter the buttons that Editor adds to TableTools so they are suitable for bootstrap
+ */
+var i18nDefaults = DataTable.Editor.defaults.i18n;
+i18nDefaults.create.title = "<h3>"+i18nDefaults.create.title+"</h3>";
+i18nDefaults.edit.title = "<h3>"+i18nDefaults.edit.title+"</h3>";
+i18nDefaults.remove.title = "<h3>"+i18nDefaults.remove.title+"</h3>";
+
+var tt = DataTable.TableTools;
+if ( tt ) {
+	tt.BUTTONS.editor_create.formButtons[0].className = "btn btn-primary";
+	tt.BUTTONS.editor_edit.formButtons[0].className = "btn btn-primary";
+	tt.BUTTONS.editor_remove.formButtons[0].className = "btn btn-danger";
+}
+
+
+/*
+ * Change the default classes from Editor to be classes for Bootstrap
+ */
+$.extend( true, $.fn.dataTable.Editor.classes, {
+	"header": {
+		"wrapper": "DTE_Header modal-header"
+	},
+	"body": {
+		"wrapper": "DTE_Body modal-body"
+	},
+	"footer": {
+		"wrapper": "DTE_Footer modal-footer"
+	},
+	"form": {
+		"tag": "form-horizontal",
+		"button": "btn btn-default"
+	},
+	"field": {
+		"wrapper": "DTE_Field",
+		"label":   "col-lg-4 control-label",
+		"input":   "col-lg-8 controls",
+		"error":   "error has-error",
+		"msg-labelInfo": "help-block",
+		"msg-info":      "help-block",
+		"msg-message":   "help-block",
+		"msg-error":     "help-block",
+		"multiValue":    "well well-sm multi-value",
+		"multiInfo":     "small",
+		"multiRestore":  "well well-sm multi-restore"
+	}
+} );
+
+
+/*
+ * Bootstrap display controller - this is effectively a proxy to the Bootstrap
+ * modal control.
+ */
+
+var self;
+
+DataTable.Editor.display.bootstrap = $.extend( true, {}, DataTable.Editor.models.displayController, {
+	/*
+	 * API methods
+	 */
+	"init": function ( dte ) {
+		// init can be called multiple times (one for each Editor instance), but
+		// we only support a single construct here (shared between all Editor
+		// instances)
+		if ( ! self._dom.content ) {
+			self._dom.content = $(
+				'<div class="modal fade">'+
+					'<div class="modal-dialog">'+
+						'<div class="modal-content"/>'+
+					'</div>'+
+				'</div>'
+			);
+
+			self._dom.close = $('<button class="close">&times;</div>');
+
+			self._dom.close.click( function () {
+				self._dte.close('icon');
+			} );
+
+			$(document).on('click', 'div.modal', function (e) {
+				if ( $(e.target).hasClass('modal') && self._shown ) {
+					self._dte.background();
+				}
+			} );
+
+			dte.on( 'open.dtebs', function ( e, type ) {
+				if ( type === 'inline' || type === 'bubble' ) {
+					$('div.DTE input[type=text], div.DTE select, div.DTE textarea').addClass( 'form-control' );
+				}
+			} );
+		}
+
+		return self;
+	},
+
+	"open": function ( dte, append, callback ) {
+		if ( self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		self._dte = dte;
+		self._shown = true;
+
+		var content = self._dom.content.find('div.modal-content');
+		content.children().detach();
+		content.append( append );
+
+		$('div.modal-header', append).prepend( self._dom.close );
+
+		$(self._dom.content)
+			.one('shown.bs.modal', function () {
+				// Can only give elements focus when shown
+				if ( self._dte.s.setFocus ) {
+					self._dte.s.setFocus.focus();
+				}
+
+				if ( callback ) {
+					callback();
+				}
+			})
+			.one('hidden', function () {
+				self._shown = false;
+			})
+			.appendTo( 'body' )
+			.modal( {
+				backdrop: "static",
+				keyboard: false
+			} );
+
+		$('input:not([type=checkbox]):not([type=radio]), select, textarea', self._dom.content)
+			.addClass( 'form-control' );
+	},
+
+	"close": function ( dte, callback ) {
+		if ( !self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		$(self._dom.content)
+			.one( 'hidden.bs.modal', function () {
+				$(this).detach();
+			} )
+			.modal('hide');
+
+		self._dte = dte;
+		self._shown = false;
+
+		if ( callback ) {
+			callback();
+		}
+	},
+
+	node: function ( dte ) {
+		return self._dom.content[0];
+	},
+
+
+	/*
+	 * Private properties
+	 */
+	 "_shown": false,
+	"_dte": null,
+	"_dom": {}
+} );
+
+self = DataTable.Editor.display.bootstrap;
+
+
+return DataTable.Editor;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.bootstrap.min.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,10 @@
+/*!
+ Bootstrap integration for DataTables' Editor
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(c){"function"===typeof define&&define.amd?define(["jquery","datatables.net-bs","datatables.net-editor"],function(a){return c(a,window,document)}):"object"===typeof exports?module.exports=function(a,d){a||(a=window);if(!d||!d.fn.dataTable)d=require("datatables.net-bs")(a,d).$;d.fn.dataTable.Editor||require("datatables.net-editor")(a,d);return c(d,a,a.document)}:c(jQuery,window,document)})(function(c,a,d){a=c.fn.dataTable;a.Editor.defaults.display="bootstrap";var e=a.Editor.defaults.i18n;
+e.create.title="<h3>"+e.create.title+"</h3>";e.edit.title="<h3>"+e.edit.title+"</h3>";e.remove.title="<h3>"+e.remove.title+"</h3>";if(e=a.TableTools)e.BUTTONS.editor_create.formButtons[0].className="btn btn-primary",e.BUTTONS.editor_edit.formButtons[0].className="btn btn-primary",e.BUTTONS.editor_remove.formButtons[0].className="btn btn-danger";c.extend(!0,c.fn.dataTable.Editor.classes,{header:{wrapper:"DTE_Header modal-header"},body:{wrapper:"DTE_Body modal-body"},footer:{wrapper:"DTE_Footer modal-footer"},
+form:{tag:"form-horizontal",button:"btn btn-default"},field:{wrapper:"DTE_Field",label:"col-lg-4 control-label",input:"col-lg-8 controls",error:"error has-error","msg-labelInfo":"help-block","msg-info":"help-block","msg-message":"help-block","msg-error":"help-block",multiValue:"well well-sm multi-value",multiInfo:"small",multiRestore:"well well-sm multi-restore"}});var b;a.Editor.display.bootstrap=c.extend(!0,{},a.Editor.models.displayController,{init:function(a){if(!b._dom.content){b._dom.content=
+c('<div class="modal fade"><div class="modal-dialog"><div class="modal-content"/></div></div>');b._dom.close=c('<button class="close">&times;</div>');b._dom.close.click(function(){b._dte.close("icon")});c(d).on("click","div.modal",function(a){c(a.target).hasClass("modal")&&b._shown&&b._dte.background()});a.on("open.dtebs",function(b,a){(a==="inline"||a==="bubble")&&c("div.DTE input[type=text], div.DTE select, div.DTE textarea").addClass("form-control")})}return b},open:function(a,e,d){if(b._shown)d&&
+d();else{b._dte=a;b._shown=true;a=b._dom.content.find("div.modal-content");a.children().detach();a.append(e);c("div.modal-header",e).prepend(b._dom.close);c(b._dom.content).one("shown.bs.modal",function(){b._dte.s.setFocus&&b._dte.s.setFocus.focus();d&&d()}).one("hidden",function(){b._shown=false}).appendTo("body").modal({backdrop:"static",keyboard:false});c("input:not([type=checkbox]):not([type=radio]), select, textarea",b._dom.content).addClass("form-control")}},close:function(a,d){if(b._shown){c(b._dom.content).one("hidden.bs.modal",
+function(){c(this).detach()}).modal("hide");b._dte=a;b._shown=false}d&&d()},node:function(){return b._dom.content[0]},_shown:!1,_dte:null,_dom:{}});b=a.Editor.display.bootstrap;return a.Editor});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.foundation.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,180 @@
+/*! Foundation integration for DataTables' Editor
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net-zf', 'datatables.net-editor'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net-zf')(root, $).$;
+			}
+
+			if ( ! $.fn.dataTable.Editor ) {
+				require('datatables.net-editor')(root, $);
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+/*
+ * Set the default display controller to be our foundation control 
+ */
+DataTable.Editor.defaults.display = "foundation";
+
+
+/*
+ * Change the default classes from Editor to be classes for Foundation
+ */
+$.extend( true, $.fn.dataTable.Editor.classes, {
+	field: {
+		wrapper:         "DTE_Field row",
+		label:           "small-4 columns inline",
+		input:           "small-8 columns",
+		error:           "error",
+		multiValue:      "panel radius multi-value",
+		multiInfo:       "small",
+		multiRestore:    "panel radius multi-restore",
+		"msg-labelInfo": "label secondary",
+		"msg-info":      "label secondary",
+		"msg-message":   "label secondary",
+		"msg-error":     "label alert"
+	},
+	form: {
+		button:  "button small"
+	}
+} );
+
+
+/*
+ * Foundation display controller - this is effectively a proxy to the Foundation
+ * modal control.
+ */
+var self;
+
+DataTable.Editor.display.foundation = $.extend( true, {}, DataTable.Editor.models.displayController, {
+	/*
+	 * API methods
+	 */
+	"init": function ( dte ) {
+		self._dom.content = $(
+			'<div class="reveal reveal-modal" data-reveal />'
+		);
+		self._dom.close = $('<button class="close close-button">&times;</div>');
+
+		self._dom.close.click( function () {
+			self._dte.close('icon');
+		} );
+
+		return self;
+	},
+
+	"open": function ( dte, append, callback ) {
+		if ( self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		self._dte = dte;
+		self._shown = true;
+
+		var content = self._dom.content;
+		content.children().detach();
+		content.append( append );
+		content.prepend( self._dom.close );
+
+		$(self._dom.content)
+			.one('opened.fndtn.reveal', function () {
+				if ( callback ) {
+					callback();
+				}
+			})
+			.one('closed.fndtn.reveal', function () {
+				self._shown = false;
+			});
+
+		if ( window.Foundation && window.Foundation.Reveal ) {
+			// Foundation 6
+			if ( ! self._reveal ) {
+				self._reveal = new window.Foundation.Reveal( self._dom.content, {
+					closeOnClick: false
+				} );
+			}
+
+			$(self._dom.content).appendTo('body');
+			self._reveal.open();
+		}
+		else {
+			// Foundation 5
+			$(self._dom.content).foundation( 'reveal','open' );
+		}
+
+		$(document).on('click.dte-zf', 'div.reveal-modal-bg, div.reveal-overlay', function () {
+			self._dte.background();
+		} );
+	},
+
+	"close": function ( dte, callback ) {
+		if ( !self._shown ) {
+			if ( callback ) {
+				callback();
+			}
+			return;
+		}
+
+		if ( self._reveal ) {
+			self._reveal.close();
+		}
+		else {
+			$(self._dom.content).foundation( 'reveal', 'close' );
+		}
+
+		$(document).off( 'click.dte-zf' );
+
+		self._dte = dte;
+		self._shown = false;
+
+		if ( callback ) {
+			callback();
+		}
+	},
+
+	node: function ( dte ) {
+		return self._dom.content[0];
+	},
+
+
+	/*
+	 * Private properties
+	 */
+	 "_shown": false,
+	"_dte": null,
+	"_dom": {}
+} );
+
+self = DataTable.Editor.display.foundation;
+
+
+return DataTable.Editor;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.foundation.min.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,8 @@
+/*!
+ Foundation integration for DataTables' Editor
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net-zf","datatables.net-editor"],function(c){return b(c,window,document)}):"object"===typeof exports?module.exports=function(c,d){c||(c=window);if(!d||!d.fn.dataTable)d=require("datatables.net-zf")(c,d).$;d.fn.dataTable.Editor||require("datatables.net-editor")(c,d);return b(d,c,c.document)}:b(jQuery,window,document)})(function(b,c,d){var e=b.fn.dataTable;e.Editor.defaults.display="foundation";b.extend(!0,b.fn.dataTable.Editor.classes,
+{field:{wrapper:"DTE_Field row",label:"small-4 columns inline",input:"small-8 columns",error:"error",multiValue:"panel radius multi-value",multiInfo:"small",multiRestore:"panel radius multi-restore","msg-labelInfo":"label secondary","msg-info":"label secondary","msg-message":"label secondary","msg-error":"label alert"},form:{button:"button small"}});var a;e.Editor.display.foundation=b.extend(!0,{},e.Editor.models.displayController,{init:function(){a._dom.content=b('<div class="reveal reveal-modal" data-reveal />');
+a._dom.close=b('<button class="close close-button">&times;</div>');a._dom.close.click(function(){a._dte.close("icon")});return a},open:function(f,e,g){if(a._shown)g&&g();else{a._dte=f;a._shown=true;f=a._dom.content;f.children().detach();f.append(e);f.prepend(a._dom.close);b(a._dom.content).one("opened.fndtn.reveal",function(){g&&g()}).one("closed.fndtn.reveal",function(){a._shown=false});if(c.Foundation&&c.Foundation.Reveal){if(!a._reveal)a._reveal=new c.Foundation.Reveal(a._dom.content,{closeOnClick:false});
+b(a._dom.content).appendTo("body");a._reveal.open()}else b(a._dom.content).foundation("reveal","open");b(d).on("click.dte-zf","div.reveal-modal-bg, div.reveal-overlay",function(){a._dte.background()})}},close:function(c,e){if(a._shown){a._reveal?a._reveal.close():b(a._dom.content).foundation("reveal","close");b(d).off("click.dte-zf");a._dte=c;a._shown=false}e&&e()},node:function(){return a._dom.content[0]},_shown:!1,_dte:null,_dom:{}});a=e.Editor.display.foundation;return e.Editor});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.jqueryui.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,141 @@
+/*! jQuery UI integration for DataTables' Editor
+ * ©2015 SpryMedia Ltd - datatables.net/license
+ */
+
+(function( factory ){
+	if ( typeof define === 'function' && define.amd ) {
+		// AMD
+		define( ['jquery', 'datatables.net-jqui', 'datatables.net-editor'], function ( $ ) {
+			return factory( $, window, document );
+		} );
+	}
+	else if ( typeof exports === 'object' ) {
+		// CommonJS
+		module.exports = function (root, $) {
+			if ( ! root ) {
+				root = window;
+			}
+
+			if ( ! $ || ! $.fn.dataTable ) {
+				$ = require('datatables.net-jqui')(root, $).$;
+			}
+
+			if ( ! $.fn.dataTable.Editor ) {
+				require('datatables.net-editor')(root, $);
+			}
+
+			return factory( $, root, root.document );
+		};
+	}
+	else {
+		// Browser
+		factory( jQuery, window, document );
+	}
+}(function( $, window, document, undefined ) {
+'use strict';
+var DataTable = $.fn.dataTable;
+
+
+var Editor = DataTable.Editor;
+var doingClose = false;
+
+/*
+ * Set the default display controller to be our foundation control 
+ */
+Editor.defaults.display = "jqueryui";
+
+/*
+ * Change the default classes from Editor to be classes for Bootstrap
+ */
+$.extend( true, $.fn.dataTable.Editor.classes, {
+	form: {
+		button:  "btn ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
+	}
+} );
+
+/*
+ * jQuery UI display controller - this is effectively a proxy to the jQuery UI
+ * modal control.
+ */
+Editor.display.jqueryui = $.extend( true, {}, Editor.models.displayController, {
+	init: function ( dte ) {
+		dte.__dialouge = $('<div/>')
+			.css('display', 'none')
+			.appendTo('body')
+			.dialog( $.extend( true, Editor.display.jqueryui.modalOptions, {
+				autoOpen: false,
+				buttons: { "A": function () {} }, // fake button so the button container is created
+				closeOnEscape: false // allow editor's escape function to run
+			} ) );
+
+		// Need to know when the dialogue is closed using its own trigger
+		// so we can reset the form
+		$(dte.__dialouge).on( 'dialogclose', function (e) {
+			if ( ! doingClose ) {
+				dte.close();
+			}
+		} );
+
+		return Editor.display.jqueryui;
+	},
+
+	open: function ( dte, append, callback ) {
+		dte.__dialouge
+			.append( append )
+			.dialog( 'open' );
+
+		$(dte.dom.formError).appendTo(
+			dte.__dialouge.parent().find('div.ui-dialog-buttonpane')
+		);
+
+		dte.__dialouge.parent().find('.ui-dialog-title').html( dte.dom.header.innerHTML );
+		dte.__dialouge.parent().addClass('DTED');
+
+		// Modify the Editor buttons to be jQuery UI suitable
+		var buttons = $(dte.dom.buttons)
+			.children()
+			.addClass( 'ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only' )
+			.each( function () {
+				$(this).wrapInner( '<span class="ui-button-text" />' );
+			} );
+
+		// Move the buttons into the jQuery UI button set
+		dte.__dialouge.parent().find('div.ui-dialog-buttonset')
+			.empty()
+			.append( buttons.parent() );
+
+		if ( callback ) {
+			callback();
+		}
+	},
+
+	close: function ( dte, callback ) {
+		if ( dte.__dialouge ) {
+			// Don't want to trigger a close() call from dialogclose!
+			doingClose = true;
+			dte.__dialouge.dialog( 'close' );
+			doingClose = false;
+		}
+
+		if ( callback ) {
+			callback();
+		}
+	},
+
+	node: function ( dte ) {
+		return dte.__dialouge[0];
+	},
+
+	// jQuery UI dialogues perform their own focus capture
+	captureFocus: false
+} );
+
+
+Editor.display.jqueryui.modalOptions = {
+	width: 600,
+	modal: true
+};
+
+
+return DataTable.Editor;
+}));
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/Editor-1.5.6/js/editor.jqueryui.min.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,8 @@
+/*!
+ jQuery UI integration for DataTables' Editor
+ ©2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(b){"function"===typeof define&&define.amd?define(["jquery","datatables.net-jqui","datatables.net-editor"],function(c){return b(c,window,document)}):"object"===typeof exports?module.exports=function(c,a){c||(c=window);if(!a||!a.fn.dataTable)a=require("datatables.net-jqui")(c,a).$;a.fn.dataTable.Editor||require("datatables.net-editor")(c,a);return b(a,c,c.document)}:b(jQuery,window,document)})(function(b){var c=b.fn.dataTable,a=c.Editor,e=!1;a.defaults.display="jqueryui";b.extend(!0,b.fn.dataTable.Editor.classes,
+{form:{button:"btn ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"}});a.display.jqueryui=b.extend(!0,{},a.models.displayController,{init:function(d){d.__dialouge=b("<div/>").css("display","none").appendTo("body").dialog(b.extend(true,a.display.jqueryui.modalOptions,{autoOpen:false,buttons:{A:function(){}},closeOnEscape:false}));b(d.__dialouge).on("dialogclose",function(){e||d.close()});return a.display.jqueryui},open:function(d,a,c){d.__dialouge.append(a).dialog("open");b(d.dom.formError).appendTo(d.__dialouge.parent().find("div.ui-dialog-buttonpane"));
+d.__dialouge.parent().find(".ui-dialog-title").html(d.dom.header.innerHTML);d.__dialouge.parent().addClass("DTED");a=b(d.dom.buttons).children().addClass("ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only").each(function(){b(this).wrapInner('<span class="ui-button-text" />')});d.__dialouge.parent().find("div.ui-dialog-buttonset").empty().append(a.parent());c&&c()},close:function(a,b){if(a.__dialouge){e=true;a.__dialouge.dialog("close");e=false}b&&b()},node:function(a){return a.__dialouge[0]},
+captureFocus:!1});a.display.jqueryui.modalOptions={width:600,modal:!0};return c.Editor});
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/boxplots.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,608 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var displayMarkerTable = function(plotconfig){
+  var nbm = plotconfig.mrkrNames.length + 1;
+  $(plotconfig.mtable).empty();
+  plotconfig.allMarkers.map(function(v) {
+    $(plotconfig.mtable).append('<tr>'
+        + '<td><span style="background-color:rgba(0,0,0,' + (v + 1 )/ nbm + ')'
+        + '">&nbsp;&nbsp;&nbsp;</span></td>'
+        + '<td title="' + plotconfig.mrkrNames[v] + '">'
+        + plotconfig.mrkrNames[v] + '</td>'
+        + '<td align="center"><input type="checkbox" checked class='
+        + plotconfig.mrkrSelect + ' value=' + v + '/></td></tr>');
+  });
+  if (nbm > 5) {
+    $(plotconfig.mrkrSelectAll).prop('checked', false);
+    $(plotconfig.mrkrSelectAll).prop('disabled', true);
+    $('#markerWarning').show();
+    $(plotconfig.mrkrSelectj).each(function() {
+      var selectedMrkr = parseInt(this.value);
+      if (selectedMrkr > 4){
+        this.checked = false;
+        this.disabled = true;
+      } else {
+        this.checked = true;
+      }
+    });
+  }
+
+  $(plotconfig.mrkrSelectAll).click(function() {
+    var checkAll = $(plotconfig.mrkrSelectAll).prop('checked');
+    if (checkAll) {
+      $(plotconfig.mrkrSelectj).prop("checked", true);
+    } else {
+      $(plotconfig.mrkrSelectj).prop("checked", false);
+    }
+    updateCSplots(plotconfig);
+  });
+
+  $(plotconfig.mrkrSelectj).click(function() {
+    if (nbm < 6){
+      if ($(plotconfig.mrkrSelectj).length == $(plotconfig.mrkrSelectCheck).length) {
+        $(plotconfig.mrkrSelectAll).prop("checked",true);
+      } else {
+        $(plotconfig.mrkrSelectAll).prop("checked",false);
+      }
+    } else {
+      var nbSelected = 0;
+      $(plotconfig.mrkrSelectj).each(function() {
+        if (this.checked) {nbSelected++}
+      });
+      if (nbSelected < 5) {
+        $(plotconfig.mrkrSelectj).prop('disabled', false);
+      } else {
+        $(plotconfig.mrkrSelectj).each(function() {
+          if (!this.checked) {
+            this.disabled = true;
+          }
+        });
+      }
+    }
+    updateCSplots(plotconfig);
+  });
+};
+
+var updateBoxplot = function(plotconfig){
+  var margin = {top: 30, right: 10, bottom: 50, left: 60},
+      h = 0,
+      w = 0,
+      width = 0,
+      height = 0,
+      labels = false, // show the text labels beside individual boxplots?
+      mfi_option = false,
+      min = Infinity,
+      max = -Infinity,
+      checkLabels = $(plotconfig.displayvalues).prop("checked"),
+      checkMFI = $(plotconfig.displayMFI).prop("checked"),
+      dataToPlot = [],
+      tmp = [],
+      nbm = plotconfig.mrkrNames.length + 1,
+      maxRange = 0,
+      minRange = 0,
+      domainx = [],
+      domainx1 = [];
+
+  $(plotconfig.plotdivj).empty();
+  h = $(window).height() - 200;
+  $(plotconfig.plotdivj).height(h);
+  w = $(plotconfig.plotdivj).width();
+  width = w - margin.left - margin.right;
+  height = h - margin.top - margin.bottom;
+
+  var svg = d3.select(plotconfig.plotdivj).append("svg")
+      .attr("width", w)
+      .attr("height", h)
+      .attr("class", "box")
+    .append("g")
+      .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+  if (checkLabels) {
+      labels = true;
+  };
+  if (checkMFI) {
+      mfi_option = true;
+  };
+  /* Get the data in proper shape to feed to the boxplot function
+  want [Object, Object, ..., Object] where Object:
+    'population': pop
+    'Data' : [Object, Object, ..., Object] where Object:
+        'Marker' : marker name
+        'outliers' : outliers
+  */
+
+  if (plotconfig.view == 'p') {
+    plotconfig.selectedPopulations.forEach(function(p) {
+      tmpPlot = [];
+      plotconfig.selectedMarkers.forEach(function(m) {
+        var markernm = plotconfig.mrkrNames[m],
+            qtmp = [
+                +plotconfig.csdata.q1[markernm][p],
+                +plotconfig.csdata.q2[markernm][p],
+                +plotconfig.csdata.q3[markernm][p]
+            ],
+            wtmp = [
+                +plotconfig.csdata.lower[markernm][p],
+                +plotconfig.csdata.upper[markernm][p]
+            ];
+        tmp = [];
+        // Get min and max while we're here
+        plotconfig.csdata.outliers[markernm][p].forEach(function(outl) {
+          tmp.push(+outl);
+          if (+outl > max) {max = +outl};
+          if (+outl < min) {min = +outl};
+        });
+        if (+plotconfig.csdata.upper[markernm][p] > max) {
+          max = +plotconfig.csdata.upper[markernm][p];
+        };
+        if (+plotconfig.csdata.lower[markernm][p] < min) {
+          min = +plotconfig.csdata.lower[markernm][p];
+        };
+        tmpPlot.push({
+            marker: markernm,
+            outliers: tmp,
+            quartiles: qtmp,
+            whiskers: wtmp,
+            config: [m,p, nbm],
+            mfi: +plotconfig.csdata.mfi[markernm][p]
+        });
+      });
+      dataToPlot.push({population:p, popdata: tmpPlot});
+    });
+  } else {
+    plotconfig.selectedMarkers.forEach(function(m) {
+      var markernm = plotconfig.mrkrNames[m];
+      tmpPlot = [];
+      plotconfig.selectedPopulations.forEach(function(p) {
+        var qtmp = [
+                +plotconfig.csdata.q1[markernm][p],
+                +plotconfig.csdata.q2[markernm][p],
+                +plotconfig.csdata.q3[markernm][p]
+            ],
+           wtmp = [
+                +plotconfig.csdata.lower[markernm][p],
+                +plotconfig.csdata.upper[markernm][p]
+            ];
+        tmp = [];
+        // Get min and max while we're here
+        plotconfig.csdata.outliers[markernm][p].forEach(function(outl) {
+          tmp.push(+outl);
+          if (+outl > max) {max = +outl};
+          if (+outl < min) {min = +outl};
+        });
+        if (+plotconfig.csdata.upper[markernm][p] > max) {
+          max = +plotconfig.csdata.upper[markernm][p];
+        };
+        if (+plotconfig.csdata.lower[markernm][p] < min) {
+          min = +plotconfig.csdata.lower[markernm][p];
+        };
+        tmpPlot.push({
+            population:p,
+            outliers: tmp,
+            quartiles: qtmp,
+            whiskers: wtmp,
+            config: [m,p, nbm],
+            mfi: +plotconfig.csdata.mfi[markernm][p]
+        });
+      });
+      dataToPlot.push({marker: markernm, popdata: tmpPlot});
+    });
+  };
+  maxRange = max + 30;
+  minRange = min - 30;
+
+  if (plotconfig.view == 'p') {
+    domainx = plotconfig.selectedPopulations;
+    domainx1 = plotconfig.selectedMarkers.map(function(d){
+      return plotconfig.mrkrNames[d];
+    });
+  } else {
+    domainx1 = plotconfig.selectedPopulations;
+    domainx = plotconfig.selectedMarkers.map(function(d){
+      return plotconfig.mrkrNames[d];
+    });
+  }
+  // axes
+  var xScale = d3.scale.ordinal()
+      .domain(domainx)
+      .rangeRoundBands([0 , width], 0.2, 0.02);
+
+  var x1Scale = d3.scale.ordinal()
+      .domain(domainx1)
+      .rangeRoundBands([0, xScale.rangeBand()], 0.1);
+
+  var xAxis = d3.svg.axis()
+      .scale(xScale)
+      .orient("bottom");
+
+  // the y-axis
+  var yScale = d3.scale.linear()
+      .domain([minRange, maxRange])
+      .range([height + margin.top, 0 + margin.top]);
+
+  var yAxis = d3.svg.axis()
+      .scale(yScale)
+      .orient("left")
+      .tickFormat(d3.format("d"));
+
+  svg.append("g")
+      .attr("class", "x axisbp")
+      .attr("transform", "translate(0," + (height + margin.top) + ")")
+      .call(xAxis);
+
+  svg.append("g")
+      .attr("class", "y axisbp")
+      .call(yAxis)
+    .append("text")
+      .attr("class", "ylabel")
+      .attr("transform", "rotate(-90)")
+      .attr("y", 0 - margin.left)
+      .attr("x", 0 - (height / 2))
+      .attr("dy", "1em")
+      .style("text-anchor", "middle")
+      .text("MFI values");
+
+  var boxplot = d3.box()
+      .width(x1Scale.rangeBand())
+      .height(height + margin.top)
+      .domain([minRange, maxRange])
+      .showLabels(labels)
+      .showMFI(mfi_option);
+
+  if (plotconfig.view == 'p'){
+    var group = svg.selectAll(".groups")
+        .data(dataToPlot)
+      .enter().append("g")
+        .attr("class", "group")
+        .attr("transform", function(d) {
+            return "translate(" + xScale(d.population) + ",0)";
+        });
+
+    group.selectAll(".box")
+        .data(function(d) { return d.popdata; })
+      .enter().append("g")
+        .attr("transform", function(d) {return "translate(" + x1Scale(d.marker) + ",0)"; })
+        .call(boxplot);
+  } else {
+    var group = svg.selectAll(".groups")
+        .data(dataToPlot)
+      .enter().append("g")
+        .attr("class", "group")
+        .attr("transform", function(d) {
+            return "translate(" + xScale(d.marker) + ",0)";
+        });
+
+      group.selectAll(".box")
+          .data(function(d) { return d.popdata; })
+        .enter().append("g")
+          .attr("transform", function(d) { return "translate(" + x1Scale(d.population) + ",0)"; })
+          .call(boxplot);
+  }
+};
+
+(function() {
+  // Inspired by http://informationandvisualization.de/blog/box-plot
+  // Modified to fit our data structure.
+  d3.box = function() {
+    var width = 1,
+        height = 1,
+        duration = 0,
+        domain = null,
+        value = Number,
+        showLabels = true, // whether or not to show text labels
+        numBars = 4,
+        curBar = 1,
+        showMFI = true, // display MFI ?
+        tickFormat = null,
+        margin = {top: 30, right: 10, bottom: 50, left: 60};
+
+    // For each small multiple…
+    function box(g) {
+      g.each(function(data, i) {
+        var d = data.outliers.sort(d3.ascending),
+            g = d3.select(this),
+            n = d.length,
+            min = Infinity,
+            max = -Infinity;
+        if (n > 0){
+            min = d[0],
+            max = d[n - 1];
+        }
+        // Readjust min and max with upper and lower values
+        if (data.whiskers[0] < min) {min = data.whiskers[0]}
+        if (data.whiskers[1] > max) {max = data.whiskers[1]}
+        // Compute quartiles. Must return exactly 3 elements.
+        var quartileData = data.quartiles;
+        // Compute whiskers. Must return exactly 2 elements, or null.
+        var whiskerData = data.whiskers;
+        // Compute outliers. here all data in d is an outlier.
+        // We compute the outliers as indices, so that we can join across transitions!
+        var outlierIndices = d3.range(n);
+        var mfiData = data.mfi;
+        // this is the scale for ONE SET of values
+        // Compute the new x-scale.
+        var x1 = d3.scale.linear()
+            .domain(domain && domain.call(this, d, i) || [min, max])
+            .range([height , 0 + margin.top ]);
+        // Retrieve the old x-scale, if this is an update.
+        var x0 = this.__chart__ || d3.scale.linear()
+            .domain([0, Infinity])
+            .range(x1.range());
+
+        // Stash the new scale.
+        this.__chart__ = x1;
+// Note: the box, median, and box tick elements are fixed in number,
+// so we only have to handle enter and update. In contrast, the outliers
+// and other elements are variable, so we need to exit them! Variable
+// elements also fade in and out.
+        // Update center line: the vertical line spanning the whiskers.
+        var center = g.selectAll("line.center")
+            .data(whiskerData ? [whiskerData] : []);
+
+        //vertical line
+        center.enter().insert("line", "rect")
+            .attr("class", "center")
+            .attr("x1", width / 2)
+            .attr("y1", function(d) { return x0(d[0]); })
+            .attr("x2", width / 2)
+            .attr("y2", function(d) { return x0(d[1]); })
+            .style("opacity", 1e-6)
+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })
+          .transition()
+            .duration(duration)
+            .style("opacity", 1)
+            .attr("y1", function(d) { return x1(d[0]); })
+            .attr("y2", function(d) { return x1(d[1]); });
+
+        center.transition()
+            .duration(duration)
+            .style("opacity", 1)
+            .attr("y1", function(d) { return x1(d[0]); })
+            .attr("y2", function(d) { return x1(d[1]); });
+
+        center.exit().transition()
+            .duration(duration)
+            .style("opacity", 1e-6)
+            .attr("y1", function(d) { return x1(d[0]); })
+            .attr("y2", function(d) { return x1(d[1]); })
+            .remove();
+
+        // Update innerquartile box.
+        var box = g.selectAll("rect.box")
+            .data([quartileData]);
+
+        box.enter().append("rect")
+            .attr("class", "box")
+            .style("fill", function(d) {
+                var nbm = data.config[2],
+                    pop = data.config[1],
+                    mrkr = data.config[0];
+                var color = color_palette[0][pop][1] + (mrkr + 1 )/ nbm + ')';
+                return color; })
+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })
+            .attr("x", 0)
+            .attr("y", function(d) { return x0(d[2]); })
+            .attr("width", width)
+            .attr("height", function(d) { return x0(d[0]) - x0(d[2]); })
+          .transition()
+            .duration(duration)
+            .attr("y", function(d) { return x1(d[2]); })
+            .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+        box.transition()
+            .duration(duration)
+            .attr("y", function(d) { return x1(d[2]); })
+            .attr("height", function(d) { return x1(d[0]) - x1(d[2]); });
+
+        // Update median line.
+        var medianLine = g.selectAll("line.median")
+            .data([quartileData[1]]);
+
+        medianLine.enter().append("line")
+            .attr("class", "median")
+            .attr("x1", 0)
+            .attr("y1", x0)
+            .attr("x2", width)
+            .attr("y2", x0)
+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })
+          .transition()
+            .duration(duration)
+            .attr("y1", x1)
+            .attr("y2", x1);
+
+        medianLine.transition()
+            .duration(duration)
+            .attr("y1", x1)
+            .attr("y2", x1);
+
+        // Update MFI line.
+        var MFILine = g.selectAll("line.mfi")
+            .data([mfiData]);
+        if (showMFI == true) {
+            MFILine.enter().append("line")
+                .attr("class", "mfi")
+                .style("stroke", function(d){ return color_palette[0][data.config[1]][2]; })
+                .attr("x1", 0)
+                .attr("y1", x0)
+                .attr("x2", width)
+                .attr("y2", x0)
+              .transition()
+                .duration(duration)
+                .attr("y1", x1)
+                .attr("y2", x1);
+
+            MFILine.transition()
+                .duration(duration)
+                .attr("y1", x1)
+                .attr("y2", x1);
+        }
+
+        // Update whiskers.
+        var whisker = g.selectAll("line.whisker")
+            .data(whiskerData || []);
+
+        whisker.enter().insert("line", "circle, text")
+            .attr("class", "whisker")
+            .attr("x1", 0)
+            .attr("y1", x0)
+            .attr("x2", 0 + width)
+            .attr("y2", x0)
+            .style("opacity", 1e-6)
+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })
+          .transition()
+            .duration(duration)
+            .attr("y1", x1)
+            .attr("y2", x1)
+            .style("opacity", 1);
+
+        whisker.transition()
+            .duration(duration)
+            .attr("y1", x1)
+            .attr("y2", x1)
+            .style("opacity", 1);
+
+        whisker.exit().transition()
+            .duration(duration)
+            .attr("y1", x1)
+            .attr("y2", x1)
+            .style("opacity", 1e-6)
+            .remove();
+
+        // Update outliers.
+        var outlier = g.selectAll("circle.outlier")
+            .data(outlierIndices, Number);
+
+        outlier.enter().insert("circle", "text")
+            .attr("class", "outlier")
+            .attr("r", 3)
+            .attr("cx", function(d){
+                  return Math.floor(Math.random() * width);
+                })
+            .attr("cy", function(i) { return x0(d[i]); })
+            .style("opacity", 1e-6)
+            .style("fill", function(d) {
+                    var nbm = data.config[2],
+                        pop = data.config[1],
+                        mrkr = data.config[0];
+                    var color = color_palette[0][pop][1] + (mrkr + 1 )/ nbm + ')';
+                    return color; })
+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })
+          .transition()
+            .duration(duration)
+            .attr("cy", function(i) { return x1(d[i]); })
+            .style("opacity", 1);
+
+        outlier.transition()
+            .duration(duration)
+            .attr("cy", function(i) { return x1(d[i]); })
+            .style("opacity", 1);
+
+        outlier.exit().transition()
+            .duration(duration)
+            .attr("cy", function(i) { return x1(d[i]); })
+            .style("opacity", 1e-6)
+            .remove();
+
+        // Compute the tick format.
+        var format = tickFormat || x1.tickFormat(8);
+
+        // Update box ticks.
+        var boxTick = g.selectAll("text.box")
+            .data(quartileData);
+        if(showLabels == true) {
+          boxTick.enter().append("text")
+              .attr("class", "box")
+              .attr("dy", ".3em")
+              .attr("dx", function(d, i) { return i & 1 ? 6 : -6 })
+              .attr("x", function(d, i) { return i & 1 ?  + width : 0 })
+              .attr("y", x0)
+              .attr("text-anchor", function(d, i) { return i & 1 ? "start" : "end"; })
+              .text(format)
+            .transition()
+              .duration(duration)
+              .attr("y", x1);
+        }
+
+        boxTick.transition()
+            .duration(duration)
+            .text(format)
+            .attr("y", x1);
+
+        // Update whisker ticks. These are handled separately from the box
+        // ticks because they may or may not exist, and we want don't want
+        // to join box ticks pre-transition with whisker ticks post-.
+        var whiskerTick = g.selectAll("text.whisker")
+            .data(whiskerData || []);
+        if(showLabels == true) {
+          whiskerTick.enter().append("text")
+              .attr("class", "whisker")
+              .attr("dy", ".3em")
+              .attr("dx", 6)
+              .attr("x", width)
+              .attr("y", x0)
+              .text(format)
+              .style("opacity", 1e-6)
+            .transition()
+              .duration(duration)
+              .attr("y", x1)
+              .style("opacity", 1);
+        }
+        whiskerTick.transition()
+            .duration(duration)
+            .text(format)
+            .attr("y", x1)
+            .style("opacity", 1);
+
+        whiskerTick.exit().transition()
+            .duration(duration)
+            .attr("y", x1)
+            .style("opacity", 1e-6)
+            .remove();
+      });
+      d3.timer.flush();
+    }
+
+    box.width = function(x) {
+      if (!arguments.length) return width;
+      width = x;
+      return box;
+    };
+    box.height = function(x) {
+      if (!arguments.length) return height;
+      height = x;
+      return box;
+    };
+    box.tickFormat = function(x) {
+      if (!arguments.length) return tickFormat;
+      tickFormat = x;
+      return box;
+    };
+    box.duration = function(x) {
+      if (!arguments.length) return duration;
+      duration = x;
+      return box;
+    };
+    box.domain = function(x) {
+      if (!arguments.length) return domain;
+      domain = x == null ? x : d3.functor(x);
+      return box;
+    };
+    box.value = function(x) {
+      if (!arguments.length) return value;
+      value = x;
+      return box;
+    };
+    box.showLabels = function(x) {
+      if (!arguments.length) return showLabels;
+      showLabels = x;
+      return box;
+    };
+    box.showMFI = function(x) {
+      if (!arguments.length) return showMFI;
+      showMFI = x;
+      return box;
+    };
+    return box;
+  };
+})();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/color_palette.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,226 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+/* Palettes for graphics.
+* 0 -> Liz's palette (original ImmPort color scheme for graphics)
+* 1 -> Cris's palette (diverging)
+* 2 -> Christmas (diverging)
+* 3 -> not Christmas (sequential color blind friendly)
+* 4 -> Rainbow (sequential)
+* arrays are color HEX, color RGB (for transparency effect), contrasting color, darker shade for borders
+*/
+var color_palette = [[
+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],
+	['#FF0000','rgba(255,0,0,','rgba(52,17,81,1)','#D21111'],
+	['#FFFF00','rgba(255,255,0,','rgba(52,17,81,1)','#FFC900'],
+	['#008000','rgba(0,128,0,','rgba(52,17,81,1)','#016D01'],
+	['#0000FF','rgba(0,0,255,','rgba(255,0,0,1)','#2121A0'],
+	['#FFA500','rgba(255,165,0,','rgba(52,17,81,1)','#DE991B'],
+	['#8A2BE2','rgba(138,43,226,','rgba(52,17,81,1)','#6A0EBF'],
+	['#808000','rgba(128,128,0,','rgba(52,17,81,1)','#66660A'],
+	['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#1DCBCB'],
+	['#FF00FF','rgba(255,0,255,','rgba(52,17,81,1)','#A009A0'],
+	['#00FF00','rgba(0,255,0,','rgba(52,17,81,1)','#20AB20'],
+	['#000080','rgba(0,0,128,','rgba(255,0,0,1)','#13135B'],
+	['#F08080','rgba(240,128,128,','rgba(52,17,81,1)','#922626'],
+	['#800080','rgba(128,0,128,','rgba(255,0,0,1)','#580B58'],
+	['#F0E68C','rgba(240,230,140,','rgba(52,17,81,1)','#F0C08C'],
+	['#8FBC8F','rgba(143,188,143,','rgba(52,17,81,1)','#668166'],
+	['#2F4F4F','rgba(47,79,79,','rgba(52,17,81,1)','#0E3636'],
+	['#008080','rgba(0,128,128,','rgba(52,17,81,1)','#095454'],
+	['#9932CC','rgba(153,50,204,','rgba(52,17,81,1)','#78289F'],
+	['#FF7F50','rgba(255,127,80,','rgba(52,17,81,1)','#B0431A'],
+	['#FFD700','rgba(255,215,0,','rgba(52,17,81,1)','#FFB900'],
+	['#008B8B','rgba(0,139,139,','rgba(52,17,81,1)','#097171'],
+	['#800000','rgba(128,0,0,','rgba(255,0,0,1)','#500303'],
+	['#5F9EA0','rgba(95,158,160,','rgba(52,17,81,1)','#366668'],
+	['#FFC0CB','rgba(255,192,203,','rgba(52,17,81,1)','#FC869B'],
+	['#545454','rgba(84,84,84,','rgba(255,0,0,1)','#342C2C'],
+	['#7FFFD4','rgba(127,255,212,','rgba(255,0,0,1)','#8CCAB5'],
+	['#ADD8E6','rgba(173,216,230,','rgba(52,17,81,1)','#77C6DF'],
+	['#DB7093','rgba(219,112,147,','rgba(52,17,81,1)','#B24B6D'],
+	['#CD853F','rgba(205,133,63,','rgba(52,17,81,1)','#BA6D22'],
+	['#4169E1','rgba(65,105,225,','rgba(52,17,81,1)','#1840B8'],
+	['#708090','rgba(112,128,144,','rgba(52,17,81,1)','#465A6D'],
+	['#4682B4','rgba(70,130,180,','rgba(52,17,81,1)','#1F5785'],
+	['#D8BFD8','rgba(216,191,216,','rgba(52,17,81,1)','#B679B6'],
+	['#F5DEB3','rgba(245,222,179,','rgba(52,17,81,1)','#E9AB3F'],
+	['#9ACD32','rgba(154,205,50,','rgba(52,17,81,1)','#6E971B'],
+	['#BDB76B','rgba(189,183,107,','rgba(52,17,81,1)','#938E49'],
+	['#8B008B','rgba(139,0,139,','rgba(255,0,0,1)','#590A59'],
+	['#556B2F','rgba(85,107,47,','rgba(52,17,81,1)','#3A4D19'],
+	['#00CED1','rgba(0,206,209,','rgba(52,17,81,1)','#1BA0A2'],
+	['#FF1493','rgba(255,20,147,','rgba(52,17,81,1)','#A40F5F']
+],[
+	//cris
+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],
+	['#5B1A48','rgba(91,26,72,','rgba(255,0,0,1)','#922B74'],
+	['#1ED992','rgba(30,217,146,','rgba(52,17,81,1)','#108A5B'],
+	['#FFE4FF','rgba(255,228,255,','rgba(52,17,81,1)','#FF9AFF'],
+	['#3B2000','rgba(59,32,0,','rgba(255,0,0,1)','#8C4D02'],
+	['#BDF765','rgba(189,247,101,','rgba(52,17,81,1)','#83b438'],
+	['#C6DCFD','rgba(198,220,253,','rgba(52,17,81,1)','#70A9FE'],
+	['#542788','rgba(84,39,136,','rgba(255,0,0,1)','#8055B2'],
+	['#FB8072','rgba(251,128,114,','rgba(52,17,81,1)','#D55446'],
+	['#F2E0B8','rgba(242,224,184,','rgba(52,17,81,1)','#F9C146'],
+	['#0A684C','rgba(10,104,76,','rgba(52,17,81,1)','#27B88D'],
+	['#FD8ADC','rgba(253,138,220,','rgba(52,17,81,1)','#CB3AA2'],
+	['#CDFAFF','rgba(205,250,255,','rgba(52,17,81,1)','#66EDFC'],
+	['#0C1657','rgba(12,22,87,','rgba(255,0,0,1)','#3243B6'],
+	['#FFDE69','rgba(255,222,105,','rgba(52,17,81,1)','#CFAD34'],
+	['#BEBADA','rgba(190,186,218,','rgba(52,17,81,1)','#6A5EBA'],
+	['#8D182B','rgba(141,24,43,','rgba(52,17,81,1)','#5E0412'],
+	['#FFFF00','rgba(255,255,0,','rgba(52,17,81,1)','#FFC900'],
+	['#788D84','rgba(120,141,132,','rgba(52,17,81,1)','#496F5F'],
+	['#A53DD5','rgba(165,61,213,','rgba(52,17,81,1)','#66178A'],
+	['#5DF33F','rgba(93,243,63,','rgba(52,17,81,1)','#47A035'],
+	['#C8C8C8','rgba(200,200,200,','rgba(52,17,81,1)','#878484'],
+	['#9A1B7D','rgba(154,27,125,','rgba(52,17,81,1)','#D54BB5'],
+	['#1068BD','rgba(16,104,189,','rgba(52,17,81,1)','#0C3156'],
+	['#C7EAE5','rgba(199,234,229,','rgba(52,17,81,1)','#68B8AC'],
+	['#8C510A','rgba(140,81,10,','rgba(52,17,81,1)','#653B07'],
+	['#FFBD01','rgba(255,189,1,','rgba(52,17,81,1)','#CE9800'],
+	['#DFFCC5','rgba(223,252,197,','rgba(52,17,81,1)','#99C670'],
+	['#41C8C4','rgba(65,200,196,','rgba(52,17,81,1)','#24918E'],
+	['#9685F5','rgba(150,133,245,','rgba(52,17,81,1)','#6257A1'],
+	['#D8B365','rgba(216,179,101,','rgba(52,17,81,1)','#9F7E39'],
+	['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#1DCBCB'],
+	['#F1F1A2','rgba(241,241,162,','rgba(52,17,81,1)','#CECE54'],
+	['#AFBFFD','rgba(175,191,253,','rgba(52,17,81,1)','#5E72BF'],
+	['#FF0019','rgba(255,0,25,','rgba(52,17,81,1)','#970110'],
+	['#8A598A','rgba(138,89,138,','rgba(52,17,81,1)','#602E60'],
+	['#75B030','rgba(117,176,48,','rgba(52,17,81,1)','#3D690A'],
+	['#0A5A83','rgba(10,90,131,','rgba(52,17,81,1)','#0F3447'],
+	['#937B6A','rgba(147,123,106,','rgba(52,17,81,1)','#473121'],
+	['#1540EC','rgba(21,64,236,','rgba(255,0,0,1)','#0C2589'],
+	['#010101','rgba(1,1,1,','rgba(255,0,0,1)','#4A4242']
+],[
+	//christmas
+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],
+	['#BD1A00','rgba(189,26,0,','rgba(52,17,81,1)','#7B1E0F'],
+	['#FF8F68','rgba(255,143,104,','rgba(52,17,81,1)','#BC4F28'],
+	['#FFFFBF','rgba(255,255,191,','rgba(52,17,81,1)','#EAEA72'],
+	['#1A9850','rgba(26,152,80,','rgba(52,17,81,1)','#0F582F'],
+	['#BDF765','rgba(189,247,101,','rgba(52,17,81,1)','#73B70C'],
+	['#542788','rgba(84,39,136,','rgba(255,0,0,1)','#230941'],
+	['#998EC3','rgba(153,142,195,','rgba(52,17,81,1)','#483884'],
+	['#D8DAEB','rgba(216,218,235,','rgba(52,17,81,1)','#7581E9'],
+	['#5A95B8','rgba(90,149,184,','rgba(52,17,81,1)','#154C6C'],
+	['#01555E','rgba(1,85,94,','rgba(255,0,0,1)','#04272A'],
+	['#FEE0B6','rgba(254,224,182,','rgba(52,17,81,1)','#C8954F'],
+	['#F1A340','rgba(241,163,64,','rgba(52,17,81,1)','#BD7519'],
+	['#B35806','rgba(179,88,6,','rgba(52,17,81,1)','#683303'],
+	['#8D182B','rgba(141,24,43,','rgba(52,17,81,1)','#5B0B18'],
+	['#EF8AB4','rgba(239,138,180,','rgba(52,17,81,1)','#E7337E'],
+	['#C51B7D','rgba(197,27,125,','rgba(52,17,81,1)','#690840'],
+	['#3B2000','rgba(59,32,0,','rgba(255,0,0,1)','#120A00'],
+	['#8C510A','rgba(140,81,10,','rgba(52,17,81,1)','#442907'],
+	['#D8B365','rgba(216,179,101,','rgba(52,17,81,1)','#816426'],
+	['#C7EAE5','rgba(199,234,229,','rgba(52,17,81,1)','#54AB9F'],
+	['#41B6C4','rgba(65,182,196,','rgba(52,17,81,1)','#167D89'],
+	['#225EA8','rgba(34,94,168,','rgba(52,17,81,1)','#103B6F'],
+	['#0C1657','rgba(12,22,87,','rgba(255,0,0,1)','#030933'],
+	['#00FF00','rgba(0,255,0,','rgba(52,17,81,1)','#20AB20'],
+	['#FF0000','rgba(255,0,0,','rgba(52,17,81,1)','#D21111'],
+	['#AFAFAF','rgba(175,175,175,','rgba(52,17,81,1)','#818D8D'],
+	['#FFFF00','rgba(255,255,0,','rgba(52,17,81,1)','#FFC900'],
+	['#FF00DB','rgba(255,0,219,','rgba(52,17,81,1)','#A70C91'],
+	['#0000FF','rgba(0,0,255,','rgba(255,0,0,1)','#2121A0'],
+	['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#1DCBCB'],
+	['#95E199','rgba(149,225,153,','rgba(52,17,81,1)','#369F3B'],
+	['#A53DD5','rgba(165,61,213,','rgba(52,17,81,1)','#590480'],
+	['#1A4A26','rgba(26,74,38,','rgba(255,0,0,1)','#08240F'],
+	['#FCCDE5','rgba(252,205,229,','rgba(52,17,81,1)','#D082AA'],
+	['#FDB462','rgba(255,222,105,','rgba(52,17,81,1)','#D77C15'],
+	['#FFDE69','rgba(253,180,98,','rgba(52,17,81,1)','#E6B505'],
+	['#80B1D3','rgba(128,177,211,','rgba(52,17,81,1)','#306E99'],
+	['#737B1B','rgba(115,123,27,','rgba(52,17,81,1)','#424705'],
+	['#BEBADA','rgba(190,186,218,','rgba(52,17,81,1)','#514984'],
+	['#8DD3C7','rgba(141,211,199,','rgba(52,17,81,1)','#248D7B']
+],[
+// Not christmas
+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],
+	['#781C81','rgba(120,28,129,','rgba(255,0,0,1)','#49074F'],
+	['#61187E','rgba(97,24,126,','rgba(255,0,0,1)','#3B0251'],
+	['#531B7F','rgba(83,27,127,','rgba(255,0,0,1)','#320356'],
+	['#4A2384','rgba(74,35,132,','rgba(255,0,0,1)','#260656'],
+	['#442E8A','rgba(68,46,138,','rgba(255,0,0,1)','#1E0A5C'],
+	['#413B93','rgba(65,59,147,','rgba(255,0,0,1)','#18125E'],
+	['#3F499D','rgba(63,73,157,','rgba(255,0,0,1)','#17206F'],
+	['#3F58A8','rgba(63,88,168,','rgba(255,0,0,1)','#11276C'],
+	['#4066B2','rgba(64,102,178,','rgba(255,0,0,1)','#16377B'],
+	['#4273BB','rgba(66,115,187,','rgba(255,0,0,1)','#13438A'],
+	['#447FC0','rgba(68,127,192,','rgba(52,17,81,1)','#164F8E'],
+	['#488AC2','rgba(72,138,194,','rgba(52,17,81,1)','#195A92'],
+	['#4C94BF','rgba(76,148,191,','rgba(52,17,81,1)','#1C6490'],
+	['#519CB8','rgba(81,156,184,','rgba(52,17,81,1)','#1E6D8B'],
+	['#57A3AE','rgba(87,163,174,','rgba(52,17,81,1)','#287985'],
+	['#5EA9A2','rgba(94,169,162,','rgba(52,17,81,1)','#277A72'],
+	['#65AE95','rgba(101,174,149,','rgba(52,17,81,1)','#28785D'],
+	['#6DB388','rgba(109,179,136,','rgba(52,17,81,1)','#348252'],
+	['#76B67D','rgba(118,182,125,','rgba(52,17,81,1)','#388340'],
+	['#7FB972','rgba(127,185,114,','rgba(52,17,81,1)','#448635'],
+	['#88BB69','rgba(136,187,105,','rgba(52,17,81,1)','#518730'],
+	['#92BD60','rgba(146,189,96,','rgba(52,17,81,1)','#62902D'],
+	['#9CBE59','rgba(156,190,89,','rgba(52,17,81,1)','#6D9028'],
+	['#A7BE53','rgba(167,190,83,','rgba(52,17,81,1)','#70871D'],
+	['#B1BE49','rgba(177,190,78,','rgba(52,17,81,1)','#7C8919'],
+	['#BABC49','rgba(186,188,73,','rgba(52,17,81,1)','#87891B'],
+	['#C3BA45','rgba(195,186,69,','rgba(52,17,81,1)','#928917'],
+	['#CCB742','rgba(204,183,66,','rgba(52,17,81,1)','#AC9516'],
+	['#D3B33F','rgba(211,179,63,','rgba(52,17,81,1)','#A78713'],
+	['#DAAD3C','rgba(218,173,60,','rgba(52,17,81,1)','#AB7E0D'],
+	['#DFA539','rgba(223,165,57,','rgba(52,17,81,1)','#B17609'],
+	['#E39C37','rgba(227,156,55,','rgba(52,17,81,1)','#BB730D'],
+	['#E59134','rgba(229,145,52,','rgba(52,17,81,1)','#B16006'],
+	['#E78432','rgba(231,132,50,','rgba(52,17,81,1)','#B45404'],
+	['#E7752F','rgba(231,117,47,','rgba(52,17,81,1)','#763703'],
+	['#E6652D','rgba(230,101,45,','rgba(52,17,81,1)','#AD3906'],
+	['#E4542A','rgba(228,84,42,','rgba(52,17,81,1)','#AE2A04'],
+	['#E14326','rgba(225,67,38,','rgba(52,17,81,1)','#AD1E04'],
+	['#DD3123','rgba(221,49,35,','rgba(52,17,81,1)','#A11105'],
+	['#D92120','rgba(217,33,32,','rgba(52,17,81,1)','#8A0201']
+],[
+// Rainbow
+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],
+	['#FF0000','rgba(255,0,0,','rgba(52,17,81,1)','#C30707'],
+	['#FF2600','rgba(255,38,0,','rgba(52,17,81,1)','#BA250B'],
+	['#FF4D00','rgba(255,77,0,','rgba(52,17,81,1)','#BD3A02'],
+	['#FF7300','rgba(255,115,0,','rgba(52,17,81,1)','#C15B06'],
+	['#FF9900','rgba(255,153,0,','rgba(52,17,81,1)','#BF7504'],
+	['#FFBF00','rgba(255,191,0,','rgba(52,17,81,1)','#C49405'],
+	['#FFE500','rgba(255,229,0,','rgba(52,17,81,1)','#BEAB01'],
+	['#F2FF00','rgba(242,255,0,','rgba(52,17,81,1)','#B3BD03'],
+	['#CCFF00','rgba(204,255,0,','rgba(52,17,81,1)','#93B607'],
+	['#A6FF00','rgba(166,255,0,','rgba(52,17,81,1)','#7BBB05'],
+	['#80FF00','rgba(128,255,0,','rgba(52,17,81,1)','#59AC05'],
+	['#59FF00','rgba(89,255,0,','rgba(52,17,81,1)','#3DAD01'],
+	['#33FF00','rgba(51,255,0,','rgba(52,17,81,1)','#24B001'],
+	['#0DFF00','rgba(13,255,0,','rgba(52,17,81,1)','#0CAA03'],
+	['#00FF1A','rgba(0,255,26,','rgba(52,17,81,1)','#03AC14'],
+	['#00FF40','rgba(0,255,64,','rgba(52,17,81,1)','#02AB2C'],
+	['#00FF66','rgba(0,255,102,','rgba(52,17,81,1)','#01AD46'],
+	['#00FF8C','rgba(0,255,140,','rgba(52,17,81,1)','#06B466'],
+	['#00FFB3','rgba(0,255,179,','rgba(52,17,81,1)','#01AB79'],
+	['#00FFD9','rgba(0,255,217,','rgba(52,17,81,1)','#02B399'],
+	['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#04AEAE'],
+	['#00D9FF','rgba(0,217,255,','rgba(52,17,81,1)','#0496B0'],
+	['#00B2FF','rgba(0,178,255,','rgba(52,17,81,1)','#0272A3'],
+	['#008CFF','rgba(0,140,255,','rgba(255,0,0,1)','#00569D'],
+	['#0068FF','rgba(0,102,255,','rgba(255,0,0,1)','#044AAE'],
+	['#0040FF','rgba(0,64,255,','rgba(255,0,0,1)','#032894'],
+	['#0019FF','rgba(0,25,255,','rgba(255,0,0,1)','#01109C'],
+	['#0D00FF','rgba(13,0,255,','rgba(255,0,0,1)','#0B03A7'],
+	['#3300FF','rgba(51,0,255,','rgba(255,0,0,1)','#2403A7'],
+	['#5900FF','rgba(89,0,255,','rgba(255,0,0,1)','#3E04AA'],
+	['#8000FF','rgba(128,0,255,','rgba(255,0,0,1)','#5302A4'],
+	['#A600FF','rgba(166,0,255,','rgba(255,0,0,1)','#6F03A9'],
+	['#CC00FF','rgba(204,0,255,','rgba(255,0,0,1)','#8A04AC'],
+	['#F200FF','rgba(242,0,255,','rgba(52,17,81,1)','#9D03A5'],
+	['#FF00E5','rgba(255,0,229,','rgba(52,17,81,1)','#B607A4'],
+	['#FF00BF','rgba(255,0,191,','rgba(52,17,81,1)','#B40588'],
+	['#FF0099','rgba(255,0,153,','rgba(52,17,81,1)','#B4016D'],
+	['#FF0073','rgba(255,0,115,','rgba(52,17,81,1)','#A9024D'],
+	['#FF004C','rgba(255,0,76,','rgba(52,17,81,1)','#A90335'],
+	['#FF0026','rgba(255,0,38,','rgba(52,17,81,1)','#A6051D']
+]];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/crossSamplePlots.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,263 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+var updateCSplots = function(plotconfig){
+  plotconfig.selectedPopulations = [];
+  $(plotconfig.popSelectj).each(function() {
+    if (this.checked) {
+      plotconfig.selectedPopulations.push(parseInt(this.value));
+    }
+  });
+  if (plotconfig.hasOwnProperty("mtable")) {
+    // Update selected markers?
+    plotconfig.selectedMarkers = [];
+    $(plotconfig.mrkrSelectj).each(function() {
+      if (this.checked) {
+        plotconfig.selectedMarkers.push(parseInt(this.value));
+      }
+    });
+    // update plot
+    updateBoxplot(plotconfig);
+  } else {
+    updatePlot(plotconfig);
+  }
+};
+
+var displayPopulationLegend = function(plotconfig) {
+  $(plotconfig.table).empty();
+  plotconfig.allPopulations.map(function(value,index) {
+    $(plotconfig.table).append('<tr><td align="center">'
+        + '<input type="checkbox" checked class=' + plotconfig.popSelect
+        + ' value=' + value + '/></td><td title="' + newPopNames[value] + '">'
+        + newPopNames[value] + '</td><td><span style="background-color:'
+        + color_palette[0][value][0] + '">&nbsp;&nbsp;&nbsp;</span></td></tr>');
+  });
+
+  $(plotconfig.popSelectAll).click(function() {
+    var checkAll = $(plotconfig.popSelectAll).prop('checked');
+    if (checkAll) {
+      $(plotconfig.popSelectj).prop("checked", true);
+    } else {
+      $(plotconfig.popSelectj).prop("checked", false);
+    }
+    updateCSplots(plotconfig);
+  });
+
+  $(plotconfig.popSelectj).click(function() {
+    if ($(plotconfig.popSelectj).length == $(plotconfig.popSelectCheck).length) {
+      $(plotconfig.popSelectAll).prop("checked",true);
+    } else {
+      $(plotconfig.popSelectAll).prop("checked",false);
+    }
+    updateCSplots(plotconfig);
+  });
+
+  $(plotconfig.popSelectj).each(function() {
+    var selectedpopn = parseInt(this.value);
+    if ($.inArray(selectedpopn,plotconfig.selectedPopulations) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  });
+};
+
+var displayToolbar = function(plotconfig){
+  $(plotconfig.displaybutton).on("click",function() {
+    $(plotconfig.popSelectj).prop("checked", true);
+    $(plotconfig.popSelectAll).prop("checked", true);
+    if (plotconfig.hasOwnProperty("mtable")){
+      $(plotconfig.displayMFI).prop("checked", false);
+      $(plotconfig.displayvalues).prop("checked", false);
+      $(plotconfig.mrkrSelectj).prop("checked", true);
+      $(plotconfig.mrkrSelectAll).prop("checked",true);
+    }
+    updateCSplots(plotconfig);
+  });
+
+  if (plotconfig.hasOwnProperty("mtable")){
+    $(plotconfig.displayMFI).on("click", function(){
+      updateCSplots(plotconfig);
+    });
+    $(plotconfig.displayvalues).on("click", function(){
+      updateCSplots(plotconfig);
+    });
+  }
+  $(plotconfig.toggledisplayj).on("click",function() {
+    plotconfig.selectedPopulations = [];
+    $(plotconfig.popSelectj).each(function() {
+      if (this.checked) {
+        plotconfig.selectedPopulations.push(parseInt(this.value));
+      }
+    })
+    if (plotconfig.hasOwnProperty("mtable")){
+      plotconfig.selectedMarkers = [];
+      $(plotconfig.mrkrSelectj).each(function() {
+        if (this.checked) {
+          plotconfig.selectedMarkers.push(parseInt(this.value));
+        }
+      });
+      var text = document.getElementById(plotconfig.toggledisplay).firstChild;
+      text.data = text.data == "View per marker" ? "View per population" : "View per marker";
+      plotconfig.view = plotconfig.view == "p" ? "m" : "p";
+      updateBoxplot(plotconfig);
+    } else {
+      var imgSrc = document.getElementById(plotconfig.toggledisplay);
+      imgSrc.src = imgSrc.src.endsWith("stackedsm.png") ? "/static/images/flowtools/barssm.png" : "/static/images/flowtools/stackedsm.png";
+      plotconfig.type = plotconfig.type == "barplot" ? "areaplot" : "barplot";
+      updatePlot(plotconfig);
+    }
+  });
+  displayPlot(plotconfig);
+};
+
+var displayPlot = function(plotconfig) {
+  var h = $(window).height() - 200;
+  $(plotconfig.plotdivj).empty();
+  $(plotconfig.plotdivj).height(h);
+
+  if (plotconfig.hasOwnProperty("mtable")) {
+    var nbPop = Object.keys(plotconfig.csdata.mfi[plotconfig.mrkrNames[0]]).length + 2;
+    // Get Markers too
+    for (var i = 0, nbMarkers = plotconfig.mrkrNames.length; i < nbMarkers; i++) {
+      plotconfig.allMarkers.push(i);
+      plotconfig.selectedMarkers.push(i);
+    }
+  } else {
+    var nbPop = plotconfig.csdata[0].length;
+  }
+
+  for (var i = 2; i < nbPop; i++) {
+    plotconfig.allPopulations.push(i - 1);
+    plotconfig.selectedPopulations.push(i - 1);
+  }
+
+  $(window).on('resize',function() {
+    waitForFinalEvent(function() {
+      if (plotconfig.hasOwnProperty("mtable")){
+          updateBoxplot(plotconfig);
+      } else {
+          updatePlot(plotconfig);
+      }
+    }, 500, "resizePlot");
+  });
+
+  displayPopulationLegend(plotconfig);
+  if (plotconfig.hasOwnProperty("mtable")){
+    displayMarkerTable(plotconfig);
+    updateBoxplot(plotconfig);
+  } else {
+    updatePlot(plotconfig);
+  }
+};
+
+var updatePlot = function(plotconfig) {
+  var h = $(window).height() - 200,
+      traces = [],
+      tmptraces = [],
+      x_values = [],
+      totals = [];
+      layout = {};
+
+  $(plotconfig.plotdivj).empty();
+  $(plotconfig.plotdivj).height(h);
+  for (var i = 1, j = plotconfig.csdata.length; i < j; i++) {
+    x_values.push(newSmpNames[plotconfig.csdata[i][1]]);
+  }
+
+  for (var k = 1, i = plotconfig.csdata.length; k < i; k++){
+    totals[k] = 0;
+    for (var m = 2, o = plotconfig.csdata[0].length; m < o; m++){
+      for (var n = 0, p = plotconfig.selectedPopulations.length; n < p; n++){
+        if (plotconfig.csdata[0][m] === plotconfig.selectedPopulations[n]) {
+          totals[k] += plotconfig.csdata[k][m];
+        }
+      }
+    }
+  }
+
+  for (var i = 0, ii = plotconfig.selectedPopulations.length; i < ii; i++) {
+    pop = plotconfig.selectedPopulations[i];
+    var popName = "Pop " + pop;
+    var y_values = [];
+    var obj;
+
+    for (var j = 1, jj = plotconfig.csdata.length; j < jj; j++) {
+      var newvalue = (plotconfig.csdata[j][pop + 1] / totals[j]) * 100;
+      y_values.push(newvalue);
+    }
+    if (plotconfig.type === "areaplot") {
+      obj = {
+          x: x_values,
+          y: y_values,
+          hoverinfo: "x",
+          name: popName,
+          type: 'area',
+          fill: 'tonexty',
+          marker: {color: color_palette[0][pop][0]}
+      };
+    }
+    if (plotconfig.type === "barplot") {
+      obj = {
+          x: x_values,
+          y: y_values,
+          hoverinfo: "x",
+          name: popName,
+          type: 'bar',
+          marker: {color: color_palette[0][pop][0]}
+      };
+    }
+    tmptraces.push(obj)
+  }
+
+  if (plotconfig.type === "barplot") {
+    layout = {
+        hovermode:'closest',
+        title: '',
+        barmode: 'stack',
+        showlegend: false,
+        yaxis: {
+            mirror: 'all',
+            tickmode: 'array',
+            ticktext: ["","20%", "40%", "60%", "80%", "100%"],
+            tickvals: [0,20,40,60,80,100],
+            title: 'Populations proportions in selected set',
+            titlefont: {
+                size: 16,
+                color: 'grey'
+            }
+        }
+    };
+    traces = tmptraces;
+  }
+  if (plotconfig.type === "areaplot") {
+    function stacked(trcs) {
+      for(var i=1; i<trcs.length; i++) {
+        for(var j=0; j<(Math.min(trcs[i]['y'].length, trcs[i-1]['y'].length)); j++) {
+          trcs[i]['y'][j] += trcs[i-1]['y'][j];
+        }
+      }
+      return trcs;
+    }
+    layout = {
+        title: '',
+        showlegend: false,
+        yaxis: {
+            mirror: 'all',
+            tickmode: 'array',
+            ticktext: ["","20%", "40%", "60%", "80%", "100%"],
+            tickvals: [0,20,40,60,80,100],
+            title: 'Populations proportions in selected set',
+            titlefont: {
+                size: 16,
+                color: 'grey'
+            }
+        },
+        xaxis: {
+            autorange: false,
+            range: [-0.2, x_values.length - 0.8]
+        }
+    };
+    traces = stacked(tmptraces);
+  }
+  Plotly.newPlot(plotconfig.plotdiv,traces,layout);
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/csOverview.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,250 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var url = "./csOverview.tsv",
+    boxplotUrl = "./csBoxplotData.json",
+    pctablecontent,
+    newSmpNames= {},
+    newPopNames = {},
+    configBoxplot = {},
+    configAreaplot = {};
+
+var waitForFinalEvent = (function () {
+  var timers = {};
+  return function (callback, ms, uniqueId) {
+    if (!uniqueId) {
+      uniqueId = "Don't call this twice without a uniqueId";
+    }
+    if (timers[uniqueId]) {
+      clearTimeout (timers[uniqueId]);
+    }
+    timers[uniqueId] = setTimeout(callback, ms);
+  };
+})();
+
+var preprocess = function(text){
+  var crossSampleData = d3.tsv.parseRows(text).map(function(row) {
+    return row.map(function(value) {
+      if (isNaN(value)) {
+        return value;
+      }
+      return +value;
+    })
+  })
+  return crossSampleData;
+};
+
+var displayProp = function() {
+  d3.text(url, function(error, data) {
+    var fileID = [],
+        sampleNames = [],
+        popTableData = [],
+        propHeadings = [],
+        propTableData = [],
+        propTableHeadings = [],
+        propTargets = [],
+        popTableHeadings = [],
+        propEditorData = [],
+        popEditorData = [],
+        smpcol = 2,
+        propHTML = '<table id="proptable" class="dtable display compact nowrap" cellspacing="0" width="100%"/>',
+        popHTML = '<table id="popnamestable" class="popt dtable display nowrap compact" cellspacing="0" width="100%"/>';
+
+    if (error) {
+      alert("Problem retrieving data");
+      return;
+    }
+    propHeadings = data.split("\n")[0].split("\t");
+    propHeadings.unshift("Comment");
+    data = d3.tsv.parse(data);
+    function propHandle(method, url, d, successCallBack, errorCallBack) {
+      var output = {data : propTableData};
+      successCallBack(output);
+    }
+
+    function popHandle(method, url, d, successCallBack, errorCallBack) {
+      var output = {data : popTableData};
+      successCallBack(output);
+    }
+
+    propTableData = $.extend(true,[],data);
+    propTableData.forEach(function(d) {
+      d.Comment = d.SampleName;
+      newSmpNames[d.SampleName] = d.Comment;
+      fileID.push(d.FileID);
+      sampleNames.push(d.SampleName);
+    });
+
+    for (var i = 3, j = propHeadings.length; i < j; i++){
+      propTargets.push(i);
+    }
+    propHeadings.forEach(function(d) {
+      propTableHeadings.push({"data":d, "title":d});
+      propEditorData.push({"label":d,"name":d});
+      if (d != 'Comment' && d != 'SampleName' && d != "FileID") {
+        newPopNames[d] = d.toString();
+        popTableHeadings.push({"data":d, "title":d});
+        popEditorData.push({"label":d,"name":d});
+      }
+    });
+    popTableData.push(newPopNames);
+    pctablecontent = $.extend(true,[],propTableData);
+
+    $('#propDiv').empty();
+    $('#propDiv').html(propHTML);
+    var smpEditor = new $.fn.dataTable.Editor({
+        ajax: propHandle,
+        table: '#proptable',
+        fields: propEditorData,
+        idSrc: 'SampleName'
+    });
+
+    $('#proptable').on( 'click', 'tbody td:first-child', function (e) {
+      smpEditor.bubble( this );
+    });
+    var propTable = $('#proptable').DataTable({
+        columns: propTableHeadings,
+        data: propTableData,
+        order: [[ smpcol, "asc" ]],
+        pageLength: 10,
+        scrollX: true,
+        scrollCollapse: true,
+        dom: '<"top"Bi>t<"bottom"lp><"clear">',
+        columnDefs: [{
+            targets: propTargets,
+            className: "dt-body-right",
+            render: function(data, type, row){
+                    return parseFloat(data).toFixed(2) + '%';
+            }
+          }, {
+            targets: [smpcol - 1, smpcol, smpcol + 1],
+            className: "dt-body-left",
+        }],
+        buttons: [
+            'copy', 'pdfHtml5','csvHtml5', 'colvis'
+        ],
+        colReorder: {
+            fixedColumnsLeft:1
+        },
+        select: true
+    });
+
+    // Add titles to File ID and Sample Name
+    $('#proptable tr').each(function(i,d){
+      if (i > 0) {
+        $(this).find('td').each(function(j,e){
+          if (j == 1 ) {
+            $(this).prop('title', fileID[i - 1] );
+          }
+          if (j == 2) {
+            $(this).prop('title', sampleNames[i - 1]);
+          }
+        });
+      }
+    });
+
+    // Add a table below to rename pops
+    // Might want to change that some other time?
+    $('#popnamesDiv').html(popHTML);
+    var popEditor = new $.fn.dataTable.Editor({
+        ajax: popHandle,
+        table: '#popnamestable',
+        fields: popEditorData,
+        idSrc: '1'
+    });
+
+    $('#popnamestable').on( 'click', 'tbody td', function (e) {
+      popEditor.bubble(this);
+    });
+    var popTable = $('#popnamestable').DataTable({
+        columns: popTableHeadings,
+        dom: 't',
+        select: true,
+        data: popTableData
+    });
+
+    smpEditor.on( 'preSubmit', function(e, object, action){
+      var data = object.data;
+      var key = Object.keys(data)[0];
+      var count = object.data[key]['Comment'];
+
+      propTableData.forEach(function(d){
+        if (d.SampleName === key) {
+          d.Comment = count;
+          newSmpNames[key] = count;
+        }
+      });
+      pctablecontent = $.extend(true, [], propTableData);
+    });
+    popEditor.on( 'preSubmit', function(e, object, action){
+      var data = object.data;
+      var key = Object.keys(data['1'])[0];
+      var count = object.data['1'][key];
+      popTableData[0][key] = count;
+      newPopNames[key] = count;
+    });
+  });
+};
+
+var displayStackedAreaPlot = function() {
+  $.ajax({
+    url: url,
+    dataType: "text",
+    success: function(text) {
+      configAreaplot = {
+        displaybutton : '#updateDisplayA',
+        popSelectj : '.popSelectA',
+        plotdivj : '#plotDivA',
+        toggledisplayj : '#togglePlot',
+        toggledisplay : 'toggleButtonImg',
+        csdata : preprocess(text),
+        plotdiv : 'plotDivA',
+        type : 'areaplot',
+        table : '#popTableA tbody',
+        popSelect : 'popSelectA',
+        allPopulations : [],
+        selectedPopulations : [],
+        popSelectAll : '#popSelectAllA',
+        popSelectCheck : '.popSelectA:checked'
+      };
+      displayToolbar(configAreaplot);
+    }
+  });
+};
+
+var displayBoxplot = function() {
+  $.ajax({
+    url: boxplotUrl,
+    dataType: "json",
+    success: function(data) {
+      configBoxplot = {
+        displaybutton : '#updateDisplayC',
+        toggledisplayj : '#changeDisplayC',
+        toggledisplay : 'changeDisplayC',
+        popSelectj : '.popSelectC',
+        plotdivj : '#plotDivC',
+        csdata : data,
+        plotdiv : 'plotDivC',
+        type : 'boxplot',
+        table : '#popTableC tbody',
+        popSelect : 'popSelectC',
+        allMarkers : [],
+        selectedMarkers: [],
+        allPopulations : [],
+        selectedPopulations : [],
+        popSelectAll : '#popSelectAllC',
+        popSelectCheck: '.popSelectC:checked',
+        mrkrSelectAll : '#mrkrSelectAllC',
+        mrkrSelectCheck: '.mrkrSelectC:checked',
+        mrkrSelect : 'mrkrSelectC',
+        mtable : '#mrkrTableC tbody',
+        mrkrSelectj: '.mrkrSelectC',
+        displayvalues: '#displayLabelsC',
+        displayMFI: '#displayMFIC',
+        view: 'p',
+        mrkrNames :  Object.keys(data.mfi)
+      };
+      displayToolbar(configBoxplot);
+    }
+  });
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/pCoordCSstats.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,418 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+/*
+ * Initialize variables for parallelCoordinates display
+*/
+var pcApp = pcApp || {};
+
+pcApp.allSamples = [];
+pcApp.selectedSamples = [];
+pcApp.origData;
+pcApp.flowData;
+pcApp.updatedData;
+pcApp.headers = [];
+pcApp.foreground;
+pcApp.background;
+
+var displayAll = function() {
+  displayParallelPlot();
+}
+/*
+ * Display the Population Legend
+*/
+var displaySmpTable = function() {
+  $('#popTablePC tbody').empty();
+  pcApp.origData.map(function(d) {
+    $('#popTablePC tbody').append('<tr><td align="center">'
+        + '<input type="checkbox" id="' + d.SampleName + '" '
+        + 'checked class="popSelectPC" value='
+        + d.SampleNumber + '/></td><td title="' + newSmpNames[d.SampleName]
+        + '">' + newSmpNames[d.SampleName]
+        + '</td><td><span style="background-color:'
+        + color_palette[0][d.SampleNumber + 1][0]
+        + '">&nbsp;&nbsp;&nbsp;</span></td></tr>');
+  });
+
+  $('#popSelectAllPC').click(function() {
+    var checkAll = $("#popSelectAllPC").prop('checked');
+    if (checkAll) {
+      $(".popSelectPC").prop("checked", true);
+    } else {
+      $(".popSelectPC").prop("checked", false);
+    }
+    pcApp.selectedSamples = [];
+    $('.popSelectPC').each(function() {
+      if (this.checked) {
+        pcApp.selectedSamples.push(parseInt(this.value));
+      }
+    })
+    displayTableGrid();
+    if (checkAll) {
+      displayParallelPlot();
+    } else {
+      updateParallelForeground();
+    }
+  });
+
+  $('.popSelectPC').click(function() {
+    if ($('.popSelectPC').length == $(".popSelectPC:checked").length) {
+      $('#popSelectAllPC').prop("checked",true);
+    } else {
+      $('#popSelectAllPC').prop("checked",false);
+    }
+    pcApp.selectedSamples = [];
+    $('.popSelectPC').each(function() {
+      if (this.checked) {
+         pcApp.selectedSamples.push(parseInt(this.value));
+      }
+    })
+    displayTableGrid();
+    updateParallelForeground();
+  });
+  updateSmpTable();
+};
+
+var updateSmpTable = function() {
+  $('.popSelectPC').each(function() {
+    var smp = parseInt(this.value);
+    if ($.inArray(smp,pcApp.selectedSamples) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  })
+}
+
+var displayTableGrid = function() {
+  var colTable = [],
+      colNames = [],
+      pctargets = [],
+      updatedHeaders = [],
+      displayData = [],
+      targetCol = 0,
+      textCol = [],
+      colOrder = [],
+      tableHTML = [];
+
+  $("#tableDivPC").empty();
+  pcApp.updatedData = $.extend(true,[],pctablecontent);
+  pcApp.updatedData.forEach(function(d, idx){
+    d.SampleName = idx + 1;
+    delete(d.FileID);
+  });
+
+  updatedHeaders = Object.keys(pcApp.updatedData[0]);
+  displayData = pcApp.updatedData.filter(function(d,i) {
+    if ($.inArray(i,pcApp.selectedSamples) > -1) {
+      return d;
+    }
+  });
+
+  targetCol = updatedHeaders.length - 2;
+  updatedHeaders.forEach(function(d,i){
+    colTable.push("<th>" + d + "</th>");
+    colNames.push({"data":d});
+    if (i < targetCol){
+      pctargets.push(i);
+    }
+  });
+  textCol = [targetCol, targetCol + 1];
+  colOrder = textCol.concat(pctargets);
+  tableHTML = [
+      '<table id="pcTable" class="pctable display compact nowrap" cellspacing="0" width="100%">',
+      '<thead>',
+      '<tr>',
+      colTable.join("\n"),
+      '</tr>',
+      '</thead>',
+      '</table>',
+  ];
+
+  $('#tableDivPC').html(tableHTML.join("\n"));
+  var pcTable = $('#pcTable').DataTable({
+      columns: colNames,
+      data: displayData,
+      order: [[ targetCol, "asc" ]],
+      pageLength: 10,
+      //paging: false,
+      scrollY: 250,
+      scrollCollapse: true,
+      scrollX: true,
+      dom: '<"top"B>t<"bottom"lip><"clear">',
+      columnDefs: [{
+          targets: pctargets,
+          className: "dt-body-right",
+          render: function(data,type,row){
+              return parseFloat(data).toFixed(2) + '%';
+          }
+        }, {
+          targets: [targetCol, targetCol+1],
+          className: "dt-body-center"
+        }, {
+          targets:[targetCol],
+          render: function(data, type, row){
+              return 'Sample' + parseInt(data);
+          }
+      }],
+      buttons: [
+          'copy', 'pdfHtml5','csvHtml5', 'colvis'
+      ],
+      colReorder: {order:colOrder},
+      select: true
+  });
+
+  $('#pcTable').on('mouseover', 'tr', function() {
+    var data = pcTable.row(this).data();
+    if (data != undefined) {
+      var smp = parseInt(data.SampleName) - 1;
+      pcApp.selectedSamples = [smp];
+      updateParallelForeground();
+    }
+  });
+  $('#pcTable').on('mouseleave', 'tr', function() {
+    pcApp.selectedSamples = [];
+    $('.popSelectPC').each(function() {
+      if (this.checked) {
+        pcApp.selectedSamples.push(parseInt(this.value));
+      }
+      updateParallelForeground();
+    })
+  });
+};
+/*
+ * Display The Main Plot
+*/
+var displayParallelPlot = function() {
+  var margin = {top: 30, right: 10, bottom: 10, left: 10},
+      h = 300,
+      w = $("#plotDivPC").width(),
+      width = w - margin.left - margin.right,
+      height = h - margin.top - margin.bottom,
+      y  = {},
+      dragging = {},
+      ymax = 0;
+
+  $("#plotDivPC").empty();
+  $("#plotDivPC").height(h);
+  var svg = d3.select("#plotDivPC").append("svg")
+      .attr("width", width + margin.left + margin.right)
+      .attr("height", height + margin.top + margin.bottom)
+    .append("g")
+      .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
+
+  var x = d3.scale.ordinal().rangePoints([0, width], 1);
+  var line = d3.svg.line();
+  var axis = d3.svg.axis()
+      .orient("left")
+      .tickFormat(d3.format("d"))
+      .ticks(5);
+
+  for (var m = 0, n = pcApp.flowData.length; m < n; m++){
+    for (var p in pcApp.flowData[m]){
+      if (+pcApp.flowData[m][p] > ymax){
+        ymax = +pcApp.flowData[m][p];
+      }
+    }
+  }
+
+  // Y axis label
+  svg.append("text")
+      .attr("class", "ylabel")
+      .attr("transform", "rotate(-90)")
+      .attr("y", 0 - margin.left)
+      .attr("x",0 - (height / 2))
+      .attr("dy", "1em")
+      .style("text-anchor", "middle")
+      .text("Fraction of population in sample");
+
+  var dimensions = d3.keys(pcApp.flowData[0]).filter(function(d) {
+    return (y[d] = d3.scale.linear()
+        .domain([0,parseInt(ymax)+1])
+        .range([height, 0]));
+  });
+  x.domain(dimensions);
+
+  function path(d) {
+    return line(dimensions.map(function(p) { return [x(p), y[p](d[p])]; }));
+  }
+
+  function position(d) {
+    var v = dragging[d];
+    return v == null ? x(d) : v;
+  }
+
+  function transition(g) {
+    return g.transition().duration(500);
+  }
+
+  function brush() {
+    var actives = dimensions.filter(function(p) { return !y[p].brush.empty(); });
+    var extents = actives.map(function(p) { return y[p].brush.extent(); });
+    var selectedSamples = pcApp.origData.filter(function(d) {
+      var smp = parseInt(d.SampleNumber);
+      var tf = actives.every(function(p,i) {
+        return extents[i][0] <= pcApp.flowData[smp][p] &&
+                      pcApp.flowData[smp][p] <= extents[i][1];
+      });
+      if (tf) {
+        return smp.toString();
+      }
+    });
+    pcApp.selectedSamples = selectedSamples.map(function(d) {
+      return parseInt(d.SampleNumber);
+    });
+
+    updateParallelForeground();
+    updateSmpTable()
+    displayTableGrid();
+  }
+  // Display paths in light gray color, to use as reference
+  pcApp.background = svg.append("g")
+      .attr("class", "background")
+    .selectAll("path")
+      .data(pcApp.flowData)
+    .enter().append("path")
+      .attr("d", path);
+
+  // Add foreground lines for focus, color by population.
+  pcApp.foreground = svg.append("g")
+      .attr("class", "foreground")
+    .selectAll("path")
+      .data(pcApp.origData)
+    .enter().append("path")
+      .attr("d", function(d) {
+        var smp = d.SampleNumber;
+        return path(pcApp.flowData[smp]); })
+      .attr("stroke",function(d){
+        var smp = d.SampleNumber + 1;
+        return color_palette[0][smp][0];})
+      .attr("stroke-width", 1);
+
+  // Add a group element for each dimension.
+  var g = svg.selectAll(".dimension")
+      .data(dimensions)
+    .enter().append("g")
+      .attr("class", "dimension")
+      .attr("transform", function(d) { return "translate(" + x(d) + ")"; })
+      .call(d3.behavior.drag()
+        .origin(function(d) { return {x: x(d)}; })
+        .on("dragstart", function(d) {
+          dragging[d] = x(d);
+          pcApp.background.attr("visibility", "hidden");})
+        .on("drag", function(d) {
+          dragging[d] = Math.min(width, Math.max(0, d3.event.x));
+          pcApp.foreground.attr("d", path);
+          dimensions.sort(function(a, b) { return position(a) - position(b); });
+          x.domain(dimensions);
+          g.attr("transform", function(d) { return "translate(" + position(d) + ")"; }); })
+        .on("dragend", function(d) {
+          delete dragging[d];
+          transition(d3.select(this)).attr("transform", "translate(" + x(d) + ")");
+          transition(pcApp.foreground).attr("d", path);
+          pcApp.background
+              .attr("d", path)
+            .transition()
+              .delay(500)
+              .duration(0)
+              .attr("visibility", null);
+        }));
+
+  // Add an axis and title.
+  g.append("g")
+      .attr("class", "axis")
+      .each(function(d) { d3.select(this).call(axis.scale(y[d])); });
+  g.append("g")
+      .attr("class", "xlabel")
+    .append("text")
+      .style("text-anchor", "middle")
+      .attr("y", -9)
+      .text(function(d) { return d; });
+
+  // Add and store a brush for each axis.
+  g.append("g")
+      .attr("class", "brush")
+      .each(function(d) { d3.select(this).call(y[d].brush = d3.svg.brush().y(y[d]).on("brush", brush)); })
+    .selectAll("rect")
+      .attr("x", -8)
+      .attr("width", 16);
+
+  // Control line opacity.
+  $('#PCline_opacity').on('change', (function() {
+    var val = $(this).val();
+    $('#plotDivPC .foreground path').css('stroke-opacity', val.toString());
+    $('#pc_opacity').html((Math.round(val*10000)/100) + "%");
+  }));
+};
+
+var updateParallelForeground = function() {
+  pcApp.foreground[0].map(function(d) {
+    var smp = parseInt(d['__data__']['SampleNumber'])
+    if ($.inArray(smp,pcApp.selectedSamples) < 0) {
+      d.style.display = "none";
+    } else {
+      d.style.display = null;
+    }
+  });
+};
+/*
+ * Retrieve the data, then call display functions
+*/
+var displayParallelCoordinates = function() {
+/*    var inputFile = "./csOverview.tsv";
+    d3.tsv(inputFile, function(error, data) {
+         if (error) {
+            alert("Problem Retrieving Data");
+            return;
+        }
+  */
+  pcApp.origData = $.extend(true,[], pctablecontent);
+  pcApp.headers = Object.keys(pcApp.origData[0]);
+  pcApp.headers.splice(pcApp.headers.indexOf("FileID"), 1);
+  pcApp.origData.forEach(function(d,idx){
+      d.SampleNumber = idx;
+//    delete d.FileID;
+  })
+  /*
+   * For the plot use only the proportion of each
+   * population per sample. Store in flowData
+  */
+  pcApp.flowData = $.extend(true,[],pctablecontent);
+  pcApp.flowData.forEach(function(d,idx){
+    delete d.SampleName;
+    delete d.FileID;
+    delete d.Comment;
+  });
+  for (var i = 0, j = pcApp.flowData.length; i < j ; i++) {
+    pcApp.allSamples.push(i);
+    pcApp.selectedSamples.push(i);
+  }
+  displaySmpTable();
+  displayTableGrid();
+  displayParallelPlot();
+
+  $("#resetPCDisplay").on("click",function() {
+    var opcty = ".8";
+    for (var i = 0, j = pcApp.flowData.length; i < j; i++) {
+      pcApp.allSamples.push(i);
+      pcApp.selectedSamples.push(i);
+    }
+    $("#smpSelectAllPC").prop('checked',true);
+    $(".smpSelectPC").prop("checked",true);
+
+    $('#plotDivPC .foreground path').css('stroke-opacity', opcty);
+    $('#pc_opacity').html("80%");
+    $('#PCline_opacity').val(0.8);
+
+    displaySmpTable();
+    displayTableGrid();
+    displayParallelPlot();
+  });
+
+  $(window).on('resize',function() {
+    waitForFinalEvent(function() {
+      displayAll();
+    }, 500, "resizePC");
+  });
+//    });
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/pCoordMFIstats.js	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,559 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+/*
+ * Initialize variables for parallelCoordinates display
+*/
+var pcAppMFI = pcAppMFI || {};
+
+pcAppMFI.origData;
+pcAppMFI.flowData;
+pcAppMFI.background;
+pcAppMFI.foreground;
+pcAppMFI.selectedLines = [];
+pcAppMFI.selectedPopulations = [];
+pcAppMFI.selectedSamples = [];
+pcAppMFI.populations = [];
+pcAppMFI.samples = [];
+pcAppMFI.lines = [];
+pcAppMFI.allLines;
+pcAppMFI.headers = [];
+
+var displayAllm = function() {
+  displayParallelPlotm();
+};
+/*
+ * Display the Population Legend
+*/
+var displayPopTablem = function() {
+  $('#popTablePCm tbody').empty();
+  pcAppMFI.populations.map(function(d, index) {
+    $('#popTablePCm tbody').append('<tr><td align="center">'
+        + '<input type="checkbox" '
+        + 'id="'+ d + '" '
+        + 'checked class="popSelectPCm" value='
+        + index + '/></td><td title="' + newPopNames[d]
+        + '">' + newPopNames[d]
+        + '</td><td><span style="background-color:'
+        + color_palette[0][index + 1][0]
+        + '">&nbsp;&nbsp;&nbsp;</span></td></tr>');
+  });
+
+  $('#popSelectAllPCm').click(function() {
+    var checkAll = $("#popSelectAllPCm").prop('checked');
+    if (checkAll) {
+      $(".popSelectPCm").prop("checked", true);
+      for (var i = 0; i < pcAppMFI.allLines; i ++) {
+        pcAppMFI.selectedLines.push(i);
+        pcAppMFI.lines.push(i);
+      }
+    } else {
+      $(".popSelectPCm").prop("checked", false);
+      pcAppMFI.selectedLines = [];
+      pcAppMFI.lines = [];
+    }
+
+    pcAppMFI.selectedPopulations = [];
+    $('.popSelectPCm').each(function() {
+      if (this.checked) {
+        pcAppMFI.selectedPopulations.push(parseInt(this.value));
+      }
+    });
+
+    displayTableGridm();
+    if (checkAll) {
+      displayParallelPlotm();
+    } else {
+      updateParallelForegroundidx();
+    }
+  });
+
+  $('.popSelectPCm').click(function() {
+    if ($('.popSelectPCm').length == $(".popSelectPCm:checked").length) {
+      $('#popSelectAllPCm').prop("checked",true);
+    } else {
+      $('#popSelectAllPCm').prop("checked",false);
+    }
+    pcAppMFI.selectedPopulations = [];
+    $('.popSelectPCm').each(function() {
+      if (this.checked) {
+        pcAppMFI.selectedPopulations.push(parseInt(this.value));
+      }
+    });
+    pcAppMFI.selectedLines = [];
+    pcAppMFI.lines = [];
+    pcAppMFI.origData.forEach(function(d,idx){
+      if ($.inArray(pcAppMFI.populations.indexOf(d.Population), pcAppMFI.selectedPopulations) > -1) {
+        if ($.inArray(pcAppMFI.samples.indexOf(d.SmpName), pcAppMFI.selectedSamples) > -1){
+          pcAppMFI.selectedLines.push(idx);
+          pcAppMFI.lines.push(idx);
+        }
+      }
+    });
+    displayTableGridm();
+    updateParallelForegroundidx();
+  });
+  updatePopTableidx();
+  updateSmpTableidx();
+};
+
+var updatePopTableidx = function() {
+  $('.popSelectPCm').each(function() {
+    var pop = parseInt(this.value);
+    var selectedPops = pcAppMFI.origData.map(function(d){
+      if ($.inArray(d.idx, pcAppMFI.selectedLines) > -1){
+        return pcAppMFI.populations.indexOf(d.Population);
+      }
+    });
+    if ($.inArray(pop,selectedPops) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  });
+};
+/*
+* Display Sample Legend
+*/
+var displaySmpTablem = function(){
+  $('#smpTablePCm tbody').empty();
+  pcAppMFI.samples.map(function(d, index) {
+    $('#smpTablePCm tbody').append('<tr><td title="'
+        + newSmpNames[d] + '">' + newSmpNames[d]
+        + '</td><td align="center">' + '<input type="checkbox" '
+        + 'id="' + d + '" ' + 'checked class="smpSelectPCm" value='
+        + index + '></td></tr>');
+  });
+
+  $('#smpSelectAllPCm').click(function() {
+    var checkAll = $("#smpSelectAllPCm").prop('checked');
+    if (checkAll) {
+      $(".smpSelectPCm").prop("checked", true);
+      for (var i = 0; i < pcAppMFI.allLines; i ++) {
+        pcAppMFI.selectedLines.push(i);
+        pcAppMFI.lines.push(i);
+      }
+    } else {
+      $(".smpSelectPCm").prop("checked", false);
+      pcAppMFI.selectedLines = [];
+      pcAppMFI.lines = [];
+    }
+    pcAppMFI.selectedSamples = [];
+    $('.smpSelectPCm').each(function() {
+      if (this.checked) {
+        pcAppMFI.selectedSamples.push(parseInt(this.value));
+      }
+    });
+    displayTableGridm();
+    if (checkAll) {
+      displayParallelPlotm();
+    } else {
+      updateParallelForegroundidx();
+    }
+  });
+
+  $('.smpSelectPCm').click(function() {
+    if ($('.smpSelectPCm').length == $(".smpSelectPCm:checked").length) {
+      $('#smpSelectAllPCm').prop("checked",true);
+    } else {
+      $('#smpSelectAllPCm').prop("checked",false);
+    }
+    pcAppMFI.selectedSamples = [];
+    $('.smpSelectPCm').each(function() {
+      if (this.checked) {
+        pcAppMFI.selectedSamples.push(parseInt(this.value));
+      }
+    });
+    pcAppMFI.selectedLines = [];
+    pcAppMFI.lines = [];
+    pcAppMFI.origData.forEach(function(d,idx) {
+      if ($.inArray(pcAppMFI.populations.indexOf(d.Population), pcAppMFI.selectedPopulations) > -1) {
+        if ($.inArray(pcAppMFI.samples.indexOf(d.SmpName), pcAppMFI.selectedSamples) > -1){
+          pcAppMFI.selectedLines.push(idx);
+          pcAppMFI.lines.push(idx);
+        }
+      }
+    });
+    displayTableGridm();
+    updateParallelForegroundidx();
+  });
+};
+
+var updateSmpTableidx = function() {
+  $('.smpSelectPCm').each(function() {
+    var smp = parseInt(this.value),
+        selectedSamples = pcAppMFI.origData.map(function(d){
+      if ($.inArray(d.idx, pcAppMFI.selectedLines) > -1){
+        return pcAppMFI.samples.indexOf(d.SmpName);
+      }
+    });
+    if ($.inArray(smp,selectedSamples) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  });
+};
+/*
+ * Display Data table
+*/
+var displayTableGridm = function() {
+  var colTablem = [],
+      colNamesm = [],
+      pctargetsm = [],
+      displayDatamfi = [],
+      targetColm = pcAppMFI.headers.length - 3,
+      textColm = [],
+      colOrderm = [],
+      tableHTMLm = [];
+
+  $("#tableDivPCm").empty();
+
+  displayDatamfi = pcAppMFI.origData.filter(function(d,i) {
+    if ($.inArray(i,pcAppMFI.selectedLines) > -1) {
+      return d;
+    }
+  });
+  displayDatamfi.forEach(function(d){
+    d.EditedPopName = newPopNames[d.Population];
+    d.SampleName = newSmpNames[d.SmpName];
+  });
+  pcAppMFI.headers.forEach(function(d,i){
+    colTablem.push("<th>" + d + "</th>");
+    colNamesm.push({"data":d});
+    if (i < targetColm - 1){
+      pctargetsm.push(i);
+    }
+  });
+  textColm = [targetColm, targetColm + 1, targetColm + 2];
+  colOrderm = textColm.concat(pctargetsm);
+  colOrderm.push(targetColm - 1);
+  tableHTMLm = [
+      '<table id="pcTableMFI" class="pctable display compact nowrap" cellspacing="0" width="100%">',
+      '<thead>',
+      '<tr>',
+      colTablem.join("\n"),
+      '</tr>',
+      '</thead>',
+      '</table>',
+  ];
+  $('#tableDivPCm').html(tableHTMLm.join("\n"));
+  var pcTablem = $('#pcTableMFI').DataTable({
+      columns: colNamesm,
+      data: displayDatamfi,
+      order: [[ targetColm, "asc" ]],
+      pageLength: 10,
+      //paging: false,
+      scrollY: 250,
+      scrollCollapse: true,
+      scrollX: true,
+      dom: '<"top"B>t<"bottom"lip><"clear">',
+      columnDefs: [{
+          targets: pctargetsm,
+          className: "dt-body-right",
+          render: function(data,type,row){
+              return parseFloat(data).toFixed(2);
+          }
+        }, {
+          targets: [targetColm - 1],
+          className: "dt-body-right",
+          render: function(data,type,row){
+              return parseFloat(data).toFixed(2) + '%';
+          }
+        }, {
+          targets: [targetColm, targetColm+1, targetColm+2],
+          className: "dt-body-center"
+      }],
+      buttons: [
+          'copy', 'pdfHtml5','csvHtml5', 'colvis'
+      ],
+      colReorder: {order:colOrderm},
+      select: true
+  });
+
+  $('#pcTableMFI').on('mouseover', 'tr', function() {
+    var data = pcTablem.row(this).data();
+    if (data != undefined) {
+      var line = parseInt(data.idx);
+      pcAppMFI.selectedLines = [line];
+      updateParallelForegroundidx();
+    }
+  });
+  $('#pcTableMFI').on('mouseleave', 'tr', function() {
+    pcAppMFI.selectedLines = [];
+    for (var i = 0, j = pcAppMFI.lines.length; i < j; i++){
+      pcAppMFI.selectedLines.push(pcAppMFI.lines[i]);
+    }
+    updateParallelForegroundidx();
+  });
+};
+/*
+* Update Parallel Foreground
+*/
+var updateParallelForegroundidx = function() {
+  pcAppMFI.foreground[0].map(function(d) {
+    var ln = parseInt(d['__data__']['idx']);
+
+    if ($.inArray(ln,pcAppMFI.selectedLines) < 0){
+      d.style.display = "none";
+    } else {
+      d.style.display = null;
+    }
+  });
+};
+/*
+ * Display The Main Plot
+*/
+var displayParallelPlotm = function() {
+  var margin = {top: 30, right: 10, bottom: 10, left: 10},
+      h = $("#chartDivPCm").height() * 0.6,
+      w = $("#plotDivPCm").width(),
+      y = {},
+      dragging = {},
+      width = w - margin.left - margin.right,
+      height = h - margin.top - margin.bottom;
+
+  $("#plotDivPCm").empty();
+  $("#plotDivPCm").height(h);
+
+  var svg = d3.select("#plotDivPCm").append("svg")
+      .attr("width", w)
+      .attr("height", h)
+    .append("g")
+      .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+  // Y axis label
+  svg.append("text")
+      .attr("class", "ylabel")
+      .attr("transform", "rotate(-90)")
+      .attr("y", 0 - margin.left)
+      .attr("x", 0 - (height / 2))
+      .attr("dy", "1em")
+      .style("text-anchor", "middle")
+      .text("MFI");
+
+  var x = d3.scale.ordinal().rangePoints([0, width], 1);
+  var line = d3.svg.line();
+  var axis = d3.svg.axis().orient("left").ticks(8);
+
+  // Use this to scale line width to percentage population
+  var pd = d3.extent(pcAppMFI.origData, function(p) { return +p['Percentage']; });
+  var popScale = d3.scale.linear().range([1,5]).domain(pd);
+
+  var dimensions = d3.keys(pcAppMFI.flowData[0]).filter(function(d) {
+    return (y[d] = d3.scale.linear()
+      .domain(d3.extent(pcAppMFI.flowData,function(p) { return +p[d]; }))
+      .range([height, 0]));
+  });
+  x.domain(dimensions);
+
+  function path(d) {
+    return line(dimensions.map(function(p) { return [x(p), y[p](d[p])]; }));
+  }
+  function position(d) {
+    var v = dragging[d];
+    return v == null ? x(d) : v;
+  }
+  function transition(g) {
+    return g.transition().duration(500);
+  }
+
+  function brush() {
+    var actives = dimensions.filter(function(p) { return !y[p].brush.empty(); });
+    var extents = actives.map(function(p) { return y[p].brush.extent(); });
+    var indices = pcAppMFI.origData.filter(function(d) {
+      var line = parseInt(d.idx)
+      var tf = actives.every(function(p,i) {
+        return extents[i][0] <= pcAppMFI.flowData[line][p] &&
+                    pcAppMFI.flowData[line][p] <= extents[i][1];
+      });
+      if (tf) {
+        return line.toString();
+      }
+    });
+
+    pcAppMFI.selectedLines = indices.map(function(d) {
+      return parseInt(d.idx);
+    });
+    pcAppMFI.lines = indices.map(function(d) {
+      return parseInt(d.idx);
+    });
+    updateParallelForegroundidx();
+    updatePopTableidx();
+    updateSmpTableidx();
+    displayTableGridm();
+  }
+
+  // Display paths in light gray color, to use as reference
+  pcAppMFI.background = svg.append("g")
+      .attr("class", "background")
+    .selectAll("path")
+      .data(pcAppMFI.flowData)
+    .enter().append("path")
+      .attr("d", path);
+
+  // Add foreground lines for focus, color by population.
+  pcAppMFI.foreground = svg.append("g")
+      .attr("class", "foreground")
+    .selectAll("path")
+      .data(pcAppMFI.origData)
+    .enter().append("path")
+      .attr("d", path)
+      .attr("stroke",function(d){
+        var pop = pcAppMFI.populations.indexOf(d.Population) + 1;
+        return color_palette[0][pop][0]; })
+    //.attr("stroke-width", 1);
+      // Use this if you want to scale the lines based on
+      // population percentage
+      .attr("stroke-width", function(d) {
+        var pop = pcAppMFI.populations.indexOf(d.Population);
+        var w = popScale(pcAppMFI.origData[pop]['Percentage']);
+        w = parseInt(w);
+        return w;
+      });
+
+  // Add a group element for each dimension.
+  var g = svg.selectAll(".dimension")
+      .data(dimensions)
+    .enter().append("g")
+      .attr("class", "dimension")
+      .attr("transform", function(d) { return "translate(" + x(d) + ")"; })
+      .call(d3.behavior.drag()
+      .origin(function(d) { return {x: x(d)}; })
+      .on("dragstart", function(d) {
+          dragging[d] = x(d);
+          pcAppMFI.background.attr("visibility", "hidden"); })
+      .on("drag", function(d) {
+          dragging[d] = Math.min(width, Math.max(0, d3.event.x));
+          pcAppMFI.foreground.attr("d", path);
+          dimensions.sort(function(a, b) { return position(a) - position(b); });
+          x.domain(dimensions);
+          g.attr("transform", function(d) { return "translate(" + position(d) + ")"; }); })
+      .on("dragend", function(d) {
+          delete dragging[d];
+          transition(d3.select(this)).attr("transform", "translate(" + x(d) + ")");
+          transition(pcAppMFI.foreground).attr("d", path);
+          pcAppMFI.background
+              .attr("d", path)
+            .transition()
+              .delay(500)
+              .duration(0)
+              .attr("visibility", null);
+      }));
+
+  // Add an axis and title.
+  g.append("g")
+      .attr("class", "axis")
+      .each(function(d) { d3.select(this).call(axis.scale(y[d])); });
+  g.append("g")
+      .attr("class", "xlabel")
+    .append("text")
+      .style("text-anchor", "middle")
+      .attr("y", -9)
+      .text(function(d) { return d; });
+
+  // Add and store a brush for each axis.
+  g.append("g")
+      .attr("class", "brush")
+      .each(function(d) { d3.select(this).call(y[d].brush = d3.svg.brush().y(y[d]).on("brush", brush)); })
+    .selectAll("rect")
+      .attr("x", -8)
+      .attr("width", 16);
+
+  // Control line opacity.
+  $('#PCmline_opacity').on('change', (function() {
+    var val = $(this).val();
+    $('#plotDivPCm .foreground path').css('stroke-opacity', val.toString());
+    $('#pcm_opacity').html((Math.round(val*10000)/100) + "%");
+  }));
+};
+
+/*
+ * Retrieve the data, then call display functions
+*/
+var displayParallelCoordinatesMFI = function() {
+  var inputFile = "./csAllMFIs.tsv";
+  d3.tsv(inputFile, function(error, data) {
+    var allPops = 0,
+        allSamples = 0;
+    if (error) {
+      alert("Problem Retrieving Data");
+      return;
+    }
+    pcAppMFI.origData = $.extend(true,[],data);
+    pcAppMFI.headers = Object.keys(pcAppMFI.origData[0]);
+    pcAppMFI.headers.push("EditedPopName");
+    pcAppMFI.origData.forEach(function(d,idx) {
+      d.idx = idx;
+      d.EditedPopName = d.Population;
+      d.SmpName = d.SampleName;
+      pcAppMFI.selectedLines.push(idx);
+      pcAppMFI.lines.push(idx);
+      if (!pcAppMFI.populations.includes(d.Population)){
+        pcAppMFI.populations.push(d.Population);
+      }
+      if (!pcAppMFI.samples.includes(d.SmpName)){
+        pcAppMFI.samples.push(d.SmpName);
+      }
+    });
+    pcAppMFI.populations = pcAppMFI.populations.sort(function(a, b){return a-b});
+    pcAppMFI.allLines = pcAppMFI.origData.length;
+
+    allPops = pcAppMFI.populations.length;
+    allSamples = pcAppMFI.samples.length;
+    for (var i = 0; i < allPops; i++) {
+      pcAppMFI.selectedPopulations.push(i);
+    }
+    for (var i = 0; i < allSamples; i++) {
+      pcAppMFI.selectedSamples.push(i);
+    }
+    /*
+     * For the plot use only the MFI information
+     * for each populations. Store in flowData
+    */
+    pcAppMFI.flowData = $.extend(true,[],data);
+    pcAppMFI.flowData.forEach(function(d) {
+      delete d['Population'];
+      delete d['SampleName'];
+      delete d['Percentage'];
+    });
+
+    displayPopTablem();
+    displaySmpTablem();
+    displayTableGridm();
+    displayParallelPlotm();
+
+    $("#resetDisplayMFIpop").on("click",function() {
+      var opcty = ".8";
+      for (var i = 0; i < allPops; i++) {
+        pcAppMFI.selectedPopulations.push(i);
+      }
+      for (var i = 0; i < allSamples; i++) {
+        pcAppMFI.selectedSamples.push(i);
+      }
+      for (var i = 0; i < pcAppMFI.allLines; i++) {
+        pcAppMFI.selectedLines.push(i);
+        pcAppMFI.lines.push(i);
+      }
+
+      $("#popSelectAllPCm").prop('checked',true);
+      $(".popSelectPCm").prop("checked",true);
+      $("#smpSelectAllPCm").prop('checked',true);
+      $(".smpSelectPCm").prop("checked",true);
+
+      $('#plotDivPCm .foreground path').css('stroke-opacity', opcty);
+      $('#pcm_opacity').html("80%");
+      $('#PCmline_opacity').val(0.8);
+
+      displayPopTablem();
+      displaySmpTablem();
+      displayTableGridm();
+      displayParallelPlotm();
+    });
+
+    $(window).on('resize',function() {
+      waitForFinalEvent(function() {
+        displayAllm();
+      }, 500, "resizePCm");
+    });
+  });
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/csOverview.template	Tue Jul 28 08:32:36 2020 -0400
@@ -0,0 +1,287 @@
+<!DOCTYPE html>
+<html>
+<head lang="en">
+<title>CrossSample Overview</title>
+<meta charset="UTF-8">
+<meta HTTP-EQUIV="Pragma" CONTENT="no-cache">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"/>
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css"/>
+<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.css"/>
+<link rel="stylesheet" type="text/css" href="js/Editor-1.5.6/css/editor.dataTables.css">
+<link rel="stylesheet" href="css/parallelCoordinates.css"/>
+
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script type="text/javascript" src="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.js"></script>
+<script src="js/Editor-1.5.6/js/dataTables.editor.js" type="text/javascript"></script>
+<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js" type="text/javascript"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" type="text/javascript"></script>
+<script src="https://cdn.plot.ly/plotly-1.0.0.min.js" type="text/javascript"></script>
+<script src="js/csOverview.js" type="text/javascript"></script>
+<script src="js/crossSamplePlots.js" type="text/javascript"></script>
+<script src="js/pCoordMFIstats.js" type="text/javascript"></script>
+<script src="js/pCoordCSstats.js" type="text/javascript"></script>
+<script src="js/color_palette.js" type="text/javascript"></script>
+<script src="js/boxplots.js" type="text/javascript"></script>
+
+<style>
+#input{font-family:Calibri,Arial}
+table.dataTable tbody td.dt-body-right {
+    text-align: right;
+}
+#div{padding:5px;width:150px;height:100px;text-align:center}
+table{width:100%;border:0px solid;border-collapse:collapse;text-align:center;}
+th{background-color:#3e6db0;color:#fff;padding:5px}
+</style>
+</head>
+
+<body>
+<div class="container-fluid">
+    <div class="row" style="padding-bottom:10px;min-height:500px;">
+        <div  class="col-md-12">
+            <ul class="nav nav-tabs tabs-main">
+                <li class="homeTab active" data-value="prop"><a href="#prop" data-toggle="tab">Population Distribution</a></li>
+                <li class="homeTab" data-value="stackedA"><a href="#stackedA" data-toggle="tab">Stacked Plot</a></li>
+                <li class="homeTab" data-value="pcoord"><a href="#pcoord" data-toggle="tab">Parallel Coordinates Population Summary</a></li>
+                <li class="homeTab" data-value="pcoordMFI"><a href="#pcoordMFI" data-toggle="tab">Parallel Coordinates MFI Summary</a></li>
+                <li class="homeTab" data-value="csstats"><a href="#boxplot" data-toggle="tab">Summary Statistics Boxplots</a></li>
+            </ul>
+
+            <div class="tab-content">
+                <div class="tab-pane active" id="prop" style="min-height:500px;">
+                    <div class="row">
+                        <div id="propDiv">Population Distribution</div>
+                    </div>
+                    <div class="row">
+                    &nbsp;&nbsp;&nbsp;&nbsp;Edit population names below:
+                    <div id="popnamesDiv"></div>
+                    </div>
+                </div>
+
+                <div class="tab-pane" id="stackedA" style="min-height:500px;">
+                    <div class="col-md-12 chartDiv">
+                        <div id="plotDivA" class="col-md-10" style="height:100%;"></div>
+
+                        <div id="popDivA" class="col-md-2" style="height:100%;">
+                          <div class="row">
+                              <div class="col-sm-6 optionButtons">
+                                <button id="updateDisplayA" class="igbtn">Reset Display</button>
+                              </div>
+                              <div class="col-sm-6 optionButtons">
+                                <button id="togglePlot" class="igbtn"><img id="toggleButtonImg" src="images/barssm.png"></button>
+                              </div>
+                            </div>
+                            <table id="popTableA" class="table table-condensed table-bordered igtable">
+                                <thead>
+                                    <tr>
+                                        <th><input type="checkbox" checked id="popSelectAllA"/></th>
+                                        <th>Pop. Names</th>
+                                        <th>Color</th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="tab-pane" id="pcoord" style="min-height:500px;">
+                    <div id="chartDivPC" class="col-md-12 chartDiv">
+                        <div class="row">
+                            <div class="col-md-10" style="height:100%;">
+                                <div id="plotDivPC" style="height:50%;"></div>
+                                <div id="tableDivPC" style="height:50%;"></div>
+                            </div>
+                            <div id="popDivPC" class="col-md-2" style="height:100%;">
+                                <div class="widget">
+	                                  <input type="range" min="0" max="1" value="0.8" step="0.01" id="PCline_opacity" >
+	                                  </input>
+                                      Opacity: <span id="pc_opacity">80%</span>
+	                            </div>
+                                <button id="resetPCDisplay" class="igbtn">Reset Display</button>
+                                <table id="popTablePC" class="table table-condensed table-bordered igtable">
+                                    <thead>
+                                        <tr>
+                                          <th><input type="checkbox" checked id="popSelectAllPC"/></th>
+                                          <th>Sample Name</th>
+                                          <th>Color</th>
+                                       </tr>
+                                    </thead>
+                                    <tbody>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="tab-pane" id="pcoordMFI" style="min-height:500px;">
+                    <div id="chartDivPCm" class="col-md-12 chartDiv">
+                        <div class="row">
+                            <div id="smpDivPCm" class="col-md-1" style="height:100%;min-width:5%;">
+                                 <table id="smpTablePCm" class="table table-condensed table-bordered igtable">
+                                    <thead>
+                                        <tr>
+                                          <th>Sample Name</th>
+                                          <th><input type="checkbox" checked id="smpSelectAllPCm"/></th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                    </tbody>
+                                </table>
+                            </div>
+                            <div class="col-md-9" style="height:100%">
+                                <div id="plotDivPCm" style="height:50%"></div>
+                                <div id="tableDivPCm" style="height:50%"></div>
+                            </div>
+
+                            <div id="popDivPCm" class="col-md-2" style="margin-top:5px;">
+                                <div class="widget">
+	                                  <input type="range" min="0" max="1" value="0.8" step="0.01" id="PCmline_opacity" >
+	                                  </input>
+                                      Opacity: <span id="pcm_opacity">80%</span>
+	                            </div>
+                                <button id="resetDisplayMFIpop" class="igbtn">Reset Display</button>
+                                <table id="popTablePCm" class="table table-condensed table-bordered igtable">
+                                    <thead>
+                                        <tr>
+                                          <th><input type="checkbox" checked id="popSelectAllPCm"/></th>
+                                          <th>Population</th>
+                                          <th>Color</th>
+                                        </tr>
+                                    </thead>
+                                    <tbody>
+                                    </tbody>
+                                </table>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="tab-pane" id="boxplot" style="min-height:500px;">
+                    <div class="col-md-12 chartDiv">
+                        <div id="mrkrDivC" class="col-md-2" style="height:100%;min-width:5%;">
+                          <table id="mrkrTableC" class="table table-condensed table-bordered igtable">
+                            <thead>
+                              <tr>
+                                <th>Shade</th>
+                                <th>Marker Names</th>
+                                <th><input type="checkbox" checked id="mrkrSelectAllC"/></th>
+                              </tr>
+                            </thead>
+                            <tbody>
+                            </tbody>
+                          </table>
+                          <input type="checkbox" unchecked id="displayLabelsC"/>&nbsp;Display values<br>
+                          <input type="checkbox" unchecked id="displayMFIC"/>&nbsp;Display MFI<br><br>
+                          <button id="changeDisplayC" class="igbtn">View per marker</button><br><br>
+                          <div id="markerWarning" style="display:none;">
+                            <div class="alert alert-info alert-dismissible fade in" role="alert">
+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                                <span aria-hidden="true">&times;</span></button>
+                                  Only 5 markers can be displayed at most.
+                            </div>
+                          </div>
+
+                          <div id="outlierWarning" style="display:none;">
+                            <div class="alert alert-info alert-dismissible fade in" role="alert">
+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                                <span aria-hidden="true">&times;</span></button>
+                                  The number of outliers is too large to display. Representation shows randomly downsampled outliers.
+                            </div>
+                          </div>
+                        </div>
+
+                        <div id="plotDivC" class="col-md-8" style="height:100%;"></div>
+
+                        <div id="popDivC" class="col-md-2" style="height:100%;">
+                            <button id="updateDisplayC" class="igbtn">Reset Display</button>
+                            <table id="popTableC" class="table table-condensed table-bordered igtable">
+                                <thead>
+                                    <tr>
+                                        <th><input type="checkbox" checked id="popSelectAllC"/></th>
+                                        <th>Pop. Names</th>
+                                        <th>Color</th>
+                                     </tr>
+                                </thead>
+                                <tbody>
+                                </tbody>
+                            </table>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+        </div>
+    </div>
+</div>
+
+
+</div>
+</div>
+<script>
+
+var poppropLoaded = false;
+var stackedALoaded = false;
+var pCoordLoaded = false;
+var pCoordMFILoaded = false;
+var boxplotLoaded = false;
+
+$().ready(function() {
+    $(document).on('shown.bs.tab','a[data-toggle="tab"]', function(e) {
+      var tab = e.target.getAttribute("href");
+      if (tab == '#prop') {
+        if (poppropLoaded) {
+            return true;
+        }
+        poppropLoaded = true;
+        displayProp();
+      }
+      if (tab == '#stackedA') {
+        if (stackedALoaded) {
+            displayPopulationLegend(configAreaplot);
+            updatePlot(configAreaplot);
+            return true;
+        }
+        stackedALoaded = true;
+        displayStackedAreaPlot();
+      }
+      if (tab == '#pcoord') {
+        if (pCoordLoaded) {
+            displaySmpTable();
+            displayTableGrid();
+            return true;
+        }
+        pCoordLoaded = true;
+        displayParallelCoordinates();
+      }
+      if (tab == '#pcoordMFI') {
+        if (pCoordMFILoaded) {
+            displayPopTablem();
+            displaySmpTablem();
+            displayTableGridm();
+            return true;
+        }
+        pCoordMFILoaded = true;
+        displayParallelCoordinatesMFI();
+      }
+      if (tab == '#boxplot') {
+        if (boxplotLoaded) {
+            displayPopulationLegend(configBoxplot);
+            displayMarkerTable(configBoxplot);
+            updateBoxplot(configBoxplot);
+            return true;
+        }
+        boxplotLoaded = true;
+        displayBoxplot();
+      }
+    });
+
+    poppropLoaded = true;
+    displayProp();
+});
+</script>
+</body>
+</html>
--- a/test-data/csBoxplotData.json	Wed May 20 16:04:43 2020 -0400
+++ b/test-data/csBoxplotData.json	Tue Jul 28 08:32:36 2020 -0400
@@ -1,1 +1,1 @@
-{"lower": {"CCR3":{"1":-57.5,"2":56.0,"3":294.25,"4":288.5,"5":-76.5,"6":94.0,"7":116.0,"8":342.0,"9":434.875,"10":-57.5,"11":446.5,"12":-64.5,"13":125.5,"14":-74.0,"15":-86.0,"16":-88.375,"17":78.0,"18":58.5,"19":237.625,"20":96.0,"21":-21.0,"22":135.625,"23":251.5,"24":-39.5,"25":60.0,"26":114.0},"CCR7":{"1":37.5,"2":-112.5,"3":-183.75,"4":-114.75,"5":-196.5,"6":-160.625,"7":-20.0,"8":71.5,"9":64.5,"10":-94.5,"11":-126.875,"12":-23.0,"13":135.0,"14":351.5,"15":-202.25,"16":262.875,"17":397.0,"18":39.0,"19":192.625,"20":268.25,"21":94.5,"22":44.375,"23":373.0,"24":-4.75,"25":167.5,"26":200.0},"CD4":{"1":446.0,"2":441.0,"3":434.0,"4":-96.5,"5":-105.5,"6":-79.0,"7":-62.5,"8":449.5,"9":-77.0,"10":442.0,"11":-65.5,"12":-15.25,"13":415.0,"14":430.0,"15":191.0,"16":-57.5,"17":376.25,"18":450.5,"19":249.75,"20":-60.25,"21":25.5,"22":240.875,"23":271.5,"24":277.0,"25":77.5,"26":5.5},"CD8":{"1":-133.5,"2":-183.0,"3":550.5,"4":-141.25,"5":-144.5,"6":504.5,"7":515.0,"8":566.5,"9":-198.5,"10":-151.5,"11":510.0,"12":-57.75,"13":512.5,"14":-196.5,"15":-161.75,"16":-188.875,"17":-205.75,"18":-172.5,"19":117.375,"20":516.0,"21":111.0,"22":53.0,"23":281.0,"24":21.5,"25":161.0,"26":190.5},"FSC":{"1":271.5,"2":260.5,"3":265.0,"4":175.5,"5":207.0,"6":278.5,"7":295.0,"8":287.0,"9":187.875,"10":258.0,"11":286.5,"12":256.5,"13":263.5,"14":278.0,"15":232.25,"16":270.0,"17":261.75,"18":268.0,"19":708.0,"20":297.0,"21":486.5,"22":463.5,"23":326.0,"24":469.0,"25":548.0,"26":748.625},"SSC":{"1":42.0,"2":37.5,"3":42.0,"4":23.5,"5":49.0,"6":38.5,"7":43.5,"8":46.0,"9":21.75,"10":43.0,"11":36.5,"12":2.25,"13":15.5,"14":34.0,"15":1.5,"16":26.5,"17":-25.25,"18":41.0,"19":1023.0,"20":53.0,"21":798.0,"22":186.375,"23":1023.0,"24":178.75,"25":1023.0,"26":1023.0}}, "mfi": {"CCR3":{"1":72,"2":187,"3":483,"4":520,"5":109,"6":251,"7":304,"8":504,"9":641,"10":68,"11":565,"12":161,"13":306,"14":108,"15":110,"16":201,"17":289,"18":195,"19":541,"20":267,"21":173,"22":283,"23":448,"24":132,"25":232,"26":311},"CCR7":{"1":189,"2":37,"3":68,"4":141,"5":67,"6":90,"7":318,"8":257,"9":419,"10":32,"11":111,"12":213,"13":424,"14":566,"15":84,"16":509,"17":598,"18":198,"19":629,"20":534,"21":224,"22":204,"23":476,"24":204,"25":269,"26":343},"CD4":{"1":520,"2":523,"3":512,"4":84,"5":56,"6":75,"7":83,"8":517,"9":138,"10":521,"11":85,"12":119,"13":516,"14":526,"15":322,"16":104,"17":509,"18":524,"19":490,"20":82,"21":145,"22":389,"23":366,"24":392,"25":182,"26":325},"CD8":{"1":53,"2":67,"3":632,"4":114,"5":82,"6":608,"7":620,"8":641,"9":327,"10":59,"11":604,"12":183,"13":615,"14":76,"15":75,"16":138,"17":119,"18":60,"19":533,"20":621,"21":225,"22":215,"23":387,"24":187,"25":259,"26":318},"FSC":{"1":364,"2":370,"3":363,"4":360,"5":333,"6":372,"7":389,"8":371,"9":422,"10":357,"11":381,"12":410,"13":406,"14":401,"15":356,"16":413,"17":440,"18":384,"19":944,"20":393,"21":617,"22":667,"23":546,"24":681,"25":727,"26":960},"SSC":{"1":117,"2":121,"3":112,"4":175,"5":156,"6":154,"7":162,"8":113,"9":214,"10":114,"11":138,"12":276,"13":137,"14":139,"15":121,"16":239,"17":198,"18":128,"19":966,"20":154,"21":975,"22":437,"23":976,"24":440,"25":1013,"26":975}}, "outliers": {"CCR3":{"1":[],"2":[342,565,320,633,364,568,450,390,545,543,548,558,305,309,322,385,344,331,424,358,310,388,542,607,335,338,530,324,316,412,594,593,339,386,306,432,333,488,560,375,317,323,627,367,536,333,578,313,321,348,385,310,407,366,502,333,337,334,335,334,351,419,376,312,317,310,307,418,317,345,423,368,340,334,393,568,553,317,326,366,587,354,553,313,315,313,314,565,345,385,340,407,387,333,503,550,378,385,320,531],"3":[283,281,260,281,258,291,278,222,240,287,273,236,270,272,260,280,259,262,277,282,261,156,698,190,251,283,286,278,239,167,281,187,293,285,165,237,245,240,280,256,268,262,286,153,237,285,294,249,294,285,228,286,293,282,282,141,255,254,180,274,234,210,266,175,159,264,270,266,272,277,256,214,273,224,206,195,276,127,184,176,268,241,246,274,281,215,288,266,278,168,274,275,230,232,270,252,267,181,95,264],"4":[274,260,274,273,244,246,263,257,249,263,259,245,280,223,286,244,250,266,267,282,215,252,285,276,277,233,276,276,214,266,217,276,281,202,260,225,240,253,240,282,261,253,256,221,234,262,287,243,251,268,244,258,272,198,201,282,249,192,247,232,257],"5":[322,299,336,356,329,353,348],"6":[34,79,55,433,45,80,443,90,84,24,66,39,36,66,29,427,421,44,40,77,430,426,88,85,65,77,47,66,421,420,433,49,27,430,56,423,424,447,78,2,15,434,424,57,438,423,72,2,84,65,72,69,65,419,29,29,58,69,429,84,62,429,72,441,421,0,63,66,417,54,443,426,41,426,429,416,444,417,85,416,433,55,26,65,421,71,52,52,91,448,0,0,63,44,429,419,35,21,426,69],"7":[110,49,99,62,82,84,108,38,112,55,113,509,557,500,481,611,493,506,564,563,483,506,608,507,490,487,477,489,543,490,539,501,551,524,494,639,544,499,491,484,479,483,514,479,501,579,552,552,536,494,499,486,483,98,479,91,104,45,87,25,114,110,109,92,85,99,97,87,75,103,73,16,82,96,50,74,94],"8":[319,256,219,327,318,280,319,282,240,258,263,317,308,276,328,321,306,309,848,332,331,329,766,715,775,888,310,315,300,720,756,945,336,303,323,341,335,323,692,692,1023,695,333,737,705,699,321,324,329,715,841,765,704,335,687,319,319,873,330,329,682,307,750,290,332,327,296,338,340,806,686,326,682,722,691],"9":[427,431,424,395,356,291,421,996,843,939,847,842,950,397,892,886,434,948,983,842,939,899,841,260,363,394,322,434,924,427,832],"10":[],"11":[749,731,444,442,785,435,443,440,442,444,437,446,444,445,815,439,727,816,440,439,442,446,437,441,444,770,787,439,427,435,417,428,416,742,407,425,422,430],"12":[514,431,402,398,398],"13":[524,68,493,500,62,630,104,530,507,494,498,490,111,94,55,100,513,502,550,521,501,83,516,0,122,81,488,515,586,84,615,65,496,545,80,530,501,494,486,69,495,84,109,486,125,89,93,116,539,506,570,534,495,111,114,501,529,530,522,541,64,494,577,486,40,97,557,115,485,74,628,522,496,507,596,491,529,542,121,520,81,119,613,485,511],"14":[],"15":[325,349,396,329],"16":[508],"17":[528,537,580,600,534,544,556,626,558,595,616,631,513,568,38],"18":[350,405,439,330,472,332,320,386,362,452,336,425,384,323,328,373,387,349,328,331,368,322,343,442,330,556,335,408,343,350,336,406,457,366,323,354,331,321,360,327,372,365,336,364,395,354,366,402,323,323,339,366,423,389,552,329,409,323,343,388,418,327,404,323,324,327,429,324,379,405,350,331,398,375,578,328,344,357,413,42,379,329,377,370,529,351,356,416,337,339,323,335,538,368,350,366,422,322,336,341],"19":[186,841,1023,905,986,1023,812,799,951,1005,955,887,928,804,1023,1022,987,1023,876,1023,835,975,230,1013,816],"20":[565,523,528,472,684,463,477,458,511,627,470,467,500,495,479,568,553,46,10,72,59,91,27,95,85,14,95,0,61,39,87,58,2,74,58,16,33,48,20,76,80,45,57,85,0,54,82,72,89,65,35,80,50,77,91,46,40],"21":[426,400,393,446],"22":[429,431,427,442,431,479,429,412,120,438,439,126,457,415,485,576,426,473,625,440,446,609,531,589,439,560,581,545,610,522,562,457,612,625,634,607,481,563,643,580,611,599,512,555,562,701,523,465,574,422,439,486,522,629,552,619,463,578,458,628,532,597,609,536,444,557,451,495,527,642,654,594,425,613,606,668,477,421,548,543,540,456,541,464,416,135,128],"23":[144,250,145,649,699,685,806,806,722,959,243,235,100],"24":[],"25":[422,17,34,19,41,7,407,56,6,0,0,37,423,51,47,56,35,0,39,35,58,15,33,0,0,55,44,1,0,0,52,59,0,0,27,30,23,56,53,8,14,19,0,37,420,10,44,28,397,38,53,57,0,57,57,48,56,31,55,43,52,39,53,420,31,28,22,0,57,24,54,30,46,45,28,515,0,3,50,46,40,27,12,4,485,16,34,32,59,10,31,10,5,32,54,16,34,45,57,9],"26":[77,514,540,25,100,35,564,621,589,641,547,511,83,545,579,77,625,83,100,68,102,98,102]},"CCR7":{"1":[348,334,382,341,340,334,342,355,344,345,338,331,333,373,356,371,346,390,359,379,330,330,384,336,338,373,340,354,346,370],"2":[188,198],"3":[],"4":[442,445,424,435,424],"5":[328],"6":[],"7":[],"8":[469,441,576,431,541,477,508,488,512,437,432,450,563,459,474,577,443,448,505,486,521,554,443,579,699,438,444,463,458,452,507,437,520,817,492,448,454,515,599,460,516,430,491,444,507,439,501,601,436,468,430,438,474,513,438,504,511,436,647,499,431,497,444,432,428,449,441,522,577,447,557],"9":[907,825,836,941,925,978,829,811,893,855,835,837,920,818,890],"10":[],"11":[404,425,440,380,362,428,404,399,400,425,344,373,347,475,388,426,537,486,469,595,566,464,429,435,488,442,410,428,432,603],"12":[419,429,466],"13":[714,735,780,120,768,750,735,727,753,724],"14":[],"15":[],"16":[250,220,784,786,850,815,822,771,817,761,817,750,774,741,772],"17":[856,797,897,823,867,874,952,851,393,379,811],"18":[463,0,421,425,355,361,353,392,372,367,377,377,371,398,383,355,358,375,380,387,379,401,371,367,367,365,388,378,353,384,358,371,372,378,386],"19":[161,172,184],"20":[849],"21":[0,90,49,368,35,84,40,0,18,580,12,27,87,0,85,84,0,0,74,88,70,37,87,381,71,93,58,6,22,86,392,16,67,49,0,72,44,45,19,74,84,0,0,32,84,39,94,15,81,59,79,63,51,12,1,81,71,91,68,72,54,30,6,0,0,50,73,69,31,84,86,19,63,423,372,94,87,80,62,74,478,89,70,71,94,77,79,0,62,14,476,77,58,63,0,70,70,14,29,486],"22":[0,0,422,5,0,482,0,24,23,41,0,34,0,412,446,0,0,10,18,30,0,0,0,0,0,12,44,452,25,22,0,540,32,35,22,0,502,491,0,0,32,12,25,44,435,0,34,44,6,538,463,0,0,490,496,495,430,434,446,0,460,622,430,0,548,422,7,430,482,0,0,426,412,0,487,547,421],"23":[677,725,558,822,721,578,615,250,798,588,738,647,578,346,637,686,615,635,882,675,572,355,603,299,253,306,236,657,211,607,599,140,707,574,292,654,613,266,638,742,711,584,700,661,347,607,332,256,570,321,590,311,589,362,753,800,643,710,345,594,305,640,771,371,692,750,637,727,342,595,609,684,569,685,358,334,335,604,565,731,638,641,597,608,587],"24":[500,617,499,468,423,494,423],"25":[158,381,401,87,126,166,164,161,385,159,139,141,417,158,397,101,434,164,154,159,122,150,117,162,401,157,150,156,487,159,166,157,372,161,56,163,428,1,131,154,132,163,463,119,82,379,430,165,126,468,97,397,131,161,167,151,131,148,150,115,6,164,80,119,416,141,167,149,143,120,373,110,121,404,373,131,159,158,148,159,162,93,372,167,147,162,438,166,157,139,98,119,137,111,166,430,84,160,158,129],"26":[485,175,521,568,482,179,513,482,138,160,164,193,503,496,560,500,483,515,482,523,535,603,482,499,526,199,189,487,482,495,484,531,546,506,501,526,508,492,526,543,489,492,560,495,507,492,512,560]},"CD4":{"1":[429,383,443,405,441,380,416,443,405,432,445,441,429,441,396,427,442,421,445,430,439,439,440,434,444,393,413,417,439,444,416,626,444,361,368,404,443,421,371,436,409,441,357,418,381,439,434,434,419,440,441,406,379,445,444,433,438,423,439,429,437,433,423,418,406,430,427,410],"2":[434,613,428,420,429,377,376,432,433,339,398,389,428,382,344,411,379,416,420,618,424,417,411,421,440,422,417,337,409,418,438,359,428,611,414,440,439,432,440,217,436,339,637,432,404,334,439,384,400,398,377,330,376,439,365,342,424,305,389,396,424,360,408,377,417,303,437,623,408,384,359,396,385,359,314,355,361,377,414,291,218,402,424,325,384,434,359,374,429,344,422,409,613,322,288,404,409,430,418,340],"3":[303,296,364,342,428,305,344,327,357,384,413,403,296,432,419,429,371,377,432,433,397,400,432,427,365,428,420,344,428,357,324,604,396,309,337,339,389,422,409,415,405,599,431,424,423,599,388,433,419,368,306,430,413,426,433,426,374,409,429,405,297,298,303,369,311],"4":[272,332,281,251],"5":[208,204],"6":[253,218,219,256,249,237,220,322,278,265,244,221,243],"7":[235,241,234,285,241,248,230,237,232],"8":[252,407,349,321,381,349,281,238,259,259,398,406,261,356,276,415,445,440,394,426,443,448,431,447,413,420,448,424,447,644,426,429,447,439,438,446,590,378,424,441,606,446,607,447,613,378,391,447,441,437,341,436,440,389,417,426,338,411,412,405,428,381,423,445,429,439,442,433,447,640,443,402,393,426,400,322,618,384,444,356,449,419,618,439,438],"9":[368,369,427,427,375,697,565,400,389,385,560,502,549,401,376,418,465,459,406,479,465,454],"10":[437,425,393,425,441,430,434,425,433,416,429,432,423,438,438,395,621,435,394,438,427,426,645,441,423,434,418,424,414,441,419,424,432,429,424,423,615,401,425,439,429,433,412,422,433,440,439,408,432,412,436,440,437,422,437,434,434,393,399,412,439,415,422,439,436,420,415,434,417],"11":[256,252,251,242,271,242,247,313,244,237],"12":[333,266,284,263,271,266,293,271,258,273,257,255,307,267,336,276,303,345,314,390,304,293,271,305,384,360,331,286,323,301,270,273,299,314,255,338,292,262,280,292,288,264,263,306,319,257,320,319,298,302,312,313,272,266,292,367,276,265],"13":[242,349,409,639,403,375,377,406,352,399,392,387,366,359,414,357,367,400,394,388,404,292,394,381,396,401,392,409,411,411,312,312,235,346,299,313,363,407,377,261,367,319,365,302,197,346,260,403,387,354,358,305],"14":[331,330,406,234,359,365,405,261,386,416,426,398,388,368,425,390,421,377],"15":[187,189,178,183,170,179,187,134,156,154],"16":[295,315,290,290,283,265,252,318,266,319,277,291,259,271,278,282,264],"17":[313,369,234,373,236,330,286,363,263,368,299,370,352,344,364,343,327,359,304],"18":[449,434,610,445,380,440,445,446,638,447,424,374,374,435,351,373,427,423,443,611,449,448,609,400,410,444,410,436,449,441,385,350,339,272,356,353,353,337,305,440,346,417,317,351,359,367,208,407,295,385,435,299,265,277,432,320,216,300,306,315,330,345,428,258,358,435,294,330,391,365,319,252,444,320,414,392,406,442,618,608,447,418,402,422,444,448,318,438,415,409,442,443,393,430,358,413,334],"19":[775,768,764,235,245,216,231,210,193,1023,208],"20":[241,252,281,238,304,304,312,252,249,226],"21":[0,10,10,25,7,300,0,0,268,11,17,18,0,10,0,0,324,6,21,18,0,17,262,8,10,274,0,12,23,0,1,10,263,303,0,306,267,265,0,10,294,265,18,0,280,263,290,0,6,22,12,24,293,15,0,0,22,0,265,10,278,266,0,8,266,21,289,9,3,357,7,17,25,12,25,282,23,0,11,14,282,0,11,22,0,1,276,0,277,0,305,357,24,267,10,0,23,287,346,0],"22":[185,185,139,190,196,579,161,220,163,136,194,126,150,232,164,157,204,197,169,203,154,227,176,547,206,149,95,235,235,170,228,215,126,149,177,228,177,578,209,234,213,561,157,160,219,224,205,134,232,155,143,564,223,221,225,188,237,194,200,218,176,195,222,136,125,146,208,214,171,171,550,138,136,234,134,230,108,193,111,224,203,167,112,178,128,214,223,169,110,204,187],"23":[270,264,213,483,248,505,231,268,628,224,242,536,259,196,248,179,515,240,499,505,181,175,211,252,517,223,196,239,540,522,149,575,159,591,580,249,512,529,189,494,178,224,485,249,488,224,270,167,262,187,205,266,538,465,216,220,168,580,556,180,237,536,177,521],"24":[550,263,574,252,528,226,167,266,247,180,578,241,585,611,623,550,247,263,262,563,181,633,273,200,152,244,215,541,250,573,232,214,215,90,546,266,519,263,258,177,243,264,203,537,611,195,241,234,231,186,137,210,136,206,521,611,245,231,271,155,253,151,274,255,191,156,208,248,188,202,251,175,207,260,189,236,578],"25":[53,40,47,316,55,56,71,330,291,66,411,72,77,31,0,298,0,52,309,76,38,59,64,77,73,53,340,56,321,68,43,63,71,298,308,58,76,321,293,44,14,316,36,37,307,293,68,304,315,34,318,41,290,330,72,292,38,68,71,317,311,75,45,77,65,344,54,74,347,48,313,50,422,0,328,316,315,31,40,61,65,0,76,25,297,476,295,292,61,56,43,528,72,73,67,65,39,297,76,71],"26":[]},"CD8":{"1":[250,237,223,298,237,252,236,234,250,223,231,326,276,254,228,236,233,225,252],"2":[332,325,381,329,306,376,312,432,397,342,382,331,372,391,347,349],"3":[538,478,545,516,532,550,483,421,734,497,733,542,521,535,514,731,523,512,542,479,541,443,542,518,514,490,544,546,482,549,417,538,521,518,546,547,540,489,515,457,534,538,531,523,549,534,544,530,512,542,505,544,521,524,484,550,522,728,522,528,470,524,545,535,536,528,532,548,450,514,530,521,483,513,352],"4":[],"5":[287,316,291,297,286,314,351,286,358,283,279,262,287,344,260,286,285,296,282,297,280,334,271,260,260,268,312,296,328,299,318,326,284,325,334,331,284,300,297,318,266,273,280,267,274,280,290,286,266,323],"6":[499,447,727,429,405,428,420,481,489,487,401,462,443,489,732,729,415,440,439,436,389,414,431,434,502,462,500,469,410,458,431,495,462,400,467,446,463,467,503,482,414,494,496,498,404,443,446,466,484,423,379,444,429,383,441,501,455,493,432,421,373,503,471,456,499,471,497,467,483,491,422,387,375,404,442,391,453,469,437,485,451,474,479,481,454,490,498,402,442,438,372,502,457,444,386,397,431,483,485,496],"7":[396,422,454,740,422,448,487,445,479,458,423,445,504,495,486,468,464,505,497,500,439,489,511,510,463,464,492,482,513,491,455,473,388,468,444,455,372,464,487,450,461,455,507,486,454,463,484,489,480,425,461,503,509,514,481,457,490,493,471,439,500,503,406,429,504,485,444,448,456,475,474,513,348,462,440,441,442,501,748,488,421,444,480,451,474,445,484,463,500,402,491,435,504,499,477,460,492,496,465,479],"8":[514,486,530,527,439,565,566,730,739,487,559,506,529,752,563,515,565,535,788,503,564,535,566,541,725,557,548,472,432,522,884,509,544,467,555,492,533,561,551,518,558,558,548,512,475,745,524,562,753,524,557,527,546,561,497,533,476,550,522,739,561,559,490,232,266,334],"9":[860,872],"10":[290,266,271,260],"11":[443,728,497,445,472,742,716,506,496,505,499,481,746,501,757,478,482,506,485,704,715,468,707,705,487,498,471,376,504,736,499,707,504,495,482,497,470,422,497,504,497,501,705,504,720,711,504,480,746,492,705,714,761,737,460,508,472,413,505,497,450,500,712,722,383,414,495,479,508,493,466,450,717,492,499,703,464,742,494,734,460,498,722,507,493,453,458,744,741,476,715,381,469,483,493,400,711,911,857,723],"12":[477,479],"13":[369,455,378,497,503,473,447,512,512,501,493,512,492,507,493,508,496,477,507,476,506,488,477,507,491,743,427,485,496,431,503,448,509,486,728,486,484,487,478,459,510,500,478,502,449,493,501,481,438,501,497,427,463,479,453,464,483,458,493],"14":[545,610,562,594,546,569,594,577,561,600,513,471,555,596,557,435,581,363],"15":[302,408,358,419,350,348],"16":[],"17":[494,491,451,489,456,457,524,540,462],"18":[357,348,395,290,437,339,483,406,427,355,377,364,455,492,314,376,388,439,339,390,370,446,429,436,528,317,419,392,320,323,299],"19":[1023,1023,1009,1012,1023,1023],"20":[427,446,491,413,507,479,434,467,496,419,493,502,473,427,466,428,512,486,467,483,435,425,417,451,415,463,461,459,489,509,408,431,395,751,423,488,492,501,474,774,492,492,438,408,455,423,449,385,490,448,414,468,491,423,407,456,436,403,438,472,365,472,475,457,441,471,437,744,513,480,398,492,495,442,408,510,380,470,442,489,472,445,420,494,466,495,427,467,447,504,438,490,488,837,439,514,500,461,466,512],"21":[108,107,88,28,78,96,66,348,41,78,55,99,75,106,99,79,109,71,49,101,98,103,75,78,79,88,88,107,103,100,105,78,98,106,108,90,73,90,51,110,344,103,95,87,101,80,110,63,90,0,60,100,109,104,0,110,107,0,46,106,76,95,107,71,40,0,105,350,59,0,86,96,53,109,43,86,34,4,72,14,83,109,95,81,82,34,51,52,109,74,77,102,44,84,17,372,109,65,107,106],"22":[396,40,48,2,25,43,51,1,37,19,17,0,16,385,44,14,0,43,46,10,27,405,619,659,512,414,544,391,446,459,445,652,410,401,440,428,612,481,32,473,461,407,0,49,42,0,507,1,0,5,0,9,0,32],"23":[238,278,268,236,499,261,247,541,609,642,216,245,569,236,511,267,272,595,578,493,236,507,605,592,644,503,517,550,572,690,591,617,556,631,654,619,663,532,773,490,638,614,665,637,621,684,529,602,533,215,274,482,626,522,670,161,204,268,220,140,261,278,238,148,135,262,105,547,237,498],"24":[0,16,16,0,0,0,11,0,7,0,0,0,8,378,0,4,0,10,0,0,439,383,10,0,375,3,0,21,12,0,19,10,0,19,21],"25":[157,364,67,115,154,143,159,621,158,52,145,148,156,142,150,122,160,120,160,143,136,154,153,152,384,0,157,373,157,145,150,133,143,150,149,397,82,143,135,136,137,155,140,138,138,151,364,372,369,84,379,118,129,79,143,425,160,154,157,151,144,123,114,158,517,132,107,153,160,150,114,160,150,160,158,370,129,460,134,155,69,135,630,142,109,157,61,145,151,370,152,62,157,401,132,108,141,157,89,79],"26":[675,603,125,189,168,160,180,172,631,452,468,607,452,627,447,621,613,459,597,482,187,452,575,156,523,652,177,182,585,641]},"FSC":{"1":[481,470,476,483,271,488,466,463,485,462,458,262,266,267,266,466,466,472,509,572,464,468,261,261,262,268,458,264,468,265,262,262,466,261,271,270,468,455,455,263,495,262,486,459,270,454,265,487,466,485,541,266,473,453,270,458,264,464,458,568,457,475,464,475,266,265,476,455,455,267,495,499,267,463,474,460,482,264,499,465,461,262,452,480,462,472,477,503,464,519,459,460,485,474],"2":[519,588,596,509,685,566,560,485,578,500,608,611,510,611,553,528,516,561,500,592,610,638,672,567,561,486,604,569,483,493,515,529,596,580,610,619,574,485,537,495,568,630,513,556,601,531,489,513,626,573,611,537,641,657,500,524,527,516,486,488,543,569,545,527,551,610,493,639,503,534,522,481,489,517,488,683,518,485,529,646,484,516,537,513,607,604,548,487,559,481,572,484,603,547,628,504,486,540,640,598],"3":[468,522,545,573,261,262,494,264,261,487,530,478,480,550,588,264,503,459,263,470,262,262,261,471,509,599,484,262,262,463,261,470,543,264,468,474,561,262,262,477,529,262,498,481,479],"4":[614,532,555,568,558,539,549,651,628,554,555,549,580,708,628,577,647,532,627,612,538],"5":[454,448,450,460,461,459,473,459,451,461,465,451,452,509,501,464,470,469,505,461,488,597,457,458,483,451,456,501],"6":[617,466,487,467,271,270,277,540,268,475,482,266,493,275,464,584,478,464,270,459,465,486,262,460,462,278,262,270,491,262,472,533,569,267,489,262,470,496,465,461,482,274,270,266,266,264,274,466,261,469,262,261,265,470,270,266,262,270,262,467,274,476,623,499,555,492,266,475,464,469,617,264,270,518,265,489,503,482,486,478,266,494,603,464,278,266,263,467,482,459,268,273,266,264,470,262,493,268,276],"7":[543,643,263,689,492,594,498,673,564,286,509,611,495,481,492,624,262,290,544,282,822,494,267,261,683,288,286,553,266,497,489,573,262,517,518,494,263,290,480,567,568,263,609,503,706,497,291,485,498,522,592,488,487,294,262,532,496,632,559,681,480,276,644,617,620,619,495,294,285,284,536,503,726,843,595,282,290,592,535,822,534,526,278,558,282,486,513,824,484,289,524,572,734,488,261,481,839,622,569,265],"8":[493,509,271,265,286,266,661,268,273,548,278,278,547,284,476,275,279,508,279,271,696,284,505,605,505,265,656,459,488,469,490,276,457,498,459,263,271,623,265,268,695,276,565,464,266,471,262,473,286,512,264,460,502,265,463,280,646,573,277,284,262,265,580,264,263,263,593,460,665,591,580,563,514],"9":[705,746,651,733,702,740,687,760,675,773,653,668,786,679,687,714,712,680,686,739],"10":[476,469,537,474,497,546,455,465,535,493,460,462,457,481,469,454,479,513,517,483,462,462,472,462,451,458,464,463,478,451,503,501,451,461,459,468,460,453,473,464,475,472,452,471,451,461,460,454,499,451,465,467,466,459,463],"11":[286,263,284,282,262,270,266,278,262,517,261,261,510,521,500,561,274,284,491,589,479,489,776,280,265,280,283,647,643,285,546,284,597,502,563,276,281,270,501,282,264,545,548,481,273,616,702,669],"12":[614,594,602,623,639,708,633,753,609,694,613,742,606,696,681,590,733,677,594,643,599,602,626,680,592,582,609,620,606,614,649,663,589,657,632,604,597,699,622],"13":[674,554,766,633,563,706,708,761,585,262,595,556,606,262,565,262,575,649,560,576,557,614,552,581,607,573,592,554,263,262,262,589,676,614,581,618,743,618],"14":[265,262,686,276,261,265,270,523,526,263],"15":[632,485,523,564,487,532,547,488,590,555,514,504,646,530,529,509,486,539,536,520,512],"16":[266,559,263,542,608,591,668,649,562,549,546,681,793,262,650,541,593,622,263,537,574,760,609,653,717,549,551,648,565,548,726,562,561,264,656,594,763,713,625,261,555,739,604,727,590,704,544,549,268,735,562,650,564,632,266,608,570],"17":[698,709,697,796,698,650,698,641,714,702,638,702,660,769,636,718,706,837],"18":[506,571,627,534,503,566,551,547,513,522,528,535,506,611,556,501,517,539,509,556,536,574,548,664,508,501,262,517,512,267,503,526,550,573,576,543,512,577,519,266,522,532,513,625,523,639,264,516,501,582,511,549,510,502,516,508,556,505,511],"19":[585,701,620,693,696,616,591,595,626,682,675,631,702],"20":[544,746,501,521,492,493,538,494,504,500,490,676,515,290,288,620,578,268,294,599,726,290,598,524,266,296,530,262,526,288,621,737,538,281,289,556,501,291,689,498,614,638,265,504,498,510,524,579,278,287,514,284,595,520,603,267,570,516,526,494,507,285,631,590,268,271,505,699,579,490,623,291,286],"21":[746,755,481,442,462,482,474,458,478,437,417,483,475,424,740,748,392,485,378,405,740,428,457,773,763,484,479,468,461,481,472,435,749,485,471,774,404,463,409,477,754,447,788,486,470,742,482,479,478,811,486,760,448,467,479,747,750,747,753,448,745,754,745,457,459,460,752,421,483,747,754,459,439,432,449,452,779,436,486,752,447,307,770,471,449,477,450,480,449,471,486,758,471,451,740,431,423,472,462,752],"22":[398,876,1023,409,451,876,901,441,881,444,909,1023,882,956,904,883,922,897,901,1022,921,424,925,902,1023,951,927,1013,924,939,976,905,425,457,937,398,453,932,454,463,462,450,420],"23":[323,785,798,767,787,289,780,310,266,266,305,318,268,776],"24":[458,391,447,1023,446,979,899,903,896,974,1008,934,904,454,931,425,937,898],"25":[913,904,909,903,909,923,913,906,961,902,917,908,901,910,934,954,902,906,905,906,902,958,906,902,902,944,901,937,903,922,938,918,904,910,904,913,924,911,907,906,909,906,901,938,903,908,907,910,915,942,906,901],"26":[732]},"SSC":{"1":[248,202,216,196,240,241,322,236,208,289,189,230,207,249,188,29,196,220,201,191,218,223,236,190,198,35,199,195,201,235,202,198,191,196,200,250,224,226,267,208,232,316,214,199,189,198,225,202,189,197,266,191,202,215,193,188,229,199,221,202,202,198,203,223,218,250,196,223,199,207,201,208,197,206,227,41,201,187,214,187,239,192,193,219,194,188,267],"2":[209,280,228,288,240,220,216,278,296,342,204,231,315,349,204,254,204,214,210,247,212,203,319,213,204,286,241,216,229,205,220,202,202,233,224,293,219,313,315,209,293,223,311,253,292,241,240,256,360,278,239,283,375,223,363,282,216,321,420,234,35,280,204,343,229,270,226,287,270,242,245,281,229,336,381,202,221,232,282,204,298,245,210,214,234,237,283,293,253,268,205,230,333,297,227,285,37,283,225,286],"3":[181,180,248,223,179,184,224,291,191,220,220,185,211,39,33,185,39,184,35,193,183,195,190,40,191,30,231,205,206,194,207,185,183,190,199,188,185,202,272,218,220,179,181,208,353,37,210,219,189,181,196,38,194,40,257,37,183,185,180,188,186,189,208],"4":[409,427,324,398,362,330,323,317,326,324,363,480,324,330,544,381,330,379,376,351,407,373,367,344,445,455,372,340,426],"5":[253,43,299,275,251,259,266,261,309,256,45,351,250,262,263,40,297,23,48,274,252,263,274,257,275,263,267,282,265,277,23,250,252,18,268,43,279,273,251,268,466,304,307,280,310,304,278,260,253,295,14,274,267,270,254,265,47,251,298,284],"6":[260,265,261,266,287,290,291,277,265,270,290,299,445,272,267,273,266,260,273,362,268,272,264,277,267,268,259,263,259,266,277,262,293,263,266,266,271,259,278,377,273,265,260,293,333,285,283,326,270,278,271,274,259,277,274,284,319,303,260,260,283,264,283,272,310,291,425,283,310,36,35,32,38,36],"7":[367,338,296,405,301,365,282,350,475,299,282,307,299,298,309,417,426,302,316,337,333,345,328,546,285,290,280,403,468,284,301,423,292,284,448,332,296,330,389,372,281,297,284,296,38,30,365,281,43,284,30,344],"8":[182,215,226,197,263,194,207,355,469,192,203,183,482,178,39,215,304,178,181,182,197,206,23,43,201,181,267,175,224,197,27,211,195,190,188,415,183,229,244,40,194,257,195,213,601,181,235,189,180,44,222,178,202,195,247,178,25,184,211,250,278,222,211,202,219,258],"9":[655,439,427,533,483,769,481,445,474,547,582,595,619,429,456,481,652,603,520,516],"10":[308,211,223,215,211,180,210,185,220,258,204,244,206,272,193,205,266,221,223,222,192,233,293,195,276,252,214,206,189,29,219,282,190,193,241,222,225,309,191,216,183,199,196,180,184,191,186,36,191,191,232,187,200,202,210,194,42,213,185,232,197,42,194,180,291,196,181,41,181,188,188,180,213,217,210,204,228,201,38,229,211,196,242,39,27],"11":[261,289,234,273,238,249,303,257,240,283,352,257,252,310,321,266,242,241],"12":[647,589,532,537,604,506,537,618,541,527,647,547,522,660,657,676,502,672,618,514,502,574,675,610,577,563,596,509,554,605,636,584,507,678,504,622,540,618,619,551,588,545,597,562,619,529,549,656,585,620,608,587,545,667,540,553,647,551,602,635,635,739,626,590,520,600,600,627,632,635,564,597,618,677,511,624,637,576,588,521,527,597,569,670,562,592,660,603,665,703,652,501,607,560,638,504,594,600,532,649],"13":[316,389,348,398,457,547,292,255,427,272,430,375,290,286,277,313,513,441,272,259,258,542,314,270,463,426,441,506,294,375,317,343,266,412,327,254,252,316,309,271,259,379,262,422,337,308,296,311,287,253,254,345,327,523,522],"14":[257,252,235,276,291,270,265,324,247,247,378,268],"15":[297,236,268,233,280,260,266,332,252,234,277,274,234,298,234,240,277,282,280,318,244,244,327,383,284,268,260,243,265,284,240,317,232,246,261,287,275,232,262,256,280,335],"16":[625,549,518,546,576,710,589,691,732,553,709,598,633,506,609,535,501,623,545,420,604,577,520,625,613,627,553,657,575,425,502,592,596,496,409,576,731,571,418,478,404,443,502,502,477,406,467,556,588,680,510,410,561,419,507,632,623,405,421,414],"17":[478,503,475,474,502,622,660,678,502,521,539,443],"18":[287,219,263,245,211,218,214,335,237,229,229,237,232,212,211,250,322,255,221,230,342,227,335,212,254,253,212,248,217,259,220,216,210,222,256,237,216,222,212,283,254,214,303,230,264,224,230,220,264,224,283,260,245,260,215,219,232,364,287,308,211,248,230,264,294,341,358,402,250,285,255,253,242,237,401,322,268,233,224,255,229,267,228,223,220,240,218,240,287,223,217,220,217,231],"19":[995,865,1004,938,931,976,1000,691,774,668,970,696,880,651,869,877,277,655,630,853,421,471,962,821,922,666,990,752,960,767,625,916,794,654,1006,926,738,600,817,790,739,879,573,826,762,630,946,682,1009,837],"20":[332,315,764,339,290,324,442,278,257,260,270,309,332,300,271,336,421,289,274,273,52,254,372,270,273,293,319,273,272,51,350,288,256,291,257,277,257,327,272,417,275,52,274,413],"21":[772,747,708,787,652,762,753,775,751,745,743,774,766,755,683,682,795,678,774,795,785,685,753,754,692,789,790,678,775,777,773,681,765,703,678,735,780,670,706,740,758,757,659,722,689,780,795,757,679,767,707,722,794,727,796,696,726,731,779,745,793,778,750,731,704,769,721,722,733,707,761,762,679,771,752,784,705,723,712,796,693,694,764,699,660,790,686,720,770,743,790,651,721,731,726,742,691,744,793,787],"22":[112,728,174,759],"23":[1004,953,809,718,767,740,933,862,967,998,964,964,827,943,931,911,825,704,902,930,847,881,902,865,877,659,1013,998,664,901,830,715,961,892,775,1016,992,785,849,874,934,911,853,884,982,913,826,915,978,1007,975,867,899,603,958,957,941,879,948,910,895,709,786,705,717,1009,1002,983,836,1020,1022,987,828,838,741,986,912,928,958,947,867,900,993,909,988,984,711,911,942,804,1018,1013,987,876,916,826,857,907,797,996],"24":[122,108],"25":[1017,971,938,1013,994,994,1016,1002,992,981,858,1001,940,956,975,968,1021,941,997,940,1000,972,957,982,986,856,892,1019,910,920,991,947,1003,932,878,953,1020,986,971,1009,976,1014,993,1002,1012,984,974,946,968,1001,971,1002,937,912,961,969,926,975,949,978,963,933,1013,919,974,892,974,930,1003,986,972,946,982,951,1011,1005,933,968,855,967,917,805,968,1022,942,1020,1019,1020,949,1004,879,921,980,935,941,946,1003,1019,1017,969],"26":[889,742,885,684,794,839,941,667,765,973,973,789,927,1019,805,680,857,647,763,972,801,780,687,933,682,1010,769,783,1002,772,785,857,778,759,1015,864,688,782,758,747,1005,836,712,999,809,911,848,729,736,684,1001,694,988,687,765,932,742,712,793,655,744,996,872,643,751,850,762,1020,865,916,928,717,819,800,869,804,747,883,748,859,706,868,858,813,986,660,775,1008,846,902,922,915,1019,705,1022,711,893,737,963,766]}}, "q1": {"CCR3":{"1":40.0,"2":149.0,"3":443.5,"4":458.0,"5":63.0,"6":214.0,"7":251.0,"8":465.0,"9":583.75,"10":37.0,"11":544.0,"12":99.0,"13":259.0,"14":67.0,"15":64.0,"16":127.25,"17":234.0,"18":156.0,"19":445.0,"20":228.0,"21":132.0,"22":238.0,"23":400.0,"24":100.0,"25":186.0,"26":261.0},"CCR7":{"1":147.0,"2":0.0,"3":0.0,"4":82.5,"5":0.0,"6":16.75,"7":220.0,"8":205.0,"9":340.5,"10":0.0,"11":48.25,"12":139.0,"13":351.0,"14":518.0,"15":19.0,"16":441.0,"17":544.0,"18":156.0,"19":505.0,"20":473.0,"21":195.0,"22":179.75,"23":442.0,"24":153.5,"25":244.0,"26":305.0},"CD4":{"1":503.0,"2":504.0,"3":494.0,"4":31.0,"5":10.0,"6":32.0,"7":47.0,"8":502.0,"9":88.75,"10":502.0,"11":47.0,"12":86.0,"13":493.0,"14":502.0,"15":290.0,"16":58.0,"17":486.5,"18":509.0,"19":432.75,"20":47.0,"21":114.0,"22":353.75,"23":342.0,"24":367.0,"25":157.0,"26":250.0},"CD8":{"1":0.0,"2":0.0,"3":615.0,"4":41.0,"5":7.0,"6":587.0,"7":599.0,"8":625.0,"9":196.75,"10":0.0,"11":582.0,"12":141.0,"13":592.0,"14":0.0,"15":10.0,"16":45.5,"17":36.5,"18":0.0,"19":426.75,"20":600.0,"21":198.0,"22":176.0,"23":356.0,"24":149.0,"25":236.0,"26":285.0},"FSC":{"1":339.0,"2":343.0,"3":337.0,"4":309.0,"5":297.0,"6":346.0,"7":364.0,"8":350.0,"9":360.75,"10":330.0,"11":357.0,"12":378.0,"13":370.0,"14":368.0,"15":326.0,"16":369.0,"17":397.5,"18":355.0,"19":897.0,"20":369.0,"21":581.0,"22":618.0,"23":491.0,"24":628.0,"25":680.0,"26":913.25},"SSC":{"1":96.0,"2":99.0,"3":93.0,"4":133.0,"5":124.0,"6":121.0,"7":132.0,"8":94.0,"9":171.0,"10":94.0,"11":110.0,"12":189.0,"13":104.0,"14":109.0,"15":87.0,"16":166.0,"17":148.0,"18":104.0,"19":1023.0,"20":128.0,"21":933.0,"22":387.75,"23":1023.0,"24":377.5,"25":1023.0,"26":1023.0}}, "q2": {"CCR3":{"1":77.0,"2":175.0,"3":501.0,"4":511.0,"5":109.0,"6":257.0,"7":290.0,"8":509.0,"9":634.0,"10":73.0,"11":582.0,"12":157.0,"13":301.0,"14":115.0,"15":119.0,"16":200.0,"17":274.0,"18":182.0,"19":502.5,"20":275.0,"21":190.0,"22":267.0,"23":437.0,"24":150.0,"25":232.0,"26":303.5},"CCR7":{"1":181.0,"2":23.0,"3":68.0,"4":153.0,"5":71.0,"6":86.0,"7":302.5,"8":244.0,"9":431.0,"10":10.0,"11":113.0,"12":197.0,"13":426.0,"14":583.0,"15":102.0,"16":501.0,"17":603.0,"18":194.0,"19":586.5,"20":527.0,"21":233.0,"22":230.0,"23":465.0,"24":212.0,"25":271.0,"26":338.0},"CD4":{"1":522.0,"2":526.0,"3":516.0,"4":75.0,"5":50.5,"6":69.0,"7":86.0,"8":519.0,"9":144.0,"10":523.0,"11":86.0,"12":119.0,"13":521.0,"14":528.0,"15":324.0,"16":100.0,"17":535.0,"18":529.0,"19":484.0,"20":85.0,"21":144.0,"22":395.0,"23":365.0,"24":401.0,"25":185.0,"26":296.5},"CD8":{"1":25.0,"2":63.0,"3":637.0,"4":107.0,"5":63.0,"6":619.0,"7":631.0,"8":646.0,"9":283.0,"10":42.0,"11":608.0,"12":196.0,"13":620.0,"14":50.0,"15":74.0,"16":130.0,"17":131.0,"18":50.0,"19":487.5,"20":631.0,"21":228.0,"22":220.0,"23":383.0,"24":197.0,"25":263.0,"26":315.0},"FSC":{"1":362.0,"2":369.0,"3":362.0,"4":340.0,"5":320.0,"6":369.5,"7":386.0,"8":371.0,"9":408.5,"10":355.0,"11":381.0,"12":414.0,"13":406.0,"14":400.0,"15":357.0,"16":400.0,"17":433.0,"18":380.0,"19":1023.0,"20":391.0,"21":614.0,"22":666.0,"23":547.0,"24":679.0,"25":719.0,"26":1001.0},"SSC":{"1":113.0,"2":117.0,"3":109.0,"4":166.0,"5":147.0,"6":147.0,"7":158.0,"8":110.0,"9":211.0,"10":110.0,"11":133.0,"12":230.0,"13":130.0,"14":132.0,"15":109.0,"16":201.0,"17":183.0,"18":123.0,"19":1023.0,"20":152.0,"21":1022.0,"22":457.0,"23":1023.0,"24":452.0,"25":1023.0,"26":1023.0}}, "q3": {"CCR3":{"1":105.0,"2":211.0,"3":543.0,"4":571.0,"5":156.0,"6":294.0,"7":341.0,"8":547.0,"9":683.0,"10":100.0,"11":609.0,"12":208.0,"13":348.0,"14":161.0,"15":164.0,"16":271.0,"17":338.0,"18":221.0,"19":583.25,"20":316.0,"21":234.0,"22":306.25,"23":499.0,"24":193.0,"25":270.0,"26":359.0},"CCR7":{"1":220.0,"2":75.0,"3":122.5,"4":214.0,"5":131.0,"6":135.0,"7":380.0,"8":294.0,"9":524.5,"10":63.0,"11":165.0,"12":247.0,"13":495.0,"14":629.0,"15":166.5,"16":559.75,"17":642.0,"18":234.0,"19":713.25,"20":609.5,"21":262.0,"22":270.0,"23":488.0,"24":259.0,"25":295.0,"26":375.0},"CD4":{"1":541.0,"2":546.0,"3":534.0,"4":116.0,"5":87.0,"6":106.0,"7":120.0,"8":537.0,"9":199.25,"10":542.0,"11":122.0,"12":153.5,"13":545.0,"14":550.0,"15":356.0,"16":135.0,"17":560.0,"18":548.0,"19":554.75,"20":118.5,"21":173.0,"22":429.0,"23":389.0,"24":427.0,"25":210.0,"26":413.0},"CD8":{"1":89.0,"2":122.0,"3":658.0,"4":162.5,"5":108.0,"6":642.0,"7":655.0,"8":664.0,"9":460.25,"10":101.0,"11":630.0,"12":273.5,"13":645.0,"14":131.0,"15":124.5,"16":201.75,"17":198.0,"18":115.0,"19":633.0,"20":656.0,"21":256.0,"22":258.0,"23":406.0,"24":234.0,"25":286.0,"26":348.0},"FSC":{"1":384.0,"2":398.0,"3":385.0,"4":398.0,"5":357.0,"6":391.0,"7":410.0,"8":392.0,"9":476.0,"10":378.0,"11":404.0,"12":459.0,"13":441.0,"14":428.0,"15":388.5,"16":435.0,"17":488.0,"18":413.0,"19":1023.0,"20":417.0,"21":644.0,"22":721.0,"23":601.0,"24":734.0,"25":768.0,"26":1023.0},"SSC":{"1":132.0,"2":140.0,"3":127.0,"4":206.0,"5":174.0,"6":176.0,"7":191.0,"8":126.0,"9":270.5,"10":128.0,"11":159.0,"12":313.5,"13":163.0,"14":159.0,"15":144.0,"16":259.0,"17":263.5,"18":146.0,"19":1023.0,"20":178.0,"21":1023.0,"22":522.0,"23":1023.0,"24":510.0,"25":1023.0,"26":1023.0}}, "upper": {"CCR3":{"1":202.5,"2":304.0,"3":692.25,"4":740.5,"5":295.5,"6":414.0,"7":476.0,"8":670.0,"9":831.875,"10":194.5,"11":706.5,"12":371.5,"13":481.5,"14":302.0,"15":314.0,"16":486.625,"17":494.0,"18":318.5,"19":790.625,"20":448.0,"21":387.0,"22":408.625,"23":647.5,"24":332.5,"25":396.0,"26":506.0},"CCR7":{"1":329.5,"2":187.5,"3":306.25,"4":411.25,"5":327.5,"6":312.375,"7":620.0,"8":427.5,"9":800.5,"10":157.5,"11":340.125,"12":409.0,"13":711.0,"14":795.5,"15":387.75,"16":737.875,"17":789.0,"18":351.0,"19":1025.625,"20":814.25,"21":362.5,"22":405.375,"23":557.0,"24":417.25,"25":371.5,"26":480.0},"CD4":{"1":598.0,"2":609.0,"3":594.0,"4":243.5,"5":202.5,"6":217.0,"7":229.5,"8":589.5,"9":365.0,"10":602.0,"11":234.5,"12":254.75,"13":623.0,"14":622.0,"15":455.0,"16":250.5,"17":670.25,"18":606.5,"19":737.75,"20":225.75,"21":261.5,"22":541.875,"23":459.5,"24":517.0,"25":289.5,"26":657.5},"CD8":{"1":222.5,"2":305.0,"3":722.5,"4":344.75,"5":259.5,"6":724.5,"7":739.0,"8":722.5,"9":855.5,"10":252.5,"11":702.0,"12":472.25,"13":724.5,"14":327.5,"15":296.25,"16":436.125,"17":440.25,"18":287.5,"19":942.375,"20":740.0,"21":343.0,"22":381.0,"23":481.0,"24":361.5,"25":361.0,"26":442.5},"FSC":{"1":451.5,"2":480.5,"3":457.0,"4":531.5,"5":447.0,"6":458.5,"7":479.0,"8":455.0,"9":648.875,"10":450.0,"11":474.5,"12":580.5,"13":547.5,"14":518.0,"15":482.25,"16":534.0,"17":623.75,"18":500.0,"19":1212.0,"20":489.0,"21":738.5,"22":875.5,"23":766.0,"24":893.0,"25":900.0,"26":1187.625},"SSC":{"1":186.0,"2":201.5,"3":178.0,"4":315.5,"5":249.0,"6":258.5,"7":279.5,"8":174.0,"9":419.75,"10":179.0,"11":232.5,"12":500.25,"13":251.5,"14":234.0,"15":229.5,"16":398.5,"17":436.75,"18":209.0,"19":1023.0,"20":253.0,"21":1158.0,"22":723.375,"23":1023.0,"24":708.75,"25":1023.0,"26":1023.0}}}
\ No newline at end of file
+{"lower": {"FSC":{"1":271.5,"2":260.5,"3":265.0,"4":175.5,"5":207.0,"6":278.5,"7":295.0,"8":287.0,"9":187.875,"10":258.0,"11":286.5,"12":256.5,"13":263.5,"14":278.0,"15":232.25,"16":270.0,"17":261.75,"18":268.0,"19":708.0,"20":297.0,"21":486.5,"22":463.5,"23":326.0,"24":469.0,"25":548.0,"26":748.625},"SSC":{"1":42.0,"2":37.5,"3":42.0,"4":23.5,"5":49.0,"6":38.5,"7":43.5,"8":46.0,"9":21.75,"10":43.0,"11":36.5,"12":2.25,"13":15.5,"14":34.0,"15":1.5,"16":26.5,"17":-25.25,"18":41.0,"19":1023.0,"20":53.0,"21":798.0,"22":186.375,"23":1023.0,"24":178.75,"25":1023.0,"26":1023.0},"CD4":{"1":446.0,"2":441.0,"3":434.0,"4":-96.5,"5":-105.5,"6":-79.0,"7":-62.5,"8":449.5,"9":-77.0,"10":442.0,"11":-65.5,"12":-15.25,"13":415.0,"14":430.0,"15":191.0,"16":-57.5,"17":376.25,"18":450.5,"19":249.75,"20":-60.25,"21":25.5,"22":240.875,"23":271.5,"24":277.0,"25":77.5,"26":5.5},"CCR7":{"1":37.5,"2":-112.5,"3":-183.75,"4":-114.75,"5":-196.5,"6":-160.625,"7":-20.0,"8":71.5,"9":64.5,"10":-94.5,"11":-126.875,"12":-23.0,"13":135.0,"14":351.5,"15":-202.25,"16":262.875,"17":397.0,"18":39.0,"19":192.625,"20":268.25,"21":94.5,"22":44.375,"23":373.0,"24":-4.75,"25":167.5,"26":200.0},"CD8":{"1":-133.5,"2":-183.0,"3":550.5,"4":-141.25,"5":-144.5,"6":504.5,"7":515.0,"8":566.5,"9":-198.5,"10":-151.5,"11":510.0,"12":-57.75,"13":512.5,"14":-196.5,"15":-161.75,"16":-188.875,"17":-205.75,"18":-172.5,"19":117.375,"20":516.0,"21":111.0,"22":53.0,"23":281.0,"24":21.5,"25":161.0,"26":190.5},"CCR3":{"1":-57.5,"2":56.0,"3":294.25,"4":288.5,"5":-76.5,"6":94.0,"7":116.0,"8":342.0,"9":434.875,"10":-57.5,"11":446.5,"12":-64.5,"13":125.5,"14":-74.0,"15":-86.0,"16":-88.375,"17":78.0,"18":58.5,"19":237.625,"20":96.0,"21":-21.0,"22":135.625,"23":251.5,"24":-39.5,"25":60.0,"26":114.0}}, "mfi": {"FSC":{"1":364,"2":370,"3":363,"4":360,"5":333,"6":372,"7":389,"8":371,"9":422,"10":357,"11":381,"12":410,"13":406,"14":401,"15":356,"16":413,"17":440,"18":384,"19":944,"20":393,"21":617,"22":667,"23":546,"24":681,"25":727,"26":960},"SSC":{"1":117,"2":121,"3":112,"4":175,"5":156,"6":154,"7":162,"8":113,"9":214,"10":114,"11":138,"12":276,"13":137,"14":139,"15":121,"16":239,"17":198,"18":128,"19":966,"20":154,"21":975,"22":437,"23":976,"24":440,"25":1013,"26":975},"CD4":{"1":520,"2":523,"3":512,"4":84,"5":56,"6":75,"7":83,"8":517,"9":138,"10":521,"11":85,"12":119,"13":516,"14":526,"15":322,"16":104,"17":509,"18":524,"19":490,"20":82,"21":145,"22":389,"23":366,"24":392,"25":182,"26":325},"CCR7":{"1":189,"2":37,"3":68,"4":141,"5":67,"6":90,"7":318,"8":257,"9":419,"10":32,"11":111,"12":213,"13":424,"14":566,"15":84,"16":509,"17":598,"18":198,"19":629,"20":534,"21":224,"22":204,"23":476,"24":204,"25":269,"26":343},"CD8":{"1":53,"2":67,"3":632,"4":114,"5":82,"6":608,"7":620,"8":641,"9":327,"10":59,"11":604,"12":183,"13":615,"14":76,"15":75,"16":138,"17":119,"18":60,"19":533,"20":621,"21":225,"22":215,"23":387,"24":187,"25":259,"26":318},"CCR3":{"1":72,"2":187,"3":483,"4":520,"5":109,"6":251,"7":304,"8":504,"9":641,"10":68,"11":565,"12":161,"13":306,"14":108,"15":110,"16":201,"17":289,"18":195,"19":541,"20":267,"21":173,"22":283,"23":448,"24":132,"25":232,"26":311}}, "outliers": {"FSC":{"1":[481,470,476,483,271,488,466,463,485,462,458,262,266,267,266,466,466,472,509,572,464,468,261,261,262,268,458,264,468,265,262,262,466,261,271,270,468,455,455,263,495,262,486,459,270,454,265,487,466,485,541,266,473,453,270,458,264,464,458,568,457,475,464,475,266,265,476,455,455,267,495,499,267,463,474,460,482,264,499,465,461,262,452,480,462,472,477,503,464,519,459,460,485,474],"2":[537,489,493,683,555,528,555,547,604,639,524,499,572,523,595,485,604,515,646,510,578,536,487,516,493,486,639,592,486,532,518,657,489,596,516,484,500,481,491,488,494,494,611,486,544,495,529,513,588,561,517,485,603,537,545,569,567,513,495,572,484,610,495,672,509,513,500,596,556,640,540,566,607,527,548,560,611,610,569,559,641,568,553,630,570,531,500,489,522,529,487,519,488,540,516,598,543,483,481,483],"3":[468,522,545,573,261,262,494,264,261,487,530,478,480,550,588,264,503,459,263,470,262,262,261,471,509,599,484,262,262,463,261,470,543,264,468,474,561,262,262,477,529,262,498,481,479],"4":[614,532,555,568,558,539,549,651,628,554,555,549,580,708,628,577,647,532,627,612,538],"5":[454,448,450,460,461,459,473,459,451,461,465,451,452,509,501,464,470,469,505,461,488,597,457,458,483,451,456,501],"6":[617,466,487,467,271,270,277,540,268,475,482,266,493,275,464,584,478,464,270,459,465,486,262,460,462,278,262,270,491,262,472,533,569,267,489,262,470,496,465,461,482,274,270,266,266,264,274,466,261,469,262,261,265,470,270,266,262,270,262,467,274,476,623,499,555,492,266,475,464,469,617,264,270,518,265,489,503,482,486,478,266,494,603,464,278,266,263,467,482,459,268,273,266,264,470,262,493,268,276],"7":[290,487,509,263,843,276,726,484,480,288,486,734,822,558,595,485,278,619,495,622,263,592,569,494,290,282,503,481,291,567,602,498,683,564,624,522,526,681,497,503,690,559,495,572,265,267,689,534,568,553,544,609,480,492,282,262,284,592,609,263,266,644,524,290,536,643,517,289,620,286,611,282,262,839,673,489,822,294,262,286,513,594,536,632,498,488,497,261,496,492,535,573,706,532,285,518,294,261,488,617],"8":[493,509,271,265,286,266,661,268,273,548,278,278,547,284,476,275,279,508,279,271,696,284,505,605,505,265,656,459,488,469,490,276,457,498,459,263,271,623,265,268,695,276,565,464,266,471,262,473,286,512,264,460,502,265,463,280,646,573,277,284,262,265,580,264,263,263,593,460,665,591,580,563,514],"9":[705,746,651,733,702,740,687,760,675,773,653,668,786,679,687,714,712,680,686,739],"10":[476,469,537,474,497,546,455,465,535,493,460,462,457,481,469,454,479,513,517,483,462,462,472,462,451,458,464,463,478,451,503,501,451,461,459,468,460,453,473,464,475,472,452,471,451,461,460,454,499,451,465,467,466,459,463],"11":[286,263,284,282,262,270,266,278,262,517,261,261,510,521,500,561,274,284,491,589,479,489,776,280,265,280,283,647,643,285,546,284,597,502,563,276,281,270,501,282,264,545,548,481,273,616,702,669],"12":[614,594,602,623,639,708,633,753,609,694,613,742,606,696,681,590,733,677,594,643,599,602,626,680,592,582,609,620,606,614,649,663,589,657,632,604,597,699,622],"13":[674,554,766,633,563,706,708,761,585,262,595,556,606,262,565,262,575,649,560,576,557,614,552,581,607,573,592,554,263,262,262,589,676,614,581,618,743,618],"14":[265,262,686,276,261,265,270,523,526,263],"15":[632,485,523,564,487,532,547,488,590,555,514,504,646,530,529,509,486,539,536,520,512],"16":[266,559,263,542,608,591,668,649,562,549,546,681,793,262,650,541,593,622,263,537,574,760,609,653,717,549,551,648,565,548,726,562,561,264,656,594,763,713,625,261,555,739,604,727,590,704,544,549,268,735,562,650,564,632,266,608,570],"17":[698,709,697,796,698,650,698,641,714,702,638,702,660,769,636,718,706,837],"18":[506,571,627,534,503,566,551,547,513,522,528,535,506,611,556,501,517,539,509,556,536,574,548,664,508,501,262,517,512,267,503,526,550,573,576,543,512,577,519,266,522,532,513,625,523,639,264,516,501,582,511,549,510,502,516,508,556,505,511],"19":[585,701,620,693,696,616,591,595,626,682,675,631,702],"20":[544,746,501,521,492,493,538,494,504,500,490,676,515,290,288,620,578,268,294,599,726,290,598,524,266,296,530,262,526,288,621,737,538,281,289,556,501,291,689,498,614,638,265,504,498,510,524,579,278,287,514,284,595,520,603,267,570,516,526,494,507,285,631,590,268,271,505,699,579,490,623,291,286],"21":[779,481,486,461,432,464,452,787,745,435,486,389,774,811,463,747,480,463,471,458,404,746,468,449,760,802,457,466,486,747,477,479,798,467,459,766,758,742,480,474,483,471,441,471,468,480,436,378,480,379,773,483,745,454,448,754,477,479,392,754,485,465,750,462,740,482,438,462,786,459,485,444,470,449,746,477,450,752,439,742,467,468,754,437,743,752,480,475,804,483,424,307,774,482,746,772,752,471,442,457],"22":[398,876,1023,409,451,876,901,441,881,444,909,1023,882,956,904,883,922,897,901,1022,921,424,925,902,1023,951,927,1013,924,939,976,905,425,457,937,398,453,932,454,463,462,450,420],"23":[323,785,798,767,787,289,780,310,266,266,305,318,268,776],"24":[458,391,447,1023,446,979,899,903,896,974,1008,934,904,454,931,425,937,898],"25":[913,904,909,903,909,923,913,906,961,902,917,908,901,910,934,954,902,906,905,906,902,958,906,902,902,944,901,937,903,922,938,918,904,910,904,913,924,911,907,906,909,906,901,938,903,908,907,910,915,942,906,901],"26":[732]},"SSC":{"1":[248,202,216,196,240,241,322,236,208,289,189,230,207,249,188,29,196,220,201,191,218,223,236,190,198,35,199,195,201,235,202,198,191,196,200,250,224,226,267,208,232,316,214,199,189,198,225,202,189,197,266,191,202,215,193,188,229,199,221,202,202,198,203,223,218,250,196,223,199,207,201,208,197,206,227,41,201,187,214,187,239,192,193,219,194,188,267],"2":[209,202,214,349,293,259,220,209,333,216,223,282,286,203,300,243,243,202,342,254,245,223,234,204,286,266,296,223,303,33,266,311,216,360,204,278,240,315,231,216,232,310,319,264,214,228,282,278,343,298,35,248,204,297,239,348,204,240,270,205,381,231,283,227,37,266,205,219,281,220,350,209,292,267,219,237,333,227,211,282,210,253,233,217,240,282,310,287,301,229,321,222,205,270,203,288,230,246,270,223],"3":[181,180,248,223,179,184,224,291,191,220,220,185,211,39,33,185,39,184,35,193,183,195,190,40,191,30,231,205,206,194,207,185,183,190,199,188,185,202,272,218,220,179,181,208,353,37,210,219,189,181,196,38,194,40,257,37,183,185,180,188,186,189,208],"4":[409,427,324,398,362,330,323,317,326,324,363,480,324,330,544,381,330,379,376,351,407,373,367,344,445,455,372,340,426],"5":[253,43,299,275,251,259,266,261,309,256,45,351,250,262,263,40,297,23,48,274,252,263,274,257,275,263,267,282,265,277,23,250,252,18,268,43,279,273,251,268,466,304,307,280,310,304,278,260,253,295,14,274,267,270,254,265,47,251,298,284],"6":[260,265,261,266,287,290,291,277,265,270,290,299,445,272,267,273,266,260,273,362,268,272,264,277,267,268,259,263,259,266,277,262,293,263,266,266,271,259,278,377,273,265,260,293,333,285,283,326,270,278,271,274,259,277,274,284,319,303,260,260,283,264,283,272,310,291,425,283,310,36,35,32,38,36],"7":[367,338,296,405,301,365,282,350,475,299,282,307,299,298,309,417,426,302,316,337,333,345,328,546,285,290,280,403,468,284,301,423,292,284,448,332,296,330,389,372,281,297,284,296,38,30,365,281,43,284,30,344],"8":[182,215,226,197,263,194,207,355,469,192,203,183,482,178,39,215,304,178,181,182,197,206,23,43,201,181,267,175,224,197,27,211,195,190,188,415,183,229,244,40,194,257,195,213,601,181,235,189,180,44,222,178,202,195,247,178,25,184,211,250,278,222,211,202,219,258],"9":[655,439,427,533,483,769,481,445,474,547,582,595,619,429,456,481,652,603,520,516],"10":[308,211,223,215,211,180,210,185,220,258,204,244,206,272,193,205,266,221,223,222,192,233,293,195,276,252,214,206,189,29,219,282,190,193,241,222,225,309,191,216,183,199,196,180,184,191,186,36,191,191,232,187,200,202,210,194,42,213,185,232,197,42,194,180,291,196,181,41,181,188,188,180,213,217,210,204,228,201,38,229,211,196,242,39,27],"11":[261,289,234,273,238,249,303,257,240,283,352,257,252,310,321,266,242,241],"12":[540,600,647,646,514,522,665,626,580,652,502,619,501,527,603,540,657,739,660,537,600,592,572,537,635,570,607,625,585,553,600,520,616,532,507,531,605,627,703,620,675,621,588,597,502,545,688,689,537,635,639,589,527,688,598,603,522,618,618,605,584,554,551,544,618,528,584,649,545,514,593,669,590,604,592,565,511,597,502,639,562,638,623,677,541,627,608,590,622,665,597,598,660,585,605,600,568,563,569,534],"13":[316,389,348,398,457,547,292,255,427,272,430,375,290,286,277,313,513,441,272,259,258,542,314,270,463,426,441,506,294,375,317,343,266,412,327,254,252,316,309,271,259,379,262,422,337,308,296,311,287,253,254,345,327,523,522],"14":[257,252,235,276,291,270,265,324,247,247,378,268],"15":[297,236,268,233,280,260,266,332,252,234,277,274,234,298,234,240,277,282,280,318,244,244,327,383,284,268,260,243,265,284,240,317,232,246,261,287,275,232,262,256,280,335],"16":[625,549,518,546,576,710,589,691,732,553,709,598,633,506,609,535,501,623,545,420,604,577,520,625,613,627,553,657,575,425,502,592,596,496,409,576,731,571,418,478,404,443,502,502,477,406,467,556,588,680,510,410,561,419,507,632,623,405,421,414],"17":[478,503,475,474,502,622,660,678,502,521,539,443],"18":[287,219,263,245,211,218,214,335,237,229,229,237,232,212,211,250,322,255,221,230,342,227,335,212,254,253,212,248,217,259,220,216,210,222,256,237,216,222,212,283,254,214,303,230,264,224,230,220,264,224,283,260,245,260,215,219,232,364,287,308,211,248,230,264,294,341,358,402,250,285,255,253,242,237,401,322,268,233,224,255,229,267,228,223,220,240,218,240,287,223,217,220,217,231],"19":[995,865,1004,938,931,976,1000,691,774,668,970,696,880,651,869,877,277,655,630,853,421,471,962,821,922,666,990,752,960,767,625,916,794,654,1006,926,738,600,817,790,739,879,573,826,762,630,946,682,1009,837],"20":[332,315,764,339,290,324,442,278,257,260,270,309,332,300,271,336,421,289,274,273,52,254,372,270,273,293,319,273,272,51,350,288,256,291,257,277,257,327,272,417,275,52,274,413],"21":[745,767,711,770,771,655,762,678,635,697,772,740,707,726,716,728,785,676,743,739,673,783,780,755,703,716,706,702,659,707,678,660,775,706,700,794,715,771,793,795,776,730,734,731,793,723,773,750,778,743,744,752,743,785,797,761,758,662,790,767,772,780,765,774,764,712,720,756,766,790,713,645,728,740,694,673,726,649,736,721,788,797,765,764,751,760,692,777,726,727,695,778,749,742,742,788,731,792,741,778],"22":[112,728,174,759],"23":[709,827,861,865,977,802,910,988,911,967,884,716,984,943,724,582,903,974,968,998,720,929,957,702,744,996,792,986,1014,931,895,942,717,745,925,1005,808,603,740,958,969,685,1002,876,978,947,664,893,987,630,746,902,836,664,948,786,828,857,826,964,748,900,993,721,1016,953,853,892,948,867,992,659,821,867,881,887,939,975,950,917,830,872,1002,808,855,1005,832,1004,966,899,847,990,992,1009,916,911,915,751,800,962],"24":[122,108],"25":[1000,868,1010,956,984,908,943,961,950,1001,950,902,1015,1022,853,1020,936,873,938,979,975,984,919,956,972,993,1020,989,969,992,1003,1018,952,993,1013,890,1002,917,983,978,920,957,1009,982,1009,1000,972,979,1004,992,867,951,1002,983,1014,921,973,1014,988,1004,1019,975,946,984,916,892,1011,984,1020,931,942,1016,964,993,1017,805,942,990,1017,1008,957,1003,977,957,1014,1020,1022,704,968,989,1010,968,1010,991,985,924,1012,1012,995,921],"26":[916,751,785,1002,729,769,788,687,848,751,780,1020,943,801,783,1019,672,766,924,765,647,729,655,1007,742,708,772,1010,924,643,706,713,827,748,1005,794,973,836,928,848,963,972,832,988,680,780,905,906,869,915,737,1022,986,902,758,857,824,671,759,833,674,914,747,846,763,903,885,694,793,902,712,782,747,809,800,973,823,857,935,775,687,778,1015,786,684,687,868,742,957,705,850,887,798,844,684,996,1019,872,858,682]},"CD4":{"1":[429,383,443,405,441,380,416,443,405,432,445,441,429,441,396,427,442,421,445,430,439,439,440,434,444,393,413,417,439,444,416,626,444,361,368,404,443,421,371,436,409,441,357,418,381,439,434,434,419,440,441,406,379,445,444,433,438,423,439,429,437,433,423,418,406,430,427,410],"2":[440,422,428,611,418,325,440,339,291,374,414,384,384,428,392,414,359,434,432,433,330,334,384,409,413,379,409,322,360,400,416,417,344,344,411,623,439,434,355,412,424,429,376,408,398,305,420,365,613,398,396,376,339,359,424,377,385,404,408,377,402,411,377,391,337,404,436,409,424,421,377,389,417,417,434,359,430,359,314,342,361,618,217,418,389,428,340,431,424,432,438,432,439,218,422,429,613,382,439,637],"3":[303,296,364,342,428,305,344,327,357,384,413,403,296,432,419,429,371,377,432,433,397,400,432,427,365,428,420,344,428,357,324,604,396,309,337,339,389,422,409,415,405,599,431,424,423,599,388,433,419,368,306,430,413,426,433,426,374,409,429,405,297,298,303,369,311],"4":[272,332,281,251],"5":[208,204],"6":[253,218,219,256,249,237,220,322,278,265,244,221,243],"7":[235,241,234,285,241,248,230,237,232],"8":[252,407,349,321,381,349,281,238,259,259,398,406,261,356,276,415,445,440,394,426,443,448,431,447,413,420,448,424,447,644,426,429,447,439,438,446,590,378,424,441,606,446,607,447,613,378,391,447,441,437,341,436,440,389,417,426,338,411,412,405,428,381,423,445,429,439,442,433,447,640,443,402,393,426,400,322,618,384,444,356,449,419,618,439,438],"9":[368,369,427,427,375,697,565,400,389,385,560,502,549,401,376,418,465,459,406,479,465,454],"10":[437,425,393,425,441,430,434,425,433,416,429,432,423,438,438,395,621,435,394,438,427,426,645,441,423,434,418,424,414,441,419,424,432,429,424,423,615,401,425,439,429,433,412,422,433,440,439,408,432,412,436,440,437,422,437,434,434,393,399,412,439,415,422,439,436,420,415,434,417],"11":[256,252,251,242,271,242,247,313,244,237],"12":[333,266,284,263,271,266,293,271,258,273,257,255,307,267,336,276,303,345,314,390,304,293,271,305,384,360,331,286,323,301,270,273,299,314,255,338,292,262,280,292,288,264,263,306,319,257,320,319,298,302,312,313,272,266,292,367,276,265],"13":[242,349,409,639,403,375,377,406,352,399,392,387,366,359,414,357,367,400,394,388,404,292,394,381,396,401,392,409,411,411,312,312,235,346,299,313,363,407,377,261,367,319,365,302,197,346,260,403,387,354,358,305],"14":[331,330,406,234,359,365,405,261,386,416,426,398,388,368,425,390,421,377],"15":[187,189,178,183,170,179,187,134,156,154],"16":[295,315,290,290,283,265,252,318,266,319,277,291,259,271,278,282,264],"17":[313,369,234,373,236,330,286,363,263,368,299,370,352,344,364,343,327,359,304],"18":[449,434,610,445,380,440,445,446,638,447,424,374,374,435,351,373,427,423,443,611,449,448,609,400,410,444,410,436,449,441,385,350,339,272,356,353,353,337,305,440,346,417,317,351,359,367,208,407,295,385,435,299,265,277,432,320,216,300,306,315,330,345,428,258,358,435,294,330,391,365,319,252,444,320,414,392,406,442,618,608,447,418,402,422,444,448,318,438,415,409,442,443,393,430,358,413,334],"19":[775,768,764,235,245,216,231,210,193,1023,208],"20":[241,252,281,238,304,304,312,252,249,226],"21":[8,0,0,278,279,263,24,10,0,290,280,0,0,305,22,0,10,0,20,274,0,0,0,6,324,17,0,12,7,22,7,0,294,8,24,14,0,0,0,10,301,20,21,12,305,282,9,0,0,293,24,19,0,0,0,0,346,0,267,22,306,24,21,267,270,7,0,281,12,271,7,289,18,3,280,0,0,0,25,263,24,335,0,0,12,0,323,21,12,0,287,0,6,0,10,17,306,0,18,0],"22":[185,185,139,190,196,579,161,220,163,136,194,126,150,232,164,157,204,197,169,203,154,227,176,547,206,149,95,235,235,170,228,215,126,149,177,228,177,578,209,234,213,561,157,160,219,224,205,134,232,155,143,564,223,221,225,188,237,194,200,218,176,195,222,136,125,146,208,214,171,171,550,138,136,234,134,230,108,193,111,224,203,167,112,178,128,214,223,169,110,204,187],"23":[270,264,213,483,248,505,231,268,628,224,242,536,259,196,248,179,515,240,499,505,181,175,211,252,517,223,196,239,540,522,149,575,159,591,580,249,512,529,189,494,178,224,485,249,488,224,270,167,262,187,205,266,538,465,216,220,168,580,556,180,237,536,177,521],"24":[550,263,574,252,528,226,167,266,247,180,578,241,585,611,623,550,247,263,262,563,181,633,273,200,152,244,215,541,250,573,232,214,215,90,546,266,519,263,258,177,243,264,203,537,611,195,241,234,231,186,137,210,136,206,521,611,245,231,271,155,253,151,274,255,191,156,208,248,188,202,251,175,207,260,189,236,578],"25":[315,387,71,33,68,313,71,74,64,302,32,332,363,56,52,366,429,63,72,34,76,56,65,56,396,295,327,75,77,406,0,335,73,347,298,295,38,69,14,56,41,48,343,67,69,63,39,330,74,318,401,294,69,50,76,63,56,293,67,307,77,410,53,437,350,297,296,61,292,71,297,292,50,72,40,315,73,40,71,307,75,311,297,76,63,304,53,321,317,0,67,76,43,290,292,73,63,66,68,30],"26":[]},"CCR7":{"1":[348,334,382,341,340,334,342,355,344,345,338,331,333,373,356,371,346,390,359,379,330,330,384,336,338,373,340,354,346,370],"2":[188,198],"3":[],"4":[442,445,424,435,424],"5":[328],"6":[],"7":[],"8":[469,441,576,431,541,477,508,488,512,437,432,450,563,459,474,577,443,448,505,486,521,554,443,579,699,438,444,463,458,452,507,437,520,817,492,448,454,515,599,460,516,430,491,444,507,439,501,601,436,468,430,438,474,513,438,504,511,436,647,499,431,497,444,432,428,449,441,522,577,447,557],"9":[907,825,836,941,925,978,829,811,893,855,835,837,920,818,890],"10":[],"11":[404,425,440,380,362,428,404,399,400,425,344,373,347,475,388,426,537,486,469,595,566,464,429,435,488,442,410,428,432,603],"12":[419,429,466],"13":[714,735,780,120,768,750,735,727,753,724],"14":[],"15":[],"16":[250,220,784,786,850,815,822,771,817,761,817,750,774,741,772],"17":[856,797,897,823,867,874,952,851,393,379,811],"18":[463,0,421,425,355,361,353,392,372,367,377,377,371,398,383,355,358,375,380,387,379,401,371,367,367,365,388,378,353,384,358,371,372,378,386],"19":[161,172,184],"20":[849],"21":[54,86,485,82,368,71,49,423,0,49,79,94,0,90,63,49,28,54,19,56,94,32,40,0,16,74,20,49,486,25,62,78,14,81,0,364,77,59,70,368,31,67,0,39,0,0,476,1,64,76,31,63,76,15,367,60,94,93,393,15,89,87,54,371,81,478,75,27,80,400,84,88,487,73,73,41,0,83,66,26,380,1,15,89,92,85,84,1,380,80,397,82,383,0,53,74,34,90,89,377],"22":[0,0,422,5,0,482,0,24,23,41,0,34,0,412,446,0,0,10,18,30,0,0,0,0,0,12,44,452,25,22,0,540,32,35,22,0,502,491,0,0,32,12,25,44,435,0,34,44,6,538,463,0,0,490,496,495,430,434,446,0,460,622,430,0,548,422,7,430,482,0,0,426,412,0,487,547,421],"23":[677,725,558,822,721,578,615,250,798,588,738,647,578,346,637,686,615,635,882,675,572,355,603,299,253,306,236,657,211,607,599,140,707,574,292,654,613,266,638,742,711,584,700,661,347,607,332,256,570,321,590,311,589,362,753,800,643,710,345,594,305,640,771,371,692,750,637,727,342,595,609,684,569,685,358,334,335,604,565,731,638,641,597,608,587],"24":[500,617,499,468,423,494,423],"25":[159,106,397,160,114,162,401,128,155,135,165,96,152,114,152,111,143,154,65,160,375,148,155,134,160,127,404,407,149,392,167,162,148,143,391,150,131,10,161,401,67,149,448,156,119,160,139,150,373,75,117,167,140,161,147,136,161,479,0,156,150,166,160,115,157,381,165,164,159,157,147,126,156,150,166,162,145,158,157,404,101,131,158,146,80,148,438,87,164,158,146,101,411,120,114,166,407,154,164,379],"26":[485,175,521,568,482,179,513,482,138,160,164,193,503,496,560,500,483,515,482,523,535,603,482,499,526,199,189,487,482,495,484,531,546,506,501,526,508,492,526,543,489,492,560,495,507,492,512,560]},"CD8":{"1":[250,237,223,298,237,252,236,234,250,223,231,326,276,254,228,236,233,225,252],"2":[332,325,381,329,306,376,312,432,397,342,382,331,372,391,347,349],"3":[538,478,545,516,532,550,483,421,734,497,733,542,521,535,514,731,523,512,542,479,541,443,542,518,514,490,544,546,482,549,417,538,521,518,546,547,540,489,515,457,534,538,531,523,549,534,544,530,512,542,505,544,521,524,484,550,522,728,522,528,470,524,545,535,536,528,532,548,450,514,530,521,483,513,352],"4":[],"5":[287,316,291,297,286,314,351,286,358,283,279,262,287,344,260,286,285,296,282,297,280,334,271,260,260,268,312,296,328,299,318,326,284,325,334,331,284,300,297,318,266,273,280,267,274,280,290,286,266,323],"6":[484,495,385,383,355,483,483,403,429,445,434,499,497,453,727,415,732,503,444,372,441,402,494,478,443,456,431,499,466,375,387,488,431,474,477,482,458,413,498,462,439,429,431,469,466,428,442,386,445,442,452,416,490,742,741,754,420,496,448,421,496,484,493,446,467,401,476,479,456,452,449,414,363,455,494,454,392,500,432,451,501,485,412,491,467,435,401,503,502,413,397,487,447,490,496,480,450,494,490,449],"7":[492,474,480,441,491,435,402,475,454,455,444,463,511,471,445,749,748,504,406,500,464,440,481,455,508,499,489,372,480,433,457,487,392,464,422,511,492,476,468,502,486,509,496,447,498,481,421,497,468,504,487,509,510,448,510,482,501,513,411,451,495,493,429,484,444,503,458,422,464,348,492,479,423,500,488,388,452,513,479,448,461,513,486,450,439,463,425,503,500,504,484,477,474,504,413,484,470,442,475,489],"8":[514,486,530,527,439,565,566,730,739,487,559,506,529,752,563,515,565,535,788,503,564,535,566,541,725,557,548,472,432,522,884,509,544,467,555,492,533,561,551,518,558,558,548,512,475,745,524,562,753,524,557,527,546,561,497,533,476,550,522,739,561,559,490,232,266,334],"9":[860,872],"10":[290,266,271,260],"11":[443,728,497,445,472,742,716,506,496,505,499,481,746,501,757,478,482,506,485,704,715,468,707,705,487,498,471,376,504,736,499,707,504,495,482,497,470,422,497,504,497,501,705,504,720,711,504,480,746,492,705,714,761,737,460,508,472,413,505,497,450,500,712,722,383,414,495,479,508,493,466,450,717,492,499,703,464,742,494,734,460,498,722,507,493,453,458,744,741,476,715,381,469,483,493,400,711,911,857,723],"12":[477,479],"13":[369,455,378,497,503,473,447,512,512,501,493,512,492,507,493,508,496,477,507,476,506,488,477,507,491,743,427,485,496,431,503,448,509,486,728,486,484,487,478,459,510,500,478,502,449,493,501,481,438,501,497,427,463,479,453,464,483,458,493],"14":[545,610,562,594,546,569,594,577,561,600,513,471,555,596,557,435,581,363],"15":[302,408,358,419,350,348],"16":[],"17":[494,491,451,489,456,457,524,540,462],"18":[357,348,395,290,437,339,483,406,427,355,377,364,455,492,314,376,388,439,339,390,370,446,429,436,528,317,419,392,320,323,299],"19":[1023,1023,1009,1012,1023,1023],"20":[423,407,445,837,512,427,480,751,438,492,467,457,472,500,408,427,488,466,413,466,470,395,385,507,427,436,774,449,420,485,408,509,504,494,463,441,491,514,508,461,466,403,436,472,492,501,442,432,744,423,490,438,473,459,424,512,483,468,453,457,456,438,491,471,365,442,431,485,414,438,385,490,502,492,417,489,396,451,486,448,380,435,424,475,511,489,425,419,439,474,437,415,434,471,472,474,491,492,513,446],"21":[73,75,74,85,104,71,78,85,53,109,78,96,98,56,0,79,358,85,97,0,86,77,90,98,76,110,93,0,78,372,350,59,65,107,101,107,353,53,100,52,102,98,31,0,100,52,109,0,98,108,98,109,106,66,110,55,28,107,10,65,95,90,72,87,106,107,105,110,31,99,83,60,94,103,101,84,110,102,91,44,74,106,0,103,95,100,86,49,57,90,82,103,88,84,23,31,100,73,99,108],"22":[396,40,48,2,25,43,51,1,37,19,17,0,16,385,44,14,0,43,46,10,27,405,619,659,512,414,544,391,446,459,445,652,410,401,440,428,612,481,32,473,461,407,0,49,42,0,507,1,0,5,0,9,0,32],"23":[238,278,268,236,499,261,247,541,609,642,216,245,569,236,511,267,272,595,578,493,236,507,605,592,644,503,517,550,572,690,591,617,556,631,654,619,663,532,773,490,638,614,665,637,621,684,529,602,533,215,274,482,626,522,670,161,204,268,220,140,261,278,238,148,135,262,105,547,237,498],"24":[0,16,16,0,0,0,11,0,7,0,0,0,8,378,0,4,0,10,0,0,439,383,10,0,375,3,0,21,12,0,19,10,0,19,21],"25":[151,115,94,150,616,144,143,145,138,157,160,157,52,374,131,160,107,154,154,141,134,141,157,140,156,99,144,372,159,364,150,113,150,151,401,152,149,67,157,132,362,108,151,79,153,373,150,157,123,146,82,151,107,114,372,155,517,157,144,134,129,144,370,157,138,160,82,122,69,143,159,135,134,132,146,142,384,153,145,37,150,397,157,153,144,62,143,160,133,51,387,32,143,107,151,460,148,8,148,137],"26":[675,603,125,189,168,160,180,172,631,452,468,607,452,627,447,621,613,459,597,482,187,452,575,156,523,652,177,182,585,641]},"CCR3":{"1":[],"2":[342,366,469,335,379,433,317,473,385,601,544,517,624,432,514,326,548,368,317,503,594,554,329,305,385,317,340,393,351,367,418,388,322,317,306,502,386,568,358,553,345,536,423,390,312,626,636,385,587,309,309,339,316,331,358,502,311,334,531,331,334,593,306,324,351,337,313,375,362,530,321,317,333,307,320,348,419,334,335,307,323,339,324,306,316,424,387,310,330,545,412,568,317,462,432,306,558,378,340,309],"3":[221,95,270,272,262,288,232,255,281,289,280,187,168,245,236,258,283,274,156,287,176,265,272,262,273,285,222,288,294,175,266,206,273,237,293,230,698,276,214,274,167,261,215,241,283,263,172,286,267,291,282,246,260,282,266,277,169,141,184,266,167,259,286,263,287,274,278,272,281,278,181,280,286,263,240,285,254,247,122,284,268,259,270,250,285,166,252,276,159,282,219,270,292,293,268,282,278,180,224,239],"4":[274,260,274,273,244,246,263,257,249,263,259,245,280,223,286,244,250,266,267,282,215,252,285,276,277,233,276,276,214,266,217,276,281,202,260,225,240,253,240,282,261,253,256,221,234,262,287,243,251,268,244,258,272,198,201,282,249,192,247,232,257],"5":[322,299,336,356,329,353,348],"6":[77,438,421,421,24,427,35,423,72,63,79,85,43,417,433,448,416,426,44,90,0,44,0,21,443,2,430,82,430,421,0,443,421,65,45,34,49,68,434,86,2,44,433,424,0,72,84,65,426,429,15,425,81,79,14,69,423,57,93,56,29,84,421,54,419,442,55,430,420,66,72,85,29,419,420,50,434,417,73,52,88,426,420,36,40,417,433,88,27,91,71,55,429,66,65,41,39,60,418,66],"7":[110,49,99,62,82,84,108,38,112,55,113,509,557,500,481,611,493,506,564,563,483,506,608,507,490,487,477,489,543,490,539,501,551,524,494,639,544,499,491,484,479,483,514,479,501,579,552,552,536,494,499,486,483,98,479,91,104,45,87,25,114,110,109,92,85,99,97,87,75,103,73,16,82,96,50,74,94],"8":[319,256,219,327,318,280,319,282,240,258,263,317,308,276,328,321,306,309,848,332,331,329,766,715,775,888,310,315,300,720,756,945,336,303,323,341,335,323,692,692,1023,695,333,737,705,699,321,324,329,715,841,765,704,335,687,319,319,873,330,329,682,307,750,290,332,327,296,338,340,806,686,326,682,722,691],"9":[427,431,424,395,356,291,421,996,843,939,847,842,950,397,892,886,434,948,983,842,939,899,841,260,363,394,322,434,924,427,832],"10":[],"11":[749,731,444,442,785,435,443,440,442,444,437,446,444,445,815,439,727,816,440,439,442,446,437,441,444,770,787,439,427,435,417,428,416,742,407,425,422,430],"12":[514,431,402,398,398],"13":[524,68,493,500,62,630,104,530,507,494,498,490,111,94,55,100,513,502,550,521,501,83,516,0,122,81,488,515,586,84,615,65,496,545,80,530,501,494,486,69,495,84,109,486,125,89,93,116,539,506,570,534,495,111,114,501,529,530,522,541,64,494,577,486,40,97,557,115,485,74,628,522,496,507,596,491,529,542,121,520,81,119,613,485,511],"14":[],"15":[325,349,396,329],"16":[508],"17":[528,537,580,600,534,544,556,626,558,595,616,631,513,568,38],"18":[497,324,324,356,529,328,328,322,372,375,343,360,344,332,452,346,349,336,326,329,331,321,366,323,339,347,326,384,395,328,425,323,366,377,323,379,323,394,413,340,388,398,342,386,351,364,347,418,327,325,593,439,442,327,526,350,337,327,416,357,396,405,328,330,538,339,341,409,354,394,402,552,370,350,406,350,389,336,379,343,336,556,368,320,379,351,387,383,323,336,404,322,408,336,332,395,368,330,578,365],"19":[186,841,1023,905,986,1023,812,799,951,1005,955,887,928,804,1023,1022,987,1023,876,1023,835,975,230,1013,816],"20":[565,523,528,472,684,463,477,458,511,627,470,467,500,495,479,568,553,46,10,72,59,91,27,95,85,14,95,0,61,39,87,58,2,74,58,16,33,48,20,76,80,45,57,85,0,54,82,72,89,65,35,80,50,77,91,46,40],"21":[426,400,393,446],"22":[429,431,427,442,431,479,429,412,120,438,439,126,457,415,485,576,426,473,625,440,446,609,531,589,439,560,581,545,610,522,562,457,612,625,634,607,481,563,643,580,611,599,512,555,562,701,523,465,574,422,439,486,522,629,552,619,463,578,458,628,532,597,609,536,444,557,451,495,527,642,654,594,425,613,606,668,477,421,548,543,540,456,541,464,416,135,128],"23":[144,250,145,649,699,685,806,806,722,959,243,235,100],"24":[],"25":[10,22,10,43,0,55,19,0,55,59,39,398,33,41,39,44,51,53,20,31,54,27,0,47,17,31,45,33,0,59,45,30,34,28,0,0,57,36,56,35,0,43,43,56,407,399,0,37,16,22,40,0,51,59,16,57,515,44,405,465,0,0,422,423,9,25,422,58,2,57,8,15,448,54,0,28,56,58,0,56,56,420,46,9,22,0,55,56,32,37,20,40,0,12,429,21,0,12,0,51],"26":[77,514,540,25,100,35,564,621,589,641,547,511,83,545,579,77,625,83,100,68,102,98,102]}}, "q1": {"FSC":{"1":339.0,"2":343.0,"3":337.0,"4":309.0,"5":297.0,"6":346.0,"7":364.0,"8":350.0,"9":360.75,"10":330.0,"11":357.0,"12":378.0,"13":370.0,"14":368.0,"15":326.0,"16":369.0,"17":397.5,"18":355.0,"19":897.0,"20":369.0,"21":581.0,"22":618.0,"23":491.0,"24":628.0,"25":680.0,"26":913.25},"SSC":{"1":96.0,"2":99.0,"3":93.0,"4":133.0,"5":124.0,"6":121.0,"7":132.0,"8":94.0,"9":171.0,"10":94.0,"11":110.0,"12":189.0,"13":104.0,"14":109.0,"15":87.0,"16":166.0,"17":148.0,"18":104.0,"19":1023.0,"20":128.0,"21":933.0,"22":387.75,"23":1023.0,"24":377.5,"25":1023.0,"26":1023.0},"CD4":{"1":503.0,"2":504.0,"3":494.0,"4":31.0,"5":10.0,"6":32.0,"7":47.0,"8":502.0,"9":88.75,"10":502.0,"11":47.0,"12":86.0,"13":493.0,"14":502.0,"15":290.0,"16":58.0,"17":486.5,"18":509.0,"19":432.75,"20":47.0,"21":114.0,"22":353.75,"23":342.0,"24":367.0,"25":157.0,"26":250.0},"CCR7":{"1":147.0,"2":0.0,"3":0.0,"4":82.5,"5":0.0,"6":16.75,"7":220.0,"8":205.0,"9":340.5,"10":0.0,"11":48.25,"12":139.0,"13":351.0,"14":518.0,"15":19.0,"16":441.0,"17":544.0,"18":156.0,"19":505.0,"20":473.0,"21":195.0,"22":179.75,"23":442.0,"24":153.5,"25":244.0,"26":305.0},"CD8":{"1":0.0,"2":0.0,"3":615.0,"4":41.0,"5":7.0,"6":587.0,"7":599.0,"8":625.0,"9":196.75,"10":0.0,"11":582.0,"12":141.0,"13":592.0,"14":0.0,"15":10.0,"16":45.5,"17":36.5,"18":0.0,"19":426.75,"20":600.0,"21":198.0,"22":176.0,"23":356.0,"24":149.0,"25":236.0,"26":285.0},"CCR3":{"1":40.0,"2":149.0,"3":443.5,"4":458.0,"5":63.0,"6":214.0,"7":251.0,"8":465.0,"9":583.75,"10":37.0,"11":544.0,"12":99.0,"13":259.0,"14":67.0,"15":64.0,"16":127.25,"17":234.0,"18":156.0,"19":445.0,"20":228.0,"21":132.0,"22":238.0,"23":400.0,"24":100.0,"25":186.0,"26":261.0}}, "q2": {"FSC":{"1":362.0,"2":369.0,"3":362.0,"4":340.0,"5":320.0,"6":369.5,"7":386.0,"8":371.0,"9":408.5,"10":355.0,"11":381.0,"12":414.0,"13":406.0,"14":400.0,"15":357.0,"16":400.0,"17":433.0,"18":380.0,"19":1023.0,"20":391.0,"21":614.0,"22":666.0,"23":547.0,"24":679.0,"25":719.0,"26":1001.0},"SSC":{"1":113.0,"2":117.0,"3":109.0,"4":166.0,"5":147.0,"6":147.0,"7":158.0,"8":110.0,"9":211.0,"10":110.0,"11":133.0,"12":230.0,"13":130.0,"14":132.0,"15":109.0,"16":201.0,"17":183.0,"18":123.0,"19":1023.0,"20":152.0,"21":1022.0,"22":457.0,"23":1023.0,"24":452.0,"25":1023.0,"26":1023.0},"CD4":{"1":522.0,"2":526.0,"3":516.0,"4":75.0,"5":50.5,"6":69.0,"7":86.0,"8":519.0,"9":144.0,"10":523.0,"11":86.0,"12":119.0,"13":521.0,"14":528.0,"15":324.0,"16":100.0,"17":535.0,"18":529.0,"19":484.0,"20":85.0,"21":144.0,"22":395.0,"23":365.0,"24":401.0,"25":185.0,"26":296.5},"CCR7":{"1":181.0,"2":23.0,"3":68.0,"4":153.0,"5":71.0,"6":86.0,"7":302.5,"8":244.0,"9":431.0,"10":10.0,"11":113.0,"12":197.0,"13":426.0,"14":583.0,"15":102.0,"16":501.0,"17":603.0,"18":194.0,"19":586.5,"20":527.0,"21":233.0,"22":230.0,"23":465.0,"24":212.0,"25":271.0,"26":338.0},"CD8":{"1":25.0,"2":63.0,"3":637.0,"4":107.0,"5":63.0,"6":619.0,"7":631.0,"8":646.0,"9":283.0,"10":42.0,"11":608.0,"12":196.0,"13":620.0,"14":50.0,"15":74.0,"16":130.0,"17":131.0,"18":50.0,"19":487.5,"20":631.0,"21":228.0,"22":220.0,"23":383.0,"24":197.0,"25":263.0,"26":315.0},"CCR3":{"1":77.0,"2":175.0,"3":501.0,"4":511.0,"5":109.0,"6":257.0,"7":290.0,"8":509.0,"9":634.0,"10":73.0,"11":582.0,"12":157.0,"13":301.0,"14":115.0,"15":119.0,"16":200.0,"17":274.0,"18":182.0,"19":502.5,"20":275.0,"21":190.0,"22":267.0,"23":437.0,"24":150.0,"25":232.0,"26":303.5}}, "q3": {"FSC":{"1":384.0,"2":398.0,"3":385.0,"4":398.0,"5":357.0,"6":391.0,"7":410.0,"8":392.0,"9":476.0,"10":378.0,"11":404.0,"12":459.0,"13":441.0,"14":428.0,"15":388.5,"16":435.0,"17":488.0,"18":413.0,"19":1023.0,"20":417.0,"21":644.0,"22":721.0,"23":601.0,"24":734.0,"25":768.0,"26":1023.0},"SSC":{"1":132.0,"2":140.0,"3":127.0,"4":206.0,"5":174.0,"6":176.0,"7":191.0,"8":126.0,"9":270.5,"10":128.0,"11":159.0,"12":313.5,"13":163.0,"14":159.0,"15":144.0,"16":259.0,"17":263.5,"18":146.0,"19":1023.0,"20":178.0,"21":1023.0,"22":522.0,"23":1023.0,"24":510.0,"25":1023.0,"26":1023.0},"CD4":{"1":541.0,"2":546.0,"3":534.0,"4":116.0,"5":87.0,"6":106.0,"7":120.0,"8":537.0,"9":199.25,"10":542.0,"11":122.0,"12":153.5,"13":545.0,"14":550.0,"15":356.0,"16":135.0,"17":560.0,"18":548.0,"19":554.75,"20":118.5,"21":173.0,"22":429.0,"23":389.0,"24":427.0,"25":210.0,"26":413.0},"CCR7":{"1":220.0,"2":75.0,"3":122.5,"4":214.0,"5":131.0,"6":135.0,"7":380.0,"8":294.0,"9":524.5,"10":63.0,"11":165.0,"12":247.0,"13":495.0,"14":629.0,"15":166.5,"16":559.75,"17":642.0,"18":234.0,"19":713.25,"20":609.5,"21":262.0,"22":270.0,"23":488.0,"24":259.0,"25":295.0,"26":375.0},"CD8":{"1":89.0,"2":122.0,"3":658.0,"4":162.5,"5":108.0,"6":642.0,"7":655.0,"8":664.0,"9":460.25,"10":101.0,"11":630.0,"12":273.5,"13":645.0,"14":131.0,"15":124.5,"16":201.75,"17":198.0,"18":115.0,"19":633.0,"20":656.0,"21":256.0,"22":258.0,"23":406.0,"24":234.0,"25":286.0,"26":348.0},"CCR3":{"1":105.0,"2":211.0,"3":543.0,"4":571.0,"5":156.0,"6":294.0,"7":341.0,"8":547.0,"9":683.0,"10":100.0,"11":609.0,"12":208.0,"13":348.0,"14":161.0,"15":164.0,"16":271.0,"17":338.0,"18":221.0,"19":583.25,"20":316.0,"21":234.0,"22":306.25,"23":499.0,"24":193.0,"25":270.0,"26":359.0}}, "upper": {"FSC":{"1":451.5,"2":480.5,"3":457.0,"4":531.5,"5":447.0,"6":458.5,"7":479.0,"8":455.0,"9":648.875,"10":450.0,"11":474.5,"12":580.5,"13":547.5,"14":518.0,"15":482.25,"16":534.0,"17":623.75,"18":500.0,"19":1212.0,"20":489.0,"21":738.5,"22":875.5,"23":766.0,"24":893.0,"25":900.0,"26":1187.625},"SSC":{"1":186.0,"2":201.5,"3":178.0,"4":315.5,"5":249.0,"6":258.5,"7":279.5,"8":174.0,"9":419.75,"10":179.0,"11":232.5,"12":500.25,"13":251.5,"14":234.0,"15":229.5,"16":398.5,"17":436.75,"18":209.0,"19":1023.0,"20":253.0,"21":1158.0,"22":723.375,"23":1023.0,"24":708.75,"25":1023.0,"26":1023.0},"CD4":{"1":598.0,"2":609.0,"3":594.0,"4":243.5,"5":202.5,"6":217.0,"7":229.5,"8":589.5,"9":365.0,"10":602.0,"11":234.5,"12":254.75,"13":623.0,"14":622.0,"15":455.0,"16":250.5,"17":670.25,"18":606.5,"19":737.75,"20":225.75,"21":261.5,"22":541.875,"23":459.5,"24":517.0,"25":289.5,"26":657.5},"CCR7":{"1":329.5,"2":187.5,"3":306.25,"4":411.25,"5":327.5,"6":312.375,"7":620.0,"8":427.5,"9":800.5,"10":157.5,"11":340.125,"12":409.0,"13":711.0,"14":795.5,"15":387.75,"16":737.875,"17":789.0,"18":351.0,"19":1025.625,"20":814.25,"21":362.5,"22":405.375,"23":557.0,"24":417.25,"25":371.5,"26":480.0},"CD8":{"1":222.5,"2":305.0,"3":722.5,"4":344.75,"5":259.5,"6":724.5,"7":739.0,"8":722.5,"9":855.5,"10":252.5,"11":702.0,"12":472.25,"13":724.5,"14":327.5,"15":296.25,"16":436.125,"17":440.25,"18":287.5,"19":942.375,"20":740.0,"21":343.0,"22":381.0,"23":481.0,"24":361.5,"25":361.0,"26":442.5},"CCR3":{"1":202.5,"2":304.0,"3":692.25,"4":740.5,"5":295.5,"6":414.0,"7":476.0,"8":670.0,"9":831.875,"10":194.5,"11":706.5,"12":371.5,"13":481.5,"14":302.0,"15":314.0,"16":486.625,"17":494.0,"18":318.5,"19":790.625,"20":448.0,"21":387.0,"22":408.625,"23":647.5,"24":332.5,"25":396.0,"26":506.0}}}
\ No newline at end of file
--- a/test-data/out.html	Wed May 20 16:04:43 2020 -0400
+++ b/test-data/out.html	Tue Jul 28 08:32:36 2020 -0400
@@ -8,20 +8,22 @@
 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"/>
 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css"/>
 <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.css"/>
-<link rel="stylesheet" href="/static/flowtools/css/parallelCoordinates.css"/>
+<link rel="stylesheet" type="text/css" href="js/Editor-1.5.6/css/editor.dataTables.css">
+<link rel="stylesheet" href="css/parallelCoordinates.css"/>
 
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
 <script type="text/javascript" src="https://cdn.datatables.net/v/dt/pdfmake-0.1.18/dt-1.10.12/b-1.2.1/b-colvis-1.2.1/b-html5-1.2.1/cr-1.3.2/fc-3.2.2/fh-3.1.2/r-2.1.0/rr-1.1.2/sc-1.4.2/se-1.2.0/datatables.min.js"></script>
-<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script src="js/Editor-1.5.6/js/dataTables.editor.js" type="text/javascript"></script>
 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" type="text/javascript"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.min.js" type="text/javascript"></script>
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" type="text/javascript"></script>
 <script src="https://cdn.plot.ly/plotly-1.0.0.min.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/csOverview.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/crossSamplePlots.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/pCoordMFIstats.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/pCoordCSstats.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/color_palette.js" type="text/javascript"></script>
-<script src="/static/flowtools/js/boxplots.js" type="text/javascript"></script>
+<script src="js/csOverview.js" type="text/javascript"></script>
+<script src="js/crossSamplePlots.js" type="text/javascript"></script>
+<script src="js/pCoordMFIstats.js" type="text/javascript"></script>
+<script src="js/pCoordCSstats.js" type="text/javascript"></script>
+<script src="js/color_palette.js" type="text/javascript"></script>
+<script src="js/boxplots.js" type="text/javascript"></script>
 
 <style>
 #input{font-family:Calibri,Arial}
@@ -67,7 +69,7 @@
                                 <button id="updateDisplayA" class="igbtn">Reset Display</button>
                               </div>
                               <div class="col-sm-6 optionButtons">
-                                <button id="togglePlot" class="igbtn"><img id="toggleButtonImg" src="/static/images/flowtools/barssm.png"></button>
+                                <button id="togglePlot" class="igbtn"><img id="toggleButtonImg" src="images/barssm.png"></button>
                               </div>
                             </div>
                             <table id="popTableA" class="table table-condensed table-bordered igtable">