|
@@ -0,0 +1,1054 @@
|
|
|
+# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
|
+
|
|
|
+$InitialDatabase = '0'
|
|
|
+
|
|
|
+$knownExceptions = @(
|
|
|
+ 'System.Data.Entity.Migrations.Infrastructure.MigrationsException',
|
|
|
+ 'System.Data.Entity.Migrations.Infrastructure.AutomaticMigrationsDisabledException',
|
|
|
+ 'System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException',
|
|
|
+ 'System.Data.Entity.Migrations.Infrastructure.MigrationsPendingException',
|
|
|
+ 'System.Data.Entity.Migrations.ProjectTypeNotSupportedException'
|
|
|
+)
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Adds or updates an Entity Framework provider entry in the project config
|
|
|
+ file.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Adds an entry into the 'entityFramework' section of the project config
|
|
|
+ file for the specified provider invariant name and provider type. If an
|
|
|
+ entry for the given invariant name already exists, then that entry is
|
|
|
+ updated with the given type name, unless the given type name already
|
|
|
+ matches, in which case no action is taken. The 'entityFramework'
|
|
|
+ section is added if it does not exist. The config file is automatically
|
|
|
+ saved if and only if a change was made.
|
|
|
+
|
|
|
+ This command is typically used only by Entity Framework provider NuGet
|
|
|
+ packages and is run from the 'install.ps1' script.
|
|
|
+
|
|
|
+.PARAMETER Project
|
|
|
+ The Visual Studio project to update. When running in the NuGet install.ps1
|
|
|
+ script the '$project' variable provided as part of that script should be
|
|
|
+ used.
|
|
|
+
|
|
|
+.PARAMETER InvariantName
|
|
|
+ The provider invariant name that uniquely identifies this provider. For
|
|
|
+ example, the Microsoft SQL Server provider is registered with the invariant
|
|
|
+ name 'System.Data.SqlClient'.
|
|
|
+
|
|
|
+.PARAMETER TypeName
|
|
|
+ The assembly-qualified type name of the provider-specific type that
|
|
|
+ inherits from 'System.Data.Entity.Core.Common.DbProviderServices'. For
|
|
|
+ example, for the Microsoft SQL Server provider, this type is
|
|
|
+ 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'.
|
|
|
+#>
|
|
|
+function Add-EFProvider
|
|
|
+{
|
|
|
+ param (
|
|
|
+ [parameter(Position = 0,
|
|
|
+ Mandatory = $true)]
|
|
|
+ $Project,
|
|
|
+ [parameter(Position = 1,
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $InvariantName,
|
|
|
+ [parameter(Position = 2,
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $TypeName
|
|
|
+ )
|
|
|
+
|
|
|
+ Check-Project $project
|
|
|
+
|
|
|
+ $runner = New-EFConfigRunner $Project
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddProviderCommand @( $InvariantName, $TypeName )
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Adds or updates an Entity Framework default connection factory in the
|
|
|
+ project config file.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Adds an entry into the 'entityFramework' section of the project config
|
|
|
+ file for the connection factory that Entity Framework will use by default
|
|
|
+ when creating new connections by convention. Any existing entry will be
|
|
|
+ overridden if it does not match. The 'entityFramework' section is added if
|
|
|
+ it does not exist. The config file is automatically saved if and only if
|
|
|
+ a change was made.
|
|
|
+
|
|
|
+ This command is typically used only by Entity Framework provider NuGet
|
|
|
+ packages and is run from the 'install.ps1' script.
|
|
|
+
|
|
|
+.PARAMETER Project
|
|
|
+ The Visual Studio project to update. When running in the NuGet install.ps1
|
|
|
+ script the '$project' variable provided as part of that script should be
|
|
|
+ used.
|
|
|
+
|
|
|
+.PARAMETER TypeName
|
|
|
+ The assembly-qualified type name of the connection factory type that
|
|
|
+ implements the 'System.Data.Entity.Infrastructure.IDbConnectionFactory'
|
|
|
+ interface. For example, for the Microsoft SQL Server Express provider
|
|
|
+ connection factory, this type is
|
|
|
+ 'System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework'.
|
|
|
+
|
|
|
+.PARAMETER ConstructorArguments
|
|
|
+ An optional array of strings that will be passed as arguments to the
|
|
|
+ connection factory type constructor.
|
|
|
+#>
|
|
|
+function Add-EFDefaultConnectionFactory
|
|
|
+{
|
|
|
+ param (
|
|
|
+ [parameter(Position = 0,
|
|
|
+ Mandatory = $true)]
|
|
|
+ $Project,
|
|
|
+ [parameter(Position = 1,
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $TypeName,
|
|
|
+ [string[]] $ConstructorArguments
|
|
|
+ )
|
|
|
+
|
|
|
+ Check-Project $project
|
|
|
+
|
|
|
+ $runner = New-EFConfigRunner $Project
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.AddDefaultConnectionFactoryCommand @( $TypeName, $ConstructorArguments )
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Initializes the Entity Framework section in the project config file
|
|
|
+ and sets defaults.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Creates the 'entityFramework' section of the project config file and sets
|
|
|
+ the default connection factory to use SQL Express if it is running on the
|
|
|
+ machine, or LocalDb otherwise. Note that installing a different provider
|
|
|
+ may change the default connection factory. The config file is
|
|
|
+ automatically saved if and only if a change was made.
|
|
|
+
|
|
|
+ In addition, any reference to 'System.Data.Entity.dll' in the project is
|
|
|
+ removed.
|
|
|
+
|
|
|
+ This command is typically used only by Entity Framework provider NuGet
|
|
|
+ packages and is run from the 'install.ps1' script.
|
|
|
+
|
|
|
+.PARAMETER Project
|
|
|
+ The Visual Studio project to update. When running in the NuGet install.ps1
|
|
|
+ script the '$project' variable provided as part of that script should be
|
|
|
+ used.
|
|
|
+#>
|
|
|
+function Initialize-EFConfiguration
|
|
|
+{
|
|
|
+ param (
|
|
|
+ [parameter(Position = 0,
|
|
|
+ Mandatory = $true)]
|
|
|
+ $Project
|
|
|
+ )
|
|
|
+
|
|
|
+ Check-Project $project
|
|
|
+
|
|
|
+ $runner = New-EFConfigRunner $Project
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.ConnectionFactoryConfig.InitializeEntityFrameworkCommand
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Enables Code First Migrations in a project.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Enables Migrations by scaffolding a migrations configuration class in the project. If the
|
|
|
+ target database was created by an initializer, an initial migration will be created (unless
|
|
|
+ automatic migrations are enabled via the EnableAutomaticMigrations parameter).
|
|
|
+
|
|
|
+.PARAMETER ContextTypeName
|
|
|
+ Specifies the context to use. If omitted, migrations will attempt to locate a
|
|
|
+ single context type in the target project.
|
|
|
+
|
|
|
+.PARAMETER EnableAutomaticMigrations
|
|
|
+ Specifies whether automatic migrations will be enabled in the scaffolded migrations configuration.
|
|
|
+ If omitted, automatic migrations will be disabled.
|
|
|
+
|
|
|
+.PARAMETER MigrationsDirectory
|
|
|
+ Specifies the name of the directory that will contain migrations code files.
|
|
|
+ If omitted, the directory will be named "Migrations".
|
|
|
+
|
|
|
+.PARAMETER ProjectName
|
|
|
+ Specifies the project that the scaffolded migrations configuration class will
|
|
|
+ be added to. If omitted, the default project selected in package manager
|
|
|
+ console is used.
|
|
|
+
|
|
|
+.PARAMETER StartUpProjectName
|
|
|
+ Specifies the configuration file to use for named connection strings. If
|
|
|
+ omitted, the specified project's configuration file is used.
|
|
|
+
|
|
|
+.PARAMETER ContextProjectName
|
|
|
+ Specifies the project which contains the DbContext class to use. If omitted,
|
|
|
+ the context is assumed to be in the same project used for migrations.
|
|
|
+
|
|
|
+.PARAMETER ConnectionStringName
|
|
|
+ Specifies the name of a connection string to use from the application's
|
|
|
+ configuration file.
|
|
|
+
|
|
|
+.PARAMETER ConnectionString
|
|
|
+ Specifies the the connection string to use. If omitted, the context's
|
|
|
+ default connection will be used.
|
|
|
+
|
|
|
+.PARAMETER ConnectionProviderName
|
|
|
+ Specifies the provider invariant name of the connection string.
|
|
|
+
|
|
|
+.PARAMETER Force
|
|
|
+ Specifies that the migrations configuration be overwritten when running more
|
|
|
+ than once for a given project.
|
|
|
+#>
|
|
|
+function Enable-Migrations
|
|
|
+{
|
|
|
+ [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
|
|
|
+ param (
|
|
|
+ [string] $ContextTypeName,
|
|
|
+ [alias('Auto')]
|
|
|
+ [switch] $EnableAutomaticMigrations,
|
|
|
+ [string] $MigrationsDirectory,
|
|
|
+ [string] $ProjectName,
|
|
|
+ [string] $StartUpProjectName,
|
|
|
+ [string] $ContextProjectName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringName')]
|
|
|
+ [string] $ConnectionStringName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionString,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionProviderName,
|
|
|
+ [switch] $Force
|
|
|
+ )
|
|
|
+
|
|
|
+ $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $ContextProjectName $null $ConnectionStringName $ConnectionString $ConnectionProviderName
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.Migrations.EnableMigrationsCommand @( $EnableAutomaticMigrations.IsPresent, $Force.IsPresent ) @{ 'ContextTypeName' = $ContextTypeName; 'MigrationsDirectory' = $MigrationsDirectory }
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+
|
|
|
+ $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Scaffolds a migration script for any pending model changes.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Scaffolds a new migration script and adds it to the project.
|
|
|
+
|
|
|
+.PARAMETER Name
|
|
|
+ Specifies the name of the custom script.
|
|
|
+
|
|
|
+.PARAMETER Force
|
|
|
+ Specifies that the migration user code be overwritten when re-scaffolding an
|
|
|
+ existing migration.
|
|
|
+
|
|
|
+.PARAMETER ProjectName
|
|
|
+ Specifies the project that contains the migration configuration type to be
|
|
|
+ used. If omitted, the default project selected in package manager console
|
|
|
+ is used.
|
|
|
+
|
|
|
+.PARAMETER StartUpProjectName
|
|
|
+ Specifies the configuration file to use for named connection strings. If
|
|
|
+ omitted, the specified project's configuration file is used.
|
|
|
+
|
|
|
+.PARAMETER ConfigurationTypeName
|
|
|
+ Specifies the migrations configuration to use. If omitted, migrations will
|
|
|
+ attempt to locate a single migrations configuration type in the target
|
|
|
+ project.
|
|
|
+
|
|
|
+.PARAMETER ConnectionStringName
|
|
|
+ Specifies the name of a connection string to use from the application's
|
|
|
+ configuration file.
|
|
|
+
|
|
|
+.PARAMETER ConnectionString
|
|
|
+ Specifies the the connection string to use. If omitted, the context's
|
|
|
+ default connection will be used.
|
|
|
+
|
|
|
+.PARAMETER ConnectionProviderName
|
|
|
+ Specifies the provider invariant name of the connection string.
|
|
|
+
|
|
|
+.PARAMETER IgnoreChanges
|
|
|
+ Scaffolds an empty migration ignoring any pending changes detected in the current model.
|
|
|
+ This can be used to create an initial, empty migration to enable Migrations for an existing
|
|
|
+ database. N.B. Doing this assumes that the target database schema is compatible with the
|
|
|
+ current model.
|
|
|
+
|
|
|
+#>
|
|
|
+function Add-Migration
|
|
|
+{
|
|
|
+ [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
|
|
|
+ param (
|
|
|
+ [parameter(Position = 0,
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $Name,
|
|
|
+ [switch] $Force,
|
|
|
+ [string] $ProjectName,
|
|
|
+ [string] $StartUpProjectName,
|
|
|
+ [string] $ConfigurationTypeName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringName')]
|
|
|
+ [string] $ConnectionStringName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionString,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionProviderName,
|
|
|
+ [switch] $IgnoreChanges)
|
|
|
+
|
|
|
+ $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.Migrations.AddMigrationCommand @( $Name, $Force.IsPresent, $IgnoreChanges.IsPresent )
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Applies any pending migrations to the database.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Updates the database to the current model by applying pending migrations.
|
|
|
+
|
|
|
+.PARAMETER SourceMigration
|
|
|
+ Only valid with -Script. Specifies the name of a particular migration to use
|
|
|
+ as the update's starting point. If omitted, the last applied migration in
|
|
|
+ the database will be used.
|
|
|
+
|
|
|
+.PARAMETER TargetMigration
|
|
|
+ Specifies the name of a particular migration to update the database to. If
|
|
|
+ omitted, the current model will be used.
|
|
|
+
|
|
|
+.PARAMETER Script
|
|
|
+ Generate a SQL script rather than executing the pending changes directly.
|
|
|
+
|
|
|
+.PARAMETER Force
|
|
|
+ Specifies that data loss is acceptable during automatic migration of the
|
|
|
+ database.
|
|
|
+
|
|
|
+.PARAMETER ProjectName
|
|
|
+ Specifies the project that contains the migration configuration type to be
|
|
|
+ used. If omitted, the default project selected in package manager console
|
|
|
+ is used.
|
|
|
+
|
|
|
+.PARAMETER StartUpProjectName
|
|
|
+ Specifies the configuration file to use for named connection strings. If
|
|
|
+ omitted, the specified project's configuration file is used.
|
|
|
+
|
|
|
+.PARAMETER ConfigurationTypeName
|
|
|
+ Specifies the migrations configuration to use. If omitted, migrations will
|
|
|
+ attempt to locate a single migrations configuration type in the target
|
|
|
+ project.
|
|
|
+
|
|
|
+.PARAMETER ConnectionStringName
|
|
|
+ Specifies the name of a connection string to use from the application's
|
|
|
+ configuration file.
|
|
|
+
|
|
|
+.PARAMETER ConnectionString
|
|
|
+ Specifies the the connection string to use. If omitted, the context's
|
|
|
+ default connection will be used.
|
|
|
+
|
|
|
+.PARAMETER ConnectionProviderName
|
|
|
+ Specifies the provider invariant name of the connection string.
|
|
|
+#>
|
|
|
+function Update-Database
|
|
|
+{
|
|
|
+ [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
|
|
|
+ param (
|
|
|
+ [string] $SourceMigration,
|
|
|
+ [string] $TargetMigration,
|
|
|
+ [switch] $Script,
|
|
|
+ [switch] $Force,
|
|
|
+ [string] $ProjectName,
|
|
|
+ [string] $StartUpProjectName,
|
|
|
+ [string] $ConfigurationTypeName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringName')]
|
|
|
+ [string] $ConnectionStringName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionString,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionProviderName)
|
|
|
+
|
|
|
+ $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.Migrations.UpdateDatabaseCommand @( $SourceMigration, $TargetMigration, $Script.IsPresent, $Force.IsPresent, $Verbose.IsPresent )
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ $(Get-VSComponentModel).GetService([NuGetConsole.IPowerConsoleWindow]).Show()
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+<#
|
|
|
+.SYNOPSIS
|
|
|
+ Displays the migrations that have been applied to the target database.
|
|
|
+
|
|
|
+.DESCRIPTION
|
|
|
+ Displays the migrations that have been applied to the target database.
|
|
|
+
|
|
|
+.PARAMETER ProjectName
|
|
|
+ Specifies the project that contains the migration configuration type to be
|
|
|
+ used. If omitted, the default project selected in package manager console
|
|
|
+ is used.
|
|
|
+
|
|
|
+.PARAMETER StartUpProjectName
|
|
|
+ Specifies the configuration file to use for named connection strings. If
|
|
|
+ omitted, the specified project's configuration file is used.
|
|
|
+
|
|
|
+.PARAMETER ConfigurationTypeName
|
|
|
+ Specifies the migrations configuration to use. If omitted, migrations will
|
|
|
+ attempt to locate a single migrations configuration type in the target
|
|
|
+ project.
|
|
|
+
|
|
|
+.PARAMETER ConnectionStringName
|
|
|
+ Specifies the name of a connection string to use from the application's
|
|
|
+ configuration file.
|
|
|
+
|
|
|
+.PARAMETER ConnectionString
|
|
|
+ Specifies the the connection string to use. If omitted, the context's
|
|
|
+ default connection will be used.
|
|
|
+
|
|
|
+.PARAMETER ConnectionProviderName
|
|
|
+ Specifies the provider invariant name of the connection string.
|
|
|
+#>
|
|
|
+function Get-Migrations
|
|
|
+{
|
|
|
+ [CmdletBinding(DefaultParameterSetName = 'ConnectionStringName')]
|
|
|
+ param (
|
|
|
+ [string] $ProjectName,
|
|
|
+ [string] $StartUpProjectName,
|
|
|
+ [string] $ConfigurationTypeName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringName')]
|
|
|
+ [string] $ConnectionStringName,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionString,
|
|
|
+ [parameter(ParameterSetName = 'ConnectionStringAndProviderName',
|
|
|
+ Mandatory = $true)]
|
|
|
+ [string] $ConnectionProviderName)
|
|
|
+
|
|
|
+ $runner = New-MigrationsRunner $ProjectName $StartUpProjectName $null $ConfigurationTypeName $ConnectionStringName $ConnectionString $ConnectionProviderName
|
|
|
+
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Invoke-RunnerCommand $runner System.Data.Entity.Migrations.GetMigrationsCommand
|
|
|
+ $error = Get-RunnerError $runner
|
|
|
+
|
|
|
+ if ($error)
|
|
|
+ {
|
|
|
+ if ($knownExceptions -notcontains $error.TypeName)
|
|
|
+ {
|
|
|
+ Write-Host $error.StackTrace
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose $error.StackTrace
|
|
|
+ }
|
|
|
+
|
|
|
+ throw $error.Message
|
|
|
+ }
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ Remove-Runner $runner
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function New-MigrationsRunner($ProjectName, $StartUpProjectName, $ContextProjectName, $ConfigurationTypeName, $ConnectionStringName, $ConnectionString, $ConnectionProviderName)
|
|
|
+{
|
|
|
+ $startUpProject = Get-MigrationsStartUpProject $StartUpProjectName $ProjectName
|
|
|
+ Build-Project $startUpProject
|
|
|
+
|
|
|
+ $project = Get-MigrationsProject $ProjectName
|
|
|
+ Build-Project $project
|
|
|
+
|
|
|
+ $contextProject = $project
|
|
|
+ if ($ContextProjectName)
|
|
|
+ {
|
|
|
+ $contextProject = Get-SingleProject $ContextProjectName
|
|
|
+ Build-Project $contextProject
|
|
|
+ }
|
|
|
+
|
|
|
+ $installPath = Get-EntityFrameworkInstallPath $project
|
|
|
+ $toolsPath = Join-Path $installPath tools
|
|
|
+
|
|
|
+ $info = New-AppDomainSetup $project $installPath
|
|
|
+
|
|
|
+ $domain = [AppDomain]::CreateDomain('Migrations', $null, $info)
|
|
|
+ $domain.SetData('project', $project)
|
|
|
+ $domain.SetData('contextProject', $contextProject)
|
|
|
+ $domain.SetData('startUpProject', $startUpProject)
|
|
|
+ $domain.SetData('configurationTypeName', $ConfigurationTypeName)
|
|
|
+ $domain.SetData('connectionStringName', $ConnectionStringName)
|
|
|
+ $domain.SetData('connectionString', $ConnectionString)
|
|
|
+ $domain.SetData('connectionProviderName', $ConnectionProviderName)
|
|
|
+
|
|
|
+ $dispatcher = New-DomainDispatcher $toolsPath
|
|
|
+ $domain.SetData('efDispatcher', $dispatcher)
|
|
|
+
|
|
|
+ return @{
|
|
|
+ Domain = $domain;
|
|
|
+ ToolsPath = $toolsPath
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function New-EFConfigRunner($Project)
|
|
|
+{
|
|
|
+ $installPath = Get-EntityFrameworkInstallPath $Project
|
|
|
+ $toolsPath = Join-Path $installPath tools
|
|
|
+ $info = New-AppDomainSetup $Project $installPath
|
|
|
+
|
|
|
+ $domain = [AppDomain]::CreateDomain('EFConfig', $null, $info)
|
|
|
+ $domain.SetData('project', $Project)
|
|
|
+
|
|
|
+ $dispatcher = New-DomainDispatcher $toolsPath
|
|
|
+ $domain.SetData('efDispatcher', $dispatcher)
|
|
|
+
|
|
|
+ return @{
|
|
|
+ Domain = $domain;
|
|
|
+ ToolsPath = $toolsPath
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function New-AppDomainSetup($Project, $InstallPath)
|
|
|
+{
|
|
|
+ $info = New-Object System.AppDomainSetup -Property @{
|
|
|
+ ShadowCopyFiles = 'true';
|
|
|
+ ApplicationBase = $InstallPath;
|
|
|
+ PrivateBinPath = 'tools';
|
|
|
+ ConfigurationFile = ([AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile)
|
|
|
+ }
|
|
|
+
|
|
|
+ $targetFrameworkVersion = (New-Object System.Runtime.Versioning.FrameworkName ($Project.Properties.Item('TargetFrameworkMoniker').Value)).Version
|
|
|
+
|
|
|
+ if ($targetFrameworkVersion -lt (New-Object Version @( 4, 5 )))
|
|
|
+ {
|
|
|
+ $info.PrivateBinPath += ';lib\net40'
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $info.PrivateBinPath += ';lib\net45'
|
|
|
+ }
|
|
|
+
|
|
|
+ return $info
|
|
|
+}
|
|
|
+
|
|
|
+function New-DomainDispatcher($ToolsPath)
|
|
|
+{
|
|
|
+ $utilityAssembly = [System.Reflection.Assembly]::LoadFrom((Join-Path $ToolsPath EntityFramework.PowerShell.Utility.dll))
|
|
|
+ $dispatcher = $utilityAssembly.CreateInstance(
|
|
|
+ 'System.Data.Entity.Migrations.Utilities.DomainDispatcher',
|
|
|
+ $false,
|
|
|
+ [System.Reflection.BindingFlags]::Instance -bor [System.Reflection.BindingFlags]::Public,
|
|
|
+ $null,
|
|
|
+ $PSCmdlet,
|
|
|
+ $null,
|
|
|
+ $null)
|
|
|
+
|
|
|
+ return $dispatcher
|
|
|
+}
|
|
|
+
|
|
|
+function Remove-Runner($runner)
|
|
|
+{
|
|
|
+ [AppDomain]::Unload($runner.Domain)
|
|
|
+}
|
|
|
+
|
|
|
+function Invoke-RunnerCommand($runner, $command, $parameters, $anonymousArguments)
|
|
|
+{
|
|
|
+ $domain = $runner.Domain
|
|
|
+
|
|
|
+ if ($anonymousArguments)
|
|
|
+ {
|
|
|
+ $anonymousArguments.GetEnumerator() | %{
|
|
|
+ $domain.SetData($_.Name, $_.Value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $domain.CreateInstanceFrom(
|
|
|
+ (Join-Path $runner.ToolsPath EntityFramework.PowerShell.dll),
|
|
|
+ $command,
|
|
|
+ $false,
|
|
|
+ 0,
|
|
|
+ $null,
|
|
|
+ $parameters,
|
|
|
+ $null,
|
|
|
+ $null) | Out-Null
|
|
|
+}
|
|
|
+
|
|
|
+function Get-RunnerError($runner)
|
|
|
+{
|
|
|
+ $domain = $runner.Domain
|
|
|
+
|
|
|
+ if (!$domain.GetData('wasError'))
|
|
|
+ {
|
|
|
+ return $null
|
|
|
+ }
|
|
|
+
|
|
|
+ return @{
|
|
|
+ Message = $domain.GetData('error.Message');
|
|
|
+ TypeName = $domain.GetData('error.TypeName');
|
|
|
+ StackTrace = $domain.GetData('error.StackTrace')
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function Get-MigrationsProject($name, $hideMessage)
|
|
|
+{
|
|
|
+ if ($name)
|
|
|
+ {
|
|
|
+ return Get-SingleProject $name
|
|
|
+ }
|
|
|
+
|
|
|
+ $project = Get-Project
|
|
|
+ $projectName = $project.Name
|
|
|
+
|
|
|
+ if (!$hideMessage)
|
|
|
+ {
|
|
|
+ Write-Verbose "Using NuGet project '$projectName'."
|
|
|
+ }
|
|
|
+
|
|
|
+ return $project
|
|
|
+}
|
|
|
+
|
|
|
+function Get-MigrationsStartUpProject($name, $fallbackName)
|
|
|
+{
|
|
|
+ $startUpProject = $null
|
|
|
+
|
|
|
+ if ($name)
|
|
|
+ {
|
|
|
+ $startUpProject = Get-SingleProject $name
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $startupProjectPaths = $DTE.Solution.SolutionBuild.StartupProjects
|
|
|
+
|
|
|
+ if ($startupProjectPaths)
|
|
|
+ {
|
|
|
+ if ($startupProjectPaths.Length -eq 1)
|
|
|
+ {
|
|
|
+ $startupProjectPath = $startupProjectPaths[0]
|
|
|
+
|
|
|
+ if (!(Split-Path -IsAbsolute $startupProjectPath))
|
|
|
+ {
|
|
|
+ $solutionPath = Split-Path $DTE.Solution.Properties.Item('Path').Value
|
|
|
+ $startupProjectPath = Join-Path $solutionPath $startupProjectPath -Resolve
|
|
|
+ }
|
|
|
+
|
|
|
+ $startupProject = Get-SolutionProjects | ?{
|
|
|
+ try
|
|
|
+ {
|
|
|
+ $fullName = $_.FullName
|
|
|
+ }
|
|
|
+ catch [NotImplementedException]
|
|
|
+ {
|
|
|
+ return $false
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($fullName -and $fullName.EndsWith('\'))
|
|
|
+ {
|
|
|
+ $fullName = $fullName.Substring(0, $fullName.Length - 1)
|
|
|
+ }
|
|
|
+
|
|
|
+ return $fullName -eq $startupProjectPath
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose 'More than one start-up project found.'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Write-Verbose 'No start-up project found.'
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!($startUpProject -and (Test-StartUpProject $startUpProject)))
|
|
|
+ {
|
|
|
+ $startUpProject = Get-MigrationsProject $fallbackName $true
|
|
|
+ $startUpProjectName = $startUpProject.Name
|
|
|
+
|
|
|
+ Write-Warning "Cannot determine a valid start-up project. Using project '$startUpProjectName' instead. Your configuration file and working directory may not be set as expected. Use the -StartUpProjectName parameter to set one explicitly. Use the -Verbose switch for more information."
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ $startUpProjectName = $startUpProject.Name
|
|
|
+
|
|
|
+ Write-Verbose "Using StartUp project '$startUpProjectName'."
|
|
|
+ }
|
|
|
+
|
|
|
+ return $startUpProject
|
|
|
+}
|
|
|
+
|
|
|
+function Get-SolutionProjects()
|
|
|
+{
|
|
|
+ $projects = New-Object System.Collections.Stack
|
|
|
+
|
|
|
+ $DTE.Solution.Projects | %{
|
|
|
+ $projects.Push($_)
|
|
|
+ }
|
|
|
+
|
|
|
+ while ($projects.Count -ne 0)
|
|
|
+ {
|
|
|
+ $project = $projects.Pop();
|
|
|
+
|
|
|
+ # NOTE: This line is similar to doing a "yield return" in C#
|
|
|
+ $project
|
|
|
+
|
|
|
+ if ($project.ProjectItems)
|
|
|
+ {
|
|
|
+ $project.ProjectItems | ?{ $_.SubProject } | %{
|
|
|
+ $projects.Push($_.SubProject)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function Get-SingleProject($name)
|
|
|
+{
|
|
|
+ $project = Get-Project $name
|
|
|
+
|
|
|
+ if ($project -is [array])
|
|
|
+ {
|
|
|
+ throw "More than one project '$name' was found. Specify the full name of the one to use."
|
|
|
+ }
|
|
|
+
|
|
|
+ return $project
|
|
|
+}
|
|
|
+
|
|
|
+function Test-StartUpProject($project)
|
|
|
+{
|
|
|
+ if ($project.Kind -eq '{cc5fd16d-436d-48ad-a40c-5a424c6e3e79}')
|
|
|
+ {
|
|
|
+ $projectName = $project.Name
|
|
|
+ Write-Verbose "Cannot use start-up project '$projectName'. The Windows Azure Project type isn't supported."
|
|
|
+
|
|
|
+ return $false
|
|
|
+ }
|
|
|
+
|
|
|
+ return $true
|
|
|
+}
|
|
|
+
|
|
|
+function Build-Project($project)
|
|
|
+{
|
|
|
+ $configuration = $DTE.Solution.SolutionBuild.ActiveConfiguration.Name
|
|
|
+
|
|
|
+ $DTE.Solution.SolutionBuild.BuildProject($configuration, $project.UniqueName, $true)
|
|
|
+
|
|
|
+ if ($DTE.Solution.SolutionBuild.LastBuildInfo)
|
|
|
+ {
|
|
|
+ $projectName = $project.Name
|
|
|
+
|
|
|
+ throw "The project '$projectName' failed to build."
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function Get-EntityFrameworkInstallPath($project)
|
|
|
+{
|
|
|
+ $package = Get-Package -ProjectName $project.FullName | ?{ $_.Id -eq 'EntityFramework' }
|
|
|
+
|
|
|
+ if (!$package)
|
|
|
+ {
|
|
|
+ $projectName = $project.Name
|
|
|
+
|
|
|
+ throw "The EntityFramework package is not installed on project '$projectName'."
|
|
|
+ }
|
|
|
+
|
|
|
+ return Get-PackageInstallPath $package
|
|
|
+}
|
|
|
+
|
|
|
+function Get-PackageInstallPath($package)
|
|
|
+{
|
|
|
+ $componentModel = Get-VsComponentModel
|
|
|
+ $packageInstallerServices = $componentModel.GetService([NuGet.VisualStudio.IVsPackageInstallerServices])
|
|
|
+
|
|
|
+ $vsPackage = $packageInstallerServices.GetInstalledPackages() | ?{ $_.Id -eq $package.Id -and $_.Version -eq $package.Version }
|
|
|
+
|
|
|
+ return $vsPackage.InstallPath
|
|
|
+}
|
|
|
+
|
|
|
+function Check-Project($project)
|
|
|
+{
|
|
|
+ if (!$project.FullName)
|
|
|
+ {
|
|
|
+ throw "The Project argument must refer to a Visual Studio project. Use the '`$project' variable provided by NuGet when running in install.ps1."
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+Export-ModuleMember @( 'Enable-Migrations', 'Add-Migration', 'Update-Database', 'Get-Migrations', 'Add-EFProvider', 'Add-EFDefaultConnectionFactory', 'Initialize-EFConfiguration') -Variable InitialDatabase
|
|
|
+
|
|
|
+# SIG # Begin signature block
|
|
|
+# MIIarwYJKoZIhvcNAQcCoIIaoDCCGpwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
|
|
|
+# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
|
|
|
+# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUGD2nrGYv22CsZ8TVTLPYVoMj
|
|
|
+# HJGgghWCMIIEwzCCA6ugAwIBAgITMwAAACs5MkjBsslI8wAAAAAAKzANBgkqhkiG
|
|
|
+# 9w0BAQUFADB3MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
|
|
|
+# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSEw
|
|
|
+# HwYDVQQDExhNaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EwHhcNMTIwOTA0MjExMjM0
|
|
|
+# WhcNMTMxMjA0MjExMjM0WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
|
|
|
+# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
|
|
|
+# b3JhdGlvbjENMAsGA1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0UgRVNO
|
|
|
+# OkMwRjQtMzA4Ni1ERUY4MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT
|
|
|
+# ZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAprYwDgNlrlBa
|
|
|
+# hmuFn0ihHsnA7l5JB4XgcJZ8vrlfYl8GJtOLObsYIqUukq3YS4g6Gq+bg67IXjmM
|
|
|
+# wjJ7FnjtNzg68WL7aIICaOzru0CKsf6hLDZiYHA5YGIO+8YYOG+wktZADYCmDXiL
|
|
|
+# NmuGiiYXGP+w6026uykT5lxIjnBGNib+NDWrNOH32thc6pl9MbdNH1frfNaVDWYM
|
|
|
+# Hg4yFz4s1YChzuv3mJEC3MFf/TiA+Dl/XWTKN1w7UVtdhV/OHhz7NL5f5ShVcFSc
|
|
|
+# uOx8AFVGWyiYKFZM4fG6CRmWgUgqMMj3MyBs52nDs9TDTs8wHjfUmFLUqSNFsq5c
|
|
|
+# QUlPtGJokwIDAQABo4IBCTCCAQUwHQYDVR0OBBYEFKUYM1M/lWChQxbvjsav0iu6
|
|
|
+# nljQMB8GA1UdIwQYMBaAFCM0+NlSRnAK7UD7dvuzK7DDNbMPMFQGA1UdHwRNMEsw
|
|
|
+# SaBHoEWGQ2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3Rz
|
|
|
+# L01pY3Jvc29mdFRpbWVTdGFtcFBDQS5jcmwwWAYIKwYBBQUHAQEETDBKMEgGCCsG
|
|
|
+# AQUFBzAChjxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY3Jv
|
|
|
+# c29mdFRpbWVTdGFtcFBDQS5jcnQwEwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZI
|
|
|
+# hvcNAQEFBQADggEBAH7MsHvlL77nVrXPc9uqUtEWOca0zfrX/h5ltedI85tGiAVm
|
|
|
+# aiaGXv6HWNzGY444gPQIRnwrc7EOv0Gqy8eqlKQ38GQ54cXV+c4HzqvkJfBprtRG
|
|
|
+# 4v5mMjzXl8UyIfruGiWgXgxCLBEzOoKD/e0ds77OkaSRJXG5q3Kwnq/kzwBiiXCp
|
|
|
+# uEpQjO4vImSlqOZNa5UsHHnsp6Mx2pBgkKRu/pMCDT8sJA3GaiaBUYNKELt1Y0Sq
|
|
|
+# aQjGA+vizwvtVjrs73KnCgz0ANMiuK8icrPnxJwLKKCAyuPh1zlmMOdGFxjn+oL6
|
|
|
+# WQt6vKgN/hz/A4tjsk0SAiNPLbOFhDvioUfozxUwggTsMIID1KADAgECAhMzAAAA
|
|
|
+# sBGvCovQO5/dAAEAAACwMA0GCSqGSIb3DQEBBQUAMHkxCzAJBgNVBAYTAlVTMRMw
|
|
|
+# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
|
|
|
+# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNp
|
|
|
+# Z25pbmcgUENBMB4XDTEzMDEyNDIyMzMzOVoXDTE0MDQyNDIyMzMzOVowgYMxCzAJ
|
|
|
+# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
|
|
|
+# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIx
|
|
|
+# HjAcBgNVBAMTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjCCASIwDQYJKoZIhvcNAQEB
|
|
|
+# BQADggEPADCCAQoCggEBAOivXKIgDfgofLwFe3+t7ut2rChTPzrbQH2zjjPmVz+l
|
|
|
+# URU0VKXPtIupP6g34S1Q7TUWTu9NetsTdoiwLPBZXKnr4dcpdeQbhSeb8/gtnkE2
|
|
|
+# KwtA+747urlcdZMWUkvKM8U3sPPrfqj1QRVcCGUdITfwLLoiCxCxEJ13IoWEfE+5
|
|
|
+# G5Cw9aP+i/QMmk6g9ckKIeKq4wE2R/0vgmqBA/WpNdyUV537S9QOgts4jxL+49Z6
|
|
|
+# dIhk4WLEJS4qrp0YHw4etsKvJLQOULzeHJNcSaZ5tbbbzvlweygBhLgqKc+/qQUF
|
|
|
+# 4eAPcU39rVwjgynrx8VKyOgnhNN+xkMLlQAFsU9lccUCAwEAAaOCAWAwggFcMBMG
|
|
|
+# A1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQWBBRZcaZaM03amAeA/4Qevof5cjJB
|
|
|
+# 8jBRBgNVHREESjBIpEYwRDENMAsGA1UECxMETU9QUjEzMDEGA1UEBRMqMzE1OTUr
|
|
|
+# NGZhZjBiNzEtYWQzNy00YWEzLWE2NzEtNzZiYzA1MjM0NGFkMB8GA1UdIwQYMBaA
|
|
|
+# FMsR6MrStBZYAck3LjMWFrlMmgofMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j
|
|
|
+# cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY0NvZFNpZ1BDQV8w
|
|
|
+# OC0zMS0yMDEwLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6
|
|
|
+# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljQ29kU2lnUENBXzA4LTMx
|
|
|
+# LTIwMTAuY3J0MA0GCSqGSIb3DQEBBQUAA4IBAQAx124qElczgdWdxuv5OtRETQie
|
|
|
+# 7l7falu3ec8CnLx2aJ6QoZwLw3+ijPFNupU5+w3g4Zv0XSQPG42IFTp8263Os8ls
|
|
|
+# ujksRX0kEVQmMA0N/0fqAwfl5GZdLHudHakQ+hywdPJPaWueqSSE2u2WoN9zpO9q
|
|
|
+# GqxLYp7xfMAUf0jNTbJE+fA8k21C2Oh85hegm2hoCSj5ApfvEQO6Z1Ktwemzc6bS
|
|
|
+# Y81K4j7k8079/6HguwITO10g3lU/o66QQDE4dSheBKlGbeb1enlAvR/N6EXVruJd
|
|
|
+# PvV1x+ZmY2DM1ZqEh40kMPfvNNBjHbFCZ0oOS786Du+2lTqnOOQlkgimiGaCMIIF
|
|
|
+# vDCCA6SgAwIBAgIKYTMmGgAAAAAAMTANBgkqhkiG9w0BAQUFADBfMRMwEQYKCZIm
|
|
|
+# iZPyLGQBGRYDY29tMRkwFwYKCZImiZPyLGQBGRYJbWljcm9zb2Z0MS0wKwYDVQQD
|
|
|
+# EyRNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwODMx
|
|
|
+# MjIxOTMyWhcNMjAwODMxMjIyOTMyWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
|
|
|
+# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
|
|
|
+# IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBD
|
|
|
+# QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJyWVwZMGS/HZpgICBC
|
|
|
+# mXZTbD4b1m/My/Hqa/6XFhDg3zp0gxq3L6Ay7P/ewkJOI9VyANs1VwqJyq4gSfTw
|
|
|
+# aKxNS42lvXlLcZtHB9r9Jd+ddYjPqnNEf9eB2/O98jakyVxF3K+tPeAoaJcap6Vy
|
|
|
+# c1bxF5Tk/TWUcqDWdl8ed0WDhTgW0HNbBbpnUo2lsmkv2hkL/pJ0KeJ2L1TdFDBZ
|
|
|
+# +NKNYv3LyV9GMVC5JxPkQDDPcikQKCLHN049oDI9kM2hOAaFXE5WgigqBTK3S9dP
|
|
|
+# Y+fSLWLxRT3nrAgA9kahntFbjCZT6HqqSvJGzzc8OJ60d1ylF56NyxGPVjzBrAlf
|
|
|
+# A9MCAwEAAaOCAV4wggFaMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMsR6MrS
|
|
|
+# tBZYAck3LjMWFrlMmgofMAsGA1UdDwQEAwIBhjASBgkrBgEEAYI3FQEEBQIDAQAB
|
|
|
+# MCMGCSsGAQQBgjcVAgQWBBT90TFO0yaKleGYYDuoMW+mPLzYLTAZBgkrBgEEAYI3
|
|
|
+# FAIEDB4KAFMAdQBiAEMAQTAfBgNVHSMEGDAWgBQOrIJgQFYnl+UlE/wq4QpTlVnk
|
|
|
+# pDBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
|
|
|
+# L2NybC9wcm9kdWN0cy9taWNyb3NvZnRyb290Y2VydC5jcmwwVAYIKwYBBQUHAQEE
|
|
|
+# SDBGMEQGCCsGAQUFBzAChjhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
|
|
|
+# cnRzL01pY3Jvc29mdFJvb3RDZXJ0LmNydDANBgkqhkiG9w0BAQUFAAOCAgEAWTk+
|
|
|
+# fyZGr+tvQLEytWrrDi9uqEn361917Uw7LddDrQv+y+ktMaMjzHxQmIAhXaw9L0y6
|
|
|
+# oqhWnONwu7i0+Hm1SXL3PupBf8rhDBdpy6WcIC36C1DEVs0t40rSvHDnqA2iA6VW
|
|
|
+# 4LiKS1fylUKc8fPv7uOGHzQ8uFaa8FMjhSqkghyT4pQHHfLiTviMocroE6WRTsgb
|
|
|
+# 0o9ylSpxbZsa+BzwU9ZnzCL/XB3Nooy9J7J5Y1ZEolHN+emjWFbdmwJFRC9f9Nqu
|
|
|
+# 1IIybvyklRPk62nnqaIsvsgrEA5ljpnb9aL6EiYJZTiU8XofSrvR4Vbo0HiWGFzJ
|
|
|
+# NRZf3ZMdSY4tvq00RBzuEBUaAF3dNVshzpjHCe6FDoxPbQ4TTj18KUicctHzbMrB
|
|
|
+# 7HCjV5JXfZSNoBtIA1r3z6NnCnSlNu0tLxfI5nI3EvRvsTxngvlSso0zFmUeDord
|
|
|
+# EN5k9G/ORtTTF+l5xAS00/ss3x+KnqwK+xMnQK3k+eGpf0a7B2BHZWBATrBC7E7t
|
|
|
+# s3Z52Ao0CW0cgDEf4g5U3eWh++VHEK1kmP9QFi58vwUheuKVQSdpw5OPlcmN2Jsh
|
|
|
+# rg1cnPCiroZogwxqLbt2awAdlq3yFnv2FoMkuYjPaqhHMS+a3ONxPdcAfmJH0c6I
|
|
|
+# ybgY+g5yjcGjPa8CQGr/aZuW4hCoELQ3UAjWwz0wggYHMIID76ADAgECAgphFmg0
|
|
|
+# AAAAAAAcMA0GCSqGSIb3DQEBBQUAMF8xEzARBgoJkiaJk/IsZAEZFgNjb20xGTAX
|
|
|
+# BgoJkiaJk/IsZAEZFgltaWNyb3NvZnQxLTArBgNVBAMTJE1pY3Jvc29mdCBSb290
|
|
|
+# IENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0wNzA0MDMxMjUzMDlaFw0yMTA0MDMx
|
|
|
+# MzAzMDlaMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
|
|
|
+# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
|
|
|
+# BgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQTCCASIwDQYJKoZIhvcNAQEB
|
|
|
+# BQADggEPADCCAQoCggEBAJ+hbLHf20iSKnxrLhnhveLjxZlRI1Ctzt0YTiQP7tGn
|
|
|
+# 0UytdDAgEesH1VSVFUmUG0KSrphcMCbaAGvoe73siQcP9w4EmPCJzB/LMySHnfL0
|
|
|
+# Zxws/HvniB3q506jocEjU8qN+kXPCdBer9CwQgSi+aZsk2fXKNxGU7CG0OUoRi4n
|
|
|
+# rIZPVVIM5AMs+2qQkDBuh/NZMJ36ftaXs+ghl3740hPzCLdTbVK0RZCfSABKR2YR
|
|
|
+# JylmqJfk0waBSqL5hKcRRxQJgp+E7VV4/gGaHVAIhQAQMEbtt94jRrvELVSfrx54
|
|
|
+# QTF3zJvfO4OToWECtR0Nsfz3m7IBziJLVP/5BcPCIAsCAwEAAaOCAaswggGnMA8G
|
|
|
+# A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFCM0+NlSRnAK7UD7dvuzK7DDNbMPMAsG
|
|
|
+# A1UdDwQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADCBmAYDVR0jBIGQMIGNgBQOrIJg
|
|
|
+# QFYnl+UlE/wq4QpTlVnkpKFjpGEwXzETMBEGCgmSJomT8ixkARkWA2NvbTEZMBcG
|
|
|
+# CgmSJomT8ixkARkWCW1pY3Jvc29mdDEtMCsGA1UEAxMkTWljcm9zb2Z0IFJvb3Qg
|
|
|
+# Q2VydGlmaWNhdGUgQXV0aG9yaXR5ghB5rRahSqClrUxzWPQHEy5lMFAGA1UdHwRJ
|
|
|
+# MEcwRaBDoEGGP2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1
|
|
|
+# Y3RzL21pY3Jvc29mdHJvb3RjZXJ0LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYB
|
|
|
+# BQUHMAKGOGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljcm9z
|
|
|
+# b2Z0Um9vdENlcnQuY3J0MBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEB
|
|
|
+# BQUAA4ICAQAQl4rDXANENt3ptK132855UU0BsS50cVttDBOrzr57j7gu1BKijG1i
|
|
|
+# uFcCy04gE1CZ3XpA4le7r1iaHOEdAYasu3jyi9DsOwHu4r6PCgXIjUji8FMV3U+r
|
|
|
+# kuTnjWrVgMHmlPIGL4UD6ZEqJCJw+/b85HiZLg33B+JwvBhOnY5rCnKVuKE5nGct
|
|
|
+# xVEO6mJcPxaYiyA/4gcaMvnMMUp2MT0rcgvI6nA9/4UKE9/CCmGO8Ne4F+tOi3/F
|
|
|
+# NSteo7/rvH0LQnvUU3Ih7jDKu3hlXFsBFwoUDtLaFJj1PLlmWLMtL+f5hYbMUVbo
|
|
|
+# nXCUbKw5TNT2eb+qGHpiKe+imyk0BncaYsk9Hm0fgvALxyy7z0Oz5fnsfbXjpKh0
|
|
|
+# NbhOxXEjEiZ2CzxSjHFaRkMUvLOzsE1nyJ9C/4B5IYCeFTBm6EISXhrIniIh0EPp
|
|
|
+# K+m79EjMLNTYMoBMJipIJF9a6lbvpt6Znco6b72BJ3QGEe52Ib+bgsEnVLaxaj2J
|
|
|
+# oXZhtG6hE6a/qkfwEm/9ijJssv7fUciMI8lmvZ0dhxJkAj0tr1mPuOQh5bWwymO0
|
|
|
+# eFQF1EEuUKyUsKV4q7OglnUa2ZKHE3UiLzKoCG6gW4wlv6DvhMoh1useT8ma7kng
|
|
|
+# 9wFlb4kLfchpyOZu6qeXzjEp/w7FW1zYTRuh2Povnj8uVRZryROj/TGCBJcwggST
|
|
|
+# AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
|
|
|
+# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAh
|
|
|
+# BgNVBAMTGk1pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBAhMzAAAAsBGvCovQO5/d
|
|
|
+# AAEAAACwMAkGBSsOAwIaBQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
|
|
|
+# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFHlP
|
|
|
+# wIpDUAGAnbgDrTywRVvTXuBEMFAGCisGAQQBgjcCAQwxQjBAoCKAIABFAG4AdABp
|
|
|
+# AHQAeQAgAEYAcgBhAG0AZQB3AG8AcgBroRqAGGh0dHA6Ly9tc2RuLmNvbS9kYXRh
|
|
|
+# L2VmIDANBgkqhkiG9w0BAQEFAASCAQBGhre2E1qw0m8EQgJBaVLi6CgwVn7+qSCY
|
|
|
+# WqIIcygRNohB5i3zj61/qTEa4DZLc0F3hvGC6aNwwjUbnoU4nZoqOSQgta2DaVul
|
|
|
+# uhm7Y+BTZsXvYY9q26UjgUbo1jdBrWelIbu+3YV+pE00UVuV0RabWkEdFBr9HeOV
|
|
|
+# nZYczzdVvnYkkkFxO25SVHZWT2nyWhYxMYv+HLoUBND1BmZzNYWnJqegL4BrczNm
|
|
|
+# exycbGbRVEO45QOJEK+3vA4o6GKPk09wcFEmkvlncGKTz4fGhYWf5ELykT0TSQuL
|
|
|
+# vP1PN35OUNzlpqc2FuWCDosVl8FUhphYXpiw/1sUnI5nPG8aGiUboYICKDCCAiQG
|
|
|
+# CSqGSIb3DQEJBjGCAhUwggIRAgEBMIGOMHcxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
|
|
|
+# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
|
|
|
+# ZnQgQ29ycG9yYXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
|
|
|
+# QQITMwAAACs5MkjBsslI8wAAAAAAKzAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkD
|
|
|
+# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTMwOTExMTYwNDU5WjAjBgkq
|
|
|
+# hkiG9w0BCQQxFgQU0jwg1lgVl4Ydsz+7YfTew/L6w9EwDQYJKoZIhvcNAQEFBQAE
|
|
|
+# ggEAT5kurkrFiaB7YVAWU7VrrXF4Pr9kGEnSMBr0VEfztrVGNOLsdyZYk12tRYnj
|
|
|
+# 6MB0x1bajZMYXCj+0Z8oTzaG+JXASkNNIm4uWP1t6TsfixCw9Sr4p4cQUaIXwYj6
|
|
|
+# AN+tmLT82knMkW8Q/8lcc8BzfL45pjXonMNCJm3QOUwQ3SqXKgEMTsKLULFvUmsm
|
|
|
+# dlwbdl2nlNdNyF5t8NkQZX5NPkpXJ9gdz34XSXPADxBiuE1haiV8ckyfhBIgiq2A
|
|
|
+# CM2eGdggysiSVJcQGJ/GzsAsRC89FQQeqcKisHrFz7UOL8oX8ZxJ/7CWHPQUmk/t
|
|
|
+# gRpD2K2HFoKdbJziPMLEhoQ5yQ==
|
|
|
+# SIG # End signature block
|