You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2022/01/08 12:25:17 UTC

[lucenenet] 02/15: .build: Upgraded psake build automation to 4.9.0

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git

commit ba1052ece38bbdabdf9f73ad3d8f78fc4b1761ff
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Thu Jan 6 11:21:59 2022 +0700

    .build: Upgraded psake build automation to 4.9.0
---
 .build/psake.cmd                                   |   29 -
 .build/psake.ps1                                   |   53 -
 .build/psake.psd1                                  |   31 -
 .build/psake.psm1                                  |  925 --------
 .build/psake/LICENSE                               |   21 +
 .build/psake/en-US/psake.psm1-help.xml.old         | 2265 ++++++++++++++++++++
 .build/psake/private/CleanupEnvironment.ps1        |   12 +
 .build/psake/private/ConfigureBuildEnvironment.ps1 |  202 ++
 .../private/CreateConfigurationForNewContext.ps1   |   28 +
 .build/psake/private/ExecuteInBuildFileScope.ps1   |   58 +
 .build/psake/private/FormatErrorMessage.ps1        |   26 +
 .build/psake/private/Get-DefaultBuildFile.ps1      |   17 +
 .../private/GetCurrentConfigurationOrDefault.ps1   |    7 +
 .build/psake/private/GetTasksFromContext.ps1       |   15 +
 .build/psake/private/LoadConfiguration.ps1         |   31 +
 .build/psake/private/LoadModules.ps1               |   21 +
 .build/psake/private/ResolveError.ps1              |   62 +
 .build/psake/private/SelectObjectWithDefault.ps1   |   23 +
 .build/psake/private/Test-ModuleVersion.ps1        |  107 +
 .build/psake/private/WriteColoredOutput.ps1        |   20 +
 .build/psake/private/WriteDocumentation.ps1        |   26 +
 .build/psake/private/WriteTaskTimeSummary.ps1      |   34 +
 .build/psake/psake                                 |   12 +
 .build/psake/psake-config.ps1                      |   22 +
 .build/psake/psake.cmd                             |   14 +
 .build/psake/psake.ps1                             |   71 +
 .build/psake/psake.psd1                            |   33 +
 .build/psake/psake.psm1                            |  112 +
 .build/psake/public/Assert.ps1                     |   71 +
 .build/psake/public/BuildSetup.ps1                 |   55 +
 .build/psake/public/BuildTearDown.ps1              |   75 +
 .build/psake/public/Exec.ps1                       |  110 +
 .build/psake/public/FormatTaskName.ps1             |   95 +
 .build/psake/public/Framework.ps1                  |   55 +
 .build/psake/public/Get-PSakeScriptTasks.ps1       |   45 +
 .build/psake/public/Include.ps1                    |   64 +
 .build/psake/public/Invoke-Task.ps1                |  158 ++
 .build/psake/public/Invoke-psake.ps1               |  343 +++
 .build/psake/public/Properties.ps1                 |   61 +
 .build/psake/public/Task.ps1                       |  331 +++
 .build/psake/public/TaskSetup.ps1                  |  102 +
 .build/psake/public/TaskTearDown.ps1               |  107 +
 .build/psake/readme.md                             |   13 +
 .rat-excludes                                      |    1 +
 LICENSE.txt                                        |    5 +-
 Lucene.Net.sln                                     |   52 +
 azure-pipelines.yml                                |    2 +-
 build.bat                                          |    2 +-
 48 files changed, 4981 insertions(+), 1043 deletions(-)

