diff --git a/.github/scripts/generate-index-recipes.js b/.github/scripts/generate-index-recipes.js
new file mode 100644
index 000000000..ecb8214b1
--- /dev/null
+++ b/.github/scripts/generate-index-recipes.js
@@ -0,0 +1,66 @@
+const fs = require('fs-extra');
+const path = require('path');
+const crypto = require('crypto');
+
+async function generateIndex() {
+ const recipesDir = path.join(__dirname, '../../docs/recipes');
+ const outputPath = path.join(recipesDir, 'index.json');
+ const readmePath = path.join(recipesDir, 'README.md');
+ const files = await fs.readdir(recipesDir);
+ const index = [];
+ let readmeContent = '# Recipes\n\n';
+
+ console.log('Generating index and README...');
+ console.log(`Reading files from ${recipesDir}`);
+
+ for (const file of files) {
+ if (file.endsWith('.md') && file !== 'README.md') {
+ console.log(`Processing file: ${file}`);
+ const filePath = path.join(recipesDir, file);
+ const content = await fs.readFile(filePath, 'utf-8');
+ const titleMatch = content.match(/^#\s+(.+)$/m);
+ const title = titleMatch ? titleMatch[1] : 'Untitled';
+ const hash = crypto.createHash('md5').update(content).digest('hex');
+
+ // Extract metadata from the comment block
+ const metadataMatch = content.match(//);
+ let description = 'No description available.';
+ let keywords = [];
+ if (metadataMatch) {
+ const metadata = JSON.parse(metadataMatch[1]);
+ if (metadata.description) {
+ description = metadata.description;
+ }
+ if (metadata.keywords) {
+ keywords = metadata.keywords;
+ }
+ }
+
+ index.push({
+ file: file,
+ title: title,
+ path: `/docs/recipes/${file}`,
+ hash: hash,
+ keywords: keywords
+ });
+
+ readmeContent += `## [${title}](/docs/recipes/${file})\n\n${description}\n\n`;
+ }
+ }
+
+ console.log(`Writing index to ${outputPath}`);
+ await fs.writeJson(outputPath, index, { spaces: 2 });
+
+ console.log(`Writing README to ${readmePath}`);
+ await fs.writeFile(readmePath, readmeContent.trim(), 'utf-8');
+
+ const readmeExists = await fs.pathExists(readmePath);
+ console.log(`README exists: ${readmeExists}`);
+
+ console.log('Index and README generation complete.');
+}
+
+generateIndex().catch(err => {
+ console.error('Error generating index and README:', err);
+ process.exit(1);
+});
diff --git a/.github/workflows/index-recipes.yml b/.github/workflows/index-recipes.yml
new file mode 100644
index 000000000..d8dbe4d2c
--- /dev/null
+++ b/.github/workflows/index-recipes.yml
@@ -0,0 +1,43 @@
+name: Generate Recipes Index
+
+on:
+ push:
+ branches:
+ - "**"
+ paths:
+ - "docs/recipes/**"
+ workflow_dispatch:
+
+jobs:
+ generate-index:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v2
+ with:
+ node-version: '14'
+
+ - name: Install dependencies
+ run: |
+ npm install fs-extra
+
+ - name: Generate index
+ run: |
+ node .github/scripts/generate-index-recipes.js
+
+ - name: Commit and push changes
+ run: |
+ BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/})
+ if [ -n "$(git status --porcelain)" ]; then
+ git config --local user.email "action@github.com"
+ git config --local user.name "Lucee Docs GitHub Action"
+ git add docs/recipes/index.json docs/recipes/README.md
+ git commit -m "Update recipes index and README"
+ git push origin $BRANCH_NAME
+ else
+ echo "No changes found to commit"
+ fi
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 683f80cbc..a72179c55 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -7,9 +7,9 @@ jobs:
name: ๐งน Markdown Lint
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: ๐ฅ Use Node.js
- uses: actions/setup-node@v3.5.1
+ uses: actions/setup-node@v4
with:
node-version: '12.x'
- run: npm install -g markdownlint-cli@0.23.2
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: ๐ Check Out
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: ๐ฅฅ Install
run: |
wget -O - -q https://git.io/misspell | sh -s -- -b .
@@ -30,8 +30,8 @@ jobs:
name: ๐งน YAML Lint
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-python@v4.3.0
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
with:
python-version: '3.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax
architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index d54c6b363..998aa1b8d 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -16,18 +16,18 @@ jobs:
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-java@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: '11'
- name: Cache Maven packages
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ~/.m2
key: lucee-script-runner-m2-cache
- name: Cache Lucee files
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: _actions/lucee/script-runner/main/lucee-download-cache
key: lucee-downloads-${{ env.luceeVersion }}
@@ -39,11 +39,11 @@ jobs:
with:
webroot: ${{ github.workspace }}
execute: /build-all.cfm
- luceeVersion: 6.0.0.572-SNAPSHOT
+ luceeVersion: 6.1.0.238-SNAPSHOT
# redis, chart, lucene, form. ajax, chart
extensions: 60772C12-F179-D555-8E2CD2B4F7428718;version=3.0.0.54-SNAPSHOT,D46B46A9-A0E3-44E1-D972A04AC3A8DC10,EFDEB172-F52E-4D84-9CD1A1F561B3DFC8,FAD67145-E3AE-30F8-1C11A6CCF544F0B7,6E2CB28F-98FB-4B51-B6BE6C64ADF35473,DF28D0A4-6748-44B9-A2FDC12E4E2E4D38
- name: Upload Artifact
- uses: actions/upload-artifact@v3
+ uses: actions/upload-artifact@v4
with:
name: lucee-docs
path: builds/artifacts/lucee-docs.zip
@@ -61,7 +61,7 @@ jobs:
run: curl https://google.com/ping?sitemap=https://docs.lucee.org/sitemap.xml
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master'}}
# - name: Notify slack
- # uses: 8398a7/action-slack@v3.9.1
+ # uses: 8398a7/action-slack@v4.9.1
# with:
# status: ${{ job.status }}
# author_name: GitHub Actions # default: 8398a7@action-slack
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 86eff8c6e..733857778 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -16,18 +16,18 @@ jobs:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- - uses: actions/checkout@v3
- - uses: actions/setup-java@v3
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
with:
distribution: 'adopt'
java-version: '11'
- name: Cache Maven packages
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ~/.m2
key: lucee-script-runner-m2-cache
- name: Cache Lucee files
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: _actions/lucee/script-runner/main/lucee-download-cache
key: lucee-downloads-${{ env.luceeVersion }}
diff --git a/.gitignore b/.gitignore
index b82b806b2..2229ffa36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,11 @@
-jmimemagic.log
-.exitcode
-node_modules
-.vscode
+jmimemagic.log
+.exitcode
+node_modules
+.vscode
+package-lock.json
server/server-luceedocslocalserver.json
server-luceedocsbuilder.json
.commandbox
-server/performance.log
+server/performance.log
/commandbox-luceedocslocalserver
diff --git a/api/data/DocTree.cfc b/api/data/DocTree.cfc
index 7d2c4e455..bb724735c 100644
--- a/api/data/DocTree.cfc
+++ b/api/data/DocTree.cfc
@@ -30,13 +30,13 @@ component accessors=true {
private void function _initializeEmptyTree() {
setTree( [] );
- setIdMap( {} );
- setPathMap( {} );
- setPageTypeMap( {} );
- setRelatedMap( {} );
- setCategoryMap( {} );
- setReferenceMap( {} );
- setDirectlyRelatedMap( {} );
+ setIdMap( [:] );
+ setPathMap( [:] );
+ setPageTypeMap( [:] );
+ setRelatedMap( [:] );
+ setCategoryMap( [:] );
+ setReferenceMap( [:] );
+ setDirectlyRelatedMap( [:] );
}
public void function updateTree() {
@@ -44,10 +44,14 @@ component accessors=true {
}
public any function getPage( required string id ) {
+ if ( !pageExists( arguments.id ) )
+ systemOutput( "GetPage: #id# does not exist in doctree", true );
return variables.idMap[ arguments.id ] ?: NullValue();
}
public any function getPageByPath( required string path ) {
+ if ( !structKeyExists( variables.pathMap, arguments.path ) )
+ systemOutput( "GetPageByPath: #path# does not exist in doctree", true );
return variables.pathMap[ arguments.path ] ?: NullValue();
}
@@ -206,16 +210,19 @@ component accessors=true {
var start = getTickCount();
var _threads = getThreads();
each (q_source_files, function (page) {
+ // systemOutput( arguments.page.path & arguments.page.name, true);
var _parsedPage = new PageReader().preparePageObject( variables.rootDir, arguments.page.name, arguments.page.directory, arguments.page.path );
if ( ! _parsedPage.getHidden() ) {
variables.pageCache.addPage(
_parsedPage,
- arguments.page.path
+ _parsedPage.getPath()
);
+ } else {
+ // systemOutput("hidden--------------------#arguments.page.path#", true)
}
}, (_threads != 1), _threads);
- request.logger (text="Pages Parsed in #(getTickCount()-start)/1000#s");
+ request.logger (text=" #len(variables.pageCache.getPages())# Pages Parsed in #(getTickCount()-start)/1000#s");
_buildTreeHierachy(false);
_parseTree();
@@ -272,14 +279,16 @@ component accessors=true {
//var start = getTickCount();
var pages = variables.pageCache.getPages();
for (var pagePath in pages ){
- var page = pages[pagePath].page;
- if (arguments.reset)
+ var page = pages[ pagePath ].page;
+ if ( arguments.reset )
page.reset(); // clear previous structure data
try {
- _addPageToTree(page);
+ _addPageToTree( page );
} catch (any e){
dump(page);
dump(e);
+ systemOutput( pagePath, true );
+ systemOutput( e, true );
echo(e);
abort;
}
@@ -290,16 +299,22 @@ component accessors=true {
private void function _parseTree( ) {
// expose guides as a top level folder
for (var folder in variables.tree){
- if (folder.getId() eq "guides"){
- var guideTree = folder.getChildren();
- for (var guide in guideTree){
- if (guide.getForceSortOrder() gt 0){
- guide.setSortOrder(guide.getForceSortOrder());
- } else {
- guide.setSortOrder(6 + NumberFormat(guide.getSortOrder()/100,"0.00"));
+ switch( folder.getId() ){
+ case "guides":
+ var guideTree = folder.getChildren();
+ for (var guide in guideTree){
+ if (guide.getForceSortOrder() gt 0){
+ guide.setSortOrder(guide.getForceSortOrder());
+ } else {
+ guide.setSortOrder(6 + NumberFormat(guide.getSortOrder()/100,"0.00"));
+ }
+ variables.tree.append(guide);
}
- variables.tree.append(guide);
- }
+ break;
+ /*
+ case "recipes":
+ break;
+ */
}
}
_sortChildren( variables.tree );
@@ -319,23 +334,24 @@ component accessors=true {
var isPage = arguments.page.isPage(); // workaround for page types not being parsed out correctly in PageReader.readPageFile
if ( !IsNull( parent ) ) {
- if (isPage)
+ if ( isPage )
parent.addChild( arguments.page ); // don't add page subelements, i.e _attributes etc
arguments.page.setParent( parent );
ancestors = parent.getAncestors();
- if (ancestors.len() eq 0 or pageType eq "_method") // avoid duplicates, hack for methods
+ if ( ancestors.len() eq 0 or pageType eq "_method" ) // avoid duplicates, hack for methods
ancestors.append( parent.getId() );
} else {
variables.tree.append( arguments.page );
}
- if (not isPage)
- throw "not a page"; // only add main pages
+ if ( !isPage ){
+ throw "not a page [#page.getFilePath()#]"; // only add main pages
+ }
- if ( !StructKeyExists(variables.pageTypeMap, pageType) )
- variables.pageTypeMap[pageType] = 0;
- variables.pageTypeMap[pageType]++;
+ if ( !StructKeyExists( variables.pageTypeMap, pageType ) )
+ variables.pageTypeMap[ pageType ] = 0;
+ variables.pageTypeMap[ pageType ]++;
arguments.page.setAncestors( ancestors );
lineage = Duplicate( ancestors );
diff --git a/api/data/Page.cfc b/api/data/Page.cfc
index 9f81e05e2..956017586 100644
--- a/api/data/Page.cfc
+++ b/api/data/Page.cfc
@@ -51,7 +51,7 @@ component accessors=true {
}
public string function getPageMenuTitle(){
- if (len(getMenuTitle()) gt 0)
+ if ( len( getMenuTitle() ) gt 0 )
return getMenuTitle();
else
return getTitle();
@@ -65,7 +65,7 @@ component accessors=true {
}
public boolean function isPage() {
- switch (this.getPageType()){
+ switch ( getPageType() ){
case "homepage":
case "page":
case "chapter":
@@ -84,7 +84,7 @@ component accessors=true {
case "_image":
return false;
default:
- request.logger (text="Unknown pageType: #pageType#, #arguments.page.getPath()#", type="WARN");
+ request.logger (text="Unknown pageType: #getPageType()#, #getPath()#", type="WARN");
return false;
};
}
@@ -110,4 +110,13 @@ component accessors=true {
return "[[object-#type#]]";
}
}
+
+ public function getInstance(){
+ var st = {};
+ for ( var v in variables ){
+ if ( !isNull(variables[ v ]) && isSimpleValue( variables[ v ] ) and len( variables[v] ) lt 75 )
+ st[v ] = variables[ v ];
+ }
+ return st;
+ }
}
\ No newline at end of file
diff --git a/api/data/PageCache.cfc b/api/data/PageCache.cfc
index 1e67bdfea..0bf3af363 100644
--- a/api/data/PageCache.cfc
+++ b/api/data/PageCache.cfc
@@ -82,8 +82,9 @@ component accessors=true {
local.q_files = QueryNew("name,directory,depth,src,dateLastModified,fullpath", "varchar,varchar,numeric,varchar,date,varchar");
var timestamp = CreateDate(2000,1,1);//
for( var file in local.files){
- var row = QueryAddRow(local.q_files);
file = _removeRootDirectoryFromFilePath(file);
+ if ( ListFirst( file, "/" ) eq "recipes") continue;
+ var row = QueryAddRow(local.q_files);
querySetCell(local.q_files, "name", ListLast(file, "/") , row);
querySetCell(local.q_files, "fullpath", file , row);
querySetCell(local.q_files, "directory", GetDirectoryFromPath(file) , row);
diff --git a/api/data/PageReader.cfc b/api/data/PageReader.cfc
index dd2de1a79..2a4e1a8c0 100644
--- a/api/data/PageReader.cfc
+++ b/api/data/PageReader.cfc
@@ -43,14 +43,32 @@ component {
}
}
- page.setPath( arguments.pagePath );
+ // hack to restructure recipes as docs content
+ if ( listFirst( page.getPath(), "/" ) eq "recipes" ){
+ page.setSlug( page.getPageType() )
+
+ if (page.getPageType() eq "README"){
+ page.setPath( page.getPath() );
+ page.setPageType( "listing" );
+ page.setVisible( true );
+ page.setReference( false );
+ page.setBody( "Recipes" );
+ page.setTitle( "Lucee Recipes" );
+ page.setDescription( "Lucee Recipes" );
+ } else {
+ page.setPath( page.getPath() & "/" & replace( page.getPageType(), ".md", "" ) );
+ page.setPageType( "page" );
+ }
+ } else {
+ page.setPath( arguments.pagePath );
+ }
+
if ( !page.getId().len() ) {
page.setId( page.getPath() );
}
page.setChildren( [] );
page.setDepth( ListLen( page.getPath(), "/" ) );
-
return page;
}
@@ -74,7 +92,7 @@ component {
var slug = ListLast( arguments.pageDir, "\/" );
var fileContent = FileReadAsUnix( path );
- var data = _parsePage( fileContent );
+ var data = _parsePage( fileContent, path );
var sortOrder = "";
// if the last directory is in the format 00.home, flag is as visible
@@ -118,22 +136,24 @@ component {
public any function readPageFileSource( required string filePath ) {
var path = Replace(arguments.filePath,"\","/","all");
var fileContent = FileReadAsUnix( path );
- var data = _parsePage( fileContent );
+ var data = _parsePage( fileContent, arguments.filePath );
return data;
}
- private struct function _parsePage( required string pageContent ) {
+ private struct function _parsePage( required string pageContent, required string filePath ) {
var yamlAndBody = _splitYamlAndBody( arguments.pageContent );
var parsed = { body = yamlAndBody.body };
if ( yamlAndBody.yaml.len() ) {
parsed.append( _parseYaml( yamlAndBody.yaml ), false );
+ } else if ( len( trim( arguments.pageContent ) ) ){
+ parsed = _splitCommentStructAndBody( arguments.pageContent, arguments.filePath );
}
return parsed;
}
- private struct function _splitYamlAndBody( required string pageContent ) {
+ private struct function _splitYamlAndBody( required string pageContent, string filePath ) {
var splitterRegex = "^(\-\-\-\n(.*?)\n\-\-\-\n)?(.*)$";
return {
@@ -142,6 +162,44 @@ component {
}
}
+ private struct function _splitCommentStructAndBody( required string pageContent, string filePath ) {
+ // recipies use a different format, json in html comments
+ /*
+
+
+ */
+ var str = trim( arguments.pageContent );
+ var startComment = find("", str, startComment );
+ if ( endComment == 0 )
+ throw "missing closing html comment metadata [#arguments.filePath#]";
+ var meta = mid( str, 5, endComment - 5 );
+ //systemOutput( "!!" & meta & "!!", true );
+ if ( !isJson( meta ) ){
+ throw "metadata is not json [#arguments.filePath#]";
+ }
+ var body = mid( str, endComment + 3 );
+ if ( len( trim( body ) ) eq 0 )
+ throw "empty content after metadata [#arguments.filePath#]";
+ return {
+ yaml = deserializeJson( meta )
+ , body = body
+ }
+ }
+
private string function _convertToUnixLineEnding( required string content ){
return REReplace(arguments.content, "\r\n", chr(10), "all");
}
diff --git a/api/parsers/MarkdownParser.cfc b/api/parsers/MarkdownParser.cfc
index d828cdf20..d670d7705 100644
--- a/api/parsers/MarkdownParser.cfc
+++ b/api/parsers/MarkdownParser.cfc
@@ -5,14 +5,16 @@ component {
public any function init() {
variables.flexmark = false; //experimental https://luceeserver.atlassian.net/browse/LD-109
- _setupMarkdownProcessor();
+ //_setupMarkdownProcessor();
_setupNoticeBoxRenderer();
return this;
}
public string function _markdownToHtml( required string markdown, required boolean stripParagraph=false) {
- if (variables.flexmark){
+ if (true){
+ var html = markdownToHtml( arguments.markdown );
+ } else if (variables.flexmark){
var processor = _getMarkdownProcessor();
var doc = processor.parser.parse(arguments.markdown);
var html = processor.renderer.render( doc );
diff --git a/api/reference/FunctionReferenceReader.cfc b/api/reference/FunctionReferenceReader.cfc
index f136bb56d..de85ec6e2 100644
--- a/api/reference/FunctionReferenceReader.cfc
+++ b/api/reference/FunctionReferenceReader.cfc
@@ -77,8 +77,8 @@ component accessors=true {
// load java tags
variables.extensionMap = {};
var cfg = getPageContext().getConfig();
- var flds = cfg.getCombinedFLDs(1);
- var ff = flds.getFunctions()
+ var flds = cfg.getFLDs();
+ var ff = flds.getFunctions();
for (var fname in ff){
var bi = bundleInfo( ff[fname].getBIF() );
if ( bi.name != "lucee.core" ) {
diff --git a/api/reference/TagReferenceReader.cfc b/api/reference/TagReferenceReader.cfc
index d4118d1d9..8dc300c56 100644
--- a/api/reference/TagReferenceReader.cfc
+++ b/api/reference/TagReferenceReader.cfc
@@ -89,7 +89,7 @@ component accessors=true {
// load java tags
variables.extensionMap = {};
var cfg = getPageContext().getConfig();
- var tlds = cfg.getTLDs(1);
+ var tlds = cfg.getTLDs();
//dump(tlds); abort;
var tags = tlds[1].getTags();
//dump(tags); abort;
diff --git a/api/rendering/SyntaxHighlighter.cfc b/api/rendering/SyntaxHighlighter.cfc
index f753612ff..dc7a8301b 100644
--- a/api/rendering/SyntaxHighlighter.cfc
+++ b/api/rendering/SyntaxHighlighter.cfc
@@ -26,8 +26,16 @@ component {
} else if ( arguments.language.reFindNoCase( "^(lucee|cfm|coldfusion)" ) ) {
arguments.language = "cfm";
}
-
- var highlighted = highlighter.highlight( arguments.code, arguments.language, false );
+ lock name="highlight" type="exclusive" timeout=10 {
+ try {
+ var highlighted = highlighter.highlight( arguments.code, arguments.language, false );
+ } catch (e ){
+
+ systemOutput( arguments, true );
+ //systemOutput( e );
+ highlighted = arguments.code;
+ }
+ }
if ( useTryCf ) {
var rawCode = '
-
+ // Query
+ Query = queryNew( "name,age", "varchar,numeric", {name = "Susi", age = 20 } );
+ resQry = ToScript(Query, "Query");
+ writeDump(resQry);
+ // String
+ Str = "test";
+ resStr = ToScript(Str, "Str");
+ writeDump(resStr);
+
+ // Number
+ number = 10;
+ resNum = ToScript(number, "number");
+ writeDump(resNum);
```
\ No newline at end of file
diff --git a/docs/03.reference/01.functions/trimwhitespace/function.md b/docs/03.reference/01.functions/trimwhitespace/function.md
index 54a4c3bf4..00908e6ed 100644
--- a/docs/03.reference/01.functions/trimwhitespace/function.md
+++ b/docs/03.reference/01.functions/trimwhitespace/function.md
@@ -2,8 +2,11 @@
title: TrimWhitespace
id: function-trimwhitespace
related:
+- function-trim
+- function-ltrim
+- function-rtrim
categories:
- string
---
-clean white space of the given string
\ No newline at end of file
+clean white space of the given string
diff --git a/docs/03.reference/01.functions/urlencodedformat/_arguments/force.md b/docs/03.reference/01.functions/urlencodedformat/_arguments/force.md
index e69de29bb..ce06fd9aa 100644
--- a/docs/03.reference/01.functions/urlencodedformat/_arguments/force.md
+++ b/docs/03.reference/01.functions/urlencodedformat/_arguments/force.md
@@ -0,0 +1 @@
+If false, then the string will not be encoded if it does not contain unsafe characters.
\ No newline at end of file
diff --git a/docs/03.reference/01.functions/valueref/_arguments/ref.md b/docs/03.reference/01.functions/valueref/_arguments/ref.md
new file mode 100644
index 000000000..d49a6dfa9
--- /dev/null
+++ b/docs/03.reference/01.functions/valueref/_arguments/ref.md
@@ -0,0 +1 @@
+udf returning the value
\ No newline at end of file
diff --git a/docs/03.reference/01.functions/valueref/_returnTypeDesc.md b/docs/03.reference/01.functions/valueref/_returnTypeDesc.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/01.functions/valueref/_usageNotes.md b/docs/03.reference/01.functions/valueref/_usageNotes.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/01.functions/valueref/function.md b/docs/03.reference/01.functions/valueref/function.md
new file mode 100644
index 000000000..b80afd2b4
--- /dev/null
+++ b/docs/03.reference/01.functions/valueref/function.md
@@ -0,0 +1,8 @@
+---
+title: valueref
+id: function-valueref
+related:
+categories:
+---
+
+creates a reference to a UDF that acts like a simple value.
\ No newline at end of file
diff --git a/docs/03.reference/01.functions/xmlchildpos/_arguments/index.md b/docs/03.reference/01.functions/xmlchildpos/_arguments/index.md
index 64f6ff11c..55fa6dd3d 100644
--- a/docs/03.reference/01.functions/xmlchildpos/_arguments/index.md
+++ b/docs/03.reference/01.functions/xmlchildpos/_arguments/index.md
@@ -1 +1 @@
-Index of XMLchild element for which to search.
\ No newline at end of file
+Index of XML child element for which to search
\ No newline at end of file
diff --git a/docs/03.reference/01.functions/xmltransform/_arguments/xsl.md b/docs/03.reference/01.functions/xmltransform/_arguments/xsl.md
index e69de29bb..742b0feca 100644
--- a/docs/03.reference/01.functions/xmltransform/_arguments/xsl.md
+++ b/docs/03.reference/01.functions/xmltransform/_arguments/xsl.md
@@ -0,0 +1 @@
+A string containing XSL text
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingdatabase.md b/docs/03.reference/02.tags/application/_attributes/debuggingdatabase.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingdump.md b/docs/03.reference/02.tags/application/_attributes/debuggingdump.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingexception.md b/docs/03.reference/02.tags/application/_attributes/debuggingexception.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingimplicitaccess.md b/docs/03.reference/02.tags/application/_attributes/debuggingimplicitaccess.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingqueryusage.md b/docs/03.reference/02.tags/application/_attributes/debuggingqueryusage.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingtemplate.md b/docs/03.reference/02.tags/application/_attributes/debuggingtemplate.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingthread.md b/docs/03.reference/02.tags/application/_attributes/debuggingthread.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingtimer.md b/docs/03.reference/02.tags/application/_attributes/debuggingtimer.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/debuggingtracing.md b/docs/03.reference/02.tags/application/_attributes/debuggingtracing.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/03.reference/02.tags/application/_attributes/querylistener.md b/docs/03.reference/02.tags/application/_attributes/querylistener.md
index e69de29bb..11881efc5 100644
--- a/docs/03.reference/02.tags/application/_attributes/querylistener.md
+++ b/docs/03.reference/02.tags/application/_attributes/querylistener.md
@@ -0,0 +1,3 @@
+Defines a query listeners for cfquery.
+
+See the [[cookbooks-query-listeners]] for details
diff --git a/docs/03.reference/02.tags/application/_attributes/showdebug.md b/docs/03.reference/02.tags/application/_attributes/showdebug.md
new file mode 100644
index 000000000..c9247598b
--- /dev/null
+++ b/docs/03.reference/02.tags/application/_attributes/showdebug.md
@@ -0,0 +1 @@
+Show debug output at the end of the webpage or not.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/application/_attributes/showdoc.md b/docs/03.reference/02.tags/application/_attributes/showdoc.md
new file mode 100644
index 000000000..b48d8c5f5
--- /dev/null
+++ b/docs/03.reference/02.tags/application/_attributes/showdoc.md
@@ -0,0 +1 @@
+Show documentation output at the end of the webpage or not.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/application/_attributes/showmetric.md b/docs/03.reference/02.tags/application/_attributes/showmetric.md
new file mode 100644
index 000000000..3c55f21f6
--- /dev/null
+++ b/docs/03.reference/02.tags/application/_attributes/showmetric.md
@@ -0,0 +1 @@
+Show metric output at the end of the webpage or not.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/col/_examples.md b/docs/03.reference/02.tags/col/_examples.md
index 48da06280..fa2b991a1 100644
--- a/docs/03.reference/02.tags/col/_examples.md
+++ b/docs/03.reference/02.tags/col/_examples.md
@@ -1 +1,17 @@
-*There are currently no examples for this tag.*
+```lucee+trycf
+
+
+ SELECT *
+ FROM data
+
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/collection/_examples.md b/docs/03.reference/02.tags/collection/_examples.md
index 48da06280..d6287a580 100644
--- a/docs/03.reference/02.tags/collection/_examples.md
+++ b/docs/03.reference/02.tags/collection/_examples.md
@@ -1 +1,5 @@
-*There are currently no examples for this tag.*
+```lucee
+
+
+
+```
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/cookie/_attributes/partitioned.md b/docs/03.reference/02.tags/cookie/_attributes/partitioned.md
new file mode 100644
index 000000000..be4fbacf2
--- /dev/null
+++ b/docs/03.reference/02.tags/cookie/_attributes/partitioned.md
@@ -0,0 +1 @@
+Used to isolate third party cookies, requires path="/" and secure="true".
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/dump/_attributes/flush.md b/docs/03.reference/02.tags/dump/_attributes/flush.md
new file mode 100644
index 000000000..a13b84ac6
--- /dev/null
+++ b/docs/03.reference/02.tags/dump/_attributes/flush.md
@@ -0,0 +1 @@
+flushes the response stream after the dump
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/flush/_attributes/throwonerror.md b/docs/03.reference/02.tags/flush/_attributes/throwonerror.md
new file mode 100644
index 000000000..a2382c6c3
--- /dev/null
+++ b/docs/03.reference/02.tags/flush/_attributes/throwonerror.md
@@ -0,0 +1 @@
+If set to false, any exceptions thrown by the servlet engine, such as those resulting from a client disconnection, will be suppressed.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/form/_examples.md b/docs/03.reference/02.tags/form/_examples.md
index 48da06280..e61ac1ae7 100644
--- a/docs/03.reference/02.tags/form/_examples.md
+++ b/docs/03.reference/02.tags/form/_examples.md
@@ -1 +1,19 @@
-*There are currently no examples for this tag.*
+```lucee+trycf
+
+ -- year --
+
+
+
+
+
+
+
+ -- color --
+
+
+
+
+
+
+
+```
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/ftp/_attributes/actionparam.md b/docs/03.reference/02.tags/ftp/_attributes/actionparam.md
new file mode 100644
index 000000000..c8ed36e82
--- /dev/null
+++ b/docs/03.reference/02.tags/ftp/_attributes/actionparam.md
@@ -0,0 +1 @@
+used with action="quote" to execute custom ftp commands
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/function/_attributes/modifier.md b/docs/03.reference/02.tags/function/_attributes/modifier.md
index 43f4de51e..4c38d09bf 100644
--- a/docs/03.reference/02.tags/function/_attributes/modifier.md
+++ b/docs/03.reference/02.tags/function/_attributes/modifier.md
@@ -1,5 +1,5 @@
-used to denote a function as abstract (implementation must be defined in extended component), static (does not access instance variables in the component) or final (implementation cannot be extended).
+Use modifier to denote a function as abstract, static or final.
-- final
-- abstract
-- static
+- abstract: implementation must be defined in extended component.
+- final: implementation cannot be extended.
+- static: does not access instance variables in the component.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/function/_attributes/output.md b/docs/03.reference/02.tags/function/_attributes/output.md
index 76b29e711..6b80ec681 100644
--- a/docs/03.reference/02.tags/function/_attributes/output.md
+++ b/docs/03.reference/02.tags/function/_attributes/output.md
@@ -1,4 +1,4 @@
This attribute is used only for a component.
-- yes: the function is processed as if it were within a [[tag-cfoutput]] tag
-- no: the function is processed as if it were within a [[tag-cfsilent]] tag
\ No newline at end of file
+- yes: the function is processed as if it were within a [[tag-output]] tag
+- no: the function is processed as if it were within a [[tag-silent]] tag
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/http/_attributes/autocert.md b/docs/03.reference/02.tags/http/_attributes/autocert.md
new file mode 100644
index 000000000..6f8968bb7
--- /dev/null
+++ b/docs/03.reference/02.tags/http/_attributes/autocert.md
@@ -0,0 +1,3 @@
+When set to true, this attribute enables the automatic installation of SSL certificates for HTTPS connections,
+ensuring the request can proceed without SSL certificate errors.
+This is particularly useful for environments where certificates may not be pre-installed or are dynamically updated.
\ No newline at end of file
diff --git a/docs/03.reference/02.tags/imap/tag.md b/docs/03.reference/02.tags/imap/tag.md
index 50885fd16..9fda00f75 100644
--- a/docs/03.reference/02.tags/imap/tag.md
+++ b/docs/03.reference/02.tags/imap/tag.md
@@ -5,13 +5,13 @@ related:
- tag-pop
categories:
- protocols
-description: Retrieves and deletes e-mail messages from an IMAP mail server.
+description: Retrieves and deletes messages from an IMAP email server.
---
-Retrieves and deletes e-mail messages from an IMAPmail server.
+Retrieves and deletes email messages from an IMAP email server.
-This tag works exactly the same way as the [[tag-mail]] tag. It has the same attributes.
+This tag works exactly the same way as the [[tag-pop]] tag. It has the same attributes.
-The Internet Message Access Protocol or IMAP is one of two of the most prevalent Internet standard protocols for e-mail retrieval, the other being POP3. Virtually all modern e-mail clients and servers support both protocols as a means of transferring e-mail messages from a server, such as those used by Gmail, to a client, such as Mozilla Thunderbird and Microsoft Outlook.
+The Internet Message Access Protocol or IMAP is one of two of the most prevalent Internet standard protocols for email retrieval, the other being POP3. Virtually all modern email clients and servers support both protocols as a means of transferring email messages from a server, such as those used by Gmail, or to a client such as Mozilla Thunderbird and Microsoft Outlook.
-Many implementations of webmail use IMAP to retrieve e-mail messages from a server and display them within a web browser, making the use of this protocol transparent to the user.
+Many implementations of webmail use IMAP to retrieve email messages from a server and display them within a web browser, making the use of this protocol transparent to the user.
diff --git a/docs/03.reference/02.tags/input/_examples.md b/docs/03.reference/02.tags/input/_examples.md
index 48da06280..0ce680f26 100644
--- a/docs/03.reference/02.tags/input/_examples.md
+++ b/docs/03.reference/02.tags/input/_examples.md
@@ -1 +1,15 @@
-*There are currently no examples for this tag.*
+```lucee+trycf
+
+
+
+
Enables/disables installation of Lucee's default extensions. When this value is changed, it will need a complete redeployment of "lucee-server" (simple restart won't suffice).
-
This directive is very useful in combination with the system variable LUCEE_EXTENSIONS.
-
Values: Boolean true | false Default: true
@@ -276,22 +272,17 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_EXTENSIONS lucee.extensions
Comma separated list of extension GUIDs (Globally Unique Identifiers) to be downloaded and installed during the very first server start.
-
Setting GUID alone will install latest version.
-
If you want to dictate version, append ;version=xx.xx.xx.xx to the GUID.
-
You can find available extensions and their corresponding GUID (these are listed as IDs) in the Server Administrator or at
Lucee Downloads.
-
- Values: String
+ Values: String
Example: Installing JFreeChart Extension Version 1.0.19.19:
@@ -323,7 +313,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_TEMPLATE_CHARSET lucee.template.charset
@@ -348,7 +337,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_WEB_CHARSET lucee.web.charset
@@ -371,7 +359,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_RESOURCE_CHARSET lucee.resource.charset
@@ -394,7 +381,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_SCRIPT_PROTECT lucee.script.protect
@@ -421,7 +407,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_QUEUE_ENABLE lucee.queue.enable
@@ -442,7 +427,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_QUEUE_MAX lucee.queue.max
@@ -464,7 +448,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_QUEUE_TIMEOUT lucee.queue.timeout
@@ -487,14 +470,12 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_CFML_WRITER lucee.cfml.writer
Defines whitespace management of the server.
-
regular: No whitespace management.
white-space: Simple whitespace management -
@@ -502,10 +483,9 @@ Also, make sure not to publish these files with sensitive data as part of open s
white-space-pref: Smart whitespace management - every whitespace character that follows a whitespace is removed,
but whitespace inside the tags: <code>, <pre> and <textarea> is kept
@@ -642,7 +612,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_TYPE_CHECKING lucee.type.checking
@@ -664,7 +633,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_STATUS_CODE lucee.status.code
@@ -685,7 +653,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -694,15 +661,11 @@ Also, make sure not to publish these files with sensitive data as part of open s
LUCEE_S3_ACCESSKEYID lucee.s3.accesskeyid
-
Defines the default S3 virtual S3 bucket mapping credentials.
-
Use this to hide AWS S3 credentials from source code or Web Administrator.
-
That way you connect to your S3 bucket with a S3:///myAwsBucketname/someDirectory/S3:///myAwsKey:myAwsSecretKey@/myAwsBucketname/someDirectory/.
Please see [[category-s3]]
-
Values: String
Lucee Server Administrator: not available
@@ -714,7 +677,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -723,9 +685,7 @@ Also, make sure not to publish these files with sensitive data as part of open s
Defines a comma separated list of file extensions that are not allowed to be uploaded.
-
By default Lucee will block a set of files that have potential risk. Use this setting to have more control over Lucees default settings.
-
Values: String Default: asp,aspx,cfc,cfm,cfml,do,htm,html,jsp,jspx,php
@@ -744,7 +704,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -762,7 +721,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -771,11 +729,8 @@ Also, make sure not to publish these files with sensitive data as part of open s
Defines the directory location where Lucee should create the server context.
-
By default Lucee places its server context in the servlet engines directory.
-
Use this to move the server context outside the Lucee installation dir. This directive is the same as the init param lucee-server-directory of path-to-lucee-installation\tomcat\conf\web.xml
-
Values: String
Example: Moving web contexts to another location:
@@ -789,7 +744,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -798,15 +752,10 @@ Also, make sure not to publish these files with sensitive data as part of open s
Defines the directory location where Lucee should create the web contexts.
-
By default Lucee places its web-context configuration and data files in a folder named WEB-INF under the webroot of each website.
-
Use this to move the web context outside of the websites webroot.
-
This directive is the same as the init param lucee-web-directory of path-to-lucee-installation\tomcat\conf\web.xml.
-
When using this directive you'll need to add Lucees label variable {web-context-label} to the path that will be used as the identifier hash or label for the created web contexts.
-
Values: String
Example: Moving web contexts to another location:
@@ -820,7 +769,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -833,8 +781,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
Values: String Default: false
-
-
Lucee Server Administrator: not available
@@ -843,7 +789,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -856,7 +801,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
Values: String error | warning |info | debug Default: error
-
Lucee Server Administrator: not available
@@ -867,7 +811,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -876,9 +819,7 @@ Also, make sure not to publish these files with sensitive data as part of open s
Disables the controller. Default is false.
-
The Controller is an internal background process which runs maintenance tasks.
-
On Startup
Syncing NTP time
@@ -886,7 +827,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
Clearing out cache files
Clearing out expired scopes like sessions (in persistent storage)
-
Every Minute
Automatically deploying updates / extensions [[deploying-lucee-server-apps]]
@@ -898,19 +838,15 @@ Also, make sure not to publish these files with sensitive data as part of open s
Clearing out locks
Picking up changed configuration files
-
Every Hour
Syncing NTP time
Clearing out temp files
Clearing out cache files
-
Values: Boolean true | false Default: false
-
-
Lucee Server Administrator: not available
@@ -919,7 +855,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
@@ -928,9 +863,7 @@ Also, make sure not to publish these files with sensitive data as part of open s
Number of milliseconds between controller calls.
-
Set to 0 to disable controller. Useful for benchmark testing.
-
Values: Numeric
Lucee Server Administrator: not available
@@ -940,7 +873,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_LISTENER_TYPE lucee.listener.type
@@ -953,7 +885,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
modern: Modern handling. Lucee only looks for the file Application.cfc
mixed: Mixed handling. Lucee looks for a file Application.cfm / OnRequestEnd.cfm as well as for the file Application.cfc
-
Values: String none | classic | modern | mixed Default: mixed
@@ -967,14 +898,12 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_LISTENER_MODE lucee.listener.mode
Defines where Lucee looks for the files Application.cfc / Application.cfm.
-
Note: In case of having LUCEE_LISTENER_TYPE set to none the setting for LUCEE_LISTENER_MODE is ignored.
curr2root: Looks for the file Application.cfc / Application.cfm from the current up to the webroot directory.
@@ -982,7 +911,6 @@ Also, make sure not to publish these files with sensitive data as part of open s
root: Looks for the file Application.cfc / Application.cfm only in the webroot .
curr: Looks for the file Application.cfc / Application.cfm only in the current template directory.
-
Values: String curr2root | currOrRoot | root | curr Default: curr2root
@@ -996,20 +924,17 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_QOQ_HSQLDB_DISABLE lucee.qoq.hsqldb.disable
Throw exception if native QoQ logic fails, otherwise Lucee falls back to using HSQLDB (which is needed for joins etc), Default is false.
-
[[http://wwvv.codersrevolution.com/blog/improving-lucees-query-of-query-support]]
Values: Boolean true | false Default: false
-
Lucee Server Administrator: not available
@@ -1018,14 +943,12 @@ Also, make sure not to publish these files with sensitive data as part of open s
-
LUCEE_QOQ_HSQLDB_DEBUG lucee.qoq.hsqldb.debug
Log message to WEB context's datasource log any time a QoQ "falls back" to HyperSQL.
-
This could include just bad SQL syntax. Default is false.
Values: Boolean true|false
@@ -1044,14 +967,11 @@ Also, make sure not to publish these files with sensitive data as part of open s
Changes Lucee default behaviour of using existing physical paths over virtually mapped paths with the same mapped name (conflicting situation).
-
Set this value to true to change Lucees default behaviour and force Lucee to use mappings as first priority and silently ignore conflicting physical paths.
-
Example:
// Assumption: // "D:/myimages/abc" is a physical valid location
Enables the certificate authority truststore in Lucee location, instead by the JVM default truststore location.
Previous to Lucee 6.0 Lucee served its own SSL truststore. From 6.0 the truststore is set by the JVM default truststore location.
-
Enabling this setting will tell Lucee to use its own truststore, behaving as prior to Lucee 6.0.
-
-
+
Enabling this setting will tell Lucee to use its own truststore, behaving as prior to Lucee 6.0.
Values: Boolean true|false Default: false
@@ -1121,8 +1037,7 @@ Also, make sure not to publish these files with sensitive data as part of open s
Application.cfc: not available
-
-
+
diff --git a/docs/04.guides/13.Various/24.rest-services/page.md b/docs/04.guides/13.Various/24.rest-services/page.md
index a97cd8839..082fda783 100644
--- a/docs/04.guides/13.Various/24.rest-services/page.md
+++ b/docs/04.guides/13.Various/24.rest-services/page.md
@@ -150,7 +150,7 @@ To intercept requests for `rest/*` paths and direct them to Tomcat/Lucee, follow
#### For Internet Information Services (IIS) on Windows: ####
-* *Step 1:* Open the "Internet Internet Information Services (IIS) Manager"
+* *Step 1:* Open the "Internet Information Services (IIS) Manager"
* *Step 2:* Select the main server node for global settings, or the specific site you'd like to add the REST service
diff --git a/docs/04.guides/13.Various/51.lucee-step-debugger-installation-guide/page.md b/docs/04.guides/13.Various/51.lucee-step-debugger-installation-guide/page.md
new file mode 100644
index 000000000..cabc4d585
--- /dev/null
+++ b/docs/04.guides/13.Various/51.lucee-step-debugger-installation-guide/page.md
@@ -0,0 +1,317 @@
+---
+title: Lucee Step Debugger Installation Guide
+id: lucee-step-debugger-installation-guide
+categories:
+- debugging
+description: How to set up the step debugger "luceedebug" for enhanced CFML Debugging in Visual Studio Code and Lucee
+---
+
+## Lucee Step Debugger Installation Guide
+
+### 1. Introduction
+
+**luceedebug** is a step-by-step CFML Lucee debugger created by David Rogers for developing CFML with Visual Studio Code running on the Lucee CFML engine. It allows using breakpoints, conditional breakpoints, watchers, and dumps by mousing over variables of your CFML code, enhancing your coding experience with CFML.
+
+This documentation shows an easy working example of setting up **luceedebug** for Visual Studio Code on a Windows machine. For the sake of simplicity, we will use a **Lucee Express 5.4 LTS** version as a starting point and setup all the needed components within a directory named `D:\luceedebug_example\` on a Windows OS but will show also an alternative for Linux/MacOs in a directory named `\opt\luceedebug_example\`. For testing the debuger we will use Lucee's default Application shipped within the Lucee Express Version. Please consider adapting this example to your specific needs of your own cfml development environment.
+
+For more detailed information about Luceedebug or contributing to this awesome open-source tool, please visit [https://github.com/softwareCobbler/luceedebug](https://github.com/softwareCobbler/luceedebug).
+
+### 2. What we need
+
+To set up **luceedebug** and make it available in Visual Studio Code you'll need the following components:
+
+- A **Lucee CFML-Engine** to run your CFML code: For this example, we'll use the Lucee Express Version 5.4 LTS.
+- A **Java JDK**: We will use JAVA 11 LTS as the Java Development Kit (JDK). A JDK is a *MUST have*: Using just a Java Runtime Environment (JRE) won't suffice to run luceedebug!
+- **luceedebug.jar (Debugger-Server)**: this is the server-side backend of the Lucee-Debugger that runs as a Java agent in Tomcat: While Tomcat runs the Lucee CFML Engine on the default port 8888, the Java Agent also runs in parallel providing all the necessary information for the Visual Studio Code Luceedebug Extension (Debugger-Client). That Java Agent provides this service on an additional port.
+- **Visual Studio Code Luceedebug Extension (Debugger-Client):** This is the Visual Studio Code client installed as a Visual Studio Code extension through the Visual Studio Code Extension Marketplace. When installed, this client connects from your Visual Studio Code to request the Luceedebug running server-side backend. It will also be listening for any information coming from the server side luceedebug.
+- **A code base to debug**: As an example, we will use Lucee's default application shipped with the Lucee Express Version 5.4 LTS at `Lucee-Installation-Path\webapps\ROOT\`.
+
+As a quick overview: At the end of the installation process shown in this documentation, the file tree should look somehow like the one shown below (this file tree only shows the relevant file structure):
+
+```
+luceedebug_example
+ +-java
+ | +-jdk-11.0.23+9 (Java 11 JDK LTS)
+ |
+ +-lucee-express-5.4.6.9 (Lucee Engine)
+ | +-bin
+ | | +-startup.bat (used to start Tomcat on Windows)
+ | | +-startup.sh (used to start Tomcat on Linux/MacOs)
+ | | +-setenv.bat (Tomcat configuration file for launching Lucee with the luceedebug.jar as Java Agent)
+ | | +-setenv.sh (Tomcat configuration file for launching Lucee with the luceedebug.jar as Java Agent)
+ | +-webapps
+ | +-ROOT
+ | +-index.cfm (file to try to debug)
+ |
+ +-luceedebug
+ | +-luceedebug.jar (Luceedebug Java files for the debugger server endpoint)
+ |
+ +-lucee_debug_example.code-workspace (VSCode workspace configuration file)
+```
+
+### 3. The Seven Steps to Install, Setup and Configure Luceedebug
+
+#### Step 1: Download Lucee Express 5.4 LTS
+
+ 1. Create a directory as a container to hold all the files necessary for this example e.g. named `D:\luceedebug_example\`.
+ 2. Download [Lucee Express 5.4.6.9 LTS](https://cdn.lucee.org/lucee-express-5.4.6.9.zip) and extract the zip file to `D:\luceedebug_example\lucee-express-5.4.6.9\`.
+
+#### Step 2: Download JAVA 11 JDK LTS
+
+ 1. Create a directory to hold your JAVA JDK artifact e.g. named `D:\luceedebug_example\java\`.
+ 2. Get the latest JAVA 11 JDK of your development environment at [Adoptium](https://adoptium.net/de/temurin/releases/?version=11&package=jdk&arch=x64). In this example, we'll be using the JAVA 11 JDK Version `Java jdk-11.0.23+9`. Extract the downloaded JDK to `D:\luceedebug_example\java\jdk-11.0.23+9\`.
+
+#### Step 3: Download luceedebug.jar
+
+ 1. Create a directory to hold your luceedebug artifact e.g. named `D:\luceedebug_example\luceedebug\`.
+ 2. Get the latest `luceedebug.jar` at David Rogers' GitHub page at [https://github.com/softwareCobbler/luceedebug/releases/latest](https://github.com/softwareCobbler/luceedebug/releases/latest). Place the jar file in `D:\luceedebug_example\luceedebug\luceedebug.jar`.
+
+#### Step 4: Setup Tomcat/Lucee to run luceedebug.jar as the JAVA Agent
+
+For Windows: Create a file at `D:\luceedebug_example\lucee-express-5.4.6.9\bin\setenv.bat` with the following content:
+
+```bat
+REM set MY_HOME as the main directory
+set "MY_HOME=../../"
+
+REM set paths to luceedebug
+set "LUCEEDEBUG_JAR=%MY_HOME%luceedebug/luceedebug.jar"
+
+REM set a path to a dedicated JDK
+set "JAVA_HOME=%MY_HOME%java\jdk-11.0.23+9\"
+set "JRE_HOME=%JAVA_HOME%"
+set "PATH=%JAVA_HOME%\bin;%PATH%"
+
+REM run Tomcat with Lucee and LuceeDebug as the Java Agent. While Lucee runs on default on localhost:8888, the Lucee Server Side Debug (JAVA AGENT) runs on localhost:9999. The VSCode Extension Clients Listening Port is set to 10000.
+set "CATALINA_OPTS=%CATALINA_OPTS% -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:9999 -javaagent:%LUCEEDEBUG_JAR%=jdwpHost=localhost,jdwpPort=9999,debugHost=0.0.0.0,debugPort=10000,jarPath=%LUCEEDEBUG_JAR%"
+
+exit /b 0
+```
+
+Then try running the file `D:\luceedebug_example\lucee-express-5.4.6.9\bin\startup.bat` on your Windows machine.
+
+For Linux/MacOs: Create a file at `\opt\luceedebug_example\lucee-express-5.4.6.9\bin\setenv.bat` with the following content:
+
+```bash
+#!/bin/bash
+
+export MY_HOME="../../"
+
+# Set paths to luceedebug
+# export LUCEEDEBUG_JAR="${MY_HOME}luceedebug/luceedebug.jar"
+
+# Set JAVA_HOME for JDK 11 on Windows D: drive
+export JAVA_HOME="${MY_HOME}java/jdk-11.0.23+9"
+
+# Set JRE_HOME
+export JRE_HOME="${JAVA_HOME}"
+
+# run Tomcat with Lucee and LuceeDebug as the Java Agent. While Lucee runs on default on localhost:8888, the Lucee Server Side Debug (JAVA AGENT) runs on localhost:9999. The VSCode Extension Clients Listening Port is set to 10000.
+export CATALINA_OPTS="${CATALINA_OPTS} -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=localhost:9999 -javaagent:${LUCEEDEBUG_JAR}=jdwpHost=localhost,jdwpPort=9999,debugHost=0.0.0.0,debugPort=10000,jarPath=${LUCEEDEBUG_JAR}"
+```
+
+Then try running the file `/opt/luceedebug_example/lucee-express-5.4.6.9/bin/startup.sv` on your Linux/MacOs machine.
+
+The steps above will start a Tomcat instance running Lucee as your CFML engine at `http://localhost:8888` while the Java Agent "Luceedebug" service will be listening at `localhost:9999`. Also, the luceedebug running on the server will send data to the Visual Studio Code Luceedebug Extension on port 10000 (e.g. when a breakpoint is reached during runtime).
+
+#### Step 5: Install the Lucee-Debug Visual Studio Code Extension to your Visual Studio Code
+
+Get the `Luceedebug Visual Studio Code Extension` by installing the extension from [https://marketplace.visualstudio.com/items?itemName=DavidRogers.luceedebug](https://marketplace.visualstudio.com/items?itemName=DavidRogers.luceedebug) or install it by searching the Marketplace repository from within your Visual Studio Code with `Ctrl+Shift+X` and searching for `Luceedebug`. Install the extension by clicking `install`. You may need to restart Visual Studio Code.
+
+#### Step 6: Configure Your Workspace to Launch the Visual Studio Code Luceedebug Extension
+
+At this moment, Lucee is already running providing your CFML generated content at `http://localhost:8888`, and the **Luceedebug.jar** is listening at localhost:9999, but the Visual Studio Code Editor doesn't know about it yet. The last step is to link the code base at `D:\luceedebug_example\lucee-express-5.4.6.9/webapps/ROOT` to the Visual Studio Code Luceedebug Extension and configure it to use the remote endpoint at localhost:9999 (Luceedebug.jar). This can typically be done within the workspace setting file. To achieve that, create a file named `lucee_debug_example.code-workspace` at `D:\luceedebug_example\lucee_debug_example.code-workspace` with the following content:
+
+On Windows:
+
+```json
+{
+ "folders": [
+ {
+ "path": "D:\\luceedebug_example\\lucee-express-5.4.6.9\\webapps\\ROOT"
+ }
+ ],
+ "launch": {
+ "version": "0.2.0",
+ "configurations": [
+
+
+ {
+ "type": "cfml",
+ "request": "attach",
+ "name": "Attach to Luceedebug Backend",
+ "hostName": "localhost",
+ "port": 10000,
+ "pathTransforms": []
+
+ }
+ ]
+ },
+ "settings": {
+ "files.exclude": {
+ "**/WEB-INF": true
+ }
+ }
+}
+```
+
+On Linux/MacOs:
+
+```json
+{
+ "folders": [
+ {
+ "path": "/opt/luceedebug_example/lucee-express-5.4.6.9/webapps/ROOT"
+ }
+ ],
+ "launch": {
+ "version": "0.2.0",
+ "configurations": [
+
+
+ {
+ "type": "cfml",
+ "request": "attach",
+ "name": "Attach to Luceedebug Backend",
+ "hostName": "localhost",
+ "port": 10000,
+ "pathTransforms": []
+
+ }
+ ]
+ },
+ "settings": {
+ "files.exclude": {
+ "**/WEB-INF": true
+ }
+ }
+}
+```
+
+#### Step 7: Running everything all together
+
+While the Tomcat Lucee instance is already running at `http://localhost:8888` (test it by browsing to it) and the Java Agent with luceedebug.jar is listening on localhost:9999, you can open the workspace by double-clicking the file at `D:\luceedebug_example\lucee_debug_example.code-workspace`. This should open your Visual Studio Code with Lucee's default application at `D:\luceedebug_example\lucee-express-5.4.6.9\webapps\ROOT\index.cfm`.
+
+Open that file within your Visual Studio Code for editing. Click the `Debug-Icon` in the navigation pane or press `SHIFT+CTRL+D`: this will start the Visual Studio Code Debugging Mode with all debugging panes populated by the Visual Studio Code Lucee Debug Extension.
+
+To start debugging just add a breakpoint somewhere in the code of index.cfm by right-clicking on the left side of a row number (e.g. index.cfm line 10). To start debugging: click on "Attach to Luceedebug Backend" in the top views or press F5 or go to the top menu und click on "Run" => "Start Debugging". Now load the page in your browser at `http://localhost:8888`. When the breakpoint is reached, Visual Studio Code will prompt you with all information gathered in the debugging views. Enjoy!
+
+### 4. Binding Luceedebug to a Webroot Outside Your VSCode Workplace With "pathTransforms"-Directive
+
+By default Luceedebug associates the folder set in your workplace as being also the directory deployed to the Lucee engine. In the simple example described above it's set to `D:\luceedebug_example\lucee-express-5.4.6.9\webapps\ROOT`.
+
+However, there are many times the CFML code base you are working locally witin your VSCode workplace won't match the directory served by Lucee: Imagine you are working locally on your CFML files, but you are deploying the files directly "onSave" via SSH or sFTP to a remote Lucee Development Server fully outside your VsCode Workplace. In this special cases you'll need to translate/adjust those remote paths used by Lucee to match the ones used by your Visual Studio Code workplace. Another example would be when using Docker-Container, when Lucee runs the cfml files internally with a different directory path. This is when the "pathTransforms"-directive might help you.
+
+In the following example we will configure Lucee to run cfml code outside your workplace and use `pathTransforms` to override the extensions default behaviour.
+
+#### Step 1: Create a Directory To Hold Your Deployed CFML files
+
+Create a directory named `mywebroot` at `D:\luceedebug_example\mywebroot\` and copy all your code base to that location to simulate a remote directory that differs from your workspace.
+
+#### Step 2: Configure Lucee To Serve Files From `D:\luceedebug_example\mywebroot\`
+
+Create a file named `ROOT.xml` at `D:\luceedebug_example\lucee-express-5.4.6.9\conf\Catalina\localhost\ROOT.xml` with the following content:
+
+On Windows:
+
+```xml
+
+```
+
+On Linux/MacOs:
+
+```xml
+
+```
+
+Then restart Lucee to the changes to take effect.
+
+#### Step 3: Configure Visual Studio Code Luceedebug Extension To Override Paths With pathTransforms-directive
+
+Edit your workplace setting file located at `D:\luceedebug_example\lucee_debug_example.code-workspace` and add the pathTransforms directive with `idePrefix` and `serverPrefix` to match the settings:
+
+On Windows:
+
+```json
+{
+ "folders": [
+ {
+ "path": "D:\\luceedebug_example\\lucee-express-5.4.6.9\\webapps\\ROOT"
+ }
+ ],
+ "launch": {
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "cfml",
+ "request": "attach",
+ "name": "Attach to Luceedebug Backend",
+ "hostName": "localhost",
+ "port": 10000,
+ "pathTransforms": [
+ {
+ "idePrefix": "D:\\luceedebug_example\\lucee-express-5.4.6.9\\webapps\\ROOT",
+ "serverPrefix": "D:\\luceedebug_example\\mywebroot"
+ }
+ ]
+ }
+ ]
+ },
+ "settings": {
+ "files.exclude": {
+ "**/WEB-INF": true
+ }
+ }
+}
+```
+
+On Linux/MacOs:
+
+```json
+{
+ "folders": [
+ {
+ "path": "/opt/luceedebug_example/lucee-express-5.4.6.9/webapps/ROOT"
+ }
+ ],
+ "launch": {
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "cfml",
+ "request": "attach",
+ "name": "Attach to Luceedebug Backend",
+ "hostName": "localhost",
+ "port": 10000,
+ "pathTransforms": [
+ {
+ "idePrefix": "/opt/luceedebug_example/lucee-express-5.4.6.9/webapps/ROOT",
+ "serverPrefix": "/opt/luceedebug_example/mywebroot"
+ }
+ ]
+ }
+ ]
+ },
+ "settings": {
+ "files.exclude": {
+ "**/WEB-INF": true
+ }
+ }
+}
+```
+
+Then restart Lucee to the changes to take effect. Reopen your VsCode for the extension to pick up the new settings and try setting breakpoints.
+
+### 5. Verifying the pathTransforms and breakpoint bindings
+
+If breakpoints aren't binding or pathTransforms directives are not being honoured, you can inspect what's going on using the "luceedebug: show class and breakpoint info" command. Surface this by typing "show class and breakpoint info" into the [command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette).
+
+For further detailed information please visit [https://github.com/softwareCobbler/luceedebug](https://github.com/softwareCobbler/luceedebug).
diff --git a/docs/05.categories/048.compat/category.md b/docs/05.categories/048.compat/category.md
new file mode 100644
index 000000000..fab55cdb2
--- /dev/null
+++ b/docs/05.categories/048.compat/category.md
@@ -0,0 +1,17 @@
+---
+title: Compatibility / Migration with other CFML engines
+id: category-compat
+categories:
+- category-core
+- core
+description: Whilst Lucee is broadly compatible with Adobe ColdFusion, there are some differences.
+menuTitle: Compatibility / Migration
+---
+
+Whilst Lucee is broadly compatible with Adobe ColdFusion, there are some differences.
+
+Some are for performance reasons, others due to Adobe mis-adopting or adding features whch conflict with Lucee additions to the language. Sometimes it's a trade off between being compatible and respecting our existing users.
+
+Our issue tracker has an [acf-compat](https://luceeserver.atlassian.net/issues/?jql=labels%20%3D%20%22acf-compat%22) label which tracks all the known differences.
+
+In addition, with Lucee 6, we decided to change some incompatible implementations and also change some older insecure defaults to be more secure, please refer to the following epic [All Breaking changes in Lucee 6](https://luceeserver.atlassian.net/browse/LDEV-4534)
diff --git a/docs/05.categories/293.s3/category.md b/docs/05.categories/293.s3/category.md
index 88cd7769b..ec1e05574 100644
--- a/docs/05.categories/293.s3/category.md
+++ b/docs/05.categories/293.s3/category.md
@@ -11,7 +11,7 @@ menuTitle: S3
Lucee S3 Extension Source Code
-The s3* functions listed below are optimised for use with S3, while you can use the file* functions, these S3 specfic functions will perform better and may expose additional S3 specific functionality.
+The s3* functions listed below are optimised for use with S3, while you can use the file* functions, these S3 specific functions will perform better and may expose additional S3 specific functionality.
Open Issues: [https://luceeserver.atlassian.net](https://luceeserver.atlassian.net/issues/?jql=labels%20%3D%20%22s3%22)
diff --git a/docs/_images/extension/websocket/lucee-admin-extension.png b/docs/_images/extension/websocket/lucee-admin-extension.png
new file mode 100644
index 000000000..246680a67
Binary files /dev/null and b/docs/_images/extension/websocket/lucee-admin-extension.png differ
diff --git a/docs/_images/extension/websocket/websocket-lex.png b/docs/_images/extension/websocket/websocket-lex.png
new file mode 100644
index 000000000..5d1ed178a
Binary files /dev/null and b/docs/_images/extension/websocket/websocket-lex.png differ
diff --git a/docs/_images/extension/websocket/websocketInfo.png b/docs/_images/extension/websocket/websocketInfo.png
new file mode 100644
index 000000000..983536635
Binary files /dev/null and b/docs/_images/extension/websocket/websocketInfo.png differ
diff --git a/docs/download/page.md b/docs/download/page.md
index a90059825..35ad61d9a 100644
--- a/docs/download/page.md
+++ b/docs/download/page.md
@@ -10,7 +10,7 @@ Lucee downloads are all available at [download.lucee.org](https://download.lucee
## Lucee Documentation
-The documentation is available for offline browsing as a [zip file](lucee-docs.zip) and also as a docset for [Dash](https://kapeli.com/dash)/[Zealdocs](http://zealdocs.org/).
+The documentation is available for offline browsing as a [zip file](lucee-docs.zip)
## Lucee Dictionaries
@@ -21,11 +21,3 @@ Lucee dictionaries are available for download to support spell checking your cod
[Download .json dictionary](/dictionaries/lucee.json)
-
-## Dash / Zeal Documentation install
-
-You can add the Lucee documentation to your Dash or Zealdocs install by adding the following feed:
-
-[https://docs.lucee.org/dash/lucee.xml](https://docs.lucee.org/dash/lucee.xml)
-
-Our build process should keep this up to date so that you won't miss all the awesome community contributions that make their way into the docs!
diff --git a/docs/recipes/README.md b/docs/recipes/README.md
new file mode 100644
index 000000000..e5e35709d
--- /dev/null
+++ b/docs/recipes/README.md
@@ -0,0 +1,285 @@
+# Recipes
+
+## [Application Context update](/docs/recipes/application-context-update.md)
+
+How to update your Application settings, after they have been defined in Application.cfc.
+
+## [Archives - Creating and deploying Lucee Archives (.lar files)](/docs/recipes/archives-creating-and-deploy.md)
+
+This document explains how to deploy an Application on a live server without using a single CFML file.
+
+## [Basic Date - Output the current date](/docs/recipes/basic-date.md)
+
+Learn how to output the current date in Lucee.
+
+## [Cache a Query for the current request](/docs/recipes/cached-within-request.md)
+
+Cache a Query for the current request in Lucee.
+
+## [Caches defined in Application.cfc](/docs/recipes/caches-defined-in-application-cfc.md)
+
+How to add per-application caches via Application.cfc in Lucee.
+
+## [Check for changes in your configuration file automatically](/docs/recipes/check-for-changes.md)
+
+Automatically check for changes in your configuration file with Lucee.
+
+## [Checksum](/docs/recipes/checksum.md)
+
+This document explains how to use a checksum in Lucee.
+
+## [Configure Lucee within your application](/docs/recipes/configuration-administrator-cfc.md)
+
+How to configure Lucee within your application using Administrator.cfc and cfadmin tag.
+
+## [Convert a CFML Function/Component to use in Java](/docs/recipes/convert-a-cfml-func-to-java.md)
+
+Learn how to convert user-defined functions or components in Lucee to use them in Java. This guide demonstrates how to define components to implement Java interfaces, pass components to Java methods, explicitly define interfaces, and use the onMissingMethod feature. It also shows how to convert user-defined functions to Java lambdas.
+
+## [Datasource - How to define them](/docs/recipes/datasource-how-to-define-them.md)
+
+How to define a Datasource in Lucee.
+
+## [onBuild Function in Server.cfc (supported since Lucee 6.1.1)](/docs/recipes/docker-onbuild.md)
+
+The onBuild function in Server.cfc is used for tasks during the build phase in Lucee, particularly useful in Docker environments.
+
+## [Docker Information](/docs/recipes/docker.md)
+
+Guide on using and running Lucee with Docker
+
+## [Encryption/Decryption](/docs/recipes/encryption_decryption.md)
+
+This document explains about Encryption/Decryption with public and private keys with simple examples.
+
+## [Environment Variables / System Properties for Lucee](/docs/recipes/environment-variables-system-properties.md)
+
+This document gives you an overview over all Environment Variables an System Properties you can set for Lucee.
+
+## [Custom Event Gateways](/docs/recipes/event-gateway-create.md)
+
+Here you will find a short introduction into writing your own Event Gateway type.
+
+## [Event Handling in Application.cfc](/docs/recipes/event-gateway-in-app-cfc.md)
+
+An overview of event handling functions in Application.cfc for Lucee.
+
+## [Event Gateway - How they work?](/docs/recipes/event-gateways-how-they-work.md)
+
+Overview of how Event Gateways work in Lucee.
+
+## [Event Gateways](/docs/recipes/event-gateways.md)
+
+EG's are another way how to communicate with your Lucee server and are kind of a service running on Lucee, reacting on certain events.
+
+## [Event Handling in Application.cfc](/docs/recipes/event-handling-in-app-cfc.md)
+
+An overview of event handling functions in Application.cfc for Lucee.
+
+## [Exception - Cause](/docs/recipes/exception-cause.md)
+
+Lucee 6.1 improves its support for exception causes, providing better debugging and error handling capabilities.
+
+## [Exceptions Output](/docs/recipes/exception-output.md)
+
+How to catch and display exceptions.
+
+## [Extension Installation](/docs/recipes/extension-installation.md)
+
+A comprehensive guide on how to install extensions in Lucee.
+
+## [Externalize strings](/docs/recipes/externalizing-strings.md)
+
+Externalize strings from generated class files to separate files. This method is used to reduce the memory of the static contents for templates.
+
+## [File Extensions](/docs/recipes/file-extensions.md)
+
+Learn about the different file extensions supported by Lucee, including .cfm, .cfc, .cfml, and .cfs. This guide provides examples for each type of file.
+
+## [File system - Mappings](/docs/recipes/filesystem-mapping.md)
+
+Overview of different mapping types in the file system.
+
+## [Function Listeners](/docs/recipes/function-listeners.md)
+
+This document explains how to use a Function Listeners in Lucee.
+
+## [Function SystemOutput](/docs/recipes/function-systemoutput.md)
+
+This document explains the systemoutput function with some simple examples.
+
+## [Get Datasource Drivers Directly from Maven](/docs/recipes/get-dbdriver-from-maven.md)
+
+Learn how to get datasource drivers directly from Maven.
+
+## [Global Proxy](/docs/recipes/global-proxy.md)
+
+Learn how to define a global proxy in Lucee. This guide demonstrates how to set up a global proxy in the Application.cfc file, limit the proxy to specific hosts, and exclude specific hosts from using the proxy.
+
+## [Hidden Gems](/docs/recipes/hidden-gems.md)
+
+This document explains how to declare variables, function calls with dot and bracket notation, and passing arguments via URL/form scopes as an array.
+
+## [Import](/docs/recipes/import.md)
+
+Guide on using import to import components and custom tags in Lucee
+
+## [Inline Component](/docs/recipes/inline-components.md)
+
+Learn how to create and use inline components in Lucee. This guide demonstrates how to define components directly within your CFML code, making it easier to create and use components without needing a separate .cfc file. Examples include creating an inline component and using it similarly to closures.
+
+## [Java - Explicit Casting of a Component to a Specific Interface](/docs/recipes/java-explicit-casting.md)
+
+Shows how to explicitly cast a component to a specific interface.
+
+## [Java in Functions and Closures](/docs/recipes/java-in-functions-and-closures.md)
+
+Learn how to write CFML code directly in a function or a closure with Java types in Lucee. This guide demonstrates how to define functions and components with Java types, and how to use Java lambda functions within Lucee. You will see examples of how to handle exceptions, define return types, and implement functional Java interfaces (Lambdas) seamlessly.
+
+## [Java Settings in Application.cfc](/docs/recipes/java-settings.md)
+
+Guide on configuring Java settings in Lucee using Application.cfc
+
+## [Lazy Queries](/docs/recipes/lazy-queries.md)
+
+How to use lazy queries
+
+## [List existing Cache Connections](/docs/recipes/list-existing-cache-conn.md)
+
+List existing Cache Connections available in Lucee.
+
+## [Loop Labels](/docs/recipes/loop-labels.md)
+
+Lucee supports labels for all loop tags and statements, allowing you to control the flow of nested loops more precisely.
+
+## [Looping Through File](/docs/recipes/loop-through-files.md)
+
+This document explains how to handle big files in Lucee in a better way.
+
+## [Mail - How to send a Mail](/docs/recipes/mail-how-to-send-a-mail.md)
+
+How to send an email using Lucee wth help of the tag cfmail.
+
+## [Mail Listeners](/docs/recipes/mail-listener.md)
+
+Learn how to define mail listeners in Lucee. This guide demonstrates how to set up global mail listeners in the Application.cfc file to listen to or manipulate every mail executed. Examples include defining listeners directly in Application.cfc and using a component as a mail listener.
+
+## [Mappings - How to define a regular Mapping](/docs/recipes/mappings-how-to-define-a-reg-mapping.md)
+
+All about the different mappings in Lucee and how to use them.
+
+## [Mathematical Precision](/docs/recipes/mathematical-precision.md)
+
+Learn about the switch from double to BigDecimal in Lucee 6 for more precise mathematical operations. This guide provides information on how to change the default behavior if needed.
+
+## [Monitoring/Debugging](/docs/recipes/monitoring-debugging.md)
+
+Learn about the changes in Lucee 6.1 regarding Monitoring and Debugging. Understand the old and new behavior, and how to configure the settings in Lucee Admin and Application.cfc.
+
+## [Monitoring - Enable for your session](/docs/recipes/monitoring-enable-for-your-session.md)
+
+Shows you a way to enable Monitoring for your session
+
+## [Null Support](/docs/recipes/null-support.md)
+
+This document explains how to set null support in the Lucee server admin, assigning `null` value for a variable and how to use `null` and `nullvalue`.
+
+## [PDF Engine - Flying Saucer (CFDocument)](/docs/recipes/pdf-engine-flying-saucer.md)
+
+The new CFDOCUMENT PDF engine, Flying Saucer in Lucee 5.3
+
+## [Precompiled Code](/docs/recipes/precompiled-code.md)
+
+How to pre-compile code for a production server while the source code is deployed to avoid compilation on the production server for security reasons.
+
+## [Query Async](/docs/recipes/query-async.md)
+
+Learn how to execute queries asynchronously in Lucee. This guide demonstrates how to set up asynchronous query execution using a simple flag. Examples include defining async execution for queries and using local listeners to handle exceptions. Additionally, function listeners introduced in Lucee 6.1 can be used for this purpose.
+
+## [Query Handling in Lucee](/docs/recipes/query-handling.md)
+
+How to do SQL Queries with Lucee.
+
+## [Query Indexes](/docs/recipes/query-indexes.md)
+
+Learn how to set and use indexes for query results in Lucee. This guide demonstrates how to define a query with an index and access parts of the query using the index.
+
+## [Query Listeners](/docs/recipes/query-listener.md)
+
+Learn how to define query listeners in Lucee. This guide demonstrates how to set up global query listeners in the Application.cfc file to listen to or manipulate every query executed. Examples include defining listeners directly in Application.cfc and using a component as a query listener.
+
+## [Query of Queries (QoQ)](/docs/recipes/query-of-queries.md)
+
+Query of queries (QoQ) is a technique for re-querying an existing (in memory) query without another trip to the database.
+
+## [Query of Queries sometimes it rocks, sometimes it sucks](/docs/recipes/query-of-query-sometime.md)
+
+This document explains why Query of Queries (QoQ) may or may not be the best approach for your use case.
+
+## [Query return type](/docs/recipes/query-return-type.md)
+
+This document explains the different return types for a query with some examples.
+
+## [Read XML with a listener Model (SAX)](/docs/recipes/read-xml-with-a-listener-model-sax.md)
+
+Lucee not only allows you to convert an XML file to an object tree (DOM) but also supports an event-driven model (SAX).
+
+## [Request Timeout](/docs/recipes/request-timeout.md)
+
+Learn how to use request timeout correctly with Lucee.
+
+## [Retry](/docs/recipes/retry.md)
+
+This document explains how to use retry functionality with some simple examples.
+
+## [Script Templates](/docs/recipes/script-templates.md)
+
+Learn about script templates in Lucee. This guide explains how Lucee supports templates with the `.cfs` extension, allowing you to write direct script code without the need for the `` tag.
+
+## [Startup Listeners - Server.cfc and Web.cfc](/docs/recipes/startup-listeners-code.md)
+
+Lucee supports two types of Startup Listeners: Server.cfc and Web.cfc.
+
+## [Static scope in components](/docs/recipes/static-scope-in-components.md)
+
+Static scope in components is needed to create an instance of cfc and call its method.
+
+## [Sub Component](/docs/recipes/sub-components.md)
+
+Learn how to create and use sub components in Lucee. This guide demonstrates how to define additional components within a .cfc file, making it easier to organize related components. Examples include creating a main component with sub components, and how to address/load these sub components.
+
+## [Supercharge your website](/docs/recipes/supercharge-your-website.md)
+
+This document explains how you can improve the performance of your website in a very short time with Lucee.
+
+## [Thread Task](/docs/recipes/thread-task.md)
+
+How to use Thread Tasks
+
+## [Thread Usage](/docs/recipes/thread-usage.md)
+
+How to use threads in Lucee
+
+## [Timeout](/docs/recipes/timeout.md)
+
+Learn how to use the tag in Lucee. This guide demonstrates how to define a timeout specific to a code block, handle timeouts with a listener, and handle errors within the timeout block.
+
+## [Types in Lucee](/docs/recipes/types-in-lucee.md)
+
+This document explains types in Lucee. Lucee is still an untyped language. Types are only a check put on top of the language.
+
+## [Using S3 directly for source code](/docs/recipes/using-s3-directly-for-source-code.md)
+
+Using S3 directly for source code
+
+## [Virtual File Systems](/docs/recipes/virtual-file-system.md)
+
+Lucee supports the following virtual file systems: ram, file, s3, http, https, zip, and tar.
+
+## [WebSocket Extension](/docs/recipes/websocket-extension.md)
+
+How to install, congigure and create WebSockets
+
+## [XML Fast And Easy, using SAX - Listener Functions](/docs/recipes/xml-fast-and-easy.md)
+
+This document explains how to use XML parsing in Lucee.
\ No newline at end of file
diff --git a/docs/recipes/application-context-update.md b/docs/recipes/application-context-update.md
new file mode 100644
index 000000000..0eb9174dc
--- /dev/null
+++ b/docs/recipes/application-context-update.md
@@ -0,0 +1,49 @@
+
+
+# Application Context update
+
+Lucee allows you to update the existing application context, **per request** as defined for example in [cookbook-application-context-basic].
+
+This does not affect any other request, you are only changing the application settings for the current request.
+
+For example, add a per-application mapping:
+
+```lucee
+
+
+```
+
+This example doesn't extend the existing application mappings with this new one, it replaces them. So when you plan to add a mapping, it's best to first read the existing mappings with help of the function [function-getApplicationSettings] and update these mappings as follows:
+
+```lucee
+
+
+
+
+
+
+
+
+```
+
+Of course, it's not only mappings you can update. [tag-application] lets you update all the settings you can do in the Application.cfc!
diff --git a/docs/recipes/archives-creating-and-deploy.md b/docs/recipes/archives-creating-and-deploy.md
new file mode 100644
index 000000000..d9d55c76d
--- /dev/null
+++ b/docs/recipes/archives-creating-and-deploy.md
@@ -0,0 +1,90 @@
+
+
+# Archives - Creating and deploying Lucee Archives (.lar files)
+
+This document explains how to deploy an Application on a live server without using a single CFML file.
+
+## Using CFC file
+
+```lucee
+//placed under outside root/component/org/lucee/examples/deploy/Test.cfc
+
+component test {
+ function salve() {
+ return "Hi There"
+ }
+}
+
+```
+
+You will need to add a mapping for the above CFC, because it's not inside the Root folder.
+
+Create component mapping in **Archives & Resources -> Component**.
+
+Create a mapping for test.cfc as shown below:
+
+```
+name: mycfc
+resource: **Full folder path**/component/
+```
+
+After creating the mapping, you need to create an archive file for the CFC.
+
+- Go to the detail view of mycfc mapping page,
+- Click the button **assign archive to mapping**.
+
+An archive (lar file) is created automatically and saved in `WEB-INF/lucee/context/archives`.
+
+Now you can see the archive path on the mycfc mapping.
+
+## Using CFM file
+
+Create a mapping for the below CFM file:
+
+```lucee
+//placed under /ROOT/test/deploy/index.cfm
+
+test = new org.lucee.examples.deploy.Test();
+dump(test.salve());
+
+```
+
+```
+name: /deploy
+resource: ROOT/test/deploy/index.cfm
+```
+
+After creating the mapping in the Administrator, you can create an archive file by clicking **assign archive to mapping**.
+
+Now you can see both lar files in the `WEB-INF/lucee/context/archives` folder:
+
+- One is `lucee/context/archives/xxx-deploy.lar` file,
+- Another one is `lucee/context/archives/xxx-mycfc.lar`
+
+Now you can place the archive files on your target server.
+
+Copy the archive files (deploy.lar, mycfc.lar) and place them in the target server's `/WEB-INF/lucee/deploy` folder. Wait for a minute, and it will successfully deploy your archives into the server.
+
+You can now view mappings in the admin.
+
+## Footnotes
+
+Here you can see the above details in a video:
+
+[Lucee Deploy Archive file](https://www.youtube.com/watch?time_continue=473&v=E9Z0KvspBAY)
diff --git a/docs/recipes/basic-date.md b/docs/recipes/basic-date.md
new file mode 100644
index 000000000..4e26da217
--- /dev/null
+++ b/docs/recipes/basic-date.md
@@ -0,0 +1,38 @@
+
+
+# Basic Date - Output the current date
+
+The following examples show you how to output the current date.
+
+```run
+
+
The time is #lsdateTimeFormat(now())#
+
+```
+
+The tag `` defines for the compiler that everything within a `##` is a code expression and needs to be parsed accordingly. the function `now()` is a function call that returns a date object containing the current time. [function-lsDateTimeFormat] then converts that date to a string using locale-specific formatting rules (default en_US).
+
+You can configure a different locale globally in the Lucee admin under "Settings/Regional".
+
+You can then configure a different locale for the current request in the Application.cfc file (for example: `this.locale="de_CH"`) or with the help of the function [function-setLocale] or as an argument of the function call itself as follows:
+
+```run
+
+
The time is #lsDateTimeFormat(date:now(),locale:'de_CH')#
+
+```
diff --git a/docs/recipes/cached-within-request.md b/docs/recipes/cached-within-request.md
new file mode 100644
index 000000000..caf6db077
--- /dev/null
+++ b/docs/recipes/cached-within-request.md
@@ -0,0 +1,45 @@
+
+
+# Cache a Query for the current request
+
+Perhaps you're familiar with the "cachedwithin" attribute of the tag [tag-query], which is normally used as follows:
+
+```coldfusion
+
+ select * from whatever where whatsoever='#whatsoever#'
+
+```
+
+This caches the query result for ALL users for one second. This is sometimes used to cache a query for the current request because usually most requests are completed in less than a second.
+
+The problem is that this cache applies to all requests and that's more complicated for Lucee, meaning unnecessary overhead on the system.
+
+Request query caching is a simple solution to this problem. Replace the timespan defined in the "cachedWithin" attribute with the value "request":
+
+```coldfusion
+
+ select * from whatever where whatsoever='#whatsoever#'
+
+```
+
+Then the query is cached for only the current request, independent of how long the request takes!
diff --git a/docs/recipes/caches-defined-in-application-cfc.md b/docs/recipes/caches-defined-in-application-cfc.md
new file mode 100644
index 000000000..7eb284524
--- /dev/null
+++ b/docs/recipes/caches-defined-in-application-cfc.md
@@ -0,0 +1,84 @@
+
+
+# Caches defined in Application.cfc
+
+It is possible to add cache connections in Lucee 5.1+ on a per-application basis by adding configuration to your `Application.cfc`. You can also select the default object cache, query cache, function cache, etc. Note if these caches use an extension that provides the cache driver, the extension must be installed already.
+
+To declare cache connections, create a struct called `this.cache.connections` in the pseudo constructor of your `Application.cfc`. Each key in the struct will be the name of the cache connection to create, and the value of the item will be another struct defining the properties of that cache connection.
+
+```lucee
+this.cache.connections["myCache"] = {
+ class: 'org.lucee.extension.cache.eh.EHCache',
+ bundleName: 'ehcache.extension',
+ bundleVersion: '2.10.0.25',
+ storage: false,
+ custom: {
+ "bootstrapAsynchronously":"true",
+ "replicatePuts":"true",
+ etc...
+ },
+ default: 'object'
+};
+```
+
+Note, there is a shortcut for `this.cache.connections["myCache"] = {}` and that is `this.cache["myCache"] = {}`. We support both since the latter is closer to how datasources are defined.
+
+## Generating Cache Connection code
+
+The easiest way to generate the code block above is to follow these steps:
+
+1. Start up a Lucee server
+2. Create the cache you want via the web admin
+3. Edit the cache and scroll to the bottom
+4. Copy the code snippet that appears directly into your `Application.cfc`
+
+## Cache metadata
+
+Let's take a look at some of the keys used to define a cache connection.
+
+- **class** - This is the Java class of the driver for the cache engine.
+- **bundleName** - Optional. The name of the OSGI bundle to load the `class` from.
+- **bundleVersion** - Optional. The version of the OSGI bundle to load the `class` from.
+- **storage** - A boolean that flags whether this cache can be used for client or session storage.
+- **custom** - A struct of key/value pairs for configuring the cache. This struct is entirely dependent on the cache driver in use, so refer to the docs for that cache driver to see the possible values. Note, some of these custom values might be required for some cache drivers to work.
+- **default** - Optional. If you want this cache to be used as a default cache, then give this one of these values: `function`, `object`, `template`, `query`, `resource`, `include`, `http`, `file`, `webservice`.
+
+## Default Caches
+
+When declaring a cache, you can make it the default cache for creation operations, but it is also possible to configure the default caches for each operation all at once in your `Application.cfc` like so:
+
+```lucee
+this.cache.object = "myCache";
+this.cache.template = "AnotherCache";
+this.cache.query = "yetAnother";
+this.cache.resource = "";
+this.cache.function = "";
+this.cache.include = "";
+this.cache.http = "";
+this.cache.file = "";
+this.cache.webservice = "";
+```
+
+A single cache can only be the default storage location for a single operation at a time. For example, a cache named "myCache" cannot both be the default cache for objects as well as queries.
diff --git a/docs/recipes/check-for-changes.md b/docs/recipes/check-for-changes.md
new file mode 100644
index 000000000..50bbd0483
--- /dev/null
+++ b/docs/recipes/check-for-changes.md
@@ -0,0 +1,55 @@
+
+
+# Check for changes in your configuration file automatically
+
+Lucee can automatically check for changes in your configuration files from the complete server or a single web context.
+
+This is useful if you are doing scripted deploys and/or synchronization from, for example, a master instance to many slave instances of Lucee.
+
+## Check for Changes in ALL the contexts
+
+To enable this for a whole Lucee server, find the Lucee server XML file in:
+
+ /lib/ext/lucee-server/context/lucee-server.xml
+
+At the top of this file, you should see something along the lines of:
+
+
+
+Now it's simple to add the following:
+
+
+
+Now that you have made the change, you can either restart Lucee server from the administrator at:
+
+ http://localhost:8888/lucee/admin/server.cfm?action=services.restart
+
+Or actually make any change in the Server Admin for the configuration to be picked up. This should now allow it to pick up any changes you have written to the lucee-server.xml file.
+
+## Check for changes in an individual context
+
+If you only want an individual context to check for changes, you can do the same configuration but you would have to go to:
+
+ /WEB-INF/lucee/lucee-web.xml.cfm
+
+And add the same changes from above:
+
+
+
+Lucee will now check for any changes in the Lucee configuration files every minute, and if there is a change, reload it and enable those changes.
+
+A very handy little feature for those automated deployments!
diff --git a/docs/recipes/checksum.md b/docs/recipes/checksum.md
new file mode 100644
index 000000000..b16e1ebf4
--- /dev/null
+++ b/docs/recipes/checksum.md
@@ -0,0 +1,149 @@
+
+
+# Checksum
+
+This document explains how to use a checksum in Lucee.
+
+Many servers provide a checksum for the files they provide for download. We use the checksum to validate a download file in order to avoid a corrupted file.
+
+If you download a file in your application, you can automatically check if the download is valid or not if the necessary info was provided in the response header.
+
+## Example 1
+
+```luceescript
+
+_url="http://central.maven.org/maven2/org/lucee/esapi/2.1.0.1/esapi-2.1.0.1.jar";
+http url=_url result="res";
+if(res.status_code!=200) throw "wtf";
+dump(res.responseheader);
+
+// store the file
+localFile="esapi-2.1.0.1.jar";
+fileWrite(localFile,res.fileContent);
+
+// get a hash
+dump(fileInfo(localFile));
+dump(hash(fileReadBinary(localFile),"md5"));
+dump(hash(fileReadBinary(localFile),"SHA1"));
+
+
+// validate file
+if(!isEmpty(res.responseheader["X-Checksum-MD5"]?:"")) {
+fi=fileInfo("esapi-2.1.0.1.jar");
+if(res.responseheader["X-Checksum-MD5"]==fi.checksum) {
+dump("we have a match!");
+}
+else {
+fileDelete("esapi-2.1.0.1.jar");
+dump("something went wrong! give it another try?");
+}
+}
+
+```
+
+- Download the jar file by using cfhttp.
+- Dump the file response header. You can see the "X-Checksum-MD5" "X-Checksum-SHA1" keys from the file itself.
+- Save the file, and dump(fileInfo(localFile.checksum)). Check to see if the dump matches the value of the downloaded file response["X-Checksum-MD5"] header.
+
+Checksum values are hashed from the binaryfile itself.
+
+```luceescript
+dump(hash(fileReadBinary(localFile),"md5"));
+dump(hash(fileReadBinary(localFile),"SHA1"));
+```
+
+You can validate the checksum as shown below:
+
+```luceescript
+// validate file
+if(!isEmpty(res.responseheader["X-Checksum-MD5"]?:"")) {
+fi=fileInfo("esapi-2.1.0.1.jar");
+if(res.responseheader["X-Checksum-MD5"]==fi.checksum) {
+dump("we have a match!");
+}
+else {
+fileDelete("esapi-2.1.0.1.jar");
+dump("something went wrong! give it another try?");
+}
+}
+```
+
+If the checksum is provided, we can check it. However, the checksum may not always be provided. The following example shows how to provide a checksum for all downloads.
+
+## Example 2
+
+//download.cfm
+
+```luceescript
+
+fi=fileInfo("esapi-2.1.0.1.jar");
+header name="Content-MD5" value=fi.checksum;
+content file="esapi-2.1.0.1.jar" type="application/x-zip-compressed";
+
+```
+
+This code allows a downloading application to check if the download was successful or not. Adding the file with header content "Content-MD5" is not required.
+
+Download the file using the below example code:
+
+```luceescript
+
+// possible MD5 headers
+HEADER_NAMES.SHA1=["Content-SHA1","X-Checksum-SHA1"];
+HEADER_NAMES.MD5=["Content-MD5","X-Checksum-MD5"]; // ETag
+_url=getDirectoryFromPath(cgi.request_url)&"/_download.cfm";
+
+http url=_url result="res";
+if(res.status_code!=200) throw "wtf";
+
+// store the file
+fileWrite("clone.jar",res.fileContent);
+
+// see if we have one of the MD5 headers
+checksum={type:"",name:""};
+loop label="outer" struct=HEADER_NAMES index="type" item="names" {
+loop array=names item="name" {
+if(structKeyExists(res.responseheader,name)) {
+checksum.type=type;
+checksum.name=name;
+checksum.value=res.responseheader[name];
+break outer;
+}
+}
+}
+dump(checksum);
+
+// validate file
+if(!isEmpty(checksum.name)) {
+cs=hash(fileReadBinary("clone.jar"),checksum.type);
+//dump(checksum);
+if(checksum.value==cs) {
+dump("we have a match!");
+}
+else {
+fileDelete("clone.jar");
+dump("something went wrong! give it another try?");
+}
+}
+
+```
+
+The above code checks and validates the downloaded file.
+
+## Footnotes
+
+You can see the details in this video:
+[Checksum](https://www.youtube.com/watch?v=Kb_zSsRDEOg)
diff --git a/docs/recipes/configuration-administrator-cfc.md b/docs/recipes/configuration-administrator-cfc.md
new file mode 100644
index 000000000..36312839c
--- /dev/null
+++ b/docs/recipes/configuration-administrator-cfc.md
@@ -0,0 +1,35 @@
+
+
+# Configure Lucee within your application
+
+Lucee provides a web frontend to configure the server and each web context, but you can also do this configuration from within your application.
+(For per request settings, please check out the "Application.cfc" section in the [Cookbook](/guides/cookbooks.html)).
+
+## Administrator.cfc
+
+Lucee provides the component "Administrator.cfc" in the package "org.lucee.cfml", a package auto imported in any template, so you can simply use that component as follows:
+
+```cfs
+admin = new Administrator("web", "myPassword"); // first argument is the admin type you want to load (web|server), second is the password for the Administrator
+dump(admin); // show me the doc for the component
+admin.updateCharset(resourceCharset: "UTF-8"); // set the resource charset
+```
+
+## cfadmin Tag
+
+The component "Administrator" is far from being feature complete, so if you miss a functionality, best consult the unofficial tag "cfadmin" (undocumented) and check out how this tag is used inside the [Lucee Administrator](https://github.com/lucee/Lucee/blob/5.2/core/src/main/java/resource/component/org/lucee/cfml/Administrator.cfc).
+Of course, it would be great if you could contribute your addition to the "Administrator" component.
diff --git a/docs/recipes/convert-a-cfml-func-to-java.md b/docs/recipes/convert-a-cfml-func-to-java.md
new file mode 100644
index 000000000..c3eda0c5c
--- /dev/null
+++ b/docs/recipes/convert-a-cfml-func-to-java.md
@@ -0,0 +1,80 @@
+
+
+# Convert a CFML Function/Component to use in Java
+
+Lucee allows you to convert user-defined functions or components so you can use them in Java.
+
+## Component to Java Class
+
+You simply add all functions defined for a Java interface to a component like this:
+
+```lucee
+// Component that implements all methods from interface CharSequence
+component {
+ function init(String str) {
+ variables.str = reverse(arguments.str);
+ }
+ function length() {
+ SystemOutput("MyString.length:" & str.length(), 1, 1);
+ return str.length();
+ }
+ // ... more functions here
+}
+```
+
+### Pass to Java
+
+Then you can pass that component to a Java method needing a specific interface/class.
+
+```lucee
+// This class has a method that takes as an argument a CharSequence.
+// This way we can force Lucee to convert/wrap our component to that interface.
+HashUtil = createObject("java", "lucee.commons.digest.HashUtil");
+
+// This component implements all necessary functions for the CharSequence
+cfc = new MyString("Susi Sorglos");
+
+// Calling the method HashUtil.create64BitHashAsString(CharSequence cs) with our component as an argument
+hash = HashUtil.create64BitHashAsString(cfc);
+dump(hash);
+```
+
+### Explicit Definition and "onMissingMethod"
+
+Of course, you can also define the interface you want to implement explicitly and you can use โonMissingMethodโ so you do not have to implement every single function separately.
+
+```lucee
+component implementsJava="java.util.List" {
+ function onMissingMethod(name, args) {
+ if (name == "size") return 10;
+ throw "method #name# is not supported!";
+ }
+}
+```
+
+## User-Defined Function to Java (as Lambda)
+
+Functions get converted to a Lambda interface when the interface matches automatically. You can do the same with regular functions, but here the conversion happens when passing to Java.
+
+```lucee
+numeric function echoInt(numeric i) {
+ if (i == 1) throw "Test output!!!";
+ return i * 2;
+}
+```
diff --git a/docs/recipes/datasource-how-to-define-them.md b/docs/recipes/datasource-how-to-define-them.md
new file mode 100644
index 000000000..00f3a7adb
--- /dev/null
+++ b/docs/recipes/datasource-how-to-define-them.md
@@ -0,0 +1,89 @@
+
+
+# Datasource - How to define them
+
+To execute queries, you need a datasource definition, which points to a specific local or remote datasource. There are different ways to do so.
+
+## Create a Datasource in the Administrator
+
+The most common way to define a datasource is in the Lucee Server or Web Administrator. The only difference between the Web and Server Administrator is that datasources defined in the Server Administrator are visible to all web contexts, while datasources defined in the Web Administrator are only visible to the current web context.
+
+In your Administrator, go to the Page "Services/Datasource", in the section "create new Datasource" choose a name for your datasource and the type of your Datasource, for example "MySQL".
+
+![create datasource](https://bitbucket.org/repo/rX87Rq/images/3802808059-createds.png)
+
+On the following page, you can define settings to connect to your datasource. The look and feel of this page depend on the datasource type used. After saving this page, you get back to the overview page and you will get feedback if Lucee was able to connect to your datasource or not.
+
+## Create a Datasource in the Application.cfc
+
+You cannot only define a datasource in the Lucee Administrator, you can also do this in the [cookbook-application-context-basic]. The easiest way to do so is to create a datasource in the Administrator (see above) and then go to the detail view of this datasource by clicking the "edit button".
+
+![select datasource](https://bitbucket.org/repo/rX87Rq/images/4142224660-select-datasource.png)
+
+At the bottom of the detail page, you find a box that will look like this:
+
+![datasource application definition](https://bitbucket.org/repo/rX87Rq/images/1656402808-datasource-app-def.png)
+
+You can simply copy the code inside the box to your [cookbook-application-context-basic] body, and Lucee will pick up this definition. After that, you can delete the datasource from the Administrator.
+
+```cfs
+this.datasources["myds"] = {
+ class: 'org.gjt.mm.mysql.Driver',
+ connectionString: 'jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=true',
+ username: 'root',
+ password: 'encrypted:5120611ea34c6123fd85120a0c27ab23fd81ea34cb854'
+};
+```
+
+Alternatively, you can also use this pattern:
+
+```cfs
+this.datasources["myds"] = {
+ type: 'mysql',
+ host: 'localhost',
+ database: 'test',
+ port: 3306,
+ username: 'root',
+ password: 'encrypted:5120611ea34c6123fd85120a0c27ab23fd81ea34cb854',
+ connectionLimit: -1,
+ connectionTimeout: 1,
+ blob: false,
+ clob: false,
+ storage: false,
+ timezone: 'CET',
+ custom: {useUnicode: true, characterEncoding: 'UTF-8'}
+};
+```
+
+### Default Datasource
+
+With the [cookbook-application-context-basic], you can also define a default datasource that is used if no "datasource" attribute is defined with the tag cfquery, cfstoredproc, cfinsert, cfupdate, etc. Simply do the following:
+
+```cfs
+this.defaultdatasource = "myds";
+```
+
+In that case, the datasource "myds" is used if there is no datasource defined. Instead of defining a datasource name, you can also define the datasource directly as follows:
+
+```cfs
+this.datasource = {
+ class: 'org.gjt.mm.mysql.Driver',
+ connectionString: 'jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=true',
+ username: 'root',
+ password: 'encrypted:5120611ea34c6123fd85120a0c27ab23fd81ea34cb854'
+};
+```
diff --git a/docs/recipes/docker-onbuild.md b/docs/recipes/docker-onbuild.md
new file mode 100644
index 000000000..097286d45
--- /dev/null
+++ b/docs/recipes/docker-onbuild.md
@@ -0,0 +1,112 @@
+
+
+# onBuild Function in Server.cfc (supported since Lucee 6.1.1)
+
+The `onBuild` function in `Server.cfc` is designed for executing specific tasks during the build phase of a Lucee server, which is particularly useful in Docker environments. This function allows you to automate various setup tasks that need to be completed when building your Lucee server image.
+
+## Understanding Server.cfc
+
+`Server.cfc` is a component that can be created in the `lucee-server\context\context` directory. It contains lifecycle event functions that are triggered during the startup of the Lucee server. The `onBuild` function within this component is called when you start Lucee with specific flags or environment variables indicating a build phase.
+
+### When is Server.cfc Triggered?
+
+- **onServerStart**: Triggered when the Lucee server starts.
+- **onBuild**: Triggered during the build phase, particularly useful in Docker environments. Set the environment variable `LUCEE_BUILD` to `true` or use the system property `-Dlucee.build` to activate this function.
+
+## Creating the Server.cfc File
+
+To use the `onBuild` function, create a `Server.cfc` file in the `lucee-server\context\context` directory.
+
+```lucee
+// lucee-server\context\context\Server.cfc
+component {
+ public function onBuild() {
+ systemOutput("------- Building Lucee (Docker) -----", true);
+ // Example tasks during build
+ validateConfiguration();
+ copyFilesInPlace();
+ compileSourceCode();
+ encryptSourceCode();
+ }
+
+ private function validateConfiguration() {
+ systemOutput("Validating server configuration...", true);
+ // Add validation logic here
+ }
+
+ private function copyFilesInPlace() {
+ systemOutput("Copying necessary files...", true);
+ // Add file copying logic here
+ }
+
+ private function compileSourceCode() {
+ systemOutput("Compiling source code...", true);
+ // Add source code compilation logic here
+ }
+
+ private function encryptSourceCode() {
+ systemOutput("Encrypting source code...", true);
+ // Add source code encryption logic here
+ }
+}
+```
+
+## Using onBuild with Docker
+
+To leverage the `onBuild` function in a Docker environment, set the environment variable `LUCEE_BUILD` to `true` or use the system property `-Dlucee.build`.
+
+### Dockerfile Example
+
+Here's an example of how you might configure your Dockerfile to use the `onBuild` function:
+
+```dockerfile
+FROM lucee/lucee:latest
+
+# Copy your Server.cfc into the appropriate directory
+COPY Server.cfc /opt/lucee-server/context/context/Server.cfc
+
+# Set the environment variable to trigger onBuild
+ENV LUCEE_BUILD true
+
+# Expose necessary ports
+EXPOSE 8888
+
+# Start Lucee server
+COPY supporting/prewarm.sh /usr/local/tomcat/bin/
+RUN chmod +x /usr/local/tomcat/bin/prewarm.sh
+RUN /usr/local/tomcat/bin/prewarm.sh 6.1
+```
+
+You can find the `prewarm.sh` file [here](https://github.com/lucee/lucee-dockerfiles).
+When the Docker container is built, the `onBuild` function will execute, performing any tasks you've defined in the function.
diff --git a/docs/recipes/docker.md b/docs/recipes/docker.md
new file mode 100644
index 000000000..a656f4bd0
--- /dev/null
+++ b/docs/recipes/docker.md
@@ -0,0 +1,152 @@
+
+
+# Docker Information
+
+This document provides information about Docker and how to use it to run Lucee.
+
+## Introduction to Docker
+
+Docker is a platform that enables developers to automate the deployment, scaling, and management of applications using containerization. Containers are lightweight, standalone, and executable packages that include everything needed to run an application, such as the code, runtime, libraries, and system tools. This ensures consistency across multiple development and release cycles, as well as across diverse environments. By isolating applications in containers, Docker helps to avoid conflicts, streamline development workflows, and enhance the efficiency of resource utilization.
+
+## What are the benefits of running Lucee in Docker
+
+Running Lucee in Docker provides several key benefits:
+
+- **Consistency and Portability**: Docker containers ensure that Lucee and its dependencies are packaged together, eliminating compatibility issues and reducing setup time. This makes it easier to develop, test, and deploy applications consistently across different environments.
+- **Scalability**: Docker's lightweight nature allows for efficient scaling of Lucee applications. You can quickly scale up or down based on demand, making it ideal for both small and large-scale deployments.
+- **Resource Efficiency**: Docker containers share the host system's kernel, which leads to efficient utilization of system resources and improved performance compared to traditional virtual machines.
+- **Isolation**: By isolating applications in containers, Docker helps avoid conflicts between different applications running on the same host. This ensures that Lucee runs in a clean and controlled environment.
+
+## Lucee Docker Images
+
+The Lucee Docker images are built on top of Tomcat, providing a reliable and efficient environment to run Lucee applications. You can easily build your own images using the official Lucee images as a base.
+
+### Example Dockerfile
+
+```dockerfile
+FROM lucee/lucee:latest
+
+COPY config/lucee/ /opt/lucee/web/
+COPY www /var/www
+```
+
+This example Dockerfile shows how to extend the official Lucee image by copying custom configuration files and web content into the container.
+
+For more examples, you can visit the [Lucee Docker examples repository](https://github.com/lucee/lucee-docs/tree/master/examples/docker).
+
+## Using Lucee Docker Images
+
+The official Lucee Docker images are available on Docker Hub. You can find more details on how to use them and the available tags [here](https://hub.docker.com/r/lucee/lucee/).
+
+### Pulling the Latest Lucee Image
+
+To pull the latest Lucee image from Docker Hub, use the following command:
+
+```sh
+docker pull lucee/lucee:latest
+```
+
+### Running Lucee in a Docker Container
+
+To run Lucee in a Docker container, use the following command:
+
+```sh
+docker run -d -p 8888:8888 lucee/lucee:latest
+```
+
+This command runs a new container in detached mode, mapping port 8888 of the container to port 8888 on the host machine.
+
+### Customizing Your Lucee Container
+
+You can customize your Lucee container by creating your own Dockerfile and adding your configurations and web files as shown in the example Dockerfile above.
+
+### Advanced Usage with Docker Compose
+
+For more complex setups, consider using Docker Compose to manage multiple services and their dependencies. Below is an example `docker-compose.yml` file to run Lucee with an Nginx reverse proxy:
+
+```yaml
+version: "3"
+
+services:
+ lucee:
+ image: lucee/lucee:latest
+ ports:
+ - "8888:8888"
+ volumes:
+ - ./www:/var/www
+ - ./config/lucee:/opt/lucee/web
+
+ nginx:
+ image: nginx:latest
+ ports:
+ - "80:80"
+ volumes:
+ - ./nginx.conf:/etc/nginx/nginx.conf
+ depends_on:
+ - lucee
+```
+
+This setup defines two services: `lucee` and `nginx`. The `lucee` service runs the Lucee server, while the `nginx` service runs Nginx as a reverse proxy.
+
+## Using the LUCEE_BUILD Environment Variable
+
+The `LUCEE_BUILD` environment variable is used to prewarm Lucee, setting up the environment the first time it starts. This prewarming ensures that the Lucee server is ready for immediate use, enhancing performance and reducing initialization time during actual deployment. The `onBuild` function in `Server.cfc` is an additional feature that can be triggered during this prewarm phase to perform specific tasks.
+
+### Purpose
+
+Setting the `LUCEE_BUILD` environment variable to `true` prewarms the Lucee server. This involves setting up the environment, loading necessary configurations, and preparing the server for deployment. Additionally, the `onBuild` function in `Server.cfc` can be used to perform setup tasks such as validating configurations, copying files, compiling source code, and encrypting source code during this build process.
+
+### Example Dockerfile with LUCEE_BUILD
+
+Here's an example of how to configure your Dockerfile to use the `LUCEE_BUILD` environment variable:
+
+```dockerfile
+FROM lucee/lucee:latest
+
+# Copy your Server.cfc into the appropriate directory
+COPY Server.cfc /opt/lucee-server/context/context/Server.cfc
+
+# Set the environment variable to trigger onBuild
+ENV LUCEE_BUILD true
+
+# Expose necessary ports
+EXPOSE 8888
+
+# Start Lucee server
+COPY supporting/prewarm.sh /usr/local/tomcat/bin/
+RUN chmod +x /usr/local/tomcat/bin/prewarm.sh
+RUN /usr/local/tomcat/bin/prewarm.sh 6.1
+```
+
+You can find the `prewarm.sh` file [here](https://github.com/lucee/lucee-dockerfiles).
+
+### Example Server.cfc with onBuild Function
+
+Here's an example of a `Server.cfc` file with the `onBuild` function:
+
+```lucee
+// lucee-server\context\context\Server.cfc
+component {
+ public function onBuild() {
+ systemOutput("------- Building Lucee (Docker) -----", true);
+ }
+}
+```
+
+## Conclusion
+
+Using Docker to run Lucee simplifies the deployment process, ensures consistency across environments, and provides a scalable and efficient way to manage your Lucee applications. Setting the `LUCEE_BUILD` environment variable to `true` allows for prewarming Lucee, ensuring it is ready for immediate use. With the official Lucee Docker images and the ability to customize your own images, you can easily set up and manage your Lucee environment to meet your specific needs.
+
+For more detailed recipes and advanced usage examples, refer to the [Lucee Docker examples repository](https://github.com/lucee/lucee-docs/tree/master/examples/docker).
diff --git a/docs/recipes/encryption_decryption.md b/docs/recipes/encryption_decryption.md
new file mode 100644
index 000000000..9c36b80b8
--- /dev/null
+++ b/docs/recipes/encryption_decryption.md
@@ -0,0 +1,79 @@
+
+
+# Encryption/Decryption
+
+This document explains about Encryption/Decryption with public and private keys with simple examples.
+
+Encryption/Decryption is a new functionality in Lucee 5.3. We have a new way to encrypt/decrypt string values. First we start with keys. In this case, there are two keys:
+
+- Private key to encrypt
+- Public key to decrypt
+
+## Example 1:
+
+```luceescript
+//index.cfm
+directory action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+```luceescript
+key=generateRSAKeys();
+dump(key)
+```
+
+This function generates RSA keys. Execute the example code above in the browser and a struct is returned containing the two keys: a private key and a public key. So, we can create these keys, and store them somewhere for later use.
+
+## Example 2:
+
+```luceescript
+key=generateRSAKeys();
+raw="Hi, Hello !!!";
+enc=encrypt(raw,key.private,"rsa");
+dump(enc);
+```
+
+We now create RSA keys using the [[function-generatersakeys]] function, and then use the key to encrypt using the [[function-encrypt]] function. The encrypt() function has some arguments. It has `key.private` which defines the key as the private key, and `rsa` indicates use of the RSA encryption algorithm. Then run the dump in the browser and we see the encrypted string for your input string.
+
+## Example 3:
+
+```luceescript
+key=generateRSAKeys();
+raw="Hi, Hello !!!";
+enc=encrypt(raw,key.private,"rsa");
+dec=decrypt(enc,key.public,"rsa");
+dump(dec);
+```
+
+This is a full detailed example of encrypt/decrypt functions. We create a key and we encrypt with the private key. Then we [[function-decrypt]] with the public key. Then run the dump in the browser and we see the original string returned as expected.
+
+## Footnotes
+
+Here you can see these details in the video also:
+
+[Encryption/Decryption with public and private keys](https://www.youtube.com/watch?v=2fgfq-3nWfk)
diff --git a/docs/recipes/environment-variables-system-properties.md b/docs/recipes/environment-variables-system-properties.md
new file mode 100644
index 000000000..cf6a67c98
--- /dev/null
+++ b/docs/recipes/environment-variables-system-properties.md
@@ -0,0 +1,581 @@
+
+
+# Environment Variables / System Properties for Lucee
+
+Below is a list of environment variables and system properties you can set for the Lucee Server.
+
+## Important Settings
+
+The following settings are very useful and important to know.
+
+**Environment Variable:** `LUCEE_ADMIN_ENABLED`
+**System Property:** `-Dlucee.admin.enabled`
+Should the Lucee Admin be available or not.
+
+**Environment Variable:** `LUCEE_ADMIN_PASSWORD`
+**System Property:** `-Dlucee.admin.password`
+Password used for the Lucee admin (when you run Lucee in multi mode, the password for the Server admin).
+
+**Environment Variable:** `LUCEE_DATASOURCE_POOL_VALIDATE`
+**System Property:** `-Dlucee.datasource.pool.validate`
+If enabled, Lucee will validate existing datasource connections reused from the datasource pool before using them. This protects from exceptions caused by connections dropped by the DB server but creates additional communication between Lucee and the DB server.
+
+**Environment Variable:** `LUCEE_DEBUGGING_OPTIONS`
+**System Property:** `-Dlucee.debugging.options`
+Debug options, a comma-separated list of the following possible debug options to enable:
+
+- database
+- exception
+- template
+- dump
+- tracing
+- timer
+- implicit-access
+- query-usage
+- max-records-logged
+
+**Environment Variable:** `LUCEE_EXTENSIONS`
+**System Property:** `-Dlucee.extensions`
+Define a comma-separated list of Lucee extensions to install when starting up. This can be a simple list of IDs like this, then simply the latest versions get installed:
+
+```plaintext
+99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6,
+671B01B8-B3B3-42B9-AC055A356BED5281,
+2BCD080F-4E1E-48F5-BEFE794232A21AF6
+```
+
+Or with more specific information like version and label (for better readability) like this:
+
+```plaintext
+99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;name=MSSQL;label=MS SQL Server;version=12.2.0.jre8,
+671B01B8-B3B3-42B9-AC055A356BED5281;name=PostgreSQL;label=PostgreSQL;version=42.7.3,
+2BCD080F-4E1E-48F5-BEFE794232A21AF6;name=JDTsSQL;label=jTDS (MSSQL);version=1.3.1
+```
+
+**Environment Variable:** `LUCEE_LOGINSTORAGE_ITERATIONS`
+**System Property:** `-Dlucee.loginstorage.iterations`
+Specifies the number of encryption iterations for `loginstorage`. The default is 0.
+
+**Environment Variable:** `LUCEE_LOGINSTORAGE_PRIVATEKEY`
+**System Property:** `-Dlucee.loginstorage.privatekey`
+A private key used to encrypt `loginstorage`. If not defined, a simple base64 encoding is used.
+
+**Environment Variable:** `LUCEE_LOGINSTORAGE_SALT`
+**System Property:** `-Dlucee.loginstorage.salt`
+The salt used for encrypting `loginstorage`. If no salt is defined, a hardcoded salt is used.
+
+**Environment Variable:** `LUCEE_PASSWORD_ENC_KEY`
+**System Property:** `-Dlucee.password.enc.key`
+The private encryption key used by Lucee to encrypt passwords stored in the configuration, such as for datasources.
+
+**Environment Variable:** `LUCEE_READ_CFID_FROM_URL`
+**System Property:** `-Dlucee.read.cfid.from.url`
+A boolean value. If true, Lucee allows reading the CFID from the URL query string. It is strongly recommended to disable this.
+
+**Environment Variable:** `LUCEE_REQUESTTIMEOUT`
+**System Property:** `-Dlucee.requesttimeout`
+A boolean value. If false, Lucee will disable request timeouts.
+
+**Environment Variable:** `LUCEE_REQUESTTIMEOUT_CONCURRENTREQUESTTHRESHOLD`
+**System Property:** `-Dlucee.requesttimeout.concurrentrequestthreshold`
+Concurrent request threshold to enforce a request timeout. If a request reaches the timeout, Lucee will only enforce it if this threshold is also reached. For example, setting it to `100` means the timeout is enforced only if there are at least 99 other requests running.
+
+**Environment Variable:** `LUCEE_REQUESTTIMEOUT_CPUTHRESHOLD`
+**System Property:** `-Dlucee.requesttimeout.cputhreshold`
+A floating-point number between 0 and 1. CPU threshold to enforce a request timeout. If a request reaches the timeout, Lucee will only enforce it if the CPU usage of the current core is at least the specified threshold. For example, setting it to `0.5` enforces the timeout if the CPU is at least 50%.
+
+**Environment Variable:** `LUCEE_SERVER_DIR`
+**System Property:** `-Dlucee.server.dir`
+Specifies the file directory for the Lucee server context.
+
+**Environment Variable:** `LUCEE_VERSION`
+**System Property:** `-Dlucee.version`
+Defines the version of Lucee to load. For example, setting it to `6.1.0.0` will load that version. If not available locally, Lucee will automatically download it from Maven.
+
+**Environment Variable:** `LUCEE_ADMIN_MODE="single|multi"`
+**System Property:** `-Dlucee.admin.mode`
+This setting only applies to Lucee 6 (above `6.1.1.54`), Lucee 6 can run in `single` mode or `multi` mode. In single mode, Lucee only has one set of configurations for the whole server. In multi mode, you have a base configuration for the whole server, but then every web context has its own configuration to override the base configuration. With Lucee 5, you only have multi mode and with Lucee 7, you only have single mode.
+By default, a new version of Lucee 6 with no `.CFConfig.json` provided that contains a `mode:"single|multi"` setting starts in single mode. When you update from Lucee 5, you start in multi mode.
+To change this behavior, you can set the environment variable `LUCEE_ADMIN_MODE="single|multi"` or system property `-Dlucee.admin.mode="single|multi"`.
+
+**Environment Variable:** `LUCEE_ADMIN_MODE_DEFAULT="single|multi"`
+**System Property:** `-Dlucee.admin.mode.default`
+This setting functions similarly to `LUCEE_ADMIN_MODE`, but it only affects the default behavior and can be overridden by any setting in `.CFConfig.json`.
+
+## Breaking Changes
+
+Major updates for Lucee can sometimes cause breaking changes. The settings below allow you to emulate the behavior of older Lucee versions in newer versions.
+
+**Environment Variable:** `LUCEE_QUERY_ALLOWEMPTYASNULL`
+**System Property:** `-Dlucee.query.allowemptyasnull`
+
+In Lucee 5, an empty string passed into a query parameter with a numeric type was interpreted as null. In Lucee 6, this is no longer accepted and throws an exception.
+You can simulate the old behavior by setting this environment variable or system property to `true`.
+
+By setting the log level of the `datasource` log to `warn`, you will receive information in the log when the old behavior is used.
+This allows you to modify your code for the new behavior without encountering runtime issues with the existing code.
+
+**Environment Variable:** `LUCEE_DESERIALIZEJSON_ALLOWEMPTY`
+**System Property:** `-Dlucee.deserializejson.allowempty`
+
+In Lucee 5, an empty string passed into the function deserializeJson will return an empty string back. In Lucee 6, this is no longer accepted and throws an exception.
+You can simulate the old behavior by setting this environment variable or system property to `true`.
+
+By setting the log level of the `application` log to `warn`, you will receive information in the log when the old behavior is used.
+This allows you to modify your code for the new behavior without encountering runtime issues with the existing code.
+
+## Regular Settings
+
+Settings that are nice to know, but not that important.
+
+**Environment Variable:** `FELIX_LOG_LEVEL`
+**System Property:** `-Dfelix.log.level`
+Log level for the Felix Framework (OSGi).
+
+**Environment Variable:** `LUCEE_ALLOW_COMPRESSION`
+**System Property:** `-Dlucee.allow.compression`
+Allows compressing (GZIP) the HTTP response if the client explicitly supports it.
+
+**Environment Variable:** `LUCEE_APPLICATION_PATH_CACHE_TIMEOUT`
+**System Property:** `-Dlucee.application.path.cache.timeout`
+Lucee caches the path information to the template; this defines the idle timeout for these cache elements in milliseconds.
+
+**Environment Variable:** `LUCEE_CASCADE_TO_RESULTSET`
+**System Property:** `-Dlucee.cascade.to.resultset`
+When a variable has no scope defined (example: `#myVar#` instead of `#variables.myVar#`), Lucee will also search available resultsets (CFML Standard) or not.
+
+**Environment Variable:** `LUCEE_CLI_PRINTEXCEPTIONS`
+**System Property:** `-Dlucee.cli.printExceptions`
+Print out exceptions within the CLI interface.
+
+**Environment Variable:** `LUCEE_ENABLE_WARMUP`
+**System Property:** `-Dlucee.enable.warmup`
+Boolean to enable/disable Lucee warmup on start.
+
+**Environment Variable:** `LUCEE_EXTENSIONS_INSTALL`
+**System Property:** `-Dlucee.extensions.install`
+A boolean value to enable/disable the installation of extensions.
+
+**Environment Variable:** `LUCEE_FULL_NULL_SUPPORT`
+**System Property:** `-Dlucee.full.null.support`
+A boolean value to enable/disable full null support.
+
+**Environment Variable:** `LUCEE_LIBRARY_ADDITIONAL_FUNCTION`
+**System Property:** `-Dlucee.library.additional.function`
+Path to a directory for additional CFML-based functions Lucee should load to make these functions available in the application. For example, you create a file called `length.cfm` that looks like this:
+
+```lucee
+function length(obj) {
+ return len(obj);
+}
+```
+
+Then you copy that file into that directory, and you can use the function `length(any)` in all your code like a built-in function.
+
+**Environment Variable:** `LUCEE_LIBRARY_ADDITIONAL_TAG`
+**System Property:** `-Dlucee.library.additional.tag`
+Path to a directory for additional CFML-based tags Lucee should load as globally available tags following the custom tag interface.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_FUNCTION`
+**System Property:** `-Dlucee.library.default.function`
+Path to a directory for CFML-based functions Lucee should load to make these functions available in the application. For example, you create a file called `length.cfm` that looks like this:
+
+```lucee
+function length(obj) {
+ return len(obj);
+}
+```
+
+Then you copy that file into that directory, and you can use the function `length(any)` in all your code like a built-in function.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_TAG`
+**System Property:** `-Dlucee.library.default.tag`
+Path to a directory for CFML-based tags Lucee should load as globally available tags following the custom tag interface.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_TLD`
+**System Property:** `-Dlucee.library.default.tld`
+Tag Library Descriptor files (.tld or .tldx) Lucee should load to make these tags available in the application.
+
+**Environment Variable:** `LUCEE_LISTENER_MODE`
+**System Property:** `-Dlucee.listener.mode`
+Where/how does Lucee look for the Application Listener?
+
+- `currenttoroot` - looks for the file "Application.cfc/Application.cfm" from the current up to the webroot directory.
+- `currentorroot` - looks for the file "Application.cfc/Application.cfm" in the current directory and in the webroot directory.
+- `root` - looks for the file "Application.cfc/Application.cfm" only in the webroot.
+- `current` - looks for the file "Application.cfc/Application.cfm" only in the current template directory.
+
+**Environment Variable:** `LUCEE_LISTENER_TYPE`
+**System Property:** `-Dlucee.listener.type`
+Which kind of Application Listener is supported?
+
+- `None` - no listener at all.
+- `Classical (CFML < 7)` - Classic handling. Lucee looks for the file "Application.cfm" and a corresponding file "OnRequestEnd.cfm".
+- `Modern` - Modern handling. Lucee only looks for the file "Application.cfc".
+- `Mixed (CFML >= 7)` - Mixed handling. Lucee looks for a file "Application.cfm/OnRequestEnd.cfm" as well as for the file "Application.cfc".
+
+**Environment Variable:** `LUCEE_LOGGING_MAIN`
+**System Property:** `-Dlucee.logging.main`
+Name of the main logger used by Lucee, for example, a non-existing logger is defined.
+
+**Environment Variable:** `LUCEE_MAPPING_FIRST`
+**System Property:** `-Dlucee.mapping.first`
+Let's say you have the following code:
+
+```lucee
+
+```
+
+And you have the following mappings defined:
+
+- `/foo/bar`
+- `/foo`
+
+Then Lucee will look for `/index.cfm` in `/foo/bar` and for `/bar/index.cfm` in `/foo` and invoke the first `index.cfm` it finds, which could be in both mappings. If this setting is set to `true`, Lucee will only check `/foo/bar` for `index.cfm`.
+
+**Environment Variable:** `LUCEE_MVN_REPO_RELEASES`
+**System Property:** `-Dlucee.mvn.repo.releases`
+Endpoint used by Lucee >= 6 to load releases, by default this is `https://oss.sonatype.org/service/local/repositories/releases/content/`.
+
+**Environment Variable:** `LUCEE_MVN_REPO_SNAPSHOTS`
+**System Property:** `-Dlucee.mvn.repo.snapshots`
+Endpoint used by Lucee >= 6 to load snapshots, by default this is `https://oss.sonatype.org/content/repositories/snapshots/`.
+
+**Environment Variable:** `LUCEE_PAGEPOOL_MAXSIZE`
+**System Property:** `-Dlucee.pagePool.maxSize`
+Max size of the template pool (page pool), the pool Lucee holds loaded `.cfm`/`.cfc` files. By default, this is `10000`; no number smaller than `1000` is accepted.
+
+**Environment Variable:** `LUCEE_PRECISE_MATH`
+**System Property:** `-Dlucee.precise.math`
+A boolean value. If enabled, this improves the accuracy of floating-point calculations but makes them slightly slower.
+
+**Environment Variable:** `LUCEE_PRESERVE_CASE`
+**System Property:** `-Dlucee.preserve.case`
+A boolean value. If true, Lucee will not convert variable names used in "dot notation" to UPPER CASE.
+
+**Environment Variable:** `LUCEE_QUEUE_ENABLE`
+**System Property:** `-Dlucee.queue.enable`
+A boolean value. If true, Lucee will enable the queue for requests.
+
+**Environment Variable:** `LUCEE_QUEUE_MAX`
+**System Property:** `-Dlucee.queue.max`
+The maximum concurrent requests that the engine allows to run at the same time before the engine begins to queue the requests.
+
+**Environment Variable:** `LUCEE_QUEUE_TIMEOUT`
+**System Property:** `-Dlucee.queue.timeout`
+The time in milliseconds a request is held in the queue. If the time is reached, the request is rejected with an exception. If you set it to 0 seconds, the request timeout is used instead.
+
+**Environment Variable:** `LUCEE_REQUEST_LIMIT_CONCURRENT_MAXNOSLEEP`
+**System Property:** `-Dlucee.request.limit.concurrent.maxnosleep`
+The maximal number of threads that are allowed to be active on the server. If this is reached, requests get forced into a "nap" (defined by `lucee.request.limit.concurrent.sleeptime`).
+
+**Environment Variable:** `LUCEE_REQUEST_LIMIT_CONCURRENT_SLEEPTIME`
+**System Property:** `-Dlucee.request.limit.concurrent.sleeptime`
+How long a request should "nap" in milliseconds if it reaches the `lucee.request.limit.concurrent.maxnosleep`.
+
+**Environment Variable:** `LUCEE_REQUESTTIMEOUT_MEMORYTHRESHOLD`
+**System Property:** `-Dlucee.requesttimeout.memorythreshold`
+A floating-point number between 0 and 1. Memory threshold to enforce a request timeout. If a request reaches the request timeout, Lucee will only enforce that timeout if this threshold is also reached. For example, setting it to `0.5` enforces the timeout if the memory consumption of the server is at least 50%.
+
+**Environment Variable:** `LUCEE_RESOURCE_CHARSET`
+**System Property:** `-Dlucee.resource.charset`
+Default character set for reading from/writing to various resources (files).
+
+**Environment Variable:** `LUCEE_SCRIPT_PROTECT`
+**System Property:** `-Dlucee.script.protect`
+Script protect setting used by default. Consult the Lucee admin page `/Settings/Request` for details on possible settings.
+
+**Environment Variable:** `LUCEE_SECURITY_LIMITEVALUATION`
+**System Property:** `-Dlucee.security.limitEvaluation`
+A boolean value. If enabled, limits variable evaluation in functions/tags. If enabled, you cannot use expressions within `[ ]` like this: `susi[getVariableName()]`. This affects the following functions: `IsDefined`, `structGet`, `empty` and the following tags: `savecontent attribute "variable"`.
+
+**Environment Variable:** `LUCEE_SSL_CHECKSERVERIDENTITY`
+**System Property:** `-Dlucee.ssl.checkserveridentity`
+A boolean value. If enabled, checks the identity of the SSL certificate with SMTP.
+
+**Environment Variable:** `LUCEE_STATUS_CODE`
+**System Property:** `-Dlucee.status.code`
+A boolean value. If disabled, returns a 200 status code to the client even if an uncaught exception occurs.
+
+**Environment Variable:** `LUCEE_STORE_EMPTY`
+**System Property:** `-Dlucee.store.empty`
+A boolean value. If enabled, does not store empty sessions to the client or session storage.
+
+**Environment Variable:** `LUCEE_SUPPRESS_WS_BEFORE_ARG`
+**System Property:** `-Dlucee.suppress.ws.before.arg`
+A boolean value. If enabled, Lucee suppresses whitespace defined between the `cffunction` starting tag and the last `cfargument` tag. This setting is ignored when there is different output between these tags as whitespace.
+
+**Environment Variable:** `LUCEE_SYSTEM_ERR`
+**System Property:** `-Dlucee.system.err`
+Where is the error stream of the JVM sent? Possible values are:
+
+- `null` (the stream is ignored)
+- `class:` - the data is sent to an instance of that class that must implement the `java.io.PrintStream` interface
+- `file:` - an absolute path to a file name the stream is written to
+- `log` - stream is written to `err.log` in `context/logs/`
+
+**Environment Variable:** `LUCEE_SYSTEM_OUT`
+**System Property:** `-Dlucee.system.out`
+Where is the out stream of the JVM sent? Possible values are:
+
+- `null` (the stream is ignored)
+- `class:` - the data is sent to an instance of that class that must implement the `java.io.PrintStream` interface
+- `file:` - an absolute path to a file name the stream is written to
+- `log` - stream is written to `out.log` in `context/logs/`
+
+**Environment Variable:** `LUCEE_TEMPLATE_CHARSET`
+**System Property:** `-Dlucee.template.charset`
+Default character set used to read templates (`.cfm` and `.cfc` files).
+
+**Environment Variable:** `LUCEE_TYPE_CHECKING`
+**System Property:** `-Dlucee.type.checking`
+A boolean value. If enabled, Lucee enforces types defined in the code. If false, type definitions are ignored.
+
+**Environment Variable:** `LUCEE_UPLOAD_BLOCKLIST`
+**System Property:** `-Dlucee.upload.blocklist`
+Default block list for the tag `cffile action="upload"`. A comma-separated list of extensions that are allowed when uploading files via forms.
+
+**Environment Variable:** `LUCEE_USE_LUCEE_SSL_TRUSTSTORE`
+**System Property:** `-Dlucee.use.lucee.SSL.TrustStore`
+Specifies the file location of the trust store that contains trusted Certificate Authorities (CAs) for SSL/TLS connections in Java applications.
+
+**Environment Variable:** `LUCEE_WEB_CHARSET`
+**System Property:** `-Dlucee.web.charset`
+Default character set for output streams, form-, URL-, and CGI scope variables, and reading/writing the header.
+
+## Edge Case Settings
+
+These settings are normally not needed in a regular environment.
+
+**Environment Variable:** `FELIX_LOG_LEVEL`
+**System Property:** `-Dfelix.log.level`
+Log level for the Felix Framework (OSGi).
+
+**Environment Variable:** `LUCEE_ALLOW_COMPRESSION`
+**System Property:** `-Dlucee.allow.compression`
+Allows compressing (GZIP) the HTTP response if the client explicitly supports it.
+
+**Environment Variable:** `LUCEE_APPLICATION_PATH_CACHE_TIMEOUT`
+**System Property:** `-Dlucee.application.path.cache.timeout`
+Lucee caches the path information to the template; this defines the idle timeout for these cache elements in milliseconds.
+
+**Environment Variable:** `LUCEE_CASCADE_TO_RESULTSET`
+**System Property:** `-Dlucee.cascade.to.resultset`
+When a variable has no scope defined (example: `#myVar#` instead of `#variables.myVar#`), Lucee will also search available resultsets (CFML Standard) or not.
+
+**Environment Variable:** `LUCEE_CLI_PRINTEXCEPTIONS`
+**System Property:** `-Dlucee.cli.printExceptions`
+Print out exceptions within the CLI interface.
+
+**Environment Variable:** `LUCEE_ENABLE_WARMUP`
+**System Property:** `-Dlucee.enable.warmup`
+Boolean to enable/disable Lucee warmup on start.
+
+**Environment Variable:** `LUCEE_EXTENSIONS_INSTALL`
+**System Property:** `-Dlucee.extensions.install`
+A boolean value to enable/disable the installation of extensions.
+
+**Environment Variable:** `LUCEE_FULL_NULL_SUPPORT`
+**System Property:** `-Dlucee.full.null.support`
+A boolean value to enable/disable full null support.
+
+**Environment Variable:** `LUCEE_LIBRARY_ADDITIONAL_FUNCTION`
+**System Property:** `-Dlucee.library.additional.function`
+Path to a directory for additional CFML-based functions Lucee should load to make these functions available in the application. For example, you create a file called `length.cfm` that looks like this:
+
+```lucee
+
+function length(obj) {
+ return len(obj);
+}
+
+```
+
+Then you copy that file into that directory, and you can use the function `length(any)` in all your code like a built-in function.
+
+**Environment Variable:** `LUCEE_LIBRARY_ADDITIONAL_TAG`
+**System Property:** `-Dlucee.library.additional.tag`
+Path to a directory for additional CFML-based tags Lucee should load as globally available tags following the custom tag interface.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_FUNCTION`
+**System Property:** `-Dlucee.library.default.function`
+Path to a directory for CFML-based functions Lucee should load to make these functions available in the application. For example, you create a file called `length.cfm` that looks like this:
+
+```lucee
+
+function length(obj) {
+ return len(obj);
+}
+
+```
+
+Then you copy that file into that directory, and you can use the function `length(any)` in all your code like a built-in function.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_TAG`
+**System Property:** `-Dlucee.library.default.tag`
+Path to a directory for CFML-based tags Lucee should load as globally available tags following the custom tag interface.
+
+**Environment Variable:** `LUCEE_LIBRARY_DEFAULT_TLD`
+**System Property:** `-Dlucee.library.default.tld`
+Tag Library Descriptor files (`.tld` or `.tldx`) Lucee should load to make these tags available in the application.
+
+**Environment Variable:** `LUCEE_LISTENER_MODE`
+**System Property:** `-Dlucee.listener.mode`
+Where/how does Lucee look for the Application Listener?
+
+- `currenttoroot` - looks for the file "Application.cfc/Application.cfm" from the current up to the webroot directory.
+- `currentorroot` - looks for the file "Application.cfc/Application.cfm" in the current directory and in the webroot directory.
+- `root` - looks for the file "Application.cfc/Application.cfm" only in the webroot.
+- `current` - looks for the file "Application.cfc/Application.cfm" only in the current template directory.
+
+**Environment Variable:** `LUCEE_LISTENER_TYPE`
+**System Property:** `-Dlucee.listener.type`
+Which kind of Application Listener is supported?
+
+- `None` - no listener at all.
+- `Classical (CFML < 7)` - Classic handling. Lucee looks for the file "Application.cfm" and a corresponding file "OnRequestEnd.cfm".
+- `Modern` - Modern handling. Lucee only looks for the file "Application.cfc".
+- `Mixed (CFML >= 7)` - Mixed handling. Lucee looks for a file "Application.cfm/OnRequestEnd.cfm" as well as for the file "Application.cfc".
+
+**Environment Variable:** `LUCEE_LOGGING_MAIN`
+**System Property:** `-Dlucee.logging.main`
+Name of the main logger used by Lucee, for example, a non-existing logger is defined.
+
+**Environment Variable:** `LUCEE_MAPPING_FIRST`
+**System Property:** `-Dlucee.mapping.first`
+Let's say you have the following code:
+
+```lucee
+
+```
+
+And you have the following mappings defined:
+
+- `/foo/bar`
+- `/foo`
+
+Then Lucee will look for `/index.cfm` in `/foo/bar` and for `/bar/index.cfm` in `/foo` and invoke the first `index.cfm` it finds, which could be in both mappings. If this setting is set to `true`, Lucee will only check `/foo/bar` for `index.cfm`.
+
+**Environment Variable:** `LUCEE_MVN_REPO_RELEASES`
+**System Property:** `-Dlucee.mvn.repo.releases`
+Endpoint used by Lucee >= 6 to load releases. By default, this is `https://oss.sonatype.org/service/local/repositories/releases/content/`.
+
+**Environment Variable:** `LUCEE_MVN_REPO_SNAPSHOTS`
+**System Property:** `-Dlucee.mvn.repo.snapshots`
+Endpoint used by Lucee >= 6 to load snapshots. By default, this is `https://oss.sonatype.org/content/repositories/snapshots/`.
+
+**Environment Variable:** `LUCEE_PAGEPOOL_MAXSIZE`
+**System Property:** `-Dlucee.pagePool.maxSize`
+Max size of the template pool (page pool), the pool Lucee holds loaded `.cfm`/`.cfc` files. By default, this is `10000`; no number smaller than `1000` is accepted.
+
+**Environment Variable:** `LUCEE_PRECISE_MATH`
+**System Property:** `-Dlucee.precise.math`
+A boolean value. If enabled, this improves the accuracy of floating-point calculations but makes them slightly slower.
+
+**Environment Variable:** `LUCEE_PRESERVE_CASE`
+**System Property:** `-Dlucee.preserve.case`
+A boolean value. If true, Lucee will not convert variable names used in "dot notation" to UPPER CASE.
+
+**Environment Variable:** `LUCEE_QUEUE_ENABLE`
+**System Property:** `-Dlucee.queue.enable`
+A boolean value. If true, Lucee will enable the queue for requests.
+
+**Environment Variable:** `LUCEE_QUEUE_MAX`
+**System Property:** `-Dlucee.queue.max`
+The maximum concurrent requests that the engine allows to run at the same time before the engine begins to queue the requests.
+
+**Environment Variable:** `LUCEE_QUEUE_TIMEOUT`
+**System Property:** `-Dlucee.queue.timeout`
+The time in milliseconds a request is held in the queue. If the time is reached, the request is rejected with an exception. If you set it to 0 seconds, the request timeout is used instead.
+
+**Environment Variable:** `LUCEE_REQUEST_LIMIT_CONCURRENT_MAXNOSLEEP`
+**System Property:** `-Dlucee.request.limit.concurrent.maxnosleep`
+The maximal number of threads that are allowed to be active on the server. If this is reached, requests get forced into a "nap" (defined by `lucee.request.limit.concurrent.sleeptime`).
+
+**Environment Variable:** `LUCEE_REQUEST_LIMIT_CONCURRENT_SLEEPTIME`
+**System Property:** `-Dlucee.request.limit.concurrent.sleeptime`
+How long a request should "nap" in milliseconds if it reaches the `lucee.request.limit.concurrent.maxnosleep`.
+
+**Environment Variable:** `LUCEE_REQUESTTIMEOUT_MEMORYTHRESHOLD`
+**System Property:** `-Dlucee.requesttimeout.memorythreshold`
+A floating-point number between 0 and 1. Memory threshold to enforce a request timeout. If a request reaches the request timeout, Lucee will only enforce that timeout if this threshold is also reached. For example, setting it to `0.5` enforces the timeout if the memory consumption of the server is at least 50%.
+
+**Environment Variable:** `LUCEE_RESOURCE_CHARSET`
+**System Property:** `-Dlucee.resource.charset`
+Default character set for reading from/writing to various resources (files).
+
+**Environment Variable:** `LUCEE_SCRIPT_PROTECT`
+**System Property:** `-Dlucee.script.protect`
+Script protect setting used by default. Consult the Lucee admin page `/Settings/Request` for details on possible settings.
+
+**Environment Variable:** `LUCEE_SECURITY_LIMITEVALUATION`
+**System Property:** `-Dlucee.security.limitEvaluation`
+A boolean value. If enabled, limits variable evaluation in functions/tags. If enabled, you cannot use expressions within `[ ]` like this: `susi[getVariableName()]`. This affects the following functions: `IsDefined`, `structGet`, `empty` and the following tags: `savecontent attribute "variable"`.
+
+**Environment Variable:** `LUCEE_SSL_CHECKSERVERIDENTITY`
+**System Property:** `-Dlucee.ssl.checkserveridentity`
+A boolean value. If enabled, checks the identity of the SSL certificate with SMTP.
+
+**Environment Variable:** `LUCEE_STATUS_CODE`
+**System Property:** `-Dlucee.status.code`
+A boolean value. If disabled, returns a 200 status code to the client even if an uncaught exception occurs.
+
+**Environment Variable:** `LUCEE_STORE_EMPTY`
+**System Property:** `-Dlucee.store.empty`
+A boolean value. If enabled, does not store empty sessions to the client or session storage.
+
+**Environment Variable:** `LUCEE_SUPPRESS_WS_BEFORE_ARG`
+**System Property:** `-Dlucee.suppress.ws.before.arg`
+A boolean value. If enabled, Lucee suppresses whitespace defined between the `cffunction` starting tag and the last `cfargument` tag. This setting is ignored when there is different output between these tags as whitespace.
+
+**Environment Variable:** `LUCEE_SYSTEM_ERR`
+**System Property:** `-Dlucee.system.err`
+Where is the error stream of the JVM sent? Possible values are:
+
+- `null` (the stream is ignored)
+- `class:` - the data is sent to an instance of that class that must implement the `java.io.PrintStream` interface
+- `file:` - an absolute path to a file name the stream is written to
+- `log` - stream is written to `err.log` in `context/logs/`
+
+**Environment Variable:** `LUCEE_SYSTEM_OUT`
+**System Property:** `-Dlucee.system.out`
+Where is the out stream of the JVM sent? Possible values are:
+
+- `null` (the stream is ignored)
+- `class:` - the data is sent to an instance of that class that must implement the `java.io.PrintStream` interface
+- `file:` - an absolute path to a file name the stream is written to
+- `log` - stream is written to `out.log` in `context/logs/`
+
+**Environment Variable:** `LUCEE_TEMPLATE_CHARSET`
+**System Property:** `-Dlucee.template.charset`
+Default character set used to read templates (`.cfm` and `.cfc` files).
+
+**Environment Variable:** `LUCEE_TYPE_CHECKING`
+**System Property:** `-Dlucee.type.checking`
+A boolean value. If enabled, Lucee enforces types defined in the code. If false, type definitions are ignored.
+
+**Environment Variable:** `LUCEE_UPLOAD_BLOCKLIST`
+**System Property:** `-Dlucee.upload.blocklist`
+Default block list for the tag `cffile action="upload"`. A comma-separated list of extensions that are allowed when uploading files via forms.
+
+**Environment Variable:** `LUCEE_USE_LUCEE_SSL_TRUSTSTORE`
+**System Property:** `-Dlucee.use.lucee.SSL.TrustStore`
+Specifies the file location of the trust store that contains trusted Certificate Authorities (CAs) for SSL/TLS connections in Java applications.
+
+**Environment Variable:** `LUCEE_WEB_CHARSET`
+**System Property:** `-Dlucee.web.charset`
+Default character set for output streams, form-, URL-, and CGI scope variables, and reading/writing the header.
diff --git a/docs/recipes/event-gateway-create.md b/docs/recipes/event-gateway-create.md
new file mode 100644
index 000000000..a887ed66d
--- /dev/null
+++ b/docs/recipes/event-gateway-create.md
@@ -0,0 +1,145 @@
+
+
+# Custom Event Gateways
+
+Here you will find a short introduction into writing your own Event Gateway type.
+
+Since you can write these in pure CFML (and Java when you want it), it is really simple to do.
+
+There are 2 to 3 files you need to create:
+
+- the Gateway CFC
+- the Gateway Driver CFC
+- A listener CFC
+
+## The Gateway CFC
+
+This is the file which contains the action you want your gateway to do.
+
+Also, it is the file which is instantiated by Lucee when the gateway starts.
+
+You can take the following files as an example:
+
+- {Lucee-install}/lib/lucee-server/context/gateway/lucee/extension/gateway/DirectoryWatcher.cfc
+- {Lucee-install}/lib/lucee-server/context/gateway/lucee/extension/gateway/MailWatcher.cfc
+
+The example code shown underneath is a modified version of the DirectoryWatcher.cfc, which, at time of writing, is in line for reviewing at the Lucee team.
+
+By default, you need to have the following functions:
+
+- An init function, which receives the necessary config data.
+- A start function, which continues to run while variables.state="running".
+- A stop and restart function.
+- A getState function, which returns the current state of the gateway instance (running, stopping, stopped).
+- A sendMessage function, which will be called when the CFML sendGatewayMessage function is used.
+
+The following is all the code you need:
+
+```lucee
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SELECT *
+ FROM FILE
+ WHERE directory = "#getDirectoryFromPath(variables.config.filepath)#"
+ AND name = "#getFileFromPath(variables.config.filepath)#"
+
+
+
+
+
+
+
+
+```
+
+We will save the file as {Lucee-install}/lib/lucee-server/context/gateway/filesizechecker/FileSizeWatcher.cfc.
+
+The variables.listener and variables.config variables did not just come falling from the sky; instead, it was saved to the variables scope in the init() function.
+
+Lastly, we need to create the Gateway driver. We can use the Gateway driver code shown before, and then save it as {Lucee-install}/lib/lucee-server/context/admin/gdriver/FileSizeWatcher.cfc.
+
+Now we are almost good to go! We do need to restart Lucee to have it pick up the new Gateway driver. So just go to the server admin, click on the menu-item "Restart", and then hit the "Restart Lucee" button.
+
+We can add an instance of our new Gateway type now! You can do it by using cfadmin like this:
+
+```lucee
+
+```
+
+Interval: time in milliseconds to wait between each check.
+Minimalsize: the minimum filesize in bytes.
+
+After executing the cfadmin code, or going through the admin screens, you should now have an instance of your own Event Gateway type running!
+
+When creating a Socket gateway or an Instant messaging gateway, you will need to do a bit more coding, but hopefully this instruction helped you out!
diff --git a/docs/recipes/event-gateway-in-app-cfc.md b/docs/recipes/event-gateway-in-app-cfc.md
new file mode 100644
index 000000000..e645534f6
--- /dev/null
+++ b/docs/recipes/event-gateway-in-app-cfc.md
@@ -0,0 +1,265 @@
+
+
+# Event Handling in Application.cfc
+
+Lucee provides several event handling functions within `Application.cfc` that can be used to manage different stages and types of requests. Here is an overview of these functions and their usage.
+
+## OnApplicationStart
+
+This method is triggered when the application starts.
+
+```cfs
+component {
+ void function onApplicationStart() {
+ echo('Application started');
+ }
+}
+```
+
+## OnSessionStart
+
+This method is triggered when a session starts.
+
+```cfs
+component {
+ void function onSessionStart() {
+ echo('Session started');
+ }
+}
+```
+
+### OnRequestStart
+
+This method is triggered at the start of each request.
+
+```cfs
+component {
+ void function onRequestStart(string targetPage) {
+ echo('Request started: ' & targetPage);
+ }
+}
+```
+
+## OnRequest
+
+This method handles the actual request. In Lucee, this function is called even if the target page does not exist physically or is never used.
+
+```cfs
+component {
+ void function onRequest(string targetPage) {
+ echo('Hello World');
+ }
+}
+```
+
+## OnCFCRequest
+
+Similar to "onRequest", but this function is used to handle remote component calls (HTTP Webservices).
+
+```cfs
+component {
+ void function onCFCRequest(string cfcName, string methodName, struct args) {
+ echo('Hello World');
+ }
+}
+```
+
+## OnError
+
+This method is triggered when an uncaught exception occurs in this application context.
+
+```cfs
+component {
+ void function onError(struct exception, string eventName) {
+ dump(var:exception, label:eventName);
+ }
+}
+```
+
+As arguments you receive the exception (cfcatch block) and the eventName.
+
+## OnAbort
+
+This method is triggered when a request is ended with help of the tag ``.
+
+```cfs
+component {
+ void function onAbort(string targetPage) {
+ dump('request ' & targetPage & ' ended with an abort!');
+ }
+}
+```
+
+## OnDebug
+
+This method is triggered when debugging is enabled for this request.
+
+```cfs
+component {
+ void function onDebug(struct debuggingData) {
+ dump(var:debuggingData, label:'debug information');
+ }
+}
+```
+
+## OnMissingTemplate
+
+This method is triggered when a requested page was not found and **no function "onRequest" is defined**.
+
+```cfs
+component {
+ void function onMissingTemplate(string targetPage) {
+ echo('missing:' & targetPage);
+ }
+}
+```
+
+## Application.cfc Default Template
+
+Below you can find an Application.cfc template that may serve as a starting point for your own applications settings with Lucee CFML engine.
+
+When creating an Application.cfc for the first time, you can configure all the settings within the Lucee Server or Web Administrator and use its "Export" tool (Lucee Administrator => Settings => Export) to move (by copy and paste) the settings into your Application.cfc file.
+
+```cfs
+component {
+
+ /**
+ * @hint onApplicationStart() is triggered when the application starts.
+ */
+ public boolean function onApplicationStart(){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onSessionStart() is triggered when a session starts.
+ */
+ public boolean function onSessionStart(){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onRequestStart() is triggered at the start of each request.
+ */
+ public boolean function onRequestStart(string targetPage){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onRequest() is triggered during a request right after onRequestStart() ends and before onRequestEnd() starts. Unlike other CFML engines, Lucee executes this function without looking for the "targetPage" defined, while other CFML engines will complain if the targetPage doesnโt physically exist (even if not used in the onRequest() function).
+ */
+ public void function onRequest(string targetPage){
+
+ include arguments.targetPage;
+ return;
+
+ }
+
+
+ /**
+ * @hint onRequestEnd() is triggered at the end of a request, right after onRequest() finishes.
+ */
+ public void function onRequestEnd(){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onCFCRequest() is triggered during a request for a .cfc component, typically used to handle remote component calls (e.g. HTTP Webservices).
+ */
+ public void function onCFCRequest(string cfcName, string methodName, struct args){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onError() is triggered when an uncaught exception occurs in this application context.
+ */
+ public void function onError(struct exception, string eventName){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint OnAbort() is triggered when a request is ended with help of the "abort" tag.
+ */
+ public void function onAbort(string targetPage){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onDebug() is triggered when debugging is enabled for this request.
+ */
+ public void function onDebug(struct debuggingData){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onMissingTemplate() is triggered when the requested page wasnโt found and no "onRequest()" function is defined.
+ */
+ public void function onMissingTemplate(string targetPage){
+
+ return;
+
+ }
+
+}
+```
diff --git a/docs/recipes/event-gateways-how-they-work.md b/docs/recipes/event-gateways-how-they-work.md
new file mode 100644
index 000000000..39bdc5f3d
--- /dev/null
+++ b/docs/recipes/event-gateways-how-they-work.md
@@ -0,0 +1,125 @@
+
+
+# Event Gateway - How they work?
+
+An event gateway is a background process that continuously runs.
+
+While running, it is doing the following: `` for a specific time (the "interval"), then doing what it is designed for (checking changes in a directory, polling a mailserver, etc.), and after that, it goes to `` again.
+
+This looping and sleeping does not count for all types of event gateways. For example, a socket gateway just instantiates a Java socket server.
+
+This "doing what it is designed for" will be explained in more detail underneath.
+
+# Which gateways are available?
+
+Lucee comes with 2 gateways: a Directory watcher and a Mail watcher.
+
+## Directory watcher
+
+This event gateway checks a given directory for file changes. These changes (events) can be:
+
+- new files
+- changed files
+- removed files
+
+When this gateway starts, it first takes a snapshot of the current state of the directory. This is the starting point from where changes are calculated.
+
+Please note that the files in this first snapshot are NOT seen as changes!
+
+So if you already have some files in the directory you want to watch, these files are not seen as "new file" when the gateway starts. Also, when Lucee (or your whole server) restarts, any changes which happened within this time are not seen and will not be picked up when the Directory watcher starts up again.
+
+## Filters
+
+You can apply filters for what you exactly want to watch changes for:
+
+- **Watch subdirectories**: same as the "Recurse" option in `` and `directoryList()`
+- **Extensions**: an optional list of comma-delimited file extensions. The default is "\*", which obviously means "all files".
+
+Note: the Extensions setting might be changed in the near future, due to an enhancement request.
+
+## Mail watcher
+
+This gateway checks a given POP mailbox for new mail. Since it only checks for new mail, it is rather limited in what it can do, but this is what makes it fast. The Mail watcher will read the inbox, and then check all the emails found.
+
+## Logs
+
+Make sure you regularly check the logs, because when anything goes wrong, Lucee will report this in its logs.
+
+Lucee logs can be found here:
+
+- `{Lucee-server}/context/logs/`
+- `{Lucee-web}/lucee/logs/`
+
+You can also view the logs in your web/server admin by installing the Log Analyzer plugin.
+
+Also, make sure that you wrap your Listener function code inside try-catch blocks and do something within the catch block. For example:
+
+```lucee
+
+
+
+
+
+
+
+
+
+
+```
+
+If you do not add these try-catch blocks, and anything goes wrong, it will be much harder to find out if anything went wrong!
+
+For example, the above code would crash if a file with the same name already exists in the directory "C:/backupfiles/".
+
+It might be even wiser to just email the complete error dump, so you will be semi-instantly notified of any errors.
+
+## Using cfadmin with Event gateways
+
+Instead of using the server/web admin, you can also use Lucee's `` tag.
+
+Add or update a gateway instance:
+
+```lucee
+
+```
+
+## Remove a gateway instance
+
+```lucee
+
+```
diff --git a/docs/recipes/event-gateways.md b/docs/recipes/event-gateways.md
new file mode 100644
index 000000000..986ff8e99
--- /dev/null
+++ b/docs/recipes/event-gateways.md
@@ -0,0 +1,81 @@
+
+
+# Event Gateways
+
+First of all, it is necessary to explain how Event Gateways (EG) are working in the first place. EG's are another way to communicate with your Lucee server and are kind of a service running on Lucee, reacting to certain events. These kinds of events could be something along the lines of:
+
+- SMS sent to a certain receiver
+- File change happening in a directory
+- Mail received on a mail server
+- Slack notification received
+
+What then can be done with these events is to trigger some actions that react to these events. For instance, if an SMS is sent to the server asking for the current heap memory space, the server could respond with an SMS returning the details. So you basically have an event producer and an event consumer.
+
+Event Gateways have for a long time lived a quiet life in CFML for several reasons. The main reasons were the lack of diversity and implementations, which were due to the fact that EG's had to be written in Java and not every CFML developer is very familiar with Java. Given this downside, it is understandable that there are such few available event gateways available.
+
+## Lucee's approach
+
+In Lucee, EG's can be written in CFML, and this is what this description is all about, which now makes it way more attractive to write the decisive parts with your favorite language. Some parts sometimes still need perhaps a Java library, but coding around that normally is not really a problem. Just use the according JAR solution available for the specific event (like SMS or others).
+
+## What are the involved components in Lucee?
+
+There are 2 components that are important for writing an event gateway:
+
+- Gateway driver
+- Event Gateway
+
+The gateway driver is a CFC that is always instantiated and running. It is responsible for managing the lifecycle of the event gateway. The event gateway is the actual implementation of the event handling logic.
+
+## Testing the Event Gateway
+
+I have created a template called testGateway.cfm and use the following code to test the result.
+
+```lucee
+
+
+```
+
+
+
+Now the sanity checks kick in and prevent faulty data from being sent to the Gateway. So once we change the code to this:
+
+```lucee
+
+
+```
+
+We receive the expected blank page. In the background, the message has been passed to the Gateway through the sendGateway() method and the data will be written by the start() endless loop into the logfile with the help of the method \_log().
+
+How you actually write your EG is totally up to you. But now, do it in CFML!
+
+## Further examples for Event Gateway implementations
+
+Above we have introduced the possibility to asynchronously log some data to a log file. There are additional other Event Gateways you can think of or use:
+
+- ICQ watcher
+- Slack Channel inspector
+- Listen to a socket
+- On incoming email
+
+The possibilities are huge and we expect several new event gateways to emerge in the next few months. Have fun with Lucee.
diff --git a/docs/recipes/event-handling-in-app-cfc.md b/docs/recipes/event-handling-in-app-cfc.md
new file mode 100644
index 000000000..87c887f46
--- /dev/null
+++ b/docs/recipes/event-handling-in-app-cfc.md
@@ -0,0 +1,265 @@
+
+
+# Event Handling in Application.cfc
+
+Lucee provides several event handling functions within `Application.cfc` that can be used to manage different stages and types of requests. Here is an overview of these functions and their usage.
+
+## OnApplicationStart
+
+This method is triggered when the application starts.
+
+```cfs
+component {
+ void function onApplicationStart() {
+ echo('Application started');
+ }
+}
+```
+
+## OnSessionStart
+
+This method is triggered when a session starts.
+
+```cfs
+component {
+ void function onSessionStart() {
+ echo('Session started');
+ }
+}
+```
+
+## OnRequestStart
+
+This method is triggered at the start of each request.
+
+```cfs
+component {
+ void function onRequestStart(string targetPage) {
+ echo('Request started: ' & targetPage);
+ }
+}
+```
+
+## OnRequest
+
+This method handles the actual request. In Lucee, this function is called even if the target page does not exist physically or is never used.
+
+```cfs
+component {
+ void function onRequest(string targetPage) {
+ echo('Hello World');
+ }
+}
+```
+
+## OnCFCRequest
+
+Similar to "onRequest", but this function is used to handle remote component calls (HTTP Webservices).
+
+```cfs
+component {
+ void function onCFCRequest(string cfcName, string methodName, struct args) {
+ echo('Hello World');
+ }
+}
+```
+
+## OnError
+
+This method is triggered when an uncaught exception occurs in this application context.
+
+```cfs
+component {
+ void function onError(struct exception, string eventName) {
+ dump(var:exception, label:eventName);
+ }
+}
+```
+
+As arguments you receive the exception (cfcatch block) and the eventName.
+
+## OnAbort
+
+This method is triggered when a request is ended with help of the tag ``.
+
+```cfs
+component {
+ void function onAbort(string targetPage) {
+ dump('request ' & targetPage & ' ended with an abort!');
+ }
+}
+```
+
+## OnDebug
+
+This method is triggered when debugging is enabled for this request.
+
+```cfs
+component {
+ void function onDebug(struct debuggingData) {
+ dump(var:debuggingData, label:'debug information');
+ }
+}
+```
+
+## OnMissingTemplate
+
+This method is triggered when a requested page was not found and **no function "onRequest" is defined**.
+
+```cfs
+component {
+ void function onMissingTemplate(string targetPage) {
+ echo('missing:' & targetPage);
+ }
+}
+```
+
+## Application.cfc Default Template
+
+Below you can find an Application.cfc template that may serve as a starting point for your own applications settings with Lucee CFML engine.
+
+When creating an Application.cfc for the first time, you can configure all the settings within the Lucee Server or Web Administrator and use its "Export" tool (Lucee Administrator => Settings => Export) to move (by copy and paste) the settings into your Application.cfc file.
+
+```cfs
+component {
+
+ /**
+ * @hint onApplicationStart() is triggered when the application starts.
+ */
+ public boolean function onApplicationStart(){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onSessionStart() is triggered when a session starts.
+ */
+ public boolean function onSessionStart(){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onRequestStart() is triggered at the start of each request.
+ */
+ public boolean function onRequestStart(string targetPage){
+
+ return true;
+
+ }
+
+
+ /**
+ * @hint onRequest() is triggered during a request right after onRequestStart() ends and before onRequestEnd() starts. Unlike other CFML engines, Lucee executes this function without looking for the "targetPage" defined, while other CFML engines will complain if the targetPage doesnโt physically exist (even if not used in the onRequest() function).
+ */
+ public void function onRequest(string targetPage){
+
+ include arguments.targetPage;
+ return;
+
+ }
+
+
+ /**
+ * @hint onRequestEnd() is triggered at the end of a request, right after onRequest() finishes.
+ */
+ public void function onRequestEnd(){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onCFCRequest() is triggered during a request for a .cfc component, typically used to handle remote component calls (e.g. HTTP Webservices).
+ */
+ public void function onCFCRequest(string cfcName, string methodName, struct args){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onError() is triggered when an uncaught exception occurs in this application context.
+ */
+ public void function onError(struct exception, string eventName){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint OnAbort() is triggered when a request is ended with help of the "abort" tag.
+ */
+ public void function onAbort(string targetPage){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onDebug() is triggered when debugging is enabled for this request.
+ */
+ public void function onDebug(struct debuggingData){
+
+ return;
+
+ }
+
+
+ /**
+ * @hint onMissingTemplate() is triggered when the requested page wasnโt found and no "onRequest()" function is defined.
+ */
+ public void function onMissingTemplate(string targetPage){
+
+ return;
+
+ }
+
+}
+```
diff --git a/docs/recipes/exception-cause.md b/docs/recipes/exception-cause.md
new file mode 100644
index 000000000..ebe780402
--- /dev/null
+++ b/docs/recipes/exception-cause.md
@@ -0,0 +1,59 @@
+
+
+# Exception - Cause
+
+Lucee 6.1 improves its support for exception causes, providing better debugging and error handling capabilities.
+
+## Tag Attribute cause
+
+The `` tag now includes a new attribute, `cause`, which allows you to add a cause to a newly created exception.
+
+```run
+
+try {
+ try {
+ throw "Upsi dupsi!";
+ }
+ catch(e) {
+ cfthrow (message="Upsi daisy!", cause=e);
+ }
+}
+catch(ex) {
+ dump(ex.message);
+ dump(ex.cause.message);
+}
+
+```
+
+Thanks to this enhancement, you get not only the tag context and Java stack trace from the top-level exception, but also the same information for the "cause" exception.
+
+## Parent Thread Context
+
+When you throw an exception from a child thread, for example, a `cfhttp` call executed in parallel or an exception inside the `cfthread` tag, you can now see the stack trace from where that thread was started. Previously, you only saw the stack trace within the child thread. With Lucee 6.1, you also get the information from the parent thread as the cause. Consider the following example:
+
+```run
+
+thread name="testexception" {
+ throw "Upsi dupsi!"
+}
+threadJoin("testexception");
+dump(cfthread["testexception"].error.message);
+dump(cfthread["testexception"].error.cause.Message);
+
+```
+
+The error not only includes the exception information from within the cfthread tag but also provides information from outside, making debugging much easier as you can see where the tag was called from.
diff --git a/docs/recipes/exception-output.md b/docs/recipes/exception-output.md
new file mode 100644
index 000000000..aa8788f3b
--- /dev/null
+++ b/docs/recipes/exception-output.md
@@ -0,0 +1,62 @@
+
+
+# Exceptions Output
+
+How to catch and display exceptions
+
+## Example
+
+```run
+
+try {
+ throw "an error happened";
+}
+catch ( any e ){
+ dump(e);
+}
+
+Go on with your code
+```
+
+[tag-Dump] shows the full exception structure without blocking your code. Dump includes all stack trace with it.
+
+## Example 2
+
+```lucee
+
+try {
+ throw "an error happened again!";
+}
+catch ( any e ){
+ echo(e);
+}
+
+Go on with your code
+```
+
+Here we simply echo the exception. It shows the normal exception without blocking your code.
+
+[https://www.youtube.com/watch?v=vM-4R2A-ZsM](https://www.youtube.com/watch?v=vM-4R2A-ZsM)
diff --git a/docs/recipes/extension-installation.md b/docs/recipes/extension-installation.md
new file mode 100644
index 000000000..7ca98c13a
--- /dev/null
+++ b/docs/recipes/extension-installation.md
@@ -0,0 +1,160 @@
+
+
+# Extension Installation
+
+In Lucee, there are multiple ways to install an extension. This recipe will show you all the possibilities along with their pros and cons.
+
+## Lucee Administrator
+
+You can install an extension in the Lucee Administrator by navigating to Extensions/Applications in the Lucee (Server) Administrator and installing or uninstalling the extension you need.
+
+### Pros
+
+- No physical access to the server needed
+- User-friendly interface
+- Immediate feedback on the installation process
+
+### Cons
+
+- Manual process that is not easily repeatable
+- Requires access to the Lucee Administrator interface
+
+## `deploy` Directory
+
+Simply copy the extension you want to install into the folder `{lucee-installation}/lucee-server/deploy`. Lucee will pick it up at startup or within a minute after startup and install it. You can find extensions to install under [download.lucee.org](https://download.lucee.org).
+
+### Pros
+
+- Hot deployment on a running server possible with no restart needed (except for some extensions)
+- Can be automated with scripts
+
+### Cons
+
+- Requires physical or SSH access to the server
+- Some extensions may require a restart to work properly
+
+## `.CFConfig.json` Configuration (Lucee 6 Only)
+
+With Lucee 6, you can define the extensions you need in the `.CFConfig.json` file that holds all your configurations.
+
+```json
+{
+ "extensions": [
+ {
+ "name": "Websocket",
+ "id": "07082C66-510A-4F0B-B5E63814E2FDF7BE",
+ "version": "1.0.0.11"
+ },
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/extensions/redis.extension-3.0.0.51.lex",
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718"
+ },
+ {
+ "name": "S3 Resource Extension",
+ "id": "17AB52DE-B300-A94B-E058BD978511E39E",
+ "path": "https://ext.lucee.org/s3-extension-2.0.1.25.lex"
+ }
+ ]
+}
+```
+
+You can define the `id` and `version` like in the first example (name is always optional), or provide a local path to the extension. Lucee supports virtual filesystems, so you can also define a virtual filesystem path, such as "https", "s3", or "ftp".
+
+On a fresh install of Lucee, Lucee will install the [bundled extensions](https://github.com/lucee/Lucee/blob/6.1/core/src/main/java/META-INF/MANIFEST.MF#L364) in addition to these extensions and update the `.CFConfig.json` file. On an existing installation, Lucee will remove all extensions installed that are not on this list.
+
+With Lucee 6.1, the "id" attribute is no longer necessary when you define a path.
+
+### Important Notes for Multi-Mode (Server and Web Admin Enabled)
+
+- If you run Lucee in Multi-Mode (Server and Web Admin enabled), you need to add the extension configuration to the root of the server context JSON file located at `{lucee-installation}/lucee-server/context/.CFConfig.json` and not in the web context JSON file.
+
+### Pros
+
+- You can automate the process
+- Easy to manage configurations and extensions in one place
+
+### Cons
+
+- No hot deployment
+- Requires configuration file management
+
+## Environment Variable / System Property
+
+You can also define the extension in an environment variable or system property. This option is similar to the `.CFConfig.json` option.
+
+Define a comma-separated list of Lucee extensions to install when starting up. This can be a simple list of IDs, in which case the latest versions will be installed:
+
+```plaintext
+99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6,
+671B01B8-B3B3-42B9-AC055A356BED5281,
+2BCD080F-4E1E-48F5-BEFE794232A21AF6
+```
+
+Or with more specific information like version and label (for better readability):
+
+```plaintext
+99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;name=MSSQL;label=MS SQL Server;version=12.2.0.jre8,
+671B01B8-B3B3-42B9-AC055A356BED5281;name=PostgreSQL;label=PostgreSQL;version=42.7.3,
+2BCD080F-4E1E-48F5-BEFE794232A21AF6;name=JDTsSQL;label=jTDS (MSSQL);version=1.3.1
+```
+
+You can also define a path to the extension in the same way as with `.CFConfig.json`:
+
+```plaintext
+60772C12-F179-D555-8E2CD2B4F7428718;name=Redis;path=/opt/lucee/extensions/redis.extension-3.0.0.51.lex,
+17AB52DE-B300-A94B-E058BD978511E39E;name=S3 Resource Extension;path=https://ext.lucee.org/s3-extension-2.0.1.25.lex
+```
+
+### Setting System Property
+
+To set a system property for Lucee extensions, you can use the `-D` option with the Java command that starts your Lucee server.
+
+Example command to start Lucee with system properties:
+
+```plaintext
+java -Dlucee.extensions="99A4EF8D-F2FD-40C8-8FB8C2E67A4EEEB6;name=MSSQL;version=12.2.0.jre8,671B01B8-B3B3-42B9-AC055A356BED5281;name=PostgreSQL;version=42.7.3" -jar lucee.jar
+```
+
+### Pros
+
+- Can be used in various deployment environments (e.g., Docker, cloud services)
+- Supports automation and infrastructure as code practices
+
+### Cons
+
+- No hot deployment
+- Requires setting environment variables or system properties, which might be complex in some environments
+
+## Logging and Troubleshooting
+
+If you encounter issues while installing extensions, you can check the log at `{lucee-installation}/lucee-server/context/logs/deploy.log` not only for any errors reported but also to see what actions were performed. This log is by default set to info level and should contain all details about the installation process.
+
+## Conclusion
+
+Lucee offers several methods to install extensions, each with its own advantages and disadvantages. Choose the method that best fits your deployment and management workflow:
+
+- **Lucee Administrator**: Best for manual, ad-hoc installations.
+- **`deploy` Directory**: Good for automated deployments with script support.
+- **`.CFConfig.json` Configuration**: Ideal for managing configurations and extensions together.
+- **Environment Variable / System Property**: Suitable for modern deployment environments like Docker and cloud services.
+
+By understanding the pros and cons of each method, you can effectively manage Lucee extensions in your environment.
diff --git a/docs/recipes/externalizing-strings.md b/docs/recipes/externalizing-strings.md
new file mode 100644
index 000000000..36495f6bf
--- /dev/null
+++ b/docs/recipes/externalizing-strings.md
@@ -0,0 +1,55 @@
+
+
+# Externalize strings
+
+Externalize strings from generated class files to separate files. This method is used to reduce the memory of the static contents for templates. We explain this method with a simple example below:
+
+**Example:**
+
+//index.cfm
+
+```lucee
+
+
+
+
....
+ .......
+ .......
+ It was popular in the #year#
+ .......
+ ....
+
+
+```
+
+1. Here the Index.cfm file contains a lot of strings (static contents), but there is no functionality. The file just gives a cfoutput with year. The variable string 'year' is already declared by using in top of the Index.cfm page.
+
+2. Execute the CFM page in a browser. A class file is created in the `webapps/ROOT/WEB-INF/lucee/cfclasses/` directory while the CFM file is executed. The run time compiler compiles that file to load the Java bytecode and execute it.
+
+3. Right click the class file. Then see `Get info`. For example, in my class file there is 8Kb size on the disk. In Lucee, the CFM file with its strings was also loaded. So a lot of memory could be occupied just by string loading the bytecode. To avoid this problem, the Lucee admin has the following solution:
+
+ - Lucee admin --> Language/compiler --> Externalize strings
+ - This `Externalize strings` setting has four options. Select any one option to test. We selected the fourth option (externalize strings larger than 10 characters).
+ - Again run the CFM page in a browser. The class file is created with lower memory size than the original 8Kb on disk.
+ - In addition, it created a text file too. The text file contains the strings from the CFM page. The cfoutput with year is simply not there. The byte code will crop the piece of cfoutput content from the CFM file.
+
+So, the string 'year' is no longer in memory. When the bytecode is called, it loads the string into memory. The memory is not occupied forever and this reduces the footprint of our application.
+
+## Footnotes
+
+Here you can see the above details in video
+
+[Externalize strings](https://youtu.be/AUcsHkVFXHE)
diff --git a/docs/recipes/file-extensions.md b/docs/recipes/file-extensions.md
new file mode 100644
index 000000000..d31f430a5
--- /dev/null
+++ b/docs/recipes/file-extensions.md
@@ -0,0 +1,68 @@
+
+
+# File Extensions
+
+Lucee supports several file extensions for different types of templates and components. The most common extensions are `.cfm`, `.cfc`, `.cfml`, and `.cfs`. Each serves a specific purpose in CFML development.
+
+## .cfm
+
+The `.cfm` extension is used for CFML templates. These files contain CFML code that is processed by the server to generate dynamic web pages.
+
+### Example
+
+```cfm
+
+
+
+ CFM Example
+
+
+
+
+
#greeting#
+
+
+
+```
+
+## .cfc
+
+The `.cfc` extension is used for CFML Components (CFCs). These files define reusable components that encapsulate functionality in methods, similar to classes in object-oriented programming.
+
+### Example
+
+```cfc
+component {
+ public string function greet(string name) {
+ return "Hello, " & name & "!";
+ }
+}
+```
+
+## .cfml
+
+The `.cfml` extension is an alternative to `.cfm` and can be used for CFML templates. It serves the same purpose as `.cfm` but is less commonly used.
+
+## .cfs
+
+Since version 6.0, Lucee supports templates with the extension `.cfs`. These templates contain script code, similar to `.js` files in the JavaScript world. This allows you to write direct script code without the need for the `` tag.
+
+### Example
+
+```cfs
+writeOutput("Hello from a .cfs file!");
+```
diff --git a/docs/recipes/filesystem-mapping.md b/docs/recipes/filesystem-mapping.md
new file mode 100644
index 000000000..9c471242f
--- /dev/null
+++ b/docs/recipes/filesystem-mapping.md
@@ -0,0 +1,30 @@
+
+
+# File system - Mappings
+
+We distinguish 3 different mapping types:
+
+- "component" mappings used to map components (similar to a classpath in Java),
+- "custom tag" mappings used to map custom tags
+- "regular mappings" for the rest ([[tag-include]], [[tag-file]] ...).
+
+* [[cookbook-filesystem-mapping-define-mapping]]
+* [[cookbook-application-context-set-mapping]]
+* Define a component Mapping (TODO)
+* Define a custom tag Mapping (TODO)
diff --git a/docs/recipes/function-listeners.md b/docs/recipes/function-listeners.md
new file mode 100644
index 000000000..0275b8f3c
--- /dev/null
+++ b/docs/recipes/function-listeners.md
@@ -0,0 +1,235 @@
+
+
+# Function Listeners
+
+Lucee 6.1 introduced a new feature called "Function Listeners". This allows you to execute a function (of any kind) in parallel, so you do not have to wait for the result of the execution, similar to using the `cfthread` tag. Function Listeners provide an easy syntax to not only execute a function in parallel but also include support to handle the result by simply adding a listener after the function call. This listener can handle the result or exception of a function.
+
+## Simple Version
+
+This example demonstrates a simple Function Listener that executes `mySuccess` in parallel and sets a variable with the result.
+
+```run
+
+function mySuccess() {
+ return "Susi Sorglos";
+}
+
+mySuccess():function(result,error) {
+ request.testFunctionListener=result;
+};
+// wait for the thread to finish
+sleep(100);
+dump(request.testFunctionListener ?: "undefined1");
+
+```
+
+## Join thread thread
+
+Instead of "run and forget" you can also join the thread with help of the function `threadJoin` (or the tags ``). You get a name from the call and that name you can use to join it. The thread information is available in the scope `cfhread` like a regular thread.
+
+```run
+
+function mySuccess() {
+ return "Susi Sorglos";
+}
+// the function call returns the name of the thread
+threadName=mySuccess():function(result,error) {
+ thread.result=result;
+};
+// you can then use the name to join the thread
+threadJoin(threadName);
+
+// and for example see the result in cfthread
+dump(cfthread[threadName].result);
+
+```
+
+## Handling Exceptions
+
+In this case we see what happens when the function throws an exception. in that case the argument `error` is provided to the listener function, you can then for example send it to the log.
+
+```run
+
+// function that throws an exception
+function myError() {
+ throw "Upsi dupsi!";
+}
+
+// storing the exception message in the thread scope
+threadName=myError():function(result,error) {
+ thread.result=error.message;
+};
+
+// wait for the thread to finish
+threadJoin(threadName);
+
+// see the result
+dump(cfthread[threadName].result);
+
+```
+
+## Listening on a Built-in Function (BIF)
+
+Instead of user defined functions, you can also listen to build in functions as well.
+
+```run
+
+threadName=arrayLen([1,2,3]):function(result,error) {
+ thread.result=result;
+};
+// wait for the thread to finish
+threadJoin(threadName);
+
+dump(cfthread[threadName].result);
+
+```
+
+## Listening on a variable "Chain"
+
+You can also listen to variable "chain".
+
+```run
+
+function mySuccess() {
+ return "Susi Sorglos";
+}
+// create a chain
+a.b.c.d=mySuccess;
+threadName=a.b.c.d():function(result,error) {
+ thread.result=result ?: error;
+};
+// wait for the thread to finish
+threadJoin(threadName);
+
+dump(cfthread[threadName].result);
+
+```
+
+## Listening on a Component Instantiation
+
+You can also listen to a component instantiation.
+
+```run
+
+threadName=new Query():function(result,error) {
+ thread.result=result;
+};
+
+// wait for the thread to finish
+threadJoin(threadName);
+
+dump(getMetadata(cfthread[threadName].result).fullname);
+
+```
+
+## Listening on a Static Component Function
+
+You can also listen to a static component function.
+
+```run
+
+threadName=Query::new(["columnName"]):function(result,error) {
+ thread.result=result;
+};
+
+// wait for the thread to finish
+threadJoin(threadName);
+
+dump(cfthread[threadName].result.columnlist);
+
+```
+
+## Function Collection Listener
+
+A listener does not need to be a function, it also can be a function collection (multiple functions inside a struct).
+This way you can define a function for specific events like `onSuccess` or `onFail` like this.
+
+```run
+
+function mySuccess() {
+ return "Susi Sorglos";
+}
+
+threadName1=mySuccess():{
+ onSuccess:function(result) {
+ thread.success=result;
+ }
+ ,onFail:function(error) {
+ thread.fail=error.message;
+ }
+};
+
+// wait for the thread to finish
+threadJoin(threadName1);
+dump(cfthread[threadName1].success);
+
+```
+
+## Component Listener
+
+You can also define a component instance as a listener, in this case we do a inline component.
+
+```run
+
+function mySuccess() {
+ return "Susi Sorglos";
+}
+
+threadName1=mySuccess():new component {
+ function onSuccess(result) {
+ thread.success=result;
+ }
+};
+
+// wait for the thread to finish
+threadJoin(threadName1);
+dump(cfthread[threadName1].success);
+
+```
+
+## No Listener
+
+In case you wanna simply a asynchron execution, but you don't care about the outcome, you can define no listener at all, simply pass `null` (in this case i use the function `nullValue()`, because only with full null support enabled, the constant `null` is available).
+
+```run
+
+// writing some data to the request scope
+function logAndFail(name,value) {
+ request.testFunctionListenerEcho[name]=value;
+ throw "Upsi dupsi!";
+}
+
+threadName1=logAndFail("testNull","Peter Lustig"):nullValue();
+
+// wait for the thread to finish
+threadJoin(threadName1);
+
+// reading the data stored to the request scope
+dump(request.testFunctionListenerEcho.testNull);
+
+```
+
+Instead of `null`, you can also simply pass a empty struct or a component not defining the function needed.
+
+```coldfusion
+
+// function collection with no listeners
+threadName2=logAndFail("testStruct","Ruedi Zraggen"):{};
+
+// function collection with no listeners
+threadName2=logAndFail("testStruct","Ruedi Zraggen"):new component {};
+```
diff --git a/docs/recipes/function-systemoutput.md b/docs/recipes/function-systemoutput.md
new file mode 100644
index 000000000..5113c1329
--- /dev/null
+++ b/docs/recipes/function-systemoutput.md
@@ -0,0 +1,80 @@
+
+
+# Function SystemOutput
+
+This document explains the systemoutput function with some simple examples.
+
+## Example 1:
+
+```luceescript
+
+directory action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+
+```
+
+```lucee
+
+dump(cgi); // or writedump if you love to write more
+echo(now()); // or writeoutput if you love to write more
+
+```
+
+This example has a simple dump with CGI. It displays normally in the browser while we are running example1.cfm.
+
+## Example 2:
+
+```luceescript
+// example2.cfm
+systemOutput(now(),true); // with new line
+```
+
+systemOutput() creates output content in the web browser (console). Here the systemoutput has two arguments: first argument _now()_ for current date and time, and second argument _true_ for a new line. Run this in the browser and see the content in the console.
+
+## Example 3:
+
+```luceescript
+// example3.cfm
+systemOutput(now(),true,true); // send to error stream
+```
+
+This example uses three arguments: first argument `now()` for current date and time, second argument `true` for a new line, and third argument for the stream. The stream argument indicates which stream the output should go. There are two streams to choose from: "Output stream" and "Error stream". A value of true in the third argument indicates the output should go to the error stream. Run this in the browser and see the contents with the output stream in the console.
+
+## Example 4:
+
+```luceescript
+// example4.cfm
+systemOutput(cgi,true); // complex object
+```
+
+In addition to simple strings or simple values, you can also pass complex objects to the SystemOutput() function. In this example we pass CGI as the argument. When you run this in the browser, you get a serialized output in the console.
+
+## Example 5:
+
+```luceescript
+// example5.cfm
+systemOutput("Here we are:",true); // complex object
+```
+
+SystemOutput() has another good feature too. There is `` used to show helpful information (where it is, which template, on which line number) while we mouse over the dump content. Lucee will detect and show the stack-trace if we add `` to the SystemOutput() function in our code. When we run this in the browser, we see the stack-trace in the console.
+
+## Footnotes
+
+Here you can see these details on video also:
+
+[Function SystemOutput](https://www.youtube.com/watch?v=X_BQPFPD320)
diff --git a/docs/recipes/get-dbdriver-from-maven.md b/docs/recipes/get-dbdriver-from-maven.md
new file mode 100644
index 000000000..34df78ce7
--- /dev/null
+++ b/docs/recipes/get-dbdriver-from-maven.md
@@ -0,0 +1,77 @@
+
+
+# Get Datasource Drivers Directly from Maven
+
+The following example is for the MySQL driver, but it works for all types of datasource drivers in exactly the same way.
+While you could install the MySQL extension to get the driver you need, it is not necessary. You can simply define the driver as shown below in the `Application.cfc` or `.CFConfig.json`.
+
+## Application.cfc
+
+You can define your datasource in the `Application.cfc` like this:
+
+```lucee
+this.datasources["mysql"] = {
+ class: "com.mysql.cj.jdbc.Driver",
+ bundleName: "com.mysql.cj",
+ bundleVersion: "8.4.0",
+ connectionString: "jdbc:mysql://localhost:3307/test?characterEncoding=UTF-8&serverTimezone=CET&maxReconnects=3",
+ username: "root",
+ password: "encrypted:...",
+
+ // optional settings
+ connectionLimit: -1, // default: -1
+ liveTimeout: 15, // default: -1; unit: minutes
+ alwaysSetTimeout: true, // default: false
+ validate: false // default: false
+};
+```
+
+You can use whatever version is available on [Maven](https://mvnrepository.com/artifact/com.mysql/mysql-connector-j).
+
+If you are unsure about the correct settings, simply install the MySQL extension, create a datasource in the Lucee admin, and at the bottom of the detail page, you will get an `Application.cfc` template for these settings.
+
+## .CFConfig.json
+
+For `.CFConfig.json`, your settings will look like this:
+
+```json
+"dataSources": {
+ "mysql": {
+ "class": "com.mysql.cj.jdbc.Driver",
+ "bundleName": "com.mysql.cj",
+ "bundleVersion": "8.4.0",
+ "custom": "characterEncoding=UTF-8&serverTimezone=CET&maxReconnects=3",
+ "database": "test",
+ "dbdriver": "MySQL",
+ "dsn": "jdbc:mysql://{host}:{port}/{database}",
+ "liveTimeout": "15",
+ "metaCacheTimeout": "60000",
+ "password": "encrypted:...",
+ "port": "3307",
+ "storage": "false",
+ "username": "root",
+ "validate": "false"
+ }
+}
+```
+
+Here, you can also use any version that is available on [Maven](https://mvnrepository.com/artifact/com.mysql/mysql-connector-j).
+
+Again, if you are unsure about the exact settings, simply install the MySQL extension, create a datasource in the admin, and then check out the datasource created in `.CFConfig`. Be careful here, because when you define the datasource in the Lucee admin, Lucee will set neither `bundleName` nor `bundleVersion`, as Lucee uses what is installed by default. To get it from Maven directly, you need to define the bundle information, so always add that information.
+
+## Conclusion
+
+The benefit over simply use the MySQL extension is, you can use the newest version of MySQL or any other DB driver that is fresh from the press, if no Lucee extension exist yet for that version.
diff --git a/docs/recipes/global-proxy.md b/docs/recipes/global-proxy.md
new file mode 100644
index 000000000..ff5b9c8ef
--- /dev/null
+++ b/docs/recipes/global-proxy.md
@@ -0,0 +1,58 @@
+
+
+# Global Proxy
+
+Since version 6.0, Lucee allows you to define a global proxy in the Application.cfc.
+
+If set, it will affect all connections made to the "outside world".
+
+```lucee
+this.proxy = {
+ server: "myproxy.com",
+ port: 1234,
+ username: "susi",
+ password: "sorglos"
+};
+```
+
+## Include
+
+You can also limit the proxy to specific hosts by defining a list (or array) of hosts it should be used for:
+
+```lucee
+this.proxy = {
+ server: "myproxy.com",
+ port: 1234,
+ username: "susi",
+ password: "sorglos",
+ includes: "whatever.com,lucee.org"
+};
+```
+
+## Exclude
+
+Or you can do the opposite, defining for which hosts it should not apply:
+
+```lucee
+this.proxy = {
+ server: "myproxy.com",
+ port: 1234,
+ username: "susi",
+ password: "sorglos",
+ excludes: ["lucee.org", "whatever.com"]
+};
+```
diff --git a/docs/recipes/hidden-gems.md b/docs/recipes/hidden-gems.md
new file mode 100644
index 000000000..590929c2e
--- /dev/null
+++ b/docs/recipes/hidden-gems.md
@@ -0,0 +1,123 @@
+
+
+# Hidden Gems
+
+This document explains how to declare variables, function calls with dot and bracket notation, and passing arguments via URL/form scopes as an array. These concepts are explained with simple examples below:
+
+## Example 1: Declare Variables
+
+// test.cfc
+
+```luceescript
+component {
+ function getName() {
+ return "Susi";
+ }
+}
+```
+
+// example1.cfm
+
+```luceescript
+function test() {
+ var qry;
+ dump(qry);
+ query name="qry" datasource="test" {
+ echo("select 1 as one");
+ }
+ dump(qry);
+}
+test();
+```
+
+In the cfm page, we have a test() function with a local variable scope assigned as an empty string `var qry`. When executing this cfm, the qry returns "1". Dumping the `qry` below the var declaration returns an empty string.
+
+## Example 2: Dot and Bracket Notation for Function Calls
+
+Lucee allows you to use bracket notation to call a component function.
+
+// example2.cfm
+
+```luceescript
+// UDF call via dot notation
+test = new Test();
+dump( test.getName() );
+// Dynamic function name
+funcName = "getName";
+dump(evaluate('test.#funcName#()'));
+// UDF call via bracket notation
+funcName = "getName";
+dump( test[funcName]() );
+```
+
+These three different types of function calls are:
+
+- Calling the user-defined function `getName()` from the component.
+- Dynamic function name with evaluate function.
+- User-defined function via bracket notation.
+
+All three different function calls return the same content "Susi" as defined in the CFC page.
+
+## Example 3: Passing Arguments via URL/Form Scopes as Array
+
+Lucee allows passing URL and Form scope data as an array instead of a string list.
+
+// example3.cfm
+
+```lucee
+
+ dump(label:"URL", var:url);
+ dump(label:"Form", var:form);
+ // current name
+ curr = listLast(getCurrentTemplatePath(),'\/');
+
+
+
+
Countries
+
+
+```
+
+// index.cfm
+
+```luceescript
+directory sort="name" action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+In this cfm page, URL and form scopes are available. The names are used twice.
+
+- The query string on the URL scope has the same name `country` twice. Similarly, the form also has two fields with the same name `country`.
+- Execute this cfm page in the browser & submit the form. It shows a single URL string list in merged format instead of two fields & Form fields also merged as a single `country` field.
+- Adding square brackets behind the name `country[]` means it returns two separate strings in array format. You will see the difference in the browser while dumping that name with square brackets.
+
+These simple methods are helpful for defining variables in different ways.
+
+## Footnotes
+
+Here you can see the above details in the video
+
+[Lucee Hidden Gems](https://youtu.be/4MUKPiQv1kAsss)
diff --git a/docs/recipes/import.md b/docs/recipes/import.md
new file mode 100644
index 000000000..2ca7f8ea7
--- /dev/null
+++ b/docs/recipes/import.md
@@ -0,0 +1,128 @@
+
+
+# Import
+
+The `` tag in Lucee has a dual purpose. It can be used to import components using the `path` attribute or CFML/JSP custom tags using the `prefix` and `taglib` attributes.
+
+## Import Components
+
+To import a component, you can use the `path` attribute. This can be done in both tag syntax and script syntax.
+
+### Tag Syntax
+
+To import a component in tag syntax:
+
+```cfml
+
+
+
+ // Create an instance of the imported component
+ myInstance = new MyCFC();
+
+```
+
+### Script Syntax
+
+To import a component in script syntax, you have two options:
+
+Using `cfimport` function:
+
+```cfml
+
+ cfimport(path="org.lucee.example.MyCFC");
+
+ // Create an instance of the imported component
+ myInstance = new MyCFC();
+
+```
+
+Using the `import` keyword:
+
+```cfml
+
+ import org.lucee.example.MyCFC;
+
+ // Create an instance of the imported component
+ myInstance = new MyCFC();
+
+```
+
+You can also use quotes with the `import` keyword:
+
+```cfml
+
+ import "org.lucee.example.MyCFC";
+
+ // Create an instance of the imported component
+ myInstance = new MyCFC();
+
+```
+
+### Import Multiple Components
+
+To import all components in a package, use the asterisk (`*`):
+
+```cfml
+
+ import "org.lucee.example.*";
+
+ // Create an instance of a component from the imported package
+ myInstance = new MyCFC();
+
+```
+
+### Scope of Import
+
+An import only affects the current template and not the entire request.
+
+## Import Custom Tags
+
+You can also import CFML or Java custom tags using the `prefix` and `taglib` attributes.
+
+### Tag Syntax
+
+To import custom tags in tag syntax:
+
+```cfml
+
+
+
+
+```
+
+### Script Syntax
+
+To import custom tags in script syntax:
+
+```cfml
+
+ cfimport(prefix="my", taglib="/path/to/tags/");
+
+
+
+
+```
+
+For importing custom tags, the `import` keyword cannot be used.
+
+## Supported Custom Tags
+
+Lucee supports CFML-based custom tags written as CFML templates or as components. You can also define a TLD file that points to JSP tags.
+
+## Conclusion
+
+The `` tag is a versatile tool in Lucee for importing both components and custom tags, allowing for modular and organized code. By using the appropriate attributes and syntax, you can effectively manage dependencies and custom functionalities within your Lucee applications.
diff --git a/docs/recipes/index.json b/docs/recipes/index.json
new file mode 100644
index 000000000..ccf6c6ea3
--- /dev/null
+++ b/docs/recipes/index.json
@@ -0,0 +1,1006 @@
+[
+ {
+ "file": "application-context-update.md",
+ "title": "Application Context update",
+ "path": "/docs/recipes/application-context-update.md",
+ "hash": "996c66538ed2c107fabed44863cf0885",
+ "keywords": [
+ "Application Context",
+ "Update Application",
+ "Mappings",
+ "cfapplication",
+ "getApplicationSettings",
+ "Application.cfc"
+ ]
+ },
+ {
+ "file": "archives-creating-and-deploy.md",
+ "title": "Archives - Creating and deploying Lucee Archives (.lar files)",
+ "path": "/docs/recipes/archives-creating-and-deploy.md",
+ "hash": "4726b05d39364e952a48ede93b29a67f",
+ "keywords": [
+ "Lucee",
+ "Archives",
+ ".lar files",
+ "Deploy",
+ "Mapping",
+ "Component",
+ "CFC",
+ "CFM"
+ ]
+ },
+ {
+ "file": "basic-date.md",
+ "title": "Basic Date - Output the current date",
+ "path": "/docs/recipes/basic-date.md",
+ "hash": "f66410455e64f965fa03df7649e092a3",
+ "keywords": [
+ "Date",
+ "Current date",
+ "lsDateTimeFormat",
+ "now",
+ "setLocale",
+ "Application.cfc",
+ "Locale"
+ ]
+ },
+ {
+ "file": "cached-within-request.md",
+ "title": "Cache a Query for the current request",
+ "path": "/docs/recipes/cached-within-request.md",
+ "hash": "caaac5d46fc01f776f8e29abe49c60e5",
+ "keywords": [
+ "Cache",
+ "Query",
+ "Request cache",
+ "cachedWithin",
+ "cfquery"
+ ]
+ },
+ {
+ "file": "caches-defined-in-application-cfc.md",
+ "title": "Caches defined in Application.cfc",
+ "path": "/docs/recipes/caches-defined-in-application-cfc.md",
+ "hash": "c37a4cb6f4fb432f17b432e56366df13",
+ "keywords": [
+ "Caches",
+ "Application.cfc",
+ "Per-application caches",
+ "Cache connections",
+ "Default caches",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "check-for-changes.md",
+ "title": "Check for changes in your configuration file automatically",
+ "path": "/docs/recipes/check-for-changes.md",
+ "hash": "c953e038012d3949f25e943018d8688c",
+ "keywords": [
+ "Configuration",
+ "Check for changes",
+ "Lucee",
+ "Automatic update",
+ "Server context",
+ "Web context"
+ ]
+ },
+ {
+ "file": "checksum.md",
+ "title": "Checksum",
+ "path": "/docs/recipes/checksum.md",
+ "hash": "a1fef15b4e0bd041aa90bd1cbb126a5d",
+ "keywords": [
+ "Checksum",
+ "File validation",
+ "cfhttp",
+ "hash",
+ "fileReadBinary"
+ ]
+ },
+ {
+ "file": "configuration-administrator-cfc.md",
+ "title": "Configure Lucee within your application",
+ "path": "/docs/recipes/configuration-administrator-cfc.md",
+ "hash": "c8b3b9c27321db7bec51568b5d8b3a70",
+ "keywords": [
+ "Administrator.cfc",
+ "cfadmin",
+ "Configuration",
+ "Lucee",
+ "Web context",
+ "Server configuration"
+ ]
+ },
+ {
+ "file": "convert-a-cfml-func-to-java.md",
+ "title": "Convert a CFML Function/Component to use in Java",
+ "path": "/docs/recipes/convert-a-cfml-func-to-java.md",
+ "hash": "0dcbbce8a20bcd390e27d396fd0985e1",
+ "keywords": [
+ "conversion",
+ "cfc",
+ "function",
+ "component",
+ "Java",
+ "lambda",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "datasource-how-to-define-them.md",
+ "title": "Datasource - How to define them",
+ "path": "/docs/recipes/datasource-how-to-define-them.md",
+ "hash": "612c8cd0a200d9abfc8d5b9497971e88",
+ "keywords": [
+ "Datasource",
+ "Define datasource",
+ "Administrator",
+ "Application.cfc",
+ "Default datasource",
+ "MySQL"
+ ]
+ },
+ {
+ "file": "docker-onbuild.md",
+ "title": "onBuild Function in Server.cfc (supported since Lucee 6.1.1)",
+ "path": "/docs/recipes/docker-onbuild.md",
+ "hash": "176e7866b1e914fa52485a44d43f5a90",
+ "keywords": [
+ "onBuild",
+ "Server.cfc",
+ "build",
+ "Docker",
+ "server",
+ "compile",
+ "encrypt",
+ "validate",
+ "prewarm",
+ "warmup",
+ "startup",
+ "hook",
+ "event"
+ ]
+ },
+ {
+ "file": "docker.md",
+ "title": "Docker Information",
+ "path": "/docs/recipes/docker.md",
+ "hash": "890489bc2e12ed673935f3b2d0263b78",
+ "keywords": [
+ "Docker",
+ "commandbox",
+ "installation",
+ "kubernetes"
+ ]
+ },
+ {
+ "file": "encryption_decryption.md",
+ "title": "Encryption/Decryption",
+ "path": "/docs/recipes/encryption_decryption.md",
+ "hash": "54975e06c458f45f282e75438d9975b8",
+ "keywords": [
+ "Encryption",
+ "Decryption",
+ "RSA",
+ "Public key",
+ "Private key",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "environment-variables-system-properties.md",
+ "title": "Environment Variables / System Properties for Lucee",
+ "path": "/docs/recipes/environment-variables-system-properties.md",
+ "hash": "72a554081fc2af4bfaff28e66e505267",
+ "keywords": [
+ "Environment",
+ "Environment Variables",
+ "Properties",
+ "System Properties",
+ "setting",
+ "cofig"
+ ]
+ },
+ {
+ "file": "event-gateway-create.md",
+ "title": "Custom Event Gateways",
+ "path": "/docs/recipes/event-gateway-create.md",
+ "hash": "f82f361b20c0bd9706d81e122024b8bb",
+ "keywords": [
+ "Event Gateway",
+ "Custom Gateway",
+ "Directory Watcher",
+ "File Size Checker",
+ "Lucee",
+ "Gateway Driver"
+ ]
+ },
+ {
+ "file": "event-gateway-in-app-cfc.md",
+ "title": "Event Handling in Application.cfc",
+ "path": "/docs/recipes/event-gateway-in-app-cfc.md",
+ "hash": "81f8b93eaf6629dcdf512dd247bb5b13",
+ "keywords": [
+ "Event Handling",
+ "Application.cfc",
+ "onApplicationStart",
+ "onSessionStart",
+ "onRequestStart",
+ "onRequest",
+ "onCFCRequest",
+ "onError",
+ "onAbort",
+ "onDebug",
+ "onMissingTemplate"
+ ]
+ },
+ {
+ "file": "event-gateways-how-they-work.md",
+ "title": "Event Gateway - How they work?",
+ "path": "/docs/recipes/event-gateways-how-they-work.md",
+ "hash": "a6dc0c39537f66692fed0d8ca1a66367",
+ "keywords": [
+ "Event Gateway",
+ "Directory Watcher",
+ "Mail Watcher",
+ "Lucee",
+ "cfadmin",
+ "File Changes"
+ ]
+ },
+ {
+ "file": "event-gateways.md",
+ "title": "Event Gateways",
+ "path": "/docs/recipes/event-gateways.md",
+ "hash": "81f72bcc92dd36139b851423c1c7359d",
+ "keywords": [
+ "Event Gateway",
+ "Custom Gateway",
+ "SMS",
+ "File Change",
+ "Mail Server",
+ "Slack Notification",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "event-handling-in-app-cfc.md",
+ "title": "Event Handling in Application.cfc",
+ "path": "/docs/recipes/event-handling-in-app-cfc.md",
+ "hash": "bc76937b11c5b27128f8d752c843bdae",
+ "keywords": [
+ "Event Handling",
+ "Application.cfc",
+ "onApplicationStart",
+ "onSessionStart",
+ "onRequestStart",
+ "onRequest",
+ "onCFCRequest",
+ "onError",
+ "onAbort",
+ "onDebug",
+ "onMissingTemplate"
+ ]
+ },
+ {
+ "file": "exception-cause.md",
+ "title": "Exception - Cause",
+ "path": "/docs/recipes/exception-cause.md",
+ "hash": "d38b239656cae0e99e6784155a48433d",
+ "keywords": [
+ "exception",
+ "error",
+ "cause",
+ "thread",
+ "parent"
+ ]
+ },
+ {
+ "file": "exception-output.md",
+ "title": "Exceptions Output",
+ "path": "/docs/recipes/exception-output.md",
+ "hash": "1ac2a166eb95cc8a7892adbf06fe736c",
+ "keywords": [
+ "Exception",
+ "Output",
+ "Catch",
+ "Display exceptions",
+ "Lucee",
+ "try-catch"
+ ]
+ },
+ {
+ "file": "extension-installation.md",
+ "title": "Extension Installation",
+ "path": "/docs/recipes/extension-installation.md",
+ "hash": "9b5d3396c15710bdd224d63171ec3fd9",
+ "keywords": [
+ "extension",
+ "install",
+ "lucee administrator",
+ "deploy directory",
+ "CFConfig.json",
+ "environment variable",
+ "system property",
+ "hot deployment",
+ "automation"
+ ]
+ },
+ {
+ "file": "externalizing-strings.md",
+ "title": "Externalize strings",
+ "path": "/docs/recipes/externalizing-strings.md",
+ "hash": "cac194b9345a0133c8c1985b75b8981f",
+ "keywords": [
+ "Externalize strings",
+ "Memory reduction",
+ "Class files",
+ "Static contents",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "file-extensions.md",
+ "title": "File Extensions",
+ "path": "/docs/recipes/file-extensions.md",
+ "hash": "649c74438e264a8e29eec5ea07aa9eab",
+ "keywords": [
+ "CFML",
+ "cfm",
+ "cfc",
+ "cfml",
+ "cfs",
+ "file extensions"
+ ]
+ },
+ {
+ "file": "filesystem-mapping.md",
+ "title": "File system - Mappings",
+ "path": "/docs/recipes/filesystem-mapping.md",
+ "hash": "d64043f0e9b8231abd2ff02cc0dd16b1",
+ "keywords": [
+ "Mapping",
+ "Component mapping",
+ "Custom tag mapping",
+ "Regular mapping",
+ "File system"
+ ]
+ },
+ {
+ "file": "function-listeners.md",
+ "title": "Function Listeners",
+ "path": "/docs/recipes/function-listeners.md",
+ "hash": "fb4c0a4e5e8dc80158edf3dd680c048d",
+ "keywords": [
+ "parallel",
+ "async",
+ "thread",
+ "function",
+ "promises"
+ ]
+ },
+ {
+ "file": "function-systemoutput.md",
+ "title": "Function SystemOutput",
+ "path": "/docs/recipes/function-systemoutput.md",
+ "hash": "59046be4f7a342b242f0fcc88468882e",
+ "keywords": [
+ "SystemOutput function",
+ "Debugging",
+ "Output stream",
+ "Error stream",
+ "Stack trace"
+ ]
+ },
+ {
+ "file": "get-dbdriver-from-maven.md",
+ "title": "Get Datasource Drivers Directly from Maven",
+ "path": "/docs/recipes/get-dbdriver-from-maven.md",
+ "hash": "34d33dd5ea56e9ccfb539c246bdd0f4e",
+ "keywords": [
+ "datasource",
+ "maven",
+ "mysql",
+ "db"
+ ]
+ },
+ {
+ "file": "global-proxy.md",
+ "title": "Global Proxy",
+ "path": "/docs/recipes/global-proxy.md",
+ "hash": "cdf4145a729621988220682f731e425b",
+ "keywords": [
+ "CFML",
+ "proxy",
+ "global proxy",
+ "Lucee",
+ "Application.cfc"
+ ]
+ },
+ {
+ "file": "hidden-gems.md",
+ "title": "Hidden Gems",
+ "path": "/docs/recipes/hidden-gems.md",
+ "hash": "3ab486e60bde4cd0203f26b5c9078758",
+ "keywords": [
+ "Hidden gems",
+ "Declare variables",
+ "Function calls",
+ "Dot notation",
+ "Bracket notation",
+ "URL form scopes",
+ "Array format"
+ ]
+ },
+ {
+ "file": "import.md",
+ "title": "Import",
+ "path": "/docs/recipes/import.md",
+ "hash": "d0a4f5427a500c100381695fcf029ff4",
+ "keywords": [
+ "cfimport",
+ "import",
+ "Lucee",
+ "components",
+ "custom tags",
+ "taglib"
+ ]
+ },
+ {
+ "file": "inline-components.md",
+ "title": "Inline Component",
+ "path": "/docs/recipes/inline-components.md",
+ "hash": "cfea57ca49e66f2ba76a79d439adf2d8",
+ "keywords": [
+ "CFML",
+ "component",
+ "inline-component",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "java-explicit-casting.md",
+ "title": "Java - Explicit Casting of a Component to a Specific Interface",
+ "path": "/docs/recipes/java-explicit-casting.md",
+ "hash": "d7bf4af9b9a8bacd1cde12f9f2a15bc7",
+ "keywords": [
+ "java",
+ "cast",
+ "convert",
+ "method"
+ ]
+ },
+ {
+ "file": "java-in-functions-and-closures.md",
+ "title": "Java in Functions and Closures",
+ "path": "/docs/recipes/java-in-functions-and-closures.md",
+ "hash": "411e845bac8e2978a974ea3af94ab1a5",
+ "keywords": [
+ "function",
+ "java",
+ "closures",
+ "components",
+ "lambda",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "java-settings.md",
+ "title": "Java Settings in Application.cfc",
+ "path": "/docs/recipes/java-settings.md",
+ "hash": "e2d2e72d7019ece36553f54aa0593d19",
+ "keywords": [
+ "Java settings",
+ "Application.cfc",
+ "javasettings",
+ "cfapplication"
+ ]
+ },
+ {
+ "file": "lazy-queries.md",
+ "title": "Lazy Queries",
+ "path": "/docs/recipes/lazy-queries.md",
+ "hash": "8fe64da123e2f7e52abb3fb4f272c789",
+ "keywords": [
+ "Lazy Queries",
+ "Regular Queries",
+ "Performance",
+ "Memory Optimization",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "list-existing-cache-conn.md",
+ "title": "List existing Cache Connections",
+ "path": "/docs/recipes/list-existing-cache-conn.md",
+ "hash": "c881e8d1cd05a738dcb92c3dcbaab1fc",
+ "keywords": [
+ "Cache",
+ "Cache connections",
+ "List cache",
+ "hasCache",
+ "cacheNames",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "loop-labels.md",
+ "title": "Loop Labels",
+ "path": "/docs/recipes/loop-labels.md",
+ "hash": "aea64c62a64313fa7d87e3b8c15ef5cd",
+ "keywords": [
+ "loop",
+ "label",
+ "for",
+ "while",
+ "continue",
+ "break"
+ ]
+ },
+ {
+ "file": "loop-through-files.md",
+ "title": "Looping Through File",
+ "path": "/docs/recipes/loop-through-files.md",
+ "hash": "2387d7589d70fc3977f33db5989a8793",
+ "keywords": [
+ "Looping through files",
+ "cffile",
+ "fileRead",
+ "fileReadBinary",
+ "Memory optimization",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "mail-how-to-send-a-mail.md",
+ "title": "Mail - How to send a Mail",
+ "path": "/docs/recipes/mail-how-to-send-a-mail.md",
+ "hash": "c278c5dff011da0798117834fdf3c9c7",
+ "keywords": [
+ "Email",
+ "Send mail",
+ "cfmail",
+ "Mail server",
+ "Mail script",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "mail-listener.md",
+ "title": "Mail Listeners",
+ "path": "/docs/recipes/mail-listener.md",
+ "hash": "8cea64daf2a3141d4132d74a4238ac49",
+ "keywords": [
+ "mail",
+ "listener",
+ "Application.cfc",
+ "component"
+ ]
+ },
+ {
+ "file": "mappings-how-to-define-a-reg-mapping.md",
+ "title": "Mappings - How to define a regular Mapping",
+ "path": "/docs/recipes/mappings-how-to-define-a-reg-mapping.md",
+ "hash": "7a3dcbd7f77c1db9f805512d4d17d897",
+ "keywords": [
+ "Mapping",
+ "Filesystem",
+ "Define mapping",
+ "Application.cfc",
+ "Lucee archive"
+ ]
+ },
+ {
+ "file": "mathematical-precision.md",
+ "title": "Mathematical Precision",
+ "path": "/docs/recipes/mathematical-precision.md",
+ "hash": "fd0a4bf923840d968652e201575d3fd3",
+ "keywords": [
+ "CFML",
+ "math",
+ "precision",
+ "BigDecimal",
+ "Lucee",
+ "Application.cfc",
+ "PrecisionEvaluate"
+ ]
+ },
+ {
+ "file": "monitoring-debugging.md",
+ "title": "Monitoring/Debugging",
+ "path": "/docs/recipes/monitoring-debugging.md",
+ "hash": "598cdd7328ecba6f890d19338abf375f",
+ "keywords": [
+ "monitoring",
+ "debugging",
+ "admin",
+ "Application.cfc",
+ "cfsetting",
+ "debug",
+ "showdebugoutput",
+ "cfapplication"
+ ]
+ },
+ {
+ "file": "monitoring-enable-for-your-session.md",
+ "title": "Monitoring - Enable for your session",
+ "path": "/docs/recipes/monitoring-enable-for-your-session.md",
+ "hash": "40b88dc626df5c52efe6c02b9e0601e9",
+ "keywords": [
+ "monitoring",
+ "session"
+ ]
+ },
+ {
+ "file": "null-support.md",
+ "title": "Null Support",
+ "path": "/docs/recipes/null-support.md",
+ "hash": "1632a30798317207a90f34f6c1167b74",
+ "keywords": [
+ "Null support",
+ "null keyword",
+ "NullValue function",
+ "isNull function",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "pdf-engine-flying-saucer.md",
+ "title": "PDF Engine - Flying Saucer (CFDocument)",
+ "path": "/docs/recipes/pdf-engine-flying-saucer.md",
+ "hash": "58a53f406410c3915ad12f6bde20f158",
+ "keywords": [
+ "Flying Saucer",
+ "PDF Engine",
+ "CFDOCUMENT",
+ "HTML to PDF"
+ ]
+ },
+ {
+ "file": "precompiled-code.md",
+ "title": "Precompiled Code",
+ "path": "/docs/recipes/precompiled-code.md",
+ "hash": "106f0b51ff0b285f474d8b64add272d2",
+ "keywords": [
+ "Precompiled",
+ "Pre-compile code",
+ "Production server",
+ "Security",
+ "CFML",
+ "Class files",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "query-async.md",
+ "title": "Query Async",
+ "path": "/docs/recipes/query-async.md",
+ "hash": "185df889c6bf4de47668895c9c708d94",
+ "keywords": [
+ "query",
+ "async",
+ "listener",
+ "thread",
+ "parallel"
+ ]
+ },
+ {
+ "file": "query-handling.md",
+ "title": "Query Handling in Lucee",
+ "path": "/docs/recipes/query-handling.md",
+ "hash": "f18d07bcde6c11ea5fd7aae6985643d0",
+ "keywords": [
+ "Query",
+ "SQL",
+ "QueryParam",
+ "Query Builder",
+ "cfquery",
+ "params",
+ "Query Handling"
+ ]
+ },
+ {
+ "file": "query-indexes.md",
+ "title": "Query Indexes",
+ "path": "/docs/recipes/query-indexes.md",
+ "hash": "e1d9bdad9e6a50cc9d6ee1bb08b36765",
+ "keywords": [
+ "query",
+ "indexes",
+ "cfquery"
+ ]
+ },
+ {
+ "file": "query-listener.md",
+ "title": "Query Listeners",
+ "path": "/docs/recipes/query-listener.md",
+ "hash": "9497bb3976a1910f94c2a631a43bc5eb",
+ "keywords": [
+ "query",
+ "listener",
+ "Lucee",
+ "Application.cfc",
+ "component"
+ ]
+ },
+ {
+ "file": "query-of-queries.md",
+ "title": "Query of Queries (QoQ)",
+ "path": "/docs/recipes/query-of-queries.md",
+ "hash": "0260dff0425bb3cd893ac4767cd8e4e2",
+ "keywords": [
+ "Query of Queries",
+ "QoQ",
+ "SQL",
+ "In memory query",
+ "Lucee",
+ "dbtype query"
+ ]
+ },
+ {
+ "file": "query-of-query-sometime.md",
+ "title": "Query of Queries sometimes it rocks, sometimes it sucks",
+ "path": "/docs/recipes/query-of-query-sometime.md",
+ "hash": "9aa140cf0b422b4a0a96d52c5fbe9835",
+ "keywords": [
+ "Query of Queries",
+ "QoQ",
+ "Performance",
+ "Query Filter",
+ "Query Sort",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "query-return-type.md",
+ "title": "Query return type",
+ "path": "/docs/recipes/query-return-type.md",
+ "hash": "792f4fe5807a39611254146c37100db9",
+ "keywords": [
+ "Query return type",
+ "Array return type",
+ "Struct return type",
+ "Foreign key",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "read-xml-with-a-listener-model-sax.md",
+ "title": "Read XML with a listener Model (SAX)",
+ "path": "/docs/recipes/read-xml-with-a-listener-model-sax.md",
+ "hash": "b0f18d5228f3cf2e7a889d7c3954b844",
+ "keywords": [
+ "XML",
+ "SAX",
+ "XML Parsing",
+ "Event Driven",
+ "XML Event Parsing",
+ "XML to Struct"
+ ]
+ },
+ {
+ "file": "request-timeout.md",
+ "title": "Request Timeout",
+ "path": "/docs/recipes/request-timeout.md",
+ "hash": "d29d7f0ace7a4a6b683c825af4fd36aa",
+ "keywords": [
+ "request timeout",
+ "timeout",
+ "memory",
+ "cpu",
+ "Concurrent Requests",
+ "Administrator",
+ "Application.cfc",
+ "cfsetting",
+ "Threshold"
+ ]
+ },
+ {
+ "file": "retry.md",
+ "title": "Retry",
+ "path": "/docs/recipes/retry.md",
+ "hash": "d6639c1b5be93b3de2d93e22ae0e4d8f",
+ "keywords": [
+ "Retry",
+ "Exception handling",
+ "Try catch",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "script-templates.md",
+ "title": "Script Templates",
+ "path": "/docs/recipes/script-templates.md",
+ "hash": "a31ad423369d46df7824c7c2e952d086",
+ "keywords": [
+ "CFML",
+ "script",
+ "templates",
+ "Lucee",
+ "cfs"
+ ]
+ },
+ {
+ "file": "startup-listeners-code.md",
+ "title": "Startup Listeners - Server.cfc and Web.cfc",
+ "path": "/docs/recipes/startup-listeners-code.md",
+ "hash": "edb4b5bdad97967849c5796a18a0fe09",
+ "keywords": [
+ "startup",
+ "warmup",
+ "prewarm",
+ "Server.cfc",
+ "Web.cfc",
+ "onServerStart",
+ "onWebStart",
+ "onBuild",
+ "initialization",
+ "bootstrap",
+ "configuration",
+ "initialization",
+ "events",
+ "hooks"
+ ]
+ },
+ {
+ "file": "static-scope-in-components.md",
+ "title": "Static scope in components",
+ "path": "/docs/recipes/static-scope-in-components.md",
+ "hash": "4ef213604dc8a1abf5335bc1a1073a74",
+ "keywords": [
+ "Static scope",
+ "Components",
+ "Lucee",
+ "Application scope",
+ "Server scope",
+ "GetComponentMetaData"
+ ]
+ },
+ {
+ "file": "sub-components.md",
+ "title": "Sub Component",
+ "path": "/docs/recipes/sub-components.md",
+ "hash": "479f64357ac885abaa16ac74dc171612",
+ "keywords": [
+ "CFML",
+ "component",
+ "sub-component",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "supercharge-your-website.md",
+ "title": "Supercharge your website",
+ "path": "/docs/recipes/supercharge-your-website.md",
+ "hash": "cba98355eb7396979f04febd592cee35",
+ "keywords": [
+ "Supercharge website",
+ "Performance",
+ "Caching",
+ "Template cache",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "thread-task.md",
+ "title": "Thread Task",
+ "path": "/docs/recipes/thread-task.md",
+ "hash": "e0fb0c5456add34c97c1adf447cd77fb",
+ "keywords": [
+ "Thread Tasks",
+ "Daemon Threads",
+ "Task Threads",
+ "Retry",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "thread-usage.md",
+ "title": "Thread Usage",
+ "path": "/docs/recipes/thread-usage.md",
+ "hash": "04376a0a607d55b64c206cdd386f08d1",
+ "keywords": [
+ "Threads",
+ "Parallel execution",
+ "cfthread",
+ "Asynchronous tasks",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "timeout.md",
+ "title": "Timeout",
+ "path": "/docs/recipes/timeout.md",
+ "hash": "b7e03149be0aa44af86508797a0f675c",
+ "keywords": [
+ "tag",
+ "timeout",
+ "listener",
+ "Lucee",
+ "cftimeout",
+ "error handling"
+ ]
+ },
+ {
+ "file": "types-in-lucee.md",
+ "title": "Types in Lucee",
+ "path": "/docs/recipes/types-in-lucee.md",
+ "hash": "5c5fcd8d807661d0f0988282fe41b9a2",
+ "keywords": [
+ "Types",
+ "Function argument",
+ "Return value",
+ "CFParam",
+ "Lucee"
+ ]
+ },
+ {
+ "file": "using-s3-directly-for-source-code.md",
+ "title": "Using S3 directly for source code",
+ "path": "/docs/recipes/using-s3-directly-for-source-code.md",
+ "hash": "4fc9da16c9ed40562120ffacaad51a80",
+ "keywords": [
+ "S3",
+ "Source code",
+ "Credentials",
+ "Mapping",
+ "Caching"
+ ]
+ },
+ {
+ "file": "virtual-file-system.md",
+ "title": "Virtual File Systems",
+ "path": "/docs/recipes/virtual-file-system.md",
+ "hash": "46240b85031475591b0fa9c17b7d1a40",
+ "keywords": [
+ "Virtual File System",
+ "VFS",
+ "Local File System",
+ "ZIP",
+ "RAM",
+ "S3",
+ "FTP",
+ "git",
+ "HTTP",
+ "MinIO",
+ "Wasabi",
+ "Backblaze B2",
+ "Google Cloud Storage",
+ "Microsoft Azure Blob Storage",
+ "IBM Cloud Object Storage",
+ "DigitalOcean Spaces",
+ "Ceph",
+ "Alibaba Cloud OSS",
+ "DreamHost DreamObjects",
+ "Scality RING",
+ "Dell EMC ECS",
+ "Cloudian HyperStore",
+ "OpenIO",
+ "NetApp StorageGRID"
+ ]
+ },
+ {
+ "file": "websocket-extension.md",
+ "title": "WebSocket Extension",
+ "path": "/docs/recipes/websocket-extension.md",
+ "hash": "849d999dd657e7a8485b15f2656fe969",
+ "keywords": [
+ "Lucee",
+ "Extension"
+ ]
+ },
+ {
+ "file": "xml-fast-and-easy.md",
+ "title": "XML Fast And Easy, using SAX - Listener Functions",
+ "path": "/docs/recipes/xml-fast-and-easy.md",
+ "hash": "4d5bdb9d198add9a48817d95c1888e40",
+ "keywords": [
+ "XML parsing",
+ "SAX",
+ "XML event listener",
+ "XMLCatalog",
+ "Lucee"
+ ]
+ }
+]
diff --git a/docs/recipes/inline-components.md b/docs/recipes/inline-components.md
new file mode 100644
index 000000000..8ae66b366
--- /dev/null
+++ b/docs/recipes/inline-components.md
@@ -0,0 +1,32 @@
+
+
+# Inline Component
+
+Since Lucee 6.0, Lucee allows you to create inline components. These are components you can create directly in your CFML code, with no need to create a .cfc file for it. This feature allows you to directly use them, similar to closures.
+
+This example shows how to create an inline component and then use it:
+
+```run
+
+inline = new component {
+ function subTest() {
+ return "inline ";
+ }
+};
+dump("inline->" & inline.subTest());
+dump(inline);
+
+```
diff --git a/docs/recipes/java-explicit-casting.md b/docs/recipes/java-explicit-casting.md
new file mode 100644
index 000000000..8411ae2f8
--- /dev/null
+++ b/docs/recipes/java-explicit-casting.md
@@ -0,0 +1,70 @@
+
+
+# Java - Explicit Casting of a Component to a Specific Interface
+
+This guide demonstrates how to explicitly cast a component to a specific interface in Lucee.
+
+## Implicit Casting
+
+Lucee supports implicit casting by passing a component to a method where the method argument is of a specific type. For example:
+
+```lucee
+cs = new component implementsJava="java.lang.CharSequence" {
+ variables.text = "en_us";
+
+ public function onMissingMethod(missingMethodName, missingMethodArguments) {
+ if ("toString" == missingMethodName) return variables.text;
+ else throw "method #missingMethodName# not supported yet!";
+ }
+};
+// setLocale expects a String as argument PageContext.setLocale(java.lang.String)
+getPageContext().setLocale(cs);
+```
+
+In this example, Lucee implicitly finds a matching method and converts the component to a class implementing the `java.lang.CharSequence` interface.
+
+## Explicit Casting
+
+Sometimes, implicit casting can be problematic if Lucee cannot make the correct fit, or if a method is overloaded and you need to specify which method to use.
+
+For instance, the `PageContext` class has two `setLocale` methods:
+
+- `setLocale(java.lang.String): void`
+- `setLocale(java.util.Locale): void`
+
+To ensure the correct method is called, it is better to use explicit casting. Here's the modified example:
+
+```lucee
+cs = new component implementsJava="java.lang.CharSequence" {
+ variables.text = "en_us";
+
+ public function onMissingMethod(missingMethodName, missingMethodArguments) {
+ if ("toString" == missingMethodName) return variables.text;
+ else throw "method #missingMethodName# not supported yet!";
+ }
+};
+// Explicitly cast to java.lang.CharSequence
+obj = JavaCast("java.lang.CharSequence", cs);
+dump(obj);
+
+// Use the CharSequence object
+getPageContext().setLocale(obj);
+```
+
+In this example, we first cast the component to `java.lang.CharSequence` (the base interface for `String`), then call `setLocale`. With this explicit casting, Lucee is able to link the correct method.
diff --git a/docs/recipes/java-in-functions-and-closures.md b/docs/recipes/java-in-functions-and-closures.md
new file mode 100644
index 000000000..60b377f51
--- /dev/null
+++ b/docs/recipes/java-in-functions-and-closures.md
@@ -0,0 +1,56 @@
+
+
+# Java in Functions and Closures
+
+You can write CFML code directly in a function or a closure.
+
+## Function
+
+Inside the function, you write regular Java code. The arguments and return type definition must be Java types.
+
+```lucee
+int function echoInt(int i) type="java" {
+ if (i == 1) throw new Exception("Upsi dupsi!!!");
+ return i * 2;
+}
+```
+
+## Component
+
+Of course, the function can also be part of a component.
+
+```lucee
+component {
+ int function echoInt(int i) type="java" {
+ if (i == 1) throw new Exception("Test output!!!");
+ return i * 2;
+ }
+}
+```
+
+## Java Lambda Function
+
+If the interface of a function matches a functional Java interface (Lambda), Lucee automatically implements that interface. In the following example, we implement the `IntUnaryOperator` implicitly. You can then pass it to Java and use it as such.
+
+```lucee
+int function echoInt(int i) type="java" {
+ if (i == 1) throw new Exception("Test");
+ return i * 2;
+}
+dump(echoInt(1));
+```
diff --git a/docs/recipes/java-settings.md b/docs/recipes/java-settings.md
new file mode 100644
index 000000000..c871e7612
--- /dev/null
+++ b/docs/recipes/java-settings.md
@@ -0,0 +1,107 @@
+
+
+# Java Settings in Application.cfc
+
+This document provides information about configuring Java settings in Lucee using `Application.cfc` or the `` tag.
+
+## Introduction
+
+The `this.javasettings` settings in `Application.cfc` allow you to define Java library paths, OSGi bundle paths, and other Java-related configurations. These settings cannot be configured through the Lucee admin or environment variables.
+
+## Configuring Java Settings
+
+You can configure Java settings in `Application.cfc` or using the `` tag. Below are the details of each available setting.
+
+### Load Paths
+
+You can define regular JARs (not OSGi) by specifying the path to a directory or the JAR file itself.
+
+```cfml
+this.javasettings.loadPaths = [
+ "/my/local/path/to/whatever/lib/",
+ "/my/local/path/to/whatever/lib/xyz.jar"
+];
+```
+
+### Bundle Paths
+
+You can load local OSGi bundles in a similar way.
+
+```cfml
+this.javasettings.bundlePaths = [
+ "/my/local/path/to/whatever/lib/",
+ "/my/local/path/to/whatever/lib/xyz.jar"
+];
+```
+
+### Load CFML Class Path
+
+The setting `this.javasettings.loadCFMLClassPath` (an alias for compatibility with Adobe ColdFusion `this.javasettings.loadColdFusionClassPath`) indicates whether to load the classes from the main lib directory. The default value is `false`.
+
+```cfml
+this.javasettings.loadCFMLClassPath = false;
+```
+
+### Reload On Change
+
+The setting `this.javasettings.reloadOnChange` indicates whether to reload the updated classes and JARs dynamically, without restarting ColdFusion. The default value is `false`.
+
+```cfml
+this.javasettings.reloadOnChange = false;
+```
+
+### Watch Interval
+
+The setting `this.javasettings.watchInterval` defines the interval in seconds that Lucee looks for changes. The default value is `60`.
+
+```cfml
+this.javasettings.watchInterval = 60;
+```
+
+### Watch Extensions
+
+The setting `this.javasettings.watchExtensions` defines the extensions Lucee looks for when you list a directory with `loadPaths` or `bundlePaths`. The default value is `["jar","class"]`.
+
+```cfml
+this.javasettings.watchExtensions = ["jar", "class"];
+```
+
+## Using `` Tag
+
+You can also configure these settings using the `` tag.
+
+```cfml
+
+```
+
+## Conclusion
+
+Configuring Java settings in Lucee through `Application.cfc` or the `` tag provides flexibility in managing Java libraries and bundles. By setting these configurations, you can ensure that your Lucee applications are properly integrated with the necessary Java dependencies and can dynamically respond to changes as needed.
diff --git a/docs/recipes/lazy-queries.md b/docs/recipes/lazy-queries.md
new file mode 100644
index 000000000..3da3061de
--- /dev/null
+++ b/docs/recipes/lazy-queries.md
@@ -0,0 +1,100 @@
+
+
+# Lazy Queries
+
+This document explains about lazy queries with some simple examples as follows:
+
+## Example 1
+
+**Regular query**: Regular query tags/functions load all data inside a two-dimensional structure to use.
+
+```luceescript
+//regularQuery.cfm
+query name="qry" returntype="query" {
+ echo("select * from lazyQuery");
+}
+dump(numberFormat(qry.getColumnCount()*qry.getRowCount()));
+loop query=qry {
+ dump(qry.val);
+ if(qry.currentrow==10) break;
+}
+```
+
+1. In this example, we have a simple task. All statements return a result set with 200,000 records. We output the first ten. Then we make a break when we add ten rows.
+
+2. We execute this in the browser and we get the expected result.
+
+## Example 2
+
+**Lazy query**: Lazy queries keep a pointer to the database and only load the data on demand. If you loop through a query, the data is loaded on the spot. It does not create a two-dimensional struct to store all the data beforehand. When the query tag is done, it keeps a pointer to the database.
+
+As a lazy query loops through, it loads the data on demand so you do not have to wait until it has loaded all the data. It is faster when you only load the first 10 rows as you don't have to wait until it's done loading everything.
+
+```luceescript
+//lazyQuery.cfm
+query name="qry" returntype="query" lazy=true {
+ echo("select * from lazyQuery");
+}
+loop query=qry {
+ dump(qry.val);
+ if(qry.currentrow==10) break;
+}
+```
+
+This example is similar to a regular query, but we define `lazy=true`. So that Lucee knows to do a lazy query.
+
+I have removed the column count from the example. Record count is no longer possible because it does not read all the data initially. It does not know how many records there are. When you loop, you can count the records, so you know the total number of records at the end, but not at the start.
+
+There is not really a difference between a regular query and a lazy query, just some limitations (you cannot get the record count in the beginning, and you cannot use cache) within a lazy query.
+
+With a lazy query, we do not have to wait until Lucee has loaded all the data into a two-dimensional structure, and it is also better for memory because you do not have to store all the older data in the memory until you are ready to use it. So there are some benefits.
+
+## Example 3
+
+A comparison of lazy queries and regular queries follows:
+
+```luceescript
+types=['regular':false,'lazy':true];
+results=structNew("ordered");
+loop struct=types index="type" item="lazy" {
+ loop from=1 to=10 index="i" {
+ start=getTickCount('nano');
+ query name="qry" returntype="query" lazy=lazy {
+ echo("select * from lazyQuery");
+ }
+ x=qry.val;
+ time=getTickCount('nano')-start;
+
+ if(isNull(results[type]) || results[type]>time)results[type]=time;
+ }
+}
+// format results
+results.regular=decimalFormat(results.regular/1000000)&"ms";
+results.lazy=decimalFormat(results.lazy/1000000)&"ms";
+dump(results);
+```
+
+This example compares lazy queries with regular queries. It has a loop that loops two times: once for a regular query and a second one for a lazy query. The `type` is used here with `lazy=lazy`, So it sets true or false and does that ten times, once for every time the loops execute. It stores the execution time but you only get the fastest execution time of the ten tries.
+
+Execute that example in the browser. The regular query takes 41 milliseconds and the lazy query takes 27 milliseconds. So we see the benefits of the lazy queries.
+
+## Footnotes
+
+You can see the details in this video:
+[Lazy Query](https://youtu.be/X8_TB1py8n0)
diff --git a/docs/recipes/list-existing-cache-conn.md b/docs/recipes/list-existing-cache-conn.md
new file mode 100644
index 000000000..7600978b1
--- /dev/null
+++ b/docs/recipes/list-existing-cache-conn.md
@@ -0,0 +1,49 @@
+
+
+# List existing Cache Connections
+
+There is now a built-in function in Lucee to list existing cache connections, but you can also easily do this using the following:
+
+```cfs
+/**
+* returns all available cache names as an array
+*/
+array function cacheNames() {
+ return getPageContext().getConfig().getCacheConnections().keySet().toArray();
+}
+```
+
+This function returns an array containing all cache connections available.
+
+```cfs
+/**
+* checks if a cache with the given name is defined
+* @cacheName name of the cache to look for
+*/
+boolean function hasCache(required string cacheName) {
+ var it = getPageContext().getConfig().getCacheConnections().keySet().iterator();
+ loop collection="#it#" item="local.name" {
+ if (cacheName.trim() == name) return true;
+ }
+ return false;
+}
+```
+
+This is a variation of this function that checks if a cache with the given name exists.
diff --git a/docs/recipes/loop-labels.md b/docs/recipes/loop-labels.md
new file mode 100644
index 000000000..7295bbf7c
--- /dev/null
+++ b/docs/recipes/loop-labels.md
@@ -0,0 +1,63 @@
+
+
+# Loop Labels
+
+Lucee supports labels for all loop tags and statements, allowing you to control the flow of nested loops more precisely.
+
+Labels are particularly useful when using the `break` or `continue` statements to avoid affecting only the nearest enclosing loop.
+
+### Example
+
+Consider the following examples:
+
+### Tag-Based Example
+
+In this example, the `break` statement is used with a label to exit the outer loop:
+
+```run
+
+
+ time: #hour#:#minute#
+
+
+
+```
+
+Here, the `cfbreak` statement with the `outerLoop` label causes the loop to break out of the outer loop, not just the inner loop. As a result, only a single time value is printed.
+
+### Script-Based Example
+
+Similarly, you can use labels in script-based loops:
+
+```run
+
+outerloop:for(hour=0; hour<=4; hour++) {
+ for(minute=1; minute<=60; minute++) {
+ echo("time: " & hour & ":" & minute & " ");
+ continue outerloop;
+ }
+}
+
+```
+
+In this example, the `continue outerloop` statement causes the loop to skip to the next iteration of the outer loop, effectively restarting the outer loop and ignoring the remaining iterations of the inner loop.
+
+### Summary
+
+Using labels with `break` and `continue` statements in Lucee allows you to control nested loops more effectively by specifying which loop to break out of or continue. This provides greater flexibility and clarity in managing complex looping structures.
+
+If you have any questions or need further clarification, feel free to ask!
diff --git a/docs/recipes/loop-through-files.md b/docs/recipes/loop-through-files.md
new file mode 100644
index 000000000..8eff546ca
--- /dev/null
+++ b/docs/recipes/loop-through-files.md
@@ -0,0 +1,72 @@
+
+
+# Looping Through File
+
+This document explains how to handle big files in Lucee in a better way. The classic way that you are familiar with uses cffile tag, fileRead, and fileReadBinary functions to read the file into memory. This is a simple solution, but it consumes a lot of memory.
+
+## Example: Handle files with cffile tag, fileRead, and fileReadBinary functions
+
+```luceescript
+include "_getPath2BigFile.cfm";
+NL="";
+// read the complete file into memory
+content=fileRead(path);
+// now we split, again everything lands in memory as an array
+arr=listToArray(content,NL);
+// now we loop over every single line
+loop array=arr index="i" item="line" {
+ handle(line);
+}
+function handle(line) {}
+dump(label:"String Size",var:len(content));
+dump(label:"Array Size",var:len(arr));
+```
+
+In the example above,
+
+- Read the file into the memory
+- Split into array
+- Loop over the array
+
+It consumes a lot of memory.
+
+## Use Loop - File
+
+Use cfloop file. It allows you to read a file line by line, so you do not have to load an entire file into memory. You only load a line at a time into the memory.
+
+```luceescript
+
+```
+
+## Example Using Loop
+
+```luceescript
+include "_getPath2BigFile.cfm";
+// now we loop over every single line
+loop file=path item="line" {
+ handle(line);
+}
+function handle(line) {}
+```
+
+In the above example, loop through the file and get each line, so in memory there is only ever the one line. This is not only faster, it also consumes less memory.
+
+## Footnotes
+
+Here you can see the above details in a video:
+
+[Looping through Files](https://www.youtube.com/watch?v=6w2Wr8snk50)
diff --git a/docs/recipes/mail-how-to-send-a-mail.md b/docs/recipes/mail-how-to-send-a-mail.md
new file mode 100644
index 000000000..5ff3a2f97
--- /dev/null
+++ b/docs/recipes/mail-how-to-send-a-mail.md
@@ -0,0 +1,45 @@
+
+
+# Mail - How to send a Mail
+
+The following example shows you how you can send a mail. Before you can use this functionality, you have to define a Mail server in the Lucee Administrator.
+
+## Tags
+
+```coldfusion
+
+ Hi there,
+ This mail is sent to confirm that we have received your order.
+
+```
+
+## Script
+
+```cfs
+mail subject="Your Order" from="whatever@lucee.org" to="whatever@gmail.com" {
+ writeOutput('Hi there,');
+ writeOutput('This mail is sent to confirm that we have received your order.');
+};
+```
+
+That is all you need to do to send a mail.
diff --git a/docs/recipes/mail-listener.md b/docs/recipes/mail-listener.md
new file mode 100644
index 000000000..5af034d91
--- /dev/null
+++ b/docs/recipes/mail-listener.md
@@ -0,0 +1,55 @@
+
+
+# Mail Listeners
+
+Since Lucee 6.0, you can define a listener in the Application.cfc to listen to or manipulate every mail executed.
+
+## Global Listeners
+
+This example shows how to define a global mail listener in the Application.cfc:
+
+```lucee
+this.mail.listener = {
+ before: function (caller, nextExecution, created, detail, closed, advanced, tries, id, type, remainingtries) {
+ detail.from &= ".de";
+ return arguments.detail;
+ },
+ after: function (caller, created, detail, closed, lastExecution, advanced, tries, id, type, passed, remainingtries) {
+ systemOutput(arguments.keyList(), 1, 1);
+ }
+}
+```
+
+The listener can also be a component:
+
+```lucee
+this.mail.listener = new MailListener();
+```
+
+The component would look like this:
+
+```lucee
+component {
+ function before(caller, nextExecution, created, detail, closed, advanced, tries, id, type, remainingtries) {
+ detail.from &= ".de";
+ return arguments.detail;
+ }
+
+ function after(caller, created, detail, closed, lastExecution, advanced, tries, id, type, passed, remainingtries) {
+ systemOutput(arguments.keyList(), 1, 1);
+ }
+}
+```
diff --git a/docs/recipes/mappings-how-to-define-a-reg-mapping.md b/docs/recipes/mappings-how-to-define-a-reg-mapping.md
new file mode 100644
index 000000000..0b666a83e
--- /dev/null
+++ b/docs/recipes/mappings-how-to-define-a-reg-mapping.md
@@ -0,0 +1,106 @@
+
+
+# Mappings - How to define a regular Mapping
+
+Lucee allows you to define a mapping to a specific location in a filesystem, so you don't always have to use the full path. In most cases, the full path is not working anyway, for example with [tag-include] which does not work with a full path.
+
+This is supported with all the various [lucee-resources] supported (local, ftp, http, ram, zip, s3, etc.).
+
+# Create a regular Mapping in the Administrator
+
+The most common way to define a regular mapping is in the Lucee Server or Web Administrator.
+
+The only difference between the Web and Server Administrator is that a mapping defined in the Server Administrator is visible to all web contexts, and a mapping defined in the Web Administrator is only visible to the current web context.
+
+In your Administrator, go to the Page "Archives & Resources/Mappings" in the section "create new Mapping" that looks like this.
+
+![create-mapping.png](https://bitbucket.org/repo/rX87Rq/images/4035761629-create-mapping.png)
+
+With "Virtual" choose the virtual path for the mapping, this is the path you will later use to address this mapping.
+
+"Resource" is the physical location where the mapping is pointing to, for example `C:\Projects\whatever\test`.
+
+With "Archive" you can map a Lucee archive (more below) to the mapping.
+
+"Primary" defines where a template is searched first. Let's say you have set primary to "archive" and you execute the following code:
+
+```coldfusion
+
+```
+
+In that case, Lucee first checks the archive associated with the "/myMapping" mapping for "test.cfm". If the template is not found there, Lucee also checks the physical location.
+
+"Inspect templates" defines the re-check interval for the physical paths.
+
+## Using the Mapping
+
+Now you can use that mapping in your code:
+
+```coldfusion
+
+
+```
+
+# Advanced
+
+In the previous example, we simply set a path. As you can see in the Administrator, a mapping can contain more data than only a physical path. Of course, you can use these settings also with a mapping done in the [tag-application].
+
+```cfs
+// Application.cfc
+component {
+ this.mappings['/shop'] = {
+ physical: getDirectoryFromPath(getCurrentTemplatePath()) & 'shop',
+ archive: getDirectoryFromPath(getCurrentTemplatePath()) & 'shop.lar',
+ primary: 'archive'
+ };
+}
+```
+
+In that case, we not only define a physical path but also a Lucee archive (.lar).
+
+"primary" defines where Lucee checks first for a resource. Let's say you have the following code:
+
+```coldfusion
+
+```
+
+In that case, Lucee first checks in the archive for "whatever.cfm". If not found there, it looks inside the physical path.
+
+## Side Note
+
+Of course, this can be done for all mapping types:
+
+```cfs
+// Application.cfc
+component {
+ this.componentpaths = [{archive: getDirectoryFromPath(getCurrentTemplatePath()) & 'testbox.lar'}]; // loading testbox from an archive
+ this.customtagpaths = [{archive: getDirectoryFromPath(getCurrentTemplatePath()) & 'helper.lar'}]; // a collection of helper custom tags
+}
+```
+
+## See Also
+
+- [Forcing Lucee to re-check the physical paths of application defined mappings without a restart](https://blog.simplicityweb.co.uk/123/forcing-lucee-to-re-check-the-physical-paths-of-application-defined-mappings-without-a-restart)
+- [Confusion Over this.mappings And expandPath() Not Working In Lucee](https://www.bennadel.com/blog/3718-confusion-over-this-mappings-and-expandpath-not-working-in-lucee-cfml-5-3-3-62.htm)
diff --git a/docs/recipes/mathematical-precision.md b/docs/recipes/mathematical-precision.md
new file mode 100644
index 000000000..8fbaa5628
--- /dev/null
+++ b/docs/recipes/mathematical-precision.md
@@ -0,0 +1,31 @@
+
+
+# Mathematical Precision
+
+So far, Lucee has handled numbers internally as โdoubleโ, but with Lucee 6 we have switched to โBigDecimalโ. This makes math operations much more precise and there is no need anymore to use the function โPrecisionEvaluateโ.
+
+Since version 6.0, all numbers Lucee uses in the runtime are by default BigDecimal based and no longer double as before. You can still change that fact in the Application.cfc as follows:
+
+```lucee
+this.preciseMath = false;
+```
+
+## System Property / Environment Variable
+
+You can also change that behavior with the system property `-Dlucee.precise.math=false` or with the environment variable `LUCEE_PRECISE_MATH=false`.
diff --git a/docs/recipes/monitoring-debugging.md b/docs/recipes/monitoring-debugging.md
new file mode 100644
index 000000000..08639fc60
--- /dev/null
+++ b/docs/recipes/monitoring-debugging.md
@@ -0,0 +1,155 @@
+
+
+# Monitoring/Debugging
+
+Lucee 6.1 changed how you handle Monitoring/Debugging.
+
+## Old Behaviour
+
+Previously, you could enable/disable Debugging in the Lucee admin, and enable/disable specific debug options like showing template execution. With the tag ``, you could define whether the debugging is shown or not.
+
+## New Behaviour
+
+Lucee 6 has completely overhauled this functionality. Instead of having "Metrics" and "Reference" as part of the "Modern" Debug Template, they are now independently controlled under the new umbrella term "Monitoring".
+
+### Lucee Admin
+
+The "debugging" settings are now under the group "Monitoring" and there is a new page called "Output".
+
+#### Page "Output"
+
+On the "Output" page, you define which sections of monitoring are shown:
+
+- Debugging
+- Metrics
+- Documentation (formerly "Reference")
+- Test (available soon)
+
+This is similar to the action `` (more on that tag later).
+
+#### Page "Settings"
+
+You no longer enable/disable debug as a whole, only the options. If no options are enabled, debugging is disabled. Thus, the general switch was/is not really needed anymore.
+
+#### Page "Debug Templates"
+
+Here you can choose the debug template you want to use. You can limit it to a specific IP Range if you like, and you can also define different templates for different IP Ranges, though one template can cover all requests.
+
+#### Page "Logs"
+
+This page allows you to show the last X requests (depending on your settings), which is useful if no debugging is shown on the output.
+
+### Application.cfc
+
+Lucee 6.1 now allows you to overwrite all these settings in the Application.cfc, which was not possible in previous versions.
+
+You can define what is shown:
+
+```lucee
+this.monitoring.showDebug = true;
+this.monitoring.showDoc = true;
+this.monitoring.showMetric = true;
+this.monitoring.showTest = true; // following soon
+```
+
+And also enable/disable debug options:
+
+```lucee
+this.monitoring.debuggingTemplate = true;
+this.monitoring.debuggingDatabase = true;
+this.monitoring.debuggingException = true;
+this.monitoring.debuggingTracing = true;
+this.monitoring.debuggingDump = true;
+this.monitoring.debuggingTimer = true;
+this.monitoring.debuggingImplicitAccess = true;
+this.monitoring.debuggingThread = true;
+```
+
+You can also export all these settings in the Lucee Administrator on the Monitoring/Settings page.
+
+### In Your Code
+
+Even after the Application.cfc, you can still change these settings.
+
+With the help of the tag ``:
+
+```lucee
+
+```
+
+Or with the tag `` you can change the "show" settings (not the debug options):
+
+```lucee
+
+```
+
+#### Downside/Upside
+
+Of course, when you enable, for example, "debuggingTemplate" in your code, everything that happened before was not logged and is lost. But this can also be a benefit, as it allows you to do things like this:
+
+```lucee
+try {
+ application action="update" debuggingTemplate=false;
+ include "mysecretcode.cfm";
+} finally {
+ application action="update" debuggingTemplate=true;
+}
+```
+
+This way, you can prevent Lucee from logging certain code.
+
+## Tab Documentation (formerly Reference)
+
+This tab now not only gives you a function and tag reference, it also provides all kinds of "recipes" like this.
+
+## Backward Compatibility
+
+These new features are fully backward compatible.
+
+### Tag cfsetting
+
+The old attribute "showDebugOutput" is now an alias to the newly introduced "show" attribute. This means with this attribute you can still enable/disable Monitoring as a whole.
+
+So when you do:
+
+```lucee
+
+```
+
+It will not show the monitoring at all, the same way as you would do:
+
+```lucee
+
+```
+
+## Conclusion
+
+Lucee 6.1 gives you full control over Monitoring in your code, making it easier for every developer to use it.
diff --git a/docs/recipes/monitoring-enable-for-your-session.md b/docs/recipes/monitoring-enable-for-your-session.md
new file mode 100644
index 000000000..473dbf3c7
--- /dev/null
+++ b/docs/recipes/monitoring-enable-for-your-session.md
@@ -0,0 +1,72 @@
+
+
+# Monitoring - Enable for your session
+
+This guide demonstrates how to enable monitoring for your session in Lucee 6.1 and above. Prior to Lucee 6.1, you could only enable or disable the display of debugging information using the `` tag. However, Lucee 6.1 introduces the ability to enable debugging itself directly in the `Application.cfc`.
+
+**Note:** Be cautious when deploying this to a public-facing server, as it may expose sensitive information about your web server when not used correctly.
+
+## Enabling/Disable Monitoring
+
+To enable or disable monitoring for your session, add the following code to your `Application.cfc`:
+
+```lucee
+if (!isNull(url.show) || isNull(session.show)) {
+ session.show = url.show ?: true;
+}
+
+this.monitoring.showDebug = session.show;
+this.monitoring.showDoc = session.show;
+this.monitoring.showMetric = session.show;
+
+this.monitoring.debuggingTemplate = session.show;
+this.monitoring.debuggingDatabase = session.show;
+this.monitoring.debuggingException = session.show;
+this.monitoring.debuggingTracing = session.show;
+this.monitoring.debuggingDump = session.show;
+this.monitoring.debuggingTimer = session.show;
+this.monitoring.debuggingImplicitAccess = session.show;
+this.monitoring.debuggingThread = session.show;
+```
+
+## Activating and Deactivating Debugging
+
+To show debugging, add `show=true` to the URL. To disable debugging, add `show=false` to the URL.
+
+For example:
+
+- Enable debugging: `https://yourdomain.com?show=true`
+- Disable debugging: `https://yourdomain.com?show=false`
+
+## Enhanced Security
+
+To enhance security, you can use a more specific string in the URL:
+
+```lucee
+if (!isNull(url.fsdfsdfdfgdgdfs) || isNull(session.show)) {
+ session.show = url.fsdfsdfdfgdgdfs ?: true;
+}
+```
+
+In this case, use `fsdfsdfdfgdgdfs=true` to enable debugging and `fsdfsdfdfgdgdfs=false` to disable it.
+
+For example:
+
+- Enable debugging: `https://yourdomain.com?fsdfsdfdfgdgdfs=true`
+- Disable debugging: `https://yourdomain.com?fsdfsdfdfgdgdfs=false`
+
+This additional string requirement helps ensure that only those who know the specific string can enable or disable debugging.
diff --git a/docs/recipes/null-support.md b/docs/recipes/null-support.md
new file mode 100644
index 000000000..e8329f8db
--- /dev/null
+++ b/docs/recipes/null-support.md
@@ -0,0 +1,85 @@
+
+
+# Null Support
+
+This document explains how to set null support in the Lucee server admin, assigning `null` value for a variable and how to use `null` and `nullvalue`. It is an annotation of the video found here: [https://www.youtube.com/watch?v=GSlWfLR8Frs](https://www.youtube.com/watch?v=GSlWfLR8Frs)
+
+## Enabling NULL support
+
+You can enable null support via the **Lucee Server Admin** --> **Language/compiler** and setting Null support to **complete support** (exclusive to Lucee) or **partial support** (default, same as Adobe CF).
+
+Or via [[tag-application]]
+
+```lucee
+this.nullSupport = true;
+```
+
+## Explanation
+
+### Illustration 1:
+
+```lucee
+
+ function test() {
+ }
+ dump( test() );
+
+ t = test();
+ dump(t);
+
+ dump( isNull( t ) );
+ dump( isNull( notexisting ) );
+
+```
+
+In this example, the function `test()` does not return a value. This, in effect, is the same as returning `null`. If you dump the result of the function (`dump( test() );`), you will see that the dump outputs `Empty: Null`.
+
+If we assign the function result to a variable, i.e. `t = test();`, and reference the variable, i.e. `dump( t );` an error will be thrown when using **partial support** for null: "the key [T] does not exist". If we enable **full support**, you will be able to reference the variable without error, the dump output will be `Empty: Null` and `IsNull( t )` will evaluate `true`.
+
+In all cases, `dump( isNull( notexisting ) );` will throw an error.
+
+### Illustration 2:
+
+```luceescript
+query datasource="test" name="qry" {
+ echo("select '' as empty, null as _null");
+}
+dump( qry );
+dump( qry._null );
+```
+
+With **partial support** for NULL enabled, `dump(qry._null);` will output an **empty string**.
+With **full support**, `Empty: null` will be output and `IsNull( qry._null );` will evaluate `true`.
+
+## NullValue() function and null keyword
+
+With **partial support** for NULL, the `NullValue()` function must be used to explicitly return a null value (this will work in all scenarios). For example:
+
+```luceescript
+var possibleVariable = functionThatMayOrMayNotReturnNull();
+return possibleVariable ?: NullValue();
+```
+
+With **full support**, you are able to use the `null` keyword directly and, as illustrated above, can assign it to a variable directly:
+
+```luceescript
+t = null;
+dump( t );
+```
diff --git a/docs/recipes/pdf-engine-flying-saucer.md b/docs/recipes/pdf-engine-flying-saucer.md
new file mode 100644
index 000000000..68aac9d9e
--- /dev/null
+++ b/docs/recipes/pdf-engine-flying-saucer.md
@@ -0,0 +1,127 @@
+
+
+# PDF Engine - Flying Saucer (CFDocument)
+
+This document provides information about the new PDF engine, [Flying Saucer](https://github.com/flyingsaucerproject/flyingsaucer) (FS) in Lucee 5.3
+
+Flying saucer is a new PDF engine in Lucee. PDF engines are mainly used to convert HTML to PDF format.
+
+## Benefits of moving to Flying Saucer from the old engine (PD4ML)
+
+- Full support for CSS 2.1
+- On average the generated PDFs are smaller
+- Consume less Memory and CPU
+- Engine in active development,
+- Better Results
+
+## Downsides to Flying Saucer compared to the old engine (PD4ML)
+
+- The generated PDF does not always look exactly the same when generated with the new FC compared to files generated with the PD4ML.
+
+If it's important that the PDF output remains exactly the same as the old PD4ML-generated file, you will need to check it manually.
+
+If you don't have time to check all PDF outputs, or you really don't care about the fancy new engine, simply add the following code to use the old PDF engine.
+
+via Application.cfc,
+
+```luceescript
+this.pdf.type = "classic";
+```
+
+or if you are using an Application.cfm,
+
+```lucee
+
+```
+
+and since the PDF Extension 1.0.0.92-SNAPSHOT you can specify the engine using type
+
+```lucee
+
+ or
+
+```
+
+## Features of Flying Saucer
+
+You can define a font directory where you have the fonts(.ttf,.otf) you are using in your PDF.
+
+## Define the font directory
+
+```lucee
+
+```
+
+Define the font directory Application itself:
+
+via Application.cfc
+
+```luceescript
+this.pdf.fontDirectory = "path/to/my/font";
+```
+
+or via application.cfm
+
+```lucee
+
+```
+
+If the font directory isn't specified, Lucee will look for fonts in /WEB_INF/lucee/fonts and uses them if they match.
+
+**Note**: Classic engine works using the font-family-name from pd4fonts.properties file. Modern (Flying saucer) engine works using the font-family-name from the .ttf file with the same case.
+
+### Simplify Attributes
+
+Attributes with cfdocument are a mess. You can make it clearer using the following syntax:
+
+Example:
+
+```lucee
+
+```
+
+In Lucee you can do the following:
+
+```lucee
+
+```
+
+Or even simpler
+
+```lucee
+
+```
+
+### Additional Units
+
+In addition to "inch" and "cm", the attribute unit now supports "pixel" and "points".
+
+```lucee
+
+```
+
+If you find any issues while using the new PDF engine, please ask a question on the [mailing list](https://dev.lucee.org/)
+
+## Footnotes
+
+You can see the details in this video:
+[Flying saucer](https://www.youtube.com/watch?v=B3Yfa8SUKKg)
diff --git a/docs/recipes/precompiled-code.md b/docs/recipes/precompiled-code.md
new file mode 100644
index 000000000..1dfb88b85
--- /dev/null
+++ b/docs/recipes/precompiled-code.md
@@ -0,0 +1,46 @@
+
+
+# Precompiled Code
+
+This document explains how to pre-compile code for a production server while the source code is deployed. This method avoids compilation on the production server for security reasons. We explain this method with a simple example below:
+
+Example:
+
+```lucee
+//index.cfm page in current instance location like \webapps\ROOT\sample\index.cfm
+
+Time is
+writeoutput(now());
+
+```
+
+Run this index.cfm page in the browser.
+
+- When a cfm or cfc file is executed for the first time (or after the file has been edited), a class file holding the java byte-code representing that CFML file is automatically created within the cfclasses folder, webroot --> WEB-INF --> lucee --> cfclasses folder, in a sub-folder representing your application's context, for example `CFC__lucee_tomcat_webapps_ROOT4900`. (Differently from Adobe ColdFusion, a separate class file is not created for each method/function within a cfc/cfm file.)
+
+- After executing a request to our `/sample/index.cfm` example above, a class file named `index_cfm$cf.class` will be created within a `sample` folder of the cfclasses folder for our application's context.
+
+- To demonstrate how you can deploy that compiled byte-code for a cfm as if it was the cfm itself, you can copy that class file and paste it into your original application folder (\webapps\ROOT\sample). Since you already have the original index.cfm there, rename this class file to `test.cfm`.
+
+- Finally, run the `/sample/test.cfm` file in your browser. It should show the same results as the index.cfm file would.
+
+## Footnotes
+
+Here you can see the above details in a video:
+
+[Lucee Precompiled Code](https://www.youtube.com/watch?v=Yjy3bQJgphA)
diff --git a/docs/recipes/query-async.md b/docs/recipes/query-async.md
new file mode 100644
index 000000000..b8ecb2902
--- /dev/null
+++ b/docs/recipes/query-async.md
@@ -0,0 +1,49 @@
+
+
+# Query Async
+
+Since Lucee 6.0, you can define that a query gets executed asynchronously. Asynchronous execution of queries is useful in many cases where you donโt want to wait for a query to be executed. You can now set a simple flag to enable this feature.
+
+## Async Execution
+
+This example shows how to define a query for async execution:
+
+```lucee
+query async=true {
+~~~
+update user set lastAccess=now()
+~~~
+}
+```
+
+But you may want to know when an exception is happening, so we use a local listener:
+
+```lucee
+query datasource="mysql" async=true listener={
+ error: function (args, caller, meta, exception) {
+ systemOutput(exception, true, true);
+ }
+} {
+~~~
+ update user set lastAccess=now()
+~~~
+}
+```
+
+## Other Option
+
+Since Lucee 6.1, this can also be done with the help of "function listeners".
diff --git a/docs/recipes/query-handling.md b/docs/recipes/query-handling.md
new file mode 100644
index 000000000..474ead886
--- /dev/null
+++ b/docs/recipes/query-handling.md
@@ -0,0 +1,156 @@
+
+
+# Query Handling in Lucee
+
+This document explains how SQL queries are supported in Lucee.
+
+## Query tags
+
+[tag-query] different ways to use the tags in Lucee and how we can pass the value into the query.
+
+```lucee
+
+ select * from Foo1890
+
+
+```
+
+The above example just shows how to retrieve the data from the database.
+
+### Using QueryParam
+
+The [tag-QueryParam] is used inside the [tag-query] tag. It is used to bind the value with the SQL statement.
+
+```lucee
+
+ select * from Foo1890
+ where title=
+
+
+```
+
+Passing values with [tag-QueryParam] has two advantages:
+
+- The value you pass in QueryParam is very secure.
+- Lucee is able to cache the query statement and reuse it as long as the value is unchanged.
+
+### Params
+
+Here we use params as part of [tag-cfquery] tag, used to pass the value with SQL statement.
+
+Pass the params value with struct.
+
+```lucee
+
+ select * from Foo1890
+ where title=:title
+
+
+```
+
+Referenced as `:key` in SQL.
+
+The below example shows how to pass more information using a struct.
+
+```lucee
+
+ select * from Foo1890
+ where title=:title
+
+
+```
+
+You can pass the params value using an array. It is referenced as `?` in SQL.
+
+```lucee
+
+ select * from Foo1890
+ where title=?
+
+
+```
+
+### Query Builder
+
+Query Builder is used as an extension; it will not come up with core.
+
+It is much easier to do a simple query.
+
+```lucee
+
+// Query Builder (creates SQL in dialect based on the datasource defined)
+qb = new QueryBuilder("test")
+ .select("lastName")
+ .from("person")
+ .where(QB::eq("firstname", "Susi"));
+qb.execute();
+dump(res);
+
+```
+
+Use `QueryBuilder("test")` as constructor.
+
+- Define a datasource with constructor or `setDatasource('test')` function.
+- Use `select("lastName")` to select the column.
+- Use `from("person")` from which table you want to retrieve data.
+- Where statement like `where(QB::eq("firstname", "Susi"))`.
+
+Use `qb.execute()` to obtain the result.
+
+You can change the selected column like in the example below.
+
+```lucee
+
+// change select
+qb.select(["age", "firstname"]);
+qb.execute();
+dump(res);
+
+```
+
+You can also change the where condition as shown in the example below.
+
+```lucee
+
+// change where
+qb.clear("where");
+qb.where(
+ QB::and(
+ QB::eq("firstname", "Susi"),
+ QB::neq("lastname", "Moser"),
+ QB::lt("age", 18)
+ )
+);
+qb.execute();
+dump(res);
+
+```
+
+### Footnotes
+
+Here you can see the above details in a video:
+
+[https://www.youtube.com/watch?time_continue=684&v=IMdPM58guUQ](https://www.youtube.com/watch?time_continue=684&v=IMdPM58guUQ)
diff --git a/docs/recipes/query-indexes.md b/docs/recipes/query-indexes.md
new file mode 100644
index 000000000..bdf3692d0
--- /dev/null
+++ b/docs/recipes/query-indexes.md
@@ -0,0 +1,38 @@
+
+
+# Query Indexes
+
+Since Lucee 6.0, you can set an index for a query result, which you can then use down the line.
+
+## Setting an Index
+
+This example shows how to define a query with an index:
+
+```lucee
+
+ select 1 as id, 'Susi' as name
+ union all
+ select 2 as id, 'Peter' as name
+
+```
+
+You can then access parts of the query like this:
+
+```lucee
+
+
+
+
+```
diff --git a/docs/recipes/query-listener.md b/docs/recipes/query-listener.md
new file mode 100644
index 000000000..063d19cc1
--- /dev/null
+++ b/docs/recipes/query-listener.md
@@ -0,0 +1,62 @@
+
+
+# Query Listeners
+
+Since Lucee 6.0, you can define a listener in the Application.cfc to listen to or manipulate every query executed.
+
+## Global Listeners
+
+This example shows how to define a global query listener in the Application.cfc:
+
+```lucee
+this.query.listener = {
+ before: function (caller, args) {
+ dump(label: "before", var: arguments);
+ },
+ after: function (caller, args, result, meta) {
+ dump(label: "after", var: arguments);
+ }
+};
+```
+
+The listener can also be a component:
+
+```lucee
+this.query.listener = new QueryListener();
+```
+
+The component would look like this:
+
+```lucee
+component {
+ function before(caller, args) {
+ args.sql = "SELECT TABLE_NAME as abc FROM INFORMATION_SCHEMA.TABLES";
+ args.maxrows = 2;
+ return arguments;
+ }
+
+ function after(caller, args, result, meta) {
+ var row = queryAddRow(result);
+ result.setCell("abc", "123", row);
+ return arguments;
+ }
+
+ function error(args, caller, meta, exception) {
+ // Handle exception
+ }
+}
+```
diff --git a/docs/recipes/query-of-queries.md b/docs/recipes/query-of-queries.md
new file mode 100644
index 000000000..885bfd345
--- /dev/null
+++ b/docs/recipes/query-of-queries.md
@@ -0,0 +1,127 @@
+
+
+# Query of Queries (QoQ)
+
+Query of queries (QoQ) is a technique for re-querying an existing (in memory) query without another trip to the database. This allows you to dynamically combine queries from different databases.
+
+```lucee
+
+
+ SELECT *
+ FROM my_db_table
+
+
+
+
+ SELECT *
+ FROM sourceQry
+
+```
+
+The above example isn't very useful, because `newQry` is a straight copy of the source query, but it demonstrates the two requirements of `QoQ`:
+
+- The dbtype="query" attribute
+- A source query object name (e.g., sourceQry) instead of a table name in the FROM clause.
+
+## Example: Filtering
+
+Let's say you have the following database query, `myQuery`:
+
+```lucee
+
+ SELECT Name, Age, Location
+ FROM People
+
+```
+
+You would now have a list of names, ages, and locations for all the people in a query called `myQuery`.
+
+Say you want to filter out people under 18 and over 90, but you don't want to hit the database again:
+
+```lucee
+
+ SELECT Name, Age, Location
+ FROM myQuery
+ WHERE Age >= 18
+ AND Age <= 90
+
+```
+
+`filteredQry` contains the desired records.
+
+## Internals
+
+Lucee uses its own SQL implementation for QoQ; when that fails, HSQLDB is tried.
+
+Lucee's SQL implementation is a basic subset of ANSI92, but it is relatively fast. [HSQLDB is a more complete SQL implementation](http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html), but it is slow compared to Lucee's implementation.
+
+## Supported Constructs
+
+Even though under the hood, Lucee handles the fallback to HSQLDB automatically, it still can be useful to know what's possible with the fast Lucee SQL implementation versus the slower, fallback HSQLDB SQL implementation.
+
+## Lucee's SQL Implementation
+
+**Keywords and Operators**
+
+- <=
+- <>
+- =
+- =>
+- =
+- !=
+- ALL
+- AND
+- AS
+- BETWEEN x AND y
+- DESC/ASC
+- DISTINCT
+- FROM
+- GROUP BY
+- HAVING
+- IN ()
+- IS
+- IS NOT NULL
+- IS NULL
+- LIKE
+- NOT
+- NOT IN ()
+- NOT LIKE
+- OR
+- ORDER BY
+- SELECT
+- TOP
+- UNION
+- WHERE
+- XOR
+
+Functions
+
+TODO: Flesh this out.
+
+## HSQLDB SQL Implementation
+
+This is the fallback for when Lucee's SQL implementation can't handle the QoQ syntax. See the [HSQLDB documentation](http://hsqldb.org/doc/2.0/guide/sqlgeneral-chapt.html) for details.
+
+## Footnotes
+
+Lucee Google Groups Post: SQL syntax supported by query-of-queries?
diff --git a/docs/recipes/query-of-query-sometime.md b/docs/recipes/query-of-query-sometime.md
new file mode 100644
index 000000000..dc3c46430
--- /dev/null
+++ b/docs/recipes/query-of-query-sometime.md
@@ -0,0 +1,134 @@
+
+
+# Query of Queries sometimes it rocks, sometimes it sucks
+
+This document explains why Query of Queries (QoQ) may or may not be the best approach for your use case.
+
+- **PRO**: It's nice to work with in-memory datasets/queries using SQL.
+- **CON**: It can be very slow, depending on the use case.
+
+Update: The performance of QoQ has been dramatically improved for single tables since 5.3.8!
+
+[Improving Lucee's Query of Query Support](http://wwvv.codersrevolution.com/blog/improving-lucees-query-of-query-support)
+
+There has also been a lot of work done to improve the "correctness" of the native SQL engine's behavior.
+
+[QoQ tickets](https://luceeserver.atlassian.net/issues/?jql=text%20~%20%22qoq%22%20ORDER%20BY%20updated)
+
+Currently, Lucee QoQ only supports `SELECT` statements; `UPDATE` and `INSERT` aren't yet supported.
+
+Lucee has two QoQ engines, a fast native engine which only works on a single table.
+
+Any SQL using multiple tables, i.e., with a JOIN, will fall back to the HSQLDB engine.
+
+The HSQLDB engine requires loading all the queries into temporary tables and is currently Java synchronized, all of which can affect performance.
+
+If the native QoQ engine fails on a single table query, by default, Lucee will attempt to fall back on the HSQLDB engine.
+
+See `LUCEE_QOQ_HSQLDB_DISABLE` and `LUCEE_QOQ_HSQLDB_DEBUG` under [[running-lucee-system-properties]].
+
+## Example:
+
+```lucee+trycf
+
+ q = QueryNew("name, description");
+ loop times=3 {
+ getFunctionList().each(function(f){
+ var fd = getFunctionData(arguments.f);
+ var r = QueryAddRow(q);
+ QuerySetCell(q,"name", fd.name, r);
+ QuerySetCell(q,"description", fd.description, r);
+ });
+ }
+ dump(server.lucee.version);
+ dump(var=q.recordcount,
+ label="demo data set size");
+ s = "the";
+
+
+
+
+ q3 = q.filter(function(row){
+ return (row.description contains s);
+ });
+
+
+
+```
+
+In this example, we have a QOQ with the persons table.
+
+```luceescript
+// index.cfm
+
+directory sort="name" action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+```luceescript
+// example.cfm
+
+max=1000;
+persons=query(
+ "lastname":["Lebowski","Lebowski","Lebowski","Sobchak"],
+ "firstname":["Jeffrey","Bunny","Maude","Walter"]
+ );
+
+// Query of Query
+start=getTickCount("micro");
+loop times=max {
+ query dbtype="query" name="qoq" {echo("
+ select * from persons
+ where lastname='Lebowski'
+ and firstname='Bunny'
+ order by lastname
+ ");}
+}
+dump("Query of Query Execution Time:"&(getTickCount("micro")-start));
+
+// Query Filter/Sort
+start=getTickCount("micro");
+loop times=max {
+ qf=queryFilter(persons,function (row,cr,qry) {return row.firstname=='Bunny' && row.lastname=='Lebowski';});
+ qs=querySort(qf,"lastname");
+}
+dump("Query Filter/Sort Execution Time:"&(getTickCount("micro")-start));
+```
+
+In this example, we have two different methods of queries.
+
+1. First one is QoQ. Here, `QoQ` from the `persons` table is executed a thousand times due to the looping required by QoQ.
+
+2. The second one is calling the function query filter. Query filter filters out the same row the same way the QoQ does.
+
+3. Execute it in the browser and we get two results (Query of Query execution time and Query filter/sort execution time). Query filter executes at least twice as fast as query of query. Because QoQ loops over and over again, it is slower. If you can avoid QoQ and use the Query filter/sort, your code will execute much faster.
+
+## Footnotes
+
+You can see these details in the video here:
+
+[Query of Query Sucks](https://www.youtube.com/watch?v=bUBXzo1WbSM)
diff --git a/docs/recipes/query-return-type.md b/docs/recipes/query-return-type.md
new file mode 100644
index 000000000..e0523e5c0
--- /dev/null
+++ b/docs/recipes/query-return-type.md
@@ -0,0 +1,106 @@
+
+
+# Query return type
+
+This document explains the different return types for a query with some examples.
+
+## Example 1: query
+
+First we start with the regular return type for a query. This query simply returns a result set.
+
+```luceescript
+// index.cfm
+directory sort="name" action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+```luceescript
+query name="qry" datasource="test" {
+ echo("
+ select lastname,firstname from person
+ ");
+}
+dump(qry);
+```
+
+In this example we have a select statement with two columns in the `person` table. Execute the query in the browser and we get a simple result.
+
+## Example 2: Array
+
+Lucee can define the return type in a query tag. If we set array as follows: `returntype="array"`. We will get the result as an array.
+
+```luceescript
+query name="arr" datasource="test" returntype="array" {
+ echo("
+ select lastname,firstname from person
+ ");
+}
+dump(arr);
+```
+
+In this array, for each row there is an item in the array and it has a struct with all the columns. So this array is special because it returns an array of structs, and it has meta information about the SQL statement. So it shows the record count and execution time of the query.
+
+## Example 3: struct
+
+This example shows the same concepts that were shown in the previous Example 2, however instead of an array, we can do a struct. If you want to have a struct result, set the return type as struct.
+
+```luceescript
+query name="sct" datasource="test" returntype="struct" columnKey="lastname" {
+ echo("
+ select lastname,firstname from person
+ ");
+}
+dump(sct);
+```
+
+1. In this case you have to define which column is the key of the struct. Here I simply use the last name as the key of the struct.
+
+2. Execute it in the browser, and we get a struct as a result and the key is the last name. So you can directly choose one of these elements by writing the lastname.
+
+## Example 4:
+
+```luceescript
+if(isNull(application.sex)) {
+ query name="application.sex" datasource="test" returntype="struct" columnKey="sex_id" {
+ echo("
+ select sex_id,name from sex
+ ");
+ }
+}
+query name="qryPerson" datasource="test" {
+ echo("
+ select sex_id,lastname,firstname from person
+ ");
+}
+loop query=qryPerson {
+ dump(qryPerson.lastname&" "&qryPerson.firstname&" ("&application.sex[qryPerson.sex_id].name&")");
+}
+```
+
+1. In this example we have two tables. We make a query to the `person` table. Notice that some fields are foreign key references too. We store `sex_id` in the application scope because we use this in the second query. In this, `sex_id` is the key of that struct, so we can simply address it in `"(&application.sex[qryPerson.sex_id].name&")"` this way.
+
+2. Execute this example in the browser and we get a result from the other table that is referenced by a foreign key.
+
+## Footnotes
+
+You can see these details in the video here:
+
+[Query return type](https://www.youtube.com/watch?v=b9YHhnAuNiw)
diff --git a/docs/recipes/read-xml-with-a-listener-model-sax.md b/docs/recipes/read-xml-with-a-listener-model-sax.md
new file mode 100644
index 000000000..8817e5371
--- /dev/null
+++ b/docs/recipes/read-xml-with-a-listener-model-sax.md
@@ -0,0 +1,148 @@
+
+
+# Read XML with a listener Model (SAX)
+
+Lucee not only allows you to convert an XML file to an object tree (DOM) but also supports an event-driven model (SAX).
+
+The function `XMLParse` is handy to get an object representation of a complete XML document. However, for large XML documents, this can cause memory issues. This method is an overhead if you simply need to read some data from an XML file and convert it to something else. For this, the SAX event-driven model is a very handy and lightweight way to do this. Here is an example.
+
+Let's say we want to read in the following XML document:
+
+```lucee
+
+
+
+ Empire Burlesque
+ Bob Dylan
+ USA
+ Columbia
+ 10.90
+ 1985
+
+
+ Hide your heart
+ Bonnie Tyler
+ UK
+ CBS Records
+ 9.90
+ 1988
+
+
+```
+
+To read this, we need to define a component that looks like the following, and you need to add functions that are listening to certain events of the XML parser (startDocument, startElement, body, endElements, ...). It is completely up to your code to store the data for later use.
+
+```cfs
+component {
+ this.cds = [];
+ this.cd = {};
+ this.insideCD = false;
+ this.currentName = "";
+ this.filter = {};
+ this.removeCD = false;
+
+ /**
+ * constructor of the component that takes the path to the XML file and a simple custom-made filter
+ * @param xmlFile XML File to parse
+ * @param filter filter to limit content on certain records
+ */
+ function init(string xmlFile, struct filter = {}) {
+ var xmlEventParser = createObject("java", "lucee.runtime.helpers.XMLEventParser");
+ this.filter = filter;
+ // registering the event handlers
+ xmlEventParser.init(
+ getPageContext(),
+ this.startDocument,
+ this.startElement,
+ this.body,
+ this.endElement,
+ this.endDocument,
+ this.error
+ );
+ xmlEventParser.start(xmlFile);
+ return this.cds;
+ }
+
+ /**
+ * this function will be called on the start of parsing of an XML Element (Tag)
+ */
+ function startElement(string uri, string localName, string qName, struct attributes) {
+ if (localName EQ "cd") {
+ this.cd = {};
+ this.insideCD = true;
+ this.removeCD = false;
+ } else if (this.insideCD) {
+ this.currentName = localName;
+ }
+ }
+
+ /**
+ * call with body of the tag
+ */
+ function body(string content) {
+ if (len(this.currentName)) {
+ this.cd[this.currentName] = content;
+ if (structKeyExists(this.filter, this.currentName) and content NEQ this.filter[this.currentName])
+ this.removeCD = true;
+ }
+ }
+
+ /**
+ * this function will be called at the end of parsing an XML Element (Tag)
+ */
+ function endElement(string uri, string localName, string qName, struct attributes) {
+ if (localName EQ "cd") {
+ if (!this.removeCD)
+ this.cds[arrayLen(this.cds) + 1] = this.cd;
+ this.insideCD = false;
+ }
+ this.currentName = "";
+ }
+
+ /**
+ * this function will be called when the document starts to be parsed
+ */
+ function startDocument(string uri, string localName, string qName, struct attributes) {}
+
+ /**
+ * this function will be called when the document finishes being parsed
+ */
+ function endDocument(string uri, string localName, string qName, struct attributes) {}
+
+ /**
+ * this function will be called when an error occurs
+ */
+ function error(struct cfcatch) {
+ dump(cfcatch);
+ }
+}
+```
+
+Now we simply can invoke that component to parse the XML file and get the result as an array of structs:
+
+```coldfusion
+
+
+
+
+```
+
+You can download the complete example [here](https://bitbucket.org/lucee/lucee/downloads/lucee-sax-example.zip).
diff --git a/docs/recipes/request-timeout.md b/docs/recipes/request-timeout.md
new file mode 100644
index 000000000..19cd0eef2
--- /dev/null
+++ b/docs/recipes/request-timeout.md
@@ -0,0 +1,96 @@
+
+
+# Request Timeout
+
+Lucee allows you to define a request timeout for every request made to Lucee. **Never accept request timeouts as a regular behavior of your application; always try to resolve any request timeout that occurs.**
+
+## Setting Request Timeout
+
+### Lucee Administrator
+
+You can set the request timeout in the Lucee Administrator under "Settings/Request".
+
+### Application.cfc
+
+You can also set the request timeout in the `Application.cfc` as follows:
+
+```luceescript
+this.requestTimeout = createTimeSpan(0, 0, 0, 49);
+```
+
+### Tag cfsetting
+
+Alternatively, you can set the request timeout using the `` tag:
+
+```luceetag
+
+```
+
+## Thresholds
+
+Lucee includes several additional thresholds that requests must meet before they are terminated due to a timeout. These thresholds help prevent unnecessary termination of requests, which can pose risks such as deadlocks and open monitors. If a request timeout is reached but the thresholds are not met, Lucee will log the event in the "requesttimeout" log instead of terminating the request.
+
+### Concurrent Requests Threshold
+
+This setting allows you to specify the number of concurrent requests Lucee can handle before enforcing request timeouts. Adjusting this threshold can help manage request timeouts under varying loads. A higher threshold allows more concurrent requests to be processed without enforcing timeouts, potentially improving performance under heavy loads at the risk of longer request times. The default threshold is set to 0, meaning request timeouts are enforced immediately for all requests.
+
+Set this threshold via the System Property:
+
+```sh
+-Dlucee.requesttimeout.concurrentrequestthreshold=100
+```
+
+or the Environment Variable:
+
+```sh
+LUCEE_REQUESTTIMEOUT_CONCURRENTREQUESTTHRESHOLD=100
+```
+
+### CPU Usage Threshold
+
+This option allows you to set a CPU usage threshold that Lucee monitors before enforcing request timeouts. The threshold value is a float ranging from 0.0 (0% CPU usage) to 1.0 (100% CPU usage). When the system's CPU usage is below this threshold, Lucee processes requests without applying the request timeout rule. This helps manage resource allocation and maintain application responsiveness during high demand or limited system resources. The default setting is 0.0, which means request timeouts are applied regardless of CPU usage.
+
+Set this threshold via the System Property:
+
+```sh
+-Dlucee.requesttimeout.cputhreshold=0.9
+```
+
+or the Environment Variable:
+
+```sh
+LUCEE_REQUESTTIMEOUT_CPUTHRESHOLD=0.9
+```
+
+### Memory Usage Threshold
+
+This setting allows you to establish a memory usage threshold, guiding Lucee on when to enforce request timeouts based on current memory consumption. The threshold value is a float from 0.0 (0% memory usage) to 1.0 (100% memory usage). By monitoring memory usage against this threshold, Lucee decides whether to enforce or relax request timeouts dynamically. This prevents system overloads and ensures stable performance by not strictly applying timeouts when memory usage is below the defined threshold. The default threshold is set to 0.0, meaning Lucee will apply request timeouts without considering memory usage.
+
+Set this threshold via the System Property:
+
+```sh
+-Dlucee.requesttimeout.memorythreshold=0.8
+```
+
+or the Environment Variable:
+
+```sh
+LUCEE_REQUESTTIMEOUT_MEMORYTHRESHOLD=0.8
+```
diff --git a/docs/recipes/retry.md b/docs/recipes/retry.md
new file mode 100644
index 000000000..88ab2376f
--- /dev/null
+++ b/docs/recipes/retry.md
@@ -0,0 +1,77 @@
+
+
+# Retry
+
+This document explains how to use retry functionality with some simple examples.
+
+## Example 1
+
+```luceescript
+// example1.cfm
+
+path="test.txt";
+function fr(){
+ dump(fileRead(path));
+}
+try {
+ fr();
+}
+catch(e) {
+ if(!fileExists(path)) {
+ fileWrite(path,"content of the file");
+ fr();
+ }
+ else echo(e);
+}
+if(fileExists(path)) fileDelete(path);
+```
+
+In this example, we have the "try" and "catch" blocks for reading a file and outputting the file content. Maybe that file does not exist in every case. So we have to check in advance if the file exists or not. In this example, the file read is a function `fr()`, and we will call this function in the "try" block. If the file does not exist, the "catch" block is executed and the `fr()` function is called again.
+
+This is not the best way. 'Retry' is a better option. The retry code looks like example2.cfm
+
+## Example 2
+
+```luceescript
+// example2.cfm
+
+path="test.txt";
+try {
+ dump(fileRead(path));
+}
+catch(e) {
+ if(!fileExists(path)) {
+ fileWrite(path,"content of the file");
+ retry;
+ }
+ echo(e);
+}
+if(fileExists(path)) fileDelete(path);
+```
+
+In this example, we use the retry functionality. Here we also still check if the file exists or not. If the file does not exist, we create a new file by using `fileWrite`. Then call retry to avoid duplicate code `fr()`. Retry points to the beginning of the try block and then it will read again the file and output the file content.
+
+We do not get an exception because if the file does not exist, we call retry (read the file again and output the file content). For this case, we simply use retry, and if it fails, we correct what is wrong.
+
+## Footnotes
+
+Here you can see these details in the video also:
+
+[Retry](https://youtu.be/zA9aAAimkk8)
diff --git a/docs/recipes/script-templates.md b/docs/recipes/script-templates.md
new file mode 100644
index 000000000..65d0db24e
--- /dev/null
+++ b/docs/recipes/script-templates.md
@@ -0,0 +1,20 @@
+
+
+# Script Templates
+
+Since version 6.0, Lucee supports templates with the extension `.cfs`. The idea of these templates is that they contain script code, similar to `.js` files in the JavaScript world.
+
+This allows you to write direct script code without the need for the `` tag.
diff --git a/docs/recipes/startup-listeners-code.md b/docs/recipes/startup-listeners-code.md
new file mode 100644
index 000000000..f82ed9e43
--- /dev/null
+++ b/docs/recipes/startup-listeners-code.md
@@ -0,0 +1,127 @@
+
+
+# Startup Listeners - Server.cfc and Web.cfc
+
+Lucee supports two types of startup listeners:
+
+- **Server.cfc**: Executes when the Lucee Server starts up. This file is unique to each Lucee instance.
+- **Web.cfc**: Executes for each web context.
+
+## Server.cfc
+
+Create a `Server.cfc` file in the `lucee-server\context\context` directory.
+
+```lucee
+// lucee-server\context\context\Server.cfc
+component {
+ public function onServerStart( reload ) {
+ if ( !arguments.reload ) {
+ systemOutput("------- Server Context started -----", true);
+ // This runs when the server starts for the first time.
+ // Example: Import a .cfConfig.json setting file
+ var config_server = "/www/config/lucee_server_cfConfig.json";
+ configImport(
+ type: "server",
+ data: deserializeJSON(fileRead(config_server)),
+ password: "your_lucee_server_admin_password"
+ );
+ } else {
+ // Runs each time the server config is reloaded, such as when an extension is installed or the config is updated
+ systemOutput("------- Server Context config reloaded -----", true);
+ }
+ }
+
+ public function onBuild() {
+ systemOutput("------- Building Lucee (Docker?) -----", true);
+ }
+}
+```
+
+Start the Lucee Server, and the server console should display the above system outputs, indicating that `Server.cfc` has executed.
+
+### Functions in Server.cfc
+
+#### onServerStart
+
+`onServerStart` is called when you start Lucee. The `reload` argument is set to `false` on the first start, and `true` when any configuration in the Lucee Administrator is updated or an extension is installed.
+
+#### onBuild (since Lucee 6.1.1)
+
+`onBuild` is called when you start Lucee with the environment variable `LUCEE_BUILD` (or the older variable `LUCEE_ENABLE_WARMUP`) set to `true`. You can also use the system property `-Dlucee.build` (or `-dlucee-enable.warmup`). This feature got indroduced in Lucee 6.1.1.
+
+## Web.cfc
+
+Create a `Web.cfc` file in the `webapps\ROOT\WEB-INF\lucee\context\` directory, or in the context webroot.
+
+```lucee
+// webapps\ROOT\WEB-INF\lucee\context\Web.cfc
+component {
+ public function onWebStart( reload ) {
+ if ( !arguments.reload ) {
+ systemOutput("------- Web Context started -----", true);
+ // This runs when the web context starts for the first time.
+ // Example: Import a .cfConfig.json setting file
+ var config_web = "/www/config/lucee_web_cfConfig.json";
+ configImport(
+ type: "web",
+ data: deserializeJSON(fileRead(config_web)),
+ password: "your_lucee_web_context_admin_password"
+ );
+ } else {
+ // Runs each time the web context config is reloaded, such as when an extension is installed or the config is updated
+ systemOutput("------- Web Context config reloaded -----", true);
+ }
+ }
+}
+```
+
+`Web.cfc` has one function: `onWebStart()`, with an argument `reload` that indicates if the web context is a new startup.
+
+### Behavior with reload Argument
+
+When `reload` is `true`, the web context is reloaded. When `reload` is `false`, it indicates a fresh start of the web context.
+
+## How to Test
+
+1. **Start your Lucee server.**
+ - You will see the server context output first, followed by the web context output, indicating that both listeners are triggered by Lucee.
+
+2. **Change a Setting in Web Admin.**
+ - For example, change **Settings -> Charset** for the web charset to "UTF-8" in the web admin.
+ - After changing the charset, only the web context is reloaded; the server context is not affected.
+
+This feature helps to prevent unnecessary reloading of the server context, ensuring smoother operations.
+
+## Footnotes
+
+Watch the detailed video on [Lucee Startup Listeners](https://youtu.be/b1MWLwkKdLE).
diff --git a/docs/recipes/static-scope-in-components.md b/docs/recipes/static-scope-in-components.md
new file mode 100644
index 000000000..8029d1b6d
--- /dev/null
+++ b/docs/recipes/static-scope-in-components.md
@@ -0,0 +1,215 @@
+
+
+# Static scope in components
+
+Static scope in components is needed to create an instance of cfc and call its method. It is used to avoid creating an instance each time you use the cfc.
+
+You can create an object in the Application init() function, and make it at application scope, so you can directly call the methods.
+
+We explain this methodology with a simple example below:
+
+## Example 1
+
+```luceescript
+// index.cfm
+directory sort="name" action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+1. Create a constructor of the component. It is the instance of the current path and also create new function hey().
+
+```luceescript
+// Example0.cfc
+Component {
+ public function init() {
+ dump("create an instance of " & listLast(getCurrentTemplatePath(),'\/'));
+ }
+ public function hey() {
+ dump("Salve!");
+ }
+}
+```
+
+2. Next, we instantiate the component four times, and then call the hey() function. Run this example00.cfm page in the browser. It shows five dumps. Four dumps coming from inside of the constructor and the fifth dump is from hey(). Note that the init() function is private, so you cannot load it from outside the component. Therefore, you have no access to the message within init() from the cfscript in the example below.
+
+```luceescript
+// example0.cfm
+new Example0();
+new Example0();
+new Example0();
+cfc = new Example0();
+cfc.hey();
+```
+
+## Example 2
+
+As our code gets more complicated, we need to make some additions to it.
+
+- One option is to create the Component in the application scope or server scope, or to use the function GetComponentMetaData to store components in a more persistent manner.
+
+The static scope for components was introduced in Lucee 5.0. This is a scope that is shared with all instances of the same component.
+
+Here is an example showing the use of static scope:
+
+```luceescript
+// Example1.cfc
+Component {
+ static var counter = 0;
+ public function init() {
+ static.counter++;
+ dump("create an instance of " & listLast(getCurrentTemplatePath(),'\/') & " " & static.counter);
+ }
+ public function getCount() {
+ return static.counter;
+ }
+}
+```
+
+Here, the variable `counter` is defined in the static scope. This means that all instances of Example1.cfc share this variable.
+
+2. In the following example, we call the Example1() function three times. Each time, the `counter` variable is incremented and shared across all instances.
+
+```luceescript
+// example1.cfm
+new Example1();
+new Example1();
+new Example1();
+```
+
+## Example 3
+
+1. Another example is using the static scope to store the result of a time-consuming operation that does not need to be recomputed every time.
+
+```luceescript
+// Example2.cfc
+Component {
+ static var data = [];
+ public function init() {
+ if (arrayLen(static.data) == 0) {
+ for (i = 1; i <= 100; i++) {
+ arrayAppend(static.data, i * i);
+ }
+ }
+ dump(static.data);
+ }
+}
+```
+
+Here, the array `data` is defined in the static scope, which means it will be computed only once and shared across all instances.
+
+2. In the following example, we call the Example2() function twice. The array `data` is computed only once and reused in the second instance.
+
+```luceescript
+// example2.cfm
+new Example2();
+new Example2();
+```
+
+## Example 4
+
+1. The static scope can also be used for functions. In this example, we define a static function that is available to all instances.
+
+```luceescript
+// Example3.cfc
+Component {
+ public static function hello() {
+ return "Hello, World!";
+ }
+}
+```
+
+2. In the following example, we call the static function `hello` without creating an instance of Example3.
+
+```luceescript
+// example3.cfm
+dump(Example3::hello());
+```
+
+## Example 5
+
+1. The static scope can be used to count the number of instances created from a component.
+
+```luceescript
+// Example4.cfc
+Component {
+ static var counter = 0;
+ public function init() {
+ static.counter++;
+ dump(static.counter & " instances used so far");
+ }
+}
+```
+
+2. In the following example, we call the Example4() function five times. Each time the function is called, the count of `counter` in the static scope increases.
+
+```luceescript
+// example4.cfm
+new Example4();
+new Example4();
+new Example4();
+new Example4();
+new Example4();
+```
+
+## Example 6
+
+1. We can also use the static scope to store constant data like HOST, PORT.
+
+- If we store the instance in the variable scope, you will run into problems when you have a thousand components or it gets loaded a thousand times. This is a waste of time and memory storage.
+- The static scope means that a variable only exists once and is independent of how many instances you have. So it is more memory efficient to do it that way. You can also do the same for functions.
+
+```luceescript
+// Example5.cfc
+Component {
+ static {
+ static.HOST = "lucee.org";
+ static.PORT = 8080;
+ }
+ public static function splitFullName(required string fullName) {
+ var arr = listToArray(fullName, " ");
+ return {'lastname': arr[1], 'firstname': arr[2]};
+ }
+ public function init(required string fullName) {
+ variables.fullname = static.splitFullName(fullName);
+ }
+ public string function getLastName() {
+ return variables.fullname.lastname;
+ }
+}
+```
+
+2. In the following example, we call the Example5() function in two ways. It has a function splitFullName() that does not need to access anything (read or write data from the disks) and a variable scope that doesn't have to be part of the instance. It returns the firstname and lastname.
+
+```luceescript
+// example5.cfm
+person = new Example5("Sobchak Walter");
+dump(person.getLastName());
+dump(Example5::splitFullName("Quintana Jesus"));
+```
+
+## Footnotes
+
+[Lucee 5 features reviewed: static](https://dev.lucee.org/t/lucee-5-features-reviewed-static/433)
+
+[Video: Lucee Static Scopes in Component Code](https://www.youtube.com/watch?v=B5ILIAbXBzo&feature=youtu.be)
diff --git a/docs/recipes/sub-components.md b/docs/recipes/sub-components.md
new file mode 100644
index 000000000..79580c067
--- /dev/null
+++ b/docs/recipes/sub-components.md
@@ -0,0 +1,46 @@
+
+
+# Sub Component
+
+Since Lucee 6.0, Lucee allows you to create sub components. These are additional components created in a .cfc after the main component.
+
+After the main component, simply add as many additional components as you like with the attribute "name" like this:
+
+```lucee
+component {
+ function mainTest() {
+ return "main";
+ }
+}
+component name="Sub" {
+ function subTest() {
+ return "sub";
+ }
+}
+```
+
+This is useful when a component needs sub components, like an Address component could have a Person component inside.
+
+Here is an example of how you can address/load these sub components:
+
+```lucee
+cfc = new MyCFC();
+echo("main->" & cfc.mainTest());
+echo(" ");
+cfc = new MyCFC$Sub();
+echo("sub->" & cfc.subTest());
+echo(" ");
+```
diff --git a/docs/recipes/supercharge-your-website.md b/docs/recipes/supercharge-your-website.md
new file mode 100644
index 000000000..eaa8d2d32
--- /dev/null
+++ b/docs/recipes/supercharge-your-website.md
@@ -0,0 +1,45 @@
+
+
+# Supercharge your website
+
+This document explains how you can improve the performance of your website in a very short time with Lucee.
+
+## Example:
+
+```luceescript
+// index.cfm
+writeDump(now());
+```
+
+Run the above index.cfm, and you get a timestamp. Whenever we call our file, Lucee checks once at every request if a file has changed or not (for files currently residing in the template cache). If a file has changed, Lucee recompiles it, and executes it. Checking the files at every request takes time. If you have a published server, and you know your server does not produce or change any files, you can simply avoid that check that happens all the time.
+
+## Using Admin
+
+- Go to _Admin -> Performance/ Caching -> Inspect Templates (CFM/CFC) -> Never_
+
+- The default is "Once", checking any requested files one time within each request. You should check "Never" to avoid the checking at every request.
+
+- Change the index.cfm and run it again. No changes happen in the output because Lucee does not check if the file changed or not. Now, let's see the faster execution and less performance memory being used.
+
+- You can clear the cache by code using `pagePoolClear()`. This clears all template cache so that Lucee will check again if the template has changed. On the next request, Lucee will check initially for the file.
+
+- Another option to clear the template cache is to use clear cache via the admin by clicking the button in _Admin -> Settings -> Performance/ Caching -> Page Pool Cache_.
+
+## Footnotes
+
+Here you can see these details on video also:
+
+[Charge Your Website](https://youtu.be/w-eeigEkmn0)
diff --git a/docs/recipes/thread-task.md b/docs/recipes/thread-task.md
new file mode 100644
index 000000000..34dda69dd
--- /dev/null
+++ b/docs/recipes/thread-task.md
@@ -0,0 +1,122 @@
+
+
+# Thread Task
+
+This document explains about the thread tasks. It is useful to know the differences between regular threads and task threads.
+
+When a regular thread throws an exception, the default exception type is `type='daemon'`. After an exception, the thread is dumped. If a regular thread is terminated due to an error, the information from the thread will be output with a 'terminated' status.
+
+Regular Threads have the following characteristics:
+
+1. **Bound to current request**: With the help of CFThread you can always see what the thread is doing. With `action='join'` you can wait until the thread ends and join it. You can also call `action='terminate'` and end the thread. You always have control over the thread with the various actions.
+
+2. **Runs only once**: The thread runs only once. It ends at the end of the Cfthread tag or if there is an exception.
+
+3. **It fails when it fails**: There is no special exception handling so when the thread fails it fails unless you have Cftry, cfcatch inside the thread and you have exception handling there.
+
+## Example 1
+
+In addition to daemon (regular) threads, Lucee also supports task threads. The main differences is that task threads execute completely independently of the request that is calling the thread. We log the thread and can re-execute it.
+
+This example shows a task thread. It is similar to the daemon thread, but we do not have the join and output of the thread because these are not allowed with a task thread.
+
+```luceescript
+thread name="test" type="daemon" {
+ throw "hopala!";
+}
+thread action="join" name="test";
+dump(cfthread.test);
+```
+
+Note that when you execute the example code, you will get no output. This is expected since no output was written in the code.
+
+However, view the Lucee _Admin --> Services --> Tasks_ and see the name of the tasks and their `Type` is `daemon` and the status is `terminated`.
+
+## Example 2
+
+Next we show a similar example using the task type:
+
+```luceescript
+thread name="test" type="task" {
+ throw "hopala!";
+}
+sleep(1000);
+dump(getPageContext().getTasks().getTask("test"));
+```
+
+This example shows the task type. This example is similar to the daemon thread. It waits 1 second before outputting the task details. The task type thread will continue to run independently.
+
+## Example 3
+
+Task threads can be retried multiple times if they fail. This is different from daemon threads which fail permanently after an exception. Below example shows a task thread that retries multiple times.
+
+```luceescript
+thread name="test" type="task"
+ retryinterval=[
+ {tries:3, interval:createTimeSpan(0,0,0,1)},
+ {tries:5, interval:createTimeSpan(0,0,0,5)},
+ {tries:10, interval:createTimeSpan(0,0,0,10)},
+ {tries:10, interval:createTimeSpan(0,0,1,0)},
+ {tries:20, interval:createTimeSpan(0,0,10,0)}
+ ] {
+ throw "hopala!";
+}
+sleep(1000);
+dump(getPageContext().getTasks().getTask("test"));
+```
+
+This example creates a task thread named `test` that retries according to the defined intervals. Initially, the task thread throws an exception. The retry intervals are defined in the array with `tries` and `interval` attributes.
+
+## Example 4
+
+Another example for getting the admin component and task is physically created on the system.
+
+```luceescript
+thread name="test" type="task"
+ retryinterval=[
+ {tries:3, interval:createTimeSpan(0,0,0,1)},
+ {tries:5, interval:createTimeSpan(0,0,0,5)},
+ {tries:10, interval:createTimeSpan(0,0,0,10)},
+ {tries:10, interval:createTimeSpan(0,0,1,0)},
+ {tries:20, interval:createTimeSpan(0,0,10,0)}
+ ] {
+ throw "hopala!";
+}
+sleep(1000);
+admin=new Administrator(type:"web",password:"server");
+tasks=admin.getTasks();
+dump(tasks);
+admin.executeTask(tasks.id);
+admin.removeTask(tasks.id[tasks.recordcount]);
+admin.removeAllTask();
+```
+
+1. `admin.getTasks()` is used to list out all existing tasks. When executed, it returns a query that contains the information from the task.
+
+2. `admin.executeTask()` is used to execute the task and we see it in the browser. It throws an exception.
+
+3. `admin.removeTask()` and `admin.removeAllTask()` are used to remove tasks from the administrator.
+
+## Footnotes
+
+Here you can see the details in the video:
+[Thread Task](https://youtu.be/-SUbVWqJRME)
diff --git a/docs/recipes/thread-usage.md b/docs/recipes/thread-usage.md
new file mode 100644
index 000000000..7b022c282
--- /dev/null
+++ b/docs/recipes/thread-usage.md
@@ -0,0 +1,193 @@
+
+
+# Thread Usage
+
+This document explains how to use threads in Lucee. Threads are mainly used for executing code in parallel.
+
+## Example 1
+
+The below example shows normal execution, waiting for all code to resolve. Here it takes 1000 milliseconds to complete the execution.
+
+```lucee
+
+function napASecond() localmode=true {
+ sleep(1000);
+}
+start = getTickCount();
+napASecond();
+dump("done in #getTickCount()-start#ms");
+
+```
+
+The below example shows thread execution. Code within the thread tag runs in parallel with the execution of the other code in the cfscript. Here execution does not wait for sleep.
+
+```lucee
+
+function napASecond() localmode=true {
+ thread {
+ sleep(1000);
+ }
+}
+start = getTickCount();
+napASecond();
+dump("done in #getTickCount()-start#ms");
+
+```
+
+Threads run independently of other threads or code in Lucee. Lucee does not the thread first and then the following code.
+
+Threads are mainly used to retrieve data from the database, cfhttp, or webservice. Threads are used when it does not matter how much time it takes to execute.
+
+## Example 2
+
+Here we see an example using multiple threads in Lucee. All threads run in parallel.
+
+```lucee
+
+function napASecond(index) localmode=true {
+ thread {
+ thread.start = now();
+ sleep(1000)
+ thread.end = now();
+ }
+}
+
+start = getTickCount();
+loop from=1 to=5 index="index" {
+ napASecond(index);
+}
+
+// show threads
+dump(var:cfthread, expand=false);
+// wait for all threads to finish
+thread action="join" name=cfthread.keyList();
+// show threads
+dump(var:cfthread, expand=false);
+
+dump("done in #getTickCount()-start#ms");
+
+```
+
+The above example shows five threads running in parallel. The thread action="join" line waits for all threads to finish. `cfthread` returns struct info of all thread statuses.
+
+## Example 3
+
+Threads can also be used to perform long-running tasks asynchronously.
+
+```lucee
+
+// normal array
+list = ["Susi", "Harry"];
+list.each(
+ function(value, key, struct) {
+ systemOutput(arguments, true);
+ }
+ ,true
+);
+// struct
+list = {"name": "Susi", "age": 47};
+list.each(
+ function(value, key, struct) {
+ systemOutput(arguments, true);
+ }
+ ,true
+);
+// list
+list = "Susi,Harry";
+list.each(
+ function(value, key, struct) {
+ systemOutput(arguments, true);
+ }
+ ,true
+);
+// query
+persons = query(
+ 'firstName': ['Susi', 'Harry'],
+ 'lastName': ['Sorglos', 'Hirsch']
+);
+queryEach(
+ persons,
+ function(value, row, query) {
+ systemOutput(arguments, true);
+ }
+ ,true
+);
+persons.each(
+ function(value, row, query) {
+ systemOutput(arguments, true);
+ }
+ ,true
+);
+dump("done");
+
+```
+
+## Example 4
+
+Lucee members often discuss how to extend functionality to make Lucee easier to use or adding other new functionality.
+
+This example shows a future implementation of threads in Lucee.
+
+```lucee
+
+// Thread Pool
+tasks.each(
+ function(value, key, struct) {
+ systemOutput(arguments, true);
+ }
+ ,true
+ ,20 // ATM default for max threads is 20, instead we plan to use a smart thread pool in the future (Java ExecutorService)
+);
+
+```
+
+Currently, the default max threads is 20. In the future, we plan to use a smart thread pool based on your JVM (Java ExecutorService). So you will not have to take care of how many threads are being used. The system will do that, and provide the best choice for your code.
+
+```lucee
+
+thread /* action="thread" name="whatever" */ {
+ sleep();
+}
+
+```
+
+In the future, we will make threads smarter by also using a pool for threads.
+
+This feature is something we are planning. Changes will be implemented on the backend so that nothing changes on the front end.
+
+```lucee
+
+// Extend parallel
+loop from=1 to=10 index="i" parallel=true {
+ ...
+}
+// ???
+for(i=0; i<10; i++; true) {
+}
+
+```
+
+Another planned enhancement is to extend parallel to the loop by simply adding `parallel=true`. It will execute the body of the loop in parallel.
+
+## Footnotes
+
+Here you can see the above details in a video:
+
+[Lucee Threads](https://www.youtube.com/watch?v=oGUZRrcg9KE)
diff --git a/docs/recipes/timeout.md b/docs/recipes/timeout.md
new file mode 100644
index 000000000..84ff2c698
--- /dev/null
+++ b/docs/recipes/timeout.md
@@ -0,0 +1,50 @@
+
+
+# Timeout
+
+Since version 6.0, Lucee supports the tag ``. This tag allows you to define a timeout specific to a code block.
+
+## Basic Usage
+
+This example shows how to define a timeout for a code block:
+
+```lucee
+
+
+
+```
+
+You define how long the code within the tag is allowed to run and a listener (closure) that is called in case the timeout is reached. In this case, the listener `onTimeout` simply dumps the timespan.
+
+## Error Handling
+
+You can also add an additional listener `onError` that is called in case an exception occurs within the timeout block. If you want to escalate the exception, you simply rethrow the exception like in the following example:
+
+```lucee
+
+
+
+```
diff --git a/docs/recipes/types-in-lucee.md b/docs/recipes/types-in-lucee.md
new file mode 100644
index 000000000..5ed27f9c5
--- /dev/null
+++ b/docs/recipes/types-in-lucee.md
@@ -0,0 +1,110 @@
+
+
+# Types in Lucee
+
+This document explains types in Lucee. Lucee is still an untyped language. Types are only a check put on top of the language. The language is not based on types, however there are different places where types come into Lucee. This is explained with some simple examples below:
+
+### Example 1 : Function Argument and Return Value
+
+For functions, the return value is returned with the specific type that was defined in that function.
+
+```luceescript
+
+// function1.cfm
+
+ param application.names={};
+ boolean function recExists(string name, number age) {
+ var exists = application.names.keyExists(name);
+ application.names[name]=age;
+ dump(age);
+ return exists;
+ }
+ dump(recExists("Susi","15"));
+ void function test(array arr) {
+ arr[2]="two";
+ }
+ arr={'1':'one'};
+ test(arr);
+ dump(arr);
+```
+
+- This example function has two arguments: name, age (One is a string, the other is a number). When this example is executed, the recExists() function checks if a certain record exists or not and It returns the boolean value `true`.
+- When dumping the function recExists() with arguments, if we give age as a string format in the argument, `dump(recExists("Susi","15"))`, it shows `string 15` even though we defined it as a number data type in the arguments.
+- The test() function takes an array, but in this example I do not pass an array into the function. I have passed a struct `arr={'1':'one'}` value into the test() function. The test() function contains an array value `arr[2]= "two"`, so Lucee converts this array value into a structure. So the struct has two values as per keys are 1, 2 and values are one, two.
+- Lucee can handle an array as long as the keys are all numbers, meaning it considers a struct `'1' and [2]`. Execute this cfm page, the dump shows the structure format.
+
+### Example 2 : CFParam
+
+```luceescript
+
+// param.cfm
+
+param name="url.age" type="numeric" default=10;
+param name="url.name" type="string" default="Susi";
+param name="url.mails" type="array" default=["Susi@lucee.org"];
+dump(url);
+
+// convert string to date
+ d=dateAdd("d",0,"12/1/2018");
+ dump(d);
+// convert date to number
+ n=d+1;
+ dump(n);
+// convert number to date
+ d=dateAdd("d",0,n);
+ dump(d);
+ sb=createObject("java","java.lang.StringBuilder").init("Susi Sorglos");
+ dump(sb);
+ dump(sb.substring("5"));
+ dump(sb.substring(JavaCast("int","5")));
+//sb=createObject("java","java.lang.StringBuilder").init("1");
+ sb=createObject("java","java.lang.StringBuilder").init(javaCast("int","1"));
+ dump(sb);
+```
+
+- Internally every object has a type and Lucee automatically takes care of converting from one type to another if necessary. For example when you define a function with a string, but then pass a number into that function, Lucee automatically converts the number to a string.
+- The above example is useful for converting "string to date", "date to number", "number to date" formats.
+- We have loaded a Java library and string builder. We pass a string into a constructor and execute this. We see that the string builder contains that value. We refer to this `string builder` method in the Java Doc. The method is called `substring`. This substring takes an int as its argument. For example, we pass a string value instead of an int value `sb.substring("5")`. Lucee returns a substring properly.
+- Two constructors are available for string builder. There are `StringBuilder(int), StringBuilder(string)`.
+
+```luceescript
+
+//index.cfm
+
+directory sort="name" action="list" directory=getDirectoryFromPath(getCurrentTemplatePath()) filter="example*.cfm" name="dir";
+loop query=dir {
+ echo('#dir.name# ');
+}
+```
+
+```luceescript
+
+// test.cfc
+
+component {
+ function getName() {
+ return "Susi";
+ }
+}
+```
+
+These types are on top of the language. Lucee contains some other different types too. Therefore, it is always good to do type checking in your code.
+
+## Footnotes
+
+Here you can see above details in video
+
+[Types of Lucee](https://youtu.be/02kMrN4PByc)
diff --git a/docs/recipes/using-s3-directly-for-source-code.md b/docs/recipes/using-s3-directly-for-source-code.md
new file mode 100644
index 000000000..8d215107e
--- /dev/null
+++ b/docs/recipes/using-s3-directly-for-source-code.md
@@ -0,0 +1,73 @@
+
+
+# Using S3 directly for source code
+
+This document explains how to use S3 as for your source code and how to use S3 for your artifacts when we look at the source code itself.
+
+## Example:
+
+```luceescript
+// get an image directly from s3
+content file = "s3:///cfml1/lucee.png" type = "image/png"
+"s3://##:#awsSecretKey#@/";
+```
+
+//Application.cfc
+
+```luceescript
+component{
+ this.name = 'exampleS3';
+ this.s3.accesskeyid = "JHKLJHGSGSGVSGVS";
+ this.s3.awssecretkey = "Jgftiutry3uwiumcx4bvhjf9ksepu5wrwnvwbh9gj";
+}
+```
+
+1. In this example we directly call an S3 resource of the image using `file="s3:///cfml1/lucee.png"` and also define the mime type. Then we see the image while calling it in the browser.
+
+2. In this example, we define the credentials of the S3 in the Application.cfc. Here we give dummy data for the accesskey Id and secretkey.
+
+3. In this example, if you have an exception, it will display on the page exposing your credential information. So, we never use an error template that shows the exception. Best practice is to never use the credential with the password itself. Instead, always defined it in the application.cfc
+
+4. Another option is to map with the admin.
+
+ - Virtual : /s3
+ - Resource : s3://somethingLikeThis@/
+
+But again, that would expose your credentials for everybody that sees an exception message.
+
+5. Instead, set the credentials in the environment variable or system properties (This is a new feature in S3 0.9.4.118). So, we can remove the resource in the mapping and just simply define `Resource : s3:///cfml1/` and save this mapping.
+
+6. Two important things in mapping.
+
+ - When enabling the flag `Web Accessible`, this exposes that mapping directly to the user. So you can call it at /s3 in the browser.
+ - When removing the flag `Web Accessible`, you can only include that mapping. So, we always use cfinclude s3.
+
+7. If we select `Never` in 'Inspect Templates' this tells Lucee to pick up the file on first request from s3. It will compile the file to a local folder. Then it will only use that local compiled file and never check again if the file has changed.
+
+8. We go to `localhost:8888/s3/cfml1/index.cfm` in the browser. We get the source from S3 which comes directly from a stream, so we are catching that. It will not pick up any changes at all. For example, if we change that file a little bit and then update the file on s3, and then call it again in the browser, it does not pick up the latest changes. Because it is cached, what you now can do is flush the change with the help of the function `PagePoolClear()`. This function will create a complete page pool.
+
+9. Lucee will pick up the file including the new changes when we call and execute again. Here you have cached and flushed the cache manually. If you add new files to the s3, you can automate that step.
+
+It might be very useful to schedule a task that checks every five minutes or so to see if there are changes in the files on S3, and flush everything is there are changes.
+
+## Footnotes
+
+Here you can also see these details in the video:
+
+[S3 for source code](https://youtu.be/twQomRCbaCY)
diff --git a/docs/recipes/virtual-file-system.md b/docs/recipes/virtual-file-system.md
new file mode 100644
index 000000000..14c1e2393
--- /dev/null
+++ b/docs/recipes/virtual-file-system.md
@@ -0,0 +1,432 @@
+
+
+# Virtual File Systems
+
+Lucee uses virtual file systems for all file interactions. Actions like `fileRead(file)` can be done against any filesystem defined. Every virtual filesystem is addressed with a protocol prefix like "http" or "s3". When no protocol prefix is defined, the default "virtual" file system "file" is used, which is the local filesystem (can be changed).
+
+Lucee supports the following virtual file systems out of the box:
+
+- file (default)
+- ftp
+- http / https
+- ram
+- zip / tgz / tar
+
+Additionally, there are extensions for the following virtual file systems:
+
+- git
+- S3
+
+## File - Local File System
+
+You may already be familiar with local file systems. The local file system is the default file system in Lucee. That means if there is no other definition, Lucee will always use the local file system.
+
+A simple example:
+
+```lucee
+
+ sct.file = getCurrentTemplatePath();
+ sct.directory = getDirectoryFromPath(sct.file);
+ dump(sct);
+
+ dump(fileRead(sct.file));
+ dump(directoryList(sct.directory));
+
+```
+
+- `getCurrentTemplatePath` returns the current template path.
+- `getDirectoryFromPath` returns the directory.
+- Pass the file path to `fileRead` to read the content of the file.
+- Pass the directory to `directoryList` to list all the directories in the given folder path.
+
+However, you can explicitly define the file system you want to use. To use a local file system, use the `file://` prefix.
+
+As seen in the example code above, the local file system is the default, so it is not necessary to explicitly define it. The example below shows how you can explicitly define a local file system. The result is the same as the code above.
+
+```lucee
+
+ sct.file = getCurrentTemplatePath();
+ sct.directory = getDirectoryFromPath(sct.file);
+ dump(sct);
+
+ sct.file = "file://" & sct.file;
+ sct.directory = "file://" & sct.directory;
+
+ dump(sct);
+ dump(fileRead(sct.file));
+ dump(directoryList(sct.directory));
+
+```
+
+### Pattern
+
+`[file://]`
+so for example
+`file:///Users/susi/Projects/local/file.txt`
+or simply
+`/Users/susi/Projects/local/file.txt`
+
+## FTP File System
+
+Lucee allows you to treat a remote FTP server as a virtual filesystem.
+
+You will need access credentials for accessing FTP. Set up an FTP file system using the prefix `ftp://`.
+
+You can define the credentials in the Application.cfc like this
+
+Application.cfc
+
+```lucee
+// How to configure default FTP settings via Application.cfc
+this.ftp.username = "secretUser";
+this.ftp.password = "secretPW";
+this.ftp.host = "ftp.lucee.org";
+this.ftp.port = 21;
+```
+
+Then you can simply do an FTP call like this:
+
+```lucee
+dir = directoryList("ftp:///dir/file.txt");
+dump(dir);
+```
+
+But you can also put everything in the path directly with no definition in the Application.cfc like this:
+
+```lucee
+
+dir = directoryList("ftp://secretUser:secretPW@ftp.lucee.org:21/dir/file.txt");
+dump(dir);
+
+```
+
+Or take parts from Application.cfc and define other parts directly like this:
+
+Application.cfc
+
+```lucee
+// How to configure default FTP settings via Application.cfc
+this.ftp.username = "secretUser";
+this.ftp.password = "secretPW";
+```
+
+```lucee
+
+dir = directoryList("ftp://ftp.lucee.org:21/dir/file.txt");
+dump(dir);
+
+```
+
+Values in the path directly always overwrite parts coming from the Application.cfc
+
+### Pattern
+
+`ftp://[{user}:{password}@][{host}][:{port}]/{path}`
+so for example
+`ftp://secretUser:secretPW@ftp.lucee.org:21/file.txt`
+
+## HTTP/HTTPS Filesystem
+
+This is a read-only filesystem that makes essential `get` and `head` calls to an HTTP server, with limited functionality. Because of the nature of HTML, things like `directoryList("http://...")` are not possible. This file system also does not support credentials or any definition in the Application.cfc.
+
+```lucee
+
+dump(fileRead("https://lucee.org/index.cfm"));
+
+```
+
+### Pattern
+
+`https://{host}[:{port}]/{path}`
+so for example
+`https://lucee.org/index.cfm`
+
+## RAM/Cache File System
+
+RAM is a virtual file system that allows you to treat the memory of the JVM as a file system.
+This is useful for storing temporary files, and it is very fast since it uses the system's RAM. This data will be lost when the server restarts (unless you use a cache; see below).
+
+The RAM file system is configured with the `ram://` prefix.
+
+```lucee
+
+sct.ram = "ram://";
+dump(sct);
+dump(directoryCreate(sct.ram & "/heidi/"));
+fileWrite(sct.ram & "susi.txt", "sorglos");
+dump(directoryList(sct.ram));
+
+```
+
+### Cache
+
+In addition, you can define a Cache in the Lucee Administrator or in the Application.cfc that then is used to store the data.
+With this cache, this file system can be distributed across multiple servers and can also survive a restart of the Server.
+
+#### Define a cache in the Admin
+
+In the Lucee Administrator under "Services/Cache" you can define a cache (EHCache, Redis, Couchbase, ...) and then below "Default cache connection",
+you define that cache as default for "Resource".
+
+#### Define a cache in the Application.cfc
+
+In the Application.cfc you simply define the following:
+
+```lucee
+// link a cache to be used as resource cache
+this.cache.resource = "cache"; // name of the cache
+```
+
+### Pattern
+
+`ram:///{path}`
+so for example
+`ram:///path/to/my/file.txt`
+
+## ZIP/TGZ/TAR File System
+
+Another file system you can use in Lucee is the ZIP/TGZ/TAR file system to access a compressed file like a file system.
+To tell Lucee to use a compressed file system, use the prefix `zip://`, `tgz://`, or `tar://`.
+
+Now the file path will look like `zip://path/to/the/zip/test.zip!/path/inside/the/zip/file.txt`.
+
+```lucee
+
+sct.zip = "zip://path/to/the/zip/test.zip!/path/inside/the/zip/";
+dump(directoryList(sct.zip));
+dump(fileRead(sct.zip & "/file.txt"));
+
+```
+
+### Pattern
+
+`zip://{path-zip-file}!/{path-inside-zip}`
+`tgz://{path-tgz-file}!/{path-inside-tgz}`
+`tar://{path-tar-file}!/{path-inside-tar}`
+so for example
+`zip://path/to/the/zip/test.zip!/path/inside/the/zip/file.txt`
+
+Next to the bundled virtual file system, there are other file systems available as extensions you can install when needed.
+
+## Object Storage/S3 File System
+
+Object Storage/S3 is a remote file system you can use for Amazon S3 storage.
+
+### Support for different providers
+
+Lucee not only supports access to Amazon S3 cloud storage, it also allows using the same file system to access other Object storage providers:
+
+- Amazon S3 - Cloud Storage
+- MinIO - Open-source Object Storage
+- Wasabi - Cloud Storage
+- Backblaze B2 - Cloud Storage
+- Google Cloud Storage - Cloud Storage
+- Microsoft Azure Blob Storage - Cloud Storage
+- IBM Cloud Object Storage - Cloud Storage
+- DigitalOcean Spaces - Cloud Storage
+- Ceph - Open-source Storage Platform
+- Alibaba Cloud OSS - Cloud Storage
+- DreamHost DreamObjects - Cloud Storage
+- Scality RING - Software-defined Storage
+- Dell EMC ECS - Enterprise Object Storage
+- Cloudian HyperStore - Object Storage
+- OpenIO - Open-source Object Storage
+- NetApp StorageGRID - Object Storage Solution
+
+Traditionally only Amazon S3 Cloud Storage was supported, because of that the prefix `s3://` is used.
+
+### Credentials
+
+The credentials needed to access can be provided in various ways.
+
+#### Environment Variables / System Properties
+
+You can define the credentials with the help of Environment Variables/System Properties. In that case, only a single set of credentials is possible. These are the possible settings:
+
+Environment Variables
+
+```sh
+LUCEE_S3_ACCESSKEYID: AKIAIOSFODNN7EXAMPLE
+LUCEE_S3_SECRETACCESSKEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+# optional
+LUCEE_S3_HOST: s3.eu-central-1.wasabisys.com
+LUCEE_S3_REGION: eu-central-1
+LUCEE_S3_ACL: public-read
+```
+
+System Properties
+
+```sh
+-Dlucee.s3.accesskeyid: AKIAIOSFODNN7EXAMPLE
+-Dlucee.s3.secretaccesskey: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+# optional
+-Dlucee.s3.host: s3.eu-central-1.wasabisys.com # not needed for AWS
+-Dlucee.s3.region: eu-central-1
+-Dlucee.s3.acl: public-read
+```
+
+#### Application.cfc
+
+You can define the credentials in the Application.cfc as a single set like this:
+
+```lucee
+this.s3.accessKeyId = "AKIAIOSFODNN7EXAMPLE";
+this.s3.secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
+// optional
+this.s3.host = "s3.eu-central-1.wasabisys.com"; // not needed for AWS
+this.s3.defaultLocation = "eu-central-1";
+this.s3.acl = "public-read";
+```
+
+But you can also do multiple entries and give everyone a name.
+
+```lucee
+// my wasabi
+this.vfs.s3.mywasabi.accessKeyId = "AKIAIOSFODNN7EXAMPLE";
+this.vfs.s3.mywasabi.secretKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
+this.vfs.s3.mywasabi.host = "s3.eu-central-1.wasabisys.com"; // not needed for AWS
+
+// my aws
+this.vfs.s3.myaws.accessKeyId = "AKFHJUKHZZHEXAMPLE";
+this.vfs.s3.myaws.secretKey = "sdszhHJNkliomi/K7MDENG/bPxRfiCYEXAMPLEKEY";
+```
+
+In the code, they can be used like this:
+
+```lucee
+dir = directoryList("s3://mywasabi@/path/inside/wasabi.txt");
+dump(dir);
+```
+
+#### Define the credentials as part of the path
+
+This is the least secure option because it takes the risk that your credentials get exposed to the user in case of an exception. Lucee 6 and beyond suppress this data, but it's still a risk.
+
+So, in case you have defined your credentials in the environment or in the Application.cfc like described above, you can simply use it like this:
+
+```lucee
+dir = directoryList("s3:///mybucketName/myObjectFolder/myObject.txt");
+dump(dir);
+```
+
+In case you have defined it in the Application.cfc with the help of `this.vfs.s3` with a name, you can use it like this:
+
+```lucee
+dir = directoryList("s3://mywasabi@/mybucketName/myObjectFolder/myObject.txt");
+dump(dir);
+```
+
+Or if you want to pass all data into the path, it would look like this:
+
+```lucee
+dir = directoryList("s3://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY@s3.eu-central-1.wasabisys.com/mybucketName/myObjectFolder/myObject.txt");
+dump(dir);
+```
+
+### Pattern
+
+`s3://[{access-key-id}:{secret-access} || {name}]@[{host}]/{path-inside-s3}`
+so for example:
+`s3://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY@s3.eu-central-1.wasabisys.com/mybucketName/myObjectFolder/myObject.txt`
+
+## GIT File System
+
+GIT is a virtual filesystem that allows you to access GitHub like a filesystem, so you can, for example, map your webroot directly to a GitHub repository. The extension caches the files locally for faster access and recognizes any changes made on GitHub.
+
+### Credentials
+
+The credentials needed to access a private repository can be provided in different ways.
+
+#### Environment Variables / System Properties
+
+You can define the credentials with the help of Environment Variables/System Properties. In that case, only a single set of credentials is possible. These are the possible settings:
+
+Environment Variables
+
+```sh
+LUCEE_GIT_USERNAME: whatever
+LUCEE_GIT_PASSWORD: qwerty
+```
+
+System Properties
+
+```sh
+-Dlucee.git.username: whatever
+-Dlucee.git.password: qwerty
+```
+
+#### Application.cfc
+
+You can define the credentials in the Application.cfc like the following. Additionally, you can define the name and branch of the repository you want to access.
+
+```lucee
+this.git.username = "whatever";
+this.git.password = "qwerty";
+this.git.repository = "lucee-examples";
+this.git.branch = "master";
+```
+
+In the code, this can be used as follows when you have defined everything in the environment (for example, Application.cfc).
+
+```lucee
+dir = directoryList("git:///path/inside/git");
+dump(dir);
+```
+
+It is not possible to define the credentials as part of the path (for security reasons), but you can define "branch" and "repository" in the path like this:
+
+```lucee
+dir = directoryList("git://master@/path/inside/git!lucee-examples");
+dump(dir);
+```
+
+### Pattern
+
+`git://[{branch}@]/{path-inside-git}[!{repository}]`
+so for example:
+`git://master@/path/inside/git!lucee-examples`
+
+## Footnotes
+
+Here you can see the above details in a video:
+
+[Lucee virtual File System](https://www.youtube.com/watch?time_continue=693&v=AzUNVYrbWiQ)
diff --git a/docs/recipes/websocket-extension.md b/docs/recipes/websocket-extension.md
new file mode 100644
index 000000000..c806f6bbe
--- /dev/null
+++ b/docs/recipes/websocket-extension.md
@@ -0,0 +1,282 @@
+
+
+# WebSocket Extension
+
+This extension adds a WebSocket Server to your Lucee Server that runs over `TCP` on port 80 for `WS:` and 443 for `WSS:`
+
+WebSocket Listeners are created with a CFML Component - one per channel.
+
+## Installation
+
+There are multiple ways to install the docker extension.
+
+### Lucee Administrator
+
+The Extension can be installed via Lucee Administrator
+
+![Lucee Admin: Extensions - Application](https://raw.githubusercontent.com/lucee/lucee-docs/master/docs/_images/extension/websocket/lucee-admin-extension.png)
+
+### Manual Installation
+
+Download the LEX file from [https://download.lucee.org/](https://download.lucee.org/) and save to `/lucee/lucee-server/deploy/` (takes up to a minute for Lucee to pick up and install)
+
+![Lucee Download LEX File](https://raw.githubusercontent.com/lucee/lucee-docs/master/docs/_images/extension/websocket/websocket-lex.png)
+
+### Docker
+
+In docker there are different ways to install it.
+
+Copy it into the `deploy folder` like this:
+
+```Dockerfile
+ADD https://ext.lucee.org/org.lucee.websocket.extension-1.0.0.4-BETA.lex /lucee/lucee-server/deploy/
+```
+
+Use Environment Variables like this:
+
+```yml
+environment:
+ - LUCEE_EXTENSIONS=07082C66-510A-4F0B-B5E63814E2FDF7BE;version=1.0.0.4-BETA
+```
+
+Or simply define it in the .CFConfig.json file (Lucee 6 only)
+
+```json
+{
+ "extensions": [
+ {
+ "name": "WebSocket",
+ "path": "/your/path/extensions/websocket.extension-1.0.0.4-BETA.lex",
+ "id": "07082C66-510A-4F0B-B5E63814E2FDF7BE"
+ }
+ ]
+}
+```
+
+See [this](https://github.com/lucee/lucee-docs/tree/master/examples/docker/with-extension) example for more details about setting up Extension in .CFConfig.json.
+
+## Configuration
+
+By default, Lucee Server will look in `{lucee-config}/websockets/` for WebSocket Components.
+
+Lucee Server will create a config file if one does not exists at `{lucee-config}websocket.json` with the following defaults
+
+_{lucee-config}: /lucee/lucee-server/context_
+
+```json
+{
+ "directory": "{lucee-config}/websockets/",
+ "requestTimeout": 50,
+ "idleTimeout": 300
+}
+```
+
+The WebSocket Extension comes with a helper function `websocketInfo()` that well show the current configurations settings. More on other details later ...
+
+![websocketInfo()](https://raw.githubusercontent.com/lucee/lucee-docs/master/docs/_images/extension/websocket/websocketInfo.png)
+TODO: update with new version
+
+## Component
+
+> [!IMPORTANT]
+> a Lucee restart is required when a new WebSocket CFC is added (just like for a ReST CFC)
+
+```lucee
+component hint="used to test websocket client" {
+
+ public static function onFirstOpen(wsclients) {}
+
+ function onOpen(wsclient) {}
+
+ function onOpenAsync(wsclient) {}
+
+ function onMessage(wsclient, message) {}
+
+ function onClose(wsclient, ReasonPhrase) {}
+
+ function onError(wsclient,cfcatch) {}
+
+ public static function onLastClose() {}
+
+}
+```
+
+### Javascript Client
+
+Given that the Component was saved as `{lucee-config}/websockets/test.cfc`, here is native Javascript to open and use a connection to your Lucee WebSocket:
+
+```javascript
+socket = new WebSocket("ws://127.0.0.1:80/ws/test");
+
+socket.onopen = function (evt) {
+ console.log(["onopen()", evt]);
+};
+
+socket.onmessage = (event) => {
+ console.log(event.data);
+};
+
+socket.onerror = function (error) {
+ console.error(error);
+};
+
+socket.send("Hello, Lucee Extension!");
+
+socketclose();
+```
+
+### Broadcast Message to all Clients
+
+A broadcast is a message send to all connected clients
+
+To be able to do this, we need to know who is connected. The first time a connection is made, `onFirstOpen(wsclients)` is fired. `wsclients` is a Java class with the following methods
+
+```java
+size():number // the number of clients connected
+broadcast(any message):boolean // send message to all clients
+getClients():Client[] // return array of all clients currently connected
+close():void // closes all clients
+```
+
+SO we can save that for furture use
+
+```lucee
+public static function onFirstOpen(wsclients) {
+ static.wsclients = arguments.wsclients;
+}
+```
+
+For example
+
+```lucee
+function onOpen(wsclient) {
+ static.wsclients.broadcast("There are now ##static.wsclients.size()## connections");
+}
+```
+
+### Send Message to one Client
+
+When a connection is instantiated, `onOpen(wsclient)` is fired. `wsclient` is a Java class with the following methods
+
+```java
+client.broadcast(message):void // send message to all connected clients
+client.send(message):void // send message to the client
+client.isOpen():boolean // is the client still connected?
+client.isClose():boolean // is the client no longer connected?
+client.close():void // closes the connection of the client
+```
+
+To send a message using wsclient
+
+```lucee
+function onOpen(wsclient) {
+ arguments.wsclient.send("You are connected to Lucee WebSocket");
+}
+```
+
+You can also send a message from `onOpen()` by returning a string
+
+```lucee
+function onOpen(wsclient) {
+ return "Welcome to the test websocket channel";
+}
+```
+
+You can add your own function to the WebSocket Component
+
+```lucee
+public void function sendMessage(
+ required string jsonData
+) {
+ variables.wsclient.send(jsonData);
+}
+
+function onOpen(wsclient) {
+ sendMessage("Hello, Lucee WebSocket!");
+}
+```
+
+## Using Lucee WebSocket to PUSH data to Client
+
+With webSocets being a bidirectional communication channel, your Lucee Server no longer limited to responding to a _request_, it can now _push_ data to the client.
+
+This means the user no longer has to refresh a page to see if data is updated, or have a Javascript looping function that is continuously calling a ReST API to get lasted data.
+
+When your application has data ready for the user, have the WebSocket push the data to the cient!
+
+### Make use of Static Function
+
+Add a thread to start a background process, and have it continuously looping for as long as there are clients connected
+
+```lucee
+public static function onFirstOpen(wsclients) {
+ static.wsclients = arguments.wsclients;
+ thread name="threadDataQueue" oClients=static.wsclients {
+ while( attributes.oClients.size() > 0 ) {
+ data = getDataFromSomewhere();
+ attributes.oClients.broadcastMessage(data);
+ sleep(1000);
+ }
+ }
+}
+```
+
+Function `getDataFromSomewhere()` is respoible for obtaining the data that needs to be sent to the client. RedisQueue is an example of where data can be stored. Your Lucee application can Push data to a Redis Queue, and `getDataFromSomewhere()` can Pop one record at a time.
+
+### Using websocketInfo() to Send Message to Client
+
+`websocketInfo()` also has an array of instances - one for each client call to a WebSocket Component. So looping through the array, gives you access to the Component, and then you can call any of it'sfunction
+
+For Example ( _excuding role management functions_ )
+
+```lucee
+component hint="Test WebSocket" {
+ variables.roles = [];
+
+ public boolean function hasRole(
+ required string role
+ ) {
+ return ( variables.roles.find(arguments.role) > 0 );
+ }
+
+ public void function sendMessage(
+ required string jsonData
+ ) {
+ variables.wsclient.send(jsonData);
+ }
+ ...
+}
+```
+
+```lucee
+var wsInfo = websocketInfo(false);
+if ( !wsInfo.instances.len() )
+ return;
+
+var wsInstances = wsInfo.instances;
+
+var item = getRedisData();
+var stItem = deserializeJSON(item);
+for ( var wsI in wsInstances) {
+ if ( GetMetadata(wsI).name == 'test' && wsI.hasRole(stItem.data.role) ) {
+ wsI.sendMessage(item);
+ }
+}
+```
+
+[Task Event Gateway](event-gateways-overview.md) is a good candidate for this script
+
+_TODO: link to recipe page_
diff --git a/docs/recipes/xml-fast-and-easy.md b/docs/recipes/xml-fast-and-easy.md
new file mode 100644
index 000000000..be29e5dc1
--- /dev/null
+++ b/docs/recipes/xml-fast-and-easy.md
@@ -0,0 +1,432 @@
+
+
+# XML Fast And Easy, using SAX - Listener Functions
+
+This document explains how to use XML parsing in Lucee.
+
+I have XML as shown below:
+
+```luceescript
+//catalog.xml
+
+
+
+Empire Burlesque
+Bob Dylan
+USA
+Columbia
+10.90
+1985
+
+
+Hide your heart
+Bonnie Tyler
+UK
+CBS Records
+9.90
+1988
+
+
+Greatest Hits
+Dolly Parton
+USA
+RCA
+9.90
+1982
+
+
+Still got the blues
+Gary Moore
+UK
+Virgin records
+10.20
+1990
+
+
+Eros
+Eros Ramazzotti
+EU
+BMG
+9.90
+1997
+
+
+One night only
+Bee Gees
+UK
+Polydor
+10.90
+1998
+
+
+Sylvias Mother
+Dr.Hook
+UK
+CBS
+8.10
+1973
+
+
+Maggie May
+Rod Stewart
+UK
+Pickwick
+8.50
+1990
+
+
+Romanza
+Andrea Bocelli
+EU
+Polydor
+10.80
+1996
+
+
+When a man loves a woman
+Percy Sledge
+USA
+Atlantic
+8.70
+1987
+
+
+Black angel
+Savage Rose
+EU
+Mega
+10.90
+1995
+
+
+1999 Grammy Nominees
+Many
+USA
+Grammy
+10.20
+1999
+
+
+For the good times
+Kenny Rogers
+UK
+Mucik Master
+8.70
+1995
+
+
+Big Willie style
+Will Smith
+USA
+Columbia
+9.90
+1997
+
+
+Tupelo Honey
+Van Morrison
+UK
+Polydor
+8.20
+1971
+
+
+Soulsville
+Jorn Hoel
+Norway
+WEA
+7.90
+1996
+
+
+The very best of
+Cat Stevens
+UK
+Island
+8.90
+1990
+
+
+Stop
+Sam Brown
+UK
+A&M
+8.90
+1988
+
+
+Bridge of Spies
+T'Pau
+UK
+Siren
+7.90
+1987
+
+
+Private Dancer
+Tina Turner
+UK
+Capitol
+8.90
+1983
+
+
+Midt om natten
+Kim Larsen
+EU
+Medley
+7.80
+1983
+
+
+Pavarotti Gala Concert
+Luciano Pavarotti
+UK
+DECCA
+9.90
+1991
+
+
+The dock of the bay
+Otis Redding
+USA
+Stax Records
+7.90
+1968
+
+
+Picture book
+Simply Red
+EU
+Elektra
+7.20
+1985
+
+
+Red
+The Communards
+UK
+London
+7.80
+1987
+
+
+Unchain my heart
+Joe Cocker
+USA
+EMI
+8.20
+1987
+
+
+Forever Man
+Eric Clapton
+UK
+Duck
+7.90
+1989
+
+
+Brother in Arms
+Dire Straits
+UK
+Vertigo
+7.90
+1985
+
+
+20 Greatest Hits
+Frank Sinatra
+UK
+Reprise Records
+9.90
+1987
+
+
+Surface Tension
+Roger Hodgson
+UK
+A&M
+8.70
+1984
+
+
+Get a Grip
+Aerosmith
+USA
+Geffen
+8.90
+1993
+
+
+Morning Glory
+Oasis
+UK
+Chrysalis
+8.90
+1995
+
+
+Falling into you
+Celine Dion
+USA
+Epic
+8.90
+1996
+
+
+Escapology
+Robbie Williams
+UK
+Chrysalis
+8.90
+2002
+
+
+One night only
+Bee Gees
+UK
+Polydor
+10.90
+1998
+
+
+```
+
+To read this XML, we need to define a component that implements certain listener functions to handle events from the XML parser.
+
+```luceescript
+component {
+variables.cds=[];
+variables.cd={};
+variables.insideCD=false;
+variables.currentName="";
+variables.filter={};
+variables.removeCD=false;
+
+/**
+* Constructor of the component that takes the path to the XML file and a simple custom-made filter.
+* @param xmlFile XML File to parse.
+* @param filter Filter to limit content to certain records.
+*/
+public any function init(required string xmlFile, struct filter={}) {
+variables.filter=filter;
+xmlEventParser=createObject("java","lucee.runtime.helpers.XMLEventParser");
+xmlEventParser.init(
+getPageContext(),
+this.startDocument,
+this.startElement,
+this.body,
+this.endElement,
+this.endDocument,
+this.error
+);
+xmlEventParser.start(xmlFile);
+return this;
+}
+
+public array function execute(struct filter=variables.filter) {
+variables.cds=[];
+variables.filter=filter;
+xmlEventParser.start();
+return variables.cds;
+}
+
+/**
+* This function will be called at the start of parsing an XML Element (Tag).
+*/
+public void function startElement(string uri, string localName, string qName, struct attributes) {
+if(qName == "cd") {
+variables.cd={};
+variables.insideCD=true;
+variables.removeCD=false;
+}
+else if(variables.insideCD) {
+variables.currentName=qName;
+}
+}
+
+/**
+* Call with body of content.
+*/
+public void function body(string content) {
+if(len(variables.currentName)) {
+variables.cd[variables.currentName]=content;
+if(structKeyExists(variables.filter,variables.currentName) && content != variables.filter[variables.currentName]) {
+variables.removeCD=true;
+}
+}
+}
+
+/**
+* This function will be called at the end of parsing an XML Element (Tag).
+*/
+public void function endElement(string uri, string localName, string qName, struct attributes) {
+if(qName == "cd") {
+if(!variables.removeCD) {
+arrayAppend(variables.cds,variables.cd);
+}
+variables.insideCD=false;
+}
+variables.currentName="";
+}
+
+/**
+* This function will be called at the start of parsing a document.
+*/
+public void function startDocument() {}
+
+/**
+* This function will be called at the end of parsing a document.
+*/
+public void function endDocument() {}
+
+/**
+* This function will be called when an error occurs.
+*/
+public void function error(struct cfcatch) {
+echo(cfcatch);
+}
+}
+```
+
+You can pass the filter struct when you execute the function.
+
+Example:
+
+```luceescript
+
+file=GetDirectoryFromPath(GetCurrentTemplatePath())&'catalog.xml';
+catalog=new XMLCatalog2(file);
+
+dump(catalog.execute({year:"1995"}));
+
+```
+
+The example above executes and returns a result array which contains only the year equal to 1995.
+
+You can modify the component as you like. Instead of storing the array, you can store the result in a database or mail, or whatever you like.
+
+## Footnotes
+
+You can see the details in this video:
+[Xml-Fast and Easy](https://www.youtube.com/watch?v=_AP6GpVk7TE)
diff --git a/examples/docker/basic/Dockerfile b/examples/docker/basic/Dockerfile
new file mode 100644
index 000000000..c780595c5
--- /dev/null
+++ b/examples/docker/basic/Dockerfile
@@ -0,0 +1,11 @@
+FROM lucee/lucee:6.1.0.175-BETA
+
+# Provide test page by creating the directory and copying files
+RUN mkdir -p /var/www
+COPY www/ /var/www/
+
+# how to build it
+# docker build -t lucee-basic .
+
+# how to run it (provides port for nginx and tomcat (optional); Lucee admin password)
+# docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-basic
\ No newline at end of file
diff --git a/examples/docker/basic/docker-compose.yml b/examples/docker/basic/docker-compose.yml
new file mode 100644
index 000000000..7869a1057
--- /dev/null
+++ b/examples/docker/basic/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ lucee:
+ image: lucee-basic:latest
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ ports:
+ - "8854:8888" # tomcat
+ - "8054:80" # nginx
+
+# how to run it
+# docker-compose up -d
diff --git a/examples/docker/basic/readme.md b/examples/docker/basic/readme.md
new file mode 100644
index 000000000..b2c118fa2
--- /dev/null
+++ b/examples/docker/basic/readme.md
@@ -0,0 +1,28 @@
+# Simple Lucee Docker Setup
+
+This repository contains configurations to set up a basic Lucee server using Docker and Docker Compose.
+
+## Files
+
+- `Dockerfile`: Defines the Docker image for the Lucee server.
+- `docker-compose.yml`: Defines the services and configurations to run the Lucee server build using Docker Compose.
+
+## Dockerfile
+
+The `Dockerfile` uses the `lucee/lucee:6.1.0.175-BETA` image and sets up a basic Lucee server with some pages. It includes instructions to create the necessary directory structure and copy the website files into the container.
+
+### How to Build
+
+To build the Docker image defined by the `Dockerfile`, navigate to the directory containing the file and execute this command `docker build -t lucee-basic .`.
+
+### How to Run
+
+To run the Docker container created from the image, use this Docker's run command `docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-basic`. The container will expose ports for Nginx and Tomcat, and you can set the Lucee admin password through environment variables. You can also start it with `docker compose` (see below).
+
+## docker-compose.yml
+
+The `docker-compose.yml` file defines a service for running the Lucee server created with `Dockerfile`. It specifies the image to use, environment variables, volume mappings, and port configurations. This is useful to map an external drive you can access and modify.
+
+### How to Run
+
+To run the services defined in the `docker-compose.yml` file, navigate to the directory containing the file and use this Docker Compose's up command `docker-compose up -d`. This will start the services in detached mode, exposing the necessary ports and setting the Lucee admin password as specified.
diff --git a/examples/docker/basic/www/Application.cfc b/examples/docker/basic/www/Application.cfc
new file mode 100644
index 000000000..a7d8c5562
--- /dev/null
+++ b/examples/docker/basic/www/Application.cfc
@@ -0,0 +1,4 @@
+๏ปฟcomponent {
+
+ this.Name = "Lucee";
+}
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/css/core/_ed07b761.core.min.css b/examples/docker/basic/www/assets/css/core/_ed07b761.core.min.css
new file mode 100644
index 000000000..2ac021e13
--- /dev/null
+++ b/examples/docker/basic/www/assets/css/core/_ed07b761.core.min.css
@@ -0,0 +1,15 @@
+html{-webkit-text-size-adjust:none}body{font-family:'Open Sans',Arial,sans-serif;font-size:15px;font-weight:400;color:#666;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff}a{color:#5999b2}a:hover{text-decoration:underline;color:#449caf}a:focus{text-decoration:none;outline:0;color:#449caf}code{padding:2px 9px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}p{margin:0 0 25px;line-height:28px;font-weight:300;font-size:22px}@media only screen and (max-width:1199px){p{font-size:18px}}@media only screen and (max-width:979px){p{font-size:16px}}img{max-width:100%}h1,h2,h3,h4,h5,h6{font-family:'Open Sans',Arial,sans-serif;font-weight:600;margin-top:0;margin-bottom:25px}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}strong{font-weight:600}.intro-text{font-size:1.2em;line-height:1.6;margin-bottom:18px}.line-break{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-break.dotted{border-top-style:dotted}.line-bold{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-bold.dotted{border-top-style:dotted}.btn{border:none;padding:12px 20px;color:#fff;background:#4c9bb0;font-family:'Open Sans',Arial,sans-serif;font-weight:600;text-align:center;display:inline-block;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn:hover{color:#fff}.btn.disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50)}.btn:focus{color:#fff}.btn:hover{text-decoration:none}@media only screen and (min-width:1200px){.btn-large{font-size:25px;line-height:35px;font-weight:700}}.btn-wide{width:355px;max-width:100%}.btn-download{background:#539ab1;width:355px;max-width:100%}.btn-download:after{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -2px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-left:10px}.primary{color:#4c9bb0}blockquote{border:none;padding:13px 18px 18px;position:relative;font-size:1.2em}blockquote p{margin-bottom:10px;font-weight:300}blockquote .author{font-size:.722em;font-style:normal;text-transform:uppercase;font-weight:700}.well{font-size:1em;border:none}@media print{*{box-shadow:none!important;text-shadow:none!important;-ms-filter:none!important;filter:none!important}input,select,textarea{page-break-inside:avoid}a,a:visited{text-decoration:underline}.ir a:after,a[href]:after,a[href^="javascript:"]:after,a[href^="#"]:after,abbr[title]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.listing{padding:0;margin:0;list-style:none}.listing.border .listing-item+.listing-item{border-top:1px solid #ccc}.listing.border-light .listing-item+.listing-item{border-top:1px solid #f8f8f8}.listing .listing-item{padding:35px 0}.listing .listing-item:after,.listing .listing-item:before{content:" ";display:table}.listing .listing-item:after{clear:both}.listing .listing-item.thumb-small .listing-thumb{width:85px}.listing .listing-item.thumb-small .listing-content{margin-left:-85px;padding-left:110px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-small .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-thumb{width:120px}.listing .listing-item.thumb-large .listing-content{margin-left:-120px;padding-left:145px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-large .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-content .title{margin-bottom:15px}.listing .listing-item.thumb-large .listing-content p{font-weight:400}.listing .listing-item.thumb-large .listing-content .readmore{margin-top:10px;font-weight:700}.listing .listing-thumb{float:left;position:relative;z-index:3}@media only screen and (max-width:767px){.listing .listing-thumb{float:none;margin-bottom:15px;text-align:center;margin-right:auto;margin-left:auto}}.listing .listing-thumb a{display:block;text-decoration:none}@media only screen and (max-width:767px){.listing .listing-thumb a{display:inline-block}}.listing .listing-thumb img{max-width:100%}.listing .listing-content{position:relative;z-index:1;width:100%}.listing .listing-content .title{font-weight:700;margin:0 0 5px}.listing .listing-content p{margin:0}.listing .link-download{margin-top:30px;margin-bottom:0}.link-list{padding:0;margin:0;list-style:none;font-family:'Open Sans',Arial,sans-serif;font-size:1.333em}.link-list li{margin-bottom:7px}.blue{color:#0c0140}.underline{text-decoration:underline}.round-borders{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.round-borders-lg{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.perfect-round{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.aligned-center{text-align:center}.aligned-right{text-align:right}.aligned-left{text-align:left}.aligned-justify{text-align:justify}.uppercase{text-transform:uppercase}.centered{display:block;margin-left:auto;margin-right:auto}.full-width{width:100%}@media only screen and (max-width:979px){.half-grey-light{background:0 0}}.readmore{text-decoration:none;color:#4c9bb0;text-transform:uppercase;font-size:12px;font-weight:700;line-height:1.2}.readmore a{text-decoration:none;color:#4c9bb0}.readmore a:hover{text-decoration:underline}.readmore.explore{color:#0099d2;text-align:left;padding:2px}.readmore.explore a{color:#0099d2}.readmore.explore a:hover{text-decoration:underline}.three-columns,.two-columns{column-count:2;column-gap:30px;-moz-column-count:2;-moz-column-gap:30px;-webkit-column-count:2;-webkit-column-gap:30px;-webkit-margin-bottom-collapse:separate}@media only screen and (max-width:767px){.three-columns,.two-columns{column-count:1!important;column-gap:0!important;-moz-column-count:1!important;-moz-column-gap:0!important;-webkit-column-count:1!important;-webkit-column-gap:0!important}}.three-columns .no-break,.two-columns .no-break{column-break-inside:avoid;-webkit-column-break-inside:avoid;display:inline-block;max-width:100%}.three-columns li,.two-columns li{column-break-inside:avoid;-webkit-column-break-inside:avoid}.three-columns.three-columns,.two-columns.three-columns{column-count:3;-moz-column-count:3;-webkit-column-count:3}#page-banner{background:url(../../img/banner-bg.png) center;background-size:cover;color:#fff}#page-banner.home-banner .banner-content{padding:70px 10px}#page-banner .banner-content{padding:30px 10px;text-align:center}#page-banner .banner-content h1{font-size:55px;font-weight:300;line-height:65px}@media only screen and (max-width:1199px){#page-banner .banner-content h1{font-size:45px;line-height:55px}}@media only screen and (max-width:979px){#page-banner .banner-content h1{font-size:40px;line-height:45px}}@media only screen and (max-width:767px){#page-banner .banner-content h1{font-size:32px;line-height:35px}}#page-banner .banner-content p{font-size:20px;font-weight:600;line-height:25px}@media only screen and (max-width:979px){#page-banner .banner-content p{font-size:18px}}@media only screen and (max-width:767px){#page-banner .banner-content p{font-size:16px}}#page-banner .banner-content p.leadtext{font-size:30px;line-height:35px;margin-bottom:0}@media only screen and (max-width:979px){#page-banner .banner-content p.leadtext{font-size:22px}}@media only screen and (max-width:767px){#page-banner .banner-content p.leadtext{font-size:18px}}#page-banner .banner-content .learn-more{margin-bottom:0}#page-banner .banner-content .learn-more a{width:210px}#page-banner .banner-content .learn-more a:hover{text-decoration:none}
+#contents{position:relative}
+#contents .main-content,#contents .sidebar{padding-top:50px;padding-bottom:60px}
+#contents .main-content{background:#fff}
+#contents .main-content .content-wrap{width:70%;margin-left:10%;margin-right:10%}@media only screen and (max-width:1199px){#contents .main-content .content-wrap{margin-left:auto;margin-right:auto;width:auto}}
+#contents:before{background:#f8f8f8;position:absolute;z-index:0;display:block;content:"";width:50%;height:auto;right:0;top:0;bottom:0}#masthead{background:#01798a;padding-top:50px;padding-bottom:50px}@media only screen and (max-width:979px){#masthead{padding-top:30px;padding-bottom:30px}}@media only screen and (max-width:767px){#masthead{padding-top:15px;padding-bottom:15px}}@media only screen and (max-width:979px){#masthead .top-header{text-align:center;position:relative}}#masthead .site-logo{margin:0;float:left}@media only screen and (max-width:979px){#masthead .site-logo{float:none;display:block;width:121px;height:50px;margin:0 auto}}#masthead .site-logo a{display:block;text-decoration:none}#masthead .main-navigation{float:right;margin-top:13px}@media only screen and (max-width:979px){#masthead .main-navigation{float:none}}@media only screen and (max-width:767px){#masthead .main-navigation{display:none;background:#01798a;position:absolute;z-index:99;top:60px;left:0;width:100%;margin-top:0;padding:15px 30px;text-align:left}}@media only screen and (min-width:768px){#masthead .main-navigation{display:block!important}}@media only screen and (max-width:479px){#masthead .main-navigation{padding-left:15px;padding-right:15px}}#masthead .main-navigation>ul{padding:0;margin:0;list-style:none;display:block}#masthead .main-navigation>ul>li{float:left}#masthead .main-navigation>ul>li+li{margin-left:20px}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li+li{margin-left:0}}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li{display:inline-block;float:none;margin-top:8px}}@media only screen and (max-width:767px){#masthead .main-navigation>ul>li{display:block;margin-top:0}#masthead .main-navigation>ul>li+li{margin-top:12px}}#masthead .main-navigation>ul>li>a{font-weight:400;color:#fff;font-size:18px;text-transform:uppercase}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li>a{margin:0 7px}}#masthead .main-navigation>ul>li.active>a{font-weight:800}.toggle-menu{display:none;border:none;background:0 0;padding:10px;position:absolute;z-index:3;left:30px;top:5px}.toggle-menu:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -46px;width:24px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle}.toggle-menu:focus{outline:0}@media only screen and (max-width:767px){.toggle-menu{display:block}}@media only screen and (max-width:479px){.toggle-menu{left:15px}}#subhead .footer-top{background:#01798a;color:#fff;padding:50px 0 45px}@media only screen and (max-width:1199px){#subhead .footer-top .row>div{padding-left:25px;padding-right:25px}#subhead .footer-top .row>div+div>div{margin-top:20px;padding-top:20px;border-top:1px solid #fff}}#subhead .footer-top .footer-links h3{font-weight:600;font-size:22px;line-height:24px;margin:0 0 25px}#subhead .footer-top .footer-links ul{margin:0;padding:0;list-style:none}#subhead .footer-top .footer-links ul li{margin:0 0 10px}#subhead .footer-top .footer-links ul li a{color:#fff;font-size:18px}#subhead .footer-bot{background:#449caf;padding:30px 0 50px}@media only screen and (max-width:979px){#subhead .footer-bot{text-align:center}}#subhead .footer-bot .footer-logo{float:left;display:block;text-decoration:none}@media only screen and (max-width:979px){#subhead .footer-bot .footer-logo{float:none;display:inline-block}}#subhead .footer-bot p{color:#fff;font-size:13px;font-weight:600;margin:30px 0 0}@media only screen and (max-width:979px){#subhead .footer-bot p{text-align:center}#subhead .footer-bot p.powered-text{margin-top:0}}.sidebar{background:#f8f8f8}.sidebar .sidebar-wrap{max-width:360px;margin:0 auto}.sidebar .widget{margin-bottom:40px}.widget .widget-title{font-size:18px;line-height:23px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ccc}.widget-download .readmore{margin-top:10px}.widget-links ul.links{padding:0;margin:0;list-style:none;display:block}.widget-links ul.links li{margin-bottom:3px;display:block}.widget-links ul.links li a{color:#888;font-weight:600;font-size:18px;display:inline-block}@media only screen and (max-width:979px){.widget-links ul.links li a{font-size:16px}}.widget-links ul.links.docs li a:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -24px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-right:10px}.widget-text p{font-size:18px;font-weight:400;line-height:1.3}@media only screen and (max-width:979px){.widget-text p{font-size:16px}}
+.widget-text p.file-link{margin-bottom:10px}
+.widget-text p.file-link a{color:#888;font-weight:600}
+.widget-text p.file-link a:before{
+ background-image:url(../../img/ico-sprite.png);
+ background-repeat:no-repeat;background-position:-19px -24px;
+ width:18px;height:18px;content:"";
+ display:inline-block;text-indent:-999em;
+ vertical-align:middle;margin-right:10px}
+.widget-text p.readmore{font-weight:700;font-size:12px;line-height:1.2}
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/css/core/ie8.css b/examples/docker/basic/www/assets/css/core/ie8.css
new file mode 100644
index 000000000..30774b1dd
--- /dev/null
+++ b/examples/docker/basic/www/assets/css/core/ie8.css
@@ -0,0 +1,56 @@
+input[type="checkbox"] + label.checked:before {
+ background-position: -162px -68px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ max-width: none;
+ padding-left: 25px !important;
+ width: 100%;
+ width: auto;
+}
+
+.form-control,
+input[type="email"],
+input[type="number"],
+input[type="password"],
+input[type="tel"],
+input[type="url"],
+input[type="text"],
+textarea {
+ padding-top: 13px;
+}
+
+select.form-control {
+ padding-top: 12px;
+ padding-bottom: 11px;
+ height: auto;
+}
+
+.announcement-ticker-wrapper .announcement-ticker .announcement {
+ min-height: 0;
+}
+
+.search-form .search-query {
+ padding-top: 10px;
+}
+
+.supplier-list li.third-child,
+.featured-articles .article.third-child {
+ clear: left !important;
+}
+
+.royalSlider .rsNav .rsNavItem {
+ min-height: 83px;
+}
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/css/json.css b/examples/docker/basic/www/assets/css/json.css
new file mode 100644
index 000000000..62a450ab7
--- /dev/null
+++ b/examples/docker/basic/www/assets/css/json.css
@@ -0,0 +1,48 @@
+
+ pre.json-display {
+ background-color: #2e3b4e;
+ color: #fff;
+ padding: 20px;
+ border-radius: 8px;
+ overflow-x: auto;
+ overflow-y: auto;
+ line-height: 1.5;
+ white-space: pre-wrap; /* Allows the JSON to wrap within the container */
+ width: 600px; /* Fixed width */
+ height: 400px; /* Fixed height */
+ position: relative;
+ }
+
+ .key {
+ color: #d19a66; /* Orange color for keys */
+ }
+
+ .string {
+ color: #98c379; /* Green color for strings */
+ }
+
+ .number {
+ color: #e5c07b; /* Yellow color for numbers */
+ }
+
+ .boolean {
+ color: #56b6c2; /* Blue color for booleans */
+ }
+
+ .null {
+ color: #c678dd; /* Purple color for null */
+ }
+
+ .copy-button {
+ background-color: #5999b2;
+ color: #fff;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ margin-top: 10px;
+ }
+
+ .copy-button:hover {
+ background-color: #417a8a;
+ }
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/css/lib/bootstrap.min.css b/examples/docker/basic/www/assets/css/lib/bootstrap.min.css
new file mode 100644
index 000000000..09b7c3219
--- /dev/null
+++ b/examples/docker/basic/www/assets/css/lib/bootstrap.min.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=47ae24b4df7d7a66efad)
+ * Config saved to config.json and https://gist.github.com/47ae24b4df7d7a66efad
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:980px){.container{width:970px}}@media (min-width:1200px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:980px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:980px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:979px){.hidden-sm{display:none !important}}@media (min-width:980px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/img/banner-bg.png b/examples/docker/basic/www/assets/img/banner-bg.png
new file mode 100644
index 000000000..437e23cf3
Binary files /dev/null and b/examples/docker/basic/www/assets/img/banner-bg.png differ
diff --git a/examples/docker/basic/www/assets/img/ico-sprite.png b/examples/docker/basic/www/assets/img/ico-sprite.png
new file mode 100644
index 000000000..480a237ab
Binary files /dev/null and b/examples/docker/basic/www/assets/img/ico-sprite.png differ
diff --git a/examples/docker/basic/www/assets/img/img-config.png b/examples/docker/basic/www/assets/img/img-config.png
new file mode 100644
index 000000000..904f7b273
Binary files /dev/null and b/examples/docker/basic/www/assets/img/img-config.png differ
diff --git a/examples/docker/basic/www/assets/img/img-ext.png b/examples/docker/basic/www/assets/img/img-ext.png
new file mode 100644
index 000000000..ddd842a82
Binary files /dev/null and b/examples/docker/basic/www/assets/img/img-ext.png differ
diff --git a/examples/docker/basic/www/assets/img/img-link.png b/examples/docker/basic/www/assets/img/img-link.png
new file mode 100644
index 000000000..8d60efd82
Binary files /dev/null and b/examples/docker/basic/www/assets/img/img-link.png differ
diff --git a/examples/docker/basic/www/assets/img/lucee-white.png b/examples/docker/basic/www/assets/img/lucee-white.png
new file mode 100644
index 000000000..8b6756836
Binary files /dev/null and b/examples/docker/basic/www/assets/img/lucee-white.png differ
diff --git a/examples/docker/basic/www/assets/js/core/_38444bee.core.min.js b/examples/docker/basic/www/assets/js/core/_38444bee.core.min.js
new file mode 100644
index 000000000..6a58c32b7
--- /dev/null
+++ b/examples/docker/basic/www/assets/js/core/_38444bee.core.min.js
@@ -0,0 +1,2 @@
+!function(a){var b=(a("html").hasClass("lt-ie9"),function(){var b=function(){a(".toggle-menu").on("click",function(){a(".main-navigation").stop().slideToggle()})};return{init:function(){b()}}}());a(document).ready(function(){b.init()})}(jQuery);
+//# sourceMappingURL=_core.min.map
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/js/core/_core.min.map b/examples/docker/basic/www/assets/js/core/_core.min.map
new file mode 100644
index 000000000..bc5ba4dc5
--- /dev/null
+++ b/examples/docker/basic/www/assets/js/core/_core.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"_core.min.js","sources":["main.js"],"names":["$","LuceeJS","hasClass","mobileMenuHandler","on","stop","slideToggle","init","document","ready","jQuery"],"mappings":"CAAA,SAAUA,GAEN,GAEIC,IAFOD,EAAE,QAAQE,SAAS,UAEhB,WAEV,GAAIC,GAAoB,WACpBH,EAAE,gBACGI,GAAG,QAAS,WAETJ,EAAE,oBAAoBK,OAAOC,gBAQzC,QAGIC,KAAM,WAEFJ,SAYZH,GAAEQ,UAAUC,MAAM,WAEdR,EAAQM,UAIbG"}
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/js/lib/SmoothScroll.js b/examples/docker/basic/www/assets/js/lib/SmoothScroll.js
new file mode 100644
index 000000000..e58b3d059
--- /dev/null
+++ b/examples/docker/basic/www/assets/js/lib/SmoothScroll.js
@@ -0,0 +1,542 @@
+// SmoothScroll for websites v1.2.1
+// Licensed under the terms of the MIT license.
+
+// People involved
+// - Balazs Galambosi (maintainer)
+// - Michael Herf (Pulse Algorithm)
+
+(function(){
+
+// Scroll Variables (tweakable)
+var defaultOptions = {
+
+ // Scrolling Core
+ frameRate : 60, // [Hz]
+ animationTime : 800, // [px] // custom
+ stepSize : 200, // [px] // custom
+
+ // Pulse (less tweakable)
+ // ratio of "tail" to "acceleration"
+ pulseAlgorithm : true,
+ pulseScale : 8,
+ pulseNormalize : 1,
+
+ // Acceleration
+ accelerationDelta : 20, // 20
+ accelerationMax : 1, // 1
+
+ // Keyboard Settings
+ keyboardSupport : true, // option
+ arrowScroll : 50, // [px]
+
+ // Other
+ touchpadSupport : true,
+ fixedBackground : true,
+ excluded : ""
+};
+
+var options = defaultOptions;
+
+
+// Other Variables
+var isExcluded = false;
+var isFrame = false;
+var direction = { x: 0, y: 0 };
+var initDone = false;
+var root = document.documentElement;
+var activeElement;
+var observer;
+var deltaBuffer = [ 120, 120, 120 ];
+
+var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32,
+ pageup: 33, pagedown: 34, end: 35, home: 36 };
+
+
+/***********************************************
+ * SETTINGS
+ ***********************************************/
+
+var options = defaultOptions;
+
+
+/***********************************************
+ * INITIALIZE
+ ***********************************************/
+
+/**
+ * Tests if smooth scrolling is allowed. Shuts down everything if not.
+ */
+function initTest() {
+
+ var disableKeyboard = false;
+
+ // disable keyboard support if anything above requested it
+ if (disableKeyboard) {
+ removeEvent("keydown", keydown);
+ }
+
+ if (options.keyboardSupport && !disableKeyboard) {
+ addEvent("keydown", keydown);
+ }
+}
+
+/**
+ * Sets up scrolls array, determines if frames are involved.
+ */
+function init() {
+
+ if (!document.body) return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var windowHeight = window.innerHeight;
+ var scrollHeight = body.scrollHeight;
+
+ // check compat mode for root element
+ root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
+ activeElement = body;
+
+ initTest();
+ initDone = true;
+
+ // Checks if this script is running in a frame
+ if (top != self) {
+ isFrame = true;
+ }
+
+ /**
+ * This fixes a bug where the areas left and right to
+ * the content does not trigger the onmousewheel event
+ * on some pages. e.g.: html, body { height: 100% }
+ */
+ else if (scrollHeight > windowHeight &&
+ (body.offsetHeight <= windowHeight ||
+ html.offsetHeight <= windowHeight)) {
+
+ // DOMChange (throttle): fix height
+ var pending = false;
+ var refresh = function () {
+ if (!pending && html.scrollHeight != document.height) {
+ pending = true; // add a new pending action
+ setTimeout(function () {
+ html.style.height = document.height + 'px';
+ pending = false;
+ }, 500); // act rarely to stay fast
+ }
+ };
+ html.style.height = 'auto';
+ setTimeout(refresh, 10);
+
+ // clearfix
+ if (root.offsetHeight <= windowHeight) {
+ var underlay = document.createElement("div");
+ underlay.style.clear = "both";
+ body.appendChild(underlay);
+ }
+ }
+
+ // disable fixed background
+ if (!options.fixedBackground && !isExcluded) {
+ body.style.backgroundAttachment = "scroll";
+ html.style.backgroundAttachment = "scroll";
+ }
+}
+
+
+/************************************************
+ * SCROLLING
+ ************************************************/
+
+var que = [];
+var pending = false;
+var lastScroll = +new Date;
+
+/**
+ * Pushes scroll actions to the scrolling queue.
+ */
+function scrollArray(elem, left, top, delay) {
+
+ delay || (delay = 1000);
+ directionCheck(left, top);
+
+ if (options.accelerationMax != 1) {
+ var now = +new Date;
+ var elapsed = now - lastScroll;
+ if (elapsed < options.accelerationDelta) {
+ var factor = (1 + (30 / elapsed)) / 2;
+ if (factor > 1) {
+ factor = Math.min(factor, options.accelerationMax);
+ left *= factor;
+ top *= factor;
+ }
+ }
+ lastScroll = +new Date;
+ }
+
+ // push a scroll command
+ que.push({
+ x: left,
+ y: top,
+ lastX: (left < 0) ? 0.99 : -0.99,
+ lastY: (top < 0) ? 0.99 : -0.99,
+ start: +new Date
+ });
+
+ // don't act if there's a pending queue
+ if (pending) {
+ return;
+ }
+
+ var scrollWindow = (elem === document.body);
+
+ var step = function (time) {
+
+ var now = +new Date;
+ var scrollX = 0;
+ var scrollY = 0;
+
+ for (var i = 0; i < que.length; i++) {
+
+ var item = que[i];
+ var elapsed = now - item.start;
+ var finished = (elapsed >= options.animationTime);
+
+ // scroll position: [0, 1]
+ var position = (finished) ? 1 : elapsed / options.animationTime;
+
+ // easing [optional]
+ if (options.pulseAlgorithm) {
+ position = pulse(position);
+ }
+
+ // only need the difference
+ var x = (item.x * position - item.lastX) >> 0;
+ var y = (item.y * position - item.lastY) >> 0;
+
+ // add this to the total scrolling
+ scrollX += x;
+ scrollY += y;
+
+ // update last values
+ item.lastX += x;
+ item.lastY += y;
+
+ // delete and step back if it's over
+ if (finished) {
+ que.splice(i, 1); i--;
+ }
+ }
+
+ // scroll left and top
+ if (scrollWindow) {
+ window.scrollBy(scrollX, scrollY);
+ }
+ else {
+ if (scrollX) elem.scrollLeft += scrollX;
+ if (scrollY) elem.scrollTop += scrollY;
+ }
+
+ // clean up if there's nothing left to do
+ if (!left && !top) {
+ que = [];
+ }
+
+ if (que.length) {
+ requestFrame(step, elem, (delay / options.frameRate + 1));
+ } else {
+ pending = false;
+ }
+ };
+
+ // start a new queue of actions
+ requestFrame(step, elem, 0);
+ pending = true;
+}
+
+
+/***********************************************
+ * EVENTS
+ ***********************************************/
+
+/**
+ * Mouse wheel handler.
+ * @param {Object} event
+ */
+function wheel(event) {
+
+ if (!initDone) {
+ init();
+ }
+
+ var target = event.target;
+ var overflowing = overflowingAncestor(target);
+
+ // use default if there's no overflowing
+ // element or default action is prevented
+ if (!overflowing || event.defaultPrevented ||
+ isNodeName(activeElement, "embed") ||
+ (isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
+ return true;
+ }
+
+ var deltaX = event.wheelDeltaX || 0;
+ var deltaY = event.wheelDeltaY || 0;
+
+ // use wheelDelta if deltaX/Y is not available
+ if (!deltaX && !deltaY) {
+ deltaY = event.wheelDelta || 0;
+ }
+
+ // check if it's a touchpad scroll that should be ignored
+ if (!options.touchpadSupport && isTouchpad(deltaY)) {
+ return true;
+ }
+
+ // scale by step size
+ // delta is 120 most of the time
+ // synaptics seems to send 1 sometimes
+ if (Math.abs(deltaX) > 1.2) {
+ deltaX *= options.stepSize / 120;
+ }
+ if (Math.abs(deltaY) > 1.2) {
+ deltaY *= options.stepSize / 120;
+ }
+
+ scrollArray(overflowing, -deltaX, -deltaY);
+ event.preventDefault();
+}
+
+/**
+ * Keydown event handler.
+ * @param {Object} event
+ */
+function keydown(event) {
+
+ var target = event.target;
+ var modifier = event.ctrlKey || event.altKey || event.metaKey ||
+ (event.shiftKey && event.keyCode !== key.spacebar);
+
+ // do nothing if user is editing text
+ // or using a modifier key (except shift)
+ // or in a dropdown
+ if ( /input|textarea|select|embed/i.test(target.nodeName) ||
+ target.isContentEditable ||
+ event.defaultPrevented ||
+ modifier ) {
+ return true;
+ }
+ // spacebar should trigger button press
+ if (isNodeName(target, "button") &&
+ event.keyCode === key.spacebar) {
+ return true;
+ }
+
+ var shift, x = 0, y = 0;
+ var elem = overflowingAncestor(activeElement);
+ var clientHeight = elem.clientHeight;
+
+ if (elem == document.body) {
+ clientHeight = window.innerHeight;
+ }
+
+ switch (event.keyCode) {
+ case key.up:
+ y = -options.arrowScroll;
+ break;
+ case key.down:
+ y = options.arrowScroll;
+ break;
+ case key.spacebar: // (+ shift)
+ shift = event.shiftKey ? 1 : -1;
+ y = -shift * clientHeight * 0.9;
+ break;
+ case key.pageup:
+ y = -clientHeight * 0.9;
+ break;
+ case key.pagedown:
+ y = clientHeight * 0.9;
+ break;
+ case key.home:
+ y = -elem.scrollTop;
+ break;
+ case key.end:
+ var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
+ y = (damt > 0) ? damt+10 : 0;
+ break;
+ case key.left:
+ x = -options.arrowScroll;
+ break;
+ case key.right:
+ x = options.arrowScroll;
+ break;
+ default:
+ return true; // a key we don't care about
+ }
+
+ scrollArray(elem, x, y);
+ event.preventDefault();
+}
+
+/**
+ * Mousedown event only for updating activeElement
+ */
+function mousedown(event) {
+ activeElement = event.target;
+}
+
+
+/***********************************************
+ * OVERFLOW
+ ***********************************************/
+
+var cache = {}; // cleared out every once in while
+setInterval(function () { cache = {}; }, 10 * 1000);
+
+var uniqueID = (function () {
+ var i = 0;
+ return function (el) {
+ return el.uniqueID || (el.uniqueID = i++);
+ };
+})();
+
+function setCache(elems, overflowing) {
+ for (var i = elems.length; i--;)
+ cache[uniqueID(elems[i])] = overflowing;
+ return overflowing;
+}
+
+function overflowingAncestor(el) {
+ var elems = [];
+ var rootScrollHeight = root.scrollHeight;
+ do {
+ var cached = cache[uniqueID(el)];
+ if (cached) {
+ return setCache(elems, cached);
+ }
+ elems.push(el);
+ if (rootScrollHeight === el.scrollHeight) {
+ if (!isFrame || root.clientHeight + 10 < rootScrollHeight) {
+ return setCache(elems, document.body); // scrolling root in WebKit
+ }
+ } else if (el.clientHeight + 10 < el.scrollHeight) {
+ overflow = getComputedStyle(el, "").getPropertyValue("overflow-y");
+ if (overflow === "scroll" || overflow === "auto") {
+ return setCache(elems, el);
+ }
+ }
+ } while (el = el.parentNode);
+}
+
+
+/***********************************************
+ * HELPERS
+ ***********************************************/
+
+function addEvent(type, fn, bubble) {
+ window.addEventListener(type, fn, (bubble||false));
+}
+
+function removeEvent(type, fn, bubble) {
+ window.removeEventListener(type, fn, (bubble||false));
+}
+
+function isNodeName(el, tag) {
+ return (el.nodeName||"").toLowerCase() === tag.toLowerCase();
+}
+
+function directionCheck(x, y) {
+ x = (x > 0) ? 1 : -1;
+ y = (y > 0) ? 1 : -1;
+ if (direction.x !== x || direction.y !== y) {
+ direction.x = x;
+ direction.y = y;
+ que = [];
+ lastScroll = 0;
+ }
+}
+
+var deltaBufferTimer;
+
+function isTouchpad(deltaY) {
+ if (!deltaY) return;
+ deltaY = Math.abs(deltaY)
+ deltaBuffer.push(deltaY);
+ deltaBuffer.shift();
+ clearTimeout(deltaBufferTimer);
+ var allDivisable = (isDivisible(deltaBuffer[0], 120) &&
+ isDivisible(deltaBuffer[1], 120) &&
+ isDivisible(deltaBuffer[2], 120));
+ return !allDivisable;
+}
+
+function isDivisible(n, divisor) {
+ return (Math.floor(n / divisor) == n / divisor);
+}
+
+var requestFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function (callback, element, delay) {
+ window.setTimeout(callback, delay || (1000/60));
+ };
+})();
+
+
+/***********************************************
+ * PULSE
+ ***********************************************/
+
+/**
+ * Viscous fluid with a pulse for part and decay for the rest.
+ * - Applies a fixed force over an interval (a damped acceleration), and
+ * - Lets the exponential bleed away the velocity over a longer interval
+ * - Michael Herf, http://stereopsis.com/stopping/
+ */
+function pulse_(x) {
+ var val, start, expx;
+ // test
+ x = x * options.pulseScale;
+ if (x < 1) { // acceleartion
+ val = x - (1 - Math.exp(-x));
+ } else { // tail
+ // the previous animation ended here:
+ start = Math.exp(-1);
+ // simple viscous drag
+ x -= 1;
+ expx = 1 - Math.exp(-x);
+ val = start + (expx * (1 - start));
+ }
+ return val * options.pulseNormalize;
+}
+
+function pulse(x) {
+ if (x >= 1) return 1;
+ if (x <= 0) return 0;
+
+ if (options.pulseNormalize == 1) {
+ options.pulseNormalize /= pulse_(1);
+ }
+ return pulse_(x);
+}
+
+var isChrome = /chrome/i.test(window.navigator.userAgent);
+var isSafari = /safari/i.test(window.navigator.userAgent);
+var wheelEvent = null;
+if ("onwheel" in document.createElement("div"))
+ wheelEvent = "wheel";
+else if ("onmousewheel" in document.createElement("div"))
+ wheelEvent = "mousewheel";
+
+if (wheelEvent && isChrome) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+if (wheelEvent && isSafari) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+})();
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/js/lib/bootstrap.min.js b/examples/docker/basic/www/assets/js/lib/bootstrap.min.js
new file mode 100644
index 000000000..140718def
--- /dev/null
+++ b/examples/docker/basic/www/assets/js/lib/bootstrap.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c33a6af5a36352853818)
+ * Config saved to config.json and https://gist.github.com/c33a6af5a36352853818
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e,s){return this.each(function(){var i=t(this),n=i.data("bs.modal"),a=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);n||i.data("bs.modal",n=new o(this,a)),"string"==typeof e?n[e](s):a.show&&n.show(s)})}var o=function(e,o){this.options=o,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};o.VERSION="3.2.0",o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},o.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},o.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var i=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):o.$element.trigger("focus").trigger(i)}))},o.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden.bs.modal")})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=t.support.transition&&s;if(this.$backdrop=t('').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;i?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},o.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},o.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},o.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},o.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var s=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=o,t.fn.modal.noConflict=function(){return t.fn.modal=s,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(o){var s=t(this),i=s.attr("href"),n=t(s.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),a=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},n.data(),s.data());s.is("a")&&o.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){s.is(":visible")&&s.trigger("focus")})}),e.call(n,a,this)})}(jQuery);
\ No newline at end of file
diff --git a/examples/docker/basic/www/assets/js/lib/jquery-1.10.1.min.js b/examples/docker/basic/www/assets/js/lib/jquery-1.10.1.min.js
new file mode 100644
index 000000000..e407e7699
--- /dev/null
+++ b/examples/docker/basic/www/assets/js/lib/jquery-1.10.1.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.1.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
+ Get involved in the Lucee Project!
+ - Engage with other Lucee community members via our forums/mailing list
+ - Submitting bugs and feature requests
+ - Contribute to the code
+ - Support the project
+
Whether you need installation support or are looking for other professional services. Access our directory of providers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/docker/basic/www/test.cfm b/examples/docker/basic/www/test.cfm
new file mode 100644
index 000000000..8d0a34a2b
--- /dev/null
+++ b/examples/docker/basic/www/test.cfm
@@ -0,0 +1,4 @@
+
+ dump(getCurrentTemplatePath());
+ dump(fileRead(getCurrentTemplatePath()));
+
\ No newline at end of file
diff --git a/examples/docker/readme.md b/examples/docker/readme.md
new file mode 100644
index 000000000..afe848315
--- /dev/null
+++ b/examples/docker/readme.md
@@ -0,0 +1,27 @@
+# Docker Example
+
+This repository contains various directories, each showcasing different configurations and setups for building Lucee Docker containers. These examples demonstrate the flexibility and possibilities available when setting up Lucee.
+
+## basic
+
+The simplest version possible. This setup uses the default configuration and includes no additional extensions or customizations.
+
+## with-config
+
+This version includes a custom configuration file (`lucee-config.json`). It demonstrates how to configure the Lucee server with specific settings tailored to your needs.
+
+## with-extension
+
+This version bundles custom extensions with the Lucee server. It shows how to include additional functionalities and features by integrating custom extensions.
+
+# Usage
+
+Each directory contains everything you need to build and run a Lucee server with the specified setup. Navigate to the desired directory and follow the instructions provided within to build and run the Docker container.
+
+## Building the Docker Image
+
+To build the Docker image for any setup, navigate to the corresponding directory and run:
+
+```sh
+docker build -t lucee-custom .
+```
diff --git a/examples/docker/wip/Dockerfile b/examples/docker/wip/Dockerfile
new file mode 100644
index 000000000..ec2da3ad3
--- /dev/null
+++ b/examples/docker/wip/Dockerfile
@@ -0,0 +1,22 @@
+FROM lucee/lucee:6.1.0.175-BETA
+
+# Provide test page by creating the directory and copying files
+RUN mkdir -p /var/www
+COPY www/ /var/www/
+
+# copy a custom lucee config in place
+COPY lucee-config.json /opt/lucee/server/lucee-server/context/.CFConfig.json
+
+# Create directory for extensions and copy them
+RUN mkdir -p /opt/lucee/extensions
+COPY extensions/ /opt/lucee/extensions/
+
+
+# COPY patches/ /opt/lucee/server/lucee-server/patches
+
+
+# how to build it
+# docker build -t lucee-with-extension .
+
+# how to run it (provides port for nginx and tomcat (optional); Lucee admin password)
+# docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-extension
\ No newline at end of file
diff --git a/examples/docker/wip/docker-compose.yml b/examples/docker/wip/docker-compose.yml
new file mode 100644
index 000000000..1323e5576
--- /dev/null
+++ b/examples/docker/wip/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ lucee:
+ image: lucee/lucee:6.1.0.175-BETA
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ - "./patches:/opt/lucee/server/lucee-server/patches"
+ ports:
+ - "8854:8888" # tomcat
+ - "8054:80" # nginx
+
+# docker-compose up -d
diff --git a/examples/docker/wip/extensions/redis.extension-3.0.0.51.lex b/examples/docker/wip/extensions/redis.extension-3.0.0.51.lex
new file mode 100644
index 000000000..5635fe6f2
Binary files /dev/null and b/examples/docker/wip/extensions/redis.extension-3.0.0.51.lex differ
diff --git a/examples/docker/wip/lucee-config.json b/examples/docker/wip/lucee-config.json
new file mode 100644
index 000000000..c880216b7
--- /dev/null
+++ b/examples/docker/wip/lucee-config.json
@@ -0,0 +1,276 @@
+{
+ "applicationTimeout": "1,0,0,0",
+ "cacheDirectory": "{lucee-config}/cache/",
+ "cacheDirectoryMaxSize": "100mb",
+ "cascadeToResultset": true,
+ "clientCookies": true,
+ "clientDirectory": "{lucee-config}/client-scope/",
+ "clientDirectoryMaxSize": "100mb",
+ "clientManagement": false,
+ "clientTimeout": "0,0,90,0",
+ "componentBase": "/lucee/Component.cfc",
+ "componentDataMemberAccess": "public",
+ "componentDumpTemplate": "/lucee/component-dump.cfm",
+ "debuggingEnabled": false,
+ "debuggingQueryUsage": false,
+ "developMode": false,
+ "domainCookies": false,
+ "listenerMode": "curr2root",
+ "listenerType": "mixed",
+ "mailConnectionTimeout": 30,
+ "mailSpoolEnable": true,
+ "mailSpoolInterval": 5,
+ "mergeUrlForm": false,
+ "mode": "single",
+ "preserveSingleQuote": false,
+ "requestTimeout": "0,0,0,50",
+ "scopeCascading": "standard",
+ "sessionManagement": true,
+ "sessionTimeout": "0,0,30,0",
+ "systemErr": "system",
+ "systemOut": "system",
+ "tempDirectory": "{lucee-config}/temp/",
+ "timeserver": "pool.ntp.org",
+ "updateLocation": "https://update.lucee.org",
+ "updateType": "manual",
+ "version": "5.0",
+ "cacheHandlers": {
+ "timespan": {
+ "class": "lucee.runtime.cache.tag.timespan.TimespanCacheHandler"
+ },
+ "request": {
+ "class": "lucee.runtime.cache.tag.request.RequestCacheHandler"
+ }
+ },
+ "componentMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/components/"
+ }
+ ],
+ "customTagMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/customtags/"
+ }
+ ],
+ "dataSources": {
+ "preserveSingleQuote": "yes"
+ },
+ "debugging": {
+ "logMemoryUsage": "no",
+ "template": "/lucee/templates/debugging/debugging.cfm"
+ },
+ "defaultResourceProvider": [
+ {
+ "class": "lucee.commons.io.res.type.file.FileResourceProvider",
+ "arguments": "lock-timeout:1000;"
+ }
+ ],
+ "dumpWriters": [
+ {
+ "name": "html",
+ "class": "lucee.runtime.dump.HTMLDumpWriter",
+ "default": "browser"
+ },
+ {
+ "name": "text",
+ "class": "lucee.runtime.dump.TextDumpWriter",
+ "default": "console"
+ },
+ {
+ "name": "classic",
+ "class": "lucee.runtime.dump.ClassicHTMLDumpWriter"
+ },
+ {
+ "name": "simple",
+ "class": "lucee.runtime.dump.SimpleHTMLDumpWriter"
+ }
+ ],
+ "fileSystem": {
+ "fldDefaultDirectory": "{lucee-config}/library/fld/",
+ "tldDefaultDirectory": "{lucee-config}/library/tld/",
+ "functionDefaultDirectory": "{lucee-config}/library/function/",
+ "tagDefaultDirectory": "{lucee-config}/library/tag/",
+ "deployDirectory": "{lucee-config}/cfclasses/"
+ },
+ "loggers": {
+ "datasource": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/datasource.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "memory": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/memory.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "requesttimeout": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/requesttimeout.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "deploy": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/deploy.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "thread": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/thread.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "exception": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/exception.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "application": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/application.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "scope": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scope.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "scheduler": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scheduler.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "search": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/search.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mail": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mail.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "orm": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/orm.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "remoteclient": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/remoteclient.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "gateway": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/gateway.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "rest": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/rest.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mapping": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mapping.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "execute": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/execute.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "http": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/http.log",
+ "level": "error",
+ "layout": "classic"
+ }
+ },
+ "mappings": {
+ "/lucee/": {
+ "readonly": "yes",
+ "physical": "{lucee-config}/context/",
+ "archive": "{lucee-config}/context/lucee-context.lar",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ },
+ "/lucee-server/": {
+ "readonly": "yes",
+ "physical": "{lucee-server}/context/",
+ "archive": "",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ }
+ },
+ "orm": {
+ "engineClass": "lucee.runtime.orm.DummyORMEngine"
+ },
+ "remoteClients": {
+ "directory": "{lucee-config}remote-client/"
+ },
+ "resourceProviders": [
+ {
+ "scheme": "ftp",
+ "class": "lucee.commons.io.res.type.ftp.FTPResourceProvider",
+ "arguments": "lock-timeout:20000;socket-timeout:-1;client-timeout:60000"
+ },
+ {
+ "scheme": "zip",
+ "class": "lucee.commons.io.res.type.zip.ZipResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tar",
+ "class": "lucee.commons.io.res.type.tar.TarResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tgz",
+ "class": "lucee.commons.io.res.type.tgz.TGZResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "http",
+ "class": "lucee.commons.io.res.type.http.HTTPResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "https",
+ "class": "lucee.commons.io.res.type.http.HTTPSResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "ram",
+ "class": "lucee.commons.io.res.type.cache.CacheResourceProvider",
+ "arguments": "case-sensitive:true;lock-timeout:1000;"
+ }
+ ],
+ "extensions": [
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/extensions/redis.extension-3.0.0.51.lex"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/docker/wip/patches/6.1.0.186-SNAPSHOT.lco b/examples/docker/wip/patches/6.1.0.186-SNAPSHOT.lco
new file mode 100644
index 000000000..5ff233d5d
Binary files /dev/null and b/examples/docker/wip/patches/6.1.0.186-SNAPSHOT.lco differ
diff --git a/examples/docker/wip/readme.md b/examples/docker/wip/readme.md
new file mode 100644
index 000000000..19fceaae3
--- /dev/null
+++ b/examples/docker/wip/readme.md
@@ -0,0 +1,125 @@
+
+# Lucee Docker Setup with Custom Extensions
+
+This repository demonstrates how to build a Lucee Docker image with custom extensions bundled.
+
+## Files
+
+### Dockerfile
+
+Defines the Docker image for the Lucee server. It includes steps to copy website files, a custom Lucee configuration, and extensions into the appropriate directories.
+
+### lucee-config.json
+
+Contains the Lucee server configuration, including the definition of extensions. Extensions can be defined in various ways:
+
+#### Example with Local Path
+
+The extensions array can specify the path to the extension file within the container.
+
+```json
+"extensions": [
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/web/lucee-server/context/extensions/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+- **name**: Optional, makes it easier to read.
+- **path**: Points to the local directory where the extension is located within the container.
+
+#### Example with URL
+
+The extensions array can also specify the URL from which to download the extension. Note that Lucee needs internet access to download the extension.
+
+```json
+"extensions": [
+ {
+ "url": "https://ext.lucee.org/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+#### Example with Extension ID
+
+You can define the extension by its ID. Lucee will download the extension from the Extension Provider or directly from Maven, depending on the Lucee version.
+
+```json
+"extensions": [
+ {
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718"
+ }
+]
+```
+
+### extensions/redis.extension-3.0.0.51.lex
+
+The extension file itself. Place any extensions you want to bundle in this directory.
+
+## Directory Structure
+
+Your project directory should look like this:
+
+```
+your-project-directory/
+โ
+โโโ Dockerfile
+โโโ docker-compose.yml
+โโโ lucee-config.json
+โโโ www/
+โ โโโ [your website files]
+โโโ extensions/
+ โโโ redis.extension-3.0.0.51.lex
+```
+
+## Usage
+
+### Building the Docker Image
+
+To build the Docker image, navigate to the directory containing the `Dockerfile` and run:
+
+```sh
+docker build -t lucee-with-config .
+```
+
+### Running the Docker Container
+
+To run the Docker container, use the following command:
+
+```sh
+docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-config
+```
+
+This command will start the container, exposing port 80 for Nginx and port 8888 for Tomcat, with the Lucee admin password set to `qwerty`.
+
+### Using Docker Compose
+
+If you prefer to use Docker Compose, you can define the services and configurations in `docker-compose.yml`. Here is an example:
+
+```yaml
+version: '3'
+services:
+ lucee:
+ build: .
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ - "./extensions:/opt/lucee/web/lucee-server/context/extensions"
+ ports:
+ - "8054:80" # nginx
+ - "8854:8888" # tomcat
+```
+
+To start the services, navigate to the directory containing the `docker-compose.yml` file and run:
+
+```sh
+docker-compose up -d
+```
+
+This will build and start the services in detached mode, exposing the necessary ports and setting the Lucee admin password.
+
+## Summary
+
+This setup provides a flexible way to configure and extend the Lucee server using Docker and Docker Compose.
diff --git a/examples/docker/wip/www/Application.cfc b/examples/docker/wip/www/Application.cfc
new file mode 100644
index 000000000..766debabb
--- /dev/null
+++ b/examples/docker/wip/www/Application.cfc
@@ -0,0 +1,8 @@
+๏ปฟcomponent {
+
+ this.Name = "Lucee";
+
+ //this.monitoring.showDebug = true;
+ //this.monitoring.showDoc = true;
+ //this.monitoring.showMetric = true;
+}
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/css/core/_ed07b761.core.min.css b/examples/docker/wip/www/assets/css/core/_ed07b761.core.min.css
new file mode 100644
index 000000000..2ac021e13
--- /dev/null
+++ b/examples/docker/wip/www/assets/css/core/_ed07b761.core.min.css
@@ -0,0 +1,15 @@
+html{-webkit-text-size-adjust:none}body{font-family:'Open Sans',Arial,sans-serif;font-size:15px;font-weight:400;color:#666;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff}a{color:#5999b2}a:hover{text-decoration:underline;color:#449caf}a:focus{text-decoration:none;outline:0;color:#449caf}code{padding:2px 9px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}p{margin:0 0 25px;line-height:28px;font-weight:300;font-size:22px}@media only screen and (max-width:1199px){p{font-size:18px}}@media only screen and (max-width:979px){p{font-size:16px}}img{max-width:100%}h1,h2,h3,h4,h5,h6{font-family:'Open Sans',Arial,sans-serif;font-weight:600;margin-top:0;margin-bottom:25px}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}strong{font-weight:600}.intro-text{font-size:1.2em;line-height:1.6;margin-bottom:18px}.line-break{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-break.dotted{border-top-style:dotted}.line-bold{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-bold.dotted{border-top-style:dotted}.btn{border:none;padding:12px 20px;color:#fff;background:#4c9bb0;font-family:'Open Sans',Arial,sans-serif;font-weight:600;text-align:center;display:inline-block;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn:hover{color:#fff}.btn.disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50)}.btn:focus{color:#fff}.btn:hover{text-decoration:none}@media only screen and (min-width:1200px){.btn-large{font-size:25px;line-height:35px;font-weight:700}}.btn-wide{width:355px;max-width:100%}.btn-download{background:#539ab1;width:355px;max-width:100%}.btn-download:after{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -2px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-left:10px}.primary{color:#4c9bb0}blockquote{border:none;padding:13px 18px 18px;position:relative;font-size:1.2em}blockquote p{margin-bottom:10px;font-weight:300}blockquote .author{font-size:.722em;font-style:normal;text-transform:uppercase;font-weight:700}.well{font-size:1em;border:none}@media print{*{box-shadow:none!important;text-shadow:none!important;-ms-filter:none!important;filter:none!important}input,select,textarea{page-break-inside:avoid}a,a:visited{text-decoration:underline}.ir a:after,a[href]:after,a[href^="javascript:"]:after,a[href^="#"]:after,abbr[title]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.listing{padding:0;margin:0;list-style:none}.listing.border .listing-item+.listing-item{border-top:1px solid #ccc}.listing.border-light .listing-item+.listing-item{border-top:1px solid #f8f8f8}.listing .listing-item{padding:35px 0}.listing .listing-item:after,.listing .listing-item:before{content:" ";display:table}.listing .listing-item:after{clear:both}.listing .listing-item.thumb-small .listing-thumb{width:85px}.listing .listing-item.thumb-small .listing-content{margin-left:-85px;padding-left:110px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-small .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-thumb{width:120px}.listing .listing-item.thumb-large .listing-content{margin-left:-120px;padding-left:145px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-large .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-content .title{margin-bottom:15px}.listing .listing-item.thumb-large .listing-content p{font-weight:400}.listing .listing-item.thumb-large .listing-content .readmore{margin-top:10px;font-weight:700}.listing .listing-thumb{float:left;position:relative;z-index:3}@media only screen and (max-width:767px){.listing .listing-thumb{float:none;margin-bottom:15px;text-align:center;margin-right:auto;margin-left:auto}}.listing .listing-thumb a{display:block;text-decoration:none}@media only screen and (max-width:767px){.listing .listing-thumb a{display:inline-block}}.listing .listing-thumb img{max-width:100%}.listing .listing-content{position:relative;z-index:1;width:100%}.listing .listing-content .title{font-weight:700;margin:0 0 5px}.listing .listing-content p{margin:0}.listing .link-download{margin-top:30px;margin-bottom:0}.link-list{padding:0;margin:0;list-style:none;font-family:'Open Sans',Arial,sans-serif;font-size:1.333em}.link-list li{margin-bottom:7px}.blue{color:#0c0140}.underline{text-decoration:underline}.round-borders{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.round-borders-lg{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.perfect-round{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.aligned-center{text-align:center}.aligned-right{text-align:right}.aligned-left{text-align:left}.aligned-justify{text-align:justify}.uppercase{text-transform:uppercase}.centered{display:block;margin-left:auto;margin-right:auto}.full-width{width:100%}@media only screen and (max-width:979px){.half-grey-light{background:0 0}}.readmore{text-decoration:none;color:#4c9bb0;text-transform:uppercase;font-size:12px;font-weight:700;line-height:1.2}.readmore a{text-decoration:none;color:#4c9bb0}.readmore a:hover{text-decoration:underline}.readmore.explore{color:#0099d2;text-align:left;padding:2px}.readmore.explore a{color:#0099d2}.readmore.explore a:hover{text-decoration:underline}.three-columns,.two-columns{column-count:2;column-gap:30px;-moz-column-count:2;-moz-column-gap:30px;-webkit-column-count:2;-webkit-column-gap:30px;-webkit-margin-bottom-collapse:separate}@media only screen and (max-width:767px){.three-columns,.two-columns{column-count:1!important;column-gap:0!important;-moz-column-count:1!important;-moz-column-gap:0!important;-webkit-column-count:1!important;-webkit-column-gap:0!important}}.three-columns .no-break,.two-columns .no-break{column-break-inside:avoid;-webkit-column-break-inside:avoid;display:inline-block;max-width:100%}.three-columns li,.two-columns li{column-break-inside:avoid;-webkit-column-break-inside:avoid}.three-columns.three-columns,.two-columns.three-columns{column-count:3;-moz-column-count:3;-webkit-column-count:3}#page-banner{background:url(../../img/banner-bg.png) center;background-size:cover;color:#fff}#page-banner.home-banner .banner-content{padding:70px 10px}#page-banner .banner-content{padding:30px 10px;text-align:center}#page-banner .banner-content h1{font-size:55px;font-weight:300;line-height:65px}@media only screen and (max-width:1199px){#page-banner .banner-content h1{font-size:45px;line-height:55px}}@media only screen and (max-width:979px){#page-banner .banner-content h1{font-size:40px;line-height:45px}}@media only screen and (max-width:767px){#page-banner .banner-content h1{font-size:32px;line-height:35px}}#page-banner .banner-content p{font-size:20px;font-weight:600;line-height:25px}@media only screen and (max-width:979px){#page-banner .banner-content p{font-size:18px}}@media only screen and (max-width:767px){#page-banner .banner-content p{font-size:16px}}#page-banner .banner-content p.leadtext{font-size:30px;line-height:35px;margin-bottom:0}@media only screen and (max-width:979px){#page-banner .banner-content p.leadtext{font-size:22px}}@media only screen and (max-width:767px){#page-banner .banner-content p.leadtext{font-size:18px}}#page-banner .banner-content .learn-more{margin-bottom:0}#page-banner .banner-content .learn-more a{width:210px}#page-banner .banner-content .learn-more a:hover{text-decoration:none}
+#contents{position:relative}
+#contents .main-content,#contents .sidebar{padding-top:50px;padding-bottom:60px}
+#contents .main-content{background:#fff}
+#contents .main-content .content-wrap{width:70%;margin-left:10%;margin-right:10%}@media only screen and (max-width:1199px){#contents .main-content .content-wrap{margin-left:auto;margin-right:auto;width:auto}}
+#contents:before{background:#f8f8f8;position:absolute;z-index:0;display:block;content:"";width:50%;height:auto;right:0;top:0;bottom:0}#masthead{background:#01798a;padding-top:50px;padding-bottom:50px}@media only screen and (max-width:979px){#masthead{padding-top:30px;padding-bottom:30px}}@media only screen and (max-width:767px){#masthead{padding-top:15px;padding-bottom:15px}}@media only screen and (max-width:979px){#masthead .top-header{text-align:center;position:relative}}#masthead .site-logo{margin:0;float:left}@media only screen and (max-width:979px){#masthead .site-logo{float:none;display:block;width:121px;height:50px;margin:0 auto}}#masthead .site-logo a{display:block;text-decoration:none}#masthead .main-navigation{float:right;margin-top:13px}@media only screen and (max-width:979px){#masthead .main-navigation{float:none}}@media only screen and (max-width:767px){#masthead .main-navigation{display:none;background:#01798a;position:absolute;z-index:99;top:60px;left:0;width:100%;margin-top:0;padding:15px 30px;text-align:left}}@media only screen and (min-width:768px){#masthead .main-navigation{display:block!important}}@media only screen and (max-width:479px){#masthead .main-navigation{padding-left:15px;padding-right:15px}}#masthead .main-navigation>ul{padding:0;margin:0;list-style:none;display:block}#masthead .main-navigation>ul>li{float:left}#masthead .main-navigation>ul>li+li{margin-left:20px}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li+li{margin-left:0}}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li{display:inline-block;float:none;margin-top:8px}}@media only screen and (max-width:767px){#masthead .main-navigation>ul>li{display:block;margin-top:0}#masthead .main-navigation>ul>li+li{margin-top:12px}}#masthead .main-navigation>ul>li>a{font-weight:400;color:#fff;font-size:18px;text-transform:uppercase}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li>a{margin:0 7px}}#masthead .main-navigation>ul>li.active>a{font-weight:800}.toggle-menu{display:none;border:none;background:0 0;padding:10px;position:absolute;z-index:3;left:30px;top:5px}.toggle-menu:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -46px;width:24px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle}.toggle-menu:focus{outline:0}@media only screen and (max-width:767px){.toggle-menu{display:block}}@media only screen and (max-width:479px){.toggle-menu{left:15px}}#subhead .footer-top{background:#01798a;color:#fff;padding:50px 0 45px}@media only screen and (max-width:1199px){#subhead .footer-top .row>div{padding-left:25px;padding-right:25px}#subhead .footer-top .row>div+div>div{margin-top:20px;padding-top:20px;border-top:1px solid #fff}}#subhead .footer-top .footer-links h3{font-weight:600;font-size:22px;line-height:24px;margin:0 0 25px}#subhead .footer-top .footer-links ul{margin:0;padding:0;list-style:none}#subhead .footer-top .footer-links ul li{margin:0 0 10px}#subhead .footer-top .footer-links ul li a{color:#fff;font-size:18px}#subhead .footer-bot{background:#449caf;padding:30px 0 50px}@media only screen and (max-width:979px){#subhead .footer-bot{text-align:center}}#subhead .footer-bot .footer-logo{float:left;display:block;text-decoration:none}@media only screen and (max-width:979px){#subhead .footer-bot .footer-logo{float:none;display:inline-block}}#subhead .footer-bot p{color:#fff;font-size:13px;font-weight:600;margin:30px 0 0}@media only screen and (max-width:979px){#subhead .footer-bot p{text-align:center}#subhead .footer-bot p.powered-text{margin-top:0}}.sidebar{background:#f8f8f8}.sidebar .sidebar-wrap{max-width:360px;margin:0 auto}.sidebar .widget{margin-bottom:40px}.widget .widget-title{font-size:18px;line-height:23px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ccc}.widget-download .readmore{margin-top:10px}.widget-links ul.links{padding:0;margin:0;list-style:none;display:block}.widget-links ul.links li{margin-bottom:3px;display:block}.widget-links ul.links li a{color:#888;font-weight:600;font-size:18px;display:inline-block}@media only screen and (max-width:979px){.widget-links ul.links li a{font-size:16px}}.widget-links ul.links.docs li a:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -24px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-right:10px}.widget-text p{font-size:18px;font-weight:400;line-height:1.3}@media only screen and (max-width:979px){.widget-text p{font-size:16px}}
+.widget-text p.file-link{margin-bottom:10px}
+.widget-text p.file-link a{color:#888;font-weight:600}
+.widget-text p.file-link a:before{
+ background-image:url(../../img/ico-sprite.png);
+ background-repeat:no-repeat;background-position:-19px -24px;
+ width:18px;height:18px;content:"";
+ display:inline-block;text-indent:-999em;
+ vertical-align:middle;margin-right:10px}
+.widget-text p.readmore{font-weight:700;font-size:12px;line-height:1.2}
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/css/core/ie8.css b/examples/docker/wip/www/assets/css/core/ie8.css
new file mode 100644
index 000000000..30774b1dd
--- /dev/null
+++ b/examples/docker/wip/www/assets/css/core/ie8.css
@@ -0,0 +1,56 @@
+input[type="checkbox"] + label.checked:before {
+ background-position: -162px -68px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ max-width: none;
+ padding-left: 25px !important;
+ width: 100%;
+ width: auto;
+}
+
+.form-control,
+input[type="email"],
+input[type="number"],
+input[type="password"],
+input[type="tel"],
+input[type="url"],
+input[type="text"],
+textarea {
+ padding-top: 13px;
+}
+
+select.form-control {
+ padding-top: 12px;
+ padding-bottom: 11px;
+ height: auto;
+}
+
+.announcement-ticker-wrapper .announcement-ticker .announcement {
+ min-height: 0;
+}
+
+.search-form .search-query {
+ padding-top: 10px;
+}
+
+.supplier-list li.third-child,
+.featured-articles .article.third-child {
+ clear: left !important;
+}
+
+.royalSlider .rsNav .rsNavItem {
+ min-height: 83px;
+}
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/css/json.css b/examples/docker/wip/www/assets/css/json.css
new file mode 100644
index 000000000..62a450ab7
--- /dev/null
+++ b/examples/docker/wip/www/assets/css/json.css
@@ -0,0 +1,48 @@
+
+ pre.json-display {
+ background-color: #2e3b4e;
+ color: #fff;
+ padding: 20px;
+ border-radius: 8px;
+ overflow-x: auto;
+ overflow-y: auto;
+ line-height: 1.5;
+ white-space: pre-wrap; /* Allows the JSON to wrap within the container */
+ width: 600px; /* Fixed width */
+ height: 400px; /* Fixed height */
+ position: relative;
+ }
+
+ .key {
+ color: #d19a66; /* Orange color for keys */
+ }
+
+ .string {
+ color: #98c379; /* Green color for strings */
+ }
+
+ .number {
+ color: #e5c07b; /* Yellow color for numbers */
+ }
+
+ .boolean {
+ color: #56b6c2; /* Blue color for booleans */
+ }
+
+ .null {
+ color: #c678dd; /* Purple color for null */
+ }
+
+ .copy-button {
+ background-color: #5999b2;
+ color: #fff;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ margin-top: 10px;
+ }
+
+ .copy-button:hover {
+ background-color: #417a8a;
+ }
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/css/lib/bootstrap.min.css b/examples/docker/wip/www/assets/css/lib/bootstrap.min.css
new file mode 100644
index 000000000..09b7c3219
--- /dev/null
+++ b/examples/docker/wip/www/assets/css/lib/bootstrap.min.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=47ae24b4df7d7a66efad)
+ * Config saved to config.json and https://gist.github.com/47ae24b4df7d7a66efad
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:980px){.container{width:970px}}@media (min-width:1200px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:980px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:980px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:979px){.hidden-sm{display:none !important}}@media (min-width:980px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/img/banner-bg.png b/examples/docker/wip/www/assets/img/banner-bg.png
new file mode 100644
index 000000000..437e23cf3
Binary files /dev/null and b/examples/docker/wip/www/assets/img/banner-bg.png differ
diff --git a/examples/docker/wip/www/assets/img/ico-sprite.png b/examples/docker/wip/www/assets/img/ico-sprite.png
new file mode 100644
index 000000000..480a237ab
Binary files /dev/null and b/examples/docker/wip/www/assets/img/ico-sprite.png differ
diff --git a/examples/docker/wip/www/assets/img/img-config.png b/examples/docker/wip/www/assets/img/img-config.png
new file mode 100644
index 000000000..904f7b273
Binary files /dev/null and b/examples/docker/wip/www/assets/img/img-config.png differ
diff --git a/examples/docker/wip/www/assets/img/img-ext.png b/examples/docker/wip/www/assets/img/img-ext.png
new file mode 100644
index 000000000..ddd842a82
Binary files /dev/null and b/examples/docker/wip/www/assets/img/img-ext.png differ
diff --git a/examples/docker/wip/www/assets/img/img-link.png b/examples/docker/wip/www/assets/img/img-link.png
new file mode 100644
index 000000000..8d60efd82
Binary files /dev/null and b/examples/docker/wip/www/assets/img/img-link.png differ
diff --git a/examples/docker/wip/www/assets/img/lucee-white.png b/examples/docker/wip/www/assets/img/lucee-white.png
new file mode 100644
index 000000000..8b6756836
Binary files /dev/null and b/examples/docker/wip/www/assets/img/lucee-white.png differ
diff --git a/examples/docker/wip/www/assets/js/core/_38444bee.core.min.js b/examples/docker/wip/www/assets/js/core/_38444bee.core.min.js
new file mode 100644
index 000000000..6a58c32b7
--- /dev/null
+++ b/examples/docker/wip/www/assets/js/core/_38444bee.core.min.js
@@ -0,0 +1,2 @@
+!function(a){var b=(a("html").hasClass("lt-ie9"),function(){var b=function(){a(".toggle-menu").on("click",function(){a(".main-navigation").stop().slideToggle()})};return{init:function(){b()}}}());a(document).ready(function(){b.init()})}(jQuery);
+//# sourceMappingURL=_core.min.map
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/js/core/_core.min.map b/examples/docker/wip/www/assets/js/core/_core.min.map
new file mode 100644
index 000000000..bc5ba4dc5
--- /dev/null
+++ b/examples/docker/wip/www/assets/js/core/_core.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"_core.min.js","sources":["main.js"],"names":["$","LuceeJS","hasClass","mobileMenuHandler","on","stop","slideToggle","init","document","ready","jQuery"],"mappings":"CAAA,SAAUA,GAEN,GAEIC,IAFOD,EAAE,QAAQE,SAAS,UAEhB,WAEV,GAAIC,GAAoB,WACpBH,EAAE,gBACGI,GAAG,QAAS,WAETJ,EAAE,oBAAoBK,OAAOC,gBAQzC,QAGIC,KAAM,WAEFJ,SAYZH,GAAEQ,UAAUC,MAAM,WAEdR,EAAQM,UAIbG"}
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/js/lib/SmoothScroll.js b/examples/docker/wip/www/assets/js/lib/SmoothScroll.js
new file mode 100644
index 000000000..e58b3d059
--- /dev/null
+++ b/examples/docker/wip/www/assets/js/lib/SmoothScroll.js
@@ -0,0 +1,542 @@
+// SmoothScroll for websites v1.2.1
+// Licensed under the terms of the MIT license.
+
+// People involved
+// - Balazs Galambosi (maintainer)
+// - Michael Herf (Pulse Algorithm)
+
+(function(){
+
+// Scroll Variables (tweakable)
+var defaultOptions = {
+
+ // Scrolling Core
+ frameRate : 60, // [Hz]
+ animationTime : 800, // [px] // custom
+ stepSize : 200, // [px] // custom
+
+ // Pulse (less tweakable)
+ // ratio of "tail" to "acceleration"
+ pulseAlgorithm : true,
+ pulseScale : 8,
+ pulseNormalize : 1,
+
+ // Acceleration
+ accelerationDelta : 20, // 20
+ accelerationMax : 1, // 1
+
+ // Keyboard Settings
+ keyboardSupport : true, // option
+ arrowScroll : 50, // [px]
+
+ // Other
+ touchpadSupport : true,
+ fixedBackground : true,
+ excluded : ""
+};
+
+var options = defaultOptions;
+
+
+// Other Variables
+var isExcluded = false;
+var isFrame = false;
+var direction = { x: 0, y: 0 };
+var initDone = false;
+var root = document.documentElement;
+var activeElement;
+var observer;
+var deltaBuffer = [ 120, 120, 120 ];
+
+var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32,
+ pageup: 33, pagedown: 34, end: 35, home: 36 };
+
+
+/***********************************************
+ * SETTINGS
+ ***********************************************/
+
+var options = defaultOptions;
+
+
+/***********************************************
+ * INITIALIZE
+ ***********************************************/
+
+/**
+ * Tests if smooth scrolling is allowed. Shuts down everything if not.
+ */
+function initTest() {
+
+ var disableKeyboard = false;
+
+ // disable keyboard support if anything above requested it
+ if (disableKeyboard) {
+ removeEvent("keydown", keydown);
+ }
+
+ if (options.keyboardSupport && !disableKeyboard) {
+ addEvent("keydown", keydown);
+ }
+}
+
+/**
+ * Sets up scrolls array, determines if frames are involved.
+ */
+function init() {
+
+ if (!document.body) return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var windowHeight = window.innerHeight;
+ var scrollHeight = body.scrollHeight;
+
+ // check compat mode for root element
+ root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
+ activeElement = body;
+
+ initTest();
+ initDone = true;
+
+ // Checks if this script is running in a frame
+ if (top != self) {
+ isFrame = true;
+ }
+
+ /**
+ * This fixes a bug where the areas left and right to
+ * the content does not trigger the onmousewheel event
+ * on some pages. e.g.: html, body { height: 100% }
+ */
+ else if (scrollHeight > windowHeight &&
+ (body.offsetHeight <= windowHeight ||
+ html.offsetHeight <= windowHeight)) {
+
+ // DOMChange (throttle): fix height
+ var pending = false;
+ var refresh = function () {
+ if (!pending && html.scrollHeight != document.height) {
+ pending = true; // add a new pending action
+ setTimeout(function () {
+ html.style.height = document.height + 'px';
+ pending = false;
+ }, 500); // act rarely to stay fast
+ }
+ };
+ html.style.height = 'auto';
+ setTimeout(refresh, 10);
+
+ // clearfix
+ if (root.offsetHeight <= windowHeight) {
+ var underlay = document.createElement("div");
+ underlay.style.clear = "both";
+ body.appendChild(underlay);
+ }
+ }
+
+ // disable fixed background
+ if (!options.fixedBackground && !isExcluded) {
+ body.style.backgroundAttachment = "scroll";
+ html.style.backgroundAttachment = "scroll";
+ }
+}
+
+
+/************************************************
+ * SCROLLING
+ ************************************************/
+
+var que = [];
+var pending = false;
+var lastScroll = +new Date;
+
+/**
+ * Pushes scroll actions to the scrolling queue.
+ */
+function scrollArray(elem, left, top, delay) {
+
+ delay || (delay = 1000);
+ directionCheck(left, top);
+
+ if (options.accelerationMax != 1) {
+ var now = +new Date;
+ var elapsed = now - lastScroll;
+ if (elapsed < options.accelerationDelta) {
+ var factor = (1 + (30 / elapsed)) / 2;
+ if (factor > 1) {
+ factor = Math.min(factor, options.accelerationMax);
+ left *= factor;
+ top *= factor;
+ }
+ }
+ lastScroll = +new Date;
+ }
+
+ // push a scroll command
+ que.push({
+ x: left,
+ y: top,
+ lastX: (left < 0) ? 0.99 : -0.99,
+ lastY: (top < 0) ? 0.99 : -0.99,
+ start: +new Date
+ });
+
+ // don't act if there's a pending queue
+ if (pending) {
+ return;
+ }
+
+ var scrollWindow = (elem === document.body);
+
+ var step = function (time) {
+
+ var now = +new Date;
+ var scrollX = 0;
+ var scrollY = 0;
+
+ for (var i = 0; i < que.length; i++) {
+
+ var item = que[i];
+ var elapsed = now - item.start;
+ var finished = (elapsed >= options.animationTime);
+
+ // scroll position: [0, 1]
+ var position = (finished) ? 1 : elapsed / options.animationTime;
+
+ // easing [optional]
+ if (options.pulseAlgorithm) {
+ position = pulse(position);
+ }
+
+ // only need the difference
+ var x = (item.x * position - item.lastX) >> 0;
+ var y = (item.y * position - item.lastY) >> 0;
+
+ // add this to the total scrolling
+ scrollX += x;
+ scrollY += y;
+
+ // update last values
+ item.lastX += x;
+ item.lastY += y;
+
+ // delete and step back if it's over
+ if (finished) {
+ que.splice(i, 1); i--;
+ }
+ }
+
+ // scroll left and top
+ if (scrollWindow) {
+ window.scrollBy(scrollX, scrollY);
+ }
+ else {
+ if (scrollX) elem.scrollLeft += scrollX;
+ if (scrollY) elem.scrollTop += scrollY;
+ }
+
+ // clean up if there's nothing left to do
+ if (!left && !top) {
+ que = [];
+ }
+
+ if (que.length) {
+ requestFrame(step, elem, (delay / options.frameRate + 1));
+ } else {
+ pending = false;
+ }
+ };
+
+ // start a new queue of actions
+ requestFrame(step, elem, 0);
+ pending = true;
+}
+
+
+/***********************************************
+ * EVENTS
+ ***********************************************/
+
+/**
+ * Mouse wheel handler.
+ * @param {Object} event
+ */
+function wheel(event) {
+
+ if (!initDone) {
+ init();
+ }
+
+ var target = event.target;
+ var overflowing = overflowingAncestor(target);
+
+ // use default if there's no overflowing
+ // element or default action is prevented
+ if (!overflowing || event.defaultPrevented ||
+ isNodeName(activeElement, "embed") ||
+ (isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
+ return true;
+ }
+
+ var deltaX = event.wheelDeltaX || 0;
+ var deltaY = event.wheelDeltaY || 0;
+
+ // use wheelDelta if deltaX/Y is not available
+ if (!deltaX && !deltaY) {
+ deltaY = event.wheelDelta || 0;
+ }
+
+ // check if it's a touchpad scroll that should be ignored
+ if (!options.touchpadSupport && isTouchpad(deltaY)) {
+ return true;
+ }
+
+ // scale by step size
+ // delta is 120 most of the time
+ // synaptics seems to send 1 sometimes
+ if (Math.abs(deltaX) > 1.2) {
+ deltaX *= options.stepSize / 120;
+ }
+ if (Math.abs(deltaY) > 1.2) {
+ deltaY *= options.stepSize / 120;
+ }
+
+ scrollArray(overflowing, -deltaX, -deltaY);
+ event.preventDefault();
+}
+
+/**
+ * Keydown event handler.
+ * @param {Object} event
+ */
+function keydown(event) {
+
+ var target = event.target;
+ var modifier = event.ctrlKey || event.altKey || event.metaKey ||
+ (event.shiftKey && event.keyCode !== key.spacebar);
+
+ // do nothing if user is editing text
+ // or using a modifier key (except shift)
+ // or in a dropdown
+ if ( /input|textarea|select|embed/i.test(target.nodeName) ||
+ target.isContentEditable ||
+ event.defaultPrevented ||
+ modifier ) {
+ return true;
+ }
+ // spacebar should trigger button press
+ if (isNodeName(target, "button") &&
+ event.keyCode === key.spacebar) {
+ return true;
+ }
+
+ var shift, x = 0, y = 0;
+ var elem = overflowingAncestor(activeElement);
+ var clientHeight = elem.clientHeight;
+
+ if (elem == document.body) {
+ clientHeight = window.innerHeight;
+ }
+
+ switch (event.keyCode) {
+ case key.up:
+ y = -options.arrowScroll;
+ break;
+ case key.down:
+ y = options.arrowScroll;
+ break;
+ case key.spacebar: // (+ shift)
+ shift = event.shiftKey ? 1 : -1;
+ y = -shift * clientHeight * 0.9;
+ break;
+ case key.pageup:
+ y = -clientHeight * 0.9;
+ break;
+ case key.pagedown:
+ y = clientHeight * 0.9;
+ break;
+ case key.home:
+ y = -elem.scrollTop;
+ break;
+ case key.end:
+ var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
+ y = (damt > 0) ? damt+10 : 0;
+ break;
+ case key.left:
+ x = -options.arrowScroll;
+ break;
+ case key.right:
+ x = options.arrowScroll;
+ break;
+ default:
+ return true; // a key we don't care about
+ }
+
+ scrollArray(elem, x, y);
+ event.preventDefault();
+}
+
+/**
+ * Mousedown event only for updating activeElement
+ */
+function mousedown(event) {
+ activeElement = event.target;
+}
+
+
+/***********************************************
+ * OVERFLOW
+ ***********************************************/
+
+var cache = {}; // cleared out every once in while
+setInterval(function () { cache = {}; }, 10 * 1000);
+
+var uniqueID = (function () {
+ var i = 0;
+ return function (el) {
+ return el.uniqueID || (el.uniqueID = i++);
+ };
+})();
+
+function setCache(elems, overflowing) {
+ for (var i = elems.length; i--;)
+ cache[uniqueID(elems[i])] = overflowing;
+ return overflowing;
+}
+
+function overflowingAncestor(el) {
+ var elems = [];
+ var rootScrollHeight = root.scrollHeight;
+ do {
+ var cached = cache[uniqueID(el)];
+ if (cached) {
+ return setCache(elems, cached);
+ }
+ elems.push(el);
+ if (rootScrollHeight === el.scrollHeight) {
+ if (!isFrame || root.clientHeight + 10 < rootScrollHeight) {
+ return setCache(elems, document.body); // scrolling root in WebKit
+ }
+ } else if (el.clientHeight + 10 < el.scrollHeight) {
+ overflow = getComputedStyle(el, "").getPropertyValue("overflow-y");
+ if (overflow === "scroll" || overflow === "auto") {
+ return setCache(elems, el);
+ }
+ }
+ } while (el = el.parentNode);
+}
+
+
+/***********************************************
+ * HELPERS
+ ***********************************************/
+
+function addEvent(type, fn, bubble) {
+ window.addEventListener(type, fn, (bubble||false));
+}
+
+function removeEvent(type, fn, bubble) {
+ window.removeEventListener(type, fn, (bubble||false));
+}
+
+function isNodeName(el, tag) {
+ return (el.nodeName||"").toLowerCase() === tag.toLowerCase();
+}
+
+function directionCheck(x, y) {
+ x = (x > 0) ? 1 : -1;
+ y = (y > 0) ? 1 : -1;
+ if (direction.x !== x || direction.y !== y) {
+ direction.x = x;
+ direction.y = y;
+ que = [];
+ lastScroll = 0;
+ }
+}
+
+var deltaBufferTimer;
+
+function isTouchpad(deltaY) {
+ if (!deltaY) return;
+ deltaY = Math.abs(deltaY)
+ deltaBuffer.push(deltaY);
+ deltaBuffer.shift();
+ clearTimeout(deltaBufferTimer);
+ var allDivisable = (isDivisible(deltaBuffer[0], 120) &&
+ isDivisible(deltaBuffer[1], 120) &&
+ isDivisible(deltaBuffer[2], 120));
+ return !allDivisable;
+}
+
+function isDivisible(n, divisor) {
+ return (Math.floor(n / divisor) == n / divisor);
+}
+
+var requestFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function (callback, element, delay) {
+ window.setTimeout(callback, delay || (1000/60));
+ };
+})();
+
+
+/***********************************************
+ * PULSE
+ ***********************************************/
+
+/**
+ * Viscous fluid with a pulse for part and decay for the rest.
+ * - Applies a fixed force over an interval (a damped acceleration), and
+ * - Lets the exponential bleed away the velocity over a longer interval
+ * - Michael Herf, http://stereopsis.com/stopping/
+ */
+function pulse_(x) {
+ var val, start, expx;
+ // test
+ x = x * options.pulseScale;
+ if (x < 1) { // acceleartion
+ val = x - (1 - Math.exp(-x));
+ } else { // tail
+ // the previous animation ended here:
+ start = Math.exp(-1);
+ // simple viscous drag
+ x -= 1;
+ expx = 1 - Math.exp(-x);
+ val = start + (expx * (1 - start));
+ }
+ return val * options.pulseNormalize;
+}
+
+function pulse(x) {
+ if (x >= 1) return 1;
+ if (x <= 0) return 0;
+
+ if (options.pulseNormalize == 1) {
+ options.pulseNormalize /= pulse_(1);
+ }
+ return pulse_(x);
+}
+
+var isChrome = /chrome/i.test(window.navigator.userAgent);
+var isSafari = /safari/i.test(window.navigator.userAgent);
+var wheelEvent = null;
+if ("onwheel" in document.createElement("div"))
+ wheelEvent = "wheel";
+else if ("onmousewheel" in document.createElement("div"))
+ wheelEvent = "mousewheel";
+
+if (wheelEvent && isChrome) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+if (wheelEvent && isSafari) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+})();
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/js/lib/bootstrap.min.js b/examples/docker/wip/www/assets/js/lib/bootstrap.min.js
new file mode 100644
index 000000000..140718def
--- /dev/null
+++ b/examples/docker/wip/www/assets/js/lib/bootstrap.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c33a6af5a36352853818)
+ * Config saved to config.json and https://gist.github.com/c33a6af5a36352853818
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e,s){return this.each(function(){var i=t(this),n=i.data("bs.modal"),a=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);n||i.data("bs.modal",n=new o(this,a)),"string"==typeof e?n[e](s):a.show&&n.show(s)})}var o=function(e,o){this.options=o,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};o.VERSION="3.2.0",o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},o.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},o.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var i=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):o.$element.trigger("focus").trigger(i)}))},o.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden.bs.modal")})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=t.support.transition&&s;if(this.$backdrop=t('').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;i?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},o.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},o.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},o.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},o.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var s=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=o,t.fn.modal.noConflict=function(){return t.fn.modal=s,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(o){var s=t(this),i=s.attr("href"),n=t(s.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),a=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},n.data(),s.data());s.is("a")&&o.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){s.is(":visible")&&s.trigger("focus")})}),e.call(n,a,this)})}(jQuery);
\ No newline at end of file
diff --git a/examples/docker/wip/www/assets/js/lib/jquery-1.10.1.min.js b/examples/docker/wip/www/assets/js/lib/jquery-1.10.1.min.js
new file mode 100644
index 000000000..e407e7699
--- /dev/null
+++ b/examples/docker/wip/www/assets/js/lib/jquery-1.10.1.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.1.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
diff --git a/examples/docker/wip/www/debug.cfm b/examples/docker/wip/www/debug.cfm
new file mode 100644
index 000000000..b75e61419
--- /dev/null
+++ b/examples/docker/wip/www/debug.cfm
@@ -0,0 +1,34 @@
+
+
+
+
+
+
Hello Cruel World!
+
+
+ Lucee #server.lucee.version# released #dateformat(server.lucee["release-date"], "dd mmm yyyy")#
+ #server.servlet.name# (java #server.java.version#) running on #server.os.name# (#server.os.version#)
+ Hosted at #headers.host#
+
+
+
+
Server Internals
+
+
As at #now()#
+
+
Environment Variables
+
+
+
Cookie Variables
+
+
+
Server Variables
+
+
+
CGI Variables
+
+
+
HTTP Request Variables
+
+
+
\ No newline at end of file
diff --git a/examples/docker/wip/www/favicon.ico b/examples/docker/wip/www/favicon.ico
new file mode 100644
index 000000000..9f974f0c2
Binary files /dev/null and b/examples/docker/wip/www/favicon.ico differ
diff --git a/examples/docker/wip/www/index.cfm b/examples/docker/wip/www/index.cfm
new file mode 100644
index 000000000..f64edc17c
--- /dev/null
+++ b/examples/docker/wip/www/index.cfm
@@ -0,0 +1,390 @@
+
+
+
+ extURL="https://download.lucee.org/";
+ configURL="/lucee/admin.cfm";
+ wikiURL="https://docs.lucee.org/index.html";
+ gitURL="https://github.com/lucee/Lucee";
+ adminURL="#CGI.CONTEXT_PATH#/lucee/admin.cfm";
+ webAdminURL="#CGI.CONTEXT_PATH#/lucee/admin/web.cfm";
+ serverAdminURL="#CGI.CONTEXT_PATH#/lucee/admin/server.cfm";
+ docURL="#CGI.CONTEXT_PATH#/lucee/doc.cfm";
+ mailinglistURL="https://dev.lucee.org/";
+ profURL="https://lucee.org/get-support/consulting.html";
+ issueURL="https://luceeserver.atlassian.net/projects/LDEV/issues";
+ newURL="http://docs.lucee.org/guides/lucee-5.html";
+
+ extensionList="https://extension.lucee.org/rest/extension/provider/info?withLogo=false";
+
+ function getAvailableExtensions() {
+ http url=extensionList cachedWithin=0.01 result="local.res";
+ var extensions=deserializeJson(res.filecontent,false).extensions;
+ return extensions;
+ }
+
+ function getInstalledExtensions() {
+ var qry=extensionlist();
+ querySort(qry, "name");
+ var data=[:];
+ loop query=qry {
+ data[qry.id]={version:qry.version,name:qry.name};
+ }
+ return data;
+ }
+
+
+ function getConfig() {
+ var pc=getPageContext();
+ var cf=pc.getConfig();
+ var result={};
+ result.single=listFirst(server.lucee.version,".")>5 && cf.getMode()== 1;
+ result.server=cf.getConfigFile()&"";
+
+ if(!result.single) {
+
+ var dir = cf.getServerConfigDir();
+ var srv = dir&"/.CFConfig.json";
+ if(!fileExists(srv)) srv=dir&"/config.json";
+ result.web=result.server;
+ result.server=srv;
+ }
+ return result;
+ }
+config=getConfig();
+
+
+
+
+ Lucee Docker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Welcome to your Lucee Docker Installation!
+
You are now successfully running Lucee #server.lucee.version# in Docker!
+
+
+
+
+
+
+
+
+
+
+
+
+
Customize Your Own Docker Build
+
+ Personalize your Docker build by selecting the extensions you need.
+ Lucee will generate a zip file containing all the necessary components for you to create a custom Docker build.
+ Follow the steps to choose your desired extensions and configurations,
+ ensuring your Docker build is tailored to your specific requirements.
+
Choose the extensions you would like to include in your Lucee Docker Build.
+ Don't forget to select the desired version for each extension.
+
+
Lucee comes with several built-in extensions. You can unselect any that you do not need,
+ but please be careful not to remove extensions unless you are sure they are unnecessary,
+ as some extensions may be essential for certain functionalities.
+ To customize your Lucee setup, visit the Lucee Administrator. Here, you can change the configuration settings to match your specific requirements. Make sure to review all the settings carefully to ensure they meet your needs.
+
+
+ Below is a preview of your current configuration.
+ You can modify these settings directly in the Lucee Administrator.
+
+ Get involved in the Lucee Project!
+ - Engage with other Lucee community members via our forums/mailing list
+ - Submitting bugs and feature requests
+ - Contribute to the code
+ - Support the project
+
Whether you need installation support or are looking for other professional services. Access our directory of providers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/docker/wip/www/testx.cfm b/examples/docker/wip/www/testx.cfm
new file mode 100644
index 000000000..861cc3300
--- /dev/null
+++ b/examples/docker/wip/www/testx.cfm
@@ -0,0 +1,14 @@
+
+extensionList="https://extension.lucee.org/rest/extension/provider/info?withLogo=false";
+
+function getAvailableExtensions() {
+ http url=extensionList cachedWithin=0.01 result="local.res";
+ var extensions=deserializeJson(res.filecontent,false).extensions;
+ return extensions;
+}
+
+extensions=getAvailableExtensions();
+
+
+
+
diff --git a/examples/docker/with-config/Dockerfile b/examples/docker/with-config/Dockerfile
new file mode 100644
index 000000000..3f37b6258
--- /dev/null
+++ b/examples/docker/with-config/Dockerfile
@@ -0,0 +1,14 @@
+FROM lucee/lucee:6.1.0.175-BETA
+
+# Provide test page by creating the directory and copying files
+RUN mkdir -p /var/www
+COPY www/ /var/www/
+
+# copy a custom lucee config in place
+COPY lucee-config.json /opt/lucee/server/lucee-server/context/.CFConfig.json
+
+# how to build it
+# docker build -t lucee-with-config .
+
+# how to run it (provides port for nginx and tomcat (optional); Lucee admin password)
+# docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-config
\ No newline at end of file
diff --git a/examples/docker/with-config/docker-compose.yml b/examples/docker/with-config/docker-compose.yml
new file mode 100644
index 000000000..a9c9620ce
--- /dev/null
+++ b/examples/docker/with-config/docker-compose.yml
@@ -0,0 +1,13 @@
+services:
+ lucee:
+ image: lucee-with-config:latest
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ ports:
+ - "8854:8888" # tomcat
+ - "8054:80" # nginx
+
+# how to run it
+# docker-compose up -d
diff --git a/examples/docker/with-config/lucee-config.json b/examples/docker/with-config/lucee-config.json
new file mode 100644
index 000000000..83cf9aad0
--- /dev/null
+++ b/examples/docker/with-config/lucee-config.json
@@ -0,0 +1,271 @@
+{
+ "inspectTemplate": "never",
+ "applicationTimeout": "1,0,0,0",
+ "cacheDirectory": "{lucee-config}/cache/",
+ "cacheDirectoryMaxSize": "100mb",
+ "cascadeToResultset": true,
+ "clientCookies": true,
+ "clientDirectory": "{lucee-config}/client-scope/",
+ "clientDirectoryMaxSize": "100mb",
+ "clientManagement": false,
+ "clientTimeout": "0,0,90,0",
+ "componentBase": "/lucee/Component.cfc",
+ "componentDataMemberAccess": "public",
+ "componentDumpTemplate": "/lucee/component-dump.cfm",
+ "debuggingEnabled": false,
+ "debuggingQueryUsage": false,
+ "developMode": false,
+ "domainCookies": false,
+ "listenerMode": "curr2root",
+ "listenerType": "mixed",
+ "mailConnectionTimeout": 30,
+ "mailSpoolEnable": true,
+ "mailSpoolInterval": 5,
+ "mergeUrlForm": false,
+ "mode": "single",
+ "preserveSingleQuote": false,
+ "requestTimeout": "0,0,0,50",
+ "scopeCascading": "standard",
+ "sessionManagement": true,
+ "sessionTimeout": "0,0,30,0",
+ "systemErr": "system",
+ "systemOut": "system",
+ "tempDirectory": "{lucee-config}/temp/",
+ "timeserver": "pool.ntp.org",
+ "updateLocation": "https://update.lucee.org",
+ "updateType": "manual",
+ "version": "5.0",
+ "cacheHandlers": {
+ "timespan": {
+ "class": "lucee.runtime.cache.tag.timespan.TimespanCacheHandler"
+ },
+ "request": {
+ "class": "lucee.runtime.cache.tag.request.RequestCacheHandler"
+ }
+ },
+ "componentMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/components/"
+ }
+ ],
+ "customTagMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/customtags/"
+ }
+ ],
+ "dataSources": {
+ "preserveSingleQuote": "yes"
+ },
+ "debugging": {
+ "logMemoryUsage": "no",
+ "template": "/lucee/templates/debugging/debugging.cfm"
+ },
+ "defaultResourceProvider": [
+ {
+ "class": "lucee.commons.io.res.type.file.FileResourceProvider",
+ "arguments": "lock-timeout:1000;"
+ }
+ ],
+ "dumpWriters": [
+ {
+ "name": "html",
+ "class": "lucee.runtime.dump.HTMLDumpWriter",
+ "default": "browser"
+ },
+ {
+ "name": "text",
+ "class": "lucee.runtime.dump.TextDumpWriter",
+ "default": "console"
+ },
+ {
+ "name": "classic",
+ "class": "lucee.runtime.dump.ClassicHTMLDumpWriter"
+ },
+ {
+ "name": "simple",
+ "class": "lucee.runtime.dump.SimpleHTMLDumpWriter"
+ }
+ ],
+ "fileSystem": {
+ "fldDefaultDirectory": "{lucee-config}/library/fld/",
+ "tldDefaultDirectory": "{lucee-config}/library/tld/",
+ "functionDefaultDirectory": "{lucee-config}/library/function/",
+ "tagDefaultDirectory": "{lucee-config}/library/tag/",
+ "deployDirectory": "{lucee-config}/cfclasses/"
+ },
+ "loggers": {
+ "datasource": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/datasource.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "memory": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/memory.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "requesttimeout": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/requesttimeout.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "deploy": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/deploy.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "thread": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/thread.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "exception": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/exception.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "application": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/application.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "scope": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scope.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "scheduler": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scheduler.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "search": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/search.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mail": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mail.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "orm": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/orm.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "remoteclient": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/remoteclient.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "gateway": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/gateway.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "rest": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/rest.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mapping": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mapping.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "execute": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/execute.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "http": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/http.log",
+ "level": "error",
+ "layout": "classic"
+ }
+ },
+ "mappings": {
+ "/lucee/": {
+ "readonly": "yes",
+ "physical": "{lucee-config}/context/",
+ "archive": "{lucee-config}/context/lucee-context.lar",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ },
+ "/lucee-server/": {
+ "readonly": "yes",
+ "physical": "{lucee-server}/context/",
+ "archive": "",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ }
+ },
+ "orm": {
+ "engineClass": "lucee.runtime.orm.DummyORMEngine"
+ },
+ "remoteClients": {
+ "directory": "{lucee-config}remote-client/"
+ },
+ "resourceProviders": [
+ {
+ "scheme": "ftp",
+ "class": "lucee.commons.io.res.type.ftp.FTPResourceProvider",
+ "arguments": "lock-timeout:20000;socket-timeout:-1;client-timeout:60000"
+ },
+ {
+ "scheme": "zip",
+ "class": "lucee.commons.io.res.type.zip.ZipResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tar",
+ "class": "lucee.commons.io.res.type.tar.TarResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tgz",
+ "class": "lucee.commons.io.res.type.tgz.TGZResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "http",
+ "class": "lucee.commons.io.res.type.http.HTTPResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "https",
+ "class": "lucee.commons.io.res.type.http.HTTPSResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "ram",
+ "class": "lucee.commons.io.res.type.cache.CacheResourceProvider",
+ "arguments": "case-sensitive:true;lock-timeout:1000;"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/docker/with-config/readme.md b/examples/docker/with-config/readme.md
new file mode 100644
index 000000000..4d725d0ad
--- /dev/null
+++ b/examples/docker/with-config/readme.md
@@ -0,0 +1,29 @@
+# Lucee Docker Setup
+
+This example shows how to build a Lucee Docker image with a custom configuration.
+
+## Files
+
+- `Dockerfile`: Defines the Docker image for the Lucee server.
+- `lucee-config.json`: the Lucee configuration, modify it as you like.
+- `docker-compose.yml`: Defines the services and configurations to run the Lucee server build using Docker Compose.
+
+## Dockerfile
+
+The `Dockerfile` uses the `lucee/lucee:6.1.0.175-BETA` image and sets up a Lucee server with some pages. It includes instructions to create the necessary directory structure and copy the website files into the container.
+
+### How to Build
+
+To build the Docker image defined by the `Dockerfile`, navigate to the directory containing the file and execute this command `docker build -t lucee-with-config .`.
+
+### How to Run
+
+To run the Docker container created from the image, use this Docker's run command `docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-config`. The container will expose ports for Nginx and Tomcat, and you can set the Lucee admin password through environment variables. You can also start it with `docker compose` (see below).
+
+## docker-compose.yml
+
+The `docker-compose.yml` file defines a service for running the Lucee server created with `Dockerfile`. It specifies the image to use, environment variables, volume mappings, and port configurations. This is useful to map an external drive you can access and modify.
+
+### How to Run
+
+To run the services defined in the `docker-compose.yml` file, navigate to the directory containing the file and use this Docker Compose's up command `docker-compose up -d`. This will start the services in detached mode, exposing the necessary ports and setting the Lucee admin password as specified.
diff --git a/examples/docker/with-config/www/Application.cfc b/examples/docker/with-config/www/Application.cfc
new file mode 100644
index 000000000..a7d8c5562
--- /dev/null
+++ b/examples/docker/with-config/www/Application.cfc
@@ -0,0 +1,4 @@
+๏ปฟcomponent {
+
+ this.Name = "Lucee";
+}
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/css/core/_ed07b761.core.min.css b/examples/docker/with-config/www/assets/css/core/_ed07b761.core.min.css
new file mode 100644
index 000000000..2ac021e13
--- /dev/null
+++ b/examples/docker/with-config/www/assets/css/core/_ed07b761.core.min.css
@@ -0,0 +1,15 @@
+html{-webkit-text-size-adjust:none}body{font-family:'Open Sans',Arial,sans-serif;font-size:15px;font-weight:400;color:#666;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff}a{color:#5999b2}a:hover{text-decoration:underline;color:#449caf}a:focus{text-decoration:none;outline:0;color:#449caf}code{padding:2px 9px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}p{margin:0 0 25px;line-height:28px;font-weight:300;font-size:22px}@media only screen and (max-width:1199px){p{font-size:18px}}@media only screen and (max-width:979px){p{font-size:16px}}img{max-width:100%}h1,h2,h3,h4,h5,h6{font-family:'Open Sans',Arial,sans-serif;font-weight:600;margin-top:0;margin-bottom:25px}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}strong{font-weight:600}.intro-text{font-size:1.2em;line-height:1.6;margin-bottom:18px}.line-break{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-break.dotted{border-top-style:dotted}.line-bold{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-bold.dotted{border-top-style:dotted}.btn{border:none;padding:12px 20px;color:#fff;background:#4c9bb0;font-family:'Open Sans',Arial,sans-serif;font-weight:600;text-align:center;display:inline-block;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn:hover{color:#fff}.btn.disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50)}.btn:focus{color:#fff}.btn:hover{text-decoration:none}@media only screen and (min-width:1200px){.btn-large{font-size:25px;line-height:35px;font-weight:700}}.btn-wide{width:355px;max-width:100%}.btn-download{background:#539ab1;width:355px;max-width:100%}.btn-download:after{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -2px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-left:10px}.primary{color:#4c9bb0}blockquote{border:none;padding:13px 18px 18px;position:relative;font-size:1.2em}blockquote p{margin-bottom:10px;font-weight:300}blockquote .author{font-size:.722em;font-style:normal;text-transform:uppercase;font-weight:700}.well{font-size:1em;border:none}@media print{*{box-shadow:none!important;text-shadow:none!important;-ms-filter:none!important;filter:none!important}input,select,textarea{page-break-inside:avoid}a,a:visited{text-decoration:underline}.ir a:after,a[href]:after,a[href^="javascript:"]:after,a[href^="#"]:after,abbr[title]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.listing{padding:0;margin:0;list-style:none}.listing.border .listing-item+.listing-item{border-top:1px solid #ccc}.listing.border-light .listing-item+.listing-item{border-top:1px solid #f8f8f8}.listing .listing-item{padding:35px 0}.listing .listing-item:after,.listing .listing-item:before{content:" ";display:table}.listing .listing-item:after{clear:both}.listing .listing-item.thumb-small .listing-thumb{width:85px}.listing .listing-item.thumb-small .listing-content{margin-left:-85px;padding-left:110px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-small .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-thumb{width:120px}.listing .listing-item.thumb-large .listing-content{margin-left:-120px;padding-left:145px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-large .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-content .title{margin-bottom:15px}.listing .listing-item.thumb-large .listing-content p{font-weight:400}.listing .listing-item.thumb-large .listing-content .readmore{margin-top:10px;font-weight:700}.listing .listing-thumb{float:left;position:relative;z-index:3}@media only screen and (max-width:767px){.listing .listing-thumb{float:none;margin-bottom:15px;text-align:center;margin-right:auto;margin-left:auto}}.listing .listing-thumb a{display:block;text-decoration:none}@media only screen and (max-width:767px){.listing .listing-thumb a{display:inline-block}}.listing .listing-thumb img{max-width:100%}.listing .listing-content{position:relative;z-index:1;width:100%}.listing .listing-content .title{font-weight:700;margin:0 0 5px}.listing .listing-content p{margin:0}.listing .link-download{margin-top:30px;margin-bottom:0}.link-list{padding:0;margin:0;list-style:none;font-family:'Open Sans',Arial,sans-serif;font-size:1.333em}.link-list li{margin-bottom:7px}.blue{color:#0c0140}.underline{text-decoration:underline}.round-borders{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.round-borders-lg{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.perfect-round{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.aligned-center{text-align:center}.aligned-right{text-align:right}.aligned-left{text-align:left}.aligned-justify{text-align:justify}.uppercase{text-transform:uppercase}.centered{display:block;margin-left:auto;margin-right:auto}.full-width{width:100%}@media only screen and (max-width:979px){.half-grey-light{background:0 0}}.readmore{text-decoration:none;color:#4c9bb0;text-transform:uppercase;font-size:12px;font-weight:700;line-height:1.2}.readmore a{text-decoration:none;color:#4c9bb0}.readmore a:hover{text-decoration:underline}.readmore.explore{color:#0099d2;text-align:left;padding:2px}.readmore.explore a{color:#0099d2}.readmore.explore a:hover{text-decoration:underline}.three-columns,.two-columns{column-count:2;column-gap:30px;-moz-column-count:2;-moz-column-gap:30px;-webkit-column-count:2;-webkit-column-gap:30px;-webkit-margin-bottom-collapse:separate}@media only screen and (max-width:767px){.three-columns,.two-columns{column-count:1!important;column-gap:0!important;-moz-column-count:1!important;-moz-column-gap:0!important;-webkit-column-count:1!important;-webkit-column-gap:0!important}}.three-columns .no-break,.two-columns .no-break{column-break-inside:avoid;-webkit-column-break-inside:avoid;display:inline-block;max-width:100%}.three-columns li,.two-columns li{column-break-inside:avoid;-webkit-column-break-inside:avoid}.three-columns.three-columns,.two-columns.three-columns{column-count:3;-moz-column-count:3;-webkit-column-count:3}#page-banner{background:url(../../img/banner-bg.png) center;background-size:cover;color:#fff}#page-banner.home-banner .banner-content{padding:70px 10px}#page-banner .banner-content{padding:30px 10px;text-align:center}#page-banner .banner-content h1{font-size:55px;font-weight:300;line-height:65px}@media only screen and (max-width:1199px){#page-banner .banner-content h1{font-size:45px;line-height:55px}}@media only screen and (max-width:979px){#page-banner .banner-content h1{font-size:40px;line-height:45px}}@media only screen and (max-width:767px){#page-banner .banner-content h1{font-size:32px;line-height:35px}}#page-banner .banner-content p{font-size:20px;font-weight:600;line-height:25px}@media only screen and (max-width:979px){#page-banner .banner-content p{font-size:18px}}@media only screen and (max-width:767px){#page-banner .banner-content p{font-size:16px}}#page-banner .banner-content p.leadtext{font-size:30px;line-height:35px;margin-bottom:0}@media only screen and (max-width:979px){#page-banner .banner-content p.leadtext{font-size:22px}}@media only screen and (max-width:767px){#page-banner .banner-content p.leadtext{font-size:18px}}#page-banner .banner-content .learn-more{margin-bottom:0}#page-banner .banner-content .learn-more a{width:210px}#page-banner .banner-content .learn-more a:hover{text-decoration:none}
+#contents{position:relative}
+#contents .main-content,#contents .sidebar{padding-top:50px;padding-bottom:60px}
+#contents .main-content{background:#fff}
+#contents .main-content .content-wrap{width:70%;margin-left:10%;margin-right:10%}@media only screen and (max-width:1199px){#contents .main-content .content-wrap{margin-left:auto;margin-right:auto;width:auto}}
+#contents:before{background:#f8f8f8;position:absolute;z-index:0;display:block;content:"";width:50%;height:auto;right:0;top:0;bottom:0}#masthead{background:#01798a;padding-top:50px;padding-bottom:50px}@media only screen and (max-width:979px){#masthead{padding-top:30px;padding-bottom:30px}}@media only screen and (max-width:767px){#masthead{padding-top:15px;padding-bottom:15px}}@media only screen and (max-width:979px){#masthead .top-header{text-align:center;position:relative}}#masthead .site-logo{margin:0;float:left}@media only screen and (max-width:979px){#masthead .site-logo{float:none;display:block;width:121px;height:50px;margin:0 auto}}#masthead .site-logo a{display:block;text-decoration:none}#masthead .main-navigation{float:right;margin-top:13px}@media only screen and (max-width:979px){#masthead .main-navigation{float:none}}@media only screen and (max-width:767px){#masthead .main-navigation{display:none;background:#01798a;position:absolute;z-index:99;top:60px;left:0;width:100%;margin-top:0;padding:15px 30px;text-align:left}}@media only screen and (min-width:768px){#masthead .main-navigation{display:block!important}}@media only screen and (max-width:479px){#masthead .main-navigation{padding-left:15px;padding-right:15px}}#masthead .main-navigation>ul{padding:0;margin:0;list-style:none;display:block}#masthead .main-navigation>ul>li{float:left}#masthead .main-navigation>ul>li+li{margin-left:20px}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li+li{margin-left:0}}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li{display:inline-block;float:none;margin-top:8px}}@media only screen and (max-width:767px){#masthead .main-navigation>ul>li{display:block;margin-top:0}#masthead .main-navigation>ul>li+li{margin-top:12px}}#masthead .main-navigation>ul>li>a{font-weight:400;color:#fff;font-size:18px;text-transform:uppercase}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li>a{margin:0 7px}}#masthead .main-navigation>ul>li.active>a{font-weight:800}.toggle-menu{display:none;border:none;background:0 0;padding:10px;position:absolute;z-index:3;left:30px;top:5px}.toggle-menu:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -46px;width:24px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle}.toggle-menu:focus{outline:0}@media only screen and (max-width:767px){.toggle-menu{display:block}}@media only screen and (max-width:479px){.toggle-menu{left:15px}}#subhead .footer-top{background:#01798a;color:#fff;padding:50px 0 45px}@media only screen and (max-width:1199px){#subhead .footer-top .row>div{padding-left:25px;padding-right:25px}#subhead .footer-top .row>div+div>div{margin-top:20px;padding-top:20px;border-top:1px solid #fff}}#subhead .footer-top .footer-links h3{font-weight:600;font-size:22px;line-height:24px;margin:0 0 25px}#subhead .footer-top .footer-links ul{margin:0;padding:0;list-style:none}#subhead .footer-top .footer-links ul li{margin:0 0 10px}#subhead .footer-top .footer-links ul li a{color:#fff;font-size:18px}#subhead .footer-bot{background:#449caf;padding:30px 0 50px}@media only screen and (max-width:979px){#subhead .footer-bot{text-align:center}}#subhead .footer-bot .footer-logo{float:left;display:block;text-decoration:none}@media only screen and (max-width:979px){#subhead .footer-bot .footer-logo{float:none;display:inline-block}}#subhead .footer-bot p{color:#fff;font-size:13px;font-weight:600;margin:30px 0 0}@media only screen and (max-width:979px){#subhead .footer-bot p{text-align:center}#subhead .footer-bot p.powered-text{margin-top:0}}.sidebar{background:#f8f8f8}.sidebar .sidebar-wrap{max-width:360px;margin:0 auto}.sidebar .widget{margin-bottom:40px}.widget .widget-title{font-size:18px;line-height:23px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ccc}.widget-download .readmore{margin-top:10px}.widget-links ul.links{padding:0;margin:0;list-style:none;display:block}.widget-links ul.links li{margin-bottom:3px;display:block}.widget-links ul.links li a{color:#888;font-weight:600;font-size:18px;display:inline-block}@media only screen and (max-width:979px){.widget-links ul.links li a{font-size:16px}}.widget-links ul.links.docs li a:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -24px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-right:10px}.widget-text p{font-size:18px;font-weight:400;line-height:1.3}@media only screen and (max-width:979px){.widget-text p{font-size:16px}}
+.widget-text p.file-link{margin-bottom:10px}
+.widget-text p.file-link a{color:#888;font-weight:600}
+.widget-text p.file-link a:before{
+ background-image:url(../../img/ico-sprite.png);
+ background-repeat:no-repeat;background-position:-19px -24px;
+ width:18px;height:18px;content:"";
+ display:inline-block;text-indent:-999em;
+ vertical-align:middle;margin-right:10px}
+.widget-text p.readmore{font-weight:700;font-size:12px;line-height:1.2}
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/css/core/ie8.css b/examples/docker/with-config/www/assets/css/core/ie8.css
new file mode 100644
index 000000000..30774b1dd
--- /dev/null
+++ b/examples/docker/with-config/www/assets/css/core/ie8.css
@@ -0,0 +1,56 @@
+input[type="checkbox"] + label.checked:before {
+ background-position: -162px -68px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ max-width: none;
+ padding-left: 25px !important;
+ width: 100%;
+ width: auto;
+}
+
+.form-control,
+input[type="email"],
+input[type="number"],
+input[type="password"],
+input[type="tel"],
+input[type="url"],
+input[type="text"],
+textarea {
+ padding-top: 13px;
+}
+
+select.form-control {
+ padding-top: 12px;
+ padding-bottom: 11px;
+ height: auto;
+}
+
+.announcement-ticker-wrapper .announcement-ticker .announcement {
+ min-height: 0;
+}
+
+.search-form .search-query {
+ padding-top: 10px;
+}
+
+.supplier-list li.third-child,
+.featured-articles .article.third-child {
+ clear: left !important;
+}
+
+.royalSlider .rsNav .rsNavItem {
+ min-height: 83px;
+}
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/css/json.css b/examples/docker/with-config/www/assets/css/json.css
new file mode 100644
index 000000000..62a450ab7
--- /dev/null
+++ b/examples/docker/with-config/www/assets/css/json.css
@@ -0,0 +1,48 @@
+
+ pre.json-display {
+ background-color: #2e3b4e;
+ color: #fff;
+ padding: 20px;
+ border-radius: 8px;
+ overflow-x: auto;
+ overflow-y: auto;
+ line-height: 1.5;
+ white-space: pre-wrap; /* Allows the JSON to wrap within the container */
+ width: 600px; /* Fixed width */
+ height: 400px; /* Fixed height */
+ position: relative;
+ }
+
+ .key {
+ color: #d19a66; /* Orange color for keys */
+ }
+
+ .string {
+ color: #98c379; /* Green color for strings */
+ }
+
+ .number {
+ color: #e5c07b; /* Yellow color for numbers */
+ }
+
+ .boolean {
+ color: #56b6c2; /* Blue color for booleans */
+ }
+
+ .null {
+ color: #c678dd; /* Purple color for null */
+ }
+
+ .copy-button {
+ background-color: #5999b2;
+ color: #fff;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ margin-top: 10px;
+ }
+
+ .copy-button:hover {
+ background-color: #417a8a;
+ }
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/css/lib/bootstrap.min.css b/examples/docker/with-config/www/assets/css/lib/bootstrap.min.css
new file mode 100644
index 000000000..09b7c3219
--- /dev/null
+++ b/examples/docker/with-config/www/assets/css/lib/bootstrap.min.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=47ae24b4df7d7a66efad)
+ * Config saved to config.json and https://gist.github.com/47ae24b4df7d7a66efad
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:980px){.container{width:970px}}@media (min-width:1200px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:980px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:980px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:979px){.hidden-sm{display:none !important}}@media (min-width:980px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/img/banner-bg.png b/examples/docker/with-config/www/assets/img/banner-bg.png
new file mode 100644
index 000000000..437e23cf3
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/banner-bg.png differ
diff --git a/examples/docker/with-config/www/assets/img/ico-sprite.png b/examples/docker/with-config/www/assets/img/ico-sprite.png
new file mode 100644
index 000000000..480a237ab
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/ico-sprite.png differ
diff --git a/examples/docker/with-config/www/assets/img/img-config.png b/examples/docker/with-config/www/assets/img/img-config.png
new file mode 100644
index 000000000..904f7b273
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/img-config.png differ
diff --git a/examples/docker/with-config/www/assets/img/img-ext.png b/examples/docker/with-config/www/assets/img/img-ext.png
new file mode 100644
index 000000000..ddd842a82
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/img-ext.png differ
diff --git a/examples/docker/with-config/www/assets/img/img-link.png b/examples/docker/with-config/www/assets/img/img-link.png
new file mode 100644
index 000000000..8d60efd82
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/img-link.png differ
diff --git a/examples/docker/with-config/www/assets/img/lucee-white.png b/examples/docker/with-config/www/assets/img/lucee-white.png
new file mode 100644
index 000000000..8b6756836
Binary files /dev/null and b/examples/docker/with-config/www/assets/img/lucee-white.png differ
diff --git a/examples/docker/with-config/www/assets/js/core/_38444bee.core.min.js b/examples/docker/with-config/www/assets/js/core/_38444bee.core.min.js
new file mode 100644
index 000000000..6a58c32b7
--- /dev/null
+++ b/examples/docker/with-config/www/assets/js/core/_38444bee.core.min.js
@@ -0,0 +1,2 @@
+!function(a){var b=(a("html").hasClass("lt-ie9"),function(){var b=function(){a(".toggle-menu").on("click",function(){a(".main-navigation").stop().slideToggle()})};return{init:function(){b()}}}());a(document).ready(function(){b.init()})}(jQuery);
+//# sourceMappingURL=_core.min.map
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/js/core/_core.min.map b/examples/docker/with-config/www/assets/js/core/_core.min.map
new file mode 100644
index 000000000..bc5ba4dc5
--- /dev/null
+++ b/examples/docker/with-config/www/assets/js/core/_core.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"_core.min.js","sources":["main.js"],"names":["$","LuceeJS","hasClass","mobileMenuHandler","on","stop","slideToggle","init","document","ready","jQuery"],"mappings":"CAAA,SAAUA,GAEN,GAEIC,IAFOD,EAAE,QAAQE,SAAS,UAEhB,WAEV,GAAIC,GAAoB,WACpBH,EAAE,gBACGI,GAAG,QAAS,WAETJ,EAAE,oBAAoBK,OAAOC,gBAQzC,QAGIC,KAAM,WAEFJ,SAYZH,GAAEQ,UAAUC,MAAM,WAEdR,EAAQM,UAIbG"}
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/js/lib/SmoothScroll.js b/examples/docker/with-config/www/assets/js/lib/SmoothScroll.js
new file mode 100644
index 000000000..e58b3d059
--- /dev/null
+++ b/examples/docker/with-config/www/assets/js/lib/SmoothScroll.js
@@ -0,0 +1,542 @@
+// SmoothScroll for websites v1.2.1
+// Licensed under the terms of the MIT license.
+
+// People involved
+// - Balazs Galambosi (maintainer)
+// - Michael Herf (Pulse Algorithm)
+
+(function(){
+
+// Scroll Variables (tweakable)
+var defaultOptions = {
+
+ // Scrolling Core
+ frameRate : 60, // [Hz]
+ animationTime : 800, // [px] // custom
+ stepSize : 200, // [px] // custom
+
+ // Pulse (less tweakable)
+ // ratio of "tail" to "acceleration"
+ pulseAlgorithm : true,
+ pulseScale : 8,
+ pulseNormalize : 1,
+
+ // Acceleration
+ accelerationDelta : 20, // 20
+ accelerationMax : 1, // 1
+
+ // Keyboard Settings
+ keyboardSupport : true, // option
+ arrowScroll : 50, // [px]
+
+ // Other
+ touchpadSupport : true,
+ fixedBackground : true,
+ excluded : ""
+};
+
+var options = defaultOptions;
+
+
+// Other Variables
+var isExcluded = false;
+var isFrame = false;
+var direction = { x: 0, y: 0 };
+var initDone = false;
+var root = document.documentElement;
+var activeElement;
+var observer;
+var deltaBuffer = [ 120, 120, 120 ];
+
+var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32,
+ pageup: 33, pagedown: 34, end: 35, home: 36 };
+
+
+/***********************************************
+ * SETTINGS
+ ***********************************************/
+
+var options = defaultOptions;
+
+
+/***********************************************
+ * INITIALIZE
+ ***********************************************/
+
+/**
+ * Tests if smooth scrolling is allowed. Shuts down everything if not.
+ */
+function initTest() {
+
+ var disableKeyboard = false;
+
+ // disable keyboard support if anything above requested it
+ if (disableKeyboard) {
+ removeEvent("keydown", keydown);
+ }
+
+ if (options.keyboardSupport && !disableKeyboard) {
+ addEvent("keydown", keydown);
+ }
+}
+
+/**
+ * Sets up scrolls array, determines if frames are involved.
+ */
+function init() {
+
+ if (!document.body) return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var windowHeight = window.innerHeight;
+ var scrollHeight = body.scrollHeight;
+
+ // check compat mode for root element
+ root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
+ activeElement = body;
+
+ initTest();
+ initDone = true;
+
+ // Checks if this script is running in a frame
+ if (top != self) {
+ isFrame = true;
+ }
+
+ /**
+ * This fixes a bug where the areas left and right to
+ * the content does not trigger the onmousewheel event
+ * on some pages. e.g.: html, body { height: 100% }
+ */
+ else if (scrollHeight > windowHeight &&
+ (body.offsetHeight <= windowHeight ||
+ html.offsetHeight <= windowHeight)) {
+
+ // DOMChange (throttle): fix height
+ var pending = false;
+ var refresh = function () {
+ if (!pending && html.scrollHeight != document.height) {
+ pending = true; // add a new pending action
+ setTimeout(function () {
+ html.style.height = document.height + 'px';
+ pending = false;
+ }, 500); // act rarely to stay fast
+ }
+ };
+ html.style.height = 'auto';
+ setTimeout(refresh, 10);
+
+ // clearfix
+ if (root.offsetHeight <= windowHeight) {
+ var underlay = document.createElement("div");
+ underlay.style.clear = "both";
+ body.appendChild(underlay);
+ }
+ }
+
+ // disable fixed background
+ if (!options.fixedBackground && !isExcluded) {
+ body.style.backgroundAttachment = "scroll";
+ html.style.backgroundAttachment = "scroll";
+ }
+}
+
+
+/************************************************
+ * SCROLLING
+ ************************************************/
+
+var que = [];
+var pending = false;
+var lastScroll = +new Date;
+
+/**
+ * Pushes scroll actions to the scrolling queue.
+ */
+function scrollArray(elem, left, top, delay) {
+
+ delay || (delay = 1000);
+ directionCheck(left, top);
+
+ if (options.accelerationMax != 1) {
+ var now = +new Date;
+ var elapsed = now - lastScroll;
+ if (elapsed < options.accelerationDelta) {
+ var factor = (1 + (30 / elapsed)) / 2;
+ if (factor > 1) {
+ factor = Math.min(factor, options.accelerationMax);
+ left *= factor;
+ top *= factor;
+ }
+ }
+ lastScroll = +new Date;
+ }
+
+ // push a scroll command
+ que.push({
+ x: left,
+ y: top,
+ lastX: (left < 0) ? 0.99 : -0.99,
+ lastY: (top < 0) ? 0.99 : -0.99,
+ start: +new Date
+ });
+
+ // don't act if there's a pending queue
+ if (pending) {
+ return;
+ }
+
+ var scrollWindow = (elem === document.body);
+
+ var step = function (time) {
+
+ var now = +new Date;
+ var scrollX = 0;
+ var scrollY = 0;
+
+ for (var i = 0; i < que.length; i++) {
+
+ var item = que[i];
+ var elapsed = now - item.start;
+ var finished = (elapsed >= options.animationTime);
+
+ // scroll position: [0, 1]
+ var position = (finished) ? 1 : elapsed / options.animationTime;
+
+ // easing [optional]
+ if (options.pulseAlgorithm) {
+ position = pulse(position);
+ }
+
+ // only need the difference
+ var x = (item.x * position - item.lastX) >> 0;
+ var y = (item.y * position - item.lastY) >> 0;
+
+ // add this to the total scrolling
+ scrollX += x;
+ scrollY += y;
+
+ // update last values
+ item.lastX += x;
+ item.lastY += y;
+
+ // delete and step back if it's over
+ if (finished) {
+ que.splice(i, 1); i--;
+ }
+ }
+
+ // scroll left and top
+ if (scrollWindow) {
+ window.scrollBy(scrollX, scrollY);
+ }
+ else {
+ if (scrollX) elem.scrollLeft += scrollX;
+ if (scrollY) elem.scrollTop += scrollY;
+ }
+
+ // clean up if there's nothing left to do
+ if (!left && !top) {
+ que = [];
+ }
+
+ if (que.length) {
+ requestFrame(step, elem, (delay / options.frameRate + 1));
+ } else {
+ pending = false;
+ }
+ };
+
+ // start a new queue of actions
+ requestFrame(step, elem, 0);
+ pending = true;
+}
+
+
+/***********************************************
+ * EVENTS
+ ***********************************************/
+
+/**
+ * Mouse wheel handler.
+ * @param {Object} event
+ */
+function wheel(event) {
+
+ if (!initDone) {
+ init();
+ }
+
+ var target = event.target;
+ var overflowing = overflowingAncestor(target);
+
+ // use default if there's no overflowing
+ // element or default action is prevented
+ if (!overflowing || event.defaultPrevented ||
+ isNodeName(activeElement, "embed") ||
+ (isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
+ return true;
+ }
+
+ var deltaX = event.wheelDeltaX || 0;
+ var deltaY = event.wheelDeltaY || 0;
+
+ // use wheelDelta if deltaX/Y is not available
+ if (!deltaX && !deltaY) {
+ deltaY = event.wheelDelta || 0;
+ }
+
+ // check if it's a touchpad scroll that should be ignored
+ if (!options.touchpadSupport && isTouchpad(deltaY)) {
+ return true;
+ }
+
+ // scale by step size
+ // delta is 120 most of the time
+ // synaptics seems to send 1 sometimes
+ if (Math.abs(deltaX) > 1.2) {
+ deltaX *= options.stepSize / 120;
+ }
+ if (Math.abs(deltaY) > 1.2) {
+ deltaY *= options.stepSize / 120;
+ }
+
+ scrollArray(overflowing, -deltaX, -deltaY);
+ event.preventDefault();
+}
+
+/**
+ * Keydown event handler.
+ * @param {Object} event
+ */
+function keydown(event) {
+
+ var target = event.target;
+ var modifier = event.ctrlKey || event.altKey || event.metaKey ||
+ (event.shiftKey && event.keyCode !== key.spacebar);
+
+ // do nothing if user is editing text
+ // or using a modifier key (except shift)
+ // or in a dropdown
+ if ( /input|textarea|select|embed/i.test(target.nodeName) ||
+ target.isContentEditable ||
+ event.defaultPrevented ||
+ modifier ) {
+ return true;
+ }
+ // spacebar should trigger button press
+ if (isNodeName(target, "button") &&
+ event.keyCode === key.spacebar) {
+ return true;
+ }
+
+ var shift, x = 0, y = 0;
+ var elem = overflowingAncestor(activeElement);
+ var clientHeight = elem.clientHeight;
+
+ if (elem == document.body) {
+ clientHeight = window.innerHeight;
+ }
+
+ switch (event.keyCode) {
+ case key.up:
+ y = -options.arrowScroll;
+ break;
+ case key.down:
+ y = options.arrowScroll;
+ break;
+ case key.spacebar: // (+ shift)
+ shift = event.shiftKey ? 1 : -1;
+ y = -shift * clientHeight * 0.9;
+ break;
+ case key.pageup:
+ y = -clientHeight * 0.9;
+ break;
+ case key.pagedown:
+ y = clientHeight * 0.9;
+ break;
+ case key.home:
+ y = -elem.scrollTop;
+ break;
+ case key.end:
+ var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
+ y = (damt > 0) ? damt+10 : 0;
+ break;
+ case key.left:
+ x = -options.arrowScroll;
+ break;
+ case key.right:
+ x = options.arrowScroll;
+ break;
+ default:
+ return true; // a key we don't care about
+ }
+
+ scrollArray(elem, x, y);
+ event.preventDefault();
+}
+
+/**
+ * Mousedown event only for updating activeElement
+ */
+function mousedown(event) {
+ activeElement = event.target;
+}
+
+
+/***********************************************
+ * OVERFLOW
+ ***********************************************/
+
+var cache = {}; // cleared out every once in while
+setInterval(function () { cache = {}; }, 10 * 1000);
+
+var uniqueID = (function () {
+ var i = 0;
+ return function (el) {
+ return el.uniqueID || (el.uniqueID = i++);
+ };
+})();
+
+function setCache(elems, overflowing) {
+ for (var i = elems.length; i--;)
+ cache[uniqueID(elems[i])] = overflowing;
+ return overflowing;
+}
+
+function overflowingAncestor(el) {
+ var elems = [];
+ var rootScrollHeight = root.scrollHeight;
+ do {
+ var cached = cache[uniqueID(el)];
+ if (cached) {
+ return setCache(elems, cached);
+ }
+ elems.push(el);
+ if (rootScrollHeight === el.scrollHeight) {
+ if (!isFrame || root.clientHeight + 10 < rootScrollHeight) {
+ return setCache(elems, document.body); // scrolling root in WebKit
+ }
+ } else if (el.clientHeight + 10 < el.scrollHeight) {
+ overflow = getComputedStyle(el, "").getPropertyValue("overflow-y");
+ if (overflow === "scroll" || overflow === "auto") {
+ return setCache(elems, el);
+ }
+ }
+ } while (el = el.parentNode);
+}
+
+
+/***********************************************
+ * HELPERS
+ ***********************************************/
+
+function addEvent(type, fn, bubble) {
+ window.addEventListener(type, fn, (bubble||false));
+}
+
+function removeEvent(type, fn, bubble) {
+ window.removeEventListener(type, fn, (bubble||false));
+}
+
+function isNodeName(el, tag) {
+ return (el.nodeName||"").toLowerCase() === tag.toLowerCase();
+}
+
+function directionCheck(x, y) {
+ x = (x > 0) ? 1 : -1;
+ y = (y > 0) ? 1 : -1;
+ if (direction.x !== x || direction.y !== y) {
+ direction.x = x;
+ direction.y = y;
+ que = [];
+ lastScroll = 0;
+ }
+}
+
+var deltaBufferTimer;
+
+function isTouchpad(deltaY) {
+ if (!deltaY) return;
+ deltaY = Math.abs(deltaY)
+ deltaBuffer.push(deltaY);
+ deltaBuffer.shift();
+ clearTimeout(deltaBufferTimer);
+ var allDivisable = (isDivisible(deltaBuffer[0], 120) &&
+ isDivisible(deltaBuffer[1], 120) &&
+ isDivisible(deltaBuffer[2], 120));
+ return !allDivisable;
+}
+
+function isDivisible(n, divisor) {
+ return (Math.floor(n / divisor) == n / divisor);
+}
+
+var requestFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function (callback, element, delay) {
+ window.setTimeout(callback, delay || (1000/60));
+ };
+})();
+
+
+/***********************************************
+ * PULSE
+ ***********************************************/
+
+/**
+ * Viscous fluid with a pulse for part and decay for the rest.
+ * - Applies a fixed force over an interval (a damped acceleration), and
+ * - Lets the exponential bleed away the velocity over a longer interval
+ * - Michael Herf, http://stereopsis.com/stopping/
+ */
+function pulse_(x) {
+ var val, start, expx;
+ // test
+ x = x * options.pulseScale;
+ if (x < 1) { // acceleartion
+ val = x - (1 - Math.exp(-x));
+ } else { // tail
+ // the previous animation ended here:
+ start = Math.exp(-1);
+ // simple viscous drag
+ x -= 1;
+ expx = 1 - Math.exp(-x);
+ val = start + (expx * (1 - start));
+ }
+ return val * options.pulseNormalize;
+}
+
+function pulse(x) {
+ if (x >= 1) return 1;
+ if (x <= 0) return 0;
+
+ if (options.pulseNormalize == 1) {
+ options.pulseNormalize /= pulse_(1);
+ }
+ return pulse_(x);
+}
+
+var isChrome = /chrome/i.test(window.navigator.userAgent);
+var isSafari = /safari/i.test(window.navigator.userAgent);
+var wheelEvent = null;
+if ("onwheel" in document.createElement("div"))
+ wheelEvent = "wheel";
+else if ("onmousewheel" in document.createElement("div"))
+ wheelEvent = "mousewheel";
+
+if (wheelEvent && isChrome) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+if (wheelEvent && isSafari) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+})();
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/js/lib/bootstrap.min.js b/examples/docker/with-config/www/assets/js/lib/bootstrap.min.js
new file mode 100644
index 000000000..140718def
--- /dev/null
+++ b/examples/docker/with-config/www/assets/js/lib/bootstrap.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c33a6af5a36352853818)
+ * Config saved to config.json and https://gist.github.com/c33a6af5a36352853818
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e,s){return this.each(function(){var i=t(this),n=i.data("bs.modal"),a=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);n||i.data("bs.modal",n=new o(this,a)),"string"==typeof e?n[e](s):a.show&&n.show(s)})}var o=function(e,o){this.options=o,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};o.VERSION="3.2.0",o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},o.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},o.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var i=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):o.$element.trigger("focus").trigger(i)}))},o.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden.bs.modal")})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=t.support.transition&&s;if(this.$backdrop=t('').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;i?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},o.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},o.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},o.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},o.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var s=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=o,t.fn.modal.noConflict=function(){return t.fn.modal=s,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(o){var s=t(this),i=s.attr("href"),n=t(s.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),a=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},n.data(),s.data());s.is("a")&&o.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){s.is(":visible")&&s.trigger("focus")})}),e.call(n,a,this)})}(jQuery);
\ No newline at end of file
diff --git a/examples/docker/with-config/www/assets/js/lib/jquery-1.10.1.min.js b/examples/docker/with-config/www/assets/js/lib/jquery-1.10.1.min.js
new file mode 100644
index 000000000..e407e7699
--- /dev/null
+++ b/examples/docker/with-config/www/assets/js/lib/jquery-1.10.1.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.1.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
+ Get involved in the Lucee Project!
+ - Engage with other Lucee community members via our forums/mailing list
+ - Submitting bugs and feature requests
+ - Contribute to the code
+ - Support the project
+
Whether you need installation support or are looking for other professional services. Access our directory of providers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/docker/with-config/www/test.cfm b/examples/docker/with-config/www/test.cfm
new file mode 100644
index 000000000..8d0a34a2b
--- /dev/null
+++ b/examples/docker/with-config/www/test.cfm
@@ -0,0 +1,4 @@
+
+ dump(getCurrentTemplatePath());
+ dump(fileRead(getCurrentTemplatePath()));
+
\ No newline at end of file
diff --git a/examples/docker/with-extension/Dockerfile b/examples/docker/with-extension/Dockerfile
new file mode 100644
index 000000000..d230f6d33
--- /dev/null
+++ b/examples/docker/with-extension/Dockerfile
@@ -0,0 +1,18 @@
+FROM lucee/lucee:6.1.0.175-BETA
+
+# Provide test page by creating the directory and copying files
+RUN mkdir -p /var/www
+COPY www/ /var/www/
+
+# copy a custom lucee config in place
+COPY lucee-config.json /opt/lucee/server/lucee-server/context/.CFConfig.json
+
+# Create directory for extensions and copy them
+RUN mkdir -p /opt/lucee/extensions
+COPY extensions/ /opt/lucee/extensions/
+
+# how to build it
+# docker build -t lucee-with-extension .
+
+# how to run it (provides port for nginx and tomcat (optional); Lucee admin password)
+# docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-extension
\ No newline at end of file
diff --git a/examples/docker/with-extension/docker-compose.yml b/examples/docker/with-extension/docker-compose.yml
new file mode 100644
index 000000000..ba2d5440c
--- /dev/null
+++ b/examples/docker/with-extension/docker-compose.yml
@@ -0,0 +1,12 @@
+services:
+ lucee:
+ image: lucee-with-extension:latest
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ ports:
+ - "8854:8888" # tomcat
+ - "8054:80" # nginx
+
+# docker-compose up -d
diff --git a/examples/docker/with-extension/extensions/redis.extension-3.0.0.51.lex b/examples/docker/with-extension/extensions/redis.extension-3.0.0.51.lex
new file mode 100644
index 000000000..5635fe6f2
Binary files /dev/null and b/examples/docker/with-extension/extensions/redis.extension-3.0.0.51.lex differ
diff --git a/examples/docker/with-extension/lucee-config.json b/examples/docker/with-extension/lucee-config.json
new file mode 100644
index 000000000..51aead691
--- /dev/null
+++ b/examples/docker/with-extension/lucee-config.json
@@ -0,0 +1,277 @@
+{
+ "applicationTimeout": "1,0,0,0",
+ "cacheDirectory": "{lucee-config}/cache/",
+ "cacheDirectoryMaxSize": "100mb",
+ "cascadeToResultset": true,
+ "clientCookies": true,
+ "clientDirectory": "{lucee-config}/client-scope/",
+ "clientDirectoryMaxSize": "100mb",
+ "clientManagement": false,
+ "clientTimeout": "0,0,90,0",
+ "componentBase": "/lucee/Component.cfc",
+ "componentDataMemberAccess": "public",
+ "componentDumpTemplate": "/lucee/component-dump.cfm",
+ "debuggingEnabled": false,
+ "debuggingQueryUsage": false,
+ "developMode": false,
+ "domainCookies": false,
+ "listenerMode": "curr2root",
+ "listenerType": "mixed",
+ "mailConnectionTimeout": 30,
+ "mailSpoolEnable": true,
+ "mailSpoolInterval": 5,
+ "mergeUrlForm": false,
+ "mode": "single",
+ "preserveSingleQuote": false,
+ "requestTimeout": "0,0,0,50",
+ "scopeCascading": "standard",
+ "sessionManagement": true,
+ "sessionTimeout": "0,0,30,0",
+ "systemErr": "system",
+ "systemOut": "system",
+ "tempDirectory": "{lucee-config}/temp/",
+ "timeserver": "pool.ntp.org",
+ "updateLocation": "https://update.lucee.org",
+ "updateType": "manual",
+ "version": "5.0",
+ "cacheHandlers": {
+ "timespan": {
+ "class": "lucee.runtime.cache.tag.timespan.TimespanCacheHandler"
+ },
+ "request": {
+ "class": "lucee.runtime.cache.tag.request.RequestCacheHandler"
+ }
+ },
+ "componentMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/components/"
+ }
+ ],
+ "customTagMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/customtags/"
+ }
+ ],
+ "dataSources": {
+ "preserveSingleQuote": "yes"
+ },
+ "debugging": {
+ "logMemoryUsage": "no",
+ "template": "/lucee/templates/debugging/debugging.cfm"
+ },
+ "defaultResourceProvider": [
+ {
+ "class": "lucee.commons.io.res.type.file.FileResourceProvider",
+ "arguments": "lock-timeout:1000;"
+ }
+ ],
+ "dumpWriters": [
+ {
+ "name": "html",
+ "class": "lucee.runtime.dump.HTMLDumpWriter",
+ "default": "browser"
+ },
+ {
+ "name": "text",
+ "class": "lucee.runtime.dump.TextDumpWriter",
+ "default": "console"
+ },
+ {
+ "name": "classic",
+ "class": "lucee.runtime.dump.ClassicHTMLDumpWriter"
+ },
+ {
+ "name": "simple",
+ "class": "lucee.runtime.dump.SimpleHTMLDumpWriter"
+ }
+ ],
+ "fileSystem": {
+ "fldDefaultDirectory": "{lucee-config}/library/fld/",
+ "tldDefaultDirectory": "{lucee-config}/library/tld/",
+ "functionDefaultDirectory": "{lucee-config}/library/function/",
+ "tagDefaultDirectory": "{lucee-config}/library/tag/",
+ "deployDirectory": "{lucee-config}/cfclasses/"
+ },
+ "loggers": {
+ "datasource": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/datasource.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "memory": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/memory.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "requesttimeout": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/requesttimeout.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "deploy": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/deploy.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "thread": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/thread.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "exception": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/exception.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "application": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/application.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "scope": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scope.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "scheduler": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scheduler.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "search": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/search.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mail": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mail.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "orm": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/orm.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "remoteclient": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/remoteclient.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "gateway": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/gateway.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "rest": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/rest.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mapping": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mapping.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "execute": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/execute.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "http": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/http.log",
+ "level": "error",
+ "layout": "classic"
+ }
+ },
+ "mappings": {
+ "/lucee/": {
+ "readonly": "yes",
+ "physical": "{lucee-config}/context/",
+ "archive": "{lucee-config}/context/lucee-context.lar",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ },
+ "/lucee-server/": {
+ "readonly": "yes",
+ "physical": "{lucee-server}/context/",
+ "archive": "",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ }
+ },
+ "orm": {
+ "engineClass": "lucee.runtime.orm.DummyORMEngine"
+ },
+ "remoteClients": {
+ "directory": "{lucee-config}remote-client/"
+ },
+ "resourceProviders": [
+ {
+ "scheme": "ftp",
+ "class": "lucee.commons.io.res.type.ftp.FTPResourceProvider",
+ "arguments": "lock-timeout:20000;socket-timeout:-1;client-timeout:60000"
+ },
+ {
+ "scheme": "zip",
+ "class": "lucee.commons.io.res.type.zip.ZipResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tar",
+ "class": "lucee.commons.io.res.type.tar.TarResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tgz",
+ "class": "lucee.commons.io.res.type.tgz.TGZResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "http",
+ "class": "lucee.commons.io.res.type.http.HTTPResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "https",
+ "class": "lucee.commons.io.res.type.http.HTTPSResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "ram",
+ "class": "lucee.commons.io.res.type.cache.CacheResourceProvider",
+ "arguments": "case-sensitive:true;lock-timeout:1000;"
+ }
+ ],
+ "extensions": [
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/extensions/redis.extension-3.0.0.51.lex",
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/docker/with-extension/patches/6.1.0.175-SNAPSHOT.lco b/examples/docker/with-extension/patches/6.1.0.175-SNAPSHOT.lco
new file mode 100644
index 000000000..0858b04e6
Binary files /dev/null and b/examples/docker/with-extension/patches/6.1.0.175-SNAPSHOT.lco differ
diff --git a/examples/docker/with-extension/readme.md b/examples/docker/with-extension/readme.md
new file mode 100644
index 000000000..76ff9eab6
--- /dev/null
+++ b/examples/docker/with-extension/readme.md
@@ -0,0 +1,128 @@
+
+# Lucee Docker Setup with Custom Extensions
+
+This repository demonstrates how to build a Lucee Docker image with custom extensions bundled.
+
+## Files
+
+### Dockerfile
+
+Defines the Docker image for the Lucee server. It includes steps to copy website files, a custom Lucee configuration, and extensions into the appropriate directories.
+
+### lucee-config.json
+
+Contains the Lucee server configuration, including the definition of extensions. Extensions can be defined in various ways:
+
+#### Example with Local Path
+
+The extensions array can specify the path to the extension file within the container.
+
+```json
+"extensions": [
+ {
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718",
+ "name": "Redis",
+ "path": "/opt/lucee/web/lucee-server/context/extensions/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+- **id**: Optional, for Lucee 6.1 and beyond.
+- **name**: Optional, makes it easier to read.
+- **path**: Points to the local directory where the extension is located within the container.
+
+#### Example with URL
+
+The extensions array can also specify the URL from which to download the extension. Note that Lucee needs internet access to download the extension.
+
+```json
+"extensions": [
+ {
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718",
+ "url": "https://ext.lucee.org/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+#### Example with Extension ID
+
+You can define the extension only by its ID. Lucee will download the extension from the Extension Provider or directly from Maven, depending on the Lucee version.
+
+```json
+"extensions": [
+ {
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718"
+ }
+]
+```
+
+### extensions/redis.extension-3.0.0.51.lex
+
+The extension file itself. Place any extensions you want to bundle in this directory.
+
+## Directory Structure
+
+Your project directory should look like this:
+
+```
+your-project-directory/
+โ
+โโโ Dockerfile
+โโโ docker-compose.yml
+โโโ lucee-config.json
+โโโ www/
+โ โโโ [your website files]
+โโโ extensions/
+ โโโ redis.extension-3.0.0.51.lex
+```
+
+## Usage
+
+### Building the Docker Image
+
+To build the Docker image, navigate to the directory containing the `Dockerfile` and run:
+
+```sh
+docker build -t lucee-with-config .
+```
+
+### Running the Docker Container
+
+To run the Docker container, use the following command:
+
+```sh
+docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-config
+```
+
+This command will start the container, exposing port 80 for Nginx and port 8888 for Tomcat, with the Lucee admin password set to `qwerty`.
+
+### Using Docker Compose
+
+If you prefer to use Docker Compose, you can define the services and configurations in `docker-compose.yml`. Here is an example:
+
+```yaml
+version: '3'
+services:
+ lucee:
+ build: .
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ - "./extensions:/opt/lucee/web/lucee-server/context/extensions"
+ ports:
+ - "8054:80" # nginx
+ - "8854:8888" # tomcat
+```
+
+To start the services, navigate to the directory containing the `docker-compose.yml` file and run:
+
+```sh
+docker-compose up -d
+```
+
+This will build and start the services in detached mode, exposing the necessary ports and setting the Lucee admin password.
+
+## Summary
+
+This setup provides a flexible way to configure and extend the Lucee server using Docker and Docker Compose.
diff --git a/examples/docker/with-extension/www/Application.cfc b/examples/docker/with-extension/www/Application.cfc
new file mode 100644
index 000000000..a7d8c5562
--- /dev/null
+++ b/examples/docker/with-extension/www/Application.cfc
@@ -0,0 +1,4 @@
+๏ปฟcomponent {
+
+ this.Name = "Lucee";
+}
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/css/core/_ed07b761.core.min.css b/examples/docker/with-extension/www/assets/css/core/_ed07b761.core.min.css
new file mode 100644
index 000000000..2ac021e13
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/css/core/_ed07b761.core.min.css
@@ -0,0 +1,15 @@
+html{-webkit-text-size-adjust:none}body{font-family:'Open Sans',Arial,sans-serif;font-size:15px;font-weight:400;color:#666;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff}a{color:#5999b2}a:hover{text-decoration:underline;color:#449caf}a:focus{text-decoration:none;outline:0;color:#449caf}code{padding:2px 9px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}p{margin:0 0 25px;line-height:28px;font-weight:300;font-size:22px}@media only screen and (max-width:1199px){p{font-size:18px}}@media only screen and (max-width:979px){p{font-size:16px}}img{max-width:100%}h1,h2,h3,h4,h5,h6{font-family:'Open Sans',Arial,sans-serif;font-weight:600;margin-top:0;margin-bottom:25px}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}strong{font-weight:600}.intro-text{font-size:1.2em;line-height:1.6;margin-bottom:18px}.line-break{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-break.dotted{border-top-style:dotted}.line-bold{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-bold.dotted{border-top-style:dotted}.btn{border:none;padding:12px 20px;color:#fff;background:#4c9bb0;font-family:'Open Sans',Arial,sans-serif;font-weight:600;text-align:center;display:inline-block;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn:hover{color:#fff}.btn.disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50)}.btn:focus{color:#fff}.btn:hover{text-decoration:none}@media only screen and (min-width:1200px){.btn-large{font-size:25px;line-height:35px;font-weight:700}}.btn-wide{width:355px;max-width:100%}.btn-download{background:#539ab1;width:355px;max-width:100%}.btn-download:after{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -2px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-left:10px}.primary{color:#4c9bb0}blockquote{border:none;padding:13px 18px 18px;position:relative;font-size:1.2em}blockquote p{margin-bottom:10px;font-weight:300}blockquote .author{font-size:.722em;font-style:normal;text-transform:uppercase;font-weight:700}.well{font-size:1em;border:none}@media print{*{box-shadow:none!important;text-shadow:none!important;-ms-filter:none!important;filter:none!important}input,select,textarea{page-break-inside:avoid}a,a:visited{text-decoration:underline}.ir a:after,a[href]:after,a[href^="javascript:"]:after,a[href^="#"]:after,abbr[title]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.listing{padding:0;margin:0;list-style:none}.listing.border .listing-item+.listing-item{border-top:1px solid #ccc}.listing.border-light .listing-item+.listing-item{border-top:1px solid #f8f8f8}.listing .listing-item{padding:35px 0}.listing .listing-item:after,.listing .listing-item:before{content:" ";display:table}.listing .listing-item:after{clear:both}.listing .listing-item.thumb-small .listing-thumb{width:85px}.listing .listing-item.thumb-small .listing-content{margin-left:-85px;padding-left:110px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-small .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-thumb{width:120px}.listing .listing-item.thumb-large .listing-content{margin-left:-120px;padding-left:145px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-large .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-content .title{margin-bottom:15px}.listing .listing-item.thumb-large .listing-content p{font-weight:400}.listing .listing-item.thumb-large .listing-content .readmore{margin-top:10px;font-weight:700}.listing .listing-thumb{float:left;position:relative;z-index:3}@media only screen and (max-width:767px){.listing .listing-thumb{float:none;margin-bottom:15px;text-align:center;margin-right:auto;margin-left:auto}}.listing .listing-thumb a{display:block;text-decoration:none}@media only screen and (max-width:767px){.listing .listing-thumb a{display:inline-block}}.listing .listing-thumb img{max-width:100%}.listing .listing-content{position:relative;z-index:1;width:100%}.listing .listing-content .title{font-weight:700;margin:0 0 5px}.listing .listing-content p{margin:0}.listing .link-download{margin-top:30px;margin-bottom:0}.link-list{padding:0;margin:0;list-style:none;font-family:'Open Sans',Arial,sans-serif;font-size:1.333em}.link-list li{margin-bottom:7px}.blue{color:#0c0140}.underline{text-decoration:underline}.round-borders{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.round-borders-lg{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.perfect-round{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.aligned-center{text-align:center}.aligned-right{text-align:right}.aligned-left{text-align:left}.aligned-justify{text-align:justify}.uppercase{text-transform:uppercase}.centered{display:block;margin-left:auto;margin-right:auto}.full-width{width:100%}@media only screen and (max-width:979px){.half-grey-light{background:0 0}}.readmore{text-decoration:none;color:#4c9bb0;text-transform:uppercase;font-size:12px;font-weight:700;line-height:1.2}.readmore a{text-decoration:none;color:#4c9bb0}.readmore a:hover{text-decoration:underline}.readmore.explore{color:#0099d2;text-align:left;padding:2px}.readmore.explore a{color:#0099d2}.readmore.explore a:hover{text-decoration:underline}.three-columns,.two-columns{column-count:2;column-gap:30px;-moz-column-count:2;-moz-column-gap:30px;-webkit-column-count:2;-webkit-column-gap:30px;-webkit-margin-bottom-collapse:separate}@media only screen and (max-width:767px){.three-columns,.two-columns{column-count:1!important;column-gap:0!important;-moz-column-count:1!important;-moz-column-gap:0!important;-webkit-column-count:1!important;-webkit-column-gap:0!important}}.three-columns .no-break,.two-columns .no-break{column-break-inside:avoid;-webkit-column-break-inside:avoid;display:inline-block;max-width:100%}.three-columns li,.two-columns li{column-break-inside:avoid;-webkit-column-break-inside:avoid}.three-columns.three-columns,.two-columns.three-columns{column-count:3;-moz-column-count:3;-webkit-column-count:3}#page-banner{background:url(../../img/banner-bg.png) center;background-size:cover;color:#fff}#page-banner.home-banner .banner-content{padding:70px 10px}#page-banner .banner-content{padding:30px 10px;text-align:center}#page-banner .banner-content h1{font-size:55px;font-weight:300;line-height:65px}@media only screen and (max-width:1199px){#page-banner .banner-content h1{font-size:45px;line-height:55px}}@media only screen and (max-width:979px){#page-banner .banner-content h1{font-size:40px;line-height:45px}}@media only screen and (max-width:767px){#page-banner .banner-content h1{font-size:32px;line-height:35px}}#page-banner .banner-content p{font-size:20px;font-weight:600;line-height:25px}@media only screen and (max-width:979px){#page-banner .banner-content p{font-size:18px}}@media only screen and (max-width:767px){#page-banner .banner-content p{font-size:16px}}#page-banner .banner-content p.leadtext{font-size:30px;line-height:35px;margin-bottom:0}@media only screen and (max-width:979px){#page-banner .banner-content p.leadtext{font-size:22px}}@media only screen and (max-width:767px){#page-banner .banner-content p.leadtext{font-size:18px}}#page-banner .banner-content .learn-more{margin-bottom:0}#page-banner .banner-content .learn-more a{width:210px}#page-banner .banner-content .learn-more a:hover{text-decoration:none}
+#contents{position:relative}
+#contents .main-content,#contents .sidebar{padding-top:50px;padding-bottom:60px}
+#contents .main-content{background:#fff}
+#contents .main-content .content-wrap{width:70%;margin-left:10%;margin-right:10%}@media only screen and (max-width:1199px){#contents .main-content .content-wrap{margin-left:auto;margin-right:auto;width:auto}}
+#contents:before{background:#f8f8f8;position:absolute;z-index:0;display:block;content:"";width:50%;height:auto;right:0;top:0;bottom:0}#masthead{background:#01798a;padding-top:50px;padding-bottom:50px}@media only screen and (max-width:979px){#masthead{padding-top:30px;padding-bottom:30px}}@media only screen and (max-width:767px){#masthead{padding-top:15px;padding-bottom:15px}}@media only screen and (max-width:979px){#masthead .top-header{text-align:center;position:relative}}#masthead .site-logo{margin:0;float:left}@media only screen and (max-width:979px){#masthead .site-logo{float:none;display:block;width:121px;height:50px;margin:0 auto}}#masthead .site-logo a{display:block;text-decoration:none}#masthead .main-navigation{float:right;margin-top:13px}@media only screen and (max-width:979px){#masthead .main-navigation{float:none}}@media only screen and (max-width:767px){#masthead .main-navigation{display:none;background:#01798a;position:absolute;z-index:99;top:60px;left:0;width:100%;margin-top:0;padding:15px 30px;text-align:left}}@media only screen and (min-width:768px){#masthead .main-navigation{display:block!important}}@media only screen and (max-width:479px){#masthead .main-navigation{padding-left:15px;padding-right:15px}}#masthead .main-navigation>ul{padding:0;margin:0;list-style:none;display:block}#masthead .main-navigation>ul>li{float:left}#masthead .main-navigation>ul>li+li{margin-left:20px}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li+li{margin-left:0}}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li{display:inline-block;float:none;margin-top:8px}}@media only screen and (max-width:767px){#masthead .main-navigation>ul>li{display:block;margin-top:0}#masthead .main-navigation>ul>li+li{margin-top:12px}}#masthead .main-navigation>ul>li>a{font-weight:400;color:#fff;font-size:18px;text-transform:uppercase}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li>a{margin:0 7px}}#masthead .main-navigation>ul>li.active>a{font-weight:800}.toggle-menu{display:none;border:none;background:0 0;padding:10px;position:absolute;z-index:3;left:30px;top:5px}.toggle-menu:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -46px;width:24px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle}.toggle-menu:focus{outline:0}@media only screen and (max-width:767px){.toggle-menu{display:block}}@media only screen and (max-width:479px){.toggle-menu{left:15px}}#subhead .footer-top{background:#01798a;color:#fff;padding:50px 0 45px}@media only screen and (max-width:1199px){#subhead .footer-top .row>div{padding-left:25px;padding-right:25px}#subhead .footer-top .row>div+div>div{margin-top:20px;padding-top:20px;border-top:1px solid #fff}}#subhead .footer-top .footer-links h3{font-weight:600;font-size:22px;line-height:24px;margin:0 0 25px}#subhead .footer-top .footer-links ul{margin:0;padding:0;list-style:none}#subhead .footer-top .footer-links ul li{margin:0 0 10px}#subhead .footer-top .footer-links ul li a{color:#fff;font-size:18px}#subhead .footer-bot{background:#449caf;padding:30px 0 50px}@media only screen and (max-width:979px){#subhead .footer-bot{text-align:center}}#subhead .footer-bot .footer-logo{float:left;display:block;text-decoration:none}@media only screen and (max-width:979px){#subhead .footer-bot .footer-logo{float:none;display:inline-block}}#subhead .footer-bot p{color:#fff;font-size:13px;font-weight:600;margin:30px 0 0}@media only screen and (max-width:979px){#subhead .footer-bot p{text-align:center}#subhead .footer-bot p.powered-text{margin-top:0}}.sidebar{background:#f8f8f8}.sidebar .sidebar-wrap{max-width:360px;margin:0 auto}.sidebar .widget{margin-bottom:40px}.widget .widget-title{font-size:18px;line-height:23px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ccc}.widget-download .readmore{margin-top:10px}.widget-links ul.links{padding:0;margin:0;list-style:none;display:block}.widget-links ul.links li{margin-bottom:3px;display:block}.widget-links ul.links li a{color:#888;font-weight:600;font-size:18px;display:inline-block}@media only screen and (max-width:979px){.widget-links ul.links li a{font-size:16px}}.widget-links ul.links.docs li a:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -24px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-right:10px}.widget-text p{font-size:18px;font-weight:400;line-height:1.3}@media only screen and (max-width:979px){.widget-text p{font-size:16px}}
+.widget-text p.file-link{margin-bottom:10px}
+.widget-text p.file-link a{color:#888;font-weight:600}
+.widget-text p.file-link a:before{
+ background-image:url(../../img/ico-sprite.png);
+ background-repeat:no-repeat;background-position:-19px -24px;
+ width:18px;height:18px;content:"";
+ display:inline-block;text-indent:-999em;
+ vertical-align:middle;margin-right:10px}
+.widget-text p.readmore{font-weight:700;font-size:12px;line-height:1.2}
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/css/core/ie8.css b/examples/docker/with-extension/www/assets/css/core/ie8.css
new file mode 100644
index 000000000..30774b1dd
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/css/core/ie8.css
@@ -0,0 +1,56 @@
+input[type="checkbox"] + label.checked:before {
+ background-position: -162px -68px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ max-width: none;
+ padding-left: 25px !important;
+ width: 100%;
+ width: auto;
+}
+
+.form-control,
+input[type="email"],
+input[type="number"],
+input[type="password"],
+input[type="tel"],
+input[type="url"],
+input[type="text"],
+textarea {
+ padding-top: 13px;
+}
+
+select.form-control {
+ padding-top: 12px;
+ padding-bottom: 11px;
+ height: auto;
+}
+
+.announcement-ticker-wrapper .announcement-ticker .announcement {
+ min-height: 0;
+}
+
+.search-form .search-query {
+ padding-top: 10px;
+}
+
+.supplier-list li.third-child,
+.featured-articles .article.third-child {
+ clear: left !important;
+}
+
+.royalSlider .rsNav .rsNavItem {
+ min-height: 83px;
+}
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/css/json.css b/examples/docker/with-extension/www/assets/css/json.css
new file mode 100644
index 000000000..62a450ab7
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/css/json.css
@@ -0,0 +1,48 @@
+
+ pre.json-display {
+ background-color: #2e3b4e;
+ color: #fff;
+ padding: 20px;
+ border-radius: 8px;
+ overflow-x: auto;
+ overflow-y: auto;
+ line-height: 1.5;
+ white-space: pre-wrap; /* Allows the JSON to wrap within the container */
+ width: 600px; /* Fixed width */
+ height: 400px; /* Fixed height */
+ position: relative;
+ }
+
+ .key {
+ color: #d19a66; /* Orange color for keys */
+ }
+
+ .string {
+ color: #98c379; /* Green color for strings */
+ }
+
+ .number {
+ color: #e5c07b; /* Yellow color for numbers */
+ }
+
+ .boolean {
+ color: #56b6c2; /* Blue color for booleans */
+ }
+
+ .null {
+ color: #c678dd; /* Purple color for null */
+ }
+
+ .copy-button {
+ background-color: #5999b2;
+ color: #fff;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ margin-top: 10px;
+ }
+
+ .copy-button:hover {
+ background-color: #417a8a;
+ }
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/css/lib/bootstrap.min.css b/examples/docker/with-extension/www/assets/css/lib/bootstrap.min.css
new file mode 100644
index 000000000..09b7c3219
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/css/lib/bootstrap.min.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=47ae24b4df7d7a66efad)
+ * Config saved to config.json and https://gist.github.com/47ae24b4df7d7a66efad
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:980px){.container{width:970px}}@media (min-width:1200px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:980px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:980px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:979px){.hidden-sm{display:none !important}}@media (min-width:980px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/img/banner-bg.png b/examples/docker/with-extension/www/assets/img/banner-bg.png
new file mode 100644
index 000000000..437e23cf3
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/banner-bg.png differ
diff --git a/examples/docker/with-extension/www/assets/img/ico-sprite.png b/examples/docker/with-extension/www/assets/img/ico-sprite.png
new file mode 100644
index 000000000..480a237ab
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/ico-sprite.png differ
diff --git a/examples/docker/with-extension/www/assets/img/img-config.png b/examples/docker/with-extension/www/assets/img/img-config.png
new file mode 100644
index 000000000..904f7b273
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/img-config.png differ
diff --git a/examples/docker/with-extension/www/assets/img/img-ext.png b/examples/docker/with-extension/www/assets/img/img-ext.png
new file mode 100644
index 000000000..ddd842a82
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/img-ext.png differ
diff --git a/examples/docker/with-extension/www/assets/img/img-link.png b/examples/docker/with-extension/www/assets/img/img-link.png
new file mode 100644
index 000000000..8d60efd82
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/img-link.png differ
diff --git a/examples/docker/with-extension/www/assets/img/lucee-white.png b/examples/docker/with-extension/www/assets/img/lucee-white.png
new file mode 100644
index 000000000..8b6756836
Binary files /dev/null and b/examples/docker/with-extension/www/assets/img/lucee-white.png differ
diff --git a/examples/docker/with-extension/www/assets/js/core/_38444bee.core.min.js b/examples/docker/with-extension/www/assets/js/core/_38444bee.core.min.js
new file mode 100644
index 000000000..6a58c32b7
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/js/core/_38444bee.core.min.js
@@ -0,0 +1,2 @@
+!function(a){var b=(a("html").hasClass("lt-ie9"),function(){var b=function(){a(".toggle-menu").on("click",function(){a(".main-navigation").stop().slideToggle()})};return{init:function(){b()}}}());a(document).ready(function(){b.init()})}(jQuery);
+//# sourceMappingURL=_core.min.map
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/js/core/_core.min.map b/examples/docker/with-extension/www/assets/js/core/_core.min.map
new file mode 100644
index 000000000..bc5ba4dc5
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/js/core/_core.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"_core.min.js","sources":["main.js"],"names":["$","LuceeJS","hasClass","mobileMenuHandler","on","stop","slideToggle","init","document","ready","jQuery"],"mappings":"CAAA,SAAUA,GAEN,GAEIC,IAFOD,EAAE,QAAQE,SAAS,UAEhB,WAEV,GAAIC,GAAoB,WACpBH,EAAE,gBACGI,GAAG,QAAS,WAETJ,EAAE,oBAAoBK,OAAOC,gBAQzC,QAGIC,KAAM,WAEFJ,SAYZH,GAAEQ,UAAUC,MAAM,WAEdR,EAAQM,UAIbG"}
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/js/lib/SmoothScroll.js b/examples/docker/with-extension/www/assets/js/lib/SmoothScroll.js
new file mode 100644
index 000000000..e58b3d059
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/js/lib/SmoothScroll.js
@@ -0,0 +1,542 @@
+// SmoothScroll for websites v1.2.1
+// Licensed under the terms of the MIT license.
+
+// People involved
+// - Balazs Galambosi (maintainer)
+// - Michael Herf (Pulse Algorithm)
+
+(function(){
+
+// Scroll Variables (tweakable)
+var defaultOptions = {
+
+ // Scrolling Core
+ frameRate : 60, // [Hz]
+ animationTime : 800, // [px] // custom
+ stepSize : 200, // [px] // custom
+
+ // Pulse (less tweakable)
+ // ratio of "tail" to "acceleration"
+ pulseAlgorithm : true,
+ pulseScale : 8,
+ pulseNormalize : 1,
+
+ // Acceleration
+ accelerationDelta : 20, // 20
+ accelerationMax : 1, // 1
+
+ // Keyboard Settings
+ keyboardSupport : true, // option
+ arrowScroll : 50, // [px]
+
+ // Other
+ touchpadSupport : true,
+ fixedBackground : true,
+ excluded : ""
+};
+
+var options = defaultOptions;
+
+
+// Other Variables
+var isExcluded = false;
+var isFrame = false;
+var direction = { x: 0, y: 0 };
+var initDone = false;
+var root = document.documentElement;
+var activeElement;
+var observer;
+var deltaBuffer = [ 120, 120, 120 ];
+
+var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32,
+ pageup: 33, pagedown: 34, end: 35, home: 36 };
+
+
+/***********************************************
+ * SETTINGS
+ ***********************************************/
+
+var options = defaultOptions;
+
+
+/***********************************************
+ * INITIALIZE
+ ***********************************************/
+
+/**
+ * Tests if smooth scrolling is allowed. Shuts down everything if not.
+ */
+function initTest() {
+
+ var disableKeyboard = false;
+
+ // disable keyboard support if anything above requested it
+ if (disableKeyboard) {
+ removeEvent("keydown", keydown);
+ }
+
+ if (options.keyboardSupport && !disableKeyboard) {
+ addEvent("keydown", keydown);
+ }
+}
+
+/**
+ * Sets up scrolls array, determines if frames are involved.
+ */
+function init() {
+
+ if (!document.body) return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var windowHeight = window.innerHeight;
+ var scrollHeight = body.scrollHeight;
+
+ // check compat mode for root element
+ root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
+ activeElement = body;
+
+ initTest();
+ initDone = true;
+
+ // Checks if this script is running in a frame
+ if (top != self) {
+ isFrame = true;
+ }
+
+ /**
+ * This fixes a bug where the areas left and right to
+ * the content does not trigger the onmousewheel event
+ * on some pages. e.g.: html, body { height: 100% }
+ */
+ else if (scrollHeight > windowHeight &&
+ (body.offsetHeight <= windowHeight ||
+ html.offsetHeight <= windowHeight)) {
+
+ // DOMChange (throttle): fix height
+ var pending = false;
+ var refresh = function () {
+ if (!pending && html.scrollHeight != document.height) {
+ pending = true; // add a new pending action
+ setTimeout(function () {
+ html.style.height = document.height + 'px';
+ pending = false;
+ }, 500); // act rarely to stay fast
+ }
+ };
+ html.style.height = 'auto';
+ setTimeout(refresh, 10);
+
+ // clearfix
+ if (root.offsetHeight <= windowHeight) {
+ var underlay = document.createElement("div");
+ underlay.style.clear = "both";
+ body.appendChild(underlay);
+ }
+ }
+
+ // disable fixed background
+ if (!options.fixedBackground && !isExcluded) {
+ body.style.backgroundAttachment = "scroll";
+ html.style.backgroundAttachment = "scroll";
+ }
+}
+
+
+/************************************************
+ * SCROLLING
+ ************************************************/
+
+var que = [];
+var pending = false;
+var lastScroll = +new Date;
+
+/**
+ * Pushes scroll actions to the scrolling queue.
+ */
+function scrollArray(elem, left, top, delay) {
+
+ delay || (delay = 1000);
+ directionCheck(left, top);
+
+ if (options.accelerationMax != 1) {
+ var now = +new Date;
+ var elapsed = now - lastScroll;
+ if (elapsed < options.accelerationDelta) {
+ var factor = (1 + (30 / elapsed)) / 2;
+ if (factor > 1) {
+ factor = Math.min(factor, options.accelerationMax);
+ left *= factor;
+ top *= factor;
+ }
+ }
+ lastScroll = +new Date;
+ }
+
+ // push a scroll command
+ que.push({
+ x: left,
+ y: top,
+ lastX: (left < 0) ? 0.99 : -0.99,
+ lastY: (top < 0) ? 0.99 : -0.99,
+ start: +new Date
+ });
+
+ // don't act if there's a pending queue
+ if (pending) {
+ return;
+ }
+
+ var scrollWindow = (elem === document.body);
+
+ var step = function (time) {
+
+ var now = +new Date;
+ var scrollX = 0;
+ var scrollY = 0;
+
+ for (var i = 0; i < que.length; i++) {
+
+ var item = que[i];
+ var elapsed = now - item.start;
+ var finished = (elapsed >= options.animationTime);
+
+ // scroll position: [0, 1]
+ var position = (finished) ? 1 : elapsed / options.animationTime;
+
+ // easing [optional]
+ if (options.pulseAlgorithm) {
+ position = pulse(position);
+ }
+
+ // only need the difference
+ var x = (item.x * position - item.lastX) >> 0;
+ var y = (item.y * position - item.lastY) >> 0;
+
+ // add this to the total scrolling
+ scrollX += x;
+ scrollY += y;
+
+ // update last values
+ item.lastX += x;
+ item.lastY += y;
+
+ // delete and step back if it's over
+ if (finished) {
+ que.splice(i, 1); i--;
+ }
+ }
+
+ // scroll left and top
+ if (scrollWindow) {
+ window.scrollBy(scrollX, scrollY);
+ }
+ else {
+ if (scrollX) elem.scrollLeft += scrollX;
+ if (scrollY) elem.scrollTop += scrollY;
+ }
+
+ // clean up if there's nothing left to do
+ if (!left && !top) {
+ que = [];
+ }
+
+ if (que.length) {
+ requestFrame(step, elem, (delay / options.frameRate + 1));
+ } else {
+ pending = false;
+ }
+ };
+
+ // start a new queue of actions
+ requestFrame(step, elem, 0);
+ pending = true;
+}
+
+
+/***********************************************
+ * EVENTS
+ ***********************************************/
+
+/**
+ * Mouse wheel handler.
+ * @param {Object} event
+ */
+function wheel(event) {
+
+ if (!initDone) {
+ init();
+ }
+
+ var target = event.target;
+ var overflowing = overflowingAncestor(target);
+
+ // use default if there's no overflowing
+ // element or default action is prevented
+ if (!overflowing || event.defaultPrevented ||
+ isNodeName(activeElement, "embed") ||
+ (isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
+ return true;
+ }
+
+ var deltaX = event.wheelDeltaX || 0;
+ var deltaY = event.wheelDeltaY || 0;
+
+ // use wheelDelta if deltaX/Y is not available
+ if (!deltaX && !deltaY) {
+ deltaY = event.wheelDelta || 0;
+ }
+
+ // check if it's a touchpad scroll that should be ignored
+ if (!options.touchpadSupport && isTouchpad(deltaY)) {
+ return true;
+ }
+
+ // scale by step size
+ // delta is 120 most of the time
+ // synaptics seems to send 1 sometimes
+ if (Math.abs(deltaX) > 1.2) {
+ deltaX *= options.stepSize / 120;
+ }
+ if (Math.abs(deltaY) > 1.2) {
+ deltaY *= options.stepSize / 120;
+ }
+
+ scrollArray(overflowing, -deltaX, -deltaY);
+ event.preventDefault();
+}
+
+/**
+ * Keydown event handler.
+ * @param {Object} event
+ */
+function keydown(event) {
+
+ var target = event.target;
+ var modifier = event.ctrlKey || event.altKey || event.metaKey ||
+ (event.shiftKey && event.keyCode !== key.spacebar);
+
+ // do nothing if user is editing text
+ // or using a modifier key (except shift)
+ // or in a dropdown
+ if ( /input|textarea|select|embed/i.test(target.nodeName) ||
+ target.isContentEditable ||
+ event.defaultPrevented ||
+ modifier ) {
+ return true;
+ }
+ // spacebar should trigger button press
+ if (isNodeName(target, "button") &&
+ event.keyCode === key.spacebar) {
+ return true;
+ }
+
+ var shift, x = 0, y = 0;
+ var elem = overflowingAncestor(activeElement);
+ var clientHeight = elem.clientHeight;
+
+ if (elem == document.body) {
+ clientHeight = window.innerHeight;
+ }
+
+ switch (event.keyCode) {
+ case key.up:
+ y = -options.arrowScroll;
+ break;
+ case key.down:
+ y = options.arrowScroll;
+ break;
+ case key.spacebar: // (+ shift)
+ shift = event.shiftKey ? 1 : -1;
+ y = -shift * clientHeight * 0.9;
+ break;
+ case key.pageup:
+ y = -clientHeight * 0.9;
+ break;
+ case key.pagedown:
+ y = clientHeight * 0.9;
+ break;
+ case key.home:
+ y = -elem.scrollTop;
+ break;
+ case key.end:
+ var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
+ y = (damt > 0) ? damt+10 : 0;
+ break;
+ case key.left:
+ x = -options.arrowScroll;
+ break;
+ case key.right:
+ x = options.arrowScroll;
+ break;
+ default:
+ return true; // a key we don't care about
+ }
+
+ scrollArray(elem, x, y);
+ event.preventDefault();
+}
+
+/**
+ * Mousedown event only for updating activeElement
+ */
+function mousedown(event) {
+ activeElement = event.target;
+}
+
+
+/***********************************************
+ * OVERFLOW
+ ***********************************************/
+
+var cache = {}; // cleared out every once in while
+setInterval(function () { cache = {}; }, 10 * 1000);
+
+var uniqueID = (function () {
+ var i = 0;
+ return function (el) {
+ return el.uniqueID || (el.uniqueID = i++);
+ };
+})();
+
+function setCache(elems, overflowing) {
+ for (var i = elems.length; i--;)
+ cache[uniqueID(elems[i])] = overflowing;
+ return overflowing;
+}
+
+function overflowingAncestor(el) {
+ var elems = [];
+ var rootScrollHeight = root.scrollHeight;
+ do {
+ var cached = cache[uniqueID(el)];
+ if (cached) {
+ return setCache(elems, cached);
+ }
+ elems.push(el);
+ if (rootScrollHeight === el.scrollHeight) {
+ if (!isFrame || root.clientHeight + 10 < rootScrollHeight) {
+ return setCache(elems, document.body); // scrolling root in WebKit
+ }
+ } else if (el.clientHeight + 10 < el.scrollHeight) {
+ overflow = getComputedStyle(el, "").getPropertyValue("overflow-y");
+ if (overflow === "scroll" || overflow === "auto") {
+ return setCache(elems, el);
+ }
+ }
+ } while (el = el.parentNode);
+}
+
+
+/***********************************************
+ * HELPERS
+ ***********************************************/
+
+function addEvent(type, fn, bubble) {
+ window.addEventListener(type, fn, (bubble||false));
+}
+
+function removeEvent(type, fn, bubble) {
+ window.removeEventListener(type, fn, (bubble||false));
+}
+
+function isNodeName(el, tag) {
+ return (el.nodeName||"").toLowerCase() === tag.toLowerCase();
+}
+
+function directionCheck(x, y) {
+ x = (x > 0) ? 1 : -1;
+ y = (y > 0) ? 1 : -1;
+ if (direction.x !== x || direction.y !== y) {
+ direction.x = x;
+ direction.y = y;
+ que = [];
+ lastScroll = 0;
+ }
+}
+
+var deltaBufferTimer;
+
+function isTouchpad(deltaY) {
+ if (!deltaY) return;
+ deltaY = Math.abs(deltaY)
+ deltaBuffer.push(deltaY);
+ deltaBuffer.shift();
+ clearTimeout(deltaBufferTimer);
+ var allDivisable = (isDivisible(deltaBuffer[0], 120) &&
+ isDivisible(deltaBuffer[1], 120) &&
+ isDivisible(deltaBuffer[2], 120));
+ return !allDivisable;
+}
+
+function isDivisible(n, divisor) {
+ return (Math.floor(n / divisor) == n / divisor);
+}
+
+var requestFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function (callback, element, delay) {
+ window.setTimeout(callback, delay || (1000/60));
+ };
+})();
+
+
+/***********************************************
+ * PULSE
+ ***********************************************/
+
+/**
+ * Viscous fluid with a pulse for part and decay for the rest.
+ * - Applies a fixed force over an interval (a damped acceleration), and
+ * - Lets the exponential bleed away the velocity over a longer interval
+ * - Michael Herf, http://stereopsis.com/stopping/
+ */
+function pulse_(x) {
+ var val, start, expx;
+ // test
+ x = x * options.pulseScale;
+ if (x < 1) { // acceleartion
+ val = x - (1 - Math.exp(-x));
+ } else { // tail
+ // the previous animation ended here:
+ start = Math.exp(-1);
+ // simple viscous drag
+ x -= 1;
+ expx = 1 - Math.exp(-x);
+ val = start + (expx * (1 - start));
+ }
+ return val * options.pulseNormalize;
+}
+
+function pulse(x) {
+ if (x >= 1) return 1;
+ if (x <= 0) return 0;
+
+ if (options.pulseNormalize == 1) {
+ options.pulseNormalize /= pulse_(1);
+ }
+ return pulse_(x);
+}
+
+var isChrome = /chrome/i.test(window.navigator.userAgent);
+var isSafari = /safari/i.test(window.navigator.userAgent);
+var wheelEvent = null;
+if ("onwheel" in document.createElement("div"))
+ wheelEvent = "wheel";
+else if ("onmousewheel" in document.createElement("div"))
+ wheelEvent = "mousewheel";
+
+if (wheelEvent && isChrome) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+if (wheelEvent && isSafari) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+})();
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/js/lib/bootstrap.min.js b/examples/docker/with-extension/www/assets/js/lib/bootstrap.min.js
new file mode 100644
index 000000000..140718def
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/js/lib/bootstrap.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c33a6af5a36352853818)
+ * Config saved to config.json and https://gist.github.com/c33a6af5a36352853818
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e,s){return this.each(function(){var i=t(this),n=i.data("bs.modal"),a=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);n||i.data("bs.modal",n=new o(this,a)),"string"==typeof e?n[e](s):a.show&&n.show(s)})}var o=function(e,o){this.options=o,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};o.VERSION="3.2.0",o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},o.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},o.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var i=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):o.$element.trigger("focus").trigger(i)}))},o.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden.bs.modal")})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=t.support.transition&&s;if(this.$backdrop=t('').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;i?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},o.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},o.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},o.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},o.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var s=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=o,t.fn.modal.noConflict=function(){return t.fn.modal=s,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(o){var s=t(this),i=s.attr("href"),n=t(s.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),a=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},n.data(),s.data());s.is("a")&&o.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){s.is(":visible")&&s.trigger("focus")})}),e.call(n,a,this)})}(jQuery);
\ No newline at end of file
diff --git a/examples/docker/with-extension/www/assets/js/lib/jquery-1.10.1.min.js b/examples/docker/with-extension/www/assets/js/lib/jquery-1.10.1.min.js
new file mode 100644
index 000000000..e407e7699
--- /dev/null
+++ b/examples/docker/with-extension/www/assets/js/lib/jquery-1.10.1.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.1.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
+ Get involved in the Lucee Project!
+ - Engage with other Lucee community members via our forums/mailing list
+ - Submitting bugs and feature requests
+ - Contribute to the code
+ - Support the project
+
Whether you need installation support or are looking for other professional services. Access our directory of providers
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/docker/with-patch/Dockerfile b/examples/docker/with-patch/Dockerfile
new file mode 100644
index 000000000..ec2da3ad3
--- /dev/null
+++ b/examples/docker/with-patch/Dockerfile
@@ -0,0 +1,22 @@
+FROM lucee/lucee:6.1.0.175-BETA
+
+# Provide test page by creating the directory and copying files
+RUN mkdir -p /var/www
+COPY www/ /var/www/
+
+# copy a custom lucee config in place
+COPY lucee-config.json /opt/lucee/server/lucee-server/context/.CFConfig.json
+
+# Create directory for extensions and copy them
+RUN mkdir -p /opt/lucee/extensions
+COPY extensions/ /opt/lucee/extensions/
+
+
+# COPY patches/ /opt/lucee/server/lucee-server/patches
+
+
+# how to build it
+# docker build -t lucee-with-extension .
+
+# how to run it (provides port for nginx and tomcat (optional); Lucee admin password)
+# docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-extension
\ No newline at end of file
diff --git a/examples/docker/with-patch/docker-compose.yml b/examples/docker/with-patch/docker-compose.yml
new file mode 100644
index 000000000..ba2d5440c
--- /dev/null
+++ b/examples/docker/with-patch/docker-compose.yml
@@ -0,0 +1,12 @@
+services:
+ lucee:
+ image: lucee-with-extension:latest
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ ports:
+ - "8854:8888" # tomcat
+ - "8054:80" # nginx
+
+# docker-compose up -d
diff --git a/examples/docker/with-patch/extensions/redis.extension-3.0.0.51.lex b/examples/docker/with-patch/extensions/redis.extension-3.0.0.51.lex
new file mode 100644
index 000000000..5635fe6f2
Binary files /dev/null and b/examples/docker/with-patch/extensions/redis.extension-3.0.0.51.lex differ
diff --git a/examples/docker/with-patch/lucee-config.json b/examples/docker/with-patch/lucee-config.json
new file mode 100644
index 000000000..c880216b7
--- /dev/null
+++ b/examples/docker/with-patch/lucee-config.json
@@ -0,0 +1,276 @@
+{
+ "applicationTimeout": "1,0,0,0",
+ "cacheDirectory": "{lucee-config}/cache/",
+ "cacheDirectoryMaxSize": "100mb",
+ "cascadeToResultset": true,
+ "clientCookies": true,
+ "clientDirectory": "{lucee-config}/client-scope/",
+ "clientDirectoryMaxSize": "100mb",
+ "clientManagement": false,
+ "clientTimeout": "0,0,90,0",
+ "componentBase": "/lucee/Component.cfc",
+ "componentDataMemberAccess": "public",
+ "componentDumpTemplate": "/lucee/component-dump.cfm",
+ "debuggingEnabled": false,
+ "debuggingQueryUsage": false,
+ "developMode": false,
+ "domainCookies": false,
+ "listenerMode": "curr2root",
+ "listenerType": "mixed",
+ "mailConnectionTimeout": 30,
+ "mailSpoolEnable": true,
+ "mailSpoolInterval": 5,
+ "mergeUrlForm": false,
+ "mode": "single",
+ "preserveSingleQuote": false,
+ "requestTimeout": "0,0,0,50",
+ "scopeCascading": "standard",
+ "sessionManagement": true,
+ "sessionTimeout": "0,0,30,0",
+ "systemErr": "system",
+ "systemOut": "system",
+ "tempDirectory": "{lucee-config}/temp/",
+ "timeserver": "pool.ntp.org",
+ "updateLocation": "https://update.lucee.org",
+ "updateType": "manual",
+ "version": "5.0",
+ "cacheHandlers": {
+ "timespan": {
+ "class": "lucee.runtime.cache.tag.timespan.TimespanCacheHandler"
+ },
+ "request": {
+ "class": "lucee.runtime.cache.tag.request.RequestCacheHandler"
+ }
+ },
+ "componentMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/components/"
+ }
+ ],
+ "customTagMappings": [
+ {
+ "inspectTemplate": "never",
+ "physical": "{lucee-config}/customtags/"
+ }
+ ],
+ "dataSources": {
+ "preserveSingleQuote": "yes"
+ },
+ "debugging": {
+ "logMemoryUsage": "no",
+ "template": "/lucee/templates/debugging/debugging.cfm"
+ },
+ "defaultResourceProvider": [
+ {
+ "class": "lucee.commons.io.res.type.file.FileResourceProvider",
+ "arguments": "lock-timeout:1000;"
+ }
+ ],
+ "dumpWriters": [
+ {
+ "name": "html",
+ "class": "lucee.runtime.dump.HTMLDumpWriter",
+ "default": "browser"
+ },
+ {
+ "name": "text",
+ "class": "lucee.runtime.dump.TextDumpWriter",
+ "default": "console"
+ },
+ {
+ "name": "classic",
+ "class": "lucee.runtime.dump.ClassicHTMLDumpWriter"
+ },
+ {
+ "name": "simple",
+ "class": "lucee.runtime.dump.SimpleHTMLDumpWriter"
+ }
+ ],
+ "fileSystem": {
+ "fldDefaultDirectory": "{lucee-config}/library/fld/",
+ "tldDefaultDirectory": "{lucee-config}/library/tld/",
+ "functionDefaultDirectory": "{lucee-config}/library/function/",
+ "tagDefaultDirectory": "{lucee-config}/library/tag/",
+ "deployDirectory": "{lucee-config}/cfclasses/"
+ },
+ "loggers": {
+ "datasource": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/datasource.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "memory": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/memory.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "requesttimeout": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/requesttimeout.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "deploy": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/deploy.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "thread": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/thread.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "exception": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/exception.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "application": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/application.log",
+ "level": "info",
+ "layout": "classic"
+ },
+ "scope": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scope.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "scheduler": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/scheduler.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "search": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/search.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mail": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mail.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "orm": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/orm.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "remoteclient": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/remoteclient.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "gateway": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/gateway.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "rest": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/rest.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "mapping": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/mapping.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "execute": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/execute.log",
+ "level": "error",
+ "layout": "classic"
+ },
+ "http": {
+ "appender": "resource",
+ "appenderArguments": "path:{lucee-config}/logs/http.log",
+ "level": "error",
+ "layout": "classic"
+ }
+ },
+ "mappings": {
+ "/lucee/": {
+ "readonly": "yes",
+ "physical": "{lucee-config}/context/",
+ "archive": "{lucee-config}/context/lucee-context.lar",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ },
+ "/lucee-server/": {
+ "readonly": "yes",
+ "physical": "{lucee-server}/context/",
+ "archive": "",
+ "primary": "physical",
+ "listenerMode": "modern",
+ "listenerType": "curr2root",
+ "inspectTemplate": "once"
+ }
+ },
+ "orm": {
+ "engineClass": "lucee.runtime.orm.DummyORMEngine"
+ },
+ "remoteClients": {
+ "directory": "{lucee-config}remote-client/"
+ },
+ "resourceProviders": [
+ {
+ "scheme": "ftp",
+ "class": "lucee.commons.io.res.type.ftp.FTPResourceProvider",
+ "arguments": "lock-timeout:20000;socket-timeout:-1;client-timeout:60000"
+ },
+ {
+ "scheme": "zip",
+ "class": "lucee.commons.io.res.type.zip.ZipResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tar",
+ "class": "lucee.commons.io.res.type.tar.TarResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "tgz",
+ "class": "lucee.commons.io.res.type.tgz.TGZResourceProvider",
+ "arguments": "lock-timeout:1000;case-sensitive:true;"
+ },
+ {
+ "scheme": "http",
+ "class": "lucee.commons.io.res.type.http.HTTPResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "https",
+ "class": "lucee.commons.io.res.type.http.HTTPSResourceProvider",
+ "arguments": "lock-timeout:10000;case-sensitive:false;"
+ },
+ {
+ "scheme": "ram",
+ "class": "lucee.commons.io.res.type.cache.CacheResourceProvider",
+ "arguments": "case-sensitive:true;lock-timeout:1000;"
+ }
+ ],
+ "extensions": [
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/extensions/redis.extension-3.0.0.51.lex"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/examples/docker/with-patch/patches/6.1.0.175-SNAPSHOT.lco b/examples/docker/with-patch/patches/6.1.0.175-SNAPSHOT.lco
new file mode 100644
index 000000000..0858b04e6
Binary files /dev/null and b/examples/docker/with-patch/patches/6.1.0.175-SNAPSHOT.lco differ
diff --git a/examples/docker/with-patch/readme.md b/examples/docker/with-patch/readme.md
new file mode 100644
index 000000000..19fceaae3
--- /dev/null
+++ b/examples/docker/with-patch/readme.md
@@ -0,0 +1,125 @@
+
+# Lucee Docker Setup with Custom Extensions
+
+This repository demonstrates how to build a Lucee Docker image with custom extensions bundled.
+
+## Files
+
+### Dockerfile
+
+Defines the Docker image for the Lucee server. It includes steps to copy website files, a custom Lucee configuration, and extensions into the appropriate directories.
+
+### lucee-config.json
+
+Contains the Lucee server configuration, including the definition of extensions. Extensions can be defined in various ways:
+
+#### Example with Local Path
+
+The extensions array can specify the path to the extension file within the container.
+
+```json
+"extensions": [
+ {
+ "name": "Redis",
+ "path": "/opt/lucee/web/lucee-server/context/extensions/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+- **name**: Optional, makes it easier to read.
+- **path**: Points to the local directory where the extension is located within the container.
+
+#### Example with URL
+
+The extensions array can also specify the URL from which to download the extension. Note that Lucee needs internet access to download the extension.
+
+```json
+"extensions": [
+ {
+ "url": "https://ext.lucee.org/redis.extension-3.0.0.51.lex"
+ }
+]
+```
+
+#### Example with Extension ID
+
+You can define the extension by its ID. Lucee will download the extension from the Extension Provider or directly from Maven, depending on the Lucee version.
+
+```json
+"extensions": [
+ {
+ "id": "60772C12-F179-D555-8E2CD2B4F7428718"
+ }
+]
+```
+
+### extensions/redis.extension-3.0.0.51.lex
+
+The extension file itself. Place any extensions you want to bundle in this directory.
+
+## Directory Structure
+
+Your project directory should look like this:
+
+```
+your-project-directory/
+โ
+โโโ Dockerfile
+โโโ docker-compose.yml
+โโโ lucee-config.json
+โโโ www/
+โ โโโ [your website files]
+โโโ extensions/
+ โโโ redis.extension-3.0.0.51.lex
+```
+
+## Usage
+
+### Building the Docker Image
+
+To build the Docker image, navigate to the directory containing the `Dockerfile` and run:
+
+```sh
+docker build -t lucee-with-config .
+```
+
+### Running the Docker Container
+
+To run the Docker container, use the following command:
+
+```sh
+docker run -d -p 8054:80 -p 8854:8888 -e LUCEE_ADMIN_PASSWORD=qwerty lucee-with-config
+```
+
+This command will start the container, exposing port 80 for Nginx and port 8888 for Tomcat, with the Lucee admin password set to `qwerty`.
+
+### Using Docker Compose
+
+If you prefer to use Docker Compose, you can define the services and configurations in `docker-compose.yml`. Here is an example:
+
+```yaml
+version: '3'
+services:
+ lucee:
+ build: .
+ environment:
+ - LUCEE_ADMIN_PASSWORD=qwerty
+ volumes:
+ - "./www:/var/www"
+ - "./extensions:/opt/lucee/web/lucee-server/context/extensions"
+ ports:
+ - "8054:80" # nginx
+ - "8854:8888" # tomcat
+```
+
+To start the services, navigate to the directory containing the `docker-compose.yml` file and run:
+
+```sh
+docker-compose up -d
+```
+
+This will build and start the services in detached mode, exposing the necessary ports and setting the Lucee admin password.
+
+## Summary
+
+This setup provides a flexible way to configure and extend the Lucee server using Docker and Docker Compose.
diff --git a/examples/docker/with-patch/www/Application.cfc b/examples/docker/with-patch/www/Application.cfc
new file mode 100644
index 000000000..a7d8c5562
--- /dev/null
+++ b/examples/docker/with-patch/www/Application.cfc
@@ -0,0 +1,4 @@
+๏ปฟcomponent {
+
+ this.Name = "Lucee";
+}
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/css/core/_ed07b761.core.min.css b/examples/docker/with-patch/www/assets/css/core/_ed07b761.core.min.css
new file mode 100644
index 000000000..2ac021e13
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/css/core/_ed07b761.core.min.css
@@ -0,0 +1,15 @@
+html{-webkit-text-size-adjust:none}body{font-family:'Open Sans',Arial,sans-serif;font-size:15px;font-weight:400;color:#666;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background:#fff}a{color:#5999b2}a:hover{text-decoration:underline;color:#449caf}a:focus{text-decoration:none;outline:0;color:#449caf}code{padding:2px 9px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}p{margin:0 0 25px;line-height:28px;font-weight:300;font-size:22px}@media only screen and (max-width:1199px){p{font-size:18px}}@media only screen and (max-width:979px){p{font-size:16px}}img{max-width:100%}h1,h2,h3,h4,h5,h6{font-family:'Open Sans',Arial,sans-serif;font-weight:600;margin-top:0;margin-bottom:25px}h1{font-size:30px}h2{font-size:26px}h3{font-size:22px}h4{font-size:18px}strong{font-weight:600}.intro-text{font-size:1.2em;line-height:1.6;margin-bottom:18px}.line-break{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-break.dotted{border-top-style:dotted}.line-bold{margin-top:23px;margin-bottom:16px;width:100%;clear:both}.line-bold.dotted{border-top-style:dotted}.btn{border:none;padding:12px 20px;color:#fff;background:#4c9bb0;font-family:'Open Sans',Arial,sans-serif;font-weight:600;text-align:center;display:inline-block;font-size:18px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn:hover{color:#fff}.btn.disabled,.btn[disabled]{opacity:.5;filter:alpha(opacity=50)}.btn:focus{color:#fff}.btn:hover{text-decoration:none}@media only screen and (min-width:1200px){.btn-large{font-size:25px;line-height:35px;font-weight:700}}.btn-wide{width:355px;max-width:100%}.btn-download{background:#539ab1;width:355px;max-width:100%}.btn-download:after{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -2px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-left:10px}.primary{color:#4c9bb0}blockquote{border:none;padding:13px 18px 18px;position:relative;font-size:1.2em}blockquote p{margin-bottom:10px;font-weight:300}blockquote .author{font-size:.722em;font-style:normal;text-transform:uppercase;font-weight:700}.well{font-size:1em;border:none}@media print{*{box-shadow:none!important;text-shadow:none!important;-ms-filter:none!important;filter:none!important}input,select,textarea{page-break-inside:avoid}a,a:visited{text-decoration:underline}.ir a:after,a[href]:after,a[href^="javascript:"]:after,a[href^="#"]:after,abbr[title]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.listing{padding:0;margin:0;list-style:none}.listing.border .listing-item+.listing-item{border-top:1px solid #ccc}.listing.border-light .listing-item+.listing-item{border-top:1px solid #f8f8f8}.listing .listing-item{padding:35px 0}.listing .listing-item:after,.listing .listing-item:before{content:" ";display:table}.listing .listing-item:after{clear:both}.listing .listing-item.thumb-small .listing-thumb{width:85px}.listing .listing-item.thumb-small .listing-content{margin-left:-85px;padding-left:110px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-small .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-thumb{width:120px}.listing .listing-item.thumb-large .listing-content{margin-left:-120px;padding-left:145px;float:left}@media only screen and (max-width:767px){.listing .listing-item.thumb-large .listing-content{float:none;padding-left:0;margin-left:0;text-align:center}}.listing .listing-item.thumb-large .listing-content .title{margin-bottom:15px}.listing .listing-item.thumb-large .listing-content p{font-weight:400}.listing .listing-item.thumb-large .listing-content .readmore{margin-top:10px;font-weight:700}.listing .listing-thumb{float:left;position:relative;z-index:3}@media only screen and (max-width:767px){.listing .listing-thumb{float:none;margin-bottom:15px;text-align:center;margin-right:auto;margin-left:auto}}.listing .listing-thumb a{display:block;text-decoration:none}@media only screen and (max-width:767px){.listing .listing-thumb a{display:inline-block}}.listing .listing-thumb img{max-width:100%}.listing .listing-content{position:relative;z-index:1;width:100%}.listing .listing-content .title{font-weight:700;margin:0 0 5px}.listing .listing-content p{margin:0}.listing .link-download{margin-top:30px;margin-bottom:0}.link-list{padding:0;margin:0;list-style:none;font-family:'Open Sans',Arial,sans-serif;font-size:1.333em}.link-list li{margin-bottom:7px}.blue{color:#0c0140}.underline{text-decoration:underline}.round-borders{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.round-borders-lg{-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px}.perfect-round{-webkit-border-radius:100px;-moz-border-radius:100px;border-radius:100px}.aligned-center{text-align:center}.aligned-right{text-align:right}.aligned-left{text-align:left}.aligned-justify{text-align:justify}.uppercase{text-transform:uppercase}.centered{display:block;margin-left:auto;margin-right:auto}.full-width{width:100%}@media only screen and (max-width:979px){.half-grey-light{background:0 0}}.readmore{text-decoration:none;color:#4c9bb0;text-transform:uppercase;font-size:12px;font-weight:700;line-height:1.2}.readmore a{text-decoration:none;color:#4c9bb0}.readmore a:hover{text-decoration:underline}.readmore.explore{color:#0099d2;text-align:left;padding:2px}.readmore.explore a{color:#0099d2}.readmore.explore a:hover{text-decoration:underline}.three-columns,.two-columns{column-count:2;column-gap:30px;-moz-column-count:2;-moz-column-gap:30px;-webkit-column-count:2;-webkit-column-gap:30px;-webkit-margin-bottom-collapse:separate}@media only screen and (max-width:767px){.three-columns,.two-columns{column-count:1!important;column-gap:0!important;-moz-column-count:1!important;-moz-column-gap:0!important;-webkit-column-count:1!important;-webkit-column-gap:0!important}}.three-columns .no-break,.two-columns .no-break{column-break-inside:avoid;-webkit-column-break-inside:avoid;display:inline-block;max-width:100%}.three-columns li,.two-columns li{column-break-inside:avoid;-webkit-column-break-inside:avoid}.three-columns.three-columns,.two-columns.three-columns{column-count:3;-moz-column-count:3;-webkit-column-count:3}#page-banner{background:url(../../img/banner-bg.png) center;background-size:cover;color:#fff}#page-banner.home-banner .banner-content{padding:70px 10px}#page-banner .banner-content{padding:30px 10px;text-align:center}#page-banner .banner-content h1{font-size:55px;font-weight:300;line-height:65px}@media only screen and (max-width:1199px){#page-banner .banner-content h1{font-size:45px;line-height:55px}}@media only screen and (max-width:979px){#page-banner .banner-content h1{font-size:40px;line-height:45px}}@media only screen and (max-width:767px){#page-banner .banner-content h1{font-size:32px;line-height:35px}}#page-banner .banner-content p{font-size:20px;font-weight:600;line-height:25px}@media only screen and (max-width:979px){#page-banner .banner-content p{font-size:18px}}@media only screen and (max-width:767px){#page-banner .banner-content p{font-size:16px}}#page-banner .banner-content p.leadtext{font-size:30px;line-height:35px;margin-bottom:0}@media only screen and (max-width:979px){#page-banner .banner-content p.leadtext{font-size:22px}}@media only screen and (max-width:767px){#page-banner .banner-content p.leadtext{font-size:18px}}#page-banner .banner-content .learn-more{margin-bottom:0}#page-banner .banner-content .learn-more a{width:210px}#page-banner .banner-content .learn-more a:hover{text-decoration:none}
+#contents{position:relative}
+#contents .main-content,#contents .sidebar{padding-top:50px;padding-bottom:60px}
+#contents .main-content{background:#fff}
+#contents .main-content .content-wrap{width:70%;margin-left:10%;margin-right:10%}@media only screen and (max-width:1199px){#contents .main-content .content-wrap{margin-left:auto;margin-right:auto;width:auto}}
+#contents:before{background:#f8f8f8;position:absolute;z-index:0;display:block;content:"";width:50%;height:auto;right:0;top:0;bottom:0}#masthead{background:#01798a;padding-top:50px;padding-bottom:50px}@media only screen and (max-width:979px){#masthead{padding-top:30px;padding-bottom:30px}}@media only screen and (max-width:767px){#masthead{padding-top:15px;padding-bottom:15px}}@media only screen and (max-width:979px){#masthead .top-header{text-align:center;position:relative}}#masthead .site-logo{margin:0;float:left}@media only screen and (max-width:979px){#masthead .site-logo{float:none;display:block;width:121px;height:50px;margin:0 auto}}#masthead .site-logo a{display:block;text-decoration:none}#masthead .main-navigation{float:right;margin-top:13px}@media only screen and (max-width:979px){#masthead .main-navigation{float:none}}@media only screen and (max-width:767px){#masthead .main-navigation{display:none;background:#01798a;position:absolute;z-index:99;top:60px;left:0;width:100%;margin-top:0;padding:15px 30px;text-align:left}}@media only screen and (min-width:768px){#masthead .main-navigation{display:block!important}}@media only screen and (max-width:479px){#masthead .main-navigation{padding-left:15px;padding-right:15px}}#masthead .main-navigation>ul{padding:0;margin:0;list-style:none;display:block}#masthead .main-navigation>ul>li{float:left}#masthead .main-navigation>ul>li+li{margin-left:20px}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li+li{margin-left:0}}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li{display:inline-block;float:none;margin-top:8px}}@media only screen and (max-width:767px){#masthead .main-navigation>ul>li{display:block;margin-top:0}#masthead .main-navigation>ul>li+li{margin-top:12px}}#masthead .main-navigation>ul>li>a{font-weight:400;color:#fff;font-size:18px;text-transform:uppercase}@media only screen and (max-width:979px){#masthead .main-navigation>ul>li>a{margin:0 7px}}#masthead .main-navigation>ul>li.active>a{font-weight:800}.toggle-menu{display:none;border:none;background:0 0;padding:10px;position:absolute;z-index:3;left:30px;top:5px}.toggle-menu:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -46px;width:24px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle}.toggle-menu:focus{outline:0}@media only screen and (max-width:767px){.toggle-menu{display:block}}@media only screen and (max-width:479px){.toggle-menu{left:15px}}#subhead .footer-top{background:#01798a;color:#fff;padding:50px 0 45px}@media only screen and (max-width:1199px){#subhead .footer-top .row>div{padding-left:25px;padding-right:25px}#subhead .footer-top .row>div+div>div{margin-top:20px;padding-top:20px;border-top:1px solid #fff}}#subhead .footer-top .footer-links h3{font-weight:600;font-size:22px;line-height:24px;margin:0 0 25px}#subhead .footer-top .footer-links ul{margin:0;padding:0;list-style:none}#subhead .footer-top .footer-links ul li{margin:0 0 10px}#subhead .footer-top .footer-links ul li a{color:#fff;font-size:18px}#subhead .footer-bot{background:#449caf;padding:30px 0 50px}@media only screen and (max-width:979px){#subhead .footer-bot{text-align:center}}#subhead .footer-bot .footer-logo{float:left;display:block;text-decoration:none}@media only screen and (max-width:979px){#subhead .footer-bot .footer-logo{float:none;display:inline-block}}#subhead .footer-bot p{color:#fff;font-size:13px;font-weight:600;margin:30px 0 0}@media only screen and (max-width:979px){#subhead .footer-bot p{text-align:center}#subhead .footer-bot p.powered-text{margin-top:0}}.sidebar{background:#f8f8f8}.sidebar .sidebar-wrap{max-width:360px;margin:0 auto}.sidebar .widget{margin-bottom:40px}.widget .widget-title{font-size:18px;line-height:23px;margin-bottom:20px;padding-bottom:20px;border-bottom:1px solid #ccc}.widget-download .readmore{margin-top:10px}.widget-links ul.links{padding:0;margin:0;list-style:none;display:block}.widget-links ul.links li{margin-bottom:3px;display:block}.widget-links ul.links li a{color:#888;font-weight:600;font-size:18px;display:inline-block}@media only screen and (max-width:979px){.widget-links ul.links li a{font-size:16px}}.widget-links ul.links.docs li a:before{background-image:url(../../img/ico-sprite.png);background-repeat:no-repeat;background-position:-2px -24px;width:15px;height:18px;content:"";display:inline-block;text-indent:-999em;vertical-align:middle;margin-right:10px}.widget-text p{font-size:18px;font-weight:400;line-height:1.3}@media only screen and (max-width:979px){.widget-text p{font-size:16px}}
+.widget-text p.file-link{margin-bottom:10px}
+.widget-text p.file-link a{color:#888;font-weight:600}
+.widget-text p.file-link a:before{
+ background-image:url(../../img/ico-sprite.png);
+ background-repeat:no-repeat;background-position:-19px -24px;
+ width:18px;height:18px;content:"";
+ display:inline-block;text-indent:-999em;
+ vertical-align:middle;margin-right:10px}
+.widget-text p.readmore{font-weight:700;font-size:12px;line-height:1.2}
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/css/core/ie8.css b/examples/docker/with-patch/www/assets/css/core/ie8.css
new file mode 100644
index 000000000..30774b1dd
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/css/core/ie8.css
@@ -0,0 +1,56 @@
+input[type="checkbox"] + label.checked:before {
+ background-position: -162px -68px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="radio"] + label.checked:before {
+ background-position: -162px -96px;
+ content: ","; /* IE8 Fix, force repaint of before */
+}
+
+input[type="checkbox"] + label,
+input[type="radio"] + label {
+ max-width: none;
+ padding-left: 25px !important;
+ width: 100%;
+ width: auto;
+}
+
+.form-control,
+input[type="email"],
+input[type="number"],
+input[type="password"],
+input[type="tel"],
+input[type="url"],
+input[type="text"],
+textarea {
+ padding-top: 13px;
+}
+
+select.form-control {
+ padding-top: 12px;
+ padding-bottom: 11px;
+ height: auto;
+}
+
+.announcement-ticker-wrapper .announcement-ticker .announcement {
+ min-height: 0;
+}
+
+.search-form .search-query {
+ padding-top: 10px;
+}
+
+.supplier-list li.third-child,
+.featured-articles .article.third-child {
+ clear: left !important;
+}
+
+.royalSlider .rsNav .rsNavItem {
+ min-height: 83px;
+}
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/css/json.css b/examples/docker/with-patch/www/assets/css/json.css
new file mode 100644
index 000000000..62a450ab7
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/css/json.css
@@ -0,0 +1,48 @@
+
+ pre.json-display {
+ background-color: #2e3b4e;
+ color: #fff;
+ padding: 20px;
+ border-radius: 8px;
+ overflow-x: auto;
+ overflow-y: auto;
+ line-height: 1.5;
+ white-space: pre-wrap; /* Allows the JSON to wrap within the container */
+ width: 600px; /* Fixed width */
+ height: 400px; /* Fixed height */
+ position: relative;
+ }
+
+ .key {
+ color: #d19a66; /* Orange color for keys */
+ }
+
+ .string {
+ color: #98c379; /* Green color for strings */
+ }
+
+ .number {
+ color: #e5c07b; /* Yellow color for numbers */
+ }
+
+ .boolean {
+ color: #56b6c2; /* Blue color for booleans */
+ }
+
+ .null {
+ color: #c678dd; /* Purple color for null */
+ }
+
+ .copy-button {
+ background-color: #5999b2;
+ color: #fff;
+ border: none;
+ padding: 10px 20px;
+ border-radius: 5px;
+ cursor: pointer;
+ margin-top: 10px;
+ }
+
+ .copy-button:hover {
+ background-color: #417a8a;
+ }
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/css/lib/bootstrap.min.css b/examples/docker/with-patch/www/assets/css/lib/bootstrap.min.css
new file mode 100644
index 000000000..09b7c3219
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/css/lib/bootstrap.min.css
@@ -0,0 +1,10 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=47ae24b4df7d7a66efad)
+ * Config saved to config.json and https://gist.github.com/47ae24b4df7d7a66efad
+ *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff !important}.navbar{display:none}.table td,.table th{background-color:#fff !important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;width:100% \9;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:980px){.container{width:970px}}@media (min-width:1200px){.container{width:1200px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:980px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{line-height:34px;line-height:1.42857143 \0}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate3d(0, -25%, 0);transform:translate3d(0, -25%, 0);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:980px){.modal-lg{width:900px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important;visibility:hidden !important}.affix{position:fixed;-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:979px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:980px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:979px){.hidden-sm{display:none !important}}@media (min-width:980px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/img/banner-bg.png b/examples/docker/with-patch/www/assets/img/banner-bg.png
new file mode 100644
index 000000000..437e23cf3
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/banner-bg.png differ
diff --git a/examples/docker/with-patch/www/assets/img/ico-sprite.png b/examples/docker/with-patch/www/assets/img/ico-sprite.png
new file mode 100644
index 000000000..480a237ab
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/ico-sprite.png differ
diff --git a/examples/docker/with-patch/www/assets/img/img-config.png b/examples/docker/with-patch/www/assets/img/img-config.png
new file mode 100644
index 000000000..904f7b273
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/img-config.png differ
diff --git a/examples/docker/with-patch/www/assets/img/img-ext.png b/examples/docker/with-patch/www/assets/img/img-ext.png
new file mode 100644
index 000000000..ddd842a82
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/img-ext.png differ
diff --git a/examples/docker/with-patch/www/assets/img/img-link.png b/examples/docker/with-patch/www/assets/img/img-link.png
new file mode 100644
index 000000000..8d60efd82
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/img-link.png differ
diff --git a/examples/docker/with-patch/www/assets/img/lucee-white.png b/examples/docker/with-patch/www/assets/img/lucee-white.png
new file mode 100644
index 000000000..8b6756836
Binary files /dev/null and b/examples/docker/with-patch/www/assets/img/lucee-white.png differ
diff --git a/examples/docker/with-patch/www/assets/js/core/_38444bee.core.min.js b/examples/docker/with-patch/www/assets/js/core/_38444bee.core.min.js
new file mode 100644
index 000000000..6a58c32b7
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/js/core/_38444bee.core.min.js
@@ -0,0 +1,2 @@
+!function(a){var b=(a("html").hasClass("lt-ie9"),function(){var b=function(){a(".toggle-menu").on("click",function(){a(".main-navigation").stop().slideToggle()})};return{init:function(){b()}}}());a(document).ready(function(){b.init()})}(jQuery);
+//# sourceMappingURL=_core.min.map
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/js/core/_core.min.map b/examples/docker/with-patch/www/assets/js/core/_core.min.map
new file mode 100644
index 000000000..bc5ba4dc5
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/js/core/_core.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"_core.min.js","sources":["main.js"],"names":["$","LuceeJS","hasClass","mobileMenuHandler","on","stop","slideToggle","init","document","ready","jQuery"],"mappings":"CAAA,SAAUA,GAEN,GAEIC,IAFOD,EAAE,QAAQE,SAAS,UAEhB,WAEV,GAAIC,GAAoB,WACpBH,EAAE,gBACGI,GAAG,QAAS,WAETJ,EAAE,oBAAoBK,OAAOC,gBAQzC,QAGIC,KAAM,WAEFJ,SAYZH,GAAEQ,UAAUC,MAAM,WAEdR,EAAQM,UAIbG"}
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/js/lib/SmoothScroll.js b/examples/docker/with-patch/www/assets/js/lib/SmoothScroll.js
new file mode 100644
index 000000000..e58b3d059
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/js/lib/SmoothScroll.js
@@ -0,0 +1,542 @@
+// SmoothScroll for websites v1.2.1
+// Licensed under the terms of the MIT license.
+
+// People involved
+// - Balazs Galambosi (maintainer)
+// - Michael Herf (Pulse Algorithm)
+
+(function(){
+
+// Scroll Variables (tweakable)
+var defaultOptions = {
+
+ // Scrolling Core
+ frameRate : 60, // [Hz]
+ animationTime : 800, // [px] // custom
+ stepSize : 200, // [px] // custom
+
+ // Pulse (less tweakable)
+ // ratio of "tail" to "acceleration"
+ pulseAlgorithm : true,
+ pulseScale : 8,
+ pulseNormalize : 1,
+
+ // Acceleration
+ accelerationDelta : 20, // 20
+ accelerationMax : 1, // 1
+
+ // Keyboard Settings
+ keyboardSupport : true, // option
+ arrowScroll : 50, // [px]
+
+ // Other
+ touchpadSupport : true,
+ fixedBackground : true,
+ excluded : ""
+};
+
+var options = defaultOptions;
+
+
+// Other Variables
+var isExcluded = false;
+var isFrame = false;
+var direction = { x: 0, y: 0 };
+var initDone = false;
+var root = document.documentElement;
+var activeElement;
+var observer;
+var deltaBuffer = [ 120, 120, 120 ];
+
+var key = { left: 37, up: 38, right: 39, down: 40, spacebar: 32,
+ pageup: 33, pagedown: 34, end: 35, home: 36 };
+
+
+/***********************************************
+ * SETTINGS
+ ***********************************************/
+
+var options = defaultOptions;
+
+
+/***********************************************
+ * INITIALIZE
+ ***********************************************/
+
+/**
+ * Tests if smooth scrolling is allowed. Shuts down everything if not.
+ */
+function initTest() {
+
+ var disableKeyboard = false;
+
+ // disable keyboard support if anything above requested it
+ if (disableKeyboard) {
+ removeEvent("keydown", keydown);
+ }
+
+ if (options.keyboardSupport && !disableKeyboard) {
+ addEvent("keydown", keydown);
+ }
+}
+
+/**
+ * Sets up scrolls array, determines if frames are involved.
+ */
+function init() {
+
+ if (!document.body) return;
+
+ var body = document.body;
+ var html = document.documentElement;
+ var windowHeight = window.innerHeight;
+ var scrollHeight = body.scrollHeight;
+
+ // check compat mode for root element
+ root = (document.compatMode.indexOf('CSS') >= 0) ? html : body;
+ activeElement = body;
+
+ initTest();
+ initDone = true;
+
+ // Checks if this script is running in a frame
+ if (top != self) {
+ isFrame = true;
+ }
+
+ /**
+ * This fixes a bug where the areas left and right to
+ * the content does not trigger the onmousewheel event
+ * on some pages. e.g.: html, body { height: 100% }
+ */
+ else if (scrollHeight > windowHeight &&
+ (body.offsetHeight <= windowHeight ||
+ html.offsetHeight <= windowHeight)) {
+
+ // DOMChange (throttle): fix height
+ var pending = false;
+ var refresh = function () {
+ if (!pending && html.scrollHeight != document.height) {
+ pending = true; // add a new pending action
+ setTimeout(function () {
+ html.style.height = document.height + 'px';
+ pending = false;
+ }, 500); // act rarely to stay fast
+ }
+ };
+ html.style.height = 'auto';
+ setTimeout(refresh, 10);
+
+ // clearfix
+ if (root.offsetHeight <= windowHeight) {
+ var underlay = document.createElement("div");
+ underlay.style.clear = "both";
+ body.appendChild(underlay);
+ }
+ }
+
+ // disable fixed background
+ if (!options.fixedBackground && !isExcluded) {
+ body.style.backgroundAttachment = "scroll";
+ html.style.backgroundAttachment = "scroll";
+ }
+}
+
+
+/************************************************
+ * SCROLLING
+ ************************************************/
+
+var que = [];
+var pending = false;
+var lastScroll = +new Date;
+
+/**
+ * Pushes scroll actions to the scrolling queue.
+ */
+function scrollArray(elem, left, top, delay) {
+
+ delay || (delay = 1000);
+ directionCheck(left, top);
+
+ if (options.accelerationMax != 1) {
+ var now = +new Date;
+ var elapsed = now - lastScroll;
+ if (elapsed < options.accelerationDelta) {
+ var factor = (1 + (30 / elapsed)) / 2;
+ if (factor > 1) {
+ factor = Math.min(factor, options.accelerationMax);
+ left *= factor;
+ top *= factor;
+ }
+ }
+ lastScroll = +new Date;
+ }
+
+ // push a scroll command
+ que.push({
+ x: left,
+ y: top,
+ lastX: (left < 0) ? 0.99 : -0.99,
+ lastY: (top < 0) ? 0.99 : -0.99,
+ start: +new Date
+ });
+
+ // don't act if there's a pending queue
+ if (pending) {
+ return;
+ }
+
+ var scrollWindow = (elem === document.body);
+
+ var step = function (time) {
+
+ var now = +new Date;
+ var scrollX = 0;
+ var scrollY = 0;
+
+ for (var i = 0; i < que.length; i++) {
+
+ var item = que[i];
+ var elapsed = now - item.start;
+ var finished = (elapsed >= options.animationTime);
+
+ // scroll position: [0, 1]
+ var position = (finished) ? 1 : elapsed / options.animationTime;
+
+ // easing [optional]
+ if (options.pulseAlgorithm) {
+ position = pulse(position);
+ }
+
+ // only need the difference
+ var x = (item.x * position - item.lastX) >> 0;
+ var y = (item.y * position - item.lastY) >> 0;
+
+ // add this to the total scrolling
+ scrollX += x;
+ scrollY += y;
+
+ // update last values
+ item.lastX += x;
+ item.lastY += y;
+
+ // delete and step back if it's over
+ if (finished) {
+ que.splice(i, 1); i--;
+ }
+ }
+
+ // scroll left and top
+ if (scrollWindow) {
+ window.scrollBy(scrollX, scrollY);
+ }
+ else {
+ if (scrollX) elem.scrollLeft += scrollX;
+ if (scrollY) elem.scrollTop += scrollY;
+ }
+
+ // clean up if there's nothing left to do
+ if (!left && !top) {
+ que = [];
+ }
+
+ if (que.length) {
+ requestFrame(step, elem, (delay / options.frameRate + 1));
+ } else {
+ pending = false;
+ }
+ };
+
+ // start a new queue of actions
+ requestFrame(step, elem, 0);
+ pending = true;
+}
+
+
+/***********************************************
+ * EVENTS
+ ***********************************************/
+
+/**
+ * Mouse wheel handler.
+ * @param {Object} event
+ */
+function wheel(event) {
+
+ if (!initDone) {
+ init();
+ }
+
+ var target = event.target;
+ var overflowing = overflowingAncestor(target);
+
+ // use default if there's no overflowing
+ // element or default action is prevented
+ if (!overflowing || event.defaultPrevented ||
+ isNodeName(activeElement, "embed") ||
+ (isNodeName(target, "embed") && /\.pdf/i.test(target.src))) {
+ return true;
+ }
+
+ var deltaX = event.wheelDeltaX || 0;
+ var deltaY = event.wheelDeltaY || 0;
+
+ // use wheelDelta if deltaX/Y is not available
+ if (!deltaX && !deltaY) {
+ deltaY = event.wheelDelta || 0;
+ }
+
+ // check if it's a touchpad scroll that should be ignored
+ if (!options.touchpadSupport && isTouchpad(deltaY)) {
+ return true;
+ }
+
+ // scale by step size
+ // delta is 120 most of the time
+ // synaptics seems to send 1 sometimes
+ if (Math.abs(deltaX) > 1.2) {
+ deltaX *= options.stepSize / 120;
+ }
+ if (Math.abs(deltaY) > 1.2) {
+ deltaY *= options.stepSize / 120;
+ }
+
+ scrollArray(overflowing, -deltaX, -deltaY);
+ event.preventDefault();
+}
+
+/**
+ * Keydown event handler.
+ * @param {Object} event
+ */
+function keydown(event) {
+
+ var target = event.target;
+ var modifier = event.ctrlKey || event.altKey || event.metaKey ||
+ (event.shiftKey && event.keyCode !== key.spacebar);
+
+ // do nothing if user is editing text
+ // or using a modifier key (except shift)
+ // or in a dropdown
+ if ( /input|textarea|select|embed/i.test(target.nodeName) ||
+ target.isContentEditable ||
+ event.defaultPrevented ||
+ modifier ) {
+ return true;
+ }
+ // spacebar should trigger button press
+ if (isNodeName(target, "button") &&
+ event.keyCode === key.spacebar) {
+ return true;
+ }
+
+ var shift, x = 0, y = 0;
+ var elem = overflowingAncestor(activeElement);
+ var clientHeight = elem.clientHeight;
+
+ if (elem == document.body) {
+ clientHeight = window.innerHeight;
+ }
+
+ switch (event.keyCode) {
+ case key.up:
+ y = -options.arrowScroll;
+ break;
+ case key.down:
+ y = options.arrowScroll;
+ break;
+ case key.spacebar: // (+ shift)
+ shift = event.shiftKey ? 1 : -1;
+ y = -shift * clientHeight * 0.9;
+ break;
+ case key.pageup:
+ y = -clientHeight * 0.9;
+ break;
+ case key.pagedown:
+ y = clientHeight * 0.9;
+ break;
+ case key.home:
+ y = -elem.scrollTop;
+ break;
+ case key.end:
+ var damt = elem.scrollHeight - elem.scrollTop - clientHeight;
+ y = (damt > 0) ? damt+10 : 0;
+ break;
+ case key.left:
+ x = -options.arrowScroll;
+ break;
+ case key.right:
+ x = options.arrowScroll;
+ break;
+ default:
+ return true; // a key we don't care about
+ }
+
+ scrollArray(elem, x, y);
+ event.preventDefault();
+}
+
+/**
+ * Mousedown event only for updating activeElement
+ */
+function mousedown(event) {
+ activeElement = event.target;
+}
+
+
+/***********************************************
+ * OVERFLOW
+ ***********************************************/
+
+var cache = {}; // cleared out every once in while
+setInterval(function () { cache = {}; }, 10 * 1000);
+
+var uniqueID = (function () {
+ var i = 0;
+ return function (el) {
+ return el.uniqueID || (el.uniqueID = i++);
+ };
+})();
+
+function setCache(elems, overflowing) {
+ for (var i = elems.length; i--;)
+ cache[uniqueID(elems[i])] = overflowing;
+ return overflowing;
+}
+
+function overflowingAncestor(el) {
+ var elems = [];
+ var rootScrollHeight = root.scrollHeight;
+ do {
+ var cached = cache[uniqueID(el)];
+ if (cached) {
+ return setCache(elems, cached);
+ }
+ elems.push(el);
+ if (rootScrollHeight === el.scrollHeight) {
+ if (!isFrame || root.clientHeight + 10 < rootScrollHeight) {
+ return setCache(elems, document.body); // scrolling root in WebKit
+ }
+ } else if (el.clientHeight + 10 < el.scrollHeight) {
+ overflow = getComputedStyle(el, "").getPropertyValue("overflow-y");
+ if (overflow === "scroll" || overflow === "auto") {
+ return setCache(elems, el);
+ }
+ }
+ } while (el = el.parentNode);
+}
+
+
+/***********************************************
+ * HELPERS
+ ***********************************************/
+
+function addEvent(type, fn, bubble) {
+ window.addEventListener(type, fn, (bubble||false));
+}
+
+function removeEvent(type, fn, bubble) {
+ window.removeEventListener(type, fn, (bubble||false));
+}
+
+function isNodeName(el, tag) {
+ return (el.nodeName||"").toLowerCase() === tag.toLowerCase();
+}
+
+function directionCheck(x, y) {
+ x = (x > 0) ? 1 : -1;
+ y = (y > 0) ? 1 : -1;
+ if (direction.x !== x || direction.y !== y) {
+ direction.x = x;
+ direction.y = y;
+ que = [];
+ lastScroll = 0;
+ }
+}
+
+var deltaBufferTimer;
+
+function isTouchpad(deltaY) {
+ if (!deltaY) return;
+ deltaY = Math.abs(deltaY)
+ deltaBuffer.push(deltaY);
+ deltaBuffer.shift();
+ clearTimeout(deltaBufferTimer);
+ var allDivisable = (isDivisible(deltaBuffer[0], 120) &&
+ isDivisible(deltaBuffer[1], 120) &&
+ isDivisible(deltaBuffer[2], 120));
+ return !allDivisable;
+}
+
+function isDivisible(n, divisor) {
+ return (Math.floor(n / divisor) == n / divisor);
+}
+
+var requestFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function (callback, element, delay) {
+ window.setTimeout(callback, delay || (1000/60));
+ };
+})();
+
+
+/***********************************************
+ * PULSE
+ ***********************************************/
+
+/**
+ * Viscous fluid with a pulse for part and decay for the rest.
+ * - Applies a fixed force over an interval (a damped acceleration), and
+ * - Lets the exponential bleed away the velocity over a longer interval
+ * - Michael Herf, http://stereopsis.com/stopping/
+ */
+function pulse_(x) {
+ var val, start, expx;
+ // test
+ x = x * options.pulseScale;
+ if (x < 1) { // acceleartion
+ val = x - (1 - Math.exp(-x));
+ } else { // tail
+ // the previous animation ended here:
+ start = Math.exp(-1);
+ // simple viscous drag
+ x -= 1;
+ expx = 1 - Math.exp(-x);
+ val = start + (expx * (1 - start));
+ }
+ return val * options.pulseNormalize;
+}
+
+function pulse(x) {
+ if (x >= 1) return 1;
+ if (x <= 0) return 0;
+
+ if (options.pulseNormalize == 1) {
+ options.pulseNormalize /= pulse_(1);
+ }
+ return pulse_(x);
+}
+
+var isChrome = /chrome/i.test(window.navigator.userAgent);
+var isSafari = /safari/i.test(window.navigator.userAgent);
+var wheelEvent = null;
+if ("onwheel" in document.createElement("div"))
+ wheelEvent = "wheel";
+else if ("onmousewheel" in document.createElement("div"))
+ wheelEvent = "mousewheel";
+
+if (wheelEvent && isChrome) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+if (wheelEvent && isSafari) {
+ addEvent(wheelEvent, wheel);
+ addEvent("mousedown", mousedown);
+ addEvent("load", init);
+}
+
+})();
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/js/lib/bootstrap.min.js b/examples/docker/with-patch/www/assets/js/lib/bootstrap.min.js
new file mode 100644
index 000000000..140718def
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/js/lib/bootstrap.min.js
@@ -0,0 +1,11 @@
+/*!
+ * Bootstrap v3.2.0 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=c33a6af5a36352853818)
+ * Config saved to config.json and https://gist.github.com/c33a6af5a36352853818
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";function e(e,s){return this.each(function(){var i=t(this),n=i.data("bs.modal"),a=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);n||i.data("bs.modal",n=new o(this,a)),"string"==typeof e?n[e](s):a.show&&n.show(s)})}var o=function(e,o){this.options=o,this.$body=t(document.body),this.$element=t(e),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};o.VERSION="3.2.0",o.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},o.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},o.prototype.show=function(e){var o=this,s=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(s),this.isShown||s.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.backdrop(function(){var s=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),s&&o.$element[0].offsetWidth,o.$element.addClass("in").attr("aria-hidden",!1),o.enforceFocus();var i=t.Event("shown.bs.modal",{relatedTarget:e});s?o.$element.find(".modal-dialog").one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(i)}).emulateTransitionEnd(300):o.$element.trigger("focus").trigger(i)}))},o.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},o.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},o.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},o.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$element.trigger("hidden.bs.modal")})},o.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},o.prototype.backdrop=function(e){var o=this,s=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=t.support.transition&&s;if(this.$backdrop=t('').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;i?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(150):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(150):n()}else e&&e()},o.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},o.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",t+this.scrollbarWidth)},o.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},o.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var s=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=o,t.fn.modal.noConflict=function(){return t.fn.modal=s,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(o){var s=t(this),i=s.attr("href"),n=t(s.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,"")),a=n.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(i)&&i},n.data(),s.data());s.is("a")&&o.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){s.is(":visible")&&s.trigger("focus")})}),e.call(n,a,this)})}(jQuery);
\ No newline at end of file
diff --git a/examples/docker/with-patch/www/assets/js/lib/jquery-1.10.1.min.js b/examples/docker/with-patch/www/assets/js/lib/jquery-1.10.1.min.js
new file mode 100644
index 000000000..e407e7699
--- /dev/null
+++ b/examples/docker/with-patch/www/assets/js/lib/jquery-1.10.1.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.1.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
+ Get involved in the Lucee Project!
+ - Engage with other Lucee community members via our forums/mailing list
+ - Submitting bugs and feature requests
+ - Contribute to the code
+ - Support the project
+