From 4278904b2c9c3d59b661fec21df110136a4a5ea8 Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Thu, 7 Sep 2023 09:58:34 -0400 Subject: [PATCH 01/28] On Snowflake always using `QUOTED_IDENTIFIERS_IGNORE_CASE=TRUE` to avoid name mismatches when using quotes. --- DESCRIPTION | 2 +- NEWS.md | 8 ++++++++ R/Connect.R | 3 ++- extras/TestOtherPlatforms.R | 11 ++++++++--- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 87e8351a..c32ef04a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: DatabaseConnector Type: Package Title: Connecting to Various Database Platforms -Version: 6.2.4 +Version: 6.3.0 Date: 2023-09-07 Authors@R: c( person("Martijn", "Schuemie", email = "schuemie@ohdsi.org", role = c("aut", "cre")), diff --git a/NEWS.md b/NEWS.md index 5d419c41..64fa8ff9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,11 @@ +DatabaseConnector 6.3.0 +======================= + +Changes: + +1. On Snowflake always using `QUOTED_IDENTIFIERS_IGNORE_CASE=TRUE` to avoid name mismatches when using quotes. + + DatabaseConnector 6.2.4 ======================= diff --git a/R/Connect.R b/R/Connect.R index 481a3482..97a61e56 100644 --- a/R/Connect.R +++ b/R/Connect.R @@ -709,7 +709,8 @@ connectSnowflake <- function(connectionDetails) { user = connectionDetails$user(), password = connectionDetails$password(), dbms = connectionDetails$dbms, - "CLIENT_TIMESTAMP_TYPE_MAPPING"="TIMESTAMP_NTZ" + "CLIENT_TIMESTAMP_TYPE_MAPPING"="TIMESTAMP_NTZ", + "QUOTED_IDENTIFIERS_IGNORE_CASE"="TRUE" ) } return(connection) diff --git a/extras/TestOtherPlatforms.R b/extras/TestOtherPlatforms.R index d86697df..464ee6f0 100644 --- a/extras/TestOtherPlatforms.R +++ b/extras/TestOtherPlatforms.R @@ -68,11 +68,12 @@ scratchDatabaseSchemaDataBricks <- "scratch" connectionDetailsSnowflake <- createConnectionDetails( dbms = "snowflake", connectionString = keyring::key_get("snowflakeConnectionString"), + # connectionString = paste(keyring::key_get("snowflakeConnectionString"), "QUOTED_IDENTIFIERS_IGNORE_CASE=TRUE", sep="&"), user = keyring::key_get("snowflakeUser"), password = keyring::key_get("snowflakePassword") ) -cdmDatabaseSchemaSnowflake <- "ohdsi.eunomia" -scratchDatabaseSchemaSnowflake <- "ohdsi.scratch" +cdmDatabaseSchemaSnowflake <- "ATLAS.SYNPUF110K_CDM_53" +scratchDatabaseSchemaSnowflake <- "ATLAS.RESULTS" # Open and close connection ----------------------------------------------- @@ -709,7 +710,11 @@ db <- DBI::dbConnect(odbc::odbc(), connection <- connect(connectionDetailsBigQuery) renderTranslateQuerySql(connection, "SELECT TOP 1 \"person_id\" FROM @schema.person;", schema = cdmDatabaseSchemaBigQuery) -querySql(connection, "SELECT `person_id` FROM synpuf_2m.person LIMIT 1;") +querySql(connection, "SELECT \"PERSON_ID\" FROM ATLAS.SYNPUF110K_CDM_53.person LIMIT 1;") disconnect(connection) + +connection <- connect(connectionDetailsSnowflake) +renderTranslateQuerySql(connection, "SELECT TOP 1 \"person_id\" FROM @schema.person;", schema = cdmDatabaseSchemaSnowflake) +disconnect(connection) From 85fabdeff2906a0f55ad46fcc82d39b2609144bd Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Tue, 12 Sep 2023 07:27:25 -0400 Subject: [PATCH 02/28] Using executeLargeUpdate instead of execute on all platforms except Spark. Addresses #249 --- R/DBI.R | 2 +- R/Sql.R | 22 ++++----- extras/TestOtherPlatforms.R | 72 +++++++++++++++++++++++++++++ tests/testthat/test-BatchProcess.R | 2 +- tests/testthat/test-dataHash.R | 2 +- tests/testthat/test-dbplyr.R | 2 +- tests/testthat/test-fetchResults.R | 4 +- tests/testthat/test-getTableNames.R | 8 ++-- tests/testthat/test-sendUpdates.R | 38 ++++++++++----- 9 files changed, 120 insertions(+), 32 deletions(-) diff --git a/R/DBI.R b/R/DBI.R index e2b2e5fd..6cfbfbb2 100644 --- a/R/DBI.R +++ b/R/DBI.R @@ -455,7 +455,7 @@ setMethod( ) } rowsAffected <- executeSql(connection = conn, sql = statement) - rowsAffected <- rJava::.jnew("java/lang/Integer", as.integer(rowsAffected)) + rowsAffected <- rJava::.jnew("java/lang/Double", as.double(sum(rowsAffected))) result <- new("DatabaseConnectorJdbcResult", content = rowsAffected, type = "rowsAffected", diff --git a/R/Sql.R b/R/Sql.R index b5905ecb..fcfab610 100644 --- a/R/Sql.R +++ b/R/Sql.R @@ -302,18 +302,20 @@ lowLevelExecuteSql.default <- function(connection, sql) { statement <- rJava::.jcall(connection@jConnection, "Ljava/sql/Statement;", "createStatement") on.exit(rJava::.jcall(statement, "V", "close")) - hasResultSet <- rJava::.jcall(statement, "Z", "execute", as.character(sql), check = FALSE) + if (dbms(connection) == "spark") { + # For some queries the DataBricks JDBC driver will throw an error saying no ROWCOUNT is returned + # when using executeLargeUpdate, so using execute instead. + rJava::.jcall(statement, "Z", "execute", as.character(sql), check = FALSE) + rowsAffected <- rJava::.jcall(statement, "I", "getUpdateCount", check = FALSE) + } else { + rowsAffected <- rJava::.jcall(statement, "J", "executeLargeUpdate", as.character(sql), check = FALSE) + } if (dbms(connection) == "bigquery") { delayIfNecessaryForDdl(sql) delayIfNecessaryForInsert(sql) } - rowsAffected <- 0 - if (!hasResultSet) { - rowsAffected <- rJava::.jcall(statement, "I", "getUpdateCount", check = FALSE) - } - delta <- Sys.time() - startTime logTrace(paste("Executing SQL took", delta, attr(delta, "units"))) invisible(rowsAffected) @@ -421,9 +423,9 @@ executeSql <- function(connection, batched <- runAsBatch && supportsBatchUpdates(connection) sqlStatements <- SqlRender::splitSql(sql) + rowsAffected <- c() if (batched) { batchSize <- 1000 - rowsAffected <- 0 for (start in seq(1, length(sqlStatements), by = batchSize)) { end <- min(start + batchSize - 1, length(sqlStatements)) @@ -441,7 +443,7 @@ executeSql <- function(connection, tryCatch( { startQuery <- Sys.time() - rowsAffected <- c(rowsAffected, rJava::.jcall(statement, "[I", "executeBatch")) + rowsAffected <- c(rowsAffected, rJava::.jcall(statement, "[J", "executeLargeBatch")) delta <- Sys.time() - startQuery if (profile) { inform(paste("Statements", start, "through", end, "took", delta, attr(delta, "units"))) @@ -471,7 +473,7 @@ executeSql <- function(connection, tryCatch( { startQuery <- Sys.time() - lowLevelExecuteSql(connection, sqlStatement) + rowsAffected <- c(rowsAffected, lowLevelExecuteSql(connection, sqlStatement)) delta <- Sys.time() - startQuery if (profile) { inform(paste("Statement ", i, "took", delta, attr(delta, "units"))) @@ -498,9 +500,7 @@ executeSql <- function(connection, delta <- Sys.time() - startTime inform(paste("Executing SQL took", signif(delta, 3), attr(delta, "units"))) } - if (batched) { invisible(rowsAffected) - } } convertFields <- function(dbms, result) { diff --git a/extras/TestOtherPlatforms.R b/extras/TestOtherPlatforms.R index 464ee6f0..012ddad0 100644 --- a/extras/TestOtherPlatforms.R +++ b/extras/TestOtherPlatforms.R @@ -75,6 +75,17 @@ connectionDetailsSnowflake <- createConnectionDetails( cdmDatabaseSchemaSnowflake <- "ATLAS.SYNPUF110K_CDM_53" scratchDatabaseSchemaSnowflake <- "ATLAS.RESULTS" +# Snowflake +connectionDetailsSnowflake <- createConnectionDetails( + dbms = "snowflake", + server = Sys.getenv("CDM_SNOWFLAKE_SERVER"), + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = Sys.getenv("CDM_SNOWFLAKE_PASSWORD") +) +connection <- connect(connectionDetailsSnowflake) +cdmDatabaseSchemaSnowflake <- "ATLAS.SYNPUF110K_CDM_53" +scratchDatabaseSchemaSnowflake <- "ATLAS.RESULTS" + # Open and close connection ----------------------------------------------- # BigQuery @@ -522,6 +533,67 @@ hash <- computeDataHash(connection = connection, expect_true(is.character(hash)) disconnect(connection) +# Test updates ----------------------------------------------------------------- +sql <- "CREATE TABLE #temp (x INT); + INSERT INTO #temp (x) SELECT 123; + DELETE FROM #temp WHERE x = 123; + DROP TABLE #temp;" + +# BigQuery +options(sqlRenderTempEmulationSchema = scratchDatabaseSchemaBigQuery) +connection <- connect(connectionDetailsBigQuery) + +expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + +expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + +rowsAffected <- dbSendStatement(connection, sql) +expect_equal(dbGetRowsAffected(rowsAffected), 2) +dbClearResult(rowsAffected) + +disconnect(connection) + +# Azure +connection <- connect(connectionDetailsAzure) + +expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + +expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + +rowsAffected <- dbSendStatement(connection, sql) +expect_equal(dbGetRowsAffected(rowsAffected), 2) +dbClearResult(rowsAffected) + +disconnect(connection) + +# Databricks JDBC +options(sqlRenderTempEmulationSchema = scratchDatabaseSchemaDataBricks) +connection <- connect(connectionDetailsDataBricksJdbc) + +expect_equal(renderTranslateExecuteSql(connection, sql), c(-1, -1, 0, -1)) + +expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(-1, -1, 0, -1)) + +rowsAffected <- dbSendStatement(connection, sql) +expect_equal(dbGetRowsAffected(rowsAffected), -3) +dbClearResult(rowsAffected) + +disconnect(connection) + +# Databricks ODBC +options(sqlRenderTempEmulationSchema = scratchDatabaseSchemaDataBricks) +connection <- connect(connectionDetailsDataBricksOdbc) + +expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 0, 0, 0)) + +expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 0, 0, 0)) + +rowsAffected <- dbSendStatement(connection, sql) +expect_equal(dbGetRowsAffected(rowsAffected), 0) +dbClearResult(rowsAffected) + +disconnect(connection) + # Test dbplyr ------------------------------------------------------------------ source("tests/testthat/dbplyrTestFunction.R") diff --git a/tests/testthat/test-BatchProcess.R b/tests/testthat/test-BatchProcess.R index 041bbaae..e80abfae 100644 --- a/tests/testthat/test-BatchProcess.R +++ b/tests/testthat/test-BatchProcess.R @@ -5,7 +5,7 @@ test_that("renderTranslateQueryApplyBatched works", { password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" fun <- function(data, position, myString) { diff --git a/tests/testthat/test-dataHash.R b/tests/testthat/test-dataHash.R index 522146b3..eb94709f 100644 --- a/tests/testthat/test-dataHash.R +++ b/tests/testthat/test-dataHash.R @@ -9,7 +9,7 @@ test_that("Compute data hash", { server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA")) + hash <- computeDataHash(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) expect_true(is.character(hash)) disconnect(connection) diff --git a/tests/testthat/test-dbplyr.R b/tests/testthat/test-dbplyr.R index e473011f..f7705069 100644 --- a/tests/testthat/test-dbplyr.R +++ b/tests/testthat/test-dbplyr.R @@ -10,7 +10,7 @@ test_that("Test dbplyr on Postgres", { password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) }) diff --git a/tests/testthat/test-fetchResults.R b/tests/testthat/test-fetchResults.R index 8cfe2203..6127b4a1 100644 --- a/tests/testthat/test-fetchResults.R +++ b/tests/testthat/test-fetchResults.R @@ -14,7 +14,7 @@ test_that("Fetch results", { password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) @@ -214,7 +214,7 @@ test_that("dbFetch works", { password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") sql <- "SELECT * FROM @cdm_database_schema.vocabulary LIMIT 10" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) diff --git a/tests/testthat/test-getTableNames.R b/tests/testthat/test-getTableNames.R index 54925ee0..215b885d 100644 --- a/tests/testthat/test-getTableNames.R +++ b/tests/testthat/test-getTableNames.R @@ -9,9 +9,9 @@ test_that("Get table names", { server = Sys.getenv("CDM5_POSTGRESQL_SERVER") ) connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), "person")) expect_true(DBI::dbExistsTable(connection, "person")) disconnect(connection) @@ -104,9 +104,9 @@ test_that("Get table names using DBI drivers", { host = Sys.getenv("CDM5_POSTGRESQL_HOST"), user = Sys.getenv("CDM5_POSTGRESQL_USER"), password = Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) - tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), "person")) DBI::dbDisconnect(connection) # SQL Server with odbc driver ---------------------------------- diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index ad5d8009..5d6c7e6d 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -20,10 +20,14 @@ test_that("Send updates to server", { ) connection <- connect(details) - expect_null(renderTranslateExecuteSql(connection, sql)) + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - expect_true(sum(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE)) > 0) + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) + disconnect(connection) # SQL Server -------------------------------------------------- @@ -35,9 +39,13 @@ test_that("Send updates to server", { ) connection <- connect(details) - expect_null(renderTranslateExecuteSql(connection, sql)) - - expect_true(sum(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE)) > 0) + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) disconnect(connection) @@ -50,9 +58,13 @@ test_that("Send updates to server", { ) connection <- connect(details) - expect_null(renderTranslateExecuteSql(connection, sql)) - - expect_true(sum(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE)) > 0) + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) disconnect(connection) @@ -65,9 +77,13 @@ test_that("Send updates to server", { ) connection <- connect(details) - expect_null(renderTranslateExecuteSql(connection, sql)) - - expect_true(sum(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE)) > 0) + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) disconnect(connection) }) From abf23de7456b6899144b272b55ddb01b79ff2e7e Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Tue, 12 Sep 2023 10:54:27 -0400 Subject: [PATCH 03/28] Switching testing to CDMv54 --- .github/workflows/R_CMD_check_Hades.yaml | 8 ++--- .../workflows/R_CMD_check_main_weekly.yaml | 8 ++--- tests/testthat/test-BatchProcess.R | 6 ++-- tests/testthat/test-dataHash.R | 6 ++-- tests/testthat/test-dbplyr.R | 6 ++-- tests/testthat/test-fetchResults.R | 36 +++++++++---------- tests/testthat/test-getTableNames.R | 22 ++++++------ 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index fe6bcdf4..64ac5a6e 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -28,22 +28,22 @@ jobs: GITHUB_PAT: ${{ secrets.GH_TOKEN }} R_REMOTES_NO_ERRORS_FROM_WARNINGS: true RSPM: ${{ matrix.config.rspm }} - CDM5_ORACLE_CDM_SCHEMA: ${{ secrets.CDM5_ORACLE_CDM_SCHEMA }} + CDM5_ORACLE_CDM54_SCHEMA: ${{ secrets.CDM5_ORACLE_CDM54_SCHEMA }} CDM5_ORACLE_OHDSI_SCHEMA: ${{ secrets.CDM5_ORACLE_OHDSI_SCHEMA }} CDM5_ORACLE_PASSWORD: ${{ secrets.CDM5_ORACLE_PASSWORD }} CDM5_ORACLE_SERVER: ${{ secrets.CDM5_ORACLE_SERVER }} CDM5_ORACLE_USER: ${{ secrets.CDM5_ORACLE_USER }} - CDM5_POSTGRESQL_CDM_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_CDM_SCHEMA }} + CDM5_POSTGRESQL_CDM54_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_CDM54_SCHEMA }} CDM5_POSTGRESQL_OHDSI_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_OHDSI_SCHEMA }} CDM5_POSTGRESQL_PASSWORD: ${{ secrets.CDM5_POSTGRESQL_PASSWORD }} CDM5_POSTGRESQL_SERVER: ${{ secrets.CDM5_POSTGRESQL_SERVER }} CDM5_POSTGRESQL_USER: ${{ secrets.CDM5_POSTGRESQL_USER }} - CDM5_SQL_SERVER_CDM_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_CDM_SCHEMA }} + CDM5_SQL_SERVER_CDM54_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_CDM54_SCHEMA }} CDM5_SQL_SERVER_OHDSI_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_OHDSI_SCHEMA }} CDM5_SQL_SERVER_PASSWORD: ${{ secrets.CDM5_SQL_SERVER_PASSWORD }} CDM5_SQL_SERVER_SERVER: ${{ secrets.CDM5_SQL_SERVER_SERVER }} CDM5_SQL_SERVER_USER: ${{ secrets.CDM5_SQL_SERVER_USER }} - CDM5_REDSHIFT_CDM_SCHEMA: ${{ secrets.CDM5_REDSHIFT_CDM_SCHEMA }} + CDM5_REDSHIFT_CDM54_SCHEMA: ${{ secrets.CDM5_REDSHIFT_CDM54_SCHEMA }} CDM5_REDSHIFT_OHDSI_SCHEMA: ${{ secrets.CDM5_REDSHIFT_OHDSI_SCHEMA }} CDM5_REDSHIFT_PASSWORD: ${{ secrets.CDM5_REDSHIFT_PASSWORD }} CDM5_REDSHIFT_SERVER: ${{ secrets.CDM5_REDSHIFT_SERVER }} diff --git a/.github/workflows/R_CMD_check_main_weekly.yaml b/.github/workflows/R_CMD_check_main_weekly.yaml index 6919051d..612a6414 100644 --- a/.github/workflows/R_CMD_check_main_weekly.yaml +++ b/.github/workflows/R_CMD_check_main_weekly.yaml @@ -20,22 +20,22 @@ jobs: GITHUB_PAT: ${{ secrets.GH_TOKEN }} R_REMOTES_NO_ERRORS_FROM_WARNINGS: true RSPM: ${{ matrix.config.rspm }} - CDM5_ORACLE_CDM_SCHEMA: ${{ secrets.CDM5_ORACLE_CDM_SCHEMA }} + CDM5_ORACLE_CDM54_SCHEMA: ${{ secrets.CDM5_ORACLE_CDM54_SCHEMA }} CDM5_ORACLE_OHDSI_SCHEMA: ${{ secrets.CDM5_ORACLE_OHDSI_SCHEMA }} CDM5_ORACLE_PASSWORD: ${{ secrets.CDM5_ORACLE_PASSWORD }} CDM5_ORACLE_SERVER: ${{ secrets.CDM5_ORACLE_SERVER }} CDM5_ORACLE_USER: ${{ secrets.CDM5_ORACLE_USER }} - CDM5_POSTGRESQL_CDM_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_CDM_SCHEMA }} + CDM5_POSTGRESQL_CDM54_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_CDM54_SCHEMA }} CDM5_POSTGRESQL_OHDSI_SCHEMA: ${{ secrets.CDM5_POSTGRESQL_OHDSI_SCHEMA }} CDM5_POSTGRESQL_PASSWORD: ${{ secrets.CDM5_POSTGRESQL_PASSWORD }} CDM5_POSTGRESQL_SERVER: ${{ secrets.CDM5_POSTGRESQL_SERVER }} CDM5_POSTGRESQL_USER: ${{ secrets.CDM5_POSTGRESQL_USER }} - CDM5_SQL_SERVER_CDM_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_CDM_SCHEMA }} + CDM5_SQL_SERVER_CDM54_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_CDM54_SCHEMA }} CDM5_SQL_SERVER_OHDSI_SCHEMA: ${{ secrets.CDM5_SQL_SERVER_OHDSI_SCHEMA }} CDM5_SQL_SERVER_PASSWORD: ${{ secrets.CDM5_SQL_SERVER_PASSWORD }} CDM5_SQL_SERVER_SERVER: ${{ secrets.CDM5_SQL_SERVER_SERVER }} CDM5_SQL_SERVER_USER: ${{ secrets.CDM5_SQL_SERVER_USER }} - CDM5_REDSHIFT_CDM_SCHEMA: ${{ secrets.CDM5_REDSHIFT_CDM_SCHEMA }} + CDM5_REDSHIFT_CDM54_SCHEMA: ${{ secrets.CDM5_REDSHIFT_CDM54_SCHEMA }} CDM5_REDSHIFT_OHDSI_SCHEMA: ${{ secrets.CDM5_REDSHIFT_OHDSI_SCHEMA }} CDM5_REDSHIFT_PASSWORD: ${{ secrets.CDM5_REDSHIFT_PASSWORD }} CDM5_REDSHIFT_SERVER: ${{ secrets.CDM5_REDSHIFT_SERVER }} diff --git a/tests/testthat/test-BatchProcess.R b/tests/testthat/test-BatchProcess.R index e80abfae..63b12e84 100644 --- a/tests/testthat/test-BatchProcess.R +++ b/tests/testthat/test-BatchProcess.R @@ -32,7 +32,7 @@ test_that("renderTranslateQueryApplyBatched works", { password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), server = Sys.getenv("CDM5_ORACLE_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" data <- renderTranslateQueryApplyBatched(connection, sql, @@ -52,7 +52,7 @@ test_that("renderTranslateQueryApplyBatched works", { password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" data <- renderTranslateQueryApplyBatched(connection, @@ -73,7 +73,7 @@ test_that("renderTranslateQueryApplyBatched works", { password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" data <- renderTranslateQueryApplyBatched(connection, diff --git a/tests/testthat/test-dataHash.R b/tests/testthat/test-dataHash.R index eb94709f..12501193 100644 --- a/tests/testthat/test-dataHash.R +++ b/tests/testthat/test-dataHash.R @@ -22,7 +22,7 @@ test_that("Compute data hash", { server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA")) + hash <- computeDataHash(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) expect_true(is.character(hash)) disconnect(connection) @@ -35,7 +35,7 @@ test_that("Compute data hash", { server = Sys.getenv("CDM5_ORACLE_SERVER") ) connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_ORACLE_CDM_SCHEMA")) + hash <- computeDataHash(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA")) expect_true(is.character(hash)) disconnect(connection) @@ -48,7 +48,7 @@ test_that("Compute data hash", { server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA")) + hash <- computeDataHash(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) expect_true(is.character(hash)) disconnect(connection) diff --git a/tests/testthat/test-dbplyr.R b/tests/testthat/test-dbplyr.R index f7705069..8f1a4863 100644 --- a/tests/testthat/test-dbplyr.R +++ b/tests/testthat/test-dbplyr.R @@ -22,7 +22,7 @@ test_that("Test dbplyr on SQL Server", { password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) }) @@ -34,7 +34,7 @@ test_that("Test dbplyr on Oracle", { password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), server = Sys.getenv("CDM5_ORACLE_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") options(sqlRenderTempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA")) testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) }) @@ -47,7 +47,7 @@ test_that("Test dbplyr on RedShift", { password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) }) diff --git a/tests/testthat/test-fetchResults.R b/tests/testthat/test-fetchResults.R index 6127b4a1..0f9039db 100644 --- a/tests/testthat/test-fetchResults.R +++ b/tests/testthat/test-fetchResults.R @@ -47,20 +47,20 @@ test_that("Fetch results", { password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) # Fetch data.frame: count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 71) + expect_equal(count[1, 1], 58) count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 71) + expect_equal(count[1, 1], 58) # Fetch Andromeda: andromeda <- Andromeda::andromeda() querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 71) + expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) renderTranslateQuerySqlToAndromeda(connection, sql, cdm_database_schema = cdmDatabaseSchema, @@ -68,7 +68,7 @@ test_that("Fetch results", { andromedaTableName = "test2", snakeCaseToCamelCase = TRUE ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 71) + expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) Andromeda::close(andromeda) disconnect(connection) @@ -80,7 +80,7 @@ test_that("Fetch results", { password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), server = Sys.getenv("CDM5_ORACLE_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) @@ -119,14 +119,14 @@ test_that("Fetch results", { # Fetch data.frame: count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 71) + expect_equal(count[1, 1], 58) count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 71) + expect_equal(count[1, 1], 58) # Fetch Andromeda: andromeda <- Andromeda::andromeda() querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 71) + expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) renderTranslateQuerySqlToAndromeda(connection, sql, cdm_database_schema = cdmDatabaseSchema, @@ -134,7 +134,7 @@ test_that("Fetch results", { andromedaTableName = "test2", snakeCaseToCamelCase = TRUE ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 71) + expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) Andromeda::close(andromeda) disconnect(connection) @@ -146,20 +146,20 @@ test_that("Fetch results", { password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) # Fetch data.frame: count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 91) + expect_equal(count[1, 1], 58) count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 91) + expect_equal(count[1, 1], 58) # Fetch Andromeda: andromeda <- Andromeda::andromeda() querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 91) + expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) renderTranslateQuerySqlToAndromeda(connection, sql, cdm_database_schema = cdmDatabaseSchema, @@ -167,7 +167,7 @@ test_that("Fetch results", { andromedaTableName = "test2", snakeCaseToCamelCase = TRUE ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 91) + expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) Andromeda::close(andromeda) disconnect(connection) @@ -233,7 +233,7 @@ test_that("dbFetch works", { password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), server = Sys.getenv("CDM5_ORACLE_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") sql <- "SELECT * FROM @cdm_database_schema.vocabulary FETCH FIRST 10 ROWS ONLY" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) @@ -251,7 +251,7 @@ test_that("dbFetch works", { password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) @@ -269,7 +269,7 @@ test_that("dbFetch works", { password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA") + cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary" renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) diff --git a/tests/testthat/test-getTableNames.R b/tests/testthat/test-getTableNames.R index 215b885d..5c0e11fe 100644 --- a/tests/testthat/test-getTableNames.R +++ b/tests/testthat/test-getTableNames.R @@ -23,9 +23,9 @@ test_that("Get table names", { server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), "person")) # This does not work on SQL Server: # expect_true(DBI::dbExistsTable(connection, "person")) disconnect(connection) @@ -38,9 +38,9 @@ test_that("Get table names", { server = Sys.getenv("CDM5_ORACLE_SERVER") ) connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_ORACLE_CDM_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_ORACLE_CDM_SCHEMA"), "person")) + tables <- getTableNames(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA")) + expect_true("person" %in% tables) + expect_true(existsTable(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), "person")) expect_true(DBI::dbExistsTable(connection, "person")) disconnect(connection) @@ -67,9 +67,9 @@ test_that("Get table names", { server = Sys.getenv("CDM5_REDSHIFT_SERVER") ) connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA"), "person")) expect_true(DBI::dbExistsTable(connection, "person")) disconnect(connection) @@ -118,9 +118,9 @@ test_that("Get table names using DBI drivers", { PWD = Sys.getenv("CDM5_SQL_SERVER_PASSWORD"), TrustServerCertificate = "yes", Port = 1433) - tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), "person")) DBI::dbDisconnect(connection) # Sqlite -------------------------------------------------- @@ -152,8 +152,8 @@ test_that("Get table names using DBI drivers", { user = Sys.getenv("CDM5_REDSHIFT_USER"), password = Sys.getenv("CDM5_REDSHIFT_PASSWORD")) - tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA")) + tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM_SCHEMA"), "person")) + expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA"), "person")) DBI::dbDisconnect(connection) }) From 28258b398a366281b2b24f6090c628b82bb3cef9 Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Mon, 18 Sep 2023 07:07:56 -0400 Subject: [PATCH 04/28] Adding code to /extras for copying test database from one server to another --- extras/UploadDataToTestServer.R | 93 ++++++++++++++++++++++++++++++ extras/UploadEunomiaToTestServer.R | 40 ------------- 2 files changed, 93 insertions(+), 40 deletions(-) create mode 100644 extras/UploadDataToTestServer.R delete mode 100644 extras/UploadEunomiaToTestServer.R diff --git a/extras/UploadDataToTestServer.R b/extras/UploadDataToTestServer.R new file mode 100644 index 00000000..ffa8305c --- /dev/null +++ b/extras/UploadDataToTestServer.R @@ -0,0 +1,93 @@ +# Copy Eunomia to a test server ------------------------------------------------ + +# Assumes connectionDetails points to the test server to upload to +databaseSchema <- "eunomia" + +library(DatabaseConnector) + + +connection <- connect(connectionDetails) +renderTranslateExecuteSql( + connection = connection, + sql = "CREATE SCHEMA @database_schema;", + database_schema = databaseSchema +) + +eunomiaCd <- Eunomia::getEunomiaConnectionDetails() +eunomiaConn <- connect(eunomiaCd) + +tableNames <- getTableNames(eunomiaConn, "main") +for (i in seq_along(tableNames)) { + # for (i in 15:length(tableNames)) { + message(sprintf("Copying table %s", tableNames[i])) + table <- renderTranslateQuerySql( + connection = eunomiaConn, + sql = "SELECT * FROM main.@table_name;", + table_name = tableNames[i]) + if (tableNames[i] == "cost") { + colnames(table)[colnames(table) == "REVEUE_CODE_SOURCE_VALUE"] <- "REVENUE_CODE_SOURCE_VALUE" + } + insertTable( + connection = connection, + databaseSchema = databaseSchema, + tableName = tableNames[i], + data = table, + dropTableIfExists = TRUE, + createTable = TRUE, + progressBar = TRUE + ) +} + +disconnect(connection) +disconnect(eunomiaConn) + +# Copy data from one test server to another ------------------------------------ + +library(DatabaseConnector) +options(andromedaTempFolder = "d:/andromedaTemp") + +fromConnection <- connect( + dbms = "sql server", + user = Sys.getenv("CDM5_SQL_SERVER_USER"), + password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), + server = Sys.getenv("CDM5_SQL_SERVER_SERVER") +) +fromDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") + +toConnection <- connect( + dbms = "postgresql", + user = Sys.getenv("CDM5_POSTGRESQL_USER"), + password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), + server = Sys.getenv("CDM5_POSTGRESQL_SERVER") +) +toDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") + +tableNames <- getTableNames(fromConnection, fromDatabaseSchema) +for (i in seq_along(tableNames)) { + # for (i in 15:length(tableNames)) { + message(sprintf("Copying table %s", tableNames[i])) + andromeda <- Andromeda::andromeda() + renderTranslateQuerySqlToAndromeda( + connection = fromConnection, + sql = "SELECT * FROM @database_schema.@table_name;", + andromeda = andromeda, + andromedaTableName = tableNames[i], + database_schema = fromDatabaseSchema, + table_name = tableNames[i]) + insertTable( + connection = toConnection, + databaseSchema = toDatabaseSchema, + tableName = tableNames[i], + data = andromeda[[tableNames[i]]], + dropTableIfExists = TRUE, + createTable = TRUE, + progressBar = TRUE + ) + # querySql(toConnection, "SELECT * FROM cdmv5.condition_era LIMIT 10;") + Andromeda::close(andromeda) +} +toTableNames <- getTableNames(toConnection, toDatabaseSchema) +disconnect(fromConnection) +disconnect(toConnection) + + diff --git a/extras/UploadEunomiaToTestServer.R b/extras/UploadEunomiaToTestServer.R deleted file mode 100644 index de3a1c9a..00000000 --- a/extras/UploadEunomiaToTestServer.R +++ /dev/null @@ -1,40 +0,0 @@ -# Assumes connectionDetails points to the test server to upload to -databaseSchema <- "eunomia" - -library(DatabaseConnector) - - -connection <- connect(connectionDetails) -renderTranslateExecuteSql( - connection = connection, - sql = "CREATE SCHEMA @database_schema;", - database_schema = databaseSchema -) - -eunomiaCd <- Eunomia::getEunomiaConnectionDetails() -eunomiaConn <- connect(eunomiaCd) - -tableNames <- getTableNames(eunomiaConn, "main") -for (i in seq_along(tableNames)) { - # for (i in 15:length(tableNames)) { - message(sprintf("Copying table %s", tableNames[i])) - table <- renderTranslateQuerySql( - connection = eunomiaConn, - sql = "SELECT * FROM main.@table_name;", - table_name = tableNames[i]) - if (tableNames[i] == "cost") { - colnames(table)[colnames(table) == "REVEUE_CODE_SOURCE_VALUE"] <- "REVENUE_CODE_SOURCE_VALUE" - } - insertTable( - connection = connection, - databaseSchema = databaseSchema, - tableName = tableNames[i], - data = table, - dropTableIfExists = TRUE, - createTable = TRUE, - progressBar = TRUE - ) -} - -disconnect(connection) -disconnect(eunomiaConn) From fdadefc8d5289b58fe0fa6fdd2bf85ee1dbd6a7b Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Mon, 18 Sep 2023 09:10:39 -0400 Subject: [PATCH 05/28] Adding unit tests for Snowflake --- DESCRIPTION | 4 +- extras/UploadDataToTestServer.R | 2 +- ...aseConnectorConnection-character-method.Rd | 1 + ...esult-DatabaseConnectorDbiResult-method.Rd | 1 + ...sult-DatabaseConnectorJdbcResult-method.Rd | 1 + ...nInfo-DatabaseConnectorDbiResult-method.Rd | 1 + ...Info-DatabaseConnectorJdbcResult-method.Rd | 1 + ...able-DatabaseConnectorConnection-method.Rd | 1 + ...nect-DatabaseConnectorConnection-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...Fetch-DatabaseConnectorDbiResult-method.Rd | 1 + ...etch-DatabaseConnectorJdbcResult-method.Rd | 1 + ...Info-DatabaseConnectorConnection-method.Rd | 1 + ...bGetInfo-DatabaseConnectorDriver-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...Count-DatabaseConnectorDbiResult-method.Rd | 1 + ...ount-DatabaseConnectorJdbcResult-method.Rd | 1 + ...ected-DatabaseConnectorDbiResult-method.Rd | 1 + ...cted-DatabaseConnectorJdbcResult-method.Rd | 1 + ...ement-DatabaseConnectorDbiResult-method.Rd | 1 + ...ment-DatabaseConnectorJdbcResult-method.Rd | 1 + ...leted-DatabaseConnectorDbiResult-method.Rd | 1 + ...eted-DatabaseConnectorJdbcResult-method.Rd | 1 + ...d-DatabaseConnectorDbiConnection-method.Rd | 1 + ...-DatabaseConnectorJdbcConnection-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...bles-DatabaseConnectorConnection-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...-DatabaseConnectorConnection-ANY-method.Rd | 1 + ...ConnectorDbiConnection-character-method.Rd | 1 + ...onnectorJdbcConnection-character-method.Rd | 1 + ...aseConnectorConnection-character-method.Rd | 1 + ...-DatabaseConnectorConnection-ANY-method.Rd | 1 + tests/testthat/dbplyrTestFunction.R | 4 +- tests/testthat/test-BatchProcess.R | 22 +++++++++++ tests/testthat/test-connection.R | 22 +++++------ tests/testthat/test-dataHash.R | 13 +++++++ tests/testthat/test-dbplyr.R | 13 +++++++ tests/testthat/test-fetchResults.R | 33 ++++++++++++++++ tests/testthat/test-getTableNames.R | 14 +++++++ tests/testthat/test-insertTable.R | 39 +++++++++++++++++++ tests/testthat/test-sendUpdates.R | 21 ++++++++++ 43 files changed, 204 insertions(+), 15 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c32ef04a..dba9cd2b 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,7 +20,7 @@ Depends: R (>= 4.0.0) Imports: rJava, - SqlRender (>= 1.15.2), + SqlRender (>= 1.16.0), methods, stringr, readr, @@ -49,6 +49,8 @@ Suggests: duckdb, pool, ParallelLogger +Remotes: + ohdsi/SqlRender@develop License: Apache License VignetteBuilder: knitr URL: https://ohdsi.github.io/DatabaseConnector/, https://github.com/OHDSI/DatabaseConnector diff --git a/extras/UploadDataToTestServer.R b/extras/UploadDataToTestServer.R index ffa8305c..4a64887e 100644 --- a/extras/UploadDataToTestServer.R +++ b/extras/UploadDataToTestServer.R @@ -52,7 +52,7 @@ fromConnection <- connect( password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), server = Sys.getenv("CDM5_SQL_SERVER_SERVER") ) -fromDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM_SCHEMA") +fromDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") toConnection <- connect( dbms = "postgresql", diff --git a/man/dbAppendTable-DatabaseConnectorConnection-character-method.Rd b/man/dbAppendTable-DatabaseConnectorConnection-character-method.Rd index 24baee71..8b0104f1 100644 --- a/man/dbAppendTable-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbAppendTable-DatabaseConnectorConnection-character-method.Rd @@ -63,6 +63,7 @@ as a placeholder for prepared queries can override \code{\link[DBI:sqlAppendTabl Other backends (with different placeholders or with entirely different ways to create tables) need to override the \code{dbAppendTable()} method. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbAppendTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbClearResult-DatabaseConnectorDbiResult-method.Rd b/man/dbClearResult-DatabaseConnectorDbiResult-method.Rd index 8632febb..3bbc8955 100644 --- a/man/dbClearResult-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbClearResult-DatabaseConnectorDbiResult-method.Rd @@ -21,6 +21,7 @@ Frees all resources (local and remote) associated with a result set. This step is mandatory for all objects obtained by calling \code{\link[DBI:dbSendQuery]{dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbClearResult")} } \seealso{ Other DBIResult generics: diff --git a/man/dbClearResult-DatabaseConnectorJdbcResult-method.Rd b/man/dbClearResult-DatabaseConnectorJdbcResult-method.Rd index c3d761ad..2571e59b 100644 --- a/man/dbClearResult-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbClearResult-DatabaseConnectorJdbcResult-method.Rd @@ -21,6 +21,7 @@ Frees all resources (local and remote) associated with a result set. This step is mandatory for all objects obtained by calling \code{\link[DBI:dbSendQuery]{dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbClearResult")} } \seealso{ Other DBIResult generics: diff --git a/man/dbColumnInfo-DatabaseConnectorDbiResult-method.Rd b/man/dbColumnInfo-DatabaseConnectorDbiResult-method.Rd index a72c0c80..79efa9b0 100644 --- a/man/dbColumnInfo-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbColumnInfo-DatabaseConnectorDbiResult-method.Rd @@ -28,6 +28,7 @@ should have as many rows as there are output fields in the result set, and each column in the data.frame describes an aspect of the result set field (field name, type, etc.) +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbColumnInfo")} } \seealso{ Other DBIResult generics: diff --git a/man/dbColumnInfo-DatabaseConnectorJdbcResult-method.Rd b/man/dbColumnInfo-DatabaseConnectorJdbcResult-method.Rd index b1cf575b..5c4e48d7 100644 --- a/man/dbColumnInfo-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbColumnInfo-DatabaseConnectorJdbcResult-method.Rd @@ -28,6 +28,7 @@ should have as many rows as there are output fields in the result set, and each column in the data.frame describes an aspect of the result set field (field name, type, etc.) +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbColumnInfo")} } \seealso{ Other DBIResult generics: diff --git a/man/dbCreateTable-DatabaseConnectorConnection-method.Rd b/man/dbCreateTable-DatabaseConnectorConnection-method.Rd index 788fa407..773cceab 100644 --- a/man/dbCreateTable-DatabaseConnectorConnection-method.Rd +++ b/man/dbCreateTable-DatabaseConnectorConnection-method.Rd @@ -64,6 +64,7 @@ Backends with a different SQL syntax can override \code{sqlCreateTable()}, backends with entirely different ways to create tables need to override this method. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbCreateTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbDisconnect-DatabaseConnectorConnection-method.Rd b/man/dbDisconnect-DatabaseConnectorConnection-method.Rd index ae801cbc..a4bb2620 100644 --- a/man/dbDisconnect-DatabaseConnectorConnection-method.Rd +++ b/man/dbDisconnect-DatabaseConnectorConnection-method.Rd @@ -17,6 +17,7 @@ This closes the connection, discards all pending work, and frees resources (e.g., memory, sockets). +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbDisconnect")} } \seealso{ Other DBIConnection generics: diff --git a/man/dbExecute-DatabaseConnectorConnection-character-method.Rd b/man/dbExecute-DatabaseConnectorConnection-character-method.Rd index a49460d7..b84f2b09 100644 --- a/man/dbExecute-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbExecute-DatabaseConnectorConnection-character-method.Rd @@ -32,6 +32,7 @@ the result is always free-d by \code{\link[DBI:dbClearResult]{dbClearResult()}}. For passing query parameters, see \code{\link[DBI:dbBind]{dbBind()}}, in particular the "The command execution flow" section. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbExecute")} } \details{ You can also use \code{dbExecute()} to call a stored procedure diff --git a/man/dbExistsTable-DatabaseConnectorConnection-character-method.Rd b/man/dbExistsTable-DatabaseConnectorConnection-character-method.Rd index ac15c20a..7e102d11 100644 --- a/man/dbExistsTable-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbExistsTable-DatabaseConnectorConnection-character-method.Rd @@ -33,6 +33,7 @@ This includes temporary tables if supported by the database. \description{ Returns if a table given by name exists in the database. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbExistsTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbFetch-DatabaseConnectorDbiResult-method.Rd b/man/dbFetch-DatabaseConnectorDbiResult-method.Rd index 0da6ef19..331c3d03 100644 --- a/man/dbFetch-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbFetch-DatabaseConnectorDbiResult-method.Rd @@ -29,6 +29,7 @@ or zero rows. Fetch the next \code{n} elements (rows) from the result set and return them as a data.frame. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbFetch")} } \details{ \code{fetch()} is provided for compatibility with older DBI clients - for all diff --git a/man/dbFetch-DatabaseConnectorJdbcResult-method.Rd b/man/dbFetch-DatabaseConnectorJdbcResult-method.Rd index a829fb4a..b192321e 100644 --- a/man/dbFetch-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbFetch-DatabaseConnectorJdbcResult-method.Rd @@ -29,6 +29,7 @@ or zero rows. Fetch the next \code{n} elements (rows) from the result set and return them as a data.frame. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbFetch")} } \details{ \code{fetch()} is provided for compatibility with older DBI clients - for all diff --git a/man/dbGetInfo-DatabaseConnectorConnection-method.Rd b/man/dbGetInfo-DatabaseConnectorConnection-method.Rd index a6b3833a..45bfb34b 100644 --- a/man/dbGetInfo-DatabaseConnectorConnection-method.Rd +++ b/man/dbGetInfo-DatabaseConnectorConnection-method.Rd @@ -54,6 +54,7 @@ as returned by \code{\link[DBI:dbHasCompleted]{dbHasCompleted()}}. Retrieves information on objects of class \linkS4class{DBIDriver}, \linkS4class{DBIConnection} or \linkS4class{DBIResult}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetInfo")} } \seealso{ Other DBIDriver generics: diff --git a/man/dbGetInfo-DatabaseConnectorDriver-method.Rd b/man/dbGetInfo-DatabaseConnectorDriver-method.Rd index 9f29460a..97c77c64 100644 --- a/man/dbGetInfo-DatabaseConnectorDriver-method.Rd +++ b/man/dbGetInfo-DatabaseConnectorDriver-method.Rd @@ -54,6 +54,7 @@ as returned by \code{\link[DBI:dbHasCompleted]{dbHasCompleted()}}. Retrieves information on objects of class \linkS4class{DBIDriver}, \linkS4class{DBIConnection} or \linkS4class{DBIResult}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetInfo")} } \seealso{ Other DBIDriver generics: diff --git a/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd b/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd index 88e29a6a..c4856336 100644 --- a/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbGetQuery-DatabaseConnectorConnection-character-method.Rd @@ -33,6 +33,7 @@ the result is always free-d by \code{\link[DBI:dbClearResult]{dbClearResult()}}. For retrieving chunked/paged results or for passing query parameters, see \code{\link[DBI:dbSendQuery]{dbSendQuery()}}, in particular the "The data retrieval flow" section. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetQuery")} } \details{ This method is for \code{SELECT} queries only diff --git a/man/dbGetRowCount-DatabaseConnectorDbiResult-method.Rd b/man/dbGetRowCount-DatabaseConnectorDbiResult-method.Rd index 66714830..2a8682a3 100644 --- a/man/dbGetRowCount-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbGetRowCount-DatabaseConnectorDbiResult-method.Rd @@ -33,6 +33,7 @@ and after calling \code{dbFetch()}. Returns the total number of rows actually fetched with calls to \code{\link[DBI:dbFetch]{dbFetch()}} for this result set. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowCount")} } \seealso{ Other DBIResult generics: diff --git a/man/dbGetRowCount-DatabaseConnectorJdbcResult-method.Rd b/man/dbGetRowCount-DatabaseConnectorJdbcResult-method.Rd index cfac98ca..d829f8b4 100644 --- a/man/dbGetRowCount-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbGetRowCount-DatabaseConnectorJdbcResult-method.Rd @@ -33,6 +33,7 @@ and after calling \code{dbFetch()}. Returns the total number of rows actually fetched with calls to \code{\link[DBI:dbFetch]{dbFetch()}} for this result set. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowCount")} } \seealso{ Other DBIResult generics: diff --git a/man/dbGetRowsAffected-DatabaseConnectorDbiResult-method.Rd b/man/dbGetRowsAffected-DatabaseConnectorDbiResult-method.Rd index e655d81b..4b3eac6e 100644 --- a/man/dbGetRowsAffected-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbGetRowsAffected-DatabaseConnectorDbiResult-method.Rd @@ -25,6 +25,7 @@ and after the call to \code{dbFetch()}. This method returns the number of rows that were added, deleted, or updated by a data manipulation statement. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowsAffected")} } \seealso{ Other DBIResult generics: diff --git a/man/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.Rd b/man/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.Rd index 6e6a6a67..bbe60fa5 100644 --- a/man/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.Rd @@ -25,6 +25,7 @@ and after the call to \code{dbFetch()}. This method returns the number of rows that were added, deleted, or updated by a data manipulation statement. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetRowsAffected")} } \seealso{ Other DBIResult generics: diff --git a/man/dbGetStatement-DatabaseConnectorDbiResult-method.Rd b/man/dbGetStatement-DatabaseConnectorDbiResult-method.Rd index b99830f1..e4a9b8a7 100644 --- a/man/dbGetStatement-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbGetStatement-DatabaseConnectorDbiResult-method.Rd @@ -20,6 +20,7 @@ or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. Returns the statement that was passed to \code{\link[DBI:dbSendQuery]{dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetStatement")} } \seealso{ Other DBIResult generics: diff --git a/man/dbGetStatement-DatabaseConnectorJdbcResult-method.Rd b/man/dbGetStatement-DatabaseConnectorJdbcResult-method.Rd index 464874cb..0ef6bb43 100644 --- a/man/dbGetStatement-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbGetStatement-DatabaseConnectorJdbcResult-method.Rd @@ -20,6 +20,7 @@ or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. Returns the statement that was passed to \code{\link[DBI:dbSendQuery]{dbSendQuery()}} or \code{\link[DBI:dbSendStatement]{dbSendStatement()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbGetStatement")} } \seealso{ Other DBIResult generics: diff --git a/man/dbHasCompleted-DatabaseConnectorDbiResult-method.Rd b/man/dbHasCompleted-DatabaseConnectorDbiResult-method.Rd index 8a0988ee..c359f5aa 100644 --- a/man/dbHasCompleted-DatabaseConnectorDbiResult-method.Rd +++ b/man/dbHasCompleted-DatabaseConnectorDbiResult-method.Rd @@ -24,6 +24,7 @@ This method returns if the operation has completed. A \code{SELECT} query is completed if all rows have been fetched. A data manipulation statement is always completed. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbHasCompleted")} } \seealso{ Other DBIResult generics: diff --git a/man/dbHasCompleted-DatabaseConnectorJdbcResult-method.Rd b/man/dbHasCompleted-DatabaseConnectorJdbcResult-method.Rd index c2db6f96..d2e4b702 100644 --- a/man/dbHasCompleted-DatabaseConnectorJdbcResult-method.Rd +++ b/man/dbHasCompleted-DatabaseConnectorJdbcResult-method.Rd @@ -24,6 +24,7 @@ This method returns if the operation has completed. A \code{SELECT} query is completed if all rows have been fetched. A data manipulation statement is always completed. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbHasCompleted")} } \seealso{ Other DBIResult generics: diff --git a/man/dbIsValid-DatabaseConnectorDbiConnection-method.Rd b/man/dbIsValid-DatabaseConnectorDbiConnection-method.Rd index 3179faec..36f2adcf 100644 --- a/man/dbIsValid-DatabaseConnectorDbiConnection-method.Rd +++ b/man/dbIsValid-DatabaseConnectorDbiConnection-method.Rd @@ -35,6 +35,7 @@ connectivity problems, server failure, etc.), \code{dbIsValid()} should return This generic tests whether a database object is still valid (i.e. it hasn't been disconnected or cleared). +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbIsValid")} } \seealso{ Other DBIDriver generics: diff --git a/man/dbIsValid-DatabaseConnectorJdbcConnection-method.Rd b/man/dbIsValid-DatabaseConnectorJdbcConnection-method.Rd index 380a3da0..6fdab4d5 100644 --- a/man/dbIsValid-DatabaseConnectorJdbcConnection-method.Rd +++ b/man/dbIsValid-DatabaseConnectorJdbcConnection-method.Rd @@ -35,6 +35,7 @@ connectivity problems, server failure, etc.), \code{dbIsValid()} should return This generic tests whether a database object is still valid (i.e. it hasn't been disconnected or cleared). +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbIsValid")} } \seealso{ Other DBIDriver generics: diff --git a/man/dbListFields-DatabaseConnectorConnection-character-method.Rd b/man/dbListFields-DatabaseConnectorConnection-character-method.Rd index c05e345a..8f7ab093 100644 --- a/man/dbListFields-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbListFields-DatabaseConnectorConnection-character-method.Rd @@ -35,6 +35,7 @@ The returned names are suitable for quoting with \code{dbQuoteIdentifier()}. \description{ Returns the field names of a remote table as a character vector. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbListFields")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbListTables-DatabaseConnectorConnection-method.Rd b/man/dbListTables-DatabaseConnectorConnection-method.Rd index a8e3d7a1..c21cb8e2 100644 --- a/man/dbListTables-DatabaseConnectorConnection-method.Rd +++ b/man/dbListTables-DatabaseConnectorConnection-method.Rd @@ -35,6 +35,7 @@ connection. This should include views and temporary objects, but not all database backends (in particular \pkg{RMariaDB} and \pkg{RMySQL}) support this. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbListTables")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbReadTable-DatabaseConnectorConnection-character-method.Rd b/man/dbReadTable-DatabaseConnectorConnection-character-method.Rd index 9f621b1e..0362a755 100644 --- a/man/dbReadTable-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbReadTable-DatabaseConnectorConnection-character-method.Rd @@ -71,6 +71,7 @@ Reads a database table to a data frame, optionally converting a column to row names and converting the column names to valid R identifiers. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbReadTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbRemoveTable-DatabaseConnectorConnection-ANY-method.Rd b/man/dbRemoveTable-DatabaseConnectorConnection-ANY-method.Rd index 3659ef6e..5b4cef27 100644 --- a/man/dbRemoveTable-DatabaseConnectorConnection-ANY-method.Rd +++ b/man/dbRemoveTable-DatabaseConnectorConnection-ANY-method.Rd @@ -44,6 +44,7 @@ can be created.} Remove a remote table (e.g., created by \code{\link[DBI:dbWriteTable]{dbWriteTable()}}) from the database. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbRemoveTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd b/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd index f8f12694..147b9a1e 100644 --- a/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd +++ b/man/dbSendQuery-DatabaseConnectorDbiConnection-character-method.Rd @@ -31,6 +31,7 @@ then you must call \code{\link[DBI:dbClearResult]{dbClearResult()}} when you fin records you need. For interactive use, you should almost always prefer \code{\link[DBI:dbGetQuery]{dbGetQuery()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendQuery")} } \details{ This method is for \code{SELECT} queries only. Some backends may diff --git a/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd b/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd index eba179a3..03e2951f 100644 --- a/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd +++ b/man/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.Rd @@ -31,6 +31,7 @@ then you must call \code{\link[DBI:dbClearResult]{dbClearResult()}} when you fin records you need. For interactive use, you should almost always prefer \code{\link[DBI:dbGetQuery]{dbGetQuery()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendQuery")} } \details{ This method is for \code{SELECT} queries only. Some backends may diff --git a/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd b/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd index 4551ffe4..6f1b9e61 100644 --- a/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd +++ b/man/dbSendStatement-DatabaseConnectorConnection-character-method.Rd @@ -33,6 +33,7 @@ returned result object. You must also call \code{\link[DBI:dbClearResult]{dbCle that. For interactive use, you should almost always prefer \code{\link[DBI:dbExecute]{dbExecute()}}. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbSendStatement")} } \details{ \code{\link[DBI:dbSendStatement]{dbSendStatement()}} comes with a default implementation that simply diff --git a/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd b/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd index 8d8b6f25..a5874645 100644 --- a/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd +++ b/man/dbWriteTable-DatabaseConnectorConnection-ANY-method.Rd @@ -56,6 +56,7 @@ can be created.} Writes, overwrites or appends a data frame to a database table, optionally converting row names to a column and specifying SQL data types for fields. +\Sexpr[results=rd,stage=render]{DBI:::methods_as_rd("dbWriteTable")} } \details{ The \code{databaseSchema} argument is interpreted differently according to the different platforms: diff --git a/tests/testthat/dbplyrTestFunction.R b/tests/testthat/dbplyrTestFunction.R index c19aba4a..e97debdc 100644 --- a/tests/testthat/dbplyrTestFunction.R +++ b/tests/testthat/dbplyrTestFunction.R @@ -6,7 +6,8 @@ testDbplyrFunctions <- function(connectionDetails, cdmDatabaseSchema) { assertTempEmulationSchemaSet(connectionDetails$dbms) connection <- connect(connectionDetails) - on.exit(disconnect(connection)) + on.exit(dropEmulatedTempTables(connection)) + on.exit(disconnect(connection), add = TRUE) person <- tbl(connection, inDatabaseSchema(cdmDatabaseSchema, "person")) observationPeriod <- tbl(connection, inDatabaseSchema(cdmDatabaseSchema, "observation_period")) @@ -178,7 +179,6 @@ testDbplyrFunctions <- function(connectionDetails, cdmDatabaseSchema) { # names(dumbNameCars) <- c("Car speed", "Dist. to Stop") # copy_to(connection, dumbNameCars, name = "dn_cars") - dropEmulatedTempTables(connection) # disconnect(connection) invisible(NULL) } diff --git a/tests/testthat/test-BatchProcess.R b/tests/testthat/test-BatchProcess.R index 63b12e84..1929cb91 100644 --- a/tests/testthat/test-BatchProcess.R +++ b/tests/testthat/test-BatchProcess.R @@ -111,4 +111,26 @@ test_that("renderTranslateQueryApplyBatched works", { disconnect(connection) unlink(dbFile) + + # Snowflake -------------------------------------------------- + details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + connection <- connect(details) + cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") + + sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" + data <- renderTranslateQueryApplyBatched(connection, + sql, + fun, + args, + cdm_database_schema = cdmDatabaseSchema + ) + data <- do.call(rbind, data) + expect_true("test" %in% colnames(data)) + expect_true(all(data$test == "MY STRING")) + disconnect(connection) }) diff --git a/tests/testthat/test-connection.R b/tests/testthat/test-connection.R index 88fce758..2351cabb 100644 --- a/tests/testthat/test-connection.R +++ b/tests/testthat/test-connection.R @@ -253,17 +253,17 @@ test_that("Open and close connection using connection strings with separate user # expect_equal(dbms(connection), "spark") # expect_true(disconnect(connection)) - # Snowflake -------------------------------------------------- - # Disable Snowflake unit tests until we have a testing server - # details <- createConnectionDetails( - # dbms = "snowflake", - # connectionString = Sys.getenv("CDM5_SNOWFLAKE_CONNECTION_STRING"), - # user = Sys.getenv("CDM5_SNOWFLAKE_USER"), - # password = URLdecode(Sys.getenv("CDM5_SNOWFLAKE_PASSWORD")) - # ) - # connection <- connect(details) - # expect_true(inherits(connection, "DatabaseConnectorConnection")) - # expect_true(disconnect(connection)) + # Snowflake -------------------------------------------------- + details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + connection <- connect(details) + expect_true(inherits(connection, "DatabaseConnectorConnection")) + expect_equal(dbms(connection), "snowflake") + expect_true(disconnect(connection)) }) test_that("Error is thrown when using incorrect dbms argument", { diff --git a/tests/testthat/test-dataHash.R b/tests/testthat/test-dataHash.R index 12501193..746ee011 100644 --- a/tests/testthat/test-dataHash.R +++ b/tests/testthat/test-dataHash.R @@ -106,4 +106,17 @@ test_that("Compute data hash", { disconnect(connection) unlink(dbFile) + + # Snowflake ------------------------------------------------------------------ + details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + connection <- connect(details) + hash <- computeDataHash(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA")) + expect_true(is.character(hash)) + + disconnect(connection) }) diff --git a/tests/testthat/test-dbplyr.R b/tests/testthat/test-dbplyr.R index 8f1a4863..b47637f9 100644 --- a/tests/testthat/test-dbplyr.R +++ b/tests/testthat/test-dbplyr.R @@ -117,6 +117,19 @@ test_that("Test dbplyr on DuckDB", { unlink(databaseFile) }) +test_that("Test dbplyr on Snowflake", { + # Snowflake ---------------------------------------------- + connectionDetails <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") + options(sqlRenderTempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA")) + testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) +}) + test_that("Test dbplyr date functions on non-dbplyr data", { date <- c(as.Date("2000-02-01"), as.Date("2000-12-31"), as.Date("2000-01-31")) diff --git a/tests/testthat/test-fetchResults.R b/tests/testthat/test-fetchResults.R index 0f9039db..b3478f81 100644 --- a/tests/testthat/test-fetchResults.R +++ b/tests/testthat/test-fetchResults.R @@ -205,6 +205,39 @@ test_that("Fetch results", { disconnect(connection) unlink(databaseFile) + # Snowflake ---------------------------------------------- + connection <- connect( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") + sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" + renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) + + # Fetch data.frame: + count <- querySql(connection, renderedSql) + expect_equal(count[1, 1], 104) + count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) + expect_equal(count[1, 1], 104) + + # Fetch Andromeda: + andromeda <- Andromeda::andromeda() + querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) + expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 104) + renderTranslateQuerySqlToAndromeda(connection, + sql, + cdm_database_schema = cdmDatabaseSchema, + andromeda = andromeda, + andromedaTableName = "test2", + snakeCaseToCamelCase = TRUE + ) + expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 104) + Andromeda::close(andromeda) + + disconnect(connection) + }) test_that("dbFetch works", { diff --git a/tests/testthat/test-getTableNames.R b/tests/testthat/test-getTableNames.R index 5c0e11fe..374c16c5 100644 --- a/tests/testthat/test-getTableNames.R +++ b/tests/testthat/test-getTableNames.R @@ -87,6 +87,20 @@ test_that("Get table names", { expect_true(DBI::dbExistsTable(connection, "person")) disconnect(connection) unlink(dbFile) + + # Snowflake -------------------------------------------------- + details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + connection <- connect(details) + tables <- getTableNames(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA")) + expect_true("person" %in% tables) + expect_true(existsTable(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), "person")) + expect_true(DBI::dbExistsTable(connection, "person")) + disconnect(connection) }) test_that("Cleaning of database or schema name", { diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index 9f07df57..525aca6d 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -253,6 +253,45 @@ test_that("insertTable", { disconnect(connection) unlink(dbFile) + + + # Snowflake ----------------------------------------- + details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ) + schema <- Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") + connection <- connect(details) + insertTable( + connection = connection, + databaseSchema = schema, + tableName = "temp", + data = data, + createTable = TRUE, + tempTable = FALSE + ) + + # Check data on server is same as local + sql <- SqlRender::render("SELECT * FROM @schema.temp", schema = schema) + data2 <- querySql(connection, sql, integer64AsNumeric = FALSE) + names(data2) <- tolower(names(data2)) + data <- data[order(data$person_id), ] + data2 <- data2[order(data2$person_id), ] + row.names(data) <- NULL + row.names(data2) <- NULL + expect_equal(data, data2, check.attributes = FALSE) + + # Check data types + res <- dbSendQuery(connection, sprintf("SELECT * FROM %s.temp", schema)) + columnInfo <- dbColumnInfo(res) + dbClearResult(res) + expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMPNTZ", "NUMBER", "DOUBLE", "VARCHAR", "NUMBER")) + + dropEmulatedTempTables(connection) + + disconnect(connection) }) test_that("Test temp emulation helper functions", { diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index 5d6c7e6d..dde3238d 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -86,6 +86,27 @@ test_that("Send updates to server", { dbClearResult(rowsAffected) disconnect(connection) + + # Snowflake -------------------------------------------------- + details <- createConnectionDetails( + dbms = "redshift", + user = Sys.getenv("CDM5_REDSHIFT_USER"), + password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), + server = Sys.getenv("CDM5_REDSHIFT_SERVER") + ) + options(sqlRenderTempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA")) + connection <- connect(details) + + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) + + disconnect(connection) + }) test_that("Logging update times", { From 985df265146f946541bcdc7eab18892a784e31e8 Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Mon, 18 Sep 2023 09:26:12 -0400 Subject: [PATCH 06/28] Forgot to update GA with Snowflake secrets --- .github/workflows/R_CMD_check_Hades.yaml | 5 +++++ .github/workflows/R_CMD_check_main_weekly.yaml | 5 +++++ extras/UploadDataToTestServer.R | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index 64ac5a6e..3a2e6e29 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -48,6 +48,11 @@ jobs: CDM5_REDSHIFT_PASSWORD: ${{ secrets.CDM5_REDSHIFT_PASSWORD }} CDM5_REDSHIFT_SERVER: ${{ secrets.CDM5_REDSHIFT_SERVER }} CDM5_REDSHIFT_USER: ${{ secrets.CDM5_REDSHIFT_USER }} + CDM_SNOWFLAKE_CDM53_SCHEMA: ${{ secrets.CDM_SNOWFLAKE_CDM53_SCHEMA }} + CDM_SNOWFLAKE_OHDSI_SCHEMA: ${{ secrets.CDM_SNOWFLAKE_OHDSI_SCHEMA }} + CDM_SNOWFLAKE_PASSWORD: ${{ secrets.CDM_SNOWFLAKE_PASSWORD }} + CDM_SNOWFLAKE_CONNECTION_STRING: ${{ secrets.CDM_SNOWFLAKE_CONNECTION_STRING }} + CDM_SNOWFLAKE_USER: ${{ secrets.CDM_SNOWFLAKE_USER }} CDM5_SPARK_USER: ${{ secrets.CDM5_SPARK_USER }} CDM5_SPARK_PASSWORD: ${{ secrets.CDM5_SPARK_PASSWORD }} CDM5_SPARK_CONNECTION_STRING: ${{ secrets.CDM5_SPARK_CONNECTION_STRING }} diff --git a/.github/workflows/R_CMD_check_main_weekly.yaml b/.github/workflows/R_CMD_check_main_weekly.yaml index 612a6414..d7274aa4 100644 --- a/.github/workflows/R_CMD_check_main_weekly.yaml +++ b/.github/workflows/R_CMD_check_main_weekly.yaml @@ -40,6 +40,11 @@ jobs: CDM5_REDSHIFT_PASSWORD: ${{ secrets.CDM5_REDSHIFT_PASSWORD }} CDM5_REDSHIFT_SERVER: ${{ secrets.CDM5_REDSHIFT_SERVER }} CDM5_REDSHIFT_USER: ${{ secrets.CDM5_REDSHIFT_USER }} + CDM_SNOWFLAKE_CDM53_SCHEMA: ${{ secrets.CDM_SNOWFLAKE_CDM53_SCHEMA }} + CDM_SNOWFLAKE_OHDSI_SCHEMA: ${{ secrets.CDM_SNOWFLAKE_OHDSI_SCHEMA }} + CDM_SNOWFLAKE_PASSWORD: ${{ secrets.CDM_SNOWFLAKE_PASSWORD }} + CDM_SNOWFLAKE_CONNECTION_STRING: ${{ secrets.CDM_SNOWFLAKE_CONNECTION_STRING }} + CDM_SNOWFLAKE_USER: ${{ secrets.CDM_SNOWFLAKE_USER }} CDM5_SPARK_USER: ${{ secrets.CDM5_SPARK_USER }} CDM5_SPARK_PASSWORD: ${{ secrets.CDM5_SPARK_PASSWORD }} CDM5_SPARK_CONNECTION_STRING: ${{ secrets.CDM5_SPARK_CONNECTION_STRING }} diff --git a/extras/UploadDataToTestServer.R b/extras/UploadDataToTestServer.R index 4a64887e..976f6ae4 100644 --- a/extras/UploadDataToTestServer.R +++ b/extras/UploadDataToTestServer.R @@ -64,7 +64,7 @@ toDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") tableNames <- getTableNames(fromConnection, fromDatabaseSchema) for (i in seq_along(tableNames)) { - # for (i in 15:length(tableNames)) { + # for (i in 31:length(tableNames)) { message(sprintf("Copying table %s", tableNames[i])) andromeda <- Andromeda::andromeda() renderTranslateQuerySqlToAndromeda( From 7f49afe061a0a9101a964fe727fbba773a17c455 Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Mon, 18 Sep 2023 10:17:41 -0400 Subject: [PATCH 07/28] Fixing unit tests --- R/Connect.R | 17 +++++++++++++++++ tests/testthat/test-connection.R | 17 ----------------- tests/testthat/test-sendUpdates.R | 31 ++++++++++++++++++------------- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/R/Connect.R b/R/Connect.R index 97a61e56..91fda1ef 100644 --- a/R/Connect.R +++ b/R/Connect.R @@ -34,6 +34,12 @@ checkIfDbmsIsSupported <- function(dbms) { "synapse", "duckdb" ) + deprecated <- c( + "hive", + "impala", + "netezza", + "pdw" + ) if (!dbms %in% supportedDbmss) { abort(sprintf( "DBMS '%s' not supported. Please use one of these values: '%s'", @@ -41,6 +47,17 @@ checkIfDbmsIsSupported <- function(dbms) { paste(supportedDbmss, collapse = "', '") )) } + if (dbms %in% deprecated) { + warn(sprintf( + paste(c("DBMS '%s' has been deprecated. Current functionality is provided as is.", + "No futher support will be provided.", + "Please consider switching to a different database platform."), + collapse = " "), + dbms), + .frequency = "regularly", + .frequency_id = "deprecated_dbms" + ) + } } checkDetailValidation <- function(connectionDetails, name) { diff --git a/tests/testthat/test-connection.R b/tests/testthat/test-connection.R index 2351cabb..babb6a74 100644 --- a/tests/testthat/test-connection.R +++ b/tests/testthat/test-connection.R @@ -153,23 +153,6 @@ test_that("Open and close connection using connection strings with embedded user # connection <- connect(details) # expect_true(inherits(connection, "DatabaseConnectorConnection")) # expect_true(disconnect(connection)) - - # Snowflake -------------------------------------------------- - # Disable Snowflake unit tests until we have a testing server - # connectionString <- sprintf( - # "%s;UID=%s;PWD=%s", - # Sys.getenv("CDM5_SNOWFLAKE_CONNECTION_STRING"), - # Sys.getenv("CDM5_SNOWFLAKE_USER"), - # URLdecode(Sys.getenv("CDM5_SNOWFLAKE_PASSWORD")) - # ) - # - # details <- createConnectionDetails( - # dbms = "snowflake", - # connectionString = connectionString - # ) - # connection <- connect(details) - # expect_true(inherits(connection, "DatabaseConnectorConnection")) - # expect_true(disconnect(connection)) }) test_that("Open and close connection using connection strings with separate user and pw", { diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index dde3238d..7328a8cf 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -1,9 +1,9 @@ library(testthat) -if (DatabaseConnector:::is_installed("ParallelLogger")) { - logFileName <- tempfile(fileext = ".txt") - ParallelLogger::addDefaultFileLogger(logFileName, name = "TEST_LOGGER") -} +# if (DatabaseConnector:::is_installed("ParallelLogger")) { +# logFileName <- tempfile(fileext = ".txt") +# ParallelLogger::addDefaultFileLogger(logFileName, name = "TEST_LOGGER") +# } test_that("Send updates to server", { sql <- "CREATE TABLE #temp (x INT); @@ -56,6 +56,7 @@ test_that("Send updates to server", { password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), server = Sys.getenv("CDM5_ORACLE_SERVER") ) + options(sqlRenderTempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA")) connection <- connect(details) expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) @@ -65,6 +66,8 @@ test_that("Send updates to server", { rowsAffected <- dbSendStatement(connection, sql) expect_equal(dbGetRowsAffected(rowsAffected), 2) dbClearResult(rowsAffected) + + dropEmulatedTempTables(connection) disconnect(connection) @@ -105,16 +108,18 @@ test_that("Send updates to server", { expect_equal(dbGetRowsAffected(rowsAffected), 2) dbClearResult(rowsAffected) + dropEmulatedTempTables(connection) + disconnect(connection) }) -test_that("Logging update times", { - skip_if_not_installed("ParallelLogger") - log <- readLines(logFileName) - statementCount <- sum(grepl("Executing SQL:", log)) - expect_gt(statementCount, 19) - # writeLines(log) - ParallelLogger::unregisterLogger("TEST_LOGGER") - unlink(logFileName) -}) +# test_that("Logging update times", { +# skip_if_not_installed("ParallelLogger") +# log <- readLines(logFileName) +# statementCount <- sum(grepl("Executing SQL:", log)) +# expect_gt(statementCount, 19) +# # writeLines(log) +# ParallelLogger::unregisterLogger("TEST_LOGGER") +# unlink(logFileName) +# }) From 66c11320550ee66ca94fe8809bc8e32d6112814a Mon Sep 17 00:00:00 2001 From: Admin_mschuemi Date: Tue, 19 Sep 2023 10:15:12 -0400 Subject: [PATCH 08/28] Some more code to clean up garbage on testing servers --- extras/PackageMaintenance.R | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/extras/PackageMaintenance.R b/extras/PackageMaintenance.R index 95f6ae42..1470e15a 100644 --- a/extras/PackageMaintenance.R +++ b/extras/PackageMaintenance.R @@ -81,6 +81,13 @@ databaseSchema <- Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") tables <- getTableNames(connection, databaseSchema, cast = "none") sql <- paste(sprintf("DROP TABLE %s.%s;", databaseSchema, tables), collapse= "\n") executeSql(connection, sql) + +databaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") +tables <- getTableNames(connection, databaseSchema, cast = "none") +tables <- tables[grepl("", tables)] +sql <- paste(sprintf("DROP TABLE %s.%s;", databaseSchema, tables), collapse= "\n") +executeSql(connection, sql) + disconnect(connection) # Postgres From 339ddb7b58a08707f8ed8a0a0af2f81fecac6c28 Mon Sep 17 00:00:00 2001 From: schuemie Date: Wed, 11 Oct 2023 12:07:55 +0200 Subject: [PATCH 09/28] Fix date fields in test data --- extras/UploadDataToTestServer.R | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/extras/UploadDataToTestServer.R b/extras/UploadDataToTestServer.R index 976f6ae4..c0709e49 100644 --- a/extras/UploadDataToTestServer.R +++ b/extras/UploadDataToTestServer.R @@ -86,7 +86,31 @@ for (i in seq_along(tableNames)) { # querySql(toConnection, "SELECT * FROM cdmv5.condition_era LIMIT 10;") Andromeda::close(andromeda) } + + +# change timestamp fields to dates if needed: toTableNames <- getTableNames(toConnection, toDatabaseSchema) +for (i in seq_along(toTableNames)) { + tableName <- toTableNames[i] + row <- renderTranslateQuerySql(toConnection, + sql = "SELECT TOP 1 * FROM @schema.@table;", + schema = toDatabaseSchema, + table = tableName) + dateFieldIdx <- which(grepl("_DATE$", colnames(row))) + for (j in dateFieldIdx) { + if (!is(row[,j], "Date")) { + writeLines(sprintf("Incorrect type of field %s in table %s: %s", colnames(row)[j], tableName, class(row[,j])[1])) + sql <- "ALTER TABLE @schema.@table ALTER COLUMN @column TYPE date;" + renderTranslateExecuteSql(toConnection, + sql = sql, + schema = toDatabaseSchema, + table = tableName, + column = colnames(row)[j]) + } + } + +} + disconnect(fromConnection) disconnect(toConnection) From 20c66bda7b576902ac71937b7ebe57b60b7b2267 Mon Sep 17 00:00:00 2001 From: schuemie Date: Thu, 12 Oct 2023 08:51:51 -0400 Subject: [PATCH 10/28] Building indices on test server --- extras/UploadDataToTestServer.R | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/extras/UploadDataToTestServer.R b/extras/UploadDataToTestServer.R index c0709e49..6d53e37a 100644 --- a/extras/UploadDataToTestServer.R +++ b/extras/UploadDataToTestServer.R @@ -44,7 +44,7 @@ disconnect(eunomiaConn) # Copy data from one test server to another ------------------------------------ library(DatabaseConnector) -options(andromedaTempFolder = "d:/andromedaTemp") +options(andromedaTempFolder = "e:/andromedaTemp") fromConnection <- connect( dbms = "sql server", @@ -62,6 +62,15 @@ toConnection <- connect( ) toDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM_SCHEMA") +# toConnection <- connect( +# dbms = "postgresql", +# user = Sys.getenv("LOCAL_POSTGRES_USER"), +# password = Sys.getenv("LOCAL_POSTGRES_PASSWORD"), +# server = Sys.getenv("LOCAL_POSTGRES_SERVER") +# ) +# toDatabaseSchema <- Sys.getenv("LOCAL_POSTGRES_CDM_SCHEMA") + + tableNames <- getTableNames(fromConnection, fromDatabaseSchema) for (i in seq_along(tableNames)) { # for (i in 31:length(tableNames)) { @@ -108,9 +117,18 @@ for (i in seq_along(toTableNames)) { column = colnames(row)[j]) } } - } +# Create indices: +sql <- readLines("https://raw.githubusercontent.com/OHDSI/CommonDataModel/v5.4.0/inst/ddl/5.4/postgresql/OMOPCDM_postgresql_5.4_indices.sql") +sql <- sql[!grepl("note_nlp", sql)] + +renderTranslateExecuteSql( + connection = toConnection, + sql = paste(sql, collapse = "\n"), + cdmDatabaseSchema = toDatabaseSchema +) + disconnect(fromConnection) disconnect(toConnection) From 70ce98f1e8a3817064b96695fa6e8eb72d015498 Mon Sep 17 00:00:00 2001 From: egillax Date: Sun, 15 Oct 2023 14:20:02 +0200 Subject: [PATCH 11/28] add exception of pathtoDriver check for duckdb --- R/Drivers.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/Drivers.R b/R/Drivers.R index 485407a9..510a79a1 100644 --- a/R/Drivers.R +++ b/R/Drivers.R @@ -162,7 +162,7 @@ getJbcDriverSingleton <- function(driverClass = "", classPath = "") { } checkPathToDriver <- function(pathToDriver, dbms) { - if (!is.null(dbms) && dbms %in% c("sqlite", "sqlite extended")) { + if (!is.null(dbms) && dbms %in% c("sqlite", "sqlite extended", "duckdb")) { return() } if (pathToDriver == "") { From 57dbb721beacdd57af252884e895c5ebeed60439 Mon Sep 17 00:00:00 2001 From: egillax Date: Sun, 15 Oct 2023 14:21:21 +0200 Subject: [PATCH 12/28] add test for duckdb without specifying pathToDriver or JAR folder --- tests/testthat/test-duckdb.R | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/testthat/test-duckdb.R b/tests/testthat/test-duckdb.R index 5d958002..62dd602c 100644 --- a/tests/testthat/test-duckdb.R +++ b/tests/testthat/test-duckdb.R @@ -9,6 +9,20 @@ test_that("Open and close duckdb connection", { unlink(databaseFile) }) +test_that("Open and close duckdb without DATABASECONNECTOR_JAR_FOLDER", { + withr::with_envvar( + new=c("DATABASECONNECTOR_JAR_FOLDER"=""), + { + databaseFile <- tempfile() + connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) + expect_s4_class(connection, "DatabaseConnectorDbiConnection") + disconnect(connection) + unlink(databaseFile) + } + + ) +}) + test_that("Insert and retrieve dates from duckdb", { databaseFile <- tempfile() connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) From d3f7a8bc801da2f7e85c8824fe0c8de65c0cd763 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sat, 21 Oct 2023 13:30:01 -0400 Subject: [PATCH 13/28] Remove SqlRender from remotes --- DESCRIPTION | 2 -- 1 file changed, 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index dba9cd2b..76f1d2bb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -49,8 +49,6 @@ Suggests: duckdb, pool, ParallelLogger -Remotes: - ohdsi/SqlRender@develop License: Apache License VignetteBuilder: knitr URL: https://ohdsi.github.io/DatabaseConnector/, https://github.com/OHDSI/DatabaseConnector From 2b6e31c3d499419b2dad2cb2f17c5dc1bb5e9c8f Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sat, 21 Oct 2023 15:34:11 -0400 Subject: [PATCH 14/28] Trying test loops --- tests/testthat/setup.R | 218 ++++++++++++++++++++++- tests/testthat/test-BatchProcess.R | 161 +++-------------- tests/testthat/test-connection.R | 274 ++--------------------------- 3 files changed, 256 insertions(+), 397 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index bf1696c2..c66df0df 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -1,5 +1,5 @@ -# Download the JDBC drivers used in the tests - +library(DatabaseConnector) +# Download the JDBC drivers used in the tests ---------------------------------- if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { oldJarFolder <- Sys.getenv("DATABASECONNECTOR_JAR_FOLDER") Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = tempfile("jdbcDrivers")) @@ -10,12 +10,218 @@ if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { downloadJdbcDrivers("redshift") downloadJdbcDrivers("spark") downloadJdbcDrivers("snowflake") - - withr::defer( - { + + if (testthat::is_testing()) { + withr::defer({ unlink(Sys.getenv("DATABASECONNECTOR_JAR_FOLDER"), recursive = TRUE, force = TRUE) Sys.setenv("DATABASECONNECTOR_JAR_FOLDER" = oldJarFolder) }, testthat::teardown_env() - ) + ) + } } + +# Create a list with testing server details ------------------------------ +testServers <- list() + +# Postgres +parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) +host <- parts[1] +database <- parts[2] +port <- "5432" +connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = createConnectionDetails( + dbms = "postgresql", + user = Sys.getenv("CDM5_POSTGRESQL_USER"), + password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), + server = Sys.getenv("CDM5_POSTGRESQL_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "postgresql", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_POSTGRESQL_USER"), + password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), + tempEmulationSchema = NULL +) + +# SQL Server +connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "sql server", + user = Sys.getenv("CDM5_SQL_SERVER_USER"), + password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), + server = Sys.getenv("CDM5_SQL_SERVER_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "sql server", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_SQL_SERVER_USER"), + password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), + tempEmulationSchema = NULL +) + +# Oracle +port <- "1521" +parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) +host <- parts[1] +sid <- parts[2] +connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "oracle", + user = Sys.getenv("CDM5_ORACLE_USER"), + password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), + server = Sys.getenv("CDM5_ORACLE_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "oracle", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_ORACLE_USER"), + password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") +) + +# RedShift +parts <- unlist(strsplit(Sys.getenv("CDM5_REDSHIFT_SERVER"), "/")) +host <- parts[1] +database <- parts[2] +port <- "5439" +connectionString <- paste0("jdbc:redshift://", host, ":", port, "/", database) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "redshift", + user = Sys.getenv("CDM5_REDSHIFT_USER"), + password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), + server = Sys.getenv("CDM5_REDSHIFT_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "redshift", + connectionString = connectionString, + user = Sys.getenv("CDM5_REDSHIFT_USER"), + password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA"), + tempEmulationSchema = NULL +) + +# Snowflake +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") +) + +# SQLite +sqliteFile <- tempfile(fileext = ".sqlite") +if (testthat::is_testing()) { + withr::defer(unlink(sqliteFile, force = TRUE), testthat::teardown_env()) +} +cdmDatabaseSchema <- "main" +connectionDetails <- createConnectionDetails( + dbms = "sqlite", + server = sqliteFile +) +connection <- connect(connectionDetails) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "person", + data = data.frame(person_id = seq_len(100), + year_of_birth = round(runif(100, 1900, 2000)), + race_concept_id = as.numeric(NA), + gender_concept_id = rep(c(8507, 8532), 50), + care_site_id = round(runif(100, 1, 1e7))) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "observation_period", + data = data.frame(person_id = seq_len(100), + observation_period_start_date = rep(as.Date("2000-01-01"), 100), + observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), + period_type_concept_id = rep(0, 100)) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "vocabulary", + data = data.frame(vocabulary_id = c("a", "b"), + vocabulary_name = c("a", "b"), + vocabulary_reference= c("a", "b"), + vocabulary_version = c("a", "b"), + vocabulary_concpet_id = c(1, 2)) +) +disconnect(connection) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = connectionDetails, + NULL, + cdmDatabaseSchema = cdmDatabaseSchema, + tempEmulationSchema = NULL +) + +# DuckDB +duckdbFile <- tempfile(fileext = ".duckdb") +if (testthat::is_testing()) { + withr::defer(unlink(duckdbFile, force = TRUE), testthat::teardown_env()) +} +cdmDatabaseSchema <- "main" +connectionDetails <- createConnectionDetails( + dbms = "duckdb", + server = duckdbFile +) +connection <- connect(connectionDetails) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "person", + data = data.frame(person_id = seq_len(100), + year_of_birth = round(runif(100, 1900, 2000)), + race_concept_id = as.numeric(NA), + gender_concept_id = rep(c(8507, 8532), 50), + care_site_id = round(runif(100, 1, 1e7))) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "observation_period", + data = data.frame(person_id = seq_len(100), + observation_period_start_date = rep(as.Date("2000-01-01"), 100), + observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), + period_type_concept_id = rep(0, 100)) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "vocabulary", + data = data.frame(vocabulary_id = c("a", "b"), + vocabulary_name = c("a", "b"), + vocabulary_reference= c("a", "b"), + vocabulary_version = c("a", "b"), + vocabulary_concpet_id = c(1, 2)) +) +disconnect(connection) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = connectionDetails, + NULL, + cdmDatabaseSchema = cdmDatabaseSchema, + tempEmulationSchema = NULL +) + +addDbmsToLabel <- function(label, testServer) { + return(paste(label, testServer$connectionDetails$dbms)) +} + diff --git a/tests/testthat/test-BatchProcess.R b/tests/testthat/test-BatchProcess.R index 1929cb91..ef84330a 100644 --- a/tests/testthat/test-BatchProcess.R +++ b/tests/testthat/test-BatchProcess.R @@ -1,136 +1,25 @@ -test_that("renderTranslateQueryApplyBatched works", { - connection <- connect( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" - - fun <- function(data, position, myString) { - data$test <- myString - return(data) - } - args <- list(myString = "MY STRING") - data <- renderTranslateQueryApplyBatched(connection, - sql, - fun, - args, - cdm_database_schema = cdmDatabaseSchema - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - disconnect(connection) - - - # Oracle --------------------------------------- - connection <- connect( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" - data <- renderTranslateQueryApplyBatched(connection, - sql, - fun, - args, - cdm_database_schema = cdmDatabaseSchema - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - disconnect(connection) - - # SQL Server -------------------------------------- - connection <- connect( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") - - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" - data <- renderTranslateQueryApplyBatched(connection, - sql, - fun, - args, - cdm_database_schema = cdmDatabaseSchema - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - disconnect(connection) - - # RedShift ---------------------------------------------- - connection <- connect( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") - - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" - data <- renderTranslateQueryApplyBatched(connection, - sql, - fun, - args, - cdm_database_schema = cdmDatabaseSchema - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - disconnect(connection) - - - # Sqlite -------------------------------------------------- - dbFile <- tempfile() - details <- createConnectionDetails( - dbms = "sqlite", - server = dbFile - ) - connection <- connect(details) - executeSql(connection, "CREATE TABLE person (x INT); - INSERT INTO person (x) VALUES (1); INSERT INTO person (x) VALUES (2); INSERT INTO person (x) VALUES (3);") - - sql <- "SELECT * FROM person;" - data <- renderTranslateQueryApplyBatched( - connection, - sql, - fun, - args - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - - disconnect(connection) - unlink(dbFile) - - # Snowflake -------------------------------------------------- - details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - connection <- connect(details) - cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") - - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" - data <- renderTranslateQueryApplyBatched(connection, - sql, - fun, - args, - cdm_database_schema = cdmDatabaseSchema - ) - data <- do.call(rbind, data) - expect_true("test" %in% colnames(data)) - expect_true(all(data$test == "MY STRING")) - disconnect(connection) -}) +library(testthat) + +fun <- function(data, position, myString) { + data$test <- myString + return(data) +} +args <- list(myString = "MY STRING") + +for (testServer in testServers) { + test_that(addDbmsToLabel("Open and close connection", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary;" + data <- renderTranslateQueryApplyBatched( + connection, + sql, + fun, + args, + cdm_database_schema = testServer$cdmDatabaseSchema + ) + data <- do.call(rbind, data) + expect_true("test" %in% colnames(data)) + expect_true(all(data$test == "MY STRING")) + }) +} diff --git a/tests/testthat/test-connection.R b/tests/testthat/test-connection.R index babb6a74..9fb1efa6 100644 --- a/tests/testthat/test-connection.R +++ b/tests/testthat/test-connection.R @@ -1,253 +1,24 @@ library(testthat) -test_that("Open and close connection", { - # Postgresql -------------------------------------------------- - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_equal(dbms(connection), "postgresql") - expect_true(disconnect(connection)) - - # SQL Server -------------------------------------------------- - details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_equal(dbms(connection), "sql server") - expect_true(disconnect(connection)) - - # Oracle -------------------------------------------------- - details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_equal(dbms(connection), "oracle") - expect_true(disconnect(connection)) - - # RedShift -------------------------------------------------- - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_equal(dbms(connection), "redshift") - expect_true(disconnect(connection)) -}) - -test_that("Open and close connection using connection strings with embedded user and pw", { - # Postgresql -------------------------------------------------- - parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) - host <- parts[1] - database <- parts[2] - port <- "5432" - connectionString <- paste0( - "jdbc:postgresql://", - host, - ":", - port, - "/", - database, - "?user=", - Sys.getenv("CDM5_POSTGRESQL_USER"), - "&password=", - URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) - ) - details <- createConnectionDetails(dbms = "postgresql", connectionString = connectionString) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # SQL Server -------------------------------------------------- - connectionString <- paste0( - "jdbc:sqlserver://", - Sys.getenv("CDM5_SQL_SERVER_SERVER"), - ";user=", - Sys.getenv("CDM5_SQL_SERVER_USER"), - ";password=", - URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) - ) - - details <- createConnectionDetails(dbms = "sql server", connectionString = connectionString) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # Oracle -------------------------------------------------- - port <- "1521" - parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) - host <- parts[1] - sid <- parts[2] - - connectionString <- paste0( - "jdbc:oracle:thin:", - Sys.getenv("CDM5_ORACLE_USER"), - "/", - URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - "@", - host, - ":", - port, - ":", - sid - ) - - details <- createConnectionDetails(dbms = "oracle", connectionString = connectionString) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # RedShift -------------------------------------------------- - parts <- unlist(strsplit(Sys.getenv("CDM5_REDSHIFT_SERVER"), "/")) - host <- parts[1] - database <- parts[2] - port <- "5439" - connectionString <- paste0( - "jdbc:redshift://", - host, - ":", - port, - "/", - database, - "?user=", - Sys.getenv("CDM5_REDSHIFT_USER"), - "&password=", - URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")) - ) - details <- createConnectionDetails( - dbms = "redshift", - connectionString = connectionString - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # Spark -------------------------------------------------- - # Disabling Spark unit tests until new testing server is up - # connectionString <- sprintf( - # "%s;UID=%s;PWD=%s", - # Sys.getenv("CDM5_SPARK_CONNECTION_STRING"), - # Sys.getenv("CDM5_SPARK_USER"), - # URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")) - # ) - # - # details <- createConnectionDetails( - # dbms = "spark", - # connectionString = connectionString - # ) - # connection <- connect(details) - # expect_true(inherits(connection, "DatabaseConnectorConnection")) - # expect_true(disconnect(connection)) -}) - -test_that("Open and close connection using connection strings with separate user and pw", { - # Postgresql -------------------------------------------------- - parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) - host <- parts[1] - database <- parts[2] - port <- "5432" - connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) - details <- createConnectionDetails( - dbms = "postgresql", - connectionString = connectionString, - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # SQL Server -------------------------------------------------- - connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) - details <- createConnectionDetails( - dbms = "sql server", - connectionString = connectionString, - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # Oracle -------------------------------------------------- - port <- "1521" - parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) - host <- parts[1] - sid <- parts[2] - connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) - details <- createConnectionDetails( - dbms = "oracle", - connectionString = connectionString, - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # RedShift -------------------------------------------------- - parts <- unlist(strsplit(Sys.getenv("CDM5_REDSHIFT_SERVER"), "/")) - host <- parts[1] - database <- parts[2] - port <- "5439" - connectionString <- paste0( - "jdbc:redshift://", - host, - ":", - port, - "/", - database - ) - details <- createConnectionDetails( - dbms = "redshift", - connectionString = connectionString, - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")) - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_true(disconnect(connection)) - - # Spark -------------------------------------------------- - # Disabling Spark unit tests until new testing server is up - # details <- createConnectionDetails( - # dbms = "spark", - # connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING"), - # user = Sys.getenv("CDM5_SPARK_USER"), - # password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")) - # ) - # connection <- connect(details) - # expect_true(inherits(connection, "DatabaseConnectorConnection")) - # expect_equal(dbms(connection), "spark") - # expect_true(disconnect(connection)) - - # Snowflake -------------------------------------------------- - details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - connection <- connect(details) - expect_true(inherits(connection, "DatabaseConnectorConnection")) - expect_equal(dbms(connection), "snowflake") - expect_true(disconnect(connection)) -}) +for (testServer in testServers) { + test_that(addDbmsToLabel("Open and close connection", testServer), { + connection <- connect(testServer$connectionDetails) + expect_true(inherits(connection, "DatabaseConnectorConnection")) + expect_equal(dbms(connection), testServer$connectionDetails$dbms) + expect_true(disconnect(connection)) + }) +} + +for (testServer in testServers) { + if (!is.null(testServer$connectionDetails2)) { + test_that(addDbmsToLabel("Open and close connection using secondary details", testServer), { + connection <- connect(testServer$connectionDetails2) + expect_true(inherits(connection, "DatabaseConnectorConnection")) + expect_equal(dbms(connection), testServer$connectionDetails2$dbms) + expect_true(disconnect(connection)) + }) + } +} test_that("Error is thrown when using incorrect dbms argument", { expect_error(createConnectionDetails(dbms = "foobar"), "DBMS 'foobar' not supported") @@ -267,9 +38,7 @@ test_that("Error is thrown when forgetting password", { expect_error(connection <- connect(details), "Connection propery 'password' is NULL") }) - test_that("dbms function maps DBI connections to correct SQL dialect", { - mappings <- c( 'Microsoft SQL Server' = 'sql server', 'PqConnection' = 'postgresql', @@ -277,16 +46,11 @@ test_that("dbms function maps DBI connections to correct SQL dialect", { 'BigQueryConnection' = 'bigquery', 'SQLiteConnection' = 'sqlite', 'duckdb_connection' = 'duckdb') - - for(i in seq_along(mappings)) { driver <- names(mappings)[i] dialect <- unname(mappings)[i] mockConstructor <- setClass(driver, contains = "DBIConnection") mockConnection <- mockConstructor() expect_equal(dbms(mockConnection), dialect) - - # duckdb is not yet supported in the current release of SqlRender - if(dialect != "duckdb") expect_error(checkIfDbmsIsSupported(dbms(mockConnection)), NA) } }) From faa68ea27808ac66aa69eddee92c1c1b41d60b22 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sat, 21 Oct 2023 17:20:32 -0400 Subject: [PATCH 15/28] Putting all unit tests in a loop --- tests/testthat/test-dataHash.R | 128 +-------- tests/testthat/test-dbplyr.R | 142 +-------- tests/testthat/test-duckdb.R | 67 ----- tests/testthat/test-fetchResults.R | 342 +++------------------- tests/testthat/test-getTableNames.R | 182 +----------- tests/testthat/test-insertTable.R | 428 +++++++--------------------- tests/testthat/test-sendUpdates.R | 133 +-------- tests/testthat/test-sqlite.R | 54 ---- 8 files changed, 186 insertions(+), 1290 deletions(-) delete mode 100644 tests/testthat/test-duckdb.R delete mode 100644 tests/testthat/test-sqlite.R diff --git a/tests/testthat/test-dataHash.R b/tests/testthat/test-dataHash.R index 746ee011..37e46690 100644 --- a/tests/testthat/test-dataHash.R +++ b/tests/testthat/test-dataHash.R @@ -1,122 +1,10 @@ library(testthat) -test_that("Compute data hash", { - # Postgresql ----------------------------------------------------------------- - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) - expect_true(is.character(hash)) - - disconnect(connection) - - # SQL Server ----------------------------------------------------------------- - details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) - expect_true(is.character(hash)) - - disconnect(connection) - - # Oracle --------------------------------------------------------------------- - details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA")) - expect_true(is.character(hash)) - - disconnect(connection) - - # RedShift ------------------------------------------------------------------ - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) - expect_true(is.character(hash)) - - disconnect(connection) - - # RSQLite -------------------------------------------------------------------- - dbFile <- tempfile(fileext = "sqlite") - details <- createConnectionDetails( - dbms = "sqlite", - server = dbFile - ) - connection <- connect(details) - DatabaseConnector::insertTable( - connection = connection, - databaseSchema = "main", - tableName = "cars", - data = cars, - createTable = TRUE - ) - DatabaseConnector::insertTable( - connection = connection, - databaseSchema = "main", - tableName = "iris", - data = iris, - createTable = TRUE - ) - hash <- computeDataHash(connection, "main") - expect_true(is.character(hash)) - - disconnect(connection) - unlink(dbFile) - - # DuckDB -------------------------------------------------------------------- - dbFile <- tempfile(fileext = "duckdb") - details <- createConnectionDetails( - dbms = "duckdb", - server = dbFile - ) - connection <- connect(details) - DatabaseConnector::insertTable( - connection = connection, - databaseSchema = "main", - tableName = "cars", - data = cars, - createTable = TRUE - ) - DatabaseConnector::insertTable( - connection = connection, - databaseSchema = "main", - tableName = "iris", - data = iris, - createTable = TRUE - ) - hash <- computeDataHash(connection, "main") - expect_true(is.character(hash)) - - disconnect(connection) - unlink(dbFile) - - # Snowflake ------------------------------------------------------------------ - details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - connection <- connect(details) - hash <- computeDataHash(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA")) - expect_true(is.character(hash)) - - disconnect(connection) -}) +for (testServer in testServers) { + test_that(addDbmsToLabel("Compute data hash", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + hash <- computeDataHash(connection, testServer$cdmDatabaseSchema) + expect_true(is.character(hash)) + }) +} diff --git a/tests/testthat/test-dbplyr.R b/tests/testthat/test-dbplyr.R index b47637f9..27f92b70 100644 --- a/tests/testthat/test-dbplyr.R +++ b/tests/testthat/test-dbplyr.R @@ -2,148 +2,28 @@ library(testthat) library(DatabaseConnector) source("dbplyrTestFunction.R") -test_that("Test dbplyr on Postgres", { - # Postgres ---------------------------------------------------------- - connectionDetails <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) -}) - -test_that("Test dbplyr on SQL Server", { - # SQL Server -------------------------------------- - connectionDetails <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) -}) - -test_that("Test dbplyr on Oracle", { - # Oracle --------------------------------------- - connectionDetails <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") - options(sqlRenderTempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA")) - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) -}) - -test_that("Test dbplyr on RedShift", { - # RedShift ---------------------------------------------- - connectionDetails <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) -}) - -test_that("Test dbplyr on SQLite", { - # SQLite ------------------------------------------------- - databaseFile <- tempfile(fileext = ".sqlite") - cdmDatabaseSchema <- "main" - connectionDetails <- createConnectionDetails( - dbms = "sqlite", - server = databaseFile - ) - connection <- connect(connectionDetails) - insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "person", - data = data.frame(person_id = seq_len(100), - year_of_birth = round(runif(100, 1900, 2000)), - race_concept_id = as.numeric(NA), - gender_concept_id = rep(c(8507, 8532), 50), - care_site_id = round(runif(100, 1, 1e7))) - ) - insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "observation_period", - data = data.frame(person_id = seq_len(100), - observation_period_start_date = rep(as.Date("2000-01-01"), 100), - observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), - period_type_concept_id = rep(0, 100)) - ) - disconnect(connection) - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) - unlink(databaseFile) -}) - -test_that("Test dbplyr on DuckDB", { - # DuckDb ------------------------------------------------- - databaseFile <- tempfile(fileext = ".duckdb") - cdmDatabaseSchema <- "main" - connectionDetails <- createConnectionDetails( - dbms = "duckdb", - server = databaseFile - ) - connection <- connect(connectionDetails) - insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "person", - data = data.frame(person_id = seq_len(100), - year_of_birth = round(runif(100, 1900, 2000)), - race_concept_id = as.numeric(NA), - gender_concept_id = rep(c(8507, 8532), 50), - care_site_id = round(runif(100, 1, 1e7))) - ) - insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "observation_period", - data = data.frame(person_id = seq_len(100), - observation_period_start_date = rep(as.Date("2000-01-01"), 100), - observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), - period_type_concept_id = rep(0, 100)) - ) - disconnect(connection) - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) - unlink(databaseFile) -}) - -test_that("Test dbplyr on Snowflake", { - # Snowflake ---------------------------------------------- - connectionDetails <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") - options(sqlRenderTempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA")) - testDbplyrFunctions(connectionDetails, cdmDatabaseSchema) -}) +for (testServer in testServers) { + test_that(addDbmsToLabel("Test dbplyr", testServer), { + options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + testDbplyrFunctions(connectionDetails = testServer$connectionDetails, + cdmDatabaseSchema = testServer$cdmDatabaseSchema) + }) +} test_that("Test dbplyr date functions on non-dbplyr data", { date <- c(as.Date("2000-02-01"), as.Date("2000-12-31"), as.Date("2000-01-31")) - + date2 <- c(as.Date("2000-02-05"), as.Date("2000-11-30"), as.Date("2002-01-31")) expect_equal(dateDiff("day", date, date2), c(4, -31, 731)) expect_equal(eoMonth(date), c(as.Date("2000-02-29"), as.Date("2000-12-31"), as.Date("2000-01-31"))) - + expect_equal(dateAdd("day", 1, date), c(as.Date("2000-02-02"), as.Date("2001-01-01"), as.Date("2000-02-01"))) expect_equal(year(date), c(2000, 2000, 2000)) - + expect_equal(month(date), c(2, 12, 1)) - + expect_equal(day(date), c(1, 31, 31)) }) diff --git a/tests/testthat/test-duckdb.R b/tests/testthat/test-duckdb.R deleted file mode 100644 index 62dd602c..00000000 --- a/tests/testthat/test-duckdb.R +++ /dev/null @@ -1,67 +0,0 @@ -library(testthat) - -test_that("Open and close duckdb connection", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) - expect_s4_class(connection, "DatabaseConnectorDbiConnection") - - disconnect(connection) - unlink(databaseFile) -}) - -test_that("Open and close duckdb without DATABASECONNECTOR_JAR_FOLDER", { - withr::with_envvar( - new=c("DATABASECONNECTOR_JAR_FOLDER"=""), - { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) - expect_s4_class(connection, "DatabaseConnectorDbiConnection") - disconnect(connection) - unlink(databaseFile) - } - - ) -}) - -test_that("Insert and retrieve dates from duckdb", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) - data <- data.frame(startDate = as.Date(c("2000-01-01", "2000-02-01"))) - insertTable( - connection = connection, - databaseSchema = "main", - tableName = "test", - data = data, - createTable = TRUE, - camelCaseToSnakeCase = TRUE - ) - data2 <- renderTranslateQuerySql( - connection = connection, - sql = "SELECT * FROM main.test;", - snakeCaseToCamelCase = TRUE) - expect_equal(data, data2) - disconnect(connection) - unlink(databaseFile) -}) - -test_that("Insert using tibbles and retrieve dates from duckdb", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "duckdb", server = databaseFile) - - data <- dplyr::tibble(startDate = as.Date(c("2000-01-01", "2000-02-01"))) - insertTable( - connection = connection, - databaseSchema = "main", - tableName = "test", - data = data, - createTable = TRUE, - camelCaseToSnakeCase = TRUE - ) - data2 <- renderTranslateQuerySql( - connection = connection, - sql = "SELECT * FROM main.test;", - snakeCaseToCamelCase = TRUE) - expect_equal(data, dplyr::as_tibble(data2)) - disconnect(connection) - unlink(databaseFile) -}) diff --git a/tests/testthat/test-fetchResults.R b/tests/testthat/test-fetchResults.R index b3478f81..6c311226 100644 --- a/tests/testthat/test-fetchResults.R +++ b/tests/testthat/test-fetchResults.R @@ -6,313 +6,41 @@ if (DatabaseConnector:::is_installed("ParallelLogger")) { ParallelLogger::addDefaultFileLogger(logFileName, name = "TEST_LOGGER") } -test_that("Fetch results", { - # Postgres ---------------------------------------------------------- - connection <- connect( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") - sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - # Fetch data.frame: - count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 58) - count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 58) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) - renderTranslateQuerySqlToAndromeda(connection, - sql, - cdm_database_schema = cdmDatabaseSchema, - andromeda = andromeda, - andromedaTableName = "test2", - snakeCaseToCamelCase = TRUE - ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) - Andromeda::close(andromeda) - - disconnect(connection) - - # SQL Server -------------------------------------- - connection <- connect( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") - sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - # Fetch data.frame: - count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 58) - count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 58) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) - renderTranslateQuerySqlToAndromeda(connection, - sql, - cdm_database_schema = cdmDatabaseSchema, - andromeda = andromeda, - andromedaTableName = "test2", - snakeCaseToCamelCase = TRUE - ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) - Andromeda::close(andromeda) - - disconnect(connection) - - # Oracle --------------------------------------- - connection <- connect( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") - sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - # Fetch types correctly: - x <- querySql(connection, " - SELECT - 1/10 as a, - x1, - x2, - x1 / x2 AS b, - CAST(1 AS INT) AS c, - CAST(1.1 AS NUMBER(1,0)) AS d, - CAST(1.1 AS FLOAT) AS e, - 0.1 AS f, - CAST(9223372036854775807 AS NUMBER(19)) AS g - FROM ( - SELECT - 1 AS x1, - 10 AS x2 - FROM - DUAL - ) - ", integerAsNumeric = FALSE, integer64AsNumeric = FALSE) - - expect_identical(x, data.frame( - A = 0.1, - X1 = 1, - X2 = 10, - B = 0.1, - C = as.integer(1), - D = as.integer(1), - E = 1.1, - F = 0.1, - G = bit64::as.integer64("9223372036854775807") - )) - - # Fetch data.frame: - count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 58) - count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 58) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) - renderTranslateQuerySqlToAndromeda(connection, - sql, - cdm_database_schema = cdmDatabaseSchema, - andromeda = andromeda, - andromedaTableName = "test2", - snakeCaseToCamelCase = TRUE - ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) - Andromeda::close(andromeda) - - disconnect(connection) - - # RedShift ---------------------------------------------- - connection <- connect( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") - sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - # Fetch data.frame: - count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 58) - count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 58) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 58) - renderTranslateQuerySqlToAndromeda(connection, - sql, - cdm_database_schema = cdmDatabaseSchema, - andromeda = andromeda, - andromedaTableName = "test2", - snakeCaseToCamelCase = TRUE - ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 58) - Andromeda::close(andromeda) - - disconnect(connection) - - # SQLite -------------------------------------------------- - databaseFile <- tempfile(fileext = ".sqlite") - cdmDatabaseSchema <- "main" - connectionDetails <- createConnectionDetails( - dbms = "sqlite", - server = databaseFile - ) - connection <- connect(connectionDetails) - insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "person", - data = data.frame(person_id = seq_len(100), - year_of_birth = round(runif(100, 1900, 2000)), - race_concept_id = as.numeric(NA), - gender_concept_id = rep(c(8507, 8532), 50)) - ) - # Fetch data.frame: - count <- querySql(connection, "SELECT COUNT(*) FROM main.person;") - expect_equal(count[1, 1], 100) - count <- renderTranslateQuerySql(connection, "SELECT COUNT(*) FROM @cdm.person;", cdm = cdmDatabaseSchema) - expect_equal(count[1, 1], 100) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, "SELECT * FROM main.person;", andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(nrow(dplyr::collect(andromeda$test)), 100) - - Andromeda::close(andromeda) - - disconnect(connection) - unlink(databaseFile) - - # Snowflake ---------------------------------------------- - connection <- connect( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - cdmDatabaseSchema <- Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA") - sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - # Fetch data.frame: - count <- querySql(connection, renderedSql) - expect_equal(count[1, 1], 104) - count <- renderTranslateQuerySql(connection, sql, cdm_database_schema = cdmDatabaseSchema) - expect_equal(count[1, 1], 104) - - # Fetch Andromeda: - andromeda <- Andromeda::andromeda() - querySqlToAndromeda(connection, renderedSql, andromeda = andromeda, andromedaTableName = "test", snakeCaseToCamelCase = TRUE) - expect_equivalent(dplyr::collect(andromeda$test)$rowCount[1], 104) - renderTranslateQuerySqlToAndromeda(connection, - sql, - cdm_database_schema = cdmDatabaseSchema, - andromeda = andromeda, - andromedaTableName = "test2", - snakeCaseToCamelCase = TRUE - ) - expect_equivalent(dplyr::collect(andromeda$test2)$rowCount[1], 104) - Andromeda::close(andromeda) - - disconnect(connection) - -}) - -test_that("dbFetch works", { - connection <- connect( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA") - sql <- "SELECT * FROM @cdm_database_schema.vocabulary LIMIT 10" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - queryResult <- dbSendQuery(connection, renderedSql) - df <- dbFetch(queryResult) - dbClearResult(queryResult) - - expect_s3_class(df, "data.frame") - expect_equal(nrow(df), 10) - disconnect(connection) - - # Oracle --------------------------------------- - connection <- connect( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA") - - sql <- "SELECT * FROM @cdm_database_schema.vocabulary FETCH FIRST 10 ROWS ONLY" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - queryResult <- dbSendQuery(connection, renderedSql) - df <- dbFetch(queryResult) - dbClearResult(queryResult) - - disconnect(connection) - - # SQL Server -------------------------------------- - connection <- connect( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA") - - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - queryResult <- dbSendQuery(connection, renderedSql) - df <- dbFetch(queryResult) - dbClearResult(queryResult) - - disconnect(connection) - - # RedShift ---------------------------------------------- - connection <- connect( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - cdmDatabaseSchema <- Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA") - - sql <- "SELECT TOP 10 * FROM @cdm_database_schema.vocabulary" - renderedSql <- SqlRender::render(sql, cdm_database_schema = cdmDatabaseSchema) - - queryResult <- dbSendQuery(connection, renderedSql) - df <- dbFetch(queryResult) - dbClearResult(queryResult) - - disconnect(connection) -}) +for (testServer in testServers) { + test_that(addDbmsToLabel("Fetch results", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + sql <- "SELECT COUNT(*) AS row_count FROM @cdm_database_schema.vocabulary" + renderedSql <- SqlRender::render(sql = sql, + cdm_database_schema = testServer$cdmDatabaseSchema) + + # Fetch data.frame: + count <- querySql(connection, renderedSql) + expect_gt(count[1, 1], 1) + count <- renderTranslateQuerySql(connection = connection, + sql = sql, + cdm_database_schema = testServer$cdmDatabaseSchema) + expect_gt(count[1, 1], 1) + + # Fetch Andromeda: + andromeda <- Andromeda::andromeda() + querySqlToAndromeda(connection = connection, + sql = renderedSql, + andromeda = andromeda, + andromedaTableName = "test", + snakeCaseToCamelCase = TRUE) + expect_gt(dplyr::collect(andromeda$test)$rowCount[1], 1) + renderTranslateQuerySqlToAndromeda(connection, + sql, + cdm_database_schema = testServer$cdmDatabaseSchema, + andromeda = andromeda, + andromedaTableName = "test2", + snakeCaseToCamelCase = TRUE + ) + expect_gt(dplyr::collect(andromeda$test2)$rowCount[1], 1) + Andromeda::close(andromeda) + }) +} test_that("Logging query times", { skip_if_not_installed("ParallelLogger") diff --git a/tests/testthat/test-getTableNames.R b/tests/testthat/test-getTableNames.R index 374c16c5..7a484e53 100644 --- a/tests/testthat/test-getTableNames.R +++ b/tests/testthat/test-getTableNames.R @@ -1,173 +1,15 @@ library(testthat) -test_that("Get table names", { - # Postgresql -------------------------------------------------- - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - - # SQL Server -------------------------------------------------- - details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), "person")) - # This does not work on SQL Server: - # expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - - # Oracle -------------------------------------------------- - details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA")) +for (testServer in testServers) { + test_that(addDbmsToLabel("Get table names", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + tables <- getTableNames(connection, testServer$cdmDatabaseSchema) expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - - # Sqlite -------------------------------------------------- - dbFile <- tempfile() - details <- createConnectionDetails( - dbms = "sqlite", - server = dbFile - ) - connection <- connect(details) - executeSql(connection, "CREATE TABLE person (x INT);") - tables <- getTableNames(connection, "main") - expect_true("person" %in% tables) - expect_true(existsTable(connection, "main", "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - unlink(dbFile) - - # RedShift -------------------------------------------------- - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA"), "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - - # DuckDB -------------------------------------------------- - dbFile <- tempfile() - details <- createConnectionDetails( - dbms = "duckdb", - server = dbFile - ) - connection <- connect(details) - executeSql(connection, "CREATE TABLE person (x INT);") - tables <- getTableNames(connection, "main") - expect_true("person" %in% tables) - expect_true(existsTable(connection, "main", "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) - unlink(dbFile) - - # Snowflake -------------------------------------------------- - details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - connection <- connect(details) - tables <- getTableNames(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), "person")) - expect_true(DBI::dbExistsTable(connection, "person")) - disconnect(connection) -}) - -test_that("Cleaning of database or schema name", { - expect_equivalent(cleanSchemaName("[test\\name]"), "test\\\\name") - expect_equivalent(cleanSchemaName("\"test\\name\""), "test\\\\name") - expect_equivalent(cleanDatabaseName("test\\name"), "test\\name") -}) - -test_that("Get table names using DBI drivers", { - skip_if_not(Sys.getenv("RUN_DATABASECONNECTOR_DBI_DRIVER_TESTS") == "TRUE") - - # Postgresql with RPostgres driver ----------------------------- - connection <- con <- DBI::dbConnect(RPostgres::Postgres(), - dbname = Sys.getenv("CDM5_POSTGRESQL_DBNAME"), - host = Sys.getenv("CDM5_POSTGRESQL_HOST"), - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) - tables <- getTableNames(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), "person")) - DBI::dbDisconnect(connection) - - # SQL Server with odbc driver ---------------------------------- - connection <- DBI::dbConnect(odbc::odbc(), - Driver = "ODBC Driver 18 for SQL Server", - Server = Sys.getenv("CDM5_SQL_SERVER_SERVER"), - Database = Sys.getenv("CDM5_SQL_SERVER_CDM_DATABASE"), - UID = Sys.getenv("CDM5_SQL_SERVER_USER"), - PWD = Sys.getenv("CDM5_SQL_SERVER_PASSWORD"), - TrustServerCertificate = "yes", - Port = 1433) - tables <- getTableNames(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), "person")) - DBI::dbDisconnect(connection) - - # Sqlite -------------------------------------------------- - - dbFile <- tempfile() - connection <- DBI::dbConnect(RSQLite::SQLite(), dbname = dbFile) - DBI::dbExecute(connection, "CREATE TABLE person (x INT);") - tables <- getTableNames(connection, "main") - expect_true("person" %in% tables) - expect_true(existsTable(connection, "main", "person")) - DBI::dbDisconnect(connection) - unlink(dbFile) - - # duckdb -------------------------------------------------- - - connection <- DBI::dbConnect(duckdb::duckdb()) - DBI::dbExecute(connection, "CREATE SCHEMA test") - DBI::dbExecute(connection, "CREATE TABLE test.person (x INT);") - tables <- getTableNames(connection, "test") - expect_true("person" %in% tables) - expect_true(existsTable(connection, "test", "person")) - DBI::dbDisconnect(connection) - - # RedShift -------------------------------------------------- - connection <- DBI::dbConnect(RPostgres::Redshift(), - dbname = Sys.getenv("CDM5_REDSHIFT_DBNAME"), - host = Sys.getenv("CDM5_REDSHIFT_HOST"), - port = Sys.getenv("CDM5_REDSHIFT_PORT"), - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = Sys.getenv("CDM5_REDSHIFT_PASSWORD")) - - tables <- getTableNames(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA")) - expect_true("person" %in% tables) - expect_true(existsTable(connection, Sys.getenv("CDM5_REDSHIFT_CDM54_SCHEMA"), "person")) - DBI::dbDisconnect(connection) -}) + expect_true(existsTable(connection, testServer$cdmDatabaseSchema, "person")) + # This does not work on SQL Server: + if (testServer$connectionDetails$dbms != "sql server") { + expect_true(DBI::dbExistsTable(connection, "person")) + } + }) +} diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index 525aca6d..fa627467 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -6,302 +6,87 @@ if (DatabaseConnector:::is_installed("ParallelLogger")) { ParallelLogger::addDefaultFileLogger(logFileName, name = "TEST_LOGGER") } - -test_that("insertTable", { - set.seed(0) - day.start <- "1960/01/01" - day.end <- "2000/12/31" - time.start <- as.POSIXct("2018-11-12 09:04:07 CET") - dayseq <- seq.Date(as.Date(day.start), as.Date(day.end), by = "week") - timeSeq <- time.start + (1:length(dayseq)) * 60 * 60 * 24 - makeRandomStrings <- function(n = 1, lenght = 12) { - randomString <- c(1:n) - for (i in 1:n) { - randomString[i] <- paste(sample(c(0:9, letters, LETTERS), lenght, replace = TRUE), - collapse = "" - ) - } - return(randomString) +set.seed(0) +day.start <- "1960/01/01" +day.end <- "2000/12/31" +time.start <- as.POSIXct("2018-11-12 09:04:07 CET") +dayseq <- seq.Date(as.Date(day.start), as.Date(day.end), by = "week") +timeSeq <- time.start + (1:length(dayseq)) * 60 * 60 * 24 +makeRandomStrings <- function(n = 1, lenght = 12) { + randomString <- c(1:n) + for (i in 1:n) { + randomString[i] <- paste(sample(c(0:9, letters, LETTERS), lenght, replace = TRUE), + collapse = "" + ) } - bigInts <- bit64::runif64(length(dayseq)) - data <- data.frame( - start_date = dayseq, - some_datetime = timeSeq, - person_id = as.integer(round(runif(length(dayseq), 1, 1e+07))), - value = runif(length(dayseq)), - id = makeRandomStrings(length(dayseq)), - big_ints = bigInts, - stringsAsFactors = FALSE - ) - - data$start_date[4] <- NA - data$some_datetime[6] <- NA - data$person_id[5] <- NA - data$value[2] <- NA - data$id[3] <- NA - data$big_ints[7] <- NA - data$big_ints[8] <- 3.3043e+10 - - # Postgresql -------------------------------------- - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - insertTable( - connection = connection, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = TRUE - ) - - # Check data on server is same as local - data2 <- querySql(connection, "SELECT * FROM temp", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, "SELECT * FROM temp") - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$field.type), c("date", "timestamp", "int4", "numeric", "varchar", "int8")) - - disconnect(connection) - - - # SQL Server ---------------------------------------------- - details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - connection <- connect(details) - insertTable( - connection = connection, - tableName = "#temp", - data = data, - createTable = TRUE, - tempTable = TRUE - ) - - # Check data on server is same as local - data2 <- querySql(connection, "SELECT * FROM #temp", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, "SELECT * FROM #temp") - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$field.type), c("date", "datetime2", "int", "float", "varchar", "bigint")) - - disconnect(connection) - - - # Oracle ----------------------------------------- - details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - schema <- Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") - connection <- connect(details) - insertTable( - connection = connection, - databaseSchema = schema, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = FALSE - ) - - - # lowLevelQuerySql(connection, "SELECT * FROM all_tab_columns WHERE owner = 'OHDSI' AND table_name = 'TEMP'") - - # Check data on server is same as local - sql <- SqlRender::render("SELECT * FROM @schema.temp", schema = schema) - data2 <- querySql(connection, sql, integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, sprintf("SELECT * FROM %s.temp", schema)) - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMP", "NUMBER", "NUMBER", "VARCHAR2", "NUMBER")) - - dropEmulatedTempTables(connection) - - disconnect(connection) - - # SQLite --------------------------------------------------------------- - dbFile <- tempfile() - details <- createConnectionDetails( - dbms = "sqlite", - server = dbFile - ) - connection <- connect(details) - insertTable( - connection = connection, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = FALSE - ) - - # Check data on server is same as local - data2 <- querySql(connection, "SELECT * FROM temp", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - - attr(data$some_datetime, "tzone") <- NULL - attr(data2$some_datetime, "tzone") <- NULL - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, "SELECT * FROM temp") - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$type), c("double", "double", "integer", "double", "character", "double")) - - disconnect(connection) - unlink(dbFile) - - # RedShift -------------------------------------- - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - connection <- connect(details) - - # Use subset of data because inserts on RedShift are slow: - subset <- data[1:10, ] - - insertTable( - connection = connection, - tableName = "temp", - data = subset, - createTable = TRUE, - tempTable = TRUE - ) - - # Check data on server is same as local - data2 <- querySql(connection, "SELECT * FROM temp", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - subset <- subset[order(subset$person_id), ] - data2 <- data2[order(data2$person_id), ] - expect_equal(subset, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, "SELECT * FROM temp") - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$field.type), c("date", "timestamp", "int4", "float8", "varchar", "int8")) - - disconnect(connection) - - - # DuckDb --------------------------------------------------------------- - dbFile <- tempfile() - details <- createConnectionDetails( - dbms = "duckdb", - server = dbFile - ) - connection <- connect(details) - insertTable( - connection = connection, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = FALSE - ) - - # Check data on server is same as local - data2 <- querySql(connection, "SELECT * FROM temp", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - attr(data$some_datetime, "tzone") <- NULL - attr(data2$some_datetime, "tzone") <- NULL - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, "SELECT * FROM temp") - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$type), c("Date", "POSIXct", "integer", "numeric", "character", "numeric")) - - disconnect(connection) - unlink(dbFile) - - - # Snowflake ----------------------------------------- - details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ) - schema <- Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") - connection <- connect(details) - insertTable( - connection = connection, - databaseSchema = schema, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = FALSE - ) - - # Check data on server is same as local - sql <- SqlRender::render("SELECT * FROM @schema.temp", schema = schema) - data2 <- querySql(connection, sql, integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - expect_equal(data, data2, check.attributes = FALSE) - - # Check data types - res <- dbSendQuery(connection, sprintf("SELECT * FROM %s.temp", schema)) - columnInfo <- dbColumnInfo(res) - dbClearResult(res) - expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMPNTZ", "NUMBER", "DOUBLE", "VARCHAR", "NUMBER")) - - dropEmulatedTempTables(connection) - - disconnect(connection) -}) + return(randomString) +} +bigInts <- bit64::runif64(length(dayseq)) +data <- data.frame( + start_date = dayseq, + some_datetime = timeSeq, + person_id = as.integer(round(runif(length(dayseq), 1, 1e+07))), + value = runif(length(dayseq)), + id = makeRandomStrings(length(dayseq)), + big_ints = bigInts, + stringsAsFactors = FALSE +) -test_that("Test temp emulation helper functions", { - expect_true(requiresTempEmulation("bigquery")) - expect_false(requiresTempEmulation("postgresql")) - - expect_error(assertTempEmulationSchemaSet("oracle", tempEmulationSchema = NULL), "emp emulation schema is not set") - expect_no_error(assertTempEmulationSchemaSet("oracle", tempEmulationSchema = "some_schema")) - expect_no_error(assertTempEmulationSchemaSet("sql server", tempEmulationSchema = NULL)) -}) +data$start_date[4] <- NA +data$some_datetime[6] <- NA +data$person_id[5] <- NA +data$value[2] <- NA +data$id[3] <- NA +data$big_ints[7] <- NA +data$big_ints[8] <- 3.3043e+10 + +for (testServer in testServers) { + test_that(addDbmsToLabel("Insert data", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + insertTable( + connection = connection, + tableName = "#temp", + data = data, + createTable = TRUE, + tempTable = TRUE + ) + + # Check data on server is same as local + data2 <- renderTranslateQuerySql(connection, "SELECT * FROM #temp;", integer64AsNumeric = FALSE) + names(data2) <- tolower(names(data2)) + data <- data[order(data$person_id), ] + data2 <- data2[order(data2$person_id), ] + row.names(data) <- NULL + row.names(data2) <- NULL + expect_equal(data, data2, check.attributes = FALSE) + + # Check data types + res <- dbSendQuery(connection, "SELECT * FROM #temp;") + columnInfo <- dbColumnInfo(res) + dbClearResult(res) + dbms <- testServer$connectionDetails$dbms + if (dbms == "postgresql") { + expect_equal(as.character(columnInfo$field.type), c("date", "timestamp", "int4", "numeric", "varchar", "int8")) + } else if (dbms == "sql server") { + expect_equal(as.character(columnInfo$field.type), c("date", "datetime2", "int", "float", "varchar", "bigint")) + } else if (dbms == "oracle") { + expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMP", "NUMBER", "NUMBER", "VARCHAR2", "NUMBER")) + } else if (dbms == "redshift") { + expect_equal(as.character(columnInfo$field.type), c("date", "timestamp", "int4", "float8", "varchar", "int8" )) + } else if (dbms == "sqlite") { + expect_equal(as.character(columnInfo$type), c("double", "double", "integer", "double", "character", "double")) + } else if (dbms == "duckdb") { + expect_equal(as.character(columnInfo$type), c("Date", "POSIXct", "integer", "numeric", "character", "numeric")) + } else if (dbms == "snowflake") { + expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMPNTZ", "NUMBER", "DOUBLE", "VARCHAR", "NUMBER")) + } else { + warning("Unable to check column types for ", dbms) + } + dropEmulatedTempTables(connection) + }) +} test_that("Logging insertTable times", { skip_if_not_installed("ParallelLogger") @@ -313,31 +98,30 @@ test_that("Logging insertTable times", { unlink(logFileName) }) -test_that("Converting logical to numeric in insertTable", { - data <- data.frame( - id = 1:3, - isPrime = c(NA, FALSE, TRUE) - ) - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - expect_warning( - insertTable( - connection = connection, - tableName = "temp", - data = data, - createTable = TRUE, - tempTable = TRUE - ), - "Column 'isPrime' is of type 'logical'") - - data2 <- querySql(connection, "SELECT * FROM temp") - data$isPrime <- as.numeric(data$isPrime) - names(data2) <- tolower(names(data2)) - expect_equal(data, data2, check.attributes = FALSE) - disconnect(connection) -}) +data <- data.frame( + id = 1:3, + isPrime = c(NA, FALSE, TRUE) +) + +for (testServer in testServers) { + test_that(addDbmsToLabel("Converting logical to numeric in insertTable", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + expect_warning( + insertTable( + connection = connection, + tableName = "#temp", + data = data, + createTable = TRUE, + tempTable = TRUE + ), + "Column 'isPrime' is of type 'logical'") + data2 <- renderTranslateQuerySql(connection, "SELECT * FROM #temp;") + data$isPrime <- as.numeric(data$isPrime) + names(data2) <- tolower(names(data2)) + data2 <- data2[order(data2$id), ] + expect_equal(data, data2, check.attributes = FALSE) + dropEmulatedTempTables(connection) + }) +} diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index 7328a8cf..50cf5c4f 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -1,125 +1,20 @@ library(testthat) -# if (DatabaseConnector:::is_installed("ParallelLogger")) { -# logFileName <- tempfile(fileext = ".txt") -# ParallelLogger::addDefaultFileLogger(logFileName, name = "TEST_LOGGER") -# } - -test_that("Send updates to server", { - sql <- "CREATE TABLE #temp (x INT); +sql <- "CREATE TABLE #temp (x INT); INSERT INTO #temp (x) SELECT 123; DELETE FROM #temp WHERE x = 123; DROP TABLE #temp;" - # Postgresql -------------------------------------------------- - details <- createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ) - connection <- connect(details) - - expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - - expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) - - rowsAffected <- dbSendStatement(connection, sql) - expect_equal(dbGetRowsAffected(rowsAffected), 2) - dbClearResult(rowsAffected) - - disconnect(connection) - - # SQL Server -------------------------------------------------- - details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ) - connection <- connect(details) - - expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - - expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) - - rowsAffected <- dbSendStatement(connection, sql) - expect_equal(dbGetRowsAffected(rowsAffected), 2) - dbClearResult(rowsAffected) - - disconnect(connection) - - # Oracle -------------------------------------------------- - details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ) - options(sqlRenderTempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA")) - connection <- connect(details) - - expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - - expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) - - rowsAffected <- dbSendStatement(connection, sql) - expect_equal(dbGetRowsAffected(rowsAffected), 2) - dbClearResult(rowsAffected) - - dropEmulatedTempTables(connection) - - disconnect(connection) - - # RedShift -------------------------------------------------- - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - connection <- connect(details) - - expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - - expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) - - rowsAffected <- dbSendStatement(connection, sql) - expect_equal(dbGetRowsAffected(rowsAffected), 2) - dbClearResult(rowsAffected) - - disconnect(connection) - - # Snowflake -------------------------------------------------- - details <- createConnectionDetails( - dbms = "redshift", - user = Sys.getenv("CDM5_REDSHIFT_USER"), - password = URLdecode(Sys.getenv("CDM5_REDSHIFT_PASSWORD")), - server = Sys.getenv("CDM5_REDSHIFT_SERVER") - ) - options(sqlRenderTempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA")) - connection <- connect(details) - - expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) - - expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) - - rowsAffected <- dbSendStatement(connection, sql) - expect_equal(dbGetRowsAffected(rowsAffected), 2) - dbClearResult(rowsAffected) - - dropEmulatedTempTables(connection) - - disconnect(connection) - -}) - -# test_that("Logging update times", { -# skip_if_not_installed("ParallelLogger") -# log <- readLines(logFileName) -# statementCount <- sum(grepl("Executing SQL:", log)) -# expect_gt(statementCount, 19) -# # writeLines(log) -# ParallelLogger::unregisterLogger("TEST_LOGGER") -# unlink(logFileName) -# }) +for (testServer in testServers) { + test_that(addDbmsToLabel("Open and close connection", testServer), { + connection <- connect(testServer$connectionDetails) + on.exit(disconnect(connection)) + options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) + expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) + rowsAffected <- dbSendStatement(connection, sql) + expect_equal(dbGetRowsAffected(rowsAffected), 2) + dbClearResult(rowsAffected) + dropEmulatedTempTables(connection) + }) +} diff --git a/tests/testthat/test-sqlite.R b/tests/testthat/test-sqlite.R deleted file mode 100644 index a168d896..00000000 --- a/tests/testthat/test-sqlite.R +++ /dev/null @@ -1,54 +0,0 @@ -library(testthat) - -test_that("Open and close SQLite connection", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "sqlite", server = databaseFile) - expect_s4_class(connection, "DatabaseConnectorDbiConnection") - - disconnect(connection) - unlink(databaseFile) -}) - -test_that("Insert and retrieve dates from SQLite", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "sqlite", server = databaseFile) - - data <- data.frame(startDate = as.Date(c("2000-01-01", "2000-02-01"))) - insertTable( - connection = connection, - databaseSchema = "main", - tableName = "test", - data = data, - createTable = TRUE, - camelCaseToSnakeCase = TRUE - ) - data2 <- renderTranslateQuerySql( - connection = connection, - sql = "SELECT * FROM main.test;", - snakeCaseToCamelCase = TRUE) - expect_equal(data, data2) - disconnect(connection) - unlink(databaseFile) -}) - -test_that("Insert using tibbles and retrieve dates from SQLite", { - databaseFile <- tempfile() - connection <- DatabaseConnector::connect(dbms = "sqlite", server = databaseFile) - - data <- dplyr::tibble(startDate = as.Date(c("2000-01-01", "2000-02-01"))) - insertTable( - connection = connection, - databaseSchema = "main", - tableName = "test", - data = data, - createTable = TRUE, - camelCaseToSnakeCase = TRUE - ) - data2 <- renderTranslateQuerySql( - connection = connection, - sql = "SELECT * FROM main.test;", - snakeCaseToCamelCase = TRUE) - expect_equal(data, dplyr::as_tibble(data2)) - disconnect(connection) - unlink(databaseFile) -}) From 1e0550dc3e14670f6fb0426613eee1b70f9ee176 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 08:23:19 -0400 Subject: [PATCH 16/28] Fixing unit tests --- tests/testthat/setup.R | 4 +++- tests/testthat/test-insertTable.R | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index c66df0df..b53a238b 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -222,6 +222,8 @@ testServers[[length(testServers) + 1]] <- list( ) addDbmsToLabel <- function(label, testServer) { - return(paste(label, testServer$connectionDetails$dbms)) + # Test sections are not shown in R check, so also printing them here: + message(sprintf("Test: %s (%s)", label, testServer$connectionDetails$dbms)) + return(sprintf("%s (%s)", label, testServer$connectionDetails$dbms)) } diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index fa627467..10db2dcc 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -9,7 +9,7 @@ if (DatabaseConnector:::is_installed("ParallelLogger")) { set.seed(0) day.start <- "1960/01/01" day.end <- "2000/12/31" -time.start <- as.POSIXct("2018-11-12 09:04:07 CET") +time.start <- as.POSIXct("2018-11-12 09:04:07") dayseq <- seq.Date(as.Date(day.start), as.Date(day.end), by = "week") timeSeq <- time.start + (1:length(dayseq)) * 60 * 60 * 24 makeRandomStrings <- function(n = 1, lenght = 12) { @@ -60,6 +60,8 @@ for (testServer in testServers) { data2 <- data2[order(data2$person_id), ] row.names(data) <- NULL row.names(data2) <- NULL + attr(data$some_datetime, "tzone") <- NULL + attr(data2$some_datetime, "tzone") <- NULL expect_equal(data, data2, check.attributes = FALSE) # Check data types From 957fc7ca66ae5e9d7530ddfe8dc830dbdf615203 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 09:44:38 -0400 Subject: [PATCH 17/28] Add DataBricks unit tests --- .github/workflows/R_CMD_check_Hades.yaml | 2 ++ R/Sql.R | 3 +++ tests/testthat/setup.R | 13 +++++++++++++ tests/testthat/test-insertTable.R | 12 +++++++----- tests/testthat/test-sendUpdates.R | 4 ++-- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index 3a2e6e29..e0819273 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -56,6 +56,8 @@ jobs: CDM5_SPARK_USER: ${{ secrets.CDM5_SPARK_USER }} CDM5_SPARK_PASSWORD: ${{ secrets.CDM5_SPARK_PASSWORD }} CDM5_SPARK_CONNECTION_STRING: ${{ secrets.CDM5_SPARK_CONNECTION_STRING }} + CDM5_SPARK_CDM_SCHEMA: ${{ secrets.CDM5_SPARK_CDM_SCHEMA }} + CDM5_SPARK_OHDSI_SCHEMA: ${{ secrets.CDM5_SPARK_OHDSI_SCHEMA }} steps: - uses: actions/checkout@v3 diff --git a/R/Sql.R b/R/Sql.R index fcfab610..566391b3 100644 --- a/R/Sql.R +++ b/R/Sql.R @@ -307,6 +307,9 @@ lowLevelExecuteSql.default <- function(connection, sql) { # when using executeLargeUpdate, so using execute instead. rJava::.jcall(statement, "Z", "execute", as.character(sql), check = FALSE) rowsAffected <- rJava::.jcall(statement, "I", "getUpdateCount", check = FALSE) + if (rowsAffected == -1) { + rowsAffected <- 0 + } } else { rowsAffected <- rJava::.jcall(statement, "J", "executeLargeUpdate", as.character(sql), check = FALSE) } diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index b53a238b..e2c05622 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -125,6 +125,19 @@ testServers[[length(testServers) + 1]] <- list( tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") ) +# Databricks (Spark) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "spark", + user = Sys.getenv("CDM5_SPARK_USER"), + password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")), + connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING") + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM5_SPARK_CDM_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") +) + # SQLite sqliteFile <- tempfile(fileext = ".sqlite") if (testthat::is_testing()) { diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index 10db2dcc..f55c1662 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -43,8 +43,9 @@ data$big_ints[8] <- 3.3043e+10 for (testServer in testServers) { test_that(addDbmsToLabel("Insert data", testServer), { connection <- connect(testServer$connectionDetails) - on.exit(disconnect(connection)) options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + on.exit(dropEmulatedTempTables(connection)) + on.exit(disconnect(connection), add = TRUE) insertTable( connection = connection, tableName = "#temp", @@ -62,7 +63,7 @@ for (testServer in testServers) { row.names(data2) <- NULL attr(data$some_datetime, "tzone") <- NULL attr(data2$some_datetime, "tzone") <- NULL - expect_equal(data, data2, check.attributes = FALSE) + expect_equal(data, data2, check.attributes = FALSE, tolerance = 1e-7) # Check data types res <- dbSendQuery(connection, "SELECT * FROM #temp;") @@ -83,10 +84,11 @@ for (testServer in testServers) { expect_equal(as.character(columnInfo$type), c("Date", "POSIXct", "integer", "numeric", "character", "numeric")) } else if (dbms == "snowflake") { expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMPNTZ", "NUMBER", "DOUBLE", "VARCHAR", "NUMBER")) + } else if (dbms == "spark") { + expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMP", "INT", "FLOAT", "STRING", "BIGINT")) } else { warning("Unable to check column types for ", dbms) } - dropEmulatedTempTables(connection) }) } @@ -108,8 +110,9 @@ data <- data.frame( for (testServer in testServers) { test_that(addDbmsToLabel("Converting logical to numeric in insertTable", testServer), { connection <- connect(testServer$connectionDetails) - on.exit(disconnect(connection)) options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + on.exit(dropEmulatedTempTables(connection)) + on.exit(disconnect(connection), add = TRUE) expect_warning( insertTable( connection = connection, @@ -124,6 +127,5 @@ for (testServer in testServers) { names(data2) <- tolower(names(data2)) data2 <- data2[order(data2$id), ] expect_equal(data, data2, check.attributes = FALSE) - dropEmulatedTempTables(connection) }) } diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index 50cf5c4f..bec7eecc 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -8,13 +8,13 @@ sql <- "CREATE TABLE #temp (x INT); for (testServer in testServers) { test_that(addDbmsToLabel("Open and close connection", testServer), { connection <- connect(testServer$connectionDetails) - on.exit(disconnect(connection)) options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) + on.exit(dropEmulatedTempTables(connection)) + on.exit(disconnect(connection), add = TRUE) expect_equal(renderTranslateExecuteSql(connection, sql), c(0, 1, 1, 0)) expect_equal(renderTranslateExecuteSql(connection, sql, runAsBatch = TRUE), c(0, 1, 1, 0)) rowsAffected <- dbSendStatement(connection, sql) expect_equal(dbGetRowsAffected(rowsAffected), 2) dbClearResult(rowsAffected) - dropEmulatedTempTables(connection) }) } From 580263180f95f42e0435542b418469176743c8f6 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 10:13:58 -0400 Subject: [PATCH 18/28] Limiting testing to 1 OS for now --- .github/workflows/R_CMD_check_Hades.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index e0819273..3c0aefe7 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -20,8 +20,6 @@ jobs: fail-fast: false matrix: config: - - {os: windows-latest, r: 'release'} - - {os: macOS-latest, r: 'release'} - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} env: From 06f5fc24e7ae6fc3943d7367685a8ad53256366b Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 10:53:01 -0400 Subject: [PATCH 19/28] Using writeLines instead of message in the hope that will reveal point of error --- tests/testthat/setup.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index e2c05622..75b1a366 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -236,7 +236,7 @@ testServers[[length(testServers) + 1]] <- list( addDbmsToLabel <- function(label, testServer) { # Test sections are not shown in R check, so also printing them here: - message(sprintf("Test: %s (%s)", label, testServer$connectionDetails$dbms)) + writeLines(sprintf("Test: %s (%s)", label, testServer$connectionDetails$dbms)) return(sprintf("%s (%s)", label, testServer$connectionDetails$dbms)) } From bc958ab22a8faf3b38cb6a1112386aefc2c61475 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 12:29:54 -0400 Subject: [PATCH 20/28] Updating Redshift driver --- R/Connect.R | 4 ++-- R/Drivers.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/R/Connect.R b/R/Connect.R index 91fda1ef..783aece6 100644 --- a/R/Connect.R +++ b/R/Connect.R @@ -501,8 +501,8 @@ connectPostgreSql <- function(connectionDetails) { connectRedShift <- function(connectionDetails) { inform("Connecting using Redshift driver") - jarPath <- findPathToJar("^RedshiftJDBC.*\\.jar$", connectionDetails$pathToDriver) - if (grepl("RedshiftJDBC42", jarPath)) { + jarPath <- findPathToJar("^[Rr]edshift.*\\.jar$", connectionDetails$pathToDriver) + if (grepl("RedshiftJDBC42", jarPath) || grepl("redshift-jdbc42", jarPath)) { driver <- getJbcDriverSingleton("com.amazon.redshift.jdbc42.Driver", jarPath) } else { driver <- getJbcDriverSingleton("com.amazon.redshift.jdbc4.Driver", jarPath) diff --git a/R/Drivers.R b/R/Drivers.R index 510a79a1..74d5aa36 100644 --- a/R/Drivers.R +++ b/R/Drivers.R @@ -91,7 +91,7 @@ downloadJdbcDrivers <- function(dbms, pathToDriver = Sys.getenv("DATABASECONNECT jdbcDriverSources <- utils::read.csv(text = "row,dbms, fileName, baseUrl 1,postgresql,postgresqlV42.2.18.zip,https://ohdsi.github.io/DatabaseConnectorJars/ - 2,redshift,redShiftV2.1.0.9.zip,https://ohdsi.github.io/DatabaseConnectorJars/ + 2,redshift,redshift-jdbc42-2.1.0.20.zip,https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.20/ 3,sql server,sqlServerV9.2.0.zip,https://ohdsi.github.io/DatabaseConnectorJars/ 4,oracle,oracleV19.8.zip,https://ohdsi.github.io/DatabaseConnectorJars/ 5,spark,DatabricksJDBC42-2.6.32.1054.zip,https://databricks-bi-artifacts.s3.us-east-2.amazonaws.com/simbaspark-drivers/jdbc/2.6.32/ From 65a05638503a07aac000f09341dc5207ba3eca60 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 13:45:27 -0400 Subject: [PATCH 21/28] Verifying Redshift is the culprit --- tests/testthat/setup.R | 366 ++++++++++++++++++++--------------------- 1 file changed, 183 insertions(+), 183 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index 75b1a366..a3760cb7 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -25,69 +25,69 @@ if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { testServers <- list() # Postgres -parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) -host <- parts[1] -database <- parts[2] -port <- "5432" -connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = createConnectionDetails( - dbms = "postgresql", - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), - server = Sys.getenv("CDM5_POSTGRESQL_SERVER") - ), - connectionDetails2 = details <- createConnectionDetails( - dbms = "postgresql", - connectionString = !!connectionString, - user = Sys.getenv("CDM5_POSTGRESQL_USER"), - password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) - ), - cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), - tempEmulationSchema = NULL -) - -# SQL Server -connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = details <- createConnectionDetails( - dbms = "sql server", - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), - server = Sys.getenv("CDM5_SQL_SERVER_SERVER") - ), - connectionDetails2 = details <- createConnectionDetails( - dbms = "sql server", - connectionString = !!connectionString, - user = Sys.getenv("CDM5_SQL_SERVER_USER"), - password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) - ), - cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), - tempEmulationSchema = NULL -) - -# Oracle -port <- "1521" -parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) -host <- parts[1] -sid <- parts[2] -connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = details <- createConnectionDetails( - dbms = "oracle", - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), - server = Sys.getenv("CDM5_ORACLE_SERVER") - ), - connectionDetails2 = details <- createConnectionDetails( - dbms = "oracle", - connectionString = !!connectionString, - user = Sys.getenv("CDM5_ORACLE_USER"), - password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) - ), - cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), - tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") -) +# parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) +# host <- parts[1] +# database <- parts[2] +# port <- "5432" +# connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = createConnectionDetails( +# dbms = "postgresql", +# user = Sys.getenv("CDM5_POSTGRESQL_USER"), +# password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), +# server = Sys.getenv("CDM5_POSTGRESQL_SERVER") +# ), +# connectionDetails2 = details <- createConnectionDetails( +# dbms = "postgresql", +# connectionString = !!connectionString, +# user = Sys.getenv("CDM5_POSTGRESQL_USER"), +# password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) +# ), +# cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), +# tempEmulationSchema = NULL +# ) +# +# # SQL Server +# connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = details <- createConnectionDetails( +# dbms = "sql server", +# user = Sys.getenv("CDM5_SQL_SERVER_USER"), +# password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), +# server = Sys.getenv("CDM5_SQL_SERVER_SERVER") +# ), +# connectionDetails2 = details <- createConnectionDetails( +# dbms = "sql server", +# connectionString = !!connectionString, +# user = Sys.getenv("CDM5_SQL_SERVER_USER"), +# password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) +# ), +# cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), +# tempEmulationSchema = NULL +# ) +# +# # Oracle +# port <- "1521" +# parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) +# host <- parts[1] +# sid <- parts[2] +# connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = details <- createConnectionDetails( +# dbms = "oracle", +# user = Sys.getenv("CDM5_ORACLE_USER"), +# password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), +# server = Sys.getenv("CDM5_ORACLE_SERVER") +# ), +# connectionDetails2 = details <- createConnectionDetails( +# dbms = "oracle", +# connectionString = !!connectionString, +# user = Sys.getenv("CDM5_ORACLE_USER"), +# password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) +# ), +# cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), +# tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") +# ) # RedShift parts <- unlist(strsplit(Sys.getenv("CDM5_REDSHIFT_SERVER"), "/")) @@ -113,126 +113,126 @@ testServers[[length(testServers) + 1]] <- list( ) # Snowflake -testServers[[length(testServers) + 1]] <- list( - connectionDetails = details <- createConnectionDetails( - dbms = "snowflake", - user = Sys.getenv("CDM_SNOWFLAKE_USER"), - password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), - connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") - ), - NULL, - cdmDatabaseSchema = Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), - tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") -) - -# Databricks (Spark) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = details <- createConnectionDetails( - dbms = "spark", - user = Sys.getenv("CDM5_SPARK_USER"), - password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")), - connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING") - ), - NULL, - cdmDatabaseSchema = Sys.getenv("CDM5_SPARK_CDM_SCHEMA"), - tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") -) - -# SQLite -sqliteFile <- tempfile(fileext = ".sqlite") -if (testthat::is_testing()) { - withr::defer(unlink(sqliteFile, force = TRUE), testthat::teardown_env()) -} -cdmDatabaseSchema <- "main" -connectionDetails <- createConnectionDetails( - dbms = "sqlite", - server = sqliteFile -) -connection <- connect(connectionDetails) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "person", - data = data.frame(person_id = seq_len(100), - year_of_birth = round(runif(100, 1900, 2000)), - race_concept_id = as.numeric(NA), - gender_concept_id = rep(c(8507, 8532), 50), - care_site_id = round(runif(100, 1, 1e7))) -) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "observation_period", - data = data.frame(person_id = seq_len(100), - observation_period_start_date = rep(as.Date("2000-01-01"), 100), - observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), - period_type_concept_id = rep(0, 100)) -) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "vocabulary", - data = data.frame(vocabulary_id = c("a", "b"), - vocabulary_name = c("a", "b"), - vocabulary_reference= c("a", "b"), - vocabulary_version = c("a", "b"), - vocabulary_concpet_id = c(1, 2)) -) -disconnect(connection) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = connectionDetails, - NULL, - cdmDatabaseSchema = cdmDatabaseSchema, - tempEmulationSchema = NULL -) - -# DuckDB -duckdbFile <- tempfile(fileext = ".duckdb") -if (testthat::is_testing()) { - withr::defer(unlink(duckdbFile, force = TRUE), testthat::teardown_env()) -} -cdmDatabaseSchema <- "main" -connectionDetails <- createConnectionDetails( - dbms = "duckdb", - server = duckdbFile -) -connection <- connect(connectionDetails) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "person", - data = data.frame(person_id = seq_len(100), - year_of_birth = round(runif(100, 1900, 2000)), - race_concept_id = as.numeric(NA), - gender_concept_id = rep(c(8507, 8532), 50), - care_site_id = round(runif(100, 1, 1e7))) -) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "observation_period", - data = data.frame(person_id = seq_len(100), - observation_period_start_date = rep(as.Date("2000-01-01"), 100), - observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), - period_type_concept_id = rep(0, 100)) -) -insertTable( - connection = connection, - databaseSchema = cdmDatabaseSchema, - tableName = "vocabulary", - data = data.frame(vocabulary_id = c("a", "b"), - vocabulary_name = c("a", "b"), - vocabulary_reference= c("a", "b"), - vocabulary_version = c("a", "b"), - vocabulary_concpet_id = c(1, 2)) -) -disconnect(connection) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = connectionDetails, - NULL, - cdmDatabaseSchema = cdmDatabaseSchema, - tempEmulationSchema = NULL -) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = details <- createConnectionDetails( +# dbms = "snowflake", +# user = Sys.getenv("CDM_SNOWFLAKE_USER"), +# password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), +# connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") +# ), +# NULL, +# cdmDatabaseSchema = Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), +# tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") +# ) +# +# # Databricks (Spark) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = details <- createConnectionDetails( +# dbms = "spark", +# user = Sys.getenv("CDM5_SPARK_USER"), +# password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")), +# connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING") +# ), +# NULL, +# cdmDatabaseSchema = Sys.getenv("CDM5_SPARK_CDM_SCHEMA"), +# tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") +# ) +# +# # SQLite +# sqliteFile <- tempfile(fileext = ".sqlite") +# if (testthat::is_testing()) { +# withr::defer(unlink(sqliteFile, force = TRUE), testthat::teardown_env()) +# } +# cdmDatabaseSchema <- "main" +# connectionDetails <- createConnectionDetails( +# dbms = "sqlite", +# server = sqliteFile +# ) +# connection <- connect(connectionDetails) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "person", +# data = data.frame(person_id = seq_len(100), +# year_of_birth = round(runif(100, 1900, 2000)), +# race_concept_id = as.numeric(NA), +# gender_concept_id = rep(c(8507, 8532), 50), +# care_site_id = round(runif(100, 1, 1e7))) +# ) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "observation_period", +# data = data.frame(person_id = seq_len(100), +# observation_period_start_date = rep(as.Date("2000-01-01"), 100), +# observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), +# period_type_concept_id = rep(0, 100)) +# ) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "vocabulary", +# data = data.frame(vocabulary_id = c("a", "b"), +# vocabulary_name = c("a", "b"), +# vocabulary_reference= c("a", "b"), +# vocabulary_version = c("a", "b"), +# vocabulary_concpet_id = c(1, 2)) +# ) +# disconnect(connection) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = connectionDetails, +# NULL, +# cdmDatabaseSchema = cdmDatabaseSchema, +# tempEmulationSchema = NULL +# ) +# +# # DuckDB +# duckdbFile <- tempfile(fileext = ".duckdb") +# if (testthat::is_testing()) { +# withr::defer(unlink(duckdbFile, force = TRUE), testthat::teardown_env()) +# } +# cdmDatabaseSchema <- "main" +# connectionDetails <- createConnectionDetails( +# dbms = "duckdb", +# server = duckdbFile +# ) +# connection <- connect(connectionDetails) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "person", +# data = data.frame(person_id = seq_len(100), +# year_of_birth = round(runif(100, 1900, 2000)), +# race_concept_id = as.numeric(NA), +# gender_concept_id = rep(c(8507, 8532), 50), +# care_site_id = round(runif(100, 1, 1e7))) +# ) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "observation_period", +# data = data.frame(person_id = seq_len(100), +# observation_period_start_date = rep(as.Date("2000-01-01"), 100), +# observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), +# period_type_concept_id = rep(0, 100)) +# ) +# insertTable( +# connection = connection, +# databaseSchema = cdmDatabaseSchema, +# tableName = "vocabulary", +# data = data.frame(vocabulary_id = c("a", "b"), +# vocabulary_name = c("a", "b"), +# vocabulary_reference= c("a", "b"), +# vocabulary_version = c("a", "b"), +# vocabulary_concpet_id = c(1, 2)) +# ) +# disconnect(connection) +# testServers[[length(testServers) + 1]] <- list( +# connectionDetails = connectionDetails, +# NULL, +# cdmDatabaseSchema = cdmDatabaseSchema, +# tempEmulationSchema = NULL +# ) addDbmsToLabel <- function(label, testServer) { # Test sections are not shown in R check, so also printing them here: From a9785aee7b9b396c01c8a8fc8a65e5930a1c94d5 Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 14:20:29 -0400 Subject: [PATCH 22/28] Reducing number of rows to insert on RedShift --- tests/testthat/setup.R | 366 +++++++++++++++--------------- tests/testthat/test-insertTable.R | 28 ++- 2 files changed, 201 insertions(+), 193 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index a3760cb7..27031ae4 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -25,69 +25,69 @@ if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { testServers <- list() # Postgres -# parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) -# host <- parts[1] -# database <- parts[2] -# port <- "5432" -# connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = createConnectionDetails( -# dbms = "postgresql", -# user = Sys.getenv("CDM5_POSTGRESQL_USER"), -# password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), -# server = Sys.getenv("CDM5_POSTGRESQL_SERVER") -# ), -# connectionDetails2 = details <- createConnectionDetails( -# dbms = "postgresql", -# connectionString = !!connectionString, -# user = Sys.getenv("CDM5_POSTGRESQL_USER"), -# password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) -# ), -# cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), -# tempEmulationSchema = NULL -# ) -# -# # SQL Server -# connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = details <- createConnectionDetails( -# dbms = "sql server", -# user = Sys.getenv("CDM5_SQL_SERVER_USER"), -# password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), -# server = Sys.getenv("CDM5_SQL_SERVER_SERVER") -# ), -# connectionDetails2 = details <- createConnectionDetails( -# dbms = "sql server", -# connectionString = !!connectionString, -# user = Sys.getenv("CDM5_SQL_SERVER_USER"), -# password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) -# ), -# cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), -# tempEmulationSchema = NULL -# ) -# -# # Oracle -# port <- "1521" -# parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) -# host <- parts[1] -# sid <- parts[2] -# connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = details <- createConnectionDetails( -# dbms = "oracle", -# user = Sys.getenv("CDM5_ORACLE_USER"), -# password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), -# server = Sys.getenv("CDM5_ORACLE_SERVER") -# ), -# connectionDetails2 = details <- createConnectionDetails( -# dbms = "oracle", -# connectionString = !!connectionString, -# user = Sys.getenv("CDM5_ORACLE_USER"), -# password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) -# ), -# cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), -# tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") -# ) +parts <- unlist(strsplit(Sys.getenv("CDM5_POSTGRESQL_SERVER"), "/")) +host <- parts[1] +database <- parts[2] +port <- "5432" +connectionString <- paste0("jdbc:postgresql://", host, ":", port, "/", database) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = createConnectionDetails( + dbms = "postgresql", + user = Sys.getenv("CDM5_POSTGRESQL_USER"), + password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")), + server = Sys.getenv("CDM5_POSTGRESQL_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "postgresql", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_POSTGRESQL_USER"), + password = URLdecode(Sys.getenv("CDM5_POSTGRESQL_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_POSTGRESQL_CDM54_SCHEMA"), + tempEmulationSchema = NULL +) + +# SQL Server +connectionString <- paste0("jdbc:sqlserver://", Sys.getenv("CDM5_SQL_SERVER_SERVER")) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "sql server", + user = Sys.getenv("CDM5_SQL_SERVER_USER"), + password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")), + server = Sys.getenv("CDM5_SQL_SERVER_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "sql server", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_SQL_SERVER_USER"), + password = URLdecode(Sys.getenv("CDM5_SQL_SERVER_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_SQL_SERVER_CDM54_SCHEMA"), + tempEmulationSchema = NULL +) + +# Oracle +port <- "1521" +parts <- unlist(strsplit(Sys.getenv("CDM5_ORACLE_SERVER"), "/")) +host <- parts[1] +sid <- parts[2] +connectionString <- paste0("jdbc:oracle:thin:@", host, ":", port, ":", sid) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "oracle", + user = Sys.getenv("CDM5_ORACLE_USER"), + password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")), + server = Sys.getenv("CDM5_ORACLE_SERVER") + ), + connectionDetails2 = details <- createConnectionDetails( + dbms = "oracle", + connectionString = !!connectionString, + user = Sys.getenv("CDM5_ORACLE_USER"), + password = URLdecode(Sys.getenv("CDM5_ORACLE_PASSWORD")) + ), + cdmDatabaseSchema = Sys.getenv("CDM5_ORACLE_CDM54_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM5_ORACLE_OHDSI_SCHEMA") +) # RedShift parts <- unlist(strsplit(Sys.getenv("CDM5_REDSHIFT_SERVER"), "/")) @@ -113,126 +113,126 @@ testServers[[length(testServers) + 1]] <- list( ) # Snowflake -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = details <- createConnectionDetails( -# dbms = "snowflake", -# user = Sys.getenv("CDM_SNOWFLAKE_USER"), -# password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), -# connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") -# ), -# NULL, -# cdmDatabaseSchema = Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), -# tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") -# ) -# -# # Databricks (Spark) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = details <- createConnectionDetails( -# dbms = "spark", -# user = Sys.getenv("CDM5_SPARK_USER"), -# password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")), -# connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING") -# ), -# NULL, -# cdmDatabaseSchema = Sys.getenv("CDM5_SPARK_CDM_SCHEMA"), -# tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") -# ) -# -# # SQLite -# sqliteFile <- tempfile(fileext = ".sqlite") -# if (testthat::is_testing()) { -# withr::defer(unlink(sqliteFile, force = TRUE), testthat::teardown_env()) -# } -# cdmDatabaseSchema <- "main" -# connectionDetails <- createConnectionDetails( -# dbms = "sqlite", -# server = sqliteFile -# ) -# connection <- connect(connectionDetails) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "person", -# data = data.frame(person_id = seq_len(100), -# year_of_birth = round(runif(100, 1900, 2000)), -# race_concept_id = as.numeric(NA), -# gender_concept_id = rep(c(8507, 8532), 50), -# care_site_id = round(runif(100, 1, 1e7))) -# ) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "observation_period", -# data = data.frame(person_id = seq_len(100), -# observation_period_start_date = rep(as.Date("2000-01-01"), 100), -# observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), -# period_type_concept_id = rep(0, 100)) -# ) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "vocabulary", -# data = data.frame(vocabulary_id = c("a", "b"), -# vocabulary_name = c("a", "b"), -# vocabulary_reference= c("a", "b"), -# vocabulary_version = c("a", "b"), -# vocabulary_concpet_id = c(1, 2)) -# ) -# disconnect(connection) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = connectionDetails, -# NULL, -# cdmDatabaseSchema = cdmDatabaseSchema, -# tempEmulationSchema = NULL -# ) -# -# # DuckDB -# duckdbFile <- tempfile(fileext = ".duckdb") -# if (testthat::is_testing()) { -# withr::defer(unlink(duckdbFile, force = TRUE), testthat::teardown_env()) -# } -# cdmDatabaseSchema <- "main" -# connectionDetails <- createConnectionDetails( -# dbms = "duckdb", -# server = duckdbFile -# ) -# connection <- connect(connectionDetails) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "person", -# data = data.frame(person_id = seq_len(100), -# year_of_birth = round(runif(100, 1900, 2000)), -# race_concept_id = as.numeric(NA), -# gender_concept_id = rep(c(8507, 8532), 50), -# care_site_id = round(runif(100, 1, 1e7))) -# ) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "observation_period", -# data = data.frame(person_id = seq_len(100), -# observation_period_start_date = rep(as.Date("2000-01-01"), 100), -# observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), -# period_type_concept_id = rep(0, 100)) -# ) -# insertTable( -# connection = connection, -# databaseSchema = cdmDatabaseSchema, -# tableName = "vocabulary", -# data = data.frame(vocabulary_id = c("a", "b"), -# vocabulary_name = c("a", "b"), -# vocabulary_reference= c("a", "b"), -# vocabulary_version = c("a", "b"), -# vocabulary_concpet_id = c(1, 2)) -# ) -# disconnect(connection) -# testServers[[length(testServers) + 1]] <- list( -# connectionDetails = connectionDetails, -# NULL, -# cdmDatabaseSchema = cdmDatabaseSchema, -# tempEmulationSchema = NULL -# ) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "snowflake", + user = Sys.getenv("CDM_SNOWFLAKE_USER"), + password = URLdecode(Sys.getenv("CDM_SNOWFLAKE_PASSWORD")), + connectionString = Sys.getenv("CDM_SNOWFLAKE_CONNECTION_STRING") + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM_SNOWFLAKE_CDM53_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM_SNOWFLAKE_OHDSI_SCHEMA") +) + +# Databricks (Spark) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "spark", + user = Sys.getenv("CDM5_SPARK_USER"), + password = URLdecode(Sys.getenv("CDM5_SPARK_PASSWORD")), + connectionString = Sys.getenv("CDM5_SPARK_CONNECTION_STRING") + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM5_SPARK_CDM_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") +) + +# SQLite +sqliteFile <- tempfile(fileext = ".sqlite") +if (testthat::is_testing()) { + withr::defer(unlink(sqliteFile, force = TRUE), testthat::teardown_env()) +} +cdmDatabaseSchema <- "main" +connectionDetails <- createConnectionDetails( + dbms = "sqlite", + server = sqliteFile +) +connection <- connect(connectionDetails) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "person", + data = data.frame(person_id = seq_len(100), + year_of_birth = round(runif(100, 1900, 2000)), + race_concept_id = as.numeric(NA), + gender_concept_id = rep(c(8507, 8532), 50), + care_site_id = round(runif(100, 1, 1e7))) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "observation_period", + data = data.frame(person_id = seq_len(100), + observation_period_start_date = rep(as.Date("2000-01-01"), 100), + observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), + period_type_concept_id = rep(0, 100)) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "vocabulary", + data = data.frame(vocabulary_id = c("a", "b"), + vocabulary_name = c("a", "b"), + vocabulary_reference= c("a", "b"), + vocabulary_version = c("a", "b"), + vocabulary_concpet_id = c(1, 2)) +) +disconnect(connection) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = connectionDetails, + NULL, + cdmDatabaseSchema = cdmDatabaseSchema, + tempEmulationSchema = NULL +) + +# DuckDB +duckdbFile <- tempfile(fileext = ".duckdb") +if (testthat::is_testing()) { + withr::defer(unlink(duckdbFile, force = TRUE), testthat::teardown_env()) +} +cdmDatabaseSchema <- "main" +connectionDetails <- createConnectionDetails( + dbms = "duckdb", + server = duckdbFile +) +connection <- connect(connectionDetails) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "person", + data = data.frame(person_id = seq_len(100), + year_of_birth = round(runif(100, 1900, 2000)), + race_concept_id = as.numeric(NA), + gender_concept_id = rep(c(8507, 8532), 50), + care_site_id = round(runif(100, 1, 1e7))) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "observation_period", + data = data.frame(person_id = seq_len(100), + observation_period_start_date = rep(as.Date("2000-01-01"), 100), + observation_period_end_date = rep(as.Date(c("2000-06-01", "2001-12-31")), 50), + period_type_concept_id = rep(0, 100)) +) +insertTable( + connection = connection, + databaseSchema = cdmDatabaseSchema, + tableName = "vocabulary", + data = data.frame(vocabulary_id = c("a", "b"), + vocabulary_name = c("a", "b"), + vocabulary_reference= c("a", "b"), + vocabulary_version = c("a", "b"), + vocabulary_concpet_id = c(1, 2)) +) +disconnect(connection) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = connectionDetails, + NULL, + cdmDatabaseSchema = cdmDatabaseSchema, + tempEmulationSchema = NULL +) addDbmsToLabel <- function(label, testServer) { # Test sections are not shown in R check, so also printing them here: diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index f55c1662..948d37aa 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -42,6 +42,14 @@ data$big_ints[8] <- 3.3043e+10 for (testServer in testServers) { test_that(addDbmsToLabel("Insert data", testServer), { + if (testServer$connectionDetails$dbms == "redshift") { + # Inserting on RedShift is slow (Without bulk upload), so + # taking subset: + dataCopy1 <- data[1:10, ] + } else { + dataCopy1 <- data + } + connection <- connect(testServer$connectionDetails) options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) on.exit(dropEmulatedTempTables(connection)) @@ -49,21 +57,21 @@ for (testServer in testServers) { insertTable( connection = connection, tableName = "#temp", - data = data, + data = dataCopy1, createTable = TRUE, tempTable = TRUE ) # Check data on server is same as local - data2 <- renderTranslateQuerySql(connection, "SELECT * FROM #temp;", integer64AsNumeric = FALSE) - names(data2) <- tolower(names(data2)) - data <- data[order(data$person_id), ] - data2 <- data2[order(data2$person_id), ] - row.names(data) <- NULL - row.names(data2) <- NULL - attr(data$some_datetime, "tzone") <- NULL - attr(data2$some_datetime, "tzone") <- NULL - expect_equal(data, data2, check.attributes = FALSE, tolerance = 1e-7) + dataCopy2 <- renderTranslateQuerySql(connection, "SELECT * FROM #temp;", integer64AsNumeric = FALSE) + names(dataCopy2) <- tolower(names(dataCopy2)) + dataCopy1 <- data[order(dataCopy1$person_id), ] + dataCopy2 <- dataCopy2[order(dataCopy2$person_id), ] + row.names(dataCopy1) <- NULL + row.names(dataCopy2) <- NULL + attr(dataCopy1$some_datetime, "tzone") <- NULL + attr(dataCopy2$some_datetime, "tzone") <- NULL + expect_equal(dataCopy1, dataCopy2, check.attributes = FALSE, tolerance = 1e-7) # Check data types res <- dbSendQuery(connection, "SELECT * FROM #temp;") From bd94697c9898131e32070a6e1dcdff58bebcb60f Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 14:42:08 -0400 Subject: [PATCH 23/28] Restoring other OSs --- .github/workflows/R_CMD_check_Hades.yaml | 2 ++ .github/workflows/R_CMD_check_main_weekly.yaml | 2 ++ NEWS.md | 2 ++ 3 files changed, 6 insertions(+) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index 3c0aefe7..e0819273 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -20,6 +20,8 @@ jobs: fail-fast: false matrix: config: + - {os: windows-latest, r: 'release'} + - {os: macOS-latest, r: 'release'} - {os: ubuntu-20.04, r: 'release', rspm: "https://packagemanager.rstudio.com/cran/__linux__/focal/latest"} env: diff --git a/.github/workflows/R_CMD_check_main_weekly.yaml b/.github/workflows/R_CMD_check_main_weekly.yaml index d7274aa4..c2c2a074 100644 --- a/.github/workflows/R_CMD_check_main_weekly.yaml +++ b/.github/workflows/R_CMD_check_main_weekly.yaml @@ -48,6 +48,8 @@ jobs: CDM5_SPARK_USER: ${{ secrets.CDM5_SPARK_USER }} CDM5_SPARK_PASSWORD: ${{ secrets.CDM5_SPARK_PASSWORD }} CDM5_SPARK_CONNECTION_STRING: ${{ secrets.CDM5_SPARK_CONNECTION_STRING }} + CDM5_SPARK_CDM_SCHEMA: ${{ secrets.CDM5_SPARK_CDM_SCHEMA }} + CDM5_SPARK_OHDSI_SCHEMA: ${{ secrets.CDM5_SPARK_OHDSI_SCHEMA }} steps: - uses: actions/checkout@v3 diff --git a/NEWS.md b/NEWS.md index 64fa8ff9..5d8e9c50 100644 --- a/NEWS.md +++ b/NEWS.md @@ -5,6 +5,8 @@ Changes: 1. On Snowflake always using `QUOTED_IDENTIFIERS_IGNORE_CASE=TRUE` to avoid name mismatches when using quotes. +2. Updated Redshift drivers. + DatabaseConnector 6.2.4 ======================= From baa049f7dadca3bb73419a221a73c3a5fba3a40f Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 15:51:55 -0400 Subject: [PATCH 24/28] Adding unit tests for BQ --- .github/workflows/R_CMD_check_Hades.yaml | 4 +++ tests/testthat/setup.R | 37 +++++++++++++++++++----- tests/testthat/test-insertTable.R | 6 ++-- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/.github/workflows/R_CMD_check_Hades.yaml b/.github/workflows/R_CMD_check_Hades.yaml index e0819273..01d90a51 100644 --- a/.github/workflows/R_CMD_check_Hades.yaml +++ b/.github/workflows/R_CMD_check_Hades.yaml @@ -58,6 +58,10 @@ jobs: CDM5_SPARK_CONNECTION_STRING: ${{ secrets.CDM5_SPARK_CONNECTION_STRING }} CDM5_SPARK_CDM_SCHEMA: ${{ secrets.CDM5_SPARK_CDM_SCHEMA }} CDM5_SPARK_OHDSI_SCHEMA: ${{ secrets.CDM5_SPARK_OHDSI_SCHEMA }} + CDM_BIG_QUERY_CONNECTION_STRING: ${{ secrets.CDM_BIG_QUERY_CONNECTION_STRING }} + CDM_BIG_QUERY_KEY_FILE: ${{ secrets.CDM_BIG_QUERY_KEY_FILE }} + CDM_BIG_QUERY_CDM_SCHEMA: ${{ secrets.CDM_BIG_QUERY_CDM_SCHEMA }} + CDM_BIG_QUERY_OHDSI_SCHEMA: ${{ secrets.CDM_BIG_QUERY_OHDSI_SCHEMA }} steps: - uses: actions/checkout@v3 diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index 27031ae4..c07f2e97 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -1,4 +1,5 @@ library(DatabaseConnector) + # Download the JDBC drivers used in the tests ---------------------------------- if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { oldJarFolder <- Sys.getenv("DATABASECONNECTOR_JAR_FOLDER") @@ -10,6 +11,7 @@ if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { downloadJdbcDrivers("redshift") downloadJdbcDrivers("spark") downloadJdbcDrivers("snowflake") + downloadJdbcDrivers("bigquery") if (testthat::is_testing()) { withr::defer({ @@ -21,6 +23,13 @@ if (Sys.getenv("DONT_DOWNLOAD_JDBC_DRIVERS", "") != "TRUE") { } } +# Helper functions ------------------------------------------------------------- +addDbmsToLabel <- function(label, testServer) { + # Test sections are not shown in R check, so also printing them here: + writeLines(sprintf("Test: %s (%s)", label, testServer$connectionDetails$dbms)) + return(sprintf("%s (%s)", label, testServer$connectionDetails$dbms)) +} + # Create a list with testing server details ------------------------------ testServers <- list() @@ -138,6 +147,27 @@ testServers[[length(testServers) + 1]] <- list( tempEmulationSchema = Sys.getenv("CDM5_SPARK_OHDSI_SCHEMA") ) +# BigQuery +bqKeyFile <- tempfile(fileext = ".json") +writeLines(Sys.getenv("CDM_BIG_QUERY_KEY_FILE"), bqKeyFile) +if (testthat::is_testing()) { + withr::defer(unlink(bqKeyFile, force = TRUE), testthat::teardown_env()) +} +bqConnectionString <- gsub("", + normalizePath(bqKeyFile, winslash = "/"), + Sys.getenv("CDM_BIG_QUERY_CONNECTION_STRING")) +testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "bigquery", + user = "", + password = "", + connectionString = !!bqConnectionString + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM_BIG_QUERY_CDM_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM_BIG_QUERY_OHDSI_SCHEMA") +) + # SQLite sqliteFile <- tempfile(fileext = ".sqlite") if (testthat::is_testing()) { @@ -233,10 +263,3 @@ testServers[[length(testServers) + 1]] <- list( cdmDatabaseSchema = cdmDatabaseSchema, tempEmulationSchema = NULL ) - -addDbmsToLabel <- function(label, testServer) { - # Test sections are not shown in R check, so also printing them here: - writeLines(sprintf("Test: %s (%s)", label, testServer$connectionDetails$dbms)) - return(sprintf("%s (%s)", label, testServer$connectionDetails$dbms)) -} - diff --git a/tests/testthat/test-insertTable.R b/tests/testthat/test-insertTable.R index 948d37aa..fde69f64 100644 --- a/tests/testthat/test-insertTable.R +++ b/tests/testthat/test-insertTable.R @@ -42,8 +42,8 @@ data$big_ints[8] <- 3.3043e+10 for (testServer in testServers) { test_that(addDbmsToLabel("Insert data", testServer), { - if (testServer$connectionDetails$dbms == "redshift") { - # Inserting on RedShift is slow (Without bulk upload), so + if (testServer$connectionDetails$dbms %in% c("redshift", "bigquery")) { + # Inserting on RedShift or BigQuery is slow (Without bulk upload), so # taking subset: dataCopy1 <- data[1:10, ] } else { @@ -94,6 +94,8 @@ for (testServer in testServers) { expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMPNTZ", "NUMBER", "DOUBLE", "VARCHAR", "NUMBER")) } else if (dbms == "spark") { expect_equal(as.character(columnInfo$field.type), c("DATE", "TIMESTAMP", "INT", "FLOAT", "STRING", "BIGINT")) + } else if (dbms == "bigquery") { + expect_equal(as.character(columnInfo$field.type), c("DATE", "DATETIME", "INT64", "FLOAT64", "STRING", "INT64")) } else { warning("Unable to check column types for ", dbms) } From c90cc4b5e680a7754e5d94c9a75b65c1ae1e3fac Mon Sep 17 00:00:00 2001 From: Schuemie Date: Sun, 22 Oct 2023 16:15:00 -0400 Subject: [PATCH 25/28] Only testing BigQuery on Windows to avoid rate limit --- tests/testthat/setup.R | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/tests/testthat/setup.R b/tests/testthat/setup.R index c07f2e97..63c5be46 100644 --- a/tests/testthat/setup.R +++ b/tests/testthat/setup.R @@ -148,25 +148,28 @@ testServers[[length(testServers) + 1]] <- list( ) # BigQuery -bqKeyFile <- tempfile(fileext = ".json") -writeLines(Sys.getenv("CDM_BIG_QUERY_KEY_FILE"), bqKeyFile) -if (testthat::is_testing()) { - withr::defer(unlink(bqKeyFile, force = TRUE), testthat::teardown_env()) +# To avoid rate limit on BigQuery, only test on 1 OS: +if (.Platform$OS.type == "windows") { + bqKeyFile <- tempfile(fileext = ".json") + writeLines(Sys.getenv("CDM_BIG_QUERY_KEY_FILE"), bqKeyFile) + if (testthat::is_testing()) { + withr::defer(unlink(bqKeyFile, force = TRUE), testthat::teardown_env()) + } + bqConnectionString <- gsub("", + normalizePath(bqKeyFile, winslash = "/"), + Sys.getenv("CDM_BIG_QUERY_CONNECTION_STRING")) + testServers[[length(testServers) + 1]] <- list( + connectionDetails = details <- createConnectionDetails( + dbms = "bigquery", + user = "", + password = "", + connectionString = !!bqConnectionString + ), + NULL, + cdmDatabaseSchema = Sys.getenv("CDM_BIG_QUERY_CDM_SCHEMA"), + tempEmulationSchema = Sys.getenv("CDM_BIG_QUERY_OHDSI_SCHEMA") + ) } -bqConnectionString <- gsub("", - normalizePath(bqKeyFile, winslash = "/"), - Sys.getenv("CDM_BIG_QUERY_CONNECTION_STRING")) -testServers[[length(testServers) + 1]] <- list( - connectionDetails = details <- createConnectionDetails( - dbms = "bigquery", - user = "", - password = "", - connectionString = !!bqConnectionString - ), - NULL, - cdmDatabaseSchema = Sys.getenv("CDM_BIG_QUERY_CDM_SCHEMA"), - tempEmulationSchema = Sys.getenv("CDM_BIG_QUERY_OHDSI_SCHEMA") -) # SQLite sqliteFile <- tempfile(fileext = ".sqlite") From 7bbfba942aa726e5c7711ba6fcf76bc424c21774 Mon Sep 17 00:00:00 2001 From: schuemie Date: Thu, 26 Oct 2023 17:01:36 +0200 Subject: [PATCH 26/28] Fixing waiting times on BigQuery to avoid rate limit issues --- NEWS.md | 4 ++++ R/Sql.R | 29 +++++++++-------------------- tests/testthat/test-sendUpdates.R | 2 +- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/NEWS.md b/NEWS.md index 5d8e9c50..c3105391 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,10 @@ Changes: 2. Updated Redshift drivers. +Bugfixes: + +1. Fix bug on BigQuery where wait time was too short to avoid rate limit error. + DatabaseConnector 6.2.4 ======================= diff --git a/R/Sql.R b/R/Sql.R index 566391b3..7453de77 100644 --- a/R/Sql.R +++ b/R/Sql.R @@ -255,44 +255,33 @@ lowLevelExecuteSql <- function(connection, sql) { UseMethod("lowLevelExecuteSql", connection) } -delayIfNecessary <- function(sql, regex, executionTimeList, threshold) { +ddlExecutionTimes <- new.env() +insertExecutionTimes <- new.env() + +delayIfNecessary <- function(sql, regex, executionTimes, threshold) { regexGroups <- stringr::str_match(sql, stringr::regex(regex, ignore_case = TRUE)) tableName <- regexGroups[3] if (!is.na(tableName) && !is.null(tableName)) { currentTime <- Sys.time() - lastExecutedTime <- executionTimeList[[tableName]] + lastExecutedTime <- executionTimes[[tableName]] if (!is.na(lastExecutedTime) && !is.null(lastExecutedTime)) { - delta <- currentTime - lastExecutedTime + delta <- difftime(currentTime, lastExecutedTime, units = "secs") if (delta < threshold) { Sys.sleep(threshold - delta) } } - - executionTimeList[[tableName]] <- currentTime + executionTimes[[tableName]] <- currentTime } - return(executionTimeList) } delayIfNecessaryForDdl <- function(sql) { - ddlList <- getOption("ddlList") - if (is.null(ddlList)) { - ddlList <- list() - } - regexForDdl <- "(^CREATE\\s+TABLE\\s+IF\\s+EXISTS|^CREATE\\s+TABLE|^DROP\\s+TABLE\\s+IF\\s+EXISTS|^DROP\\s+TABLE)\\s+([a-zA-Z0-9_$#-]*\\.?\\s*(?:[a-zA-Z0-9_]+)*)" - updatedList <- delayIfNecessary(sql, regexForDdl, ddlList, 5) - options(ddlList = updatedList) + delayIfNecessary(sql, regexForDdl, ddlExecutionTimes, 5) } delayIfNecessaryForInsert <- function(sql) { - insetList <- getOption("insetList") - if (is.null(insetList)) { - insetList <- list() - } - regexForInsert <- "(^INSERT\\s+INTO)\\s+([a-zA-Z0-9_$#-]*\\.?\\s*(?:[a-zA-Z0-9_]+)*)" - updatedList <- delayIfNecessary(sql, regexForInsert, insetList, 5) - options(insetList = updatedList) + delayIfNecessary(sql, regexForInsert, insertExecutionTimes, 5) } #' @export diff --git a/tests/testthat/test-sendUpdates.R b/tests/testthat/test-sendUpdates.R index bec7eecc..937b8a45 100644 --- a/tests/testthat/test-sendUpdates.R +++ b/tests/testthat/test-sendUpdates.R @@ -6,7 +6,7 @@ sql <- "CREATE TABLE #temp (x INT); DROP TABLE #temp;" for (testServer in testServers) { - test_that(addDbmsToLabel("Open and close connection", testServer), { + test_that(addDbmsToLabel("Send updates", testServer), { connection <- connect(testServer$connectionDetails) options(sqlRenderTempEmulationSchema = testServer$tempEmulationSchema) on.exit(dropEmulatedTempTables(connection)) From 105405047c12c144c4486ecfacb41d68a70be778 Mon Sep 17 00:00:00 2001 From: schuemie Date: Wed, 8 Nov 2023 14:22:50 +0100 Subject: [PATCH 27/28] Regenerating documentation --- DESCRIPTION | 2 +- NEWS.md | 2 ++ cran-comments.md | 4 ++-- docs/404.html | 2 +- docs/articles/Connecting.html | 6 +++--- docs/articles/DbiAndDbplyr.html | 4 ++-- docs/articles/Querying.html | 4 ++-- docs/articles/index.html | 2 +- docs/authors.html | 2 +- docs/index.html | 2 +- docs/news/index.html | 13 +++++++++++-- docs/pkgdown.yml | 2 +- docs/pull_request_template.html | 2 +- docs/reference/DatabaseConnector-package.html | 2 +- .../DatabaseConnectorDbiResult-class.html | 2 +- .../DatabaseConnectorDriver-class.html | 2 +- docs/reference/DatabaseConnectorDriver.html | 2 +- .../DatabaseConnectorJdbcResult-class.html | 2 +- .../assertTempEmulationSchemaSet.html | 2 +- docs/reference/computeDataHash.html | 2 +- docs/reference/connect.html | 2 +- docs/reference/createConnectionDetails.html | 2 +- .../reference/createDbiConnectionDetails.html | 2 +- docs/reference/createZipFile.html | 2 +- docs/reference/dateAdd.html | 2 +- docs/reference/dateDiff.html | 2 +- docs/reference/dateFromParts.html | 2 +- docs/reference/day.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...ult-DatabaseConnectorDbiResult-method.html | 2 +- ...lt-DatabaseConnectorJdbcResult-method.html | 2 +- ...nfo-DatabaseConnectorDbiResult-method.html | 2 +- ...fo-DatabaseConnectorJdbcResult-method.html | 2 +- ...onnect-DatabaseConnectorDriver-method.html | 2 +- ...le-DatabaseConnectorConnection-method.html | 2 +- ...ct-DatabaseConnectorConnection-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...tch-DatabaseConnectorDbiResult-method.html | 2 +- ...ch-DatabaseConnectorJdbcResult-method.html | 2 +- ...fo-DatabaseConnectorConnection-method.html | 2 +- ...etInfo-DatabaseConnectorDriver-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...unt-DatabaseConnectorDbiResult-method.html | 2 +- ...nt-DatabaseConnectorJdbcResult-method.html | 2 +- ...ted-DatabaseConnectorDbiResult-method.html | 2 +- ...ed-DatabaseConnectorJdbcResult-method.html | 2 +- ...ent-DatabaseConnectorDbiResult-method.html | 2 +- ...nt-DatabaseConnectorJdbcResult-method.html | 2 +- ...ted-DatabaseConnectorDbiResult-method.html | 2 +- ...ed-DatabaseConnectorJdbcResult-method.html | 2 +- ...DatabaseConnectorDbiConnection-method.html | 2 +- ...atabaseConnectorJdbcConnection-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...es-DatabaseConnectorConnection-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...atabaseConnectorConnection-ANY-method.html | 2 +- ...nnectorDbiConnection-character-method.html | 2 +- ...nectorJdbcConnection-character-method.html | 2 +- ...eConnectorConnection-character-method.html | 2 +- ...Driver-DatabaseConnectorDriver-method.html | 2 +- ...atabaseConnectorConnection-ANY-method.html | 2 +- docs/reference/dbms.html | 2 +- docs/reference/disconnect.html | 2 +- docs/reference/downloadJdbcDrivers.html | 2 +- docs/reference/dropEmulatedTempTables.html | 2 +- docs/reference/eoMonth.html | 2 +- docs/reference/executeSql.html | 2 +- docs/reference/existsTable.html | 2 +- docs/reference/extractQueryTimes.html | 8 ++++---- docs/reference/getAvailableJavaHeapSpace.html | 2 +- docs/reference/getTableNames.html | 2 +- docs/reference/inDatabaseSchema.html | 2 +- docs/reference/index.html | 2 +- docs/reference/insertTable.html | 2 +- docs/reference/isSqlReservedWord.html | 2 +- docs/reference/jdbcDrivers.html | 2 +- docs/reference/lowLevelExecuteSql.html | 2 +- docs/reference/lowLevelQuerySql.html | 2 +- .../lowLevelQuerySqlToAndromeda.html | 2 +- docs/reference/month.html | 2 +- docs/reference/querySql.html | 2 +- docs/reference/querySqlToAndromeda.html | 2 +- docs/reference/renderTranslateExecuteSql.html | 2 +- .../renderTranslateQueryApplyBatched.html | 2 +- docs/reference/renderTranslateQuerySql.html | 2 +- .../renderTranslateQuerySqlToAndromeda.html | 2 +- docs/reference/requiresTempEmulation.html | 2 +- docs/reference/year.html | 2 +- extras/DatabaseConnector.pdf | Bin 667094 -> 667291 bytes inst/doc/Connecting.pdf | Bin 239379 -> 239487 bytes inst/doc/DbiAndDbplyr.pdf | Bin 221165 -> 221276 bytes inst/doc/Querying.pdf | Bin 211454 -> 211559 bytes ...aseConnectorConnection-character-method.Rd | 1 - ...esult-DatabaseConnectorDbiResult-method.Rd | 1 - ...sult-DatabaseConnectorJdbcResult-method.Rd | 1 - ...nInfo-DatabaseConnectorDbiResult-method.Rd | 1 - ...Info-DatabaseConnectorJdbcResult-method.Rd | 1 - ...able-DatabaseConnectorConnection-method.Rd | 1 - ...nect-DatabaseConnectorConnection-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...Fetch-DatabaseConnectorDbiResult-method.Rd | 1 - ...etch-DatabaseConnectorJdbcResult-method.Rd | 1 - ...Info-DatabaseConnectorConnection-method.Rd | 1 - ...bGetInfo-DatabaseConnectorDriver-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...Count-DatabaseConnectorDbiResult-method.Rd | 1 - ...ount-DatabaseConnectorJdbcResult-method.Rd | 1 - ...ected-DatabaseConnectorDbiResult-method.Rd | 1 - ...cted-DatabaseConnectorJdbcResult-method.Rd | 1 - ...ement-DatabaseConnectorDbiResult-method.Rd | 1 - ...ment-DatabaseConnectorJdbcResult-method.Rd | 1 - ...leted-DatabaseConnectorDbiResult-method.Rd | 1 - ...eted-DatabaseConnectorJdbcResult-method.Rd | 1 - ...d-DatabaseConnectorDbiConnection-method.Rd | 1 - ...-DatabaseConnectorJdbcConnection-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...bles-DatabaseConnectorConnection-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...-DatabaseConnectorConnection-ANY-method.Rd | 1 - ...ConnectorDbiConnection-character-method.Rd | 1 - ...onnectorJdbcConnection-character-method.Rd | 1 - ...aseConnectorConnection-character-method.Rd | 1 - ...-DatabaseConnectorConnection-ANY-method.Rd | 1 - 125 files changed, 108 insertions(+), 129 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 76f1d2bb..2b02b0c7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: DatabaseConnector Type: Package Title: Connecting to Various Database Platforms Version: 6.3.0 -Date: 2023-09-07 +Date: 2023-11-08 Authors@R: c( person("Martijn", "Schuemie", email = "schuemie@ohdsi.org", role = c("aut", "cre")), person("Marc", "Suchard", role = c("aut")), diff --git a/NEWS.md b/NEWS.md index c3105391..d84e6c6b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -7,6 +7,8 @@ Changes: 2. Updated Redshift drivers. +3. Added unit tests for all supported platforms. + Bugfixes: 1. Fix bug on BigQuery where wait time was too short to avoid rate limit error. diff --git a/cran-comments.md b/cran-comments.md index ad55f89e..123fd033 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -1,4 +1,4 @@ -This update includes 1 changes and 2 bugfixes, including the fix requested by Prof. Hornik. (see NEWS.md). +This update includes 3 changes and 1 bugfixes. (see NEWS.md). --- @@ -14,4 +14,4 @@ There were no ERRORs or WARNINGs. ## Downstream dependencies -DatabaseConnector is used by CDMConnector, which was tested with this new version. No issues were found. \ No newline at end of file +DatabaseConnector is used by Achilles, CohortAlgebra, CohortExplorer, TreatmentPatterns, and CDMConnector, which were tested with this new version. No issues were found. \ No newline at end of file diff --git a/docs/404.html b/docs/404.html index 73b89288..da23bf91 100644 --- a/docs/404.html +++ b/docs/404.html @@ -32,7 +32,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/articles/Connecting.html b/docs/articles/Connecting.html index 8385f4c1..830a00b6 100644 --- a/docs/articles/Connecting.html +++ b/docs/articles/Connecting.html @@ -33,7 +33,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 @@ -91,7 +91,7 @@

Connecting to a database

Martijn J. Schuemie

-

2023-09-07

+

2023-11-08

Source: vignettes/Connecting.Rmd @@ -267,7 +267,7 @@

Connecting to a SQLite databaseinsertTable(connection = conn, tableName = "cars", data = cars) -
## Inserting data took 0.0521 secs
+
## Inserting data took 0.0571 secs
 querySql(conn, "SELECT COUNT(*) FROM main.cars;")
##   COUNT(*)
diff --git a/docs/articles/DbiAndDbplyr.html b/docs/articles/DbiAndDbplyr.html
index 139a4d0d..f80c8cdb 100644
--- a/docs/articles/DbiAndDbplyr.html
+++ b/docs/articles/DbiAndDbplyr.html
@@ -33,7 +33,7 @@
       
       
         DatabaseConnector
-        6.2.4
+        6.3.0
       
     
 
@@ -92,7 +92,7 @@ 

Using DatabaseConnector through DBI and

Martijn J. Schuemie

-

2023-09-07

+

2023-11-08

Source: vignettes/DbiAndDbplyr.Rmd diff --git a/docs/articles/Querying.html b/docs/articles/Querying.html index bb43aa57..89701c20 100644 --- a/docs/articles/Querying.html +++ b/docs/articles/Querying.html @@ -33,7 +33,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 @@ -91,7 +91,7 @@

Querying a database

Martijn J. Schuemie

-

2023-09-07

+

2023-11-08

Source: vignettes/Querying.Rmd diff --git a/docs/articles/index.html b/docs/articles/index.html index 2986d96e..d7b8e32b 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/authors.html b/docs/authors.html index 95203a33..70d79724 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/index.html b/docs/index.html index b6624d43..4f2f28cf 100644 --- a/docs/index.html +++ b/docs/index.html @@ -35,7 +35,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/news/index.html b/docs/news/index.html index d5e51dda..a12defec 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 @@ -67,7 +67,16 @@

Changelog

- + +

Changes:

+
  1. On Snowflake always using QUOTED_IDENTIFIERS_IGNORE_CASE=TRUE to avoid name mismatches when using quotes.

  2. +
  3. Updated Redshift drivers.

  4. +
  5. Added unit tests for all supported platforms.

  6. +

Bugfixes:

+
  1. Fix bug on BigQuery where wait time was too short to avoid rate limit error.
  2. +
+
+

Changes:

  1. The DatabaseConnectorConnection class is now defined at runtime, preventing the “Found more than one class ‘Microsoft SQL Server’” error when using the odbc package while DatabaseConnector is installed.

Bugfixes:

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index ef6b0e5f..b0a3c684 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -5,5 +5,5 @@ articles: Connecting: Connecting.html DbiAndDbplyr: DbiAndDbplyr.html Querying: Querying.html -last_built: 2023-09-07T04:23Z +last_built: 2023-11-08T13:18Z diff --git a/docs/pull_request_template.html b/docs/pull_request_template.html index a216f966..edc816be 100644 --- a/docs/pull_request_template.html +++ b/docs/pull_request_template.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0
diff --git a/docs/reference/DatabaseConnector-package.html b/docs/reference/DatabaseConnector-package.html index 51b5a18f..36dc0b7e 100644 --- a/docs/reference/DatabaseConnector-package.html +++ b/docs/reference/DatabaseConnector-package.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/DatabaseConnectorDbiResult-class.html b/docs/reference/DatabaseConnectorDbiResult-class.html index 5c8e02f4..4f81b4ff 100644 --- a/docs/reference/DatabaseConnectorDbiResult-class.html +++ b/docs/reference/DatabaseConnectorDbiResult-class.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/DatabaseConnectorDriver-class.html b/docs/reference/DatabaseConnectorDriver-class.html index 1c193aa3..54407e61 100644 --- a/docs/reference/DatabaseConnectorDriver-class.html +++ b/docs/reference/DatabaseConnectorDriver-class.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/DatabaseConnectorDriver.html b/docs/reference/DatabaseConnectorDriver.html index bd5813cf..d38dd784 100644 --- a/docs/reference/DatabaseConnectorDriver.html +++ b/docs/reference/DatabaseConnectorDriver.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/DatabaseConnectorJdbcResult-class.html b/docs/reference/DatabaseConnectorJdbcResult-class.html index 65fb7876..640494bf 100644 --- a/docs/reference/DatabaseConnectorJdbcResult-class.html +++ b/docs/reference/DatabaseConnectorJdbcResult-class.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/assertTempEmulationSchemaSet.html b/docs/reference/assertTempEmulationSchemaSet.html index 7bd4365c..e12be44b 100644 --- a/docs/reference/assertTempEmulationSchemaSet.html +++ b/docs/reference/assertTempEmulationSchemaSet.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/computeDataHash.html b/docs/reference/computeDataHash.html index 73822767..d4bec885 100644 --- a/docs/reference/computeDataHash.html +++ b/docs/reference/computeDataHash.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/connect.html b/docs/reference/connect.html index 3f5ff767..60a1c286 100644 --- a/docs/reference/connect.html +++ b/docs/reference/connect.html @@ -152,7 +152,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/createConnectionDetails.html b/docs/reference/createConnectionDetails.html index 1855e440..672f7a84 100644 --- a/docs/reference/createConnectionDetails.html +++ b/docs/reference/createConnectionDetails.html @@ -151,7 +151,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/createDbiConnectionDetails.html b/docs/reference/createDbiConnectionDetails.html index 6d9a1f7b..1efc90c3 100644 --- a/docs/reference/createDbiConnectionDetails.html +++ b/docs/reference/createDbiConnectionDetails.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/createZipFile.html b/docs/reference/createZipFile.html index 0ad540e8..241c64ea 100644 --- a/docs/reference/createZipFile.html +++ b/docs/reference/createZipFile.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dateAdd.html b/docs/reference/dateAdd.html index 28763fa9..e9f1cc25 100644 --- a/docs/reference/dateAdd.html +++ b/docs/reference/dateAdd.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dateDiff.html b/docs/reference/dateDiff.html index 0a654c48..9593d103 100644 --- a/docs/reference/dateDiff.html +++ b/docs/reference/dateDiff.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dateFromParts.html b/docs/reference/dateFromParts.html index 663cb60a..c01ab6d7 100644 --- a/docs/reference/dateFromParts.html +++ b/docs/reference/dateFromParts.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/day.html b/docs/reference/day.html index 217dfebc..8fcb040e 100644 --- a/docs/reference/day.html +++ b/docs/reference/day.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbAppendTable-DatabaseConnectorConnection-character-method.html b/docs/reference/dbAppendTable-DatabaseConnectorConnection-character-method.html index 6093ef3a..c8ef7e25 100644 --- a/docs/reference/dbAppendTable-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbAppendTable-DatabaseConnectorConnection-character-method.html @@ -25,7 +25,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbClearResult-DatabaseConnectorDbiResult-method.html b/docs/reference/dbClearResult-DatabaseConnectorDbiResult-method.html index ea4f6517..5216204d 100644 --- a/docs/reference/dbClearResult-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbClearResult-DatabaseConnectorDbiResult-method.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbClearResult-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbClearResult-DatabaseConnectorJdbcResult-method.html index e8bbe322..a9f6e186 100644 --- a/docs/reference/dbClearResult-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbClearResult-DatabaseConnectorJdbcResult-method.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbColumnInfo-DatabaseConnectorDbiResult-method.html b/docs/reference/dbColumnInfo-DatabaseConnectorDbiResult-method.html index 93ed55af..88182aae 100644 --- a/docs/reference/dbColumnInfo-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbColumnInfo-DatabaseConnectorDbiResult-method.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbColumnInfo-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbColumnInfo-DatabaseConnectorJdbcResult-method.html index cd1e4362..d76696ee 100644 --- a/docs/reference/dbColumnInfo-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbColumnInfo-DatabaseConnectorJdbcResult-method.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbConnect-DatabaseConnectorDriver-method.html b/docs/reference/dbConnect-DatabaseConnectorDriver-method.html index 45cc100e..28594da0 100644 --- a/docs/reference/dbConnect-DatabaseConnectorDriver-method.html +++ b/docs/reference/dbConnect-DatabaseConnectorDriver-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbCreateTable-DatabaseConnectorConnection-method.html b/docs/reference/dbCreateTable-DatabaseConnectorConnection-method.html index 2e81216e..1c6c7538 100644 --- a/docs/reference/dbCreateTable-DatabaseConnectorConnection-method.html +++ b/docs/reference/dbCreateTable-DatabaseConnectorConnection-method.html @@ -22,7 +22,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbDisconnect-DatabaseConnectorConnection-method.html b/docs/reference/dbDisconnect-DatabaseConnectorConnection-method.html index e5e4a112..d6c0be6e 100644 --- a/docs/reference/dbDisconnect-DatabaseConnectorConnection-method.html +++ b/docs/reference/dbDisconnect-DatabaseConnectorConnection-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbExecute-DatabaseConnectorConnection-character-method.html b/docs/reference/dbExecute-DatabaseConnectorConnection-character-method.html index 46ab80c1..294dcb9a 100644 --- a/docs/reference/dbExecute-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbExecute-DatabaseConnectorConnection-character-method.html @@ -23,7 +23,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbExistsTable-DatabaseConnectorConnection-character-method.html b/docs/reference/dbExistsTable-DatabaseConnectorConnection-character-method.html index 30323292..61bd7a36 100644 --- a/docs/reference/dbExistsTable-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbExistsTable-DatabaseConnectorConnection-character-method.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbFetch-DatabaseConnectorDbiResult-method.html b/docs/reference/dbFetch-DatabaseConnectorDbiResult-method.html index fdb75195..dbda3d88 100644 --- a/docs/reference/dbFetch-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbFetch-DatabaseConnectorDbiResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbFetch-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbFetch-DatabaseConnectorJdbcResult-method.html index d5163b22..5c7652b3 100644 --- a/docs/reference/dbFetch-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbFetch-DatabaseConnectorJdbcResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetInfo-DatabaseConnectorConnection-method.html b/docs/reference/dbGetInfo-DatabaseConnectorConnection-method.html index d8b620a0..65f4104a 100644 --- a/docs/reference/dbGetInfo-DatabaseConnectorConnection-method.html +++ b/docs/reference/dbGetInfo-DatabaseConnectorConnection-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetInfo-DatabaseConnectorDriver-method.html b/docs/reference/dbGetInfo-DatabaseConnectorDriver-method.html index cb35a590..8c4f2e8b 100644 --- a/docs/reference/dbGetInfo-DatabaseConnectorDriver-method.html +++ b/docs/reference/dbGetInfo-DatabaseConnectorDriver-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetQuery-DatabaseConnectorConnection-character-method.html b/docs/reference/dbGetQuery-DatabaseConnectorConnection-character-method.html index 67d4367e..e279a0bd 100644 --- a/docs/reference/dbGetQuery-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbGetQuery-DatabaseConnectorConnection-character-method.html @@ -23,7 +23,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetRowCount-DatabaseConnectorDbiResult-method.html b/docs/reference/dbGetRowCount-DatabaseConnectorDbiResult-method.html index a6a1c0a0..3901f879 100644 --- a/docs/reference/dbGetRowCount-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbGetRowCount-DatabaseConnectorDbiResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetRowCount-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbGetRowCount-DatabaseConnectorJdbcResult-method.html index a180e4ea..6f95f1ba 100644 --- a/docs/reference/dbGetRowCount-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbGetRowCount-DatabaseConnectorJdbcResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetRowsAffected-DatabaseConnectorDbiResult-method.html b/docs/reference/dbGetRowsAffected-DatabaseConnectorDbiResult-method.html index 19a25e52..f03c47e6 100644 --- a/docs/reference/dbGetRowsAffected-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbGetRowsAffected-DatabaseConnectorDbiResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.html index 679a87f1..821ed731 100644 --- a/docs/reference/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbGetRowsAffected-DatabaseConnectorJdbcResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetStatement-DatabaseConnectorDbiResult-method.html b/docs/reference/dbGetStatement-DatabaseConnectorDbiResult-method.html index d8c427f7..de1a5dd7 100644 --- a/docs/reference/dbGetStatement-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbGetStatement-DatabaseConnectorDbiResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbGetStatement-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbGetStatement-DatabaseConnectorJdbcResult-method.html index e0b5f7da..dc6cfd98 100644 --- a/docs/reference/dbGetStatement-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbGetStatement-DatabaseConnectorJdbcResult-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbHasCompleted-DatabaseConnectorDbiResult-method.html b/docs/reference/dbHasCompleted-DatabaseConnectorDbiResult-method.html index 71a23e18..3f4e4875 100644 --- a/docs/reference/dbHasCompleted-DatabaseConnectorDbiResult-method.html +++ b/docs/reference/dbHasCompleted-DatabaseConnectorDbiResult-method.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbHasCompleted-DatabaseConnectorJdbcResult-method.html b/docs/reference/dbHasCompleted-DatabaseConnectorJdbcResult-method.html index 4e613ea3..7b0ef020 100644 --- a/docs/reference/dbHasCompleted-DatabaseConnectorJdbcResult-method.html +++ b/docs/reference/dbHasCompleted-DatabaseConnectorJdbcResult-method.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbIsValid-DatabaseConnectorDbiConnection-method.html b/docs/reference/dbIsValid-DatabaseConnectorDbiConnection-method.html index 56bb47a7..83c0b58f 100644 --- a/docs/reference/dbIsValid-DatabaseConnectorDbiConnection-method.html +++ b/docs/reference/dbIsValid-DatabaseConnectorDbiConnection-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbIsValid-DatabaseConnectorJdbcConnection-method.html b/docs/reference/dbIsValid-DatabaseConnectorJdbcConnection-method.html index 7abdc282..f35ec937 100644 --- a/docs/reference/dbIsValid-DatabaseConnectorJdbcConnection-method.html +++ b/docs/reference/dbIsValid-DatabaseConnectorJdbcConnection-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbListFields-DatabaseConnectorConnection-character-method.html b/docs/reference/dbListFields-DatabaseConnectorConnection-character-method.html index 3b581f5d..cfaf80c8 100644 --- a/docs/reference/dbListFields-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbListFields-DatabaseConnectorConnection-character-method.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbListTables-DatabaseConnectorConnection-method.html b/docs/reference/dbListTables-DatabaseConnectorConnection-method.html index efd91608..c57b20c8 100644 --- a/docs/reference/dbListTables-DatabaseConnectorConnection-method.html +++ b/docs/reference/dbListTables-DatabaseConnectorConnection-method.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbReadTable-DatabaseConnectorConnection-character-method.html b/docs/reference/dbReadTable-DatabaseConnectorConnection-character-method.html index 292132a7..a9d6eb53 100644 --- a/docs/reference/dbReadTable-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbReadTable-DatabaseConnectorConnection-character-method.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbRemoveTable-DatabaseConnectorConnection-ANY-method.html b/docs/reference/dbRemoveTable-DatabaseConnectorConnection-ANY-method.html index 2efa5ce0..0bbeb660 100644 --- a/docs/reference/dbRemoveTable-DatabaseConnectorConnection-ANY-method.html +++ b/docs/reference/dbRemoveTable-DatabaseConnectorConnection-ANY-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbSendQuery-DatabaseConnectorDbiConnection-character-method.html b/docs/reference/dbSendQuery-DatabaseConnectorDbiConnection-character-method.html index e9ab030e..9aba5b3f 100644 --- a/docs/reference/dbSendQuery-DatabaseConnectorDbiConnection-character-method.html +++ b/docs/reference/dbSendQuery-DatabaseConnectorDbiConnection-character-method.html @@ -22,7 +22,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.html b/docs/reference/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.html index e6a3c15f..9e7454c2 100644 --- a/docs/reference/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.html +++ b/docs/reference/dbSendQuery-DatabaseConnectorJdbcConnection-character-method.html @@ -22,7 +22,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbSendStatement-DatabaseConnectorConnection-character-method.html b/docs/reference/dbSendStatement-DatabaseConnectorConnection-character-method.html index e02654bd..b725655c 100644 --- a/docs/reference/dbSendStatement-DatabaseConnectorConnection-character-method.html +++ b/docs/reference/dbSendStatement-DatabaseConnectorConnection-character-method.html @@ -23,7 +23,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbUnloadDriver-DatabaseConnectorDriver-method.html b/docs/reference/dbUnloadDriver-DatabaseConnectorDriver-method.html index b72e7cff..b6a862f9 100644 --- a/docs/reference/dbUnloadDriver-DatabaseConnectorDriver-method.html +++ b/docs/reference/dbUnloadDriver-DatabaseConnectorDriver-method.html @@ -25,7 +25,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbWriteTable-DatabaseConnectorConnection-ANY-method.html b/docs/reference/dbWriteTable-DatabaseConnectorConnection-ANY-method.html index 815439ad..eeefe22f 100644 --- a/docs/reference/dbWriteTable-DatabaseConnectorConnection-ANY-method.html +++ b/docs/reference/dbWriteTable-DatabaseConnectorConnection-ANY-method.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dbms.html b/docs/reference/dbms.html index b4b962ed..f6a56def 100644 --- a/docs/reference/dbms.html +++ b/docs/reference/dbms.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/disconnect.html b/docs/reference/disconnect.html index 2b316a4a..3183b0cc 100644 --- a/docs/reference/disconnect.html +++ b/docs/reference/disconnect.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/downloadJdbcDrivers.html b/docs/reference/downloadJdbcDrivers.html index 2745a5f8..45fc6188 100644 --- a/docs/reference/downloadJdbcDrivers.html +++ b/docs/reference/downloadJdbcDrivers.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/dropEmulatedTempTables.html b/docs/reference/dropEmulatedTempTables.html index bcb31913..149610f7 100644 --- a/docs/reference/dropEmulatedTempTables.html +++ b/docs/reference/dropEmulatedTempTables.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/eoMonth.html b/docs/reference/eoMonth.html index 905ed705..5fddef98 100644 --- a/docs/reference/eoMonth.html +++ b/docs/reference/eoMonth.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/executeSql.html b/docs/reference/executeSql.html index c1a9bd9d..9f58ddb6 100644 --- a/docs/reference/executeSql.html +++ b/docs/reference/executeSql.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/existsTable.html b/docs/reference/existsTable.html index 0aa2237d..21659b49 100644 --- a/docs/reference/existsTable.html +++ b/docs/reference/existsTable.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/extractQueryTimes.html b/docs/reference/extractQueryTimes.html index 14a7daa3..c616cbea 100644 --- a/docs/reference/extractQueryTimes.html +++ b/docs/reference/extractQueryTimes.html @@ -19,7 +19,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 @@ -105,15 +105,15 @@

Examples

executeSql(connection, "CREATE TABLE test (x INT);") #> | | | 0% | |======================================================================| 100% -#> Executing SQL took 0.0115 secs +#> Executing SQL took 0.0109 secs querySql(connection, "SELECT * FROM test;") #> [1] X #> <0 rows> (or 0-length row.names) extractQueryTimes(logFile) #> query startTime milliseconds thread -#> 1 CREATE TABLE test (x INT) 2023-09-07 00:26:46 1 Main thread -#> 2 SELECT * FROM test 2023-09-07 00:26:46 2 Main thread +#> 1 CREATE TABLE test (x INT) 2023-11-08 14:18:33 1 Main thread +#> 2 SELECT * FROM test 2023-11-08 14:18:33 2 Main thread ParallelLogger::unregisterLogger("MY_LOGGER") #> [1] TRUE diff --git a/docs/reference/getAvailableJavaHeapSpace.html b/docs/reference/getAvailableJavaHeapSpace.html index 220cecaf..b2210397 100644 --- a/docs/reference/getAvailableJavaHeapSpace.html +++ b/docs/reference/getAvailableJavaHeapSpace.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/getTableNames.html b/docs/reference/getTableNames.html index 766825c9..58de9a40 100644 --- a/docs/reference/getTableNames.html +++ b/docs/reference/getTableNames.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/inDatabaseSchema.html b/docs/reference/inDatabaseSchema.html index 3b6c3ae2..9069a3b4 100644 --- a/docs/reference/inDatabaseSchema.html +++ b/docs/reference/inDatabaseSchema.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/index.html b/docs/reference/index.html index d2594ae7..0bea3d87 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/insertTable.html b/docs/reference/insertTable.html index 5046b080..7e0453c6 100644 --- a/docs/reference/insertTable.html +++ b/docs/reference/insertTable.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/isSqlReservedWord.html b/docs/reference/isSqlReservedWord.html index 30b05943..62fd9cc4 100644 --- a/docs/reference/isSqlReservedWord.html +++ b/docs/reference/isSqlReservedWord.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/jdbcDrivers.html b/docs/reference/jdbcDrivers.html index 27f7a7ca..175e2346 100644 --- a/docs/reference/jdbcDrivers.html +++ b/docs/reference/jdbcDrivers.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/lowLevelExecuteSql.html b/docs/reference/lowLevelExecuteSql.html index 348f7d90..f3e7b27c 100644 --- a/docs/reference/lowLevelExecuteSql.html +++ b/docs/reference/lowLevelExecuteSql.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/lowLevelQuerySql.html b/docs/reference/lowLevelQuerySql.html index 4c300eb0..de89effc 100644 --- a/docs/reference/lowLevelQuerySql.html +++ b/docs/reference/lowLevelQuerySql.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/lowLevelQuerySqlToAndromeda.html b/docs/reference/lowLevelQuerySqlToAndromeda.html index 50a929cb..5405e6ac 100644 --- a/docs/reference/lowLevelQuerySqlToAndromeda.html +++ b/docs/reference/lowLevelQuerySqlToAndromeda.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/month.html b/docs/reference/month.html index 631ad8f8..cd71d614 100644 --- a/docs/reference/month.html +++ b/docs/reference/month.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/querySql.html b/docs/reference/querySql.html index 29479789..b2b3a4af 100644 --- a/docs/reference/querySql.html +++ b/docs/reference/querySql.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/querySqlToAndromeda.html b/docs/reference/querySqlToAndromeda.html index 8ae1c641..5d4bb6b2 100644 --- a/docs/reference/querySqlToAndromeda.html +++ b/docs/reference/querySqlToAndromeda.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/renderTranslateExecuteSql.html b/docs/reference/renderTranslateExecuteSql.html index 49e37ecc..8e66a7d9 100644 --- a/docs/reference/renderTranslateExecuteSql.html +++ b/docs/reference/renderTranslateExecuteSql.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/renderTranslateQueryApplyBatched.html b/docs/reference/renderTranslateQueryApplyBatched.html index 9ab7c4e9..28526a00 100644 --- a/docs/reference/renderTranslateQueryApplyBatched.html +++ b/docs/reference/renderTranslateQueryApplyBatched.html @@ -20,7 +20,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/renderTranslateQuerySql.html b/docs/reference/renderTranslateQuerySql.html index a4c05827..4573529d 100644 --- a/docs/reference/renderTranslateQuerySql.html +++ b/docs/reference/renderTranslateQuerySql.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/renderTranslateQuerySqlToAndromeda.html b/docs/reference/renderTranslateQuerySqlToAndromeda.html index 9194047d..99f38d21 100644 --- a/docs/reference/renderTranslateQuerySqlToAndromeda.html +++ b/docs/reference/renderTranslateQuerySqlToAndromeda.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/requiresTempEmulation.html b/docs/reference/requiresTempEmulation.html index 1bbc2c5d..0e734353 100644 --- a/docs/reference/requiresTempEmulation.html +++ b/docs/reference/requiresTempEmulation.html @@ -17,7 +17,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/docs/reference/year.html b/docs/reference/year.html index 34f58ea8..03b93f81 100644 --- a/docs/reference/year.html +++ b/docs/reference/year.html @@ -18,7 +18,7 @@ DatabaseConnector - 6.2.4 + 6.3.0 diff --git a/extras/DatabaseConnector.pdf b/extras/DatabaseConnector.pdf index 0459a09026cb41c14d4d9209a0e2dba4506a6b2b..001e64235ad441ab77b593f4c1c92251fce9b6eb 100644 GIT binary patch delta 171483 zcmbrlV~i(I*X3KbZQHhO+cvuF`j^pV+qP|^%eHO1x~AXBOz!(6lexLMUrw@<^L78u z+H38zvPqS-O;z761HwX-qReGHD8`pSUMj?nu?RFVWcTtq2L5H8K9yCvqj(|?VEKftK$>K!t;+r^xa;JyCVefhmvaiHKz zL9>k)qIKCxh(ENo)FXM43*B+z`u9$GSHG|HDKx3DloC-;9o#agrr4{v`-*UK`pxMu zA6qCY2g}aB-Fh6>@gSlw z#feYNQEM_?JhpxTSWfs@x&$?~)hx4a@n2Kv<>h8^%&1*>^nen5DF5R*X}5#?*Yhd5 z`8eTz-;})K63GaTv&E>E`?t5QimpV%HP2{`R%LfDorW4l)==&oys7d?0+#)Rwy5mG zMy=g@+y>(y${P(HSSS8Y6jewhPo!~JizByx_aP#*ixB~8m40E&816FzIuc)IM zXP$RMK*MdF--&3pU2{^*%6uyx88R_a(Rf07k9aH)*d0kH{Gw=|y(=d|VK{gHyD*4< zb>KQKDq0{DK=y;4*e|1GjB!=)$h%phexyD=k%f66EvEMShGeE5FgQ z+L)qF-;J?cEO0U>xs|y2pu^%$vD26+ebiE(qrt~<0e;bvx||7f&Pm_peL9Z``bF3| zz)QHZhD6KjiW%r{Rf^#L!V5ilt0}k%_}DyZQ6)i9nwV;AE+|Ub)OWo*oj`> zWFLL)UvNm9*Wk2$BXHEF9tA026m}vOZVnTC9A3Ge5yTYT>OPHjo6m2P!*)1To#u9$ry8-VB|!I<>hIuND~?xVy6rk z`1n9dgrahPQg+*Uls-^K50G!-$3U`X0HCqM$*QNz=`4@JJ;o~W7xg>98hK>jZ$uOQ zSAxlwKGm-*u||B$o*fa|)?NZ%o2$TlG$`JT51n0vlf-Ux=?D-jMtS}emT5uPE)$#+ zbX9Kd}-q}3j!#EUgvuJs={A*5wz7;%e=lX_V&(pJa}FF`c$=wy`>DXulB6FBM)NT z;20Xz$|WV*eGsr;m&(r{5E~!m8r4ujoljR>lgFG=dsDLxqQ)culdmkb06-N(QQ*1I z;fEf5<7R@UGw%3ol2C{;i}i9ikY&O2bGc)KxlL;hi&K$|cgN%)!mo(U@mU4aoS48< zq!_p!f=rt{7!O!tAuW6f|J+BpSUF4_-_+dM-)m_JQeiZZGhf7MrQ&$AKo=nUxE*Yw za(+NrlCFMLB%P0d(4VxBb| zykye3S1TL+N&oB2-O!ce>CGgR*en$G>v7?)3bpyeg*cOx0IcU7#IXliNw8&TP9cDab0BCVd^27HY{>J2M4m>mO8y?%!XmW07# zLfx6vl`qiqg}^DFleN{QegJt+AQUucBbG_h_iGNUG4qOQz|quy&eB={-4;E9T$YiC z=Tg3(8j1MnJM4%KPZ8WPU;}3pAmG-WRLpIutDOtr` z9{Z^Wp_+I%xBZ>gp{Be&+| z;i`QR|1LQG z6)gXog#Up>?j(nD#v~dC3}E&&U_l5PfUdqv);~19*6qztp^-pK=Z_Ujw@x?bSYK_= zD6}GiC8z5P;011;?AC?U$KZD*=$AQ}7)19IInDI&basmLceVsPOWvBT@$$S@jOa-q zw}f$Gfb~B!wfMs59T3}M>1ux0({+@GwIY7-;pUkqu~jFM5Q>rJhJqTb8-`;7Bv0G* z5h0eIsS|6K*gY>&39K?(@ZumCK-Zk(>j>sKM^bn-CQUBNb7K8*GY)m@e161)LtV2`JWcVfR7vQL8K~`b$U`G8*l@g_{Gs}Z|*^+ zf+j@W!M%MxFye}=AugJM-z{DOim7E+EZ3k#X9N6nDb5tql^E)SV8qs73kNxi4@6Zo zPN5YKABd4%PUnGe(y5A32+lqH# z$Yv@MI5~L4%9sjQOwLRIIBVGDobC>cSKkWN5@x%Ahl{nB1~@IVB@~JZ z=eH=OY5b=Y4?aA^QR8B7V6WxFU?(eudg>-t=yx=mSMqk$_?qnX=m)aAneV60lxr|7 zcRXBYxoC)SvQ^m7rh$9tM5=H;iA-|-M3u0JG`&obS++yQNup4t3@bU_G)^*JCX&xx z^+)eK_ofp4x2_BTv`UV}d;h6~)NJaBEF5Icn4kpbX66kK#;O?T0`-)`TUgwqK4Qy= z6G0ToVMDYv(;Y&xyiMx-q^m&G0mFtr&3dVYbxl`>h3mvfSv|cdk zhd}e zPvzVYN`(_>XYeGx1y@uj1k9*_<){&8Md6RsVe^=q`9-k*T%ANW^?0XSWE+`CZfe5s z5?2<(97=PS9&0ah;dtRR6i3uBHdM0_4s5BwsA6@%Wt!lzIa#99x4$i)iE&koE5x|o z**?e10^XO+p4)yYQs*!42dBBOif4`q$28j7Og+D@n2jG>=>mo@`2JVU2L{2jT})K{ zH^$YD$aV7qS!HAw{mf(=d)buC7d2_XZk-0Cl%TTX6)U{(U+jw^du2c{wXF11maY2y z5<#hkwTn5M-<3t8Bs}NC6(LYORaI$Zqn83_N$zY}T-3>TnNfkO_`;jpkV~R03#;@b z-}k~V^5Nv;BZ~770ApPG^ z{NIVq_Mcq-ca8Ob5u1xC$tlJU!206pD||5|k`FFSO{Pl#q#n!P)o`>nfT{Gi_jC%I zx8c5Y-Cq6JICgfb!*D2CHyFE*A-4`w(eOPGnb&C#eDq`V7q$zR(O>{~kk2R&t3X!o zv)lK{dDYz$@oB;#%wC~E@v_5ii*rWvgrjuR$SZ7VXaJa#h?T9(CM>cf;AvIfnO0KG zBd4EUV40J}j?+0P;@@*mdg)H@@tM|DE49&0qj|1zlbB-H$26c6Qg|YC!qb2xmS*oh zjp{b>Brb$`JzGtu%VhCaWUR(+_x2v4L(rxdozOgE!doI(@@`O_&n7$;md*TctMZQDZQc6!FOab3Yh*v#>x2W`+r zE#2dThGAM}epyJnZ=0U+}vT=+9ZFR(-@JXT`!8Zz9GZv)KdzTzx2*oj+_pgXxql zFImB*H|wtQgije@aegX$Y!g4tCW`BVS$m7I>7AmPFB!)0AG@dZK*b?G0+t3v8_`S!qR2f?kl`=?{eyg?%MTBQ+ocxXJX{l2>61$*NkVs)+2^ zJT3a~9eBUTgT0P-#uOSQr{Dw)e^ElYvM`t@t#n-6BT9`8P%((G4v@~Z5`)+eC82=S zCMUq8q_Jvd70*{wkuwEzvl{MBQ*2Wl*MzKFJVp$G$`Ok9)pU{+t$ub+cDl|vQ4q3H z0hPz&Y7eae0zC`}iEc)b?&X3=K>F2pVHb+25HOMdpvM10KxgiSIu?W2C+Mm9*)Ga z55~8&AVKXh+g{-Xw#@CYHuNPZam6)-M<=fXbPj*5^2B^4?voyL*U%JBPKwXp_lsYI z*UjMqK-0M<;3`1>CS4GeKWsR!d?e4?pp97(M9Wh^x5=ZpN#KK6;`U1+>eFOe(4M>& zQ7)Z+sbyXI3@!Ka5J|*r7PZgUYLLCaB_`lKKeN=LAd78Bjb9VpKqz_Jft0=D0dx;S zkmye?P%{yZlU!s*pPpZkUOU|d{TFZ(wo6(FAi9#tm1HKI=Bt9CRN)m5p$-2rUasu%-Ogu+^9Im1Tht%4=uwKf+8xsoyA1X~U5acVid?TL~V z1b=&?Z)#b(?TBt}5#`{1Y$1sMAPF4x30uEnP{QZ{IMfzG3y%|e*fe7Y@61%SMb~=) zpx`B6jQAQu;ORo!5d7I0Q1X6%bEi2wKEbhU8UyIrq!b6a_)MtMe!zZykDP=;qhY@h#n;z@6)(c-Jh&rQi@r*{Y-$;bw~;1GSht-&T?P0iR3c zro{S-@C83+JOBPaNuQmx0sfzI{6Db&escMcw3 zLI{oMgMRqx^(_)C(pki6rv3=;TJ}HHjP5!qgg0mNE&;zU;r+4%|FSSrkR*xU zbI3CFtR_j_Wb7dC2=8CY1a=DK-_Y}8id?c_RXGi^4LN6k@CFGPwcElAI?G6@+QiKB zw#<6~zKH$kGjAq6Hm9vLYr3XwQ@0b;)K7U=;$kt?)D#P+?W0?TE7wK3IWl6P>L`PR z0Q3FFMQ1Z+wL(1U5u`Gsnj!PZ`m&o}KI6Yv(xP4F!dvzJ%E)rpq2^!^ZXFOrsY)Sc zz<@)IuDAdQlK0%Z@WZz0&YaDZa3t<``=?-IFz-O~ zpOMLij>l(S`f2cM8_l+ndcnjKx=M$yU&#zReD)bKNB&NF^Z zzMUr4wZ2=k`sC(VR3C7)LW$Gp%60#2U@bu?H^-poMc91NQqWNdpn^I6>*x~ZW%a%H z-YHV+N0Vt(c!yj@)L|)A$4a^*AVe+mU4o0oQ#3oS~uHLCaE>3Q#Y5`LY1Q$7D@6 zc2055Z&wS5O%y+Bgl8wKFU$`3a0!E>ZOyEA&&7K~4QnKXJ6mmGk)nBjs zH{j*ps=uRKE8nHIUs&n8&r|_*HwK;fmh63X<^)<2!G=qM*_wrf+4iE`KoWKO{rdVq zw5oqi$z#C{n>Z=9eD$MpeiX1UVMbH}%1pPN(Aj++;jRaw9*&hR_;|ex6z~)mf-pDg zir-~2+u|wwu&l!XRF(pdc|eTPnfs1I8F4U!gd&*(E=ec1uPN`gT8}6wF!lr3dhTp* zjxSy7XMnOm$TZ_9kbf3)UKsHIMa^^nhkz$yWBz~qmo#8xaE7GP0<0wFDQdvAwyeu0 z2U72+rj>Jfi2@ihnQ+3(S-fOY1xy7Qh}$Y4QB z$s)_c)_*Gu0EDvk4^NY^#!@Ca ziXhbGwuXwDmFlV|lD-CQ!oXaS0wDGGz??aPLS+dUx%vSo<0+MyxQEbklkr0tu({us zr#*Q96maw^u1X%){u_c(s@~*dqf9H%0|^R?H$D-o6A-`m!)ZW@Ask=|(unN?#>o4) z=JW`pn#pd+c@&5?$tdCWMG_2OB+1)QPml6sIdqLR8?NkGv;FgLJHLQ%N{c8R_A4aJ({;fn(s@Bo3$Mo%~DP zr$xsd*zHWtsBE9G_ny!mzfR=qk!2_Di}fsTb#IYCvg84jlJ{kQ;l?$P9=C|22hhMFQ{ zi@x-7#Fal~9{qygEJOhILA?)ZPT3L4pQUB?^NGGLDvQg@PgcX;$<`plhX*P9In&42 zh|PkPp0hXYKLTQ$3utE(Gu@38D_zgvIrEO@2?23)Rr5e=EQ-eu{VGR8*-jDhz73yp z`T#)pXos_eu{8o3YC~y5@_EfASCN7+)NB_rkzBio!7z2gkX$`HWXZtjoi>{k{`Lg~ zFhr

&qQD3%>;!rh-@4m6GO*7^I94g34IuovsJG5T6Nw3Ew`*fsVZEwhzB6TZ6HD zs~z@1qIi)fw|5`$BCI=&$BOzJAVBAAvmS+ehqc@LOZ){eUFka1|C%ODO<4V!S8kLh zz?CA@*(gS2)mem8=`4*4+ll&vIAJX(a3|w)2BG2Ap!M)2p%VGmN2S5b$`<3qiLSUC zwFqoCO?e7kxT(WN_^-d(eCukX(AZ}fxWlm}VztGZ)AhJjX0Cou%CBx~R& zwvFtcd+|^+c@VcCwC#JyudSX!rRE<<=B~3Mwo#v7!QFD_y}c~f=2!e6vvj*!G6O-f z?um{&bWv8P1piZ5w(&PaCDSvv@BWr}&9;&TpHLIv$6H-7Ey}_asZ$5nouA{9%u9HDC~U>h zp?L-%Lb`J4K`AZy>26-8gi$jjaYO(ix2&*ynrY1bWvmI%ti)s4ftErCo4cAeQoDlWLB6N9&qGeq zfmjESo*x@cc<#ouNAt^de2gU+EL8N!I268Zbkg#{gdhV;@vpLVJ2X1$qSAB^9Hs8; zJ4WNT;eM)u~!8EvaY{jr;fOs|4Ydyg_lj?{&$y#^FM_Af4S%W0G+~K*2NC# zOm|M+X%5}bTEuJl@YXY}uErzu&r)W zPXch>%u%2OPZW>2rkhjGK?YcBQyyN9iBG*+O(e6&)i_@s50_^>ZHhPRz_6eQQ*6c& zWR|V_1^^#XPSrWV{w7Y{ z5#6`Vre5Vh{Aa5=JsEIjRM_t?Bk73;+uzu>09V8PrqjjjGWZ7 zd~GnC&YprpW=>~?IVJx(8Rk@VaLNh-~kfOEot;}|&ol>ggE zjh8ZtkPb+|AgY-!jL$6az%_n@7^^SlA9acttWOpfOmsgzn_sQhEMu<&Xb4gJRp&eL z_l;`mR_lfoNnO0k^iZ}KpQO*49M0+d8xblDzgrS*$V!{Uc($Iu{&FY8j1lT=;sxi? zO}ZM$%Oq6gJ?Acw88F+p#1aiKUg zzqkX|k}$8^f7zV~^|!hA(9pU2<7kpY>^GPhPl;?=i$myu>fHd$`NW^U#_aIP} zb`<+Ow1_FFsxrr1&fSqTxt%z^4R1wE3`7yVVdiBye}C+ctY%Y$;j=M~Cfyqy@0PI) z0+Gp!HCC2o0{q?9n_zmTmE2mr$?}4vB|wa8YNj^3%|9W zhBX@p1Ela7`f&+RJ^d$IkSU+ zpC0oQu(WuJ-19KNCCjj9l;=*a9>Q3AOqz8x2znU>W zR;IJd=K}RB(bB7kPBvd*n6p@FAQZl35tsS5+Ej()QP;ibt zk(AW-KjhN!NmRo+20@%1(mA6w)atIFjZ<-ed6I{tNEWgy$NKBqgdqBXgr;0&p;SBZ z0rA4XF#BKesp7pMu#{7!kj?E>sxt8r9k|0=op@Zart<#p90Nz+_nYJfU4Wt6OGLt% zX=d>G#Vlmc*<>F`Y`boCIIxs=&{6xJ8hso@jH_wHyABe$~X6tJU zf9M`woHKi$YUp_h&8%~oj^J14M8K^w!88Wp%3v@&fF|`+<=5Cu37i9e>*?*pM^&qR z>^^tNyNEw$9;V=tis=#Sg!x9!Z0=gc7q6CZ5G3&E5_v#bl2I}6&_`2>H< zksG+^3HLc0%6O(CcI?cG3usal z;nw68-?R1n*wX*GCVtF|IuKx$(JOiFBb}buk*g}2gNOrux%~wuV4#(@#G+`nK#7(E z9KbC)v~=XcXmg#+kqDwVYMkzlj87a(e+^Bl$0y!vW@^mr8)_=9vd*csd_ptd|t26 zW0>}=1r_lkG5=PTJ27h&r9oHOMGJH>PfTAYV`HIuaT#ClS=_@yX=;fx+#fe1h7~2m zDONPIGNAMw34qxQ^q zv7K{srDxu>1Ddxa4RcY!sENs@^2zMua$UKu_4`V8cr0y)O6^AYuAA4G2he6=CNQS(swmli!zb@_c z1bz%ECA=_Ae(i!7%XX@3P*!%Y5BlJ}!%g&OmhHlFLd2P<-&}is-9EYk+-WdSHyJmu zf>Hg4;P~%SgzdkNm~8*z`~R9MFIupY?lY(X)0(=fn_OuAraUK`i~+s1E6+* z`EAtNaSpa`CJLQpO60=i7of?~-UNH?-RJn$XgQPQ60;*nFmpDhk0u|17g0R#w8bRV zChst{&v8^7te9`Aft`^WWE5G0xKIslp#A&5^?-ZM%~?gIu~MstWgw1EJX{{PWcGVQU3ez&X1X^<$%ko1Iw7yNz+BYK@j| zEcA0PwN#lqcWlG!%Z44=Dmo@0o(#;LGh3H;AF`xKBf~azm6rfDF`w>g%3|77pPjqQ z>~XN2PQdi{KIa?bt{>!LRl;VeTLJKmCJ)+Rc6<63=Va5Ee|-k`QkdOH^D#Q7UVmP9 zsz!liyby=wd1%eHGnHmyB7L0mx~MSDU2k9zYB$$a4Kb9m~eYrv^5XYF&n4IW*WMRQYrX_wsUk zYPW?+KDQZILN)Ej`NYV1lO|{ny|6I`kF|d0FHHvqXM|7vBC4rRafJBmbQMGu?&1Vf zYym){n^X-xBoVrd35EKP^c`r5acsZDOZ zS|ZR066U`q%YZN>8Dwmtfempkr?VOqnO|zv1l6P5)d_9$n4melD`g zq(>I*iPdLu^lCM7L^*)d(&8@%dg#A>*cc^kJ zzPsI+iXsmqwyZzk_c606xiU_CfwHM}ROy6R8tIV_uxy$}4`q>8uil$8f;#-ykZ)o< z{$X6Xa-HLZi&SJuCIh|gfe#-H&n{1C#e#`5Hl<>ml#4TPWd%OD(+GdTql<5}{|!=T zO+%f6ApcnQZwd4NxRmsNVwqOYf3b`<4X+3U8qgsILKB)S#jkSoF9s10Znm}s^|A6% zBHO^omtqiK-30Uvg_}vMcgin7)@R9b`No{!&iJw-G_GJY{>|psol!6lD@gH_J_}!Q zHa8CG4hYdeBZ-6PZJDZhbsyEHS@Y6Yr$ZIjpU#kqYIG7{U{o-O|LYbc!U*H1RLel| z02qhMsN*-B5twF*7#|Erd>@yw`j#|1uJF zLGw~Z`liiPSe}T&f`585Kr#K3LON1IKpAnh=_Wr2Z+f8YO4*Ks zk>gn$kD>+J!tJtR*1aY}3!#J%55X8}3J^l|F|KyZqb*~Lz5HBKcvixQnN!iw45*^1 zY{^FDrI+nV!0onCVNPw*`%`%1AhQaGsaiv>DDIuZG3Bxa^#0;J#Kj7!BW%aTdayGv zuF%K!;ZWAcDsBgJ>;ZHc1c@rc-nd+=qUgeN_d666ikB+bMeQ&nCg z1BF2d>7VBYOv$jwlUW0LofN(vV?dA-KfAS?H;-_`!#OA;v{crMuEsGBt9iMaHyUm! z_F#U7EFA^OKg2;2O!9w<38zw64ky0m7>!`iL zTsTohC!=d2fW-6x`FNi!9njwD+v5rUSr#h`-57^oUrhaAI$d1b;M!j{_8?375&w{* zJx9npJnbYocalCurp#{RcyyUMb%T$mMB2+ag{hm0J~?){r>;|)QHZ%}Q)`u2qqe@C zar>C$V~WG)~OMOk9TyoNL^7i=&+Gd6d`Ztlq}(8I@DR z7v|N#hi^J8pZQJdC>6pH&7T(!nQ&5ovx{BZ%?IX1mFSkyMu7Fy_bu94X#H;T_v*`? z(twM&@yBzu6yrg5#goUCq(6AjSn{QE+;e-0HpxAzEiLJA008WsWID(Qn3lN)m1fzA zV~`ZA)qL-~T_{*&RC#{oFz%}_nXmtS62Dkka*jOO{&4|evF5f?bsLHS#D*h~-?>u~ z>Zu=ff9cA942JuCrtv1Y0##3QXxMrncZcs|vy*j;u* zey1yYqIUQ7^zm+S1J=kw0+#Tt#YuR1V!G{HofYTy*x>Lt@A5?Rr@_BB`x}(97(X=W zeiE%oawz2gSJ1#Pf|YiL2Tqf8R)7Ei2PPAa{1-0_%Tqe+EIcK;mNG#{$x#iG=eNJq z-3Gz_E+*lPJ!p=+#2Xwjxqrim`o>_nruS}sz1$gk-#K$adLcmxHCW5ad%-FhhMeXq z4*4{2%zfH-XcE1q;7bZ~j?L`AA8mEe|2 zbRo$bz>TVtSH-dpG9EV`(o_WiQU`_1ZwM9ym-FMO2MTC_3cPlfazCgUI|8npD319Z z3#?vhEE>29kgcG61jB8hA^Lz>4b6fe4xJOJK$0y}EyI`tl@PQ z1MN9o_k^noL91>UB3+Hh_t`F&en_Ft0@unPOmM2mk!77KU{pH!B>O}7G)HbhN3{%( z)&ri2PlUh*Y9H1>M(%afL;UN=K)n1d?g8L1UJNna-Ds=K5rA+kvi2gdMpe08)^T|( zvbVp`W+H;ZL;&8<*`G&flrPw${gw&riK0S-7U2PQFD@Q~B+0RHb5A=W4=w8?-pZX! z-uPL154J4>yFDn3-4J&f1FA(f2v1PgqB_nkQo&6D=Ww17%+}|oIjH|3!aAuA71hpI*g5D+8 zdP+O$5LCudm)#dVu_)+)ypcGuG<-wxArXVs5hGz z$3)ga7Hm2OaNG2QHLls!a}#7U%QVE(Tqsq?!T_YVB8^(X5HdY0T!L9OlClbB%kb80 zvv5QW3O|ZN*9$_O>pvH-&`AoCA9cRNQ26R02*Rl}ToC*yluji36p&xP0Qwf&2aLL$ zHH9L5rO*T&G?S;Ol1CbYG?OnIYfYJ*zbjoUSZx!?PN#=6nxe!5-6?H-7IWNobAyyU z69FRv?zv@+9Hwa@gKtD?w!mUkt9y^pHqZI=reg^p zN*?PsoljeRGr})#86SH9K*5`(R^@rHH*{O@l0og!)BW^Oq!KRU5In2y}zk4*Xs$L z^o8vw)4FuZufHodX)`5iJCWGERZ16=<*95w(UwVm{6T$lF%H86opJbH1nq(4p*S~Q zTAc~(_X{Z0BOft*bH$D{=_<+|RvUCEHx(aPTwK_EK8r^U*8g@n$WRAB4~5h61cpXr zbd=4I|2406FUJ9o$7bf!`v-*aY|Gb3zt}pA0{8T88XrmIHk{E|KMft2j0|X;S6JHi z=2wr%+UE#L%N?nKqjSYN*OB&~xI~)^Jg0py1Ro;XfHqi>&TF=7nx$Lt?{7DOzRurS z=*G`S>&<^@^PDXdJ)Fn^n#ZlF&uj){6-R?kJx!L)b{syd>!a-cy_JoZ76v2YJ$)yq zzbU)^M9=Xuv`%02$aU&*ojCY>2fQ1nkbch3;N}zsk1eCD+-)F9nz%JzkIKU^PRm&9M%3@3HYPTF zT1P~vT+0T)`ZlMN{_P|Ue*AbK*6sZ!nF_A*ce}RnxC{EFlMB%c@+zdSS9t0*uq81i zETSLJ3u@SFwUjJ?&!)@`HF#*ea3V4NN;)T2!Ac2c48@e!E$I`-k@ z5J?O~o8N(+EaskMRjJ4#Suf;`&E4Jv(Y|rz(&vg;ff^EcBvZ7yC6It}4*GzkB(CaD zgQ;%bQ&V_)ma}X>4FN1UvK{}?Z&1QLp7(U!j?ua!r8TdAKZWWp+ck8|$34cnDGF}2 z(#RAO(wu(F^0P>86=AN*u!xDtF=b&i;%WtQEo3>ID-HI0#m$-!>J~ zTt0N3<2+l6%bkO0&Wi%w^IJnDu(RhtGM500uZBpl?_nWA`{|!p)BanHSi$Ya()`Rg zd>AsFV?-_ia8jo~A@(!;aS6J!W_(&mg(FGn0J8U#WU}xBN0&Em$SE|I1H9e1>JKf6 zO%ppT>}%=vF3<)q(~W@2XFqLEfS~0YK+06R{#8TF!}yRavz{#2ExC$FWf72Tt#_}2 zGbjPJ$51J?x@wgig)DN$z*;50NT>#LGyS|y?6%_vfb>pDWrF7SR^WC}c!I{U;0VMu zpRO5D5}(b<&y;obASy)0lI|65_c!h6Ez)%N6D!L^s~bJ)_lZo^PG&N58ruJY&;qv` zMsNRu5EQee=So2L-j})M7~B`3&%X0(q{&t^=^>r5mG2&Xy4OKMO&x?G@wi;l2S1@sz58gSjNsrgtYq~TjULhz0Y#=)IgwRI zF`sT_{(QK_4tx%+!n$?|?tMONcUgXNakp&1*I03_`S zDN@Epi`CRiuEFpOE@!bbpB1_`fz4XZcb?DJ^QiW|MOoB@5a@Ac9}F3bnC^7UQ#bVq zan+^eP`k#$rE#BwyU1U9Yp5*tC2~Djl+r6$ri%SShDL6v$X&nS}BtkX=yzVkXp2NC|||MGLt_ zgIXcRbK+61e-A5^g+!KqO-iNneE9F;Q|Rm9;AHsbq1h!KtqRi)!H z-(VR=8ExurqAEBMj`Bw|S)Q?etWKg?irdS&%hH*#BL(P)UB0n_X&YHAtYmWRD97J+ zVYpgMQ@;7ajA{+mY!)Gh02hgV0V9N~ymg%9t>i?-iQ~>%*CHY}YZGB+>S;INCHwj6h(ehoU(VrPvi%}j=`H2OcE*VvfZ6DjzH}^Bm<@JT zJF32jm>k!r91b&c3knhjcupj9I#yD(WE{ofoYPfXdc0J*z1xa;CTK?LgTxMGm^H~f z7+wSBUivD!s#|D^_)=k35p$6-e2S{tTF~94uOStilWsm>ntCk|;?yXzz%hZL(#Ms( zfZ5WK%&dx9mei;W@UL$bDg9@;=Uzy6?Om>&(po?91ECUYuj^~=RfW6_?`ty9i>r8S zag!MJ+R-2;oiFlofbZr1oZwQdx8Y7{Uxk$ERN_`BPmpN)kVsuk*uuz0SDGHz5&J-L}6P-ZYNBB?Dwr@CZNv-z1?&*JH0+dU;oGH$kUn zc2&rNt({T)mz15=X_k-^&UIu-X=ALlHdW(CX9ashWZ@|-smC!(SJCgS+v)(9qiA|tz(Qfyx7K3_wcWvqOlA@|8bVVj+)(enHQ~y(F1M1<^Z4_DEMEPr zQkeCXdG}a=Z)NWELPS~SNME&4tDTt1a~5|-+YJv$SUwG;vo}z~TjLp%;r$|&hj-ca z?p>J{+jTB;g*pa9!`#_+q8&e9-XVAZHn+viNVtb%`%>|On_IKUPhp=~*-P&UCN&_WXhKoU`}Yd!Oe3dEv6AKRI4sXMeaVfqquIC1K8%F4a{ay)yWE zA@o%h3D07-Y#w9}ph57>!hZ0*q-z5Oy2IaLtjLF9zwG;XnSvR@xYf}3o6B~0qP%ZE zmUc9#ps9oI`8CiJ~nKR#DM zebg|{vn@m@sa<>8jT?K6^!fs%aCGE0T6t)|ss*ac8*mY#8r0&QRI;CBn39tSSv6o+ z0Kr#FpsS)1hnXHO2yL*(Sp8>a>-`Yz!qR?N#wsEKkT<1%51c|THPZwq2?~b8Mfj&D z?fhi(dM}2;&zruuDXHwBY&-1=Hqkck-$8_WiAE>>G3gC_hA-ntFuBx~neXMZ+qa0j zdrOi^9vy3o#36|ATmu$*rK-qhfy^=!>zsP#% zTM-5}1!;@f?fnNWM8T{1UVAKuai1;j86wEpOIJdfzH}}>EXQ52+zn$k)(=fiqy^4~NIEM>FMI!*8UkjCIxq@?B4Gz<*9e z|L59#R$?}0&i~VrwR<4?ADgxW`9o-6b6dfRj;wx=l9pC?xA+*~^g#2sL?~ya zJnW&v7~f*P6mR1c0}{L?-{2>=$JYW#7yOa3t;80&(l?_)*0J*N4K>*`6PQne1Bk1a z@-^D%(i(D#oMJ(Q6p;B{wK*V_j*8>d^|ku9F_vix%t!R|NZN0#i46J_SMSs73=?&A zy6M5YhCHsTS7f<7cU`_ggjzAv&|LztvB6_X;%{@EluoZ8>P1lBrMdnVKn+6Twf#<3 z_l8|iF6`&eZ2n@;r=<8~ zH+14lh%7((8X6>G;mNO9dp=n6cwe9UDFq-b#q$0sdzJ(yru#wqblEA)uiK2*9xr`K z7_AyLX)@JCI))(C(4OQe+}nkQh%)q}qU!X%)0$m|@Q-EmTzxhN{a-=z`8rpv+w9JW zZ^DLQgo{+xfg;w@X1qYD0aBUUx~QLR&WScR9i{2(n4k?)RVA~?myKygFhq}~&PX1O z0$uvpeA@+96>6Q!27R-gLT8fk~Ro>C~CM>z!M?Zn!SEaystLzfyg~omXmJ5 zMlT!!91TN1TRQf(CO6be)%tbk;36pOC>JA@Y{DyiOhK@i*oY@qqG)_NdKnD-0^t`l zR!5icApVBfdK*xwA0nM~h&f_wN|b{Pj**;j^Ab@ayq^~Wic_HNvbqu&^?uNo8TuELC>L43=i0hQp&b%#-k_{ z^Dmd8zX%ixLrE3=cZ1Fi=fy0L@LVR0BAfS-{8NiT$2mF)a%lg!RD}BaC7ud_R_`N4r zb8yTdH<5tF-(;KKN4WjLZ6>>WE$0}YrI!j*mpGf6-Fnz-t&P#Z-2g*W-ogT|R;Ngb zkJ#v={@)8;$H`KQmk=~@=))|ETzOSxN5kSsrMiMKcvNeHvLRVJ*y$CgWdZrnl>P@1 zRmxd$AchQ5pDCUd3F(ZH_KJ;@Fl(~O=~TV@@ZZ43EM&WT`9nJaGQ`DT92fN>yf96x zx(z!)rW!pSx7r_dltqg(unv=XgOe(GKeiu#uJj^PT&?nt zW-$FX;l7uDTCO;tGuoUm>uI@cK`K4K$|xf^1bnsn+gnW>d0&7q%V?O;e5n4-<@p`c zUo|whCV{bG>=p4@A&@NR)vQ@K5&5EDVh8P_4PnZ_$yC8+d!{>Q8)78e26>0tpD9Y} zr-eJp$ha*)`r&--z#gD4h3pLnoFuLd!CX7I%Fe~k_7=M#hnwrZokT7{hyEMn9quFR zRe*wzd11rIZFrXkFSD-qx zxKrP_*&82Qe908^2f%2!n-Mbfft1OnhPd1xg4!-W;EFCpb&2RS=_(`*1W#zJ#5Ari zOCY_bcuTbFIVEwx9zs`5IM29iOf$W-I#Zvy=j}Tw#nZy_Bw6A3t75bZa)hHmW4jrsRU@G@;XtKmy(Cg2Li^>`{kzaE z>YG_>KXbSD6T5zDSppIk7?|Dk_b7r=(y*x{qh20=gQ6~SBY_;vIG!+Z%o%6Ljp4Dq zN@Jw`&zQ$%En20wVhtikjOP&N2)W)Safa=@kokwl{SQSG!SiNasepTXx(T89nnsET zR6GrXjon1eZCnL`Ex#CW|B~5GAw3Vd@Y~8-)u`0$j9lyK+h1I%ab~$PDlpvgNfnLMg@;n;FogjE@Mos;h zsF`1wA*X3;*F|0@z{twcb7xb6Lh6zi^c8!CXi%u7K0;>2B?@m(?gq>bcLllEBAu34 zOJ|m_b-yJ-r?HB!E+Siw`K=K4t8N|eUMMa?d+%4~D4#Wy09EV5Z|Np@C62PUF8;DU zYCrAIyGPwPYen@gZQZ=|%T90rlkr7bw}t}^uYv)4e!rRqwx-cI49SnYn+)12XQJ5! zx?S*lq!k{Q_6E`0An^af|M)*H`#G8ZAG|RPk60-}y%4m(OEoFm4bK0lF=Q?YfvH$@ zn(z?bMwy1y%=SO7jMhkzA{&55JDRfU@6Tvq$vAB`^UaGY0T74M-ARtjkz?dW5s1$= zwFa0NQd1&ub%wO@vEo3J_ayCzm9=Sv>QLJ`mjz6MD z%=6fi2uy7OnYxd;L_8k5f|?Ij-_if_jh%!F3r7`}0L)z*(T$8e$!Z02HD$Xco4P+jD~jPPYX8Y>Vs+%US#LEKilt9h+^to)9=JA_m2 zP6Vy75LR{IafzXV#22D|Bl&zwk`b}QQ!_{zLbraga6m%UEaPxQ_CQdnZQpZ$xtS0> z!@@G1;I{@NLA}ZGxoJAna2_r>-WG4y_OTd`k}1kS{FvZnEi2*i@$#yns!dkmCRp3- zb32foQ_EpIpeKErSc3(}unhe-$dDwAE$xJ3ieT1C(gp!Q(tq5?K~Z&jCmJKVpzdnn zI@hFrrgmk11DV*wcr%isVAICXS>NJhirmgffrdB7{8`^Vrc|Rds9?MPq1uk?^2yESRhZCa~ouW6l$NuZQ7XB!JLei8?VzlT6 zomaFa?!-K}<~+8BGmF$|j93G1E|55IO=2l^LaPB@YsEx6=``*59?o}dnI}`VuLqcC za5G=kW<~4%Orab%wJduxX8GA-;h4O;xR6-4895xYTy9&)q3c{XBlEf61wpO<5uHn+ z+H1W1FfT8zeSd=?aCeT~M}OtxJJR|zoZ7N`|6nJ` zC^$cgrt*q;hG3aLy_H}|nh_}uV_g(%)BCD%wi#FUWVwujLHYRo{jmF84>TQe%qL#7 z{T}0Ex`8vNY>glijb0n(Oa+}5<=^!%~97^F|1Xu4`}?b(Y^6i z?!o#IhEt5ae=IT16fN<>5{qVfVbbu^d5iLpKo!by6t+PO{s@99M0os!GI_@JWA{#yKo(#aejX8PWkch z2e&!g`YKxGeH4_r>9fA&r1DvFGrffCFy8vEm*UvU1&&ZyD%{ZICsFzAiF%>Y)wHK+ zQO~0oDGh{6&9}C7Ci)k~sF!BGv!4RE$G#yjAVRt7@TDJ<-F5wlQv`NnnSO zvgYj?T~MB){2mt~Por}}nxOopgGn2p1VEN(2>pVwT`5P@>>?=eyx8wCM*!^jeE})R z;=7^MLdQA*wl9kZi|f|kQwLxcxcM;T_yzVUY43&+3FDl0Pc_93c zjP}27D3N3hO3)(8cXLtKrua!PIWJspL*sNo^2r_xY)M2mW(aB5Vv&&tp@OK=4z4Sf zz5`JrnH^z8%_`6jIBMGOSwX!o+Zva0%-@o+FQ*e%cCB0xE&8FrHUR>@di(QUxKNcPbF3e>@!fM6I8 zadD$DMf~+U#iVNOy8`7{O)P(m5PQ+mtsxEZpg%f)qz#TM?L7!IU>Ob6?H`1%t}6Be z4O_zX2k$Uf{s&equ=D0BE2v z?loD;wl?aJC9>aR+SB86-7M!&Ci4L@I4ic=ZNOC^%CvJxzZIsR&7>Q(8*dx*XKcFs zc&k=(by>k$IBd%L@5xfdZJ?5cjJ6kE99!3<19`YxQh5D1ML8mR4gAP_6XD=`%q zf>yRVdKIXCOC4|FM#-Wfi)Gn{Vm8F_^0vS6`MHy>Xw$6Da98r<{r&v?^pcqWh5?l; zKt(KT?^3pHQ#ni?lju)t{9#E|x>7MWBVqhM{G2xPl#&G=!b^=qVr2Jw2IzxgJZT`O zJjIJ+7tTG<+Ma+;8%+SWvcd&wFT5ydvT;_cLWP`Prm4zt8{tZpZIPxZh{xVH*ph-*ik?O-}h01T042= zz7D3xeK09o8%Th>@#vELqG(*y89^+(XZ-Wt@F!~fpra;c8Yi+zD)F!qX^NV53*a~N zUfpaeB~#oa_H~DD5Px9~fug0_`-7>%k$pShO--vhjy9R49*)7GWd*VsPm-kLappBM!^_}Y&cT(Gk!4C z+h0w4)MI_r9*baK#3Z5D#$#kUI|4z{rd&#tUTkH0f>t6s)~i$)^*c9lNtJ(UnVqVG z6Ho?U+1>uY%t)U32Hf0xh9bN0x_>}(pJ9ByD>^dgx~8y{2HW%Ko2xeX{j1twE3Dd} zT>!7BME5G@4&y-D%+GPrV!-^u5MXfbj`!wx*ka~HE(P9NTgOraO*CPE>GqQk1k$Q2r**p1<>ta5e~dQr(!cp-*S3w zPV@Q|0*uA?H~goK`-<;z;uVZZJsUQ_BCX)oZ!-DCN0|>9ma`>3sJcdW6U%CJrf|Jb z9B(IgR7NFHdTh^UtE6_R}_l2(DAE(r3%xRz{`qqNR`3q=qL9D z)d|kS+{GNN?23AlFmINI&YuItL^k45zj!7qJ1xt9uFbItSjRP1vp3^9D)xXA=5t#c zeqfikD{r&)M*8NKRvwcI3A6)JHOrRlC5dqNwvSNGDo|EQc@N!RTbPmf7oh-L$e)uo z$D2kaDMCCP?LV}_iLn*RoW&MMZ#anXQ zxsUKi%U*w{(#<;NRrI_Wb?x35K~fHpF;Rr#X^>5j_vS|rY~HcZs#DS_6nN(?*ZW`HXLXv_yxR& zR^XY!1l32XDK|!0Tu+zU^@9oFGr@;Y9?E8*XSOq_S;gty-0u#i{Xg{rUL3Vk$O-2;0NW^vc`IH#D4NfJR3dh0P@@fkLdw|!fyE)UIjq?PhoUGnsO6^M zN2c_&hYZ-w3{u~d&#K=I+NKLVT+56?SNp;_HWiwH6({eJ`_{bzXMKktOBDaab2 z3@J+(|61W~J{WBZ7A7b%P!V;k>u^m*fjD&E32BYcC{4C8wn#ZK<6!$b)W~Y0=1(;) zctk$6u+n1Z@%|(P&+`u#K4)2|tQahx6Bu#;DtAELzJ4V2MJ;lHFRCe%!&N)swKtyE zms_6&6{HY)=?PlFt~qT%KI76a`k3i_7F?3u`eHKQ(nBY2h;IXXHYitay2Z2=) z2#P;se|6pks;V{48;9bP7V6HGefiz`2)wYxynXHfNg;v92OqchR1~D z$93q*58Jsp8Z0qNaaVNvf05JsKtTw3>384%7 z)}494zjYgq@i#+rN7SUCIJSVkcVpLE3E<8gr=DP$EMz_Kyp%Qh`mIgQlgOTRFL>-Z zvS8Gu{)+nslm~#_y3Mz}2WO#lejsR-?Mx@|aoc;@vEEmhNo8eBKS~OQS+Y4)J=`-X z+h(HydIRkWE)_v@5EHB+nMT;&ggyJKvi+)j*_@TY#f}snsLw6Zk6PjnF$46N#78r* z2dN1w&3}Lm=W^8s)hOG?RW5_^EFWS8L73Uo+_ozK)6+#rRQTxkRzAl!%n8Nb=*@DX zbYf)g6wf%Bw&{{aU&Zm!}YLcE0K;JM9 zZ{ltLw%$5zaxrR>AM?gcS^(g_a%z){dmluoUp|GX=#v@POusr0!nQ8KH={r|*pWl1 z|BF7gD|UboevDIqB54E}drbBi8y^vw321f&YPc&|H$CC0G8`=Pr36K!`eb$$izZQ- zWEst-QW+H6Z*s2B^ALlYsQc5!(rUP$<*@fe^e|L)l-7gJXE5Wj};;Og$X`qinSRMKtl5_K6+0s z(PmeA%61Yw?L8hS$LVV+(Xwt5_@@H`7M>P@-Ljilx^rh4A&MbdH}PTBM-t)QJbDk( zaIM-6ZCC92&j(Lkwde^3`g}R1%i%c_TuwFnws8~2>;}ino=)u#h`z8@AqE2_jqHnVyV-yHn<;Prgr z^)$18>iu$U2ytJ&7TcsiAcm@UDdXHQeyKH}_YL|6L0%phYVp7Wg(du7+LZr~lrHCg z`?(oY9=JfU{v+=woSir5UMFWCYiWIq3xQa^?CaKZB0P z1=nd489j*l?d0z@Y^NpTjZRdyoY;&GW!(sJ#K39>!*6^DYSOxtLC}1K6B*X)fSjr6 z1B(U*hVY=@T*u)vZWPl-3ZZTBhp#_-(3eb#C@u4nS@3}A-9At8PQbc&kOFeZcqjrB zTqAT&N|0n1J*ppWsFZKhJ`Nhu_B*<^%lYyu*XNg1dWPEWASfo(xr?NdSO#?9B@@Gl7b-X&=xb8#H}mBuh63O(G0-2>67qn2jaJ1{8Fl3!)e-z~ z@|pFxHXg56Lm(`AzCn#p+&FUi#9;T)5whBe*#$?vA9H z%vnMvO*WQB3hwYrU|Wtv6aEfT2?`t@nQ;T1f{`sp{ztvo6X$6lGGjexV*<54bv`UL z7TGebT0xJZ7OeFZ0dD z+$QA>d~b-$)I4&7ZMlyk`TIi@Cs;vqbRYgrH2?t(Gb9ztIeOyNX-c zV={TsdP48(1EWZT6$?XPw27R<=fq(nfqXE~GB#YIKEPSy8xXjcEHzUH?*`Nn3ER>A zYbv0EHe7ZWP3|9j9H-MREo5#`i~16mzShG%UfsjBI)xjMWnf2~q?VE1yH}jhkMG+r zQ_dGMwfut$U>_*LE1k+&@J)!=cgNoS?i*28YBXO=ZC`YTXpX3Fg4_M$$v{c(#7@hK z0FObLE6|d7g%DJ?L3?Gq1Gj5)%{@auUpI{TK_9{sor+rW);lCjwoNvG@D2G*9-$9J z?rhew@i4uj)5h#o+D7YIC%RzJbt>r8x#w@Iy`DTw#5x-QL^%0;Yo8-35N7x4{T{t4X1{l<(Dph?!!@6j~_PbHz30{6;YPfGy z1ZmB5Gve$DD~gH<@@?TQ!^irNtnDbMn~eq);$mq=FI^E2JqY+I;`Wt|z<)SBxG^&ygc= z=%y06J`(@l9@3{%|HaIy&_W~?A8kAAsX$}I;-DV@agM+tXSjD`y>JrB((@~CQ-5p# zAxmkr6VaUnc1fuB#$XedLDkGcZsIV+@cB&7r`3|r} zPy2oamod#6o^oZjR3i5mV64c<&9umf3SI2uO=k$xl(u^VMD{LnwbF44NFWa>rISfF z?`SUE^<;qW0@O1$L-=8*7mc6MOT)s6x2sq*PWOklszOCCCTET=F?-vaZ{s<<4S~(! zhA!&Bszs^A4~GuU5ICIA_A7Le)mfeML?e^jF3;z#dqfE* zLzvV(@87GpZIR2EsJDW%h!`6Dm&s{n(CYO!^2;k@?kNVI-$(R2##;3Bb6N3*<^eP& zV{T;XM6M2}=)b>qGv+SyKMc6vpd;krp;H81K+#$*1VHz&|24b+d1Uf`Z+4=ftpDw{ z)Rel!zhpo3?sGM}bfF>~coKGotkXWJEbawa+>J4cDL+b*2!b#tai;3~^LJlp$wKLg z_^fsUA{gIUO+GJMk_*q3?CUNZ0_|v>obcWV3H;jLj!gH(XV{P=rkk*X$&SfRIm074 zKHY9_Z(J8w7ECk}vRK1sBefA@g;HfAU?w?to213zk+HMlAsXd~E|qe$3Y-3yTf4G{ zj)~~msB80w1J@f%KGOqlJ9~hAzrj_}#9YZtcS_$x3t?wC+4ZuGwuiqWD%_9#AXjFO zp7@qmVcq@ennfzVT%8lChUO>3xt|dY2C7@Ght@7h*%j^TCnQ)pIifytd}Q{*z^*cP z$?&_VzZPjHoj)m+C_n8TRM>GtmI6Zz=?ISBu0)qq2Z%WZ4-!J_y?X_b4|@HeNlE=j z%nriJ7ifFxL|q89c-E<8Aozv@#imF2%ULWHnY_o-u&IvvMsV~bOjPQXTPu&lh80Yj zw42@^wRRanQZj}wX-s+bb#YZTfihrRlnFGmPF`zYCQ4Ggj2R-q`|bvj z;Tk+lGa;c%d^LVja4RJRcmA{MCceO%M^z?jT0qlz?tbQU&n%KU_Kd@O7$8p+6}Le$fN_RUexZ6|%l<{(Pehc$r zb=T;Cl6V2VNN!H^7o$mT?BtJEMDjBv^UP7M;ST&mIn5T4V_fdb|2Z-((+gZa`X_bqNk z)wFVr#!i}J6j-yrh)4qWQj;^tjz#oQWBnsAB{T2${z}mj#T)tRhi3Ts1uZ1pi}^e z^Xw<|@YPN{DI^L667fMbXb}YVyF8&oi1HWNLE}y!YIKgCF~rN0o#?X=w5HxJq5Sl| z4M_2Qp`;?>*k!j53M#HESI}O>5Ribjc4_hF;d%7(tGD7_M*bqF_ymQMC>+qtk^JYG zppzLsvV<$Z)LTAu8dTI#XHkPwB_b(E`P|6zoD6-$C=O@|A2HFrDN0XYVWA?w0#vlhM8w2D z3t1l5k+aLoY#k8MzFN9y(6KMH|7VdnZKBN`EqRpdfX-!RMy=RuMCFvhk~eNqwG!-S z(?xPoqX~T&;@*q7Bi*oKY(`fKEfMEapu6_s5u&dO_RO$O!uK+nQL|C+30e24_H5tc zkjzjuMw&v!kIn&mR+fLE0X~4@fg(|6rnHP0D}6w>7Tmqru?H}zzSsWH7!eq~Hs}iq zMmKI>^ZtmDH~~U~_{f|YmLkA6@+i%@s1f=)5b{R(7uSnqp#QGm z2jtJ_kixNl0Jjr0vW)GXUVn}d?gYJ>(!bD$KtXt%rcn8+0Q2bXfjDn_bKiL{^*mn# zSiV1h={7!WcM%w~P_o2#{Jry0S=w63ua4jx?wFZ!p%FQKJ#uaG^mcf7AHsBV1Ic=F zZ6`A3gRaPNED$@QMI}lLNZMIhI{f?ecw?}PPXB|+QtiAWf3RZ0cx{z! zxj9_)N$c|VlI%}Qr76#W>)R7-7^B*x4Wct4wc+M=S^Jzff5zcm^`})JA?^B0=Gfae zYp<$SS>@IJ&iLGrmf6vhEX&3r>BZ|x)Wf&KW~e>~ISw}=&itiXl*3MhH^%%d|0K{UtoERipf@Q# z_MpnZb2g_D4RMu(BL$b598oX9^IXlztcTfRq9`dj5Tmy(Ze2`6F&gRXbn3Httr98Ah zApY%s{~`sEzQ79tJA#(vR^(2hpGo~Vbn}G47LwwwCMLWH&o+?;pQ|z zlehcK{q`h`T;i_6L%1Smk|qz8rX=txos&fWKLPTO7+QwXG-1DqgkL=gxg$1qdbDl|r$~#Zw z5le5+vDH!yLf~FSpS6`4RImj%tXXt{Qcll!30&e3)lnL( zAcIqeXyeRBn1qE!jYlpl``%|(nP_z3;u@DIVjvkqlKNVY8Jts`x_GVIR%LQnAcOsH z0q+^ISClKPANy2VHbg{U02k4t#jN`*wu^erm_o}o^vACCMn%^`R8z>DKvcE2Z|%NZmM!IP_Kgbq1Bt-G$2YFp z_sHF!oXG{KbwVQU6#>5o7VJKLr^wu6n+#d4_PoF^pYGEsL=tW%6aMiT8eH5w+O}6( zY@L@4K68eJMJm&}jyTy!UcNHmqL&03pAnzRN2(oZHKS$Mci#J?->Xc!MmHYLl<`sg z`a$ix&+Vv%oMlVZu4#q>Tj}kiAHR+~)agvJvEHE0riHmD2RY-?y4|K$q`@{Io8Rs) ze>n`8fov)K8R_JUW&8p>&0b2s0v3VeTNw{bP2DV7)u!WjQf zapd3TVr`=2K(oBNJ6YR1IfY-z2&8_fd4U0J~L zu{AyUm%J<>b|H~GLx;QM#Ec01Nv2`)aPYglz~{k4v&YvNt{-~`>vNloB^THMzwci>T?ygz6l?N{OV&F zmf$xYeV9LMFJKH4&V*g!kZ3G<0p5A0G1}rqKO(|191*+iw@C|ZuQS!EoFK&t%{x5V za9=W7%fk0D&;R*pr2a?qlSwl`o86wg$mEt@Tg;0!FcOOt%p$Eh3II50<~IuDRp0hb z_RPt&I*iy_u;21tW&%I(=rdE(N2OKMzZOu_KY)%__4s;nNUZTX2yVTmWAML$O%V{| z%Za=bmZcTDZOaB01dgt2F2qSBg0m{CE^y5v96fSUtu%;q(J_?aOPj{$m+^gzQE+I8rx`|l##UC0R6Ff;4N7R4YNKRP4r94p>kXd`nUZ)v@m}wrHfFLF zrOPJf*fl`ceM?V0A*?f7gaOZS$XcAG!yCn;sB;H=aZvpBE(R)v&+|^mn=TxE+eaR_ zV7Jkl#Gr@xV)`DVak`wTvMr%=>ZwFQHEzrCpXIxT*7fnjU?BTjPoEyN5`7Dyfs!*| zs5Axe?F?d;7VFrk0*?pB4IC>C$EHdf%~3-aAId<_^ef*&kbI{A0=ApXD!f@3+$zL- zeWUkLm-SIuN7V)Dwi0s+P-0Euhemo^#ukNgTDwfFzXh|9&iE&PWY5tlu^Jw9ePk3O z)cU&}M3h>CR{! zf|)peVc0UTkufhv3OCSX!Zoz(+}tuJ&Yk^f$~E0{focc>{N$uq-xPSn_hU;xWRUMB zXe8rdi7t`m*w~U2`l)eDbg0=%wY^Ryl)bYVZIi0V*H2$OipAOt4@qy7(5wd3((1|B zjPO5;PdQS;x}u?xN{MwRWOg~fLOnsLWAVL$acXf%uG=G?z4cfUJiPvzkvf`w`Y%fQ&*q=jgn39n-lx}_a!M2e|B3p1%7WE zP~8pUJaK6LFErD$ZyOq)Z`&y_+?B-^glA&S6_?{t@a>*T|M~W9rn{ulq-X4!(VX|4 zaKT{&?L+5E&u8L`=7RA~#lCcDOm6q1IWJ)OVg=#@vLpC>RV90q0QaUZ0F2PaDH-ht z_?LfIO#QD{L{K2??U%v()CExTgDN_(#PSx&VVhOf5XrmFq*%gwdFkkG#u@JN!a$kuk%k*{;l)t{K05aXi`BH zKwDBgQ$c-z^|h81E-0p}ce|%=yK}0|q&nIVHnu?jeh|%Q505|BJ!{?<$TLmfPP`n` za5Q?pj}_wld#bARMs$3?Z;<=?NM6kFJL$KMbbNoC*m0t@9eLYu3|AP&ZI2SD030 z=zNj06Dfuxj@s|(rzLqxyxABhjXxim(In4Mk)x3|PS>3mpUw!BF<$ zzxUX1DHk~KgzPk@9W5CB_x!tiGTD?*R1{aeB-2$XfR z;<-4@R1xjKu4K=I3b|v=r+%it#741l_sou$L}k(?>IA17hUtR+1Fb}>EB)jp3(}Zk zg`G&To5WT$rr^zsHAkda#<&x@NIM{b#E0}!o*CTsm=bLfkR$;ORp2vQ23!UVo51!Gug(XKqEK4265oaH~h^1tw4khl~t34_dVA@Q0jxV?PS1ab> zrlb6nK0`=92lo7@qD~m~YpiLAS)U*f9+!{MSL&5(eEvZGWGya!P4v!l=Us%hUYO9r z<;JZc=?2LektBzIJ@JN)WMypzRmT+P72nDcJBT&sp5z!~A8E=NALQnv0Qp2YNAjuu zg(RDC!G!^G>;YHyS%`JI0D)+;2lC zhJd7Uyg~~1)3y#va6?H_&(;E?1AdpC7FMeW%aw*!scvk+wy5~ z;_lI*JY27-GWFE;FxB0~o@^?(f%(S;4mBO>eOLGBfFyP9`2eBvrHJV!fQh4=`SFrl zDGjf))TK2vIJ7V6Mk1XIoe2(jqx2v;Z9B5sU>RG~j_+2!TR=!(dsNjgf|wqm$Xn(~ zZ857?H4JAt-lmOdxVOeJ)y&Ga@TY)&I^r8s=yv^XGY)VCC^Y3{M%12pq`v&p-pzLvxx@lA(uMM}LNpf_Z zcAD`7Af2})&iv{i>{l0?nd6c#Hzb z(DcrOfB7vO;KHdmt1E_m;GM)w2!yVU!Fix6B+2HlzKBShefr`IwGz_`U)WWlPKk#@ z^zE{sH&PDip36I7TBsyYJLAGo=N+9>b=*pcq}VuSp%Jv~0{b-G^wBGNbH@ z%t%o@KR;2XM?UmZ1{P3S#gp7Ad*6i*E1E(W@t0zZi9iY?+R!g_XUtxe`fAfq#IAPZ4JlKL*dv&opM zsvL7IjJez~vfN!ov~BWCNmT~8fVA|%0*?&%UKKx-TNFq9x-PIeFW`f~JHV0SP-gZT zl%}9)Np9vLvGRE{4=XKbpxw|F?4?jiJi7dN+kf9I#{uP?V%OTxY#76qY(fH8zjau;;wmDK{Z!~w%Rr%EeRVGa~w|wL4ac9eXiE-4D zm<>vW`Cnkg{~0!kA%(8#ze~GlQmmRlX@TR`_t!Z*@$n*JV+W1mD1+Qt)LZYjSHe^r zXx#4JcMkS<_jLTJgXBN{F#Usq3`K+B(%AC-yzJ^m2}nQgOMr|%@2@ImRR<(_b@1>1 z)XH~zmJE1psiKP#$w8dFa_L5C;mcqb*~RCDvh$*gN}^e7qQA~*g@CwJ zi*`^}w}f@-Qr5!&VT<(Re2F`N2ICWZZEKWXOejR0&wWkVxnjw>jOowNtY0)Jp_zrT zNurm9vn=oSwkaS2%PD^fJ4C$-Gy8iibxsl>t3PYK^U5?Fh8CUSyc7N%fBp=WcC4$a zP&Vq&I1!uTHlGAns44d#W8(w=v;clk(%fHGi_15?sjHk*sWd#jw+cv9W+jhma zjU85uN-9>xwr$(CZR@7{oDUb{_UInt{Db{vzYBA&XU6(h$1f;j5u8xNrOR_G0-Glx zV&i^nx*$!_;BAt3vx(p$pinr}ZpSNSap1na-f~oa1IP@U6O0v@v)GS5ewgae4k1W6 zii?;LkBfGUn;jdwm!65IP(kO7Jo91?hDl5l*0i{Kzo-28QDiM6k>GVp1;Wa!C=8Y& zP8M@KLZnW(pM3-|n0f*x)^C-50wlv)2j%wB;6l96l91|~v!|cQ18~lrsE_?l-T+Tb zcz>unvR!j8R^9~Wo22dZAlQmiQKqP(8?NGEv9IkLT9UPBDv-C>!Bza2Us@EU;C(k+~#Gn zW)^=Wo{=`Y47QwTnIlPY0Y8ZiU3IfndJPMIvu05Q0zM=Y;-e5B?rS|O(2IAh9oskP zlin~^ZA19lrgehe!1JHtS6iqXi(MWJ$~O0;p~C(sp4W}2?DcD?%O8Fm5Xb$CD%PrS z_=5Pxg%@tbfM!LBkqm<4;9IML+VU}Vo6P|$rez#A0YF{3J=H-2M642SxhCDjA|c0|sT5 z+^_obRatQkldZvSfNVY8`zcM1#U0v)vTkvDFG8y&JH{I${&~2Sd;e#>7?axl zp%T^BS{R`qEk-}M_)XLF$dv|p4hD6>UzT24yFwcD2WE{!%9j}`a%zRGHc0H}$@h`# zZ1}x5s(o|vEB~*9K{~`;*A3EHu1;;tNGpSiR#O6qVfDu_z&+lG`$2P@UMi}`7p~Hz z=J?L97M?A1d7`W@S{5{=daCH)tX;R&w4qx!RHI-6kB95_?G2yW9;{F3yJUhqjA?9L@@!0z8?q(_^gu*J)AkDJu zp5lSDp68ce1PtTN*BD=J9^TW~P0@+-l8k@L8VBr@4M=v6Bg7|oPpKdx(!{QZq&6}g z5h9u)8aEC@?VGy}T9~oa|5FO?FLrR-t@ND9hKye6j5#Xe?ZLiuu}pm_ie8~v7}{1E zeW5$pBG$-!A+xM61hcPuz_4L@$XR`Y4$wZz)rMEG0p8Ta&B4Y_Ub=NrFI`nh8Cb7k zy%QolBgM{iGq%{`xzx2;6I3xu`(anhSRo7Ly9~8|5Mu9!9EcM_9l9BvoCPYbj}%Od z;=%*NY4yKV9)$GOeT6hxeB3^69-B4)p@-?0N{rwM+79sw%e(1O^C&ZZ243>wt`F6b zc%jWi1Bd=Y1pd87=|hr=SPd~%CGy!3Yx0)0%xXb$G%GRq4=*yM;|(;b1Ln_F_iZca zQ)bjxvj|*-KSag|a;?(E9n!3dow9JWnTt|5;m?1)L_AcPrL6*YD`tgmJNY`ZtQ(yc zMi|Kap<-#_*GtLa-^5eHyPv0218&{y#FlA-0PyJL1|f{QVf=r@b%&%VW>McQ;DR|u z6~gz`v>mjGAiz~ctZh$BSZ061bXjr5C+p@7vkyQ%V&RNr+uNCw-cEr==#>m)?eY>5 zxq;7bU^g73M{T@B3wGg>Lf3HAp)Pg*@$pXFR5zPH$+VQ&v=Ef7IfvX$c}^~}RXZ>8 z0<_8CeVx)=gg@rAKCXyOIqLV=vYZBB%)~}tno0x(hPH0Hccpb))+s~y+m9gUXaop9 ziCwA*UgS=GlifVneBh4~jEq6APd;YPgv;cAn{i(o&Tmd6ddHB$B>zcNv*yiJY)~F9 zFYup9y8YQ+$hBbW$!GerwSH{W~#F=H$>E)mkL>H9OJjEEHx76t_8=&qQUPu?ug zxo4-7;0f4wiDnA0kbSBhV<;!_ic+0F*gRY-Cu*B?v}5uwwMX5$P;;$^o}0?2(nSV3 z`+uoTuM5yzZ8gVm)3q=Cf%Li?XZz>slND4z_9 zfv}_BDnol6j0u(ZKhY0<{vUkb8)w= zYwg{i7`~5{Oj98V{>kW)ib>yIVu$l(nIpQ%GB0}T5NkwMEls9LrG}e2eGwVs@bdGY+FogeP!E-;=9VuH|XY~($2 zfB#rL_x@T);jWJ_BvUXl9kz=P<#5ow-55a#E~4e58z8>v6}u{}Oex!=%RGE@OKQG~ zfeL~H+e4{DuGv%7!Ej_DN8_&c*fUHacc|bCCEccHpv*i?*EH0@Ci(7V9tMot^6S8V znS_y1e#F-VZ!48I`6z9akF*%7$J~bANTcmE(L)Wtt!A{bCEmm2U`ITH) z#?F*K(-Ju8!KzwHsH+6)Z2axqU&SDj3GJKzpWWzH)x&1AN&h*3AdhfPms0t}Yhu3@ z*GfBuYHTVFvuzCJ*-je!LxF<<-Qd>qbq=~Hgeo~^-X!LTZP=I`jN&+8d#wts8^?)-;L2ix!*2+DYZ{>smQ^_Xy%b8OJ~b>o`r6OC7_O4Y0TJA?j8DokEw8aG)2#6Us4CZ-bTTvPj}+kOjpN8_DKwP z3YiiS*X_Ers*@UH2Uv>oqI7)lOy^&~OW*jTz%6>nCD;1r6YGNgCUNjMgk;kfYHWRI zbB9N|6Z~L9c&~NBJ#)mU5x)cB7V(z9dtx8AX&Ll@0`yI8?91}d3A$215S)C;p8SYQ zjkXgL#mYzJm*M)L80v=8v~T4wxk=N|yC-II?CK%!mTBFEg zJp9~b;U;Ru(is=i6Vr(Aw=wA#fEK#q(2U{x+>Ta$x>nzk%C&#{S6DGfAV7EZH~sm^ z_U>Ae@7Q&;(f1@oXK3Rp`Pu(x;_hgpoEBCK?}*5$eo5w7!Pa8DAE$u!{wHlbL=q|v z2M_W~%1WCTDA14M)VJc@e^AY=JiqcPGsn`X$?=!7!UzRAEeo(P_*teHLo{;4jPoPa z2t1fE5QX&L&paK+l)uZf#yeGgx>oOsCW^^g#W+Rr8qh9Ar>Wt@qoNxVjvf`$c0bDO z)xYZyNk#FOK8hWdgXHtsYePD`qF`FwmeTmFez~{4(1P8?C(!g#R76mxq``KCk5+l| zEV>AoSA*zx{BKMtEQ>A|JhydC^Ovxy)TNjy^buGO2B+FgPrf#LqBg$omHtjg%P+S- zSw+%Cps#9Up8h@&hv!fx1Pp}pi6Ds9ZHO5V@PFM1tr`R=47Q$^%S>i_yV*Q5JX!*s z3(_5ph5(%Rlt#p;6D(nNd|ZJ*2nu^?jp1_l{_TX@o91Ldk4xc6MLaL73X0C&x#d$Y z>>l*rIa%@*jRmL8N$W(tpxi1wP3vi`R?RI)T_Tv0S3JY}~&~OW$36IpnMnCAp8~CMRCbW$8?eD08kadU&Fs5&|=MZXz{wvK)s? zIY#$k#+O8QcQPd>%tL=QScTEZpeB$*#}nsSLRpHudfdl_-a}4UX6|d&s|qi93^{+! zdWZ7tyV5kFv{Fn)>dp<`Aqz%f-Yc<{s{x`E$kgn;+KQ`T`S^cSsl)S&-9S@Jq24#l z|Ae*#9TnbPD(AYnF9iOEYW8TV{UfL0E@nnBR%m<}QGgchTwug|CGjlu&2I_98|z4T zEt39s6uR}~=JqLwBoU`UIk<#Cg5yxNpYR6x)}{!=RHPPm-u$on@U-(f*<2LXHFuHvx3ABob3prZ(D@#9% zaqy+$xPG z1tx*_2xUC2jr4;M@|2RbR9^8ptxU0 zMsN%IQFkWhMUfHOri)pVg?rkX%wuCm_E5NPW>Y*XQkDYh4NX{c-T|j2Q3`dN={YjOa>`@t3BxM!t|ckOCw} zO(^**{Uw8&So;~cUyuYIa2v*M&}B!}7gA z`EnYCEjC9sqa$MGFqAafAzI=d+;~^}vHT?rY>&4S$da;`iodD9$ng!^4_0U%c4*~K zY41Qc^na9ZLiY@YZH}ogdXoKamPOB^>kIW}0kdI-&M52hGVnBec1gr0B=h#E-TC0l z=ezUHhpvafA4)kqHgA2$uP_c`&?vYDx`X#$EL;9(Jxu)bR}aJaAD47r+PsEr{457j z`=NSMcrS&j5wYgS8Vv#y)0sl6C^M@)C_;2O*@jDAcMWz=<>o>XDimrQc49fFgxa3k zAQA%FixZjhtvjfy&X}<;vD55JNB^& z5I5|(PZ&?DG}@3qfuzxk2?ykVje6Z-K03R$LgwmYGEE3i(pDPmP3=^olBt|C4y{Iy zeh|U>tG4<-v{^R*tx*0gXm&#kky&mSryW1He~$=kF9YMhSh$Bhj(u%fe?L|>;l>B1 z(fUi8Pw!d%E{kuKc(Di#z)BV}5||UZRy&aX8NLl&u#8oZ=omvV{sz5!>|!o9`ioZ& z#9-m@!HyIY*|K029%|;mcj27~$flB}%0uy235U`wsr)m{ ziVDTvi^}@c$3Pl%haRI}xwX>&Zox|G-f{+~jIjL)zSdpL>w(3>3OVL!$yX1Da@z^Y z!dm$h{zFy!dLQ9Ol<1Ri@gf~Bd%Gv+^~R~rWR{L?^#x)G=|p5gj)6xd>g_ma;On&s z@(9zq)Z33;U>}#9?c_UN+a@eKf+7m}g-Knfi~agv3ZfCvHQC=JLasHh988PPNtWw^ z6f=M2JQ_1=2gdq)BBSE8$?MtR3(M^zY?PVvp|TRTm})&wH*~0KvQx6Q;2h(lrq~o@ zqI1jfEJCxAyD3Re(ENPAWqW}-UTfzn@IZ$R+UVZ&1EGpiiUD4XL|jW?$%aKaeWnU~ zSS^GOAaj$aTC&hV6Vk$b0r-Q*z789#~;ecD?3Cx|1!u1&AJ(g zk!Cxpe0ejb-1C0~x0Ea$sM2?;BO?|M^;oP$`@-9Di*lSu>*sUe7s&}GGi0j}7onHm zSt^Cz)3439m6W>XCJxt zWY4L^#cd^76}vKNuO4GVhNJ3oCvJiK{;$O^8Nk^xI1@uXD>&%wiQO@^Va_az^}0^f7k3AHmz;wY096=aHUJfr`|?T?lXjUd zyb{qnp3}H(*I_(T2^$kWjnr&b=QZ#mDH!jk%FairI%+4)snQ~W)^+Niq-J~QzUBHs z0O-|X`%=zd`HTcA+N)yMa5Y%JWaN6{A$`sQzz28Cxl#++D5h{tdqsTMN5SZMA0_8W z*T756+SvkMKzZC!t#LDc6`xbw3xkdCc3W0H*x`=0J66IcYb(DxS~+Goxd6CcsW!m5 zLpx#x7Y*u|v5lp>*&Z45`Q?Ir%a5{Vzyus$p%lrb@xXD35a{C2uP2r0M{L|Mdw-0k z)qDuHblB>*T#Aq;s>pTGvn-ofb*yr{fa!P~RbN=b*{TwTN|PEbwK6^DDbMFP?j3SG zZNrGeztzd9d^^fyke+V%q&htOF^W6OOE5c24iiwaF}rNiY`;HKe)N6IHcj0Tm8kswa=Q&%!HN*=!_;{H`I;l<6PwhJ1@cpyTBn+h-iY zFtV2pP4cV(0aRGws+_>^3aSneO7vFVlC>oinzMdM!|^P&mJt#C`Ta^9F-aa1_6fnH z&>j(IljDtZTTi&uBsCCq2MSF8=4$tIXunxueAr@o^VOZd4?2oql+N1yG=0_!a zp{d}5JrcuyYg@&L@-X4X?Oq1TT>&b6E8X@*sc3)dr$4X~$X}ZH_p_oqL+w&iFxle)P>7rRm87o%h+6Lp#`Ax~zZwex!I(sg1opqV zD%MC~7(juQKfQU}dH#8z^=t!|rWARz=Epk%V~dz8dZ92~GfJeV8|~$-bG>`z2;wmpcWdN`IWqbQiL`P(UF{nD z4qe8jO7pl{ZKWHbp5FCCCLSsoILDN=SUyIIJ^;17zP|Sw)P>}g$C-hGrgT8>7C)(1 z-53x<$oqr_xeB_kx!H8 z0eDybI4PPbnqww}Y2)k<1q(BMj-t8M7%xixBA79&2G3JL-rVRIyZ%7Ece;i@a#C7e z;Y*TKLA!ANlAe?7+AQ5~eRq6ZgM6CCb`Q$hz_Gg0qgHa64eZ+c|HiEBiJ`ydoq-EX zY_FD0{xFFoI+K=O))TE$4E%*?Pe`!+0nC>!|I+7a-+ws9n~C)I<)+$^#YuSmrD+ao zWjDmJll_GJ?omKJgh*49SgzCAj0_8q3^FAaoXR=S_&%!T`;5= z2i`j9!S_|QmM>MbFvN#HV1^IgbYtB}gkA)Y%j5BqI@xg{(9d5*sY0%a&{7EO0 zKhQc1-$JnLQcqFF^iky?Hjw8w3<^fdCi;;?`t`{|)`ZN(Z#QdW<#LTH<%ToWS13}s zP--ZC#Koq~6;X=kiP7^-jQOY+0(dagG`?I0i{Z5mU_Igr(WU6k0ex{87#7CmV07&FOgX=( zRl&WHRk!FtO16{3&Y3d_X8ar8(OZWNgY*^WWt=d`uM)l0S%ms41dd-M4hT+o!i5Hr z;DqdS&3iR}j*+`N=-13QKgp)`sprs`Lcpk!J7h?xm}vPvZsJFkxQ^tWC^bq3nIorW z5s9HHZxmCrOQyT0_`z`-Tpo)g3Gpn%wR;!n&%6u)Zq&gkCLawAN&gV<{R0U)fTX9_ z?3>V(t|C+bA79Ns9ik&_TmahB7+esr1?w(z*wi612OTfo4i}1$%AP*mo3M4(82D@y z(7?OKBFOQp${c)KQ&g)+sIm(lDQ)Y&uDg8b`td{OuGqFy%iIXguMmU}+HTZOO z2!n{?4HIM~um_5W*^f*DQHg$&T2=aVZ+(~&?y=hmM7{^pZ_`wi697r?iVY{Qr(XpD z{$MI};n!epbxhtkG-W?wEpx($wKsLm8vYi9WmWmWFwL$_vqwD zF(<+l3=sFt(6}Jp<~4ra5=|wcKItkA+!Smoiuac$LAmhtWei)gHpa~vS+BJ`_}~jm znkFfZtQ~(C9!V%#QPYpQg*Q?4hp0$-zx5V?;Vp3yP)$e*{r2I%qo0~vpo~(Xyfb<9 z_xGi32p8GL8Zh80Vf{~Vr$G=!Hn0y0hiuv+_GuPUQUxA`e~Acrrv9d=1t}9LNfsRp zTY_N6(W@_%m%{+s{cV7!af;1nrSz@Z=AZC*)1@$?QaP{Z`K8x4F|xez;>!=!QJ><0 zbZU+`;>yIH^)N#T@ZkA%PwD=?9fza}bTE9(ZsnUZQ2N^Us$6?CrWFUY!#%W$w`1R= z9ds~u#t`48Nn-3NgirS6-rxmywD&FaJET_`DK!0;fF7tbOe(EPVzZKLsh!^IsYpWT zBnb>K5`<=D=h!E3NI%_R!5(kPBzFuj2GHE3LJTl`LQV`~v=bOBxEn8(Un)>B6GC;f z@I1_Gt*yfVJ~M`9(smITYU2Y2m^l1@F&+K4rRe`G3>9Qx!v6vHl|cHs-7BIANhlc$ z@&JubGaA$^tVs($H%631kchN)MW*uGdD^s_6oy7h4Bk_ar)t-WVdpQLUCwqAGR(lH?M8ds)hQ)R{}8NSBp-_G z#>fpzh6&}N0e~&nBb51t-YPUn%sRYIzM76pXPEgbV-JARK@N1avH9IihqX zl(kahsmu#vP*kceYeX0<6i{7SK=aoy(@QJ`qK^;3*>L(?3V;yLadPV9%5nJUptuqm zQCoKe5c>y$`-gT_U4d+C`E4;LG+K?AS`jk+gHw!|>(ZCKvk*Xn^RVum(`V30J9e&) zwQxq2i{o3a=EwVyoVCwFx6e0L&B62IxzY~`^4mXC|J$Zy0>oJDvCX%?vnJFrphLLn z#M}|NoVpHXQ6IbGlf}P|?#{aj#x8bx6QCXlfg~1yL+Xbi1Zk4BO743^4{P6grsy{I zjvRV$ga(D8L%LQ|_gn9t-O&9Gw8Coln-s?Ao;vg5ur40y3Z59J_w@=>B}oV4p1VE> z0p3QC&alUWFhS{9L$aQ5@MQ#tmcyrqyIzvQ{vpe`@-Ens9hfJ_XXi~55VEbnF7S1j zwvJC!Sfa@~Y}|3-fo?ok=>q)T0zA?0EZ?tBInD#S&}>QZ2qzxs{utQWxJCNb4)aJS z-l~ifM1y|DtV1vwbGDy4AsbWu+tYlBEUsBt-co2Qg`zS zW@RJ-$_LVPkaS5yvQ79!c{^MvWs=v8WpUUjWBTF3eOcwe%mzpauzja2%mHTHb@jL zj1F^@bBeN9L#f2~&!_wq(oiy zl$(rD=SP;I0~EUn^n2;=G0SSemNN3jh@7_DlCE|2djzIYNbAK>YKlB=j3@j7djv^` zY_DUAG${_-;b&1JJMDX}&pm0_lqfbh!m~TBNflWj72Jx3L9HCI5SxF*ZP+w8 zu?l!;IV9is;1d2igX%D21I`N!xYdVtnqwuO51*>C!S*Vax)mY{s4XJkP`su7`E#`P z`2j?^kf>{HNT0Q5J5^eoInJCL{S*5pSh3-Up4v>2g0fP`>QJ*RzgyuHsjov>#&|m& z6B-ebt6NliU-2G1F;@T$*PU95Dia)xinD1o6C)0e|APnJ5S2`#BjH|~0-s_*Z$O0s zGHii?qRj^zA<5YI?QAKz2xr%xu294mZUJLJI+M*=sdUNufL|X zZLrd%@`;HCzj%#+kTe4WM8Ehk!^E#{gsr8~Cql}xNi}T2+3b6{OCpVUhb2vU#WG&{ zzL030$s;Xs8$Odu1VrfkhMJYW@Rj;f)8-0JX8;7q(DY5IfL0JN3!n|1GA_{ew_vQ) zsN+K+ruIW*Dld`G9_1Cs?m~q&`8u&pOXpjl1ZF>|Szywuoktp&EJ*SU_r4jNIVj^3 z$Nv)zlB?KGr@^MWUmO-FE?h1e$Bz@l_X4ZrLh(lpN;yh^7JLt*K}LI>g0?{wJWm!; zppAz0nJ(C7WhX_^%g2IZjgpv z%(YphQrZ|2H4YEk7;Hwwg8`*Kq@(s1KR{R$HK-9n-E0vEAVm8Hv4?R7lFL}*&EA~- za8!$cytJmdH9G_skvgXEWX0n2&9+6arEYQ}DOe{zMQ5pu9Wex70pcmT?YlaLpWCA* zfeSf-AYUa)<%kb$k7n>U3}Nr4dk=azW_{zAY}F>S(u{tRutHCF+jOTS`uHKWq7j4B zty3^n-A_Vvc_7mjUPE8?*pG{wstM*3b_kZP@PAcXSUNB<^8XWh>VH<-9!0Qt0Bg(; z4T>$9UX3+?*^nnW7*s4^dfAZk^@P3>P@6w2ry)G>zmnS=meQ3jpNQa5msI`hLP~!# zYfLYlqEeEseD;j1S{||g7SqpY$Kaj>HwY1oe5KzhZ^XI}vG{A;8-w|FsW984SGFY? zbsK$ujgt8>{PYt<(1wet$uUq8ps26tg!oioqaBCRxkc%CotN`^eCW-eSuHz3eLu-q zh#b)IP>6OH!I3K`-L1xwMSFe7po-;IQUr+{4F{rMh=U>yFm%%1qp7@; ze-}ml-2}qfiwL{Ewn>fNE(snc5(-s*;QXyY!Degp^)Fs-XqD-Syi=A~(>DI9dV@Ree=sNcw&cbS3wu6Fm2TvQ?rtV_Y6Hlhe}fMGM%Ra?so8~Zib42Gk` zIG)7xi~5`(uhcZa5tzIzQ*JO?XxVNIEHxd_TDWXT$371Evl!Vp(|D14P<_Z-U>>Ak zPnBVFWmi0j+mmZh6bz;!t>}C&f+fmfEM^c2b787WO^WQ_UJD1JAJh^C!zfdR+KlK8 zmXat&-Uk7FIWo6&%Z}>A*2_)TdlyaIyah=b8zl5B48c68|UTkp=efB;}vTCp+6}vc&Ka2!Y@duXMjdrQt{zwz@4n z!JvNr+JUm~Qe2Bt;6IWkPs+MEGbowJ1rM8LxYjdCWGFmI?@YfD56yFfLgw`c4^1%= zF`5bafJ6fG0t}aYmf`WiAR|dJrVy~s_+C0ei4Ul@LTuopx&6Fdyu@X&^L}XUw`WUhxe;n82f8qgmvq%Y{v)I6+bk4;O_|7_{?-iq_ccsJv28q z>Y?3MKS2sxFmR|WX96dCXry~qg^>75(~f9lXRTA%p-<7h$M2NUldCyOgo*!NofG6n zdfO7;H4*p%*lA22*weY_o=Z#0XahGr9{Ejt^njbz>u?T_PL5`7;zT$L>FIQct5LJz zgS}Hi_lBU5P7qAGXwyg66UYK2G{@Q}Ygd<>XT=Llx6^g-#z?_ch&3Guz0eTx28a3! zxs2A`KGL;ZVVm@wG(EwzJeLkx%jzhW4n zT^go{Gzu;j1Z6pFj_R6edof@AJfha=F3gfO&Q`|6}2X;5yXpM-|18eboL z#$YAAA09`4T6~Q-z&|X;Q{~Qp#GXXh0^knEcIp)(i9ONfWa?tBS|6`G9>j}2o2}Qf z$yzBVpMn**(8u$SlU4oH_I1jw80sV0A!ixA3(CPorqX|#ihJEk-*zHNe~vaI5+ON3 zd$;!f@%w?Ps-{l0qS3_5Cjcg#geTUQo@Oiql%ax-4urubvi1f27L z_pzhdQ)%JhI}|S6PDh{Zwu}*fD>(aVTY~8!sPV}xWc=LU9TLG`ZK?a%FBTgtYWc%I zt*T~;;n{pO*vfJEATCBG-pocDdH|I+W+%~W!qk3E@#@BKNoMiCvA*cH5s<}~qQksJ z*!+R1{2v^T-v&0&-8$<7YizXtvcqR=?4eAla(-;xtuv}!HH`~=7$K@XAZ+Yj1f6Gt zANu~@Jv@4fOkLHFnc>zk|H*kj>!~U`ruSH?biftJy!c-Ds`<;;Lr-1++69Ph*Rza% zdEulTzi3)sNrRg_Ii`LOib@)~HEXn+lBN98>59jbwK_%SW2(;}+>9z3Jd3r3Z7*6w zE!Y_)K(>V*4@6~s?%=7WORxFK*|P?~&WvJ{r@dlaCc~>Xnz@yoap!^uFaET;EIw57 z0p6MQsRA*z8P!n-*34#p1MKBd4_$?U>8tpey6YxMAl@Z!i^d;a3xiH-hn+7?>v#3G zV+BRTbu??0y*N=17l@&}pRmTS+)2z?(5Q_uT3{)Z|IO+D|CQzQe+wV^!W#T%Kavsv zhV>t$I-nnW)p57sf>&=lg%8hz!jxRs`B=L}vf=pbY=X;nvbO=TMs}4;Jn@(0M%nBA zH|UcCj*4^VnPC};ZZca40T5@XQGafC;C^@SaNMf zS2HwP{LnhJOqfJIPO#DhfYyF{njLuc0dqvPbdZcdmw95?$wn z|XhqGTz1Uk<6))mlU0m{CwWtn>|^j`;YQ7SsIEIUUD5N%U~?#_G}fW*MYcWv z;bwia)t6<}3k(f-onXtH#x}i0AqM?=ntW**)4pOg?gW4O*LKKmMOR#IgP!O^2UwA~6SdFfeHLl$qJ^XX>He=ERK zF?^54cG%{>#l??=U86ZDsflLNGh<*~y;&*kc=(vgy@Ai~7#$ot% z%rlHV)LAV-ov*}p3CH+5+?}mabvz_}g+Vw#-3I3+bRv*m^c|~pqV?vI0?cb`%vs&9 zZaSQgeYc!WCcD`V;feP_pF8+1h=}Ej$uWKbN3c?a-pr?ptk#Nsr+l*qU-omU67=mT zda0?ew`@X*)Twy*2hZ4zp{>9CiaWO-W=m?h3|UwGa$5w4HF8>DRloy+VPfH`%a^=o zJ-GQR>D1Y_Gp-DQ?nR>yI7)6@kEM&YmKpICknUPJuc-_j#%q2S@#=L@txYoX>U=AP z#bvcx$7iRfea&rfx1C|(rxk^U>E@NvX02ZDsy@95ne|a}pa7q4*(2?%9ps|R*hx0% zYQq4{{1~nyuKF!#@6ng&_4OT!FpNjyXYzk*q4l^L`T3UWq75MczeKJ;D-YM`0UqKM zzqN^(3u657nI^gzW`xGp&4aAP!ub2`A?`!x+T|`u*&U0P%gu>DOsIY z4IkI`WkzbGIjKv5oAEMRdD|xO%Z~B8fu>9BJ;8H^Pw^pss&!917ndX__R!6^FFpBk#FBOE#H+wfiC?8q<^Cjd5#U#PB?U zzR<_ARJ!t?ouZCHz78(z%`dwntmf?nuv7_yd6bZ~_wz}c>)m+1K|9G|RCqio`KSI6 zxUe$q2?zw0eEg%$>$;`YN$(yEWcC{Zh8RcJy13Up7=}j=S5CQM$k8LEt9}g+QapL5qFO!c?Z+Yoz~0Wr28!sxp~zW zLfdOs5%DaVrVhbA{JjKCzMTqjit*N;hXS>=hxd%HUCiLqV^*hZZosfN6#q%{&bx>d@JUmV zY^Z|-boWj>j}f|QinO%nU3+O)4+{zvN98KJ8h8(9$*Sg?uB8n{Dew~3JZT~G)i4D*Ma!5pF5@`zK}8*iGa zTEWxk>vGeln4Zb5Q6B&s)nAbMxBNn|t!&P4c@&qs&-E3 zYl~zSMeO0Cx~#(?T|L!dW{{{6^H>Ul2Hx>Z$FwP4AlSzpLCCQ=!27)* zjIQ9ESkbMhfLD384U7wrV5h@=C z{&l>ml!Clfec$??g?Uvc9l&0iRyuR}D`7-8p~Ow~Wx?-0eHu0J&nP5@sH~DG&!6}b z1gTHXk&CpTAEjhz+qDpm)L;gP=oCK)(n$&Mv=^?dTDZNW>EWpqS_~`MBVkcmZKj99 z^pJu|c(ri6RuZQ`i_J3z)3|XD4<-nP0f~BiEeQ5WzbC=xkgF~t)_|k?f)#ubS6Ms3 zIa4tWrG--o8KF8#@;3tQ+7Ju+BjSNE=@HQFmrELoIA=X?az62-Rjv`NFu6yvp#UBR zy;+|`ig|0JZ!E^z*Ijakn$|8sQ^mjE`o$DID?t9KqV~vW_=O4~Uuvom^I%+bVv^%S zgS~bzYErpZ8oi&X1+2X>2Fw%4{I4C1O9a^Me;nVjaI*jJOj`E;2fgsW?FakMo@Y4+ zEE-soR_GDFki{fG0285lBq1OY6S7P7;D57zP%QdFMX-E+JF}YS9J<+Cp=uFohjt>P6N-Sjv_Y6YnbUt*qP)}N;Iqs~NeYoEfJ)g`%h&1a<5B$@QWWKcn z<$(iz!F(0gI)A{9$bRV?Y#M9%ZDVnS6{djK!gthObg1fEc%#IZAJu|UQk=&sTd%8- zA27Cbj$T zam*G|+q?OAF1-=7XbFvb!x=M)FBq|%&0DV~lZ-F^iH&wEw_WA{K9^@eT&VSfO1tsA z__s{H+6AH@&!eCA^$*bwwI+_bQ4U*-xa%ZyUhVCpqhTfxJ&zBUcmU5__ery}Ki?}9 zp7CLGP=r_oo5m_g<;Z*{$b)aP>M8dyWLu7`4J3lgiHv;!2eBHp{mM2*lhvPLX?ugU z=Be0=t)H_8rqr#@Y`O5Ao>l~8b0zbWftR~vce6Rjt@>tqXZ+!RbVM0hD6#9zmIKhE z-scd05J_t-bL!7yy#lq@5U*eq(Iv}=N-*#%(%Yf?o)H~%me*#9hJsTcY^RBgXG_9- zPg+L!QP$W~BKS@Jkc}S7wiU{e10m16v&Zfef^cvImkrn9@%$oMFms*ZBiMyZ^>7t= z@xY?+e%6|=OLdiV)|sLPXrpG>zIfB=>=sb$qr`RZv{QUimH;S%u7S-NvKoZZtmRcf zMgoMCaMvHQ*Y;B}$X#l!it1T4iVsN8lvFY~+tg^!H0m#FnsXTZ4X%D4_6X3}kLtyI z=PNU<^E$RZOT;OjsG#aWw?eAIbR*v{*QQM?J_v zcJ4Jr`|xRGv;aQOisvJT^3;!1UcC1FdPqD8a4>49&iB$<8HrXRw^fXcj2Bn|37esS zqjLzG>XC|G1NGYbwYf7G*<_&D8cRo?FI%jD2ya6vwWW``O*~7WLe+vmB?Y=Q2F6E7K%htp zirRC-Ll1;@OVBaxL_#)NT#*|)KixmP4~wp8V=I%vfO5LZa&^p&yKv_5co)eR7G#`A z=FT=AmM9vjo&vQsRQh>k8-=^W^%Y4TtXfB=x&>k{AYN&{t@vw*ks5fh^_+imsloz= z4X^fT5tNd>3A_Hv1VFVqBZ~z6<1n0>3{2}DOlTWlc&2O3M2Zv<3BaNZRbIIre5x6Z zxpin*jf#(ecytEQf`Jh$*zY@T$~fH)b;QFM?blGR&;#UjwBbn!0(>9y3xwm`ManbF znZkmIG2)H%9qq5^sfjqmH5|=Onky((T^Ef_rk$M5ZTX{6uGj=gEbzx82{{mWl^XPp zO*PS7NnmgzzC~74`E~U7l-+skcceC3t`$J(JnPWN5{pbx^2oSU;C_<#%#3PnPI=>biEkd)+2_7;zN596$GeqZ1WLIMInYcS3A$_wXXx9l6({uDogbr6~> zbSU<>*F}Hx6VVozht;dz?dfoMIn&zd_CcEn6s?4*#>ssN<*5UV5Lpwi~^LJs_We!3F&_$^X>cG(x9NZ0N%I|=I zHAdp$^!+(MQ6WN&Cmx0>l%=0iFAnd}GlYoDDk4+|4z17Suu$<3iXDPmpGPCNf(M+v zs=r2YjNl97J9nG5mP%!2_?-Wlz=}nZa7aLGxh#*A1D;!ZD++bcIK1=p)ec4p?Q3Dt*&NdU( z6#!K|s{~)FwP`Pzk(V4&iDWh{u=yR34#oe+Q310VWh$ZqHRdLVNEQ|ytO4}l?>kVaf!R>%Xt)42~} z&gQXCD8+&96U(Hq3JBd5CH=wStwKmYf;U0VXX9bEO9j9DOXvXHaPqr1;fw91@Nj86 zB5yZV)3M%)=O^iZblPZ**F#_=$p1yB{Xg>-1+9R^0DZjv5Qt6eDPMCDn$m?R9w`Ro z2HAbZyYq{r+AdA;o>Ixl5nXYdh0=&}`QLQa7LGJi^_pM%^XAm0xETn53?IN#Xw!^_ ziq`+H4g>4A=`aX4t3JI|Iev40E)k2ECmjNAUT zHv+~eaK|{t^cIgGEgD3HxR{7hqlI3A7ahQHhw4RbCYgz5iuYt$pFYwvft#IDvKPw) zRA>Id5Da+Cp&}qVo_kxEuWrH zbJqw=Ny@18=AU=*E)tYKB5B=a41i4ZjZ%N59leHq-?DJmmio9o&eb~G2prxAQt z=XK_X;=QPqC!wGOwh8*iP}fY;JoX0>Abiq?NsP{Z#Lk*BmABuy5W7gdrBa#YS6f%y zXDoD*o2|XlZfS?1l#ZyNNKNAKu_!cF}?Km0c1|QrS0O5@Q zN@>{Y0@Ne5?sN{Tk8$zehqglPj4kU+!Ncj|aTeZo_~7;I`}de~SLbB$Iijw{r z;zMPFgk5eNhCGx9wtbL8E6yFp;WO#<90z3Acyi5w7@IWRV#IitLYG40!9xrOW zn;L_TCu#s)fw;|8G(;-Gl*3RF;KgGov(4t1QR*p zzj>0T4&Qn4f#8(YAbPGh}8M#AY2NBcEN~TtiIh=g4*MrW+gU&_yrBhIV>~(b{ zz9-W{<8ea$r;Z(DG>CtORfn#nnlDYF7zc|$Qh5jQ*KWW40OQl}g09ZR@_w5Em#Km& zOtPPHaTCIdkqja0A!-ZEHV7&(*wE8;&3}F|96KPg|106H{~qQaKYj#^+jJU$j9uZ6 zh4EdDaMHkr>goZ<(=O(IMU*5O+3P4F8+}qyi)5+7~&6QKm zFemWi1Fz0i0$b*oB?N!DCO1dGRms(a>;osX2%mi6i}%s?sWD1Xf0LYAd}{Vee=t7A z{FYH{52}`NC5Q>6lfmS2*L&{D-Oge3ui7LdzC*2LbPBN5Hh6!w(@oXm%a|cKmE|0L zQm%Sy+Bi^GGF?ZJE;kZ5}f9(s`873`~Y8pG@? zOeaL)Vm;U1sh#qD-Ut>~dX7~hDT=LcKNiXBJ%2jj!U%}M8BsyjcbK0GL_qs=MgG&? zA_v3a@6}GZOYSwdK*yG$78FDIQ^sAta5ho=h(D^)NchYbx_4k}Y~%(wA~#wPLjf;z zrTMgkNKX+PDk=xSa*^-BD9?Nwj{U9a&*B-{Besm?fccN~FMK=K-a26~df3K;lfVkT z4b)FrLVj*i8LI)!JTGhO$bK)vVksbD@oh{(+NVVaFYAcR{1ML;LwUDEI?SDjOA!|^ z8e>J#-pV5`gpB8ef<|i`un0l~&^|*fu*muF1%f5*FuVXz$0kF-9|O;{v9NMBRE}`2 z>J^ConWMWh^F6r?aey#M7mgvc!{CAci_=084}W@Xe9sBZetyHPEebJ`0=+uHCHxXc z6;PHps6s4FNAJR|hnEMmu>#LC?Dlr|na_KJ;QMJS$-$p<gmy|LFI_u4N;h6bs2Rm7ZB9^l4vjwQkq(jd zf{XUh#W_8aYYKGdh$x z`U>r|gj+U{_0iF1fKtQGH)i~&|7B81;<9lknk1s_5HSFR=s~zmJ%td!O@V2hk6Sey zOe=u1&nEVebbBJ+*Kc$6`c*TjmuLnA-Me&NtPaAqXqXbpjt@YoxhG~Z>oyqxdQaf* z?`LSUs_5VW7OYOen^sb2RE%z$+z!~fn>vpYHc&7&=;-9HHAPgc%NeW9aSBQ&;k@Tc z1_BsXSRJVAfXYtYvw~<4YN~a3CnKt8fzq>tT=2wS)AvgUqtY^cmo<1>XHtHEFB_q+A73I;Yq5MlTex*ug zf+>Y9f1!>=^KZ)mhcJjRmU_4<*H-Y7ii$dT@&_vvRb?5bRDGj;-Tmpo{=q>%8VqiX`_8W^<154{q~K)6 zo{`cV7OAXjdN^@_obRVSnyc#_wHJ zP*RRpD#ouHZmB^UaR$}gpe-lon}vvJ7-~Im!*~}kl3p#>{T-eSru%i)LxazS;CVh~ z5R?~3#l?L5bYLY?`_0;Z*9;C;=!ZlxfKNH3_cHhKXVQaQI^uk*kaTvJ#Twm;HpQueO(;Rd&PhPdT za{u2L9@^D12BMMXnS^13J-^r)0nKwQ9?a1)9R?gzElm2jOwEyBE0Kg;aflP5KySVb zf0I%ZPE$|yO2u)4;u`MxP5A*d5?~#XkJ1Nz`8r3wy%QM#22UP+cu>X!H7gHrzkFWn z9Z8R!5-vfG>N#(Nt;umi6RJLfh%Cq5h5k%=iYd3Q^S%8?43VNqTy;Mt%;K7mYdPwC zIqYQ&lZqaI0C6`A(L>Oh9Cj45SmF6G-5g~PRr$Wof&KEd;IsIMizNlD7k4xBDi$Ma<}u> zMKiQ-5O1Fqnlx~IR^UJqQ!+SJp{*+IoJLkU8x)B`jKThL4v<2)#>|S5IUFyfc6vANS;iriP2}HFIk^pFToBQ2uH!E8>!&06nnW!!|3|@ zLq30m`@DvBwoiALcZ_{kd0C246GRr|BBNg|PaNu@2(^mFjmT9_7h)0YHEc9fai
knn3+0LbiCY@W^ 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 |^S(8nOg>XQttTtLz z6r$B_brM>3QhqVlEjYtF;ROW|4g9hmE>O~B&C;ntb2oiFE45$aIETdYqJMT)tDDJ` zieVM^MN<=-lK?$5ty)2AQ*kH|z1e?!v??jn{LE{gClPTh^Izbs`qG%B+Pk93f1m&F z=_10K$p-@qxq!xZh=-@)Ms7klvGhfr6j-F0j<$&9h5xI@LaYudXk}KT(W&_|YAEYv z=JtjfcXT(e_8&`6&a(zq2PWexUxrrMP4Ugj|DhdQJ}mZvyWfS(Q?t=IrP-j{`ir|8 zgGu(TDz`QvAWn6=1lsk|*x~=q{=Nm+z$%77tNIMI%9c)Flyo@IPPM(u`Xd6b2K#x1 z>6jQN)>-2U18N)-DaT<#(}3-oSe_18V)dp%Q<+_pRPNNcDn(I2#c3FD+L{NFU75MIgoN5?qbGd&W|VwA+Bhk6_@E`<+G za*(z+`){zAwYg;X`{9t^GjZQnk5)AvXw^XP>G9&K#QHkgvuV{Z!5@nJ<}yj&)rZK0 zHSLO=9RBa@m!7G;Fn6}pBvo*tX;HO$lTfNQU}!YQ{(sB*BT7i^#5vHDjViZXY%bI9 z#(gLSJQx_Uo_VpC5?7!+S^O{ z<-}fwOKFnovVc}eQM4+{LKC#lm*H<;_uIk#n@`S7xIA4CD+Vc=Qj(%oiJnM8ly2ZZ zsa)4yqcIQi523qiW4chc*y`ZahUE6l;T!Fdf9)lx;>E2DYlBZ63A+AaH4q~l4_TR#^wrEJ4_|#@ukH4wSDBGe|8ZpYF2Vyg?H%#*|~5%|jeF)roC>DB&&0_!g!0&=JOyV7ie+T}S3^_AxYs$2@|B8PZqV3o-Lf>d7% zG_kMzV)DDV;EWX)2o{4)@eVRyI-G-1cm9@!SK(QQHj$ueAvd_>_6bx z1TOi*f_|YD^lM6#61a?3{cNQ-D!upgd{F^cZ%DKz7p6~IN;m+l-qi!(-M;P`WMn{R zUkf0DYrb&!zq5ZDLe;};?V?q_&>up@2`DZ1e9D?#2bx!Q~h7 z_T(RG;_~;LFeYk_SU>lSo_9^?x#`68qDhx;E$p6M$Gdqcu^Vcyu3;lpr zvI1L6InC0g{2&~+8~Zl<&%%{;D-Bi6UZ?YTo)Y`0uIS{?SKsofvx)THx0xxj6#2zm z`t(+edwBipFTehab*G$4p>nkBr9xn%Rs0LB?%ty)Ds6?fhQRkNi&%}%sQ9v@(W)`a zr1Nqcqlr1i;tMF80|2%xjlwU@fl`TaNR6v{Ihv=+n9x3?>r4CEb~%UeL58d~%qi)B zR`;>UWecI_9}d5gM)rj)h0oqU<1x^|+*F{0 znT}wWt;W?sI>~ut9%>A@EVe_tvw;*q)|z!~iL(}x|2LdBZc|D0sX`3nYAna6*B}2H zzNd}lrvi1NX_%0V1Z;l&iNCm{fiiW9naV*s#Qv|A5nA0>jaC;XI{@gQwe$CRC9V1IwM(hgLAqQOki5a9k#K-AZT=(Edtlqlwql z|6R)p{LgAQ(`^r*{B8|w^6$U;9LbC(W?0fn%F~rBd}U6j2Ph4>)-wQn{QpxX5>PZSVXHx zELsJ;&??7>rX51Q(=Lh}HHUZAKECRD)>=Dj zi)wj;s=i$&Z7&;&29TmL>2Sb-wsk_=Tm?T&C*6Zdk2KpH492=R?7kshCS?7)Rb93) ztQeKc&~Skaf3m>bwPft5=Va4`5Cv`-7*1fTA9m$z|9H%h6wL@K5o~P01U(-u7*9et zNHxCLxSlGwPa@6~OtN@2ksV*r2~P6Imn@O)cRr!k#)1gTH(==XW+WIU3^YWDU`z{g zk_E{GP0k4n1=mJ_S2~OQh(gKRwiat&Ns>#2_jW=!cUMd@GaoF7ZhA=`MkGYOeuOJV z;v+WKXCGA&FPIK4WyBn%OD=4;dIfBRXxbz^tWlZ#!nhr(n9I#cBezmNi;bLhMQ{|V z0C^961NvbU8eo%4U`wJI&1sTeJaC?%mOzZB%s{h@a0jOv;4H}sj3pMVbnJ;J&D>im zmP(j12cFyS3$kcSZCxgSgbrTE<3(P?1;QnVx2`0I7;oo>J)1GjJJ?2fBc+>*l_#K?*ogo< z>ZA#KoLN-vLEd7H)>Uh|8Cf!MF=--h-oSkgy~Tu~o*gltn$6x!=6E%c`cwHuLKnCb z8eE*R*^XbOC>YP|9&<*UpsV)Y-=ujgbG@TD4j39c3;#}Mf}MDObOOG zhD-XE!S)wNVFt4Z})uPyn+^=kPI)OiGZ2)NtEJPT$f zoObvj3x(8TqQv73<|5?)$IWOoW42^}Dyk<%{@z6Ls^Gg%WY}m;#Kb93w(Vw{?0w2j z&oIAs6ll16$J1=+lj)T5r~9CO;e?}28?moLItTE9D&ydPOEHTb>-A0a(K&pB%Gf=# zr!~Aopf>d>NCBfT6R~h}5HS&{5HU)yvHUwYlYkv)l0=on04`ZvXnwPGyT}$nbYx^= zme0fu2V^-@t+u>5YxXa|!6vK&{Q;*OKmMTuwZHU8C>>BJ2?PUTT-|0ncA^V7=JVbC zU3qxUAMJ}f`b#2gig2fckc_fy5JCftieo^os$!!7l7zf|V>;Rq3Ghr}DpS7W`38+N zlixb%hNrwW0BiM07-PvM`Rt%F41^wBsmdg`cWb|9)3kn zQ^u1mve*vB#Og%|2ItL#4GF97C%BGpJsO{VP z-a>f^0KsjhI)`G^ctDvn#r>5uIavEevOu*B<drKs~n+;3pz!hfD+myt=|CAV3gXi&@20B^U?cHgw6Wof*-E=DX`7hbwaIkY7P zg`^Rlkaog{N;(wClUHKdL~<{dJ}jC6YPlT`J4Du61?m-e8>5#=Od%LBP1@O;f?VSV zV5g7P!*_%m^GXrvA8d&+Q!5MIHJ38pxo=`AAA$r#a3^Q%>s^oYXHy;DbD6>Mn+S$En48P!2wOtRNXzOZKwVfp zeJjFeE#O3)>{>K=%jL=H_c*a#oDOg+EQ$bxDIf-17o(cIPv`!d0= zd=A!Dm-+$ZIe}2npov%}N#D;ou*S?wssTq+eH52BWDh}D`CZ=Q+S9$D*-m7X#=PQoP zphG#aVv&VtM=`>hhl<+AxeEh_2QuzGN$a2O`#rvtxYXPr?#GxA6jjT!x*$sr2=aGR z3WW$mSQAbByZm=hVNPn3670Y3+5Gj~VUeU`!Ekm`#ZxVY?C!R<7blcU3bsbS(;;OZ zDE&%S=W81r>-#?Bh;Mb35JR)GCIpwLdYnvL34`!&z`jd0Vh*Q(K=uPbEE}YfKmglba(#25y}6>aG)rIS`0-*Bu+X>FUy*Dan&OyOOFtWirM4S z3Ctnu=bJ3V{&F?uk|zfB!32Yj%x|YwqY52lxdyyi(3^5-d!Aby!v$M-7-w4x320?# zxDc$pH@w=|PXB4B@vsnQ9qrMJLtv7^T8ms$|>IFMZ>$30i_aZuqKO9=f*;l36b`^nH@vSOza{ zX#a^v8P4(YjrY359A+%DR9=- z3IV>kv3@1OG`?udu#OR}N8}Au)J-5~jn%mufU4jo+$Z3!tj~6Ze+Ylh58E3Hd!OKz z@0)LLf1ASpCn3W#rj=hV53$Vh)Ru6dgKM@n%LK|FBE%C^9-*>+AA7cn9)ccb_n~5* z&Eb<(F^Wk5{dY{Msro8bb>rp;OO&_R$Nu;P6d)TB4P9{>0azsg0! zuSqB#lQ60qM_Ti=VaD`wJ?3>z4tm1yvph$Ft>Sf;L0y>Qy!^*LGQeJ(%v^njFUpm! z`oJHPMhG`LRA%Jj>E7H*wlCLgVo1X1e6!I9%n- zBudhAM4O=)qm(MdyT`LmeUy^HCNXfXfazI??xPAt6EQDjK9k#yzwD2=1ZdV=P@ieY zb^+==Ska4lrtbr1Q{r>!Ytpa~c%lH&4z284ZgjQ3A^cB_-G?}Rvv0gB>0=+X(6Hmo z<$?n}^6gNXqBTk%w81>)pH(~TO;VRTv)-Z^I$qIqgmA6*0x9o6*E_CT4l}QsU~|Xx z{&LeGAD66WYaz%%@q_utJWvkXG4}2=uURbdBZgin{SDPn#Iu@T z3S6G=_&fY56mp=Cp+Duvz%NFPT|QF(5p{J?It>tdjjFB^cr zDU^GnVj`}6b52`t^0pINJ#8BJ)WeXWjWxm3KzZ~R=TSiLl*@_`VZi^x2?~rMp&W_K z0jN84h}ae}tQjid%SJOy52JtGDq{!h>X&}Tdp_Y~6|y6kc3Z0Fr1+l=7L|r%h2yG^ zV!K>U`Z_WwmQ$3SjS%8#Fuh-L5Ga6Ml8U9yhqCTyF_zkowowv{*mWt>fT>Ud2UEuB zfjS5SSkBP7!L#u(;fJ#4HfjGZywq0awK(cUq{F;|-c5`r&U6(SlWo4L$WpCmCiyJN zqBC30BtDz=1dkt}05NTL`Q&MzPU~+IVj5NXE?Rq;%-5ecMzWix4wn$@e~kVQ68|T#|H1k{WR?Bj zXRQB2Z;rHrEii_p{1`=msSjT-(UURpTu?q*B0XXN%~k_MQD0KGJ#)<5uIC+`?rm!_wCb_&PkWz$c|zkBgY((@qgj|;L+}9pDyUn^ChIU zcHW*9er2Q>J8vul3Jx@yZxB7hHwoEy?&AvO#C!4wNImzYkdK2vzK%Avt@18(>7q}! z)a|*5T4=@AI4to2?%T>%w|p`Ow-CMPp$>%GR|Z(6sB7Lnd{pI~1ukEoTVeT~w3F4{ z>MJEAr_{s@JMiHbg&bTf^h2(|9msxjdzPU(F`Y=SzXm}1KgyzMWfT77KlgS`V$8OI zct|Z(_J&JsIFnc+X-BoAGfFWHyV0+6O=iieG3jGy3GXTbg8e}|(;3>HZo(#?xMml| zEh%wqXI!guDuP1zuph1!Rspe1XYKi^tdSh&f!$Cj{F3i>YQ$2nM2VMC_FW>@eY`a1 zx$-NI!iG|}e@MYcrN7INI~Kl2!16q*txf7^=dmar{CcW&Ky2pS-K3rLOi&0m_|0g@ z3T8!_+G^(jdxDvJzxl-VO?{E398Qxdh=sIgeG#Vm+_bkQ$>OBXlg4gcEZcV@+(#t@ z2tDvquq-!o*j;5V4oj@4WeprOcQj(BEG$nC@K)aq^2tZeA2fAk_fU$p>0nw2@2v~G zZpm)3`a4>+{o0!f=IYavA^(OW?mZGk0C$<82!Tff#);1c3%U)E$hBJ}b)b!l23Wyk zJvPol8K!7Y1l$w(X9jN{xSD(o$q#hcq;tjzega(aqD}bbO!<7xaY^Pl_^63@WpJpK zwL6?zqHsqdRX|wN*WNF>*2q5EyV038OD_%JwamzGpZ0AjSv&;}kz!L!pz6@PE2(~H zNLeefY76-H`G06^iNHA)z_QOCc;B0S+`S(GetLAXFTMK1m`O^(3p43a%6QUi(8U-m zU1bRMSuaURKp|ezKN;-G{15qEH*N{K?coTdJs24hmMd1rOE(aW2?k)ZdY@e75Tu)0I->dh^icYs=aT&#OLEH9@Ql*HP?0&6w>1t9p(F zwNDB{Wls2r;YcJtxvxjUsI|~J)L>JPYi#JSOT~Ak=N%KbAcdEaIZB5Mhyl2t0dzhf zb3s9U+UR(f`GevR~aSXDtkrl z-D#&hu&o(Ix4q6qE0Yj&tj}9QqqB;D_VZ#N>4drbCN$P$9OJJgX$mrdn#GsNjKW)m zR$tu#8D?aQOje$IaRw1*1cb1IRUX(LxHuZnzTBqEVX8gyL_r`Q0aLKT&9d(|V?gQ@`M|Bm zu49qcyh&4J(iQlB>-c|h|Njy7>ls+UoM{O|AaqHDnUDZ~XsJ6_2rPz*`}*G->V+KA zwz3~{&w>4`5+u6_2T#vCHyN-TNGeC`mFk95Olhnq?|zV`w${cMH}m7ZkLUKMI?R!v zob|`BQAW{xg7t$yq~{&Wd`$vt*6OKr=rd_=Z&hvnK3#F3Xb=ogs<;)KEQ1p7S#PHo z5&cNIW{iN+@L(Xo;dK(_TXu4Q1 zsOJ%mjVBcAQSuu_vs~ePD(JNXwMgINskpEoX&UPB`)G-TWi|VO&Yem}^6IcFR^yX~ zy$(as25rg+IT(a*?C(!_f{&dju#SOgF!^lWa{tE3m|lE+5b>(5dAMEQ20jBpki z^g8L;Fy;@-7L?tiBpbTS>B`im?8j6JSG)D7h0fQRMME(S90b!GuB0Ex2A9!}Ow{r6x^CTQ*N?>rVL;-6U4$SbmI4Te zU$~dJ5NoEprnw9rB)c9x6~?hu!<$t(t;+aK2P!Cgx zE=A4XN{7(d0rgs>?U8<)kvpAywg$M=gZehfVGv8b-j{ojwIJNi z7^oEkV1&POv3*BvhKZ8a87ri#=7v}*(?6*gv|{qN)yEY^qh>z4NGZ8fY2rJ{vrJ zepuFFebkn{w|PKy`d5A#1K z1CVS@wR!2l|2HoG-}+9(#{7SVFKNPne|bwq0ajZ45C~1uMF9-JySzjJ44G^ooS)}# z-gW<&UY=3f5++JL|KNjE+#~?zi@I z$9{52dT1uv!39W@tHkg`5=2XWMa{eqek(f-|cwotI)7wW3Hn_|mk+ zZdWhF#o{XijMp9UkBj%^BykNf-Ivh>r(X21$_zhDA^>XBmLk+#s2!m8yP^;p#!8Oz%0MfpxBwhQS?FYuSyP+iY<&uB{)Ip&`QdX(7D zF24ti=`X;?6jd-()$2wSd3~Qo?)ud^>IjzJu3^UjCMaP8OI~8;nq=Xu?a1;_t6344 z#Z`|eAb!eGYgJ{d0$z{1#4^@72h(R_3*%HyVK0W9#z*a;@nBmRAQX_Efe^zb$T%N5 z#VnJvf0cJk{}Q8>7nOCE#q)<=QXl%1#J{$pv3Rmt#Ik2t;@Fk4`+{Y&Z&D{Z_EDl|g}YlA=aPv`=rYUP+GCICA+u#wAsjkNqU-z6 z!#;L9YVAt+Klj^Ud{SwzmN2y|4&})WF@1RCq)k;FnLvzmdwS(60Okb+Hw`10RJVlz z#)3XiY?}MFWxKkifwtXX?gGk%Q4>Ky$s<${n22safoeOJ1#kzGSrdkh==#@u?k7_G-LLilnY4wpdYC$H`3?$r<-23>{E z^}2psBiKE6?#If(6SJ{|)!=?`&XV6mu)NwDvIULPMhSf@YpV>N<*?~R&G4DyW?sy# zZBX*Ul)4&qbK_*xm2NWYUSt)ilD#+bJmcS3jZV~Vo_tj*%+tv__!o(Z1UrU+s>=+i z#tM&WAH&Q(m2x|t1OO(gO!n^rSE$D7Ak%nM|IFf`&UorLM9!3DbZo}9y+vD|BG80y6|?G^-CmSu))-JX!Na*xh=%`bJtC+cz-#YVp2fd{$d z80_Qr>2J?e44E4`&B9dm@u*`!ydCNbzELRri%SjMlRKRx}PFfhbrUFYb4;IFooxTX+>p>Zm2)RAM<)d!@_ z!z*)#d{=f<)x&z-u*alR4z-g3gO0|*7#4z`iOYP9P(<{=LVM6G0--%80r9?))pKw= zMMpI1648DcB{7i#4D4K48*=Ro=_2(=y_whW*o^WMF!UdjX3id%>ac^EBj4qpwD{1Y zl3C?SQNH?>&S>(M4JZrlo8R0CF=K=}8zBRV7~(8-6ynJ#yn=o6EO)H{riIIPJ@qt%QvCUWr(2Z*l#?c%Zey>J*XKlFkjo1szH;JvR~>( zNCdLS;ZrAt=-5{9P8~o-V*&nY!xBTMFeBH~sg045mD(F*rvxGX@1(gi3=;_Yl11VM z8kkns^L_hgSzMKc)@qf2yt%N;-7qlVbP_hsLoit(E;L4Y;G}n*3wfN0!XpICtc|=y z&dg~wZGl{5y%m$6M?XVx^N#VTc2RO(vp`w`Rq1~r*?~n&K~}7Z> zY+@ja=ou41`s1e;5eV)0K3?29)`6IlshS3PQv`@iUaYaQEYmk&OK*lb8xfb#H6INV z6W``ugH8?txE!prb1;+UU1IUCP>R94H}d{N{~j3ugt_%8;;?8o2Lgx=Tb7uu3O~ax zeMDor|E4~oorB*fkO1WrhaqZx1cZt$nC?pn3K8UHjw@01-(Aeg6pyKqA9YK^G56|r zDWz)-UwF{j)>>&m9^G^imb8AP^=9;SkMcMQwOl1 z@UH*7THAQ_pGjYXmZJA4i&FbQwMP`8pztdAhaeIFJbD3~d}Qg(y@9_aXmsP4 zm?U=iEt~0#t;<)CI4={mHd27uqwe~7l)Y!1U?ApZgC$Ii&Z5`-bawG`EVv*IvYO~| zXI@!;S=(bk^U2~jn#+t}U2c}_2G{k{-Rd7(Nk*bH!@uApvN<|{eOC6FaRW`*YgdpD z(0ZmY--=rS91uKo(S@UKE=`)(wg!;z8pyfU@ANM$6x2@p8PuJp)R7*pd_vRZ6VyPJ ze{33A`*}=B8AR{tzvJbbcSRDh2SeBNX~RP#xX--M)Y}E3redk+;U7?7|8y8{GwCSz zG*X6W+kl-ap)krMo2l`8JM@6F06_qml>U$OL`e|O!K_@hVQEr^yT6lI}}rN3_Iady~a1IziTxkDxV-= za`^B_^TfzDojGm0;D$nE`l|eq5+^V4a`LP5Kk=WW{VQI^_Z7V~ju^_#bO>U? zveoXrtS4M=$sQ_A+*+(UvBYFFzUBpY!v0uBKRLuL#j9dx=i^D``3+fl>oLO5y=Q?g{hq_#Zur40NN!LbW+MAUyykg!E1%(kuXm^Ffai8 z-cAi#v{28eR!oTg8ORCWckJe$VaadjG$esCeREa7$9TuarpC~k#MGC#UY^*(?ftJ3(q7{{|csgDH?6%ytSmc%RGR2Px%lTX!8B@6su7$b9wj) zcL1_51M)sA+L|_bDrrBV73B$|7PQ zN-H&INq2b>=Fh3OM%%2|Bnfdd7e_b`C@|yHYyfknix(JoutMH4VS@ewEp7>9G&9G<{Y;IPAgy>ybSB|efTsUdv$TY@`R2k)04g%=ApO3hIs%Zyx+J7}Yyi=Q>WNUkt5(@|U6eN+n3zwI)u;OGp=Gl;Eymw1 zbfBlx_*6}B_9o~jH>q^N1%r&F2G%E$T}exlXz~23B4tZkE2_4Tl3I*_yH`-sQ~q4_ zB9D>MH3y5Ib_q~C9?6trDgM;cczF-3*T)(SHx2k`$-OF;;JF5zzsyL@kbqVzSe#W8 zMR@2MUlK#r;<8EWUN(SH;zC&kL{rR`jUyhwMK1E~BsO~b1jHRJt8H8-= z-h6%^_X^`~>4ZF81*fWr_^*yx*?B_>Mj01^4bcbd9h50R6e7w{J3UU@SVf|^LAQoeD0G79uJc?QEEmL!Qz#S3)=F{C z^z9T#O{CUTBg_Gd$43;;ym`)eIKa4H<6n03@?_!1FpBOMQ^iOfPF>>>nxcgyph{xR z2XL_-e_l}(0W4MyCOvhTq?jVDVVG*93^dVaOHlX*AplzfdoZ0PXW+=z>ij4qGS-Os z;3nfETi6h8l?1pIy9Xj)f9L3>};AINg-W;WRv8k}XCYPBcf<{Gq?FAIf9X3o5PgWxIKY9kETMsF;#IYe=1a9YY0%S z2)P`-Rk(}tvwpQ#$wC-i;Z!GUD_8I=7f$%L%q>-DR8vcYbnc)Pt9KEIuln&W;f}bC zg9FH*1Gnf;MipL#e=kzGJUMrsFcUM&1kc!M2&$XsG}v;?woLA`mSXvT{oHRgG4;{?D{W-iJYS1CWY&GJ^w}ISPZWr=4H0`9B0S8rK~DeK1C*rAJ+zK46^-AfCr(P z7sKV+6Y`@ruo>wQND4^8B2w89gFTqossyadG~(T>IX}?gDhxAJ#5`q89cSzYTU7bz zCQbJMVpKqu>i6qd)?Ys~u#uG8as?})!7h->r;7#btA5dYjSLI9NI{cWYd$75RXxOL zg7(l$2;*p-wX*Hi${CvBKX*zbT)afV5oIBlFcdoriB7U~ucyoD`#{vho+YI!a{-LS zO(kfVBvsMKfAyUlK7lY87ZOG=^i-RBk5zpX^3c&?Uf4B+px{MM>?SJ$(ZSd!|HT6B z)v4xmlpq*c?NR zGL+r?{H-EqtLo(Ozl#*P)M}-dCaU>51WJ1jhME6Mi{EpQbfs_T>dpG*$_vQ(^k*MJ z_O2#CR-5Y`7>_#uYj*BU{^6t!*9`cM{JE$hq8am%l|2}|BGw?S18l% z!TL8v`qzEXB<1#C0a~qXL4B-zl*raG@}(HWS2h5BL*Zu9>YZMXz?a7;2!=&(VXQmR z!PPCH)q<9@sZB|k36A6jDDMR=dfHgTj6?6AB*U*?QB}pEGryI0KcadYScgsBwp5**=OYpHx35Az>f{fi+DgIgoF{M5Fox-0a6zN%HNwdyy|=; z^{Z+On&iVmKgnq*-4ksKx;8A7l7PAxY+1y9CYv3bv2`I5I2p8fKz0vnZrA|pV&i0j zI_BVAphcA*kStExoV`8;j5vjJ=2oOHB0=*$MOA0nJYg?MQQF8kH#$K;pB)fPoVi_JAzGpdb%u9tR5FA+rP9?+OcCgWoFHY7tu4T*rlkO|##RW}KOTR<6-Tz&2pb~Ux3Q1=T zi2T%It+1uTzddXCT=*?e>}!efIEL`cWfQrXn}StZEoL3}?O%oJ0}1&zVk7L$WU^7@ z%@eO%W|B?yabIT|UA{4ermJgVlV=gMRNy=8T>@L^2H08Yi()RUzmV;`pago!8VQL6 zR65Au#Z$npxaRu_Kn<@51$8lS9q_U)JNZ}+u=M#x@)9M zGwEai0PK-uImieYk+}kuX4#HokQA)dd~3Z~C|G1vd9u%{H(Xt?(h_(1W4*NS2xY40 z=LX7p$#bz}UjPmi6NXq`>tRj2{nzA^M_-Y9Ktiw+{X32wqjvub2*V4olmgGzc+_Buo{j;*i3MFdaUzJi<9u;*mTRc zI_u}8^KBYXoyTbT10*tmH`v5E^#89U&zX8B*CNe$56aasH~-@GwQ*xSq8)I%F@ z#p}x91LDW>28S8ngx#E~XvM+BtFokiT<`lPtHIkK{t~A0n4?AXB)^h**Qol^puV2= zX@BuO8Mm{1q`UQIjud6QoL2AwGd+YfcEmFg^Q+^O^|^TmL;Oz1kIjwQ$P~C!4&mpI zTau=kK?4A2CK4%WFpq#W=@^TdHwPR#T3W&k&7(T-afzF=L0;YRZ2lLdS5_8J@yG>V61J<1ne&P?XP4X}6H3I*i@p?(1vO|urSf=;uuy_b zWB~ZPWCySmFT3ee7?M@soweYCe&T;3WVSfI%PjfEYZQ;x$2YV)2O5Z}>^}HQxsJ*x zR#zLHG*DmX`d=QoI*twOPz636)f=caWe9(70&&32rN`+xso#XxD{O2FuU^a`(Y{G^NNpSBOA*)Wj7sI2Z)KR}H zQ$Ob+H2vJTm{O*Pg;N}R9oZxfetEiKD6gSc?5P<>@PKTJhkVRy*fjDrBO>PVfm7Ew zw{z79@!*BD|Ge7ctFO|wi|w{HjD`#`&~_hHOx>$K2@xTJ-3t-DqzUcQLl?g|NCB9y zf5xYE@CUIHSH(M#1&Tlysd+n75u)>TBxrerQS0CfZ-((EpV)y6i5H-~2R^$f(CDf2?r7836c1M2HK$u{LE5H-7?09uTWSL zA2Hb7csSEV2R!B=d4xuD8F@RbE_b8f2hkRS3%3o%`T459`AU>r`p)j09xf`$xiy|s>MiJZVsQL=j8tV>=7aoq-?It;iX-4|9J;H?e4`ssS=Pk0Vo zC>}^mdzB1(R@c!bT23i75K*5+(xVQ8`l>ybCGvC85>ZhFUE=jAv4A9SE^P8pt5krU;H@3~6m5^!$z}Vh^0_+epwZgMd+Wo9O(`Yu3}sZG(z4n@ zJHz9@I%Lw;tiP@wQ2-i2+v75ZZkAi@W%*#)W*xA>C)kV^_Nxc27em@SR8FY{lMmgA zg=XS@+M9Opj+%OTmAwkoihZFgeZ_}G2diG&aVs(cf=*szaKhu3otJk39%o#YJynp! z2s96Joaf5}oi`$MTVOG&a)3!{i#e~=83cmmoS7kq$()UQH#maYzP=gvZ{U&MpRA(m(-qlKzw&fJg#4%6BjBc!ktqW9rwJ^6tiz%dk~$tbndG`GG_)U6crg zyaq;E_xE-F&Fl4SaN;?Q53VtCMLWMtY)RCymyF5ac`>l|6b%6K;6*j$ z`Zn-Ye22emXX=uNHoOxN2}alz3rB9mpVnhq?p!Az4f8D|wPD*B0BxPM-4sbN|8Xw( zZK!00S&W#~TC&iOE?3Q|a5P(vuBxHTdpn(<6h-c)vaa?-K$WxZq&E&@qMGww`}P{E z4o6nch1~&;prQJj8*ANu;kMy}%Sh6exx^_x=7z z^dl|LWdytF-+eIykB43>bnVkzVnFL|k=mCx*2`*E!DHFr$gp<)x^kP2daY!|hcN5QlG4j9m1^y)xH{E*P1O5(1a!2#TA zh%rDe2TL|dK~y9*dX+hS#movQ+AD34V6#oDeV5l+?X@1}DF{-BLeVd;_9zuG<^G%1 zOottjPwm`D9}yRzy{`r4KKT)JKkqNQ3DjcI@{!Bd-}fqlQlTqk|XyG%Z=dT5@#uM#(f{BkVwb%WLZ$TcXaoW;UkOB^%@JH0 zDhvIdx6X7v^`Pc0EQv-;qOabf3D&e0$_h=U#_76BxEm=1FK*bYS6yW730*d1WW0gR}FKLq;(VV zpo3b+?AN_KtSf>mqlu6{r%DeBDpFW94A2(tD7wj@M*^M$LTYL!4w>2Xo+SDLbNS9y zH*bIlk9sP-DZgu~Gq|^BdLX%mIA>T5_CmkS-6oVr9IY=6%s!%cr9`Y|5W^ z2LmfEu%U0lS*HL0nu6x6{|4-8S4fdEHd?HtUT_T}lF-KDA;0IcPu9$~UdZ>(eEYqV zT;Dt{h>;nCI8WtXh(s>G$S;7o{ccI#+5?GLw96#{hba~sJ>EX}7R z$;}yD3bQ&*C4$3~e8qCv*Z3AyTsi(53815n4v3G?|!CRJq2 z=2V{O?Tur=Z;l9o;2JN zOHF@SjSMm5neLW6mrlV!tHy|V31;mvP z4pp5yYH7Eqr1UejmQWd+9eHqi*-R`ztpd&@YTurvd}ab$3Ev#DY~#9` zw{D=s;$7{--R!eK7Cs^!r>lwdm$Wz1efI`Sn3Pgge=gx79CbK$n8tgzjAl$I`Ic0+ zq}<*^z#Ld=9BoIAe?*6@wHX_o)h~|EAin8R{+8K8@;^?CjtOrGIHgx!9LJ5ck=zJ^ z=v5xxA^}b@smUA#drywv&Bi=1`6x|wV_qAU^e?pq=goWgc%@Q($TPb6a(}7oic?4; zf)i43S68>tITl-3PPI(~$0e?)jMql2C+bcdw>vSH?(QQ1vDg6=dEK3k@RLJ`Sr_U- zOj7>{|2eVckJicZ5tNCzjzCBr2hA1k3{d}y9s``lO$?yZp-8E%DoV-1d>3jeIvQK^*FI`*0l2xgUpc$q9}Kh4&0gJh5r&Y+)Qr3zK4|_g ztes<%W`VM$i``|r%eGzBW!tuG>n*#wY}>YN+qP{@pL_0&xDzqw3}Pbohy4fk&dil7 zpEW$D4}dj-=9R9{tar2q2eR1%;<7T=&g|gzD4+e63s0_9L*nl_{~Y(5`_1?RPZU%> zOAHx(1Jv*&uEde$)-W9lZfga7S{Js;8RYRdw%rD_47oweIG`WasEX^3_|BlGMSOur z9%49`769a`gRfM9h{5UWcK=Jr8S^14!=xsM84!EqA1$DX?+~^23`_m6#dagy+!Cvj z1cP)fz|R&XbmqK#1ujSchk4?NjzSt6nt!#aSA&9ETnCG%noGg;mLmonTMpukA6QAM zU;Hg9y@Qq0M3+a5ZD8ep53J9E0XG0N0>02bmWDW=C&$kJp_w$;7sjPq!KnQ^t0io6 z1~BVLLB%5n5G*&sHqGj z_sMzpJL_`T6O@&uW3y%O=q#9mKxlmj7tnVyy#SU`v(Z;x*NRtyr^s}oUH{w>xH}t9 zs*_G%|HLwP!78=5Y~AnSI4HlS@)OA9WE#8jE_66*F&wbZ!*|e?SB9TVIT_Uf_a;n1B#AU?SH3`0nm$>$)FkHcxC>)jQ zwQjTsIOo&1E9~lOJ^8LDsKCD#p#QZKp97zTf&ITk>;JsKLO%S5G;I$FOaZ_ccUWh= zxvJhdP;ekMfapq3F#y#G;7$cHLAvM23bw@D~znHYRj_5{+qz3+~ zFl9jfK-U?>Z=R*|TqE$ihWQqQgmI=am#ryz}WT3cP)mTxT zMaIFatCJgJbkk&rk3Y}Dsoclo=QPO8f~VJQHmhn>Q!jV%MI2YJ2(ncxay$btHKL}W zN0|fWyG%GS-zb)rD&2f2XFxq?^f$1oRIrJj*lxu(Y*K_JpscV8Bgei7d(&HlX-!E^ z*ETNpuTRJN-V5QdsM`Sejl5XVx7JI4_Iukd5qW{`pTu|YnLc85WKdXQOP2WYbr9ld z{yv{H@&H&8)}2$fOhWi_Mi=R0C0DSxx6KdTrWq2jDpjg7gzsGUB-JzbFr*rs!|Vgey5qH>}C9)uuJuOrClc2m^~z5&>146#f&#Hr3x@oT0zDd`1`v2sP7G{b+e-! z5Xcn#RP@71uPE{Pep37+F8G-eQJFYHAg~uO3qR4@JB0uP*z2Net&06%X^Nxt5nEF- zRk9Er^mijRwqo@#xEgK|kE6-9v8w$fEfi8^bL|WTmUQ6BsOBJc``$dSPI@*Ax-w63 zX))vzz3Ju(!KL?`y$*Btnz7gR!#nPKckj~8TcP-VL$rnIx$+zIr)4!hhi$9M%P0Op z*!9UBIBozDfv7eDmti(08vdz({H3LAWtC?%w_IH z8qqc*HMBR_&$t)GxkERONR0R>OvOJ3Ay=cW5M3}6%o*YMZN7#Q-nsnInSU!r9Lw?X}8iK6^JMzjSCzE zqDtRHB;iB1`J&Sc-1Uq5W$ZvEm7f>nXNi#cYX((Dw#0lHl1;zvI~OGGkc-JpIuA1sNl(-FD;ECF&Lih@`e;RAH`h}fo zhh#9-dtuP~ewtXCQmERHN~)TyuCFh@!W}mrHHr`a6-9TJfDECt1Uj60+S!3DY~wNafebx9+0zd z)9p3Y=OSNtj1QiqRi&7jGo7TDou}Patva%%@VZVeepc5?g1b|pYHqup*)fmQXn(*5 zkT{RmgPzBL{2w~^|EH5&w*RaFPnUv#afftzl+AZ4W}RLsIbs5xapq{5_Va~P(n$f< zI_ds?V5?=oHWhKGJ$|$dV|-*xOBd(ymLn}#B?7-LnXXCv{jVvxK%(qdvnHVggbN2e zaGu_*@fm6nSG2>Y&x`k0X*=xGAHaVI#pVMC@{-W)EA~hSjJmU=ami3{A@gJbVVJ~E zGlc0Io5(2r?bi@nLIi7Uv6y=ad%o>A8F|_9c-n3A$^p-RdKLY>W#su%+VX*2NGur8 z6FaEyv}n)rIw<2asXh7pQnw}h?NAgBN*0+|TBxnrYKUhVaE=fqPmHO(@9R>&{pyd( zdNp3;1kf#B{ur3eIpr93{W8D;V9eENB#aixgm;KOgxPhU5;$NCqNwygN^@HusdJ@! zEID?OVc<9ioEy*`yalgIR2<+p0GDh*%ZZ+Sr@MiDow{BAo`E{`Q)ul2BA3`r+3k2mtm>T=fc<6w^-1eqvqt7F zm#0P42}3U8)ca4wqe7_#KN}C*VC=Y)JvLRW^|ULDI&Bsp+r1U4qgbOo2ib?gNHw`e zj?y3G(pt7UK*y-f`kyS#?RadA-No(_w;($QM3Poq*bkSQhfsRBZtQ`AU32E-xpJSx zEwCu(#u}V#6>Ahwpd7RGrB%iL#6-7}aYbRO zxSX|4A}g*L>jx7;+^lq1n1!P_?Sc%AFReHtGer&RdzfTBEATi0(kn*JotwGDH1LT>$(i&C~Lm*Dqi+2NSFCs%UaM=>ZyLeyj72|mR4+CRm)AfYylIbFg{J_ zR<KO)eeMj!zJ=N4)tRs(^d zL42|%sZ=>VpEw=ZeAi7wtE+Q!iz!2%gvfpoS!yP2G7#hjXioV|kxxMqvh8I00|`CD zn5_*UBKM0kB|p`MHAs ze6xe!Z!h#Nw3YPQRNBaE>hA_wAWLLh7=^;R7G{c z9VrQ?22R>z#21a3xHPX^xa3i{fqaPmoX~9>RV@_LP}2BXT8I9ng&=9hnZ{I;8xKMB zbE3hG@IzOZ>&#_R$DbMaRJvD{`z1ZDu~ zc~L?2CR@LymVd8Dw}I>Y^j14CmbVRF)S+?=j<%0-Oy$yZ#1bg~v!(F%yh`nHq6?{S zGJxf+Vdf%mB0)D!$Pw-}0pzyc=4*)Nb!+$oz_xiZuS0^~1%#IBWR70t7WJ-D^@lQp zJ$0_gJO8#*%Q@=dDtW9qwd$)Y8Hj|t8`Lb!aHfu{a{;;38drJO@nyl9Nnj*H?uE;8 z{WKbl-*%R5v!M(u&QRp5KIw;m0oL3)F`ZN@K$ZZT1EemT!(QYj zHM%Yu*u!2ZHUn}-u77RG1}%?IpFBA47e=paP$b;d3F{aHKfrxRZ&L^l?V67B9JF6{ zmlOlCM~EJdk(JXM5UfE<>Pk*Yj49~kX!;g-gW)TyFlKMXx<*%l+uU*)A340abiMFW zJ}cXi#+U$Fq{bf6ZKvzwC`Y*_ny_4>?Z$QD?*_h9xC8lWSHxdsuUXp!j~;mnm{I8?%r zyPyJ3ZkCe7ybHmESm+BBaKa(o4R29dU45K-GjC|VLfO>HrE*F1^I+j=d@HYh%huU4 z>nK68X%sX$qkfgb4WUv1m&x!|E=XjWP}%6J!?o$A`AZB6%5U==p!$m}2msEwon)r1 zx8S?=0$ABGO|npwQk2SCRr@_zr^HBn_nmB1x+8`*sBYTcRX*w3pl%~`nHhTCNfiXM~VLLdH;wUuo_c8B$T^0dOI({He8p*{k>);Hfn}R>Y zajR|=d~h8j1}rdgg8^jX_3}dz+TD(XKeOVkl>qEbb4l)(WfzSSVpdKpUk>Y!9{Fof zN4}A!wIY`IdSRon@91a>kwy#E`S!2tL|J0cVT>}x%-WSY0l)L{em@a<8lB`;`rDdd2hRtWHu8~Hxq$OSWA zl?NaKoqaMiooZjg!SF?9O=PmUwr%Jh^Nj@xP5gVAtLS&zxE1Sqwzj}4*4AO&-F>vH!{7Ai#OmXXN zTx6!luhkH=(_@PY&z1|4#&bu+FAq7W1%>G1M@Q7_U+8pU;ux9Uw~prQYKMo?a_McH zv$u#@b%np0wZU_^b>qw)7oM^AgT>5I)gS9>QZ3x?gaqj_&s`OP^8U09{@6Kft^xrT z{qb))rGKqU{c{XSR)YlohvWON7R3&TTfoUtE0ESOinW1nZ->9k%b{6Ys-ouLR5;ka zju9Mqnj8Xd9QcdvVar2tlpk?bPa6|XJq!-5e{iTpYgJ2N#B;QeW~~Egna;jk zuU=Pgb6v(`kA>p-V!S~dQ6({1fPv~P?PX#dK|U{H(7vjKCSFu{T*0=tTH`E=B+w`C zid5@FkqY|XfYB6~E_qKm9QrNTjisxV=jcKSJj zgsd=gJ53E7v8s*zlExs)J%0jVmt;H#v?*0ClwZ*9gMhUz#4kv>vB!o-UC5-MMiZ6> zn-b<9I@Koq@>B5&sOIh3+=j2BI5bH=Bm|t*ba!`UZ^7MxUK7SLsW~rDY+WU+OD94Y z-}(hnsr#&zaTu4~?-9I0HO0SL0aiKeYWPPX2m5?%ak{)2QC+ev zl9lPruI&id7giW`ue|i`97}k4J+8C_+X|Sw%O9sb9Nt0P=`9 zyYQ#O0v4AR*r%1cYlk3rn{l0);B_nIGF&c3dqZ}QF z;h>gh%fqS1y=;rkSH5Wn!M*n=20Bm5b(FG>$~bg^(EEKQG;xCgp5Agequ9?%7$7s>&e(TN*$elGo`5_JvNEM^$>2hwxoFHzZi zPxW!&kVyfsi#`-?uCAzlKcX-YcB+lFd#(cA1INP}Z$O34>4=8&g!};WX7*%;T6|t1 zk(VVyLr3jEF@}Y(z$cEu%3jsD)4YG+4C(s9WcFrUOBN~kkn+gZoZY?E)sD+FRIz$F zi3+8N>VW^eL%DysfGcqDe#!O#S)ZPVRE%&z=m8AKZ3Ql{3k}+8gwJvbFPoPV#&`Nq z=~-Q{@h|BaCH_*?cVK!IUq?4}8dV8!O|KLST&3!FO-p1~KT0e+wx}p+LXdiFacRV& zl}^1PVSLe5Mxq0gEzxXWTY08wl^6bDl<;ExB%c743KHHXC}^2(S_a8I6uXQ3!nlcL zHk|-KXL+NFKL2duc#6kZ2!vHB(=bnJoH%qu?^2ma^VNY+v^v_X;q6@LVYzrYcn8B& zMF-6tW9FOP!-re8{m{MPJ?p=sb!!O4lU`je!Zd4#gY5Wmu-H7d^{4IF#g^SuRq|&n z?G_zQ{8o__+$QzA=mOiA_U;xsniS#+Eb|(`7Rp=DP9XhTxJdT2opz<)rLu+o8l|Ht zs6F2W9Y*L@VekNnke-Hx)1SXq&B(o=8vRVMU7^!?^pdVGm$b23>Bt`30s$W!pQygQ z8>5Jkja`Dl)48pE={UVsy0Uwy$yR$e;mRWXk)y6?kGX5r`1WTwHBVj2cE1B z^l$D9nKVXI30cg6^O5mQ9H#X+-{Rll#td!N$4e5aWfXdx>l6@16TObc1Ov!x?&9in zo=`!n$9%y?z-fnoSn^yF0u^Y_)lj1q4?sEYZ)dNpDDLbQ&srg%8DK=iN@@WC$=fv{ zyWRQPs{2#qAgW)cM}_GjbkWl6p4bdW%{`n+v8=A3M?Cbd0l!n$6AT7w;0X@#uU@Ma zGI%4*RG8=RsHZh=-d`Q5q22Mj0ceA-j>NdiU(7pjN5e8y7j*ODEbP1j_(#d3hN%ya2Rh#zogiSZcQaC;u|tJ+S3t-;WrRQ%iM^B2clIL4wFCR*1_J-WY9joNB40g(x+Z)?(_G_>!v!q9w`6`F$tQp4UW$^ znuc!f;9ALFUM;gOrM}Z5w@n}z zRiTvLdEENRveQaE;cZoZf}bOvwC9v*Z_Ox!XaRckp?J&;p(-2d^Vn{Y{Em81x&-;$ zI+frq72|Xcz%vHz1E+vs@jUd_m{sa%oo7i~GIf-)<{WQMpWm#LP`P`206Jr|L4@j~ zPem>66gJ1UF*OoYdbG1uT>JL^kQMs4Ah!jo&VY7BJv9Gkorfplar8X@x*R=NYDPzK za#y2#!pM1rl)L2G%j#{>!AVaAOjrgSDcjWiku*MZ(>vd2xWW@ zorOAeclKM3IhTOU#H|F)%Fp0L$J)keV;|J{==tRZ@_V7`eH5(w7IH^{&#Z%0C&>g2 z*E5ucb?AAO>K_f%(vx{2*zFZIwZQZ>Ygbq)4E_T8^!oH{xoaL^5FXMm6DJx*Z>9aR zRnlNpwq0o{zphYDJycuC9_M3`m$oOV=D9I1uWv}?^QmsF`$&pGfy!5R#eNyx6> zhZg1FoMC`@Qt9Gx`I#Xr8cCD+hTW3f%B5oglvzR0u7tcElAph-W;(HG$*osDeC{a; zAL@(et(Hp8&1{>%Ck}6oK-dz@kescfocR5{+h|#|Eqj3gA$QE_JfwN4Pu8%{aP-G_ zC>~2dUv>di>6j19$%Z%H++o5#zAuVMUVckl@bTK9V7>;t0c|GU+2H9 z`*Kw7POdY#5vGN)-zz^ZFPo!r#ngW@HfPR)`kC&$0ZickJ~UIfE8jLxH6w4ICF_B} z1AI%gsHW{Ocq$d(H8;>R@O@Ox{=a}BasQt-=>J{dW&4l+Hf{1d2k<|^N6EiAf#CrZ z3dz8pV)0Fq3^|s2PlcDD*0Z%gG$klJ_}?G7I!=zp{$&2pW&;x@2@&-$?;d+wjX|-+>H!%=|o1 z`eVPNYrB*ur+j^WNv3D0?GA(}Bj1xEOf1|e-7#*4oy$zXl3zUNCZM*HT;I*7;5ijh z7}GiyVfo$_bGW7-2q3>L5V49*t`^z)3F`dy(RWrNiY=C7ZPPX(i_L|Mol6gJLc$M( zOWuhBv7yPwR!U)}WL9PCC=)s|a;htv#r6=5;rsaGHUGo{@SHHYeL;MV7u8$4)Wh}**bZ)=oWs zLSzClttz(bEjZj}Ro`8#kh=k$cW)+0Xc_6fd&LUEecyhWvcC|i3fwJr?*IjVB*wK7 zeC*DCSG{<(e2LN(#Ye7R(qftw!yw6nxmM*CN#JeI3Rk4{5aYenS#sqw>jt8j!&}+C zTBJZTK1o^sSMfnM%N$O5g-hd#v(!1!j3?yp(fLd`Orif)5o9#!)(aM=*iiO1dkNa+ z{Q-1Mn zu@z1b>*hQk8KF@-w3t*SoP_fYx^&SSrr3Rwa;b&V(<^>ndj$cDerA;HlbrSN>%kSZ z8_je02=r%Tv1~7ae@}Pb)2aVL#$;##yt0qB9mZs!F^x<+1i|JEbD81_9jGD<3%|DO zH5c*#fn%Z-`F zmRm9C^i2s|f$1uD+TqAXS&5b@3_Crp5u;!tu(WmuAk|Ot6`u0}I-|4p2u`7rHV(9b z+p0-Kzq65FbyZz)%97V=%U90kv4>7f^qBR_^_eB7e>~U3gj_g6i5GlG+^BV*g_Xg^ z%c~-`DY{&X3%+(&KS7Q2t|fsOn4wlyu_ewW&ly!Io#iAVaIS>GPNm_dIQ#?rs7gA_RTyI`^i z$qm3eXdyk(?0z7(Nbz-dB94dSaWx8yYzle~H~jLwCrQRGa^PtA4wY{=cTfR)@c6?F zCdII*>b^eB**Y!xE-6pxnbQB!F5l;4=0L0kDC57}QJRkaXDFzc}#x=lo)O5Jm!1{EX?tQT#SwtR=mAjtH(*7U9o#@!Tfw>&A-G$_xXtY!ds85d#@}c z+)+FM#bwKnPM^&-U>f`9TR&U=y723u(*t~0J)}l5zdkT>^CKVd9>(7y_k5p(;c-HYvb;nM%^7h3mqW!+68hPVZ&cXLz1l>@A+|O70zR#_b3vx*oF8cK266 zf`Z#GboIIEif?`u(ly>zJ&Wg)qkAY+*L<(FQW-R7pu29nV{Mn3R@$U~Oo8^5qmP*u z!YhV)qucLyYfTe~_{8W-uIWDs77^Q`df5WqMc zcKkv^cNnnT^UfN^sw-o?e=h%l6G!%oX4s9rzl|=NNJEjzwkIVGbH5S)p%&+!Sb;)& zE}Undpl+Rf>C-9q0^M`iX74%n%D0j%qTCFa=aU(6`oWy3)zH1Vpg=cflDg{_i*ZE& zYwxb(plqZ%WtkJ^!4lVREJF?kDR6 ztD}0AFlkWvKoCjDDIN}^TTZOKGrka4OIHXEf%ao6je}2&3@2%*$zVspmzLy_ zJR4;=YrXNl1%cRok9YKwMK5%L@e2vy?50H8R2nO6Y@v&RCfv)Bw&dkJf9DK}vS`+q z40p?Tz=Y-q6XY?{=cU2?*iC?&#S{SGimYb7%d-@I9h9k;3M^~RcEKB??2lX4r_^om+iYnu80KM2A(?cInjfr-XI!t-+=FNid7OXBWT@Rq!SR> z=P8!+s_g&>gEyt66?$#Xa(2r~cqt}e{WNd&pAy@JxBe3-{5u>j3Y73v=A;51YL;Wb zY$`&dd|-8b!BD~^Lx6A%=61{8(7mw}md9sk*qehTTpYp4bj{?uK_Se=TG>C^wv5uW zs&D{R)Us8ksfkCxUMlIexv8e*V%>IOuCA=jzby%1uy56{BgfmI0_WlHcsPJVbM8=W zk_{V96!reNDpRclEX-30So;kW6&8CEu1IE=M4LNiQ@P?FXxW8(Ri%J%8sR*EcP!kr zs$)e_gdiL1RiLuq_5%tWvPRa2ykyW)(=L6r^ul4NKX`8@WIfk1?!j8@R<0>`h zM)3py$_j!j#ZG0blPGR zRF~gat?aX-`RsIlF?-2Wj%+J6ys7;TDB=FZ9)&rPX02ey{1Xw$`w3gVX7~HOXyJ@G zpnm$8;|XYbg4eRwmV+68Mv|8oxZ=%GJ9Qc`V;cPhKbX9Ei`NZgl>3@j_0$RUsv^9NOSoL7PNmFqmy~;fyIGql0)r*l>m~z+6*hXn?M^wNL3Al zXdGL$?>iD`&aa@hI*uxP5TnFSPToV0uU047L9>N&wTC%0Z)aDYs1@y6CnXXhz^h2S zgk*071q8`M$a!#ucS8p5HrK8Z1K9|@kM{7!>v!XzNNS*7aG+ctZg`q6T;ZnCI+|;m zKAR?|+f_s?-a7{>hae%86qsbTH%Qd*SJfBfLx;fz6adqw`;`6W7?fO$&YVNgTw9Dr zXW81Ap9-Cm1b+p8$s1G^Ls5cIRy0AeduFE65-P&?a8d_4qw_8l4SFS6wN>Zn%R0__ z**Zc7fAPXj&`j&va=UAOt*QEvw|pLc)9dtm41uzaQ^}8o7w1SSsanAxul#pf%4EvO zoJ-c!Y5+;wJ8bgqj~(qkE4Q&=bZGX21ATIf`dB4r^cO6 zQ>&B&x*)N&v$$dZWZLFvct9=+ z**V~lcH0Ww2-Gom1b~@!mpx&tuzI3G!s={YqRfrebpLx4xo}PDy=#=LzIWbN#nJx? za-vatkG%`A`e$~xng|G9FNb~Jj9aPFaxgRrZi_{v$&k~{t&zA2_39CF%O7~*YYqC) z(sljOYrPSX)t^4eG)}-&fS;G{EbKNyUSu<1!^YHelZZ^29HdlRLDXrGy5wu7;a>J@ z%!<46dm{Y5$22+282OV|b8s?Bn&w`8=dm$L)k&v|@u$gjT6l4Td&2HzH?d}-tu)r_ zxjDYgFe17Racp?p4{w{e&y}W0_!|IWKp`P;EWABps(km{{74vF0NMux;;un(d*FU< zWB1aOZMJccylarTHegX+P7)2&)Qh2enB2A{WEj!M7@AP_YFM<;x5fUZTpQOLI@iE|1U}z{TmWyD0}Q*N*O(j`92zEn{ia< zr9RFN^*m(jx`J?p^^bR)EhF(KEsjeKlpqS7sZX!t7<-dvCex?0i`TP@_GH{tVe-2$ zUQKJ075kX;*ZLk;1m{t!#Hp_uh}7@ax7+sQUOm$Tf<65lqUVBhbe4!;O@OqJKd9A? zF7`NVx12{8!s;m0=3^T0b#*n(74GDU{Eri}b-ws5qFbyF)<~h^gNJ2VhQn>P%@t-Z zJ1;NjBePu%1PFa2j^4uL!0JO6?`z;Z;Q|H;?Q@#Dcu=N|?76|N)l(*bl|as=$NTh5 zAJ8!m!Pc)|Xmm$+L`P@MCID$obZTYY^I;;dA*ff{yuhc4>XvTj6438khQpE&{}Qh7 zAnvkj%{)Aip10pPq?eB$T4j9*Sexf08y6`^h zdF23WFeHJu$036)UnH|Vt7uW(hgZMP5s9Kt!Dtxd%9SkZs>=RuSooDdFgSxTM}Q{y zEOvO>!!wW%F+W58EQR|enc-RF3NJt;z(1qDXHZag?ndsQEr;n(2vuB)ecX!n4p!{} z2bIw?VjnMaOL*WK3g8lUeUcipRz^c&h{P7;vR&f_DD}HqXPDaJgkY3sn^@M2)BZ_V z;C9zrSF;L^xg`?fr}<@wB45_zT}^ng`gBXz_`Eu()0Oi3_p$dFmP;r%Z^i|s0MRAo zUiJy4zyA!21l@K=)p-yU-3Qgms$Cb68w*T%bOV%@ryXfPmpuL*y}rT9dkP z7^-k2d+wn1H#XHhfR=3W^Slo9CLh!9`3(nFknn(QO~7PyMn#wMuyHzR;zD0K<8UqK zS3HX{F569Qqx&Edr0=NSyZ!IRzwMR~QKczlSVBGOx=K7tBZD8<%>2}}sEcpSy0DANP4M6;S(*wKNL`SE?8S>{ ztF(f0zcAnLOfnsys zL>R}Gin4mT`wX8nTboBz4Fpth4;3$nY^Y}nJ^&jGEnZ`~HUXlG1&0BNMPw)ESV%=V z8AN2;v~&x-9B;F?XJt82W5TDTUgWymLfM2#4jEzt8YM96^u zk_kVSZOq9)>^U4mz|5m->k3K@71}DGtS@>?`k=b4?`}S*d>p=ne$gl`l((_tRLU{u z7vNUzMAYPdy1UEA8$Zg3it%`oZI0?r@UH^t$cSdmFVTTsJ@6gJ>C&@1o#J)j_)pX%?z`c}aH8CP&f%Z}J* z$53)Zg(^djw!rc#y^p$O@W|#(h#U=mkpK#;)q_5x3}WNVF{-?mgj_P8LYm=_1*M?{?;2w&~8-g*2@%p&5>XqyIwX1A5LY2Bz$5n=(Jg%VU3N)i-q(6wDM=o&$dN`M5 zk`3kaS)J@N-u=MOAXzip#No6QFBLg&fT>Mr-wn)1^<9Qdk}ZBBygB zmyX-OJL8&}QfOEVdMQ?~g4>QEGDoT5{qFipa5!S@360-YpVqkv>zu!;z4ArxDm@ud zAh)hhhA2?+=k&up81_TtX82QFIstoUSIdKB@^ZR&bp}_xze)C2u^6X|m-IJ(L;WV4 z{Xvi8ce+&Nppym0`IYll@-yoTIWHsb(lO~~9NEJJi4fh@1p}cm9-DIQ!E#^_vKmMa z*>$-@R~eN`;dFI2Ai#NI9v5oln2D`95SbmG4m!J+b3csn8FIo~?@B~g&j#RmmpOsg zJLPd3OJeO9_q8X!^6vGCj>oihV|(zdTA}VGrRKZ?`9} zv~mf{J0~!p|9XehMe`uK_=nd^fp5sK%zcr4-|pS+LH8t|0AB#??U%#%`_(}~Ovn%^)TaH&cCGbm)^Bk0 z+j+w3=aclRWVub*pbWBfy_=XyH@aVD*oTc4oPgJt10SC6?ZNS3GT82A2wD}>Z;&R~ zp3!EoK;UrX|0iGDe=dk_lmCtqEdN2WN@hv{mIJO$4om^|0WelulDHt6uH5aOzU|Jc zG!X&`Z>?wN(Dx+eXW=fr+q&R!4LDx%YEMVi3qWD$eNxUvw=<0%fQ}i4fio2tGH$aNgx|$(L36UR^L5MV&Z1T@uaIj>wQocaoR@is0Fw(F8>on= zlY&#0Gc{= zU!svLVEF_4@yUx4rfGQrZgJpSIRs z^Z3|YTzEI+)rsOx;%e{#)Fh2Sl^ZZ}QM-7IpTInnnO1lc0#cr#IeBw-Ir65!ba?S- zj92AiTA!2hRfrUvYa%InqfHAV`!`|c00wps#eKk%S*pmEHI&ti$0%bM-?%B;hJ|Rw|#UnLeTo!jtBiR5g35`65Wag?|J; z`^fNUjaMO6rk-=Id6+pMFvOm>raDMmrZ|=QkC;0iemnn)!qg9|Qr$^m+A-#&ZrmPV z2>vn6q$gJAJ?c0IbZCJerkX#qItLvFwAu)^P5}}myW-4~1HR8sw4$It?O)tZZ6y$u z_b^TmAa>zk83=J(lV|arWv*00N_K)qo?j6;=?|QN*}GA1+c?D>=sxg>I1&@RXit9j zZHJ$Iu%eaIoVpY{@of&u5`Hmeqw)ef$9&k+jI|%gO{jM9&aeb{01XtossdH@*(4oP zjCUL>NAyspJja4lR6}@a=j=c`uc8Dqr96oj#qKlC2(zpF9$UCb?GKq!u?8>bsXON|O)I50y}REz}w2ug4hfFZM*zU`-9N zSD55fh>twIV?z?<_?AO{m#jrhwFT+fC>fruJO4ExxyfJJA;KaCQ0>Mui<0Z1>;Q^S zqB6Gs)S52iOFDDhDD{i}*3g^O42r;FMlbYGc$Qnp>D7orT}p6lryd%pw@tG)wJ53; z(X3Jj+gpMC@EkmjE5+GDinm|$K3$;pv^3e@F~~~P0gfL zRkwC8u$4N?oZB;r9fJOy7-5h};sMxj@}Ho_F>GfXPYPo8lp&hm7)3Vsu)Jx~5IXv{ zPcU})Uf>78L;R4tTRYa_nb3eEXgU1oLPx>N2MW*ZJq1_ZM-5y#mE!Wmvkrb1oCyX} zanL>s)`X|pZ0QdVci3kx&6Y3HtMW$L6z`OIJiy+s40yxk5gxdF`pt-#*al!-9WL9- z4dwH}SV5=UP!g4(eY$;R1qHdG?%T;?{brjm^d?)#zAVxqb+Nc2?W+i{ z?9~_zKk%zIb}YLj7VBeMbaP468-jI&Da)qB;3YIwLc)f|+ErlX<6$02Uer{%soURI zvW$Fk{q=G9xm}qF#3RkRrK#B@o*}{FSNKz$ESYK5p-BDpDr!b--UsQY-ly-`yQK+M z^=IVfM4^@0{6SZlnGdW&sz_etF7V^QwzDxxL336XFd5pv85jTWbS0L?|5%jt`h!p= zyEOun10<~Pud})0JRB3GWFk=bE9S%YI`OV$oLrdl>zB#sRLOX|9agD{bB8-tEtu*l zNdBBpdPO5$)vQvcde@|IeS1ExPgj5RN?ajht<^+p#8=RD71hO+yYp3=Wroe)mxM3H zqI9FV)9#g#!^WV!n*Zgokyi0HHi??dN@!A|#iZ}Gl;qP! zdm}nwe{B4y5#{UP>waC{Xew1+xCg%%p!(wg20}Gvlq=teqG6K!>~afaJI^!U!+aN->tX@B;Qw z4!CV6mwk3d%e8p?TQ_9GEucAnbn$u2WFYq~k`f%J<%_9auOy_E)xTn_cL#ZQHi(Iz2OSBknyBcVbS&`44-)xiWL* zv#JimcNo)t!Q?vzPqa)#T`c+Z>0<0Ip$Tsi2U{#Y4V`~IZA`S(@qFseH0Z|tv71n~ zHKAyNKCrPcJ(xhkzWp7j8G&5bXN^YbgS0&O;;s0lrE;Sn=}XbWFv=^QzS8cUIUxlQ zl^pma%od4LfD}&bTXKDT7dR#Y-CEi2_BehSc_`L^3;%T+$`dVQ<=dBcitamE#25Bp zbL8NkgjAzgvDdjB!5s7Cd{EYE!m$5HQX-SCP6KsQGt1c7h<^NKROD#NWWM=sR4$Iw zxglt#f()GgWGf;B=iKPD0t#xWQ)nVTg;!gs(&PHTUk zOOa|YU|Qh@c&_C*VY`wzxnvqQnexy(c0T80*|di@N{olSLLl&^A)*YhHsAxo4_(^1 zH*Wf*Xm}?e4|n%K6_11bR$G4k{6*c}jw7-Qi_7QFHomy zlsB!e@dI054v3ZraxqOkadh66S|HEV2o4q z@P)L{>6nSgI*lAK9I@f9t9t_6K0r7Bv0jl)E$=~9ejq--RH++8@oC&{eZ%!@ejp3z z^Z3`}U;kEG0+1Y2Ob?YkHu_yTH$B4m8n}B49{`?gYy(rx~O}RNV;AD<~hpWdQ+68Fv;jy9f!-a^N=D!AIr+e9EX%O;c{(B=8s>Aand_Ed%e*%f;x`nAvHAt9P z9;&jG=57jyatg=?X7vM!Z$)wC~(EsURwkt_Y{N`5q(W=ME3%@#6syD4O-5G96~-h=0s`+8sdck~ro=OnF#*%~3Eke$Lw)mp)%IR+{Fbej*d=3DOh(Di-i@GR(-<*N|Oe#se@Awx&0V(4hK zx%FC=>rx(2^n63YZ58G)?46TY%3o20k7|ABaMt@yd$>!ak=ssc(NqTF(D1A#%lKTl z@d_2_eOiPAj|!0eME`98GHKPJR~F&!su(c=#!I?YT$o*$U|1*TkSSSH)s-<$9hI^_ zG+PY|Q5HASUtq=0Jd8LM$B!^=AGUZNsJJy=Df55>50I>?2~~L(&Yu=2ppEF}0la<8 z)6PbU{!t_~O(os&sI)iR3@j3~@xaR>2B2jp3u`Ya+bc}CYd;tz%CNauVk zu0{$?O;!j@mh@O4dN+4`{jT$M^PI*s1I*_z<<7~DxOJvw)ufF9cABe;jwaG58ybQ>ex4g&?!K88VG z?vC>FPq;5>*0+^mFSu(dB-w2Ac^L7NS7ynwoCCJa6+?D5(XZkK@M!_BNG#b1hpc(d zrO@W$6Ys6mLV}~a_k9P_x~^LkBLZEg5H1S-{NEzyRy@x+i_em~F1Fuz6ZqqkP*=wv z3YOrd^B|VEb|v#V&hdVTB~d6iNRn3kImv(2hA0S&IO)elbL>2-R07qHV8a+JRg6vE zKmYW3re0e;J@6Ok+%dlS(ZR8+fN0j>}u+GwU zQQXpS_;|L?Rrbr^#}r?hj|O$1=U2{MH)p%j<%YUP$>1-%7hHqh8-=77`)z&t*UyUR zz#n!7S#&wb&pG%LP%X3rMi1yWe+8{BXk^L-m<^lR?VLw0tb~ zH3w#_sicx2)@3hba;W|3WH9^CEwC9FHA(UjlSEhJarc^K8DxdAU)&|$fF1omLO5o_QUcP^By}-P zMaa|GhiD;^JlYW#_(xG}t5U?`D9H}K-}(MI9VziQ#?1VQp-ATrxx&JB+UDz1Q;olT zp6%S84`ca40?|9KK6EVQ0srB@x z8hHTZ=bf3gnt%7t4&&D91h!j!18aj6kw7@aB0QYNGmKvcbT+ei*pkXf?32P* z9rYUf#__@H82D+2iS7r)Z!hXH$_Ht4PcGd@oOcQ0ps>J3iR?&B#wy!s2Ti0Xn~lFl z-Nt{h-Pnl>b**3Bj zCnP9s`KHmtGYbo=VBXD2kLmoojC?4pr1tdNJ8{&cf~;2NjCmC9+B0Iv2|55i zQ7ZOKUDNw$-jV4@(mG|cZtCXkTW0!}W97<*jMiCsMSBCO5*Nt42eV2gfzD!x(@`jH zpo&4vI|WoQtypg}HQmEN0Z65LUI~HGF1gZ0_p2)Rmf>b*z0(3R8jTFH{hd(e&w^QM zGQ%&gmqn=ZD9ZG>xg-Bm)-huuw-~@52Hitqg3*kjld#68go{}-UGAP$8;u0&37kJc z1TUI}Q6TqD$7y6yG;T1?xH-MPQY6vgzeCLurb`C0Z8=6pcf}~7K7W}wB&@9Ts*

q_dPrM^Le6NDradqpO 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

N%{mI^?z457RYVGC~fjZEt9N?pXq%{5&8m` za

*-5s8C_Pk}K=p?@(*^urGfb`rbsm4ZB$_IDuM|lB#l2}{k*d$T~$!)cZzp^>O z0y)OBWm<~%!XN|yCEA)O-C1E4b*Pi#15es4nA6mv7Qa2R3S=_Rr z&urSQNt<6^Gi$(+_8M1>YxVs|p8pKt;$bJwA0D+;{eqQSR$KTSww+PC`3d2uM=&Gr zDs%X?#8g#?vR62imR3?^yYM${O_CYkbHz6m(@;Z}t5abX;P0646I1cOAqHcaqYaBX z&zZ_vGk1@K+!e_?tMu_FrQ(bs%E-=Xg9P_u7V!4~F`dyaO;6G%ycd@rCGb(Yo(;1F zBCzhM`}Q|zlTG6*&k@n|bNf?ZZJ|`1AC)w|jASfHGdzwPv3z&6$g49V9@d_(Qv`?d zO5Q3ppb1KINPdoWy@<$pC|$e_s}B3DSh3%2Tu9cdkrV67c7Tjyo^7s26sIU*E~m4>F-bbEbK?!}%gKJ<#Pf!-EaKllRsgD;rgbFl`A zB5xC6u?I_~=rc?+axse5oWmd&TN4w0;py%qya0XWDi`v~*uZj%9MX$QG|ONL69+&I z4BCb)RZ#msDd)o_cP{M0#RRM_hRE`_ro^|f|><>NSx$sJTvGXW6+ za+ZtoB+5N+n`=;Lk(ka}Nd!m5%KE{b)XaL&!DpfZ_b!%*cuw0Zk~1^il?o^qT?}+C zU4ZHkbG3@j5554kG-N(~Kq*eFJw9Y1iuJceK>5(4xR;Fn(2K*v552?-ejVGh69y3z zu#2$;5QuQ5o7N?I1=1Ae+0JmlG6~?@s7_!w*p5$3?l0q;I@8pv`#p<=1oFpzER$4l zhu+S2oq)ng-S0q|haDPs*#3uJuId0F=y~>8@?MpGO$ZhL4hl+b?=)wZFD@QO+3(Z_ z|6wFade+nNAZJ$g@t4&9At*DBMT?Ta6#StV#2_n z0rk9T$*3oB$m*{MKpZEQtUbfohlQ#Gi zZlCd9e7(ioLAxuW?6V?h|CUIKYwa9i>t<))L2uwTZ~fBlXy+Nqj>R0HH1xhlR=TaW z>z#Gu|9EtnsnS44*fW-N1qF1qU2!EH9i*-Q#eaE=59-GM{x(_b>GmV>3=>lO78zuN z4{CIwE9wx(2g5q7+M9;@P)7(5j6@}v<2f}zhBiaW>BMh#xpYc*oQGLEH2qtZ>@j`e z;i>h{m?05xRbvM+`c0ST?d>OKUwm;Kx)}le*BkR;Ozd(F8{a0@c$Qf5&sc! z{p=-CVQOeOWpJSSKG*2ah3=$jpds(Yr|}hLG^S9cfYQliN9%Uih3}GV6U8uTVWJO* zt;OteVKPZYX&QSom$82_dp+MpuXCL$7Hd zYm^8Z^SBf0-kok@X3n$32S*#9@(R?b>V=Mh-J{%v_WH#@tkn$YvDrLpEl-xdCzj4s z3Ni+Z}y5Okn63S&N_5aAuS{0C&;1>?e@^bj|1w9+p1 zv)kqO3K}11A~1CgVIJq?SUPKZcAD(uAzgXi10pyxB0CCCtrr(OMuxHr$Ku$21P`%p zR_eQ_%h4CoU4ZM?o1@wN(&U=}+c%_cc4J<~cG}P_HMvBahyvXsdhcqp91ok$Rv=+<7h~HH_cs!oLe3X$|~( zYcsR(3^?P+aVSD$2E%NGx-dIoRdWqvAz;&G=5wkO^X~9c^tuKvjrbYfBO{% zA>@OWFO6iliQ}{F z24olyH9*#c>l19lBA2wuSm}ZJx<{R4d=+tzO#o@K3zcV76!(( z%M=c&Y-U{x0-hc7vD|P&ysUR<+Bjo(JUe}$O@xJ~N&DYM#y5-4xWv>nU}@LQC>kZE z1lfm8w>UQ1o7bvt6-i1e6zfzqQ#Z_EC|NEh4WyAG$ceQYvJt-#iq;2~Za+n3q}S$9 z+5s`UV>*G*Nu+VTc{%$YbuHfiO3vORwvOgol4K^IjYTe*YjR6Hu62dm{#2?Di7Re4O z2jsm|G^u*DaeylbBnP)DF`fBGq1%*9QURu2C?f}Aq>xcr?yv8ehK|IUIJ3&tkuw5L z*a{76N-a#$-B!uNAG!tB3@gy@Wk@L<3NN-6cXfNzpU0q~$!)^v6UKr#V?1Di^>l*r zJzOiF8Pv}Se+hW6H#{UYihHjiYR)u`+G~7AE`HCc>j{I#+xs+y$kOG`M<)Jq_ynXQ z8As!h+zNT1Lb){L$FhS@2eUDHrJL1P_SzQjLscVIJMd(&@pR@C<^CSWcUpQa8lway z4@WS{NfoT$MF3y#ey!&IWF1aX<4`nSci}l)gp$!AhNgG1Xuw15h)z?j9`DFiL6s+h zzt24gek-6|*bBzbdu(zj*QMEx!~v)%Zgi0>a_eUwaxy9-6`RxTtudghAM% zxpi%0rt7QvupufPb|T;pk=r^exkw_xg^bC`uy6Ceq6h~U8qZkYM*hu*OaKh#hqc?{ zq`DCCps-yLIE2cGX8EhbhW#^5(k+g(mH9?#>F}#u&=?cLF?twO zfSs31;dQX^jaQM$d*Fu-odOpS2J0@DZ7#MuBa?Xlh{ritz$qg3Ev zGDk#9JAHwiQpdH=__JPzlb*0-w_PRfSYdV0lrBYqC?0(XI=e*=mqGZ6X?UoW)Ixq zjfSIN{P9(x^99`jf7a5qjz8X)Ti-A%FY<&)k+%kk8)=O60PYY*i2+5|-zuP;c}XR5 zuc^QOXp688eMLQc&zq%3bNeRPnn$+m%p4EBf6nb#^(pe=`HuDA$?a)fZq%I+`vw-G z3fF};u{Cybb~G`tflj%|1cPcR$OeT&{T~|x5I2Bg0JHqB|7nU*1E>@r73uG&SvOM_ z4qMTngAd6K)h({649b2(+C=qyd3KDj<((#Z`8LFI3%FF&PrZQrH7P_8YWz92B9cddW?`1ZSGruB(={ciHYf(RnPkew_{tO%K z>x15K7ChX9CzXBOzaE?3Mld%{y=-3-4E#Axjpl8Uy$T>-`fw^kzWQ^V`9CNIb#`oZ) zZ7VaGX1@yiUWAZOqwv%WS?VNqZtOLueuD0mE3bgZaN@97+FE)iVKjZQjo*;YdIWZ0 z#eUY@S>K1l4yS!WVXI643#e3=MRb|(L2JoQ7Lo*2+x?EwfDq)jW)uYb7|&P zhbn%-I|qz7v}o+aQQE)NowyRDkus0V&!&@?kl!j*a%6w{$37EO*Zf8!5&^fA7bryN z=;L58QKDy~`MbQ>m-|7D*={052I*6qBJPinZ5+)q^_%KL!aNbCKy$0>M~u{s&((uX1Ai%5tkX?|n^V zo$#bQz>$MZdt(d9sf1^sdrs`5nNLM z*{j?uYfYHX!v-Hw(KnfwjTwKaTw)C$a)=wJw$sBT3jN(RIAhtnvoY znlSq{)moF%Ih-__2QRG~dE|AdD47o_??UOMaJwoS+av*1;$R@sm|OU<8_=0@+LDmR4G|_8j`GemSAs2(z%Y}63te+Yk?YD$(Ju@#7olS zDkK8sdEsWNvp}B;5hC=7bD}+!U6#Ll0V^ZIuzVI)LIG$vepZVCGm? z7a*wn_WhQ5@z^pnv(9q(B=v2C5^BBO%KK9@FWz%Oj;g7?b+Tn=v!Mo|enN7#2m}DjY(s2>n?nr~M3o z2zO-yljctM*4V@gS2E#@%51uG0EBA~+T-E0M&0s*iuoEbefSb>VaDl>U+})|rONvui>3^z|U; zsV*e{c6rIMqhz`1H;VBU!lr8ZIDZeii`SldJpR=F+eo6bJeL;|~A- zrMYBGxt;(O`caJjIQ|2k^@vC@$w8TF6xGu)1QzYv^@sMM>}4?1rAv3lcf1?ZElSvInZ% z4K~;4@c&PFTLWInj4!Ebzvh!O+z}=0Qus4bhrHYAD6Fj51qsiiHHy5 zFG4A%8WYZ=g>2(`UrKcMfiUbg`n}no^<_!AX0-5k(g26-Xj^_oD`0}{KQ~m+RScF^ zrfpGwdtLnGs#Z^Y#_ik|JiT;mFv+^dD}ltu3dBk(&;EfUzH|v^iV#^5x|5vW26-)1 z6BLr810cY7wTkk)8OCI$ug2@nSA)}j@lI&PEp!EPyeJ9?9g{JdyR7=9efssCSiY9j zr>FcY@AAQD(oz3a^$RAP;B20W`ch#zo41&qSCL5V+XO`&L%2B^y5<7+LG3W=?73-HO8r6aqB;No8pXkK1MIYQf*QoqFv zG$fGrixAZ#o5_h-2`DRyg5FI5!K9XPp`Hkv5#~aB><1~IhKg>3`b;LKCc^i8&BRAQ z_1pG=Tgzs=xGc{Ot4O)7JhRU@fHB!uhO?e#@%HWI0!kkz)Q}c@_exjb-w6}zbyLhi z0O+EByh%~rMEzF?@xkRMX9IA$xO{wy!ejQa;mt)JMN^Bo2Yz-{rHH~O=7{yuQG)Tg zuL_dkIOvYWQY=Rk3ChH2EcRscbM-`j=1O@`g85>dWMlg6*R^PWIIkS0d1qO zMe#FV%t7gx&&Hl6Rr^S#9nttLf-jjP=}$XCBN{I5D?z;zZdx|Iqj_b57LMu>j)Ba4 zr-axqsx!j(yP{QEQ55*b33}w77cb#*`mHY&_%Y=ptYwF@;o14e`OB_unWoG%W0R+| z-7wsJU3TNQcIm5h?+ZO{=1!4MfKv-Cn7HrR2ik6q47ns?G5wKeSa3CP>p7R=Aam4! zbjU~Ba_K+vHF#w`6tA&dnP11vhBj`kgK$}< z1M-WA2!-7v`O&5YQ~~p&O+$Oee!Kh|BmQFm+e~NFY>>@aheZAY^;1GO_F!X3JxFG7Y(0zxIh`9i+?U!d&w8TMb-z z2`r#1T?2GvYpI?YsgqQ2V$RdTOVt|3D zE2Z@Z)TT26E}0|hx%ZDl?GX0LbWY95~WlIr&AO z3;d^Uf>w$kh%m9~O;FAeBEggE&bel$O%-C7;ZwVTL1$*;RqZydXW<0eDDsBazzLBW z63Z39->OF|(;Y(8D>s^ZwcHiPlWIa=Pnjn2KsQ7o=RN%1 zBgyZz*PcUy61F(t|JL=kInaHu|DjHYAq8#))Dz%`DjIX-lb!c^VK8h)u-&QE{kkhm zY04A{iZqdYo;J>T|Dlf#ktr!Zk-U20MxnJ?MyfSMaz$EE)!r(VZk)7m=A(&9Z8J6| zb64Lg!7iCp7+ro8z#W-o$!5a#{d_kcf*J0R%LzMd2k1_tY;uX-lN?CMw0S>{u$0?h5$#B7;tv6YVF2~HbBeI zJY4N(tX{(qwK+Xr70-|O)vqd4e}OVE9K8{hSyZYxl|m=Y&YztIUq^vM^NG@lmDoBg?ZGRad8IW#Igel+Ot$v<5duAl6&r>|Vn zE3s0qpNb7T=h`gQ3CQR(2}qShv;yq5(s>#=_w-GMBHfWoi7I_5=ua;OFd9 zY20<@6Z}<)(q?1t%GVnM>LP(9Ax$Mm?qmFudc=$ zMi6PIgHrC5Z}oz0f~&Gk>c>C4(2w8qgMoC5M5Sl@}g_Ja?l; zw`dEf&xKL<3r)ROU+&q^>G{dh=%_xYt*O~UW)J-%yFwIjHb+(NZ>M_=Pl%|Ja<#u7 zfy%sWg-6S92GP6XCe;+xn^}jhtbzJGv8+pS<`WJPys+JnGt#w0{<~}A2tdri!oY9w zIfsMS-Rj=3PO&~XLv2Aj7NX0x2yBG2d^X^#r{;=BntM1LL`wicBLeuf0zewn|0Pl( z!2yd0t~9MfVS&nv!^JVsTTayLgU|h5J{WXEH$BlE1d-5efS>vhR1vFcdwNMTM#mZU z3k+YyrrBDhsQ85xVr|e?n@1M*NHYycf(D$&jKb5I!4b=-B=npDN(x5{ND`>NqTClL z?(}c2kB#ykQ0)lc?E&D|a336%j0~&1;3E>iC@kjJAxE;n&Zt%7q(eP63|wbp7@_|a z5%VT!*uEr1&7_9kigMQmbQ z`7kh*s46bRJF|}=@QyXq%9-{~`uk#BJ=&AJS07ea!BbkEMGeGsa$?vsR#oTyv!2TM z&1sq=8*RS%p{iv*={R5SjbeIs+bM*bKa+l!2p|3JSZ(3C4E^o%x~ThPlND>Ze@}@- zvTeh0Y_=?>_8&w@!=TkwYfgu76 z`@_@KqjE>*p^zaGvCO&~s-Ylz4I3n}(*@VzUVF2Ns2=ZZdsL(I6Ouz9S;scbt%_Vt zj84zIex(NPj0NdhD&o~~Em$JJB1c^qBuFiW+OUAphlMh2$X|=*@!t*9o{RGTNSy># zT)00p}Pn*o zB&aHJpoEgkSSv;+`OIepkytW=mm&e@LeN1HrYBs5$<3_Z zT`iw0oBT#DT2tjhj~+D(aof~iG8+gB;o*I*DpfU_W<4x3^y&pP;p_)P>I=PohvBhI zX@&cCXG$5p=@ulc4!ng1u8&1Yi zJA~ss_uc97*gU}(4gy2QcZ#mOF}F~nH}mDGR#a75Sg1<-lUN*jCeia`d(2w%$9-^)jxS9JL26@sr z1Uld(Hd{(YW5K}bf)B|RXd4^WqA#~ohA}sjZof_Ulvct+lVpN1R>-r zobM6IBHpSYh!CQPlgHZcVkA~&#pXv@m zFwD%aSL-@a7}p-4sP#_$wF}=uh92Dv4gU@2{yPoQJt|-MTM~1~z+N2fj%h}9Mxvn; zbc6PQNBvc@VdC0+TJ%R05skHjQ)i}9ZXPv!nYfdTWyRsT{l~jWJq8bE?f;Ss%`WIO z#P9#Zhv@%bxAlM6FS7n0?dkuvUko|<8Ow5}_?v=K12oV7(~N#!^$3mfsX!3N6pHYI zTnPUu5e~7{G_o6*feWOaZD!MS6m8S_ddDMZCew7Nbe2#o%ztU+-r9F_V{T4HZ|)}O z%8u^#Iaj0+`YZ2a)m#fTJo@NObHijv-(*_$*!OhuGQEnh-3|AL+Xtb|AI5nh+u3(| z`7o6c@SgAyJ3UO)yzeo^K;eKlZPd4&DB73MUO7QX6FGjK<4b@dWNkKiu9_yrMq(WV z`cEP-r@`oCMnKN8S$S#%-ejeFN_3TLi*O#98%&DmPT1$GTKCrSqP5#hUUwUxbY59n z_l8<}FewlATftm4z7~Ir=B-k48=Ojzs~{O2ph)qPBHNx~ErsDR3h8)sbNFiQbFdpi zSIv&2TgX!Ojn1v{0m=dk5Xop9;=NH2=*fJ|h#2_|fOkUX4eZz#15*_1s|FK|x*Ux2 zW%pWv{pjn+?OYH;uCs+380q^B~J?gj&)ARD?+rXFo8%IE_6KMFEvFF$@qX)`qq+sW! zw+HlA2^ySz&t!uhTC!v7bx@Cb#1)V#Pt=6~=USQrg3gn`ZgZc#6t}nBi5b5mL}@GZ zcK89PsAn0AoSn3Oa1cS&tgo^1K_|XIq0x-x`v|W>MF#*?+oJx-SzKy5^p6G4et6tS zkJ%zXOKer;X|d!F$nz%2{mC%z#25D{$GoZu1kTHlDRl%F=S!msbh(Valm`@J$2=CO zNhuA8{(ef;sh;c~lPM9)M!^o$7AAHJ8*Vg}kk{%Xjw-cdW!WVztKawb(LLO3x82^P$)g9gN=u&pf+u7Fvoy zj8Kc{njeQGdxe3-;8DZo)d(2(Y{U^spJCsQ!V9V6eSDbbD8^QQhh^N%)3bbWbem%rRW$DC`^J8thhp#giS;xODC9%g%mogAb5~d&Jegdy^YV z?%WA}N!X%>|<{+_Od)mmky1 ztGx?&TQ?&N(BXDwM;(d1T@Uq``;9Q(-ctMnkEwI~+UKbQKG$YpJ_PS{<+v zDobsydYZt(p1zxN_MpzV6*gl6=}ew%rz9DE!Xb!eih!AbTDeIk+@t6#vP=g2bA*MA z?h?WE&ywfFWrt*(71gG^F=Pe9-tjdgoNUSpimJYebSEoVOUyJ8*a`-S)VMfbiKC+<<-fEyF{(I zOMq+rOW;p-fFK%gkGSFuXHLv8_1KX|B7R1L0M;5x;-!2##UMS|t-%lLIIzMFMP|l7 zekFszo-~{cTm1_xSv!@ErrImj7Pu08#i--2<)dz_TjG{$KV+a7;QZ54j^IlCMga^EDA}@qH@E88Y!~7vY9F`3HeKs z11T=XBoCqEOhjYSEPQjo7)?U@fhhpv_r#Y6vuoYw`U>0yO;=&B8hkrme&#wiJuX^> zV@8RouF&zGV9$i~;q1!jcH!b~x8Aa|mlk&tDc;fh6ODxaI|AHkr?<(G%R%6at^}-P zi@0|SQ9bUpXvpLds+ISsLgDW@%(-Ek?6X1(#7itebRNcdn6>=hj4KAIxIG}|Ki*3l zl#Mm2MPLm@zeos)WcNeK5kg*Ar8(JX-~9|1CI9;DId)$ z#{Zj})hrlTEXXKMiXk|dA%O0>Dr;p3g+U10=WdwJen4WiAk(XneJ z{RpZ;YYg@9&of@?D)Y8kh6V!!v|jMO&Or{G>x3}3)|B{1kA$;ZE;9MnS-EjRV$ z_;YuFAlv0FYXAxO;)vOcOBkLyAQZ@_lC{Bh&mBS_AH=$ObbwtXdrif8V+Gp-I!MLG zk4?cO0%+<=3-(G(W^M_X)oF(4n?6$tn!$%SqKroyMr_pXN3EUPH7je7zF58n2HvSd z%op*_q&pmA89Ner#fZs__Ftk}$3iP8Ml0@5NOCkJ1-t_-^ym7g&gA0gD(We5H|Y~i z=rgCEN3cfyK(ip>F9kXaezGN}(Yj-}vV$o}poV>4#vE{=j0~nG3!EB~%Us8a!iKWY zmtL=gf2Y`=DRf~gr92bqN;m92UYfzSx>wxb3IZoJ6S1LAOF~x_Vz~=F5@YqEq)D$y zDf_TdVHX8b7iOYDPe=TIq8o~71QAnJWCvJ%y0J^gU(NFQ%X_JQB)_5 zNrILA)2^R)A3us%imgWbW2zM+o@Wo9U+m4FC43agQ&Aqvu5~R%M;7uG7 zyzck29?#cHmQX)RZE(Zv11Xyvg_a%W#Aj`Q&f-Bq{DA@MGF*cng&^3CayITKy^s1} z2LnSs*a0~!lCzLTdrIiqjrFc#W5ljzx2Z!kuH_Mz_+uxIv$Wvx6WpUqtMbV<+>d$J zuKW>|a?+bW^`f_=AE|o4k5U$&O2#eNAiMqAO&^u#$rKfF3z4;&pxGANT{AF{(qCzS zYc2(d(Xqs+w-V4E0@jGP|@?S;xsJt zmf%-%?4pdS&BW1>XWB-(jKnHI@z`O3m7^p9n9hdCZfyi*}$j7c>Pk<uuarU z00l3j`N2clLg##z$+P42cA+Yluv2miY~?F~2#s=ix9NP zLi@6?hoXdDMs95{uExTJM%N+KR%4|$Uxqta#O5mi^_AgCbS?BFr0Ms8)NZAWT#pA< z{Yx2WjJXp;r$D}xiY@a&wbQ)Xsv-UW*jXaty(kyFK5XVT@%wirAzHc?ScgPTPr{Bg zE;Eh{jq)q$=es2RaarP+iEezLLI9^rBYf)Sq8ltO3sd2Fy^SYsN&rQ#&PL<(TENF; z6uazLu|7u_oJbA|x+v`l78E#5FOL@JH}Yr!q}56TWZx>&Z!us<3CT%~JC}3Jy+LJ` zHv8M#utt1wI>ePGBsoqN)Zx(=fwZ<11yb-#fh!uqURohIbp_;T!ZEe1qd1Vp4X_X;MM|oa9 zVgZF3!*r`pQ|R{ZtCE&grn>-ncXCw!H~34`Si=rQStG~uP6lQv7b{7lTD)R}+{Vo+ zD&1?lJPd?+Hrk6GP7WA6_rQyQl50~ma;2@_=Z4! zU%swqNC;;_$A3!^8}Io-xRRzAiBH=U^}7i!I>Y5f!o!6q76j*QyDpz z2#*D2NtLE5rY5Y15Sb8$`~&MG+~Z@aWzGQ#>gRh9w&7bedM#^wO4f zfkSzpF|887T=uW^v>rP$k5T7T@82w~(*c7f-Pe7!1TsO#L%mR0SIs8>#z)x94&)&? z9xA0#mHYvJ;ZflJdRhi2wzCZ!=8d}py=ui@kz+KAu=R^}J%b@_ju0KPy-JwQKHLu*#I`|jTOdZHB zaP{zXkMNQ#bf~45O>*~l!B%^kgF}5-K|@MHXa%AIQH!-JCdTufZm<0onTzk?6O!`` zm+lr@<|P)98e-bZ8nMMQT8NgxJKL7R$&C~y1fQrOkERxSPEp$LXw&;-eE(|=Hmdxv zwq9Tmxs=IPxS#Ab2pBI@u2y*^RW`;g5Y{{UMH}a+!3MRC2!mp+&G`>by~9^{9aOC_ zpK#GU=^`CF1ewrBzz6)~Wx37fg4$-8U%{aKIqc^w2D5?Sn^0gV;?)ns$|B6O0y%He zlaO!yzu|+T!T!b&Qvc5NbwoX?hOl<}v(NT@loS#sj}Yc5xU_s773UfNJLrd)1a3cd$!LoaFbPQ8;2IPFkhSK+l;g(036*D+O7aj<0dWl{s*wdVzvt@lW=%(E zxmQ46OO%V@(U)c9k%lJt8drW%0xK{^Mj?tF^m?cl(u-3{)AF@v)7|JYw{WLl(JsKJ z$Vi?X68v!^V4ToAgqR+J@3eT>s77IPt&g(xO8bhJ6E#M!85PgkX`BY3vL#i zvn1XVF3~1!aod8(KW;H}Tm551VABP{?`!n&HN#TVVr%WJdKW92=^Dl!aMip^9V7nlz#-#E2wQdhRL`c4Bx&5P`r`8pNY~p#!eh? zXeoHU(1!|-Oy8tK#IBJ}^IWP|zDGVBuHjWdVjSYv%N32GS>tqnW)R%H8Q4vH8(tyu zU3a&tvn|ws=Uyroxjn6{1Ag{PQeLg5!i9z%EMjkG`7H3;8St-`hETVNzmi8Oqhdz` z2uuIw1`pXy9BB6j2}q`fybZNj_rt{1oWM6CLJU4!$Z)u#@MNpyfzm=66w=PIb0=Vr z&J~L_0Yd}4^jQabHm`~4)QcT*zo1E{f$f%-7=2iB_H*ScZic{i&XA^T>_t(K<8JpL9Bu#5O&II?upKc% z&7e1%Uk%*rd#394&4NBkiDDfEP2$Dn)xDApGYXks3!0&X2YEOgDwo2cY_Pk61<1CZ z?~Jx&@VUEQ2!ac0mXc%C6&>HoQ;mLo`fu>CfrYh|%)N8G1C49XfgMD))?bbP;Gr3f z!}9H!T49UoKxX;Jf1#o6z`tl{{WO5*$zN2*%?pid-&fDsf~?j>9$76^@tQ?esgJl6>?^>m6=T zPoWl)4Dk2BH@xriT%z_~Rg8nT#aQhqp8-Y9%rr<+<^r-7ya@PaV22(p#74&CA&Gj+ zeD)X0*8u-W(a=ix4FP_W&8BsPIwLH_{D83U_ya*^5FQjXy@Dk--{sCeaMQOjn877L zW2M%u)*OJgScd(otV_27MZvw<#ookGf6>tE4s>=;a5q*Lv^ZGkRQH)Q2Ak8EJRm`R!@SDr&QTnm&RB2y__N-% zzXQ1;kLmdra&gJ;i#~=1sYx!(Ysqe4ivbgV0IU!$70#8`)eJYPXpPQZddAs zo)0yKi8ML#O_EA4Nk;o-&EwiDyS;td55ax)&FT;1MR>k>EnbMCu?qE7V`2Mnlq4Bp zKE|4TI(3vHDVtf0S7BM5?ZX4d^l#>?UtXut#o;NQ3?hYkS5{QsfG{KZ8*KvTTj z-tU(l&3Go`!p(aze9OWMGs=n%cUXL1LVUT;5qlRFM(1%N&l$ z`eJ8{hy?)$sK(fbA?Rl|OfS}tckcF?$42LD`gAu^txtcG-wdX{ z?*FU{mnt>WrQo&p-PA1lj!o{F$Kt4Wi#=Hiz9U?#k19ZJvRa8g?m^+BFuFbFoBH z7NW^G%I5s17iGTc*;BPh9=ePcfrJQah%Mx*A)j1FlTs=6cjBWF zEJVEhey7*HiceF$eNA{CJ^L2JGA&L8%}BgXo6{@*c1SDIBUE4(%XO?u*xnA{v>4w| zv^SR=i!-;;SS0AmrUkzr96t7_jpDk+UIKsw3M45!C1)a8G>)JdiqKShm&1h=FQo^0 zeb^+I-Lp*#!ueyoz0-t!0ASMvwnYfkx%7nXX!B9Im`EGiHWk#<_hg-x@F($e3VujW zwib97EJ$E1S#=xnj_r*s_88=_>abkY(s}p4CT|yfoE&=va8EQ*Uiim|y{iO747Fe*exBmKfTrl~Zb(o?;< z&9=BaNLmOtuIl8l4|=IK^<9;y7@Cg_&(Q9=UE7B?(2Z{cY*tt%TnX;y6FtAbb}Ps8w}` zs2EFBT+dHZYu<9fd=vxAS*x(T>_}c&E>o{!0-$2b>c?AIwxU@%0uS_}H15f%R~GD% zc9OBD--7yxE!hem4!<3$l|G>(aQgnp$$CJDOUNvirU@L!$<>w&&m;XRgiHii zNbJWxq}a#cvxl@TIW*-nR9r{Wit7SJC#nmfno+6fMn{3qz8FCX%?GtiB%}P91qj-R z);vHv^TM}^!=fQvF1jlcW)5dT)3pdSW65WFb!4C5J?B8+@o0K!OuSS8XyK)z8M_g% zM)a#TQ)4<)!;W-3b%$F;Bgx*wVhdIkb}^z1_nVhOc0@6M_exBaO7oGP=+g`B7(1B$ zU)P|NZsia@1_Bv9Y;)p)n7TO=>6Q(ul!S;B6S-Ap`qa=_7EbU+g|tfd&Z%wO10ts} zr0qR%P~w}eFW~$~Yt9NIu)1<|{DOTPHVeD|n6QsKc0VaHM9l0{wBtur1USRD5e#I= z83g>vx^{$5cIaGGN$E$`FQ@bi!YA^_?h>VN#nD4N3~UzjrF8sMw}8P zB1h2qhm>*N^>>MCbqd<+@P6gctd7B6%||0AJ9x04j27v3XvJ2hz-o&m609P*CQZ5o zX^P97)x6EzPfyC_;B>uZ*ApfGBMcIt4aiZ2!~uc-jMXvy%#N}iO>T8IfcSooC)iNl(a$1JIaQMSiQ91Yx6 z-JcnkBjVj>OfI`Bc~mdZj3uT3e*2-He{W44&kkBl7~Hm`rv&U=4PtZ@xb0lK4;^XR zMjelSmsIToeb%H6Je)?S^~ybvx_6m))@VIb&)lBdf+Z{6iSAQ389 z6aYcLoxZF6d%Dfa0U-WU8RY*l>;G4lvV~(Y$a=!}Rm_&v9iH74-$>p0~4P6Iolz#8-Y}yez)H%GhTL~yr?b?D4{R8jxQx_oGFJIf62rr zw|m-TMcdVi21mFoP+e-WMojBgHRALb&h>mKX1r=NF*VI3(Yr45gU{LMMANPY(^aTu zMcTbVAqSrZeAgOQ($SRfxPWKeT@U4zpc3}X?$Ki8>N#?_A@8PI1Z=xWc!X35DGTc{ zNh4vn_cIZ6r`B*VE1uJ-D)^Ndv#keo>JGvzCM(f=_J?CDa4L%RP9`$FBSz0!D1iWm zgt6b`*A0?af0krmFQh^c)2Y|MS>xCfGv>kQ)Yg_Gwb)Vs_uwx%47wIw++9d^?h17Q zVV<%HyWuBv1=QaSG==A|G0g+q=w_Q}C<+MPQ3uB>8Bul_3LWX95_h2W*zSx$xx25|;rq7K!E& z&XOcOGK{i$J$Q$`J=S(`dcP^d^IPef@Khf&SL7Ec>RUQjXxgmCP4o0Q*ru<8&{`AJ z@j9*PQzU8Hls`c^e#t384xYm9bIoypJB914O{Oc=16eAQOuoIka#eP=GZshrROk_M zlbeE4QkO?8dxOT&a7cRpO5_93uR4HL{#mXP-3^Q=D!sJkC2L9g!LCy%w1WnNU8MHx z7dp;gs)6RQd-!q@Kyxb)k4T226k^eZE*B?fHr$PJ%3PRIpYw98{cVnQx~sGh0ieij z0QNwf0@T?M!|Yd&rVpyB*ZIyiH$mL<)N5%x3oMCZs}E$}UX720k0;0&qcfqixC9>zteZ~ zKcJ_f#aBM1#G&L$K46Qh*s8!=({95UlkJyhTV% z2H-pU9|MCYIp-Z*c#nvNGgOTBBhElb-(3)tU&=46{#p+YFml8}aQR$rF079?ESu#V z?Lvzdz90C6f%gS{#);xaAfG35l$PrWWfD!v?J>1Xww_5c307y)=j5IFheX>ahM?Du z$9r)$0%Qaa+^ZoB>^KQc6$3#~#Q{?>aX>3!f6RnZ9*LMu#)$6=ERLxHm(@r$5-$iu zZ-#hKD~6|ZKPAQW$R?Aq#~!8hT8hiXBR>xl8v24N2EsVyQwoqy1kmmkp8G=MSP8gx zIlp)z&&_S~T39klg;Sw3P-;dvjgGPOmAza(U}S1dca-!{)A9Volg;cwxcK9RFqXum_-D)hfy|Z zoW{-iAM(4R_c}FMoe5vSzl9bk7+&Lwrgn%s$MzUR|WLErC-e$#9Ka?h4 zgWdGVhY0j_rEqRIbP^F^$v|aOCTP2h2=91`qw*p=zv&KxOTCZK_kZ6=K^KprF~Wz z*(SQX2G9>FPa;eh^EQ$t@a8U~U#e=wR2V)izW_|oT^?9GMWlW(bxPki*$ZUBgQ_iy zcZatHIjmS^pwN zMgoAPIVT3*=?bHK^y=~WpUz8-((_iiBsyu{5oVuLhV(6BmnDu{eyE+yMA}`QJs6mHxJ>G)BR0cYqf4?w( zXbm_549-?N3{{w=*(g0EcT05XDC&Tg;-Q4DI(0Bwu?f)$Hwda--4HSm4uVa+nJevb zFcw@SAJwHt?MvuTgUI|$+Am~{&xh7-zAdU^l_2&=EcR||1_J2t%FRj>eCQM?Bbl5h zA*B+nSplSqIA~b`55mhy(p1OEV(sHjTrszr2<3DJ{y`~19hOKFM% zkpGS82@4w#b4~GsNI8fC2*LPaVQ-5)8+3JXr7%VV3?as=OJC$tlA-}*pn)mv|NP{o zY)1o#KpB!_02H7cDU>k)e9)E@@fZLJs7#7w4B!lOBSq~OKpV6xrS=y<4#vXBpp9e< zNq);T1u_|%!$ z6*s9n;LPM?V)woWMbdyYNaUpmdBSUS&BZE7NqItCtA^}`5zO1O_=7T+KQr&DU7 z0O}3*xVARTo_V^Uhb5=Q@4lWy?$Mt%&}5kzk>q7_qAerH&MOkutk z$e5R-U^A1u1~czN+@|l*D)8JGrAwlGZnBOkHS?M^H6Do*gbSw0Def?Z=X0kHHBac9 z4bq^MV(y8@cyzIBF1pLSdi?KQ#6i1Se&x$G$rX(7LOzG6a&wo++je2JBTb_qm35go zG6~&4`hLoT^hURgYJWZP1z0Qbg%KTbCy^{lI5aahem&T~DM9DG9MkivRRQP+j#4PM zKXeW7qcaIjsYcSxel<#iKw2k|UaVGmB-{uS>-*$8@N0px4Y*7`L1Z`+t?aHIkx;#` zW){6OoEttTd^+U2UJJEWM#|m;%A%1$OO_mf^BL=oh;)X8iWcB5#rJZ|kw$kqB=Ojy zS!byq+Bks0>fKo{_vpbJL`GtP7w{rC9d zIBakA54WFT&DSuVpcgPk%+oC_<<~kXz9(X;iMacJ8S>(9AWDj*EkrX05=4OjKYnmM z-=gC(*$5NIfX{{{aY)`^At?vf5=$ zsO9!+PWL*7S*hT;n*El**0tgscy5it{V`hwh56AnTi2!ROEfpqoX_6*kxO(GELQ6m zf&>ZiiYSDm&OIaHVaH-zahV9PMICQrb$r+au`vMOuQYN9)?a+6ORp4rpd<<9Eo(28 z2xToIaB6w7AE${hBnA-;stU@9LbAhFQ?MO1uz*mTYJ!pBNPm?G80TvHk6ul7fNA>@BLsWJg750r`=8E#ax;`X$4vn z4y>dSO+y0l4}5uIN$@M1wq$vx@xjR0C97hYMa%3bma|53R>F21YrW-uwX~*=4#s8NSGtYUq|A|$A=gVG+U;1g zp+EHOq}rvm<<#NXlq9{0CV-BW(@IgR{o9BYEr(|D!E)}H8reKADRX>_0qz(8CNaX5UNvNJK)eLGmMf=OS)3+Z>xD3UxP59- zkNM*_Z1yFYojYqPLP+56$%oD58jj`pj!=WWzJZ$cj_HDoP1^b24wR(I7ow|2T!CCH@a2#_%LgHOz#--rwg~e;pviU?W)xIs$ ze9c2$UW!ee2D0w5gx?=Whhk}{xJ($p&Yzigl9jt+juAYXph+nICcMsn2qGDqy`AGxO9YMM#zGxATey25e#CzxU zWH5gD!f?h-jMJi(m9vymVSFarI+|bZ>+UnJTio1wj^BNh1t@4W%esib?HzOh6Wb;- z7`bSS3@yPlb=`QQkgIj95`rLVr!$^gPrSQB!)!S+%5KQ~t|59SbZulB80mhZ)tvjh zR0L5z$BN$eB~7HDPrv+b%Uo8fe>Nx#7tMUZr^*^{c%M|wXJbXLfQQeCnz zqCDAKVbv+6U9PUGl@rw-y)ts5oOK%YJ2h|`b?QOYdWr;6Nuc!pLj~R&*cgVoRln&~ z3$wIdwR9y&@>doPdWBL+@(oM)ReHu&kdZ`_`s{IjKjCMvW7op9AidbtHt~b4Ol>+u zSoK3^66r@)GKdmlo!5&m4S#hs??^?V(mH|Afs9~A$DriMRlv}FEuvrnMLFCUOl+mq zULvS{HH?^Rh5o{Hvno0_kd9;fkSmB`b@>43T2IFah&xjXu=$FnXx@UVM%zHlAc5(4 zeF^-CSp+x#5}oqvHNH-N2O$blazIuepQ$zkuSGHdl#9Ctga7s(Qn(GVbrM{bZx4$f z_u(ZRLZ=oH{lx5oYQ|~Dv6ete;DY#GWd;xY`h@hvo|5=i%2mo?CIGPox)C4`_8+`c z{{gM02mvAJQ`(#V619JMr>Iiin*q|mxRe6ka1{Ht$G=6B#o;OBSaqDY$wf~?7M#z` z?+!2gS=PgxLY~QBQ-vyH)jgKO>4^Ed->4qN<{1Lv-h9+xi!Lx%E@5=yu@#SF`zaR_ zzFj%TO7Pc6I2v*Xa&o$U8%FL=#ok+I&t2J8E7x9B5W-?Qmtl&kS2Jg{2}YI%=7p3W zh%7dl=W7#My9f=wk2GI;Seg@ngXwFLv0(%&TJbH74j#|2`POm@1sxt5a(vwu3&f1H z3HUQHfY%0HW|8ffn%8c1!wZMheQ9uD3B_F4<6uRJ1Sn0N7n@nceC6q)FW0X@mvtM5 zY)dMY+cptw^@eeZtPoR3@N6^!i`Y}`_hm6S#)qCDKxNM3d>HYEFF>*#y2oBPCcczg2PHdwy`Js`wu7V<`{{iYsBBbkNa-*1AKx{z_Nz6$u)@5c zkxlf}h65cWw7zwGkHM?v3W}h)skYWpg3D?ozhg01e5ZB87*KcHGxrALE~b=Do%ep$ z-;QiXD?zdhfr`m2?i!>5Qsq)=g%~Ts5`S_vG#c5nM_x?gv{_B&oEhv_7}Ma`6??5h z1cA;bsyOvdoc;!reFyC?-LZ*!p@gEEdS6!-)Lv~3R+4WlMwxa$n3GS=#~2{?xd+dF z^3_9+={4MSng(GRxiq4a_f23Cr!NGla5EA2Up~GAv91n)dMj82Y7eN%^~*O9rKoY7 z-VI@2Qz;VNbS%a2tlE28&&uL8?el`Q{ZSB)Md~RJ_6NCn8@DxEUN+Iu6fi8L(Z+v{ z$1>2@OcKxTbfH!|YwdD6hhOL_`K)Gpx+Nj`(z%KD;EK#)7@D6bI&pK-#~ls@rIbbP zYh#e#Y(fYE1w=yvGb+=YfE+#1SeN9xsb2n04-Gzcj|B`tcP1;o8@n|m51|XD_1L(x z2m)8$M46a$Rc+=4(H#4g}DwK3$X~<|7@*3<5)lBZ5g^&g5 zr{aXiW_j2dBr`SEf9|3be>{q&s6@H|UZA%pD zc6q-PN9D6_JJWHiXI-Hv$LDJH?B*WD@$%lXzX1^PHp%pjKL@+rp_=EAWjnPh} zW6)k^U{t0SLnO4wOI|Ok`sdyS3o5xPChiV-h9%)Andj`R=H2kV}^608$CA^}(Mh0O|za&SO z6nBh4ldmOhS!h9lbn%P_b+)=R*I)m-ijy~Zk*uL%(~QvXu;@4oXYk3wCxq9x{sNu! z)^(Hh-OpywnnqzpLI{ULT=qIGfzKeiEOX0_ow>wIm6pn3leMhTRrN#-5<%Hq8fH@@~w61Re9Cy zV7sK7r?Kw4T$31gzOsV8atjR|zK)6DBzIUbnhWXp&G~(v2C$wJrUPkPe}Eq52fB=hzFh z^;CA1bCYO9hedN!bw5wcttfrYS{ySinmi0N?AEEEjm&!tOG)eCB-XF}c`lVceb!K4cHMPUMJ7 z3qz1sm!Yu(#w(rISl;7Gu%UABHrHe<6KT){R0c9PJC2nr>joTO&R**Cm;KulZ-mJj zTAK%2g?8kD?+q$LZ$G}%tiIpNK6wQ-DuZI6rX$Kbhc7UD2(F=7;lnEDsEgnJbhm68 zcQxbk^9O%&WxJtHxvu51p@OPrQk9EYh4|_@C47Eu^dGg|_YZZ9oTC-WIX54Z^M`dl zBkWM?(<3xWy%Nkq%KsT;BT}=a)Tm_ zz1vbo-Z-m#pIWv=+GMF)qwJ_{&a-w^VS}xerDY;{s>h@Spa4`FhFJX7Ygj@?O=O>m z@R;=0O2hIIE4+QDg5D(fhKM;i!cR7=oXn78laJDoY4FN%u0gSk7@w($t~qe2v$fxC zWVzpfAVWWMk6UgA0D0j56{ztr0>J*e7g`I6dB z7wnYxwV~!m+4dnTT0AQ+jGjH2on26+sClC$-3_{20Fy!9ZD^k;&Vngs*X~wh>DIS~ zs=dOl)$mtGF0+kEm|58#x-Sp!KM&X*skuae%hT@`@umUMyt%;de1BIH*|UOMClop9 z9(3PoVyb$hpVU&Kph%*ytAOTm>$H1sx;{gA6lz)#g_GsClP<$dZu70tS9{{L@zIpV z&a2Y56|J!fVNCY9^@;shw`CjCWmtB4)DG!^t&y+A_u2)W^ z#Vja)K22QhXc~apVAhp?uWmkxO{lHzIx!q+lzms&wAz+*;y?q}j==@cxSLdE?Co<_ zM2Tbl_O%|O)aTxovPRBteb8nujUHgq0Hi3c1X5QD2K0&ElwqyD5yOQ(vE_pjv~Z?i zMDlVIAyoHctx7SQD9mzK8o&|_B*Xe6Ecdfx9 zOxDdLzq^fP6F^_?LU81ovP93;)rM-=lp6pl!r!|Vp&YS^6GId zIp{gca*~-Pi$Q|@37<7RM#xoycq$`7p@jnhhEYMI!yhrHS)i$ zy(<|EODO{v%gXsYRSDuMZkL|py6fZYwuJshq|w{a7bQ>80`Q>&iBQlS_bSC|j155nR!dCT?j^9DY6-;~oK-O0R+kYfT{+EclWRx>c~lCTX_1 zm@8}Yt`7QZ*)3Vr9caV8DN%%lcrZwQ=8?kSPHJ5#xPgq#;a~(`@=ib47F}!9#pd0J zsAv%T=@)L`#`)U%s!U}dmv`n)e{e;Y;vVtb*hkn_4;}nX3*Xfx^cyu*hg)Q#QF*Re zJV68=g+?_*)Ixs#yKtKr&YDwp7HA*1gn6xe&4f*9A{GB z?Uydz6C*4M+Uu+}ZzZ1;0$kQaU>?goZ8L{dmTeB4D1&U|uet@c-F1eP<3*ew8w{@bDhKK4`F7IDG5r{AgeC-4)ye_+w~&y^ z%Uo~-PHU0)D+rWC=x8dGcDmz~gUZ^z@D?Z3MdEA{)H`g=oo-M3w@|wy6r2`QI@wZw z6MBBKHmi<9k>Hv^kk|Fkfsnfmr-W4?$$FA`raG#cE=Th_cU%@9_pW%8tzJ<_VPKty zz{Kk5#bI8k?Bi(OqYkWR`=jq=H&oWwn*=IffC2ME?_A{h*C(wpMl|;-10jD+<1bPc z=aAXBu_ON;G9S+a6*I%o1Zz5x5kl=2i9A=1NqLc`kN5apI?B;;$Y9Kn{I^@_c-3!Z z#{^}j*-nFe+&CPsx$}XR87a!Xeq^rSobMTIF27=TnR8flL_S_8W&4*qZlx;5C)7ZR z;@QBuDduOFBlYsQKH#w`rD6a5LXWNh3jaZ#{|_dgf8;`me-fbod7M$U0209Reae`! z^!ScAM&XF!jCeDWp&8ZR@P+oMB7fb(8iWj$^hM@G5Jun*IO(yf)iwp;Eiu2FQexxl zqmVEG$_}CK)Tt%qVhq@W@2fJm9>1J_K!}Re|6EtsxV^~5x0wl zkbrCPM+_~YdnSVH<(plZYJ2=qIbsFKy0v76klzCgLyT1CXn!mk1%*CRWa2zt_> z9R%}(4`TY+fSmM`z^|Tn*Phn4&P)bKx-qBIp?GPKvA4T49-geKLkkYz^70+aleuS4 zyWTzH=D}tsY_aiB-v-95?0Y*&MQG~o1wr^32fxmg#bxH+ggmD6pWb-ysCvGJ3&Lf3 z^gBz%yU=trhQNIFJBZ_Hgr3?1W6wJ?idw{tmV9d7p7x?=J3yWMcLxQ;oAVyyEDW-! zu?VydOx|6#Q`VTd9>{&5D|BG#`QYo6kB~rmM?om^H+Hf=>=*F(R2ciQIZ@pog32I- zpjxwdI$lqaB3=ef=I3=kH=z6Rk#{k1y5-n zFVs&y^%?@S4WWh9G0}a-n(z~`^w5K0R)Wwd9_Jq4t-p1dl+f(}8}wGCxsG8r>(IxQ zw)bGnnfVpvUFX%|;%1Ht?;}g4Dguk_ddTMI%tb6sHZYml$+h}yphmUTXA2PqDB)Mt z^f5iv<8MW?t+157>ffx!KmI7iNN7Qn+;1$j2^>=gv;FiVE*UE$=M5QZ?4aq2#WU!I ztipqX#hD}tflT@XjQLb?TL{No-siJh@&IdFH^CohR;{BndwY;sM1!b=8%g<=j?@0I zU7Q}0DK5F5AG&tecfVWZi=0H#u$u~rIz+Xqk2RTv>Tx|w)21Pv6LOYJwuM`*h%duL z91WB%FDouOUU|hXJG3LU+bfoTVH8q;C_5#g^EMx;N~oU%_PDE`m3}czyD>S|D#4&@ zL_2lK1ASXG9jLcyp3KuZy-9|iS5&jmnd#JBh38H$KplDs;+nJi?Cn7=_#4Hulh)|AEI{kDmPw?9jWbp@lv9+j^D|WqZa;5j?F6 z!W!*aJB)qtL!m=~z1P1>RIolAthsU{Zs*BuDyVIVQS{dkmPl13*eA&O6;vpU1Kgczs^5|7S;@5ryPD?RWfgRugY4d!FYoZG4c6idb}-`y3!hFVAq= zKQds-!9ObC)-K@hRrh}da~=aibTP#^cj+Y>Ao7C@r;jLi04&pD4S-EeOFw!mCd{PF zVVX9K$IbKk-@)4{chEyZe}m&dhtbA^uvmI!ygOrz+%^O+EaRNDB3Uck_PuU-u#zZ; z;xH{|SEX@8D_dYr0KuR@1SKOzr!Y)B0_!eDfRDt_$b#5r@Lg?s?d6QakeZb{&PjK9 zf(-E^nczwm9s-op0XW#t?__JP+|0ASsSZ^~f19|+T~tcMKGShL7@{nk_u$Zc^2HNI(zGKPR%E?4w7q{k%*s8^5yDNdehhjniJuy7 zw^YHl;4rmlKafp`T<43VoaB)~;I$XaT-z*WKm-cS5=2|{-hjNQHuD}<&Cp_8Ojz10 zS}>HQ<0Jlj)N_H8R}K}|OF6E8so9EF-DS!Cwa<3Tw%}*CovmO$UD9$iKc1s-jy_#- z4CKv`UBp~@qrrZm&LfjksbAy=3R=cBzYeTKcq&vO0uIJ-Op4F4xy_P^PF zF{WT&1Jr?Dav9`pSlfJ!YC$(^LVbdolJs96ljrnUHs>shREU-C7UoCZezT~X^^&!rnY5*Lmn(iKC!BN~d8MQe#j$?!kLmA+#+xTN$=(+qP}nRz_5=^`DDV z&r`Mbu6;Sbn|U|d7`?alHtiVwL3|_jR{2ZlgzL0O@CjBi^I&nYtW@T+B@TOYvtM&H zZ1Xz9Zd?HOJFMSzee6fB$>Oq5Uo8DOF60PpF?AXtreg|+Nw>kDke4J|Fc&P=^Jy`U z29z>9fpRBZ^=9LHf|Ci!_d`o6>v8*CXIqI0^>*X6kRaBm1%bijn%xot{@17uW#*b& zb5(0mX^J>%(fET|rv~hr&;znpk&38Gce!aPjvWBYm@EB*el`Etx~IUQ0L=srA_KI2j1J-3Z=Lcr z$>)dfJ~Djqn(OptFJanfm+L8GxAc~SGk9Z;J$bCYj8zYl<}ThJ*Ctw#7}Jmebyt4r+6%a{70H<1Xiky;B}jjO{~>X>LNKLlo=DZs z3lK~-e2`7$p~g_SHa`M_v^QEVex}UGQvVFknVR<9AI#}wCi|FcZdocKxEjYSGFy!m z_zh|%j;dgsBZn5(N41q#@Z$3gS#P7DA+J05c^{9oo zWQO$$BGjtIt0f;tjAe`O@LhDl<%q%Ea_5(~MkzE{ewU(7S2k zv8wDHv`sUZk+KJ4nuh zeGh|CjC9fiCcD$6^Ak$NWM0{q$*P0dK%$Y<$Q20m)P|;Q;Hn@Lo3xujwEuwL;p_aW zGsH?!KO`PhJN9lUh`a9qyTz)Z-<=)_rTO7|ae3#Xe4DB^TZ?o)R0ND9c1EX!>w{Yl zCxE@QR=JXx%EL^hFwwt{J5`DFlPP?$0dFhC>8*;zS$^r%Q)LqQq%gaSe2G4I%pnm! zHylL#7%2i{y56+KtU6-WquTo*k5BTY%&G(4p{mekM(dz%X07Oyf4}l_!#wB=gYPT0 z!)j$fyap1$MR8VIU;<|5_Jwx6!?W-|x=)H7#4!F&Ppa8e3)Nh+ZHBcmjmz0;j4IO) zv%UzLe-g8qq%@rrV4*aVDH$2g8!#)msxmCt^?lVT@b*9)pmQ|nBIX<#qi)^yo(gzY zc)*VYR-fz&5fC*LZIt-LtR*^a)FGV`7vHIALn~qbG&qSih|}2$Wx)*8^;!dei7XEp zS8V;HB7je7&H}=5$ackLVgSiIVTFXz-{9gqF8=?~oq`uIlmBVZ^}k#_T7G~jfkmCP zmZkQ5fH44040xCz-D`Jh^mKbO*MiEKpKSqk8*p@sYk+=n0bmAN&$?c0Vmme`3vOvT;5gc8+DGQe%BW3M%^v~w+CS(wfIE%*vD zw9oWb3@?GJyu@M&b}pNX96J8CZe-+9hstD@^~Gko6^ux}{NXB}(aV|2N6Xf}S7|LR zU+GwZs5i+v{+{yLxY{Cw-aWN355`MC*y9~| z)PH?@%&|c~>g{alN# z3Gu*y5GV3-3pVUoWm)EJn_ye^N44of1!w~fA)DCOzBj3r)PBFTB|>?WIJM7jyoH{7 z$@z_)!Qlq`wCn)qu&+Yq{hm*Fk|#8T*Z?jY35sLPc(P??r>@l3Fu;AEo+X3!e8 zt5y2nU*i7?nT7ePvCuKsezy4ZCt9W2Sw%OM7n8sT$31dETW>?aL36OPgNx|~nwOhE zJ{U6oa@x29U8bW&9Cs9oDJ}$BXf^;GNJ^ipemzu_*ojBB(ZTG18CaKXDOm7zN~;_S zxU7Nb8D9uCCb;152Eqde&&n*25`GCMktu5ZPEoD%?161kz+w5rLt#645M{Zs8PumM zB9{P@7cq>dt@t355jg=P?_6b-lZc1W0lS$I*?{#rU&=ZZ@K{7_D~E=1#$gIbNoF}v z)z6z3W=4tgz-p@rd&EZ1;$mCITx1QiTAzonFl%&ZkKPIE6@6_L5%v^8g|B2eMb47w zswhBkN}?F7?0HxPVH{j1(b3%_<>W-|*VPVC$LrF4odQPn58FaLvVD`!ZL2d@1m^dh zD{X0s#Ms~ddngjMc_`Qn7VHD4AR(@AMG`^T$;#T>Jy^;$yA5D3z8G}~4>%^(_r9Pm zdi02dDKneRBiQ{$n^9{zAdt4Ff`qQs`9YX>YIj)Q{cyq-uhc(DKsejnx0Q>oVB1G# zG;-WB_7i<}oDHj+SF;!EAAb zn@ef>kaUnAx)31FzA1u}Z?K9*>j4~OQ5>@AA%a#F>%MCo;_wd(2iTWAe?^u-Q8ME_ zeeV#^66YpJyrhz1Njb7)PH;8bsM<*9b`TojbHo*{siiNQR#?_TH(UK}-XMA260kyJ zKxm5H4v#sHSDF0q9tYFGn>i4K7ln;)2c={uzwKM9rL`AueyCe^nwOiZ+KrB<2aME> zu~eggZbm2V#E*tA{&_KL6Wp*lo%fbkBe&32#Hfo2R~5wJSqge=mFx%33uvjb7R1KB zpm%@i8GEZg0AmIBt|OFZZ?0mjqN%=Ax4bH3Lr$2RiMW1Op=m)o{E+4sk@VphXt_XlQnB3` zPGCD2D_&w(DEQ4-!%@wUwba~1j9$IRYq0vjGPjo?`XuQmeV-ktZ2ahzr&exc{1vy~l|Qis?Iqr}wuTu$#5zz3jafT&WHK#v!cR`j50SfPnu7ruyHVP^J=U z|1d2!_BYvLFg8RTP2Qx7i- zD<6AnYx#5Z5hMUtTU6+@sQ8(~Zlahy%CA{R&==iQRv!$RI#EyZCEcGn@Chk~tvLuf zVe9e$i>Z`u#$7tn01?HREl!q|1XoLsmTBQxaBfzLZiQ-vR&^N4UR-&9DIh%ro48>D z%?!1~Pa8TKCI0XuXC(@4M-&KL7(5J#me_`JY#v{w{!P5y3ui4eEPGhJg8}nqD$7ry zsSDxxVfyMsg;UWZA8HyBd-mVn8X0zL>JSTnnT~jGsb`Sb6i}kSaM56?-ISkSbD>)> zXVaug(-SVLrD8n+DwK^JES!Oo(dpIuISk5w=O}We=z}+er*10bh=7L}{8{311&^Fj zf#e_Q-_(mGhtwyXoMO~ctT1A{sppeE66otzOJdgls6Wmp*S>+eg8x_}H z8_!-?f*G9La-op#&T2>OZLHI$PrARwlKg(tovHmH=i&N|nN4KW8PWq9)nH=)ITa+D z@*-t`=m+mbL3?r@ZLXqb`b8Hhjyu8w_(P@}s{iYP`niCvj<$N)uR@q*S`LvpfHbFg z{P8&;RTwjpLg9Pk^kc2?mmBFbA)P9(^-wJtJ?ETjV2>BOugiAW?q!o66~~`hcKRD! zdVl$W<`}{^7+^%bML(^1ZhTUdxv8Vo>J`Q}*>h2*qzU}}>8TO?97M-~0 zQJa5fco7>{`fA2MBnXisIQk zt9QCUk5BrT31~hui5q)M6$z3;fM^I%gif-Xpur$D?s_}TMt&^5ClH${N1&W3oIJE{ zQ9`w66YUksfTSY4B9#nR1dEDfWNgQjxwQOl&nmn{!j)@)SgZs{ZPCL# zyqJKQ;n9VK*1Z=qJrxYPGiGz2A(N-I8J-u(vhi6Y+iqJ$7(ug!Ns_Y&An`DpB&M)y zbw&FOmTL){uJiirEgF$ngs)UCxPbRdTC$faa+CJ>9|IIKs89lg`?ngt5y(^xQ*X=2 zVY~=J09!!Blq1LAf`PHv@`(Ko8fDSiPI6<=h-oAiU&6t@fFMH%U-nbiQ%-L-&|bvG zAY-n-qXoq9tU0K_B0nh)fK^huE|J9++bo;y@4GRVzx-dgiU5eY_PemXDX=hv(bdw_ z)5662%NU2>A_aMNDJf#H_5Sq!TKpj#ZZE&I4{HPqdmoRbfBjW)m1NSbuXB{RT@=j& zpW`b|Lziho3B>0cMo5p|VBpE$c=Z<$6dqI&*BjVc(E6Hp$s6kwG3k%X z%9RmcHJ4xeu3hOqx+-VKPeNB4;_d59L}&YuafZ?AJZ@xH+3fnw>-gA0m!hDMFm(Jm ze+2sHcHzU%#Bs*I*Uyea})+Uhm@TT^Y49^mU3Rg7n z%jLB9k?19b#uk~$hxwZmS68g~HT&xZ>nsD;tKQ1cmJy0KV!QaVw?0dI5)%f!X^BST@?`oz+j6KL@yN5;h!o^{~hV7MC!TIEZvekOW<<_XW_#TmHF`Bzh1?#E>Mo zn3SxS0^ZmNqLBfmX7=PS9k2tK0O_6m0@si$10i{AX{P!Wp9Hy*NLSeFzY3AQJv2C% zeFc>)g~L^{jRJ|~iBi{j)+JjAKq`{7x2DTC%Q^bEWrcujh+7B$-u?>4-{n!Pm6g&s z?s-C-5SLT@>!VG^=tx(LJl8UhB@wmhCq|z(Lof8KQ<7wPZ5H}E&f8aH{UUXm)+KDl zjPa$mUa1^*%aY5eQ6aR@=VR9c9PQ~7AZS$Ph+m2}3`D=WJ@-*VIu*za?QpzMF1s0jkdgCi>WFT0?fgs`WhyTb+$X|4-g&1e{ zjXBn>8B~C5Laf7Z%A?+5L5Ns!V#3#HSIXtXPpG?w9gQF9Ln5m6VIo-PkO5I}x(Cxr z7+PEDd7Uf8zQeZSO+pN5k%iA+X~~A+c+o#FjmiMzLA?j-DV&%z_E=vYiW`zJ`1iT? zQlPJ5^1JBmT1>a4z)yGB{qRtQn3uhWcJ)?8GNXCY&!=-rF_g}O>7xy7_2n6lVp+3( zV)E5yt1$VIZ*g>6TH02Pbxn}jA!4mwg%Z)e#*7&KaMu*qiuYVQr20-&m!s$qoCed~ zJ3YYq{TNHXz{c}aNJh%EBWn=H+;eSh(eAZ_n-3RHa~ics^oX&6QnM5Fvg0E-1DUGH zor#I8@pE0$buzW$BhjTj*l22V$Jzh^o~8x^rloodsp?~9ZE1&|o7QbK(td3kv*4|9 zcucr|@MAqQV?_sH0O2>pRagYwf2x^NPqV<_Tahuq&Hv9DKR8ki6~UQOxADMZ08W$? zj(wo!9sg2rqGNr~pwd45+2;fAR}f2|EPvkzP1m-^2h;B2feE`QX?brtXIEh|DdXO2 zChTxk{kj2DC3>RUMhT1)M%5V5EVxRvAX&5AI-~U3XM074{M3Bn+p3Lfp1RLtui6Hu z?#mHb%u$kLK7$r|N9`G_mVa(x0rRT#aFTfUYK`YX4R$HHPQh>md62v5m_k1EZd!+*_=eELk;M&($Bch)L-k?UgQ43 zTlUaVs52%>bspB2!&hH#BEC`s9^O>zyBmC_bee*qXo1rp17+;rq+at8fRh7$*IWBq zxzY+?cNctC(MChiE6Tro({ z91^4dN$D>WqvU~PKZOm2}k=*e;eecn>b!>!Uh;qtaB8&t56OcM|lEzlM zES;Qq0m0ytJ`>mHIK>%0{xbh00;sGBZ=-$lNLeX~E6w9~P!3@gu8gD2>!Gw%(9ROK zt)H$|$$+r$E3hz2Uw9R?_YlsNZV*=`>~@qCd9~sSJ}JhOc6agx01W4>O#gLeab$VQ zH%>j7Rk-fTmDAi^tl)4I;bD;}Tr?dXb0@rlMgk!PwYiSag7$8&folhgf^D`XlB+&{ zxMJ{=1`5%c2a5X5HQEs=v@!xFdjh^*H(Hagaj(5C_%TF+lMSsgImzP9&9&1Yub`+o zin=fpUKi`2j7Y#s0ESG076Cs>%TgKelzV@<3*@>M;&-mWwN)3{Ir z46Rb-9Xm4R9kY&L8><6}Rv#9D26Zwv<#^=Hj5H~%#h7M3ZsZD?!(6SE;@V^On-1>+ z*`&%tZTR=Jwgo*8fzOAY-1U||g1b9|UIckNOWu~F+DrJy0a$7iQj~+~k}+jz3>HA* zGp+eWxrmUcrv;`3^lQcEYjDF|X|V(nvZ>fM+LqD+6lhBswGz3#isrykK(xq?N4%HS z))Gc;@&7y!&H^32^>3`lHn(>Zj*9Ra`r& zl+KvZ)M~9CTQhH7wl`*Ux4LH1WI+RF4VDNy=DmU zm_~N)WK&Ht1QNrqRI-x>LirrRr02Y$mXu14Z=ao{Wu^Ip-^o==mA56WI|>iel|hnL zs_|NQ!D63IUIJ+B&AK17EgF(qH$g6&%a$O}9}q@sdo6xS{4dn5y}zc(OHK_}GGit% z7lobq0SP4&i2_SpMd6l?2n{Bu+}d!7vEazO7mI{T-Fx~Vmi3zDADF(oNT=?$EDg7H z1zj73zOOs+^h+$34IQIaUa#jMzJ5se0S{L$%-l<(P)115l0f(QVUnG1DFDFdEAacz zEAXeU;P>?{=ojHPKhd|yF65iu5Vzh=#B+%ef1!=NdUYDOF4!JzuG4Qzi`schYE65V zOS`xHJ@8*V{mmdA=tDg7RYd0I9I(a+Z=CsHF*p4ADoB@l}=3b^6!CKD3U*3pik z<0?v;{`NKJETZF*ZjjQ>qePGx-0w0k8{72!^Ex>^dl@y#=zNlFm|j1nz3b(O7Q#E; z#Tzw{#A>hWY5yg%`trHA{joaAm`Lr2GHj>^L@AOyEa`--xnmasU_C#Yip0c2tkys& zv6Pk&(=NXuqOHfs6xWLg%Btt?DGVD(6k9=ISzpo4E(AM&PEtfa} zTe-f%eay6@#Tn4$Hl)j()_2-O^=VC&&T&*#MwF`+=tX4%I#+juQ#KQG#FkO z>#fWT&5J2gea%h)sCv}APk9txXr`THrKuI9ekkugRoJ;B)@8b`PWRwuz|=6H7zyS5 zDcSS$<#ek^O%YtH-RxF0+LRI7j1$WGFvylam++@f--Ulk%&C*G2HNLyEW!0xUxkn| z@yx2Z=uAJh3D)^RD=M!YSEgbRYR%>j|2}u$l*Nl{s9wniM6`x&UZHpVV*Hybl=GI_ zyWQm>>OHUZ*8}-od{v?OW*+~f5tbK7ZjX2(7*SE75dO}c-DD#e1V|1UzKNp+9$Oqy z7`NSofjll|4JYwojK!3}3VC_LzxW&9wl9YS%uUINO?2r4$M+EjeaKmI-y^;4n8R)# zcYR?S{DzelkT&F#tv#ri$4)>mMc+h#APU)2?XC4X(2*UikR39-f)XD<6|z)!4M|Rz zCMGqeDer!%)|EONoN{@CeP@mIwL@YOo$5$f6mQW+_qZ#LoJfHP6!*Od22(`}A(&lE z&NLF_I`={=jXsojpQ{}|`Veg8IbuScOmWpxHfJ@icTjc=YC9~PlI&7p=iQ!op{yTp zR`tOkdz=9+Vyw^o1d1PcW$qD0iHra$Qy1bk@ zw#0kjY)Oxw?#d+p2>>)6{aor(ZVEizp58=Fl1(LUy@NB1Cr~PgvogLhGY<0Nbjn*$ zAEaM4u*h<@#iGZjt+>vbGG2%SED{6(&7e!LeLgjbhb4OzmdMSmXz=ow=ZFb1tiDI5k@k-TkA=2HaT;gwC&BP z+tjTsDD)xlHWb{F#W6ND%Mp&g^sxdntCx!@EcE>PI5!c6CMyf=&3z&1Fm_NPB7}#z z08UMq9c@$73w`(+u;oRiGT7?!5i8_i;MKOXk-p zpT;yCtc}I0H&Uwf`5%dg1N8LvmFJRvU`FP7<}!@#)HY`Lxz{KF`oyt!xSol!{N5h*LOO4;dzvk-robNsXn1B2}5LZ zbH<4X+y@&sm=7uBPL#KU-?ei9j>D;6Gl4@91fVpM%DXDmYZ2qx`;!@?Vrc=2yZKy} zSd3lintwvlGbwXrx>cX+Yl#&AL{~QDw8}qj7OkOC>s(h#t`>1|?C?7fzX^jYGC%LJ zP3N9Aq#cWzf_+;P4fw@)P^Dl=B@%*__*?RT5(I30ONg-O#J(LD(dWlb%aCAJrBv=H5)P1KD1;UQdBrbLg!6-w9QS`}c z;6z5-7k+Tq`y?=wFUKUPrSYumT?<_+My)!gJ@@KITYo7krY%7CtsydNm$|GPWI|rn z`(2h^J}Q-c4quqf37)9%^g30BjH6lt-$$pyf3%eJW*Y$!phcg%7?Sfk|Irh5Ch+q#?-QR#G6X(3y}q95a9o9C6cMsQamVeqN#B0H`ZzP#u7D3AF5K|oZrL%^ zM`Uuwp5s>cVk_~4&zwBw7iFZBfezRX4QbJ&f||_^EBo(!=4spqZu?|n1pS{L=Ud&<%%VguScGyJ|KJ1`i#UUf;uJ3*%1&tS%6$jEcW?tGth ztLjsByi*K?qQcTeV*se*D}xghE|eoO8O_`)+T{yjaJrY?3Zf(CXLZj^(&d%6DMHM# zfAyPRYWU$i31r7#T#m**HU-{f=)n@$+@D(PGP+yMV!CoE9<88qQmjtXnPk(p7IzfZ>hRZX^ zQm(PQ)n7A-mm{=cHLGk9c8Q9Uf9C5Ki2bbi1NAK|Ny0-YGf@=m;lqrVsLze~4th6; z&&&_pI*sPA)3Y9ap9SMiXP-7PROrF**Fg(A4ur`wMZj85=C(yHpGYo)5AKy5+A0ji z3ygk8Ng0P^1qhnODdLyp#d*wXqPl|70T2TVYPa`HWlufgFgcmjo7z9Dhg{kv-KLpI zGpE3g1)XHVa5vSuDZUmoIH-d(Y8kf2#%$~f_1SlkMk1?oKEdgQA!F7^JoG?XS`LeV zI~7|z2H-J3`%iTKAvGiZUm(-gBL6=zxmDO?&Fm+fQ4OM2^OF}O27a3~lp0m{T=`{s z3_S3M{7Lmdby}I#CM{M$lkvF`%=ZW920j7rv=#Wgz}Gl0F`PWBp z1pd{9j|>Y>eN%iK?+C*?f_81u|J(@^f<;L!aDWP({Z|;YUy>&!L@5?HX&kZrEl9kb zBh@&yvUwM~UO#mLVc+XHO`YbPpa%B+)KD2}?THDv zqoG}1$U{hcJu05sSaD1QkgA1-aHA8lW`Ext-_Ec`SD{hHucsLDdl4`>Be5f}aBoAQ z@BB`PHuR0DUsgE>+8=wDTVJm+FF%`n=m4NDC{p^EOeDjV>YHo|OU&bY8Ux}EFGm?3_m#>K zgI6NPM8N)illinYJNf|{7#srmZ4lMVY&-!D9?11F^RMRKplI#=A183W&2Hmbc0ts1 z74Xzc!UZ#{{{KvAoJ^f(1BKf`Q_ZJ~H z+Z&++qr|s+kG0E}{%SYLh%ePE4H9Z;{}(-$-1zxc6L9bswwjG0BrDopzA4?dH{IOO zXn8h#FlY00Kju*j7rs!W)zV&T`3GE>Eaf1nF%~O-_WaOb{XYC=jx!73qi2jtO65rz zX=I$&zpd$N=`c4296=grpDU?H%Gx;Nj2)z0Z9&cA>(^K&AHRCE&T1|z;oN$OFfL zsz}u?gk7fDJlEH_e#P!E)}}^D0_f}r?MSHaGFhrtYHsX)RvP&ZRW-9>veV5}XO~-w zf|SC8>}u!%Q7VxwziX7z=?cdW!GcO`_eJuN1OHqa)2_?$1L~{MIQluA2K&6!3V0?5 z6)AIIAGbPkeQ@X@Ri_n^tF1x}sL=2o`HoOp)u*?m?NpN$csTITAlk~$c_=(a%+h3Y z^Q2D^>Ps!@jQCKC38qUY^!bt{rg>SGN6U+yo*97vpD--3K}`4ZLgJ+UkZ)74Q&wtSq4z{Rz6Zk@F4z8N{sa{sgR$mYjwTSwmwgG!li-e2 zIKm%*uFnCXYTLbu{^z#(?d{_3Z7RLvD~g?ZA=2o_gxz}I@nO}JMuf#`L*Q%U`s5k= zG!Hd)`pY)Mv=olus3CX9lGd;Rssno)WOX_k%sn}V((J<;hT7ZI!9O>z@xPVIg|QdY zJI7oDYmC&OS`5D$I?COn&BtwSI%<}ZK}B6sVTHg+0eL$=j)ld((WE%Yk!3O+mh(2T zD}klQ4DWE8i||<*;j8+@y=5V(M>hh28(RmziPTGpS0&YW5w2SrK2q2UM#S?1WB|>Q zVwIJcG8FlY0mHx4Si3)|DInwX^Hy!`TMFu&m$|^=JHB8dEkB5FR4trjWd?;xQ<_@w!edgQkea4t%lv)NFJn(H zbk56RF~G5O1{7`&usgHwoUI--hO2U>_=%tzDt=A?{D!OC8NgQGz8r;{;l_XMZykuR z{6wyEEaO4%GHW=XR!zMY1{VUmx0X8l&uv#s1YGm~G)eZ~XCtU2xFUe&LVG=w_%bVB zBqcwhHMIrHA|ir)EI~v`?sNAxR$@G%(&X}^fs!C@^zhzYzsP)BGw1p7V08LmSnNzY zJ#*O4#@3Gh#M2IGL=DB;4()BFq;6-;@vLj}>*0U|TLwZ8DgpXzo<(^nBp#PC+-Cf; zSs#!e8DfrbBf-gsbFTAlS(RM#1(sfvL5Ps&vuN|yf`ZCUIYL>V zS?p&&U#V@5PL}SwPnPfN=h>*YkhN;DB9T^BDmR}Zsc zJt`3OCtszr9t??o7k52_ie61s)VBHEU@wySS5yH(hsdzA5+{IG;4WJEAHD-kv)SQm z%r8%>AKhIj8}kB}#M=2fIOi{q9@1;RXf3RQxD~BMOx@M2GJFhBgkE+*J~>j%@zBMZ zN3m@u-?&(gE)9-*7kOZGoL8`?9T*gm9QFEfMdAS8^Enw=^lx=KmqfPW#!0OR9^%=} zN;^iA^q;6a4Q2qL%`arv^{r&C+Ly8S++IP3T+7=JYqI)zp0(q-Hs1|6B z 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 b7ytg}KmFJ5cy_w1zWd=1fBa8=|K0xs4QN8n diff --git a/inst/doc/Connecting.pdf b/inst/doc/Connecting.pdf index 1ff79f834f27364f56fa801894424a6cd348cb68..5860d1ce4d71d5ee64c03f695e6198e7fe4dc4cd 100644 GIT binary patch delta 39459 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%0AmL(`S41oa)3Tq?&3ngiW}%d|LM@hPrjQHEncd; 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 delta 39460 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 v7^h7z%*@Qx++3_-MEwzqorYMf?PeNI2; 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 delta 37850 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 diff --git a/inst/doc/Querying.pdf b/inst/doc/Querying.pdf index c20d56ae3beb98d334bffd2eb553a59d18c2e8fb..296276c44149facce8f8e4b65f2ce76796895a3e 100644 GIT binary patch delta 35979 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 delta 35893 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 Date: Wed, 8 Nov 2023 15:29:56 +0100 Subject: [PATCH 28/28] Updating CRAN submission file --- CRAN-SUBMISSION | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CRAN-SUBMISSION b/CRAN-SUBMISSION index 58f20b8d..6de6acd1 100644 --- a/CRAN-SUBMISSION +++ b/CRAN-SUBMISSION @@ -1,3 +1,3 @@ -Version: 6.2.4 -Date: 2023-09-07 07:52:51 UTC -SHA: 0275322b097fac96668c8804dd0acd8466c1442c +Version: 6.3.0 +Date: 2023-11-08 13:53:53 UTC +SHA: 105405047c12c144c4486ecfacb41d68a70be778