diff --git a/.build/psake.cmd b/.build/psake.cmd
deleted file mode 100644
index beee3fa..0000000
--- a/.build/psake.cmd
+++ /dev/null
@@ -1,29 +0,0 @@
-@echo off
-REM  Licensed to the Apache Software Foundation (ASF) under one or more
-REM  contributor license agreements.  See the NOTICE file distributed with
-REM  this work for additional information regarding copyright ownership.
-REM  The ASF licenses this file to You under the Apache License, Version 2.0
-REM  (the "License"); you may not use this file except in compliance with
-REM  the License.  You may obtain a copy of the License at
-REM
-REM      http://www.apache.org/licenses/LICENSE-2.0
-REM
-REM  Unless required by applicable law or agreed to in writing, software
-REM  distributed under the License is distributed on an "AS IS" BASIS,
-REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-REM  See the License for the specific language governing permissions and
-REM  limitations under the License.
-
-rem Helper script for those who want to run psake from cmd.exe
-rem Example run from cmd.exe:
-rem psake "default.ps1" "BuildHelloWord" "4.0" 
-
-if '%1'=='/?' goto help
-if '%1'=='-help' goto help
-if '%1'=='-h' goto help
-
-powershell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0\psake.ps1' %*; if ($psake.build_success -eq $false) { exit 1 } else { exit 0 }"
-exit /B %errorlevel%
-
-:help
-powershell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0\psake.ps1' -help"
diff --git a/.build/psake.ps1 b/.build/psake.ps1
deleted file mode 100644
index 23c6f2d..0000000
--- a/.build/psake.ps1
+++ /dev/null
@@ -1,53 +0,0 @@
-# Helper script for those who want to run psake without importing the module.
-# Example run from PowerShell:
-# .\psake.ps1 "default.ps1" "BuildHelloWord" "4.0" 
-
-# Must match parameter definitions for psake.psm1/invoke-psake 
-# otherwise named parameter binding fails
-param(
-    [Parameter(Position=0,Mandatory=0)]
-    [string]$buildFile,
-    [Parameter(Position=1,Mandatory=0)]
-    [string[]]$taskList = @(),
-    [Parameter(Position=2,Mandatory=0)]
-    [string]$framework,
-    [Parameter(Position=3,Mandatory=0)]
-    [switch]$docs = $false,
-    [Parameter(Position=4,Mandatory=0)]
-    [System.Collections.Hashtable]$parameters = @{},
-    [Parameter(Position=5, Mandatory=0)]
-    [System.Collections.Hashtable]$properties = @{},
-    [Parameter(Position=6, Mandatory=0)]
-    [alias("init")]
-    [scriptblock]$initialization = {},
-    [Parameter(Position=7, Mandatory=0)]
-    [switch]$nologo = $false,
-    [Parameter(Position=8, Mandatory=0)]
-    [switch]$help = $false,
-    [Parameter(Position=9, Mandatory=0)]
-    [string]$scriptPath,
-    [Parameter(Position=10,Mandatory=0)]
-    [switch]$detailedDocs = $false
-)
-
-# setting $scriptPath here, not as default argument, to support calling as "powershell -File psake.ps1"
-if (!$scriptPath) {
-  $scriptPath = $(Split-Path -parent $MyInvocation.MyCommand.path)
-}
-
-# '[p]sake' is the same as 'psake' but $Error is not polluted
-remove-module [p]sake
-import-module (join-path $scriptPath psake.psm1)
-if ($help) {
-  Get-Help Invoke-psake -full
-  return
-}
-
-if ($buildFile -and (-not(test-path $buildFile))) {
-    $absoluteBuildFile = (join-path $scriptPath $buildFile)
-    if (test-path $absoluteBuildFile) {
-        $buildFile = $absoluteBuildFile
-    }
-} 
-
-Invoke-psake $buildFile $taskList $framework $docs $parameters $properties $initialization $nologo $detailedDocs
diff --git a/.build/psake.psd1 b/.build/psake.psd1
deleted file mode 100644
index 7e00532..0000000
--- a/.build/psake.psd1
+++ /dev/null
@@ -1,31 +0,0 @@
-@{
-    ModuleToProcess   = 'psake.psm1'
-    ModuleVersion     = '4.6.0'
-    GUID              = 'cfb53216-072f-4a46-8975-ff7e6bda05a5'
-    Author            = 'James Kovacs'
-    Copyright         = 'Copyright (c) 2012-16 James Kovacs, Damian Hickey and Contributors'
-    PowerShellVersion = '2.0'
-    Description       = 'psake is a build automation tool written in PowerShell.'
-    FunctionsToExport = @('Invoke-psake',
-                          'Invoke-Task',
-                          'Get-PSakeScriptTasks', 
-                          'Task',
-                          'Properties',
-                          'Include',
-                          'FormatTaskName',
-                          'TaskSetup',
-                          'TaskTearDown',
-                          'Framework',
-                          'Assert',
-                          'Exec')
-    VariablesToExport = 'psake'
-
-    PrivateData = @{
-        PSData = @{
-            LicenseUri = 'https://github.com/psake/psake/blob/master/license.txt'
-            ProjectUri = 'https://github.com/psake/psake'
-            Tags     = @('Build', 'Task')
-            IconUri  = 'https://raw.githubusercontent.com/psake/graphics/master/jpg/psake-full-icon-teal-bg-256x256.jpg'
-        }
-    }
-}
diff --git a/.build/psake.psm1 b/.build/psake.psm1
deleted file mode 100644
index e5f8f3c..0000000
--- a/.build/psake.psm1
+++ /dev/null
@@ -1,925 +0,0 @@
-# psake
-# Copyright (c) 2012 James Kovacs
-# 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.
-
-#Requires -Version 2.0
-
-if ($PSVersionTable.PSVersion.Major -ge 3)
-{
-    $script:IgnoreError = 'Ignore'
-}
-else
-{
-    $script:IgnoreError = 'SilentlyContinue'
-}
-
-#-- Public Module Functions --#
-
-# .ExternalHelp  psake.psm1-help.xml
-function Invoke-Task
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)] [string]$taskName
-    )
-
-    Assert $taskName ($msgs.error_invalid_task_name)
-
-    $taskKey = $taskName.ToLower()
-
-    if ($currentContext.aliases.Contains($taskKey)) {
-        $taskName = $currentContext.aliases.$taskKey.Name
-        $taskKey = $taskName.ToLower()
-    }
-
-    $currentContext = $psake.context.Peek()
-
-    Assert ($currentContext.tasks.Contains($taskKey)) ($msgs.error_task_name_does_not_exist -f $taskName)
-
-    if ($currentContext.executedTasks.Contains($taskKey))  { return }
-
-    Assert (!$currentContext.callStack.Contains($taskKey)) ($msgs.error_circular_reference -f $taskName)
-
-    $currentContext.callStack.Push($taskKey)
-
-    $task = $currentContext.tasks.$taskKey
-
-    $precondition_is_valid = & $task.Precondition
-
-    if (!$precondition_is_valid) {
-        WriteColoredOutput ($msgs.precondition_was_false -f $taskName) -foregroundcolor Cyan
-    } else {
-        if ($taskKey -ne 'default') {
-
-            if ($task.PreAction -or $task.PostAction) {
-                Assert ($task.Action -ne $null) ($msgs.error_missing_action_parameter -f $taskName)
-            }
-
-            if ($task.Action) {
-                try {
-                    foreach($childTask in $task.DependsOn) {
-                        Invoke-Task $childTask
-                    }
-
-                    $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
-                    $currentContext.currentTaskName = $taskName
-
-                    & $currentContext.taskSetupScriptBlock
-
-                    if ($task.PreAction) {
-                        & $task.PreAction
-                    }
-
-                    if ($currentContext.config.taskNameFormat -is [ScriptBlock]) {
-                        & $currentContext.config.taskNameFormat $taskName
-                    } else {
-                        WriteColoredOutput ($currentContext.config.taskNameFormat -f $taskName) -foregroundcolor Cyan
-                    }
-
-                    foreach ($variable in $task.requiredVariables) {
-                        Assert ((test-path "variable:$variable") -and ((get-variable $variable).Value -ne $null)) ($msgs.required_variable_not_set -f $variable, $taskName)
-                    }
-
-                    & $task.Action
-
-                    if ($task.PostAction) {
-                        & $task.PostAction
-                    }
-
-                    & $currentContext.taskTearDownScriptBlock
-                    $task.Duration = $stopwatch.Elapsed
-                } catch {
-                    if ($task.ContinueOnError) {
-                        "-"*70
-                        WriteColoredOutput ($msgs.continue_on_error -f $taskName,$_) -foregroundcolor Yellow
-                        "-"*70
-                        $task.Duration = $stopwatch.Elapsed
-                    }  else {
-                        throw $_
-                    }
-                }
-            } else {
-                # no action was specified but we still execute all the dependencies
-                foreach($childTask in $task.DependsOn) {
-                    Invoke-Task $childTask
-                }
-            }
-        } else {
-            foreach($childTask in $task.DependsOn) {
-                Invoke-Task $childTask
-            }
-        }
-
-        Assert (& $task.Postcondition) ($msgs.postcondition_failed -f $taskName)
-    }
-
-    $poppedTaskKey = $currentContext.callStack.Pop()
-    Assert ($poppedTaskKey -eq $taskKey) ($msgs.error_corrupt_callstack -f $taskKey,$poppedTaskKey)
-
-    $currentContext.executedTasks.Push($taskKey)
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Exec
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
-        [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd),
-        [Parameter(Position=2,Mandatory=0)][int]$maxRetries = 0,
-        [Parameter(Position=3,Mandatory=0)][string]$retryTriggerErrorPattern = $null
-    )
-
-    $tryCount = 1
-
-    do {
-        try {
-            $global:lastexitcode = 0
-            & $cmd
-            if ($lastexitcode -ne 0) {
-                throw ("Exec: " + $errorMessage)
-            }
-            break
-        }
-        catch [Exception]
-        {
-            if ($tryCount -gt $maxRetries) {
-                throw $_
-            }
-
-            if ($retryTriggerErrorPattern -ne $null) {
-                $isMatch = [regex]::IsMatch($_.Exception.Message, $retryTriggerErrorPattern)
-
-                if ($isMatch -eq $false) {
-                    throw $_
-                }
-            }
-
-            Write-Host "Try $tryCount failed, retrying again in 1 second..."
-
-            $tryCount++
-
-            [System.Threading.Thread]::Sleep([System.TimeSpan]::FromSeconds(1))
-        }
-    }
-    while ($true)
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Assert
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)]$conditionToCheck,
-        [Parameter(Position=1,Mandatory=1)]$failureMessage
-    )
-    if (!$conditionToCheck) {
-        throw ("Assert: " + $failureMessage)
-    }
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Task
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][string]$name = $null,
-        [Parameter(Position=1,Mandatory=0)][scriptblock]$action = $null,
-        [Parameter(Position=2,Mandatory=0)][scriptblock]$preaction = $null,
-        [Parameter(Position=3,Mandatory=0)][scriptblock]$postaction = $null,
-        [Parameter(Position=4,Mandatory=0)][scriptblock]$precondition = {$true},
-        [Parameter(Position=5,Mandatory=0)][scriptblock]$postcondition = {$true},
-        [Parameter(Position=6,Mandatory=0)][switch]$continueOnError = $false,
-        [Parameter(Position=7,Mandatory=0)][string[]]$depends = @(),
-        [Parameter(Position=8,Mandatory=0)][string[]]$requiredVariables = @(),
-        [Parameter(Position=9,Mandatory=0)][string]$description = $null,
-        [Parameter(Position=10,Mandatory=0)][string]$alias = $null
-    )
-    if ($name -eq 'default') {
-        Assert (!$action) ($msgs.error_default_task_cannot_have_action)
-    }
-
-    $newTask = @{
-        Name = $name
-        DependsOn = $depends
-        PreAction = $preaction
-        Action = $action
-        PostAction = $postaction
-        Precondition = $precondition
-        Postcondition = $postcondition
-        ContinueOnError = $continueOnError
-        Description = $description
-        Duration = [System.TimeSpan]::Zero
-        RequiredVariables = $requiredVariables
-        Alias = $alias
-    }
-
-    $taskKey = $name.ToLower()
-
-    $currentContext = $psake.context.Peek()
-
-    Assert (!$currentContext.tasks.ContainsKey($taskKey)) ($msgs.error_duplicate_task_name -f $name)
-
-    $currentContext.tasks.$taskKey = $newTask
-
-    if($alias)
-    {
-        $aliasKey = $alias.ToLower()
-
-        Assert (!$currentContext.aliases.ContainsKey($aliasKey)) ($msgs.error_duplicate_alias_name -f $alias)
-
-        $currentContext.aliases.$aliasKey = $newTask
-    }
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Properties {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][scriptblock]$properties
-    )
-    $psake.context.Peek().properties += $properties
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Include {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][string]$fileNamePathToInclude
-    )
-    Assert (test-path $fileNamePathToInclude -pathType Leaf) ($msgs.error_invalid_include_path -f $fileNamePathToInclude)
-    $psake.context.Peek().includes.Enqueue((Resolve-Path $fileNamePathToInclude));
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function FormatTaskName {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)]$format
-    )
-    $psake.context.Peek().config.taskNameFormat = $format
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function TaskSetup {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][scriptblock]$setup
-    )
-    $psake.context.Peek().taskSetupScriptBlock = $setup
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function TaskTearDown {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][scriptblock]$teardown
-    )
-    $psake.context.Peek().taskTearDownScriptBlock = $teardown
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Framework {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position=0,Mandatory=1)][string]$framework
-    )
-    $psake.context.Peek().config.framework = $framework
-    ConfigureBuildEnvironment
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Get-PSakeScriptTasks {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position = 0, Mandatory = 0)][string] $buildFile
-    )
-
-    if (!$buildFile) {
-        $buildFile = $psake.config_default.buildFileName
-    }
-
-    try
-    {
-        ExecuteInBuildFileScope $buildFile $MyInvocation.MyCommand.Module {
-            param($currentContext, $module)
-            return GetTasksFromContext $currentContext
-        }
-
-    } finally {
-
-        CleanupEnvironment
-    }
-}
-
-# .ExternalHelp  psake.psm1-help.xml
-function Invoke-psake {
-    [CmdletBinding()]
-    param(
-        [Parameter(Position = 0, Mandatory = 0)][string] $buildFile,
-        [Parameter(Position = 1, Mandatory = 0)][string[]] $taskList = @(),
-        [Parameter(Position = 2, Mandatory = 0)][string] $framework,
-        [Parameter(Position = 3, Mandatory = 0)][switch] $docs = $false,
-        [Parameter(Position = 4, Mandatory = 0)][hashtable] $parameters = @{},
-        [Parameter(Position = 5, Mandatory = 0)][hashtable] $properties = @{},
-        [Parameter(Position = 6, Mandatory = 0)][alias("init")][scriptblock] $initialization = {},
-        [Parameter(Position = 7, Mandatory = 0)][switch] $nologo = $false,
-        [Parameter(Position = 8, Mandatory = 0)][switch] $detailedDocs = $false,
-        [Parameter(Position = 9, Mandatory = 0)][switch] $notr = $false # disable time report
-    )
-    try {
-        if (-not $nologo) {
-            "psake version {0}`nCopyright (c) 2010-2014 James Kovacs & Contributors`n" -f $psake.version
-        }
-
-        if (!$buildFile) {
-          $buildFile = $psake.config_default.buildFileName
-        }
-        elseif (!(test-path $buildFile -pathType Leaf) -and (test-path $psake.config_default.buildFileName -pathType Leaf)) {
-            # If the $config.buildFileName file exists and the given "buildfile" isn 't found assume that the given
-            # $buildFile is actually the target Tasks to execute in the $config.buildFileName script.
-            $taskList = $buildFile.Split(', ')
-            $buildFile = $psake.config_default.buildFileName
-        }
-
-        ExecuteInBuildFileScope $buildFile $MyInvocation.MyCommand.Module {
-            param($currentContext, $module)            
-
-            $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
-            
-            if ($docs -or $detailedDocs) {
-                WriteDocumentation($detailedDocs)
-                return
-            }
-            
-            foreach ($key in $parameters.keys) {
-                if (test-path "variable:\$key") {
-                    set-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
-                } else {
-                    new-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
-                }
-            }
-            
-            # The initial dot (.) indicates that variables initialized/modified in the propertyBlock are available in the parent scope.
-            foreach ($propertyBlock in $currentContext.properties) {
-                . $propertyBlock
-            }
-            
-            foreach ($key in $properties.keys) {
-                if (test-path "variable:\$key") {
-                    set-item -path "variable:\$key" -value $properties.$key -WhatIf:$false -Confirm:$false | out-null
-                }
-            }
-            
-            # Simple dot sourcing will not work. We have to force the script block into our
-            # module's scope in order to initialize variables properly.
-            . $module $initialization
-            
-            # Execute the list of tasks or the default task
-            if ($taskList) {
-                foreach ($task in $taskList) {
-                    invoke-task $task
-                }
-            } elseif ($currentContext.tasks.default) {
-                invoke-task default
-            } else {
-                throw $msgs.error_no_default_task
-            }
-            
-            WriteColoredOutput ("`n" + $msgs.build_success + "`n") -foregroundcolor Green
-            
-            $stopwatch.Stop()
-            if (-not $notr) {
-                WriteTaskTimeSummary $stopwatch.Elapsed
-            }
-        }
-
-        $psake.build_success = $true
-
-    } catch {
-        $currentConfig = GetCurrentConfigurationOrDefault
-        if ($currentConfig.verboseError) {
-            $error_message = "{0}: An Error Occurred. See Error Details Below: `n" -f (Get-Date)
-            $error_message += ("-" * 70) + "`n"
-            $error_message += "Error: {0}`n" -f (ResolveError $_ -Short)
-            $error_message += ("-" * 70) + "`n"
-            $error_message += ResolveError $_
-            $error_message += ("-" * 70) + "`n"
-            $error_message += "Script Variables" + "`n"
-            $error_message += ("-" * 70) + "`n"
-            $error_message += get-variable -scope script | format-table | out-string
-        } else {
-            # ($_ | Out-String) gets error messages with source information included.
-            $error_message = "Error: {0}: `n{1}" -f (Get-Date), (ResolveError $_ -Short)
-        }
-
-        $psake.build_success = $false
-
-        # if we are running in a nested scope (i.e. running a psake script from a psake script) then we need to re-throw the exception
-        # so that the parent script will fail otherwise the parent script will report a successful build
-        $inNestedScope = ($psake.context.count -gt 1)
-        if ( $inNestedScope ) {
-            throw $_
-        } else {
-            if (!$psake.run_by_psake_build_tester) {
-                WriteColoredOutput $error_message -foregroundcolor Red
-            }
-        }
-    } finally {
-        CleanupEnvironment
-    }
-}
-
-#-- Private Module Functions --#
-function WriteColoredOutput {
-    param(
-        [string] $message,
-        [System.ConsoleColor] $foregroundcolor
-    )
-
-    $currentConfig = GetCurrentConfigurationOrDefault
-    if ($currentConfig.coloredOutput -eq $true) {
-        if (($Host.UI -ne $null) -and ($Host.UI.RawUI -ne $null) -and ($Host.UI.RawUI.ForegroundColor -ne $null)) {
-            $previousColor = $Host.UI.RawUI.ForegroundColor
-            $Host.UI.RawUI.ForegroundColor = $foregroundcolor
-        }
-    }
-
-    $message
-
-    if ($previousColor -ne $null) {
-        $Host.UI.RawUI.ForegroundColor = $previousColor
-    }
-}
-
-function LoadModules {
-    $currentConfig = $psake.context.peek().config
-    if ($currentConfig.modules) {
-
-        $scope = $currentConfig.moduleScope
-
-        $global = [string]::Equals($scope, "global", [StringComparison]::CurrentCultureIgnoreCase)
-
-        $currentConfig.modules | foreach {
-            resolve-path $_ | foreach {
-                "Loading module: $_"
-                $module = import-module $_ -passthru -DisableNameChecking -global:$global
-                if (!$module) {
-                    throw ($msgs.error_loading_module -f $_.Name)
-                }
-            }
-        }
-        ""
-    }
-}
-
-function LoadConfiguration {
-    param(
-        [string] $configdir = $PSScriptRoot
-    )
-
-    $psakeConfigFilePath = (join-path $configdir "psake-config.ps1")
-
-    if (test-path $psakeConfigFilePath -pathType Leaf) {
-        try {
-            $config = GetCurrentConfigurationOrDefault
-            . $psakeConfigFilePath
-        } catch {
-            throw "Error Loading Configuration from psake-config.ps1: " + $_
-        }
-    }
-}
-
-function GetCurrentConfigurationOrDefault() {
-    if ($psake.context.count -gt 0) {
-        return $psake.context.peek().config
-    } else {
-        return $psake.config_default
-    }
-}
-
-function CreateConfigurationForNewContext {
-    param(
-        [string] $buildFile,
-        [string] $framework
-    )
-
-    $previousConfig = GetCurrentConfigurationOrDefault
-
-    $config = new-object psobject -property @{
-        buildFileName = $previousConfig.buildFileName;
-        framework = $previousConfig.framework;
-        taskNameFormat = $previousConfig.taskNameFormat;
-        verboseError = $previousConfig.verboseError;
-        coloredOutput = $previousConfig.coloredOutput;
-        modules = $previousConfig.modules;
-        moduleScope =  $previousConfig.moduleScope;
-    }
-
-    if ($framework) {
-        $config.framework = $framework;
-    }
-
-    if ($buildFile) {
-        $config.buildFileName = $buildFile;
-    }
-
-    return $config
-}
-
-function ConfigureBuildEnvironment {
-    $framework = $psake.context.peek().config.framework
-    if ($framework -cmatch '^((?:\d+\.\d+)(?:\.\d+){0,1})(x86|x64){0,1}$') {
-        $versionPart = $matches[1]
-        $bitnessPart = $matches[2]
-    } else {
-        throw ($msgs.error_invalid_framework -f $framework)
-    }
-    $versions = $null
-    $buildToolsVersions = $null
-    switch ($versionPart) {
-        '1.0' {
-            $versions = @('v1.0.3705')
-        }
-        '1.1' {
-            $versions = @('v1.1.4322')
-        }
-        '2.0' {
-            $versions = @('v2.0.50727')
-        }
-        '3.0' {
-            $versions = @('v2.0.50727')
-        }
-        '3.5' {
-            $versions = @('v3.5', 'v2.0.50727')
-        }
-        '4.0' {
-            $versions = @('v4.0.30319')
-        }
-        {($_ -eq '4.5.1') -or ($_ -eq '4.5.2')} {
-            $versions = @('v4.0.30319')
-            $buildToolsVersions = @('14.0', '12.0')
-        }
-        {($_ -eq '4.6') -or ($_ -eq '4.6.1')} {
-            $versions = @('v4.0.30319')
-            $buildToolsVersions = @('14.0')
-        }
-
-        default {
-            throw ($msgs.error_unknown_framework -f $versionPart, $framework)
-        }
-    }
-
-    $bitness = 'Framework'
-    if ($versionPart -ne '1.0' -and $versionPart -ne '1.1') {
-        switch ($bitnessPart) {
-            'x86' {
-                $bitness = 'Framework'
-                $buildToolsKey = 'MSBuildToolsPath32'
-            }
-            'x64' {
-                $bitness = 'Framework64'
-                $buildToolsKey = 'MSBuildToolsPath'
-            }
-            { [string]::IsNullOrEmpty($_) } {
-                $ptrSize = [System.IntPtr]::Size
-                switch ($ptrSize) {
-                    4 {
-                        $bitness = 'Framework'
-                        $buildToolsKey = 'MSBuildToolsPath32'
-                    }
-                    8 {
-                        $bitness = 'Framework64'
-                        $buildToolsKey = 'MSBuildToolsPath'
-                    }
-                    default {
-                        throw ($msgs.error_unknown_pointersize -f $ptrSize)
-                    }
-                }
-            }
-            default {
-                throw ($msgs.error_unknown_bitnesspart -f $bitnessPart, $framework)
-            }
-        }
-    }
-    $frameworkDirs = @()
-    if ($buildToolsVersions -ne $null) {
-        foreach($ver in $buildToolsVersions) {
-            if (Test-Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$ver") {
-                $frameworkDirs += (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$ver" -Name $buildToolsKey).$buildToolsKey
-            }
-        }
-    }
-    $frameworkDirs = $frameworkDirs + @($versions | foreach { "$env:windir\Microsoft.NET\$bitness\$_\" })
-
-    for ($i = 0; $i -lt $frameworkDirs.Count; $i++) {
-        $dir = $frameworkDirs[$i]
-        if ($dir -Match "\$\(Registry:HKEY_LOCAL_MACHINE(.*?)@(.*)\)") {
-            $key = "HKLM:" + $matches[1]
-            $name = $matches[2]
-            $dir = (Get-ItemProperty -Path $key -Name $name).$name
-            $frameworkDirs[$i] = $dir
-        }
-    }
-
-    $frameworkDirs | foreach { Assert (test-path $_ -pathType Container) ($msgs.error_no_framework_install_dir_found -f $_)}
-
-    $env:path = ($frameworkDirs -join ";") + ";$env:path"
-    # if any error occurs in a PS function then "stop" processing immediately
-    # this does not effect any external programs that return a non-zero exit code
-    $global:ErrorActionPreference = "Stop"
-}
-
-function ExecuteInBuildFileScope {    
-    param([string]$buildFile, $module, [scriptblock]$sb)
-    
-    # Execute the build file to set up the tasks and defaults
-    Assert (test-path $buildFile -pathType Leaf) ($msgs.error_build_file_not_found -f $buildFile)
-
-    $psake.build_script_file = get-item $buildFile
-    $psake.build_script_dir = $psake.build_script_file.DirectoryName
-    $psake.build_success = $false
-
-    $psake.context.push(@{
-        "taskSetupScriptBlock" = {};
-        "taskTearDownScriptBlock" = {};
-        "executedTasks" = new-object System.Collections.Stack;
-        "callStack" = new-object System.Collections.Stack;
-        "originalEnvPath" = $env:path;
-        "originalDirectory" = get-location;
-        "originalErrorActionPreference" = $global:ErrorActionPreference;
-        "tasks" = @{};
-        "aliases" = @{};
-        "properties" = @();
-        "includes" = new-object System.Collections.Queue;
-        "config" = CreateConfigurationForNewContext $buildFile $framework
-    })
-
-    LoadConfiguration $psake.build_script_dir
-
-    set-location $psake.build_script_dir
-
-    LoadModules
-
-    $frameworkOldValue = $framework
-    . $psake.build_script_file.FullName
-
-    $currentContext = $psake.context.Peek()
-
-    if ($framework -ne $frameworkOldValue) {
-        writecoloredoutput $msgs.warning_deprecated_framework_variable -foregroundcolor Yellow
-        $currentContext.config.framework = $framework
-    }
-
-    ConfigureBuildEnvironment
-
-    while ($currentContext.includes.Count -gt 0) {
-        $includeFilename = $currentContext.includes.Dequeue()
-        . $includeFilename
-    }
-
-    & $sb $currentContext $module
-}
-
-function CleanupEnvironment {
-    if ($psake.context.Count -gt 0) {
-        $currentContext = $psake.context.Peek()
-        $env:path = $currentContext.originalEnvPath
-        Set-Location $currentContext.originalDirectory
-        $global:ErrorActionPreference = $currentContext.originalErrorActionPreference
-        [void] $psake.context.Pop()
-    }
-}
-
-function SelectObjectWithDefault
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(ValueFromPipeline=$true)]
-        [PSObject]
-        $InputObject,
-        [string]
-        $Name,
-        $Value
-    )
-
-    process {
-        if ($_ -eq $null) { $Value }
-        elseif ($_ | Get-Member -Name $Name) {
-          $_.$Name
-        }
-        elseif (($_ -is [Hashtable]) -and ($_.Keys -contains $Name)) {
-          $_.$Name
-        }
-        else { $Value }
-    }
-}
-
-# borrowed from Jeffrey Snover http://blogs.msdn.com/powershell/archive/2006/12/07/resolve-error.aspx
-# modified to better handle SQL errors
-function ResolveError
-{
-    [CmdletBinding()]
-    param(
-        [Parameter(ValueFromPipeline=$true)]
-        $ErrorRecord=$Error[0],
-        [Switch]
-        $Short
-    )
-
-    process {
-        if ($_ -eq $null) { $_ = $ErrorRecord }
-        $ex = $_.Exception
-
-        if (-not $Short) {
-            $error_message = "`nErrorRecord:{0}ErrorRecord.InvocationInfo:{1}Exception:`n{2}"
-            $formatted_errorRecord = $_ | format-list * -force | out-string
-            $formatted_invocationInfo = $_.InvocationInfo | format-list * -force | out-string
-            $formatted_exception = ''
-
-            $i = 0
-            while ($ex -ne $null) {
-                $i++
-                $formatted_exception += ("$i" * 70) + "`n" +
-                    ($ex | format-list * -force | out-string) + "`n"
-                $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
-            }
-
-            return $error_message -f $formatted_errorRecord, $formatted_invocationInfo, $formatted_exception
-        }
-
-        $lastException = @()
-        while ($ex -ne $null) {
-            $lastMessage = $ex | SelectObjectWithDefault -Name 'Message' -Value ''
-            $lastException += ($lastMessage -replace "`n", '')
-            if ($ex -is [Data.SqlClient.SqlException]) {
-                $lastException += "(Line [$($ex.LineNumber)] " +
-                    "Procedure [$($ex.Procedure)] Class [$($ex.Class)] " +
-                    " Number [$($ex.Number)] State [$($ex.State)] )"
-            }
-            $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
-        }
-        $shortException = $lastException -join ' --> '
-
-        $header = $null
-        $current = $_
-        $header = (($_.InvocationInfo |
-            SelectObjectWithDefault -Name 'PositionMessage' -Value '') -replace "`n", ' '),
-            ($_ | SelectObjectWithDefault -Name 'Message' -Value ''),
-            ($_ | SelectObjectWithDefault -Name 'Exception' -Value '') |
-                ? { -not [String]::IsNullOrEmpty($_) } |
-                Select -First 1
-
-        $delimiter = ''
-        if ((-not [String]::IsNullOrEmpty($header)) -and
-            (-not [String]::IsNullOrEmpty($shortException)))
-            { $delimiter = ' [<<==>>] ' }
-
-        return "$($header)$($delimiter)Exception: $($shortException)"
-    }
-}
-
-function GetTasksFromContext($currentContext) {    
-
-    $docs = $currentContext.tasks.Keys | foreach-object {
-
-        $task = $currentContext.tasks.$_
-        new-object PSObject -property @{
-            Name = $task.Name;
-            Alias = $task.Alias;
-            Description = $task.Description;
-            DependsOn = $task.DependsOn;
-        }
-    }
-
-    return $docs
-}
-
-function WriteDocumentation($showDetailed) {
-
-    $currentContext = $psake.context.Peek()
-
-    if ($currentContext.tasks.default) {
-        $defaultTaskDependencies = $currentContext.tasks.default.DependsOn
-    } else {
-        $defaultTaskDependencies = @()
-    }
-    
-    $docs = GetTasksFromContext $currentContext | 
-                Where   {$_.Name -ne 'default'} | 
-                ForEach {
-                    $isDefault = $null
-                    if ($defaultTaskDependencies -contains $_.Name) { 
-                        $isDefault = $true 
-                    }
-                    return Add-Member -InputObject $_ 'Default' $isDefault -PassThru
-                }
-
-    if ($showDetailed) {
-        $docs | sort 'Name' | format-list -property Name,Alias,Description,@{Label="Depends On";Expression={$_.DependsOn -join ', '}},Default
-    } else {
-        $docs | sort 'Name' | format-table -autoSize -wrap -property Name,Alias,@{Label="Depends On";Expression={$_.DependsOn -join ', '}},Default,Description
-    }
-}
-
-function WriteTaskTimeSummary($invokePsakeDuration) {
-    if ($psake.context.count -gt 0) {
-        "-" * 70
-        "Build Time Report"
-        "-" * 70
-        $list = @()
-        $currentContext = $psake.context.Peek()
-        while ($currentContext.executedTasks.Count -gt 0) {
-            $taskKey = $currentContext.executedTasks.Pop()
-            $task = $currentContext.tasks.$taskKey
-            if ($taskKey -eq "default") {
-                continue
-            }
-            $list += new-object PSObject -property @{
-                Name = $task.Name;
-                Duration = $task.Duration
-            }
-        }
-        [Array]::Reverse($list)
-        $list += new-object PSObject -property @{
-            Name = "Total:";
-            Duration = $invokePsakeDuration
-        }
-        # using "out-string | where-object" to filter out the blank line that format-table prepends
-        $list | format-table -autoSize -property Name,Duration | out-string -stream | where-object { $_ }
-    }
-}
-
-DATA msgs {
-convertfrom-stringdata @'
-    error_invalid_task_name = Task name should not be null or empty string.
-    error_task_name_does_not_exist = Task {0} does not exist.
-    error_circular_reference = Circular reference found for task {0}.
-    error_missing_action_parameter = Action parameter must be specified when using PreAction or PostAction parameters for task {0}.
-    error_corrupt_callstack = Call stack was corrupt. Expected {0}, but got {1}.
-    error_invalid_framework = Invalid .NET Framework version, {0} specified.
-    error_unknown_framework = Unknown .NET Framework version, {0} specified in {1}.
-    error_unknown_pointersize = Unknown pointer size ({0}) returned from System.IntPtr.
-    error_unknown_bitnesspart = Unknown .NET Framework bitness, {0}, specified in {1}.
-    error_no_framework_install_dir_found = No .NET Framework installation directory found at {0}.
-    error_bad_command = Error executing command {0}.
-    error_default_task_cannot_have_action = 'default' task cannot specify an action.
-    error_duplicate_task_name = Task {0} has already been defined.
-    error_duplicate_alias_name = Alias {0} has already been defined.
-    error_invalid_include_path = Unable to include {0}. File not found.
-    error_build_file_not_found = Could not find the build file {0}.
-    error_no_default_task = 'default' task required.
-    error_loading_module = Error loading module {0}.
-    warning_deprecated_framework_variable = Warning: Using global variable $framework to set .NET framework version used is deprecated. Instead use Framework function or configuration file psake-config.ps1.
-    required_variable_not_set = Variable {0} must be set to run task {1}.
-    postcondition_failed = Postcondition failed for task {0}.
-    precondition_was_false = Precondition was false, not executing task {0}.
-    continue_on_error = Error in task {0}. {1}
-    build_success = Build Succeeded!
-'@
-}
-
-Import-LocalizedData -BindingVariable msgs -FileName messages.psd1 -ErrorAction $script:IgnoreError
-
-$scriptDir = Split-Path $MyInvocation.MyCommand.Path
-$manifestPath = Join-Path $scriptDir psake.psd1
-$manifest = Test-ModuleManifest -Path $manifestPath -WarningAction SilentlyContinue
-
-$script:psake = @{}
-
-$psake.version = $manifest.Version.ToString()
-$psake.context = new-object system.collections.stack # holds onto the current state of all variables
-$psake.run_by_psake_build_tester = $false # indicates that build is being run by psake-BuildTester
-$psake.config_default = new-object psobject -property @{
-    buildFileName = "default.ps1";
-    framework = "4.0";
-    taskNameFormat = "Executing {0}";
-    verboseError = $false;
-    coloredOutput = $true;
-    modules = $null;
-    moduleScope = "";
-} # contains default configuration, can be overriden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script
-
-$psake.build_success = $false # indicates that the current build was successful
-$psake.build_script_file = $null # contains a System.IO.FileInfo for the current build script
-$psake.build_script_dir = "" # contains a string with fully-qualified path to current build script
-
-LoadConfiguration
-
-export-modulemember -function Invoke-psake, Invoke-Task, Get-PSakeScriptTasks, Task, Properties, Include, FormatTaskName, TaskSetup, TaskTearDown, Framework, Assert, Exec -variable psake
diff --git a/.build/psake/LICENSE b/.build/psake/LICENSE
new file mode 100644
index 0000000..154b4e6
--- /dev/null
+++ b/.build/psake/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2012-2018 James Kovacs, Damian Hickey, Brandon Olin, and Contributors
+
+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/.build/psake/en-US/psake.psm1-help.xml.old b/.build/psake/en-US/psake.psm1-help.xml.old
new file mode 100644
index 0000000..d67c446
--- /dev/null
+++ b/.build/psake/en-US/psake.psm1-help.xml.old
@@ -0,0 +1,2265 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<helpItems schema="maml">
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Invoke-psake</command:name>
+      <maml:description>
+        <maml:para>Runs a psake build script.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb>Invoke</command:verb>
+      <command:noun>psake</command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This function runs a psake build script</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Invoke-psake</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>buildFile</maml:name>
+          <command:parameterValue required="false" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>taskList</maml:name>
+          <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>framework</maml:name>
+          <command:parameterValue required="false" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>docs</maml:name>
+          <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>parameters</maml:name>
+          <command:parameterValue required="false" variableLength="false">Hashtable</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>properties</maml:name>
+          <command:parameterValue required="false" variableLength="false">Hashtable</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>nologo</maml:name>
+          <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>notr</maml:name>
+          <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        </command:parameter>
+      </command:syntaxItem>
+    </command:syntax>
+    <command:parameters>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>buildFile</maml:name>
+        <maml:description>
+          <maml:para>The path to the psake build script to execute</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue>'psakefile.ps1'</dev:defaultValue>
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="1">
+        <maml:name>taskList</maml:name>
+        <maml:description>
+          <maml:para>A comma-separated list of task names to execute</maml:para>
+        </maml:description>
+        <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+        <dev:type>
+          <maml:name>String[]</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="2">
+        <maml:name>framework</maml:name>
+       <maml:description>
+            <maml:para>The version of the .NET framework you want to use during build. You can append x86 or x64 to force a specific framework. If not specified, x86 or x64 will be detected based on the bitness of the PowerShell process.
+Possible values: '1.0', '1.1', '2.0', '2.0x86', '2.0x64', '3.0', '3.0x86', '3.0x64', '3.5', '3.5x86', '3.5x64', '4.0', '4.0x86', '4.0x64', '4.5', '4.5x86', '4.5x64', '4.5.1', '4.5.1x86', '4.5.1x64'</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue>'3.5'</dev:defaultValue>
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="3">
+        <maml:name>docs</maml:name>
+        <maml:description>
+            <maml:para>Prints a list of tasks and their descriptions</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        <dev:type>
+          <maml:name>SwitchParameter</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="4">
+        <maml:name>parameters</maml:name>
+         <maml:description>
+            <maml:para>A hashtable containing parameters to be passed into the current build script.  These parameters will be processed before the 'Properties' function of the script is processed.  This means you can access parameters from within the 'Properties' function!
+</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">Hashtable</command:parameterValue>
+        <dev:type>
+          <maml:name>Hashtable</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="5">
+        <maml:name>properties</maml:name>
+         <maml:description>
+            <maml:para>A hashtable containing properties to be passed into the current build script.  These properties will override matching properties that are found in the 'Properties' function of the script.</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">Hashtable</command:parameterValue>
+        <dev:type>
+          <maml:name>Hashtable</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="6">
+        <maml:name>nologo</maml:name>
+         <maml:description>
+            <maml:para>Do not display the startup banner and copyright message.</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        <dev:type>
+          <maml:name>SwitchParameter</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="6">
+        <maml:name>notr</maml:name>
+         <maml:description>
+            <maml:para>Do not display the time report.</maml:para>
+          </maml:description>
+        <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+        <dev:type>
+          <maml:name>SwitchParameter</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue />
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+      <maml:alert>
+    <maml:para>---- Exceptions ----</maml:para>
+    <maml:para>If there is an exception thrown during the running of a build script psake will set the '$psake.build_success' variable to $false. To detect failue outside PowerShell (for example by build server), finish PowerShell process with non-zero exit code when '$psake.build_success' is $false. Calling psake from 'cmd.exe' with 'psake.cmd' will give you that behaviour.</maml:para>
+    <maml:para></maml:para>
+    </maml:alert>
+    <maml:alert>
+    <maml:para>---- $psake variable ----</maml:para>
+        <maml:para>When the psake module is loaded a variable called $psake is created which is a hashtable
+containing some variables:
+
+$psake.version                      # contains the current version of psake
+$psake.context                      # holds onto the current state of all variables
+$psake.run_by_psake_build_tester    # indicates that build is being run by psake-BuildTester
+$psake.config_default               # contains default configuration
+                                    # can be overriden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script
+$psake.build_success                # indicates that the current build was successful
+$psake.build_script_file            # contains a System.IO.FileInfo for the current build script
+$psake.build_script_dir             # contains the fully qualified path to the current build script
+
+You should see the following when you display the contents of the $psake variable right after importing psake
+
+PS projects:\psake> Import-Module .\psake.psm1
+PS projects:\psake> $psake
+
+Name                           Value
+----                           -----
+run_by_psake_build_tester      False
+version                        4.2
+build_success                  False
+build_script_file
+build_script_dir
+config_default                 @{framework=3.5; ...
+context                        {}
+
+After a build is executed the following $psake values are updated: build_script_file, build_script_dir, build_success
+
+PS projects:\psake> Invoke-psake .\examples\psakefile.ps1
+Executing task: Clean
+Executed Clean!
+Executing task: Compile
+Executed Compile!
+Executing task: Test
+Executed Test!
+
+Build Succeeded!
+
+----------------------------------------------------------------------
+Build Time Report
+----------------------------------------------------------------------
+Name    Duration
+----    --------
+Clean   00:00:00.0798486
+Compile 00:00:00.0869948
+Test    00:00:00.0958225
+Total:  00:00:00.2712414
+
+PS projects:\psake> $psake
+
+Name                           Value
+----                           -----
+build_script_file              YOUR_PATH\examples\psakefile.ps1
+run_by_psake_build_tester      False
+build_script_dir               YOUR_PATH\examples
+context                        {}
+version                        4.2
+build_success                  True
+config_default                 @{framework=3.5; ...
+
+</maml:para>
+  <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>Runs the 'default' task in the '.build.ps1' build script</maml:para>
+          <maml:para />
+          <maml:para />
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    <command:example>
+        <maml:title>--------------  EXAMPLE 2 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake '.\build.ps1' Tests,Package</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>Runs the 'Tests' and 'Package' tasks in the '.build.ps1' build script</maml:para>
+          <maml:para />
+          <maml:para />
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    <command:example>
+        <maml:title>--------------  EXAMPLE 3 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake Tests</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>This example will run the 'Tests' tasks in the 'psakefile.ps1' build script.  The 'psakefile.ps1' is assumed to be in the current directory.</maml:para>
+          <maml:para />
+          <maml:para />
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    <command:example>
+        <maml:title>--------------  EXAMPLE 4 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake 'Tests, Package'</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>This example will run the 'Tests' and 'Package' tasks in the 'psakefile.ps1' build script. The 'psakefile.ps1' is assumed to be in the current directory.</maml:para>
+          <maml:para>NOTE: The quotes around the list of tasks to execute is required if you want to execute more than 1 task.</maml:para>
+          <maml:para />
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+     <command:example>
+        <maml:title>--------------  EXAMPLE 5 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake .\build.ps1 -docs</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>Prints a report of all the tasks and their dependencies and descriptions and then exits</maml:para>
+          <maml:para />
+          <maml:para />
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+     <command:example>
+        <maml:title>--------------  EXAMPLE 6 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake .\parameters.ps1 -parameters @{"p1"="v1";"p2"="v2"}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>Runs the build script called 'parameters.ps1' and passes in parameters 'p1' and 'p2' with values 'v1' and 'v2'</maml:para>
+          <maml:para>Here's the .\parameters.ps1 build script:</maml:para>
+      <maml:para />
+      <maml:para>
+      properties {
+  $my_property = $p1 + $p2
+}
+
+task default -depends TestParams
+
+task TestParams {
+  Assert ($my_property -ne $null) '$my_property should not be null'
+}</maml:para>
+          <maml:para />
+      <maml:para>Notice how you can refer to the parameters that were passed into the script from within the “properties” function. The value of the $p1 variable should be the string “v1” and the value of the $p2 variable should be “v2”.</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    <command:example>
+        <maml:title>--------------  EXAMPLE 7 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-psake .\properties.ps1 -properties @{"x"="1";"y"="2"}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>Runs the build script called 'properties.ps1' and passes in parameters 'x' and 'y' with values '1' and '2'</maml:para>
+      <maml:para>This feature allows you to over-ride existing properties in your build script.</maml:para>
+          <maml:para />
+      <maml:para>Here's the .\properties.ps1 build script</maml:para>
+          <maml:para>properties {
+  $x = $null
+  $y = $null
+  $z = $null
+}
+
+task default -depends TestProperties
+
+task TestProperties {
+  Assert ($x -ne $null) "x should not be null"
+  Assert ($y -ne $null) "y should not be null"
+  Assert ($z -eq $null) "z should be null"
+}
+</maml:para>
+    <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>TaskTearDown</command:name>
+      <maml:description>
+        <maml:para>Adds a scriptblock to the build that will be executed after each task</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This function will accept a scriptblock that will be executed after each
+task in the build script.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>TaskTearDown</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>teardown</maml:name>
+          <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>teardown</maml:name>
+        <maml:description>
+          <maml:para>A scriptblock to execute</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        <dev:type>
+          <maml:name>ScriptBlock</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script is shown below:
+
+Task default -depends Test
+
+Task Test -depends Compile, Clean {
+}
+
+Task Compile -depends Clean {
+}
+
+Task Clean {
+}
+
+TaskTearDown {
+  "Running 'TaskTearDown' for task $context.Peek().currentTaskName"
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The script above produces the following output:</maml:para>
+          <maml:para>Executing task, Clean...
+Running 'TaskTearDown' for task Clean
+Executing task, Compile...
+Running 'TaskTearDown' for task Compile
+Executing task, Test...
+Running 'TaskTearDown' for task Test
+
+Build Succeeded</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>TaskSetup</command:name>
+      <maml:description>
+        <maml:para>Adds a scriptblock that will be executed before each task</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This function will accept a scriptblock that will be executed before each
+task in the build script.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>TaskSetup</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>setup</maml:name>
+          <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>setup</maml:name>
+        <maml:description>
+          <maml:para>A scriptblock to execute</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        <dev:type>
+          <maml:name>ScriptBlock</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script is shown below:
+
+Task default -depends Test
+
+Task Test -depends Compile, Clean {
+}
+
+Task Compile -depends Clean {
+}
+
+Task Clean {
+}
+
+TaskSetup {
+  "Running 'TaskSetup' for task $context.Peek().currentTaskName"
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The script above produces the following output:</maml:para>
+          <maml:para>Running 'TaskSetup' for task Clean
+Executing task, Clean...
+Running 'TaskSetup' for task Compile
+Executing task, Compile...
+Running 'TaskSetup' for task Test
+Executing task, Test...
+
+Build Succeeded</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Framework</command:name>
+      <maml:description>
+        <maml:para>Sets the version of the .NET framework you want to use during build.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This function will accept a string containing version of the .NET framework to use during build. Possible values: '1.0', '1.1', '2.0', '2.0x86', '2.0x64', '3.0', '3.0x86', '3.0x64', '3.5', '3.5x86', '3.5x64', '4.0', '4.0x86', '4.0x64', '4.5', '4.5x86', '4.5x64', '4.5.1', '4.5.1x86', '4.5.1x64'. Default is '3.5*', where x86 or x64 will be detected based on the bitness of the PowerShell process.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Framework</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>framework</maml:name>
+          <command:parameterValue required="true" variableLength="false">string</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>framework</maml:name>
+        <maml:description>
+          <maml:para>Version of the .NET framework to use during build.</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">string</command:parameterValue>
+        <dev:type>
+          <maml:name>string</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+  <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+  <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <dev:code>
+Framework "4.0"
+
+Task default -depends Compile
+
+Task Compile -depends Clean {
+  msbuild /version
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The script above will output detailed version of msbuid v4</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    </command:examples>
+  <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>FormatTaskName</command:name>
+      <maml:description>
+        <maml:para>This function allows you to change how psake renders the task name during a build.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This function takes either a string which represents a format string (formats using the -f format operator see “help about_operators”) or it can accept a script block that has a single parameter that is the name of the task that will be executed.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>FormatTaskName</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>format</maml:name>
+          <command:parameterValue required="true" variableLength="false">String or ScriptBlock</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>format</maml:name>
+        <maml:description>
+          <maml:para>A format string or a scriptblock to execute</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">String or ScriptBlock</command:parameterValue>
+        <dev:type>
+          <maml:name>String or ScriptBlock</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script that uses a format string is shown below:
+
+Task default -depends TaskA, TaskB, TaskC
+
+FormatTaskName "-------- {0} --------"
+
+Task TaskA {
+  "TaskA is executing"
+}
+
+Task TaskB {
+  "TaskB is executing"
+}
+
+Task TaskC {
+  "TaskC is executing"
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The script above produces the following output:</maml:para>
+          <maml:para>-------- TaskA --------
+TaskA is executing
+-------- TaskB --------
+TaskB is executing
+-------- TaskC --------
+TaskC is executing
+
+Build Succeeded!</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+     <command:example>
+        <maml:title>--------------  EXAMPLE 2 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script that uses a ScriptBlock is shown below:
+
+Task default -depends TaskA, TaskB, TaskC
+
+FormatTaskName {
+   param($taskName)
+   write-host "Executing Task: $taskName" -foregroundcolor blue
+}
+
+Task TaskA {
+  "TaskA is executing"
+}
+
+Task TaskB {
+  "TaskB is executing"
+}
+
+Task TaskC {
+  "TaskC is executing"
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The preceding example uses the scriptblock parameter to the FormatTaskName function to render each task name in the color blue.</maml:para>
+          <maml:para>Note: the $taskName parameter is arbitrary it could be named anything</maml:para>
+          <maml:para />
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10" xmlns:MSHelp="http://msdn.microsoft.com/mshelp">
+  <!--Generated by PS Cmdlet Help Editor-->
+    <command:details>
+      <command:name>Get-PSakeScriptTasks</command:name>
+      <maml:description>
+        <maml:para>Returns meta data about all the tasks defined in the provided psake script.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb>Get</command:verb>
+      <command:noun>PSakeScriptTasks</command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>Returns meta data about all the tasks defined in the provided psake script. </maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <maml:name>Get-PSakeScriptTasks</maml:name>
+        <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="0">
+          <maml:name>buildFile</maml:name>
+          <maml:description>
+            <maml:para>The path to the psake build script to read the tasks from.</maml:para>
+          </maml:description>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+        <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="named">
+          <maml:name>InformationAction</maml:name>
+          <maml:description>
+            <maml:para />
+          </maml:description>
+          <command:parameterValue required="true" variableLength="false">ActionPreference</command:parameterValue>
+        </command:parameter>
+        <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="named">
+          <maml:name>InformationVariable</maml:name>
+          <maml:description>
+            <maml:para />
+          </maml:description>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+      </command:syntaxItem>
+    </command:syntax>
+    <command:parameters>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="0">
+        <maml:name>buildFile</maml:name>
+        <maml:description>
+          <maml:para>The path to the psake build script to read the tasks from.</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri/>
+        </dev:type>
+        <dev:defaultValue>&apos;psakefile.ps1&apos;</dev:defaultValue>
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="named">
+        <maml:name>InformationAction</maml:name>
+        <maml:description>
+          <maml:para />
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">ActionPreference</command:parameterValue>
+        <dev:type>
+          <maml:name>ActionPreference</maml:name>
+          <maml:uri/>
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+      <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false" position="named">
+        <maml:name>InformationVariable</maml:name>
+        <maml:description>
+          <maml:para />
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri/>
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name></maml:name>
+          <maml:uri></maml:uri>
+          <maml:description/>
+        </dev:type>
+        <maml:description>
+  <maml:para />
+        </maml:description>
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name></maml:name>
+          <maml:uri></maml:uri>
+          <maml:description/>
+        </dev:type>
+        <maml:description>
+  <maml:para />
+        </maml:description>
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors></command:terminatingErrors>
+    <command:nonTerminatingErrors></command:nonTerminatingErrors>
+    <maml:alertSet>
+      <maml:title></maml:title>
+      <maml:alert>
+        <maml:para />
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+    </command:examples>
+    <maml:relatedLinks>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Include</command:name>
+      <maml:description>
+        <maml:para>Include the functions or code of another powershell script file into the current build script's scope</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>A build script may declare an "includes" function which allows you to define a file containing powershell code to be included and added to the scope of the currently running build script. Code from such file will be executed after code from build script.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Include</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>fileNamePathToInclude</maml:name>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>fileNamePathToInclude</maml:name>
+        <maml:description>
+          <maml:para>A string containing the path and name of the powershell file to include</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script is shown below:
+
+Include ".\build_utils.ps1"
+
+Task default -depends Test
+
+Task Test -depends Compile, Clean {
+}
+
+Task Compile -depends Clean {
+}
+
+Task Clean {
+}</dev:code>
+        <dev:remarks>
+          <maml:para>Description</maml:para>
+          <maml:para>-----------</maml:para>
+          <maml:para>The script above includes all the functions and variables defined in the ".\build_utils.ps1" script into the current build script's scope</maml:para>
+          <maml:para>Note: You can have more than 1 "Include" function defined in the build script</maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Properties</command:name>
+      <maml:description>
+        <maml:para>Define a scriptblock that contains assignments to variables that will be available to all tasks in the build script</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>A build script may declare a "Properies" function which allows you to define variables that will be available to all the "Task" functions in the build script. </maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Properties</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>properties</maml:name>
+          <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>properties</maml:name>
+        <maml:description>
+          <maml:para>The script block containing all the variable assignment statements</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        <dev:type>
+          <maml:name>ScriptBlock</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script is shown below:
+
+Properties {
+  $build_dir = "c:\build"
+  $connection_string = "datasource=localhost;initial catalog=northwind;integrated security=sspi"
+}
+
+Task default -depends Test
+
+Task Test -depends Compile, Clean {
+}
+
+Task Compile -depends Clean {
+}
+
+Task Clean {
+}</dev:code>
+        <dev:remarks>
+      <maml:para>Description</maml:para>
+      <maml:para>-----------</maml:para>
+      <maml:para>Note: You can have more than 1 "Properties" function defined in the build script</maml:para>
+      <maml:para></maml:para>
+      <maml:para></maml:para>
+      <maml:para></maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Task</command:name>
+      <maml:description>
+        <maml:para>Defines a build task to be executed by psake</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+  <maml:description>
+      <maml:para>This function creates a 'task' object that will be used by the psake engine to execute a build task. Note: There must be at least one task called 'default' in the build script</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Task</command:name>
+        <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Name</maml:name>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Action</maml:name>
+          <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>PreAction</maml:name>
+          <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>PostAction</maml:name>
+          <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Precondition</maml:name>
+          <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Postcondition</maml:name>
+          <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>ContinueOnError</maml:name>
+          <command:parameterValue required="false" variableLength="false">Boolean</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Depends</maml:name>
+          <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>RequiredVariables</maml:name>
+          <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+        </command:parameter>
+    <command:parameter require="false" variableLength="false" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>Description</maml:name>
+          <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+  <command:parameters>
+    <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Name</maml:name>
+      <maml:description>
+        <maml:para>The name of the task</maml:para>
+      </maml:description>
+      <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+      <dev:type>
+        <maml:name>String</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Action</maml:name>
+      <maml:description>
+        <maml:para>A scriptblock containing the statements to execute for the task.</maml:para>
+      </maml:description>
+      <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+      <dev:type>
+        <maml:name>ScriptBlock</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>PreAction</maml:name>
+      <maml:description>
+        <maml:para>A scriptblock to be executed before the 'Action' scriptblock.  Note: This parameter is ignored if the 'Action' scriptblock is not defined.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+      <dev:type>
+        <maml:name>ScriptBlock</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>PostAction</maml:name>
+      <maml:description>
+        <maml:para>A scriptblock to be executed after the 'Action' scriptblock.  Note: This parameter is ignored if the 'Action' scriptblock is not defined.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+      <dev:type>
+        <maml:name>ScriptBlock</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Precondition</maml:name>
+      <maml:description>
+        <maml:para>A scriptblock that is executed to determine if the task is executed or skipped. This scriptblock should return $true or $false</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+      <dev:type>
+        <maml:name>ScriptBlock</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Postcondition</maml:name>
+      <maml:description>
+        <maml:para>A scriptblock that is executed to determine if the task completed its job correctly.  An exception is thrown if the scriptblock returns $false.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">ScriptBlock</command:parameterValue>
+      <dev:type>
+        <maml:name>ScriptBlock</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>ContinueOnError</maml:name>
+      <maml:description>
+        <maml:para>If this switch parameter is set then the task will not cause the build to fail when an exception is thrown by the task</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">SwitchParameter</command:parameterValue>
+      <dev:type>
+        <maml:name>SwitchParameter</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Depends</maml:name>
+      <maml:description>
+        <maml:para>An array of task names that this task depends on.  These tasks will be executed before the current task is executed.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+      <dev:type>
+        <maml:name>String[]</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>RequiredVariables</maml:name>
+      <maml:description>
+        <maml:para>An array of names of variables that must be set to run this task.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">String[]</command:parameterValue>
+      <dev:type>
+        <maml:name>String[]</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+    <command:parameter required="false" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+      <maml:name>Description</maml:name>
+      <maml:description>
+        <maml:para>A description of the task.</maml:para>
+      </maml:description>
+      <command:parameterValue required="false" variableLength="false">String</command:parameterValue>
+      <dev:type>
+        <maml:name>String</maml:name>
+        <maml:uri />
+      </dev:type>
+      <dev:defaultValue></dev:defaultValue>
+    </command:parameter>
+  </command:parameters>
+   <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>A sample build script is shown below:
+
+Task default -Depends Test
+
+Task Test -Depends Compile, Clean {
+  "This is a test"
+}
+
+Task Compile -Depends Clean {
+  "Compile"
+}
+
+Task Clean {
+  "Clean"
+}
+
+The 'default' task is required and should not contain an 'Action' parameter.
+It uses the 'Depends' parameter to specify that 'Test' is a dependency
+
+The 'Test' task uses the 'Depends' parameter to specify that 'Compile' and 'Clean' are dependencies
+The 'Compile' task depends on the 'Clean' task.
+
+Note:
+The 'Action' parameter is defaulted to the script block following the 'Clean' task.
+
+An equivalent 'Test' task is shown below:
+
+Task Test -Depends Compile, Clean -Action {
+  $testMessage
+}
+
+The output for the above sample build script is shown below:
+Executing task, Clean...
+Clean
+Executing task, Compile...
+Compile
+Executing task, Test...
+This is a test
+
+Build Succeeded!
+
+----------------------------------------------------------------------
+Build Time Report
+----------------------------------------------------------------------
+Name    Duration
+----    --------
+Clean   00:00:00.0065614
+Compile 00:00:00.0133268
+Test    00:00:00.0225964
+Total:  00:00:00.0782496</dev:code>
+        <dev:remarks>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Properties</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Assert</command:name>
+      <maml:description>
+        <maml:para>Helper function for "Design by Contract" assertion checking.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This is a helper function that makes the code less noisy by eliminating many of the "if" statements that are normally required to verify assumptions in the code.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Assert</command:name>
+        <command:parameter require="true" variableLength="true" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>conditionToCheck</maml:name>
+          <command:parameterValue required="true" variableLength="false">Boolean</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="true" variableLength="true" globbing="false" pipelineInput="false" postion="1">
+          <maml:name>failureMessage</maml:name>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>conditionToCheck</maml:name>
+        <maml:description>
+          <maml:para>The boolean condition to evaluate</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="true">Boolean</command:parameterValue>
+        <dev:type>
+          <maml:name>Boolean</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    <command:parameter required="true" variableLength="true" globbing="false" pipelineInput="false (ByValue)" position="1">
+        <maml:name>failureMessage</maml:name>
+        <maml:description>
+          <maml:para>The error message used for the exception if the conditionToCheck parameter is false</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="true">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Assert $false "This always throws an exception"</dev:code>
+        <dev:remarks>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+    <command:example>
+        <maml:title>--------------  EXAMPLE 2 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Assert ( ($i % 2) -eq 0 ) "$i is not an even number"</dev:code>
+        <dev:remarks>
+    <maml:para>Description</maml:para>
+      <maml:para>-----------</maml:para>
+          <maml:para>This exmaple may throw an exception if $i is not an even number</maml:para>
+          <maml:para></maml:para>
+          <maml:para>Note:</maml:para>
+      <maml:para>It might be necessary to wrap the condition with paranthesis to force PS to evaluate the condition
+so that a boolean value is calculated and passed into the 'conditionToCheck' parameter.
+
+Example:
+    Assert 1 -eq 2 "1 doesn't equal 2"
+
+PS will pass 1 into the condtionToCheck variable and PS will look for a parameter called "eq" and
+throw an exception with the following message "A parameter cannot be found that matches parameter name 'eq'"
+
+The solution is to wrap the condition in () so that PS will evaluate it first.
+
+    Assert (1 -eq 2) "1 doesn't equal 2"
+      </maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+      <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Exec</command:name>
+      <maml:description>
+        <maml:para>Helper function for executing command-line programs.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode to see if an error occcured. If an error is detected then an exception is thrown. This function allows you to run command-line programs without having to explicitly check fthe $lastexitcode variable.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Exec</command:name>
+        <command:parameter require="true" variableLength="true" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>cmd</maml:name>
+          <command:parameterValue required="true" variableLength="false">ScriptBlock</command:parameterValue>
+        </command:parameter>
+        <command:parameter require="true" variableLength="true" globbing="false" pipelineInput="false" postion="1">
+          <maml:name>errorMessage</maml:name>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>cmd</maml:name>
+        <maml:description>
+          <maml:para>The scriptblock to execute.  This scriptblock will typically contain the command-line invocation.</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="true">ScriptBlock</command:parameterValue>
+        <dev:type>
+          <maml:name>Boolean</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    <command:parameter required="false" variableLength="true" globbing="false" pipelineInput="false (ByValue)" position="1">
+        <maml:name>failureMessage</maml:name>
+        <maml:description>
+          <maml:para>The error message used for the exception that is thrown.</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="true">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"</dev:code>
+        <dev:remarks>
+          <maml:para>This example calls the svn command-line client.</maml:para>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+  </command:command>
+
+  <command:command xmlns:maml="http://schemas.microsoft.com/maml/2004/10" xmlns:command="http://schemas.microsoft.com/maml/dev/command/2004/10" xmlns:dev="http://schemas.microsoft.com/maml/dev/2004/10">
+    <command:details>
+      <command:name>Invoke-Task</command:name>
+      <maml:description>
+        <maml:para>Executes another task in the current build script.</maml:para>
+      </maml:description>
+      <maml:copyright>
+        <maml:para />
+      </maml:copyright>
+      <command:verb></command:verb>
+      <command:noun></command:noun>
+      <dev:version />
+    </command:details>
+    <maml:description>
+      <maml:para>This is a function that will allow you to invoke a Task from within another Task in the current build script.</maml:para>
+    </maml:description>
+    <command:syntax>
+      <command:syntaxItem>
+        <command:name>Invoke-Task</command:name>
+        <command:parameter require="true" variableLength="true" globbing="false" pipelineInput="false" postion="0">
+          <maml:name>taskName</maml:name>
+          <command:parameterValue required="true" variableLength="false">String</command:parameterValue>
+        </command:parameter>
+       </command:syntaxItem>
+    </command:syntax>
+   <command:parameters>
+      <command:parameter required="true" variableLength="false" globbing="false" pipelineInput="false (ByValue)" position="0">
+        <maml:name>taskName</maml:name>
+        <maml:description>
+          <maml:para>The name of the task to execute.</maml:para>
+        </maml:description>
+        <command:parameterValue required="true" variableLength="true">String</command:parameterValue>
+        <dev:type>
+          <maml:name>String</maml:name>
+          <maml:uri />
+        </dev:type>
+        <dev:defaultValue></dev:defaultValue>
+      </command:parameter>
+    </command:parameters>
+    <command:inputTypes>
+      <command:inputType>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para />
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:inputType>
+    </command:inputTypes>
+    <command:returnValues>
+      <command:returnValue>
+        <dev:type>
+          <maml:name>None</maml:name>
+          <maml:uri />
+          <maml:description>
+            <maml:para></maml:para>
+          </maml:description>
+        </dev:type>
+        <maml:description />
+      </command:returnValue>
+    </command:returnValues>
+    <command:terminatingErrors />
+    <command:nonTerminatingErrors />
+    <maml:alertSet>
+      <maml:title></maml:title>
+    <maml:alert>
+    <maml:para></maml:para>
+      </maml:alert>
+    </maml:alertSet>
+    <command:examples>
+      <command:example>
+        <maml:title>--------------  EXAMPLE 1 --------------</maml:title>
+        <maml:introduction>
+          <maml:para>C:\PS&gt;</maml:para>
+        </maml:introduction>
+        <dev:code>Invoke-Task "Compile"</dev:code>
+        <dev:remarks>
+          <maml:para>This example calls the "Compile" task.</maml:para>
+          <maml:para></maml:para>
+          <maml:para></maml:para>
+        </dev:remarks>
+        <command:commandLines>
+          <command:commandLine>
+            <command:commandText />
+          </command:commandLine>
+        </command:commandLines>
+      </command:example>
+
+    </command:examples>
+    <maml:relatedLinks>
+    <maml:navigationLink>
+    <maml:linkText>Assert</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Exec</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>FormatTaskName</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>Include</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Invoke-psake</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Properties</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+        <maml:linkText>Task</maml:linkText>
+       <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+      <maml:linkText>TaskSetup</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>TaskTearDown</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    <maml:navigationLink>
+    <maml:linkText>Framework</maml:linkText>
+    <maml:uri />
+      </maml:navigationLink>
+    </maml:relatedLinks>
+  </command:command>
+  </helpItems>
diff --git a/.build/psake/private/CleanupEnvironment.ps1 b/.build/psake/private/CleanupEnvironment.ps1
new file mode 100644
index 0000000..7d970f6
--- /dev/null
+++ b/.build/psake/private/CleanupEnvironment.ps1
@@ -0,0 +1,12 @@
+function CleanupEnvironment {
+    if ($psake.context.Count -gt 0) {
+        $currentContext = $psake.context.Peek()
+        [System.Diagnostics.CodeAnalysis.SuppressMessage('PSUseDeclaredVarsMoreThanAssigments', '')]
+        $env:PATH = $currentContext.originalEnvPath
+        Set-Location $currentContext.originalDirectory
+        $global:ErrorActionPreference = $currentContext.originalErrorActionPreference
+        $psake.LoadedTaskModules = @{}
+        $psake.ReferenceTasks = @{}
+        [void] $psake.context.Pop()
+    }
+}
diff --git a/.build/psake/private/ConfigureBuildEnvironment.ps1 b/.build/psake/private/ConfigureBuildEnvironment.ps1
new file mode 100644
index 0000000..de64819
--- /dev/null
+++ b/.build/psake/private/ConfigureBuildEnvironment.ps1
@@ -0,0 +1,202 @@
+
+function ConfigureBuildEnvironment {
+    if (!(Test-Path Variable:\IsWindows) -or $IsWindows) {
+        $framework = $psake.context.peek().config.framework
+        if ($framework -cmatch '^((?:\d+\.\d+)(?:\.\d+){0,1})(x86|x64){0,1}$') {
+            $versionPart = $matches[1]
+            $bitnessPart = $matches[2]
+        }
+        else {
+            throw ($msgs.error_invalid_framework -f $framework)
+        }
+        $versions = $null
+        $buildToolsVersions = $null
+        switch ($versionPart) {
+            '1.0' {
+                $versions = @('v1.0.3705')
+            }
+            '1.1' {
+                $versions = @('v1.1.4322')
+            }
+            '1.1.0' {
+                $versions = @()
+            }
+            '2.0' {
+                $versions = @('v2.0.50727')
+            }
+            '2.0.0' {
+                $versions = @()
+            }
+            '3.0' {
+                $versions = @('v2.0.50727')
+            }
+            '3.5' {
+                $versions = @('v3.5', 'v2.0.50727')
+            }
+            '4.0' {
+                $versions = @('v4.0.30319')
+            }
+            {($_ -eq '4.5') -or ($_ -eq '4.5.1') -or ($_ -eq '4.5.2')} {
+                $versions = @('v4.0.30319')
+                $buildToolsVersions = @('16.0', '15.0', '14.0', '12.0')
+            }
+            {($_ -eq '4.6') -or ($_ -eq '4.6.1') -or ($_ -eq '4.6.2')} {
+                $versions = @('v4.0.30319')
+                $buildToolsVersions = @('16.0', '15.0', '14.0')
+            }
+            {($_ -eq '4.7') -or ($_ -eq '4.7.1') -or ($_ -eq '4.7.2')} {
+                $versions = @('v4.0.30319')
+                $buildToolsVersions = @('16.0', '15.0')
+            }
+            '4.8' {
+                $versions = @('v4.0.30319')
+                $buildToolsVersions = @('16.0', '15.0')
+            }
+
+            default {
+                throw ($msgs.error_unknown_framework -f $versionPart, $framework)
+            }
+        }
+
+        $bitness = 'Framework'
+        if ($versionPart -ne '1.0' -and $versionPart -ne '1.1') {
+            switch ($bitnessPart) {
+                'x86' {
+                    $bitness = 'Framework'
+                    $buildToolsKey = 'MSBuildToolsPath32'
+                }
+                'x64' {
+                    $bitness = 'Framework64'
+                    $buildToolsKey = 'MSBuildToolsPath'
+                }
+                { [string]::IsNullOrEmpty($_) } {
+                    $ptrSize = [System.IntPtr]::Size
+                    switch ($ptrSize) {
+                        4 {
+                            $bitness = 'Framework'
+                            $buildToolsKey = 'MSBuildToolsPath32'
+                        }
+                        8 {
+                            $bitness = 'Framework64'
+                            $buildToolsKey = 'MSBuildToolsPath'
+                        }
+                        default {
+                            throw ($msgs.error_unknown_pointersize -f $ptrSize)
+                        }
+                    }
+                }
+                default {
+                    throw ($msgs.error_unknown_bitnesspart -f $bitnessPart, $framework)
+                }
+            }
+        }
+
+        $frameworkDirs = @()
+        if ($null -ne $buildToolsVersions) {
+            foreach($ver in $buildToolsVersions) {
+                if ($ver -eq "15.0") {
+                    if ($null -eq (Get-Module -Name VSSetup)) {
+                        if ($null -eq (Get-Module -Name VSSetup -ListAvailable)) {
+                            WriteColoredOutput ($msgs.warning_missing_vsssetup_module -f $ver) -foregroundcolor Yellow
+                            continue
+                        }
+
+                        Import-Module VSSetup
+                    }
+
+                    # borrowed from nightroman https://github.com/nightroman/Invoke-Build
+                    if ($vsInstances = Get-VSSetupInstance) {
+                        $vs = @($vsInstances | Select-VSSetupInstance -Version '[15.0, 16.0)' -Require Microsoft.Component.MSBuild)
+                        if ($vs) {
+                            if ($buildToolsKey -eq 'MSBuildToolsPath32') {
+                                $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\15.0\Bin
+                            }
+                            else {
+                                $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\15.0\Bin\amd64
+                            }
+                        }
+
+                        $vs = @($vsInstances | Select-VSSetupInstance -Version '[15.0, 16.0)' -Product Microsoft.VisualStudio.Product.BuildTools)
+                        if ($vs) {
+                            if ($buildToolsKey -eq 'MSBuildToolsPath32') {
+                                $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\15.0\Bin
+                            }
+                            else {
+                                $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\15.0\Bin\amd64
+                            }
+                        }
+                    }
+                    else {
+                        if (!($root = ${env:ProgramFiles(x86)})) {$root = $env:ProgramFiles}
+                        if (Test-Path -LiteralPath "$root\Microsoft Visual Studio\2017") {
+                            if ($buildToolsKey -eq 'MSBuildToolsPath32') {
+                                $rp = @(Resolve-Path "$root\Microsoft Visual Studio\2017\*\MSBuild\15.0\Bin" -ErrorAction SilentlyContinue)
+                            }
+                            else {
+                                $rp = @(Resolve-Path "$root\Microsoft Visual Studio\2017\*\MSBuild\15.0\Bin\amd64" -ErrorAction SilentlyContinue)
+                            }
+
+                            if ($rp) {
+                                $frameworkDirs += $rp[-1].ProviderPath
+                            }
+                        }
+                    }
+                }
+                elseif ($ver -eq "16.0") {
+                    if ($null -eq (Get-Module -Name VSSetup)) {
+                        if ($null -eq (Get-Module -Name VSSetup -ListAvailable)) {
+                            WriteColoredOutput ($msgs.warning_missing_vsssetup_module -f $ver) -foregroundcolor Yellow
+                            continue
+                        }
+
+                        Import-Module VSSetup
+                    }
+
+                    # borrowed from nightroman https://github.com/nightroman/Invoke-Build
+                    if ($vsInstances = Get-VSSetupInstance) {
+                        $vs = @($vsInstances | Select-VSSetupInstance -Version '[16.0,)' -Require Microsoft.Component.MSBuild)
+                        if ($vs) {
+                            $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\Current\Bin
+                        }
+
+                        $vs = @($vsInstances | Select-VSSetupInstance -Version '[16.0,)' -Product Microsoft.VisualStudio.Product.BuildTools)
+                        if ($vs) {
+                            $frameworkDirs += Join-Path ($vs[0].InstallationPath) MSBuild\Current\Bin
+                        }
+                    }
+                    else {
+                        if (!($root = ${env:ProgramFiles(x86)})) {$root = $env:ProgramFiles}
+                        if (Test-Path -LiteralPath "$root\Microsoft Visual Studio\2019") {
+                            $rp = @(Resolve-Path "$root\Microsoft Visual Studio\2019\*\MSBuild\Current\Bin" -ErrorAction SilentlyContinue)
+                            if ($rp) {
+                                $frameworkDirs += $rp[-1].ProviderPath
+                            }
+                        }
+                    }
+                }
+                elseif (Test-Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$ver") {
+                    $frameworkDirs += (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\MSBuild\ToolsVersions\$ver" -Name $buildToolsKey).$buildToolsKey
+                }
+            }
+        }
+
+        $frameworkDirs = $frameworkDirs + @($versions | ForEach-Object { "$env:windir\Microsoft.NET\$bitness\$_\" })
+        for ($i = 0; $i -lt $frameworkDirs.Count; $i++) {
+            $dir = $frameworkDirs[$i]
+            if ($dir -Match "\$\(Registry:HKEY_LOCAL_MACHINE(.*?)@(.*)\)") {
+                $key = "HKLM:" + $matches[1]
+                $name = $matches[2]
+                $dir = (Get-ItemProperty -Path $key -Name $name).$name
+                $frameworkDirs[$i] = $dir
+            }
+        }
+
+        $frameworkDirs | ForEach-Object { Assert (test-path $_ -pathType Container) ($msgs.error_no_framework_install_dir_found -f $_)}
+
+        $env:PATH = ($frameworkDirs -join ";") + ";$env:PATH"
+    }
+
+    # if any error occurs in a PS function then "stop" processing immediately
+    # this does not effect any external programs that return a non-zero exit code
+    $global:ErrorActionPreference = "Stop"
+}
diff --git a/.build/psake/private/CreateConfigurationForNewContext.ps1 b/.build/psake/private/CreateConfigurationForNewContext.ps1
new file mode 100644
index 0000000..cbe91f4
--- /dev/null
+++ b/.build/psake/private/CreateConfigurationForNewContext.ps1
@@ -0,0 +1,28 @@
+function CreateConfigurationForNewContext {
+    param(
+        [string] $buildFile,
+        [string] $framework
+    )
+
+    $previousConfig = GetCurrentConfigurationOrDefault
+
+    $config = new-object psobject -property @{
+        buildFileName = $previousConfig.buildFileName;
+        framework = $previousConfig.framework;
+        taskNameFormat = $previousConfig.taskNameFormat;
+        verboseError = $previousConfig.verboseError;
+        coloredOutput = $previousConfig.coloredOutput;
+        modules = $previousConfig.modules;
+        moduleScope =  $previousConfig.moduleScope;
+    }
+
+    if ($framework) {
+        $config.framework = $framework;
+    }
+
+    if ($buildFile) {
+        $config.buildFileName = $buildFile;
+    }
+
+    return $config
+}
diff --git a/.build/psake/private/ExecuteInBuildFileScope.ps1 b/.build/psake/private/ExecuteInBuildFileScope.ps1
new file mode 100644
index 0000000..8dd5fbb
--- /dev/null
+++ b/.build/psake/private/ExecuteInBuildFileScope.ps1
@@ -0,0 +1,58 @@
+function ExecuteInBuildFileScope {
+    param([string]$buildFile, $module, [scriptblock]$sb)
+
+    # Execute the build file to set up the tasks and defaults
+    Assert (test-path $buildFile -pathType Leaf) ($msgs.error_build_file_not_found -f $buildFile)
+
+    $psake.build_script_file = get-item $buildFile
+    $psake.build_script_dir = $psake.build_script_file.DirectoryName
+    $psake.build_success = $false
+
+    # Create a new psake context
+    $psake.context.push(
+        @{
+            "buildSetupScriptBlock"         = {}
+            "buildTearDownScriptBlock"      = {}
+            "taskSetupScriptBlock"          = {}
+            "taskTearDownScriptBlock"       = {}
+            "executedTasks"                 = new-object System.Collections.Stack
+            "callStack"                     = new-object System.Collections.Stack
+            "originalEnvPath"               = $env:PATH
+            "originalDirectory"             = get-location
+            "originalErrorActionPreference" = $global:ErrorActionPreference
+            "tasks"                         = @{}
+            "aliases"                       = @{}
+            "properties"                    = new-object System.Collections.Stack
+            "includes"                      = new-object System.Collections.Queue
+            "config"                        = CreateConfigurationForNewContext $buildFile $framework
+        }
+    )
+
+    # Load in the psake configuration (or default)
+    LoadConfiguration $psake.build_script_dir
+
+    set-location $psake.build_script_dir
+
+    # Import any modules declared in the build script
+    LoadModules
+
+    $frameworkOldValue = $framework
+
+    . $psake.build_script_file.FullName
+
+    $currentContext = $psake.context.Peek()
+
+    if ($framework -ne $frameworkOldValue) {
+        writecoloredoutput $msgs.warning_deprecated_framework_variable -foregroundcolor Yellow
+        $currentContext.config.framework = $framework
+    }
+
+    ConfigureBuildEnvironment
+
+    while ($currentContext.includes.Count -gt 0) {
+        $includeFilename = $currentContext.includes.Dequeue()
+        . $includeFilename
+    }
+
+    & $sb $currentContext $module
+}
diff --git a/.build/psake/private/FormatErrorMessage.ps1 b/.build/psake/private/FormatErrorMessage.ps1
new file mode 100644
index 0000000..657aa72
--- /dev/null
+++ b/.build/psake/private/FormatErrorMessage.ps1
@@ -0,0 +1,26 @@
+function FormatErrorMessage
+{
+    [CmdletBinding()]
+    param(
+        [Parameter(ValueFromPipeline=$true)]
+        $ErrorRecord = $Error[0]
+    )
+
+    $currentConfig = GetCurrentConfigurationOrDefault
+    if ($currentConfig.verboseError) {
+        $error_message = "{0}: An Error Occurred. See Error Details Below: $($script:nl)" -f (Get-Date)
+        $error_message += ("-" * 70) + $script:nl
+        $error_message += "Error: {0}$($script:nl)" -f (ResolveError $ErrorRecord -Short)
+        $error_message += ("-" * 70) + $script:nl
+        $error_message += ResolveError $ErrorRecord
+        $error_message += ("-" * 70) + $script:nl
+        $error_message += "Script Variables" + $script:nl
+        $error_message += ("-" * 70) + $script:nl
+        $error_message += get-variable -scope script | format-table | out-string
+    } else {
+        # ($_ | Out-String) gets error messages with source information included.
+        $error_message = "Error: {0}: $($script:nl){1}" -f (Get-Date), (ResolveError $ErrorRecord -Short)
+}
+
+    $error_message
+}
diff --git a/.build/psake/private/Get-DefaultBuildFile.ps1 b/.build/psake/private/Get-DefaultBuildFile.ps1
new file mode 100644
index 0000000..5413208
--- /dev/null
+++ b/.build/psake/private/Get-DefaultBuildFile.ps1
@@ -0,0 +1,17 @@
+# Attempt to find the default build file given the config_default of
+# buildFileName and legacyBuildFileName.  If neither exist optionally
+# return the buildFileName or $null
+function Get-DefaultBuildFile {
+    param(
+        [boolean] $UseDefaultIfNoneExist = $true
+    )
+
+    if (test-path $psake.config_default.buildFileName -pathType Leaf) {
+        Write-Output $psake.config_default.buildFileName
+    } elseif (test-path $psake.config_default.legacyBuildFileName -pathType Leaf) {
+        Write-Warning "The default configuration file of default.ps1 is deprecated.  Please use psakefile.ps1"
+        Write-Output $psake.config_default.legacyBuildFileName
+    } elseif ($UseDefaultIfNoneExist) {
+        Write-Output $psake.config_default.buildFileName
+    }
+}
diff --git a/.build/psake/private/GetCurrentConfigurationOrDefault.ps1 b/.build/psake/private/GetCurrentConfigurationOrDefault.ps1
new file mode 100644
index 0000000..ae0fa4f
--- /dev/null
+++ b/.build/psake/private/GetCurrentConfigurationOrDefault.ps1
@@ -0,0 +1,7 @@
+function GetCurrentConfigurationOrDefault() {
+    if ($psake.context.count -gt 0) {
+        return $psake.context.peek().config
+    } else {
+        return $psake.config_default
+    }
+}
diff --git a/.build/psake/private/GetTasksFromContext.ps1 b/.build/psake/private/GetTasksFromContext.ps1
new file mode 100644
index 0000000..5764962
--- /dev/null
+++ b/.build/psake/private/GetTasksFromContext.ps1
@@ -0,0 +1,15 @@
+function GetTasksFromContext($currentContext) {
+
+    $docs = $currentContext.tasks.Keys | foreach-object {
+
+        $task = $currentContext.tasks.$_
+        new-object PSObject -property @{
+            Name = $task.Name;
+            Alias = $task.Alias;
+            Description = $task.Description;
+            DependsOn = $task.DependsOn;
+        }
+    }
+
+    return $docs
+}
diff --git a/.build/psake/private/LoadConfiguration.ps1 b/.build/psake/private/LoadConfiguration.ps1
new file mode 100644
index 0000000..7cdcd28
--- /dev/null
+++ b/.build/psake/private/LoadConfiguration.ps1
@@ -0,0 +1,31 @@
+function LoadConfiguration {
+    <#
+    .SYNOPSIS
+    Load psake-config.ps1 file
+    .DESCRIPTION
+    Load psake-config.ps1 if present in the directory of the current build script.
+    If that file doesn't exist, load the default psake-config.ps1 file from the module directory.
+    #>
+    param(
+        [string]$configdir = (Split-Path -Path $PSScriptRoot -Parent)
+    )
+
+    $configFilePath  = Join-Path -Path $configdir -ChildPath $script:psakeConfigFile
+    $defaultConfigFilePath = Join-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -ChildPath $script:psakeConfigFile
+
+    if (Test-Path -LiteralPath $configFilePath -PathType Leaf) {
+        $configFileToLoad = $configFilePath
+    } elseIf (Test-Path -LiteralPath $defaultConfigFilePath -PathType Leaf) {
+        $configFileToLoad = $defaultConfigFilePath
+    } else {
+        throw 'Cannot find psake-config.ps1'
+    }
+
+    try {
+        [System.Diagnostics.CodeAnalysis.SuppressMessage('PSUseDeclaredVarsMoreThanAssigments', '')]
+        $config = GetCurrentConfigurationOrDefault
+        . $configFileToLoad
+    } catch {
+        throw 'Error Loading Configuration from {0}: {1}' -f $configFileToLoad, $_
+    }
+}
diff --git a/.build/psake/private/LoadModules.ps1 b/.build/psake/private/LoadModules.ps1
new file mode 100644
index 0000000..7182b1f
--- /dev/null
+++ b/.build/psake/private/LoadModules.ps1
@@ -0,0 +1,21 @@
+function LoadModules {
+    $currentConfig = $psake.context.peek().config
+    if ($currentConfig.modules) {
+
+        $scope = $currentConfig.moduleScope
+
+        $global = [string]::Equals($scope, "global", [StringComparison]::CurrentCultureIgnoreCase)
+
+        $currentConfig.modules | ForEach-Object {
+            resolve-path $_ | ForEach-Object {
+                "Loading module: $_"
+                $module = Import-Module $_ -passthru -DisableNameChecking -global:$global
+                if (!$module) {
+                    throw ($msgs.error_loading_module -f $_.Name)
+                }
+            }
+        }
+
+        ""
+    }
+}
diff --git a/.build/psake/private/ResolveError.ps1 b/.build/psake/private/ResolveError.ps1
new file mode 100644
index 0000000..3f697ba
--- /dev/null
+++ b/.build/psake/private/ResolveError.ps1
@@ -0,0 +1,62 @@
+# borrowed from Jeffrey Snover http://blogs.msdn.com/powershell/archive/2006/12/07/resolve-error.aspx
+# modified to better handle SQL errors
+function ResolveError
+{
+    [CmdletBinding()]
+    param(
+        [Parameter(ValueFromPipeline=$true)]
+        $ErrorRecord=$Error[0],
+        [Switch]
+        $Short
+    )
+
+    process {
+        if ($_ -eq $null) { $_ = $ErrorRecord }
+        $ex = $_.Exception
+
+        if (-not $Short) {
+            $error_message = "$($script:nl)ErrorRecord:{0}ErrorRecord.InvocationInfo:{1}Exception:$($script:nl){2}"
+            $formatted_errorRecord = $_ | format-list * -force | out-string
+            $formatted_invocationInfo = $_.InvocationInfo | format-list * -force | out-string
+            $formatted_exception = ''
+
+            $i = 0
+            while ($null -ne $ex) {
+                $i++
+                $formatted_exception += ("$i" * 70) + $script:nl +
+                    ($ex | format-list * -force | out-string) + $script:nl
+                $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
+            }
+
+            return $error_message -f $formatted_errorRecord, $formatted_invocationInfo, $formatted_exception
+        }
+
+        $lastException = @()
+        while ($null -ne $ex) {
+            $lastMessage = $ex | SelectObjectWithDefault -Name 'Message' -Value ''
+            $lastException += ($lastMessage -replace $script:nl, '')
+            if ($ex -is [Data.SqlClient.SqlException]) {
+                $lastException += "(Line [$($ex.LineNumber)] " +
+                    "Procedure [$($ex.Procedure)] Class [$($ex.Class)] " +
+                    " Number [$($ex.Number)] State [$($ex.State)] )"
+            }
+            $ex = $ex | SelectObjectWithDefault -Name 'InnerException' -Value $null
+        }
+        $shortException = $lastException -join ' --> '
+
+        $header = $null
+        $header = (($_.InvocationInfo |
+            SelectObjectWithDefault -Name 'PositionMessage' -Value '') -replace $script:nl, ' '),
+            ($_ | SelectObjectWithDefault -Name 'Message' -Value ''),
+            ($_ | SelectObjectWithDefault -Name 'Exception' -Value '') |
+                Where-Object { -not [String]::IsNullOrEmpty($_) } |
+                Select-Object -First 1
+
+        $delimiter = ''
+        if ((-not [String]::IsNullOrEmpty($header)) -and
+            (-not [String]::IsNullOrEmpty($shortException)))
+            { $delimiter = ' [<<==>>] ' }
+
+        return "$($header)$($delimiter)Exception: $($shortException)"
+    }
+}
diff --git a/.build/psake/private/SelectObjectWithDefault.ps1 b/.build/psake/private/SelectObjectWithDefault.ps1
new file mode 100644
index 0000000..f60af9d
--- /dev/null
+++ b/.build/psake/private/SelectObjectWithDefault.ps1
@@ -0,0 +1,23 @@
+function SelectObjectWithDefault
+{
+    [CmdletBinding()]
+    param(
+        [Parameter(ValueFromPipeline=$true)]
+        [PSObject]
+        $InputObject,
+        [string]
+        $Name,
+        $Value
+    )
+
+    process {
+        if ($_ -eq $null) { $Value }
+        elseif ($_ | Get-Member -Name $Name) {
+          $_.$Name
+        }
+        elseif (($_ -is [Hashtable]) -and ($_.Keys -contains $Name)) {
+          $_.$Name
+        }
+        else { $Value }
+    }
+}
diff --git a/.build/psake/private/Test-ModuleVersion.ps1 b/.build/psake/private/Test-ModuleVersion.ps1
new file mode 100644
index 0000000..c1c9fb5
--- /dev/null
+++ b/.build/psake/private/Test-ModuleVersion.ps1
@@ -0,0 +1,107 @@
+<#
+.SYNOPSIS
+    Validate that the version of a module passed in via the $currentVersion
+    parameter is valid based on the criteria specified by the following
+    parameters.
+.DESCRIPTION
+    This function is used to determine whether or not a given module is within
+    the version bounds specified by the parameters passed in. Psake will use
+    this information to determine if the module it has found will contain the
+    proper version of the shared task it has been asked to import.
+
+    This function should allow bounds that are only on the lower limit, only on
+    the upper, within a range, or if no bounds are supplied, the current module
+    will be accepted without question.
+.PARAMETER currentVersion
+    The version of the module in the current session to be subjected to comparison
+.PARAMETER minimumVersion
+    The lower bound of the version that will be accepted. This comparison should
+    be inclusive, meaning an input version greater than or equal to this version
+    should be accepted.
+.PARAMETER maximumVersion
+    The upper bound of the version that will be accepted. This comparison should
+    be inclusive, meaning an input version less than or equal to this version
+    should be accepted.
+.PARAMETER lessThanVersion
+    The upper bound of the version that will be accepted. This comparison should
+    be exlusive. Meaning an input version that is less than only, not equal to
+    this version, will be accepted.
+.INPUTS
+    A $currentVersion of type [System.Version] or a convertable string.
+    A set of version criteria, each of type [System.Version] or a convertable string.
+.OUTPUTS
+    boolean - Pass/Fail
+#>
+function Test-ModuleVersion {
+    [CmdletBinding()]
+    param (
+        [string]$currentVersion,
+        [string]$minimumVersion,
+        [string]$maximumVersion,
+        [string]$lessThanVersion
+    )
+
+    begin {
+    }
+
+    process {
+        $result = $true
+
+        # If no version is specified simply return true and allow the module to pass.
+        if("$minimumVersion$maximumVersion$lessthanVersion" -eq ''){
+            return $true
+        }
+
+        # Single integer values cannot be converted to type system.version.
+        # We convert to a string, and if there is a single character we know that
+        # we need to add a '.0' to the integer to make it convertable to a version.
+        if(![string]::IsNullOrEmpty($currentVersion)) {
+            if($currentVersion.ToString().Length -eq 1) {
+                [version]$currentVersion = "$currentVersion.0"
+            } else {
+                [version]$currentVersion = $currentVersion
+            }
+        }
+
+        if(![string]::IsNullOrEmpty($minimumVersion)) {
+            if($minimumVersion.ToString().Length -eq 1){
+                [version]$minimumVersion = "$minimumVersion.0"
+            } else {
+                [version]$minimumVersion = $minimumVersion
+            }
+
+            if($currentVersion.CompareTo($minimumVersion) -lt 0){
+                $result = $false
+            }
+        }
+
+        if(![string]::IsNullOrEmpty($maximumVersion)) {
+            if($maximumVersion.ToString().Length -eq 1) {
+                [version]$maximumVersion = "$maximumVersion.0"
+            } else {
+                [version]$maximumVersion = $maximumVersion
+            }
+
+            if ($currentVersion.CompareTo($maximumVersion) -gt 0) {
+                $result = $false
+            }
+        }
+
+        if(![string]::IsNullOrEmpty($lessThanVersion)) {
+            if($lessThanVersion.ToString().Length -eq 1) {
+                [version]$lessThanVersion = "$lessThanVersion.0"
+            } else {
+                [version]$lessThanVersion = $lessThanVersion
+            }
+
+            if($currentVersion.CompareTo($lessThanVersion) -ge 0) {
+                $result = $false
+            }
+        }
+
+        Write-Output $result
+    }
+
+    end {
+    }
+}
diff --git a/.build/psake/private/WriteColoredOutput.ps1 b/.build/psake/private/WriteColoredOutput.ps1
new file mode 100644
index 0000000..5c33ec6
--- /dev/null
+++ b/.build/psake/private/WriteColoredOutput.ps1
@@ -0,0 +1,20 @@
+function WriteColoredOutput {
+    param(
+        [string] $message,
+        [System.ConsoleColor] $foregroundcolor
+    )
+
+    $currentConfig = GetCurrentConfigurationOrDefault
+    if ($currentConfig.coloredOutput -eq $true) {
+        if (($null -ne $Host.UI) -and ($null -ne $Host.UI.RawUI) -and ($null -ne $Host.UI.RawUI.ForegroundColor)) {
+            $previousColor = $Host.UI.RawUI.ForegroundColor
+            $Host.UI.RawUI.ForegroundColor = $foregroundcolor
+        }
+    }
+
+    $message
+
+    if ($null -ne $previousColor) {
+        $Host.UI.RawUI.ForegroundColor = $previousColor
+    }
+}
diff --git a/.build/psake/private/WriteDocumentation.ps1 b/.build/psake/private/WriteDocumentation.ps1
new file mode 100644
index 0000000..a131e54
--- /dev/null
+++ b/.build/psake/private/WriteDocumentation.ps1
@@ -0,0 +1,26 @@
+function WriteDocumentation($showDetailed) {
+
+        $currentContext = $psake.context.Peek()
+
+        if ($currentContext.tasks.default) {
+            $defaultTaskDependencies = $currentContext.tasks.default.DependsOn
+        } else {
+            $defaultTaskDependencies = @()
+        }
+
+        $docs = GetTasksFromContext $currentContext |
+                    Where-Object   {$_.Name -ne 'default'} |
+                    ForEach-Object {
+                        $isDefault = $null
+                        if ($defaultTaskDependencies -contains $_.Name) {
+                            $isDefault = $true
+                        }
+                        return Add-Member -InputObject $_ 'Default' $isDefault -PassThru
+                    }
+
+        if ($showDetailed) {
+            $docs | Sort-Object 'Name' | format-list -property Name,Alias,Description,@{Label="Depends On";Expression={$_.DependsOn -join ', '}},Default
+        } else {
+            $docs | Sort-Object 'Name' | format-table -autoSize -wrap -property Name,Alias,@{Label="Depends On";Expression={$_.DependsOn -join ', '}},Default,Description
+        }
+    }
diff --git a/.build/psake/private/WriteTaskTimeSummary.ps1 b/.build/psake/private/WriteTaskTimeSummary.ps1
new file mode 100644
index 0000000..732a2d6
--- /dev/null
+++ b/.build/psake/private/WriteTaskTimeSummary.ps1
@@ -0,0 +1,34 @@
+function WriteTaskTimeSummary($invokePsakeDuration) {
+    if ($psake.context.count -gt 0) {
+        $currentContext = $psake.context.Peek()
+        if ($currentContext.config.taskNameFormat -is [ScriptBlock]) {
+            & $currentContext.config.taskNameFormat "Build Time Report"
+        } elseif ($currentContext.config.taskNameFormat -ne "Executing {0}") {
+            $currentContext.config.taskNameFormat -f "Build Time Report"
+        }
+        else {
+            "-" * 70
+            "Build Time Report"
+            "-" * 70
+        }
+        $list = @()
+        while ($currentContext.executedTasks.Count -gt 0) {
+            $taskKey = $currentContext.executedTasks.Pop()
+            $task = $currentContext.tasks.$taskKey
+            if ($taskKey -eq "default") {
+                continue
+            }
+            $list += new-object PSObject -property @{
+                Name = $task.Name;
+                Duration = $task.Duration.ToString("hh\:mm\:ss\.fff")
+            }
+        }
+        [Array]::Reverse($list)
+        $list += new-object PSObject -property @{
+            Name = "Total:";
+            Duration = $invokePsakeDuration.ToString("hh\:mm\:ss\.fff")
+        }
+        # using "out-string | where-object" to filter out the blank line that format-table prepends
+        $list | format-table -autoSize -property Name,Duration | out-string -stream | where-object { $_ }
+    }
+}
diff --git a/.build/psake/psake b/.build/psake/psake
new file mode 100644
index 0000000..e2cbfc5
--- /dev/null
+++ b/.build/psake/psake
@@ -0,0 +1,12 @@
+#!/usr/bin/env sh
+
+# Use greadlink on macOS.
+if [ "$(uname)" = "Darwin" ]; then
+  which greadlink > /dev/null || {
+    printf 'GNU readlink not found\n'
+    exit 1
+  }
+  alias readlink="greadlink"
+fi
+
+pwsh -NoProfile -Command "& $(dirname "$(readlink -f -- "$0")")/psake.ps1 $@"
diff --git a/.build/psake/psake-config.ps1 b/.build/psake/psake-config.ps1
new file mode 100644
index 0000000..2c5001f
--- /dev/null
+++ b/.build/psake/psake-config.ps1
@@ -0,0 +1,22 @@
+<#
+-------------------------------------------------------------------
+Defaults
+-------------------------------------------------------------------
+$config.buildFileName="psakefile.ps1"
+$config.legacyBuildFileName="default.ps1"
+$config.framework = "4.0"
+$config.taskNameFormat="Executing {0}"
+$config.verboseError=$false
+$config.coloredOutput = $true
+$config.modules=$null
+
+-------------------------------------------------------------------
+Load modules from .\modules folder and from file my_module.psm1
+-------------------------------------------------------------------
+$config.modules=(".\modules\*.psm1",".\my_module.psm1")
+
+-------------------------------------------------------------------
+Use scriptblock for taskNameFormat
+-------------------------------------------------------------------
+$config.taskNameFormat= { param($taskName) "Executing $taskName at $(get-date)" }
+#>
diff --git a/.build/psake/psake.cmd b/.build/psake/psake.cmd
new file mode 100644
index 0000000..634314e
--- /dev/null
+++ b/.build/psake/psake.cmd
@@ -0,0 +1,14 @@
+@echo off
+rem Helper script for those who want to run psake from cmd.exe
+rem Example run from cmd.exe:
+rem psake "psakefile.ps1" "BuildHelloWord" "4.0"
+
+if '%1'=='/?' goto help
+if '%1'=='-help' goto help
+if '%1'=='-h' goto help
+
+powershell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0\psake.ps1' %*"
+exit /B %errorlevel%
+
+:help
+powershell -NoProfile -ExecutionPolicy Bypass -Command "& '%~dp0\psake.ps1' -help"
diff --git a/.build/psake/psake.ps1 b/.build/psake/psake.ps1
new file mode 100644
index 0000000..0fe9e6f
--- /dev/null
+++ b/.build/psake/psake.ps1
@@ -0,0 +1,71 @@
+# Helper script for those who want to run psake without importing the module.
+# Example run from PowerShell:
+# .\psake.ps1 "psakefile.ps1" "BuildHelloWord" "4.0"
+
+# Must match parameter definitions for psake.psm1/invoke-psake
+# otherwise named parameter binding fails
+[cmdletbinding()]
+param(
+    [Parameter(Position = 0, Mandatory = $false)]
+    [string]$buildFile,
+
+    [Parameter(Position = 1, Mandatory = $false)]
+    [string[]]$taskList = @(),
+
+    [Parameter(Position = 2, Mandatory = $false)]
+    [string]$framework,
+
+    [Parameter(Position = 3, Mandatory = $false)]
+    [switch]$docs = $false,
+
+    [Parameter(Position = 4, Mandatory = $false)]
+    [System.Collections.Hashtable]$parameters = @{},
+
+    [Parameter(Position = 5, Mandatory = $false)]
+    [System.Collections.Hashtable]$properties = @{},
+
+    [Parameter(Position = 6, Mandatory = $false)]
+    [alias("init")]
+    [scriptblock]$initialization = {},
+
+    [Parameter(Position = 7, Mandatory = $false)]
+    [switch]$nologo = $false,
+
+    [Parameter(Position = 8, Mandatory = $false)]
+    [switch]$help = $false,
+
+    [Parameter(Position = 9, Mandatory = $false)]
+    [string]$scriptPath,
+
+    [Parameter(Position = 10, Mandatory = $false)]
+    [switch]$detailedDocs = $false,
+
+    [Parameter(Position = 11, Mandatory = $false)]
+    [switch]$notr = $false
+)
+
+# setting $scriptPath here, not as default argument, to support calling as "powershell -File psake.ps1"
+if (-not $scriptPath) {
+    $scriptPath = $(Split-Path -Path $MyInvocation.MyCommand.path -Parent)
+}
+
+# '[p]sake' is the same as 'psake' but $Error is not polluted
+Remove-Module -Name [p]sake -Verbose:$false
+Import-Module -Name (Join-Path -Path $scriptPath -ChildPath 'psake.psd1') -Verbose:$false
+if ($help) {
+    Get-Help -Name Invoke-psake -Full
+    return
+}
+
+if ($buildFile -and (-not (Test-Path -Path $buildFile))) {
+    $absoluteBuildFile = (Join-Path -Path $scriptPath -ChildPath $buildFile)
+    if (Test-path -Path $absoluteBuildFile) {
+        $buildFile = $absoluteBuildFile
+    }
+}
+
+Invoke-psake $buildFile $taskList $framework $docs $parameters $properties $initialization $nologo $detailedDocs $notr
+
+if (!$psake.build_success) {
+    exit 1
+}
diff --git a/.build/psake/psake.psd1 b/.build/psake/psake.psd1
new file mode 100644
index 0000000..0b8c0f8
--- /dev/null
+++ b/.build/psake/psake.psd1
@@ -0,0 +1,33 @@
+@{
+    RootModule        = 'psake.psm1'
+    ModuleVersion     = '4.9.0'
+    GUID              = 'cfb53216-072f-4a46-8975-ff7e6bda05a5'
+    Author            = 'James Kovacs'
+    Copyright         = 'Copyright (c) 2010-18 James Kovacs, Damian Hickey, Brandon Olin, and Contributors'
+    PowerShellVersion = '3.0'
+    Description       = 'psake is a build automation tool written in PowerShell.'
+    FunctionsToExport = @(
+        'Invoke-psake'
+        'Invoke-Task'
+        'Get-PSakeScriptTasks'
+        'Task'
+        'Properties'
+        'Include'
+        'FormatTaskName'
+        'TaskSetup'
+        'TaskTearDown'
+        'Framework'
+        'Assert'
+        'Exec'
+    )
+    VariablesToExport = 'psake'
+    PrivateData       = @{
+        PSData = @{
+            ReleaseNotes = 'https://raw.githubusercontent.com/psake/psake/master/CHANGELOG.md'
+            LicenseUri   = 'https://raw.githubusercontent.com/psake/psake/master/license.txt'
+            ProjectUri   = 'https://github.com/psake/psake'
+            Tags         = @('Build', 'Task')
+            IconUri      = 'https://raw.githubusercontent.com/psake/graphics/master/png/psake-single-icon-teal-bg-256x256.png'
+        }
+    }
+}
diff --git a/.build/psake/psake.psm1 b/.build/psake/psake.psm1
new file mode 100644
index 0000000..1d5f008
--- /dev/null
+++ b/.build/psake/psake.psm1
@@ -0,0 +1,112 @@
+# psake
+# Copyright (c) 2012 James Kovacs
+# 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.
+
+#Requires -Version 2.0
+
+if ($PSVersionTable.PSVersion.Major -ge 3) {
+    $script:IgnoreError = 'Ignore'
+} else {
+    $script:IgnoreError = 'SilentlyContinue'
+}
+
+$script:nl = [System.Environment]::NewLine
+
+# Dot source public/private functions
+$dotSourceParams = @{
+    Filter      = '*.ps1'
+    Recurse     = $true
+    ErrorAction = 'Stop'
+}
+$public = @(Get-ChildItem -Path (Join-Path -Path $PSScriptRoot -ChildPath 'public') @dotSourceParams )
+$private = @(Get-ChildItem -Path (Join-Path -Path $PSScriptRoot -ChildPath 'private/*.ps1') @dotSourceParams)
+foreach ($import in @($public + $private)) {
+    try {
+        . $import.FullName
+    } catch {
+        throw "Unable to dot source [$($import.FullName)]"
+    }
+}
+
+DATA msgs {
+    convertfrom-stringdata @'
+    error_invalid_task_name = Task name should not be null or empty string.
+    error_task_name_does_not_exist = Task {0} does not exist.
+    error_circular_reference = Circular reference found for task {0}.
+    error_missing_action_parameter = Action parameter must be specified when using PreAction or PostAction parameters for task {0}.
+    error_corrupt_callstack = Call stack was corrupt. Expected {0}, but got {1}.
+    error_invalid_framework = Invalid .NET Framework version, {0} specified.
+    error_unknown_framework = Unknown .NET Framework version, {0} specified in {1}.
+    error_unknown_pointersize = Unknown pointer size ({0}) returned from System.IntPtr.
+    error_unknown_bitnesspart = Unknown .NET Framework bitness, {0}, specified in {1}.
+    error_unknown_module = Unable to find module [{0}].
+    error_no_framework_install_dir_found = No .NET Framework installation directory found at {0}.
+    error_bad_command = Error executing command {0}.
+    error_default_task_cannot_have_action = 'default' task cannot specify an action.
+    error_shared_task_cannot_have_action = '{0} references a shared task from module {1} and cannot have an action.
+    error_duplicate_task_name = Task {0} has already been defined.
+    error_duplicate_alias_name = Alias {0} has already been defined.
+    error_invalid_include_path = Unable to include {0}. File not found.
+    error_build_file_not_found = Could not find the build file {0}.
+    error_no_default_task = 'default' task required.
+    error_loading_module = Error loading module {0}.
+    warning_deprecated_framework_variable = Warning: Using global variable $framework to set .NET framework version used is deprecated. Instead use Framework function or configuration file psake-config.ps1.
+    warning_missing_vsssetup_module = Warning: Cannot find build tools version {0} without the module VSSetup. You can install this module with the command: Install-Module VSSetup -Scope CurrentUser
+    required_variable_not_set = Variable {0} must be set to run task {1}.
+    postcondition_failed = Postcondition failed for task {0}.
+    precondition_was_false = Precondition was false, not executing task {0}.
+    continue_on_error = Error in task {0}. {1}
+    psake_success = psake succeeded executing {0}
+'@
+}
+
+Import-LocalizedData -BindingVariable msgs -FileName messages.psd1 -ErrorAction $script:IgnoreError
+
+$scriptDir = Split-Path $MyInvocation.MyCommand.Path
+$manifestPath = Join-Path $scriptDir psake.psd1
+$manifest = Test-ModuleManifest -Path $manifestPath -WarningAction SilentlyContinue
+
+$script:psakeConfigFile = 'psake-config.ps1'
+
+$script:psake = @{}
+
+$psake.version = $manifest.Version.ToString()
+$psake.context = new-object system.collections.stack # holds onto the current state of all variables
+$psake.run_by_psake_build_tester = $false # indicates that build is being run by psake-BuildTester
+$psake.LoadedTaskModules = @{}
+$psake.ReferenceTasks = @{}
+$psake.config_default = new-object psobject -property @{
+    buildFileName       = "psakefile.ps1"
+    legacyBuildFileName = "default.ps1"
+    framework           = "4.0"
+    taskNameFormat      = "Executing {0}"
+    verboseError        = $false
+    coloredOutput       = $true
+    modules             = $null
+    moduleScope         = ""
+} # contains default configuration, can be overridden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script
+
+$psake.build_success = $false # indicates that the current build was successful
+$psake.build_script_file = $null # contains a System.IO.FileInfo for the current build script
+$psake.build_script_dir = "" # contains a string with fully-qualified path to current build script
+$psake.error_message = $null # contains the error message which caused the script to fail
+
+LoadConfiguration
+
+export-modulemember -function $public.BaseName -variable psake
diff --git a/.build/psake/public/Assert.ps1 b/.build/psake/public/Assert.ps1
new file mode 100644
index 0000000..471e561
--- /dev/null
+++ b/.build/psake/public/Assert.ps1
@@ -0,0 +1,71 @@
+function Assert {
+    <#
+        .SYNOPSIS
+        Helper function for "Design by Contract" assertion checking.
+
+        .DESCRIPTION
+        This is a helper function that makes the code less noisy by eliminating many of the "if" statements that are normally required to verify assumptions in the code.
+
+        .PARAMETER conditionToCheck
+        The boolean condition to evaluate
+
+        .PARAMETER failureMessage
+        The error message used for the exception if the conditionToCheck parameter is false
+
+        .EXAMPLE
+        C:\PS>Assert $false "This always throws an exception"
+
+        Example of an assertion that will always fail.
+
+        .EXAMPLE
+        C:\PS>Assert ( ($i % 2) -eq 0 ) "$i is not an even number"
+
+        This exmaple may throw an exception if $i is not an even number
+
+        Note:
+        It might be necessary to wrap the condition with paranthesis to force PS to evaluate the condition
+        so that a boolean value is calculated and passed into the 'conditionToCheck' parameter.
+
+        Example:
+            Assert 1 -eq 2 "1 doesn't equal 2"
+
+        PS will pass 1 into the condtionToCheck variable and PS will look for a parameter called "eq" and
+        throw an exception with the following message "A parameter cannot be found that matches parameter name 'eq'"
+
+        The solution is to wrap the condition in () so that PS will evaluate it first.
+
+        Assert (1 -eq 2) "1 doesn't equal 2"
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        $conditionToCheck,
+
+        [Parameter(Mandatory = $true)]
+        [string]$failureMessage
+    )
+
+    if (-not $conditionToCheck) {
+        throw ('Assert: {0}' -f $failureMessage)
+    }
+}
diff --git a/.build/psake/public/BuildSetup.ps1 b/.build/psake/public/BuildSetup.ps1
new file mode 100644
index 0000000..4d00b7e
--- /dev/null
+++ b/.build/psake/public/BuildSetup.ps1
@@ -0,0 +1,55 @@
+function BuildSetup {
+    <#
+        .SYNOPSIS
+        Adds a scriptblock that will be executed once at the beginning of the build
+        .DESCRIPTION
+        This function will accept a scriptblock that will be executed once at the beginning of the build.
+        .PARAMETER setup
+        A scriptblock to execute
+        .EXAMPLE
+        A sample build script is shown below:
+        Task default -depends Test
+        Task Test -depends Compile, Clean {
+        }
+        Task Compile -depends Clean {
+        }
+        Task Clean {
+        }
+        BuildSetup {
+            "Running 'BuildSetup'"
+        }
+        The script above produces the following output:
+        Running 'BuildSetup'
+        Executing task, Clean...
+        Executing task, Compile...
+        Executing task, Test...
+        Build Succeeded
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        BuildTearDown
+        .LINK
+         TaskSetup
+         .LINK
+         TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$setup
+    )
+
+    $psake.context.Peek().buildSetupScriptBlock = $setup
+}
\ No newline at end of file
diff --git a/.build/psake/public/BuildTearDown.ps1 b/.build/psake/public/BuildTearDown.ps1
new file mode 100644
index 0000000..2bb5502
--- /dev/null
+++ b/.build/psake/public/BuildTearDown.ps1
@@ -0,0 +1,75 @@
+function BuildTearDown {
+    <#
+        .SYNOPSIS
+        Adds a scriptblock that will be executed once at the end of the build
+        .DESCRIPTION
+        This function will accept a scriptblock that will be executed once at the end of the build, regardless of success or failure
+        .PARAMETER setup
+        A scriptblock to execute
+        .EXAMPLE
+        A sample build script is shown below:
+        Task default -depends Test
+        Task Test -depends Compile, Clean {
+        }
+        Task Compile -depends Clean {
+        }
+        Task Clean {
+        }
+        BuildTearDown {
+            "Running 'BuildTearDown'"
+        }
+        The script above produces the following output:
+        Executing task, Clean...
+        Executing task, Compile...
+        Executing task, Test...
+        Running 'BuildTearDown'
+        Build Succeeded
+        .EXAMPLE
+        A failing build script is shown below:
+        Task default -depends Test
+        Task Test -depends Compile, Clean {
+            throw "forced error"
+        }
+        Task Compile -depends Clean {
+        }
+        Task Clean {
+        }
+        BuildTearDown {
+            "Running 'BuildTearDown'"
+        }
+        The script above produces the following output:
+        Executing task, Clean...
+        Executing task, Compile...
+        Executing task, Test...
+        Running 'BuildTearDown'
+        forced error
+        At line:x char:x ...
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        BuildSetup
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$setup
+    )
+
+    $psake.context.Peek().buildTearDownScriptBlock = $setup
+}
\ No newline at end of file
diff --git a/.build/psake/public/Exec.ps1 b/.build/psake/public/Exec.ps1
new file mode 100644
index 0000000..d934a0b
--- /dev/null
+++ b/.build/psake/public/Exec.ps1
@@ -0,0 +1,110 @@
+function Exec {
+    <#
+        .SYNOPSIS
+        Helper function for executing command-line programs.
+
+        .DESCRIPTION
+        This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode to see if an error occcured.
+        If an error is detected then an exception is thrown.
+        This function allows you to run command-line programs without having to explicitly check fthe $lastexitcode variable.
+
+        .PARAMETER cmd
+        The scriptblock to execute. This scriptblock will typically contain the command-line invocation.
+
+        .PARAMETER errorMessage
+        The error message to display if the external command returned a non-zero exit code.
+
+        .PARAMETER maxRetries
+        The maximum number of times to retry the command before failing.
+
+        .PARAMETER retryTriggerErrorPattern
+        If the external command raises an exception, match the exception against this regex to determine if the command can be retried.
+        If a match is found, the command will be retried provided [maxRetries] has not been reached.
+
+        .PARAMETER workingDirectory
+        The working directory to set before running the external command.
+
+        .EXAMPLE
+        exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"
+
+        This example calls the svn command-line client.
+        .LINK
+        Assert
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+        .LINK
+        Properties
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$cmd,
+
+        [string]$errorMessage = ($msgs.error_bad_command -f $cmd),
+
+        [int]$maxRetries = 0,
+
+        [string]$retryTriggerErrorPattern = $null,
+
+        [string]$workingDirectory = $null
+    )
+
+    $tryCount = 1
+
+    do {
+        try {
+
+            if ($workingDirectory) {
+                Push-Location -Path $workingDirectory
+            }
+
+            $global:lastexitcode = 0
+            & $cmd
+            if ($global:lastexitcode -ne 0) {
+                throw "Exec: $errorMessage"
+            }
+            break
+        }
+        catch [Exception] {
+            if ($tryCount -gt $maxRetries) {
+                throw $_
+            }
+
+            if ($retryTriggerErrorPattern -ne $null) {
+                $isMatch = [regex]::IsMatch($_.Exception.Message, $retryTriggerErrorPattern)
+
+                if ($isMatch -eq $false) {
+                    throw $_
+                }
+            }
+
+            "Try $tryCount failed, retrying again in 1 second..."
+
+            $tryCount++
+
+            [System.Threading.Thread]::Sleep([System.TimeSpan]::FromSeconds(1))
+        }
+        finally {
+            if ($workingDirectory) {
+                Pop-Location
+            }
+        }
+    }
+    while ($true)
+}
diff --git a/.build/psake/public/FormatTaskName.ps1 b/.build/psake/public/FormatTaskName.ps1
new file mode 100644
index 0000000..a8be633
--- /dev/null
+++ b/.build/psake/public/FormatTaskName.ps1
@@ -0,0 +1,95 @@
+function FormatTaskName {
+    <#
+        .SYNOPSIS
+        This function allows you to change how psake renders the task name during a build.
+
+        .DESCRIPTION
+        This function takes either a string which represents a format string (formats using the -f format operator see "help about_operators") or it can accept a script block that has a single parameter that is the name of the task that will be executed.
+
+        .PARAMETER format
+        A format string or a scriptblock to execute
+
+        .EXAMPLE
+        A sample build script that uses a format string is shown below:
+
+        Task default -depends TaskA, TaskB, TaskC
+
+        FormatTaskName "-------- {0} --------"
+
+        Task TaskA {
+        "TaskA is executing"
+        }
+
+        Task TaskB {
+        "TaskB is executing"
+        }
+
+        Task TaskC {
+        "TaskC is executing"
+
+        -----------
+        The script above produces the following output:
+
+        -------- TaskA --------
+        TaskA is executing
+        -------- TaskB --------
+        TaskB is executing
+        -------- TaskC --------
+        TaskC is executing
+
+        Build Succeeded!
+        .EXAMPLE
+        A sample build script that uses a ScriptBlock is shown below:
+
+        Task default -depends TaskA, TaskB, TaskC
+
+        FormatTaskName {
+            param($taskName)
+            write-host "Executing Task: $taskName" -foregroundcolor blue
+        }
+
+        Task TaskA {
+        "TaskA is executing"
+        }
+
+        Task TaskB {
+        "TaskB is executing"
+        }
+
+        Task TaskC {
+        "TaskC is executing"
+        }
+
+        -----------
+        The above example uses the scriptblock parameter to the FormatTaskName function to render each task name in the color blue.
+
+        Note: the $taskName parameter is arbitrary, it could be named anything.
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        $format
+    )
+
+    $psake.context.Peek().config.taskNameFormat = $format
+}
diff --git a/.build/psake/public/Framework.ps1 b/.build/psake/public/Framework.ps1
new file mode 100644
index 0000000..304bb06
--- /dev/null
+++ b/.build/psake/public/Framework.ps1
@@ -0,0 +1,55 @@
+function Framework {
+    <#
+    .SYNOPSIS
+    Sets the version of the .NET framework you want to use during build.
+
+    .DESCRIPTION
+    This function will accept a string containing version of the .NET framework to use during build.
+    Possible values: '1.0', '1.1', '2.0', '2.0x86', '2.0x64', '3.0', '3.0x86', '3.0x64', '3.5', '3.5x86', '3.5x64', '4.0', '4.0x86', '4.0x64', '4.5', '4.5x86', '4.5x64', '4.5.1', '4.5.1x86', '4.5.1x64'.
+    Default is '3.5*', where x86 or x64 will be detected based on the bitness of the PowerShell process.
+
+    .PARAMETER framework
+    Version of the .NET framework to use during build.
+
+    .EXAMPLE
+    Framework "4.0"
+
+    Task default -depends Compile
+
+    Task Compile -depends Clean {
+        msbuild /version
+    }
+
+    -----------
+    The script above will output detailed version of msbuid v4
+    .LINK
+    Assert
+    .LINK
+    Exec
+    .LINK
+    FormatTaskName
+    .LINK
+    Get-PSakeScriptTasks
+    .LINK
+    Include
+    .LINK
+    Invoke-psake
+    .LINK
+    Properties
+    .LINK
+    Task
+    .LINK
+    TaskSetup
+    .LINK
+    TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [string]$framework
+    )
+
+    $psake.context.Peek().config.framework = $framework
+
+    ConfigureBuildEnvironment
+}
diff --git a/.build/psake/public/Get-PSakeScriptTasks.ps1 b/.build/psake/public/Get-PSakeScriptTasks.ps1
new file mode 100644
index 0000000..e0f8f96
--- /dev/null
+++ b/.build/psake/public/Get-PSakeScriptTasks.ps1
@@ -0,0 +1,45 @@
+function Get-PSakeScriptTasks {
+    <#
+    .SYNOPSIS
+    Returns meta data about all the tasks defined in the provided psake script.
+
+    .DESCRIPTION
+    Returns meta data about all the tasks defined in the provided psake script.
+
+    .PARAMETER buildFile
+    The path to the psake build script to read the tasks from.
+
+    .EXAMPLE
+    PS C:\>Get-PSakeScriptTasks -buildFile '.\build.ps1'
+
+    DependsOn        Alias Name    Description
+    ---------        ----- ----    -----------
+    {}                     Compile
+    {}                     Clean
+    {Test}                 Default
+    {Clean, Compile}       Test
+
+    Gets the psake tasks contained in the 'build.ps1' file.
+
+    .LINK
+    Invoke-psake
+    #>
+    [System.Diagnostics.CodeAnalysis.SuppressMessage('PSUseSingularNouns', '')]
+    [CmdletBinding()]
+    param(
+        [string]$buildFile
+    )
+
+    if (-not $buildFile) {
+        $buildFile = $psake.config_default.buildFileName
+    }
+
+    try {
+        ExecuteInBuildFileScope $buildFile $MyInvocation.MyCommand.Module {
+            param($currentContext, $module)
+            return GetTasksFromContext $currentContext
+        }
+    } finally {
+        CleanupEnvironment
+    }
+}
diff --git a/.build/psake/public/Include.ps1 b/.build/psake/public/Include.ps1
new file mode 100644
index 0000000..3c163fe
--- /dev/null
+++ b/.build/psake/public/Include.ps1
@@ -0,0 +1,64 @@
+function Include {
+    <#
+        .SYNOPSIS
+        Include the functions or code of another powershell script file into the current build script's scope
+
+        .DESCRIPTION
+        A build script may declare an "includes" function which allows you to define a file containing powershell code to be included
+        and added to the scope of the currently running build script. Code from such file will be executed after code from build script.
+
+        .PARAMETER fileNamePathToInclude
+        A string containing the path and name of the powershell file to include
+
+        .EXAMPLE
+        A sample build script is shown below:
+
+        Include ".\build_utils.ps1"
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        -----------
+        The script above includes all the functions and variables defined in the ".\build_utils.ps1" script into the current build script's scope
+
+        Note: You can have more than 1 "Include" function defined in the build script.
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [string]$fileNamePathToInclude
+    )
+
+    Assert (test-path $fileNamePathToInclude -pathType Leaf) ($msgs.error_invalid_include_path -f $fileNamePathToInclude)
+
+    $psake.context.Peek().includes.Enqueue((Resolve-Path $fileNamePathToInclude));
+}
diff --git a/.build/psake/public/Invoke-Task.ps1 b/.build/psake/public/Invoke-Task.ps1
new file mode 100644
index 0000000..e441170
--- /dev/null
+++ b/.build/psake/public/Invoke-Task.ps1
@@ -0,0 +1,158 @@
+function Invoke-Task {
+    <#
+        .SYNOPSIS
+        Executes another task in the current build script.
+
+        .DESCRIPTION
+        This is a function that will allow you to invoke a Task from within another Task in the current build script.
+
+        .PARAMETER taskName
+        The name of the task to execute.
+
+        .EXAMPLE
+        Invoke-Task "Compile"
+
+        This example calls the "Compile" task.
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [string]$taskName
+    )
+
+    Assert $taskName ($msgs.error_invalid_task_name)
+
+    $taskKey = $taskName.ToLower()
+
+    $currentContext = $psake.context.Peek()
+
+    if ($currentContext.aliases.Contains($taskKey)) {
+        $taskName = $currentContext.aliases.$taskKey.Name
+        $taskKey = $taskName.ToLower()
+    }
+
+    Assert ($currentContext.tasks.Contains($taskKey)) ($msgs.error_task_name_does_not_exist -f $taskName)
+
+    if ($currentContext.executedTasks.Contains($taskKey))  { return }
+
+    Assert (!$currentContext.callStack.Contains($taskKey)) ($msgs.error_circular_reference -f $taskName)
+
+    $currentContext.callStack.Push($taskKey)
+
+    $task = $currentContext.tasks.$taskKey
+
+    $precondition_is_valid = & $task.Precondition
+
+    if (!$precondition_is_valid) {
+        WriteColoredOutput ($msgs.precondition_was_false -f $taskName) -foregroundcolor Cyan
+    } else {
+        if ($taskKey -ne 'default') {
+
+            if ($task.PreAction -or $task.PostAction) {
+                Assert ($null -ne $task.Action) ($msgs.error_missing_action_parameter -f $taskName)
+            }
+
+            if ($task.Action) {
+
+                $stopwatch = new-object System.Diagnostics.Stopwatch
+
+                try {
+                    foreach($childTask in $task.DependsOn) {
+                        Invoke-Task $childTask
+                    }
+                    $stopwatch.Start()
+
+                    $currentContext.currentTaskName = $taskName
+
+                    try {
+                        & $currentContext.taskSetupScriptBlock @($task)
+                        try {
+                            if ($task.PreAction) {
+                                & $task.PreAction
+                            }
+
+                            if ($currentContext.config.taskNameFormat -is [ScriptBlock]) {
+                                $taskHeader = & $currentContext.config.taskNameFormat $taskName
+                            } else {
+                                $taskHeader = $currentContext.config.taskNameFormat -f $taskName
+                            }
+                            WriteColoredOutput $taskHeader -foregroundcolor Cyan
+
+                            foreach ($variable in $task.requiredVariables) {
+                                Assert ((Test-Path "variable:$variable") -and ($null -ne (Get-Variable $variable).Value)) ($msgs.required_variable_not_set -f $variable, $taskName)
+                            }
+
+                            & $task.Action
+                        } finally {
+                            if ($task.PostAction) {
+                                & $task.PostAction
+                            }
+                        }
+                    } catch {
+                        # want to catch errors here _before_ we invoke TaskTearDown
+                        # so that TaskTearDown reliably gets the Task-scoped
+                        # success/fail/error context.
+                        $task.Success        = $false
+                        $task.ErrorMessage   = $_
+                        $task.ErrorDetail    = $_ | Out-String
+                        $task.ErrorFormatted = FormatErrorMessage $_
+
+                        throw $_ # pass this up the chain; cleanup is handled higher int he stack
+                    } finally {
+                        & $currentContext.taskTearDownScriptBlock $task
+                    }
+                } catch {
+                    if ($task.ContinueOnError) {
+                        "-"*70
+                        WriteColoredOutput ($msgs.continue_on_error -f $taskName,$_) -foregroundcolor Yellow
+                        "-"*70
+                        [void]$currentContext.callStack.Pop()
+                    }  else {
+                        throw $_
+                    }
+                } finally {
+                    $task.Duration = $stopwatch.Elapsed
+                }
+            } else {
+                # no action was specified but we still execute all the dependencies
+                foreach($childTask in $task.DependsOn) {
+                    Invoke-Task $childTask
+                }
+            }
+        } else {
+            foreach($childTask in $task.DependsOn) {
+                Invoke-Task $childTask
+            }
+        }
+
+        Assert (& $task.Postcondition) ($msgs.postcondition_failed -f $taskName)
+    }
+
+    $poppedTaskKey = $currentContext.callStack.Pop()
+    Assert ($poppedTaskKey -eq $taskKey) ($msgs.error_corrupt_callstack -f $taskKey,$poppedTaskKey)
+
+    $currentContext.executedTasks.Push($taskKey)
+}
diff --git a/.build/psake/public/Invoke-psake.ps1 b/.build/psake/public/Invoke-psake.ps1
new file mode 100644
index 0000000..2e9a65a
--- /dev/null
+++ b/.build/psake/public/Invoke-psake.ps1
@@ -0,0 +1,343 @@
+function Invoke-psake {
+    <#
+        .SYNOPSIS
+        Runs a psake build script.
+
+        .DESCRIPTION
+        This function runs a psake build script
+
+        .PARAMETER buildFile
+        The path to the psake build script to execute
+
+        .PARAMETER taskList
+        A comma-separated list of task names to execute
+
+        .PARAMETER framework
+        The version of the .NET framework you want to use during build. You can append x86 or x64 to force a specific framework.
+        If not specified, x86 or x64 will be detected based on the bitness of the PowerShell process.
+        Possible values: '1.0', '1.1', '2.0', '2.0x86', '2.0x64', '3.0', '3.0x86', '3.0x64', '3.5', '3.5x86', '3.5x64', '4.0', '4.0x86', '4.0x64', '4.5', '4.5x86', '4.5x64', '4.5.1', '4.5.1x86', '4.5.1x64'
+
+        .PARAMETER docs
+        Prints a list of tasks and their descriptions
+
+        .PARAMETER parameters
+        A hashtable containing parameters to be passed into the current build script.
+        These parameters will be processed before the 'Properties' function of the script is processed.
+        This means you can access parameters from within the 'Properties' function!
+
+        .PARAMETER properties
+        A hashtable containing properties to be passed into the current build script.
+        These properties will override matching properties that are found in the 'Properties' function of the script.
+
+        .PARAMETER initialization
+        Parameter description
+
+        .PARAMETER nologo
+        Do not display the startup banner and copyright message.
+
+        .PARAMETER detailedDocs
+        Prints a more descriptive list of tasks and their descriptions.
+
+        .PARAMETER notr
+        Do not display the time report.
+
+        .EXAMPLE
+        Invoke-psake
+
+        Runs the 'default' task in the '.build.ps1' build script
+
+        .EXAMPLE
+        Invoke-psake '.\build.ps1' Tests,Package
+
+        Runs the 'Tests' and 'Package' tasks in the '.build.ps1' build script
+
+        .EXAMPLE
+        Invoke-psake Tests
+
+        This example will run the 'Tests' tasks in the 'psakefile.ps1' build script. The 'psakefile.ps1' is assumed to be in the current directory.
+
+        .EXAMPLE
+        Invoke-psake 'Tests, Package'
+
+        This example will run the 'Tests' and 'Package' tasks in the 'psakefile.ps1' build script. The 'psakefile.ps1' is assumed to be in the current directory.
+
+        .EXAMPLE
+        Invoke-psake .\build.ps1 -docs
+
+        Prints a report of all the tasks and their dependencies and descriptions and then exits
+
+        .EXAMPLE
+        Invoke-psake .\parameters.ps1 -parameters @{"p1"="v1";"p2"="v2"}
+
+        Runs the build script called 'parameters.ps1' and passes in parameters 'p1' and 'p2' with values 'v1' and 'v2'
+
+        Here's the .\parameters.ps1 build script:
+
+        properties {
+            $my_property = $p1 + $p2
+        }
+
+        task default -depends TestParams
+
+        task TestParams {
+            Assert ($my_property -ne $null) '$my_property should not be null'
+        }
+
+        Notice how you can refer to the parameters that were passed into the script from within the "properties" function.
+        The value of the $p1 variable should be the string "v1" and the value of the $p2 variable should be "v2".
+
+        .EXAMPLE
+        Invoke-psake .\properties.ps1 -properties @{"x"="1";"y"="2"}
+
+        Runs the build script called 'properties.ps1' and passes in parameters 'x' and 'y' with values '1' and '2'
+
+        This feature allows you to override existing properties in your build script.
+
+        Here's the .\properties.ps1 build script:
+
+        properties {
+            $x = $null
+            $y = $null
+            $z = $null
+        }
+
+        task default -depends TestProperties
+
+        task TestProperties {
+            Assert ($x -ne $null) "x should not be null"
+            Assert ($y -ne $null) "y should not be null"
+            Assert ($z -eq $null) "z should be null"
+        }
+
+        .NOTES
+        ---- Exceptions ----
+
+        If there is an exception thrown during the running of a build script psake will set the '$psake.build_success' variable to $false.
+        To detect failue outside PowerShell (for example by build server), finish PowerShell process with non-zero exit code when '$psake.build_success' is $false.
+        Calling psake from 'cmd.exe' with 'psake.cmd' will give you that behaviour.
+
+        ---- $psake variable ----
+
+        When the psake module is loaded a variable called $psake is created which is a hashtable
+        containing some variables:
+
+        $psake.version                      # contains the current version of psake
+        $psake.context                      # holds onto the current state of all variables
+        $psake.run_by_psake_build_tester    # indicates that build is being run by psake-BuildTester
+        $psake.config_default               # contains default configuration
+                                            # can be overriden in psake-config.ps1 in directory with psake.psm1 or in directory with current build script
+        $psake.build_success                # indicates that the current build was successful
+        $psake.build_script_file            # contains a System.IO.FileInfo for the current build script
+        $psake.build_script_dir             # contains the fully qualified path to the current build script
+        $psake.error_message                # contains the error message which caused the script to fail
+
+        You should see the following when you display the contents of the $psake variable right after importing psake
+
+        PS projects:\psake\> Import-Module .\psake.psm1
+        PS projects:\psake\> $psake
+
+        Name                           Value
+        ----                           -----
+        run_by_psake_build_tester      False
+        version                        4.2
+        build_success                  False
+        build_script_file
+        build_script_dir
+        config_default                 @{framework=3.5; ...
+        context                        {}
+        error_message
+
+        After a build is executed the following $psake values are updated: build_script_file, build_script_dir, build_success
+
+        PS projects:\psake\> Invoke-psake .\examples\psakefile.ps1
+        Executing task: Clean
+        Executed Clean!
+        Executing task: Compile
+        Executed Compile!
+        Executing task: Test
+        Executed Test!
+
+        Build Succeeded!
+
+        ----------------------------------------------------------------------
+        Build Time Report
+        ----------------------------------------------------------------------
+        Name    Duration
+        ----    --------
+        Clean   00:00:00.0798486
+        Compile 00:00:00.0869948
+        Test    00:00:00.0958225
+        Total:  00:00:00.2712414
+
+        PS projects:\psake\> $psake
+
+        Name                           Value
+        ----                           -----
+        build_script_file              YOUR_PATH\examples\psakefile.ps1
+        run_by_psake_build_tester      False
+        build_script_dir               YOUR_PATH\examples
+        context                        {}
+        version                        4.2
+        build_success                  True
+        config_default                 @{framework=3.5; ...
+        error_message
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+        .LINK
+        Properties
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Position = 0, Mandatory = $false)]
+        [string]$buildFile,
+
+        [Parameter(Position = 1, Mandatory = $false)]
+        [string[]]$taskList = @(),
+
+        [Parameter(Position = 2, Mandatory = $false)]
+        [string]$framework,
+
+        [Parameter(Position = 3, Mandatory = $false)]
+        [switch]$docs = $false,
+
+        [Parameter(Position = 4, Mandatory = $false)]
+        [hashtable]$parameters = @{},
+
+        [Parameter(Position = 5, Mandatory = $false)]
+        [hashtable]$properties = @{},
+
+        [Parameter(Position = 6, Mandatory = $false)]
+        [alias("init")]
+        [scriptblock]$initialization = {},
+
+        [Parameter(Position = 7, Mandatory = $false)]
+        [switch]$nologo,
+
+        [Parameter(Position = 8, Mandatory = $false)]
+        [switch]$detailedDocs,
+
+        [Parameter(Position = 9, Mandatory = $false)]
+        [switch]$notr # disable time report
+    )
+
+    try {
+        if (-not $nologo) {
+            "psake version {0}$($script:nl)Copyright (c) 2010-2018 James Kovacs & Contributors$($script:nl)" -f $psake.version
+        }
+        if (!$buildFile) {
+           $buildFile = Get-DefaultBuildFile
+        }
+        elseif (!(Test-Path $buildFile -PathType Leaf) -and ($null -ne (Get-DefaultBuildFile -UseDefaultIfNoneExist $false))) {
+            # If the default file exists and the given "buildfile" isn't found assume that the given
+            # $buildFile is actually the target Tasks to execute in the $config.buildFileName script.
+            $taskList = $buildFile.Split(', ')
+            $buildFile = Get-DefaultBuildFile
+        }
+
+        $psake.error_message = $null
+
+        ExecuteInBuildFileScope $buildFile $MyInvocation.MyCommand.Module {
+            param($currentContext, $module)
+
+            $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
+
+            if ($docs -or $detailedDocs) {
+                WriteDocumentation($detailedDocs)
+                return
+            }
+
+            try {
+                foreach ($key in $parameters.keys) {
+                    if (test-path "variable:\$key") {
+                        set-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
+                    } else {
+                        new-item -path "variable:\$key" -value $parameters.$key -WhatIf:$false -Confirm:$false | out-null
+                    }
+                }
+            } catch {
+                WriteColoredOutput "Parameter '$key' is null" -foregroundcolor Red
+                throw
+            }
+
+            # The initial dot (.) indicates that variables initialized/modified in the propertyBlock are available in the parent scope.
+            while ($currentContext.properties.Count -gt 0) {
+                $propertyBlock = $currentContext.properties.Pop()
+                . $propertyBlock
+            }
+
+            foreach ($key in $properties.keys) {
+                if (test-path "variable:\$key") {
+                    set-item -path "variable:\$key" -value $properties.$key -WhatIf:$false -Confirm:$false | out-null
+                }
+            }
+
+            # Simple dot sourcing will not work. We have to force the script block into our
+            # module's scope in order to initialize variables properly.
+            . $module $initialization
+
+            & $currentContext.buildSetupScriptBlock
+
+            # Execute the list of tasks or the default task
+            try {
+                if ($taskList) {
+                    foreach ($task in $taskList) {
+                        invoke-task $task
+                    }
+                } elseif ($currentContext.tasks.default) {
+                    invoke-task default
+                } else {
+                    throw $msgs.error_no_default_task
+                }
+            }
+            finally {
+                & $currentContext.buildTearDownScriptBlock
+            }
+
+            $successMsg = $msgs.psake_success -f $buildFile
+            WriteColoredOutput ("$($script:nl)${successMsg}$($script:nl)") -foregroundcolor Green
+
+            $stopwatch.Stop()
+            if (-not $notr) {
+                WriteTaskTimeSummary $stopwatch.Elapsed
+            }
+        }
+
+        $psake.build_success = $true
+
+    } catch {
+        $psake.build_success = $false
+        $psake.error_message = FormatErrorMessage $_
+
+        # if we are running in a nested scope (i.e. running a psake script from a psake script) then we need to re-throw the exception
+        # so that the parent script will fail otherwise the parent script will report a successful build
+        $inNestedScope = ($psake.context.count -gt 1)
+        if ( $inNestedScope ) {
+            throw $_
+        } else {
+            if (!$psake.run_by_psake_build_tester) {
+                WriteColoredOutput $psake.error_message -foregroundcolor Red
+            }
+        }
+    } finally {
+        CleanupEnvironment
+    }
+}
diff --git a/.build/psake/public/Properties.ps1 b/.build/psake/public/Properties.ps1
new file mode 100644
index 0000000..0d4776b
--- /dev/null
+++ b/.build/psake/public/Properties.ps1
@@ -0,0 +1,61 @@
+function Properties {
+    <#
+        .SYNOPSIS
+        Define a scriptblock that contains assignments to variables that will be available to all tasks in the build script
+
+        .DESCRIPTION
+        A build script may declare a "Properies" function which allows you to define variables that will be available to all the "Task" functions in the build script.
+
+        .PARAMETER properties
+        The script block containing all the variable assignment statements
+
+        .EXAMPLE
+        A sample build script is shown below:
+
+        Properties {
+            $build_dir = "c:\build"
+            $connection_string = "datasource=localhost;initial catalog=northwind;integrated security=sspi"
+        }
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        Note: You can have more than one "Properties" function defined in the build script.
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$properties
+    )
+
+    $psake.context.Peek().properties.Push($properties)
+}
diff --git a/.build/psake/public/Task.ps1 b/.build/psake/public/Task.ps1
new file mode 100644
index 0000000..68e65d0
--- /dev/null
+++ b/.build/psake/public/Task.ps1
@@ -0,0 +1,331 @@
+function Task {
+    <#
+        .SYNOPSIS
+        Defines a build task to be executed by psake
+
+        .DESCRIPTION
+        This function creates a 'task' object that will be used by the psake engine to execute a build task.
+        Note: There must be at least one task called 'default' in the build script
+
+        .PARAMETER name
+        The name of the task
+
+        .PARAMETER action
+        A scriptblock containing the statements to execute for the task.
+
+        .PARAMETER preaction
+        A scriptblock to be executed before the 'Action' scriptblock.
+        Note: This parameter is ignored if the 'Action' scriptblock is not defined.
+
+        .PARAMETER postaction
+        A scriptblock to be executed after the 'Action' scriptblock.
+        Note: This parameter is ignored if the 'Action' scriptblock is not defined.
+
+        .PARAMETER precondition
+        A scriptblock that is executed to determine if the task is executed or skipped.
+        This scriptblock should return $true or $false
+
+        .PARAMETER postcondition
+        A scriptblock that is executed to determine if the task completed its job correctly.
+        An exception is thrown if the scriptblock returns $false.
+
+        .PARAMETER continueOnError
+        If this switch parameter is set then the task will not cause the build to fail when an exception is thrown by the task
+
+        .PARAMETER depends
+        An array of task names that this task depends on.
+        These tasks will be executed before the current task is executed.
+
+        .PARAMETER requiredVariables
+        An array of names of variables that must be set to run this task.
+
+        .PARAMETER description
+        A description of the task.
+
+        .PARAMETER alias
+        An alternate name for the task.
+
+        .PARAMETER FromModule
+        Load in the task from the specified PowerShell module.
+
+        .PARAMETER requiredVersion
+        The specific version of a module to load the task from
+
+        .PARAMETER minimumVersion
+        The minimum (inclusive) version of the PowerShell module to load in the task from.
+
+        .PARAMETER maximumVersion
+        The maximum (inclusive) version of the PowerShell module to load in the task from.
+
+        .PARAMETER lessThanVersion
+        The version of the PowerShell module to load in the task from that should not be met or exceeded. eg -lessThanVersion 2.0.0 will reject anything 2.0.0 or higher, allowing any module in the 1.x.x series.
+
+        .EXAMPLE
+        A sample build script is shown below:
+
+        Task default -Depends Test
+
+        Task Test -Depends Compile, Clean {
+            "This is a test"
+        }
+
+        Task Compile -Depends Clean {
+            "Compile"
+        }
+
+        Task Clean {
+            "Clean"
+        }
+
+        The 'default' task is required and should not contain an 'Action' parameter.
+        It uses the 'Depends' parameter to specify that 'Test' is a dependency
+
+        The 'Test' task uses the 'Depends' parameter to specify that 'Compile' and 'Clean' are dependencies
+        The 'Compile' task depends on the 'Clean' task.
+
+        Note:
+        The 'Action' parameter is defaulted to the script block following the 'Clean' task.
+
+        An equivalent 'Test' task is shown below:
+
+        Task Test -Depends Compile, Clean -Action {
+            $testMessage
+        }
+
+        The output for the above sample build script is shown below:
+
+        Executing task, Clean...
+        Clean
+        Executing task, Compile...
+        Compile
+        Executing task, Test...
+        This is a test
+
+        Build Succeeded!
+
+        ----------------------------------------------------------------------
+        Build Time Report
+        ----------------------------------------------------------------------
+        Name    Duration
+        ----    --------
+        Clean   00:00:00.0065614
+        Compile 00:00:00.0133268
+        Test    00:00:00.0225964
+        Total:  00:00:00.0782496
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        TaskSetup
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding(DefaultParameterSetName = 'Normal')]
+    param(
+        [Parameter(Mandatory = $true, Position = 0)]
+        [string]$name,
+
+        [Parameter(Position = 1)]
+        [scriptblock]$action = $null,
+
+        [Parameter(Position = 2)]
+        [scriptblock]$preaction = $null,
+
+        [Parameter(Position = 3)]
+        [scriptblock]$postaction = $null,
+
+        [Parameter(Position = 4)]
+        [scriptblock]$precondition = {$true},
+
+        [Parameter(Position = 5)]
+        [scriptblock]$postcondition = {$true},
+
+        [Parameter(Position = 6)]
+        [switch]$continueOnError,
+
+        [ValidateNotNull()]
+        [Parameter(Position = 7)]
+        [string[]]$depends = @(),
+
+        [ValidateNotNull()]
+        [Parameter(Position = 8)]
+        [string[]]$requiredVariables = @(),
+
+        [Parameter(Position = 9)]
+        [string]$description = $null,
+
+        [Parameter(Position = 10)]
+        [string]$alias = $null,
+
+        [parameter(Mandatory = $true, ParameterSetName = 'SharedTask', Position = 11)]
+        [ValidateNotNullOrEmpty()]
+        [string]$FromModule,
+
+        [Alias('Version')]
+        [parameter(ParameterSetName = 'SharedTask', Position = 12)]
+        [string]$requiredVersion,
+
+        [parameter(ParameterSetName = 'SharedTask', Position = 13)]
+        [string]$minimumVersion,
+
+        [parameter(ParameterSetName = 'SharedTask', Position = 14)]
+        [string]$maximumVersion,
+
+        [parameter(ParameterSetName = 'SharedTask', Position = 15)]
+        [string]$lessThanVersion
+    )
+
+    function CreateTask {
+        @{
+            Name              = $Name
+            DependsOn         = $depends
+            PreAction         = $preaction
+            Action            = $action
+            PostAction        = $postaction
+            Precondition      = $precondition
+            Postcondition     = $postcondition
+            ContinueOnError   = $continueOnError
+            Description       = $description
+            Duration          = [System.TimeSpan]::Zero
+            RequiredVariables = $requiredVariables
+            Alias             = $alias
+            Success           = $true # let's be optimistic
+            ErrorMessage      = $null
+            ErrorDetail       = $null
+            ErrorFormatted    = $null
+        }
+    }
+
+    # Default tasks have no action
+    if ($name -eq 'default') {
+        Assert (!$action) ($msgs.error_shared_task_cannot_have_action)
+    }
+
+    # Shared tasks have no action
+    if ($PSCmdlet.ParameterSetName -eq 'SharedTask') {
+        Assert (!$action) ($msgs.error_shared_task_cannot_have_action -f $Name, $FromModule)
+    }
+
+    $currentContext = $psake.context.Peek()
+
+    # Dot source the shared task module to load in its tasks
+    if ($PSCmdlet.ParameterSetName -eq 'SharedTask') {
+        $testModuleParams = @{
+            minimumVersion  = $minimumVersion
+            maximumVersion  = $maximumVersion
+            lessThanVersion = $lessThanVersion
+        }
+
+        if(![string]::IsNullOrEmpty($requiredVersion)){
+            $testModuleParams.minimumVersion = $requiredVersion
+            $testModuleParams.maximumVersion = $requiredVersion
+        }
+
+        if ($taskModule = Get-Module -Name $FromModule) {
+            # Use the task module that is already loaded into the session
+            $testModuleParams.currentVersion  = $taskModule.Version
+            $taskModule = Where-Object -InputObject $taskModule -FilterScript {Test-ModuleVersion @testModuleParams}
+        } else {
+            # Find the module
+            $getModuleParams = @{
+                ListAvailable = $true
+                Name          = $FromModule
+                ErrorAction   = 'Ignore'
+                Verbose       = $false
+            }
+            $taskModule = Get-Module @getModuleParams |
+                            Where-Object -FilterScript {Test-ModuleVersion -currentVersion $_.Version @testModuleParams} |
+                            Sort-Object -Property Version -Descending |
+                            Select-Object -First 1
+        }
+
+        # This task references a task from a module
+        # This reference task "could" include extra data about the task such as
+        # additional dependOn, aliase, etc.
+        # Store this task to the side so after we load the real task, we can combine
+        # this extra data if nesessary
+        $referenceTask = CreateTask
+        Assert (-not $psake.ReferenceTasks.ContainsKey($referenceTask.Name)) ($msgs.error_duplicate_task_name -f $referenceTask.Name)
+        $referenceTaskKey = $referenceTask.Name.ToLower()
+        $psake.ReferenceTasks.Add($referenceTaskKey, $referenceTask)
+
+        # Load in tasks from shared module into staging area
+        Assert ($null -ne $taskModule) ($msgs.error_unknown_module -f $FromModule)
+        $psakeFilePath = Join-Path -Path $taskModule.ModuleBase -ChildPath 'psakeFile.ps1'
+        if (-not $psake.LoadedTaskModules.ContainsKey($psakeFilePath)) {
+            Write-Debug -Message "Loading tasks from task module [$psakeFilePath]"
+            . $psakeFilePath
+            $psake.LoadedTaskModules.Add($psakeFilePath, $null)
+        }
+    } else {
+        # Create new task object
+        $newTask = CreateTask
+        $taskKey = $newTask.Name.ToLower()
+
+        # If this task was referenced from a parent build script
+        # check to see if that reference task has extra data to add
+        $refTask = $psake.ReferenceTasks[$taskKey]
+        if ($refTask) {
+
+            # Override the preaction
+            if ($refTask.PreAction -ne $newTask.PreAction) {
+                $newTask.PreAction = $refTask.PreAction
+            }
+
+            # Override the postaction
+            if ($refTask.PostAction -ne $newTask.PostAction) {
+                $newTask.PostAction = $refTask.PostAction
+            }
+
+            # Override the precondition
+            if ($refTask.PreCondition -ne $newTask.PreCondition) {
+                $newTask.PreCondition = $refTask.PreCondition
+            }
+
+            # Override the postcondition
+            if ($refTask.PostCondition -ne $newTask.PostCondition) {
+                $newTask.PostCondition = $refTask.PostCondition
+            }
+
+            # Override the continueOnError
+            if ($refTask.ContinueOnError) {
+                $newTask.ContinueOnError = $refTask.ContinueOnError
+            }
+
+            # Override the depends
+            if ($refTask.DependsOn.Count -gt 0 -and (Compare-Object -ReferenceObject $refTask.DependsOn -DifferenceObject $newTask.DependsOn)) {
+                $newTask.DependsOn = $refTask.DependsOn
+            }
+
+            # Override the requiredVariables
+            if ($refTask.RequiredVariables.Count -gt 0 -and (Compare-Object -ReferenceObject.RequiredVariables -DifferenceObject $newTask.RequiredVariables)) {
+                $newTask.RequiredVariables += $refTask.RequiredVariables
+            }
+        }
+
+        # Add the task to the context
+        Assert (-not $currentContext.tasks.ContainsKey($taskKey)) ($msgs.error_duplicate_task_name -f $taskKey)
+        Write-Debug "Adding task [$taskKey)]"
+        $currentContext.tasks[$taskKey] = $newTask
+
+        if ($alias) {
+            $aliasKey = $alias.ToLower()
+            Assert (-not $currentContext.aliases.ContainsKey($aliasKey)) ($msgs.error_duplicate_alias_name -f $alias)
+            $currentContext.aliases[$aliasKey] = $newTask
+        }
+    }
+}
diff --git a/.build/psake/public/TaskSetup.ps1 b/.build/psake/public/TaskSetup.ps1
new file mode 100644
index 0000000..50da9f2
--- /dev/null
+++ b/.build/psake/public/TaskSetup.ps1
@@ -0,0 +1,102 @@
+function TaskSetup {
+    <#
+        .SYNOPSIS
+        Adds a scriptblock that will be executed before each task
+
+        .DESCRIPTION
+        This function will accept a scriptblock that will be executed before each task in the build script.
+
+        The scriptblock accepts an optional parameter which describes the Task being setup.
+
+        .PARAMETER setup
+        A scriptblock to execute
+
+        .EXAMPLE
+        A sample build script is shown below:
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        TaskSetup {
+            "Running 'TaskSetup' for task $context.Peek().currentTaskName"
+        }
+
+        The script above produces the following output:
+
+        Running 'TaskSetup' for task Clean
+        Executing task, Clean...
+        Running 'TaskSetup' for task Compile
+        Executing task, Compile...
+        Running 'TaskSetup' for task Test
+        Executing task, Test...
+
+        Build Succeeded
+
+        .EXAMPLE
+        A sample build script showing access to the Task context is shown below:
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        TaskSetup {
+            param($task)
+
+            "Running 'TaskSetup' for task $($task.Name)"
+        }
+
+        The script above produces the following output:
+
+        Running 'TaskSetup' for task Clean
+        Executing task, Clean...
+        Running 'TaskSetup' for task Compile
+        Executing task, Compile...
+        Running 'TaskSetup' for task Test
+        Executing task, Test...
+
+        Build Succeeded
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskTearDown
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$setup
+    )
+
+    $psake.context.Peek().taskSetupScriptBlock = $setup
+}
diff --git a/.build/psake/public/TaskTearDown.ps1 b/.build/psake/public/TaskTearDown.ps1
new file mode 100644
index 0000000..b45a589
--- /dev/null
+++ b/.build/psake/public/TaskTearDown.ps1
@@ -0,0 +1,107 @@
+
+function TaskTearDown {
+    <#
+        .SYNOPSIS
+        Adds a scriptblock to the build that will be executed after each task
+
+        .DESCRIPTION
+        This function will accept a scriptblock that will be executed after each task in the build script.
+
+        The scriptblock accepts an optional parameter which describes the Task being torn down.
+
+        .PARAMETER teardown
+        A scriptblock to execute
+
+        .EXAMPLE
+        A sample build script is shown below:
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        TaskTearDown {
+            "Running 'TaskTearDown' for task $context.Peek().currentTaskName"
+        }
+
+        The script above produces the following output:
+
+        Executing task, Clean...
+        Running 'TaskTearDown' for task Clean
+        Executing task, Compile...
+        Running 'TaskTearDown' for task Compile
+        Executing task, Test...
+        Running 'TaskTearDown' for task Test
+
+        Build Succeeded
+
+        .EXAMPLE
+        A sample build script demonstrating access to the task context is shown below:
+
+        Task default -depends Test
+
+        Task Test -depends Compile, Clean {
+        }
+
+        Task Compile -depends Clean {
+        }
+
+        Task Clean {
+        }
+
+        TaskTearDown {
+            param($task)
+
+            if ($task.Success) {
+                "Running 'TaskTearDown' for task $($task.Name) - success!"
+            } else {
+                "Running 'TaskTearDown' for task $($task.Name) - failed: $($task.ErrorMessage)"
+            }
+        }
+
+        The script above produces the following output:
+
+        Executing task, Clean...
+        Running 'TaskTearDown' for task Clean - success!
+        Executing task, Compile...
+        Running 'TaskTearDown' for task Compile - success!
+        Executing task, Test...
+        Running 'TaskTearDown' for task Test - success!
+
+        Build Succeeded
+
+        .LINK
+        Assert
+        .LINK
+        Exec
+        .LINK
+        FormatTaskName
+        .LINK
+        Framework
+        .LINK
+        Get-PSakeScriptTasks
+        .LINK
+        Include
+        .LINK
+        Invoke-psake
+        .LINK
+        Properties
+        .LINK
+        Task
+        .LINK
+        TaskSetup
+    #>
+    [CmdletBinding()]
+    param(
+        [Parameter(Mandatory = $true)]
+        [scriptblock]$teardown
+    )
+
+    $psake.context.Peek().taskTearDownScriptBlock = $teardown
+}
diff --git a/.build/psake/readme.md b/.build/psake/readme.md
new file mode 100644
index 0000000..42222b7
--- /dev/null
+++ b/.build/psake/readme.md
@@ -0,0 +1,13 @@
+# Psake Build Automation
+
+psake is a build automation tool written in PowerShell. It avoids the angle-bracket tax associated with executable XML by leveraging the PowerShell syntax in your build scripts. psake has a syntax inspired by rake (aka make in Ruby) and bake (aka make in Boo), but is easier to script because it leverages your existing command-line knowledge.
+
+psake is pronounced sake – as in Japanese rice wine. It does NOT rhyme with make, bake, or rake.
+
+## Documentation
+
+The docs for the latest version of Psake are at: https://psake.readthedocs.io/en/latest/. There is also some good info on the [README.md](https://github.com/psake/psake#readme).
+
+## Upgrading
+
+Simply download the [latest release of Psake](https://github.com/psake/psake/releases) and drop the files from the `/src` folder it into this directory to upgrade. In general, we don't use very much advanced functionality and the main file names remain stable from one release to the next.
\ No newline at end of file
diff --git a/.rat-excludes b/.rat-excludes
index 43cd1fe..1975068 100644
--- a/.rat-excludes
+++ b/.rat-excludes
@@ -23,6 +23,7 @@ svn-release/*
 LuceneResourcesWikiPage\.html
 
 # Covered under a different license
+psake/*
 KStemData\d+\.cs
 Snowball/*
 Egothor.Stemmer/*
diff --git a/LICENSE.txt b/LICENSE.txt
index 2e2958a..4acef96 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,4 +1,4 @@
-
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -744,8 +744,7 @@ SOFTWARE.
 
 ---
 
-The code in build/psake.cmd, build/psake.ps1, build/psake.psd1, and build/psake.psm1
-falls under the following license:
+The code in build/psake/ falls under the following license:
 
 psake
 Copyright (c) 2012-13 James Kovacs, Damian Hickey and Contributors
diff --git a/Lucene.Net.sln b/Lucene.Net.sln
index 6d150d0..c80f1ab 100644
--- a/Lucene.Net.sln
+++ b/Lucene.Net.sln
@@ -46,6 +46,55 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".build", ".build", "{4016BD
 		TestTargetFramework.props = TestTargetFramework.props
 	EndProjectSection
 EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "psake", "psake", "{4BFE738F-3D99-4408-85D4-E882737F9CEC}"
+	ProjectSection(SolutionItems) = preProject
+		.build\psake\psake = .build\psake\psake
+		.build\psake\psake-config.ps1 = .build\psake\psake-config.ps1
+		.build\psake\psake.cmd = .build\psake\psake.cmd
+		.build\psake\psake.ps1 = .build\psake\psake.ps1
+		.build\psake\psake.psd1 = .build\psake\psake.psd1
+		.build\psake\psake.psm1 = .build\psake\psake.psm1
+		.build\psake\readme.md = .build\psake\readme.md
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "public", "public", "{DB6B3C48-B1B1-4977-9FB0-333ED71E84E1}"
+	ProjectSection(SolutionItems) = preProject
+		.build\psake\public\Assert.ps1 = .build\psake\public\Assert.ps1
+		.build\psake\public\BuildSetup.ps1 = .build\psake\public\BuildSetup.ps1
+		.build\psake\public\BuildTearDown.ps1 = .build\psake\public\BuildTearDown.ps1
+		.build\psake\public\Exec.ps1 = .build\psake\public\Exec.ps1
+		.build\psake\public\FormatTaskName.ps1 = .build\psake\public\FormatTaskName.ps1
+		.build\psake\public\Framework.ps1 = .build\psake\public\Framework.ps1
+		.build\psake\public\Get-PSakeScriptTasks.ps1 = .build\psake\public\Get-PSakeScriptTasks.ps1
+		.build\psake\public\Include.ps1 = .build\psake\public\Include.ps1
+		.build\psake\public\Invoke-psake.ps1 = .build\psake\public\Invoke-psake.ps1
+		.build\psake\public\Invoke-Task.ps1 = .build\psake\public\Invoke-Task.ps1
+		.build\psake\public\Properties.ps1 = .build\psake\public\Properties.ps1
+		.build\psake\public\Task.ps1 = .build\psake\public\Task.ps1
+		.build\psake\public\TaskSetup.ps1 = .build\psake\public\TaskSetup.ps1
+		.build\psake\public\TaskTearDown.ps1 = .build\psake\public\TaskTearDown.ps1
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "private", "private", "{BC910C84-EF7C-4F69-AA76-47C0EC06D809}"
+	ProjectSection(SolutionItems) = preProject
+		.build\psake\private\CleanupEnvironment.ps1 = .build\psake\private\CleanupEnvironment.ps1
+		.build\psake\private\ConfigureBuildEnvironment.ps1 = .build\psake\private\ConfigureBuildEnvironment.ps1
+		.build\psake\private\CreateConfigurationForNewContext.ps1 = .build\psake\private\CreateConfigurationForNewContext.ps1
+		.build\psake\private\ExecuteInBuildFileScope.ps1 = .build\psake\private\ExecuteInBuildFileScope.ps1
+		.build\psake\private\FormatErrorMessage.ps1 = .build\psake\private\FormatErrorMessage.ps1
+		.build\psake\private\Get-DefaultBuildFile.ps1 = .build\psake\private\Get-DefaultBuildFile.ps1
+		.build\psake\private\GetCurrentConfigurationOrDefault.ps1 = .build\psake\private\GetCurrentConfigurationOrDefault.ps1
+		.build\psake\private\GetTasksFromContext.ps1 = .build\psake\private\GetTasksFromContext.ps1
+		.build\psake\private\LoadConfiguration.ps1 = .build\psake\private\LoadConfiguration.ps1
+		.build\psake\private\LoadModules.ps1 = .build\psake\private\LoadModules.ps1
+		.build\psake\private\ResolveError.ps1 = .build\psake\private\ResolveError.ps1
+		.build\psake\private\SelectObjectWithDefault.ps1 = .build\psake\private\SelectObjectWithDefault.ps1
+		.build\psake\private\Test-ModuleVersion.ps1 = .build\psake\private\Test-ModuleVersion.ps1
+		.build\psake\private\WriteColoredOutput.ps1 = .build\psake\private\WriteColoredOutput.ps1
+		.build\psake\private\WriteDocumentation.ps1 = .build\psake\private\WriteDocumentation.ps1
+		.build\psake\private\WriteTaskTimeSummary.ps1 = .build\psake\private\WriteTaskTimeSummary.ps1
+	EndProjectSection
+EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{4DF7EACE-2B25-43F6-B558-8520BF20BD76}"
 	ProjectSection(SolutionItems) = preProject
 		src\dotnet\tools\Directory.Build.props = src\dotnet\tools\Directory.Build.props
@@ -507,6 +556,9 @@ Global
 	EndGlobalSection
 	GlobalSection(NestedProjects) = preSolution
 		{05CE3A39-40D4-452D-AFE0-E57E536A08C6} = {4016BDAB-6C33-4D1E-9439-57B416EA45D5}
+		{4BFE738F-3D99-4408-85D4-E882737F9CEC} = {4016BDAB-6C33-4D1E-9439-57B416EA45D5}
+		{DB6B3C48-B1B1-4977-9FB0-333ED71E84E1} = {4BFE738F-3D99-4408-85D4-E882737F9CEC}
+		{BC910C84-EF7C-4F69-AA76-47C0EC06D809} = {4BFE738F-3D99-4408-85D4-E882737F9CEC}
 		{4DF7EACE-2B25-43F6-B558-8520BF20BD76} = {8CA61D33-3590-4024-A304-7B1F75B50653}
 		{EFB2E31A-5917-49D5-A808-FE5061A550B4} = {8CA61D33-3590-4024-A304-7B1F75B50653}
 		{119BBACD-D4DB-4E3B-922F-3DA83E0B29E2} = {4DF7EACE-2B25-43F6-B558-8520BF20BD76}
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index b0729ad..d576f31 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -129,7 +129,7 @@ stages:
         version: '$(BuildSDKVersion)'
 
     - pwsh: |
-        Import-Module "$(BuildDirectory)/psake.psm1"
+        Import-Module "$(BuildDirectory)/psake/psake.psm1"
         $generateBuildBat = $env:ISRELEASE
         $primaryCommand = if ($env:RUNPACK -ne 'false') { 'Pack' } else { 'Compile' }
         $parameters = @{}
diff --git a/build.bat b/build.bat
index 19581c5..856cce7 100644
--- a/build.bat
+++ b/build.bat
@@ -129,6 +129,6 @@ if "!runtests!"=="true" (
 	set tasks="Default,Test"
 )
 
-powershell -ExecutionPolicy Bypass -Command "& { Import-Module .\.build\psake.psm1; Invoke-Psake .\.build\runbuild.ps1 %tasks% -properties @{configuration='%configuration%';maximumParalellJobs=%maximumParallelJobs%} -parameters @{ packageVersion='%PackageVersion%';version='%version%' } }"
+powershell -ExecutionPolicy Bypass -Command "& { Import-Module .\.build\psake\psake.psm1; Invoke-Psake .\.build\runbuild.ps1 %tasks% -properties @{configuration='%configuration%';maximumParalellJobs=%maximumParallelJobs%} -parameters @{ packageVersion='%PackageVersion%';version='%version%' } }"
 
 endlocal