<component id="39" name="Script Component 1" componentClassID="Microsoft.ManagedComponentHost" description="Includes and runs custom script code. For example, apply a business rule that limits the range of valid values in an &quot;income&quot; column or add values in two columns and calculate the average of the sum." localeId="1033" version="11" contactInfo="Includes and runs custom script code. For example, apply a business rule that limits the range of valid values in an &quot;income&quot; column or add values in two columns and calculate the average of the sum.;Microsoft Corporation; Microsoft SQL Server; Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;11"><properties><property id="43" name="SourceCode" state="cdata" dataType="System.String" isArray="true" description="Stores the source code of the component" typeConverter="NOTBROWSABLE"><arrayElements arrayElementCount="30"><arrayElement dataType="System.String"><![CDATA[My Project\Settings.Designer.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA['------------------------------------------------------------------------------
' <autogenerated>
'     This code was generated by a tool.
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </autogenerated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On



Partial Friend NotInheritable Class MySettings
    Inherits System.Configuration.ApplicationSettingsBase

    Private Shared m_Value As MySettings

    Private Shared m_SyncObject As Object = New Object

    <System.Diagnostics.DebuggerNonUserCode()> _
    Public Shared ReadOnly Property Value() As MySettings
        Get
            If (MySettings.m_Value Is Nothing) Then
                System.Threading.Monitor.Enter(MySettings.m_SyncObject)
                If (MySettings.m_Value Is Nothing) Then
                    Try
                        MySettings.m_Value = New MySettings
                    Finally
                        System.Threading.Monitor.Exit(MySettings.m_SyncObject)
                    End Try
                End If
            End If
            Return MySettings.m_Value
        End Get
    End Property
End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[My Project\AssemblyInfo.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[Imports System
Imports System.Reflection
Imports System.Runtime.InteropServices

' General Information about an assembly is controlled through the following 
' set of attributes. Change these attribute values to modify the information
' associated with an assembly.

' Review the values of the assembly attributes

<Assembly: AssemblyTitle("SC_6116cb172782430cb4ca1a4203dd0f2c")> 
<Assembly: AssemblyDescription("")> 
<Assembly: AssemblyCompany("")> 
<Assembly: AssemblyProduct("SC_6116cb172782430cb4ca1a4203dd0f2c")> 
<Assembly: AssemblyCopyright("Copyright @  2018")> 
<Assembly: AssemblyTrademark("")> 
<Assembly: CLSCompliant(True)> 

<Assembly: ComVisible(False)> 

'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid("8e08f0e7-ba79-4c10-ad26-ba86f2d6aacb")> 

' Version information for an assembly consists of the following four values:
'
'      Major Version
'      Minor Version 
'      Build Number
'      Revision
'
' You can specify all the values or you can default the Build and Revision Numbers 
' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")>

<Assembly: AssemblyVersion("1.0.0.0")> 
<Assembly: AssemblyFileVersion("1.0.0.0")> 
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[ComponentWrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services component wrapper
' This module defines the base class for your component
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class UserComponent
    Inherits ScriptComponentPlus

    Public Connections As New Connections(Me)
    Public Variables As New Variables(Me)

    Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal InputName As String, ByVal Buffer As PipelineBuffer, ByVal OutputMap As OutputNameMap)

        If InputID = MyBase.ComponentMetaData.InputCollection("Input").ID Then
            Input_ProcessInput(New InputBuffer(Me, InputID, True, Buffer, OutputMap))
        End If

    End Sub

    Public Overridable Sub Input_ProcessInput(ByVal Buffer As InputBuffer)

        While Buffer.NextRow()
            Input_ProcessInputRow(Buffer)
        End While

    End Sub

    Public Overridable Sub Input_ProcessInputRow(ByVal Row As InputBuffer)

    End Sub

End Class

Public Class Connections

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

    Public ReadOnly Property Connection() As IDTSConnectionManager100
        Get
            Return ParentComponent.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManager
        End Get
    End Property

End Class

Public Class Variables

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[My Project\Settings.settings]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version='1.0' encoding='iso-8859-1'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)" GeneratedClassNamespace="" GeneratedClassName="MySettings">
  <Profiles>
    <Profile Name="(Default)" />
  </Profiles>
  <Settings />
</SettingsFile>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[main.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' CozyRoc SQL Server Integration Services user script component
'
' Copyright (c) 2006-2016 COZYROC LLC
' 
' 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.

Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Data.Common
Imports System.Data.SqlClient
Imports System.Collections
Imports System.Reflection
Imports System.Diagnostics

Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS.Attributes


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
<ColumnMappings()>
<SortProperties(New String() {
    "ConnectionType", "Connection", "Table", "Action", "PrimaryKeys",
    "ErrorRowDisposition",
    "InsertedVariable", "UpdatedVariable", "DeletedVariable"})>
<FilterProperties("GetProperties")>
<ValidateProperties("Validate")>
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute>
<CLSCompliant(False)>
Public Class ScriptMain
    Inherits UserComponent


    Private Const ColumnSeparator As String = "," + vbLf
    Private Const Parameter_1P As String = "p{0}"


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Supported destination table actions.
    Public Enum ActionTypes
        Insert
        InsertUpdate    ' try an insert first, if it fails based on PK defined in the destination then update
        UpdateInsert    ' try an update first based on the PK, if it fails then insert
        Update
        Delete
    End Enum    ' ActionTypes


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub Input_ProcessInputRow(ByVal Row As InputBuffer)
        ' Setup command parameters.
        Dim colsCount As Integer = m_inputIndexes.Length
        For colIndex As Integer = 0 To colsCount - 1
            Dim bufIndex As Integer = m_inputIndexes(colIndex)
            Debug.Assert(bufIndex <> 0)
            Dim parameter As DbParameter = m_command.Parameters(colIndex)

            Dim value As Object = Row.Buffer(bufIndex)
            If TypeOf value Is BlobColumn Then
                If parameter.DbType = DbType.Binary Then
                    value = Row.Buffer.GetBlobData(bufIndex, 0, parameter.Size)
                Else
                    ' This is long string.
                    value = Row.Buffer.GetString(bufIndex)
                End If
            End If

            parameter.Value = value
        Next

        Try
            Select Case Me.Action
                Case ActionTypes.Insert
                    m_command.CommandText = m_insertSql
                    Call m_command.ExecuteNonQuery()
                    m_insertedCount += 1

                Case ActionTypes.InsertUpdate
                    Try
                        m_command.CommandText = m_insertSql
                        Call m_command.ExecuteNonQuery()
                        m_insertedCount += 1
                    Catch ex As Exception
                        ' Insert failed. Try update.
                        m_command.CommandText = m_updateSql
                        Call m_command.ExecuteNonQuery()
                        m_updatedCount += 1
                    End Try

                Case ActionTypes.UpdateInsert
                    m_command.CommandText = m_selectSql
                    Dim hasRow As Object = m_command.ExecuteScalar()
                    If hasRow Is Nothing Then
                        ' Row doesn't exist. Insert new one.
                        m_command.CommandText = m_insertSql
                        Call m_command.ExecuteNonQuery()
                        m_insertedCount += 1
                    Else
                        m_command.CommandText = m_updateSql
                        Call m_command.ExecuteNonQuery()
                        m_updatedCount += 1
                    End If

                Case ActionTypes.Update
                    m_command.CommandText = m_updateSql
                    Call m_command.ExecuteNonQuery()
                    m_updatedCount += 1

                Case ActionTypes.Delete
                    m_command.CommandText = m_selectSql
                    Dim hasRow As Object = m_command.ExecuteScalar()
                    If Not hasRow Is Nothing Then
                        ' Row exists. Delete it.
                        m_command.CommandText = m_deleteSql
                        Call m_command.ExecuteNonQuery()
                        m_deletedCount += 1
                    End If
            End Select
        Catch ex As Exception
            Select Case Me.ErrorRowDisposition
                Case DTSRowDisposition.RD_IgnoreFailure
                    ' Do nothing.

                Case DTSRowDisposition.RD_RedirectRow
                    Row.ErrorDescription = ex.Message
                    Call Row.DirectRowToErrorOutput()

                Case DTSRowDisposition.RD_FailComponent, DTSRowDisposition.RD_NotUsed
                    Call FireError_(ex.Message)
            End Select
        End Try
    End Sub ' Input_ProcessInputRow


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PreExecute()
        Call MyBase.PreExecute()

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)

        ' Initialize command.
        Dim conn As DbConnection = GetConnection_(False)
        m_command = conn.CreateCommand()

        Dim primaryKeys As ArrayList = New ArrayList()
        If Not String.IsNullOrEmpty(Me.PrimaryKeys) Then
            primaryKeys = New ArrayList(Me.PrimaryKeys.Split(
                New String() {ColumnSeparator},
                StringSplitOptions.None))
        End If
        Dim colsList As ArrayList = New ArrayList(primaryKeys)

        ' Include update columns (other than key).
        For Each inputCol As IDTSInputColumn100 In input.InputColumnCollection
            If inputCol.ExternalMetadataColumnID = 0 Then
                ' Column not selected. Skip it.
                Continue For
            End If

            Dim extCol As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.GetObjectByID(
                inputCol.ExternalMetadataColumnID)

            If Not primaryKeys.Contains(extCol.Name) Then
                ' Key columns will be at the end.
                Call colsList.Insert(0, extCol.Name)
            End If
        Next

        ' Setup buffer indexes and command parameters.
        Dim colsCount As Integer = colsList.Count
        m_inputIndexes = New Integer(colsCount - 1) {}
        Dim parameters() As DbParameter = New DbParameter(colsCount - 1) {}
        For Each inputCol As IDTSInputColumn100 In input.InputColumnCollection
            If inputCol.ExternalMetadataColumnID = 0 Then
                ' Column not selected. Skip it.
                Continue For
            End If

            Dim extCol As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.GetObjectByID(
                inputCol.ExternalMetadataColumnID)

            Dim colName As String = extCol.Name
            Dim paramIndex As Integer = colsList.IndexOf(colName)
            Call Debug.Assert(paramIndex <> -1)

            ' Setup parameter index.
            m_inputIndexes(paramIndex) = Me.HostComponent.BufferManager.FindColumnByLineageID(
                input.Buffer,
                inputCol.LineageID)

            ' Setup command parameter.
            Dim parameter As DbParameter = m_command.CreateParameter()
            parameter.ParameterName = String.Format(Parameter_1P, 1 + paramIndex)
            Call SetupParameter_(inputCol, parameter)
            parameters(paramIndex) = parameter
        Next

        ' Include parameters to command.
        For paramIndex As Integer = 0 To colsCount - 1
            Call m_command.Parameters.Add(parameters(paramIndex))
        Next

        ' Setup SQL statements.
        Dim valueList As ArrayList = New ArrayList()
        Dim whereList As ArrayList = New ArrayList()
        Dim setList As ArrayList = New ArrayList()
        Dim selList As ArrayList = New ArrayList()
        For colIndex As Integer = 0 To colsCount - 1
            Dim colName As String = CStr(colsList(colIndex))
            Dim paramName As String = GetParameterName_(
                conn,
                parameters(colIndex).ParameterName)

            Call valueList.Add(paramName)

            Dim keyValue As String = String.Format("{0} = {1}", colName, paramName)

            If primaryKeys.Contains(colName) Then
                ' Key column.
                Call whereList.Add(keyValue)
            Else
                Call setList.Add(keyValue)
                Call selList.Add(paramName)
            End If
        Next

        Dim whereClause As String = String.Join(
            " AND ",
            CType(whereList.ToArray(GetType(String)), String()))

        m_selectSql = String.Format(
            "SELECT {0} FROM {1} WHERE {2}",
            String.Join(",", CType(primaryKeys.ToArray(GetType(String)), String())),
            Me.Table,
            whereClause)
        m_insertSql = String.Format(
            "INSERT INTO {0} ({1}) VALUES({2})",
            Me.Table,
            String.Join(",", CType(colsList.ToArray(GetType(String)), String())),
            String.Join(",", CType(valueList.ToArray(GetType(String)), String())))
        m_updateSql = String.Format(
            "UPDATE {0} SET {1} WHERE {2}",
            Me.Table,
            String.Join(",", CType(setList.ToArray(GetType(String)), String())),
            whereClause)
        m_deleteSql = String.Format(
            "DELETE FROM {0} WHERE {1}",
            Me.Table,
            whereClause)
    End Sub ' PreExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PostExecute()
        Call MyBase.PostExecute()

        If Not m_command Is Nothing Then
            Dim conn As DbConnection = m_command.Connection
            Call m_command.Dispose()
            m_command = Nothing
            Call conn.Dispose()
        End If

        ' Store diagnostics.
        Call SetVariable_(Me.InsertedVariable, m_insertedCount)
        Call SetVariable_(Me.UpdatedVariable, m_updatedCount)
        Call SetVariable_(Me.DeletedVariable, m_deletedCount)
    End Sub ' PostExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of current properties based on current state.
    Public Function GetProperties() As String()
        Dim result As New ArrayList

        ' Setup base properties.
        Call result.Add("ConnectionType")
        Call result.Add("Connection")
        Call result.Add("Table")
        Call result.Add("Action")
        Call result.Add("ErrorRowDisposition")
        Call result.Add("InsertedVariable")
        Call result.Add("UpdatedVariable")
        Call result.Add("DeletedVariable")

        Select Case Me.Action
            Case ActionTypes.InsertUpdate, ActionTypes.UpdateInsert, ActionTypes.Update, ActionTypes.Delete
                Call result.Add("PrimaryKeys")
        End Select

        Return CType(result.ToArray(GetType(String)), String())
    End Function    ' GetProperties


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Function Validate(ByRef errMessage As String) As Boolean
        Dim result As Boolean

        Try
            If String.IsNullOrEmpty(Me.Connection) Then
                Throw New ApplicationException("Select connection.")
            End If

            If String.IsNullOrEmpty(Me.Table) Then
                Throw New ApplicationException("Select destination table.")
            End If

            If Me.Action <> ActionTypes.Insert AndAlso
                String.IsNullOrEmpty(Me.PrimaryKeys) Then
                Throw New ApplicationException("Specify table primary keys.")
            End If

            Dim primaryKeys As String() = Me.PrimaryKeys.Split(
                New String() {ColumnSeparator},
                StringSplitOptions.None)

            Dim input As IDTSInput100 = Me.ComponentMetaData.InputCollection(0)
            If input.IsAttached AndAlso
                (input.InputColumnCollection.Count = 0 OrElse
                input.InputColumnCollection.Count < primaryKeys.Length) Then
                Throw New Exception("Map input columns.")
            End If

            ' Store connection information in the runtime connection collection, too.
            ' Cannot directly use RuntimeConnectionCollection in the property get/set
            ' because of issues with multi-threading.
            Me.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManagerID = Me.Connection

            result = True
        Catch ex As Exception
            result = False
            errMessage = ex.Message
        End Try

        Validate = result
    End Function    'Validate


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub ReinitializeMetaData()
        Call MyBase.ReinitializeMetaData()

        If MyBase.ComponentMetaData.InputCollection.Count = 0 Then
            ' At least one input must exist.
            Throw New Exception("No inputs.")
        End If

        If String.IsNullOrEmpty(Me.Connection) Then
            Throw New Exception("Connection not selected.")
        End If

        If String.IsNullOrEmpty(Me.Table) Then
            Throw New Exception("Destination table not selected.")
        End If

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)

        Dim tblCols As DataTable = GetColumns_()

        ' Cleanup.
        input.ExternalMetadataColumnCollection.IsUsed = True
        Call input.InputColumnCollection.RemoveAll()
        Call input.ExternalMetadataColumnCollection.RemoveAll()

        ' Setup column metadata.
        Dim colsCount As Integer = tblCols.Rows.Count
        For colIndex As Integer = 0 To colsCount - 1
            Dim columnRow As DataRow = tblCols.Rows(colIndex)

            If Me.Action = ActionTypes.Delete AndAlso
                Not CBool(columnRow("IsKey")) Then
                ' Include only key columns for Delete action.
                Continue For
            End If

            Dim column As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.NewAt(
                colIndex)
            column.Name = CStr(columnRow("ColumnName"))

            ' Get type.
            Dim rawType As Type = CType(columnRow("DataType"), Type)
            Dim columnType As DataType = DataRecordTypeToBufferType_(rawType)
            If CBool(columnRow("IsLong")) Then
                ' This is extended type. Have to modify the column type a bit.
                Select Case columnType
                    Case DataType.DT_WSTR
                        columnType = DataType.DT_NTEXT

                    Case DataType.DT_STR
                        columnType = DataType.DT_TEXT

                    Case DataType.DT_BYTES
                        columnType = DataType.DT_IMAGE
                End Select
            End If

            ' Get length.
            Dim length As Integer = 0
            Select Case columnType
                Case DataType.DT_WSTR, DataType.DT_STR, DataType.DT_BYTES,
                    DataType.DT_IMAGE, DataType.DT_NTEXT, DataType.DT_TEXT
                    length = CInt(columnRow("ColumnSize"))
            End Select

            ' Get code page.
            Dim codepage As Integer = 0
            If columnType = DataType.DT_STR Then
                codepage = -1
            End If

            ' Get precision and scale.
            Dim precision As Integer = 0
            Dim scale As Integer = 0
            If columnType = DataType.DT_NUMERIC OrElse columnType = DataType.DT_BYREF_DECIMAL Then
                If columnRow.IsNull("NumericPrecision") Then
                    precision = 29
                Else
                    precision = CInt(columnRow("NumericPrecision"))
                End If

                If columnRow.IsNull("NumericScale") Then
                    scale = 0
                Else
                    scale = CInt(columnRow("NumericScale"))
                End If

                If scale = 255 Then
                    scale = 0
                End If
            End If

            column.DataType = columnType
            column.Length = length
            column.Precision = precision
            column.Scale = scale
            column.CodePage = codepage
        Next
    End Sub ' ReinitializeMetaData


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of tables.
    Public Function GetTables() As Object()
        Dim result As ArrayList = New ArrayList()

        Try
            If String.IsNullOrEmpty(Me.Connection) Then
                Throw New Exception("Select connection.")
            End If

            ' Get tables.
            Using conn As DbConnection = GetConnection_(True)
                Dim tableType As String = "TABLE"
                If TypeOf conn Is SqlConnection Then
                    ' SQL uses different table type identifier.
                    tableType = "BASE TABLE"
                End If

                Dim tblTables As DataTable = conn.GetSchema(
                    "Tables",
                    New String() {Nothing, Nothing, Nothing, tableType})

                ' Get table schema column name.
                Dim schemaCol As String = tblTables.Columns(1).ColumnName

                For Each tableRow As DataRow In tblTables.Rows
                    Dim tableSchema As String = CStr(tableRow(schemaCol))
                    Dim tableName As String = CStr(tableRow("table_name"))

                    Call result.Add(String.Format("[{0}].[{1}]", tableSchema, tableName))
                Next

                Call result.Sort()
            End Using
        Catch ex As Exception
            Call MsgBox(ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation)
        End Try

        GetTables = result.ToArray()
    End Function    ' GetTables


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns selected destination table columns.
    Public Function GetColumns() As Object()
        Dim result As ArrayList = New ArrayList

        Try
            Dim tblCols As DataTable = GetColumns_()
            For Each columnRow As DataRow In tblCols.Rows
                Call result.Add(columnRow("ColumnName"))
            Next

            Call result.Sort()
        Catch ex As Exception
            Call MsgBox(ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation)
        End Try

        GetColumns = result.ToArray()
    End Function    ' GetColumns


#Region "Properties"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select connection type.")>
    <Category("Destination")>
    <List(New Object() {"ADO.NET", "OLEDB"})>
    <DefaultValue("ADO.NET")>
    <RefreshProperties(RefreshProperties.All)>
    Public Property ConnectionType() As String
        Get
            ConnectionType = m_connectionType
        End Get
        Set(ByVal value As String)
            If m_connectionType <> value Then
                m_connectionType = value
                Me.Connection = String.Empty
            End If
        End Set
    End Property    ' ConnectionType


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select Connection Manager.")>
    <Category("Destination")>
    <Connection("ConnectionType")>
    <RefreshProperties(RefreshProperties.All)>
    Public Property Connection() As String
        Get
            Connection = m_connection
        End Get
        Set(ByVal value As String)
            If m_connection <> value Then
                m_connection = value
                Me.Table = String.Empty
            End If
        End Set
    End Property    ' Connection


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select destination table.")>
    <Category("Destination")>
    <List("GetTables", False, True)>
    <RefreshProperties(RefreshProperties.All)>
    Public Property Table() As String
        Get
            Table = m_table
        End Get
        Set(ByVal value As String)
            If m_table <> value Then
                m_table = value

                Me.PrimaryKeys = String.Empty
                If Me.Action <> ActionTypes.Insert Then
                    ' Initialize primary keys.
                    Me.PrimaryKeys = GetPrimaryKeys_()
                End If
            End If
        End Set
    End Property    ' Table


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select destination table action.")>
    <Category("Destination")>
    <DefaultValue(ActionTypes.InsertUpdate)>
    <RefreshProperties(RefreshProperties.All)>
    Public Property Action() As ActionTypes
        Get
            Action = m_action
        End Get
        Set(ByVal value As ActionTypes)
            If m_action <> value Then
                m_action = value

                Me.PrimaryKeys = String.Empty
                If Me.Action <> ActionTypes.Insert Then
                    ' Initialize primary keys.
                    Me.PrimaryKeys = GetPrimaryKeys_()
                End If
            End If
        End Set
    End Property    ' Action


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Specify table primary keys.")>
    <Category("Destination")>
    <List("GetColumns", True, False)>
    Public Property PrimaryKeys() As String
        Get
            PrimaryKeys = m_primaryKeys
        End Get
        Set(ByVal value As String)
            m_primaryKeys = value
        End Set
    End Property    ' PrimaryKeys


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Specify how to handle error rows.")>
    <Category("Error")>
    <DefaultValue(DTSRowDisposition.RD_FailComponent)>
    Public Property ErrorRowDisposition() As DTSRowDisposition
        Get
            ErrorRowDisposition = m_errorRowDisposition
        End Get
        Set(ByVal value As DTSRowDisposition)
            m_errorRowDisposition = value
        End Set
    End Property    ' ErrorRowDisposition


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows inserted (optional).")>
    <Category("Diagnostics")>
    <Variable()>
    Public Property InsertedVariable() As String
        Get
            InsertedVariable = m_insertedVar
        End Get
        Set(ByVal value As String)
            m_insertedVar = value
        End Set
    End Property    ' InsertedVariable


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows updated (optional).")>
    <Category("Diagnostics")>
    <Variable()>
    Public Property UpdatedVariable() As String
        Get
            UpdatedVariable = m_updatedVar
        End Get
        Set(ByVal value As String)
            m_updatedVar = value
        End Set
    End Property    ' UpdatedVariable


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Description("Select variable to store number of rows deleted (optional).")>
    <Category("Diagnostics")>
    <Variable()>
    Public Property DeletedVariable() As String
        Get
            DeletedVariable = m_deletedVar
        End Get
        Set(ByVal value As String)
            m_deletedVar = value
        End Set
    End Property    ' DeletedVariable
#End Region ' Properties


#Region "Internals"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns selected destination table primary keys.
    Private Function GetPrimaryKeys_() As String
        Dim result As ArrayList = New ArrayList

        Try
            Dim tblCols As DataTable = GetColumns_()
            For Each columnRow As DataRow In tblCols.Rows
                If CBool(columnRow("IsKey")) Then
                    ' Key column.
                    Call result.Add(columnRow("ColumnName"))
                End If
            Next
        Catch ex As Exception
            ' Silently catch the error.
        End Try

        GetPrimaryKeys_ = String.Join(
            ColumnSeparator,
            CType(result.ToArray(GetType(String)), String()))
    End Function    ' GetPrimaryKeys_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function GetColumns_() As DataTable
        Dim result As DataTable

        Using conn As DbConnection = GetConnection_(True)
            Using cmd As DbCommand = conn.CreateCommand()
                cmd.CommandText = String.Format("SELECT * FROM {0}", Me.Table)
                Dim reader As DbDataReader = cmd.ExecuteReader(
                    CommandBehavior.SchemaOnly Or CommandBehavior.KeyInfo)
                result = reader.GetSchemaTable()
            End Using
        End Using

        GetColumns_ = result
    End Function    ' GetColumns_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns SSIS data type from .NET type. Uses private PipelineComponent method.
    Private Function DataRecordTypeToBufferType_(ByVal type As Type) As DataType
        DataRecordTypeToBufferType_ = CType(
            GetType(PipelineComponent).InvokeMember(
                "DataRecordTypeToBufferType",
                BindingFlags.InvokeMethod Or BindingFlags.NonPublic Or BindingFlags.Static,
                Nothing,
                Nothing,
                New Object() {type}),
            DataType)
    End Function    ' DataRecordTypeToBufferType_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Setup parameter data type.
    Private Sub SetupParameter_(
        ByVal inputCol As IDTSInputColumn100,
        ByVal parameter As DbParameter)

        parameter.DbType = GetDbType_(inputCol.DataType)
        parameter.Size = inputCol.Length
        If parameter.Size = 0 AndAlso parameter.DbType = DbType.Binary Then
            parameter.Size = 8000
        End If

        ' Get precision.
        Dim precision As Byte = CByte(inputCol.Precision)
        If parameter.DbType = DbType.Decimal AndAlso precision = 0 Then
            ' Decimal type has precision 29.
            ' http://msdn.microsoft.com/en-us/library/ms141036.aspx
            precision = 29
        End If

        Dim scale As Byte = CByte(inputCol.Scale)
        If parameter.DbType = DbType.DateTime AndAlso scale = 0 Then
            ' DateTime has maximum scale of 3.
            ' http://msdn.microsoft.com/en-us/library/ms141036%28v=sql.100%29.aspx
            scale = 3
        End If

        ' Setup precision and scale.
        Dim iDbDataParameter As IDbDataParameter = parameter
        iDbDataParameter.Precision = precision
        iDbDataParameter.Scale = scale
    End Sub ' SetupParameter_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Return ADO.NET data type from SSIS data type.
    Private Function GetDbType_(ByVal dt As DataType) As DbType
        Select Case dt
            Case DataType.DT_BOOL
                Return DbType.Boolean
            Case DataType.DT_STR, DataType.DT_WSTR, DataType.DT_TEXT, DataType.DT_NTEXT
                Return DbType.String
            Case DataType.DT_I1
                Return DbType.SByte
            Case DataType.DT_UI1
                Return DbType.Byte
            Case DataType.DT_I2
                Return DbType.Int16
            Case DataType.DT_UI2
                Return DbType.UInt16
            Case DataType.DT_I4
                Return DbType.Int32
            Case DataType.DT_UI4
                Return DbType.UInt32
            Case DataType.DT_I8
                Return DbType.Int64
            Case DataType.DT_UI8
                Return DbType.UInt64
            Case DataType.DT_R4
                Return DbType.Single
            Case DataType.DT_R8
                Return DbType.Double
            Case DataType.DT_NUMERIC, DataType.DT_DECIMAL
                Return DbType.Decimal
            Case DataType.DT_CY
                Return DbType.Currency
            Case DataType.DT_DBTIMESTAMP
                Return DbType.DateTime
            Case DataType.DT_DBDATE
                Return DbType.Date
            Case DataType.DT_DBTIME
                Return DbType.Time
            Case DataType.DT_BYTES, DataType.DT_IMAGE
                Return DbType.Binary
        End Select

        Throw New ArgumentException(String.Format("Unhandled type. {0}", dt))
    End Function    ' GetDbType_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns parameter name for specified connection type.
    Private Function GetParameterName_(ByVal conn As DbConnection, ByVal parameter As String) As String
        Dim result As String = parameter

        If TypeOf conn Is SqlConnection Then
            result = "@" + parameter
        Else
            ' Most probably ODBC or OLEDB
            result = "?"
        End If

        GetParameterName_ = result
    End Function    ' GetParameterName_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub FireError_(ByVal message As String)
        Dim cancel As Boolean = False
        Call MyBase.ComponentMetaData.FireError(
            0,
            "Table Update Destination",
            message,
            String.Empty,
            0,
            cancel)
    End Sub ' FireError_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Get connection object.
    Private Function GetConnection_(ByVal design As Boolean) As DbConnection
        Dim result As DbConnection

        If design Then
            If Me.ConnectionType = "OLEDB" Then
                Dim manager As ConnectionManager = MyBase.DesignConnections(Me.Connection)
                Dim managerParams As IDTSConnectionManagerDatabaseParameters100 = CType(
                    manager.InnerObject,
                    IDTSConnectionManagerDatabaseParameters100)
                result = CType(managerParams.GetConnectionForSchema(), DbConnection)
            Else
                result = CType(
                    MyBase.DesignConnections(Me.Connection).AcquireConnection(Nothing),
                    DbConnection)
            End If
        Else
            If Me.ConnectionType = "OLEDB" Then
                Dim host As IDTSObjectHost100 = CType(MyBase.Connections.Connection, IDTSObjectHost100)
                Dim managerParams As IDTSConnectionManagerDatabaseParameters100 = CType(
                    host.InnerObject,
                    IDTSConnectionManagerDatabaseParameters100)
                result = CType(managerParams.GetConnectionForSchema(), DbConnection)
            Else
                result = CType(
                    MyBase.Connections.Connection.AcquireConnection(Nothing),
                    DbConnection)
            End If
        End If

        GetConnection_ = result
    End Function    ' GetConnection_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub SetVariable_(ByVal varName As String, ByVal value As Object)
        If String.IsNullOrEmpty(varName) Then
            ' Variable not set.
            Exit Sub
        End If

        Dim vars As IDTSVariables100 = Nothing
        Call MyBase.VariableDispenser.LockOneForWrite(varName, vars)
        Try
            vars(varName).Value = value
        Finally
            Call vars.Unlock()
        End Try
    End Sub ' SetVariable_
#End Region ' Internals


#Region "Attributes"
    Private m_connectionType As String
    Private m_connection As String
    Private m_table As String
    Private m_primaryKeys As String
    Private m_action As ActionTypes
    Private m_errorRowDisposition As DTSRowDisposition
    Private m_insertedVar As String
    Private m_updatedVar As String
    Private m_deletedVar As String

    Private m_command As DbCommand
    Private m_inputIndexes() As Integer
    Private m_selectSql As String
    Private m_insertSql As String
    Private m_updateSql As String
    Private m_deleteSql As String
    Private m_insertedCount As Integer
    Private m_updatedCount As Integer
    Private m_deletedCount As Integer
#End Region ' Attributes
End Class   ' ScriptMain
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[BufferWrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services buffer wrappers
' This module defines classes for accessing data flow buffers
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!


Option Strict Off   ' This allows usage of PipelineBuffer typed accessors.

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class InputBuffer
    Inherits ScriptBufferPlus

    Public Sub New(ByVal Component As ScriptComponent, ByVal ObjectID As Integer, ByVal IsInput As Boolean, ByVal Buffer As PipelineBuffer, ByVal OutputMap As OutputNameMap)
        MyBase.New(Component, ObjectID, IsInput, Buffer, OutputMap)
    End Sub

    Public Overrides ReadOnly Property StaticInputColumns() As String()
        Get
            Return New String() {}
        End Get
    End Property

    Public WriteOnly Property [ErrorDescription]() As String
        Set
            Me(0) = Value
        End Set
    End Property
    Public WriteOnly Property [ErrorDescription_IsNull] As Boolean
        Set
            If (value)
                SetNull(0)
            Else
                Throw new InvalidOperationException("IsNull property cannot be set to False. Assign a value to the column instead.")
            End If
        End Set
    End Property

    Public Sub DirectRowToErrorOutput()
        MyBase.DirectRow("Error Output")
    End Sub

    Public Overrides ReadOnly Property StaticOutputColumns() As String()
        Get
            Return New String() {"ErrorDescription"}
        End Get
    End Property

    Public Overloads Function NextRow() As Boolean
        NextRow = MyBase.NextRow()
    End Function

    Public Overloads Function EndOfRowset() As Boolean
        EndOfRowset = MyBase.EndOfRowset
    End Function

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[Project]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF16LE]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<c:Project xmlns:c="http://schemas.microsoft.com/codeprojectml/2010/08/main" xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003" runtimeVersion="4.0" schemaVersion="1.0">
	<msb:PropertyGroup>
		<msb:CodeName>SC_6116cb172782430cb4ca1a4203dd0f2c</msb:CodeName>
		<msb:Language>msBuild</msb:Language>
		<msb:DisplayName>SC_6116cb172782430cb4ca1a4203dd0f2c</msb:DisplayName>
		<msb:ProjectId>{8AFC01B0-3691-4668-8848-3A737D4DC20C}</msb:ProjectId>
	</msb:PropertyGroup>
	<msb:ItemGroup>
		<msb:Project Include="SC_6116cb172782430cb4ca1a4203dd0f2c.vbproj"/>
		<msb:File Include="My Project\Settings.Designer.vb"/>
		<msb:File Include="BufferWrapper.vb"/>
		<msb:File Include="main.vb"/>
		<msb:File Include="My Project\Resources.resx"/>
		<msb:File Include="ComponentWrapper.vb"/>
		<msb:File Include="My Project\AssemblyInfo.vb"/>
		<msb:File Include="My Project\Resources.Designer.vb"/>
		<msb:File Include="My Project\Settings.settings"/>
	</msb:ItemGroup>
</c:Project>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[SC_6116cb172782430cb4ca1a4203dd0f2c.vbproj]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectTypeGuids>{30D016F9-3734-4E33-A861-5E7D899E18F3};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{C2EE0888-2C75-415C-8AED-11A7A37F60B9}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>My Project</AppDesignerFolder>
    <RootNamespace>SC_6116cb172782430cb4ca1a4203dd0f2c</RootNamespace>
    <AssemblyName>SC_6116cb172782430cb4ca1a4203dd0f2c</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <ResolveAssemblyReferenceIgnoreTargetFrameworkAttributeVersionMismatch>true</ResolveAssemblyReferenceIgnoreTargetFrameworkAttributeVersionMismatch>
    <TargetFrameworkProfile>
    </TargetFrameworkProfile>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>.\bin\Debug\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>false</DebugSymbols>
    <Optimize>true</Optimize>
    <OutputPath>.\bin\Release\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineDebug>false</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <!-- This sections specifies references for the project. -->
  <ItemGroup>
    <Reference Include="CozyRoc.SSISPlus.2017, Version=1.0.0.0, Culture=neutral, PublicKeyToken=16cf490bb80c34ea" />
    <Reference Include="Microsoft.SqlServer.ManagedDTS, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>C:\Program Files (x86)\Microsoft Visual Studio\2017\SQL\Common7\IDE\CommonExtensions\Microsoft\SSIS\140\Binn\Microsoft.SqlServer.ManagedDTS.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.SqlServer.TxScript, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSRuntimeWrap, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSPipelineWrap, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.PipelineHost, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Compile Include="main.vb" />
    <Compile Include="BufferWrapper.vb" />
    <Compile Include="ComponentWrapper.vb" />
  </ItemGroup>
  <!-- Visual Basic supports Importing namespaces (equivalent to using statements in C#).-->
  <ItemGroup>
    <Import Include="Microsoft.VisualBasic" />
    <Import Include="System" />
    <Import Include="System.Collections" />
    <Import Include="System.Data" />
    <Import Include="System.Diagnostics" />
    <Import Include="System.Windows.Forms" />
  </ItemGroup>
  <ItemGroup>
    <AppDesigner Include="My Project\" />
    <Compile Include="My Project\AssemblyInfo.vb">
      <SubType>Code</SubType>
    </Compile>
    <EmbeddedResource Include="My Project\Resources.resx">
      <Generator>VbMyResourcesResXFileCodeGenerator</Generator>
      <LastGenOutput>Resources.Designer.vb</LastGenOutput>
      <CustomToolNamespace>My.Resources</CustomToolNamespace>
    </EmbeddedResource>
    <Compile Include="My Project\Resources.Designer.vb">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>Resources.resx</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
    <None Include="My Project\Settings.settings">
      <Generator>SettingsSingleFileGenerator</Generator>
      <LastGenOutput>Settings.Designer.vb</LastGenOutput>
    </None>
    <Compile Include="My Project\Settings.Designer.vb">
      <AutoGen>True</AutoGen>
      <DependentUpon>Settings.settings</DependentUpon>
      <SubType>Code</SubType>
    </Compile>
  </ItemGroup>
  <!-- Include the build rules for a VB project.-->
  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
  <!-- This section defines VSTA properties that describe the host-changable project properties. -->
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{30D016F9-3734-4E33-A861-5E7D899E18F3}">
        <ProjectProperties HostName="VSTAHostName" HostPackage="{B3A685AA-7EAF-4BC6-9940-57959FA5AC07}" ApplicationType="usd" Language="vb" TemplatesPath="" />
        <Host Name="SSIS_SC130" />
        <ProjectClient>
          <HostIdentifier>SSIS_SC130</HostIdentifier>
        </ProjectClient>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
</Project>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[My Project\Resources.resx]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
</root>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[My Project\Resources.Designer.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA['------------------------------------------------------------------------------
' <autogenerated>
'     This code was generated by a tool.
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </autogenerated>
'------------------------------------------------------------------------------

Option Strict Off
Option Explicit On


Namespace My.Resources
    
    '''<summary>
    '''   A strongly-typed resource class, for looking up localized strings, etc.
    '''</summary>
    'This class was auto-generated by the Strongly Typed Resource Builder
    'class via a tool like ResGen or Visual Studio.NET.
    'To add or remove a member, edit your .ResX file then rerun ResGen
    'with the /str option, or rebuild your VS project.
    Class MyResources
        
        Private Shared _resMgr As System.Resources.ResourceManager
        
        Private Shared _resCulture As System.Globalization.CultureInfo
        
        Friend Sub New()
            MyBase.New
        End Sub
        
        '''<summary>
        '''   Returns the cached ResourceManager instance used by this class.
        '''</summary>
        <System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Public Shared ReadOnly Property ResourceManager() As System.Resources.ResourceManager
            Get
                If (_resMgr Is Nothing) Then
                    Dim temp As System.Resources.ResourceManager = New System.Resources.ResourceManager("My.Resources.MyResources", GetType(MyResources).Assembly)
                    _resMgr = temp
                End If
                Return _resMgr
            End Get
        End Property
        
        '''<summary>
        '''   Overrides the current thread's CurrentUICulture property for all
        '''   resource lookups using this strongly typed resource class.
        '''</summary>
        <System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)>  _
        Public Shared Property Culture() As System.Globalization.CultureInfo
            Get
                Return _resCulture
            End Get
            Set
                _resCulture = value
            End Set
        End Property
    End Class
End Namespace
]]></arrayElement></arrayElements></property><property id="44" name="BinaryCode" state="cdata" dataType="System.String" isArray="true" description="Stores the binary representation of the component" typeConverter="NOTBROWSABLE"><arrayElements arrayElementCount="2"><arrayElement dataType="System.String"><![CDATA[SC_6116cb172782430cb4ca1a4203dd0f2c.dll]]></arrayElement><arrayElement dataType="System.String"><![CDATA[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
/v//KhswBgATAQAABgAAEXNIAAAKCwIoFwAABihJAAAKLAtyRQIAcHNwAAAKegIXKC4AAAYMchkE
AHANCHVdAAABLAZyJQQAcA0IcjsEAHAajU4AAAElGQmib4cAAAoTBBEEb4gAAAoXb4kAAApvigAA
ChMFEQRveQAACm+LAAAKEwYrQREGb04AAAp0MAAAASURBW98AAAKKGMAAAoTB3JJBABwb3wAAAoo
YwAAChMIB3JfBABwEQcRCChmAAAKb2UAAAomEQZvVQAACi223hYRBnVTAAABLAwRBnVTAAABb1YA
AArcB2+MAAAK3goILAYIb1YAAArc3h8lKD8AAAoTCREJb0IAAAofMBQojQAACiYoQAAACt4AB2+O
AAAKCgYqAAEoAAACAGUAXMEAFgAAAAACACYAud8ACgAAAAAAAAYA5esAHygAAAEbMAMAjgAAAAcA
ABFzSAAACgsCKCgAAAYMCG95AAAKb4sAAAoNKyUJb04AAAp0MAAAARMEBxEEcpEDAHBvfAAACig3
AAAKb2UAAAomCW9VAAAKLdPeFAl1UwAAASwLCXVTAAABb1YAAArcB2+MAAAK3h8lKD8AAAoTBREF
b0IAAAofMBQojQAACiYoQAAACt4AB2+OAAAKCgYqAAABHAAAAgANAD1KABQAAAAAAAAGAGBmAB8o
AAABEzABAAkAAAAIAAARAnsJAAAECgYqigJ7CQAABAMWKI8AAAosEgIDfQkAAAQCfpAAAAooGAAA
BioTMAEACQAAAAgAABECewoAAAQKBiqKAnsKAAAEAxYojwAACiwSAgN9CgAABAJ+kAAACigaAAAG
KhMwAQAJAAAACAAAEQJ7CwAABAoGKtoCewsAAAQDFiiPAAAKLCYCA30LAAAEAn6QAAAKKB4AAAYC
KBsAAAYsDAICKCcAAAYoHgAABioTMAEACQAAAAkAABECew0AAAQKBirCAnsNAAAEAy4mAgN9DQAA
BAJ+kAAACigeAAAGAigbAAAGLAwCAignAAAGKB4AAAYqAAATMAEACQAAAAgAABECewwAAAQKBioi
AgN9DAAABCoAABMwAQAJAAAACgAAEQJ7DgAABAoGKiICA30OAAAEKgAAEzABAAkAAAAIAAARAnsP
AAAECgYqIgIDfQ8AAAQqAAATMAEACQAAAAgAABECexAAAAQKBioiAgN9EAAABCoAABMwAQAJAAAA
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
AAAAAFArAAAkBgAAI1VTAHQxAAAQAAAAI0dVSUQAAACEMQAAuAkAACNCbG9iAAAAAAAAAAIAAAFX
HaIJCQ8AAAD6ATMAFgAAAQAAAHMAAAAOAAAAJwAAAEoAAAAoAAAAvwAAAAcAAABfAAAAFQAAAAcA
AAAWAAAAIAAAAAkAAAABAAAACgAAAAEAAAADAAAAAwAAAAIAAAAAAJELAQAAAAAABgCUCdUSBgBe
CtUSBgCuBxYSDwB7EwAABgABCBwNBgD2CBwNBgAzChwNBgC0CRwNBgDNCRwNBgBeCBwNBgDoCSgM
BgDtB48SBgBXB48SBgCqCBwNBgB5CO8KCgB6B6wQCgArB3ELCgDUB3ELDgDlBmUSDgCAESkSBgCS
CBYSDgAYCK4SDgAwCAAEBgBfFSgMDgAZEWUSDgDHCAAEBgC3BigMDgCVAUcLCgBlBz4MBgBqEPUS
BgADD9wMEgB8CcoTEgBkCcoTEgBKCcoTEgATCcoTFgD+CSwGGgBCDuwQHgA0BPAOHgBFEfAOBgDR
DigMGgCIAewQHgAIDvAOBgByFnUUBgDdEXUUGgBIAOwQGgAqAOwQHgDtBIQDHgDyFoQDIgBeBsQQ
HgB2BoQDIgA6AcQQBgAvDCgMCgD+CHELCgBMCnELEgAlCsoTCgBICHELCgCKE3ELCgAvCXELEgDi
CMoTEgDCB8oTEgDZFHACFgDdFSwGJgA+ECwGFgAPDywGEgDqFHACIgDzAMQQCgD1BscMBgCRBxYS
BgCFBSgMBgBcFxwNHgCuDfAOBgCxFNUSJgB9DCwGDgDHA64SGgABAOwQGgDDAOwQBgC/ASgMBgAj
CygMBgCeFCgMBgAuDXUUGgCDAOwQGgBbAOwQBgBxBSgMJgCtFSwGGgAMAewQDgBpFK4SBgBSFygM
CgD1FXELBgCaDigMGgCgAOwQGgDaAOwQHgDYDYQDHgAnDpcVHgA6DYQDHgByDIQDDgAQDQAEDgCK
FQAEDgCpBQAEDgDPFK4SHgCxD/AOHgCREYQDBgD7ExwNBgAsEBwNHgA0EYQDBgDJDigMKgCSFAwG
KgB+EAwGIgBLAcQQIgB2AcQQIgAhAcQQIgAaAMQQBgCvDigMFgBNECwGBgAOEt4KBgD3ESgMAAAA
ANsBAAAAAAEAAQAAAAAAuQwpF00AAQABAAAAAAB+ESkXUQABAAIAAAEQAGYVKRdhAAEAAwAAAAAA
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
XgORA4UVXgPBABMUZgHBAH4EuQDBABcL3gCZA1YEawM8AOgWggNEAJsKZABEAKUKmQNEAAESBgAO
ABwAwwMOACAAyAMIAIwA0QMIAJAA1gMIAJQA2wMIAJgA4AMIAJwA5QMpAKsAUAcuAAsAKwUuABMA
NAUuABsAUwUuACMAXAUuACsAhQUuADMAhQUuADsAXAUuAEMAiwUuAEsAhQUuAFMAogUuAFsAhQUu
AGMAqAUuAGsA0gUuAHMA3wVAAIsA1gNAAIMAKQZDAHsAMgZDAIMAKQZJAKsAYQdjAHsAMgZjAIMA
KQZpAKsAdQeAAIsA1gODAJMA1gODAJsA1gODAHsAMgaJAKsAggegAIsA1gOpAIMAUwXAAIsA1gPD
ALMA1gPDALsASwbDAMMAzQbDAMsA4AbDANMA1gPDAFMAhQXJAIMAUwXgAIsA1gPjAFMAhQXpANsA
lgfpAOMAswfpAOsAxAfpAPMA3QfpAPsAKQYDAVMAhQUJAdsA6gcJAeMAswcJAQMBCggJAfsAKQYp
AdsAHggpAeMAswcpAQsBPQgpAfsAKQZJAdsATghJAeMAswdJARMBKQZJAfsAKQZpAdsAdAhpAeMA
swdpAQsBlQiDAYMAKQaDAaMA7gaJAdsApwiJAeMAzgiJARMB2QijAYMAKQajAVsAhQWpAdsA4gip
AeMAJAmpARsB1gPJAdsANQnJAeMAJAnJARsB1gPpAdsAdgnpAeMAJAnpARsB1gOpAiMB1gOAB1MA
hQXAB1MAhQVACIMAKQZACIsA1gNgCIMAKQZgCIsA1gOACIMAKQaACIsA1gOgCIMAKQagCIsA1gPA
CIsA1gPgCIsA1gMACYsA1gMACYMAKQYgCYsA1gNACYsA1gNACYMAKQZ/AOIAxAHMAeYBKAJmAnoC
iAKNApMCpgLEAtgC7wL4AgMDEgMtA2MDdgMEAAEABQAFAAYABwAHABAACQAUAAsAFQANABYAAACA
EeUEAAC7DOoEAAAZEe8EAABZEvQEAABqEPkEAADdBv4EAACUBgMFAAAqDgMFAADxBAMFAAAADQcF
AAAbFQMFAABwDgwFAABgBQMFAAAPBQMFAAA3BQMFAAA+FBIFAADfDgMFAAC9CxcFAABVFBIFAAAq
DhsFAAC4CiEFAABpBCYFAgAEAAMAAgAFAAUAAgAGAAcAAgAHAAkAAgAJAAsAAgAKAA0AAQALAA0A
AgAVAA8AAQAWAA8AAgAXABEAAQAYABEAAgAZABMAAQAaABMAAgAbABUAAQAcABUAAgAdABcAAQAe
ABcAAgAfABkAAQAgABkAAgAhABsAAQAiABsAAgAjAB0AAQAkAB0AAgAlAB8AAQAmAB8AAgAxACEA
AQAyACMAAQAzACUAAgA1ACcAAgA9ACkAAgBBACsAAgBJAC0ASABPAFYAXQCsAWgDewOKA5EDBIAA
AAEAAAAAAAAAAAAAAAAA3AMAAAQAAAAAAAAAAAAAAJ8D0wMAAAAABAAAAAAAAAAAAAAAnwMoDAAA
AAAKAAAAAAAAAAAAAACoAwAEAAAAAAEAAAAAAAAAAAAAALEDxQEAAAAADgAAAAAAAAAAAAAAugND
FgAAAAAOAAAAAAAAAAAAAAC6A0oPAAAAAAQAAAAAAAAAAAAAAJ8DhAMAAAAADgAAAAAAAAAAAAAA
ugMnDwAAAAAOAAAAAAAAAAAAAAC6A3wWAAAAAA4AZAAAAAAAAAAAALoDhwIAAAAAAAAAAAEAAABD
EwAADAAEAA0ABAAOAAYAAAAQABoApgIAABAAjQCmAgAAAACPAKYCdwFxA3cBlAMAAABJRFRTQ29t
cG9uZW50TWV0YURhdGExMDAASURUU1ZhcmlhYmxlMTAwAElEVFNFeHRlcm5hbE1ldGFkYXRhQ29s
dW1uMTAwAElEVFNJbnB1dENvbHVtbjEwMABJRFRTRXh0ZXJuYWxNZXRhZGF0YUNvbHVtbkNvbGxl
Y3Rpb24xMDAASURUU0lucHV0Q29sdW1uQ29sbGVjdGlvbjEwMABJRFRTUnVudGltZUNvbm5lY3Rp
b25Db2xsZWN0aW9uMTAwAElEVFNJbnB1dENvbGxlY3Rpb24xMDAASURUU1J1bnRpbWVDb25uZWN0
aW9uMTAwAElEVFNDb25uZWN0aW9uTWFuYWdlcjEwMABJRFRTQnVmZmVyTWFuYWdlcjEwMABJRFRT
VmFyaWFibGVEaXNwZW5zZXIxMDAASURUU1ZhcmlhYmxlczEwMABJRFRTQ29ubmVjdGlvbk1hbmFn
ZXJEYXRhYmFzZVBhcmFtZXRlcnMxMDAASURUU09iamVjdEhvc3QxMDAASURUU0lucHV0MTAwAENv
bnRleHRWYWx1ZWAxAFRocmVhZFNhZmVPYmplY3RQcm92aWRlcmAxAEludDMyAENvenlSb2MuU1NJ
U1BsdXMuMjAxNwA8TW9kdWxlPgBnZXRfSUQAZ2V0X0xpbmVhZ2VJRABGaW5kQ29sdW1uQnlMaW5l
YWdlSUQAZ2V0X0V4dGVybmFsTWV0YWRhdGFDb2x1bW5JRABzZXRfQ29ubmVjdGlvbk1hbmFnZXJJ
RABPYmplY3RJRABJbnB1dElEAEdldE9iamVjdEJ5SUQAUGFyYW1ldGVyXzFQAENvenlSb2MuU3Fs
U2VydmVyLlNTSVMATWljcm9zb2Z0LlNxbFNlcnZlci5NYW5hZ2VkRFRTAFQARGlzcG9zZV9fSW5z
dGFuY2VfXwBDcmVhdGVfX0luc3RhbmNlX18AdmFsdWVfXwBTZXRWYXJpYWJsZV8AR2V0UGFyYW1l
dGVyTmFtZV8AR2V0RGJUeXBlXwBEYXRhUmVjb3JkVHlwZVRvQnVmZmVyVHlwZV8AR2V0Q29ubmVj
dGlvbl8AU2V0dXBQYXJhbWV0ZXJfAEZpcmVFcnJvcl8AR2V0Q29sdW1uc18AR2V0UHJpbWFyeUtl
eXNfAEdldENvbm5lY3Rpb25Gb3JTY2hlbWEAR2V0U2NoZW1hAFN5c3RlbS5EYXRhAFJlaW5pdGlh
bGl6ZU1ldGFEYXRhAGdldF9Db21wb25lbnRNZXRhRGF0YQBHZXRCbG9iRGF0YQBQcm9qZWN0RGF0
YQBtc2NvcmxpYgBTQ182MTE2Y2IxNzI3ODI0MzBjYjRjYTFhNDIwM2RkMGYyYwBNaWNyb3NvZnQu
VmlzdWFsQmFzaWMAQWRkAGdldF9Jc0F0dGFjaGVkAHNldF9Jc1VzZWQARGJDb21tYW5kAENyZWF0
ZUNvbW1hbmQAbV9jb21tYW5kAENyZWF0ZUluc3RhbmNlAGdldF9HZXRJbnN0YW5jZQBpbnN0YW5j
ZQBHZXRIYXNoQ29kZQBzZXRfQ29kZVBhZ2UAZ2V0X01lc3NhZ2UAZXJyTWVzc2FnZQBtZXNzYWdl
AGdldF9TY2FsZQBzZXRfU2NhbGUAZ2V0X1RhYmxlAHNldF9UYWJsZQBHZXRTY2hlbWFUYWJsZQBE
YXRhVGFibGUAZ2V0X1VwZGF0ZWRWYXJpYWJsZQBzZXRfVXBkYXRlZFZhcmlhYmxlAGdldF9EZWxl
dGVkVmFyaWFibGUAc2V0X0RlbGV0ZWRWYXJpYWJsZQBnZXRfSW5zZXJ0ZWRWYXJpYWJsZQBzZXRf
SW5zZXJ0ZWRWYXJpYWJsZQBJRGlzcG9zYWJsZQBtX3RhYmxlAFJ1bnRpbWVUeXBlSGFuZGxlAEdl
dFR5cGVGcm9tSGFuZGxlAE1zZ0JveFN0eWxlAGdldF9OYW1lAHNldF9OYW1lAGdldF9Db2x1bW5O
YW1lAHZhck5hbWUAZ2V0X1BhcmFtZXRlck5hbWUAc2V0X1BhcmFtZXRlck5hbWUASW5wdXROYW1l
AE1pY3Jvc29mdC5TcWxTZXJ2ZXIuRHRzLlJ1bnRpbWUATWljcm9zb2Z0LlNxbFNlcnZlci5EdHMu
UGlwZWxpbmUAZ2V0X0RhdGFUeXBlAHNldF9EYXRhVHlwZQBnZXRfRGJUeXBlAHNldF9EYlR5cGUA
Z2V0X0Nvbm5lY3Rpb25UeXBlAHNldF9Db25uZWN0aW9uVHlwZQBtX2Nvbm5lY3Rpb25UeXBlAEdl
dFR5cGUAdHlwZQBnZXRfQ3VsdHVyZQBzZXRfQ3VsdHVyZQBfcmVzQ3VsdHVyZQBBcHBsaWNhdGlv
bkJhc2UAQXBwbGljYXRpb25TZXR0aW5nc0Jhc2UARGlzcG9zZQBWYWxpZGF0ZQBJbnNlcnRVcGRh
dGUARWRpdG9yQnJvd3NhYmxlU3RhdGUARGVsZXRlAExvY2tPbmVGb3JXcml0ZQBHdWlkQXR0cmli
dXRlAEhlbHBLZXl3b3JkQXR0cmlidXRlAEdlbmVyYXRlZENvZGVBdHRyaWJ1dGUARGVidWdnZXJO
b25Vc2VyQ29kZUF0dHJpYnV0ZQBEZWJ1Z2dhYmxlQXR0cmlidXRlAFZhcmlhYmxlQXR0cmlidXRl
AEVkaXRvckJyb3dzYWJsZUF0dHJpYnV0ZQBDb21WaXNpYmxlQXR0cmlidXRlAEFzc2VtYmx5VGl0
bGVBdHRyaWJ1dGUAU3RhbmRhcmRNb2R1bGVBdHRyaWJ1dGUASGlkZU1vZHVsZU5hbWVBdHRyaWJ1
dGUARGVmYXVsdFZhbHVlQXR0cmlidXRlAEFzc2VtYmx5VHJhZGVtYXJrQXR0cmlidXRlAFRhcmdl
dEZyYW1ld29ya0F0dHJpYnV0ZQBEZWJ1Z2dlckhpZGRlbkF0dHJpYnV0ZQBBc3NlbWJseUZpbGVW
ZXJzaW9uQXR0cmlidXRlAE15R3JvdXBDb2xsZWN0aW9uQXR0cmlidXRlAENvbm5lY3Rpb25BdHRy
aWJ1dGUAQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZQBWYWxpZGF0ZVByb3BlcnRpZXNBdHRy
aWJ1dGUAUmVmcmVzaFByb3BlcnRpZXNBdHRyaWJ1dGUARmlsdGVyUHJvcGVydGllc0F0dHJpYnV0
ZQBTb3J0UHJvcGVydGllc0F0dHJpYnV0ZQBDb2x1bW5NYXBwaW5nc0F0dHJpYnV0ZQBDb21waWxh
dGlvblJlbGF4YXRpb25zQXR0cmlidXRlAEFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZQBBc3NlbWJs
eUNvcHlyaWdodEF0dHJpYnV0ZQBDTFNDb21wbGlhbnRBdHRyaWJ1dGUAU1NJU1NjcmlwdENvbXBv
bmVudEVudHJ5UG9pbnRBdHRyaWJ1dGUATGlzdEF0dHJpYnV0ZQBBc3NlbWJseUNvbXBhbnlBdHRy
aWJ1dGUAQ2F0ZWdvcnlBdHRyaWJ1dGUAUnVudGltZUNvbXBhdGliaWxpdHlBdHRyaWJ1dGUAUHJl
RXhlY3V0ZQBQb3N0RXhlY3V0ZQBtX1ZhbHVlAGdldF9WYWx1ZQBzZXRfVmFsdWUAR2V0T2JqZWN0
VmFsdWUAdmFsdWUAZ2V0X1NpemUAc2V0X1NpemUASW5kZXhPZgBTeXN0ZW0uVGhyZWFkaW5nAFN5
c3RlbS5SdW50aW1lLlZlcnNpb25pbmcAQ29tcGFyZVN0cmluZwBUb1N0cmluZwBHZXRTdHJpbmcA
Z2V0X0xlbmd0aABzZXRfTGVuZ3RoAFVubG9jawBNaWNyb3NvZnQuVmlzdWFsQmFzaWMuTXlTZXJ2
aWNlcy5JbnRlcm5hbABTeXN0ZW0uQ29tcG9uZW50TW9kZWwAUmVtb3ZlQWxsAFNDXzYxMTZjYjE3
Mjc4MjQzMGNiNGNhMWE0MjAzZGQwZjJjLmRsbABzZXRfRXJyb3JEZXNjcmlwdGlvbl9Jc051bGwA
U2V0TnVsbABpbnB1dENvbABtX3VwZGF0ZVNxbABtX2RlbGV0ZVNxbABtX3NlbGVjdFNxbABtX2lu
c2VydFNxbABnZXRfSXRlbQBzZXRfSXRlbQBTeXN0ZW0ARW51bQBUb0Jvb2xlYW4AU3lzdGVtLkNv
bXBvbmVudE1vZGVsLkRlc2lnbgBkZXNpZ24AU2NyaXB0TWFpbgBKb2luAERhdGFDb2x1bW4AQmxv
YkNvbHVtbgBjb25uAGdldF9QcmVjaXNpb24Ac2V0X1ByZWNpc2lvbgBnZXRfQXBwbGljYXRpb24A
TXlBcHBsaWNhdGlvbgBTeXN0ZW0uQ29uZmlndXJhdGlvbgBTeXN0ZW0uR2xvYmFsaXphdGlvbgBn
ZXRfQWN0aW9uAHNldF9BY3Rpb24AbV9hY3Rpb24ASW50ZXJhY3Rpb24AU3lzdGVtLlJlZmxlY3Rp
b24ASUNvbGxlY3Rpb24ARGF0YUNvbHVtbkNvbGxlY3Rpb24AZ2V0X0V4dGVybmFsTWV0YWRhdGFD
b2x1bW5Db2xsZWN0aW9uAGdldF9JbnB1dENvbHVtbkNvbGxlY3Rpb24AZ2V0X1J1bnRpbWVDb25u
ZWN0aW9uQ29sbGVjdGlvbgBEYlBhcmFtZXRlckNvbGxlY3Rpb24AZ2V0X0lucHV0Q29sbGVjdGlv
bgBEYXRhUm93Q29sbGVjdGlvbgBnZXRfQ29ubmVjdGlvbgBzZXRfQ29ubmVjdGlvbgBEYkNvbm5l
Y3Rpb24AQWNxdWlyZUNvbm5lY3Rpb24AU3FsQ29ubmVjdGlvbgBtX2Nvbm5lY3Rpb24ARFRTUm93
RGlzcG9zaXRpb24AZ2V0X0Vycm9yUm93RGlzcG9zaXRpb24Ac2V0X0Vycm9yUm93RGlzcG9zaXRp
b24AbV9lcnJvclJvd0Rpc3Bvc2l0aW9uAEFwcGxpY2F0aW9uRXhjZXB0aW9uAEludmFsaWRPcGVy
YXRpb25FeGNlcHRpb24AQXJndW1lbnRFeGNlcHRpb24Ac2V0X0Vycm9yRGVzY3JpcHRpb24AU3lz
dGVtLkRhdGEuQ29tbW9uAEN1bHR1cmVJbmZvAE91dHB1dE5hbWVNYXAAT3V0cHV0TWFwAE1pY3Jv
c29mdC5TcWxTZXJ2ZXIuRFRTUnVudGltZVdyYXAATWljcm9zb2Z0LlNxbFNlcnZlci5EVFNQaXBl
bGluZVdyYXAAbV91cGRhdGVkVmFyAG1fZGVsZXRlZFZhcgBtX2luc2VydGVkVmFyAEV4ZWN1dGVT
Y2FsYXIASW52b2tlTWVtYmVyAERiRGF0YVJlYWRlcgBFeGVjdXRlUmVhZGVyAG1fQXBwT2JqZWN0
UHJvdmlkZXIAbV9Vc2VyT2JqZWN0UHJvdmlkZXIAbV9Db21wdXRlck9iamVjdFByb3ZpZGVyAG1f
TXlXZWJTZXJ2aWNlc09iamVjdFByb3ZpZGVyAEJpbmRlcgBnZXRfQnVmZmVyAFBpcGVsaW5lQnVm
ZmVyAFNjcmlwdEJ1ZmZlcgBJbnB1dEJ1ZmZlcgBnZXRfUmVzb3VyY2VNYW5hZ2VyAGdldF9Db25u
ZWN0aW9uTWFuYWdlcgBnZXRfQnVmZmVyTWFuYWdlcgBUb0ludGVnZXIAU3lzdGVtLkNvZGVEb20u
Q29tcGlsZXIATWljcm9zb2Z0LlNxbFNlcnZlci5EdHMuUnVudGltZS5XcmFwcGVyAE1pY3Jvc29m
dC5TcWxTZXJ2ZXIuRHRzLlBpcGVsaW5lLldyYXBwZXIAZ2V0X1VzZXIAZ2V0X1ZhcmlhYmxlRGlz
cGVuc2VyAElEYkRhdGFQYXJhbWV0ZXIARGJQYXJhbWV0ZXIAQ3JlYXRlUGFyYW1ldGVyAHBhcmFt
ZXRlcgBFbnRlcgBnZXRfQ29tcHV0ZXIATXlDb21wdXRlcgBfcmVzTWdyAENvbW1hbmRCZWhhdmlv
cgBGaXJlRXJyb3IAQ2xlYXJQcm9qZWN0RXJyb3IAU2V0UHJvamVjdEVycm9yAENvbHVtblNlcGFy
YXRvcgBJRW51bWVyYXRvcgBHZXRFbnVtZXJhdG9yAEFjdGl2YXRvcgAuY3RvcgAuY2N0b3IATW9u
aXRvcgBTeXN0ZW0uRGlhZ25vc3RpY3MATWljcm9zb2Z0LlZpc3VhbEJhc2ljLkRldmljZXMAZ2V0
X1dlYlNlcnZpY2VzAE15V2ViU2VydmljZXMATWljcm9zb2Z0LlZpc3VhbEJhc2ljLkFwcGxpY2F0
aW9uU2VydmljZXMAU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzAE1pY3Jvc29mdC5WaXN1
YWxCYXNpYy5Db21waWxlclNlcnZpY2VzAFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXMA
U3lzdGVtLlJlc291cmNlcwBTQ182MTE2Y2IxNzI3ODI0MzBjYjRjYTFhNDIwM2RkMGYyYy5NeS5S
ZXNvdXJjZXMATXlSZXNvdXJjZXMAU0NfNjExNmNiMTcyNzgyNDMwY2I0Y2ExYTQyMDNkZDBmMmMu
UmVzb3VyY2VzLnJlc291cmNlcwBEZWJ1Z2dpbmdNb2RlcwBSZWZyZXNoUHJvcGVydGllcwBHZXRQ
cm9wZXJ0aWVzAEdldFRhYmxlcwBWYXJpYWJsZXMAQWN0aW9uVHlwZXMAQ296eVJvYy5TcWxTZXJ2
ZXIuU1NJUy5BdHRyaWJ1dGVzAG1faW5wdXRJbmRleGVzAEJpbmRpbmdGbGFncwBNeVNldHRpbmdz
AEVxdWFscwBDb250YWlucwBnZXRfQ29sdW1ucwBHZXRDb2x1bW5zAGdldF9TdGF0aWNJbnB1dENv
bHVtbnMAZ2V0X1N0YXRpY091dHB1dENvbHVtbnMAQ29udmVyc2lvbnMAU3lzdGVtLkNvbGxlY3Rp
b25zAGdldF9EZXNpZ25Db25uZWN0aW9ucwBTdHJpbmdTcGxpdE9wdGlvbnMAUnVudGltZUhlbHBl
cnMAZ2V0X1BhcmFtZXRlcnMAT3BlcmF0b3JzAFNjcmlwdEJ1ZmZlclBsdXMAU2NyaXB0Q29tcG9u
ZW50UGx1cwBnZXRfUm93cwBnZXRfUHJpbWFyeUtleXMAc2V0X1ByaW1hcnlLZXlzAG1fcHJpbWFy
eUtleXMATmV3QXQAQ29uY2F0AEZvcm1hdABtX1N5bmNPYmplY3QAZ2V0X0lubmVyT2JqZWN0AE15
UHJvamVjdABkdABFbmRPZlJvd3NldABTcGxpdABFeGl0AE1zZ0JveFJlc3VsdABTeXN0ZW0uRGF0
YS5TcWxDbGllbnQAUGlwZWxpbmVDb21wb25lbnQAVXNlckNvbXBvbmVudABQYXJlbnRDb21wb25l
bnQAU2NyaXB0Q29tcG9uZW50AGdldF9Ib3N0Q29tcG9uZW50AGdldF9DdXJyZW50AGdldF9Db3Vu
dABtX3VwZGF0ZWRDb3VudABtX2RlbGV0ZWRDb3VudABtX2luc2VydGVkQ291bnQATWljcm9zb2Z0
LlNxbFNlcnZlci5UeFNjcmlwdABVcGRhdGVJbnNlcnQAU29ydABBcnJheUxpc3QATWljcm9zb2Z0
LlNxbFNlcnZlci5QaXBlbGluZUhvc3QASXNJbnB1dABJbnB1dF9Qcm9jZXNzSW5wdXQARGlyZWN0
Um93VG9FcnJvck91dHB1dABNb3ZlTmV4dABzZXRfQ29tbWFuZFRleHQAbV9Db250ZXh0AERhdGFS
b3cARGlyZWN0Um93AElucHV0X1Byb2Nlc3NJbnB1dFJvdwBOZXh0Um93AE1zZ0JveABTQ182MTE2
Y2IxNzI3ODI0MzBjYjRjYTFhNDIwM2RkMGYyYy5NeQBUb0FycmF5AGdldF9Bc3NlbWJseQBFeGVj
dXRlTm9uUXVlcnkASXNOdWxsT3JFbXB0eQAAADFNAHkALgBSAGUAcwBvAHUAcgBjAGUAcwAuAE0A
eQBSAGUAcwBvAHUAcgBjAGUAcwAABSwACgAACXAAewAwAH0AABN7ADAAfQAgAD0AIAB7ADEAfQAA
CyAAQQBOAEQAIAAAO1MARQBMAEUAQwBUACAAewAwAH0AIABGAFIATwBNACAAewAxAH0AIABXAEgA
RQBSAEUAIAB7ADIAfQAAAywAAENJAE4AUwBFAFIAVAAgAEkATgBUAE8AIAB7ADAAfQAgACgAewAx
AH0AKQAgAFYAQQBMAFUARQBTACgAewAyAH0AKQAAOVUAUABEAEEAVABFACAAewAwAH0AIABTAEUA
VAAgAHsAMQB9ACAAVwBIAEUAUgBFACAAewAyAH0AADNEAEUATABFAFQARQAgAEYAUgBPAE0AIAB7
ADAAfQAgAFcASABFAFIARQAgAHsAMQB9AAAdQwBvAG4AbgBlAGMAdABpAG8AbgBUAHkAcABlAAAV
QwBvAG4AbgBlAGMAdABpAG8AbgAAC1QAYQBiAGwAZQAADUEAYwB0AGkAbwBuAAAnRQByAHIAbwBy
AFIAbwB3AEQAaQBzAHAAbwBzAGkAdABpAG8AbgAAIUkAbgBzAGUAcgB0AGUAZABWAGEAcgBpAGEA
YgBsAGUAAB9VAHAAZABhAHQAZQBkAFYAYQByAGkAYQBiAGwAZQAAH0QAZQBsAGUAdABlAGQAVgBh
AHIAaQBhAGIAbABlAAAXUAByAGkAbQBhAHIAeQBLAGUAeQBzAAAlUwBlAGwAZQBjAHQAIABjAG8A
bgBuAGUAYwB0AGkAbwBuAC4AADNTAGUAbABlAGMAdAAgAGQAZQBzAHQAaQBuAGEAdABpAG8AbgAg
AHQAYQBiAGwAZQAuAAA3UwBwAGUAYwBpAGYAeQAgAHQAYQBiAGwAZQAgAHAAcgBpAG0AYQByAHkA
IABrAGUAeQBzAC4AACVNAGEAcAAgAGkAbgBwAHUAdAAgAGMAbwBsAHUAbQBuAHMALgAAFU4AbwAg
AGkAbgBwAHUAdABzAC4AADFDAG8AbgBuAGUAYwB0AGkAbwBuACAAbgBvAHQAIABzAGUAbABlAGMA
dABlAGQALgAAP0QAZQBzAHQAaQBuAGEAdABpAG8AbgAgAHQAYQBiAGwAZQAgAG4AbwB0ACAAcwBl
AGwAZQBjAHQAZQBkAC4AAAtJAHMASwBlAHkAABVDAG8AbAB1AG0AbgBOAGEAbQBlAAARRABhAHQA
YQBUAHkAcABlAAANSQBzAEwAbwBuAGcAABVDAG8AbAB1AG0AbgBTAGkAegBlAAAhTgB1AG0AZQBy
AGkAYwBQAHIAZQBjAGkAcwBpAG8AbgAAGU4AdQBtAGUAcgBpAGMAUwBjAGEAbABlAAALVABBAEIA
TABFAAAVQgBBAFMARQAgAFQAQQBCAEwARQAADVQAYQBiAGwAZQBzAAAVdABhAGIAbABlAF8AbgBh
AG0AZQAAF1sAewAwAH0AXQAuAFsAewAxAH0AXQAAI1MARQBMAEUAQwBUACAAKgAgAEYAUgBPAE0A
IAB7ADAAfQAANUQAYQB0AGEAUgBlAGMAbwByAGQAVAB5AHAAZQBUAG8AQgB1AGYAZgBlAHIAVAB5
AHAAZQAAJ1UAbgBoAGEAbgBkAGwAZQBkACAAdAB5AHAAZQAuACAAewAwAH0AAANAAAADPwAAMVQA
YQBiAGwAZQAgAFUAcABkAGEAdABlACAARABlAHMAdABpAG4AYQB0AGkAbwBuAAALTwBMAEUARABC
AACAm0kAcwBOAHUAbABsACAAcAByAG8AcABlAHIAdAB5ACAAYwBhAG4AbgBvAHQAIABiAGUAIABz
AGUAdAAgAHQAbwAgAEYAYQBsAHMAZQAuACAAQQBzAHMAaQBnAG4AIABhACAAdgBhAGwAdQBlACAA
dABvACAAdABoAGUAIABjAG8AbAB1AG0AbgAgAGkAbgBzAHQAZQBhAGQALgAAGUUAcgByAG8AcgAg
AE8AdQB0AHAAdQB0AAAhRQByAHIAbwByAEQAZQBzAGMAcgBpAHAAdABpAG8AbgAAC0kAbgBwAHUA
dAAAvPbFYarBEUGToNpvxML77QAEIAEBCAMgAAEFIAEBEREEIAEBDgQgAQECBSACAQ4OBSABARFF
ByAEAQ4ODg4FIAEBHQ4FIAEBHRwGIAEBEYDlBiADAQ4CAgYVEjQBEgwGFRI0ARIIBhUSNAESZQYV
EjQBEjAEIAATAAcAARJtEYEVBSAAEoEZByACAQ4SgRkWBwoICAgSgJ0cETgQCBKAoRKAoRGAlQUg
ABKBHQYgARKAnQgFIAASgP0EIAEcCAQAARwcBSAAEYDJAyAACAcgAx0FCAgIBCABDggEIAEBHAYA
AQESgKEDAAABAyAAHAMgAA47BxoSgKUSgKkSgK0SgK0IHRKAnRKArRKArRKArRKArQ4SgLESgLUS
gLkSgLESgLUOCBKAnQgICAgODg4FIAASgS0FIAASgTEGIAESgKUcBSAAEoCZBAABAg4JIAIdDh0O
EYE9BiABARKBQQUgABKBRQUgABKAsQUgABKBSQYgARKAuQgEIAECHAUgAgEIHAMgAAIEIAEIHAUg
ABKBUQUgABKBVQUgAggICAUgABKAnQUAAg4OHAQAAQ4cBgADDg4cHAcgARKBXRJtAh0OBgACDg4d
DgcABA4OHBwcBSAAEoCpBwcCEoCtETgMBwUCAh0OEoClEoChBSAAEoFpBiABEoFtHBkHDBKApRKA
vQgIEoDBEoC5Em0RgMUICAgIBSAAEoFxBiABEoDBCAQgARwOBAABAhwEAAEIHAQgAQIOBiABARGA
xRcHCh0cEoCtEoCpDhKAvQ4SgLEODhKAoQggAhKAvQ4dDgUgABKBeQYgARKBfQgKAAMRgYUcEYGJ
HAQgAB0cEwcGHRwSgK0SgL0SgLESgMESgKEDBwEOBgADCA4OAgIGDgQHARE4BQcBEYCVEgcGDhKA
rRKAvRKAsRKAwRKAoQ4HBBKAvRKAvRKAqRKAmQggARKBkRGBlQUgABKAvQUHARGAxQ0gBRwOEYGZ
EoGdHB0cBAcCBQUFIAARgMUGIAEBEYDJBCABAQUIBwIRgMkRgMUEBwIODgUAAg4ODgMHAQIKIAYB
CA4ODggQAggHAhKAqRKAqQUgABKBqQYgARKBrRwEIAEcHAUHARKAzQUgABKBuQggAgEOEBKAzQYg
ARKBvRwOIAUBEoD5CAISgP0SgQEFIAASgQkEAAEBHAQHAR4AAh4ABRABAB4ABAoBHgAEBwETAAYV
EjQBEwAHBhUScQETAAYVEnEBEwACEwAECgETAAUgAQETAAi3elxWGTTgiQiwP19/EdUKOggWz0kL
uAw06giJhF3NgIDMkQQsAAoACHAAewAwAH0ABAAAAAAEAQAAAAQCAAAABAMAAAAEBAAAAAcGFRI0
ARIMBwYVEjQBEggHBhUSNAESZQcGFRI0ARIwAwYSeQMGEn0DBhE4BAYRgJUEBhKAmQMGHQgCBggD
BhIkAwYSKAQGEoD5AwYSLAIGHAQAABIMBAAAEggEAAASZQQAABIwBAAAEnkEAAASfQUAAQESfQUg
AQESHAQgAB0OBSABAhAOBCAAETgFIAEBETgFIAARgJUGIAEBEYCVByABEYDFEm0JIAIBEoC1EoCd
CCABEYDJEYDFByACDhKAqQ4GIAESgKkCBSACAQ4cCyAEAQgOEoD9EoEBBiABARKA+QQAABIsBCAA
Em0HEAEBHgAeAAcwAQEBEB4ABAgAEgwECAASCAQIABJlBAgAEjAECAASeQQIABJ9AygADgQoABE4
BSgAEYCVBCgAHQ4DKAACBSgAEoEJBAgAEiwEKAATAAgBAAgAAAAAAB4BAAEAVAIWV3JhcE5vbkV4
Y2VwdGlvblRocm93cwEIAQACAAAAAAAoAQAjU0NfNjExNmNiMTcyNzgyNDMwY2I0Y2ExYTQyMDNk
ZDBmMmMAAAUBAAAAABYBABFDb3B5cmlnaHQgQCAgMjAxOAAABQEAAQAAKQEAJDhlMDhmMGU3LWJh
NzktNGMxMC1hZDI2LWJhODZmMmQ2YWFjYgAADAEABzEuMC4wLjAAAEkBABouTkVURnJhbWV3b3Jr
LFZlcnNpb249djQuNQEAVA4URnJhbWV3b3JrRGlzcGxheU5hbWUSLk5FVCBGcmFtZXdvcmsgNC41
CAEAAQAAAAAAGAEACk15VGVtcGxhdGUIMTEuMC4wLjAAAICAAQAJAAAADkNvbm5lY3Rpb25UeXBl
CkNvbm5lY3Rpb24FVGFibGUGQWN0aW9uC1ByaW1hcnlLZXlzE0Vycm9yUm93RGlzcG9zaXRpb24Q
SW5zZXJ0ZWRWYXJpYWJsZQ9VcGRhdGVkVmFyaWFibGUPRGVsZXRlZFZhcmlhYmxlAAASAQANR2V0
UHJvcGVydGllcwAADQEACFZhbGlkYXRlAABhAQA0U3lzdGVtLldlYi5TZXJ2aWNlcy5Qcm90b2Nv
bHMuU29hcEh0dHBDbGllbnRQcm90b2NvbBJDcmVhdGVfX0luc3RhbmNlX18TRGlzcG9zZV9fSW5z
dGFuY2VfXwAAABABAAtNeS5Db21wdXRlcgAAEwEADk15LkFwcGxpY2F0aW9uAAAMAQAHTXkuVXNl
cgAAEwEADk15LldlYlNlcnZpY2VzAAAcAQAXU2VsZWN0IGNvbm5lY3Rpb24gdHlwZS4AABABAAtE
ZXN0aW5hdGlvbgAAGAEAAgAAAA4HQURPLk5FVA4FT0xFREIAAAwBAAdBRE8uTkVUAAAfAQAaU2Vs
ZWN0IENvbm5lY3Rpb24gTWFuYWdlci4AABMBAA5Db25uZWN0aW9uVHlwZQAAHgEAGVNlbGVjdCBk
ZXN0aW5hdGlvbiB0YWJsZS4AABABAAlHZXRUYWJsZXMAAQAAJQEAIFNlbGVjdCBkZXN0aW5hdGlv
biB0YWJsZSBhY3Rpb24uAAAgAQAbU3BlY2lmeSB0YWJsZSBwcmltYXJ5IGtleXMuAAARAQAKR2V0
Q29sdW1ucwEAAAAmAQAhU3BlY2lmeSBob3cgdG8gaGFuZGxlIGVycm9yIHJvd3MuAAAKAQAFRXJy
b3IAAAgBAAQAAAAAAEEBADxTZWxlY3QgdmFyaWFibGUgdG8gc3RvcmUgbnVtYmVyIG9mIHJvd3Mg
aW5zZXJ0ZWQgKG9wdGlvbmFsKS4AABABAAtEaWFnbm9zdGljcwAAQAEAO1NlbGVjdCB2YXJpYWJs
ZSB0byBzdG9yZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkIChvcHRpb25hbCkuAABAAQA7U2VsZWN0
IHZhcmlhYmxlIHRvIHN0b3JlIG51bWJlciBvZiByb3dzIGRlbGV0ZWQgKG9wdGlvbmFsKS4AAAC0
AAAAzsrvvgEAAACRAAAAbFN5c3RlbS5SZXNvdXJjZXMuUmVzb3VyY2VSZWFkZXIsIG1zY29ybGli
LCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVj
NTYxOTM0ZTA4OSNTeXN0ZW0uUmVzb3VyY2VzLlJ1bnRpbWVSZXNvdXJjZVNldAIAAAAAAAAAAAAA
AFBBRFBBRFC0AAAA0HIAAAAAAAAAAAAA6nIAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAANxyAAAA
AAAAAAAAAAAAX0NvckRsbE1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACAAEAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAAABgAAIAAAAAAAAAAAAAAAAAAAAEAAQAA
ADAAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAEgAAABYgAAA7AMAAAAAAAAAAAAA7AM0AAAAVgBTAF8A
VgBFAFIAUwBJAE8ATgBfAEkATgBGAE8AAAAAAL0E7/4AAAEAAAABAAAAAAAAAAEAAAAAAD8AAAAA
AAAABAAAAAIAAAAAAAAAAAAAAAAAAABEAAAAAQBWAGEAcgBGAGkAbABlAEkAbgBmAG8AAAAAACQA
BAAAAFQAcgBhAG4AcwBsAGEAdABpAG8AbgAAAAAAAACwBEwDAAABAFMAdAByAGkAbgBnAEYAaQBs
AGUASQBuAGYAbwAAACgDAAABADAAMAAwADAAMAA0AGIAMAAAABoAAQABAEMAbwBtAG0AZQBuAHQA
cwAAAAAAAAAiAAEAAQBDAG8AbQBwAGEAbgB5AE4AYQBtAGUAAAAAAAAAAABwACQAAQBGAGkAbABl
AEQAZQBzAGMAcgBpAHAAdABpAG8AbgAAAAAAUwBDAF8ANgAxADEANgBjAGIAMQA3ADIANwA4ADIA
NAAzADAAYwBiADQAYwBhADEAYQA0ADIAMAAzAGQAZAAwAGYAMgBjAAAAMAAIAAEARgBpAGwAZQBW
AGUAcgBzAGkAbwBuAAAAAAAxAC4AMAAuADAALgAwAAAAcAAoAAEASQBuAHQAZQByAG4AYQBsAE4A
YQBtAGUAAABTAEMAXwA2ADEAMQA2AGMAYgAxADcAMgA3ADgAMgA0ADMAMABjAGIANABjAGEAMQBh
ADQAMgAwADMAZABkADAAZgAyAGMALgBkAGwAbAAAAEgAEgABAEwAZQBnAGEAbABDAG8AcAB5AHIA
aQBnAGgAdAAAAEMAbwBwAHkAcgBpAGcAaAB0ACAAQAAgACAAMgAwADEAOAAAACoAAQABAEwAZQBn
AGEAbABUAHIAYQBkAGUAbQBhAHIAawBzAAAAAAAAAAAAeAAoAAEATwByAGkAZwBpAG4AYQBsAEYA
aQBsAGUAbgBhAG0AZQAAAFMAQwBfADYAMQAxADYAYwBiADEANwAyADcAOAAyADQAMwAwAGMAYgA0
AGMAYQAxAGEANAAyADAAMwBkAGQAMABmADIAYwAuAGQAbABsAAAAaAAkAAEAUAByAG8AZAB1AGMA
dABOAGEAbQBlAAAAAABTAEMAXwA2ADEAMQA2AGMAYgAxADcAMgA3ADgAMgA0ADMAMABjAGIANABj
AGEAMQBhADQAMgAwADMAZABkADAAZgAyAGMAAAA0AAgAAQBQAHIAbwBkAHUAYwB0AFYAZQByAHMA
aQBvAG4AAAAxAC4AMAAuADAALgAwAAAAOAAIAAEAQQBzAHMAZQBtAGIAbAB5ACAAVgBlAHIAcwBp
AG8AbgAAADEALgAwAC4AMAAuADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAcAAADAAAAPwyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAA==]]></arrayElement></arrayElements></property><property id="45" name="VSTAProjectName" dataType="System.String" description="Specifies the name of the Microsoft Visual Studio Tools for Applications project. Project names must be unique within a package." typeConverter="NOTBROWSABLE">SC_6116cb172782430cb4ca1a4203dd0f2c</property><property id="46" name="ScriptLanguage" dataType="System.String" description="Specifies the programming language used by the script." typeConverter="Microsoft.SqlServer.VSTAHosting.ScriptingLanguages, Microsoft.SqlServer.VSTAScriptingLib, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91">VisualBasic</property><property id="53" name="UserComponentTypeName" dataType="System.String">CozyRoc.ScriptComponentHostPlus</property></properties><connections><connection id="63" name="Connection" connectionManagerID="{74999908-AFE0-47FD-932E-0E67E482566F}" /></connections><inputs><input id="41" name="Input" hasSideEffects="true"><externalMetadataColumns /></input></inputs><outputs><output id="42" name="Error Output" exclusionGroup="1" synchronousInputId="41"><outputColumns><outputColumn id="54" name="ErrorDescription" lineageId="54" length="1000" dataType="wstr" /></outputColumns><externalMetadataColumns /></output></outputs></component>