From acf23d4fc2ba4b3675f3abfeda366aa2cf9b3d9d Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Fri, 17 Jun 2011 18:46:22 -0700 Subject: [PATCH 1/4] Removed subsonic completely --- Libraries/SubSonic.Core.XML | 4624 ----------------- Libraries/SubSonic.Core.dll | Bin 310272 -> 0 bytes NzbDrone.Core.Test/Framework/MockLib.cs | 30 +- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 2 - NzbDrone.Core.Test/RepoTest.cs | 109 - NzbDrone.Core.Test/RepositoryProviderTest.cs | 175 - NzbDrone.Core.Test/SeriesProviderTest.cs | Bin 6628 -> 6627 bytes NzbDrone.Core.Test/dbBenchmark.cs | 14 +- NzbDrone.Core/CentralDispatch.cs | 5 +- NzbDrone.Core/Datastore/Connection.cs | 36 +- .../Datastore/Migrations/Migration.cs | 43 +- NzbDrone.Core/Datastore/MigrationsHelper.cs | 67 - NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs | 39 +- NzbDrone.Core/Datastore/RepositoryProvider.cs | 98 - NzbDrone.Core/Datastore/SqliteProvider.cs | 3 - .../Helpers/FileSizeFormatHelpercs.cs | 3 - NzbDrone.Core/Instrumentation/Log.cs | 1 - .../Instrumentation/LogConfiguration.cs | 1 - NzbDrone.Core/Instrumentation/LogProvider.cs | 2 - .../Instrumentation/SubsonicTarget.cs | 1 - NzbDrone.Core/Model/ConnectionInfoModel.cs | 7 +- NzbDrone.Core/Model/EpisodeParseResult.cs | 1 - .../Model/ExternalNotificationType.cs | 7 +- NzbDrone.Core/Model/Quality.cs | 13 +- NzbDrone.Core/Model/SabnzbdInfoModel.cs | 7 +- NzbDrone.Core/Model/SeasonParseResult.cs | 4 +- NzbDrone.Core/NzbDrone.Core.csproj | 5 - .../Providers/AutoConfigureProvider.cs | 2 - .../Providers/Core/ConfigProvider.cs | 2 - NzbDrone.Core/Providers/Core/DiskProvider.cs | 1 - NzbDrone.Core/Providers/Core/HttpProvider.cs | 1 - NzbDrone.Core/Providers/DownloadProvider.cs | 5 - NzbDrone.Core/Providers/EpisodeProvider.cs | 2 - .../ExternalNotificationProviderBase.cs | 6 +- .../Providers/ExternalNotificationProvider.cs | 5 - NzbDrone.Core/Providers/Indexer/Newzbin.cs | 1 - NzbDrone.Core/Providers/Indexer/NzbMatrix.cs | 4 - NzbDrone.Core/Providers/Indexer/NzbsOrg.cs | 4 - NzbDrone.Core/Providers/Indexer/NzbsRUs.cs | 4 - .../Providers/Jobs/DeleteSeriesJob.cs | 4 - NzbDrone.Core/Providers/Jobs/DiskScanJob.cs | 1 - .../Providers/Jobs/EpisodeSearchJob.cs | 3 - NzbDrone.Core/Providers/Jobs/JobProvider.cs | 1 - .../Providers/Jobs/PostDownloadScanJob.cs | 4 - .../Providers/Jobs/RenameEpisodeJob.cs | 5 +- NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs | 4 +- .../Providers/Jobs/UpdateSceneMappingsJob.cs | 5 +- NzbDrone.Core/Providers/QualityProvider.cs | 1 - NzbDrone.Core/Providers/RootDirProvider.cs | 2 - .../Providers/SceneMappingProvider.cs | 4 - NzbDrone.Core/Providers/SeriesProvider.cs | 2 +- NzbDrone.Core/Providers/StatsProvider.cs | 2 - NzbDrone.Core/Providers/TvDbProvider.cs | 2 +- .../Providers/UpcomingEpisodesProvider.cs | 1 - NzbDrone.Core/Providers/XbmcProvider.cs | 1 - NzbDrone.Core/Repository/Config.cs | 1 - NzbDrone.Core/Repository/Episode.cs | 15 +- .../Repository/ExternalNotificationSetting.cs | 6 +- NzbDrone.Core/Repository/History.cs | 2 - NzbDrone.Core/Repository/JobSetting.cs | 2 - .../Repository/Quality/QualityProfile.cs | 7 +- NzbDrone.Core/Repository/SceneMapping.cs | 6 +- NzbDrone.Core/Repository/Series.cs | 18 +- NzbDrone.Core/WebTimer.cs | 3 - NzbDrone.Web/NzbDrone.Web.csproj | 4 - 65 files changed, 72 insertions(+), 5368 deletions(-) delete mode 100644 Libraries/SubSonic.Core.XML delete mode 100644 Libraries/SubSonic.Core.dll delete mode 100644 NzbDrone.Core.Test/RepoTest.cs delete mode 100644 NzbDrone.Core.Test/RepositoryProviderTest.cs delete mode 100644 NzbDrone.Core/Datastore/RepositoryProvider.cs diff --git a/Libraries/SubSonic.Core.XML b/Libraries/SubSonic.Core.XML deleted file mode 100644 index e2696c72f..000000000 --- a/Libraries/SubSonic.Core.XML +++ /dev/null @@ -1,4624 +0,0 @@ - - - - SubSonic.Core - - - - - Summary for the SqlFragment class - - - - - A Repository class which wraps the a Database by type - - - - - Loads a T object - - - The item. - The column. - The value. - - - - - Loads a T object - - - The item. - The expression. - - - - - Returns all T items - - - - - Returns a single record - - - - - Returns a server-side Paged List - - - - - Returns a server-side Paged List - - - - - Returns a server-side Paged List - - - - - Returns an IQueryable based on the passed-in Expression Chinook Database - - - - - Returns an IQueryable based on the passed-in Expression Chinook Database - - - - - Adds a T item to the db - - - - - Adds a T item to the db - - - - - Adds a bunch of T items - - - - - Adds a bunch of T items - - - - - Updates the passed-in T - - - - - Updates the passed-in T - - - - - Updates the passed-in T - - - - - Updates the passed-in T - - - - - Deletes the passed-in T items - - - - - Deletes the passed-in T items - - - - - Deletes the passed-in T item - - - - - Deletes the passed-in T item - - - - - Deletes the T item by Primary Key - - - - - Deletes the T item by Primary Key - - - - - Deletes 0 to n T items from the Database based on the passed-in Expression - - - - - Deletes 0 to n T items from the Database based on the passed-in Expression - - - - - Finds the first sub-expression that accesses a Query<T> object - - - - - Converts user arguments into named-value parameters - - - - - An extended expression visitor including custom DbExpression nodes - - - - - Returns the SqlDbType for a give DbType - - - - - - Takes the properties of an object and turns them into SubSonic.Query.Constraint - - - - - - - Coerces an IDataReader to try and load an object using name/property matching - - - - - Loads a single primitive value type - - - - - - Toes the type of the enumerable value. - - - The IDataReader to read from. - - - - - Determines whether [is core system type] [the specified type]. - - The type. - - true if [is core system type] [the specified type]; otherwise, false. - - - - - Coerces an IDataReader to load an enumerable of T - - - - - Invoked when a new item is created - - - - Creates a typed list from an IDataReader - - - - - Builds a SubSonic UPDATE query from the passed-in object - - - - - Builds a SubSonic INSERT query from the passed-in object - - - - - Builds a SubSonic DELETE query from the passed-in object - - - - - Defines the language rules for the query provider - - - - - - - - - - - - - - - - Generates the command line. - - - - - - Generates the constraints. - - - - - - Generates from list. - - - - - - Generates the order by. - - - - - - Generates the group by. - - - - - - Generates the joins. - - - - - - Gets the paging SQL wrapper. - - - - - - Gets the select columns. - - - - - - Finds the column. - - Name of the column. - - - - - Builds the select statement. - - - - - - Builds the paged select statement. - - - - - - Builds the update statement. - - - - - - Builds the insert statement. - - - - - - Builds the delete statement. - - - - - - Sets the insert query. - - The q. - - - - SqlFragment. Field values may change depending on the inheriting Generator. - - - - - Initializes a new instance of the class. - - - - - Sets the insert query. - - The q. - - - - Finds the column. - - Name of the column. - - - - - Generates the group by. - - - - - - Generates the command line. - - - - - - Generates the joins. - - - - - - Generates from list. - - - - - - Generates the constraints. - - - - - - Generates the order by. - - - - - - Gets the select columns. - - - - - - Gets the paging SQL wrapper. - - - - - - Builds the paged select statement. - - - - - - Builds the select statement. - - - - - - Builds the update statement. - - - - - - Builds the insert statement. - - - - - - Builds the delete statement. - - - - - - Qualifies the name of the table. - - The TBL. - - - - - Gets the qualified select. - - The table. - - - - - Generates the select column list. - - - - - - Builds the aggregate commands. - - - - - - Generates the 'SELECT' part of an - - The aggregate to include in the SELECT clause - The portion of the SELECT clause represented by this - - The ToString() logic moved from , rather than - including it in the Aggregate class itself... - - - - - Initializes a new instance of the class. - - The query. - - - - Builds the paged select statement. - - - - - - Builds the insert statement. - - - - - - Where, And, Or - - - - - WHERE operator - - - - - AND operator - - - - - OR Operator - - - - - SQL Comparison Operators - - - - - Summary for the SqlComparison class - - - - - A Class for handling SQL Constraint generation - - - - - The query that this constraint is operating on - - - - - Initializes a new instance of the class. - - The condition. - Name of the constraint column. - - - - Initializes a new instance of the class. - - The condition. - Name of the constraint column. - Name of the constraint qualified column. - - - - Initializes a new instance of the class. - - The condition. - Name of the constraint column. - Name of the constraint qualified column. - The constraint construction fragment. - - - - Initializes a new instance of the class. - - The condition. - Name of the constraint column. - The SQL query. - - - - Initializes a new instance of the class. - - The condition. - Name of the constraint column. - Name of the constraint qualified column. - The constraint construction fragment. - The SQL query. - - - - Wheres the specified column name. - - Name of the column. - - - - - Ands the specified column name. - - Name of the column. - - - - - Ors the specified column name. - - Name of the column. - - - - - Gets or sets the name of the table. - - The name of the table. - - - - Gets the comparison operator. - - The comp. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - The parameter is null. - - - - Serves as a hash function for a particular type. - - - A hash code for the current . - - - - - Creates a LIKE statement. - - The val. - - - - - Creates a LIKE statement and appends a wildcard to the end of the passed-in value. - - The val. - - - - - Creates a LIKE statement and appends a wildcard to the end of the passed-in value. - - The val. - The wild card. - - - - - Creates a LIKE statement and appends a wildcard to the end of the passed-in value. - - The val. - - - - - Creates a NOT LIKE statement - - The val. - - - - - Determines whether [is greater than] [the specified val]. - - The val. - - - - - Determines whether [is greater than] [the specified val]. - - The val. - - - - - Specifies a SQL IN statement using a nested Select statement - - The select query. - - - - - Specifies a SQL IN statement - - Value array - - - - - Specifies a SQL IN statement - - Value array - - - - - Specifies a SQL IN statement using a nested Select statement - - The select query. - - - - - Specifies a SQL Not IN statement - - Value array - - - - - Specifies a SQL NOT IN statement - - Value array - - - - - Determines whether [is less than] [the specified val]. - - The val. - - - - - Determines whether [is less than] [the specified val]. - - The val. - - - - - Determines whether [is not null] [the specified val]. - - - - - - Determines whether the specified val is null. - - - - - - Determines whether [is between and] [the specified val1]. - - The val1. - The val2. - - - - - Determines whether [is equal to] [the specified val]. - - The val. - - - - - Determines whether [is not equal to] [the specified val]. - - The val. - - - - - Gets or sets the condition. - - The condition. - - - - Gets or sets the name of the column. - - The name of the column. - - - - Gets or sets the fully qualified name of the column. - - The name of the column. - - - - Gets or sets the string fragment used when assembling the text of query. - - The construction fragment. - - - - Gets or sets the comparison. - - The comparison. - - - - Gets or sets the parameter value. - - The parameter value. - - - - Gets or sets the start value. - - The start value. - - - - Gets or sets the end value. - - The end value. - - - - Gets or sets the in values. - - The in values. - - - - Gets or sets the in select. - - The in select. - - - - Gets or sets the name of the parameter. - - The name of the parameter. - - - - Gets or sets the type of the db. - - The type of the db. - - - - Gets or sets a value indicating whether this constraint is an Aggregate. - - - true if this instance is aggregate; otherwise, false. - - - - - returns the set of all aliases produced by a query source - - - - - Removes joins expressions that are identical to joins that already exist - - - - - MySQL specific QueryLanguage - - - - - - Defines the language rules for the query provider - - - - - Determines whether the CLR type corresponds to a scalar data type in the query language - - - - - - - Determines whether the given expression can be represented as a column in a select expressionss - - - - - - - Provides language specific query translation. Use this to apply language specific rewrites or - to make assertions/validations about the query. - - - - - - - Converts the query expression into text of this query language - - - - - - - Determine which sub-expressions must be parameters - - - - - - - Creates a set of SQL commands for synchronizing your database with your object set - - - - - Type related helper methods - - - - - SQLite specific QueryLanguage - - - - - Adds relationship to query results depending on policy - - - - - Holds list of tables, views, stored procedures, etc. - - - - - - - - - - - Initializes a new instance of the class. - - The query. - - - - Gets the type of the native. - - Type of the db. - - - - - Generates SQL for all the columns in table - - Table containing the columns. - - SQL fragment representing the supplied columns. - - - - - Generates from list. - - - - - - Sets the column attributes. - - The column. - - - - - Builds the paged select statement. - - - - - - Builds the delete query. - - The item. - - - - - Builds the insert query. - - The item. - - - - - Builds the update query. - - The item. - - - - - For Jeff Atwood - http://www.codinghorror.com/blog/archives/000989.html - - - A class which wraps an inline SQL call - - Updated to support MySQL user and system variables. - - If the connection string contains "Allow User Variables=true" and the provider - is MySQL, the following syntax is supported: - - @parametername - a command parameter - @@uservariable - a MySQL user variable - @@@servervariable - a MySQL server variable - - eg: UPDATE company SET next_job_id = @@job_id:=next_job_id+1 WHERE company_id=@company_id; - SELECT @@job_id; - - where: @company_id is a command parameter. - @@job_id is a MySql user variable. - - - - - - - Initializes a new instance of the class. - Warning: This method assumes the default provider is intended. - Call InlineQuery(string providerName) if this is not the case. - - The SQL. - - - - Initializes a new instance of the class. - - The SQL. - The values. - - - - Initializes a new instance of the class. - - The provider. - - - - Gets the command. - - - - - - Executes the specified SQL. - - - - - Executes the scalar. - - The type of the result. - - - - - Executes the typed list. - - - - - - - Executes the reader. - - - - - - Initializes a new instance of the class. - Warning: This method assumes the default provider is intended. - Call InlineQuery(string providerName) if this is not the case. - - The SQL. - - - - Initializes a new instance of the class. - - The SQL. - The values. - - - - Initializes a new instance of the class. - - The provider. - - - - A holder for 1 or more queries to be executed together - - - - - Builds the SQL statement. - - - - - - Executes this instance. - - - - - - Executes the queries in and returns a multiple result set reader. - - - - - - Gets a command containing all the queued queries. - - - - - - Queues the specified query. - - The query. - - - - Queues the specified query. - - - The query. - - - - Queues a query for use in a transaction. - - The qry. - - - - Queues a query for use in a transaction. - - The CMD. - - - - Queues a query for use in a transaction. - - The SQL. - The parameters. - - - - Executes the transaction. - - - - - TSQL specific QueryLanguage - - - - - Attempts to rewrite cross-apply and outer-apply joins as inner and left-outer joins - - - - - Writes out an expression tree (including DbExpression nodes) in a C#-ish syntax - - - - - Writes out an expression tree in a C#-ish syntax - - - - - A basic abstract LINQ query provider - - - - - Optional interface for IQueryProvider to implement Query<T>'s QueryText property. - - - - - Simple implementation of the IGrouping<TKey, TElement> interface - - - - - - - Formats a query expression into TSQL language syntax - - - - - Formats a query expression into TSQL language syntax - - - - - rewrites nested projections into client-side joins - - - - - Defines mapping information and rules for the query provider - - - - - Determines if a give CLR type is mapped as a database entity - - - - - - - Deterimines is a property is mapped onto a column or relationship - - - - - - - Determines if a property is mapped onto a column - - - - - - - Determines if a property represents or is part of the entities unique identity (often primary key) - - - - - - - Determines if a property is mapped as a relationship - - - - - - - The type of the entity on the other side of the relationship - - - - - - - The name of the corresponding database table - - - - - - - The name of the corresponding table column - - - - - - - A sequence of all the mapped members - - - - - - - Determines if a relationship property refers to a single optional entity (as opposed to a collection.) - - - - - - - Get a query expression that selects all entities from a table - - - - - - - Gets an expression that constructs an entity instance relative to a root. - The root is most often a TableExpression, but may be any other experssion such as - a ConstantExpression. - - - - - - - - Get the members for the key properities to be joined in an association relationship - - - - - - - - Get an expression for a mapped property relative to a root expression. - The root is either a TableExpression or an expression defining an entity instance. - - - - - - - - Get a function that coerces an a sequence of one type into another type. - This is primarily used for aggregators stored in ProjectionExpression's, which are used to represent the - final transformation of the entire result set of a query. - - The expected type. - The actual type. - - - - - Apply mapping translations to this expression - - - - - - - The language related to the mapping - - - - - A LINQ IQueryable query provider that executes database queries over a DbConnection - - - - - DbQueryProvider constrcutor that allows for external control of policy - to allow for new types of databases. - - - - - Converts the query expression into text that corresponds to the command that would be executed. - Useful for debugging. - - - - - - - Execute the query expression (does translation, etc.) - - - - - - - Convert the query expression into an execution plan - - - - - - - Do all query translations execpt building the execution plan - - - - - - - Determines whether a given expression can be executed locally. - (It contains no parts that should be translated to the target environment.) - - - - - - - Execute an actual query specified in the target language using the sADO connection - - - - - - - - - Get an IEnumerable that will execute the specified query when enumerated - - - - - - - - - Get an ADO command object initialized with the command-text and parameters - - - - - - - - - Write a command to the log - - - - - - - - - - - Initializes a new instance of the class. - - From. - To. - Type of the join. - - - - Gets the join type value. - - The j. - - - - - - Gets or sets the type. - - The type. - - - - Gets or sets from column. - - From column. - - - - Gets or sets to column. - - To column. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Singles the specified expression. - - - The expression. - - - - - Singles the specified key. - - - The key. - - - - - Retrieves subset of records from the database matching the expression - - - - - Gets the paged. - - - Index of the page. - Size of the page. - - - - - Gets the paged. - - - The sort by. - Index of the page. - Size of the page. - - - - - Adds the specified item, setting the key if available. - - - The item. - - - - - Adds a lot of the items using a transaction. - - - The items. - - - - Updates the specified item. - - - The item. - - - - - Updates lots of items using a transaction. - - - The items. - - - - - Deletes the specified key. - - - The key. - - - - - Deletes 1 or more items. - - - The expression. - - - - - Deletes 1 or more items. - - - The items. - - - - - Migrates this instance. - - - - - - Formats a query expression into TSQL language syntax - - - - - Returns an Object with the specified Type and whose value is equivalent to the specified object. - - An Object that implements the IConvertible interface. - - An object whose Type is conversionType (or conversionType's underlying type if conversionType - is Nullable<>) and whose value is equivalent to value. -or- a null reference, if value is a null - reference and conversionType is not a value type. - - - This method exists as a workaround to System.Convert.ChangeType(Object, Type) which does not handle - nullables as of version 2.0 (2.0.50727.42) of the .NET Framework. The idea is that this method will - be deleted once Convert.ChangeType is updated in a future version of the .NET Framework to handle - nullable types, so we want this to behave as closely to Convert.ChangeType as possible. - This method was written by Peter Johnson at: - http://aspalliance.com/author.aspx?uId=1026. - - - - - - Process the passed-in LINQ expression - - - - - - Initializes the shared connection. - - - - - - Initializes the shared connection. - - The shared connection string. - - - - - Resets the shared connection. - - - - - Adds the params. - - The CMD. - The qry. - - - - Converts a data reader into a sequence of objects using a projector function on each row - - - The reader. - The fn projector. - - - - - Gets a value indicating whether [current connection string is default]. - - - true if [current connection string is default]; otherwise, false. - - - - - Gets or sets the current shared connection. - - The current shared connection. - - - - Creates a reusable, parameterized representation of a query that caches the execution plan - - - - - Summary for the Files class - - - - - Read a text file and obtain it's contents. - - The complete file path to write to. - String containing the content of the file. - - - - Creates or opens a file for writing and writes text to it. - - The complete file path to write to. - A String containing text to be written to the file. - - - - Update text within a file by replacing a substring within the file. - - The complete file path to write to. - A String to be replaced. - A String to replace all occurrences of lookFor. - - - - Writes out a string to a file. - - The complete file path to write to. - A String containing text to be written to the file. - - - - Fetches a web page - - The URL. - - - - - Gets a value indicating whether this instance is numeric. - - - true if this instance is numeric; otherwise, false. - - - - - Gets a value indicating whether this instance is date time. - - - true if this instance is date time; otherwise, false. - - - - - Gets a value indicating whether this instance is string. - - true if this instance is string; otherwise, false. - - - - Gets a value indicating whether this instance is numeric. - - - true if this instance is numeric; otherwise, false. - - - - - Gets a value indicating whether this instance is date time. - - - true if this instance is date time; otherwise, false. - - - - - Gets a value indicating whether this instance is string. - - true if this instance is string; otherwise, false. - - - - Summary for the ReservedColumnName class - - - - - A schema generator for your DB - - - - - Builds a CREATE TABLE statement. - - - - - - - Builds a DROP TABLE statement. - - Name of the table. - - - - - Adds the column. - - Name of the table. - The column. - - - - Alters the column. - - The column. - - - - Removes the column. - - Name of the table. - Name of the column. - - - - - Gets the type of the native. - - Type of the db. - - - - - Generates the columns. - - Table containing the columns. - - SQL fragment representing the supplied columns. - - - - - Sets the column attributes. - - The column. - - - - - Builds a CREATE TABLE statement. - - - - - - - Builds a DROP TABLE statement. - - Name of the table. - - - - - Adds the column. - - Name of the table. - The column. - - - - - Alters the column. - - The column. - - - - Removes the column. - - Name of the table. - Name of the column. - - - - - Gets the type of the native. - - Type of the db. - - - - - Generates the columns. - - Table containing the columns. - - SQL fragment representing the supplied columns. - - - - - Sets the column attributes. - - The column. - - - - - Gets an ITable from the DB based on name - - - - - Creates a list of table names - - - - - Sets the column attributes. - - The column. - - - - - Gets the type of the db. - - Type of the SQL. - - - - - Returns Schema instance with empty lists. - - - - - Rewrites nested singleton projection into server-side joins - - - - - Initializes the class. - - - - - Strips the last specified chars from a string. - - The source string. - The remove from end. - - - - - Strips the last specified chars from a string. - - The source string. - The back down to. - - - - - Plurals to singular. - - The source string. - - - - - Singulars to plural. - - The source string. - - - - - Make plural when count is not one - - The number of things - The source string. - - - - - Removes the specified chars from the beginning of a string. - - The source string. - The remove from beginning. - - - - - Removes chars from the beginning of a string, up to the specified string - - The source string. - The remove up to. - - - - - Strips the last char from a a string. - - The source string. - - - - - Strips the last char from a a string. - - The source string. - - - - - Fasts the replace. - - The original. - The pattern. - The replacement. - - - - - Fasts the replace. - - The original. - The pattern. - The replacement. - Type of the comparison. - - - - - Returns text that is located between the startText and endText tags. - - The source string. - The text from which to start the crop - The endpoint of the crop - - - - - Removes excess white space in a string. - - The source string. - - - - - Removes all non-alpha numeric characters in a string - - The source string. - - - - - Creates a string array based on the words in a sentence - - The source string. - - - - - Strips all HTML tags from a string - - The HTML string. - - - - - Strips all HTML tags from a string and replaces the tags with the specified replacement - - The HTML string. - The HTML place holder. - - - - - Converts a generic List collection to a single comma-delimitted string. - - The list. - - - - - Converts a generic List collection to a single string using the specified delimitter. - - The list. - The delimiter. - - - - - Strips the specified input. - - The source string. - The strip value. - - - - - Converts ASCII encoding to Unicode - - The ASCII code. - - - - - Converts Text to HTML-encoded string - - The text string. - - - - - Converts HTML-encoded bits to Text - - The entity text. - - - - - Formats the args using String.Format with the target string as a format string. - - The format string passed to String.Format - The args passed to String.Format - - - - - Strings to enum. - - - The value. - - - - - Fills the entities. - - - - - Converts US State Name to it's two-character abbreviation. Returns null if the state name was not found. - - US State Name (ie Texas) - - - - - Converts a two-character US State Abbreviation to it's official Name Returns null if the abbreviation was not found. - - US State Name (ie Texas) - - - - - Fills the US States. - - - - - Type related helper methods - - - - - Removes the column. - - - - - - - - Sets the column attributes. - - The column. - - - - - Gets the type of the db. - - Type of the SQL. - - - - - - - - - - - - - - - Initializes a new instance of the class. - - The provider. - - - - Validates the query. - - - - - Finds the column. - - Name of the column. - - - - - Wheres the specified column name. - - Name of the column. - - - - - Wheres the specified column. - - The column. - - - - - Wheres the specified agg. - - The agg. - - - - - Ors the specified column name. - - Name of the column. - - - - - Ors the specified column. - - The column. - - - - - Ors the specified agg. - - The agg. - - - - - Ors the expression. - - Name of the column. - - - - - Opens the expression. - - - - - - Closes the expression. - - - - - - Ands the specified column name. - - Name of the column. - - - - - Ands the specified column. - - The column. - - - - - Ands the specified agg. - - The agg. - - - - - Ands the expression. - - Name of the column. - - - - - Returns the currently set SQL statement for this query object - - - - - - Builds the SQL statement. - - - - - - Froms the specified TBL. - - The TBL. - - - - - Froms the specified TBL. - - Name of the table. - - - - - Froms the specified TBL. - - - - - - - Creates an inner join based on the passed-in column names - - - - - - - - - Creates an Inner Join, guessing based on Primary Key matching - - - - - - - Inners the join. - - From column. - To column. - - - - - Outers the join. - - From column. - To column. - - - - - Crosses the join. - - From column. - To column. - - - - - Lefts the inner join. - - From column. - To column. - - - - - Rights the inner join. - - From column. - To column. - - - - - Lefts the outer join. - - From column. - To column. - - - - - Rights the outer join. - - From column. - To column. - - - - - Nots the equal join. - - From column. - To column. - - - - - Orders the asc. - - The columns. - - - - - Orders the desc. - - The columns. - - - - - Pageds the specified current page. - - The current page. - Size of the page. - - - - - Pageds the specified current page. - - The current page. - Size of the page. - The id column. - - - - - Executes this instance. - - - - - - Executes the reader. - - - - - - Executes the scalar. - - - - - - Executes the scalar. - - The type of the result. - - - - - Gets the record count. - - - - - - Executes the typed list. - - - - - - - Executes the typed list. - - - - - - - Executes the query and returns the result as a single item of T - - The type of item to return - - - - Executes the transaction. - - The queries. - - - - Executes the transaction. - - The queries. - Name of the connection string. - - - - Gets or sets the open paren count. - - The open paren count. - - - - Gets or sets the closed paren count. - - The closed paren count. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The table. - The provider. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Removes one or more SelectExpression's by rewriting the expression tree to not include them, promoting - their from clause expressions and rewriting any column expressions that may have referenced them to now - reference the underlying data directly. - - - - - Rewrites take and skip expressions into uses of TSQL row_number function - - - - - Translates accesses to relationship members into projections or joins - - - - - Determines if two expressions are equivalent. Supports DbExpression nodes. - - - - - Compare two expressions to determine if they are equivalent - - - - - - - - - - Initializes a new instance of the class. - - The provider. - The columns. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The aggregates. - - - - Initializes a new instance of the class. - - The provider. - The aggregates. - - - - Initializes a new instance of the class. - - The columns. - - - - Initializes a new instance of the class. - WARNING: This overload should only be used with applications that use a single provider! - - The columns. - - - - Alls the columns from. - - - - - - - Expressions the specified SQL expression. - - The SQL expression. - - - - - Tops the specified top. - - The top. - - - - - Gets the type of the native. - - Type of the db. - - - - - Generates the columns. - - Table containing the columns. - - SQL fragment representing the supplied columns. - - - - - Builds a CREATE TABLE statement. - - - - - - - Sets the column attributes. - - The column. - - - - - Gets the type of the db. - - Type of my SQL. - - - - - Rewrite aggregate expressions, moving them into same select expression that has the group-by clause - - - - - Replaces references to one specific instance of an expression node with another node. - Supports DbExpression nodes - - - - - Summary for the Dates class - - - - - Returns a date in the past by days. - - The days. - - - - - Returns a date in the future by days. - - The days. - - - - - Returns a date in the past by hours. - - The hours. - - - - - Returns a date in the future by hours. - - The hours. - - - - - Returns a date in the past by minutes - - The minutes. - - - - - Returns a date in the future by minutes. - - The minutes. - - - - - Gets a date in the past according to seconds - - The seconds. - - - - - Gets a date in the future by seconds. - - The seconds. - - - - - Diffs the specified date. - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Returns a double indicating the number of days between two dates (past is negative) - - The date one. - The date two. - - - - - Displays the difference in time between the two dates. Return example is "12 years 4 months 24 days 8 hours 33 minutes 5 seconds" - - The start time. - The end time. - - - - - Counts the number of weekdays between two dates. - - The start time. - The end time. - - - - - Counts the number of weekends between two dates. - - The start time. - The end time. - - - - - Verifies if the object is a date - - The dt. - - true if the specified dt is date; otherwise, false. - - - - - Checks to see if the date is a week day (Mon - Fri) - - The dt. - - true if [is week day] [the specified dt]; otherwise, false. - - - - - Checks to see if the date is Saturday or Sunday - - The dt. - - true if [is week end] [the specified dt]; otherwise, false. - - - - - Displays the difference in time between the two dates. Return example is "12 years 4 months 24 days 8 hours 33 minutes 5 seconds" - - The start time. - The end time. - - - - - Given a datetime object, returns the formatted month and day, i.e. "April 15th" - - The date to extract the string from - - - - - Given a datetime object, returns the formatted day, "15th" - - The date to extract the string from - - - - - Remove leading strings with zeros and adjust for singular/plural - - The STR. - The previous STR. - The t. - - - - - Replaces references to one specific instance of an expression node with another node - - - - - Moves order-bys to the outermost select if possible - - - - - Add a sequence of order expressions to an accumulated list, prepending so as - to give precedence to the new expressions over any previous expressions - - - - - - Rebind order expressions to reference a new alias and add to column declarations if necessary - - - - - Defines query execution and materialization policies. - - - - - Determines if a relationship property is to be included in the results of the query - - - - - - - Determines if a relationship property is included, but the query for the related data is - deferred until the property is first accessed. - - - - - - - Provides policy specific query translations. This is where choices about inclusion of related objects and how - heirarchies are materialized affect the definition of the queries. - - - - - - - Converts a query into an execution plan. The plan is an function that executes the query and builds the - resulting objects. - - - - - - - - The mapping related to the policy. - - - - - A simple query mapping that attempts to infer mapping from naming conventionss - - - - - Summary for the Numbers class - - - - - Determines whether a number is a natural number (positive, non-decimal) - - The s item. - - true if [is natural number] [the specified s item]; otherwise, false. - - - - - Determines whether [is whole number] [the specified s item]. - - The s item. - - true if [is whole number] [the specified s item]; otherwise, false. - - - - - Determines whether the specified s item is integer. - - The s item. - - true if the specified s item is integer; otherwise, false. - - - - - Determines whether the specified s item is number. - - The s item. - - true if the specified s item is number; otherwise, false. - - - - - Determines whether the specified value is an even number. - - The value. - - true if the specified value is even; otherwise, false. - - - - - Determines whether the specified value is an odd number. - - The value. - - true if the specified value is odd; otherwise, false. - - - - - Generates a random number with an upper bound - - The high. - - - - - Generates a random number between the specified bounds - - The low. - The high. - - - - - Generates a random double - - - - - - This set of classes abstracts out commands and their parameters so that - the DataProviders can work their magic regardless of the client type. The - System.Data.Common class was supposed to do this, but sort of fell flat - when it came to MySQL and other DB Providers that don't implement the Data - Factory pattern. Abstracts out the assignment of parameters, etc - - - - - Gets or sets the size. - - The size. - - - - Gets or sets the mode. - - The mode. - - - - Gets or sets the name of the parameter. - - The name of the parameter. - - - - Gets or sets the parameter value. - - The parameter value. - - - - Gets or sets the type of the data. - - The type of the data. - - - - Summary for the QueryParameterCollection class - - - - - Checks to see if specified parameter exists in the current collection - - - - - - - returns the specified QueryParameter, if it exists in this collection - - - - - - - Adds the specified parameter name. - - Name of the parameter. - The value. - - - - Adds the specified parameter name. - - Name of the parameter. - The value. - Type of the data. - - - - Adds the specified parameter name. - - Name of the parameter. - The value. - Type of the data. - The mode. - - - - Summary for the QueryCommandCollection class - - - - - Summary for the QueryCommand class - - - - - - - - - - Initializes a new instance of the class. - - The SQL. - The provider. - - - - Determines whether [has output params]. - - - true if [has output params]; otherwise, false. - - - - - Adds the parameter. The public AddParameter methods should call this one. - - Name of the parameter. - The parameter value. - Size of the max. - Type of the db. - The direction. - - - - Adds the parameter. - - Name of the parameter. - The parameter value. - Type of the data. - The parameter direction. - - - - Adds the parameter. - - Name of the parameter. - The parameter value. - Type of the data. - - - - Adds the parameter. - - Name of the parameter. - The parameter value. - - - - Adds the output parameter. - - Name of the parameter. - Size of the max. - Type of the db. - - - - Adds the output parameter. - - Name of the parameter. - Size of the max. - - - - Adds the output parameter. - - Name of the parameter. - - - - Adds the output parameter. - - Name of the parameter. - Type of the db. - - - - Adds a return parameter (RETURN_VALUE) to the command. - - - - - - Suggested by feroalien@hotmail.com - Issue 11 fix - - - - - - Gets or sets the command timeout (in seconds). - - The command timeout. - - - - Gets or sets the type of the command. - - The type of the command. - - - - Gets or sets the command SQL. - - The command SQL. - - - - Gets or sets the parameters. - - The parameters. - - - - A default implementation of IQueryable for use with QueryProvider - - - - - Removes column declarations in SelectExpression's that are not referenced - - - - - - - - - Rewrites an expression tree so that locally isolatable sub-expressions are evaluated and converted into ConstantExpression nodes. - - - - - Performs evaluation and replacement of independent sub-trees - - The root of the expression tree. - A function that decides whether a given expression node can be part of the local function. - A new tree with sub-trees evaluated and replaced. - - - - Performs evaluation and replacement of independent sub-trees - - The root of the expression tree. - A new tree with sub-trees evaluated and replaced. - - - - Evaluates and replaces sub-trees when first candidate is reached (top-down) - - - - - Performs bottom-up analysis to determine which nodes can possibly - be part of an evaluated sub-tree. - - - - - Removes column declarations in SelectExpression's that are not referenced - - - - - Converts LINQ query operators to into custom DbExpression's - - - - - returns the set of all aliases produced by a query source - - - - - Result from calling ColumnProjector.ProjectColumns - - - - - Splits an expression into two parts - 1) a list of column declarations for sub-expressions that must be evaluated on the server - 2) a expression that describes how to combine/project the columns back together into the correct result - - - - - Nominator is a class that walks an expression tree bottom up, determining the set of - candidate expressions that are possible columns of a select expression - - - - - Converts the string method calls Contains,EndsWith and StartsWith into queries - - The MethodCall we are attempting to map to a query. - an expression tree. - - - - Executes the specified SQL. - - - - - Executes the scalar. - - The type of the result. - - - - - Executes the typed list. - - - - - - - Executes the reader. - - - - - - Enum for General SQL Functions - - - - - - - - - - Counts the specified col. - - The col. - - - - - Counts the specified col. - - The col. - The alias. - - - - - Counts the specified column name. - - Name of the column. - - - - - Counts the specified column name. - - Name of the column. - The alias. - - - - - Sums the specified col. - - The col. - - - - - Sums the specified column name. - - Name of the column. - - - - - Sums the specified col. - - The col. - The alias. - - - - - Sums the specified column name. - - Name of the column. - The alias. - - - - - Groups the by. - - The col. - - - - - Groups the by. - - Name of the column. - - - - - Groups the by. - - The col. - The alias. - - - - - Groups the by. - - Name of the column. - The alias. - - - - - Avgs the specified col. - - The col. - - - - - Avgs the specified column name. - - Name of the column. - - - - - Avgs the specified col. - - The col. - The alias. - - - - - Avgs the specified column name. - - Name of the column. - The alias. - - - - - Maxes the specified col. - - The col. - - - - - Maxes the specified column name. - - Name of the column. - - - - - Maxes the specified col. - - The col. - The alias. - - - - - Maxes the specified column name. - - Name of the column. - The alias. - - - - - Mins the specified col. - - The col. - - - - - Mins the specified column name. - - Name of the column. - - - - - Mins the specified col. - - The col. - The alias. - - - - - Mins the specified column name. - - Name of the column. - The alias. - - - - - Variances the specified col. - - The col. - - - - - Variances the specified column name. - - Name of the column. - - - - - Variances the specified col. - - The col. - The alias. - - - - - Variances the specified column name. - - Name of the column. - The alias. - - - - - Standards the deviation. - - The col. - - - - - Standards the deviation. - - Name of the column. - - - - - Standards the deviation. - - The col. - The alias. - - - - - Standards the deviation. - - Name of the column. - The alias. - - - - - Initializes a new instance of the class. - - Name of the column. - Type of the aggregate. - - - - Initializes a new instance of the class. - - Name of the column. - The alias. - Type of the aggregate. - - - - Initializes a new instance of the class. - - The column. - Type of the aggregate. - - - - Initializes a new instance of the class. - - The column. - The alias. - Type of the aggregate. - - - - Gets the type of the function. - - The agg. - - - - - Gets the SQL function call without an alias. Example: AVG(UnitPrice). - - - - - - Overrides ToString() to return the SQL Function call - - - - - - Gets or sets the type of the aggregate. - - The type of the aggregate. - - - - Gets or sets the name of the column. - - The name of the column. - - - - Gets or sets the alias. - - The alias. - - - - Common interface for controlling defer-loadable types - - - - - A list implementation that is loaded the first the contents are examined - - - - - - returns the list of SelectExpressions accessible from the source expression - - - - - Builds an execution plan for a query expression - - - - - columns referencing the outer alias are turned into special named-value parameters - - - - - Extended node types for custom expressions - - - - - A custom expression node that represents a table reference in a SQL query - - - - - A custom expression node that represents a reference to a column in a SQL query - - - - - A declaration of a column in a SQL SELECT expression - - - - - An SQL OrderBy order type - - - - - A pairing of an expression and an order type for use in a SQL Order By clause - - - - - A custom expression node used to represent a SQL SELECT expression - - - - - A kind of SQL join - - - - - A custom expression node representing a SQL join clause - - - - - Allows is-null tests against value-types like int and float - - - - - A custom expression representing the construction of one or more result objects from a - SQL select expression - - - - - Summary for the Validation class - - - - - Determines whether the specified eval string contains only alpha characters. - - The eval string. - - true if the specified eval string is alpha; otherwise, false. - - - - - Determines whether the specified eval string contains only alphanumeric characters - - The eval string. - - true if the string is alphanumeric; otherwise, false. - - - - - Determines whether the specified eval string contains only alphanumeric characters - - The eval string. - if set to true [allow spaces]. - - true if the string is alphanumeric; otherwise, false. - - - - - Determines whether the specified eval string contains only numeric characters - - The eval string. - - true if the string is numeric; otherwise, false. - - - - - Determines whether the specified email address string is valid based on regular expression evaluation. - - The email address string. - - true if the specified email address is valid; otherwise, false. - - - - - Determines whether the specified string is lower case. - - The input string. - - true if the specified string is lower case; otherwise, false. - - - - - Determines whether the specified string is upper case. - - The input string. - - true if the specified string is upper case; otherwise, false. - - - - - Determines whether the specified string is a valid GUID. - - The GUID. - - true if the specified string is a valid GUID; otherwise, false. - - - - - Determines whether the specified string is a valid US Zip Code, using either 5 or 5+4 format. - - The zip code. - - true if it is a valid zip code; otherwise, false. - - - - - Determines whether the specified string is a valid US Zip Code, using the 5 digit format. - - The zip code. - - true if it is a valid zip code; otherwise, false. - - - - - Determines whether the specified string is a valid US Zip Code, using the 5+4 format. - - The zip code. - - true if it is a valid zip code; otherwise, false. - - - - - Determines whether the specified string is a valid Social Security number. Dashes are optional. - - The Social Security Number - - true if it is a valid Social Security number; otherwise, false. - - - - - Determines whether the specified string is a valid IP address. - - The ip address. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is a valid US phone number using the referenced regex string. - - The telephone number. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is a valid currency string using the referenced regex string. - - The currency string. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is a valid URL string using the referenced regex string. - - The URL string. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is consider a strong password based on the supplied string. - - The password. - - true if strong; otherwise, false. - - - - - Determines whether the specified string is a valid credit, based on matching any one of the eight credit card strings - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an American Express, Discover, MasterCard, or Visa - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an American Express card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an Carte Blanche card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an Diner's Club card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is a Discover card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an En Route card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is an JCB card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is a Master Card credit card - - The credit card. - - true if valid; otherwise, false. - - - - - Determines whether the specified string is Visa card. - - The credit card. - - true if valid; otherwise, false. - - - - - Cleans the credit card number, returning just the numeric values. - - The credit card. - - - - - Determines whether the credit card number, once cleaned, passes the Luhn algorith. - See: http://en.wikipedia.org/wiki/Luhn_algorithm - - The credit card number. - - - - - Determines whether the specified int array passes the Luhn algorith - - The int array to evaluate - - true if it validates; otherwise, false. - - - - - Determine whether the passed string is numeric, by attempting to parse it to a double - - The string to evaluated for numeric conversion - - true if the string can be converted to a number; otherwise, false. - - - - - Summary for the RegexPattern class - - - - - An enumeration value for no options configured. - - - - - The default set of options (right now the same as none). - - - - - Use this flag to let the repository run migrations. - - - - - - - - - - - - - - - - - - - - Summary for the Inflector class - - - - - Initializes the class. - - - - - Adds the irregular rule. - - The singular. - The plural. - - - - Adds the unknown count rule. - - The word. - - - - Adds the plural rule. - - The rule. - The replacement. - - - - Adds the singular rule. - - The rule. - The replacement. - - - - Makes the plural. - - The word. - - - - - Makes the singular. - - The word. - - - - - Applies the rules. - - The rules. - The word. - - - - - Converts the string to title case. - - The word. - - - - - Converts the string to human case. - - The lowercase and underscored word. - - - - - Convert string to proper case - - The source string. - - - - - Converts the string to pascal case. - - The lowercase and underscored word. - - - - - Converts text to pascal case... - - The text. - if set to true [remove underscores]. - - - - - Converts the string to camel case. - - The lowercase and underscored word. - - - - - Adds the underscores. - - The pascal cased word. - - - - - Makes the initial caps. - - The word. - - - - - Makes the initial lower case. - - The word. - - - - - Adds the ordinal suffix. - - The number. - - - - - Converts the underscores to dashes. - - The underscored word. - - - - - Summary for the InflectorRule class - - - - - - - - - - - - - - - Initializes a new instance of the class. - - The regex pattern. - The replacement text. - - - - Applies the specified word. - - The word. - - - - - - - - - - Equals to. - - The value. - - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - The parameter is null. - - - - Serves as a hash function for a particular type. - - - A hash code for the current . - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The table. - - - - Sets the specified column name. - - Name of the column. - - - - - Sets the expression. - - The column. - - - - - Executes this instance. - - - - - - - - - - - Initializes a new instance of the class. - - The provider. - - - - Sets the specified columns. - - The columns. - - - - - Parses the object value. - - The expression. - - - - - Parses the passed-in Expression into exclusive (WHERE x=y) constraints. - - The exp. - - - - - Parses the passed-in Expression into exclusive (WHERE x=y) constraint. - - The expression. - - - - - Determines whether the specified exp is constraint. - - The exp. - - true if the specified exp is constraint; otherwise, false. - - - - - Gets the constant value. - - The exp. - - - - - - - - - - - Initializes a new instance of the class. - - The query. - - - - Builds the paged select statement. - - - - - - Builds the insert statement. - - - - - - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The provider. - - - - Builds the SQL statement. - - - - - - Adds the specified columns into a new Insert object. - - - The columns. - - - - - Adds the specified columns into a new Insert object. - - - The TBL. - - - - - Inits this instance. - - - - - - Values the specified column. - - The column. - The column value. - - - - - Values the specified column. - - The column. - The column value. - Type of the db. - - - - - Valueses the specified values. - - The values. - - - - - Values the expression. - - The values. - - - - - Returns a that represents the current . - - - A that represents the current . - - - - - Executes this instance. - - - - - - Removes select expressions that don't add any additional semantic value - - - - - Removes duplicate column declarations that refer to the same underlying column - - - - - Duplicate the query expression by making a copy with new table aliases - - - - - Rewrite all column references to one or more aliases to a new single alias - - - - - Determines if a SelectExpression contains any aggregate expressions - - - - - Indicates that a per-thread shared DbConnection object should be used the default DataProvider - (or alternativley a specific DataProvider if one is given) when communicating with the database. - This class is designed to be used within a using () {} block and in conjunction with a TransactionScope object. - It's purpose is to force a common DbConnection object to be used which has the effect of avoiding promotion - of a System.Transaction ambient Transaction to the DTC where possible. - When this class is created, it indicates to the underlying DataProvider that is should use a shared DbConnection - for subsequent operations. When the class is disposed (ie the using() {} block ends) it will indicate to the - underlying provider that it should no longer it's current shared connection and should Dispose() it. - - - - - Used to support nesting. By keeping a stack of all instances of the class that are created on this thread - thread we know when it is safe to Reset the underlying shared connection. - - - - - Indicates to the default DataProvider that it should use a per-thread shared connection. - - - - - Indicates to the default DataProvider that it should use a per-thread shared connection using the given connection string. - - The connection string. - Name of the provider. - - - - Indicates to the specified DataProvider that it should use a per-thread shared connection. - - The data provider. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Releases unmanaged and - optionally - managed resources - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Provides access to underlying connection that is shared per thread - - The current connection. - - - - Used within SubSonic to automatically manage a SqlConnection. If a shared connection is available - for the specified provider on the current thread, that shared connection will be used. - Otherwise, a new connection will be created. - Note that if a shared connection is used, it will NOT be automatically disposed - that is up to the caller. - Lifetime management of the shared connection is taken care of by using a - If a new connection is created, it will be automatically disposed when this AutomaticConnectionScope object - is disposed. - - - - - Initializes a new instance of the class. - - The provider. - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Releases unmanaged and - optionally - managed resources - - true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - - Gets the connection. - - - - - - - Gets the connection. - - The connection. - - - - Gets a value indicating whether this instance is using shared connection. - - - true if this instance is using shared connection; otherwise, false. - - - - diff --git a/Libraries/SubSonic.Core.dll b/Libraries/SubSonic.Core.dll deleted file mode 100644 index 94a2c0f3ffc153841adbe6023de2e161abc74689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310272 zcmeF434kO;m9VojtFx-Ix_hR&daCB`W?-76s=8sOIeLa`5Qh7Zo8i81NvxUyrR`w= zksIU?bQBL1*BcQ}TwT$1`PFr4@LqL15YJVX-)q-n_`mleGApaQXP8ku_FsA?Dqy27|!LpK1WU*66@r{e&ZKhIfl zt>etp|E;(6nkddFc#jr0crO)3O!@0{x`6%T;~8iEl(5YJ1{{YHB!4;l2PQtp8D4$P z%U0vR>jSo2QdUcM9E~KW4>y{Pvj8YJBX|Hr}1rZLn30LB}D zIsibF0jL82B{BeY06;DbKpg4gmQWpbh{*3{VGvLJUv`0N818r~^QE z3{VGvo*1AG05f8MIshPm28TKT6k~uo0QANHbpR;E0CfQ9ivj8YFe?VA13)=>X90CQr1IsnX#0qOuSF9xUs08PM@MI8VZ!~k^wSQrD;0iZtyr~|-23{VGv zZDN2r04$0D>Hx593{Z!+lj~fMEXkkSz;Wp~KN+_{om@IDGUYZX^rhn>O>P6MmyU}Z zxs6@KDH7y1ju5BFj@!6EoFX-DV~sdPUfjkF;uJ}78@G#7WW;T}Nt_}bZsSAZ6uEF4 zkBU5X8x3Qx*rN-RG z-r|(HavO(;Q)&tBh;u-ltHcQpfu1K$sS~$xxj3aZ+>pdUl}cKSPg}J*mb)S81J?^t zbAC0bRCo2Ww~0G1)PuGbqg6+X!g~att+l%)LAN9z zT&f%8jzk1dQlc#)NDd9Ks4Y2|K+NZbNJ$VOA3=1u@A!dFRA=5!o^up$TBwa1?Mt8= zZYS}c27e~{CcmB0gB_$P7yPKV)A74<5fT;DgPhkFl25Ht$VG@uup!9RedGLAmJB+` z*>&p9-2I(^Y&5?^pCdnLscmgeCZ9oP?h2F7Qd957|`A&M5fFuV|PT7<5A=Ke`gM zt#YJI;fU*@*S#Gh7;+!h_Yl9%>qYYFc(skXH6Y-Ml+;VyvB9t zfH_eebVIXqm0Kc8T zA{ZrERd;p6ok;D4dGQ_YdKSxzsGx8uAySX?$p1m!Fuw@j0%6TAF0AP*_{-Kyz~X2o z2{KUzsFD*E#qUSIA#>z*1Wff@t{fo_K_Oc|IlGoFC>TB_lWHZ;61RIs$HuZWoM>0V z^Q|h2cEexFWQ&=IDi6Zb5Ez)8@otvb#m>HH8Q=}x;09-Mb8tFP_6{68^39G%JLnLp zeChp0W+xSSIY_GWklPoL0vRY~nukkCy=Zqrx@+Zpv_SVA6rJsMF~jLe zyjrn!c{4(&J#TsMGcC^~3zf{x@{FoA{N4|qA+ zZcXA1s7)S>J{+pj=HW#Qj%v|=kUXGuNS)I6n303gm$#rSDMry7ay>fLmEZ~dl{9yU z@lo4@Hcxzl-N3Jn69a;Xj(^EtB9e9(iBE!{9)lINun@{x;oY zxcC`p`SDqNl8fUZW%WvGqv1jDBK0+l%Li))R{7N5&I9A@55X zuS4mY+PImv)DcqXpm_j4!Wn71r|_n3i(Yh~sWLhx>EN9iJQTyJZBMZm3F`0Ie6|(O zcdchT@qAA_jc;mRg68IzPMa4cbQoC|T`xL_SkVTO1<0d#hP%B8T@d);A^cW7imCm_ z65fy^X%3Y%kJ~ij8J=T`28zS*dePzhhV(c|de`|Z>Cv=BH+nH}mCN}nJ^;`FRu4ca zP2@-kJW75Lsh}~-ql-HR*D{eF8%()_#^rHH{ZcIhGjoGqJ4 zcN$(VI-TF}3=J_fxsKGWt*0{yNa{&E!`)Z@*PLc-Cxv@v+ zKQHzO{Sr;-mncfV1P|vSH#{E~a-+E0=(&J^gdXuIJs08#FEVMML+GJ}NL7ifU7V!B zBQ>kST7U!z8Og&6fe!Zo5!uOxs3*x@@T?YmQa|;mkFlv2T|!t_?HJd~s(dIh-F`h! zj}{SB+cj@PhU>ZJr9gr*9bljD(Yc9qX{=(Va)J!3vP*wt(`73s6tcOc@9^tcKYA(g zH2=1;Hzc*n1%!%6+F6sgFVi|npk+5{`b^o^NSg24b|#)yn#-o7nPt*kE@_^$X~fe? z^RiSL&w+hTnKXtmFDJ}0289$vUjl<=%ou*d7zq)^yn=U%F`7VPwKGN_EylRa@U%`O z-%672IFW3=YjH+jZsmI=ev_|+NWSZMr}EVV601F5flQNcjeKppxQZA_U5ICxS*Iv2 zs^)55;Whk7jff1bAl+=k+gAckbftKPLod3Px6E2!#hdivm1!{P4Jf=`Jvu(y62uLkVP#8(O>e6o-`6oTN!bj>q# z-6>HNCv@E<9ua(@OG1<`fez=ge)t+330=srbaln%e<(q&rW^FfhGc3@nB+6U+tg#I z&B@i!p>6#7!U_7c4xKRjhRnM`UeCJzxFFDh(gcX5UR|fZ!;$&6jFbATUJd+#AA63o zYGsi;I(gp5gC5dR2oy6Tb{yf|(W&R-xKHPK2@fqnM>uccy^JRwxx8C?xnD@ubm8w2 z&(qfPpm_e%dL9zbGuHD#@%&%wd00HZw4M)%=fA9n?A_=O*7J|z`IYs2LOj2=o==MB zH`eorcs5$kr^NGH>-n^Jo;4n2uV``pQ=AyvGWG~RB%1O=q9{KkSjPa(t8lf`F<^M{DgsnGq#WWA zI<7Ub0}(W7n+HRSwoN;I8F*ToB|lR~#2*%s{coyB+SW(J^E>PLsCa%a9)s6&M2@#H zbX+QQNX@Q(kZ3}TK%}!2ruxm78j=h>jIEy|9ffF^6jJvW5`U4&XHA?B6(u>;>#(ss za}flIrh=eU?1&&V1s!oO69m$Ngykk0%|W2ZORl+EqM7n#oTcQut;u(-B$M(5{%T=S zfyN{->FQp=+lyGJCmVKqBt5%K8r!Ui?E@alEN$b}gs1oftwFc2y`8`5ReLfTj@VC|XV+|fj34df_E z@p_Wmk;DgdX!iyHlBtwQ>Uewd^y=rBZ0}97eWT6x_$k>6M6;bK*%n*b9%r&WR#Loa za<*?a*)q@9?&~tQ`4%AK!*ptH^FDFzD9+H8)qtfMc#$hop@WhpH!c=3WrNL zqzc=sPtr!D4W*pXTgj<@4wWPhU0w^>g7Jrra>s-e1MhXBw-G$Fd*en>7wr^1_If&oZ9mKa&=C%e^zyN zwZE_0pRdm4-@NMlYJX34A^*zN{)&clSNprF{Q;o{Jg-Vh)!iQxJVNt?R`nt%9m(|< zg3g@v=6+f$qf1 zTY!Z@Z8vw~iUiQvpATw_-HEXTl9?0K`rHYqGdnCJnMzRe`e(NGS4b`VVqf5NR*Hk> zqb#|xxbR-e6TOe0?%LkHUibj6uIyNMhm(okk9(+`&FQi^>$(q0RM~(Ttn~r?0SMZl zB>#XU`RIn8UT4&I z#~4Beb0UU|LG{KMMqdz&(M{6qKFV)Ibp^V>Qk^atc}n}6LyH&^8Ge}9rQTw1W}I?w;cj5>p^zEY;IG^6=Ri9NG8v)DWSPdJM+%j2KoJ$k$6I8D@lQ0gi6 z6lacqS^|5B^%-@z#hGIgFZySG#y`tXw%D`L{}&w1NBId$NLY7%XnC=BOvtD&v5x3- z_-x`O^RvYnLo3JLJBuaB;Bj!@EK+V$Rg+ZV*~n~t#GnYDAYPJ4iW7cGsLIAvWo`POQa+PJ z=HWqo*m$N%%COoLC})$hXWq`5QofkiK4Q=yVI%8q!Pyt5%-fV}BvXqmZwZ#Y85?{Y z!Ntt7BY179T1F=4t@)OMV(=W*Qjpyrt(QVuy%eU_i>x~bqsSM;L|?_7u9p~1!loJgZ#A$u zbFnrvx@Ku@w%xe0s2=Qn${(J6){wB~cxtx3z<5@Rr&KH!E71?YQ!JLFr+A~P&=a0> zF7IJj)TS7|4!-(PeoONY&-Gh<151DtmnCX>j^~ymDWV^KgWvn5a;}n}Y8;RPnXx&c z(svb`-y}g$n-!L6$pyE!Bdp-?v$CuoxVrH@^rRoo23QrlmtT`k{@jTu&VKhN)xRe3 z(@Y4b$23}Qck~nfW)l98`bU!Rx2iuW&hB@rpWfD{zefE@&oz9RJF!a~IDA2>3mZP! zo!B)AIU>~`4!_8q*ewa!CDqFfhwj8^5;8B<+YR@)6U*WdHDrJe(d$`S4#P6byV0is z_jYWYB@Ay>A-k{J!otS==qlNI2!dDw(~>^=Eb;q)wr^QmGkM6yz4o4Mg0b9x_St8BCP97S9FY%^ zWhC8Uj26q)%3jwnCZ`zd1-fiyRKC_}vh(V_-Za@6ON+Mbh908Dhz-Ztuny@ex{A{b zG`wi82yiy~6%DKTB!qXFVABwzl&3o%O-O700g+1i+U~vi@F{V!HXQ|wHimYN6N!a6Mj^3BM<~5O21)uuk`DdjhBdwUjpaR&fOt1I8S#_?hCG1|c}ksG6#9+q zTvF41J*18`!+so^VL6AZU-QBU1TG1#-PYN{qPXlYcQQJ8?m-Dtq{@v(h>67BiM|op(5g{>r$;K0(IXv}EQv!hf|) zxEoNaYP!7UE>fa!o>Wk-H54p$){gD%RL02uw6cXdsIP#}8Dal!aXk#<=mJvD=ki*j zI>VGq^bECV0rZpMbYIA`8t${;d(0|cXO;xhPN^T(8( z9q2V?@7YR{3R-uret0>jLSY!rFeY#ODPDJ4h_X5MD2F?-rO8kP)V)lrmsRO|70yx+8#+aRDqF)d#JXVv8YX~uD3I?+}60@!FctI(~xyvO2 z?S(#NU-%ErtV0;gV>1QoPas7NKYl8e!3xRsv>TQiGJe+v%t63A+3=&9i|e=KEZRk< zda5t(2R|$*uKgKl;yk(}kN*Hr-s?KTn?KiFWVtyQtaMpIG!pt9H8@PP^AV5p}!(@ z=o_?qwDEo^Z7i8p4PXC&NkB&rJW;;V24y~P`D*hl3K_p9NqH|OQ?OX2A|3b}p&~PS zBcZ*S@VEHrBBSM~pl}60U247CZ6FIqe6^|VW*V!7rOG(&1+H9-TBzrMHncE1)YVqkurOg*nVE=bMQ@+fid494eUCV&-fr4am0ccbxs2ts zEZ@)QIu2_UN8a~N@vhfXKy3s{~DPtBApCwsj`X(Z3$N5@Mh5hpGgu0d6iPWo#vpJA3C@g)c3cM znVE^;@siqBV@(|!2T>0i4>|83Yh&= z86#(AV>K1`5>$HJ@`?5ukTlq^xzrR(n|K@(-9I@dX4>hPqn{^EoLOPGCw6wNpkH&6 ztYdItq%X$Zo#1ZuU$YWe*3`68L*hFjvOdQ;qMuS1r9!q?FlDW+Cg65rM4ckYT`K&g z?nsrTeAD8Ad>TsWFr33}!wvie09if1DY- z=&{nwY;mTEkZq`7Y2?v=HnM9fWTaH-PSZd7_Ec!kNU2O{D(&?W>Zc^ztq5(>0#l9c zoP?LsJSC&>^-|=RLz;DdxL^bOgOSBJZz4)vDn%T+ATu&Q+bFhJ(IeP|4Hl8w%9OiM z3QRVG<=^?eYV_WX<%1H9o;92(=8HvBjA0m4-q>*(85xL5k}NwgsMrT}$~u>`jweL& z-oc}tAbuHxN$Jsi?fqbHt2;j5c7n00pPh(EqUtra^wiz8ZCIq0j=F0a^$mEi%skNa z)n7HMxceo=^3%F|r8C@&$LSeIdRs=IMP1B|HMJeU>}Lls*~%@i(up;8;QjS`i=CAy z2M4=ys!?mDB2%07GTq1nEwW7|I zP@&gK3`O$0C#XtekzurRNN3^StU%F3g=}7{woog#VlGUDyV0p6psR^amv^TdohEN~ zQO=MzC2lOtJC`=9{6q}lgHq0o&Xk~hs z7b>hgguEz7-Bs}CS|TTk8mb4i=s7%bvHMKJ)-i0y?2q-A0tw2Y*Kyl zJIc8t;gdTi)4f7m(iurf{p{FrGR$o8$ZB9M5XId!A=EcoPFa#2!;(G|F*jg{eid2y zja?HqRM=V4VCq07ZhJCbU_>8u=VUC|>VNWMF9ylb3_m}1q|zXoNlfL(I6#nzP-iHr zE)pYR!O+8IM15FGQKjgq6&eSVf3uI6S6B@e&*QFk4*u6zhk3ex+LGazA%2S?wkb?2 zKhtr0p{LA46+H$8dM4pG7_v{o`w9k}awsQ4t)ZG1=c6)?=`?d{U~T8uUur*CVWtpv z4$J;o=qp6O`ILu zT7$@9t%oi-sqb1oo(8;e+G&8Lcdm2px_CbAIVVFe>kd|zBz+jtl@Tj57&VyJ>HZW( zxw$AxG()*yIrYReoHFyxInL5U44-7}_!jb|vtzC4zhp^Zj__b(2Uad-O<}HIuQa|! z(L7x;u(4#kUX7y^8$VCNbxEPhQHjQ{1s47ioH{^lOFoxOs*PE}G%-R&%^`~LM9Sng zwkJ}!3a9DQvU(nWCG;A7%8r0&(t_zwSYZ%_*=_rdjG4K_6Bt{K%2Bf-K_?^Hw&XVs zBb&LV3t_ra7V~ErOv^fVo{oe?@DN2S{@E6dbQhIX)+0LqMB91f=A?iz%=8=dbF>G~ zL5Tj>>Y~P5V72XM8u#NaE8C;_uy?R+td-VN8E4?n?B^av&bPLoQ^7X1neN22vs<9_ z{_Q%uoi@?g#p@>ryDI(TXVK5ugGCQd0nyCX(EwOreWiK5%DiM{xcZ#YJHvGJPd*oR z8@(qJD*CTJSNu#Gz1ul{CMBtEc&=3Kxwt(x-J-Iq%j4BWmDn-cI#?V&TTsg)usQ$; z*A$=*0O!U4bpSXo2B-tT`7uBp04|6D>Hu(I3{VGvi(-H}09+gc)B)fnF+d#vE{Or^ z*xwyH2f*T??4TRUnvBvcAXz1k;<)MnaA^!shuL@iChcN>(WixM#aK+U@-0>(GINlV zOb(N8wM1IXyOU=n&tW`dqt?>L@;-&gY+OUpug4&?oG7!`j>a74l zt!(l1*tf51o?;0k_FIf`oCBnvTQk7Kvp(#tmNy13GRZY;46kQETkrLCQtXB@HI5#W zp011mXQ(b(7Y65Y7}ndVQ~FK)b7zM)3KlQCSzhj#h^iZ2B_6F7FZu?kLs`=@fx6@3 z>V}H}Z~)iS6TRV^iDdB~F$uq}oN**n`p7>cE2Vu}+!^oB#hn!6Ev6Xle46v;^Qn#R zbDw8?^PUfUuE?4Gd1GcVpk9bwl_iD7K1j0}m?JQEiAeMpOui~NQ$^#A#Jl5pj7OdP z2{d+XA&t*Zymq;n|9sR-s=Y4w^YOjU?GFqVT|P6-aT66t-29ft75P3iZuk8&VnT0~ z`p<-~me-%8U)tJDIY#@Z>#H_=l|LWf!N%6sZ8Fdc#$PHumFjKjeGWu#Hy@(tDZ5*Z zfyuJGIq50}*W1XD%)@|JEvVh*BEi%UOiP;|7RFiAc<_4KW3hILZG6Zq56o*GqCc3~ z;nffHA~_kd=3V$XKfVl0X*n{Y;a>PL5UrLV7SQNY1$|bJspRxG+LlaBf~uXfWSq}a zhJ&T=F=v$Im`O$to2Ku8gfg4bGE)(YZspce0M$fa1umdf0R{NUU zk*6Ge5U0Kw-8<7z@0-N`Lq5kB&a`+i#3J&&N z{Q3%S%_DGy(T$uFzz9hWVy$^lq!xP`J@a)65Zrot>l|_WdT^k5D{i6CU{=abW*tV? zJ6Dh|l`8jAD1HzNek{up{Pk^edW@?+Ck4bpLGtO_*da>`=}U7iliH^}X2sUrIb3AP ziyos0!CHorH0)g|w6}J9B&u>to@(Uk5}&I}um=ekGL1=kulY^}S0anDZ?J$jV;f{r z!=h&enIEl%QH2eiEc9=1YnQSfUoYWDB9Tvn+P#u$Q{RCH7#tiGvMlRFP4vED;TL%MOHi z4URy|uzZzl^mnmunuXXws*cM~s!~-jSoeDtJG-51*1TNi3h&#tgQkUUbX#VMUicN* zDKcTs>>kHv+T}$;}RZk>WBzLL&U`x;CjNF!??vRNsRk;!p%xz8D=cO+2y-j zt|A3cVt_J<3WmNnc^NR~$xKmQqt3P`8J@^`+#jLkXlQZk-6@mS5e~Py(NeOgZ#Ut? zP2Cc%+)~FWm0ouBEU#Q3G(sfe?ksT+ccWc+8+(~$YA+K^NzV3>?3v^>Wg+Vt8|2Px zsdK~XHXE6LawA#+TUYg+*={N?8P1hB#$Bi_EC$8G`tE%AH3}|Pi*kn2``EqQr;^=h|1&$6TBMx$gj@ya-B6n(k6ziX^e*?|6c3c&qfhZ|QNBP3xT zNL=(^huDNU$4WkH)`9`kFO=q2MJu~&sAqIjJ)2c)e*iZFfK#a0WuTx~vZiTN`}RzG zr&H}J^PAJ{--o>CS+{4NZ{5D$?Q1Tl#N$`cZtO_R8)v6X&I(V^FvnjmI(1jK`6Q)@ zPb-@GmOfyH@HcfjQAQAYD3Jk$bT)X?Cliq-#tA4GX~$HqbDX3flRWGh_Z~{Pj1_0c z9TSoQhR^bD5$Q!Yf?@3#K((a#5p*?orwHo=r0}p`ntLBscqznX5J!6wuhcnuJ(ROy zz8AjkY(CnX_t51gc0TGQV*LVlOqh_59)}0@lME60XazCr+cb8jhtHe)QnrPdyqa3; zT)eptF}MItGtNizz*Wkyab&1&zKGDS92*XL{X_)CVgMpqXZgiO8F!+LJB>2V)qBjn z1UbEnfPsT=s>u_pVc*&(z0`Sqm(k0uWq2Kp=rX*tgMXp4)K$^rJlkB{GW_bXj|_nN zcmyub01rKZgQn7RtxI{2^2BLmT}IpzSHj}({VZI<=yzrO?65Sn4n|cQcj)hW{e8Rs zen5Z!S%1H*zu(ngw_D=(>hFO5R`qwe{wg*ZH+1Sg$njF9)?Uz%uS=*^W8#?Vkh^OG zrh6~=jTeE)bVzhVGZ@ZA`%)$B)u`tGdU_XzL)cRH6~A#Ri8zHV-IR7^W-(beII(4v z9l`Ks`c~0{X3u7^Q$Mn`w}mV?CqSzqEZ(yVl0Ca*_h_c<9{mJi&~3J#;xM~MtvyFf z0F?sfKw?Te7Zwa_IZZ4mshcb?V z6|~O6(*i^GL?EAB8w( z4*#R~tL~=^yHW;i4zZm}Yai_|Yp>kX^Jm*D%NU_V8CFR>gy*B*1HUmByeeNZ*37)H zzqC8OlkRdEV~S1fFP)oQc)Ajacboh3JAME^)lbs1ievGRKiC2r7`LGjlHBR|6`C2! zP3CLN`J5A_UNo)V>uD~b3|k8Tp5)+1hwwWH@KD~|w%EgQr}C+Z zB?L#9t=^pPEZWQ1I>d8;6WfSz#|{I7*x#1u1ElXc30j(m17zSaE`cUXoAE~f2tdsj z^Am0(^eG`_Irc4tvDm@yU|FuyJW~82bJkjw`%ooR3&)y=x#n*&Ax9AdLPQoB!-zdV zv3WEwP8y6$m>gVUzA!JR7hRfzOX8P%mu4c0^*xjFLB323Q~7>%IHOJxZPwqk0XIC=ed;g6w29GXdVx=E7v)G z0`K&J#RF5G_7V=;5)O6eHu?-rOd$(dtrz7H1N6M_g^*O6*-??Zds$u*t|YWQ+$Id# zL%FZO@PIQ-!rDmWRH5c*wbYG_OOUi;^CY54-AMF=*%&+r%~SXhYp<5LV&E0W8I$)LvjlvnfzMpiS*Vq;#fOJBy00;_W-#&8h9FyKddqMs_!c5=WjyQj54OezBa`sW zi1GR1>Et|Uas4EX%ac2KxvAHTHL}jUMJ;?XR!h^@7vob-+LmaM{$LuUG0uVQ4bHjE zGa;iox4AQOY35!kK#^QC+dNAGSosUjjveR34k2BG&W#=C#SYZD3A!M5Tquq^tey%v z@8XZIL%GSFw(@Rf$!z>eT-ATsf=FmJiJJ-cWk8Zz8WL314=37CbHJ9qJqMe((uQnvVBSpBFI@j}<=!8?- zf)TLV8U%CRbQyt9+QFT?&k(%fO88RW!Sj^baDN#B%cZ}@-#DFaws{dX67EL`yR;U5 zaXZ}CQ#PFZ87?%|NswBul?$~nlU=W?fFTw)T(TVXf}2M0F&Y6uxyZw>_J9V((#Oo1 z%$GplnbNMzHST64c`dUWTlGCA!9m$Qk$-1K4{ceE3UoSwJpe{GFC)=90VzDX z9Pdnr>-tHdhIwjc3q)JhuB50Ax@;})CN61%qvBxSJJT61OG1~63*o$0D1R9!X%C*) zTtpKKxgp=LzRyZ{^W_ANOEfn#evQ1m@mI>Ld4&XAjT1cDHbc2rS?bKyyLir4nK}uW znccW!5;+WN@#ctB$$hN+dGbs0 z=I{h!%ksXk(2HIL0>(w2t`T5v!`whlnw4sHmSq(c-%J~YEz>WM4#xN5vNZf2=?dWDmXEK_0GsSdjR$_W7(sFd6dpR#Ew$zj_s^`rS{ zdTqNYpz0{?OiW30TFDgac91V$AnRK_z5d4XMM)EZkGjwBBIlC#$9$aY{4`_ES03&* z?;z#)tH{-^#)_1Qmpd&9soolId=dN^G_&l4?MtyI?TG!m$mi1LS-j#+Wzow!QZE-u zy_h}a)eljnq|~k6*~9c*vhzD!!82!X#$s?*m^ zwB`S*&NGR>{1I`6=Ofq4Kdex>rm;TLH`g^@LW^GhMuGQ*Zy|u8@dr&8Dw&11t1#rF zyC`=~te}FS)xKWT$PQEBZuHNjbj`bg7inU0A)~L`%D!&)Y4Y&3;3#!s9~<3`D_l<` zS$=$tfMp-R-l;fy*qd9+RB9b%*{d*xWs4xbXYp`P)+JX$u5PYs56CRZh1lwG?(FgF zrMmRaG;fVz#Wz~*Zw;Wy|9&_{X_p2rw?#u&4b-h;^ znZey_LJ8Nq$gAqj9_fies|<*;bT~UBR9%ukYqGM|nzIk;Mb}=h;2l3_rra@XE-;yQ zuI4$IN7h{9FeFLs=k`m%By503_%2TmkHF%0oYn=#TsB$Pjp6b>-^Q0TwU;#>La$UC zAJN~B>#x|Y|dbRNxbw8@VU)0~n_4jM~`%V4*p8h_izdzI8XY}{C`uj)y z^@@TmFTZ`-w|o{Flz(=ge;yZF_HRGDb1h;)5@wjoZwL9N5^1yofm5&qUX0(9z~eiXc3bMWWv*XVbW#lFYGke zpF7;}`-4@C+Rc6R=u2nxQ~db-3wD2}zQf@Q{QmlIb5y);qdzGO*@#g`6tzf5C@1XD z6gv|5DB}yR{cj6g9Am6q&=yiVvCYf(sp5z(0qt4WhTG!S`X$OF2BmX_D>83+AJkkT z?L@a&0>8i3KODWD)`s(RZMm2jEXn)aWby`qdb*Q3#9f{D;;paNQE6Aso_5MLMDXI( zW7#aUx9Kpr+o{MoFuR-|$Dox4^U_`89BJDFO2{u{U*P zFI4|1=s7J`S5$-W;i`mJsT%9DbM z!bb0>cs7f}88GV>`p6D$W7TF-Uml0mF0=x;RI2dM=I!*latVkE<*UhaT#D;vwbX_R z?sO%W?a^&4!`(sr=37V`h5+;y?&!zD)0%8|wi7K4SlTb92U;KY^A3n@P+4+}+u&2=z|r)2>wWYa}vfJKS`4?<`xNl zQpAmN%77zP`yR7)#$+i3_a_J#k_voVezY_uZnF($z6@wuqWLC5EI^ZJydjmvG&J5Q z!QbB$je<+YAMyvelSz1ILUK}OTF++6y!H4n4cjbzp7T0G9!dtu3Fkc??p_E&YR&V#F1lh?&Z^hhBN9rPFOZl&}rj zm?iJBAhQ?J!Bz3K<>o+-&6SE*|}8s{Z7b(RDqm1NRNKV;iMz;s;3wW6no zd0&dIn5{?su}Mem@XLlx^Yujrk?qIdD5_c)@V^bgL9nU792!y7=!7ete4iHAB*CXm$4 z=IH#NByck>0aa zNCseP*uM|~cAM`-EXEOfF(V6iU^wMP?-4nYwZ9?gX=uOwUO|EXl|! zy7fmNYD4njHs43Y$LR(wv0gP9eN;fY7A^2`uxl z;t>q}DE(nXnOm5$=bZ(1ACVP);jVmKvL+cCu73<<<97(xrQY`-Kf=>@#JXb=>PHU~ zaR`A>U-RSmqJQKk4*mr0)u_vP$z(zLq#M8|e{T4IG+pLF12*LS#a03ct;JwaT{; zW9%4O6j3P6^-5V2pG5@L`VYkHw~Ui@SG^;0l-(+|u@c#fcR(xCRa3mlKx zE`JnPA`h&|{vZ5a^f`eVe1i8f!S{J!VifuX-s2K2!S=6sQrM*aI`u9`MuOTdn1j$R z7Uj&RJLMpi6d|j|0;WpBF9Jv!%2y{fl(?M??`GEG4>nmFT4eEBT8pyHf_4&6JSCQL z6r7(^j+aR}9wR5=%LH%u@;I-QU^Y$@b@&9pf-lzX!Gy$Vs*;m0L>ucIC?M%}DIL3Hi}Uu1>-yq^t(kLLg$;LNHqqbmz-iGP4t8F{uvj%UAkt zW<_A0+|HlEd0#&Kx&-I+Rk;O4p?jib?#ju8ODMgVRJSS?`S~V(ckEmIZeD&)hficy zY<`=lSf!6k60YJ5m83Pj|x~0c#~~Nkf;ObqFRTja-YKk_J=#)LxEi`7zlcNUdOgLV`#d`N~<&x&Iv*fauYw}@RS(%Cacj`B| zUID+@SUxe_g=n22I*ZS?7$X$>!DDm&L&mM+QZI|g?xAN{9Iyy34l|UX*Q}`5E;$W{ z|3RVkBK@S^*193n0a|)U1M$OyjGJ-0AD+YySH_yo%^UwYY2D^8_#J-0GFeq&C~v3<&-W!FA4(`C~#R2OOTtY@Bs9wJ-APIs>gV6`Lmd?c^jsEGJx9 z#P=uuOLGJT@_!WR*GZk|YL-sHf{E*;FJ6R#F{ezBEB`)oMr8Iaq8(&|hhrElUGjNr zYM7X-dqn?i$kFrtH|Ve6`db}a$jbU22RgYo;N^gLG(jJvmM5|!qdxX|;)?hkDKQ%O zz0k+Tjd;c6K>V^DKgmOkx5$tLMC0lJa9<2i#~th-F@TTHBIx?7vz4FZ1+ffBwb$dc8`Kq8IYlM_YS*Xk)HGE_kjUHsk@j_J~-(@jnv$B)0-hkDi%0fBwHn|W_4PAv!j>1z3k?pbuCW@BK= z7kfqbAHYobYL)#9sSI73Ni9Ghomv1}94zyQ>^B~huK5^ZFZ(65+4}r8K(lC%NM9hR z9w+Xg4V7t>-2M52z8pTQ?x%5Ato!%4XIpn?iOR;7AcI9D{!Fesu=Xid{QzOR7Jfb~DnM}l-y9m@<#yQK( zHCvnDnypQ6+twy{U~3b6X=@Ywc54$X?%Nz&4@*M5s%7g*31~VAPA6zwN7R&5>d|C# zPzimQalYHcij+39QYKC!{U`D~z>`79FX3StoYzBYtY<7}^GM&FBp}O8AWbW;=M8C^ zQj;@VCmm>#%E%(FDs^$`ZmxX4*7{fPfLhd#+ln=XM((O@&u*>lcpIN>6^5C$qIg`C zu(huEN+RlQJlRC4zt}>yNzVKziIbrIbpo2M4yR$ISB|S}3lkJKn?RQJo=Zxm#4(>) z-(-(vD}CEPJL6>uhSXlg?2%bk_R?gqEvlob#sNth3z&w7N4DZj({QE~cbbOtyij&p zLPjDE7bT$SYIn1gwXtX)Z_qGg5jJfT=}j;kc4;OU}oW46Rs9Q(aq9(zKkU z31{4H2_K%+6P5gBzb$B2bOqWyHM)8XlHz{oN4VpDsH4*AhjzdnkFJiy9rr^K?zkVi z33uENJ%~H*haSV7jIJbaIv9BseXJ+7hdB+pirHj*wGNj5p64=pm1lUc337hKb0)pY zw|PdnGHtW`=8CnL-#;Pq=UZcJuBz{1&~B@`bM{|1>p88gxBV+;{YHkyw$w-bm9yTq zmG#(PIqP@il2YIMSI&B> z_Oj2V#P3W9iH9dCO7xcIHcGZ+kesF@HD0NV>}Kiu1Xb`{bbTR-BO?qMj;oc&>=hR> zKbqQ;u*+%X?qI^VBA=}tG;9Uxue24R)kaviv$Vc(avKSj-2@1Me1)`;rxCLLUfV{V z0$bchevUhCBfrHRw~>yytu|7?9k-DZ?zoN2!yUJg?QzF#WJla_8`%waGVR?*Jn^(w zT9}>oE^bH@>+iA?;zJ}_xAhz^o*wHtO*}KKN19^)OzY9MSX2*fQOazKUJQB*rY+Jk zonm1nivewIFx?(E=RSdS5An!)({{8|*3_NR?ZIj4@p+YXD;nof+~<<+t(Ce|3#hC( zU&^ot2VHE2&A)Jl&riGk05!0=c6$fmThX|-mV;Y?dYX1CYPoS0d^XpV9B(I-I^~Mu z=FG8-^h8s>)FPV%jXTrzbFpZ$$2YkOoOA+>N8;R;-9~*|LG@SxsW+_WC{VTbWJkC@ zNVD4#6@3G?X>Bq(&7`nhjVoc2{qn1liZph2BTZASc19*VNwH_-*y+fc!i6aWO*6mS z1VQcmXw}AFk{^x7sGXGZNG*1X-HI$^%U{ZTvbCze;s&kHSBfB9!q1$MD=mvk^HQ}U z;nOf-$>ccG)ZDR?K~_Vnl6W za!swGF;Ow*Or5x?&1)Q~WnT$psco=**e|+5&VFE9O#!Z@{9gD~G?v~e%7TLM;l-rk zlPxFn;s~Q)=-+;1rInjhhm?)dW7L$=&b0-!H*G<;VB{4R+x-w}b=9V@)#|y`b5X8y9OS<5$B-wKO{ zj-Qn87h3r)P31eXqsAd z3Sr%PzeQ_3cg6QxLHEmSXE}^=Fz3{cd0R@+cnYe`_(Z;}sc`AAhpPCJ2~=fd9$x8x z3l?lTnXb{RQuuUek#wcQvtxV;Pv-a|N5*i?|G$&`m&I@$uZYoUlK7!JwwON{}UHNWbq@OEK)3l!GaA+94Hz4Yb3`-1%e= z&M=7k305@-3ERn2~3ikRF5SAVoqeb8+$&`bq+*MS=f}r zn{Xn~{FZ&5f>^A-O%mG}ZGG~Lg)u>do-4AWs?dwh!yVKP_E#^Ua9mWPHa;1E1SZVHMrysG;OvEhu_7gaxKPM3!~qrg_k7(wTo=rl?f;=Nm^|moemZ1+t8)* zNte@NZe?bUSG`q||ALBx%W}qG8H(k4(K|!EHbv_TwajENG77?X3d4LpUDONjucT5Q z<`F@bcl^8#|L=J|#xo!Izw_SHhKua3;yKm&7vdiM5FV4IcfT~JA+KEPs6-ib>tJjz z6SYdN)r3S!HyS-n0qh{wR9`EiP3qk*{b~Va-3h|b=f@;S!Xc`o3)3nM&rS_rLwGlr z8)H zD%92*pC7%J7+rqLs;6xxd5k0w{i7V=GNYq~%Z#&wp=J4cDX(7}vCxeoKigWKbtm*2 zfQe&j!dT$$J;pjKw(+JC4@d}i$KH&TB#byZ31Chv99ql)bFBoE@T?>pe(0w*{wTHL z>D4-uBS-1Tr%KsWvwM1jPyG_})}^EJlGEGs8BdayO9;GN{i6}%n+y;#kpf z(t=crr*EF{qSHXKOnQ9djPBLS(t&nc8E;SJ%~2dlrg2Nz8WywSWxB=Q2j6k#+XRVy zR*DoR2FFV(Lqsk*4o|}33zE9xa~3DafrDap=|7k|DrTXXZ&Z1eS_wD;Aa64=?amMU zm;uJ{g8Tr(aRwUv=*2w$%3H>ddd;-A`rR}p+qY(;1B8rcpfzrxlO=`u!hXatO<5z3 z%1F>#{UB&KR;6uzYLkrTr)`XD%@Q^tmP|4yWfr&Ix%4kgBwV4Db)rJ!ek#F!N6a@& zV0fqFyRY$vL>ZgNRZo!$pp_nT2^E(FNgql7svl1XdGF4HMs{kaSkj(KD!F#B1^uxF ziZ}RX4aCjA7MmgM*aF2ucu)d@Ci$F@p~-xUh>@68V}_R(r6XS?k~-{k=|qZ`0p<^!H8tdN+RzMwkV`0}z8N%AQ=p zC~Lb?&GKhT59KctIrxpJ^t8aV>fVd4AVwm`X`T6U36Na_aTu}Z${LIEx1dZ?wLTfn*Y6*LS;{DU` zOZ(FOV}5L^t$NX=Le}HjeQv73CgL|8&Oau+h-G;zamsl2!_axLX}4<<-rGWTZ_{G7 z5L@5nPspgY%8M?O#79c!D=zIaxV>b0Ep6i1>ts|_TUJj@!)iWKp{h_m`|U+HgIw?P zvl3!-Q^t7;^?Iwc+mtC`vidZQZMfg1YbR@ElbkW>-?weJP{~q^yb{~+l?6)sC)$SR zNo%>g!9^`BuX)Q@WmdBFiG<#HO-LyrNZVA#fr6%VWY{RFi z^l5niH?s{tAT29X#4|PU+oU8tFBaI-u;c~XaMj9Fs$iPU_|85GF>M>ZEdV1H zmZrndHK|Q>ZupM1;9uG{T-IgG!MjTt8>e>t7h@Yf#yAu0&H=o?8=FR<#gf#r75`EO z24}a}rtt^{eWPz8&2;)ZrS`S|w{Z?hmI(}i4&q4ZleXpO|0kP9Tih+NVw^_xY;Cgi zn26c4l|(+#)-H*;WzQg-RQo!S#HVFY^uNb)P|9qJ-m>E5dI7QGl_g-A3vTUm0%>HA z?sGh1Ie3z^2sx%|sy`*$f4-Hhm8ieC<>0?jmcO*+;NPTmh>H1>?emV`>@el5Bs4kd zq`9^1^JXFxRvcci&(k#!%&InRAcqV-pJ(hZPwI#MhDE~mIZ#>wrw`K~9&6I!tvzFZ z6}l#M3hb|X#$NJ9&&lg~IAed^W;ypj5*i;2XnY|7O~>kK68v&&6UfkNfw@G$eUf6)~E#F?)fMMx* zklmOq*?=)$cJJlVR9)QTMr$=slkYm@&E8*~K-mKfcT5LjNm*VZcP^*4$(C&ETw2WQ z4r|eDw3-j6%EqLJ{nRG*R^@Au=!-4fTb0<8_EyElNcIM>AuKjK<$E{N-}4iG1IBPI zQDyuc>@OuBGX4iVTnE|oNoh<%l3SJ1_q=tgJ=E>w!9D00Q)R~P;zzf3D!06sfu(%H zdhG5PcAp=f1H;T3X{RIGF*fZzag-#PxB5M#R}RF<=5ena+vm<5Ql>Y6sMJ&JamU^X zt>cm}43q8QaRInvQl9191?X`9oj}4oWmzUxsePqFU#Y8kuV9cb!uN~|>EclG!&3>+ zU9WMW+#oG>w~AqCEX^#=EZZbn;`@p-wRoCTuI`gNS(~?tn7oM}Zi^D?xHU`QUCkHs z%cp{b(~CD|_uxKY{R&Ag&PlXbeztP4R4f+DF zx0^lwp??Rye3u@36k-m! z<*FA_3BLVKeINUb@{QmNi3cl-D*AlKlKL%(O-G-g-ydI>iy+Lw*X@SgywdF=-yCvV*QZAQkOTn$5H1Dnr=k;sm zT-9r6U+8*S{rWf`weRKQHLdTBZ}0{;IQGkUpHF}9Iup(Tudm-4ugZ6s9A}9$V};`( zg52~{a+V)v?!gltTn-SckRntFua;rJ2>K~=Hl)vWy+<_d^DFF zN`7r$$Q13t=c%H3fRs|#%cZ??<6lsMD?^!LwuTCzq0X1&nPMka25_(FFa3yezm%KG zXOlr+F=x4rg5(<^uO?HgMP;SOj2TYl!;~u3eg^F2{YGFP%J2A zHn@3^BEWFcgsMDM@w^Hdkv5QX9)ahtr4BOY3P3I%L^^`y+^y_*3Mz2I4Ra;Em$a*| zn{R_ig!aejU(vSZGmHXG#69qy^-8Q>4ytodiUs_f>l4RQa{p*F#8QAx?(IN zdrw>vyBjpp7^B=W$qR zmSn{YnwBr}W-HYn-rLsO5MReN6*!cl{QiV;K7`}lXL-%7vKg*<6%JSBx>kK^QkXz6b5f zXhmKT){g!-Ln!&Oy#~&~Nc}1cq$KQtw9qT!QbG_)7G)^z#22as1&99KU z`Iw;CLY(v_LWJ}xl0x2+tGqQ&?l6|OCt6encGAZzfri%$4PG<^aj3?5v`M;|5q!-> z@HWH>2h*MhsDo^{2kvk?;W+7J+&Y6dkEE}g^w-HCl`v0DcixZ+^VTdzG78!HTyr*v z3$d;iA-IMgJ_Wc~(7Jx>OlepJV|P9pBtSm~xV_0(@|{J#n1XR7YJSXXqxC+E|L)rPm8%p{*M!U;PL~X&t-LpE_^WGScBm8RwdV zM{A@+R0pHo9EEX5WH7L103aRePWBAXQG~Rb;&3Gmz9i;|rZmT+f)Pfq(zaXmIKnlt zW=PgQi2c8b*SoR9jN`a*RvHnSeJ^S+maAi+`7O{K*5Ghd=f@oz;+KoL#)f(KZyYHw z*c2z%(w53iRvQ=xxnsyiFfKp1mx!AqRN@{H_s-&`J%qd9pbd69G#GQAuVTe;O9qUx zSdU~nqs(|5cb3V;pmxUuU$iSf*14NH1#`57`Wqirzfjf6iuOS%*TWA<^1q* z9-Dr5jVZ8b4+-5<{1wfUBLz0|F%2JqtwWE>rMY7gi!WC1#p??F{;dG?*6`{T$rw|) z)8gQ`Fwn|GKP9^l{`PNd?hOMEgd6_oCAjNqragBP3_SN`av>)$s zArrwet}x%tkM_sWooC#80FLNDe)65!^^1r6!L_?Ud2|pEKRQ_85xaGK_}hG9@UwnZ z+llBShN?2AM<>#Y1nAiZkqs<^ZoPm@jy-=pk~xdJmp=eB7xmMG{1eU?7oW8P`j#+9 z{Bj>|_!u}$88D+W-%esVU`%k{dVy=-!-zdOSYM%rdACIH*Bg+(K0Fj+Wu$EL_)ewT zi0KRWl-kXNd&{dc+?|)mmk=+Mu!Uo8=2ZuP55@p>0QgW0P>1SNX|MMS52F2O^bxI; zGp_}{bGA}uG9sWedB{RjNHeUFD zaAZt?jpn7IX@ZC2x*h)~>V_^IRmvKL{8qyEqh9NLx#2KGV*FE5cc9rD&U@hsQD4$G zErM2-3TQ8>G<^PZA0qG}1QIomAi3qG`Ns4+HW9zq**L4t)X1cZs4c!5VQ}0^|Bwxz z=1UV@URY-^6TXPh?p%JnyF*&XzWB7;d@-5v{Xp)sC)FMVxN4nFIw<&#-CuO^n5<<_DS zuC6l1{u9VDr(TYNv4dIVd7f`UAB|UO{t7hHy=^_sT({k+G}{aO=R}A>Ff^ONZ&C)i zjK{k9UOCGoL3kRFQYP=|CuxeA_~Rv|&JCTc4EWVzC$eh3%N#nr_U?O!72f0D z?s$h1Bx@0;P%g?gZMkflI9$e+p8dMbocQZDd=sKo*zS`J|Glbp@-xa5o z=4OJE<-tUK6#T5J4^BrZ-sg!|4E1Z#pT?_SKaZ=*}7PHUnQsK?}lO6RQ?Ed6>`YmZOu zXhwwFx!d!1&-|lIhwSNtzser?)vSa6t@gkrZ}!0D^*ro>{~g{l|Gh1)OuJqA^wuWm z*ltV3#pY1j+5|gpHo-I|r3Y+rg6G-;{}ay=T!TFQ{huWeDiMBp{dLb0oRO}dW9i_h zG5a4+;v^O$n?Fl%Q<8wCo=qT4-!yHd@y|z^ru2og1kX^N%+aPEAW0ifS>FH6&Jw(E z&-~-e{^i5q=0Mey8}O&OXa0dLXkTqd04_!n?3EVj8+-nT-826`{Vc&Nr7OCQq3Ykk z{m4QK9ge(SI7?uf-e1Db~ZS7ftYef>D7D@cybCy8LjKs_9fAU#^ zN48e?%lK=W<6r49fEg<3>EOzWe?u((j?NN1f2~8U`>%>`->q-mUB8c|+1~0-ZF_w( z34P%#fgN;iV%VP+yXQVj@B~{jx9NHnyWN?_3wF4V z6jtong*M~=_V1e-yJxev#OCFcZ@l}u+;7&7?Ej8Z2cCSr%Glfotk$RvfW&oRNIbiy7jEhV`1h5IoEtu zIy#NWYSS3sjg)6)_bak_AZzln7hK-i*f7c-x||*S5P7t1m1rh`>{-=z%jMUL5v61i zoet{yHreP5dC$q39g{ea)#||Po#ZPgbmw#A`WbUKGaJluHwb*$l{kZL$Th;$pBEm? z3OUwQvaccczU<28fc&|wFPQEw=Na7=b9e7kKl?UjpJ(@s`d=2aclTdu`dyOnAE^K3 zN%)u54;?oBKdb-nBpiN|ANxZ#{B7zVOTzC`|FR?;@gV-1IDGhWcVcNAIDDboy7q1O z6nA1I33;*G5{cn`-HDx(kX_x0*Cn1E+=Et}`tM583FiMP~u)s)f1e zY#gg4yF!*eK+*3gJLcVqmwnuLJ8YtDJFIH=!H#ftzQ*h?39T4Z$gQZwCZBEcO9f*d zjg{JOuu=<(1>b8vhHG31FBX)36D9hNn6XV{AVphxIXVZ@3fWRuxzt@7Ds~mS*RPh) zuAEIL2HX&ucrV3U?8XXLjvaI%`Co9g4Y2{!Q!dRI<>Ts3v8OnLJ(%V@g*YrXWsCh> z@);Mt74yoz@OTzx0J>}W{C`h#dk9JN6k*gtcmr`S30EYc8d zD*@d$pfciB#5A^!t#Tz=EQw7~)_$7tjY`5rWN9QpKnib3LTP4gQE{e`1(8AwoU@>Q zsqiJF`_vza&V!q^H8Cr>ZJa|4&36gAv9vAb z$3;qU6vjn3PVKKMSf49i@`Q#Y= zP;#F^2?hOoYWly@NJfL#6=7 ziLO97L{VQ>WcpJORtHguR~=v_>Xd3(2xyjo{vUPk0Vi2e?)~?k({nn_%uesjcF$~@ zg=L3BchA7?5O$Ze>FzVTL%8qze%|*#pXoYPzp8pF=ck^UkLF)WUvIhSitTYs-LYcOdkJLY z6uS11w5#{e+3`nndWm(Wt4FxO+jv(}rsqM-m8l@ZLyp4hbTZM|WJ>MrUUUxMjbBWB zoG%~e0$nc1@DSF&l}n z%{nsX9riQ-rOe^aaVU;3=sU5$;e~{>>iun-(Pfi;o?i`{f^Y1=eS#|vzPtm^orI5V zfx-3jV(!NQVT&DhLW~UwTja3)V{CqxyPX_wW}`orGaRlb{Q3gNx!RZq3R}e-<6aFT ztT-RH)Lp>l`jKRN47z6%oWb$Nok?6d$1hj>7FQnB_sd`OLHtx#Y(KS#CdZKIjIC??!D+p>{pgGDdbbp^F%=Wz z!5|Jnu~a9ynvoMRDefNm0R+QC1;@o^7b2Zr6k#7TNVH)!uDJW)Bye|+2*`(Kp`MkPT}org0Ea*(@n*{&qJw+&pf zU3!XCwX2n$j(`{>;y*^B*m=8}Az}RdC9y>O1=Nh>*|U}ClV{J4M4vo+_I&io(}35b zPbA{&MeyX=Grby~JbR{B!`-uINXl1maj0!c`4{F)C_J&Wd61@mBr>y{-vqzi`0c|F z4#`T`Qe{{75^EMEn#GA`VWJsMG(3P7yB;k&9ek*C%#KslG|b(7lV?dd%%H^1>f1%0 zMydH}(&&~|@Kat&_*|;e&6ZO0fsRc!oWjOyUBbW>zF1nX^>zA!@M1-n@HkI$;h6@2 zPTm2gxxouxiOa?U_l;UqNH2T=kZu+h8*t-R;eWn>idb9Xw@!q#sD3*kVj6(&B!FpF zdf{avu^wvex$}w5zY=dQp;8pl0Mk?J-l+VVf8Id)KTBO{y^py;U%{W2E3b7arlMEa z9K2ssh7FJlZ-;OYU542>q?rIa!^_BjRKcujWt78BJz$@IjzXTD+dk^kOxbuqn243AnP%L`!n&8yT>YLn}pp(YSEsgKqN*b@g z-{+Oa4-plWnH;IGKAcXVMYYtG&fa{k6YYFq%80iUm;kCGmIpCl>B>jbq#@19*opsG z=7Vpxp@D^ ziQk>Xk1p#8@@cm6%V&`PScF7oK~u6sl_Tm%Y6~_pY0TEXhq&SE1A{aQ)hNujhrlwiJY~LUEWb7pU(W@AH_sy>*7=w%(Arh40+;hvuSP zM2GvvZqHQ>axCVh2fG3$$P}h=ojyZjd%5)q%BYm{r{%{BuOh_gBKqyz=HQbmJ&s?C z;o(%H<>QOl>FKurRLUNXcJXhnh3*{a4$)(`9Y@3DOl1W#WVaG~9ibG1@e$t(&y=>y zX%I0gLhHcpy8L<^)lO+1Nd@$yKVonRwG|zl{n0cKw2vj;YIjN>TN4=;CS~8)D7CqG z1c{)F64!2T&aUgSy5g?w&2Y^}FC|c~i;FV3fy-5ql|RVG+`37=iEcKg>wD368Grtl z2&;~2-|KG0H=0MaUi~+s@3hfI@~&^yR{>x(e-Q?D4i6-{8f5-X(b{Dj^p8pZGAz(P zF8#};kFG%-o}izVW@NG#+rP;66&Qo)pJ>PXa-BOm^%IIh!%pb^bB0 zaW(VcUu+qdSrRuY)vsmb!HvbmdW0!_-aH0*=Ot8tNwZa~Gd5LGD%yQQQ`aBrt;wR;uBqu6BFcY8A9WATPV z^9AHiL<=a64+0${SJx&`W7rF<2O8}0%00+=ASA8M5b_`6Y`plAZBb-Qc0Kq}SP$md zCSm7~*}NMaStvVx>~~~F?#T3#C7J8JaDz3BuaTI>pfhpZ@T(YGuY)4ja8=LLKK_&Z zX#J3=73+NgS3+N}c>D;nA5Ef;|28N+nDe6>fgjMC+=Z3NY_pAtQ^=g-g;x+362k54 zM>mPU8x+WbjlYG0?%ia=OK?*=u<3-Jh)qA4Td5tf{bO%lxc2NSSFZUcvZ~(Gyn~NQ z^>28J+q-E+ByRc($YSPzucvlt4pJ*rQwPe2?$S{asd&94!K(V^%~P+$PPg->5$<9+n^wgvVv+_v5fc)1|M z!=ovwkOJr4O((2!cH?&wPal`3x5$$q!}VrbJ!F+r4{ya{uqOz=O~Nenjc*0%x>;WC z(VcQOJBuv;P%RmQ0kwjazoT65%V9#Srad>iale^L|Pv_ICyT*v5I7Nxv#=gz>FS+{(Z&_l);*llcqEbEa}+ErKXcR_soZau@Z6mVXpYd8F+wbNXz}IX+1oTzdS7QMOom zFi+3>chY^CyH_D8C37p8{F@;79ESLghxJ^0S{S`w`3ya^n;rOmO?0ag2+4xH;!bTg z1>N4>g*QL?K$kxnw(~bU(_b}vE!n&P;ht+humz#_7@?l% zL+!ZqWDZHTeY%(e^5>j~j7+OX9A7&1VYbPMmhZA2Ug4e?p1KMW5soeF~*F-}*Ek?#3&5 zT&MjEpYFwz&4C=v!AxZbN0S?|tq)V%bv3s24#iIz_?dC7yU>>t9;^Ry>$4&nG`VMW z;YP*?*WY~=cdgH1bGabHqt9aun*S)_?t#SJ*V^s`86LaazKA=<7)S5xZFhnUckXI8 zZ~Os>7kvThjo#RB2Zk}H_syN#yIf10*+D3WcVcf!^dIP|>!Q2(L|;U4@RoLWW5+e2 z@GHsy%`3PF)uH7@U&4O8+}xL3h~MJ)GRS2{$k}$0kAW0Ta@P@uuIh^Dv$;VXv;C5s zW$?fpOOzk|r=rUHaLrc{VEld*C!<{NW?FlX;+kW7|6f?f9aC*0yqlEZ8fzJIA9P=L__(WQGXOu-ffn-0+#rw*M=_Em ztIe-B^`PQS9!;Buy_z2bm*CxB@HevtsC0eC0@Oat)C z1TYN%`_wLCrUCeM0+weJz_ax*{_+Q7ab1D z?rv4(IS-0nqjh+J-eTBYiEcUT~5d9tk808UR5jw~m z&u60{zKwD-?9E*0>@4&W6#vnom~*t;siFG&AhVM6?A4AJ&i`u3nXxpW$LvHU@s9tj zjm0Vde{;d@M`p6Q%J5fYjnrdLx<0ENjvu{9OIRNI;sWi`LR3Lh3YzQ3k%{Bdo^t^j znfMOv_tST1MY=cN%w;(xzLwM{^ND$x#$L&opEX(EtS8tz@!d}90(ae;gP&n!Fy*;% zu8q~^s|dOfeO1Fk_qd;nz6KP19i_4t0|SL)3=*tq&Egwa3>H@1f(>Uz7m|$iU$iM~ zIorGyk`k0tv|I?<><5Di ztCWCO8tu+J6mpTyu>;HF_{g8g?MZ&Ed6xDD=9dc_h7?O3l;=1Ew|QJ(^4q*jA+z1M z%Ri4B+aK(kGoQrSyzA|JS!R`6AAuAL+dTavvncHhsr`m*QJ~b)s{$D_JLU>Y( z*B%bd#MU?ndVPD5H^KfvwzD0SqLXwe3WqRRoZ6okJ`eI<^Kyt!tI>N#X5Ms##M^(P2PUjU#rVqqbxMLAxTmc=F(2 zp{?eS(q_Jq)JCf#Fe9)jH{8^HuT8lTKMFeN0;9Ys7k-Bfi=XCl$*Bd+SGE%o*ZODs zQC8V;Y|#8n+pd0~??xz+{b>p!j$v=m{C(Tx+Yr=P6f}Q`KWDP1Si92H9x80C_%0RZ zYSqo?K4QiZF)IQc5wlU8UGqx{a&&ooO#CPmlVf6kMdz4!F8bt{cp>`an0Pt*5>rn7scgGRm{;sY*76iEyjiepfp;F4XTx+y|LjW+4RK* z)!Nbi*q};1IyW|)EoTF%mUH+$_HWxPHC- z=ElEye7k?@{AT_tU?W{WP4E`;Tgp!x&TU4)Og~NWU4*pe8Wvmy%z1L7*5e>z1H`noi^?F zrG1fU@0a#cv|1GXi&4Usg{A>`JONAtusH!t1Mu$zFwFvEIxsoe9)ghCalgPuCopUxZ=uB9)#VglzPe+oVR}*(OLFGDp3DIBu z-$dC7&ts4?p4!Laeu(#4=$E9l_VVi11AdzD9VVvMD9Z*PO&8 zBDWDvgNdjjbP0 z9WO^BaJKbB={T0lhPRXJ;X74DIoB8oAHbq^xMydEzNsHk!r)dE z^6-VoZ*N}9z{g0TzT%9oeZ{LzRy{XvYvlLM+D5us3YKdJyY-^F7Z=|+ek%%WFSny; zaoiR+7r8jL7?O%STx^jFR`e;dIiyM{TF3+2mIpy!p-hwJRnm|@*^%&d(n71p@r9UGyfKsH>bV zgbw?gb;)4Anf+P@l%hN7nwKxwq^xTq zh7{owj9EJ1wDIdswpe%rd1c3q^2#ArGomlH31#>yiw^nd*0n!Ux-5hulFk$_CSt@Y z=VHWWlqEELqvgIUZ}tCH-pxxO>l;b7bg#o;j@^EC(0ro;y=#C`z&5yp<~s!Zvb#)y53*i63u~xsvXKvMx5vFOv)$e{Qf5|qZiW5kIE~tW*S_nIiG$nA@S=x^NMC(^A^Ig6 zc7Xk^B8Y?h`PSC%RunWg7iM2(n+dlzQ~qo1@e`%f748~jC#wLEQ9RnXB_I7tY3Im! zk>~6Os82V$(oi7|WbBYx#r~jY`%k0L`ziFoU(2WW&61`czd;{8j3WN3-|}^N{A}F* z47VHAXGOmQFV&af{1J3TZ(b(+J(}=Vas>S!&|4V}WN`A|n8v@u={r)@KEtZn<*YY4 zX3nkD&2gOOQf8;!ZFy$v>yzVfy&1J*ATw)B6nb}ro-`&*Q{pmSoZ0D_E^O_qm&i5Q zY5ZoHn_;`RoG?Unj_FzLe~v|z-K-k3n^o>&l^4E@+~BguP;?@Hz`!Uz%fkF!QhD{C!se&3dxUMD#=atK zbsGDsutU^H(zr?H2H9hSy8a?3PNN@Kqhc6J)$K!m!M z#(ppCx-|9&VYj3)E!&#!Nn?)+`$QW1qp*9@*q?;`Fpd3L*du9-%~|SN8vCoTxvNt7 z$98R|xj2peP1ufU?C-+%Nn`&Ic1#-kr?4~A*uR8rNMnx+yDE*ba?3Pdm&X1r?DjNv z!yK@Wq_J1~V0Wgm8-#r`jlD+LkJA{Ox0&W2(in`XndZOK7|f@c=HTj7{@o~Sn>2Ql zu<)lE&UF?20tTO#=GAGzJrLrumjM_Eur< zN@KSP`&b%#o3Ojn7|f64a~gZQu!qtZ%qE%UqiO7&!X8g!?-Ev6lgj502^&dc9~QPl z8vBT_-O|`cg&mZ};M-$NNn^0(G5)48cmXrbOVb!!S()Zb(%7ejy)KP?TG(xA>@&hX zlEywO?Cv!7Ibr{m#y&6X{xk+#8{>2ug9j3f`U1@Bku=~>3q_Bt5*j~c^lE(HI*0V<{PlvYwo1ezY!nRLii-hf##Rl?3rW3Lu=NgBIB*h|vbYlOWfjlEXbThrLbgnb~5-7D-1Y3!TAzMjUu zCG3Z3?AyYAlg7Ry?6EYK*%qv4&s3gz!m4S^7q&c&^$6P~jpc+LkjC=Dj!R<&VP~YV zlCV}9n=5QOjg^JHB8|-xc4Hc=3VTNyTOjOHX>75ud(zkvVc$z*ONIR^jcqUNPiZU^ z_U|;dgRsJ0seG;po1ez&!nR3cI}006V|xhOJB=M6?65R;u&{M$>@;C#r?Jz8wbIyg zg?~oQNMWPfHou$(_GoIGu(MM#x|eMvc7UZv&wL**db|bwXl=Y*cxHyr?K}6dr^YHr{!gi$z(FDBH8!mn1+4SjXJG~ z{>biJZ+)A2Uic?;wg>uWG{%+G&<5mRFqIx$h=aeP8~-jlpx)*RTQl(v=#T_aB>dA8 z`y_jwPa`~q&Ok?{AJ1LEwF07TtE){lL8he+pU!}1}ggu_d{QbZNQM%GQ zB5ZjYs|#D5#`YE_nJis?4-*!+cS;rC+xU1c9Jk2;^|KB24UBwvDXN@J&nCb*k{t%ox;AI z#_kvPt2FkAu)+bUaOYxdE>B~1Vf&=9gM_V1W2Xw6PGeUIyCsd?ChWd6_CsM0rLo@% zdpwQ#2ZFt2aVpMbVT)0^>dP`=d#17dgq@VeP8T+n#;y?dmNa&|urH*syM^7K#(pg9 zw`uHAVgF2Ha}EM4qjbf&Dr}cDw!5$+(%5mr&P`(%3A-+hy++tO(%AcieJ;T`DzUSY zgRQ56>A+Z$c{r~K2n<84_BOKUF!$YYzGQG?* zq4`bq@7x4bkNN?f+f)+M`!VUV&HMP)ITmtmJ}5UsiAipdb{D>fuOIy#B8soZj>Gsq zB-&F7*^gchk1sbcV6vW4_#v-JwOmIy>HuaDTbgaQ*PTio4jngXlwOYv;J@(hJ=W zhhyaHZN$!ok0rccS$N88-(E`MkURXa<;;|dp{2*Yve7nh)7uMQh|WT5FMQ?fg|FUh zKKuyo`(VFNK^B}?K+4EBnTG7V!Y8*FPh3*@9^t!7DxMXuvoJE_`xiOC{!E;~hOiu)>SUgqs~=VF z@%@;-2~+D5*b!los;z{Hkgt0$(eg;UlFTK_UZbx|RN$KUbLIygb*)%?`1mdQZWH5i4gP7&0u>H%kp9oc|n~i&x|q`4ZTfqO4T;!<8DHE zW+Z4iFm42v^2*J%E4>EnE|wjGo_kCA#Yxb1vEe{3;0x5mf(Qfgn! z$NXh!*&&BFdE^kZkD2xuY1t1?^D*Bdl-+Mo-HuE6n6sH@6UT>%qvJ7X-iJG`KeLCe zdjh}3lvCs2ib3<%LuszPPXAu?ykWkdGtnU>Hr|wi=3<4j>hQ1ZM>y-07k+pWxdy97 z9$$X+C=9sGZPA7cAqI>%K44vO@jH*CS%i$+!SNf-$=m_GI`p0{|Mg1zB|lb9HbGv+ zSNa8Ac5<^vi_Nvx6h~;SIUE1AxHW4{$A3Kw&$W1oxKNzo6lW%H zHI2T*TU`#CS1X$zrDVod-9${Dgf&`TD=W5nQg-N>JkWiGmlc`5g_2HeaY-sYI$o3xpPsm12EM2QZdINoa)dGdCLhiHBu zi}>cgtAJATsmna#nc0U5akc6mtkt`rhtc+BVy%8IF5`rISoJSq9yYe(gtglEtP|F1n9={=e z6@DZ9LQE$&OG|f) zHj=i_v^L3{Yg%z9PY;;(-_n*l4(3T)u?tw!^9|1UxZw6z*0It}SEY5+U4I(Rxb{2r z7rUtZ--!zuqIucv#KGpy|2Oi(u1WiLi8{KQe08_5W8jMb%*lh0!=J$A+gaX}3ch7kH;t5A~kmCtA4ZuhOm`n&(2TL@<;WZ8R@BX?x>dwuEdiP{xK_qB*s(tv97= zhyWjE!c2tbA<|4S>?<^QkzUtyTzk>_=fi~mi27f9HWOJ1bEw^YtLTz5g~&tCgSaBr z;iogvO-4EwT}1%VHINp|raJiO#UP0u!Ee$l!00BY?`LF*Uhnjpu0&Tmef#cabR~c{ zr52hqVWIIQz(|(>i-iW<<6~s+1A5oq?alRPZhE`R&#{W{wJyWI)&0QusDDq|7#Q6U zq!69nYfa%!MVAga=jKF#30jQ({uP#VKXU3n&?kPY(anlHKE{UI0qcJ1j%1$vaue%+ z94>yJJY2$2cxUrHi11vtnatM8idA0tH8R@^zk<3W%USF6Of?rsNAM|LO8n)dVzhsP zIrz_UI_51mFVz#muVNhbeRm1WW{fWBWUqy*-rMr1`E8%QfVPrk&}g4YfXz{z6}S`r znkKJed}_4%w@yoGB&uKM z={rqKc%#4hHS}I9P-)l4oulUWp4qYY5AWD>EkZ`a&+%tC`hV5*}rmZGwoy9gtyfY7l>wo$^6+I7pql zzemU>hlm90alGiiF}wQV?yy6buoWHW!sN7R>*x1CxYV8P>7t-rSFO*I|;q2jAd=l&Ii!6cqO#bBjRBRhW`nEA)dTtUqt~B!vK8CfIc~)AqpKO?*@KhZ3LD|I zmiO)ME#4?2jV!*6CCkVA#t;o9z+F}k#w*R^k7Nzeyb?8JzbO{l?r1ytfRts5wwGB- zJpKsn&Ui%)b)zA-7;O{q4~nAJ9&2#>cHCzDp4KX&h)YfUf+(*RU_*V@jSmHYapJ4l zNen4zWQf+B?}pBw+UeF0@Q+Hp<~6(#LLvNl)_89%ep{x( zWm)tWYGq|7F0(0zTq@X$we0M2!I)DdC!;-xmt`!x`7c()Sr{s=@hoM0$h{2S$84ny z_ZG(Y&2>aD@cQ*4cHAU{LEBz4DHO1?Y1j|bBJ&{PWDJ-b2QK9-Lh^tSq491>B-bIr z1`|$g?ok+D*!(yd>>}Mf?3i@@%olu@%kD1!$1^+p*lu{zZvL6sVY@lKRF}*Icc3ca zX>^hdTV5qR-EAsJL>pOb8?99B^_`H; z-C`k~E-2$6Wm)G?1A3tO=&5Yvu!lHSrpGb z{`Z8NdphCn%Yg{OCbJxmXb|*jTL5-8v6TE^PcrT&z3_L`i|AjZ5;0$;T=;8@z4^U} z$5RViEBe3VH@S=BI^a0|qQS5`EN7qrRb5ZXEM4LdRIR58cRHB3FmaH+8rj1{POl8!q88n*hPVUgyd? zk`rgc4^6p$4(>GvnPc)L{z)8LEu^#*TfM}HV~IXKef7CWJnct^Fv&8}AHz5oMK&*O>~jUb|S?LpgU3>+1%X`WQD+ys< zPdHznY*^99&-R=cJ{QkD;hCu6QYjbnM31AuoO)UYaZ1yB(TH5LfUO38E!oB!x_SiIF zVDYo9Z7}LmE|2}1mO20a?jmt?O#D4oU!S?ofi9^TFVZ#ejde=OB%!XQGPkyc(B*;* z-`Gej_mSl?Sqd^dJc~@U{0lOtBs4>IIFJt4T8`7{?QzP9u|6AjNGRz(^^^$MO zWAiGe5iOSSyi})(tgNW5Z0*~QB-eheIGSJ3e1o&OxSsc94xsUDR(LKBmKvU4v*!U< zlNA|%D10Yj4u$VRMTU%Bgh$-WX&4&=?rRs}sS@>UwLYi9PLFY zu=NrtN27#qM4?YPQhLcAD6*`udNH1q$pOT_Racn^+9)M_zS_^5%(>;DMcArbZ|7aL zyoK001ZRDI^jtoT6$qJm4w|Z4>U^6<9X25CQ0K^i))ly-U+a%Ogq)Vq&jrybA~V;0 zk(RrNIXp1Bw_;HY^kyCMYF#ayo*=GNiq?T7p)D(7;Z8;I3uOLn<+~$Jie6F?DDz-i z5P(9mf-PZCu0?Yw&|VD6^yopHssbrF<_rO{E&B;R$r^rq&kvM7P)#MPX8lyg0M3%JClFT5r>vBvk$3)etf+kk26R<(Rbf1rs zN5X{ye4s3`&+$InNaoHTWb$gNTJwBCnmMX-?xh;lVY+JNneQH6p%dhd8d|V0qHqpn z5Yc6fYw!C^m>GT*q~%F<<^#|n+G>Iv8=mp&iOtu%7S<%?T)d`|GY9lY9En;Z`@KPVVSO#UBJb5ye!?vVyJFYtF|Dw@+Vc-w;nJH-AR&~jie@Yr7zVhklk5! z?jy^X;xENSlkA1tqtRMGXLmYJnGvuqe|d{tY1bX&%z zRbNeSy{+|RQlnFq2%zl@k{X>BL(2@38l5hv`E{H9iSV@-fp+zGG`~*x*8G|l9jTUg zt{<7&;is8_M(w-!?ZraxuwG&9hwV%0BDs1ff$&6*mWt!M+i*C46UIWhDhgQQ01#n49#k{VqUL!UNC zYSfIOj~OI2x+I1^W02HnDuzC5kkqIZL!UE9YP3FvK5vlJh}VuSs&^VBHF{wT-C>Z_ z=wb(DLz~wz{v5#)re$P&+4+0-sOL1B>Ak3O|$p!H(JkN~cc(yiAJ#_tbG_!|}d*nY@kBnmD?|i-*gKhj}E=kuaHF|+UrfdC#K~kejW9X9x zNsTTORIw?|g%%yDE;`DanV9lsgSnIH@P2mw?KwsV@BO zz$76vYpTQ8$9j!HQrX9v(K!(}*FP=JT=0r`9?V{}Hk=*T9u0&=ZZ`ToJ1)~J(J_7- z!=E=LQ?!^Jj_{kf*MknWhkd<@W(_Z}8h2oLt&G~wW^XRTc{TgaM&2B|a1S%l)x%_cR`#mYfM?ExC7xhIOWeJ^tmUl=6HTos+)U`Wqj zE45ML={hqPI3%cOkmK-++X37qRi4?^no`bA#{=_WtP#1|?_E`TinYU=noAD)@#*D1 zsIlpq=^O8lrK4FmHfHb{?`xLPI{}9Sb4ZUdtdgLu-HEuoBins3zT!I(XGr^)U3s`g z+P|50>$2VT5>Rp{;{SoW1x{AGBuCGFw?Mq$Pja{5DZdA?FFfY|8{dOaoufX@xbN{R z3ZZ?4!{$fNVGZ#;=11=CNt@R{?~e}H%L*|vFgf!k#ERpnCyz2q8C&&MwZA78694pW zLi`^T3(pOMgW557R~*vUB+i&&+gKD|lNgGxNkHM!E;qe&cTZ6;yym07WM$3v3422K zv1!HS1z5;+dEw={yznOqV|48Q_j2KNU7~$?!Gy#omlw{a!L;SVn~?bA@`4G8PvpXz zkoe^Cf(eOFuk&TzI=>k;sL&>l2Aw_@5|liClOS67S@~FK-^U5}W0Tka(4Q zT>S036k2}g4j4nFZp`}AqFuk-EWZMHZ`W@wdj00j_zhv6`BTrqmVNujmVEo3hE}fi zWr?78q{MUiA|)suiSdb?cus^h)3Y(7C$kox`ioD>TDvhtndTZHM_Az|CP5olp|?}v zTQP~Xu6Vg1!^3k3c6wKgI$L`a4%`_mv~{-jFm$va_X}e+EVk4wDus{8@)R}yq!)@uYGG;YsZ-gK36KZNT@v) zUL?mNZzqt^T71EJ{zh=A5K z^U{MeC*N)bZEFmUJygosY>Mtqjd|2_U+`&IF=HY3(9@WqMF*FT z%dNMP!+Q4koAm8t!IT`hoAo-<%C@4sXZZfY`CMvHP%BdkzepqBWWGri>UtJ))rSuQS92e3^2? zC*)Nsm2iI|6S8YrEX|w48?k6CEl=X^pu}C)YI&Ppc<|Q9*;uI-F`K)X+zfXWIP{(h zy)E6%La*XIHF{gP>(KLz&$>kZ&CU4XA*9ybUGVI-6^n6*KzLHC(Yk*>K@J?*F4 z?Nk2D2@l8b+>CwJl`tRS%=)bB#eAeQ>$9#8^HI*M&$_`Zz|juSXWd{Az%dTcXC1Ha zR(34F0^ge(-Q$E(9z&tJt}lR!;xOuo1}}L|>bVad9*Z}LsqU%l*jEm);K_v1Uhz6|O?3^|TW_PQ3t!2M zrpSX+!-4TjmV27-OJHNChNfBo5+fUu#>G|WxP1W<``G(Izsc50RU~VRVUU&jVZr6W?rqIahTUz7g57OEZKAsks7<7rfZ9Z=3G@WidY+^x1=RZDEbU>~+QR{^J;WrpsQ)mi z%u@ez1>`8OKSxfumel83QaP*IpS5al0`<9caR=Evn71lVo5?zJ!RltYP;kbg)yi@) z?~Em@Y-Lz$&2z6+pmJ~EjD3r2J7ciF++Qi@HX2|ILiJo9| zbTZ#82&*p*h6Pjr<{B_J7!gpN44U)Jm(6c-p(Z#Q2ah|P9SUDF0?sy5N!zt*$?ZZtP-xRW%t z=XOstZ}<-!&YU-hnC1;ejloFMmo{%!b^2fhva)q|cMvvzyo~xjPwi()PKrFkqb~&h z8v57$)=a-)KLr1+n9&OG3B6f zu$x)h(FqUSIGdQE3tGl3_Em!7Rg|G=1>+%B>)(kv5LSmp+cb_k?=exR%hm)sH3ist#0N5n6WUVrK@HMfQDoib89 zi%ER_kZmPc)dPz@=LMQ0J|DNR0~?j=z+( zRo6401sBrfk=#k@&$%m?MX^JuF(Tf7zGz}>R0 zkK4&QA1t(vLyg`-&}5lnu;xzPf9oxCV;Y1deDQ()Y_9b+s#Yzt&(35c`LBKcX?|2P zw{YVtTytoOEOR_Rt=#n|o-p;n`b&fbY+wPjaQYAm*PD{c4Kv>o7ru!Aoke!TA~`zL z97)AdwsjVT65c9Df^<7x{`EC8JgiHwq)$F9hV5Id)cAM%zOS~J5EnoE1qU89-#F64QHn$C?_n>#xE&K(un~($ z^{};KRj)g{sQd`bENbL&kKMhnJocjj{5B4wCt!_J41Yk;jm5IDF4>+vPgXO<2HZ18 z^ED^Vl5Sq^P0H4=ld|OmYr*41-l>1sjQ}Wj_Wtx%l-fRbP}D3}_R|MEPi6Cbl<|k@ zc$|wJ3qChP?d2#I{OSX@g$6NDzovMOSN%{a3GYYI71e%49xl@ga;iEu&hO#)t*U>r znDTa+azf&j2+uA#a=oSt%tdp!6;jl@LoORFKYmJngg-%vSfaB-K-zR)MCTjB9oqKB z6z_L;g>W`Wb6F(u0`c|#e1oR;2+^qbI4=+SV-IHHGhcBr?Xs_q1~YRgR7)^*)rhE+ z(?HSgWvOpd4>e+OQ5jL4qd`JofQY!35qO(}pA-Goe99nP&8E`EXHY?H+vyj=tKgRl zGCVvN7mN;x*N4(xpP6|5W!tNujZ(}jZ!Vuh!V9K`?0(cY9-jF5mHeEC?d5_D56{QN zU^d%2ANZ&q_n~8Yh)8jDaeI0{c94sMJ=r7kya#-N@-#x}IkM1g#F_Pn_oi<#QdaIP z^P8ESd)$3O&95$|>=xKq;8k2TybzKsX51@jef4K}`3|m0$}+mp(O`VQof-sQCGQ?m zbEg3ASU^{iV}H>_&>Jgf-72WC@`FJm7eAM(Li33O9B%gKHBX&~K%S^U$&D}K#b3JV z*wpVe$J-|6NzF-2whFCz&D9;71zyEPoNJ?MI?X-1+-b%d%N_D;`Wh1;8nmx$=2pJz z)V_?m3mHE1m}1{!wPLatrjZ|OVGg)IVRF}hyiFY&6UDgb?}3P}AKeM)9A?iXD54Jv1`wE>qw zbg|S*cnKe*+npS~K>l}aUCM{ne3?uWW{ReyXZ$*b7GxKnOapLi0+MEMYIq+Hk*VB_pXDxo0y zJI&q?U#@ebY}E<&y#kx@A2~t7usX$pgvI=l@J4Mvk?AL^+O!d4_++$$C!#GO#WQK^ zUT~!vW*N_G()YxAja~Z__ELrEhujpTZF}hEh&Ahll)zZ)-y}+6QU1Xx`=jzkyL7hHP)~%~>KD|!b zY*+wR$)AMLO5QX8&rSf-0Eo1?Fb%-T31Aw4Qxd>501D2$n5HY=w;>O>LmEmHLgb2e zeq6Ln;2$HM)roAiST6utss3zcsk(c&u{<9uQ|0feN&Z^U5osquj~E&)Eeb0Fw)KX>QE8~Re&#Eraa*gm zd9diuOar288O=Cm2o3p@kn2E#Xg^e%emEeP`(r@gFa5=)w=#`3Qj2^9IKp>L#c&C= zLgD=85bma`!S&{%1M$+wT0jjiIv4}`f1>Z?-`4zOq44cCg?o$iSRr%PnE%-1 zlqN1-0=;$^Sx26xXTeN#ZtJRzD;l+?`#Kkr!CG8jQeU|{x~*BVjWEZ=o+vL;_iZf< zW5PqM;kYB{E)?AcEpKu`^EV`+6NS$6^|d&3ZL-=PuIA(0sjMxI8}=br5Hc!Bw@OEJ z4>RbR&1~6qnxHl$8(V{%S$+(^u&gp4*EWhqw&!X&sl5l?{?l%e8Me6nXWLJ6Xe@U7 zPyD>*Zcw-Xv;*Tzk~c#%tCL5w&^|nfI~QJPa5mY3Tg#cuB8F;C91ri_IwG5LN~9LV?eF2<)CW1R zw-t*&5>bHetTAiS3PZwgeU{ZP9oqB{5F_ zS(S~}D3=(vgCr-#ROXuuWLxn?bjRwYtKlRr)lL+rllj(&Q`Q9InjBu*>`eshsK@v& zbP5%O6Vt}KWgGKsZ6aW~Lg5Z8>j;>6V`t|zKGj98tTRZ1!nvVS3G6)DN07i$nOA8R<|IYBWB zk5z;Y_l7nHN26=Ko|K123R~m3Ze+|It5Emp8MLYWT%`?0g=26PUjn|~*E`kTl&t*d zWt1wnxc%^W(c!CR-&v>E$$xhTkS>ZVr@n1KF(!PUI>)_&d$lOGo;Ca)v7t>?uA{2X z30e2mnTd>1A=tm$UgJpkW?ai7dBul= ze>t==@FhoC^T4v-IMSPX9=Nv2^^Idc=Fsu&yeZN3qidALxt`JRqgP-WV;{Nd{46&T z!D(jlwK3zV7+cpWdTjq{pZ-MRlJuCWo4&QPam8~=PQ>4E9qz{mZD*A!fT2NjJs@1Z zwi9Z5vx|xQmi`*0ppnO&Hd9$29UA*LV$mxF9!<5;uB5xj5k6bRsdl0@>rs65=gMj6 zAAGiExO090CA9QW47#Z){^>@-NNs(p!>r4XyJX|#7iIEMTiK$o@!=NAc*5#|jSoYt z$m0!r_3M4B-eqCSE^mGNAX#o#^yd?4+mVm&37ib=M#G~)Tko%ub@FY@JTV^&#ev)0 zx}DGD$sf{guM5o4o@nI8cWAweEGbpkh!|mjP{3?7+(cX)g9{uS+VRb={22odvRd-m zQWfiqyOXi^k;r0198xaQHf3tKyV#C*AvuJKDu=hk`@)mJ43J3}fFDOpbzh?A@)`g1^HNpHOp z#n^hR4`$~o!>vxyy9o=+3DLVTF(~D4kU^!n{!Rw%UQ#Dyavmh*$wHBbi9$X{uZ7M6 z(D{hwaAoatbRBqzzRo%9L`3xMhREa47io7CLcHBk2w`*|g(!gdDCGTZh9I^iShT&G zN;7?qX>XABY-zL8=kXC2eCtfLDN9D}0!}U5E%9eiMFzOWpvE*BPW;BJEiiErwX3}; zk+luw<(qSRP$#TE_J^`P;Ts^OJ~W^CIK^|Y-t%1+0tK=A(1Wp9T^hY(htax$d>+{ z4E=G4n`M|A8}cV&NZ2#y$&kpFULr%np1Fq%347)d%P=JDnTN_IVb45ThJ-!yPeT}7 zwjeZGIT&YTIhdCVIq@j2UKUUVa|aAl8GHC~KBA2&382cHLS|pj@ALeA&2JtjBya?7 z@%t#)_xa^n5UiT<`#k17Abd5yRi8kiPU{fKx69fUyI<_|Rnv#hqyDU4uKEzECOviM z7s|OKWfz!-CwF?vo`<4~X80aiTYNf^b>R-rNP?sKB(d1KSBH+wAn4EqGtj8{v~sEv zwVsyyYTG@tkKz**StVK@Q+_g+Rp-*BCoZl!8TDlThK8aIGfQgnQs-}G1&Zs~%tB#i zcBT5G+nAA6Co8EygIr9%%gylG40Sv0Y$&%yG#0GApXQNrw)JQ^bY`p^INSKMV6^cX=lRp3}3@*HEyIL((Yy?%BPbFOfQ}Sy(cY& zjax+Ev-GE1kAQ6;bYkElz|60mnk|S;HfN!v&4(>0^*j-!bZ&N&?f80;62rXsN17L} z(Wdhw=)&^^YdyeSip)wI=MSJ1O1aVM#8J7?(TTaarN5))Og_uExlzqGi7vEC_5bc^ znLT2|D%#?``%w{WIW@VQMI~-rgLa+?)+EV<=M$_8yLlo*og>gC)ZpW8a>5)*q0D2k z-9TWm<||HkP;4P-M#eMZ*4mRc&$EQFcXXtqS_(GYNu1yW**k9&#PQwWIs zqMKlgAPGm&VBV&cd7EVx+?+CAPXw8beJ=;7vd&kpdmk~=3W39Eo8W5Fy$NQyvvJm!FGR2B>#TCE6R|5q zuLEgakJi?bft~mLFU2MIw4yPzm1rP=^>(IFnRb%5In0TA6H+sD+`; zzLs(0h5WcbT+fb(gN*gp$Yg<{cnhxZ6Bk45cgW`GgE=eD!F+#qd~dA^RjTFuuq##` ze@Yi?NxU~*#ayythE<6A0hg2N5Qh&M*0!uf-L_S$VsUV;j^VFe$ynL3#7bh(TkcKA zqIX6tdgEBI7<2WloO6YYv8%GFjM*2=?Al$%J(iq$mYlS(2^Bt;n_NLUmmm0>{nm4mqGc=aotY5A%XfM%=W zP364HGx)IJtx_8;_r!UYOXpcmd~BKBlxI^HP`=`|(>Lxp;+&f$GmN3Em&(=Mg>*Qj zg2wZL=(Y4PaJtt|P}hLoYPXopZ1&AYwq+qK4V`M$l}YgB8vm7tgLeJtgdiSz*yrDt zPU(!d&$7m#o@^%?jECwx**vyw zmiCu^Czq))I5F_B{_gIJXKO}X&7|Zy;ohDGTZyV?-FY-i|4kp#)ltXUFjO8&SC%2y zeY@7Q5#~$B6!UWR+{-AV%LN%8UT9n@aom&A>W(}G(-}#+Vvk5d9Vv9WlQ=T-%kwMU z@TT(oq^`P}y79s!KG(G4Bgk+UpS))b+ZU^|6gP|_Fj(wi<7f3y=K~Fvy>j2Qba4;ToujT-bG?o0Uz}~+tM+ZBLmlwSWg}NVsx!YCwx@)J}{u6zfIz@YDzo zQ8nMPRJZF7RF8fT%4HSbvESId7?{ zX;+WmJ(Tb+=0Lu|Ev5$7I$SHyyGB;JQ+cTB+L`r%Tm+eK*;KXT9H`Ry09L|n)b9GqrJ!7}I2s3Z zxi6mMmrJdSl$d@v^IjM?uiU)3(VHlW#<^S1-?`ECR3q1Mba#SX`Rkm(65X9$TrW^3 zHR;2(PYb>lB6OGittlcsP0mTqqC~pGqOoY;9UvGL{Qp9rm7(lb0#*9{4~CiDT0#}(Ab&oz#<(&>v!Cuu@kPAXmR zo@JHMRYbX=p~_I+atpjY{xQ6*ehuXlM@pm2V9yrKNAKB|=^@;Mwp}eJ=(L=kxYZQP zMRUuezBW8*y;5fNS?X>!T0RKubLvR({hTHX=4mchYZpa)vL zSv!r@T%28P=DqoGE>rZ@t3jir>t+%y-CHk6t1+q*U7!^>K1-FY?%BDcc;E!VReW9KW!| z);`QlGc&ZOzMO!Sq4Wjr@<(_-SrKb>rX9f*!A(_{L*F8YdRz`^B-CY-F{~eG_Xga< zpuB81Nek+}jzz(xuch>5dz7SXcal1?Q0tkMC%ZIhU8!xgy-Cv+)mb|uZWo75kr{(Q zQLXmiPPNX))tX#x`$;Mg>CiLJL3hpOmanj!m212)!&ZomU#f7;?^1pJc=*cGX=?wa zkF7;Dy}a4l$PqUJodupuI@XeoYO*~h&JJc5^_}yDn@hpHy)y}#=399;7IO#fT!s(l!Y(dE!|Yz!Y#=_L^i3j#lVhMYj?Vet ztdR_UYTdQU8o%T|s!t}Ib%V}qs8k16s7G2d+6H^C1meoO!<;-_q{zhvz=3;(^C1z${3k%-AVuR~$`o@eOlVeXUVXOwtms+dXE3`vslE+Iq zlRVBw-xBT$fI7R$f&2`q<6<`?KH1Da>96)9KJIi>7fVNncUn~LU$X81W{sI?tl!H| z@I<)k9;Y3hIJewyd!oDN4O#j(mY}=C0F+tvb`)>@_R2$L;5AAe4Ec0K6V8+~d9xd~ z#RZ#Q^9v@r)em1rGt$$LP24*9#QBxqSOu3Y)M$GqO+9)EmW@N0rcz;~H=(?+5Y%Hc z?RRI2Hl{WgRNJqh$BSzFEuLWIf34a~>abT$wk_P%k8}a)ZQQlr!YaPDGtIRf>(Ez! z&be0rZW3GbY=>8O=WR;jTaj>K-pv`ydAIiP)_+v7;zIh*TsY<;XNy63xu7!&d9NCz88 zujIpC$katNOk=S&4L~yiOw;BEf_<$x-IAU7l;)GB{i*w{S3#yrK8ZO%K8e1LX+!*B z#W7z(OSS~tv6^0w2e=V7C;%cMqrS1(_+nh1_GDgeIZB>7PNn|r^prgJ_q1*$Go~+- zq4id2FGkzLwUHjXmN$KgY4ZJbwk zZB#f+ec`S6p1u@=;-ztjrlz+%m=|W@>~7s?Ipa2;O1WT4p&QFh>$TYM9Edqv|7)@4 z-XuhKreN68-9z^KMA@;Yt=5Dy=4X1C&SGs*W)tbl*@4oi=SXfNnhh_>d)+)d9Fa9Cp*blvk@f}}`Qmnmg!zH`-cF!<43BonG{ zhwAuS;djn$uKY&)ziyPDQuaH#(HV-;DRG4M#xO?bZg)xFM0#0zT2#wfC%(s6l)8gu z_u&wt#V)6%F&Di965f>ZpWerK%5pWDczBDbu~(^tbKkjhUDS{w;VYVoeQfH$rrwn7>qw; zcLRGebl^?~qg`(GmQTG9ipzPxXIh$|<26(^)UIsv>1@Q>b9{l^65!eDX*lOQe1Xi5 z;R}2Ve!BPq<qH~VoM};ZcOUhfKuU91F1a;iL z3>4nd@OH}9Mj)!W6744AmJjh9=vKm|J1E1wNqXaw9o=?vqkC_{rZ7yvqQrkEj84eQ z?E%%m9gZrl#(3Qo;pNdwiO?1f6iY|9a_yAH9+i(5zLQ9k@Ar}KB`Tbvm8*T)x2IQ~ zbJMz!jI;Vzw8@y(MyKy~)e|m;egKlKchUkwrZjc#?ssZYOz~Gln<_+E^km+_Y^$t# zAAXlO&>lNA($)MC9!cm>a1Si+wThB=#HzZJ6Rgtllyg72e1h4Z4zfqL+nU$M3D|iZ zc3yu65C^sUPulv??b>9PZ;g!BVkt7Wcf2l}WC&0dsM@>9tFGx-^-c0lr>rVwRfiG4 zqB=Lh7dZUH7#~RRg%000#)lGok;7{-zU?Hl1Y6CH@l1oGJ%5suH-)*_+*12g?QwRb zs=CdkDf$?Dc7lm_@#Mq+FQ=k8GD(lq?i1p&xUQWOt}N;=io@+Lh;6p;x8j8E?5iId zds;TR$l+GM#@Xms%twnZncKy#`X(22yW+IaToqgbtyZ%9*yEm_c6VIvR}|Zp^+pv)$*N zcm}Nvze3KbKaP_Ci)nFq?I%^O+ErCM?v9(pRqiBN-Rv@EW4ldsqOgppO1MrKaoqHH zHz*$$I=rj)bSx7q^@8Ks(UK&Bxf*4(><#EfHTL>ysM*aZm!Z5R6TX*hu(BYX8fR9J zgoEhYtX6Q}nG>N4BNbUtv3Z0W8%*+#b>LhtQdu)vxVg)EzK2=9sN3DZM$MeYS$0p4 zNyPBP+F*3RtyZaz_U=TD`xkQBd>v0Dh4e^83!>&5;Ou6BotJ>Za$dN#!*H!dhJUIS zAx!75CR+}F9A7`PBhjEcp&b9Hy@(Nrjpv$2)+OJl`7(Uza;vP| zoA7qm#>vggX7YEc|YapJVcL@>t1*_4lPx3O+h=?rU7_)0+B~*Kwb}X)Uq$qQmrA>+PoP&Q5!>;FE1723Ow8qvf0OA){Su}Qe`zzjb zucQllOpw}bk#L@&`AnttC;^!q3(dL7SBLwR)*oYw8SeiuoBRLXn)_-u{jPAUty$<) zyTa{`PqnpG`ip0wzj!wKi)W#~cY=3Z^GePfP$oa3ys{6S)Ag89SQ$k}ztE}Bbm%62LUHX|>^<`KpiiLXliNS@6QY zqAAvwy2Qhroh5`)^SfjM_swOQboA;Q*39OAY=-}bJN~`!Z=#|uo<4^Af!1aF)9;}x zpl|Y~q-nhuW%_-B*a!IkIC~H9DvRuYd}iL8o8CwW2`vfrl1f5HDFPxQQk5>Ef&zk9 z69gm#6X^;_6A>FCSV37UDk>_*hKdbcb+I99VHLZgi~rB(%-lCOyYBaS{=Ym=&YjPk zGiQ2vr}Ed{5{Gx6LiYg`qanPXT(q0J@M~qf@ZV@RvVmP7{J>ubp38*$562JwmE({8 zLJ-3n1~tm(Fb-Y(m%fMpO5Y>2Z0PnZs>42r{|L?*v_`vLAHOiZHxpJ)!W0kkJoM;a zc)9y8>>m3IyT@twpXu}jE&n?ld;Y?GJVqn`Q z3(vB8!VnD{%1D zLw5_egUHoOC9te~9u8}0CHA38^y~br!G%ci&f7Yw=1vH#kA8vT!FZr<$IAPH!x(PE zTdT0QFl_LXaNzbxJ5rH05jRuVm029|uAhG~p|uFs)>v6&v(tcbq!tZ~!RsL7HeR$?E*{bz+Xv4gUU3{?bv2Gx6*M?tHAu{TdGhC(3tbmhTCF()4AjU<)Mz-?Yj zO;5#^5l*OWO;5#1emMup9VHPvS#x#5+<_Efr2U0(S~wTMOv1)v=3EAM3}JmWJz5e_ z0*u4G;uUw5#LLPM=91e=b~G8=HlvZ`NqQqp31fvcR0ydI>~Cc_D>|aE*v&xrj;IeW zXC`DJuG5w2u@&7Z^a6@FW~=ID=w9k*=tZ#Hz989fghkj4yTKu@enDCGU`6dP!cvw^ zsZ19`*=K|(Hg3Y}XzgwzY#xiPkaaS8AHDYoez?6y*lkrGLMOs)gy|4zVuO(o6^sFh zOpe`b$Q^`!FtV{H*#;;(`#+&TZEI_J_y%B zM>M_)*lu;lb-ld2J_8eDY|h~GOGrN34q}y$?H%?*-Dj%UP!~1Bm%p^wINrh}g(&cLbxY9^+H`hXFr1q9^oe(K*HHNS8)l_5v81MPumQxCeV}~ z^%#Prdm_d%(rmdi&pZ<1j68;2*#kt{HAGCRDkJ7f5x4N55G6_>!Z8z(i<5K@mBSr+ z3q~w_fLAjl%ZIb<=GucQE7wFEd(oHMuybTO6)_JmnaOK%svI% zkTK(1MwwS26S|xn%+(ZT#0K!`Ux8TT^ZhFPWW)uqYQa`I9Xl=1j>|$V?!05caAi5k zRW2;pW*xv%fE~O#X|#+{#wtN+`$x0w$0NLyWe%a> zb6Hy!{m}PI4mUD**Yaf87IlxS*op*->|o@^ka)YyWWyei@Srtgg_JfdXxF>lyh|eA zBU5AOr>Mq053DFsb&rqGIk-(E@4;~q+FnueKC-zeHCiP$PdVNnh?rX1%?01BC&}9gqge`S>oZl7kJ>gZp%qgtNY~0)dw7@u%4D=z`zEe z;k5^JI~r~$NSt`%20o3TzSBTcbvJ&w1L$?ct+;bV$~n>=-2>aUiD-^!aH-5`L$C50 zxJDX?Gu(9qSKKv(SiJ#bHLYE&>UROW1rEl}Z{vp_n1uWlEOAG}z$bCtJ6XYsMhJwv z=hBL=OygQ~BcyY?U`1Xumr7Qm&+xe=^<24$$&Q0Og^R4zM8^N}A0Um1;L^}L43`8a zC^UQ!7DY`$?}|M&2PKf<_h7_s3xw5^@6>99HLvc~-IEgXI-Gs>_Tcy^Rbfp2C5-hM z^}53E3nR#H>&g$PvD}0|#IM~3fxhV1h%QJK0-YaA_?Rb%H$I**jfg!dQq;C`v#t%D|6kQV^_SWN_Qk z%Yn=hFQDJV^$Sj3e#cjIX5p?Pu$PXZeM~60#N=`Rg=hT;RKEx|yn4wwC8U>vF}cFp zW3Tw?DcWdnwKb!*^Gy|9@D?bPEi%P8mUGRrPa`x83UGr|5oXCtT3KmN+;nPW9k|Dgs$M}?abUyU9DzQk2y zxGC+phdtf+=8!+TDJLZ+C76|&85+wB;B}1H&jUD)5DCCg^OwPu!Y&3_Fx+G?Q2eEj z{AKj`D?YL?iUAf3if9l6vhRJCQDHC)cTZ4pp0Dp zlFeW8`78XZjC|j?UAt0Ayz0*&0ey#^AR!$Hj;>6fJBIxBG;+lfs#=)oG0Ef|V_>-> zKssg5+M}xR@}+uvE04$@p*Ey8%g?|_y8nl8rYLd3CSbGopKxfZNQ*NAMZ8G8K67cy zu#0m13SMpUzCjrL3i}Ne#8iLFA0*r{=Z4mFOMCu`{VgW%2e`#c?f%ZrJBg^Zw_OTCs2T3{q`S`_o^v@U{L_U z`rXOPFG|-hkZ)MJ{;=}@c7lZTP%u8U0+}J%|Bt>hD0g_F8A~^^H8!TW)q!9nM*iH6 z)xI?-gZ9EicT}c6d%Wrs*2h2j6H|@;L_DM|J*G8(#eS>(Epj-FA*%g`uyT?gvNa{r zxs;nKDzY^cW!F;|_+|G?#63C-U3tX}7?Phe$5IuIg-P)t;b7KT@i zl{*PF-7xgD=C8ANJ0sbKVeM1?jJ@A%VL)`^vb>$Br*@wst;9Yw552aL+qI0`wq@is z5hHhS8M$7|$Q@lq?(CBDBzAmcR5SQ8iT$};?B$+w@MQZQ4ijuD)T5n_q;oLI>P`#^?~k+$qe#vuw5ebE^5jpHN!*<|-h zy4ei0$@{w^gIQTr=>VDa+O|2w-Q`Y;6{fB!33P{y0v{%5J-H%kX- zI1lM62epxy^t~tvZfFR9jx5B7$gRjHgp zB})_-jE@uKtp^7Fe}&y@Kn%{47@RMZx74{39|`;U3_B0VAnc5+gq?=)KW*4K$AqwN zhgEdg>CU-8*u??&rbyU{q`oukU%0S~0vq;7xj^U`uD{C1|5bP4q&^ane2mgZ=Kmjk zHUyqc6ocl+jx)D(4A~N!st3`;SZmpDD|LhIL4v}}j=F&9xDPukaFty(MQtgM zI}v=IcdVizO$c3qrYRv#6#d_I;D6*=qRnjFW=v>-0jcu6G<~$4gaHVB9&ReY#I8$D}lipV#P?dCisHDb5)x7 z!f1S;=XEu?F@hC;l2*76%zQ-93?4ybfN3XvM2Xxl^ z_J8Zdjx>o6-fH=;_`u7*VEZxre`5RL`fJyIy8JcUPpQ9V`)T*r?E2Jna~oVw#rP+^ zVjj{tH@)&Oo5rBA8`1D77}+~N7;;lt-y&%g`U;h+sJnd`WEF?4?Dd-kW3di!5!~@* z(=VYcglnS`ZjnXHAP%y96b!w>x&ZHGZe=|5UI@KeTngp#U{Ybf*rJXm?pmsBdl_l= z_*(v$xDC1SWsMuKa^uGdF9;@IJ3OKBCdxQmnOypKFgM{GdjSB)0~zqAIm7=~?`YUY zaE__OM@B+*C$?sGUqPjUMd&jIxWr^~r2D3Cj)|D@Rq5=%`fm*})n!x{2z>yDSULDR zfACzuNBoUakGY@(?pJ%HiJotO#L;ILK3TT0abErX747x2g?NHUMrvvn@vY{(s?@}KdPpC{bIm*nIOy~^u z!YGB9i^Y8ufzWd1IO{<`;fHVZrB~LW`@}e+ngUiUE;@gKeJZ|U6GAog9^W{He%}q1 zm}G#;hoe;bI;T_Ti%uscY<5EDOVqiHI;A*W6|Hlq7fwakOw}WB(coV8wg~48>U`Ph zq=c{Y6<_Bfszb7{bcX-MD2InIwv(c*LT{6MChgB}VE;bsv1gkM&ZPh`ec1L7#TOd? zD)F_QP}2vVTT@?}9>l<<<`kGJ)}S@B&k_9y#}ykI!p(#afrNzn6yb+HJlv2QxDeb% zAXc~~VP78(A)M^PX@nI%oKJX%4<8|{^WkfR$9(t)VST8wF9I9@V*MRSIMavo2$%YB z4dE6aGQQG;hkj!8caY1so-BNba36(*dw}p$A08!~HZ8)P2UEp5AKpUvkPn|CJmABF z4dEArCwy*jI$#lq^|v$OARmq;oaw{)g!P&?6F%T`_cr9d*${r*5PnaXH6!A09!wP{ z`%tpG-lKu!*25VM;e5i)zT0htdwf_&Snu{j!mr5vp1JTVAr2fl7za~DrVrZ@miVwI zVLu-ZB^>L+DKz~+rSp8#8sBtBQiQwNx4XwT?e@+_Zuz&FvQ zc-z4}W400>_ZnMrWbS)wFvm0rUyjaTYp|)*x2-{WiB=N8vn)A~B<0tC&DQF~ULN~2 zn$;QWbjId5hkV_Zbr^&Aw=swioz6R}lO?xc;6he*6OKV!5ROMs3I;D^lYsfL7_>y} zm1xDbp@CJol?wezCFPcH0oqN&btyFy>EI=Ze$VQ!fd1l;31fZ?+o2K*b1=}s&T}k~ z2H_Wun+M|1_3`CpJi7cDTe>i&-mtOZIB57XxR%|Jm=q5E34cS!nSHMz3l{c6_@uuH zu=$(=$r@UTedu?%F2JbzQ%K5#zo9h{2;m`D_kF4rw$s@+)3nxHbn)0wjPcI^`5933Mxy?(EvU2lo#^n$HL_Q?OVu;oe$B&8w6u=yv=&vKxc(;g-+-Xroq2Ku=UKniASr@30lR(;_W>t z2$1BG<5s!g9)6YI9*mW@I11opRug%C&g%LT4q+En%<$19@egSx&6}p;2vaO=Ch7uH ztfDzgQLr~5V=P?B;(~?7`5`&w%A2sH&=t(^`7CkKGN58T_Ze*XAC~;%SPd)gnD-A>)?pMgmqVy24}J1rKnLTwW2Eg8V5TVG*Yh@ex0ZR z%K>)+*U42Ub1EEj@LAYX##mu3H7nGLCR$<_8I2rYa;$qP;#L_88|*a*r{fn}=a_G? z6@yV3@USermeVVq?9vW1Bk|~5Du3{vIJnrH;M$ZC|3e=}%R#F&N?*k!=y!*6xBzQ4 z2drkiaR)cP`oY$n3AKZ_VXTob{6_9C!O$D!Rg&Lwu@b@NE~BHCdkoOVg3kmDe~t7* zwhV_rV*Rs2=SPOhk5VQM9{6Khp4opAaY8GPcCsy4)+c-XCn}G^2IUP;hhN$#Cgj10 zO+55bvNVK?FbdHVbgSGC1#AIhtLaso6oB-=iQucSw}WmDka2)N3Df52h^l^VDYQIuG5Axf%!mC2r&-4m-Lv`)BDUqERB?Fu2alLSfv%koHUoO

R9(39m<%!M1gFPVzwFwDj$Pm%qe5Z3nidpD{@*=T}D93nD&J| z_8*6_B*j}O!dT|Oeq+p-^OqOeU~fu-9YST`2`ku!v#}d1R{G)$Tnv(g#yETwo@ABb z9d#2v2O^dk6Rb)Bv&pz%RR(^?qbS5#D`$}rU$G0}X|YNp#keCkD<1ndn{X>|Vs?4} zG>7-OB{r3t*_x%t$!-u>G*7o11YzWkO}rM5O9YVyTwiMhWqnch?W@A3swYw;5tUAY zo{FHm4Og*MquIzvJ^c>B$A&8o{3G0OS5z4XWauA8L=)P@R-H{(sW4~tMghcVwrhOE zRg)ygPGgt?g}w0TV>*n!r6(7v<&5;dawoSQ84c>3t$T>#J zLiJF1>x>MLTOYyDlH-R^7o#tDE(z642_v^iR*&&rVSm9W0CwXP4c*K> zoqZWVv0dLcU7msV9t=SrRZ+MYmC{H5SE# z)yzk*Bs6*6foo+0!OdA-s29=~jX&QO z70*9{=jJ~>w|;j}ZHHRFIc6ILzZb&q%1+RL^U_i{aa@HtFXOa|Heqgf-Gq`O#{sKZ zWHD4@-N7@#)vQ~wG1bHPgFv#BBBxP&Fx`fyXR{<|Ht-k;GE0RK^H+>^22nW~0l^rv zi8En%-HkRFvoTC2bShB&nC%RN|4M|P2^7W0z7xczs61BM{{z^-VEc$pv9Te{DkorL zExU>OtuQ_VjXdY3S3++M%Z2!k4otMmNDT!-S|w?AVhV?1(8OjZN#6XGKH9c3d{!A9 zwzM+!&(`t*VA?XlQa?Uuctd=x#d%t8a%QZ$Ia&2@7ogA!!WaSum+` zAkxIXxrddq&?q4MN;|;5wwCemLdPQ8dT{_tHgklALJ%vO@m?_01Ht0KEVdnJ!y|4^ z(9JXG;OK_C9K@k4g%;r?2yLRZoaD6FzJX;6Lom1ZL-t-I7Z%4y_FkL?$Fg@38I@tT zV#L}TpWtgkQ6MYnP?jCB6~7WaTx(K*Hp`afB-P{8$bJk@t%ZM!#6MZD#j!Y3WU?@H ziC(_Vw#&rw%xX|JrHHWvf)?Vbh$xZd!js*qbNy4S5@=?0QBw@Oct;g#|0aZ47P#%j z8&GFo&@12D1dFmZ2n-P(fZ!*iWE{fF^lpsb#RzxhnUWtiBk_#mSQHVq8Jv@zj9>m? zrznJqafjR)_$?Z0m$i!r+BN)Q_{8P^;;weJxwyoxHy2^(;qQeg&aunSSVE54WPnv> zE`HwOg@#daE}r0q_q;BDFGlXw1lB5Y=n>~0d*V1FUL8iIl<1UKj)c?bw;vO@k3%hC zo>WngmrRL+2BookIfPu1JR2GkJ-fo5A-DeX+Ep&HvjlPl9m72S6y?MfrCMX0yMYz2 z6pDa-Ca?&HgZwyWb;KRvM1`31=P!;Xa7zV+_$#+-ix3fo_{(!DlALhNU)u8**LTa7 ziDKAucLeSE%Wd-98xkvYaz-q!fMJL_mEm*;eZ?b&P)XIDTJniQ3gZz&sH0juV(1i= zw6^!*+2;^#(!}BJ-t<_0WXR46Bu6kb2C3Ea*%N>MDQ5yWuH|_`dJY7GVsQnKDIbQ6)6%gu!4P)sQJg z4u5SH2`AZvra?&tdK&B2{@VADMIs|6=p5VMD90H=Z0*8Dc1E2{u^$Ky$nDI}?6~}Vx9~3tUV{#y&32tJhU#K;K@-;H@ z#NnWEeMaKTIIgI_T-KP8kd=Y!Qzafrg}Jdf0Vsh=O;6yRpA434R>X(WSbj65CzXGI zt3zc&Vx+&s(KK}p($@>{-cGw8KOtbdwqQ}~*rGgp$01&*N7(Vyr|mOrU&k3ww7cb% z=SSr(>yW3o4vO(jx;&zZ@eMAQLF>Wz2f1|0onWUiSqFl!pNQPy{(re?SO%bh*=idY z+g90z$~IEAfwGO0ZQ-K!cG~r1`V|QoV~0Z64uhd0+*Qi#f@=1U_BKU1&(jLrYR1HM z8Z%r;_w0q7=a3Vqo`j!*o&m4&g8Ee9-ul^JU}zDV0?UF&OcjOgArX6hBt|6k)Kt-V zL!TpEZlu3miTtX(2zsK@m~d12i;qi@{GNkN^!cHA%#=_w@($vqXgV$OiaLm!aC2B&ec=``VgzAb z$HE_^Eu{;7t`F8TSZT1q!ZrqYP?U+prJ?#FNW#H1I)Ggq+>0Gkj6D7dlR>Jk57K5l zr2uwu3lH;KBEc}w1+SXIl1eq%h*fAl9BnT`i7HV2Mh)(#k)8ZY!vCD|l8z-^I(93U z4XrWqecZfAtJVwAui^LC4NA2hHM?T^B^OoFP0ce}4Z^<8)@P4WFCzUhrKeh-cJ}Ga zhxdRlJr}s&%<%aX#vc}9(#G7nwJ^RV!11=7_?S0+KSU-Bn9^04$W`bp)#8~Rv|SKBN_e@gpambwM)&#WmCmMdw?dW z^HWEI&Ib*u+ftW;KAU7WT}RodlgLA5E3zPyo5`bGBTX$h)#4(T|d)j~H3-7oZCLQ|Sjri;+ALaRW7>glFi znnI7*q&B0>$wJo&yi-Rp1siQ)hwLI7& zMSa(v@hu584+YhmLOXV7*P)SmuEQ=+T|inQ^z;I{-41h>Dkx4YZlsDzvPu%v!zJ`< zRw*?+R7xL5b|k%|BU9$lj`wy(2+tf7P?sItwJ9c`qt%i^-rNciA~BJy6ruuaL%=QB<4Ybs&>wKb5MRj z6V%gU{#fYmbLelzT+%k63F^$bEJb65&H@dpMZ#Sx+%M)b_2ykc{eNCTS26QRn+nYn z+PaiB?ZjLnw2RQ5p!chO^OgERj{^;=&*nD|HBxC+2U`Ty8C7(3r_jfR?icz!XrZ$5 z8x~OJ2GA_^*@9OWWT`(ugDSn6d68Gmyog=MuwAf_l2-`*8Z=AkD-(;eRJzb6LI(-G z>&jObG*S;-$sGCQ%66bNHFW!U4O8qTF%PMw&M~#LkG-mSsHwXAs_|C^)m>N7=9jBJ zg*kf>%^{(sLc0p>zqAl~W-gtuw2``DDa+@>ph4AR8ACN}8N+{cIrTSN!E#czf-+N9 zu$-(A^An&!)$eL@pShZ8_3_n|Z+;Ew^lK*IBJ}mwFyvc=J}mTc&@AyjOMMH9 zkgsglp{2Tg7@9 z?RdY-kw&X0EN!LETYcv0pgMRhQ{c8WOpRxSzP^Sw->rFjO;9DQCCyt)o2A1@2Z;I4 zwar6Ws%jm>|M5De)$c+Zt!KShu%422ppe$icm_2Uh>7zNwbl~k+SfSSum z1tN|1zAxr7V_<40ybBZx9!79sL7N=9Oe7xwiU+S!&^vNZlyBe*(n-J*;Zs-yb@~ z#HeC*KzQv;iWva(mGF8BD!~dLLpIb*G(%L0@}MhC%@Ks7F}fBLGb_wGXen38nyGY$ z*@gb8Ts6bUDNXGKBCoyh-hfV}df=r;N`7oQfcC(<7L@!3`eT6367;7@^=9HU&t)1= z6?-Rp$w=|b1)U*i01@1c28vN*9GW8Ne5^N-7xozH%hZE{mIB z?(ueeD{%^;PD1vM$B5cKrukC3Q7tvMswAh68FXdYMF;OO6gx-AQf8XsY8NF z1N42K`b=~V2vFw&Jd{q!k%8Ta-vX70&%QKuUVyn$tuhVMr6O>$hgnWlF1!UmF+g1f ztpM7iu2O>pT_?P&)R}^|AS^4<`%e_KQ+!{hCJWjN-T<{sO)&wa=NlMZBxBBViSYgb z-T}1+h`t{~SQO^gt`*)N60)`GW~}F?Vabz^z^_v~1+@^gUfnOK1JD<0z1n54pr*P3 zDRsSiN_eM>GluxtfVYO{LDFvoTZ zZ?k$?B%g5T4MBB4L)1;`ov8RB94M}7>g||RFHPU+(BT;7%ANQMqE0VJ|L##qBAEsh zr+27)L3zUao9Zm6D9C(x5Rco#Lsb@J3O=Ix3$JI8`S-L#X9Rb{zh~80kF{fbkhSAk zHAy7T7xcWkM0~FdvShukE=PW+sjJ{_fPP2aA@0_Q@9(IcILw!(@Eido-&KzaZ-;34 zyV@)0e$n!G^}NUYdpgMacSyZ1{=FJZh0a6ji10piynhKg;?U0``3+DE+~ox5-@nDb zZ`2t9>P(Ae+5Jfk2{6s_W9K6*KdEsjN@=P~Y^pa;|DmRdWWQMY{)gg@9+YyR7@)a= z&WmNrD_t9?MG98OGF?2qOn6J+Lkw;jxjVqpgL{4Om!KaCu+-fJ6a(}~pa$u=JC^y7 zpdS-=&&9qGJ5ML*y@I}XygEU@18vhSb+Z_TB@lPAm!(?jmNBS+Dg`JRC^v@j%Z_8H zTLV$DHBeKa4l&HXQXt&hue%7ZXB^|uUUw5TSWvO|TQAS~N-xn3z~OWbaxXD7W;!np&I$*PmSNqCQl4_$$nF4%&NKB$Mj zO?dCahaq^6aGQks+c>7~$@(tg{RG|syvgy5ptyL(VW55<3-D+>=r#%2dAdj>AC70AdY&!~)j3k6NrQ$_M> zNXDQyx<+^#g;%N91T}ov0ThEB7aN54r10kG>wO=FV8!iL;k}x$4*5`v4X-T8?MkHbHuN)uUjSLxSgz64;NJI&`9yG4^Xn&ug@0V>B4*6p>aTWnK$%Ukt{=tnXLY zIdp}f&-6?Q*|mZ`*I|*|3iP%)qAwHlphFdc_Bm83KD+^xj2?Wh@IC_CX1;Og2SMNI zD&eIjllP;(Qc#|tpLDIDazVf9C4vSD`b{qrG+NLf`WitO3p$}!3#t*M%|=Q2>wsb~ zW3pM$j%3!&7;~RUKI+h`66$@)Z|P)JY+e)Ihsi8UWkBr5zDj04cCz^nT9o=x-1Pxs zDL4UMjOuS<;#gjiQdrJTHL-#+1)X8C1T_Qd=$&aoaV!&UQW%yqO`-5Qq`VP36R4x0 zp5kt(=_F{7pi!o?pkXO2pJUCyIQl*fTZ)Lz6m*rKab~1Qt`*7gW~`vQ1Wh!P1nm}d zj=@YKv^+29Tyv4|4yG{8CYzapK2KqvGsRR2`nRBq%oTAS;xGkGPmG#jt`u~Ipo>k7 zpq+wdnX3e);)GL-y3{O*LYJ9kQK-VK5OfRXk}%>l*9fv&W}8)lUJ>5q=GrKCbIe*! z>!_1z=x(lAABUA4_nP$QIfZty9L!QqvSSok02YeyUflgcXyln1?^u! z$$QM-1pOfBUh|-!=2w%q!#pf#qM)7TQ9(AG_nF59*|6Mi_QY{{c+EPx`I8)_mlvZRHZKaY{ykz|j&k>?*^e^uSjGx``_u`2L+Bx)KL}09B)3p# zPoX1(P7^v;=xU+23Ed&|1)+z9>c-U2PG}#YQ-m%Ox>4wDLU#y#PUs<_Fc;H zO~sWhF7>op)S?RXx)zjtuElDYSLZIoXlr{ebv}{12jDD(rNp9%d|=$}I4T2r#I&}Kqg3T-2_z0hKzy@U=GI!@>mp|e`AKu9Wu zULmwr=sKa-3B5_^Z9?xC`jF74K!Yx(FTkwTo2@4!z8{L&rhjrf+LsF*+pZGa+3h}n z%?6>ngudMFAhzKhZpRcm(e8biv)VJ)9&Z05%vZKZOw#I|_N_sgl4VMTik(fq>K5t_ z^VcD6B>X;91A08PBq?2;yl`qSo7y&)F~3-}JUL%oTeJ<7+9=bgPrkab_E-3;XR8j^ytc2xZG-#RHRx%`|OnnF%$*-SECZ&w7IWAO{PJ(=}^a9Xc zrRmt|H?TAxl)h_qRw>KUgwhh&%rET(y0w&=?=7u_`N|dxLHl<60(3yfqgWDqzGGAD z%BlCAX_AXomW#`nKHJLZ_8HLnkc>=YNJv%bNVttH9|M|JPWfi#6P!)DDqg&3fK7*d zHL=rgY55|VFKL+X(lfsEcx(hp>r7uVI$sR)yv{7`8$csI9>p02)H)@)F^x?nl!J&Z-Y$n;;g~+H#8XK zEq_L)Rw>BW>;A@}=%&6)K=1FnI?LvDq&%=}l&Mep-jY?OzUg}> zWJdO5IBks^+mEf>`TZEqS^YAa1f6|O|MOrD^`8OSsefWdQ1$7La;VPePnj|O7i0z1 z`TZ+lo+dVz33q<~1+clMe=X=u{g;5=)1RSD7|4_?5ISTaZKe&B)E>x|`F_wydAlKQ zL6gxnnJJ`$gr3M=&;-MVLDbM(Xm_EbgkCXdcQ$L*v)RnexZ%vrR-iYo?g{$Z>LH*f zFVrI>J{g(NIA*%wTYd!+i>YE{-HKXQZ&8XpdX!vQ! zAFxqpQbPjh=$Z~^GG~j0mI>`Dw3pESLa#<|JGy2t%+YSOnlbcg9D80c^hMCChcY#u z9C{q)=Z6Mb*w8XAiv}<*q_3^sJ8D$TmSLB)7*+H5Fs4Qw%%}@uw!NP10e>Dwzic~f zOLCXt%)0@@cS3%|@P|OFN3gxUegq{S9ue0PZM&HBM&`iWVI<>t-YBNSGovWe<}8MA z&slrGJ#f|`P;34~?Eg3`CO2R8Ji9IEl`YCZ*;ePfp7+$VscqcZC+D(mGDp5zHe|R~ ziDNqEY1L{BxwbDjUCcHeu558SxK9op4LWKJQ_1>x?iltOVR1We%=4(xCok*?ZM(-X zRCQyb!Z{`pt;C089*2g*V*j;J+jkEc%Xr;7b{pF5-D6oJ4u}nFYor!4l_Djx_N;I6 zM%UaUv|8vjLYE2saV)vVg`NOKA2E*9_L7NXsPlqxXXoQ&VrTXgQ^s%1&sQ_Y?*L`* zmap=V=K1Q1@ee^}(RjvU#dzlOTA`cA?}7b2(q1x-rQ!zc^dB`QqX|;7uNHcp(Az+@dITXv zo=#xOM4PP*OJF2a&rCQ9ZLff8bx^1+pSGNQGl6OK+XR-P6G8(MS%Z=$23wLl6uQ6jJjm~c8D(Bv)d_vGH8uPoX6tY89QL!;9N#(EI-koOhtJz0lHgsLh6X=s8S*31U-m&JU2WIxRJmC>bZz#;9Zx%R^_O zJ;mOpl{H^5j-j$OX!s=ddbdwv3hWU2@T8$_Y)u(m^TT;;k$w{zdp^z0gmxD?Qs@k! zR|?%AbeqsULf;qqwb1W`CSE{2?S&2zS}Am%&_zO53*9L64xzh*?h*Qi(D#IXCiJM# z6GCIBP=8~gt%Q~f?IrXSp=SymFLbKV`Jj>9*)(M*MlUxD-3}UXJ>7Ftc9ft$o$@zO z+XC2c0ox9I2@N=%GIdE4rrw_u*mjX#w6c6+M05Y#110DSrXDCMQzcX10qrKV-_#6o z)u>N9HT=S#O4_N>7xD{Y@yQ%r*p|Vz)%RS;_UD-kS&~1xFr~D$gsrvmE;<$;`R=H| z_l|Yzsh=U~sT998ss$CbccYflc8*JPa%37e`dgE`v9hS}OYP}>Qi-Bh9aVV!x=1ndIX zzQ`L8R1b@JAE;KJE#{bi<`UN5xuDecdosVRMi0a;i6x}h&K#ePv|2*?){=8!^N%G{ zK!bO2@c5sJ@-K4ch(}Wf{O&u7abo?TZr6#{PmC zivsy-&$=&C^VMtX#*7b2e;QO}vnk1v7F3^}O#1MK-zIVnN2$8xZD|V-e*0IKyrThn zumO6a0eYbUI@kamX@I_Mfc|KJ;?tvjZ`1(gHb4apP+0@iw*ea708MUyW;Z}rH9#91 zpgS9&2O6Nq8lb%m(5ns5hYiqo4UlRS9rwl!P+kKRYJkccpq>rT84b|r2552v6mG=z z{NZ`b`6Kb<88y}+@{BsqA(jwNO&7E@?x~C#pbE!hc?qcbj`uQn0kz2SSbAdAHI8=> zJj~`f9?KHGCLHgd;Gq;d9!plN+Uaf+Vwj#ma= zyn4^^SOyc+$Bs7uyae^7TLCw;MdH4mlo6IYx+% z_cnOxYO>?8%r{cg9Pc~u8mY@1k2N4eUEz3*8rJ|_<#?@uj>hUn z#~Th_W3|okSXZ*t4#%qiFH1e_c&s^1)RT^P4R}pdo#U|{Wvka5Z!>t=>RrcUt;$g! zIo@{ga?}@&$2!(j9do=#z-y|0b3E3#W=glRdGtDX%~XP*Bk`<%%~d1EI|g2J)y(l& z8(XN>j+dTQ161UAteY)WXU8iCuchkcc&w?p>Qu)Y241cj>UgZTd1|!doeN%`I@j@7 zi}Te*j&})o`RY=~W1ViL<~d$9c&${e%#uZ=*Il-VX5EsM{Tn zwZE;p*YTbLudRB>qU;y5R$`Bk{i}=lDr-#?`Y!8w?DnbW-6ChDiR)s%%i50pMuXZA zEsgsnYXR=_8tza`lNz9L7Qu%aRj8&3I-==Ak-FF+`cSN{aPGP{S%5t}wGN#IEhXw| zi$qJQy1}{oD(e>2QQhPa!&0X1iQ<*3N1}M0)YF2NN^Co;7osFPtGA*gyQq(&B)h6F z8lYnq#Z@=if!Dl#b?DkAyMT0CNeS_xn@aG}F5KgqBZzUoMRixr9b%|^sEJlG?zJX+ zaMEpxLw|3w7igA6(76{cJ1lVSsO4m}+#zb|r8YWuUiKc`<#UTe>DhaM?sO;@ygurF zhdO}QNA0!V$K5dG?!Fp$SA8b{!|UJ0O-B!uNxqxv5#N=$V<}LMeooj**SW+kABK-qeuGa zcy@O^Dhl=1ILsh_buq`YPt&8L&1k1DuAc6rw44X@#Xic( z*{x^#s8!BW4bTC7i7NGT<&eHi^>z6`cNJ=;L#=WS0Db7Ar}X7&fK>S-nt3!=o#haH zpQ|=F#2lNa9`cdWRq9tCCFyE)Q;2~(qM2hg>KBKYV^^t|4wlCpTcn!%sJC9Me)Z95 zdZ|h(h)9mm%hXJVm}4tcjgO}2tJPgTnx$8&JwBSNSE)9IRtr=2TGic0bM+dv#YdC$ zI`xo`rs(zRLmw^H*QsMZTA??pzC~6ib90kA%ST)E4Qjri#nKkss1^&_rwemF*Egyb zC3Lq>mjT_RPIhQW&QX1{y33)dIX~!Iuts4eSLGbnx2oo)L>tuIIofPd#{})udvoH< zZEA5xEBQ%Is@bX@c1YoYvfI^ehuSo4VYaFCGAns{(>7+i%5-RY(?WBH8syNLrsd{N zwZ@^hoAxw!;oH)>`>p92=595>q1MgLGWV!?4h?N~j=5LuaA<0?3(XGIrjvCyr`a5{ zQ{Cjy?ah{&`_$VGJ=tuvxnJdVwvrz-yWZ?lQye{jzPb(cfA&F?f1s6QO)*Zh9- zpz7O&?l!8QvY#*ysVRc?DW>(q>UKf4)qh0oh~hn>-tB7r8`Jz*^Qd~?q4S%+Y<8=U z9lE6Xo8~dKqnnkS-~4^^xJv47(cmD!`#IJB+#_vT5p$Dv)#kDI4d zb`R_B$>zqxPCSS9H&5{PszDBY*u0VVjN0PRSIwJx&#Lzv`nh>4?>QCM(`qp-3cP)) z#-W53<=*q^DTne~e6H)%iw+gH=;^(nvT-#COI@!P{k#{|JcrI~G1z-a9d&4Gi*vk} z)%iR=rfk`LMa>XYD<%0AwOr6fwY<`uO`&^|>U_N%uYVySyo4eKTTDVDR>)L22a z>L!Hjb+yBx`&%sYu(P)}C9Mx{s7yiY)$1)bd2gsbg7zt<(wl0yppEK>7TdkIRG<&t zZB(k|ecsz@ze5QvANAf*Q~Fw7tDI-OgX%pW?f2eO=%DboQMGURf%k!$?NFDNN4$Ti z9fH=XGg|)O9a6gnTFHqmk9!}f=T5U|ddo(EPt|@O-W7VyivPKJSN?*Yoxx`KwFza(f59@loU4?W!KN&m9r?*5`G}9Rt+(3|btCXE=|k7J_Qy zs&cPa$5cDVW2nDVC62cww+5)2<1r53t3D1f4&SRm4l$fRsNoJVoIj{>4l#Z|s`DIT z{C-q39AX@PQWXv{4nL_XhZu*S)gp%&ho99-L9G3A0>Ak2q-0yEX88gclReTju@Yqj`DT0{`~W;=IrG2_LP_yC?9ckCvkbL?&74k{K4Q zEwe6JzQcXAHSduCCWz$^voU#lqR=CG&jq{)FQzUJU*$e}zXAHD0s6B6O3jaUm)igp zH$bQ4zZm7;$ovCQ=p0C58Oeq-rlJ8_*#Oa=Ct~x8JaBb)rN3hHa}e9paa1JKfwNewnt@Z5;}>S%4ka#SXP>Qv=l1p|0SC zbZ>`-ffv%JIW(=!Wr-d1Fo)*0nFBP|p`~r!R0VpnLpQWJ2sGWH9pDw}%N%+Fyh1(S zp_joc(pNe3E_g-y8ix+IS&&$)*E{rGn_8fo96HhFkwA&w=1^kWJwQ7h%5J+rmFlM* zDrk%CBKk##PHwv_v7K8otp z^Q|@~cG4}UuoTqc%XW|ItV4p9s)Ma=P3)}aIW(^It%+Uqav$B1*i|2PXiDol61(d@ zQ>kUCngYq5dbmR$K+8#bi$fdQ-j{f?KIYI?pk5mHTZ_9ktshS8t=IeLsl-0|2_MxZ z_SJ_SY7fa%bhnGFyY{W0O6;f4^-*17f4$tH$Kb;N{hmYnfKJsR`OI6Y-fR0vV4yzB zp-% zBlYDDvE3c17dpf~b(CJ}5c||o`dUGCntke7dV@pkQ_t2(GwENQW}iA*k8+58>KIK9 zcrol#$Lcwb$3AtOUMR?hY`k7)d6=udH84SMafn(b>acA!RomzS&P1Ttesez#ZNf+wbVd1HBLqn1-(#w5xcG5I`%tw=xX6OZ%QW7K1(DbC4 zdiiA*)d0=XyBt~rbcue$p<6>gcwzm$L-zq)ssk0)-P4e~OlLdvk5ENYg&rr!#zMYIa@Dqi0OH`KI#zDbB_K|kWJ6Ix^E?YVEJ5=G*8>J=^IsShwGEB(DQ_6zaOgf zZio2&w?N-7Xsv3u@SI-Nk$gx_?XZBigUO#AHP@q)I^332kNS7GGYXy2;l3o?%H`aR z?(k3)n$h98Ks|4MhsW!AF)KSfU5}D)g6}oHmIEDLNUBFi8}Kp;UajZFvZ?IM2l6Eq8`cD=^^thk7JaLI_(OJIIi2M-*$*2mW}#Hhd5%{sPn2Q zN#76Yjk>3xBbu{R*Xx-M$$XFg)u9vFi}ek<>jJtvqB$eDSr2rGb6q#;vmD}V+D*E~ zA15Qw_U&Qqo?#;`X3H)-t8XU ze4*9C8M7UFrbCTH+@3y^wA3aq<+Mqn4B&8Y5la% zo2#GkOV*5{1?o8;EhyR(g-$Bilw8kSTyzW2i=u^jTLZ~|`RMNCeLA;>akp($J$(I!al7PM3`ocr~Dhb9+1 z3*OHTeNprxP)e=B-%@o_!J9yB1l6kFirxd-CupteSo}%yYkK%qlw1_ow|Iv-ptlHG zt0ooyEBSz4;!y6DiGAMC-wCpDe^Vd#(cL(C6IdkvAzd~F-qFcE+Le4zXZz^!9++fRR@YQQV!|EK5ClskzTNbk{BI=_p!d(M{QG({yw@p`BS~up|6Tps>6EA zQo5^E{}%M&GSMP&Kdg@lvV9!B;2mNgcSN^ZPRTkMGyGE*2->JlDS5(tq2;z^jF32b z`chY}pk%G$_~k3TOb}CkrTSW5D~NMzcP4$Uw+q^+CYE$fIjSFW==_pCDc|U~tz_J# zC41Dj`a_47liCT5WlpGyX;Y>JVpif7N5JwLH%A{ic_%v4}I) z$92+Li#Xf+yFSYy&LIDxZ*qvUw*S_Fbykuy!6)=x4so{kPyM4qoRwB4Z@rb|%(FH_ z9O5X!m`x6G=Gik}IK)}$fa$)$y5nqijQQ9h&NTL-qWf#`cJ2{6eO& zL-ZkJT00bzb1bEUDf5v|Eiio?Vk#AyGaX{wi_BDq-phU|rPy5Vqdh4d&0>dImu^fc zH|u2E5q~P|{7* zvQ%*#($&P>Y*B9Mr>dJ7;1I_l-OL7uI7aDi_WNj-?qP~J<>e4Z(rNOOsgK206fKqs!4mcP1~1x25xo^9reB=h~p)X`>@pd;~vJF2v? z<~ob?}MUuMX z&98zsqUY+9GTyY@#-J^her1Ab=Mejq38te(Dz2;`ZKA1i=)RJIv~$chLAC{(WR7m9 zmVJsX^tq<*-4?N>ootGpvWPA1dFIEbEn+WozWH&lMeKntFazp{7OQrhgbHq|WfQMa@U&E6L+FRN^scaiznp}ewffoW#XOXTg-MP;As>E;uMP6C=?+Po}0 z#eVE!Gw&6P*mKP^%PrCa%MPkp=G9lNmJwyQ1}-rl3tFrumGw#so6u|49b4K<&0>ex zUSDR8I>a`)!rb(RmE;OsrP=$YMI0B*Hrw7Js#UYg2BckX%-a?%DLW%=j)@brPjMA- zuDR7At|HDedmZ8`;uR+Q9jlY8i1W<>hqzK$WiZ)?zkP};g$v9)hqzK$ZF;_Id0a_b zXeK(u9J|sC|J?GJn>A+J7Zx!_wPx|x7BTKunU4i+R6m#XNm*oqN6EA8*5L^n1{<$z1BtvGV)VZZKasbfSEB+Gbx% zTBm2zZZfmKv+i1V`g_`~=GX5n>elJAwA;*!KN8idQ#*Z|cDo7vWO*EaZa1Hb@3rdB zMc1U=VZIi$R%I<-FyKy8Ba+OA6KQvuw|%rJaIXpdOf5^}F6#6`(hk$np*fur(|4He z4%K!_2kPq(Q+J0ME2vJfjoe{2S)N+e>7Kw&^N{1Qb-T}`{USc7+d4H#zu$CrXmL@8 z^uL+0g7)d1oj%tOn7s}y&MQlQ(471$-R;v)b=nqq$Q%+>hp&R)k{&k0kCRuY-|qBV z(xYa9LyL=gq(5dp6SPks?sQuE9y3V7QmZasyyMg-%@@LBN=!;f5z~+)IM>XnoGss5|q#rP2eDrwwn`WwyHU-`?VIMt{{} zk2&5zUd~duE42954Od*hS4Fnq$TH&F(*~Bu7slnwyjscO1KYWM<0}=Ml}Z z+sEdZLmV%CVzOn4^N8kn=~J`GA&%reGe;fbSn;qK;8~p<*L`mG3941eU0z8)V$KSX zXZxcg=B`+a*t-4G+=N$L$zyx=g;{{pghXu5zBKO%vhCSd=7b=d)?b@AoFL>3YvV2l z(!Z8x3^c&)k|O8>?b;glhHrCq*E|JJN=sCSoN)4wyj1+7)5cKN~k!N~bS z+(9)S=tuJ_&b-mx^e(#5Pi8_M(ONaPOLC)M%yNg8cgbkFD;jyd!|m!^%5 zo6h;x-Ai5W^ZqcMMCV#{aM||e|2D&&4qd(cnn8b>q2kWQR(Vq_QlqvV!a`4ExNaB*Nk}Y{B}f3 z;|_G~m671haOlgf{efl+V#_`_Bhh7I6+Y z(>v-A=WrW)vkNSbbFo?87Kb>ao8|Q_v^>rWH}O_l6wi6+Y;V0o+=Y?t-RKZ!rL(=Q zf)>Y3>NX}L+k4yc^ofEOl5)IbJ~}Nq$4f4t(PRIPL~#*mfYSu*&)uJhrCcnO4h1-x?P%4;0+N} zryuLKAfwRR;CRn;TbEJn-EVnuj6;d{h#=OE!5JmqUdvOAQAh7>hZv(WuSFSssEcE% zEBD%1q*$`by&}hBsq5rT6tq!o>%JqSlh>u3?uZ`F=i)0fA>L$%zUsa+^Gt7(L%(!?Fmsr<$Dv@4otY!O zA02Ac<6p^Vc~iPl3)8U-}j!^b#%msP#{N1?QFn%ssU=1(>=<+RylndU*L!AwH_+ry)ED}^)f&ag}qIV$NCrcwm2T^-=z`% zWVc;C;=Z+d)V}8eb(t^Oy=P4nIvu0=$J-$8r z+3&l*>-w&5Z?22`KYrsLr#a@BV~#o3Tyx>~ALjae`2B|(n%RA~%Jup3p)EC31ipDb z-&XL|&>pC7zR&j_)K^3Jor4E_KK#x>4dK%%9-ptOyFdNV-Q(wT#qHGcd@1Y4tyeV^ z6<4Mn^!Ymch2sB0gW_`iQl|ffCKGL;QO7H*2lZ_}S`Yd5_~?FPfqtCms{kAm3-wb% zI3^bAUkc%vSfpPN!ZEQ(|3wJL#A5xL5RQq(y4@A$rLO{TOf1ps2;rDmqK63Km{_Vu z2;rDms<#%xF|kaK7Q!*HOz$RyV`919TL{O*a(#dhj)?+&m=KPM0zF*_$HWRfO9;or z3Vo^&j)|4}eL^@UR_gPGa7?Vy7YX5*Sf#HL!ZER0UoV7XVzpi(gvVx~{+tjVn}z!8 zLU?Sh(ccupV{?uEp%AX6*6N=L;mojB|5^w~R+0X_5RR-O{jv~_!H4ul-MHs*o_I*V zO$bNbLwZLc9CZ)rJ%w<#S*Q0C!r5k>o+^YRa=reR5RS<8`Zq#2BG>B;x^sOvBG>C3 zgm6Tz*ZT_Lh+MBvB08XM>wz>~2(LGxlsGJfpSs$hhY|7E-QYbQ%+GuN9#BJ9dTug` zeZG3V-fH-;k6QQY8o1F%eR>^h_^6NYQ~XUn!cXx_e1xCdZ}w5sTTV25+(+rXzGztL zBh}=ahEIBlo}hioNBHE?Q+gC_13#7YwBAMteNXFMcxyG>qAmJ3A>5*^`g9@OqGxoc z2lb1FTU4ee3E>t!=dI7gEqXzpE8mAN2a&kIwY6g8u3Aeb=k5A6@CyIH=s`)7>rnDA3(L zsKV!K=I#dcD%H+gv{(O@=&Jy%eXstL5Z1m|zbb^a@6(M$Z1qx16b?;_$mmxuLf?4#A;JNinZbxM!l5%i9}LFh)H_w+KMMnFgPokA_+ zUkiF)Kj)+Jpbzxs{jt7vs!jZbz>oA>g?a#;&|`!K#UBXzSf3;`5=uF#7x<_==u`bQ zp_Y*EbA6xBcOkG!KP)sR{&3J~{e+L+4?3$S4dB}6fbX2XTIc~NZNdOwbQ{n}J-)&iD&KKk0Ek`X%U+ULy2ne0k6> z`bD94<5lowJ!}x?`xI)pq8AB$1N56-cQE^YjW>gT*TaMYde;j6L!V7lsOt9K7IaMy z8P6%hdtV5=rY{kS2KrOKOaxaNkWv|?lQ1QY-A2L6xJ-o40X7SE8EKQzm#3EWhVRB3 zyM;FNZXIkGhlQR3pJ`kb+S|Kruw?{K;e5w>cMP_T)IoQ)6jQ7;SAl_7%7A^ZI}^tH~Vlt3pb8WXTtfci4k?Lx6BPj zQ)8Qt3gE5xu`|6s573uH2ej>d3RI-=C;Oc8KD&YJ`!MAK=lwqAKy`^0IbVUVnGqts z-@(_+h!m=uurj#0(ORfk!UmuYk}oy^zLRZq6Y7%y-^n)m2n|grQ!R`ELU$!>14xSjE+(B5W;g4-Kgd~_r@+BoZ@kApiHA+x#6QwfKH zV~o{8=M!ErVvSQmmx)^BaLPSUW~|ZPM@ND?8reSjIJlEhBINWv6x`VenS=S(s&0M1 z2<~FcCgRmhSHr_ZPZxDHz9m|qQu=-y+|{^B#Lp9THKOKnDWm#c1Yc<`(gHQAZ;RU9 zjpv9Ksi}Q`3yw41^wFjpdl*skxYbkp>LERiRH8g}Pv7bFdKw#ibVEqIkxCDsqOU z%2?zhJ>(8!wU5GpHVPeplw*u7KGH+R8QXmn2DC@$14x-^yyYX9kd5O$3InPV`l4@i z$eqT>JnolofhHL52>sl*Ysf_7Gato=Og1hO;b%*`RkqRQLCkjm?$d4v%r>%xGHy8r zzAZl53qE53r~JJy=F1Yor}VOoT%pNLkcxz+!Sj4j3eh_C&29ZdvW?h$ECp$J$W-G^ zB3}30ZJhAY^pLv^dm(KRoL4p&GmI8KDu7?yfFj`UKwyW&-F_6GSnfxu;JeqCavb<- zXd3ut`h20ii35d?NmAX_c`>2tQj|ZDdmoh3cM_e-17*@`XGr8>Fr=W(pOoj7eQ<#(#xGJ|>khBG9x_7cA#bj4ouLyIs-IW>mb%`UycD+q^M!_PFlH02 zQx7FYgcci1h&bOPM!_;n$)A>OG;UvxgjX6JLmxFJ5Uo>NlX{0fW=!`{|IiY{LsY44 zPr4)Y38QQUm7=|tG(Pl6!&%96FzK$)r;YoBK1jMZbgNM;bS7zT=(EO0Lcb&}2z}0| z7P69;hrVDmTE(RVC$9~C(da33Yw{zZFB!9idL%y?`m&L-no|x)ej)T#BVTAl@~+Tb z#wnrfr&m)&H$VUmLU6bD6L9|E$q@<2|9H z{eNuqt#MiCoBmfDT`-Ps;FQ1gw;F$MTo$qi)NTBOQLC7J4F@!8{FBjNC~81dud{h7Jyx=jVHWz+yl8d;q+O%9roL0C*FXkA8x~s8ymWb!9FthqeOj)V$ zO$XuTeDdMkx_d|yGx#ZQDFv#j*@g(;AYg_yH3t%Lz6kRlzLa|#MVhmT)~TR@^}?E) zON5#X3=6y2+#&h!Jrb?WBjOu5a9Y?c=4GJ_pj*v|r?K{RDjTScnIv={&~4^)p$CE5 znj3^x0JSsAg*F1UH_r(@4HRwG-NI%5bKrep9n4ljl>_s_V$CccEe`8sdW7BqUl((? zj~0h@GfxP81im=4!B#Hwqk)UVdYbKp&I~LJbDJs8vhU)+N5XoW8-%U_C75T0Y7Kfa zte<&JsQ#d5!V=BUGR_wclw`&VwH#C!mTbQI9Q)c2dNFK(c}ge=D8-C>9({#s%%GiN z1I=P090hwDrJ64g@m?8fmJ8ut8E#e+@l%K+P4fjTh0m0u%mzd}dPbR1L_B&%n{RHz zlzeaI4)c-_K9`qnPI?i2`D){!BVl9A2HPp6_S~S8VPnnmmyq!Is~!FiGkgb;b8tXJ zc$V2h=)FO=0^P<0DMLfE%sBDklT~+`2}B39uLmu!d#9Nw^dry&GeroW@|tL#7gB>$ z!Y7$O5n=5ab*GqD*{AS%x4X>1m$5Ae6h7~kZPpdS=iR27Q9}5<+ca|tQJ$(lc$0Cr zd02e-^xJgvHz9obZHDQ*!e!#qZ}*s4LiqICz2-$Be2Q(R8L<;nu2Z)Sz7ROeEEVbk zG}~;mi+#O-a?Cd=U!J;Y_42xN%%enw>ekh{33JVl#g_oST=NU@jRD_0^BbZ2S6>L6 zZ=R4clLikDf55E!8rLuq$YaI|O#sR>vxTMuJ!mc$${9R5e1W-E$ODvbZWLNHcwG2G z^KBnxg)cHc_R*B^CFYkziyVA^))MoA5WYWaiTR5VzISV>c})o4yS3D`U&nSXa*hq& zt(KW}gia1F2MQ57J9u{Zax+5c!r=Kpt%dMYg#t5L=#~~9pl(9={qPlLZz24C_zH7? z5PmAO(i|p)p9-xs)0to_!T0gZnM|r_YU|)t<`JP*smsGxn{9SetKm87HQ|M37awg1 zUu!1#Xmj{FvxtexeAwLh7b^A9uJDJ=&zT(j>}8|*wGe*xveCRKl%ATa9yKouO-=Ox z!B@ek2j{2mR*#thLWQa2KsO0(ORWgsWHu5iPdy0KT<8dtSz_KQ^f{DSV#W%6m-=q_ zW;0IckJRHpNldENkTUhSSxS_r!iJm-f84CIhx;XL$mZ~;%_ctD5dN&$#z$+ypEtV; zwH|UVe4Cl#qaVUwGH>^hN4;$R!$-e{zhX`miW^d(cAE2r1`mk|+-WZH(VyWv&FTN- zwoD$9SZ|kEtDK1T!)s=!k2V;unJs-3-sE*N)kn>n>^5H@Ivo%@^oig-=Bq-Jhb9<% z%zZ*7L)$djW4=vv0G?8h20F(+4WClqV>%UBJKv4jW2O@=aw>=Bsy*g1BD}78-L=Qu zK*V$MKh05lYg%3ITlahu*U+~c`^`L} z1Mr?bcasBVz7Ur3rddi5tr8$nMQ0<9% zrO8+3G$K5Q?{D(8Ige;92J!wd7?s%s%3?JK&{q38a^F=l=vg2 zuZDY?*0*9$FnvG#p{AkM@Q;~(AO2+1aH~kj8nL};gmw57`d}q6VsFzZEACUKb|cByb1gGjWm+@hQq!*1$S;{Tjkwk{&WiYoX~&3Cqo=i$s8Zp#M0!~}gz&q8 zZtJ)ZeupvMa(|8a_&!Q+>j=?WwR?mW(Z~AeJo*aN!4Y*M`dXKSj*SS8=w~gUekoK> z6(*!6S<8iX0wr5{-(Ws`E-x~ozqOvp`FzAJ5h>OtqCDsPh-tM`tS#dEX~Yx31Fdc1 z`*Xw=pj}K*N`V?=9VX(pf()`Q5b-QL*m8Z#+kkJuOSOWDaK+g@Vu*DclY^f)46`~4 z;p%sol|+PNcU;6UtBPnHjL3NrBdwdNu}q{#BgR-!L_E&^VQsm9zC7i*y>;+-Yp2kf z+u<8P);Xc4ZqHSBT0N*tyvB=3z0+#^9p!`izHTzXiX-CVeWH~?#5GK|-X&V3ez^Ug z5mPMVd)_|0j=RfhAVl8)vZfQkK1zGtHPt#SKKvHUG%MjE=fm$U-EB4ffm=PRQ-PXp zjU?jl(N4E&UE-8@{LQe^f98~GWT*P~Sh2q_H5&PL#J$!`qI}hHdRB#7A_n))4EE&b+A4=5pkbo{EDUUlX0`GT11$yfBjij6#MAOxEw1(2%n6bV{Mgu z_+;E%Yn%A+$+)@JPVwQBaqvUz^mia|%E)7?hVC2rAy7G`#QHpHo^`}WyTa#N=4EWz zB4_c)#{xZ8AW@#Pc4Uj%9xF(ExQflQVu-#9z#8(b?m}2Yo|PbkPwhNtrFc`q(=ZQO z!-eoknFZDuA$(G1fi*!0pW4Z{rU~IwJNecuA$%5Rp|wy5Qo6+*cFTxhK$!f)oo zZ&O=kLio-6Mb?Kxc+Y>4^_>uYGk=k#U7>APLvHyZVv*H=Xr0PS`w6IxkFG{6wi0|~ zMJ~0{eH0kE%$h0m4CE`Y3VdWmuCPjdbTwk7wcAI5k*lraLf1zA6tTvt_K_92)-ry> zmaS9QMqZ65vch~67`e`h6`BY2ZLm^&WJMNRSw6ZN@vxQaqrk|GR*}$R$oH64<|8X| zlU3=Xs}UvEDIWz!K5ktSS`PV2ty;fx%a*5EkxyDtKDrw5lojWrz{o9Dn$Rl9_l%Y8 zBP;S*E8j;~Bg(9eJ_?L{-r6Cw0rG9L4*ST8e9=1VqpK0yt*br?jND<>ze;-(MtQ@? zS1h-W!XtNDV|;XT7&MK`>ij8l4_5MJYfAQ zG<#IJdege`8n*1KfV@#zk%z3NLd!;tiG0h7WrA;SPl-HiB?+yC8s4$)5NeuQQRf}& zZlRtXr$@ePCOK-oE56_0 zThT|YFNB(=K78Xb>ldNvqw=-)tsDNNZP1cx&yGB9HDwBT0{Z1ctC{%TX!#*fC!*5< zFO8ZX`H|IM=z~$SBTrc4BxTQz3nD+UW-W(n0DeGDj<2+zfvB2QV56Y;tD zQ|m<{J|lc)RTAMD_CVxk)~}Lp+vxWqt1L_5*9!C0w$Wc|XRJ0tuK=C3&Jq=>eWOoC zera{rFy%URWb{{&Us(x6h3ezc)sbIYi^O+!^v{v!t<^+u27*$)wayV$Dts?-wbjOj zr4*`Ppv((a2@yXN^_`V(qL0_R-&-e$@|5ci)$F3x%3&YAzu-q}qY!>R_LJ3E+8MOw zlaZIK5UHW{n%7-FTid7_OW zEA|HTaS#4xB@wNKx79{8`_0NG;&xuOwg_Qc{;+Piu_oU&E3Fn1uE9DtyJmgKL~AgY zeSwJAU@rSI`_#U6{hR4_C!#_Xy>`oJ%kCxAW9{M5j-4VjeeL zEX+RSmom&g?n_yxd6>Pij(2ayG;d+Q?xUg2Z?)fIqI|;Vr(w_)!XMZBpGJOls z8KL&zYj1xm)Ghti@b>mkLjBUSnzy%q7aE#grrO(jU8>#5q~1f}e4 z)X9Eae3v0*7yB6@?CUP}b|M^u>za45_la*}+7r#Y+ix?0?**Vwe6*{15Bol_B`9sa!_5>yeYv^rH6AB!Y)x5WTzc1w{Ko5(r#i*~F_p=`t>N4hu;C}WqLfE_g z?CrjMmm%dR;#)N4mWX8g3!(LpFWLS^X!{r=D%t+gmv0OB>fXfr2wT?Q4q<}rs~gqd zcKi7T+DSsS$HG;XohlSUG}4!^QPe#zq)we|rv%`GUDQdW#BPs6~`$Y4RcAgMk z$Bnd?3QZW>J8Gm|D0JW0GBwhEjfm%ok@jBk;fNe*A7O&}hC#kw4Y+0HW3!syVJ8Z` zLo`_Eld%(`?yxh6)~Vme-UIZekTveXs4@0Mp}Iih>=1g5%{mo6Ze>)aokUcqV#lqE z8gG}1FMix(QFq!Q^opBxYUsG9qbAssgvO40F=~>%Q)uG2-BDBQt3vmTI~S7tl<*J-sLg&e}lt+a95hfM(l@UYoN{eLn8% zs5y4N(2wJOipsTj2w52~M$NNtr>!kid23@*AFy5Yf}M4$b_RTkVc#Sa1e9kt^U>9) z2kkha7s7{!=i4blEg^K#S}NLS2Ct+xH6f1zKWzgi?T(+AD-c0WGs17McjO z+(Psc)~RTqb#{B9B%t;7V4*QU8|-O9Gk}Wi6+(GH58Guz z8-O0M4-0M0yb!q2zC={0{t3QE?UZnC*+-eK7LVCGgwB9(ll?vspVdn2lYgNrKH3#t zVw+9q=zwEoY1_x`dOljy_DMV3M~}4KVrMWpFJ(R1w#;5d^i=>}wU*hB3gNQ{W%f%# z`0PQMeO3scJt(tB(hHfs3cxGqGCM;EzxPsRPZq*C1*nG{r0S3?iQ0UbRP34;HEq)?U8jRr^_?Z-I8&d#Ii8!m^^9(|6gql#jpZ z`I>!#URzbDQty1O!E5%47Favnr@iyDw!7_3Lid614ST!L0-%4|`-#@6wRc_!tgw#> zJqEPbu9B3`-g&0&KD+nLSmrwQ3i$Th_Y3U>I$*CBdKc)R{iM)GKyTXHeDrRihyL}C*_BM{hoDWyar=hWSPCC2AK0y!9K81Zz-~{pz`<+Z5A3eu!}~-Z+VSGM zrG*Emzxdo^kExIBq2l|;gb#u45MTC$GIhcpFTQybwgF{}Z{>vF+J0=$6yJsks@=!- zJoc%_C)n*iu^%PkH&CCnpAy11P@l4&7s7SxDf<=92V3g_I^?5W;h)+ke6(JDZV$Ny zw|#+wPli|7V}O8SayD#ibKI+x( zjJ;K;JNVApJBSvj>NTUMYh*}wdS^bTI%2IG<)L$ttoXJW4U*>)50J1Kv*r*lg6`9wYX zXZxIwf}(%1-7!=O_?kxlYEL4{Q)eemYjWAH7CJw%b@XL>QY@y-Q$J1Y5dE8dkZ2M7 zersIxHM`133DL^AA`~)aaJ25|9k~W$(%@*r2_)iK%5)kM@%}TNRzkS{OvfXHdklP? zsCMYH0`Rpb;?KEECy9vfGgwZp5Pplvb}EV1ss@wR2RTk`XDnr{Y6%qJ92M#gbc1u6 z2=7P~s2iPX@x2#*d-RP?-7c7~P>q6=wVYfct}oDeN(etKtL`AY? z>Ns!u<*Vy->BeQ=GiiKuJ!g_oKGblNQ!ccA(p}N@9X+mQ+Z#GTM7-?{ohTyyvf}OG+luvD$bVq22lR!Rvo;D`6k#mWB@EInwtg&PC#FUi^KPL%ux(Hz@;ZCU# z-b-lWd_u%CUsLA-5pM0h(M=tv7nZV49iEgI9q9!7XiapKb2AaQv!#<;;_m__nat&SD{K%Pr1}LfF^0Iy;E4EhW)yobQ;NZztud_RcRvdCu>XJV1Yn zFL?6K=xE1wQ@=R3Os)W`OSA|+2YNfYgA*dY*AhMgiew*+i5RD?kNVe-aoj%IV03g= zGdUHL57z4BJWBMH_R-`5)yXMipZaJr{F0vYgv>fGaoLgakZ)tU1bdW=bx%!%pT)p^j**Uecbz7yc<=2Qq> znA4|ocgHhW!5{DGIA;lyYL*+)EzUW9ca5)ybBalgpSM`=;hdOTCd~Rn5lPU+F+xgPZ7w=pU-)G>9cY3X=$=BOSWKuVHy1IKi z4Ii!X^>M>iH=9;YoH|OBE2o_wDxR%bdzK!^$M24_kNR|kwV92 zm8oQ>9=#Flbil=YRX5oQWzue5SOC5Vp&>-gBxS+EW8iB?g!{G}sBswGgQrp6-)a6A zy7e!V!la&G9F)}G=}AF4Jg9~bH+g4|=6T{@Zxkl9;;&d1KWX-PLL!1O6KI08> zwg};U#Uai`AzYCSb>0o}mRSJwA(MJ??Gtwlbvj4X_=Y*Xm{fzJjPzm7GCyCMvqpT~ ziyl*H&S!qU;m%j$8vwrH&dayflsUqAgGs#sz7dX6n(8+8|71IQ3T_?S3<|U5t=>1W z#>;8^<0n#jw*Gnj!<_yuzmomS&-t5p&gB8GOD+4GG^?+RH_|cvCWzP7R`O!lCE@K9 z_V;2-T(W;#55+CrMY+(rR0PHBp%}E@nEzfHcY7=!t+yPm5v@1o`not5x2L9sE`=@E zrR9~>LQdl!@1Kjy`QN91uHVw@d-Xr*v4gbj+%s=e_3-_kuX9Fo*mn^r3+s4-a__D@e-ujd>_6`h(P`DZAB^ynakAm(L zP9Qsg>`=0tYy2oIVK~KbnQsijn9&r&En%!p%vBS^VNG$F96#)K9HsN9OpNiS=NKNJe3boNnA`9_x4WUAT{6r0mxl4)HgjKH zZ~fCRr>$5=)<2%Z*CMer_HxP%l#=&8@2_X)U>Z(&tU0!7Bc-Vc>*~e-GR9EvT^Ik| zbupNiQ<{ps+!B9#earvnF~3qvu98*RxQ#W|r3_z;f7m~bHylVQL;dXaF*PM?ssp5S zsm{Lgz2)$6f%BoJc%Smof!3wsC_Q_51p4>De=;gK7pL?eGkm=Fqw@J!;FKKWA3u`P za635-ruUu;CVBO}8}PZQ=A5M|4s-m!TJK)NG~O`R#e3)P;&HpY>2XAP!~W?HQoo^f zseoAAn_MPZm%@16FP>vGh5OE%p7Xx#D@Rj&2K?`p{2`Tt)}>BUnD-;w?++G2XN-Vw`bc$EG`+)b_tV@m(p|9zOtNr2M4Ya||foXdY4@(AQT%VWcT zgz#wOvC$rWD^OGZF+56n%==p&t8BS0wmfopgzy~BV}{QrJeImsEo^!1as3LD*Omil z{^wOCm+#;H>qn#A0o#w(dsOIaV0BeWx!B7kzXCBXwU6T8rLg}V_uo>UMZbVFy84dN^X%%Mp2G)e zZs*!D{9lbIoCCdQN&oPV)P`$R3!g&+reO(7^3n3F&g-ap6n}-*uE7x2)lRs=)l?%0 zyHqQR=?vCTeZZRH^&cl3PNnpt!D@<2PNy(hmzqIgw*F@mj`81i|D)Ld*uVamy?zGp zpJBL6j`8pR>qlD6wzyOdwUc9(P|LZNseN%Puz$QOdEPH*z30$E@@^!{VfJqJ%f&16 zx-+mGw%pD#N`vcXm%>%9_qv=WmH*yy`bsM8 z->wDXO z{QR#D^GcqN0uKMLuF=1Ip0&6Kcx#rlQx8W>6_cOWYv#6i_ zYx!SMKA)qxJ=|t)A;+`jmT=g=J^xAg`g1X#{r%6#eCEX?&ZV+xtNp|Hd&Dl~q4*UP ze%LR(#TV8TdNuVDrQtBAf6bT1rQY?0z3Fj{?NT2@yskz}z!Ls7#!#nyxm*f=16fzU z`C`1~aE-3%SOQv?3ZyV^OE`s_`K(K|q%gNIn!<5p`;i?&HXSUi9jLDUv<}ap_$g$0 z%v8`h_kN1WyUwnp7=MdtThd zBsayr9J0uH|`(zdnY?_TR;Cr(AgUf#a0UO>B8S;bXHL(zw*yV0BsD z;X21fD;#eOpWkcZHC2=Aui?K-^S?v<8-uX7*&e5@-byRUny{{_sK?IxtV{7e#r^I* zau#}Cw>Tt3JAN--F3$mb*fPfNhOa7Q-@twCqo>%(|$3oAED;~(~4>CIn> zC9uWcB-IpK9(A0OuYi7}`&Vea*B$KTHRQuo3!nG-Ityc93qN@gf%QGRLLHHQw|2iKu>U*|M&;Z> z)_)Dd^E}VJZOQ9@mw=A~zQ)JB;Jq5<7zOKFm#lK}n1WBcA;!Dzy*>u7Wi-`=%3<4s z!fg9cnC$=xvmFLum%4*u{@)6Zr!uEfnSU3)kG%fYKjm!lvYkhz<$=`|U)}uodd7cV z;*}MzxK>bI`(ajhDZD?Ut8wu87rge4;&Cs#6nZtq^O*mA4=$5uNFFEu{yqucJM}NY z{|?E0bU);o8F)YBC90j%`&*tfueX0Jz!vW2T-RCuF~66*2f?}&hyA_(K70y3`O;L4 z_1>Ms7!K>|Z7Tm?V+?hi>!no$_tn3zi@jXV$BuMPP)<$2QoemftzyrRH+hJ0*#YvJ0t&3Dsh*?2^IKQX~|l%{wd z?n1rFZH|MmOQBa+crR2_{xOM^(my5@VhlCjFa90~>uNs5KLIN!QhQl?&LiPNYQO*dz}vzjfsc!1*rzU8hwr2?wn3+P+fcaQO`6Fy^*{0QcKOf1+*&Nt zzhv)m@fo$8M-->z(a8Pa|JlK5O3C&Y3iF*zynpLb+Pzr*e{vtmqLgU8R~G*L_IKfl zbhM)7vmSif2z!&QH-^)2{J*CBKRpd@wM+5w#bF$oy2S9T&R!1td-*E+`kv=8%y+-> zD$M(Q4quVgSnpYtQ?d=D{ac^*HOE|EK9}hqe|?!;4#)G@=3|PVF5vT8&65VY+#ThV zZ21W#{=B0JwTf%>4|7WX)RjMd;2E3ea9%I9q;26RsrY=<#DgP{S27%C%g2;M;}buh za>?w?_sTdgmg7<}P^M0+I74OzZd=9_{G_Sxy|}U(MfKvb>Ala)#~s^D@@9eceo8gP z7v_?^pC|H6#WMqcD#2rbWBfk}!Wi$l=|jITmw+owUE!xihPnpURQSw;rD}n-)pro% zD4eka6wl%R_qjCc0iGNEOZK+he}v#CQ!a(~%5-%AtfBCUCQbcB@w^{vdPA4HVZ6OO za@b-@@4Ye(^9bRTE#a)>JvZSNX=)I}z;y@3-vib=e{x~4xVO7w~dfcCEd4A|gwI@>gL1c$f4BsL5 z53`r;NJ`@$GnVr5y>SlX^Dr(ohvGS=fWrQ{@E*RVHc~vU#57d~VK|TYrTn`s^^fP- ziP!dMy}ivVEB}<-4?M@R<+CAP8R_Z})r;{i3G?XX^9YCeJ_&~p(yGHh%rX2KBIo*$ z%H&*phZ$?}J_p6MpMn^^b~FCc28`!x2bZczb@`ub6~e%11Y*;jpeSo=g5~4Cms~_^y$EYyF>C z!1>USr+@wTFNgitndhhve*9HE0`CQL7dm(P4zn8;&^sO#L zFNVEmZEiW=f4;fM>#ZpP&L40VtqbSS1`uk1=TCJb{MUm2K=`i>|8*fnh)P$D)g;wi zWvQE0k-81y+Nqr?8veVeQ>ur$sCvSGZ&eTe4Xuy5LG^*$eN?#WuWo{yQK!@p1#jqp z|IsQ-yF*Qa|152+nyF!8&N)2b8di|{lPO7 zzJq0kS`BX=m%vl%`{@0J8PShJp?1&>C#HiUwPtx{{428=x>I8N%Tm>QOjXwG91O%hWo}a(5`! z@GT0tDl`;+NmfgOZ&D1cmZLW*E3vLbWUiI7@aj-J*0 z8H$Hr$boR{;2eF~tn#2-^;XCi@cY6$n|;tB7v8tsQ`<#l?$WRa^7Q^=FLnq}8)hXK znOe!LpF5n_${>7Rdt=sBNgq~a2)QETn{Dnj}6ss$r&D7tUBk6i;dKJ=gfleu$;Wu9aO>& z+OFMH&TcBFlHw~V{xHQKruf!cI@I1;`!4l;DB;eWPvK|Tv1g*S?40i)yd>ue#Ba#? zlWfC|UA2ulw}Iu_pU;Wu7*8?r(uQ3*gE}T_dvmgyXKJfkVQ(DEncT5heGYaAl{|#D zr5JvreRju8?Yo@C`f+O8acWzp{%Cr=PMP}TCapT1qIRC59ym*B&Qh9cim#^lORyCM z>MGgO3g5(V3Ep?Mvks2om7Oj@%58P7Qp{BfXKJg!Dx3nx6yF)#!;>W?bw{9FpBm!d!|E*wsOubozt`%C)W>7 z(H@(#AJX8Fl};(sDLzxXJZEa>OwF1*vvW4ZXH%|hNxqbn85m;;-mobC*LH zYniFxH+yp-O>yT;J!%WQy27>b~&zn)Wzw13es;d&O#qv z>{3mASWW#FOL;GWcY4TGdP}?E!XD1i$GMlPS}yG8064}A!2U7!iLMP?IB$eengExR z`&!pHDl>{=qG%>*L%G^O%8OlMDL$6s0^3fcS!3oF$gcIt(e7&3dR?3YDCrm*u|SEsnM&M-Li!tRa?T z24kCF>zYm_q*JT1#A4gBeOqx$_iQR>6wPKcX&ZCNn@{Nr$mZzVbBBjx$&Yo%+Mnqj z;407kC)qc<$HRX4uzP^Q@0%7;j}^Ia^lqf^MhI`KQwrgwU@^SWg~!4u2aJ&J4L0Pb-mZFqE02* z$u!b%j!M*UOTXwb!&o@~j~>-7Jg>#lab4|d-)2c*EFJZ+a89|{3vcePsB?*W z^{UI={-nAJHNtG*!f&e^aF#6YTFbU%~ z)}!=YQ_g|K(xPM+Gb~UIyR?F1$(kgo5nX5p>LYfUmHS~NJ z4Q(RW2DPVxy%sW-Y(7{sw2;D6wWF{vJnE>X$A8%~&%mPqXP9#MZ8%(eXt0gPRH5M> zn+x&yHqsn@`lvs9!U#z+dgbW1Kd`)WG4x(>=c8KCz~EkSI+Z|ePN4QAP+ukJc&sJp zG=ou03dO`xf2MG}j%S=S%9|!(93csmW~-L@z}jAiw0j=7z5XFB?}1_n7e26C6}mP* zP@py&xW-6O`1aH|9rsQ;m5;4D9F$Jwe@vrptFiBaO-7OH{Ra}YB0ff_S6_s!fO52l z+oDZx>w%+h`l$MDJj$Aaz5Rg}ZWvt;l&NAB;pqi2tvyL@nEgD1+}Tt@re5q!aL=S3 zmDbEIXE^Sw?j-xJ@(&WN6Zi6r$9r+OMq7^{Pqni{_%k%Z7?Y>a? z`ZahzYrbxVP9<9iHl$q_NRO)~vjPjZKS$3QeF8HUN#DjL}-=M zxm3rIT&kzFn{SlrceHC;r&OQQE~d_Tt=rt+++{RM%k*kbP<$EXEz@x%$EsgEn|i`8 za_2?I8#>OkJIK3RFYTi0?$Gg_2c^{7OlZlb&Xwe?q|z#>v|`mdZ)!aD-u>}E=rMV@ z5bl?^B>t#zSKb;3KRx#mu#IxIfW0&4mH1NHuH#g~aVp_Bm3dspwUT_JslKw^ z?NINDkjy%#^zC^uU~xa5((&yHXCYkN`IHWy;q)%0{=_qWXzv;NCwXnbE=+IRJ5%2P z=lY|1b>8gW)%vsT?yYl)N~qQ!2%lf48p2EKT&4YD7&wM&8U5R%b&uWE`x5QJOSA_s zQE!LAC~Dp$({(BD``%H8yFDDgMne1QI$^X5Z9`)$7HqkSHE{388o2l4=(tNTaLgPv zDjtM0Ae?dL^|@l`3-bF^z}aD0pF?D~lEw4IvOX`84KOiWk8CK}87_=zLnXJNlG{*S zxRxtWDNsAku4(y$+-Vd}2b-v6Q5fgI0vO>Naz04Nro7qIs$#W=R-}z`+V+JNY(Ac; zC*=3)iz$=A-kCGJ?@TFq=)8S>bM!XW@xHCK(k@^2%{6d@Emq6&JNDCD1K@oU zktWvF+Prts$%3yd@Q=jz~WU!Y3C zmV?FeOR4-)DtW8+!Ywg@hctZWOBwaRA??XU&-U9v{Sa;9TeqT3e81KqSg*d?ud9h~ zP{!5HyZv@k$ur=*f4(1%gbhXkt&|FAJyxv0y{K1WCB!cZ!F9|0NL-C@ z7d@A_8}`(c$av@(5A^W)junks>IG>!?W-cyM z$Dw2x?J#dgH#tjVwOH%2q;C@1K}q>=E|?NoO=*rAN0*eT^V;W2HYQ!7m`pf2TEVJg zf3w!Xp$gY&u~f?su$F5DKUsKr$!kfYXn$?hs$1u(OtbIOZq3+TD7v)>h5c*`u~< zN0;qM-m0Bk2EAnB*a$OmY($xOe1(}f9>PpqEgy$=7I$uA;@H?l@7cLZqZH2q9#v@G zusp#iG;t2k)LJj^(Eq3rvplYUEVV6;EM8gM-9J-{Up}`#&Ru!^hqzK87akFX{Szon z3fVNW>14CWW|PIUM$&-I=6%bj4v2IuTt2r!0<=ffO`%q$fqiN~I@s+4vcQ%P*b2Ek z>P7R}<+*B?d2sph0TmE)dcYy`-14u%{=WRX0Y}Z+1(zu0Zv$R5BMJ)OSFv!+6j6-@ zFk-jWDKK&56qvYrIc=US7@G2fiRbR~&`Tpzu9&!&ubB9YQy7z#qFGpP0fe2-Mbs)> zDdnYX)sj}MNeQsBRy>jtYGDbX7Oos3EnJzScMqh&Hq3CXUU4#|we@h@&)VXu@{5!l z{jn9fY9qC+lx!K<9b|Wttt5*hbHKo(+L0A$19S9ugLlK(`Hhw>;4FM%1+GS>j~YJ^ z=ge&IP9HTNQob4V=)l7!9t+1!UgyKgd0hc%pTl^ zj)ejj&KPZIwVy|QI|TMlfocHdT0$8ZJ=yOT{>+%?XKu zHo(zDHdAlbaY|||gcG$mib)_FYhlaNEIjL_lg*;|Vp!w70C!RBRb}ds+}XfzHl@ji zG)wDbTR3iK(iocwqbn=2l&&mlQJ>^OngaM$3v5HC-fGp?Lkg&_Q_usjEs#EVXc6`E zM(Uqav;xniGIObxQYxVoVx~mqK%b8uI>Qyc>K|acu9^h)w~$FgF@6rk0!~v;Ru4eC6FH8KL|Fw$t5ddXeij$Ltk|jLySjV1zX(Nu+i4C zas1SRaDmFARcI|6d!PZuG_Y}8HGr6HU~$EZdmlzHd85dNQG7M+{c5_C6GiDWwYLga zjc8-zkr->^kyxzu!kXu(f!CN(RC2NUq;To&VH7^EeO5R#2Csi%gj315r!b6dIK|gE zR8ERbS3Oiq8l)`lTuQ6K&9rst_V`i5Bk>wDQA@W2VwVJ_+xVLk={EijMY@f@I1#Jx zmnLEr?(tY^b1Yry#KN!N;7S;O7b2Znz7&q5d~GSjKYZg-$c172-G-&m{~yA;2l3Yz zvTVHLlm+dX0%7c*Y_T|dXWMvW!Eb|uok^|Dw(%;gSao01b5ybVG4_R+Y|5KU-h8rK zXrH1=}*yCS5p}8g9W5t zqLh~?{;G|=XE@kzA6sjSo=iUt$I-LtSpN3(D@I9Cejl9AUr&!V3Uc?R;~k#Y(~I@h zD?Ut5rx`5Wg|l}phpsXl95W3ZEHjMC%z}}I_e}5#H;d8-!0&dS7;_%lTn?XoV7=$9 zkBaUcd*13iarW4aE*$?w2Cj383|!6Pbv=wvy5Cr2;Cl;;417ajkL41^!3$~S(2eys22yA<8IoMcjHP|lNLtx{yhrznFO<)tWQm{$d zR`d(!u(P#4 zz~*Y!jkV#^p!#6*wJ@+3HQb6=7j8ut7j8wI3%6o5#S~G@28uaFF;x_EmSWDiaJ#Bq zxLp@rxLucAxLucB%b~6Ydelv|RfygZY?$5;Y=nLX*eLxTu&wk}VB6@gfo-oJ1skjX z0yay3twC+IQ%`JITkY0IgDuymg00kZ!M>@l0DD+30eeJ$xuK(S4Q#o`z?SD5*zzR? zw(1DQABT9@Mx%9DZFR|L5B9Rr8SGWV4OW>0!5ZdBu#Sm6S`r7+r@bkY@DODtgYNm2-pN?IM^iTG}sgv>a|s>69_iVNd-I7 z$pf42gtmqe>l_7}<$M8llJh;-Y^T{RFk+pSU}rjQz|MBMg3WaXf%P~uz~(#mgI(e* z09)W}1iRYV3bx2O0(OJbq)lzL(P;;^#4&HHtxBCI!ESMywXLnnoM^DyobY=axo98J@uCYvpAg;W zRrq=a)}Lo6^)2XT(Q?rW(JIl?q8j{GC#H`SjTg=IGW>EB`ZGoIL^q38h@KYJY)+pi zx>>YB^h^M^bNmggPl%4M#asc3^_>>g0;PST@uHccd7_&|D@0F=o&m*v(Q0!!8KNH1 zJW*AL{Sl&>q6q+^d3qWx{J|S8q@$i8?ZC`|_TeMuXO0-XX zskZ^AZw@*v{H2lc!g@pYXM$pX)pXeD;9lm#qtq}^@zGfGekY2T1!r6v{LF0*#0ch zyw)7QS+qhl^A?Wxh~|lwh;A0G5IrrbZk6_kW{T#CZWgT&jc>#0Geu9|#taYf(0m%N30fjTCi@#*1c%W{P@5^F&KT%SEe1;o&77 zXQFP=3{j70mFQ_v6(j8vjSzKt@jk(bJ+@BKspn<3%&QoW%YL(JIl?qFS=# z7mXLq93b&2tns3mqIsZrUWpt5+GOJBc+pCDJ`l%$$!N}3E?OlDPTIbz@vQK$9C5}3 zR?kG%647$eN>D7f${T-|%wM7^TjnoOw`hrI##AX^w8X2^IKEs|-OU^!>K4uL#!qLz zTQoz|K4rqRg1+h>K4rqEf=j4g~u4F zA0xcFoY^f}TEP8MDXLaUdQrD%hNwrhM6_JAN)&D}(Rs`O#qky)>=w-s^@!$!(s&mx z7p)RiYh-_mxpNIuaLQMH5P)yvXfqHfU)QIBYeXt`*WsCq^6i@HTKL_MM< zqUEAhqUu%2FX|S}5cPt3=fsQm?36G(*%Q zS|S>;hs$+~W{7%3BmOCV(F{?KXo+aKXjVD5S5AiYD>J=?H z$XqTOb(rgkI4bExJ)$L|<)T$yexK7!{qLrt(z2%>Ae3hvBT+)e_e<^-Z^_BQV-Cr|jh?a>xQeo?n*hNwrhM6_JA zN>u$S`9rEryS#Gf1=1&Zn1!Wp6- z(Gt;e(JE2;o(1HKz;9zOnt;fW60JG|4uhzXBr7t<*wIVLqGJ!V?Wl93Ma z-J`qT-aV&#LHDP+Z|{Dj`&Zq6?rz65iEA4d8|RM8h?^95U)+;%Kg5OfaQ8^;v8%_o zJ+z+nd$#P^r|0mVIX$20`Et+WJwNVQ-Lq-0PQ8Zon%QebuaaKny}s_{xNEyZ+_$>( z-H*Fpbid>N*saC4j2{#~GXA~z>iA#dQ+walduH!Fy-)W3xp$*Jt@_0EN$qocpBa7b z?^D>Pw9hMj_Vqc`=e<53^*P_?k3LR9(}ZaWFDH~Ie3o!EA*1iZeV^`ovhN>#Bm1@O z*Q;Mjzghhr>GwvzH~Ss$ce3A~{puvPOl+4pC~;ikJ&AdVs}oBSUrOAc_;%va#IF;7 zN$i}Ip0quwJn7RUS8|i&nB>&tJCpB8E=pdi9!)Mwu1x;;|Kje=#ObQlI0 zV1VK6Fq9eA89EEg%UT$QrED`mp)du?zP#V>Irl!#BgvtCf1mfSUsIju-gEbR&pr2? za~H>dAAe}?E&J}>_viaQx$n#SLVa8MGJPle&h@>b?+tyA_ITDCKJ<%8xprCUXi#j@lfL7#HSM9N&F)5yTttD<;iu)?a33# zlga7iOOmfl{#o*oF_cO3fUp^L%T2R94#I_d-SD8Uv>1)j(+&)r;k2<^uLc@e5`n^ zdhCW{e{$@hV;?*A5;K6CTnEi1=7f2^xehnFa%Q<1g?XzA)5~ex=z6i)U~a>X_DgVc>vo*j zy~FG=FGFrGM^3NAU8uXwpm_+lxc<@{HgCdBuD5}YeaIZg!hQmGsIJ2usw@`o0=V9! zc>*`N{>Mz4pP8G@?+tie=r%B@JIvhBpO^)qSD3}2JIzI*SDK4MuQAUHz0N#8^Z?Gy zz1}PfJ!qDP9>QMaUzoMH$#qre&De!}o7o(CyV-(0;;o@~n(d*#H9JD@HakNPo1W0$ znZ2R+U>EWc(;xZ=lMMZ%84SJO423>m4un2v4u?Kuj)XpJj)y*CGNFIMPUOFuvCzlO zY25xg7y693DfA_CbLc5py)w|TL^+XcQ%;N1dWFYvDg zzC+;O3;dA4j|%*xz|RZ(qQGwo{Gq^K3A|u2OSwqkPQ4UoP-f0$(HW4FdmK;5!5G|9`D(Tf&|!3;ghsN8tX=l79otKaa2^@E@P|HMqN$ zooF^DzKrn`%SPZnu9jsU)5?e&1W4QuuK@D$t+NX)mdore3L#r^rU=ivT|xNlv@ zoaeQ%55Fz&E$c5{Xw26(5c7mU#iuqhw;yd}KEK+SSY%9SQyNh5Z(I83aKCdCd;5I? z^V{CM*p;ZYy6YOGk zpyU3M4)*Px9c<~ng8xf_?+~ao_K1XjRN!NRR~pmN`DO=8`B4Yy?OjWm^KT?hWGCGV zcQW+(0#^$Be^q+0McQ7iiPlP6t+mpAcs6xY>QcCMckH>wM0Y0v_v}6lnAn{IJRkmJ zJ?z6T34Ef5`+dLYVcWyK?1$&|o&;u%z<=pw%+Cn?iojD{#Qe9!d|IG}YRvP+sr21< zsWCV9G5?qMaYygfeJt_yf_YmX>F_-Qbre1-vecNbCb)B^)T?|$dC0{BtjY5S zZbzv0q|Q*K6Q!RY?q?~#-p`nSH8B4L##}H+%*BI?;r{F(Tl&*Ma+@Wo9l&f&G4yK! z6KU2~^SOV{>k+!=Ie!VbrL-#_QAUMbHz&fGq8;gf(djUzdK>^S@Oi-P&#@e3|@X*Gw-PB6DM0<~869b-Q{ zC~&XfwO#7I{RB%?O8(Omdyw0`Cmun3t@HOzuns>K*mraSp-c1sjy)+Ii$==SQPcc& z?39Le)Rd}&bRMK+T?ds0_MYJA{A`pp`Q3`eSA%cM96UHyf_r1v4B+d#IPNzT2=6HT zd;?oy+KqX>U63DPkka0HvUSc)^J|8azG$F^WfPZYZ11>c?0AFBs z0xmPx0xmaEz!i{ro6Kc+EuaY{^+J|j1Poo7 zWPrH_5O4QGy2ju461WSpdkD490khlW;f?|};q`?vxVr?#Ac;3YiZ1}uixWRhrbpl& zNarE6Y7&^e*c1w(RVBFl%qh700h{ptK?Uw4AYQM76dyvX2vg<^FoOcqW(Jrcfd|bw z;12+X(4HINJ|yr6q<>l)ZU*L0@zd?j?PCUYks4!eiG3in+C?+!f< z%&P&L%sruR!2KFPyf`2F7Tm7`Y%=$T{tNE=0GrJHq3^)`X97PE`W`Uv7x=-@_ksTq zV3YZ7=t;ouL9=TzPlTQV{`-JU<_Dpl06rOd8t{jqp9B6V^h>~}p#L?QABTPm_><7@ z0e>0_g}}|4!ho@+7Qp_d2yAZSO>^NM6ZqMtd2m10G#~gc05+K~HZ6erKLmcIX%R4A z7C1k=819wfivceWF9BQ?z69`!@TG{qBfJ#uYXC9d!^`0A5V$M60+?$7o6K~0CETY0 zo6OnpD!69=@h(z$HQeU_o6L*CR|4J`UJH0rcpc!);i~~}4R1i47Ylqzcq1^k3A{bL z8SXp7TLE7g-i|o03h#jXE`j%jcf$SV@U?(%3r7L}Cfo)1-{BbG6X9OKAB5w8Plop) z?GFY1Pq-hL9|?RaoCN+S;r+n;7%*g>4yWM$slcCwhk*GxV3YYp_#oWB1Z*VrGxuz>(#yqa@xw+M_h=YeSj#5+gLV{p$A zctLXkn0bI$eVR|gJs%LOPxB<;g60x13jwkEG@pX|j{vdyG*%2azZCe(0kO(7zYOjx z1g>d*1u$0%T-$sn@Glg2Rr6iIuM>E6^WDI=0fx+m=6m2?FR;D&wZLoyY{HG!d*R*; zh*hTfez>;^+}`{EFxvn@d(98ReT~45=7-?k+585;UCnPq=(T|0C(UnyI|>MX()<>{ zuI9G_b~nErFxLDIz@FxJ0rob(8}MNB!-#)K;F0F{0CN~HWTu+m3wKH2spj_qQx;fl z{zu>|0;iil0Q_lzGtD0Y{wyFUy!j(=-yrZs&HoI{jewx@=11Ya8L-KGtodKz{1)WPaKbf%_){ zpKh58%+CPv7ol3_!Tk%sCfqih5BIMG{-$LCFuw-GUwdj<1ov+R&S_l?%v?aob*&e} zJr58wt91$7^8qolS}%cn0U+eM)=S}DBye%-Qegf_;HuVTa9`270&sQfO2Dvq8RwC(_WZ|hFLM_R8%%=ZCe9chii{QW-hyoHh5MfX@ppGx z<8Xfz5O1Kj?t}YZ0P)syYd_$>wI+f2cR=vE*8Oll4cKIU)|!I*=K_D(It0uw1pcP= zAlxQ$7_cRB6mePsAt6VO16~-(0A3Wy0>31ZgZsGxFNx&getu*O@R~>gp*sN48Xk=p@>BQHgqoWOkKWx$LG9F4pJ?(xW-fQ86ifY(Rv20R(L2XHd-TEJrDUcjly z{eaVv2LMk;9t1oac?fVO@&>>gB5wqIQRGd4H%8t9cvIx9fVV{64*258I{G$fG>}{5AaVT{|I~Umf{pz`3CUc0BkbfjC>33Zvi%$Z%6(M@V_G80em9zJ;3ir zz7IHO&Xb5USKz!kKLX|gK+L8&Pr-emz~{{Q2`~!;E}HW+@CyZAGUw;OKOYdX>zrQ# z{_&h&1G5wmtH7M!0#45PJupQ;aN{|lFgPg?6(a8b}6u!z6Y$wzThTzo-3y_KP>Z zW#igS_iuW`roZ3x!A*0vY}>Mb%XM33w%oSm?OXm~%O|&ddds)B{9=pQdimD9TL-ru z**d)S`mN`--nR8sTOZlFeOq?h__orv)7x&|cE`56w%xbw9oxRX?YrB4wQc|Q)7x*_ z{=oLPZh!ao&u{_Fy*|B0r&yK{7!j4lrez4=$JN~HSA3DC? z@!gKp&Z(Ub?tIhEckW!WYuT=iyLRmA-<980+I82idv|?e*Q#sRUAyPn;t_{U7X~n^>CYNhA_)Pkb=(FNwD#-<3Q#aNWS`1|AxC+rY;M zJ~!~~fqDCf_E-0RX8%|A&l|jK@P&hYgYBv9sc0&lI+n_(CR6{G`flpu>4if}hdPHw zhdw^^*w7OPo;q;Vq25EuLw|bc1BV_x^tnUdKlJv)|9E)yk?tc?M{YRsnj@`87anat z8a?_qM}KfMdTjLAEywOUcJHy@9XoXVy5kR@So1nqahsZN;p>zy$+<#Y^FI$|$z{+I401H)pe#>UbFaF~Cc=0}5KW|9e|4QOEWAAM{ z^#5z{+ksyPemn8og=IRG<5J|(5Um!j7Rai0h;a2<|gwhXs>tU_ZsND_d&n? zEAvL|(Y?{U8NYus|7t#lyW5{LpEaMy?<=sEd=a4vyM<7d81Feox@{ef)la-;=N>{1Cq%VV?aDtOQTt_hbBif?4-d{GP_|XZZab zzhB_@OK91@0>nFO=C`QJ@9_IQeg=DR{O<*3EBfvtSYr5Hh@C}#4fZ7UdyCn%AO!y{ zrc3a5SpOa7l*IppP4{{G{en&R75iNn(tNguc1ik9@n3{}K;kbl1^X@8?m$v;A(h-|hCh(|)hD->Cg|*>B8#d+j%Fzx(XB z-+q(!yWf6O_B&+12jy$bVf#I9zxTE*SkG~Kz_ju%Qwy}Mg2*(>csF8PWBYkGAKWF{9$Rpdxdvg|_xA?rp=Oh2LjeI(9 z!^dp+m<=DZ;bW0cY->imF&nR7>oINpXKcDN)<0wYGd77Zxep^A>PK&Wm`7mw=r}C zU;h4X%iW>>we?>7?hbtf?+PW`FGs!~z_$(G--MIx)rHCSr$g6V^K__mO{VETJ7$_* zyK{5sMEl+Ny$`>SwkF&E8Tr2--~U1UX!ywPSoo&hhgy>D9r)!;vVAl1OT&E(zo(Jr z!SIRphr^FX9}ZvM`ML1k&d2ckB5)fK77IVG`^x4!yE9F9b|=j{yJO+^$9kJT9eX(Z zyq+H;|JR_L2b+`a@5Fa=Xl`%Y1xd6&i8d$E_9WU2KYp9=`zOT7G#%Ofbm++LFE#(o zo_Q^=jQ=(A*b_;%zYyWEaR1)k=Apf@a1P(=_f~;F9eH%`*~nviZ-_jx_eGKLzK6rh z_nnBe?K{{qysx);eBa@g8}|J-%K0vSKSN$CTTirKjo$|R;;nZM#9RMi;KA@^TY8)S zbbqC_39qfZv-^v!pN=KXk5W&EJ{_Caa>Y}{HS>hoWgYUmqw;1^1DoGdN@@o7IJM}rEP|+%Gt5We6i{WcW0~FfpY0|VI*I!m|3F$*_$us%h_t7R5bCfiEO3PpPia2 z6vv{~YPm2xUCsL$*2Hd0<;L@qSrbPQQ~7dr=Dg|B+2M(NB0HH+p3axcs7+(mU8RZX z$>JZ5lbD{ENTE)%Rjsd796MiFe5{CmYAkc0T$s$3XZGc18pAZNzI<`4I^GzXn4Zj+ z3%P-EK3Axq;~Hah=SQ>C6V+6{TCJ&Xd@w&%suZfF^2~J`{Eqdp9?nN0V(jcxIbUH> z2T&kVd(qnZ3dK`xsP1&GI$h42!BVNZe>z{DVW0ODiWqv+J=~anAX~ykkxRu5}=FN*=oMX+Eol1Xj6K5S~_vbya;ir zXJ58BHk}>I3k_RZMEjx%9D4MKlMUYASE%Ow2wwKg*Q4?_jb^$~mufj%C|1)mQ-PXF zkqDif%9aZikUYu=`21vMFh7dc7IXQL=tLn~@mfEaADJ$WWQ*0kr9yEqKUo4zo7$H2 z&mdQ?UFWGNBJJ-p@putqkjqbT{$Uie)%@6u>7FTOCrMwWvoo_s=r4>RDtd*j+moNb z{Ieb873;dWGG3U97jqNSq=a~|vy9Z!@6mL=Qmvsn4uI>h5s>koQn`#Wr}Jm4N)V1JO>en0O_qu{?4_Pkc`{pNpD4BZ{;r7v>P5=Rk0AB+dCA@D zLg{GBW-+V9>lH#WE`c<`&kS=ApwutD7wArDj9+SUm<3e=BLwbHLG`+a8|lR>PfBN@ zg$YEpjuF9{c+$9dJ=q+&ory=$mecvce6Ca;u?=@|K$o3b2`oXf5_n9;dI$5U&*}V# zzfNFaW&QE#S6D_JPCMAGRE`DJaU|;ssJ~z!NS>po%atKm06%Z(yP5b)wn_YQs84q@Hr45l%Y%8e4O~39u>Xk=c-I$`~ z5|<7sMMgJ1fC(_tSEy8t=RyRy3q_q=;6SIiBsgxBI$4-6~wD-H6%YHMd*X`+w=y@6vCa)qj!E_Thfaop-x=LLDOEtt_7fc8&ji=?{Q&?bJM zkUyg_(c@j1eO0e^x-fXlVS{iK9mY^%Zn)*ajYFd>kuLRTi)gQ|tFwhCi|F3^U?t1c zba@p0334b`3)zX-X)NWka-iI5IiL3tiP9tq1{6G0oUXX3=4eLf&C-Xkvreo`qa{#e zZX#Q*UnK1ea+y@nH7Xh(GO&%(j4E>k&Xm1W9M>sDq2Lh2h^VKu?e6WDQ(izP9 z;e4=4eTB(FHIT}eZv#kw0SF-dwK;$c4q0F%Autz4wBHBwWBIcKvfM-3oSo9W)lM0z zKctC#BVvyFY2$eSJ=t9oKSrAlduoSjL>Jy9@i~#p3@L?ObD_f~f)YlV(D0>XE50>!QHWx zrsA6Ztq}nXdu&hSg?Dd2jYodaoVioi9~GBFDaf##Rk)v zc*17GDr5!*V?FUhlBzG(!_b;Eg7fMszT{9km}?@L&eYV72wQ=qHZeIU`6mavkoSlar90V&nQTSfDLQl3 z-DNVvx_k-3^>8LfH9B)WwK*9Nf8Jz9L?_6MmP?Zo790Wu+N@1uMWrwxtd^_Wj88c?E~=GUv9elo>UwYFPoC`y8D zD=l?ppek@^KxG*)XK@bF2}#j)nn!z?y5a-0m?;;=#v5AKK%q98*S-M7+Mv238t6Dv zQFVZtWMSHz9EWO-}TLWRtIwkQtI%%kOUwt*rY9!lQn64WnPE$WN$LrfWaMOtT_KhjoZdWyD|J;Cp# z5F)OCJwOqj>aJeZ%++m`a`kxnxO&Nsb!$oePQA1~F(#;6?Fj0Q+gf;q)+H-VV>?Bo z`f9xTb;7LNh%so6sJyX!vu}{li4XVMc~aGFa}c)A6ZbKHLAM9J|Vk=W>2;< zp32j*RPW9DAZ(vqUK7X zbjepreQdnKonzJQ8lstWNit2B)Vd%VI*@8Na6aY7>Knr%p%g@ytg>{lqsgBs3^=z& zh511D=GuYP=RF^^XFh$ZBM`{L(|4oM7XdG6Wgwarm!Wcb{|0^n>@Ay zxn|Xc==7*V>MW^4>SXbesXW*_wIJ;yg~47Li1xyek>L(8T0?W)DQ@6MzXs#!FwY2G z3t39L?UD~!j%pN8jv8z`yuJ!{hjg;E*yF5rjQqjyLNuZ22-Ky4&`$HvKqg}jiu@mi z9GAo<@F}RA6_Y4ct*ftaGEc93d&_zBeK|dzEn?49+{v!2Sgwac>C8(pcAexKvQ@JBs8AqWvHxq6e`u6 z${2Mh#*%LJV+6bmMNj)-o`)gvq6Da!#Peu~r8|}wFIo>nyyCsSsKqdjT|AlAIwjAF zN7T~O@qoWKUsVyFCq+O}dgKCFuIOEmYC&~DlCAMs5>1y7i6kqu>pO$NAX)BZkcRaW zAkKJ2=wGryJm=|{g$5dCAaq+Y)Y|c#EtVVI#xSoNWlS2w{ZVZUbEDcA;zo705FORV z5FN8dd|<#D0{v+-OLwV`Ro6Sdbf?tmw~xF*ajy2@HkJgvUJ~*P)W|@6%##1;=7_8~ z*aIqHT^*#o$H3O5=krXVA}b9t#l#Z(2iDcIGj^GSX~}nW32XEsBFviUac0RG?x86` znMtZ&o>$W<K)k9;5y%3O#vw?ah#zj>@g@mD!G+oKEl9XcDLJ{nYBQ*8t{G;-3k9lI_4|8L5 zCN&_##+Il^1age?Tv(wx)04;HGTV4x_ipGco(*d3LRY@mrjFIo&MAV$wX z&@7Zi!f_{e>P{Ke5B>Ru)gNKoDmQq4u<01t1XTIcIt|tia1Ta4<30rF5Gy zcx*B<0zK74jn6%jqWVYCHCnpz?52Fi?TG2^AJvCJ-SLOWM z5aj9uI0Z^}BnCGc?Igq-&I-gsKT7Jni8GM1dDcZ}9X&sRZFo0VO@^X-0Y#9;rH|yG z5O=<(^9rF%iDrf4Kp=lN+kz;eaj$?tE2JXjb(M3ubikdj(7xe9jud9V@kxMuHLpM4J*G1T+dqxwxXYU@fcQyvziSSMUTMgTz9t zG%e0d1&1iIIAtue!k!exNP!a|0X9G|NWn9r7(F@DE@zyuNV}8b4$qko=ln{6obn?u z$l=guCa3J&OqKJe3#I9bf%!vZhJkFM%)_5$tmjpgBESo(Stxhbf-OTTM@Q|5%9eZW ziG()gX%ZDzCu@8vwWMm zIcdYx|E-b8l*^ZDpsx!cvd1aDc2o9iJ6if4RzXz>4K?f zOavon$dKPWi@jk50^Y9D)C{6v7@Pp5vK*FPP@q#w$n=nn1_|{A2whq+34~h&+}YOy zg>n_rEQX9dh)E(BjxcXTjvcj9FU3w78T2sA5jO}=RsjQ+rk1B-P(vzBWklnLFl^us z8XIc8)||jdp0Od|cEJ_j)CDHSBhzRLxA+1R#$q7)L?{{Ku z^!+-U?S7%nBCt7_$yDTIUx2Dff}ReGX#z$J){WaQDq~nJxIVzoz%p*eo<&+`?p6%1 zPZF=#{b(u4iuBCpd}2GgzzUwR)8O*p_K+MJ8kEs#Jf1^pa zt80@$+eo+)4J3_WZ=@=!sC@C9go(BQl znB8^?bFmUHSq3(9Va|hYf)U5+BTF5=$~19NBUdg=L6Wk(&qrv4RQ9wqT4hwn^iiB@ zW&woiZVr*kSG_{u_G%z*)@clc+yi~1I5MGiB4yVg7{jxNNwtYlf)FoL1iTFOI)q`K zrzYFlECcDi=*%cy0msc_Yagx9nI1$ihQ}val;>ecfA(zP$c*pPd>s$Bxq4m=C9UxI zferP%8cMpw$uK>pM{&n`8H#OOoIKFuFsxG0Z^LUYgGvdAREyMd{41xn9svYnpsPgf z@P?rV!5Dt;VKrlQY7knAEnG+e1dEB8Ed9~(o19orZh?CDuT1H7amv`eD~1dVogXS$MoL;VR8?c+gj>(Lfw($UVonCTu&4!8huD_Rdd zqOr0XrFc<8%ktJ7PPOh~cjZ!eoabYhG}39kVwxhB7tIu@F5>ELJXuW|OHSZgR0W1$ zSC-9LGiXR0o1B7>+2KWR7;8Q8P-(Ik*^QzgeYaGW_2PUS=*$FTK=xVeMie-q7bV-A33?AWuc06Tz zvU2yCR}Zblf>YJr5r;N11(VuzK9A_>QgmW!JZm|bEGg;IL9t|zF-`4B_xH&@kE<-S zlKcd39a(dx#4^!Ju28@c8$9E{jYP^lJgdVFz)q9&LrH`o$U64A@Q7u6dZq_u;5Z&* zQm(PR#dQM}93F-N%HhNwUlclte8O<8N6mp)!??K759>;hXHL5*O zfS8@{>m^Hc3Z>nNhkoi`5@aU@ywdQ1ABt(f2f}18BMr1iC{wYs_Av$6R-DUe{6S3B z-@HSY`4zH?9;w0_SVRupvI*q~QhniF_l61iCGK@d)LCF(?UA zV-Ok?Go;>|S90j6C8Gw$inH}4T;TNys4<351&v{|jeKLQx*>0j;Ei}gP;K?~Y)+uI zTr>kz?N=2$7_$&-T}7O_4Z0&0rc2c<_CjzoTgWir^+Gw%?Sjk5>J`? zRy2fQokZnz|E(h24%TLSh#{w(RHg`zO8cjmbca4#&Wq7XtN~zR?ki{LoyXdbbd?nY zo}7B;nv1PX?`*q^E)x{z;hkTmDfjgpqQ?GYa}C&^EXJPAwmz!M*6DK;;pbikRQ-Y& zB$0#HE?r<lqEYC^7d@Vp2wHLJ^#N{D8(dOqZ>Ml@q zFz0i}%x!G{pt(g*+_0y2EXF%E?)>(!t4MvglrMXVHVo$pt;?%MeR9j}umH(~_ck)b zhvQsy$lP^vl9-+Q^bIm^DQhL7!> zLDhY&JD?mPt&3ja8Ft^}s_a*=wsL`b1}fz$gpFF8fp8EAO9t;(K&-@_o_JrWbaHwM zTcs1?Fj-%itH|{r2*akVZ-mH+P5Ueesw(e>AafJ#O`7iLVY4SWG-&$c30&4S{mDdn zk4eS4lDLC;I2Ik0_eI1k(w&{bnLoT_fiG*6D4j8TaEm~Y;&9mhLJ>wH!CR*bN#%3k zSrTHME`&v-rm#uWT^Jn|z;eVPd5g>DhDK!NMGA>4-27lZe{zHgJRdg-Aam2IgAc=z zp>@T;j9H+h$H04hE{^s<5{3pnS=&rMlB!C-zED}(RP2?xcU;Y@g@}FYY_a#+bFS ziW#7GQ;k!FjVMi5aaf`-fx31V#tJwMkm5lE)yk~G=c$6=99f7F*$FkduHkBx0urzMp{#0sf9Nf=)*jmcT91w?^P;u#9qIjtTwF9axvXVsMjEd#7OpypUPP2U|Fv+Sr)X2BN(UVXizG z4VQ`Sct4p>hZP(;u^Sk9UzKV+OG49H8;8c1cx0pk-anK`FT#nED47KOe;}D_jFcqW z^m$IYNbR1vDpq(=UA*Dsi)7*z=@-WeQ>Jj6HKe$p9|yIdO3JHM*viZCVLuye_l<1A z;Kh+n*<&F;*93w4JY=+P&6JvU1PW^y??9OJ5>FAx`s(Jjji6f0`2su6m#m?@^F@@x ztysqn)9ok|Jw2vN5Z39l*nP((JRY6HktvwVz!J0Nk!~nGBH7_J$w@X|dfxENgUKO^ zm_l$|3x2$OlE(&M?U@KhDwe99?nx>b_Uw~Xc}S>EX27XE8vM#9buo%o1mRAoh^Gt3 zfy#ER5`>(3>g4;R?xc)d8nRSmu-FwlvBZjDPA)%HSbZv9D(r%mXvuKPpIm};N1@Rx zdg`O(VJMKhf#=~EBo_gTH-$$;TNRh>WFplm5)i!{YKbDNA}%5lnU-3L(_MLz712BN z#D$QXUV34GE%2mOAwQAP?1?CBVM|V44Do@8^_d7M4~LZm%acjs=qZ%(#vH?<#Tg1( zbUN~6dEPl5uPfpeB?87&ZH4jdN(s{-*H@e}f>l@OPP?1)Qe9(kxltn4xjQ7dfu=ib zcte2Z=2B02hAEXw$YLudPmv!2gv5ov2u)AU7Z!BfvHq)r(c?uB7MlY5?I|Z139AN< zgyTnbbZ&DgR5~Y0c=>1qOS3bARUBF35&%s}_`oj2?9sawJ$YeS5OT3+@cba%I*Cr4 zp#Y29Rn(ttD&2o@zJqwbEQgs2%P$O_IPD6t#U1Dhp0#GT>k25`#yahXfp!53uGz+| zbPb)~p$QxD{uXgVm@6O!S~*QtqfcmJDr7v3K!_TB3Tm zGJ&^=UeU|L@-`Jrez5!`MqkH8*I^shMJKyo{%xZvg!eMFd~`H4+tDozGmfjaieGmrW&4>Z;(z zg?H1vVorO9q~*w=DXNlYid0v4))x|RzQEUD>=egR2zgJq6D2cQDP$+BA3Vk54W5Ho zy(ofR5#IXOqihJ(SFxF(C4^9N0wgO*pl!NPW2F109KFP%E}h zQHVU!6^1Xq0uGv3Zahj`^clHDDX}pN?22ZpWYQHfXi@`pP9aWl5TmONU2Z9%+pQmT zqq?pfdWG4O_QXL952H$^;&9mnl1WSn6oWX9=i-zF<~#;QoY$jwq)D>dRF-Q`%vi>Q z4qo>JZytg{UX9MCm3ma83N1Vd%I@nBDZ zC-&*EYpt`330V-&Vq}6lPhduRk-P{gXTuUr&(2}x%huBiY3DR70F?a|C983~q6@Tm zR4-JaUT6u~dc+U6P8K*Ekuw496#<1r3$4c@jU7|+J8?FosmCIX%p81W@*v@$_avjR zVY~8pSeey`E?-p%9WJ<~{h02RksQre`3QfX9tYP?kRttmq(-FW4Typ^HB zK0wIXc&&dRTdABW;VEdyRj@S`u-#jxU|HkuER5OW199YJRn~10*2G61)jaQn&xguXd)9kgoh1rEj<{B7o{E}Se>C0)*ct2Y#z~>B zz9^oHB~-XV#Fx*gzj2J)AAoPy){`q8)>OD1$&Gmsjslyc>VtB7+k_(v^M5 zgVLfDZuZ;ZNF}@Cc$N~D<)OiN`Y<0hx32@x<(>`*xcwIbh{O{D`jKY@=#-}foTE0f zydS`zgnMvO64R$a>A@skjTk_09mJb+W@uo*RhKhw2*W!xI2cQG9i}^tXCnvpBoi@u z$PSX-L1$*55BMJ1(EV^9nMn?$-{BJt&Xrf|1$R!bHq-IJF-;pEDzipTem%FNjmf9f# zM&sZGGiVHzJQ~o!G8kP(}9=bl#LE^v0$T^OPCSV!vz*R7hhWj8mS+jj0;W zVN40y8T5jHZ~?Z{@))<1p{NQv*E94h%2_9vyn)7Q_gEU4i!;BoDs}n7_?bJ2%aa*e zRA30jT^hVVh?_p>A-zt($5-(@vQ^maDKt=uyW9l{l)>(NS|9{383ug?m^wl64cFgE zN)WAP4O60YMV&8}kR|L~Rsr`0;DkK22cz6s zNd$%36iyqemi`to%x1hiWrpobx@GtLyQ$befFU)9F-dHFv~q}k!YWaMl_e{0s@$9+ z3bhqYvOH2YFqEMI$~kDdV^@)~%qdeHhJD-P13H~0$VYltBW4Z7Aj4c&`$~(cxWE08 z!-)h_8or)doH+vvo(P?)2JaUJi~t^1#H&wYEApNIV2TX{?Wms|tO0LEPO$LsH8;qw z^32F&&HEsH7=g9No;7UymHa8`0*LioA;djdFu6&4=;wgy-W3?uJ&INlmV>7ckVyVA z3pGpZ^-Zy|dR%wJd(=Xoxbo)BDK0J584y~P^KJ?^sKLy2vj_< zXC5?1zxBBGk4GzIB%G?NFDPKJ?KNSF`2p>Y6ah8CXI>REDJE*Xlz2wkjz+l)r=b5F zqzb+8YAxApw1nrawVP&ToCL+uUrmm`(S>8lmcRrb3-qjXi@oeQfm>o2HQ8^~_M^+B z7aiJ^xJz%aYK+3}BPVvGvGfJ#tXlGes`e(P#2eEW)}X>)-!OU-!QHjQ&_agb^pKi^ zyXu0Ob$=jE_8zBbwYGN`4Yqsa@*vK3Ox0{F*Ifd%v{HdFj7@E9c;pMu6pXs7WIRT~BO}x02{S6Uz-IJRn91>s zq%{}9?5_8?Fzcj^cD{ffuw8B|35_i`j@&^qxH2o&5*tz$3o#eJ7!F_zV@2r3le3s? zMLj^^hj-?|*@|R+iW{0jtSOtP7RtA#w4ZrbQCz4sA-ffL>U+ekR zQ;e{|W3;o~P{36q9_N|OcvhIQDX_xTn$7ftElg%pSWv`BmgAZwCNkqYtz~IMk33;D zs#J=UNh+{@;SY1Vxv4V*lqxr2R4+D?YngvbhM+>Sggk)7KU#zqjPVt+FtMshGGZ|*o$`hha`>VV| zyMu;Ur5XdfO2yH_7|wig$8)w|NJrSxcI%l}7OH_Ka{@AjD~+!S$WBIM8k{5=LGPDO zHU@QJ4&qN$`2k&}NggJEQt0DopY?sNzyrDfHwN%xbVHyOle!C8yhMOqBp6t_^TX3) zW7I$WJQRn{SWF%oCFHI zQa3}a5@`A{t9V#Ic0&@5>8LEp6B8I2Nz63${;1vFQUw@{#ELbHn?xnhddb$JX+6^O z_l%$qR|K=~K}&>BxYr|+Wj(_mcyhv_G(Z~SNro6b=!DqS)SaD5UtyF&Z%KNHg`@s_ z_@1fQCRateaqyq$_-ML}9aVM8IRUXWbe2YD@FEPKbPp8FlebnqE0yII8*>lf_!hgw$2YL3Xt83?VJYHZ zNa59D}+2d+bfR#^-N1$S#4H;KW zbRD+RA(G0ASL$r+VGNXGog^4i9YVQUxZ};NsY7vNeUz{c_fmw#(}m>tD;$uJxT8uavqW3Ibf>T z7K3Eg>$7g)Fl+Pj7dkb+PDo&qfghb-&~t%|i;n~H2^x0fA3Li48d zmPXngHXZs93ZrIuoj@%#pnSeDsv^Fe6AUmg@q_tKQK;hiGnsgQ-~~smsU(Y?hUH2o zAcT;L5U>&D9O9dI5S(^oZE9yJh|Q_1m^=U$?C~}nQzld8Lu!M1`VI^HD0c7gK7r62kIGuAs$a3T_$GR9u?R?iQYwT3s+yc^ zu5ya;g+}!U5;hR{_8`q}YouxXZ8zAzL9Z|sJ6TZX1Z@HK-AJ}!*xfh}oC?DflZA@Y zEv`06Hyf3A`S%X}d0N}`?IXkJ`g&XrIHw(8`E28Zkqrp`32Of#QSFJ!ELpYBg4>9V zO3-p+xtnAeBd?pi_YH8?e=qwf8}T_ceGz_VvL)oRzi;KQLE>0Nbihj#30&v=ihK8s9H zLuSHR;&iH6Qn|NE5xZ?LPfNx&n zgziK5i;@2#DoY7gsAJd0jNK_0=M?uoL|nwJB5b7W+MLO>n+|52FVnMew%qHx&$j$o zw%SEgg+E{3Qy9V1guZxXo1@KxBy7|rGuEaJV8DE{xEt$4<_5Fb`zq9xb zE~4lOdV8Y}2k+g6QSDsaxS6b>9=BmuT>bprxOoHSuambZjQZTt3D;I^z-r7-l!sec{Xj(`dk9;2Uu3pPfklEG74>%;@O~{(Q1G z-XJ{g`K#q#7N|*Gh@O?0h(*|crbR6YI1Q~&U^1JLXIFn`DR7Tx_JRw^Uz;nzP_HbG zVugyuzQ3LlM8Hr|v_grq6+!%RYeJ9r{vS$F4^$${yl6JS%tOu5^Sa~Knde_OCHr#> z4r^s9FAQ*_eOf;{0>P6i5N0lK(^j(%Lpf0`;5IvIDqbjG;AteKtzJ=j9-Y;hMNZCw zxw<;3uFHs!MCzrW5igo>Z^p{0>R^=xlN}lHU#x6MzX9b?^7g2Aw9dbQ+IqQyv$9Ut zPUAYdoYe4lDL8$6pD#*tq;&k%1#3{z7u(bTK-CcDKphtz-*CPSGEqGiBNC~#_Vi$f zKuiQGvyk+?c(8L&4fSbCFN8|+VD_6-Dz}$(SS~hs!8XQ4L$rUEo8lJ^Rzvg6b0eDs zWVk|FCqI0pX@rk7xoB3fS9%dcxMjNutVnpql21$Xn7c+$43382q7K`EB}?5}W)NjD z^5~1{5M9HLiIov@&|zi?zz{b?hDboe&NE34oBcH^U|FXM;@jDEnZN|`G$>RQiwowF z>>mf#1JX%-G%>vSxy4j*2_&jd;PREzcYFpMB9+hXIR%B7*>lR7Wm?LmjvAX7FfcAr zEyo!YCiBY_g@GuR4c;P z;B>p#m+P9ldD|v5mrdj&64Guy<^T=9TE+?>2zf*YZy)HoB0hbGf%%HpJ;p$UKIWi3 zD0|1^WCC&UIR)umKCd9I!?=11x|+cw2J+?t?PjigT5lLzN{7u!z5vNlzT)750zO*T zc&=XFG>~xn2Y&2v5(?*#n%s#L8gnhXoIL>JHhTcXkl6z^o-e?1N!l(@K_PvZD`{z0 zZOl{GtoSH?jgaD@9$aSxQ9Ck3H_NR8{DFfRyqPbE;kZZ$VhRPY9a z<|cx%7;-wXKdL4mGGiWa!t99-)69OhYR%zJ6vRQH06I7My{{ zvUHV%JWE_sh#aZac7)?EX>8;mMF$hX4#Ir z<7#x^WH1BMm2uPC1x`IBCowVOXaLHa0ccWY-f|N)cvaRcH)bx~ser4?n8nLYr-_-g zIS7cG84SH-x#=>4CW*L=y%(;y4e3T4TrNTU7(#j^RzK6A9EPQk(k#Zk54h5jstaF) zN0ytN{LZgQb@6i3D|rl=0fcs%!;G_Nx!Hr79+33C#GvM`2I@+ntU-hX>&6%0CV36$&VptVl|=Ul9} zLCce90sD-8+j8{$dGcSi9P#4ltvz1Ov$O!|gRuf_s7rsIQWmiPIKFn&Fsj7J2!>gI z_9#b+;~2<&0mrW!W2SUr7Ayxn;i?g8LpmXKj2N7)!69W6GT~LmM2Ae#jGHVV&fXzx z1o86N{G7rpWK0}kGdKhYY}Mc_4{+DOz1o~J>&=b$hPKa^!!S}YN5Zi{+M1NveuU>x z4i2s1H;NM4Ky3y1rcooj%>c;qbHH~Y#w5xwNG-8phnkelX$fUL+t4GdT^VVrh>N3x z#$4)B;UE#hQaqiB6s(g8V^)SYNMGV;B|^=mQG~FqGd#cz9K=c6X47&NT4ClLwe3D` zOv_5M68*3JaL#N%Z7mLq1#oWZvUGMz*(Fl_~X ztrPpguA-+sT;rd(6kv&&IRu=TaEwGSM<&lR@jGrHQi zbM0hn#B#DVV%rQ<%Gn--44W6_7&_=vPPVE zMm$p26vl*evavoJ8|pLrf;U?qbEI@;kb1~!b>Sw9Jb&*7nLT61g<5=ytrs!YfU1Kt zo-=L(=ybVxA%1>{Kfl*{F`PJ4o5Sqs>PNk{uR`Ad(V2#SK9>9Q12uJ5|lJJ#raK-S+;FQF0lY+xrI|-HfaJsFQ zp%_C>N<1q}D7+iI{DqJn+|Z~zXIFuUV$CxBuE7A3VA-uM9!b?Kst-4-QfL8J4oDY;!Y{7q8(rh8Pv~K$GBf~vsSU%a*IYT1df!5%+wN~oD z-6g3@rlw~yLi}fd8^Lf~$+VCuMdE_&wM(T-U^o4Q;qbIW@VV*sWRI0?uuS`Jt{@LU~oh{eI5#K3V5anQJeRDr{ZclbtuBS|>^ z$T{g^a_%pOP(cD>1KZ#mLOH|+$!CqZtfr*PWN@{#5h;_oQ;;$1`Z1&_T(O#{8BibF zC1vUQVdez{t9@OlM-l%@(pr*dPTIyb$QPvAEP1U4jxEheODQ&;hL4=C&4d;erBygE zFT!3KgGLbz!pXb>`bs&Nna6dah*UEef)QXzZd}#4hL{B`m(z^#Cy;U!uq3g}ifN=P zpp_J)*mG_@9EFd3(kx&xdHBQqmo<2dOw#1x!&%v@`Z!4Iaic(--E2%@^h-TJAt6)Lz~QAXyFa(FovIB7V5 zoKz%V%F~YTaj>gGHp>x*ViyY~dHYjHCk%(471N<-&dR09N!@gCWvP&+(~V`b7NaO> z8bi%m_+_|Itv9D)89ax}E_pe-f|G${P2xNWH_IZ9Q&<^=PE59hLKztcOQg%i4fa45 zeL#Ux+eXnK}HjYZ32?KyQ+oZtv(k5iO$b!Z$J)`4mKIIc~h zjZw6Z(~m-+vMBZ;*FH`hCm2`2eW~+^eiObHM7{=u(qUF$alaBjlE+%;B)j1@ksTt$ zn3iJ@f=qY?eh3S%!+Li$zE>dL6$UW;BDh{;0K*+{k;9wtF1X13P0LP!D+FGP(uikh z2g)_!6Zjp)?>Hv?04C5uF6u25M9hLVtZ}5CG3gVo9!lz_B+SQ08gdB}gKu3Rl#2~D`o;>3q?IKf!r zQF9z$#6Swt6mW|MWDKuI9Ez354SlF3g1syWGWESEk)wz>i<79k&boa_IV0(mA+c^O zu?(hVL+1OjnSYdh8IGcCYPD{WlXiyB8gnvj>7FZU0`kK7^mr~Px`a^YCT*!+&lakn zscm!%4`&OmKq3{jSTCO;WRpB+XTQl*)@2UyNLGoPA2 z$C3G&`CM8#14Tz(!Z406YZ1W1n#H`6sPjSK^B6^1xE#(eh4zobtPM(`YMF)w1ipEP zQA?`Qa4&N{Cb_S zZ5@%8O1$}$B%P=pT02`Rjm`0$L3;MSr0jAu!WrV!MqiYm2=Po~AG$b&QDcs{ZHbZ4 zwZJTj$>;?!q*BrVZn@(NQE0wma=>88zcdb90)5WjNFu)&YBYrq(9eQ2(hdpLaYm@W z4>yoR2f)=Nc&oJ@}*mveL4h0&DK|1$I^=E~GXh9>NoJ7cSa6tCKD*UcA zA=vJGnN+bFBLu0IF=>}|(y7{T)P{(V`KqL?)|}?k8aE&dIH|D@CDXbq6u5{2!vIQ( zLU@RgCeg1$Fg9@Mr|mESL5Zof%ndqzbGKoJ@*n3+8u5GZ53%NPbZx0i)*wgPZ8aAP zABPy{5{ePT^}|O&#JNq&mE@93sM2OoK6{e=$iBrmVU8(H(wc0`Tf%wAx!a9C9K}DK zhvt%cyf@=l*M|gce}P#(YrMw!VwTR9pT|)yZ4CAJ(W?5e1lmGg7o5F~`PcBMhIV?~ z2PN0{7BPn@bfV7nVS7LmLl_B!u5ApZzUFoSXs#kR>;40AX-_0&*2G;gd%hG~l_pU)h)g{;C}6!kvj{DyuHWEPdekGD?a>vASS=S=2ypZxCNfz$}}bfo|nf zT%WiHGbDYFc{G=EZ9Qkq0(BA6Xu{f)2bsB1Si} zW~ExmQXSp77^*#7l8AuHhzUu!hR^gP(iw&DT3xU-9MC7DPW1Q z`xSxJPj}aRRhN{_HJtUqX(ISI>w-A0omZo#LE3EB(L@N1hqHtXxwh)A(*L8@hHt|B zQPtkGa1W3g3iK2x@4ADC`3O0l%6JU*QWGUjMc@IeDS=V0)ScQ5@KJ@=nCrzyPHki@ zZp?wJx}TapKX>~4yjUBS(M|p`pDVk|&0HEx#WDjqhOsY~biL+N8~G1)S7!qIzoNJn z$`_$9B!aO7#3O}2pkb=!PIJ=H)E;Jukr<@LZ()&f|>};b!zK` z(Q2OC)4? zxaav>Y$ifUA_00=p3Ze<2tCCW>j30Tvvmj~bP_+VBD6QqAc*%}&~mqa`t76^u9~7* z#r7VA)W~t^hxDqe4aX{pobB4PfD$O>k~Dr8OVBiHBQpv7g_eYX{0+Kpl)p7j2>ar` zjLe*LK5+G-p-w4+Qq3Wh#T8mL(_Wbyh_l*{uiTe=&dy#yS$_mHew7Jb$`)vDtf_Cd zM4r!>$E4=*jPVXX%XoX9WxW1p887uLo!99pVW;O|(_GI15?PWIWCshl(>vz5AIHz?J&ADSgmaF+d;y_5s-#0umx z&TG{pqrg$Sp$y42st*)EYA|!VfE8EE1?B?J#^Yp6$cdLY=_rF#DPW z=|&}N#RTPG!CX4KbT468H`s@VF^hUcXNM)TlV0@|lsum<%KRc*ilmURGn{3RXHnvD{j&z~sHckLwNzIi>fzj^ z)|J6KS#j%OcDpk-2cvSSVhGs<7p^Thi$JD9v7I73$w!wA4c{o0qX1n+SevAyfonz> z`DzqSM$X+M#^Jtha9d4HDpd%VY64NHi`p>iK@y^nH6mo?O4hu&{0(4;bobch?&=<7 zAnc?wQU*=dZdqZ=bU%i*)}5}^C~pEj8U<^&J88IgtzyY~(!kZo^$vG^oO#8Y0Jl7; zc1zv7rme;Ca!QZ&)QkfH^G!1*6)Iyrl0+fQ3BAnR6FDs=&j&2|` z1%)CuT)Sp9D7+h!l;Of+jq|iM%vN~52mZ!?zFglz9R_J7X zN^UE2U$PgWYI<5>ug_N2Rf&lc{w)^N+8WV;;nmr967md zB(sB~MlIdqTx<%yEAvYO)N~932R6|bU zHgf%1V!_tR_j_$#nTkzO5_Q6%|iOor*U72tZ$X0en)-g3}+{4o_tSNRrV8C z-&&sH82)UfI8Iw%np+1OSND*2V!)>r@5BJi5=n?SR9X_K2UR!UPjx1WkQkH-6=kDP zane|qY0NiJ=TcVXp~2Oi5Ht}AWXNlS6M|^kr|K|>*s6HZ_|7tG#Yc*vE*GS~*!KlW zy|@!`)WG0}*T(f~y=Vi(Z2fH)G0a>`vyRqAUvm#HKUAm3oQN~g#fs%P-XvOgC|AA023pOZW7EJV5mvOMl$kpQy5bsbA~tM+eyPlo4$UoJtrY~wB6zZaB%g!(|Frimuy$V8f!=># zJm-@49^QMdXi?U^^wn6hNt;wi%l1efYb?g3ZN|QmtcM>lX_*o!lZ_-&uSSfi&Us{t zOdF#KYPAs>w+$ep5#S6Y4AWr%8=wXpGy+W2?ofaRuu;3U0J)VLXKGC?%%tu2t@ZEo z;6w2QGo5tC)Ybp*_g;JLwbx#2?X~|?&Q>LI^ByGqVo|Yd^lnMYwnd^DcL2)G+>?pi z@K1#Q^btVjd%%Q$iT}PxFUnPVF>4zZ%wrMeiWd29{=dfmzXTL+*lv-BA)-A2ou@V~ z=K}RaSeH@TME6I=iUTBq0=67uwo%v4abC zqQxSH3Mn5zg@tNS7gtOG;X(TBAhhvOrc=+8di&g{m1V?bX_K2UA0Fj7;)XOYzGWn# z;o;6?+o}S(HW}W9;!rIrG3E?pYBj5+*uEE#M!cAASu#QKKcyb(HM%(6ks-D(XZX zu(TV<>-hpNyD2NB238}!m(reFWe*>wrIC>X>E4T=*n1In_l`nApL>UW(t?V}_&D}m z)WW_CTG%&i0Sa-G`B)9%t>9;5gtUL#MeW~qQTw-zwjXuIS^?(UhCPCp;Tli8+y>=I z&(dwC+GP-pm>xkA)~XS&37D=2QO+v3K^w{ zR2WAoLLa^%MYzgGDdHgWKicPgv^P!>uE}vIRGP-uTk`*!E*bgZVV{g#dK+&+f4K1$ zRGbInpoOEu7N7`Kt1=Vvxp9i{w069GonXh?KQ`JvFuC?eTA@dIW{oHE}j1!P3{qX;qK3 zh=aXPMBn#<#YkcA(p!K&2x)Z4&}ZnK5U|_^q*8z!J7A&Q?U@T4cLYu-2^=c9U!-)j zOWs|CqCHyCKWS`4bmcN`ldt%|Tv%)S&WEk9}=5T-3U&w;X4;gvs!6ciArzL>ezzQ4dg z+Zz2t-l@aUC;Y{6XYZQcisUUfE@4|L(pj!k=RTyofLY3*1t3sI9ZFfkDm6zt^faV4 zf7wUfA*h)gX@wRD)$~>4;@%pvltZ%*&*s&tGM3>&lUc6Nv@&{1&y)p&IR~!1z-eGi zwL9P=#!ps68A?NE{O%AX-4`;R=k0Yo=Hq_y(oZYf=Z8W@Q)p3osPRF}`5MlFb$`RQ zX-kbK4X^=OP`Qw+3uOscxKyuiYr^Bq%LU6=QWh`tdK>%NK%SvJ?@kQj^q7X$!9Ei( zIRAqb;QcHRjOsiCxrFvElp55dYQ2q`u8ulJ%hHTAG|c}EwB?8J$Y3PQw6PL?00@Gb zNayEiGE9FOEeCQa@dq!6>-{y*M#%R(Z#4cWxEzfu8IH!);6~%_ErU2?uy;KVq?eqL zJr||q!Hny+a8aQe*OG*5BqeaARvH=_o+D|t)5y0wJnKKfy2{i$v3q3N$2o*ZGoW@6 z&qDQCxRbZuky!?F-C}y${wir2;IN3y?5=*bPPZ)$jGFFDzavbI_M|UuO5^+LTJ})I z$*O0scM#jd+x9e0rin8BNHi-7kyaUVc`j=Bc2u9{e|?Lq8B_G#OwWrP!(FuJnX)If z#o)=0!rC+CKU`Hee}r1rw0{kT8U*#+$e12CS$}wXt!K-fbsHZ6H`T_E0Er{ed~D0c ztBqd#GWDZ%*^ipH;iHT~j5n-xdN zdy)91in2mX(Z_agc#h^w>l092ZQ7^7fVfzrPqDI(x?<~A!WBn>S>jiCi#4z5nfEIr zdE!;Sp`d>9psawxmi3IdgSoN}HCLnsy;wg+p6f`HbJB>|&}vy-HCje!KTes%R`}}e z8s-a=YdzAWi^mZuhwiq3l!;8=vzKxchU8yx@j&va9HjfziD5=cN25)#+3W}e( z9c)!sdAQ*EzB8ypZ`@lMz3^MMy7G3)3R!+lCD*gPYPZ$9-~L>=<8W3pF}Eu@&zHkc zd@tsz(K6#0x>Fimk{=`ol5YG?O*NyxafPRzbCq1~E<)9;yh$8XGr^@crZ-rjt!m~| zE_A|Ba?67`ez~4- zxfQ8)khdi7kKM?Vg*~jR(StD$5VMEswo4t;DbXlHXuBTvn-cD*(?ZJHtL*uC|LmIT z^2b2KBeLN!(C}Dwa18WGY4%dbNaOW~Wrn+q^LvRF-{fFvw9QK#EbaSwU>P1hT@DhY zj0=vSM*A&CP(#Q^j-WQ}VJE$(K63T#p;^`W2X5_N%1`!{Zjbsc*_du)`B5L8orf-~ z{Nx_fbUhRA5s2ql#gSGwmr-|Cjmde<=r#yP25NiW7S@UWR?dKj11K(bGB}T?%0<7M ziM^9F^Yt~D*r4mC8#9ZU-!30cpo_SC0cF^(L|abv$^!C2QErMZx*@`B-^&icWUsnh z+to~zJ5bIbFW0JGRu`h&%bAxxyxKYf$2QoFXW`?AO2cao=8D4<1^iHgmk7Oh6_-0U z=9ZOMrY)|l@?1+nN(OS__%B5qLTV4Ax4|WCJqu`UN%7ZZT@1t=VqK|#{QzT5xK&0} z6RQKaQZBuR(mQE*3~3u)e^!;z;6L;t`pAIkXkN)9GntKSLxZS_tZi0Ts}L)M=iy-< zMtN{`xT?C`=+t`oPO|gV)6*|Ck1tYu)KyANRA+^f>iKF8(ar_V`qnJR_;$D(a6Hpg z@)u0&s1s#d>d|?>Lqxa~@*LKhc}DA7(9_>=bO2f%Y%`sBF6APTnr*r3I(oBuAH9vD z!L!6^HNRE?E7>p8EgJcbfQWx`5(<~j2Ta894-9;J<(oHR#x9PUIUO>G5sk^W9n zRjhP-)+1BoX_OhFImc+rWh=4|>Gd({hy@Koa=lB@Vj+;iE3c>2?m>A+Y|BFjc(=yl zO*&i?kD>h9esOY4zde;i4Ha)T=F#zuW8lJ(3YkV<300TGg0(`HE*cO0eVUu&brt8A zt8{_P)Zt8LE9o_J;e1cL`@`<5KgZz~tgp zT;V4`sF@yK1wPFvx+@I(8giDcaJQs~;uRK7z@2ADfgKV;ep4YkmLQWLBvBh5GO0w& zuwKS5NAQ_jhE)KPWv7d7%0?pIb)7@~75bFiCpz6xP~RM{MaXghIZI`il^X5>6Ru*6 zl8L`{2h??c5VgeZR#woK-V5eBNy%JC5me1f(Av_p)K!1W+cL5i_aC=e;ZDC0cd9bY zm;72{L(0UbV}ry|f5UO_<%FV9XDBtNyq~LY&d?=lAe+C5Bt6>Bg_1Pd)MX{<(R$+o zUvZrqg#<}@pF*4hREm;&`M$U zSJhB*IYCOfGg{4;vxD#=npc{UYNU$%w$}&H|MNfef|+P ze;?_dWL16*k$MBd_K^ z3AR&!*$NgE|bIBGhCVdFUx$EWX z4h6CFl2uj1O|A1^?Tt~SY+2T>oI`DYxCIu!Kv(;y`|bEXGu#A5w`u{F3X8Zmhg)iq+gxgvd+dT;zHFbD9@bxRP<-pp z{ZF#V55JUA_yG*X=S1*Yjhbqh0t4J=F9nU;_{>f;w8$15RI28V>{TmyH+)1B#a7Ed}1@%4a=Qt z{JL+#_WA5cO6OizEwXgAG7LK=A-kV)t`chVsgEQ~apRRuNyfM8Om!f~bh(fH6nVE$ z#;AvQ(niq+Bzjp`Y9P5mPH;(o6qbF!HS(F34eF%IAi#BCji;27p8_arbG(mn^(r?` z$Ce-KdWgP-K^a7rTA1`TRrOJ&*KzxaCQCQay)dea^>&4XTyierUk~OFvyBh*;HY0*Ik@eAQAVrt9z`pK8k6NpN4C+ zYWx~BrI_%kA%^)d#W7Z@N1?w4&dHsZZw_J{btKlRDcCcYZb$E)RBs!P=e)WOU5Rd3 z`{>_IT8EjStWD}NGAOC~E@)0&v079&c#N%KF!Q^T8@U#o$wE&#udYZ1p8RZdQbjf8 zM)4)e-pBviqViJ>M@wvG6)b65W(#Tf>1W;?p0P=?eq80OiY2$WgKTTRfi}2<12?w0 zt1e6%Y?dpR&e=~})a(4GpQnqmKaMy0Zqj$4>)*q-f8If1y=X62@|I{tA6)n3i`%(A z>f7RYo@B8-J`sE^q~X4t`3LB;r0lK-87ZCraukI70|OtS@h>4dJxRgK<@zn>e>1te zg0d%ed>&WhL%`t|p#7-Zj&MGH6tww$LUV+{7z5ilTKZbt(nsTOR-3vvl(K%n)G0bJ z=)pBMo?@TW>HI_I`9ly=KHmeFiK_Qe{Uk%k*n5c;6q;^$S9CB;9fm%{aP~tX+Zdd{ z{OfKTz@JQ6t-zqxD=mG9zV`F~=YTw=z(lbK*bh8HesRt=Qim;Mje^9|?r^F^+kYdj zucafqDgviP-bEJ|rhN%yZ4YV?xb6J!tlNQ0M_YjD*VpOVR|Qv!u&qnwY@=_*RbdeA z2Pk(vZ?6{z9d%y%JlTH3?J)}8PqJo~tt{@G8$W~jOYwi1wej`m5M1Ma4e`Kb*SFwr z4cf`|ox?HB*6qo5MqAEu`)NCeoIHP^9E8gRPg5xVA;Un zMYtDN$x94fSU2~Gz|hU(kUC!%mlr=?a>E(Fm4&TQ@LUk!8}#Mq#=Zit^|LxHigCbss#O`O!^sh?=B1uv)Q|DiGm7-d$dtbQRgB09{OUGM%MD=^8(V>5 z8)?6u@hFqAiVtKA=is2FqwUZKzvMo7kece+p38{qdx;;6P>xGoQAydn}lw2SgDOuB>)Z#~hht!dCUq&RYINBi{ zL_ah3W4d&h^bzUNQlY9rOF=j2OV?#TUIMw8ZjxH)H%g=7Lg$V+Pa#IfH%zh2gOu?j zpM&~ACnd#I>FU0i`sxy#}z7$8O7VT z(vs&V())!RrtUjvCT4&&aw!gTbcC{)C)&I`hbb5uQoQu!_%F4tautz6-)!5F)1{y6}G6&Bz5^}gY%%{<{_wO7*5)Eiwse#7k^E<33df*rrWNVr-K37j$4bZQyNB83gdgr- z^4!5}ZL}V3W3^C(3|)2UOYHMcLW>@eE2p3-H!|k82*h^&U`0}{wujWo{a{;SC}}9o zl8#C2Phe#ldZ$#~ZCdh2ll(fLY2_Gp_^T5aI=1}f-vrYcCPCLsqYszAm*okIpU1J6 z9ApW*y=SUwM1~X*45b6h5SsB&wtYKD(1>w}UYz7KtmRJvjk?wpD9Z0xq#7%P=|Gb( zmfy6ALjtSbkbZyYj_fR?4Flr50D6XPrXj5v%?& z>AI*pp2uC~7hTc@<{{t2thFA6s;jGtlZeNF$;l4^8CI&v$@_3fo`>yRwuHB zP3_MTvg+i_>cle0TAk$C?tFcg4g+7+96)4JZ65+gxstvP`5! zWTcXdm!( zuzk?iTKn+2YNCC#eKceB>%ojYoUh08bs}F+HlkjqyC7CNf0st;SCfp+-{UU=Uv784 z9D(0$cYb%HWv`<5EP9~C4`%#e-R4tK;pukg={n)7_4^O%_t)z8vs3FB4v;gdOzM5T zem_^g&(`m6)$ecD?^o;hPwMwi>-W#{-RH-6Y_@m4e!pD5zgxe*U%y|=cYnHmH`@gt zz0*0W-sxe|nL6prdX_@xk0zJf{c1x7>8xLY+sSt4`B{_xc!Gqvs>W`=YOgghYIgo) zvGdIce3OEB9LBoqbe3lqCMH4r3rzaL#8igNYpt&{7PeG#3rU_^pu!i{Rnga#ly*`g zEhZ!@RnX`5Q=TcTSrEeM5yue0H8^2z35Dk;U%!jqt+94=Ro45uapl zH5+1|XpsYv=Hm#V&hyjjtYd3m&(>TTtrn|jvc1N$#nV=@-)Evs_nB!bH2JiAjDa*D zYDHFmPxSoEG})j|mr|0YWM^LiA>U)P%( z{iJK8+Rzn4hbRY`KfSk(t!weIR%3O_SF5=?9q-m`CV<@yt23EIn7y{$=^*7+i;szQ zkU{W?2tMJ)wGwl|vtoO9*Wxu(O|(D}yWTP>v_fx)!OyhZ)_5b*`r=R7gTP9@R}>=6 zUuH5_*i1X$Wb30#9#6OluDJVlzFDM<-l>!_5IB0L+G}&QJVLm43h`Gd=v(}`HM=WX^ce1DN80mK6DI(j49QYB29Hm~0=RXZ3oo8m~@O$mv<_P?N zz#Q-?(<8d{Hn(>w*(m;OYWENES`pdHmZw-0A>JguZs&wjOd$QdA`BgOULlh)tD3ah zz2m&votIh-swPI1Z#plAwDO&hLOStuF4~78`K5RYZHqZ+fPzq`Z0Ph-6`j1`v$t79 zZIgJW@4OIwm&cTnSA*@z2ddgDg?q-Mtowgkim7QSaHJbZTQx|Broqr&-zecbFYo48;PvJwLT>Wh#gB=e|;)>zuDe zUWiJTBdu+uX`mV?EeU+|6u4hrh}TF7bhmoyMiQA%T0x;xk()2t9ddB9$(&6rZ>j1r zILoFqGbJ>yEft7E?-G`Q!i56m_p5%gIkLOr7|@?G|QxRb?h272IoLctO6rfF&Tr1^)@Yb-UzMSS+@l9OMGEzg5^kH z1Ea{fN;U5$^dgcVW98=M_S)1s^lmyPrb7goM<0{Uf?E&0=7v~uUMUq z^?gc`Re|(reON#&SCD-!TJM|#F@jA31Z8G_ngHZVi))155-Z}|LNwADyaxr&G2C|N zDM}8i5nOW?Uqa(|4Z(+?=2&d8@Vcw0-8q}xS+Pe=ISpJR)J-5*n_r!R3$)}XEJk3Z zp;uhey~<~ImDPZj4o5T-w!Bru?2I0}u&g6Q*0WQz_(zb=dD;vw(A8>NfR>EriVgj! zzgY@sE%spul$0HUm|02K_5O(R>}{NE$k(#uwQ>`jt50`zT(c=U4)iV!CBf8C{MysyqJNgxuv>t zK?ZU+Grom)VYFK&Ru-l#y=lsfErrHQ^qPffbFZ4t+%4D#tU8i#-NK9sD>J3Umg&08 zXwnr0CKs-7$=V&wQ;udak@FObW0`Gi=i~&Suz_K>3V1i{oSxcJ1315PW_rs2oEeY^ ziYq3g)q2;RXj+~Tt2bSb=bd)b{L;4f{YJn2yT}5P?qlR3jkGz7xge=!5c0-ik0-Ly(rPf0fnJyjo}TXxvYUbq_eQ7u%2@WH#3Ao>x0lD7~?W@ zewcW^B=(jEi9O^GFhI%P@nPce*{zw_Jv0cNFCnVbxxM4!wA*o=MXx1rz7F)3OW=6$ zpx#;IOk6XB7H6=9-Y@|f5aNk26VC`YB@DUgENTM(7Q5HL&k#OYgiabsEFfn1stJ=a z(3&Qxxz46we6g%r>w?`Xb36CR+Pl{w08hFHg5qtwz%DN+roCS}ZtsU@^F$N{-|fA; zDa3+*#vwp4{q1FJC+n2%b~l9Q*d}6hV&q7num1MLZd6pzbr)xgY_3i@hplA{zm$Jw zxU?0V)ih%F?9fyl=$#C%v7_DHWjjZLBcU>+SgaCpKIPkI5W-wn>^C9By6?cB=%m$h z2eqi%mc#2lvm$zUH=BSI?-qLvtii?c40}omwqo{k95Au9*sk1fzP{cvICB0-O&4CVcwqD%GA-SU4Yl%BVhThpZ7H;n>e=GdIu|z_i z$V|5K{&dNVNSz5j8Okd7V*Br|(kc_Fl5(PbVj!y-fj5LGvQSM4W0p`h0Yi}y@5AlG z@y661?+4ot#{2R1@ihJF_#eulK`XXp>woj(}1a4@^X zln>M#FDN&QjL;^pWTgynGm?Ha7J*Bpi@xZjhit~-3QhK&<1a(%rx|i)=}?3H+Hm;2 zGYL!Y%t+e6D4#V?w|lBQw5y7np;z0zS2OgJcJC({`f0oO(+vHr-TPUDu*mn>rLB9O zzYM+H?!BC$@3wp2&CvJTz3*q}wRZ2d2nB^B$pmiWxID0HCqm4Fq5J(EDuHoqkUPH(0#cTGx5HhiPy@ZL+>@XNwTKiYa8m* z1QXX+Q)1Kq<}$d_UgK|_=C@5hsEyAg!qGj&j*j5&$z645Nc)!CXFeC2T@+;C$C4*%iZXVx(z2MtpOr?XSS?P zx4Zu`m-Crq4`J!Zl+(dMIKF}otZV2Dem%zgu`F#;Bk35%n> z1<78!N;I@L8``Tt+FLNfYfkNAxk(#TjrI&j^Bk8@n^^1;ue7`SgluoX;gi~EaEmiG zv>0^PZK5*K`eM+mx?-g%!^}yxz0T`V$^cXuJH`1GCIbfcd}Iq*_hp~`Jr`|W%c*bo zR^jg%?7x?wfKZ2Lf6qLu1dmZKK{K zWJEvKYE5E8itySb12m*Ol)2|vUaBS}Fm>lb9cOGX@i4^oP9ebeP6dUWns?Onnd_j~ zNrF!o&T@JM8XTaxUU)Q+p;K?GWC^OrA|FIv?nQdL8AN>vSsz1F-s4gj5)KWVP> zg8&%|)?)7o1)|(7RBdT}>J@bwU`$mjQSBAH*&N8l=K2M9qdLPII7OP~->bf^8vlyru zZ6aBw&Btc$bOtPcs@S{O`_ou@t}ns?4;jPpU_yhboDBj#8-(cC&L)#T8#525Ijd2x z@Bs(+vcGfO^jq(4>>yTT-yr-O>#}@04I{F(XrrjLzIg>N- zp6Zu}W%JkCJwi`^OuuU|Ui;D|Aht_oWDl3h>HHU?c>3#e6SMQ*k5j<^U#>bXTzLC+ zPHt6L*L(ieFMUq$hg5j{?P|`4Gik~d`*CRXH%j%hE#bdW0;7p}pSk4F(g$tngM*ef zmn^UT_^FB#A1U>>t9O*t@#Ze9)BQx!_Ajpd<(05Ezs~rVUHJ=Q8v5g3TXoL=yLeHw z^I!k6GHIN+ zw)?(#YFX)f=*qL$=K9+sgay0P$?hT;6}E@Dy}upUP&%;jYf?eIo+L=xWEeX7J4dYa z#hOQ}+Kr;AD?Dz*;4$VvuxXIEQmW%-5Gp6@D&a6IY{+Pm zoacG$Vu&xI4a(#RMO`6mqZH6|RVRgcIVwqpb)t6A?k5>QT)0^5{;oRaV)xnRL^X}c zvZ@GlB0#}gpjRAEg8ZIe?EcYA1G~ui>Gjy{W*Z&}VLy6-=u)+L!IO&aACu!ieCEOQ zy7e@$rP{dQ2s|RrY%iF2NrN{u&QWUvgW~xx#(Ajs)<&aAoE}7k=!nuQEezw9$iitI1ifZg_g2%@bI3 z32QfI$iTESmP75PXy|Ek!ahORr-zH)*I4ZSV^esd4SPS#bCT}1AceKrM$V#I?R5Jv z^;E8(Cx4n2*Mvy3fhL@z(#xEnbq!Het52lD1~y_dJDSzkz{a*FlM(v7D)fWVs3!i$ zGf_}DB_iudv(8D4(QJWhJt!@9#h_@;Wk5N=ELHQ3nM?}XfQq@-KhAk{lSSGGRKq)8 zCNV~Npy??3-Ron3z&wf1*R~8cAk!0j?bRXp=a#hs-sD`QUIY=)E#=zR z>4lmGdZ)oXH(u6CLuaDi8D>g0cxF)UjOETiBXpSeVAe+n2>X?51@9%{(~Hm3qVIsR zST^6W<+vMT%iPn6mixF3Pqgo{1RQx~M#|9NDVSmR&tWieg^f_AEp}h8(+ss->SaG) zf~2o#h!-1xk+e2tnV|AGr0*Y>2WV8}zyspzKUU)1H)yH<1X156`?h$#@hsGj5*elQ zdWthq;ju&|6>*TkxuD4)<;JgLvBP0#v-fWb%9CwQI(mAKa@{u~+I<6<7P~)cVmH%z z54WN6@-2-eBKC;%^aihZJ`aX1#48|9er%TkI4*JbZZdu48*2 zdi=q|j~u-Bfy3BfMI1#qYAh^#NHjsuW;5nZi@n7OPOf}`GhgeQ@mlQuAmj5Tep3nj zC^IHCkYfdmQQ@HBpn<*t@nq}u_?jz>h*5%t4aOX30pS&~BEF2Mq15giRIPIWoI<(oL*8(_$;4_Ze39$w5v)+uGb% z9|g!1KK92Pa*L+K#rA@M?QUmX{PN^*gmrNi#_E263! zbh}>zfJcePbG?(w6V&dV^sZwDf+;YD=!L@?J$9JS-09DU`4{pvnQ7kISc;*s<>J{w zA4mM3BnLj(EWma;^J0%t=D3l+5eB9fdn;Eo;4OOo-~~hq2;gtAF&BPP`Uv?CFHOii z5DZrO+e6%#af>l}OATxPmc;jR4p>o;%p6DmmYf`p=g-1%c%qv&MEdEYF1%x#;sr zQ@E$T<$@hcTC3?3x7}DaQCcKJT)AP<5z7h5fWLkxd(*4fG+TdXV=i-z4E~Hn--E!q z2Cf*L=S4}f*xoLflPKddLj%bldFVhbcpo4_CM&_vTSF{nuhIKaXv)gkGSOI{MQY&B z)nwHTXAd4$=3D+b;F?bvoph_Q+>HkxRn z&QEszJK1*6%hzb!3_gR1-jp*pp%Gk4pgoXY%Os&jBN5=&T+@s`4=&x_ZdoO-q@*4$ zdK2wWvcH7iAj~9{>)u|8Sl=y}L@x-w^CLzKFX)`Ec|mV;jmqBUnqT5gm#m;S2j8dS z=J=bd6E~O4kR+Bj3&&>L?7lm-h2J-wxY zJk`OQX*0df)!+X^qJ^jj46qFBdVQthpcChR3zsv*FmF(5fnt5Hi83dt*|g<^qgQr^UmquzDx3|L3DNy!WoHsGVD*~W=!CE5S!$hi&|0LJfjNlqF7tI zP)5LNyZ3PWCW#rF4h82%;DFFtu88ge6;%h&>ycDM7Mu7QubX)-HRdwV#6g){|C5%{ zzOQO*z>|Xij<)gajQ^Ouhsl9{qZE1ZVTJCDxM=sDWWlq9yY0q$lpaLm`E||pjoA%) zz%^!5x#~TKADQY??7I3!o<&Ur&|JVA^`kmPfkh=BVH|+A)Yx!ABdlSE=(Vo?so2L@ zUe3ONW1I1HYojgSV1tKGASiqWXUSlOXr-{kRIBS}=#*Kzw9@XMrfrERU7-}zj^dEP zAE-!c=DAu-MC}gM#@&uq*ggr!tk}Zpl$KCYF7@5Wx* zg;{l84>QzLNgvp-rl9njz>o{2e+X^@ZFOGp@x37Or$BxG8>AV0)R$_6)E+KQ#mBsFw=A(w#5?s*hlrIwLgP(9gNP+17)bS;UIy^N*-(VT3v z?+z0psnuA=hWUcY>^RFUr}^w)r$ThnvN(v(*>QnI9Clt@q)kccY`gRONX%^0G141- z_P(~s9YB_~3~{~ApD(rI(P#`i3Zc z=?m@NR=OhAMB`EjK)mO=+oaf-<#guy#v+R-F;xPeMP(fr|te(_uKv%T+#x% zY$deD?zWm8bhmM(!6Th*N$>C>=lruzm^ z!sok@LJsY>JO8wmv>zuoo$oF7{utCKVRc^7{@ednP}ZNY)DWwFAa^n22bSplNxT1T z!q7aQZ;2ZH^Nh9sa!tlBLns)KAfV0*Nj8zm9n!{hv()%5LP}=RUkG`<7wQq7&k>$) z2C=pK--lFUj+twxS*a6wvG;V5I_ClhT9vuWC?wuvW_*ZIt*fz;BbI^+1mK{T@6lm0 ziL%zXDqDcbj0PyerSHXBVd=ftJ|Wf)BVq&`Z#UN6W?v+6mm!!I z>@x|CA+HZ_Y5)trOPCrd-Nm;s#cNRPT6>Y$pgGm$ z-owkvzRM_xEU={zPq-q-Y17h_g3=P7ewxC|ZwY0~*b+iJwO)e%!w7y50!;4*ngT<& zY4=`9wizd%y&os-{TSMWrE^8`$5hqP8Mx!rl?%0Uh+zWzN6Bl4!FepV`P_%@`8$g* zt^YtUdTgA)@E1z!`PG8nU$oMgP`9q-m2DG}nY8TE>~dp+tg^2f z#771Cpy`NqoKWBFg|eH{GnPZ+m!cqL(Ct72!jrPL_K|3ucd+%Y>y|ygSI2wD>-0k$ zm$<36*RG-8lzBq@3CSmOQW)r+q6!E~Wdu}Urkvu*2~{2FUlp5@2igdRrl%&32nRo4 z*TUw+*S)N<&_H=|Of$8eN;A&N6xm+&y-LNk^CKZ2F3O`C|W?psYrOnsJI)L~7EwcHV3))M7TGy~UeM zrQ4*d@(md+`=9AJPDcfhfbwlsY*cm5G$-*f3D{MCM`>n%Y~HVHXAc9MvV;OpyZaT{ zLJ~u311t~ABxaj3bzFOaVr$b8Q=klY>077`_&Jlq)`jC#b$;}X(QkS8j;Vn?*cfxP;yEd>k2ZATQk-;jkhkE z0D-b=~1bCkHl)Uz9tq~W4+ffUnTRz>hzkFP%@H8d#}aXdbNS)g6b;#2R6(_BQ@FX%`B$8 z`?W5d%DF#EhIhfJWp)VEMEQ*4JnJngS#JYoZ=3U<%*1brkU0-Gu$ni;qJ^83iTXR* zjg46r1vvh(pU6{}uWf9Y^j~m}-WdrZ&OLdDVT>zd__sSTsLwqPDwW8Y={gq5KP5Fm zVG8J-;T>7Pp=J)nnB`H;nSwFPn1KB-QFwZ%M^5fP;LaD-=!v>C0al-@Ewn*w;`}r= zxhaP|=^iihgS*EmMhfX%prdJ5Ea&JKnZrY1k+@r}>GeF`St}46MVC6m0Dc-H8wtE? zY8Kk|yamFQ5&nq3*i&}RaeI^P>3vu&7UnVP%(K0)%b*iA*#CA-ri!#Gy z#fof=5@!^!TA)<#5jCG52D9T*0B!VNr3IE1$4()u9T7_PmLJwTm0CueFi1IT8niv# zFS;_T3H8~AdV8GDFkkWpzhMb8u(L5=fUN03Wmf)q8JHDgWXc@jkBvy)lOzDwapBt? z1#f=~%qtZ9(I*SZnS2@>jG}`kMtK+4%b4n+tw%O=U1L5{DBdN&2VVX(uFS%)J`*U6 zD{faKrc3KtPEp-H7FFC1LIDW@5MVCZ!L{^Ka9mwGuJ^( zJ{z?yXW(`cNE!huxoB-w;VU)S4pbr=Tg#JvLv@1nZ)sc!F0iA?A#%jo4=tZn^#J6T z=_^b(!J|)00{OrCip-)0C@fLiYV>6*KnJF6W(ZpiU#(}Yy%qMPI)GU`G0^3FX|4T9 z9-COU4+oi$8>m*weH*Axz(4}m+()6Im(y%Mj3hu**?wNP_gE_usyN$yKwi1CMJi&ewa)AGb0{ z!=xnqBnUsR6s@?8e%RIH`#p_?yp*Rs&vS3E2M6p|8l%>ft44c@-cxX4rcRKzrn%}w z@E#)h7dZW$det0YV~mgZvTpFgV(!1f-;gf&kS&RT%IBuyD^e3o?ZjgL04LG;51{+6 z)e1+ue~`(Wt&jsFgt}vn(`q~o_;qRSdPPkrS`OJTAHtMN`G73B2CpYsgHzDKlN%ZhwJbgnvogilsijFccDgS11Mb;EncMk8FhS{aw=W(r z{q0x5aZty|rz}JN%{=TT;T;WNaZiu)HFp5`l2X9-fx|Ede<*jDQ8Yn584KnRl^95P z`Y@1AN5gUNP>hQDDx?THM|8}GbW#E$bZO7*f*VnX8;sU58LWfgWhycX4lqM zl6F9jLohG|cMVmwe@nZ6ix|Ls#5cvStPi9~4iPKaaQ~J8rJW7CqFj1Fj&V|cHn|7H zCM%EW`owBuR{DxfQ`u@%8-i>0&IVIJEBjV`5_OtsA=&+OGN!-x9J1`Bav|SsN4kjl zhrIibBPc@9bXC9VoSeegO9F;3u#D47xjn&8dp>^eoyQ(Jdf)XQKK96AKC2LXrZrK` zt{uJakzB-yW`&X-~0X@@44Z|``>^6;rn*o@VZ1{jIZmzxzLa>z{1KMWfpD zf&F_PId=TsV^8e==+Vdamm%)}kU=EIzyH|1|H1w{4nJ`C;G>7fbFM#r=-%oJ|I;+B z<-h;P@M?*TzmJcU%ba__?w$u8SUY(1q3Xd$?*r9`uRrtvKc33J|L3}D^_B?z;_+_- z19)fB?dGcLjQ5_tUpp_6Zn=-~|7X5GT?K*F6*o`4m(ZuGJGm12DeilE_j6x-9N8a; zy|wxXVgG$|`p^DvKEp+5ivRqV?+-gl(mU(_VJY<4ro5Q(8*z{D_REPwNH5>l z^?Yb2es-4olULJ*UqJj~)E1iKd^S$VzsQFc9oxletJSm2_%TMZ8oBw~-G0p6Tb?`l zK|KF`BH;6Diniq}2w%aGF@HMf&2Tb=^Mirk{E3o7;LsmO8IJVL+HgL_>v-J@v3ntI rZ;U$mGr@i|&=0gbzQ3$q4E(Rt! diff --git a/NzbDrone.Core.Test/Framework/MockLib.cs b/NzbDrone.Core.Test/Framework/MockLib.cs index b0585ea21..7c97b627f 100644 --- a/NzbDrone.Core.Test/Framework/MockLib.cs +++ b/NzbDrone.Core.Test/Framework/MockLib.cs @@ -37,32 +37,6 @@ namespace NzbDrone.Core.Test.Framework } - public static IRepository GetEmptyRepository(bool enableLogging = false, string fileName = "") - { - Console.WriteLine("Creating an empty Subsonic repository"); - - if (String.IsNullOrWhiteSpace(fileName)) - { - fileName = Guid.NewGuid() + ".db"; - } - - - var provider = Connection.GetDataProvider(Connection.GetConnectionString(fileName)); - var repo = Connection.CreateSimpleRepository(provider); - ForceMigration(repo); - - //Migrations.Run(Connection.GetConnectionString(fileName), false); - - if (enableLogging) - { - provider.Log = new NlogWriter(); - } - Console.WriteLine("**********************************************************************************"); - Console.WriteLine("*****************************REPO IS READY****************************************"); - Console.WriteLine("**********************************************************************************"); - return repo; - } - public static IDatabase GetEmptyDatabase(bool enableLogging = false, string fileName = "") { Console.WriteLine("Creating an empty PetaPoco database"); @@ -71,9 +45,9 @@ namespace NzbDrone.Core.Test.Framework { fileName = Guid.NewGuid() + ".db"; } - + var connectionString = Connection.GetConnectionString(fileName); - + var database = Connection.GetPetaPocoDb(connectionString); return database; diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index a4b6667a5..13f90581c 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -116,7 +116,6 @@ - @@ -128,7 +127,6 @@ - diff --git a/NzbDrone.Core.Test/RepoTest.cs b/NzbDrone.Core.Test/RepoTest.cs deleted file mode 100644 index 81031f6d1..000000000 --- a/NzbDrone.Core.Test/RepoTest.cs +++ /dev/null @@ -1,109 +0,0 @@ -// ReSharper disable RedundantUsingDirective -using System; -using System.Linq; -using FizzWare.NBuilder; -using FluentAssertions; -using NLog; -using NLog.Config; -using NUnit.Framework; -using NzbDrone.Core.Instrumentation; -using NzbDrone.Core.Repository; -using NzbDrone.Core.Test.Framework; -using LogLevel = NLog.LogLevel; - -namespace NzbDrone.Core.Test -{ - [TestFixture] - // ReSharper disable InconsistentNaming - public class RepoTest : TestBase - { - [Test] - public void to_many__series_to_episode() - { - //Arrange - var fakeSeries = Builder.CreateNew().With(s => s.SeriesId = 69).Build(); - var fakeEpisode = Builder.CreateNew().With(c => c.SeriesId = 69).Build(); - - //Act - var repo = MockLib.GetEmptyRepository(true); - repo.Add(fakeSeries); - repo.Add(fakeEpisode); - var fetchedSeries = repo.Single(fakeSeries.SeriesId); - - //Assert - Assert.AreEqual(fakeSeries.SeriesId, fetchedSeries.SeriesId); - Assert.AreEqual(fakeSeries.Title, fetchedSeries.Title); - - - fetchedSeries.Episodes.Should().HaveCount(1); - Assert.AreEqual(fetchedSeries.Episodes[0].EpisodeId, fakeEpisode.EpisodeId); - Assert.AreEqual(fetchedSeries.Episodes[0].SeriesId, fakeEpisode.SeriesId); - Assert.AreEqual(fetchedSeries.Episodes[0].Title, fakeEpisode.Title); - } - - [Test] - public void query_scratch_pad() - { - - var repo = MockLib.GetEmptyRepository(true); - - repo.All().Where(e => !e.Ignored && e.AirDate <= DateTime.Today && e.AirDate.Year > 1900).Select( - s => s.Title).ToList(); - } - - - [Test] - [Ignore] - public void episode_proxy_to_string() - { - var episode = Builder.CreateNew() - .Build(); - var series = Builder.CreateNew() - .With(s => s.SeriesId = episode.SeriesId) - .Build(); - - var repo = MockLib.GetEmptyRepository(true); - repo.Add(episode); - repo.Add(series); - - //Act - - var result = repo.Single(episode.EpisodeId).ToString(); - - //Assert - Console.WriteLine(result); - result.Should().Contain(series.Title); - result.Should().Contain(episode.EpisodeNumber.ToString()); - result.Should().Contain(episode.SeasonNumber.ToString()); - } - - - [Test] - [Description( - "This test confirms that the tvdb id stored in the db is preserved rather than being replaced by an auto incrementing value" - )] - public void tvdbid_is_preserved() - { - //Arrange - var sonicRepo = MockLib.GetEmptyRepository(true); - var series = Builder.CreateNew().With(c => c.SeriesId = 18).Build(); - - //Act - var addId = sonicRepo.Add(series); - - //Assert - Assert.AreEqual(18, addId); - var allSeries = sonicRepo.All(); - allSeries.Should().HaveCount(1); - Assert.AreEqual(18, allSeries.First().SeriesId); - } - - [Test] - public void enteties_toString() - { - Console.WriteLine(new Episode().ToString()); - Console.WriteLine(new Series().ToString()); - Console.WriteLine(new EpisodeFile().ToString()); - } - } -} \ No newline at end of file diff --git a/NzbDrone.Core.Test/RepositoryProviderTest.cs b/NzbDrone.Core.Test/RepositoryProviderTest.cs deleted file mode 100644 index 2d856576a..000000000 --- a/NzbDrone.Core.Test/RepositoryProviderTest.cs +++ /dev/null @@ -1,175 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Text; -using FluentAssertions; -using Migrator.Framework; -using Migrator.Providers.SQLite; -using NUnit.Framework; -using NzbDrone.Core.Datastore; -using NzbDrone.Core.Instrumentation; -using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; -using NzbDrone.Core.Test.Framework; -using SubSonic.DataProviders; -using SubSonic.Repository; -using SubSonic.Schema; -using SubSonic.SqlGeneration.Schema; - -namespace NzbDrone.Core.Test -{ - [TestFixture] - // ReSharper disable InconsistentNaming - public class RepositoryProviderTest : TestBase - { - [Test] - public void Get_Assembly_repos() - { - var provider = new RepositoryProvider(); - var types = provider.GetRepositoryTypes(); - - types.Should().Contain(typeof(Config)); - types.Should().Contain(typeof(Episode)); - types.Should().Contain(typeof(EpisodeFile)); - types.Should().Contain(typeof(ExternalNotificationSetting)); - types.Should().Contain(typeof(History)); - types.Should().Contain(typeof(IndexerSetting)); - types.Should().Contain(typeof(JobSetting)); - types.Should().Contain(typeof(RootDir)); - types.Should().Contain(typeof(Series)); - types.Should().Contain(typeof(QualityProfile)); - - types.Should().NotContain(typeof(QualityTypes)); - - - } - - - - - - [Test] - public void Get_table_columns() - { - var provider = new RepositoryProvider(); - var typeTable = provider.GetSchemaFromType(typeof(TestRepoType)); - - Assert.IsNotNull(typeTable.Columns); - - typeTable.Columns.Should().HaveCount(3); - Assert.AreEqual("TestRepoTypes", typeTable.Name); - } - - [Test] - public void ConvertToMigratorColumn() - { - var provider = new RepositoryProvider(); - - var subsonicColumn = new DatabaseColumn - { - Name = "Name", - DataType = DbType.Boolean, - IsPrimaryKey = true, - IsNullable = true - }; - - var migColumn = provider.ConvertToMigratorColumn(subsonicColumn); - - Assert.IsTrue(migColumn.IsPrimaryKey); - Assert.AreEqual(ColumnProperty.Null | ColumnProperty.PrimaryKey, migColumn.ColumnProperty); - } - - - [Test] - public void GetDbColumns() - { - string connectionString = "Data Source=" + Guid.NewGuid() + ".db;Version=3;New=True"; - var dbProvider = ProviderFactory.GetProvider(connectionString, "System.Data.SQLite"); - var repo = new SimpleRepository(dbProvider, SimpleRepositoryOptions.RunMigrations); - var sqliteDatabase = new SQLiteTransformationProvider(new SQLiteDialect(), connectionString); - - repo.Add(new TestRepoType() { Value = "Dummy" }); - - var repositoryProvider = new RepositoryProvider(); - var columns = repositoryProvider.GetColumnsFromDatabase(sqliteDatabase, "TestRepoTypes"); - - columns.Should().HaveCount(3); - - } - - - [Test] - public void DeleteColumns() - { - string connectionString = "Data Source=" + Guid.NewGuid() + ".db;Version=3;New=True"; - var dbProvider = ProviderFactory.GetProvider(connectionString, "System.Data.SQLite"); - var sqliteDatabase = new SQLiteTransformationProvider(new SQLiteDialect(), connectionString); - var repo = new SimpleRepository(dbProvider, SimpleRepositoryOptions.RunMigrations); - - repo.Add(new TestRepoType() { Value = "Dummy" }); - - var repositoryProvider = new RepositoryProvider(); - var typeSchema = repositoryProvider.GetSchemaFromType(typeof(TestRepoType2)); - var columns = repositoryProvider.GetColumnsFromDatabase(sqliteDatabase, "TestRepoTypes"); - - - var deletedColumns = repositoryProvider.GetDeletedColumns(typeSchema, columns); - - - deletedColumns.Should().HaveCount(1); - Assert.AreEqual("NewName", deletedColumns[0].Name.Trim('[', ']')); - } - - - [Test] - public void NewColumns() - { - string connectionString = "Data Source=" + Guid.NewGuid() + ".db;Version=3;New=True"; - var dbProvider = ProviderFactory.GetProvider(connectionString, "System.Data.SQLite"); - var repo = new SimpleRepository(dbProvider, SimpleRepositoryOptions.RunMigrations); - var sqliteDatabase = new SQLiteTransformationProvider(new SQLiteDialect(), connectionString); - - repo.Add(new TestRepoType2() { Value = "dummy" }); - - var repositoryProvider = new RepositoryProvider(); - var typeSchema = repositoryProvider.GetSchemaFromType(typeof(TestRepoType)); - var columns = repositoryProvider.GetColumnsFromDatabase(sqliteDatabase, "TestRepoType2s"); - - - var deletedColumns = repositoryProvider.GetNewColumns(typeSchema, columns); - - - deletedColumns.Should().HaveCount(1); - Assert.AreEqual("NewName", deletedColumns[0].Name.Trim('[', ']')); - } - - } - - - public class TestRepoType - { - [SubSonicPrimaryKey] - public int TestId { get; set; } - - [SubSonicColumnNameOverride("NewName")] - public Boolean BaddBoolean { get; set; } - - - public string Value { get; set; } - - [SubSonicIgnore] - public Boolean BaddBooleanIgnored { get; set; } - } - - - public class TestRepoType2 - { - [SubSonicPrimaryKey] - public int TestId { get; set; } - - public string Value { get; set; } - - [SubSonicIgnore] - public Boolean BaddBooleanIgnored { get; set; } - } -} diff --git a/NzbDrone.Core.Test/SeriesProviderTest.cs b/NzbDrone.Core.Test/SeriesProviderTest.cs index ac867fa770d4d44bd24478ac40da106d5b8affd8..90a52b176222d9de2d84645df377179ed5e794d6 100644 GIT binary patch delta 25 hcmaE2{MdMdJJ00v90HpodAb-U=L=MCj^%6T1^|gu35x&# delta 58 zcmaEC{KR;JI}cY-YC(Q+W=Vcg~{nH^J7CZ89O+8o2z G&J6&H!W6Fn diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index 1117c8c0a..c6c3b125c 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -22,7 +22,7 @@ namespace NzbDrone.Core.Test private readonly List seriesIds = new List { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; private readonly List episodes = new List(); private readonly List files = new List(); - private readonly IRepository repo = MockLib.GetEmptyRepository(); + [TestFixtureSetUp] public new void Setup() @@ -40,7 +40,7 @@ namespace NzbDrone.Core.Test .With(s => s.Monitored = true) .Build(); - repo.Add(series); + //repo.Add(series); foreach (var _seasonNumber in seasonsNumbers) { @@ -83,8 +83,8 @@ namespace NzbDrone.Core.Test } - repo.AddMany(episodes); - repo.AddMany(files); + //repo.AddMany(episodes); + //repo.AddMany(files); } @@ -140,7 +140,7 @@ namespace NzbDrone.Core.Test public void get_episode_file_count_x100() { var mocker = new AutoMoq.AutoMoqer(); - mocker.SetConstant(repo); + //mocker.SetConstant(repo); mocker.SetConstant(mocker.Resolve()); var mediaProvider = mocker.Resolve(); @@ -168,7 +168,7 @@ namespace NzbDrone.Core.Test public void get_season_count_x5000() { var mocker = new AutoMoq.AutoMoqer(); - mocker.SetConstant(repo); + //mocker.SetConstant(repo); var provider = mocker.Resolve(); @@ -195,7 +195,7 @@ namespace NzbDrone.Core.Test public void get_episode_file_count_x10() { var mocker = new AutoMoq.AutoMoqer(); - mocker.SetConstant(repo); + //mocker.SetConstant(repo); mocker.SetConstant(mocker.Resolve()); var provider = mocker.Resolve(); diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index e3cc1d12c..e2fa914a7 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -1,7 +1,7 @@ using System; -using System.Linq; using System.Diagnostics; using System.IO; +using System.Linq; using System.Web.Hosting; using Ninject; using NLog; @@ -12,7 +12,6 @@ using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Providers.Jobs; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core { @@ -71,8 +70,6 @@ namespace NzbDrone.Core _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString)).InRequestScope(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InRequestScope(); - - _kernel.Bind().ToConstant(Connection.CreateSimpleRepository(Connection.MainConnectionString)).InSingletonScope(); } } diff --git a/NzbDrone.Core/Datastore/Connection.cs b/NzbDrone.Core/Datastore/Connection.cs index e6ecd8a1c..2ca526003 100644 --- a/NzbDrone.Core/Datastore/Connection.cs +++ b/NzbDrone.Core/Datastore/Connection.cs @@ -1,13 +1,9 @@ using System; using System.Data; -using System.Data.Common; using System.Data.SQLite; using System.IO; using MvcMiniProfiler.Data; using PetaPoco; -using SubSonic.DataProviders; -using SubSonic.DataProviders.SQLite; -using SubSonic.Repository; namespace NzbDrone.Core.Datastore { @@ -42,21 +38,7 @@ namespace NzbDrone.Core.Datastore } } - public static IDataProvider GetDataProvider(string connectionString) - { - return new ProfiledSQLiteProvider(connectionString, "System.Data.SQLite"); - } - - public static IRepository CreateSimpleRepository(IDataProvider dataProvider) - { - return new SimpleRepository(dataProvider, SimpleRepositoryOptions.RunMigrations); - } - - public static IRepository CreateSimpleRepository(string connectionString) - { - return new SimpleRepository(GetDataProvider(connectionString), SimpleRepositoryOptions.RunMigrations); - } - + public static IDatabase GetPetaPocoDb(string connectionString) { MigrationsHelper.Run(connectionString, true); @@ -73,20 +55,4 @@ namespace NzbDrone.Core.Datastore } } - - - public class ProfiledSQLiteProvider : SQLiteProvider - { - public ProfiledSQLiteProvider(string connectionString, string providerName) - : base(connectionString, providerName) - { - - } - - public override System.Data.Common.DbConnection CreateConnection(string connectionString) - { - return ProfiledDbConnection.Get(base.CreateConnection(connectionString)); - - } - } } diff --git a/NzbDrone.Core/Datastore/Migrations/Migration.cs b/NzbDrone.Core/Datastore/Migrations/Migration.cs index 9006496da..0e70b03b6 100644 --- a/NzbDrone.Core/Datastore/Migrations/Migration.cs +++ b/NzbDrone.Core/Datastore/Migrations/Migration.cs @@ -4,33 +4,6 @@ using Migrator.Framework; namespace NzbDrone.Core.Datastore.Migrations { - [Migration(20110523)] - public class Migration20110523 : Migration - { - public override void Up() - { - Database.RemoveTable(RepositoryProvider.JobsSchema.Name); - } - - public override void Down() - { - throw new NotImplementedException(); - } - } - - [Migration(20110603)] - public class Migration20110603 : Migration - { - public override void Up() - { - Database.RemoveTable("Seasons"); - } - - public override void Down() - { - throw new NotImplementedException(); - } - } [Migration(20110604)] public class Migration20110616 : Migration @@ -40,13 +13,13 @@ namespace NzbDrone.Core.Datastore.Migrations Database.AddTable("Series", new[] { new Column("SeriesId", DbType.Int32, ColumnProperty.PrimaryKey), - new Column("Title", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("CleanTitle", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Title", DbType.String, ColumnProperty.Null), + new Column("CleanTitle", DbType.String, ColumnProperty.Null), new Column("Status", DbType.String, ColumnProperty.Null), - new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("Overview", DbType.String, ColumnProperty.Null), new Column("AirsDayOfWeek", DbType.Int16, ColumnProperty.Null), - new Column("AirTimes", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("Language", DbType.String, ColumnProperty.NotNull, String.Empty), + new Column("AirTimes", DbType.String, ColumnProperty.Null), + new Column("Language", DbType.String, ColumnProperty.Null), new Column("Path", DbType.String, ColumnProperty.NotNull), new Column("Monitored", DbType.Boolean, ColumnProperty.NotNull), new Column("QualityProfileId", DbType.Int16, ColumnProperty.NotNull), @@ -62,9 +35,9 @@ namespace NzbDrone.Core.Datastore.Migrations new Column("SeriesId", DbType.Int32, ColumnProperty.NotNull), new Column("SeasonNumber", DbType.Int16, ColumnProperty.NotNull), new Column("EpisodeNumber", DbType.Int16, ColumnProperty.NotNull), - new Column("Title", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("Overview", DbType.String, ColumnProperty.NotNull, String.Empty), - new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull, false), + new Column("Title", DbType.String, ColumnProperty.Null), + new Column("Overview", DbType.String, ColumnProperty.Null), + new Column("Ignored", DbType.Boolean, ColumnProperty.NotNull), new Column("EpisodeFileId", DbType.Int32, ColumnProperty.Null), new Column("AirDate", DbType.DateTime, ColumnProperty.Null), new Column("GrabDate", DbType.DateTime, ColumnProperty.Null) diff --git a/NzbDrone.Core/Datastore/MigrationsHelper.cs b/NzbDrone.Core/Datastore/MigrationsHelper.cs index a4f8ced30..644b473e8 100644 --- a/NzbDrone.Core/Datastore/MigrationsHelper.cs +++ b/NzbDrone.Core/Datastore/MigrationsHelper.cs @@ -1,16 +1,6 @@ using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; using System.Reflection; -using System.Text; -using Migrator.Framework; using NLog; -using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; -using SubSonic.Extensions; -using SubSonic.Repository; -using SubSonic.Schema; namespace NzbDrone.Core.Datastore { @@ -52,63 +42,6 @@ namespace NzbDrone.Core.Datastore } } - public static void ForceSubSonicMigration(IRepository repository) - { - repository.Single(1); - repository.Single(1); - repository.Single(1); - } - - - public static void RemoveDeletedColumns(ITransformationProvider transformationProvider) - { - var provider = new RepositoryProvider(); - var repoTypes = provider.GetRepositoryTypes(); - - foreach (var repoType in repoTypes) - { - var typeSchema = provider.GetSchemaFromType(repoType); - - if (transformationProvider.TableExists(typeSchema.Name)) - { - var dbColumns = provider.GetColumnsFromDatabase(transformationProvider, typeSchema.Name); - - var deletedColumns = provider.GetDeletedColumns(typeSchema, dbColumns); - - foreach (var deletedColumn in deletedColumns) - { - Logger.Info("Removing column '{0}' from '{1}'", deletedColumn.Name, repoType.Name); - transformationProvider.RemoveColumn(typeSchema.Name, deletedColumn.Name); - } - } - } - - } - - public static void AddNewColumns(ITransformationProvider transformationProvider) - { - var provider = new RepositoryProvider(); - var repoTypes = provider.GetRepositoryTypes(); - - foreach (var repoType in repoTypes) - { - var typeSchema = provider.GetSchemaFromType(repoType); - if (transformationProvider.TableExists(typeSchema.Name)) - { - var dbColumns = provider.GetColumnsFromDatabase(transformationProvider, typeSchema.Name); - - var newColumns = provider.GetNewColumns(typeSchema, dbColumns); - - foreach (var newColumn in newColumns) - { - Logger.Info("Adding column '{0}' to '{1}'", newColumn.Name, repoType.Name); - transformationProvider.AddColumn(typeSchema.Name, newColumn); - } - } - - } - - } } diff --git a/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs b/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs index 415faaa9c..0d040ef12 100644 --- a/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs +++ b/NzbDrone.Core/Datastore/PetaPoco/PetaPoco.cs @@ -13,16 +13,17 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Configuration; -using System.Data.Common; using System.Data; -using System.Text.RegularExpressions; +using System.Data.Common; +using System.Diagnostics; +using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; -using System.Linq.Expressions; - +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; namespace PetaPoco { @@ -485,12 +486,12 @@ namespace PetaPoco } // Expand collections to parameter lists - if ((arg_val as System.Collections.IEnumerable) != null && + if ((arg_val as IEnumerable) != null && (arg_val as string) == null && (arg_val as byte[]) == null) { var sb = new StringBuilder(); - foreach (var i in arg_val as System.Collections.IEnumerable) + foreach (var i in arg_val as IEnumerable) { sb.Append((sb.Length == 0 ? "@" : ",@") + args_dest.Count.ToString()); args_dest.Add(i); @@ -510,9 +511,9 @@ namespace PetaPoco void AddParam(IDbCommand cmd, object item, string ParameterPrefix) { // Convert value to from poco type to db type - if (Database.Mapper != null && item != null) + if (Mapper != null && item != null) { - var fn = Database.Mapper.GetToDbConverter(item.GetType()); + var fn = Mapper.GetToDbConverter(item.GetType()); if (fn != null) item = fn(item); } @@ -625,8 +626,8 @@ namespace PetaPoco // Override this to log/capture exceptions public virtual void OnException(Exception x) { - System.Diagnostics.Debug.WriteLine(x.ToString()); - System.Diagnostics.Debug.WriteLine(LastCommand); + Debug.WriteLine(x.ToString()); + Debug.WriteLine(LastCommand); } // Override this to log commands, or modify command before execution @@ -1120,7 +1121,7 @@ namespace PetaPoco // Various cached stuff static Dictionary MultiPocoFactories = new Dictionary(); static Dictionary AutoMappers = new Dictionary(); - static System.Threading.ReaderWriterLockSlim RWLock = new System.Threading.ReaderWriterLockSlim(); + static ReaderWriterLockSlim RWLock = new ReaderWriterLockSlim(); // Get (or create) the multi-poco factory for a query Func GetMultiPocoFactory(Type[] types, string sql, IDataReader r) @@ -1954,7 +1955,7 @@ namespace PetaPoco #endif return ForType(t); } - static System.Threading.ReaderWriterLockSlim RWLock = new System.Threading.ReaderWriterLockSlim(); + static ReaderWriterLockSlim RWLock = new ReaderWriterLockSlim(); public static PocoData ForType(Type t) { #if !PETAPOCO_NO_DYNAMIC @@ -2018,8 +2019,8 @@ namespace PetaPoco TableInfo.AutoIncrement = TableInfo.AutoIncrement ? !TableInfo.PrimaryKey.Contains(',') : TableInfo.AutoIncrement; // Call column mapper - if (Database.Mapper != null) - Database.Mapper.GetTableInfo(t, TableInfo); + if (Mapper != null) + Mapper.GetTableInfo(t, TableInfo); // Work out bound properties bool ExplicitColumns = t.GetCustomAttributes(typeof(ExplicitColumnsAttribute), true).Length > 0; @@ -2055,7 +2056,7 @@ namespace PetaPoco if (pc.ColumnName == null) { pc.ColumnName = pi.Name; - if (Database.Mapper != null && !Database.Mapper.MapPropertyToColumn(pi, ref pc.ColumnName, ref pc.ResultColumn)) + if (Mapper != null && !Mapper.MapPropertyToColumn(pi, ref pc.ColumnName, ref pc.ResultColumn)) continue; } @@ -2307,12 +2308,12 @@ namespace PetaPoco Func converter = null; // Get converter from the mapper - if (Database.Mapper != null) + if (Mapper != null) { DestinationInfo destinationInfo = pc != null ? new DestinationInfo(pc.PropertyInfo) : new DestinationInfo(dstType); - converter = Database.Mapper.GetFromDbConverter(destinationInfo, srcType); + converter = Mapper.GetFromDbConverter(destinationInfo, srcType); } // Standard DateTime->Utc mapper diff --git a/NzbDrone.Core/Datastore/RepositoryProvider.cs b/NzbDrone.Core/Datastore/RepositoryProvider.cs deleted file mode 100644 index 040fa9ac0..000000000 --- a/NzbDrone.Core/Datastore/RepositoryProvider.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Reflection; -using Migrator.Providers; -using Migrator.Providers.SQLite; -using NzbDrone.Core.Repository; -using SubSonic.DataProviders; -using SubSonic.Extensions; -using SubSonic.Schema; -using Migrator.Framework; - - -namespace NzbDrone.Core.Datastore -{ - public class RepositoryProvider - { - public static readonly ITable EpisodesSchema = new RepositoryProvider().GetSchemaFromType(typeof(Episode)); - public static readonly ITable SeriesSchema = new RepositoryProvider().GetSchemaFromType(typeof(Series)); - public static readonly ITable EpisodeFilesSchema = new RepositoryProvider().GetSchemaFromType(typeof(EpisodeFile)); - public static readonly ITable JobsSchema = new RepositoryProvider().GetSchemaFromType(typeof(JobSetting)); - - - public virtual IList GetRepositoryTypes() - { - var coreAssembly = Assembly.GetExecutingAssembly(); - var repoTypes = coreAssembly.GetTypes().Where(t => !String.IsNullOrWhiteSpace(t.Namespace) && t.Namespace.StartsWith("NzbDrone.Core.Repository")); - - repoTypes = repoTypes.Where(r => !r.IsEnum); - return repoTypes.ToList(); - } - - public virtual ITable GetSchemaFromType(Type type) - { - return type.ToSchemaTable(Connection.GetDataProvider(Connection.MainConnectionString)); - } - - public virtual Column[] GetColumnsFromDatabase(ITransformationProvider database, string tableName) - { - return database.GetColumns(tableName); - } - - - public virtual List GetDeletedColumns(ITable typeSchema, Column[] dbColumns) - { - var deleteColumns = new List(); - foreach (var dbColumn in dbColumns) - { - if (!typeSchema.Columns.ToList().Exists(c => c.Name == dbColumn.Name.Trim('[', ']'))) - { - deleteColumns.Add(dbColumn); - } - } - - return deleteColumns; - } - - - public virtual List GetNewColumns(ITable typeSchema, Column[] dbColumns) - { - var newColumns = new List(); - foreach (var typeColumn in typeSchema.Columns) - { - if (!dbColumns.ToList().Exists(c => c.Name.Trim('[', ']') == typeColumn.Name)) - { - newColumns.Add(ConvertToMigratorColumn(typeColumn)); - } - } - - return newColumns; - } - - public virtual Column ConvertToMigratorColumn(SubSonic.Schema.IColumn subsonicColumns) - { - var migColumn = new Column(subsonicColumns.Name, subsonicColumns.DataType); - - if (subsonicColumns.IsPrimaryKey) - { - migColumn.ColumnProperty = ColumnProperty.PrimaryKey; - } - - if (subsonicColumns.IsNullable) - { - migColumn.ColumnProperty = migColumn.ColumnProperty | ColumnProperty.Null; - } - else - { - migColumn.ColumnProperty = migColumn.ColumnProperty | ColumnProperty.NotNull; - migColumn.DefaultValue = false; - } - - return migColumn; - } - - - } -} diff --git a/NzbDrone.Core/Datastore/SqliteProvider.cs b/NzbDrone.Core/Datastore/SqliteProvider.cs index b4b2e278c..1fbe6cf9d 100644 --- a/NzbDrone.Core/Datastore/SqliteProvider.cs +++ b/NzbDrone.Core/Datastore/SqliteProvider.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using Migrator.Framework; using Migrator.Providers.SQLite; diff --git a/NzbDrone.Core/Helpers/FileSizeFormatHelpercs.cs b/NzbDrone.Core/Helpers/FileSizeFormatHelpercs.cs index ccad15227..138c3227f 100644 --- a/NzbDrone.Core/Helpers/FileSizeFormatHelpercs.cs +++ b/NzbDrone.Core/Helpers/FileSizeFormatHelpercs.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; namespace NzbDrone.Core.Helpers { diff --git a/NzbDrone.Core/Instrumentation/Log.cs b/NzbDrone.Core/Instrumentation/Log.cs index c4dfc4b5b..4c06f791f 100644 --- a/NzbDrone.Core/Instrumentation/Log.cs +++ b/NzbDrone.Core/Instrumentation/Log.cs @@ -1,6 +1,5 @@ using System; using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Instrumentation { diff --git a/NzbDrone.Core/Instrumentation/LogConfiguration.cs b/NzbDrone.Core/Instrumentation/LogConfiguration.cs index 21b75225f..84ced7b24 100644 --- a/NzbDrone.Core/Instrumentation/LogConfiguration.cs +++ b/NzbDrone.Core/Instrumentation/LogConfiguration.cs @@ -1,7 +1,6 @@ using System.Diagnostics; using System.IO; using Ninject; -using Ninject.Activation; using NLog; using NLog.Config; diff --git a/NzbDrone.Core/Instrumentation/LogProvider.cs b/NzbDrone.Core/Instrumentation/LogProvider.cs index 1985c2aa5..e93bd1eae 100644 --- a/NzbDrone.Core/Instrumentation/LogProvider.cs +++ b/NzbDrone.Core/Instrumentation/LogProvider.cs @@ -1,8 +1,6 @@ using System.Collections.Generic; -using System.Linq; using NLog; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Instrumentation { diff --git a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs index 713878feb..261be609c 100644 --- a/NzbDrone.Core/Instrumentation/SubsonicTarget.cs +++ b/NzbDrone.Core/Instrumentation/SubsonicTarget.cs @@ -2,7 +2,6 @@ using NLog; using NLog.Targets; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Instrumentation { diff --git a/NzbDrone.Core/Model/ConnectionInfoModel.cs b/NzbDrone.Core/Model/ConnectionInfoModel.cs index d193ccc0d..f73ae174b 100644 --- a/NzbDrone.Core/Model/ConnectionInfoModel.cs +++ b/NzbDrone.Core/Model/ConnectionInfoModel.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NzbDrone.Core.Model +namespace NzbDrone.Core.Model { public class ConnectionInfoModel { diff --git a/NzbDrone.Core/Model/EpisodeParseResult.cs b/NzbDrone.Core/Model/EpisodeParseResult.cs index 280cb7f0b..de566a5e6 100644 --- a/NzbDrone.Core/Model/EpisodeParseResult.cs +++ b/NzbDrone.Core/Model/EpisodeParseResult.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; namespace NzbDrone.Core.Model { diff --git a/NzbDrone.Core/Model/ExternalNotificationType.cs b/NzbDrone.Core/Model/ExternalNotificationType.cs index 6e6de4a8c..41a3b5ad8 100644 --- a/NzbDrone.Core/Model/ExternalNotificationType.cs +++ b/NzbDrone.Core/Model/ExternalNotificationType.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NzbDrone.Core.Model +namespace NzbDrone.Core.Model { public enum ExternalNotificationType { diff --git a/NzbDrone.Core/Model/Quality.cs b/NzbDrone.Core/Model/Quality.cs index 35922bc37..95ea38efb 100644 --- a/NzbDrone.Core/Model/Quality.cs +++ b/NzbDrone.Core/Model/Quality.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using NzbDrone.Core.Repository.Quality; namespace NzbDrone.Core.Model @@ -22,19 +19,19 @@ namespace NzbDrone.Core.Model public int CompareTo(Quality other) { - if (other.QualityType > this.QualityType) + if (other.QualityType > QualityType) return -1; - if (other.QualityType < this.QualityType) + if (other.QualityType < QualityType) return 1; - if (other.QualityType == this.QualityType && other.Proper == this.Proper) + if (other.QualityType == QualityType && other.Proper == Proper) return 0; - if (this.Proper && !other.Proper) + if (Proper && !other.Proper) return 1; - if (!this.Proper && other.Proper) + if (!Proper && other.Proper) return -1; return 0; diff --git a/NzbDrone.Core/Model/SabnzbdInfoModel.cs b/NzbDrone.Core/Model/SabnzbdInfoModel.cs index a903e7626..4eba4f90a 100644 --- a/NzbDrone.Core/Model/SabnzbdInfoModel.cs +++ b/NzbDrone.Core/Model/SabnzbdInfoModel.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NzbDrone.Core.Model +namespace NzbDrone.Core.Model { public class SabnzbdInfoModel { diff --git a/NzbDrone.Core/Model/SeasonParseResult.cs b/NzbDrone.Core/Model/SeasonParseResult.cs index 3abc899c0..9422e35a6 100644 --- a/NzbDrone.Core/Model/SeasonParseResult.cs +++ b/NzbDrone.Core/Model/SeasonParseResult.cs @@ -1,6 +1,4 @@ -using NzbDrone.Core.Repository.Quality; - -namespace NzbDrone.Core.Model +namespace NzbDrone.Core.Model { public class SeasonParseResult { diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 7a891636b..34f5c2b9c 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -141,10 +141,6 @@ False ..\Libraries\NLog.dll - - False - ..\Libraries\SubSonic.Core.dll - @@ -172,7 +168,6 @@ - diff --git a/NzbDrone.Core/Providers/AutoConfigureProvider.cs b/NzbDrone.Core/Providers/AutoConfigureProvider.cs index 2075825b6..20abddecb 100644 --- a/NzbDrone.Core/Providers/AutoConfigureProvider.cs +++ b/NzbDrone.Core/Providers/AutoConfigureProvider.cs @@ -4,10 +4,8 @@ using System.IO; using System.Linq; using System.Net; using System.Net.NetworkInformation; -using System.Text; using System.Text.RegularExpressions; using NzbDrone.Core.Model; -using NzbDrone.Core.Providers.Core; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index 50fc4c8d7..6609b3ab1 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -1,12 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; using Ninject; using NLog; using NzbDrone.Core.Model; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Core { diff --git a/NzbDrone.Core/Providers/Core/DiskProvider.cs b/NzbDrone.Core/Providers/Core/DiskProvider.cs index 5ce87f840..bb3c191dd 100644 --- a/NzbDrone.Core/Providers/Core/DiskProvider.cs +++ b/NzbDrone.Core/Providers/Core/DiskProvider.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; namespace NzbDrone.Core.Providers.Core { diff --git a/NzbDrone.Core/Providers/Core/HttpProvider.cs b/NzbDrone.Core/Providers/Core/HttpProvider.cs index 55a8485a6..37ced57fc 100644 --- a/NzbDrone.Core/Providers/Core/HttpProvider.cs +++ b/NzbDrone.Core/Providers/Core/HttpProvider.cs @@ -3,7 +3,6 @@ using System.IO; using System.Net; using NLog; - namespace NzbDrone.Core.Providers.Core { public class HttpProvider diff --git a/NzbDrone.Core/Providers/DownloadProvider.cs b/NzbDrone.Core/Providers/DownloadProvider.cs index dfb751802..e98813a28 100644 --- a/NzbDrone.Core/Providers/DownloadProvider.cs +++ b/NzbDrone.Core/Providers/DownloadProvider.cs @@ -1,13 +1,8 @@ using System; -using System.Collections.Generic; -using System.Linq; using Ninject; using NLog; using NzbDrone.Core.Model; -using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 3ae5f45c8..86d1e68e0 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using Ninject; using NLog; using NzbDrone.Core.Model; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs b/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs index 83f7aedde..506a75bb8 100644 --- a/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs +++ b/NzbDrone.Core/Providers/ExternalNotification/ExternalNotificationProviderBase.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NLog; +using NLog; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; diff --git a/NzbDrone.Core/Providers/ExternalNotificationProvider.cs b/NzbDrone.Core/Providers/ExternalNotificationProvider.cs index 8e86e4cba..4cba27051 100644 --- a/NzbDrone.Core/Providers/ExternalNotificationProvider.cs +++ b/NzbDrone.Core/Providers/ExternalNotificationProvider.cs @@ -1,15 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; using Ninject; using NLog; -using NzbDrone.Core.Helpers; -using NzbDrone.Core.Model; -using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/Indexer/Newzbin.cs b/NzbDrone.Core/Providers/Indexer/Newzbin.cs index b5fe0eb7f..53075271b 100644 --- a/NzbDrone.Core/Providers/Indexer/Newzbin.cs +++ b/NzbDrone.Core/Providers/Indexer/Newzbin.cs @@ -5,7 +5,6 @@ using System.ServiceModel.Syndication; using Ninject; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; namespace NzbDrone.Core.Providers.Indexer { diff --git a/NzbDrone.Core/Providers/Indexer/NzbMatrix.cs b/NzbDrone.Core/Providers/Indexer/NzbMatrix.cs index c2da52a3f..e7d7b6671 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbMatrix.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbMatrix.cs @@ -1,12 +1,8 @@ using System; using System.Collections.Generic; -using System.Net; using System.ServiceModel.Syndication; using Ninject; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Indexer { diff --git a/NzbDrone.Core/Providers/Indexer/NzbsOrg.cs b/NzbDrone.Core/Providers/Indexer/NzbsOrg.cs index 8ab4a69fe..dc0d5fac9 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbsOrg.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbsOrg.cs @@ -1,12 +1,8 @@ using System; using System.Collections.Generic; -using System.Net; using System.ServiceModel.Syndication; using Ninject; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Indexer { diff --git a/NzbDrone.Core/Providers/Indexer/NzbsRUs.cs b/NzbDrone.Core/Providers/Indexer/NzbsRUs.cs index 2816da19e..8b3ae356a 100644 --- a/NzbDrone.Core/Providers/Indexer/NzbsRUs.cs +++ b/NzbDrone.Core/Providers/Indexer/NzbsRUs.cs @@ -1,11 +1,7 @@ using System.Collections.Generic; -using System.Net; using System.ServiceModel.Syndication; using Ninject; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Indexer { diff --git a/NzbDrone.Core/Providers/Jobs/DeleteSeriesJob.cs b/NzbDrone.Core/Providers/Jobs/DeleteSeriesJob.cs index 800c470af..5d4c26237 100644 --- a/NzbDrone.Core/Providers/Jobs/DeleteSeriesJob.cs +++ b/NzbDrone.Core/Providers/Jobs/DeleteSeriesJob.cs @@ -1,11 +1,7 @@ using System; -using System.IO; -using System.Linq; using Ninject; using NLog; using NzbDrone.Core.Model.Notification; -using NzbDrone.Core.Repository; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Jobs { diff --git a/NzbDrone.Core/Providers/Jobs/DiskScanJob.cs b/NzbDrone.Core/Providers/Jobs/DiskScanJob.cs index 9944d2d28..2e82491a5 100644 --- a/NzbDrone.Core/Providers/Jobs/DiskScanJob.cs +++ b/NzbDrone.Core/Providers/Jobs/DiskScanJob.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using Ninject; using NLog; using NzbDrone.Core.Model.Notification; diff --git a/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs index b8842e6fe..d88c433fc 100644 --- a/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs +++ b/NzbDrone.Core/Providers/Jobs/EpisodeSearchJob.cs @@ -1,12 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using Ninject; using NLog; -using NzbDrone.Core.Helpers; using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; -using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers.Jobs diff --git a/NzbDrone.Core/Providers/Jobs/JobProvider.cs b/NzbDrone.Core/Providers/Jobs/JobProvider.cs index 39c15b4d0..ab640155d 100644 --- a/NzbDrone.Core/Providers/Jobs/JobProvider.cs +++ b/NzbDrone.Core/Providers/Jobs/JobProvider.cs @@ -8,7 +8,6 @@ using NLog; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers.Jobs { diff --git a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs index c0daf484f..7ca43f30f 100644 --- a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs +++ b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using Ninject; using NLog; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers.Jobs { diff --git a/NzbDrone.Core/Providers/Jobs/RenameEpisodeJob.cs b/NzbDrone.Core/Providers/Jobs/RenameEpisodeJob.cs index 5ba082133..e8184750e 100644 --- a/NzbDrone.Core/Providers/Jobs/RenameEpisodeJob.cs +++ b/NzbDrone.Core/Providers/Jobs/RenameEpisodeJob.cs @@ -1,7 +1,4 @@ -using System; -using System.IO; -using System.Linq; -using Ninject; +using Ninject; using NLog; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers.Core; diff --git a/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs b/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs index 9c4609573..8b507227f 100644 --- a/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs +++ b/NzbDrone.Core/Providers/Jobs/UpdateInfoJob.cs @@ -1,5 +1,5 @@ -using System.Linq; -using System.Collections.Generic; +using System.Collections.Generic; +using System.Linq; using Ninject; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Repository; diff --git a/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs b/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs index 179b7162f..a1aebe8d2 100644 --- a/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs +++ b/NzbDrone.Core/Providers/Jobs/UpdateSceneMappingsJob.cs @@ -1,7 +1,4 @@ -using System.Linq; -using System.Collections.Generic; -using NzbDrone.Core.Model.Notification; -using NzbDrone.Core.Repository; +using NzbDrone.Core.Model.Notification; namespace NzbDrone.Core.Providers.Jobs { diff --git a/NzbDrone.Core/Providers/QualityProvider.cs b/NzbDrone.Core/Providers/QualityProvider.cs index df0c78b7f..a175acecf 100644 --- a/NzbDrone.Core/Providers/QualityProvider.cs +++ b/NzbDrone.Core/Providers/QualityProvider.cs @@ -5,7 +5,6 @@ using Ninject; using NLog; using NzbDrone.Core.Repository.Quality; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/RootDirProvider.cs b/NzbDrone.Core/Providers/RootDirProvider.cs index 5fd0bbc4d..408033174 100644 --- a/NzbDrone.Core/Providers/RootDirProvider.cs +++ b/NzbDrone.Core/Providers/RootDirProvider.cs @@ -1,13 +1,11 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using Ninject; using NLog; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/SceneMappingProvider.cs b/NzbDrone.Core/Providers/SceneMappingProvider.cs index f4d3269d5..1c4d38808 100644 --- a/NzbDrone.Core/Providers/SceneMappingProvider.cs +++ b/NzbDrone.Core/Providers/SceneMappingProvider.cs @@ -1,14 +1,10 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Net; -using System.Text; using NLog; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/SeriesProvider.cs b/NzbDrone.Core/Providers/SeriesProvider.cs index 5e1b64b5b..7d23cf0f5 100644 --- a/NzbDrone.Core/Providers/SeriesProvider.cs +++ b/NzbDrone.Core/Providers/SeriesProvider.cs @@ -114,7 +114,7 @@ namespace NzbDrone.Core.Providers return GetSeries(seriesId.Value); } - return _database.Single("WHERE CleanTitle = @0", normalizeTitle); + return _database.FirstOrDefault("WHERE CleanTitle = @0", normalizeTitle); } public virtual void UpdateSeries(Series series) diff --git a/NzbDrone.Core/Providers/StatsProvider.cs b/NzbDrone.Core/Providers/StatsProvider.cs index 9817e8d12..e93367aae 100644 --- a/NzbDrone.Core/Providers/StatsProvider.cs +++ b/NzbDrone.Core/Providers/StatsProvider.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; using Ninject; namespace NzbDrone.Core.Providers diff --git a/NzbDrone.Core/Providers/TvDbProvider.cs b/NzbDrone.Core/Providers/TvDbProvider.cs index f965e2801..ccfa19edf 100644 --- a/NzbDrone.Core/Providers/TvDbProvider.cs +++ b/NzbDrone.Core/Providers/TvDbProvider.cs @@ -1,6 +1,6 @@ using System; -using System.Linq; using System.Collections.Generic; +using System.Linq; using System.Text.RegularExpressions; using NLog; using TvdbLib; diff --git a/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs b/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs index d52c0249a..2b0d9c9f1 100644 --- a/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs +++ b/NzbDrone.Core/Providers/UpcomingEpisodesProvider.cs @@ -5,7 +5,6 @@ using Ninject; using NzbDrone.Core.Model; using NzbDrone.Core.Repository; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Providers { diff --git a/NzbDrone.Core/Providers/XbmcProvider.cs b/NzbDrone.Core/Providers/XbmcProvider.cs index 95766b33e..ab766ad97 100644 --- a/NzbDrone.Core/Providers/XbmcProvider.cs +++ b/NzbDrone.Core/Providers/XbmcProvider.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Xml.Linq; using Ninject; using NLog; -using NzbDrone.Core.Helpers; using NzbDrone.Core.Providers.Core; namespace NzbDrone.Core.Providers diff --git a/NzbDrone.Core/Repository/Config.cs b/NzbDrone.Core/Repository/Config.cs index 643928d67..2f351e61a 100644 --- a/NzbDrone.Core/Repository/Config.cs +++ b/NzbDrone.Core/Repository/Config.cs @@ -1,5 +1,4 @@ using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { diff --git a/NzbDrone.Core/Repository/Episode.cs b/NzbDrone.Core/Repository/Episode.cs index 230d16341..25bfd4464 100644 --- a/NzbDrone.Core/Repository/Episode.cs +++ b/NzbDrone.Core/Repository/Episode.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using NzbDrone.Core.Model; using PetaPoco; -using SubSonic.SqlGeneration.Schema; - namespace NzbDrone.Core.Repository { @@ -11,7 +9,7 @@ namespace NzbDrone.Core.Repository [PrimaryKey("EpisodeId", autoIncrement = true)] public class Episode { - [SubSonicPrimaryKey] + public virtual int EpisodeId { get; set; } public virtual int? TvDbEpisodeId { get; set; } @@ -23,12 +21,11 @@ namespace NzbDrone.Core.Repository public virtual string Title { get; set; } public virtual DateTime AirDate { get; set; } - [SubSonicLongString] + public virtual string Overview { get; set; } public virtual Boolean Ignored { get; set; } - [SubSonicIgnore] [Ignore] public Boolean IsDailyEpisode { @@ -47,7 +44,7 @@ namespace NzbDrone.Core.Repository /// public virtual DateTime? GrabDate { get; set; } - [SubSonicIgnore] + [Ignore] public EpisodeStatusType Status { @@ -72,15 +69,15 @@ namespace NzbDrone.Core.Repository } } - [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] + [Ignore] public virtual Series Series { get; set; } - [SubSonicToOneRelation(ThisClassContainsJoinKey = true)] + [Ignore] public virtual EpisodeFile EpisodeFile { get; set; } - [SubSonicToManyRelation] + [Ignore] public virtual IList Histories { get; protected set; } diff --git a/NzbDrone.Core/Repository/ExternalNotificationSetting.cs b/NzbDrone.Core/Repository/ExternalNotificationSetting.cs index abb30bcd7..f4a4686c0 100644 --- a/NzbDrone.Core/Repository/ExternalNotificationSetting.cs +++ b/NzbDrone.Core/Repository/ExternalNotificationSetting.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using PetaPoco; +using PetaPoco; namespace NzbDrone.Core.Repository { diff --git a/NzbDrone.Core/Repository/History.cs b/NzbDrone.Core/Repository/History.cs index 9cd65e364..a062d1c37 100644 --- a/NzbDrone.Core/Repository/History.cs +++ b/NzbDrone.Core/Repository/History.cs @@ -1,8 +1,6 @@ using System; -using NzbDrone.Core.Model; using NzbDrone.Core.Repository.Quality; using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { diff --git a/NzbDrone.Core/Repository/JobSetting.cs b/NzbDrone.Core/Repository/JobSetting.cs index 27e2ddecb..1ab02fff7 100644 --- a/NzbDrone.Core/Repository/JobSetting.cs +++ b/NzbDrone.Core/Repository/JobSetting.cs @@ -1,6 +1,5 @@ using System; using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { @@ -8,7 +7,6 @@ namespace NzbDrone.Core.Repository [PrimaryKey("Id", autoIncrement = true)] public class JobSetting { - [SubSonicPrimaryKey(true)] public Int32 Id { get; set; } public Boolean Enable { get; set; } diff --git a/NzbDrone.Core/Repository/Quality/QualityProfile.cs b/NzbDrone.Core/Repository/Quality/QualityProfile.cs index 802617e3a..7f1ed347b 100644 --- a/NzbDrone.Core/Repository/Quality/QualityProfile.cs +++ b/NzbDrone.Core/Repository/Quality/QualityProfile.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository.Quality { @@ -11,7 +10,7 @@ namespace NzbDrone.Core.Repository.Quality [PrimaryKey("QualityProfileId", autoIncrement = true)] public class QualityProfile { - [SubSonicPrimaryKey] + public virtual int QualityProfileId { get; set; } [Required(ErrorMessage = "A Name is Required")] @@ -20,12 +19,10 @@ namespace NzbDrone.Core.Repository.Quality public string Name { get; set; } [Ignore] - [SubSonicIgnore] [DisplayName("Allowed Qualities")] public List Allowed { get; set; } [Ignore] - [SubSonicIgnore] [DisplayName("Allowed Qualities String")] [DisplayFormat(ConvertEmptyStringToNull = false)] public string AllowedString { get; set; } @@ -60,7 +57,7 @@ namespace NzbDrone.Core.Repository.Quality } [Ignore] - [SubSonicToManyRelation] + public virtual List Series { get; private set; } } } \ No newline at end of file diff --git a/NzbDrone.Core/Repository/SceneMapping.cs b/NzbDrone.Core/Repository/SceneMapping.cs index d51c823d9..a5b21a847 100644 --- a/NzbDrone.Core/Repository/SceneMapping.cs +++ b/NzbDrone.Core/Repository/SceneMapping.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using PetaPoco; +using PetaPoco; namespace NzbDrone.Core.Repository { diff --git a/NzbDrone.Core/Repository/Series.cs b/NzbDrone.Core/Repository/Series.cs index 1d8767c17..55ade2a84 100644 --- a/NzbDrone.Core/Repository/Series.cs +++ b/NzbDrone.Core/Repository/Series.cs @@ -3,35 +3,34 @@ using System.Collections.Generic; using System.ComponentModel; using NzbDrone.Core.Repository.Quality; using PetaPoco; -using SubSonic.SqlGeneration.Schema; namespace NzbDrone.Core.Repository { [PrimaryKey("SeriesId", autoIncrement = false)] public class Series { - [SubSonicPrimaryKey(false)] + public virtual int SeriesId { get; set; } - [SubSonicNullString] + public string Title { get; set; } - [SubSonicNullString] + public string CleanTitle { get; set; } - [SubSonicNullString] + public string Status { get; set; } - [SubSonicNullString] + public string Overview { get; set; } [DisplayName("Air on")] public DayOfWeek? AirsDayOfWeek { get; set; } - [SubSonicNullString] + public String AirTimes { get; set; } - [SubSonicNullString] + public string Language { get; set; } public string Path { get; set; } @@ -56,15 +55,12 @@ namespace NzbDrone.Core.Repository public DateTime? LastDiskSync { get; set; } - [SubSonicToOneRelation(ThisClassContainsJoinKey = true, JoinKeyName = "QualityProfileId")] [Ignore] public virtual QualityProfile QualityProfile { get; set; } - [SubSonicToManyRelation] [Ignore] public virtual IList Episodes { get; set; } - [SubSonicToManyRelation] [Ignore] public virtual IList EpisodeFiles { get; protected set; } } diff --git a/NzbDrone.Core/WebTimer.cs b/NzbDrone.Core/WebTimer.cs index 3058e037d..3d326d5e7 100644 --- a/NzbDrone.Core/WebTimer.cs +++ b/NzbDrone.Core/WebTimer.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Web; using System.Web.Caching; using NLog; diff --git a/NzbDrone.Web/NzbDrone.Web.csproj b/NzbDrone.Web/NzbDrone.Web.csproj index 963cea074..3cf52ab63 100644 --- a/NzbDrone.Web/NzbDrone.Web.csproj +++ b/NzbDrone.Web/NzbDrone.Web.csproj @@ -71,10 +71,6 @@ False ..\Libraries\NLog.dll - - False - ..\Libraries\SubSonic.Core.dll - From f2fdece18a1e4a3d411a4665b0df1708b9ceee93 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Fri, 17 Jun 2011 19:00:44 -0700 Subject: [PATCH 2/4] Removed subsonic completely --- NzbDrone.Core.Test/ConfigProviderTest.cs | 2 -- NzbDrone.Core.Test/DiskScanJobTest.cs | 2 -- NzbDrone.Core.Test/DownloadProviderTest.cs | 2 -- NzbDrone.Core.Test/EpisodeProviderTest.cs | 6 +----- .../Framework/AutoMoq/AutoMoqerTest.cs | 3 +-- .../Framework/ExceptionVerification.cs | 2 +- NzbDrone.Core.Test/Framework/MockLib.cs | 10 ---------- NzbDrone.Core.Test/Framework/TestBase.cs | 3 +-- NzbDrone.Core.Test/HistoryProviderTest.cs | 2 -- NzbDrone.Core.Test/ImportNewSeriesJobTest.cs | 4 +--- NzbDrone.Core.Test/IndexerProviderTest.cs | 10 ++-------- NzbDrone.Core.Test/IndexerTests.cs | 2 -- .../InventoryProvider_IsMonitoredTest.cs | 6 ------ NzbDrone.Core.Test/LogProviderTest.cs | 4 ---- NzbDrone.Core.Test/MediaFileProviderTests.cs | 13 ++++++------- .../MediaFileProvider_GetNewFilenameTest.cs | 5 ----- ...MediaFileProvider_ImportNewDownloadTest.cs | 6 ------ NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 1 - NzbDrone.Core.Test/QualityProfileTest.cs | 1 - NzbDrone.Core.Test/QualityTest.cs | 6 +----- NzbDrone.Core.Test/RootDirProviderTest.cs | 1 - NzbDrone.Core.Test/SceneMappingTest.cs | 12 +----------- NzbDrone.Core.Test/SeriesProviderTest.cs | Bin 6627 -> 6522 bytes NzbDrone.Core.Test/TvDbProviderTest.cs | 4 ++-- .../UpcomingEpisodesProviderTest.cs | 5 ----- NzbDrone.Core.Test/dbBenchmark.cs | 8 ++++---- 26 files changed, 21 insertions(+), 99 deletions(-) diff --git a/NzbDrone.Core.Test/ConfigProviderTest.cs b/NzbDrone.Core.Test/ConfigProviderTest.cs index bc2805f40..342b3e00f 100644 --- a/NzbDrone.Core.Test/ConfigProviderTest.cs +++ b/NzbDrone.Core.Test/ConfigProviderTest.cs @@ -1,11 +1,9 @@ using AutoMoq; using FluentAssertions; -using Moq; using NUnit.Framework; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; -using SubSonic.Repository; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/DiskScanJobTest.cs b/NzbDrone.Core.Test/DiskScanJobTest.cs index 5177c5eb6..bd1e82e44 100644 --- a/NzbDrone.Core.Test/DiskScanJobTest.cs +++ b/NzbDrone.Core.Test/DiskScanJobTest.cs @@ -1,8 +1,6 @@ // ReSharper disable RedundantUsingDirective using System; -using System.Linq; using System.Collections.Generic; -using System.Threading; using AutoMoq; using FizzWare.NBuilder; using Moq; diff --git a/NzbDrone.Core.Test/DownloadProviderTest.cs b/NzbDrone.Core.Test/DownloadProviderTest.cs index 049c15b40..9c24890ff 100644 --- a/NzbDrone.Core.Test/DownloadProviderTest.cs +++ b/NzbDrone.Core.Test/DownloadProviderTest.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; using AutoMoq; using FizzWare.NBuilder; using Moq; diff --git a/NzbDrone.Core.Test/EpisodeProviderTest.cs b/NzbDrone.Core.Test/EpisodeProviderTest.cs index 64c634a9e..16289c50f 100644 --- a/NzbDrone.Core.Test/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/EpisodeProviderTest.cs @@ -1,20 +1,16 @@ // ReSharper disable RedundantUsingDirective using System; -using System.Linq; using System.Collections.Generic; -using System.Linq.Expressions; +using System.Linq; using AutoMoq; using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; using PetaPoco; -using SubSonic.Repository; using TvdbLib.Data; namespace NzbDrone.Core.Test diff --git a/NzbDrone.Core.Test/Framework/AutoMoq/AutoMoqerTest.cs b/NzbDrone.Core.Test/Framework/AutoMoq/AutoMoqerTest.cs index d2f9cab5d..4d31e398e 100644 --- a/NzbDrone.Core.Test/Framework/AutoMoq/AutoMoqerTest.cs +++ b/NzbDrone.Core.Test/Framework/AutoMoq/AutoMoqerTest.cs @@ -1,9 +1,8 @@ // ReSharper disable RedundantUsingDirective +using System; using AutoMoq; using Moq; -using System; using NUnit.Framework; -using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/Framework/ExceptionVerification.cs b/NzbDrone.Core.Test/Framework/ExceptionVerification.cs index 801b75c60..6cbabaf2d 100644 --- a/NzbDrone.Core.Test/Framework/ExceptionVerification.cs +++ b/NzbDrone.Core.Test/Framework/ExceptionVerification.cs @@ -1,7 +1,7 @@ // ReSharper disable RedundantUsingDirective using System; -using System.Linq; using System.Collections.Generic; +using System.Linq; using NLog; using NLog.Targets; using NUnit.Framework; diff --git a/NzbDrone.Core.Test/Framework/MockLib.cs b/NzbDrone.Core.Test/Framework/MockLib.cs index 7c97b627f..4ed4ea6c5 100644 --- a/NzbDrone.Core.Test/Framework/MockLib.cs +++ b/NzbDrone.Core.Test/Framework/MockLib.cs @@ -6,13 +6,10 @@ using System.Linq; using FizzWare.NBuilder; using Moq; using NzbDrone.Core.Datastore; -using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using PetaPoco; -using SubSonic.DataProviders; -using SubSonic.Repository; namespace NzbDrone.Core.Test.Framework { @@ -95,12 +92,5 @@ namespace NzbDrone.Core.Test.Framework .WhereAll().Have(c => c.EpisodeNumber = epNumber.Generate()) .Build(); } - - private static void ForceMigration(IRepository repository) - { - repository.All().Count(); - repository.All().Count(); - repository.All().Count(); - } } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/Framework/TestBase.cs b/NzbDrone.Core.Test/Framework/TestBase.cs index 194e78fdd..53f2c57b6 100644 --- a/NzbDrone.Core.Test/Framework/TestBase.cs +++ b/NzbDrone.Core.Test/Framework/TestBase.cs @@ -1,5 +1,4 @@ -using NUnit; -using NUnit.Framework; +using NUnit.Framework; namespace NzbDrone.Core.Test.Framework { diff --git a/NzbDrone.Core.Test/HistoryProviderTest.cs b/NzbDrone.Core.Test/HistoryProviderTest.cs index 2ea187452..b7c405de4 100644 --- a/NzbDrone.Core.Test/HistoryProviderTest.cs +++ b/NzbDrone.Core.Test/HistoryProviderTest.cs @@ -1,6 +1,5 @@ // ReSharper disable RedundantUsingDirective using System; -using System.Collections.Generic; using System.Linq; using AutoMoq; using FizzWare.NBuilder; @@ -11,7 +10,6 @@ using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; -using SubSonic.Repository; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs b/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs index b37594ac6..30e96b40f 100644 --- a/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs +++ b/NzbDrone.Core.Test/ImportNewSeriesJobTest.cs @@ -1,7 +1,6 @@ // ReSharper disable RedundantUsingDirective -using System.Linq; +using System; using System.Collections.Generic; -using System.Threading; using AutoMoq; using FizzWare.NBuilder; using Moq; @@ -11,7 +10,6 @@ using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; -using System; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/IndexerProviderTest.cs b/NzbDrone.Core.Test/IndexerProviderTest.cs index b50afa716..c6e0cdf59 100644 --- a/NzbDrone.Core.Test/IndexerProviderTest.cs +++ b/NzbDrone.Core.Test/IndexerProviderTest.cs @@ -1,22 +1,16 @@ // ReSharper disable RedundantUsingDirective using System; using System.Collections.Generic; -using System.IO; using System.Net; using System.ServiceModel.Syndication; using AutoMoq; -using FizzWare.NBuilder; -using Moq; +using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; using NzbDrone.Core.Providers.Indexer; -using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; -using FluentAssertions; namespace NzbDrone.Core.Test { @@ -158,7 +152,7 @@ namespace NzbDrone.Core.Test return "http://www.google.com"; } - protected override Model.EpisodeParseResult CustomParser(SyndicationItem item, Model.EpisodeParseResult currentResult) + protected override EpisodeParseResult CustomParser(SyndicationItem item, EpisodeParseResult currentResult) { if (currentResult == null) currentResult = new EpisodeParseResult(); currentResult.Language = LanguageType.Finnish; diff --git a/NzbDrone.Core.Test/IndexerTests.cs b/NzbDrone.Core.Test/IndexerTests.cs index fce620b40..6aceb5c0e 100644 --- a/NzbDrone.Core.Test/IndexerTests.cs +++ b/NzbDrone.Core.Test/IndexerTests.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Generic; using System.IO; using System.Net; using System.ServiceModel.Syndication; -using System.Text; using AutoMoq; using FizzWare.NBuilder; using FluentAssertions; diff --git a/NzbDrone.Core.Test/InventoryProvider_IsMonitoredTest.cs b/NzbDrone.Core.Test/InventoryProvider_IsMonitoredTest.cs index b27526b7a..0197d94f6 100644 --- a/NzbDrone.Core.Test/InventoryProvider_IsMonitoredTest.cs +++ b/NzbDrone.Core.Test/InventoryProvider_IsMonitoredTest.cs @@ -1,9 +1,6 @@ // ReSharper disable RedundantUsingDirective using System; using System.Collections.Generic; -using System.IO; -using System.Net; -using System.ServiceModel.Syndication; using AutoMoq; using FizzWare.NBuilder; using FluentAssertions; @@ -11,9 +8,6 @@ using Moq; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; -using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.ExternalNotification; -using NzbDrone.Core.Providers.Indexer; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; diff --git a/NzbDrone.Core.Test/LogProviderTest.cs b/NzbDrone.Core.Test/LogProviderTest.cs index f1066e91e..9d8490e7a 100644 --- a/NzbDrone.Core.Test/LogProviderTest.cs +++ b/NzbDrone.Core.Test/LogProviderTest.cs @@ -1,17 +1,13 @@ // ReSharper disable RedundantUsingDirective using System; using System.Linq; -using FizzWare.NBuilder; using FluentAssertions; using NLog; using NLog.Config; using NUnit.Framework; -using NzbDrone.Core.Datastore; using NzbDrone.Core.Instrumentation; -using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; - namespace NzbDrone.Core.Test { [TestFixture] diff --git a/NzbDrone.Core.Test/MediaFileProviderTests.cs b/NzbDrone.Core.Test/MediaFileProviderTests.cs index 124da51b6..97af1d265 100644 --- a/NzbDrone.Core.Test/MediaFileProviderTests.cs +++ b/NzbDrone.Core.Test/MediaFileProviderTests.cs @@ -2,8 +2,8 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq.Expressions; using System.Linq; +using System.Linq.Expressions; using AutoMoq; using FizzWare.NBuilder; using FluentAssertions; @@ -18,7 +18,6 @@ using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; using PetaPoco; -using SubSonic.Repository; namespace NzbDrone.Core.Test { @@ -213,10 +212,10 @@ namespace NzbDrone.Core.Test //Mocks var mocker = new AutoMoqer(); - mocker.GetMock() - .Setup(r => r.Exists(It.IsAny>>())).Returns(false).Verifiable(); - mocker.GetMock() - .Setup(r => r.Add(It.IsAny())).Returns(0).Verifiable(); + mocker.GetMock() + .Setup(r => r.Exists(It.IsAny())).Returns(false).Verifiable(); + mocker.GetMock() + .Setup(r => r.Insert(It.IsAny())).Returns(0).Verifiable(); mocker.GetMock() .Setup(e => e.GetEpisode(fakeSeries.SeriesId, airDate)).Returns(fakeEpisode). @@ -299,7 +298,7 @@ namespace NzbDrone.Core.Test //Assert mocker.VerifyAllMocks(); Assert.IsNull(result); - mocker.GetMock().Verify(r => r.Add(result), Times.Never()); + mocker.GetMock().Verify(r => r.Insert(result), Times.Never()); ExceptionVerification.ExcpectedWarns(1); } diff --git a/NzbDrone.Core.Test/MediaFileProvider_GetNewFilenameTest.cs b/NzbDrone.Core.Test/MediaFileProvider_GetNewFilenameTest.cs index 9e059e798..6ec6da471 100644 --- a/NzbDrone.Core.Test/MediaFileProvider_GetNewFilenameTest.cs +++ b/NzbDrone.Core.Test/MediaFileProvider_GetNewFilenameTest.cs @@ -1,13 +1,8 @@ // ReSharper disable RedundantUsingDirective -using System; using System.Collections.Generic; -using System.IO; -using System.Linq; using AutoMoq; using FizzWare.NBuilder; -using Moq; using NUnit.Framework; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; diff --git a/NzbDrone.Core.Test/MediaFileProvider_ImportNewDownloadTest.cs b/NzbDrone.Core.Test/MediaFileProvider_ImportNewDownloadTest.cs index 530bf3abe..c3a46ab16 100644 --- a/NzbDrone.Core.Test/MediaFileProvider_ImportNewDownloadTest.cs +++ b/NzbDrone.Core.Test/MediaFileProvider_ImportNewDownloadTest.cs @@ -1,19 +1,13 @@ // ReSharper disable RedundantUsingDirective -using System; using System.Collections.Generic; using System.IO; -using System.Linq.Expressions; -using System.Linq; using AutoMoq; using FizzWare.NBuilder; -using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Model; -using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; -using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 13f90581c..f6bb8d9da 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -75,7 +75,6 @@ ..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll - diff --git a/NzbDrone.Core.Test/QualityProfileTest.cs b/NzbDrone.Core.Test/QualityProfileTest.cs index 773dc524b..292daedca 100644 --- a/NzbDrone.Core.Test/QualityProfileTest.cs +++ b/NzbDrone.Core.Test/QualityProfileTest.cs @@ -1,7 +1,6 @@ // ReSharper disable RedundantUsingDirective using System; using System.Collections.Generic; -using System.Linq; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; diff --git a/NzbDrone.Core.Test/QualityTest.cs b/NzbDrone.Core.Test/QualityTest.cs index af41c12ae..63bedfea7 100644 --- a/NzbDrone.Core.Test/QualityTest.cs +++ b/NzbDrone.Core.Test/QualityTest.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; -using FluentAssertions; -using NUnit.Framework; +using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; diff --git a/NzbDrone.Core.Test/RootDirProviderTest.cs b/NzbDrone.Core.Test/RootDirProviderTest.cs index e00c606bb..7b492462c 100644 --- a/NzbDrone.Core.Test/RootDirProviderTest.cs +++ b/NzbDrone.Core.Test/RootDirProviderTest.cs @@ -9,7 +9,6 @@ using NzbDrone.Core.Providers; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; -using SubSonic.Repository; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/SceneMappingTest.cs b/NzbDrone.Core.Test/SceneMappingTest.cs index f5d49708c..a7a69eb52 100644 --- a/NzbDrone.Core.Test/SceneMappingTest.cs +++ b/NzbDrone.Core.Test/SceneMappingTest.cs @@ -1,19 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using AutoMoq; +using AutoMoq; using FizzWare.NBuilder; -using FluentAssertions; -using Moq; using NUnit.Framework; -using NzbDrone.Core.Helpers; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; -using SubSonic.Repository; -using TvdbLib.Data; namespace NzbDrone.Core.Test { diff --git a/NzbDrone.Core.Test/SeriesProviderTest.cs b/NzbDrone.Core.Test/SeriesProviderTest.cs index 90a52b176222d9de2d84645df377179ed5e794d6..784ca2e17dc2d4caefe3d652b6b1d37310185e3e 100644 GIT binary patch delta 53 zcmV-50LuU4Gx{=+O_6ZulYs#j2vB8oVNh>lZ?mfb?*a%!VRT_)VRL1ZPY4{7zyubP LbOkZ97X{1|QBM>k delta 139 zcmexm^w@ZUuds7|PEKlaNoIatv7UQsUTRTh@k55Yn4N7~eB-A^4N?S(PW}vG6M;E7;m8B+eiZYG> diff --git a/NzbDrone.Core.Test/TvDbProviderTest.cs b/NzbDrone.Core.Test/TvDbProviderTest.cs index 5dba84448..4930a5bba 100644 --- a/NzbDrone.Core.Test/TvDbProviderTest.cs +++ b/NzbDrone.Core.Test/TvDbProviderTest.cs @@ -1,16 +1,16 @@ // ReSharper disable RedundantUsingDirective using System; +using System.Collections.Generic; using System.Linq; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Providers; using NzbDrone.Core.Test.Framework; using TvdbLib.Data; -using System.Collections.Generic; namespace NzbDrone.Core.Test { - [NUnit.Framework.TestFixture] + [TestFixture] // ReSharper disable InconsistentNaming public class TvDbProviderTest : TestBase { diff --git a/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs b/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs index 3d674b252..f6a5f9947 100644 --- a/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs +++ b/NzbDrone.Core.Test/UpcomingEpisodesProviderTest.cs @@ -1,15 +1,10 @@ // ReSharper disable RedundantUsingDirective using System; -using System.Collections.Generic; -using System.Linq; using AutoMoq; using FizzWare.NBuilder; -using FluentAssertions; using NUnit.Framework; -using NzbDrone.Core.Model; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; -using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; namespace NzbDrone.Core.Test diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index c6c3b125c..7ca88b1b9 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -2,13 +2,13 @@ using System.Collections.Generic; using System.Diagnostics; using System.Threading; +using AutoMoq; using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Providers; using NzbDrone.Core.Repository; using NzbDrone.Core.Test.Framework; -using SubSonic.Repository; namespace NzbDrone.Core.Test { @@ -139,7 +139,7 @@ namespace NzbDrone.Core.Test [Test] public void get_episode_file_count_x100() { - var mocker = new AutoMoq.AutoMoqer(); + var mocker = new AutoMoqer(); //mocker.SetConstant(repo); mocker.SetConstant(mocker.Resolve()); var mediaProvider = mocker.Resolve(); @@ -167,7 +167,7 @@ namespace NzbDrone.Core.Test [Test] public void get_season_count_x5000() { - var mocker = new AutoMoq.AutoMoqer(); + var mocker = new AutoMoqer(); //mocker.SetConstant(repo); var provider = mocker.Resolve(); @@ -194,7 +194,7 @@ namespace NzbDrone.Core.Test [Test] public void get_episode_file_count_x10() { - var mocker = new AutoMoq.AutoMoqer(); + var mocker = new AutoMoqer(); //mocker.SetConstant(repo); mocker.SetConstant(mocker.Resolve()); var provider = mocker.Resolve(); From 45a51497b683d34be29bfecc273cd12bfe862a6b Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Fri, 17 Jun 2011 19:06:20 -0700 Subject: [PATCH 3/4] Fixed issue where migrration would run on every page load. --- NzbDrone.Core/Datastore/MigrationsHelper.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NzbDrone.Core/Datastore/MigrationsHelper.cs b/NzbDrone.Core/Datastore/MigrationsHelper.cs index 644b473e8..cc21db325 100644 --- a/NzbDrone.Core/Datastore/MigrationsHelper.cs +++ b/NzbDrone.Core/Datastore/MigrationsHelper.cs @@ -12,6 +12,8 @@ namespace NzbDrone.Core.Datastore public static void Run(string connetionString, bool trace) { + if (IsMigrated) return; + IsMigrated = true; Logger.Info("Preparing run database migration"); try From f4a765817bd7134fa3de15529a87e7b1c4088243 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Fri, 17 Jun 2011 19:51:53 -0700 Subject: [PATCH 4/4] Fixed some small issues, here and there. --- NzbDrone.Core.Test/ConfigProviderTest.cs | 24 ++++++++++++++++++- NzbDrone.Core.Test/ParserTest.cs | 1 + NzbDrone.Core/CentralDispatch.cs | 3 ++- NzbDrone.Core/Datastore/Connection.cs | 20 +++++++++------- NzbDrone.Core/Datastore/MigrationsHelper.cs | 8 ++++--- .../Providers/Core/ConfigProvider.cs | 2 +- 6 files changed, 44 insertions(+), 14 deletions(-) diff --git a/NzbDrone.Core.Test/ConfigProviderTest.cs b/NzbDrone.Core.Test/ConfigProviderTest.cs index 342b3e00f..14c93ea98 100644 --- a/NzbDrone.Core.Test/ConfigProviderTest.cs +++ b/NzbDrone.Core.Test/ConfigProviderTest.cs @@ -39,6 +39,7 @@ namespace NzbDrone.Core.Test mocker.SetConstant(db); db.Insert(new Config { Key = key, Value = value }); + db.Insert(new Config { Key = "Other Key", Value = "OtherValue" }); //Act var result = mocker.Resolve().GetValue(key, ""); @@ -67,7 +68,7 @@ namespace NzbDrone.Core.Test } [Test] - public void New_value_should_update_old_value() + public void New_value_should_update_old_value_new_value() { const string key = "MY_KEY"; const string originalValue = "OLD_VALUE"; @@ -88,5 +89,26 @@ namespace NzbDrone.Core.Test db.Fetch().Should().HaveCount(1); } + [Test] + public void New_value_should_update_old_value_same_value() + { + const string key = "MY_KEY"; + const string value = "OLD_VALUE"; + + + var mocker = new AutoMoqer(); + var db = MockLib.GetEmptyDatabase(); + mocker.SetConstant(db); + + //Act + mocker.Resolve().SetValue(key, value); + mocker.Resolve().SetValue(key, value); + var result = mocker.Resolve().GetValue(key, ""); + + //Assert + result.Should().Be(value); + db.Fetch().Should().HaveCount(1); + } + } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/ParserTest.cs b/NzbDrone.Core.Test/ParserTest.cs index 27e5a8309..0a3812f0a 100644 --- a/NzbDrone.Core.Test/ParserTest.cs +++ b/NzbDrone.Core.Test/ParserTest.cs @@ -152,6 +152,7 @@ namespace NzbDrone.Core.Test [TestCase("The Daily Show - 2011-04-12 - Gov. Deval Patrick", "The.Daily.Show", 2011, 04, 12)] [TestCase("2011.01.10 - Denis Leary - HD TV.mkv", "", 2011, 1, 10)] [TestCase("2011.03.13 - Denis Leary - HD TV.mkv", "", 2011, 3, 13)] + [TestCase("The Tonight Show with Jay Leno - 2011-06-16 - Larry David, \"Bachelorette\" Ashley Hebert, Pitbull with Ne-Yo", "The Tonight Show with Jay Leno", 2011, 3, 13)] public void episode_daily_parse(string postTitle, string title, int year, int month, int day) { var result = Parser.ParseEpisodeInfo(postTitle); diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index e2fa914a7..d1223a5ab 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -68,7 +68,8 @@ namespace NzbDrone.Core _kernel = new StandardKernel(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString)).InRequestScope(); - _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); + _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString, false)).WhenInjectedInto().InSingletonScope(); + _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString, false)).WhenInjectedInto().InSingletonScope(); _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InRequestScope(); } } diff --git a/NzbDrone.Core/Datastore/Connection.cs b/NzbDrone.Core/Datastore/Connection.cs index 2ca526003..a620e49ee 100644 --- a/NzbDrone.Core/Datastore/Connection.cs +++ b/NzbDrone.Core/Datastore/Connection.cs @@ -1,5 +1,6 @@ using System; using System.Data; +using System.Data.Common; using System.Data.SQLite; using System.IO; using MvcMiniProfiler.Data; @@ -14,6 +15,7 @@ namespace NzbDrone.Core.Datastore static Connection() { if (!AppDataPath.Exists) AppDataPath.Create(); + Database.Mapper = new CustomeMapper(); } @@ -38,18 +40,20 @@ namespace NzbDrone.Core.Datastore } } - - public static IDatabase GetPetaPocoDb(string connectionString) + + public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true) { MigrationsHelper.Run(connectionString, true); + DbConnection connection = new SQLiteConnection(connectionString); + if (profiled) + { + //connection = ProfiledDbConnection.Get(connection); + } - var profileConnection = ProfiledDbConnection.Get(new SQLiteConnection(connectionString)); - - Database.Mapper = new CustomeMapper(); - var db = new Database(profileConnection); + var db = new Database(connection); - if (profileConnection.State != ConnectionState.Open) - profileConnection.Open(); + if (connection.State != ConnectionState.Open) + connection.Open(); return db; } diff --git a/NzbDrone.Core/Datastore/MigrationsHelper.cs b/NzbDrone.Core/Datastore/MigrationsHelper.cs index cc21db325..ed0249417 100644 --- a/NzbDrone.Core/Datastore/MigrationsHelper.cs +++ b/NzbDrone.Core/Datastore/MigrationsHelper.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Reflection; using NLog; @@ -8,12 +9,13 @@ namespace NzbDrone.Core.Datastore { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - public static bool IsMigrated { get; private set; } + public static readonly Dictionary _migrated = new Dictionary(); public static void Run(string connetionString, bool trace) { - if (IsMigrated) return; - IsMigrated = true; + if (_migrated.ContainsKey(connetionString)) return; + _migrated.Add(connetionString, string.Empty); + Logger.Info("Preparing run database migration"); try diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index 6609b3ab1..298cb0738 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -278,7 +278,7 @@ namespace NzbDrone.Core.Providers.Core { string value; - var dbValue = _database.SingleOrDefault(key); + var dbValue = _database.SingleOrDefault("WHERE Key=@0", key); if (dbValue != null && !String.IsNullOrEmpty(dbValue.Value)) return dbValue.Value;