diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..21d6671f0
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,165 @@
+# editorconfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Default settings:
+# A newline ending every file
+# Use 4 spaces as indentation
+[*]
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+
+[project.json]
+indent_size = 2
+
+# C# files
+[*.cs]
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = one_less_than_current
+
+# avoid this. unless absolutely necessary
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# only use var when it's obvious what the variable type is
+csharp_style_var_for_built_in_types = false:none
+csharp_style_var_when_type_is_apparent = false:none
+csharp_style_var_elsewhere = false:suggestion
+
+# use language keywords instead of BCL types
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# name all constant fields using PascalCase
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# static fields should have s_ prefix
+dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion
+dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields
+dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style
+
+dotnet_naming_symbols.static_fields.applicable_kinds = field
+dotnet_naming_symbols.static_fields.required_modifiers = static
+
+dotnet_naming_style.static_prefix_style.required_prefix = s_
+dotnet_naming_style.static_prefix_style.capitalization = camel_case
+
+# internal and private fields should be m_camelCase
+dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
+dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
+dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
+
+dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
+dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
+
+dotnet_naming_style.camel_case_underscore_style.required_prefix = m_
+dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
+
+# Code style defaults
+dotnet_sort_system_directives_first = true
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = false
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = false:none
+csharp_style_expression_bodied_constructors = false:none
+csharp_style_expression_bodied_operators = false:none
+csharp_style_expression_bodied_properties = true:none
+csharp_style_expression_bodied_indexers = true:none
+csharp_style_expression_bodied_accessors = true:none
+
+# Pattern matching
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+# Null checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = do_not_ignore
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Xml project files
+
+# CA1063: Implement IDisposable Correctly
+dotnet_diagnostic.CA1063.severity = silent
+
+# CA2100: Review SQL queries for security vulnerabilities
+dotnet_diagnostic.CA2100.severity = silent
+
+[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
+indent_size = 2
+
+# Xml build files
+[*.builds]
+indent_size = 2
+
+# Xml files
+[*.{xml,stylecop,resx,ruleset}]
+indent_size = 2
+
+# Xml config files
+[*.{props,targets,config,nuspec}]
+indent_size = 2
+
+# Shell scripts
+[*.sh]
+end_of_line = lf
+[*.{cmd, bat}]
+end_of_line = crlf
+
+# Analyzers
+dotnet_code_quality.ca1802.api_surface = private, internal
\ No newline at end of file
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..e33db37fd
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,8 @@
+# Auto detect text files and perform LF normalization
+# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/
+* text=auto
+
+*.cs diff=csharp
+
+*.resx eol=crlf
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..29c6b5d05
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,220 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+build/
+bld/
+[Bb]in/
+[Oo]bj/
+
+# Visual Studio 2015 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# DNX
+project.lock.json
+artifacts/
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.VC.db
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# TODO: Comment the next line if you want to checkin your web deploy settings
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/packages/*
+# except build/, which is used as an MSBuild target.
+!**/packages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/packages/repositories.config
+
+# Windows Azure Build Output
+csx/
+*.build.csdef
+
+# Windows Store app package directory
+AppPackages/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
+
+# Others
+ClientBin/
+[Ss]tyle[Cc]op.*
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.pfx
+*.publishsettings
+node_modules/
+orleans.codegen.cs
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+*.mdf
+*.ldf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+*.DotSettings
+*.DotSettings
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 000000000..364ada605
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Grid Protection Alliance
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/RenameProject.bat b/RenameProject.bat
new file mode 100644
index 000000000..b3a79a6eb
--- /dev/null
+++ b/RenameProject.bat
@@ -0,0 +1,37 @@
+@ECHO OFF
+SET destU=%1
+IF /I "%destU%"=="" SET /P destU=Enter PascalCase target library title, e.g., "Threading" (without quotes):
+SET srcU=%2
+IF /I "%srcU%"=="" SET srcU=GemTem
+SET srcL=%srcU%
+SET destL=%destU%
+SET ucase=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+SET lcase=abcdefghijklmnopqrstuvwxyz
+SETLOCAL EnableDelayedExpansion
+
+FOR /L %%a IN (0,1,25) DO (
+ CALL SET "from=%%ucase:~%%a,1%%
+ CALL SET "to=%%lcase:~%%a,1%%
+ CALL SET "srcL=%%srcL:!from!=!to!%%
+ CALL SET "destL=%%destL:!from!=!to!%%
+)
+
+ECHO.
+ECHO *** GemStone Template Rename Script ***
+ECHO.
+ECHO About to rename "%srcU%/%srcL%" to "%destU%/%destL%", press Ctrl+C to cancel, or
+PAUSE
+.\build\tools\ReplaceInFiles /r /v /c ".\src\*.*" %srcU% %destU%
+.\build\tools\ReplaceInFiles /r /v /c ".\docs\*.*" %srcU% %destU%
+.\build\tools\BRC64 /REPLACECS:%srcU%:%destU% /RECURSIVE /EXECUTE
+.\build\tools\ReplaceInFiles /r /v /c ".\src\*.*" %srcL% %destL%
+.\build\tools\ReplaceInFiles /r /v /c ".\docs\*.*" %srcL% %destL%
+.\build\tools\BRC64 /REPLACECS:%srcL%:%destL% /RECURSIVE /EXECUTE
+REN ".\src\gemstone.%srcL%" "gemstone.%destL%"
+
+ENDLOCAL
+ECHO.
+ECHO Project Rename to "%destU%" is now Complete.
+ECHO It is recommended to now delete the "RenameProject.bat" script and the ".\build\tools\" folder.
+ECHO.
+PAUSE
diff --git a/build/tools/BRC64.exe b/build/tools/BRC64.exe
new file mode 100755
index 000000000..680561758
Binary files /dev/null and b/build/tools/BRC64.exe differ
diff --git a/build/tools/GSF.Core.dll b/build/tools/GSF.Core.dll
new file mode 100644
index 000000000..66a7eb20d
Binary files /dev/null and b/build/tools/GSF.Core.dll differ
diff --git a/build/tools/ReplaceInFiles.exe b/build/tools/ReplaceInFiles.exe
new file mode 100755
index 000000000..b33b7bc7c
Binary files /dev/null and b/build/tools/ReplaceInFiles.exe differ
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..3793cfb11
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,19 @@
+
+
+# GemTem
+### GPA Gemstone Library
+
+The Gemstone GemTem Library organizes all Gemstone functionality related to gemtem.
+
+[![GitHub license](https://img.shields.io/github/license/gemstone/gemtem?color=4CC61E)](https://github.com/gemstone/gemtem/blob/master/LICENSE)
+[![Build status](https://ci.appveyor.com/api/projects/status/ury75mtaq7tj1sp0?svg=true)](https://ci.appveyor.com/project/ritchiecarroll/gemtem)
+
+This library includes helpful gemtem classes like the following:
+
+* [Class](https://gemstone.github.io/gemtem/help/html/T_gemstone_gemtem_Class.htm):
+ * Represents a gemtem class for handling gemtem operations.
+
+Among others.
+
+### Documentation
+[Full Library Documentation](https://gemstone.github.io/gemtem/help)
\ No newline at end of file
diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 000000000..edb55b1f0
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,9 @@
+theme: jekyll-theme-cayman
+title: gemstone.gemtem
+description: GPA Gemstone GemTem Library
+github:
+ repository_name: gemstone.gemtem
+ owner_url: https://www.gridprotectionalliance.org
+ owner_name: Grid Protection Alliance
+plugins:
+ - jemoji
\ No newline at end of file
diff --git a/docs/_includes/anchor_headings.html b/docs/_includes/anchor_headings.html
new file mode 100644
index 000000000..21e2d0473
--- /dev/null
+++ b/docs/_includes/anchor_headings.html
@@ -0,0 +1,105 @@
+{% capture headingsWorkspace %}
+ {% comment %}
+ Version 1.0.4
+ https://github.com/allejo/jekyll-anchor-headings
+
+ "Be the pull request you wish to see in the world." ~Ben Balter
+
+ Usage:
+ {% include anchor_headings.html html=content %}
+
+ Parameters:
+ * html (string) - the HTML of compiled markdown generated by kramdown in Jekyll
+
+ Optional Parameters:
+ * beforeHeading (bool) : false - Set to true if the anchor should be placed _before_ the heading's content
+ * anchorAttrs (string) : '' - Any custom HTML attributes that will be added to the `` tag; you may NOT use `href`, `class` or `title`
+ * anchorBody (string) : '' - The content that will be placed inside the anchor; the `%heading%` placeholder is available
+ * anchorClass (string) : '' - The class(es) that will be used for each anchor. Separate multiple classes with a space
+ * anchorTitle (string) : '' - The `title` attribute that will be used for anchors
+ * h_min (int) : 1 - The minimum header level to build an anchor for; any header lower than this value will be ignored
+ * h_max (int) : 6 - The maximum header level to build an anchor for; any header greater than this value will be ignored
+ * bodyPrefix (string) : '' - Anything that should be inserted inside of the heading tag _before_ its anchor and content
+ * bodySuffix (string) : '' - Anything that should be inserted inside of the heading tag _after_ its anchor and content
+
+ Output:
+ The original HTML with the addition of anchors inside of all of the h1-h6 headings.
+ {% endcomment %}
+
+ {% assign minHeader = include.h_min | default: 1 %}
+ {% assign maxHeader = include.h_max | default: 6 %}
+ {% assign beforeHeading = include.beforeHeading %}
+ {% assign nodes = include.html | split: '
+ {% if headerLevel == 0 %}
+ {% if nextChar != '<' and nextChar != '' %}
+ {% capture node %}' | first }}>{% endcapture %}
+ {% assign header = _workspace[0] | replace: _hAttrToStrip, '' %}
+
+
+ {% capture anchor %}{% endcapture %}
+
+ {% if html_id and headerLevel >= minHeader and headerLevel <= maxHeader %}
+ {% capture anchor %}href="#{{ html_id }}"{% endcapture %}
+
+ {% if include.anchorClass %}
+ {% capture anchor %}{{ anchor }} class="{{ include.anchorClass }}"{% endcapture %}
+ {% endif %}
+
+ {% if include.anchorTitle %}
+ {% capture anchor %}{{ anchor }} title="{{ include.anchorTitle | replace: '%heading%', header }}"{% endcapture %}
+ {% endif %}
+
+ {% if include.anchorAttrs %}
+ {% capture anchor %}{{ anchor }} {{ include.anchorAttrs }}{% endcapture %}
+ {% endif %}
+
+ {% capture anchor %}{{ include.anchorBody | replace: '%heading%', header | default: '' }} {% endcapture %}
+
+
+ {% if beforeHeading %}
+ {% capture anchor %}{{ anchor }} {% endcapture %}
+ {% else %}
+ {% capture anchor %} {{ anchor }}{% endcapture %}
+ {% endif %}
+ {% endif %}
+
+ {% capture new_heading %}
+
+
+
+{% endcomment %}
+
+
+
+
+ {% if site.google_analytics %}
+
+
+ {% endif %}
+
+
+{% seo %}
+
+
+
+
+
+
+
+
+
+
+ {% include anchor_headings.html html=content %}
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/coding-style.md b/docs/coding-style.md
new file mode 100644
index 000000000..6794a7b78
--- /dev/null
+++ b/docs/coding-style.md
@@ -0,0 +1,26 @@
+# C# Coding Style
+
+We follow a similar coding style as [dotnet/runtime](https://github.com/dotnet/runtime).
+
+For non code files (xml, etc), our current best guidance is consistency. When editing files, keep new code and changes consistent with the style in the files. For new files, it should conform to the style for that component. If there is a completely new component, anything that is reasonably broadly accepted is fine.
+
+The general rule we follow is "_use Visual Studio defaults_".
+
+1. We use [Allman style](http://en.wikipedia.org/wiki/Indent_style#Allman_style) braces, where each brace begins on a new line. A single line statement block can go without braces but the block must be properly indented on its own line and must not be nested in other statement blocks that use braces. One exception is that a `using` statement is permitted to be nested within another `using` statement by starting on the following line at the same indentation level, even if the nested `using` contains a controlled block.
+2. We use four spaces of indentation (no tabs).
+3. We use `m_camelCase` for internal and private fields and use `readonly` where possible. Prefix internal and private member (instance) fields with `m_`, static fields with `s_` and thread static fields with `t_`. When used on static fields, `readonly` should come after `static` (e.g. `static readonly` not `readonly static`). Public fields should be used sparingly and should use PascalCasing with no prefix when used.
+4. We avoid `this.` unless absolutely necessary.
+5. We always specify the visibility, even if it's the default (e.g. `private string m_foo` not `string m_foo`). Visibility should be the first modifier (e.g. `public abstract` not `abstract public`).
+6. Namespace imports should be specified at the top of the file, *outside* of `namespace` declarations, and should be sorted alphabetically, with the exception of `System.*` namespaces, which are to be placed on top of all others.
+7. Avoid more than one empty line at any time. For example, do not have two blank lines between members of a type.
+8. Avoid spurious free spaces. For example avoid `if (someVar == 0)...`, where the dots mark the spurious free spaces. Consider enabling "View White Space (Ctrl+E, S)" if using Visual Studio to aid detection.
+9. If a file happens to differ in style from these guidelines (e.g. private members are named `_member` rather than `m_member`), the existing style in that file takes precedence.
+10. Alway use actual type names, we only use `var` when it's required because the actual type is unknown or is run-time deferred.
+11. We use language keywords instead of BCL types (e.g. `int, string, float` instead of `Int32, String, Single`, etc) for both type references as well as method calls (e.g. `int.Parse` instead of `Int32.Parse`).
+12. We use PascalCasing to name all our constant local variables and fields. The only exception is for interop code where the constant value should exactly match the name and value of the code you are calling via interop.
+13. We use ```nameof(...)``` instead of ```"..."``` whenever possible and relevant.
+14. Fields should be specified at the top within type declarations.
+15. When including non-ASCII characters in the source code use Unicode escape sequences (\uXXXX) instead of literal characters. Literal non-ASCII characters occasionally get garbled by a tool or editor.
+16. When using #region sections or labels (for goto), indent the item one less than the current indentation.
+
+An [EditorConfig](https://editorconfig.org "EditorConfig homepage") file (`.editorconfig`) has been provided at the root of the repository, enabling C# auto-formatting.
diff --git a/docs/help/SearchHelp.aspx b/docs/help/SearchHelp.aspx
new file mode 100644
index 000000000..6e2a17b6a
--- /dev/null
+++ b/docs/help/SearchHelp.aspx
@@ -0,0 +1,233 @@
+<%@ Page Language="C#" EnableViewState="False" %>
+
+
diff --git a/docs/help/SearchHelp.inc.php b/docs/help/SearchHelp.inc.php
new file mode 100644
index 000000000..b905e130c
--- /dev/null
+++ b/docs/help/SearchHelp.inc.php
@@ -0,0 +1,173 @@
+
+// Contributed to the Sandcastle Help File Builder project by Thomas Levesque
+
+class Ranking
+{
+ public $filename;
+ public $pageTitle;
+ public $rank;
+
+ function __construct($file, $title, $rank)
+ {
+ $this->filename = $file;
+ $this->pageTitle = $title;
+ $this->rank = $rank;
+ }
+}
+
+
+///
+/// Split the search text up into keywords
+///
+/// The keywords to parse
+/// A list containing the words for which to search
+function ParseKeywords($keywords)
+{
+ $keywordList = array();
+ $words = preg_split("/[^\w]+/", $keywords);
+
+ foreach($words as $word)
+ {
+ $checkWord = strtolower($word);
+ $first = substr($checkWord, 0, 1);
+ if(strlen($checkWord) > 2 && !ctype_digit($first) && !in_array($checkWord, $keywordList))
+ {
+ array_push($keywordList, $checkWord);
+ }
+ }
+
+ return $keywordList;
+}
+
+
+///
+/// Search for the specified keywords and return the results as a block of
+/// HTML.
+///
+/// The keywords for which to search
+/// The file list
+/// The dictionary used to find the words
+/// True to sort by title, false to sort by
+/// ranking
+/// A block of HTML representing the search results.
+function Search($keywords, $fileInfo, $wordDictionary, $sortByTitle)
+{
+ $sb = "";
+ $matches = array();
+ $matchingFileIndices = array();
+ $rankings = array();
+
+ $isFirst = true;
+
+ foreach($keywords as $word)
+ {
+ if (!array_key_exists($word, $wordDictionary))
+ {
+ return "Nothing found ";
+ }
+ $occurrences = $wordDictionary[$word];
+
+ $matches[$word] = $occurrences;
+ $occurrenceIndices = array();
+
+ // Get a list of the file indices for this match
+ foreach($occurrences as $entry)
+ array_push($occurrenceIndices, ($entry >> 16));
+
+ if($isFirst)
+ {
+ $isFirst = false;
+ foreach($occurrenceIndices as $i)
+ {
+ array_push($matchingFileIndices, $i);
+ }
+ }
+ else
+ {
+ // After the first match, remove files that do not appear for
+ // all found keywords.
+ for($idx = 0; $idx < count($matchingFileIndices); $idx++)
+ {
+ if (!in_array($matchingFileIndices[$idx], $occurrenceIndices))
+ {
+ array_splice($matchingFileIndices, $idx, 1);
+ $idx--;
+ }
+ }
+ }
+ }
+
+ if(count($matchingFileIndices) == 0)
+ {
+ return "Nothing found ";
+ }
+
+ // Rank the files based on the number of times the words occurs
+ foreach($matchingFileIndices as $index)
+ {
+ // Split out the title, filename, and word count
+ $fileIndex = explode("\x00", $fileInfo[$index]);
+
+ $title = $fileIndex[0];
+ $filename = $fileIndex[1];
+ $wordCount = intval($fileIndex[2]);
+ $matchCount = 0;
+
+ foreach($keywords as $words)
+ {
+ $occurrences = $matches[$word];
+
+ foreach($occurrences as $entry)
+ {
+ if(($entry >> 16) == $index)
+ $matchCount += $entry & 0xFFFF;
+ }
+ }
+
+ $r = new Ranking($filename, $title, $matchCount * 1000 / $wordCount);
+ array_push($rankings, $r);
+
+ if(count($rankings) > 99)
+ break;
+ }
+
+ // Sort by rank in descending order or by page title in ascending order
+ if($sortByTitle)
+ {
+ usort($rankings, "cmprankbytitle");
+ }
+ else
+ {
+ usort($rankings, "cmprank");
+ }
+
+ // Format the file list and return the results
+ foreach($rankings as $r)
+ {
+ $f = $r->filename;
+ $t = $r->pageTitle;
+ $sb .= "$t ";
+ }
+
+ $sb .= " Omitted $c more results
";
+ }
+
+ return $sb;
+}
+
+function cmprank($x, $y)
+{
+ return $y->rank - $x->rank;
+}
+
+function cmprankbytitle($x, $y)
+{
+ return strcmp($x->pageTitle, $y->pageTitle);
+}
+
+?>
diff --git a/docs/help/SearchHelp.php b/docs/help/SearchHelp.php
new file mode 100644
index 000000000..eaa1e117f
--- /dev/null
+++ b/docs/help/SearchHelp.php
@@ -0,0 +1,58 @@
+
+// Contributed to the Sandcastle Help File Builder project by Thomas Levesque
+
+include("SearchHelp.inc.php");
+
+ $sortByTitle = false;
+
+ // The keywords for which to search should be passed in the query string
+ $searchText = $_GET["Keywords"];
+
+ if(empty($searchText))
+ {
+ ?>
+ Nothing found
+
+ return;
+ }
+
+ // An optional SortByTitle option can also be specified
+ if($_GET["SortByTitle"] == "true")
+ $sortByTitle = true;
+
+ $keywords = ParseKeywords($searchText);
+ $letters = array();
+ $wordDictionary = array();
+
+ // Load the file index
+ $json = file_get_contents("fti/FTI_Files.json");
+ $fileList = json_decode($json);
+
+ // Load the required word index files
+ foreach($keywords as $word)
+ {
+ $letter = substr($word, 0, 1);
+
+ if(!in_array($letter, $letters))
+ {
+ array_push($letters, $letter);
+ $ascii = ord($letter);
+ $ftiFile = "fti/FTI_$ascii.json";
+
+ if(file_exists($ftiFile))
+ {
+ $json = file_get_contents($ftiFile);
+ $ftiWords = json_decode($json, true);
+
+ foreach($ftiWords as $ftiWord => $val)
+ {
+ $wordDictionary[$ftiWord] = $val;
+ }
+ }
+ }
+ }
+
+ // Perform the search and return the results as a block of HTML
+ $results = Search($keywords, $fileList, $wordDictionary, $sortByTitle);
+ echo $results;
+?>
\ No newline at end of file
diff --git a/docs/help/Web.Config b/docs/help/Web.Config
new file mode 100644
index 000000000..f0f3e6cb6
--- /dev/null
+++ b/docs/help/Web.Config
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/help/WebKI.xml b/docs/help/WebKI.xml
new file mode 100644
index 000000000..e5e54dd0b
--- /dev/null
+++ b/docs/help/WebKI.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/help/WebTOC.xml b/docs/help/WebTOC.xml
new file mode 100644
index 000000000..631f03ea5
--- /dev/null
+++ b/docs/help/WebTOC.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/help/fti/FTI_100.json b/docs/help/fti/FTI_100.json
new file mode 100644
index 000000000..cd738f018
--- /dev/null
+++ b/docs/help/fti/FTI_100.json
@@ -0,0 +1 @@
+{"description":[196609,393218,458753],"documentation":[196609,327681,393217,458753,524290],"dll":[327681,393217],"determines":[196609,393217],"default":[1,196609,393217],"development":[524289]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_101.json b/docs/help/fti/FTI_101.json
new file mode 100644
index 000000000..1da24a312
--- /dev/null
+++ b/docs/help/fti/FTI_101.json
@@ -0,0 +1 @@
+{"electric":[524290],"equals":[196609,393217],"error":[131074],"expand":[524289],"extend":[524289],"expression":[524289],"expressions":[524290],"exposes":[196609,393217],"envisioning":[524289],"example":[327681,393217],"equal":[196609,393217],"entered":[262145]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_102.json b/docs/help/fti/FTI_102.json
new file mode 100644
index 000000000..70665c63b
--- /dev/null
+++ b/docs/help/fti/FTI_102.json
@@ -0,0 +1 @@
+{"follow":[1],"function":[196609,327681,393218],"following":[196609,393217],"framework":[524289],"finalize":[196609,393217],"free":[196609,393217],"functionality":[458753,524291],"file":[196609,327681,393217,458753,524289],"focused":[524289]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_103.json b/docs/help/fti/FTI_103.json
new file mode 100644
index 000000000..dcab68430
--- /dev/null
+++ b/docs/help/fti/FTI_103.json
@@ -0,0 +1 @@
+{"gems":[524289],"gemtem":[65537,131073,196610,262145,327686,393225,458759,524292],"gettype":[196609,393217],"gemstone":[65537,131073,196610,262145,327686,393224,458756,524299],"grid":[196609,327681,393217,458753,524291],"gethashcode":[196609,393217],"generated":[196609,327681,393217,458753,524289],"gpa":[196609,327681,393217,458753,524290],"gets":[196609,393217],"gsf":[524289],"garbage":[196609,393217],"general":[131073]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_104.json b/docs/help/fti/FTI_104.json
new file mode 100644
index 000000000..62ff348e0
--- /dev/null
+++ b/docs/help/fti/FTI_104.json
@@ -0,0 +1 @@
+{"hash":[196609,393217],"help":[196609,327681,393217,458753,524289],"hundreds":[524289],"hierarchy":[393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_105.json b/docs/help/fti/FTI_105.json
new file mode 100644
index 000000000..7cf70a0d2
--- /dev/null
+++ b/docs/help/fti/FTI_105.json
@@ -0,0 +1 @@
+{"instance":[196609,327681,393218],"initializes":[327681,393217],"inheritance":[393217],"inherited":[196614,393222],"including":[524289],"industry":[524289],"includes":[458753]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_106.json b/docs/help/fti/FTI_106.json
new file mode 100644
index 000000000..bccf0e88a
--- /dev/null
+++ b/docs/help/fti/FTI_106.json
@@ -0,0 +1 @@
+{"javascript":[327681,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_108.json b/docs/help/fti/FTI_108.json
new file mode 100644
index 000000000..c6c2f1bb3
--- /dev/null
+++ b/docs/help/fti/FTI_108.json
@@ -0,0 +1 @@
+{"library":[65537,131073,196609,262145,327681,393218,458755,524291],"locate":[262145],"long":[524289],"large":[524289],"looking":[262145],"libraries":[524294],"link":[1],"load":[131073],"longer":[262145]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_109.json b/docs/help/fti/FTI_109.json
new file mode 100644
index 000000000..484011235
--- /dev/null
+++ b/docs/help/fti/FTI_109.json
@@ -0,0 +1 @@
+{"memberwiseclone":[196609,393217],"maintained":[524289],"methods":[196610,393217,524289],"misspelled":[262145],"members":[196609,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_110.json b/docs/help/fti/FTI_110.json
new file mode 100644
index 000000000..8e8e9a463
--- /dev/null
+++ b/docs/help/fti/FTI_110.json
@@ -0,0 +1 @@
+{"net":[524291],"namespace":[196609,327682,393218,458755],"new":[327682,393218,458753]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_111.json b/docs/help/fti/FTI_111.json
new file mode 100644
index 000000000..8452b3241
--- /dev/null
+++ b/docs/help/fti/FTI_111.json
@@ -0,0 +1 @@
+{"object":[196619,393228],"occurred":[131073],"operations":[196609,393217],"organizes":[458753,524290],"open":[524291]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_112.json b/docs/help/fti/FTI_112.json
new file mode 100644
index 000000000..88a80873e
--- /dev/null
+++ b/docs/help/fti/FTI_112.json
@@ -0,0 +1 @@
+{"parsers":[524289],"perform":[196609,393217],"provided":[524289],"protection":[196609,327681,393217,458753,524290],"power":[524290],"projects":[524289],"persists":[131073],"project":[524289],"parsing":[524289],"packages":[524289],"page":[131073,262148],"protocol":[524289],"public":[327683,393219]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_114.json b/docs/help/fti/FTI_114.json
new file mode 100644
index 000000000..ec7d5bf99
--- /dev/null
+++ b/docs/help/fti/FTI_114.json
@@ -0,0 +1 @@
+{"represent":[524289],"related":[458753,524290],"returns":[196609,393217],"requested":[262145],"request":[327681,393217],"represents":[196609,393217],"reference":[196609,327681,393217],"redirected":[1],"reclaimed":[196609,393217],"resources":[196609,393217],"root":[458753],"ref":[393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_115.json b/docs/help/fti/FTI_115.json
new file mode 100644
index 000000000..3dd67f19f
--- /dev/null
+++ b/docs/help/fti/FTI_115.json
@@ -0,0 +1 @@
+{"sub":[327681],"syntax":[327681,393217],"sorry":[131073,262145],"system":[393217],"sandcastle":[196609,327681,393217,458753,524289],"source":[327681,393217,524291],"serves":[196609,393217],"send":[196609,327681,393217,458753,524289],"solutions":[524289],"sample":[393217,458753],"search":[65537,262145],"string":[196609,393217],"shallow":[196609,393217],"support":[196609,327681,393217,458753,524289],"site":[131073],"sort":[65537],"specified":[196609,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_116.json b/docs/help/fti/FTI_116.json
new file mode 100644
index 000000000..a312b052d
--- /dev/null
+++ b/docs/help/fti/FTI_116.json
@@ -0,0 +1 @@
+{"typo":[262145],"tools":[524289],"title":[65537],"type":[196610,393219],"top":[196609,262145,393218],"topic":[1,196609,327681,393217,458753,524289],"tostring":[196609,393217],"threading":[524290],"try":[131073,196609,262145,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_117.json b/docs/help/fti/FTI_117.json
new file mode 100644
index 000000000..71c59357b
--- /dev/null
+++ b/docs/help/fti/FTI_117.json
@@ -0,0 +1 @@
+{"utilities":[524289],"useful":[524292],"used":[524289],"url":[262145]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_118.json b/docs/help/fti/FTI_118.json
new file mode 100644
index 000000000..93ceaf8a5
--- /dev/null
+++ b/docs/help/fti/FTI_118.json
@@ -0,0 +1 @@
+{"various":[524289],"version":[327681,393217],"variety":[524289],"view":[327681,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_119.json b/docs/help/fti/FTI_119.json
new file mode 100644
index 000000000..b7cffdd91
--- /dev/null
+++ b/docs/help/fti/FTI_119.json
@@ -0,0 +1 @@
+{"worldwide":[524289],"web":[262145]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_97.json b/docs/help/fti/FTI_97.json
new file mode 100644
index 000000000..5ee8ec563
--- /dev/null
+++ b/docs/help/fti/FTI_97.json
@@ -0,0 +1 @@
+{"alliance":[196609,327681,393217,458753,524290],"assembly":[327681,393217],"automatically":[1],"administrator":[131073],"address":[262145],"available":[262145],"allows":[196609,393217]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_98.json b/docs/help/fti/FTI_98.json
new file mode 100644
index 000000000..609c9d9ff
--- /dev/null
+++ b/docs/help/fti/FTI_98.json
@@ -0,0 +1 @@
+{"box":[262145],"builder":[196609,327681,393217,458753,524289],"best":[524289],"based":[524289]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_99.json b/docs/help/fti/FTI_99.json
new file mode 100644
index 000000000..eca7796c8
--- /dev/null
+++ b/docs/help/fti/FTI_99.json
@@ -0,0 +1 @@
+{"copy":[196609,327681,393218],"commonly":[524289],"createclass":[393217],"creates":[196609,393217],"current":[196612,393220],"contain":[262145,524289],"contact":[131073],"comments":[196609,327681,393217,458753,524289],"class":[196612,327688,393232,458756,524289],"cleanup":[196609,393217],"code":[524290],"continuous":[524289],"check":[262145],"copyright":[196609,327681,393217,458753,524289],"common":[458753],"constructor":[327681],"constructors":[393217],"classes":[458754,524289],"collection":[196609,393217,524290]}
\ No newline at end of file
diff --git a/docs/help/fti/FTI_Files.json b/docs/help/fti/FTI_Files.json
new file mode 100644
index 000000000..6aa07dfa2
--- /dev/null
+++ b/docs/help/fti/FTI_Files.json
@@ -0,0 +1 @@
+["Gemstone GemTem Library - Redirect\u0000index.html\u000018","Gemstone GemTem Library - Search\u0000search.html\u000012","General Error\u0000html/GeneralError.htm\u000033","Class Methods\u0000html/Methods_T_gemstone_gemtem_Class.htm\u0000166","Page Not Found\u0000html/PageNotFound.htm\u000067","Class Constructor\u0000html/M_gemstone_gemtem_Class__ctor.htm\u0000104","Class Class\u0000html/T_gemstone_gemtem_Class.htm\u0000254","gemstone.gemtem Namespace\u0000html/N_gemstone_gemtem.htm\u000073","Gemstone GemTem Library Documentation\u0000html/gemstone.htm\u0000216"]
\ No newline at end of file
diff --git a/docs/help/gemstone.gemtem.xml b/docs/help/gemstone.gemtem.xml
new file mode 100644
index 000000000..8633bcb3e
--- /dev/null
+++ b/docs/help/gemstone.gemtem.xml
@@ -0,0 +1,22 @@
+
+
+
+ gemstone.gemtem
+
+
+
+
+ Sample class for new GemTem library.
+
+
+
+
+
+
+ gemstone.gemtem.Class
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/help/html/GeneralError.htm b/docs/help/html/GeneralError.htm
new file mode 100644
index 000000000..fa78bb5c7
--- /dev/null
+++ b/docs/help/html/GeneralError.htm
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+ General Error
+
+
+
+
+
+
+
+
+
+
+
+
We're sorry, a general error has occurred.
+
Please try to load the page again. If the error persists, please contact the site administrator.
+
+
+
+
diff --git a/docs/help/html/M_gemstone_gemtem_Class__ctor.htm b/docs/help/html/M_gemstone_gemtem_Class__ctor.htm
new file mode 100644
index 000000000..f364a61d0
--- /dev/null
+++ b/docs/help/html/M_gemstone_gemtem_Class__ctor.htm
@@ -0,0 +1,27 @@
+Class Constructor Class Constructor
Initializes a new instance of the
Class class
+
Namespace:
+
gemstone.gemtem
+
Assembly:
+ gemstone.gemtem (in gemstone.gemtem.dll) Version: 1.0.0
Syntax See Also
\ No newline at end of file
diff --git a/docs/help/html/Methods_T_gemstone_gemtem_Class.htm b/docs/help/html/Methods_T_gemstone_gemtem_Class.htm
new file mode 100644
index 000000000..e807358a8
--- /dev/null
+++ b/docs/help/html/Methods_T_gemstone_gemtem_Class.htm
@@ -0,0 +1,10 @@
+Class Methods Class Methods
The Class type exposes the following members.
Methods
+
+ Name Description Equals Determines whether the specified object is equal to the current object.
(Inherited from Object .)Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object .)GetHashCode Serves as the default hash function.
(Inherited from Object .)GetType Gets the
Type of the current instance.
(Inherited from Object .)MemberwiseClone Creates a shallow copy of the current
Object .
(Inherited from Object .)ToString Returns a string that represents the current object.
(Inherited from Object .)
Top See Also
\ No newline at end of file
diff --git a/docs/help/html/N_gemstone_gemtem.htm b/docs/help/html/N_gemstone_gemtem.htm
new file mode 100644
index 000000000..987666d76
--- /dev/null
+++ b/docs/help/html/N_gemstone_gemtem.htm
@@ -0,0 +1,16 @@
+gemstone.gemtem Namespace gemstone.gemtem Namespace
+ The
gemstone.gemtem namespace organizes all Gemstone library functionality
+ related to gemtem. The root gemtem namespace also includes common gemtem classes,
+ e.g.,
Class .
+
Classes
+
+ Class Description Class
+ Sample class for new GemTem library.
+
\ No newline at end of file
diff --git a/docs/help/html/PageNotFound.htm b/docs/help/html/PageNotFound.htm
new file mode 100644
index 000000000..51960c62c
--- /dev/null
+++ b/docs/help/html/PageNotFound.htm
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+ Page Not Found
+
+
+
+
+
+
+
+
+
+
+
+
We're sorry, the page you requested cannot be found.
+
The URL might be misspelled or the page you are looking for is no longer available. If you entered
+the web address, check that it doesn't contain a typo. You can use the search box at the top of the page to
+try and locate the page.
+
+
+
+
diff --git a/docs/help/html/T_gemstone_gemtem_Class.htm b/docs/help/html/T_gemstone_gemtem_Class.htm
new file mode 100644
index 000000000..2d4861dd5
--- /dev/null
+++ b/docs/help/html/T_gemstone_gemtem_Class.htm
@@ -0,0 +1,35 @@
+Class Class Class Class
+ Sample class for new GemTem library.
+
Inheritance Hierarchy
+
Namespace:
+
gemstone.gemtem
+
Assembly:
+ gemstone.gemtem (in gemstone.gemtem.dll) Version: 1.0.0
SyntaxThe Class type exposes the following members.
Constructors
+
+ Name Description Class Initializes a new instance of the Class class
Top Methods
+
+ Name Description Equals Determines whether the specified object is equal to the current object.
(Inherited from Object .)Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
(Inherited from Object .)GetHashCode Serves as the default hash function.
(Inherited from Object .)GetType Gets the
Type of the current instance.
(Inherited from Object .)MemberwiseClone Creates a shallow copy of the current
Object .
(Inherited from Object .)ToString Returns a string that represents the current object.
(Inherited from Object .)
Top See Also
\ No newline at end of file
diff --git a/docs/help/html/gemstone.htm b/docs/help/html/gemstone.htm
new file mode 100644
index 000000000..f3ade09a8
--- /dev/null
+++ b/docs/help/html/gemstone.htm
@@ -0,0 +1,52 @@
+Gemstone GemTem Library Documentation Gemstone GemTem Library Documentation
+ The Gemstone GemTem Library is a useful collection of open source classes and methods for gemtem.
+
+
+
+
About the Gemstone Libraries
+
+ The
+ Gemstone Libraries , maintained by the
+ Grid Protection Alliance (GPA), are a collection of useful open source .NET code based on
+ continuous development since 2004 .
+
+
+ These packages represent a focused re-envisioning of the best libraries, i.e., the "gems", from the
+ Grid Solutions Framework
+ (GSF), which has long been in use by various open source projects and electric power utilities worldwide.
+
+
+ The Gemstone Libraries contain a large variety of code useful for any .NET project with of hundreds of class libraries that extend or expand the functionality provided with .NET,
+ including many tools and protocol parsers that are useful for the electric power industry. Below are a few of the more commonly used Gemstone libraries:
+
+
+
+
+ gemstone.threading
+
+ organizes all Gemstone functionality related to threading.
+
+
+
+
+ gemstone.expressions
+
+ organizes all Gemstone functionality related to expressions and expression parsing.
+
+
+
+
\ No newline at end of file
diff --git a/docs/help/icons/AlertCaution.png b/docs/help/icons/AlertCaution.png
new file mode 100644
index 000000000..78f246f04
Binary files /dev/null and b/docs/help/icons/AlertCaution.png differ
diff --git a/docs/help/icons/AlertNote.png b/docs/help/icons/AlertNote.png
new file mode 100644
index 000000000..dc7633374
Binary files /dev/null and b/docs/help/icons/AlertNote.png differ
diff --git a/docs/help/icons/AlertSecurity.png b/docs/help/icons/AlertSecurity.png
new file mode 100644
index 000000000..d40fcefc4
Binary files /dev/null and b/docs/help/icons/AlertSecurity.png differ
diff --git a/docs/help/icons/CFW.gif b/docs/help/icons/CFW.gif
new file mode 100644
index 000000000..cbcabf1b2
Binary files /dev/null and b/docs/help/icons/CFW.gif differ
diff --git a/docs/help/icons/CodeExample.png b/docs/help/icons/CodeExample.png
new file mode 100644
index 000000000..a3b9fba4c
Binary files /dev/null and b/docs/help/icons/CodeExample.png differ
diff --git a/docs/help/icons/Search.png b/docs/help/icons/Search.png
new file mode 100644
index 000000000..42165b6d6
Binary files /dev/null and b/docs/help/icons/Search.png differ
diff --git a/docs/help/icons/SectionCollapsed.png b/docs/help/icons/SectionCollapsed.png
new file mode 100644
index 000000000..8ded1ebc6
Binary files /dev/null and b/docs/help/icons/SectionCollapsed.png differ
diff --git a/docs/help/icons/SectionExpanded.png b/docs/help/icons/SectionExpanded.png
new file mode 100644
index 000000000..b693921cc
Binary files /dev/null and b/docs/help/icons/SectionExpanded.png differ
diff --git a/docs/help/icons/TocClose.gif b/docs/help/icons/TocClose.gif
new file mode 100644
index 000000000..e6d7b5edc
Binary files /dev/null and b/docs/help/icons/TocClose.gif differ
diff --git a/docs/help/icons/TocCollapsed.gif b/docs/help/icons/TocCollapsed.gif
new file mode 100644
index 000000000..108d49238
Binary files /dev/null and b/docs/help/icons/TocCollapsed.gif differ
diff --git a/docs/help/icons/TocExpanded.gif b/docs/help/icons/TocExpanded.gif
new file mode 100644
index 000000000..f774d9bb6
Binary files /dev/null and b/docs/help/icons/TocExpanded.gif differ
diff --git a/docs/help/icons/TocOpen.gif b/docs/help/icons/TocOpen.gif
new file mode 100644
index 000000000..4992a98a2
Binary files /dev/null and b/docs/help/icons/TocOpen.gif differ
diff --git a/docs/help/icons/favicon.ico b/docs/help/icons/favicon.ico
new file mode 100644
index 000000000..62034a97a
Binary files /dev/null and b/docs/help/icons/favicon.ico differ
diff --git a/docs/help/icons/gemstone-square-48.png b/docs/help/icons/gemstone-square-48.png
new file mode 100644
index 000000000..4ad4a974b
Binary files /dev/null and b/docs/help/icons/gemstone-square-48.png differ
diff --git a/docs/help/icons/help.png b/docs/help/icons/help.png
new file mode 100644
index 000000000..945e89fb9
Binary files /dev/null and b/docs/help/icons/help.png differ
diff --git a/docs/help/icons/privclass.gif b/docs/help/icons/privclass.gif
new file mode 100644
index 000000000..0939694ce
Binary files /dev/null and b/docs/help/icons/privclass.gif differ
diff --git a/docs/help/icons/privdelegate.gif b/docs/help/icons/privdelegate.gif
new file mode 100644
index 000000000..d3aa8a65e
Binary files /dev/null and b/docs/help/icons/privdelegate.gif differ
diff --git a/docs/help/icons/privenumeration.gif b/docs/help/icons/privenumeration.gif
new file mode 100644
index 000000000..47f387ec2
Binary files /dev/null and b/docs/help/icons/privenumeration.gif differ
diff --git a/docs/help/icons/privevent.gif b/docs/help/icons/privevent.gif
new file mode 100644
index 000000000..30db46df7
Binary files /dev/null and b/docs/help/icons/privevent.gif differ
diff --git a/docs/help/icons/privextension.gif b/docs/help/icons/privextension.gif
new file mode 100644
index 000000000..51dd267f0
Binary files /dev/null and b/docs/help/icons/privextension.gif differ
diff --git a/docs/help/icons/privfield.gif b/docs/help/icons/privfield.gif
new file mode 100644
index 000000000..cbf70f7a3
Binary files /dev/null and b/docs/help/icons/privfield.gif differ
diff --git a/docs/help/icons/privinterface.gif b/docs/help/icons/privinterface.gif
new file mode 100644
index 000000000..f3b7950ad
Binary files /dev/null and b/docs/help/icons/privinterface.gif differ
diff --git a/docs/help/icons/privmethod.gif b/docs/help/icons/privmethod.gif
new file mode 100644
index 000000000..71f882264
Binary files /dev/null and b/docs/help/icons/privmethod.gif differ
diff --git a/docs/help/icons/privproperty.gif b/docs/help/icons/privproperty.gif
new file mode 100644
index 000000000..b1e807465
Binary files /dev/null and b/docs/help/icons/privproperty.gif differ
diff --git a/docs/help/icons/privstructure.gif b/docs/help/icons/privstructure.gif
new file mode 100644
index 000000000..ed6d1ef68
Binary files /dev/null and b/docs/help/icons/privstructure.gif differ
diff --git a/docs/help/icons/protclass.gif b/docs/help/icons/protclass.gif
new file mode 100644
index 000000000..0f9294292
Binary files /dev/null and b/docs/help/icons/protclass.gif differ
diff --git a/docs/help/icons/protdelegate.gif b/docs/help/icons/protdelegate.gif
new file mode 100644
index 000000000..b209f2d81
Binary files /dev/null and b/docs/help/icons/protdelegate.gif differ
diff --git a/docs/help/icons/protenumeration.gif b/docs/help/icons/protenumeration.gif
new file mode 100644
index 000000000..cc96bb635
Binary files /dev/null and b/docs/help/icons/protenumeration.gif differ
diff --git a/docs/help/icons/protevent.gif b/docs/help/icons/protevent.gif
new file mode 100644
index 000000000..0e510b272
Binary files /dev/null and b/docs/help/icons/protevent.gif differ
diff --git a/docs/help/icons/protextension.gif b/docs/help/icons/protextension.gif
new file mode 100644
index 000000000..dcd07f5e1
Binary files /dev/null and b/docs/help/icons/protextension.gif differ
diff --git a/docs/help/icons/protfield.gif b/docs/help/icons/protfield.gif
new file mode 100644
index 000000000..9ae6833e0
Binary files /dev/null and b/docs/help/icons/protfield.gif differ
diff --git a/docs/help/icons/protinterface.gif b/docs/help/icons/protinterface.gif
new file mode 100644
index 000000000..a1b96d2c6
Binary files /dev/null and b/docs/help/icons/protinterface.gif differ
diff --git a/docs/help/icons/protmethod.gif b/docs/help/icons/protmethod.gif
new file mode 100644
index 000000000..2bc946873
Binary files /dev/null and b/docs/help/icons/protmethod.gif differ
diff --git a/docs/help/icons/protoperator.gif b/docs/help/icons/protoperator.gif
new file mode 100644
index 000000000..2cb75ab8b
Binary files /dev/null and b/docs/help/icons/protoperator.gif differ
diff --git a/docs/help/icons/protproperty.gif b/docs/help/icons/protproperty.gif
new file mode 100644
index 000000000..55473d16e
Binary files /dev/null and b/docs/help/icons/protproperty.gif differ
diff --git a/docs/help/icons/protstructure.gif b/docs/help/icons/protstructure.gif
new file mode 100644
index 000000000..af356a1db
Binary files /dev/null and b/docs/help/icons/protstructure.gif differ
diff --git a/docs/help/icons/pubclass.gif b/docs/help/icons/pubclass.gif
new file mode 100644
index 000000000..1a968ab63
Binary files /dev/null and b/docs/help/icons/pubclass.gif differ
diff --git a/docs/help/icons/pubdelegate.gif b/docs/help/icons/pubdelegate.gif
new file mode 100644
index 000000000..0a43eb261
Binary files /dev/null and b/docs/help/icons/pubdelegate.gif differ
diff --git a/docs/help/icons/pubenumeration.gif b/docs/help/icons/pubenumeration.gif
new file mode 100644
index 000000000..46888adef
Binary files /dev/null and b/docs/help/icons/pubenumeration.gif differ
diff --git a/docs/help/icons/pubevent.gif b/docs/help/icons/pubevent.gif
new file mode 100644
index 000000000..b9226da8b
Binary files /dev/null and b/docs/help/icons/pubevent.gif differ
diff --git a/docs/help/icons/pubextension.gif b/docs/help/icons/pubextension.gif
new file mode 100644
index 000000000..6262d1cca
Binary files /dev/null and b/docs/help/icons/pubextension.gif differ
diff --git a/docs/help/icons/pubfield.gif b/docs/help/icons/pubfield.gif
new file mode 100644
index 000000000..5aed17576
Binary files /dev/null and b/docs/help/icons/pubfield.gif differ
diff --git a/docs/help/icons/pubinterface.gif b/docs/help/icons/pubinterface.gif
new file mode 100644
index 000000000..c38a4c46a
Binary files /dev/null and b/docs/help/icons/pubinterface.gif differ
diff --git a/docs/help/icons/pubmethod.gif b/docs/help/icons/pubmethod.gif
new file mode 100644
index 000000000..2c72988f5
Binary files /dev/null and b/docs/help/icons/pubmethod.gif differ
diff --git a/docs/help/icons/puboperator.gif b/docs/help/icons/puboperator.gif
new file mode 100644
index 000000000..0ebe10a7e
Binary files /dev/null and b/docs/help/icons/puboperator.gif differ
diff --git a/docs/help/icons/pubproperty.gif b/docs/help/icons/pubproperty.gif
new file mode 100644
index 000000000..dfad7b430
Binary files /dev/null and b/docs/help/icons/pubproperty.gif differ
diff --git a/docs/help/icons/pubstructure.gif b/docs/help/icons/pubstructure.gif
new file mode 100644
index 000000000..1344416ab
Binary files /dev/null and b/docs/help/icons/pubstructure.gif differ
diff --git a/docs/help/icons/slMobile.gif b/docs/help/icons/slMobile.gif
new file mode 100644
index 000000000..5edc31f94
Binary files /dev/null and b/docs/help/icons/slMobile.gif differ
diff --git a/docs/help/icons/static.gif b/docs/help/icons/static.gif
new file mode 100644
index 000000000..33723a92b
Binary files /dev/null and b/docs/help/icons/static.gif differ
diff --git a/docs/help/icons/xna.gif b/docs/help/icons/xna.gif
new file mode 100644
index 000000000..9e6a9d4bd
Binary files /dev/null and b/docs/help/icons/xna.gif differ
diff --git a/docs/help/index.html b/docs/help/index.html
new file mode 100644
index 000000000..23563c655
--- /dev/null
+++ b/docs/help/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+ Gemstone GemTem Library - Redirect
+
+
+ If you are not redirected automatically, follow this link to the default topic .
+
+
diff --git a/docs/help/scripts/branding-Website.js b/docs/help/scripts/branding-Website.js
new file mode 100644
index 000000000..dc31b27a8
--- /dev/null
+++ b/docs/help/scripts/branding-Website.js
@@ -0,0 +1,624 @@
+//===============================================================================================================
+// System : Sandcastle Help File Builder
+// File : branding-Website.js
+// Author : Eric Woodruff (Eric@EWoodruff.us)
+// Updated : 03/04/2015
+// Note : Copyright 2014-2015, Eric Woodruff, All rights reserved
+// Portions Copyright 2014 Sam Harwell, All rights reserved
+//
+// This file contains the methods necessary to implement the lightweight TOC and search functionality.
+//
+// This code is published under the Microsoft Public License (Ms-PL). A copy of the license should be
+// distributed with the code. It can also be found at the project website: https://GitHub.com/EWSoftware/SHFB. This
+// notice, the author's name, and all copyright notices must remain intact in all applications, documentation,
+// and source files.
+//
+// Date Who Comments
+// ==============================================================================================================
+// 05/04/2014 EFW Created the code based on a combination of the lightweight TOC code from Sam Harwell and
+// the existing search code from SHFB.
+//===============================================================================================================
+
+// Width of the TOC
+var tocWidth;
+
+// Search method (0 = To be determined, 1 = ASPX, 2 = PHP, anything else = client-side script
+var searchMethod = 0;
+
+// Table of contents script
+
+// Initialize the TOC by restoring its width from the cookie if present
+function InitializeToc()
+{
+ tocWidth = parseInt(GetCookie("TocWidth", "280"));
+ ResizeToc();
+ $(window).resize(SetNavHeight)
+}
+
+function SetNavHeight()
+{
+ $leftNav = $("#leftNav")
+ $topicContent = $("#TopicContent")
+ leftNavPadding = $leftNav.outerHeight() - $leftNav.height()
+ contentPadding = $topicContent.outerHeight() - $topicContent.height()
+ // want outer height of left navigation div to match outer height of content
+ leftNavHeight = $topicContent.outerHeight() - leftNavPadding
+ $leftNav.css("min-height", leftNavHeight + "px")
+}
+
+// Increase the TOC width
+function OnIncreaseToc()
+{
+ if(tocWidth < 1)
+ tocWidth = 280;
+ else
+ tocWidth += 100;
+
+ if(tocWidth > 680)
+ tocWidth = 0;
+
+ ResizeToc();
+ SetCookie("TocWidth", tocWidth);
+}
+
+// Reset the TOC to its default width
+function OnResetToc()
+{
+ tocWidth = 0;
+
+ ResizeToc();
+ SetCookie("TocWidth", tocWidth);
+}
+
+// Resize the TOC width
+function ResizeToc()
+{
+ var toc = document.getElementById("leftNav");
+
+ if(toc)
+ {
+ // Set TOC width
+ toc.style.width = tocWidth + "px";
+
+ var leftNavPadding = 10;
+
+ document.getElementById("TopicContent").style.marginLeft = (tocWidth + leftNavPadding) + "px";
+
+ // Position images
+ document.getElementById("TocResize").style.left = (tocWidth + leftNavPadding) + "px";
+
+ // Hide/show increase TOC width image
+ document.getElementById("ResizeImageIncrease").style.display = (tocWidth >= 680) ? "none" : "";
+
+ // Hide/show reset TOC width image
+ document.getElementById("ResizeImageReset").style.display = (tocWidth < 680) ? "none" : "";
+ }
+
+ SetNavHeight()
+}
+
+// Toggle a TOC entry between its collapsed and expanded state
+function Toggle(item)
+{
+ var isExpanded = $(item).hasClass("tocExpanded");
+
+ $(item).toggleClass("tocExpanded tocCollapsed");
+
+ if(isExpanded)
+ {
+ Collapse($(item).parent());
+ }
+ else
+ {
+ var childrenLoaded = $(item).parent().attr("data-childrenloaded");
+
+ if(childrenLoaded)
+ {
+ Expand($(item).parent());
+ }
+ else
+ {
+ var tocid = $(item).next().attr("tocid");
+
+ $.ajax({
+ url: "../toc/" + tocid + ".xml",
+ async: true,
+ dataType: "xml",
+ success: function(data)
+ {
+ BuildChildren($(item).parent(), data);
+ }
+ });
+ }
+ }
+}
+
+// HTML encode a value for use on the page
+function HtmlEncode(value)
+{
+ // Create an in-memory div, set it's inner text (which jQuery automatically encodes) then grab the encoded
+ // contents back out. The div never exists on the page.
+ return $('
').text(value).html();
+}
+
+// Build the child entries of a TOC entry
+function BuildChildren(tocDiv, data)
+{
+ var childLevel = +tocDiv.attr("data-toclevel") + 1;
+ var childTocLevel = childLevel >= 10 ? 10 : childLevel;
+ var elements = data.getElementsByTagName("HelpTOCNode");
+
+ var isRoot = true;
+
+ if(data.getElementsByTagName("HelpTOC").length == 0)
+ {
+ // The first node is the root node of this group, don't show it again
+ isRoot = false;
+ }
+
+ for(var i = elements.length - 1; i > 0 || (isRoot && i == 0); i--)
+ {
+ var childHRef, childId = elements[i].getAttribute("Url");
+
+ if(childId != null && childId.length > 5)
+ {
+ // The Url attribute has the form "html/{childId}.htm"
+ childHRef = "../" + childId;
+ childId = childId.substring(childId.lastIndexOf("/") + 1, childId.lastIndexOf("."));
+ }
+ else
+ {
+ // The Id attribute is in raw form. There is no URL (empty container node). In this case, we'll
+ // just ignore it and go nowhere. It's a rare case that isn't worth trying to get the first child.
+ // Instead, we'll just expand the node (see below).
+ childHRef = "#";
+ childId = elements[i].getAttribute("Id");
+ }
+
+ var existingItem = null;
+
+ tocDiv.nextAll().each(function()
+ {
+ if(!existingItem && $(this).children().last("a").attr("tocid") == childId)
+ {
+ existingItem = $(this);
+ }
+ });
+
+ if(existingItem != null)
+ {
+ // First move the children of the existing item
+ var existingChildLevel = +existingItem.attr("data-toclevel");
+ var doneMoving = false;
+ var inserter = tocDiv;
+
+ existingItem.nextAll().each(function()
+ {
+ if(!doneMoving && +$(this).attr("data-toclevel") > existingChildLevel)
+ {
+ inserter.after($(this));
+ inserter = $(this);
+ $(this).attr("data-toclevel", +$(this).attr("data-toclevel") + childLevel - existingChildLevel);
+
+ if($(this).hasClass("current"))
+ $(this).attr("class", "toclevel" + (+$(this).attr("data-toclevel") + " current"));
+ else
+ $(this).attr("class", "toclevel" + (+$(this).attr("data-toclevel")));
+ }
+ else
+ {
+ doneMoving = true;
+ }
+ });
+
+ // Now move the existing item itself
+ tocDiv.after(existingItem);
+ existingItem.attr("data-toclevel", childLevel);
+ existingItem.attr("class", "toclevel" + childLevel);
+ }
+ else
+ {
+ var hasChildren = elements[i].getAttribute("HasChildren");
+ var childTitle = HtmlEncode(elements[i].getAttribute("Title"));
+ var expander = "";
+
+ if(hasChildren)
+ expander = " ";
+
+ var text = "";
+
+ tocDiv.after(text);
+ }
+ }
+
+ tocDiv.attr("data-childrenloaded", true);
+}
+
+// Collapse a TOC entry
+function Collapse(tocDiv)
+{
+ // Hide all the TOC elements after item, until we reach one with a data-toclevel less than or equal to the
+ // current item's value.
+ var tocLevel = +tocDiv.attr("data-toclevel");
+ var done = false;
+
+ tocDiv.nextAll().each(function()
+ {
+ if(!done && +$(this).attr("data-toclevel") > tocLevel)
+ {
+ $(this).hide();
+ }
+ else
+ {
+ done = true;
+ }
+ });
+}
+
+// Expand a TOC entry
+function Expand(tocDiv)
+{
+ // Show all the TOC elements after item, until we reach one with a data-toclevel less than or equal to the
+ // current item's value
+ var tocLevel = +tocDiv.attr("data-toclevel");
+ var done = false;
+
+ tocDiv.nextAll().each(function()
+ {
+ if(done)
+ {
+ return;
+ }
+
+ var childTocLevel = +$(this).attr("data-toclevel");
+
+ if(childTocLevel == tocLevel + 1)
+ {
+ $(this).show();
+
+ if($(this).children("a").first().hasClass("tocExpanded"))
+ {
+ Expand($(this));
+ }
+ }
+ else if(childTocLevel > tocLevel + 1)
+ {
+ // Ignore this node, handled by recursive calls
+ }
+ else
+ {
+ done = true;
+ }
+ });
+}
+
+// This is called to prepare for dragging the sizer div
+function OnMouseDown(event)
+{
+ document.addEventListener("mousemove", OnMouseMove, true);
+ document.addEventListener("mouseup", OnMouseUp, true);
+ event.preventDefault();
+}
+
+// Resize the TOC as the sizer is dragged
+function OnMouseMove(event)
+{
+ tocWidth = (event.clientX > 700) ? 700 : (event.clientX < 100) ? 100 : event.clientX;
+
+ ResizeToc();
+}
+
+// Finish the drag operation when the mouse button is released
+function OnMouseUp(event)
+{
+ document.removeEventListener("mousemove", OnMouseMove, true);
+ document.removeEventListener("mouseup", OnMouseUp, true);
+
+ SetCookie("TocWidth", tocWidth);
+}
+
+// Search functions
+
+// Transfer to the search page from a topic
+function TransferToSearchPage()
+{
+ var searchText = document.getElementById("SearchTextBox").value.trim();
+
+ if(searchText.length != 0)
+ document.location.replace(encodeURI("../search.html?SearchText=" + searchText));
+}
+
+// Initiate a search when the search page loads
+function OnSearchPageLoad()
+{
+ var queryString = decodeURI(document.location.search);
+
+ if(queryString != "")
+ {
+ var idx, options = queryString.split(/[\?\=\&]/);
+
+ for(idx = 0; idx < options.length; idx++)
+ if(options[idx] == "SearchText" && idx + 1 < options.length)
+ {
+ document.getElementById("txtSearchText").value = options[idx + 1];
+ PerformSearch();
+ break;
+ }
+ }
+}
+
+// Perform a search using the best available method
+function PerformSearch()
+{
+ var searchText = document.getElementById("txtSearchText").value;
+ var sortByTitle = document.getElementById("chkSortByTitle").checked;
+ var searchResults = document.getElementById("searchResults");
+
+ if(searchText.length == 0)
+ {
+ searchResults.innerHTML = "Nothing found ";
+ return;
+ }
+
+ searchResults.innerHTML = "Searching...";
+
+ // Determine the search method if not done already. The ASPX and PHP searches are more efficient as they
+ // run asynchronously server-side. If they can't be used, it defaults to the client-side script below which
+ // will work but has to download the index files. For large help sites, this can be inefficient.
+ if(searchMethod == 0)
+ searchMethod = DetermineSearchMethod();
+
+ if(searchMethod == 1)
+ {
+ $.ajax({
+ type: "GET",
+ url: encodeURI("SearchHelp.aspx?Keywords=" + searchText + "&SortByTitle=" + sortByTitle),
+ success: function(html)
+ {
+ searchResults.innerHTML = html;
+ }
+ });
+
+ return;
+ }
+
+ if(searchMethod == 2)
+ {
+ $.ajax({
+ type: "GET",
+ url: encodeURI("SearchHelp.php?Keywords=" + searchText + "&SortByTitle=" + sortByTitle),
+ success: function(html)
+ {
+ searchResults.innerHTML = html;
+ }
+ });
+
+ return;
+ }
+
+ // Parse the keywords
+ var keywords = ParseKeywords(searchText);
+
+ // Get the list of files. We'll be getting multiple files so we need to do this synchronously.
+ var fileList = [];
+
+ $.ajax({
+ type: "GET",
+ url: "fti/FTI_Files.json",
+ dataType: "json",
+ async: false,
+ success: function(data)
+ {
+ $.each(data, function(key, val)
+ {
+ fileList[key] = val;
+ });
+ }
+ });
+
+ var letters = [];
+ var wordDictionary = {};
+ var wordNotFound = false;
+
+ // Load the keyword files for each keyword starting letter
+ for(var idx = 0; idx < keywords.length && !wordNotFound; idx++)
+ {
+ var letter = keywords[idx].substring(0, 1);
+
+ if($.inArray(letter, letters) == -1)
+ {
+ letters.push(letter);
+
+ $.ajax({
+ type: "GET",
+ url: "fti/FTI_" + letter.charCodeAt(0) + ".json",
+ dataType: "json",
+ async: false,
+ success: function(data)
+ {
+ var wordCount = 0;
+
+ $.each(data, function(key, val)
+ {
+ wordDictionary[key] = val;
+ wordCount++;
+ });
+
+ if(wordCount == 0)
+ wordNotFound = true;
+ }
+ });
+ }
+ }
+
+ if(wordNotFound)
+ searchResults.innerHTML = "Nothing found ";
+ else
+ searchResults.innerHTML = SearchForKeywords(keywords, fileList, wordDictionary, sortByTitle);
+}
+
+// Determine the search method by seeing if the ASPX or PHP search pages are present and working
+function DetermineSearchMethod()
+{
+ var method = 3;
+
+ try
+ {
+ $.ajax({
+ type: "GET",
+ url: "SearchHelp.aspx",
+ async: false,
+ success: function(html)
+ {
+ if(html.substring(0, 8) == "")
+ method = 1;
+ }
+ });
+
+ if(method == 3)
+ $.ajax({
+ type: "GET",
+ url: "SearchHelp.php",
+ async: false,
+ success: function(html)
+ {
+ if(html.substring(0, 8) == "")
+ method = 2;
+ }
+ });
+ }
+ catch(e)
+ {
+ }
+
+ return method;
+}
+
+// Split the search text up into keywords
+function ParseKeywords(keywords)
+{
+ var keywordList = [];
+ var checkWord;
+ var words = keywords.split(/[\s!@#$%^&*()\-=+\[\]{}\\|<>;:'",.<>/?`~]+/);
+
+ for(var idx = 0; idx < words.length; idx++)
+ {
+ checkWord = words[idx].toLowerCase();
+
+ if(checkWord.length > 2)
+ {
+ var charCode = checkWord.charCodeAt(0);
+
+ if((charCode < 48 || charCode > 57) && $.inArray(checkWord, keywordList) == -1)
+ keywordList.push(checkWord);
+ }
+ }
+
+ return keywordList;
+}
+
+// Search for keywords and generate a block of HTML containing the results
+function SearchForKeywords(keywords, fileInfo, wordDictionary, sortByTitle)
+{
+ var matches = [], matchingFileIndices = [], rankings = [];
+ var isFirst = true;
+
+ for(var idx = 0; idx < keywords.length; idx++)
+ {
+ var word = keywords[idx];
+ var occurrences = wordDictionary[word];
+
+ // All keywords must be found
+ if(occurrences == null)
+ return "Nothing found ";
+
+ matches[word] = occurrences;
+ var occurrenceIndices = [];
+
+ // Get a list of the file indices for this match. These are 64-bit numbers but JavaScript only does
+ // bit shifts on 32-bit values so we divide by 2^16 to get the same effect as ">> 16" and use floor()
+ // to truncate the result.
+ for(var ind in occurrences)
+ occurrenceIndices.push(Math.floor(occurrences[ind] / Math.pow(2, 16)));
+
+ if(isFirst)
+ {
+ isFirst = false;
+
+ for(var matchInd in occurrenceIndices)
+ matchingFileIndices.push(occurrenceIndices[matchInd]);
+ }
+ else
+ {
+ // After the first match, remove files that do not appear for all found keywords
+ for(var checkIdx = 0; checkIdx < matchingFileIndices.length; checkIdx++)
+ if($.inArray(matchingFileIndices[checkIdx], occurrenceIndices) == -1)
+ {
+ matchingFileIndices.splice(checkIdx, 1);
+ checkIdx--;
+ }
+ }
+ }
+
+ if(matchingFileIndices.length == 0)
+ return "Nothing found ";
+
+ // Rank the files based on the number of times the words occurs
+ for(var fileIdx = 0; fileIdx < matchingFileIndices.length; fileIdx++)
+ {
+ // Split out the title, filename, and word count
+ var matchingIdx = matchingFileIndices[fileIdx];
+ var fileIndex = fileInfo[matchingIdx].split(/\0/);
+
+ var title = fileIndex[0];
+ var filename = fileIndex[1];
+ var wordCount = parseInt(fileIndex[2]);
+ var matchCount = 0;
+
+ for(var idx = 0; idx < keywords.length; idx++)
+ {
+ occurrences = matches[keywords[idx]];
+
+ for(var ind in occurrences)
+ {
+ var entry = occurrences[ind];
+
+ // These are 64-bit numbers but JavaScript only does bit shifts on 32-bit values so we divide
+ // by 2^16 to get the same effect as ">> 16" and use floor() to truncate the result.
+ if(Math.floor(entry / Math.pow(2, 16)) == matchingIdx)
+ matchCount += (entry & 0xFFFF);
+ }
+ }
+
+ rankings.push({ Filename: filename, PageTitle: title, Rank: matchCount * 1000 / wordCount });
+
+ if(rankings.length > 99)
+ break;
+ }
+
+ rankings.sort(function(x, y)
+ {
+ if(!sortByTitle)
+ return y.Rank - x.Rank;
+
+ return x.PageTitle.localeCompare(y.PageTitle);
+ });
+
+ // Format and return the results
+ var content = "";
+
+ for(var r in rankings)
+ content += "" +
+ rankings[r].PageTitle + " ";
+
+ content += " ";
+
+ if(rankings.length < matchingFileIndices.length)
+ content += "Omitted " + (matchingFileIndices.length - rankings.length) + " more results
";
+
+ return content;
+}
diff --git a/docs/help/scripts/branding.js b/docs/help/scripts/branding.js
new file mode 100644
index 000000000..2acdea51a
--- /dev/null
+++ b/docs/help/scripts/branding.js
@@ -0,0 +1,562 @@
+//===============================================================================================================
+// System : Sandcastle Help File Builder
+// File : branding.js
+// Author : Eric Woodruff (Eric@EWoodruff.us)
+// Updated : 10/08/2015
+// Note : Copyright 2014-2015, Eric Woodruff, All rights reserved
+// Portions Copyright 2010-2014 Microsoft, All rights reserved
+//
+// This file contains the methods necessary to implement the language filtering, collapsible section, and
+// copy to clipboard options.
+//
+// This code is published under the Microsoft Public License (Ms-PL). A copy of the license should be
+// distributed with the code and can be found at the project website: https://GitHub.com/EWSoftware/SHFB. This
+// notice, the author's name, and all copyright notices must remain intact in all applications, documentation,
+// and source files.
+//
+// Date Who Comments
+// ==============================================================================================================
+// 05/04/2014 EFW Created the code based on the MS Help Viewer script
+//===============================================================================================================
+
+// The IDs of all code snippet sets on the same page are stored so that we can keep them in synch when a tab is
+// selected.
+var allTabSetIds = new Array();
+
+// The IDs of language-specific text (LST) spans are used as dictionary keys so that we can get access to the
+// spans and update them when the user changes to a different language tab. The values of the dictionary
+// objects are pipe separated language-specific attributes (lang1=value|lang2=value|lang3=value). The language
+// ID can be specific (cs, vb, cpp, etc.) or may be a neutral entry (nu) which specifies text common to multiple
+// languages. If a language is not present and there is no neutral entry, the span is hidden for all languages
+// to which it does not apply.
+var allLSTSetIds = new Object();
+
+// Help 1 persistence support. This code must appear inline.
+var isHelp1;
+
+var curLoc = document.location + ".";
+
+if(curLoc.indexOf("mk:@MSITStore") == 0)
+{
+ isHelp1 = true;
+ curLoc = "ms-its:" + curLoc.substring(14, curLoc.length - 1);
+ document.location.replace(curLoc);
+}
+else
+ if(curLoc.indexOf("ms-its:") == 0)
+ isHelp1 = true;
+ else
+ isHelp1 = false;
+
+// The OnLoad method
+function OnLoad(defaultLanguage)
+{
+ var defLang;
+
+ if(typeof (defaultLanguage) == "undefined" || defaultLanguage == null || defaultLanguage == "")
+ defLang = "vb";
+ else
+ defLang = defaultLanguage;
+
+ // In MS Help Viewer, the transform the topic is ran through can move the footer. Move it back where it
+ // belongs if necessary.
+ try
+ {
+ var footer = document.getElementById("pageFooter")
+
+ if(footer)
+ {
+ var footerParent = document.body;
+
+ if(footer.parentElement != footerParent)
+ {
+ footer.parentElement.removeChild(footer);
+ footerParent.appendChild(footer);
+ }
+ }
+ }
+ catch(e)
+ {
+ }
+
+ var language = GetCookie("CodeSnippetContainerLanguage", defLang);
+
+ // If LST exists on the page, set the LST to show the user selected programming language
+ UpdateLST(language);
+
+ // If code snippet groups exist, set the current language for them
+ if(allTabSetIds.length > 0)
+ {
+ var i = 0;
+
+ while(i < allTabSetIds.length)
+ {
+ var tabCount = 1;
+
+ // The tab count may vary so find the last one in this set
+ while(document.getElementById(allTabSetIds[i] + "_tab" + tabCount) != null)
+ tabCount++;
+
+ tabCount--;
+
+ // If not grouped, skip it
+ if(tabCount > 1)
+ SetCurrentLanguage(allTabSetIds[i], language, tabCount);
+
+ i++;
+ }
+ }
+
+ InitializeToc();
+}
+
+// This is just a place holder. The website script implements this function to initialize it's in-page TOC pane
+function InitializeToc()
+{
+}
+
+// This function executes in the OnLoad event and ChangeTab action on code snippets. The function parameter
+// is the user chosen programming language. This function iterates through the "allLSTSetIds" dictionary object
+// to update the node value of the LST span tag per the user's chosen programming language.
+function UpdateLST(language)
+{
+ for(var lstMember in allLSTSetIds)
+ {
+ var devLangSpan = document.getElementById(lstMember);
+
+ if(devLangSpan != null)
+ {
+ // There may be a carriage return before the LST span in the content so the replace function below
+ // is used to trim the whitespace at the end of the previous node of the current LST node.
+ if(devLangSpan.previousSibling != null && devLangSpan.previousSibling.nodeValue != null)
+ devLangSpan.previousSibling.nodeValue = devLangSpan.previousSibling.nodeValue.replace(/\s+$/, "");
+
+ var langs = allLSTSetIds[lstMember].split("|");
+ var k = 0;
+ var keyValue;
+
+ while(k < langs.length)
+ {
+ keyValue = langs[k].split("=");
+
+ if(keyValue[0] == language)
+ {
+ devLangSpan.innerHTML = keyValue[1];
+
+ // Help 1 and MS Help Viewer workaround. Add a space if the following text element starts
+ // with a space to prevent things running together.
+ if(devLangSpan.parentNode != null && devLangSpan.parentNode.nextSibling != null)
+ {
+ if(devLangSpan.parentNode.nextSibling.nodeValue != null &&
+ !devLangSpan.parentNode.nextSibling.nodeValue.substring(0, 1).match(/[.,);:!/?]/) &&
+ (isHelp1 || devLangSpan.innerHTML == '>' || devLangSpan.innerHTML == ')'))
+ {
+ devLangSpan.innerHTML = keyValue[1] + " ";
+ }
+ }
+ break;
+ }
+
+ k++;
+ }
+
+ // If not found, default to the neutral language. If there is no neutral language entry, clear the
+ // content to hide it.
+ if(k >= langs.length)
+ {
+ if(language != "nu")
+ {
+ k = 0;
+
+ while(k < langs.length)
+ {
+ keyValue = langs[k].split("=");
+
+ if(keyValue[0] == "nu")
+ {
+ devLangSpan.innerHTML = keyValue[1];
+
+ // Help 1 and MS Help Viewer workaround. Add a space if the following text element
+ // starts with a space to prevent things running together.
+ if(devLangSpan.parentNode != null && devLangSpan.parentNode.nextSibling != null)
+ {
+ if(devLangSpan.parentNode.nextSibling.nodeValue != null &&
+ !devLangSpan.parentNode.nextSibling.nodeValue.substring(0, 1).match(/[.,);:!/?]/) &&
+ (isHelp1 || devLangSpan.innerHTML == '>' || devLangSpan.innerHTML == ')'))
+ {
+ devLangSpan.innerHTML = keyValue[1] + " ";
+ }
+ }
+ break;
+ }
+
+ k++;
+ }
+ }
+
+ if(k >= langs.length)
+ devLangSpan.innerHTML = "";
+ }
+ }
+ }
+}
+
+// Get the specified cookie. If not found, return the specified default value.
+function GetCookie(cookieName, defaultValue)
+{
+ if(isHelp1)
+ {
+ try
+ {
+ var globals = Help1Globals;
+
+ var value = globals.Load(cookieName);
+
+ if(value == null)
+ value = defaultValue;
+
+ return value;
+ }
+ catch(e)
+ {
+ return defaultValue;
+ }
+ }
+
+ var cookie = document.cookie.split("; ");
+
+ for(var i = 0; i < cookie.length; i++)
+ {
+ var crumb = cookie[i].split("=");
+
+ if(cookieName == crumb[0])
+ return unescape(crumb[1])
+ }
+
+ return defaultValue;
+}
+
+// Set the specified cookie to the specified value
+function SetCookie(name, value)
+{
+ if(isHelp1)
+ {
+ try
+ {
+ var globals = Help1Globals;
+
+ globals.Save(name, value);
+ }
+ catch(e)
+ {
+ }
+
+ return;
+ }
+
+ var today = new Date();
+
+ today.setTime(today.getTime());
+
+ // Set the expiration time to be 60 days from now (in milliseconds)
+ var expires_date = new Date(today.getTime() + (60 * 1000 * 60 * 60 * 24));
+
+ document.cookie = name + "=" + escape(value) + ";expires=" + expires_date.toGMTString() + ";path=/";
+}
+
+// Add a language-specific text ID
+function AddLanguageSpecificTextSet(lstId)
+{
+ var keyValue = lstId.split("?")
+
+ allLSTSetIds[keyValue[0]] = keyValue[1];
+}
+
+var clipboardHandler;
+
+// Add a language tab set ID
+function AddLanguageTabSet(tabSetId)
+{
+ allTabSetIds.push(tabSetId);
+
+ // Create the clipboard handler on first use
+ if(clipboardHandler == null && typeof (Clipboard) == "function")
+ {
+ clipboardHandler = new Clipboard('.copyCodeSnippet',
+ {
+ text: function (trigger)
+ {
+ // Get the code to copy to the clipboard from the active tab of the given tab set
+ var i = 1, tabSetId = trigger.id;
+ var pos = tabSetId.indexOf('_');
+
+ if(pos == -1)
+ return "";
+
+ tabSetId = tabSetId.substring(0, pos);
+
+ do
+ {
+ contentId = tabSetId + "_code_Div" + i;
+ tabTemp = document.getElementById(contentId);
+
+ if(tabTemp != null && tabTemp.style.display != "none")
+ break;
+
+ i++;
+
+ } while(tabTemp != null);
+
+ if(tabTemp == null)
+ return "";
+
+ return document.getElementById(contentId).innerText;
+ }
+ });
+ }
+}
+
+// Switch the active tab for all of other code snippets
+function ChangeTab(tabSetId, language, snippetIdx, snippetCount)
+{
+ SetCookie("CodeSnippetContainerLanguage", language);
+
+ SetActiveTab(tabSetId, snippetIdx, snippetCount);
+
+ // If LST exists on the page, set the LST to show the user selected programming language
+ UpdateLST(language);
+
+ var i = 0;
+
+ while(i < allTabSetIds.length)
+ {
+ // We just care about other snippets
+ if(allTabSetIds[i] != tabSetId)
+ {
+ // Other tab sets may not have the same number of tabs
+ var tabCount = 1;
+
+ while(document.getElementById(allTabSetIds[i] + "_tab" + tabCount) != null)
+ tabCount++;
+
+ tabCount--;
+
+ // If not grouped, skip it
+ if(tabCount > 1)
+ SetCurrentLanguage(allTabSetIds[i], language, tabCount);
+ }
+
+ i++;
+ }
+}
+
+// Sets the current language in the specified tab set
+function SetCurrentLanguage(tabSetId, language, tabCount)
+{
+ var tabIndex = 1;
+
+ while(tabIndex <= tabCount)
+ {
+ var tabTemp = document.getElementById(tabSetId + "_tab" + tabIndex);
+
+ if(tabTemp != null && tabTemp.innerHTML.indexOf("'" + language + "'") != -1)
+ break;
+
+ tabIndex++;
+ }
+
+ if(tabIndex > tabCount)
+ {
+ // Select the first non-disabled tab
+ tabIndex = 1;
+
+ if(document.getElementById(tabSetId + "_tab1").className == "codeSnippetContainerTabPhantom")
+ {
+ tabIndex++;
+
+ while(tabIndex <= tabCount)
+ {
+ var tab = document.getElementById(tabSetId + "_tab" + tabIndex);
+
+ if(tab.className != "codeSnippetContainerTabPhantom")
+ {
+ tab.className = "codeSnippetContainerTabActive";
+ document.getElementById(tabSetId + "_code_Div" + j).style.display = "block";
+ break;
+ }
+
+ tabIndex++;
+ }
+ }
+ }
+
+ SetActiveTab(tabSetId, tabIndex, tabCount);
+}
+
+// Set the active tab within a tab set
+function SetActiveTab(tabSetId, tabIndex, tabCount)
+{
+ var i = 1;
+
+ while(i <= tabCount)
+ {
+ var tabTemp = document.getElementById(tabSetId + "_tab" + i);
+
+ if (tabTemp != null)
+ {
+ if(tabTemp.className == "codeSnippetContainerTabActive")
+ tabTemp.className = "codeSnippetContainerTab";
+ else
+ if(tabTemp.className == "codeSnippetContainerTabPhantom")
+ tabTemp.style.display = "none";
+
+ var codeTemp = document.getElementById(tabSetId + "_code_Div" + i);
+
+ if(codeTemp.style.display != "none")
+ codeTemp.style.display = "none";
+ }
+
+ i++;
+ }
+
+ // Phantom tabs are shown or hidden as needed
+ if(document.getElementById(tabSetId + "_tab" + tabIndex).className != "codeSnippetContainerTabPhantom")
+ document.getElementById(tabSetId + "_tab" + tabIndex).className = "codeSnippetContainerTabActive";
+ else
+ document.getElementById(tabSetId + "_tab" + tabIndex).style.display = "block";
+
+ document.getElementById(tabSetId + "_code_Div" + tabIndex).style.display = "block";
+}
+
+// Copy the code from the active tab of the given tab set to the clipboard
+function CopyToClipboard(tabSetId)
+{
+ var tabTemp, contentId;
+ var i = 1;
+
+ if(typeof (Clipboard) == "function")
+ return;
+
+ do
+ {
+ contentId = tabSetId + "_code_Div" + i;
+ tabTemp = document.getElementById(contentId);
+
+ if(tabTemp != null && tabTemp.style.display != "none")
+ break;
+
+ i++;
+
+ } while(tabTemp != null);
+
+ if(tabTemp == null)
+ return;
+
+ if(window.clipboardData)
+ {
+ try
+ {
+ window.clipboardData.setData("Text", document.getElementById(contentId).innerText);
+ }
+ catch(e)
+ {
+ alert("Permission denied. Enable copying to the clipboard.");
+ }
+ }
+ else if(window.netscape)
+ {
+ try
+ {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
+
+ var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(
+ Components.interfaces.nsIClipboard);
+
+ if(!clip)
+ return;
+
+ var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(
+ Components.interfaces.nsITransferable);
+
+ if(!trans)
+ return;
+
+ trans.addDataFlavor("text/unicode");
+
+ var str = new Object();
+ var len = new Object();
+ var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(
+ Components.interfaces.nsISupportsString);
+
+ var copytext = document.getElementById(contentId).textContent;
+
+ str.data = copytext;
+ trans.setTransferData("text/unicode", str, copytext.length * 2);
+
+ var clipid = Components.interfaces.nsIClipboard;
+
+ clip.setData(trans, null, clipid.kGlobalClipboard);
+ }
+ catch(e)
+ {
+ alert("Permission denied. Enter \"about:config\" in the address bar and double-click the \"signed.applets.codebase_principal_support\" setting to enable copying to the clipboard.");
+ }
+ }
+}
+
+// Expand or collapse a section
+function SectionExpandCollapse(togglePrefix)
+{
+ var image = document.getElementById(togglePrefix + "Toggle");
+ var section = document.getElementById(togglePrefix + "Section");
+
+ if(image != null && section != null)
+ if(section.style.display == "")
+ {
+ image.src = image.src.replace("SectionExpanded.png", "SectionCollapsed.png");
+ section.style.display = "none";
+ }
+ else
+ {
+ image.src = image.src.replace("SectionCollapsed.png", "SectionExpanded.png");
+ section.style.display = "";
+ }
+}
+
+// Expand or collapse a section when it has the focus and Enter is hit
+function SectionExpandCollapse_CheckKey(togglePrefix, eventArgs)
+{
+ if(eventArgs.keyCode == 13)
+ SectionExpandCollapse(togglePrefix);
+}
+
+// Help 1 persistence object. This requires a hidden input element on the page with a class of "userDataStyle"
+// defined in the style sheet that implements the user data binary behavior:
+//
+var Help1Globals =
+{
+ UserDataCache: function()
+ {
+ var userData = document.getElementById("userDataCache");
+
+ return userData;
+ },
+
+ Load: function(key)
+ {
+ var userData = this.UserDataCache();
+
+ userData.load("userDataSettings");
+
+ var value = userData.getAttribute(key);
+
+ return value;
+ },
+
+ Save: function(key, value)
+ {
+ var userData = this.UserDataCache();
+ userData.setAttribute(key, value);
+ userData.save("userDataSettings");
+ }
+};
diff --git a/docs/help/scripts/clipboard.min.js b/docs/help/scripts/clipboard.min.js
new file mode 100644
index 000000000..580433f1d
--- /dev/null
+++ b/docs/help/scripts/clipboard.min.js
@@ -0,0 +1,7 @@
+/*!
+ * clipboard.js v1.5.12
+ * https://zenorocha.github.io/clipboard.js
+ *
+ * Licensed MIT © Zeno Rocha
+ */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!c&&s)return s(a,!0);if(r)return r(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;ao;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;a>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if("undefined"!=typeof o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(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]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}: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},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML=" ";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?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},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,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(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===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]||oe.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]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.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.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},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,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(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),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===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===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!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,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.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"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML=" ","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML=" ",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/
+
+
+
+
+
+
+
+
+
+
+
+ Sort by title
+
+
+
+
+
+ Back
+
+
+
+