From 691335b35f7dad543c8346568263de4e33afa6f1 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Mon, 16 Aug 2021 19:12:14 -0700 Subject: [PATCH 01/77] chore: update versions post v0.6.0 (#318) --- CMakeLists.txt | 2 +- google/cloud/functions/internal/version_info.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39f20710..c7307a92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ set(PACKAGE_BUGREPORT "http://github.com/GoogleCloudPlatform/functions-framework-cpp") project( functions-framework-cpp - VERSION 0.6.0 + VERSION 0.7.0 DESCRIPTION "Functions Framework for C++" LANGUAGES CXX) diff --git a/google/cloud/functions/internal/version_info.h b/google/cloud/functions/internal/version_info.h index cafb27e9..f17401e6 100644 --- a/google/cloud/functions/internal/version_info.h +++ b/google/cloud/functions/internal/version_info.h @@ -16,7 +16,7 @@ #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 0 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 6 +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 7 #define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H From 6cd8fe0bc35f4c0a2274387ce155e2a7b9a551eb Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 17 Aug 2021 18:56:26 -0700 Subject: [PATCH 02/77] ci: update to use v1.0.0 of the conformance tests (#319) Also enable the legacy mapping tests, as the framework now passes them. --- .github/workflows/coverage.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index e2cc3b3c..9e2edd1a 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -55,19 +55,19 @@ jobs: go-version: '1.13' - name: Run Cloud Event conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v0.3.2 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.0.0 with: functionType: 'cloudevent' useBuildpacks: false - validateMapping: false + validateMapping: true cmd: '${{runner.workspace}}/build/google/cloud/functions/integration_tests/cloud_event_conformance' - name: Run HTTP conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v0.3.2 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.0.0 with: functionType: 'http' useBuildpacks: false - validateMapping: false + validateMapping: true cmd: '${{runner.workspace}}/build/google/cloud/functions/integration_tests/http_conformance' - name: coverage-upload From c0db15ca628ea072e71cf91b73d9ee5aa96eec4c Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 04:53:37 -0700 Subject: [PATCH 03/77] doc: how-to create a release (#320) --- release/cutting-a-release.md | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 release/cutting-a-release.md diff --git a/release/cutting-a-release.md b/release/cutting-a-release.md new file mode 100644 index 00000000..a0ff6439 --- /dev/null +++ b/release/cutting-a-release.md @@ -0,0 +1,79 @@ +# Cutting a new release of the Functions Framework for C++ + +This document describes how to create a new release of the functions framework for C++. The intended audience are +developers in the `functions-framework-cpp` project. + +[GitHub repository]: https://github.com/GoogleCloudPlatform/functions-framework-cpp +[GitHub workflow]: https://github.com/googleapis/google-cloud-cpp/blob/main/doc/contributor/howto-guide-forks-and-pull-requests.md +[#317]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/317 +[#318]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/318 +[GCP builpacks]: https://github.com/GoogleCloudPlatform/buildpacks/ + +## Overview + +## Prerequisites + +The document assumes you are familiar with [GitHub](https://github.com) and with the [GitHub workflow] for forks and +pull requests. + +This document assumes you have administrator privileges on the project's [GitHub repository]. If you do not have such +access contact an existing administrator or the owners for the GoogleCloudPlatform organization. + +The document also assumes you have an existing fork of the repository, and that this fork is up-to-date with the main +repository. If your fork is behind use the GitHub UI to update it. + +Start by cloning the repository, we will use `${GITHUB_USER}` as a variable that is set to your GitHub username: + +```sh +git clone git@github.com:${GITHUB_USER}/functions-framework-cpp +``` + +In this clone create an additional remote for the main repository: + +```sh +cd functions-framework-cpp +git remote add upstream https://github.com/GoogleCloudPlatform/functions-framework-cpp +git fetch upstream +``` + +## Updating CHANGELOG.md + +Update the local `CHANGELOG.md` file with a **user-level** description of the changes. Do not think of this as a chore +that could be replaced with a summary generated from GitHub. This is an opportunity to write a summary of the changes +relevant to your users/customers. Skip changes that are purely internal cleanups, code refactoring, CI script updates, +etc. Merge changes that are split across multiple pull-requests into a single line. The following commands will give +you a start for this document, but the output is just a reminder, not the actual list of changes: + +```sh +last_tag="$(git describe --tags --abbrev=0 upstream/main)" +git log --no-merges --format="format:%s" "${last_tag}"..HEAD upstream/main +``` + +Remember to leave room in the `CHANGELOG.md` for the changes related to the next release. Send a PR with the changes to +`CHANGELOG.md` to update the main repository. An example from a previous release is [#317] + +## Create the GitHub release + +Once the changes to `CHANGELOG.md` are reviewed and accepted, create the release using: + +https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases/new + +Copy the notes from `CHANGELOG.md` to describe the release. + +## Update the version numbers + +This is boring, but easy, update the version numbers for the development branch (`main`). A good example from a previous +release is [#318] + +## Update the package in `vcpkg` + +Create a PR to update the package in `vcpkg`. Note that the CLA may require SVP approval, it might be easier to ask +`coryan@` to create this PR for you. A good example from a previous release would be: + +https://github.com/microsoft/vcpkg/pull/19603 + +## Update the GCP buildpacks + +Finally, update the [GCP buildpacks] to use this new version. This needs to be done via a CL inside google +(e.g. cl/393879364), which then gets automatically exported to GitHub +(e.g. [buildpacks@c693fe898e8d3f418b8060238fa737664747f685](https://github.com/GoogleCloudPlatform/buildpacks/commit/c693fe898e8d3f418b8060238fa737664747f685)) From a38dbe6ec316d9a2f46344a810e4a26a19152458 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 06:41:37 -0700 Subject: [PATCH 04/77] cleanup: add missing #include directives (#321) --- examples/site/testing_http/http_integration_test.cc | 1 + examples/site/testing_pubsub/pubsub_integration_test.cc | 1 + examples/site/testing_storage/storage_integration_test.cc | 1 + .../cloud/functions/integration_tests/basic_integration_test.cc | 1 + .../functions/integration_tests/cloud_event_integration_test.cc | 1 + 5 files changed, 5 insertions(+) diff --git a/examples/site/testing_http/http_integration_test.cc b/examples/site/testing_http/http_integration_test.cc index dd5d33fd..c110f358 100644 --- a/examples/site/testing_http/http_integration_test.cc +++ b/examples/site/testing_http/http_integration_test.cc @@ -21,6 +21,7 @@ #include #include #include +#include namespace { diff --git a/examples/site/testing_pubsub/pubsub_integration_test.cc b/examples/site/testing_pubsub/pubsub_integration_test.cc index 3ac880bb..51fa2df0 100644 --- a/examples/site/testing_pubsub/pubsub_integration_test.cc +++ b/examples/site/testing_pubsub/pubsub_integration_test.cc @@ -20,6 +20,7 @@ #include #include #include +#include namespace { diff --git a/examples/site/testing_storage/storage_integration_test.cc b/examples/site/testing_storage/storage_integration_test.cc index c4455ff5..d43bbf1f 100644 --- a/examples/site/testing_storage/storage_integration_test.cc +++ b/examples/site/testing_storage/storage_integration_test.cc @@ -20,6 +20,7 @@ #include #include #include +#include namespace { diff --git a/google/cloud/functions/integration_tests/basic_integration_test.cc b/google/cloud/functions/integration_tests/basic_integration_test.cc index 2cfbcd30..fb4c8377 100644 --- a/google/cloud/functions/integration_tests/basic_integration_test.cc +++ b/google/cloud/functions/integration_tests/basic_integration_test.cc @@ -24,6 +24,7 @@ #include #include #include +#include namespace google::cloud::functions_internal { inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { diff --git a/google/cloud/functions/integration_tests/cloud_event_integration_test.cc b/google/cloud/functions/integration_tests/cloud_event_integration_test.cc index 5d7abdc3..e32dc1ee 100644 --- a/google/cloud/functions/integration_tests/cloud_event_integration_test.cc +++ b/google/cloud/functions/integration_tests/cloud_event_integration_test.cc @@ -26,6 +26,7 @@ #include #include #include +#include namespace google::cloud::functions_internal { inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { From e78a3e1cd8da97799fa4ec36049308fd91fbb4d2 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 07:07:38 -0700 Subject: [PATCH 05/77] test: add missing dependencies in test library (#323) --- examples/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 0ea5fa68..e7835da5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -73,8 +73,11 @@ target_link_libraries( absl::strings fmt::fmt functions-framework-cpp::framework + Boost::filesystem + Boost::log google-cloud-cpp::bigtable google-cloud-cpp::pubsub + google-cloud-cpp::spanner google-cloud-cpp::storage) if (BUILD_TESTING) From d591ee07348ae53841da8c3d03a43c28a47c95af Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 07:33:35 -0700 Subject: [PATCH 06/77] fix: use correct version macro for pkg-config (#322) --- google/cloud/functions/config.pc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/functions/config.pc.in b/google/cloud/functions/config.pc.in index f39fc77d..21072619 100644 --- a/google/cloud/functions/config.pc.in +++ b/google/cloud/functions/config.pc.in @@ -20,7 +20,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: Functions Framework for C++ Description: A framework to support C++ Google Cloud Functions Requires: -Version: @FUNCTIONS_FRAMEWORK_CPP_VERSION@ +Version: @PROJECT_VERSION@ Libs: -L${libdir} -lboost_program_options -lboost_beast Cflags: -I${includedir} From 1dd2a3d82a60302aa6f35f065ffd26510d78eec6 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 12:39:02 -0700 Subject: [PATCH 07/77] ci: add CI build to detect API changes (#324) --- .gitignore | 3 +- ...nctions_framework_cpp.expected.abi.dump.gz | Bin 0 -> 89909 bytes ci/cloudbuild/README.md | 92 +++++ ci/cloudbuild/build.sh | 336 ++++++++++++++++++ ci/cloudbuild/builds/check-api.sh | 87 +++++ ci/cloudbuild/builds/lib/vcpkg.sh | 45 +++ ci/cloudbuild/cache.sh | 159 +++++++++ ci/cloudbuild/cloudbuild.yaml | 107 ++++++ .../dockerfiles/fedora-34.Dockerfile | 55 +++ ci/cloudbuild/trigger.sh | 130 +++++++ ci/cloudbuild/triggers/check-api-ci.yaml | 13 + ci/cloudbuild/triggers/check-api-pr.yaml | 14 + ci/etc/vcpkg-config.sh | 26 ++ ci/lib/init.sh | 69 ++++ ci/lib/io.sh | 142 ++++++++ ci/lib/module | 42 +++ 16 files changed, 1319 insertions(+), 1 deletion(-) create mode 100644 ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz create mode 100644 ci/cloudbuild/README.md create mode 100755 ci/cloudbuild/build.sh create mode 100755 ci/cloudbuild/builds/check-api.sh create mode 100644 ci/cloudbuild/builds/lib/vcpkg.sh create mode 100755 ci/cloudbuild/cache.sh create mode 100644 ci/cloudbuild/cloudbuild.yaml create mode 100644 ci/cloudbuild/dockerfiles/fedora-34.Dockerfile create mode 100755 ci/cloudbuild/trigger.sh create mode 100644 ci/cloudbuild/triggers/check-api-ci.yaml create mode 100644 ci/cloudbuild/triggers/check-api-pr.yaml create mode 100644 ci/etc/vcpkg-config.sh create mode 100755 ci/lib/init.sh create mode 100755 ci/lib/io.sh create mode 100755 ci/lib/module diff --git a/.gitignore b/.gitignore index a72c91fb..97a4442e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Common build output directory names .build/ _build/ +build-out/ +cmake-out/ # Used by some IDEs and LSP plugins compile_commands.json @@ -16,4 +18,3 @@ cmake-build-*/ .vsbuild/ .vscode/ build/ - diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz new file mode 100644 index 0000000000000000000000000000000000000000..8ad4bc327c4af22285cade2750e2c935169e9791 GIT binary patch literal 89909 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 Zko++CVg0lJ`TzcZ{{JT The basename minus suffix of the build script to run +# --distro= The distro name to use +# --docker-clean Delete the build output directories +# -t|--trigger The trigger file to extract the build name and distro +# -c|--cloud= Run the build in GCB in the given project +# -l|--local Run the build in the local environment +# -d|--docker Run the build in a local docker (default) +# -s|--docker-shell Run a shell in the build's docker container +# -h|--help Print this help message +# +# Note: flags may be specified in any order and with or without an equals +# sign (e.g. `-t=foo` is the same as `-t foo`) +# +# This tool runs build scripts (named using the --build flag), which live in +# ci/cloudbuild/builds, in certain environments (named using the --distro +# flag), which are defined in ci/cloudbuild/dockerfiles. Each build can be run +# in one of three modes: on the local machine (--local), in the cloud +# (--cloud), or in docker on the local machine (--docker), which is the default +# if no other mode is specified. +# +# A build name and a distro are required. These can be specified with the +# --build and --distro flags, respectively. As a short-hand, the --trigger flag +# can specify the basename (minus suffix) of a file in ci/cloudbuild/triggers, +# and the _BUILD_NAME and _DISTRO will be looked up from that file. +# +# Examples: +# +# 1. Runs the asan build in docker on the local machine +# $ build.sh -t asan-pr +# $ build.sh -t asan-pr -d # Equivalent form +# +# 2. Starts a shell in the asan build's docker container on the local machine +# $ build.sh -t asan-pr -s +# $ build.sh -t asan-pr -d -s # Equivalent form +# +# 3. Runs the asan build in the named Google Cloud Build project +# $ build.sh -t asan-pr --cloud=cloud-cpp-testing-gcf +# +# 4. Runs a local docker build with a completely clean environment with all +# cached artifacts from previous builds removed +# $ build.sh -t asan-pr --docker-clean +# +# Advanced Examples: +# +# 1. Runs the ci/cloudbuild/builds/asan.sh script using the +# ci/cloudbuild/dockerfiles/fedora-34.Dockerfile distro. +# $ build.sh --build asan --distro fedora-34 +# +# Note: Builds with the `--docker` flag inherit some (but not all) environment +# variables from the calling process, such as USE_BAZEL_VERSION +# (https://github.com/bazelbuild/bazelisk), CODECOV_TOKEN +# (https://codecov.io/), and every variable starting with GOOGLE_CLOUD_. +# + +set -euo pipefail + +source "$(dirname "$0")/../lib/init.sh" +source module ci/lib/io.sh +cd "${PROJECT_ROOT}" + +function print_usage() { + # Extracts the usage from the file comment starting at line 17. + sed -n '17,/^$/s/^# \?//p' "${PROGRAM_PATH}" +} + +function die() { + io::log_red "$@" + print_usage + exit 1 +} + +# Use getopt to parse and normalize all the args. +PARSED="$(getopt -a \ + --options="t:c:ldsh" \ + --longoptions="build:,distro:,trigger:,cloud:,local,docker,docker-shell,docker-clean,help" \ + --name="${PROGRAM_NAME}" \ + -- "$@")" +eval set -- "${PARSED}" + +BUILD_FLAG="" +DISTRO_FLAG="" +TRIGGER_FLAG="" +CLOUD_FLAG="" +CLEAN_FLAG="false" +LOCAL_FLAG="false" +DOCKER_FLAG="false" +SHELL_FLAG="false" +while true; do + case "$1" in + --build) + BUILD_FLAG="$2" + shift 2 + ;; + --distro) + DISTRO_FLAG="$2" + shift 2 + ;; + -t | --trigger) + TRIGGER_FLAG="$2" + shift 2 + ;; + -c | --cloud) + CLOUD_FLAG="$2" + shift 2 + ;; + -l | --local) + LOCAL_FLAG="true" + shift + ;; + -d | --docker) + DOCKER_FLAG="true" + shift + ;; + -s | --docker-shell) + DOCKER_FLAG="true" + SHELL_FLAG="true" + shift + ;; + --docker-clean) + DOCKER_FLAG="true" + CLEAN_FLAG="true" + shift + ;; + -h | --help) + print_usage + exit 0 + ;; + --) + shift + break + ;; + esac +done + +# If `--trigger=name` was specified, use the _BUILD_NAME and _DISTRO in the +# trigger file as defaults. +if [[ -n "${TRIGGER_FLAG}" ]]; then + trigger_file="${PROGRAM_DIR}/triggers/${TRIGGER_FLAG}.yaml" + test -r "${trigger_file}" || die "Cannot open ${trigger_file}" + : "${BUILD_FLAG:="$(grep _BUILD_NAME "${trigger_file}" | awk '{print $2}')"}" + : "${DISTRO_FLAG:="$(grep _DISTRO "${trigger_file}" | awk '{print $2}')"}" +fi + +if [[ -z "${BUILD_FLAG}" ]]; then + die "No build name. Specify --build or --trigger" +fi + +# Sets some env vars that usually come from GCB, but need to be set explicitly +# when doing --local or --docker builds. See also `cloudbuild.yaml` and +# https://cloud.google.com/build/docs/configuring-builds/substitute-variable-values +: "${TRIGGER_TYPE:=manual}" +: "${BRANCH_NAME:=$(git branch --show-current)}" +: "${COMMIT_SHA:=$(git rev-parse HEAD)}" +CODECOV_TOKEN="$(tr -d '[:space:]' <<<"${CODECOV_TOKEN:-}")" +LOG_LINKER_PAT="$(tr -d '[:space:]' <<<"${LOG_LINKER_PAT:-}")" + +export TRIGGER_TYPE +export BRANCH_NAME +export COMMIT_SHA +export CODECOV_TOKEN +export LOG_LINKER_PAT + +# --local is the most fundamental build mode, in that all other builds +# eventually call this one. For example, a --docker build will build the +# specified docker image, then in a container from that image it will run the +# --local build. Similarly, the GCB build will submit the build to GCB, which +# will call the --local build. +if [[ "${LOCAL_FLAG}" = "true" ]]; then + test -n "${DISTRO_FLAG}" && io::log_red "Local build ignoring --distro=${DISTRO_FLAG}" + if [[ "${DOCKER_FLAG}" = "true" || -n "${CLOUD_FLAG}" ]]; then + die "Only one of --local, --docker, or --cloud may be specified" + fi + + # Prints links to the log files for the current build. These can be useful to + # copy-n-paste into issues. The GCB link will require auth but the raw link + # may be publicly accessible. + io::log_h1 "Log Links" + printf "GCB: %s\n" "${CONSOLE_LOG_URL:-none}" + printf "Raw: %s\n" "${RAW_LOG_URL:-none}" + + function mem_total() { + awk '$1 == "MemTotal:" {printf "%0.2f GiB", $2/1024/1024}' /proc/meminfo + } + function google_time() { + # Extracts the time that Google thinks it is. + curl -sI google.com | sed -n 's/Date: \(.*\)\r/\1/p' + } + io::log_h1 "Machine Info" + printf "%10s %s\n" "host:" "$(date -u --rfc-3339=seconds)" + printf "%10s %s\n" "google:" "$(date -ud "$(google_time)" --rfc-3339=seconds)" + printf "%10s %s\n" "kernel:" "$(uname -v)" + printf "%10s %s\n" "os:" "$(grep PRETTY_NAME /etc/os-release)" + printf "%10s %s\n" "nproc:" "$(nproc)" + printf "%10s %s\n" "mem:" "$(mem_total)" + printf "%10s %s\n" "term:" "${TERM-}" + printf "%10s %s\n" "gcc:" "$(gcc --version 2>&1 | head -1)" + printf "%10s %s\n" "clang:" "$(clang --version 2>&1 | head -1)" + printf "%10s %s\n" "cc:" "$(cc --version 2>&1 | head -1)" + io::log_h1 "Starting local build: ${BUILD_FLAG}" + readonly TIMEFORMAT="==> 🕑 ${BUILD_FLAG} completed in %R seconds" + time "${PROGRAM_DIR}/builds/${BUILD_FLAG}.sh" + exit +fi + +if [[ -z "${DISTRO_FLAG}" ]]; then + die "No distro specified. Use --distro or --trigger" +fi + +if [[ -n "${CLOUD_FLAG}" ]]; then + test "${DOCKER_FLAG}" = "true" && die "Cannot specify --docker and --cloud" + # Surface invalid arguments early rather than waiting for GCB to fail. + if [ ! -r "${PROGRAM_DIR}/dockerfiles/${DISTRO_FLAG}.Dockerfile" ]; then + die "Unknown distro: ${DISTRO_FLAG}" + elif [ ! -x "${PROGRAM_DIR}/builds/${BUILD_FLAG}.sh" ]; then + die "Unknown build name: ${BUILD_FLAG}" + fi + + # Uses Google Cloud build to run the specified build. + io::log_h1 "Starting cloud build: ${BUILD_FLAG}" + # The cloudbuild.yaml file expects certain "secrets" to be present in the + # project's "Secret Manager". This is true for our main production project, but + # for personal projects we may need to create them (with empty strings). + if [[ "${CLOUD_FLAG}" != "cloud-cpp-testing-gcf" ]]; then + for secret in "CODECOV_TOKEN" "LOG_LINKER_PAT"; do + if ! gcloud --project "${CLOUD_FLAG}" secrets describe "${secret}" >/dev/null; then + io::log_yellow "Adding missing secret ${secret} to ${CLOUD_FLAG}" + echo | gcloud --project "${CLOUD_FLAG}" secrets create "${secret}" --data-file=- + fi + done + fi + account="$(gcloud config get-value account 2>/dev/null)" + subs=("_DISTRO=${DISTRO_FLAG}") + subs+=("_BUILD_NAME=${BUILD_FLAG}") + subs+=("_TRIGGER_SOURCE=manual-${account}") + subs+=("_PR_NUMBER=") # Must be empty or a number, and this is not a PR + subs+=("_LOGS_BUCKET=${CLOUD_FLAG}_cloudbuild") + subs+=("BRANCH_NAME=${BRANCH_NAME}") + subs+=("COMMIT_SHA=${COMMIT_SHA}") + printf "Substitutions:\n" + printf " %s\n" "${subs[@]}" + args=( + "--config=ci/cloudbuild/cloudbuild.yaml" + "--substitutions=$(printf "%s," "${subs[@]}")" + "--project=${CLOUD_FLAG}" + # This value must match the workerPool configured in cloudbuild.yaml + "--region=us-east1" + ) + io::run gcloud builds submit "${args[@]}" . +fi + +# Default to --docker mode since no other mode was specified. +DOCKER_FLAG="true" + +# Uses docker to locally build the specified image and run the build command. +if [[ "${DOCKER_FLAG}" = "true" ]]; then + io::log_h1 "Starting docker build: ${BUILD_FLAG}" + out_dir="${PROJECT_ROOT}/build-out/${DISTRO_FLAG}-${BUILD_FLAG}" + out_home="${out_dir}/h" + out_cmake="${out_dir}/cmake-out" + if [[ "${CLEAN_FLAG}" = "true" ]]; then + io::log_yellow "Removing build output directory:" + du -sh "${out_dir}" + rm -rf "${out_dir}" + fi + # Creates the directories that docker will mount as a volumes, otherwise they + # will be created by the docker daemon as root-owned directories. + mkdir -p "${out_cmake}" "${out_home}/.config/gcloud" + image="gcb-${DISTRO_FLAG}:latest" + io::log_h2 "Building docker image: ${image}" + io::run \ + docker build -t "${image}" "--build-arg=NCPU=$(nproc)" \ + -f "ci/cloudbuild/dockerfiles/${DISTRO_FLAG}.Dockerfile" ci + io::log_h2 "Starting docker container: ${image}" + run_flags=( + "--interactive" + "--tty=$([[ -t 0 ]] && echo true || echo false)" + "--rm" + "--network=bridge" + "--user=$(id -u):$(id -g)" + "--env=PS1=docker:${DISTRO_FLAG}\$ " + "--env=USER=$(id -un)" + "--env=TERM=$([[ -t 0 ]] && echo "${TERM:-dumb}" || echo dumb)" + "--env=TZ=UTC0" + "--env=CI_LIB_IO_FIRST_TIMESTAMP=${CI_LIB_IO_FIRST_TIMESTAMP:-}" + "--env=CODECOV_TOKEN=${CODECOV_TOKEN:-}" + "--env=BRANCH_NAME=${BRANCH_NAME}" + "--env=COMMIT_SHA=${COMMIT_SHA}" + "--env=TRIGGER_TYPE=${TRIGGER_TYPE:-}" + "--env=USE_BAZEL_VERSION=${USE_BAZEL_VERSION:-}" + # Mounts an empty volume over "build-out" to isolate builds from each + # other. Doesn't affect GCB builds, but it helps our local docker builds. + "--volume=/workspace/build-out" + "--volume=${PROJECT_ROOT}:/workspace:Z" + "--workdir=/workspace" + "--volume=${out_cmake}:/workspace/cmake-out:Z" + "--volume=${out_home}:/h:Z" + "--env=HOME=/h" + # Makes the host's gcloud credentials visible inside the docker container, + # which we need for integration tests. + "--volume=${HOME}/.config/gcloud:/h/.config/gcloud:Z" + ) + # All GOOGLE_CLOUD_* env vars will be passed to the docker container. + for e in $(env); do + if [[ "${e}" = GOOGLE_CLOUD_* ]]; then + io::log_yellow "Exporting to docker environment: ${e}" + run_flags+=("--env=${e}") + fi + done + cmd=(ci/cloudbuild/build.sh --local --build "${BUILD_FLAG}") + if [[ "${SHELL_FLAG}" = "true" ]]; then + printf "To run the build manually:\n " + printf " %q" "${cmd[@]}" + printf "\n\n" + cmd=("bash" "--norc") # some distros have rc files that override our PS1 + fi + io::run docker run "${run_flags[@]}" "${image}" "${cmd[@]}" +fi diff --git a/ci/cloudbuild/builds/check-api.sh b/ci/cloudbuild/builds/check-api.sh new file mode 100755 index 00000000..fb874984 --- /dev/null +++ b/ci/cloudbuild/builds/check-api.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +export CC=gcc +export CXX=g++ + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh + +INSTALL_PREFIX=/var/tmp/functions-framework-cpp +vcpkg_root="$(vcpkg::root_dir)" +# abi-dumper wants us to use -Og, but that causes bogus warnings about +# uninitialized values with GCC, so we disable that warning with +# -Wno-maybe-uninitialized. See also: +# https://github.com/googleapis/google-cloud-cpp/issues/6313 +io::log_h2 "Configuring, building, and installing the C++ Functions Framework" +cmake -GNinja \ + -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_FLAGS="-Og -Wno-maybe-uninitialized" \ + -DCMAKE_TOOLCHAIN_FILE="${vcpkg_root}/scripts/buildsystems/vcpkg.cmake" \ + -DVCPKG_FEATURE_FLAGS="versions,manifest" \ + -S . -B cmake-out +cmake --build cmake-out +cmake --build cmake-out --target install + +# Uses `abi-dumper` to dump the ABI for the given library, which should be +# installed at the given prefix. This function will be called from a subshell, +# so it cannot use other variables or functions (including io::log*). +function dump_abi() { + local library="$1" + local prefix="$2" + io::log_h2 "Dumping ${library} (may be slow)..." + version="$(env PKG_CONFIG_PATH="${prefix}/lib64/pkgconfig" pkg-config --modversion "${library}")" + abi-dumper "${prefix}/lib64/lib${library}.so.${version}" \ + -public-headers "${prefix}/include" \ + -lver "actual" \ + -o "cmake-out/${library}.actual.abi.dump" +} + +dump_abi "functions_framework_cpp" "${INSTALL_PREFIX}" + +io::log_h2 "Searching for API changes in functions_framework_cpp" +actual_dump_file="functions_framework_cpp.actual.abi.dump" +expected_dump_file="functions_framework_cpp.expected.abi.dump" +expected_dump_path="${PROJECT_ROOT}/ci/abi-dumps/${expected_dump_file}.gz" +if [[ -r "${expected_dump_path}" ]]; then + zcat "${expected_dump_path}" >"cmake-out/${expected_dump_file}" + report="cmake-out/compat_reports/functions_framework_cpp/expected_to_actual/src_compat_report.html" + # We ignore all symbols in internal namespaces, because these are not part + # of our public API. We do this by specifying a regex that matches against + # the mangled symbol names. For example, 8 is the number of characters in + # the string "internal", and it should again be followed by some other + # number indicating the length of the symbol within the "internal" + # namespace. See: https://en.wikipedia.org/wiki/Name_mangling + if ! abi-compliance-checker \ + -skip-internal-symbols "(18functions_internal)\d" \ + -report-path "${report}" \ + -src -l "functions_framework_cpp" \ + -old "cmake-out/${expected_dump_file}" \ + -new "cmake-out/${actual_dump_file}"; then + io::log_red "ABI Compliance error: functions_framework_cpp" + io::log "Report file: ${report}" + w3m -dump "${report}" + fi +fi + +# Replaces the (old) expected dump file with the (new) actual one. +gzip -n "cmake-out/${actual_dump_file}" +mv -f "cmake-out/${actual_dump_file}.gz" "${expected_dump_path}" diff --git a/ci/cloudbuild/builds/lib/vcpkg.sh b/ci/cloudbuild/builds/lib/vcpkg.sh new file mode 100644 index 00000000..0fa8d8a3 --- /dev/null +++ b/ci/cloudbuild/builds/lib/vcpkg.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Make our include guard clean against set -o nounset. +test -n "${CI_CLOUDBUILD_BUILDS_LIB_VCPKG_SH__:-}" || declare -i CI_CLOUDBUILD_BUILDS_LIB_VCPKG_SH__=0 +if ((CI_CLOUDBUILD_BUILDS_LIB_VCPKG_SH__++ != 0)); then + return 0 +fi # include guard + +source module ci/lib/io.sh +source module ci/etc/vcpkg-config.sh + +TIMEFORMAT="==> 🕑 vcpkg installed in %R seconds" +time { + VCPKG_ROOT_DIR="${HOME}/vcpkg-${VCPKG_RELEASE_VERSION}" + io::log_h2 "Installing vcpkg ${VCPKG_RELEASE_VERSION} -> ${VCPKG_ROOT_DIR}" + if [[ ! -d "${VCPKG_ROOT_DIR}" ]]; then + mkdir -p "${VCPKG_ROOT_DIR}" + # vcpkg needs git history to support versioning, so we clone a recent + # release tag rather than just extracting a tarball without history. + git clone https://github.com/microsoft/vcpkg.git "${VCPKG_ROOT_DIR}" + git -C "${VCPKG_ROOT_DIR}" checkout "${VCPKG_RELEASE_VERSION}" + pwd + fi + env -C "${VCPKG_ROOT_DIR}" CC="ccache ${CC}" CXX="ccache ${CXX}" \ + ./bootstrap-vcpkg.sh +} + +# Outputs the root directory where vcpkg is installed (and bootstrapped) +function vcpkg::root_dir() { + echo "${VCPKG_ROOT_DIR}" +} diff --git a/ci/cloudbuild/cache.sh b/ci/cloudbuild/cache.sh new file mode 100755 index 00000000..01632daf --- /dev/null +++ b/ci/cloudbuild/cache.sh @@ -0,0 +1,159 @@ +#!/bin/bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This script saves a cache tarball to GCS, and restores one from GCS. It is +# intended to be called from a build step in the `cloudbuild.yaml` file. It +# executes in the context of build. Typically the "restore cache" step will be +# called in one step, followed by the actual build of the code, followed by the +# "save cache" step. +# +# Usage: cache.sh +# +# Options: +# --bucket_url= URL to the GCS bucket where the cache should be saved +# --key= The primary key to use when caching +# --fallback_key= If the primary key isn't found when restoring, try this key +# --path= A path to be backed up. May be specified multiple times. +# -h|--help Print this help message + +set -euo pipefail + +source "$(dirname "$0")/../lib/init.sh" +source module ci/lib/io.sh + +function print_usage() { + # Extracts the usage from the file comment starting at line 17. + sed -n '17,/^$/s/^# \?//p' "${PROGRAM_PATH}" +} + +io::log "Running:" +printf "env -C '%s' %s" "$(pwd)" "$0" +printf " %q" "$@" +printf "\n" + +# Use getopt to parse and normalize all the args. +PARSED="$(getopt -a \ + --options="h" \ + --longoptions="bucket_url:,key:,fallback_key:,path:,help" \ + --name="${PROGRAM_NAME}" \ + -- "$@")" +eval set -- "${PARSED}" + +BUCKET_URL="" +KEY="" +FALLBACK_KEY="" +PATHS=() +while true; do + case "$1" in + --bucket_url) + BUCKET_URL="$2" + shift 2 + ;; + --key) + KEY="$2" + shift 2 + ;; + --fallback_key) + FALLBACK_KEY="$2" + shift 2 + ;; + --path) + PATHS+=("$2") + shift 2 + ;; + -h | --help) + print_usage + exit 0 + ;; + --) + shift + break + ;; + esac +done +readonly BUCKET_URL +readonly KEY +readonly FALLBACK_KEY +readonly PATHS + +if [[ $# -eq 0 ]]; then + echo "Missing action: save|restore" + print_usage + exit 1 +elif [[ -z "${BUCKET_URL}" ]]; then + echo "Missing --bucket_url=" + print_usage + exit 1 +elif [[ -z "${KEY}" ]]; then + echo "Missing --key=" + print_usage + exit 1 +fi + +readonly PRIMARY_CACHE_URL="${BUCKET_URL}/${KEY}/cache.tar.gz" + +function save_cache() { + # Filters PATHS to only those that exist. + paths=() + for p in "${PATHS[@]}"; do + test -r "${p}" && paths+=("${p}") + done + if ((${#paths[@]} == 0)); then + io::log "No paths to cache found." + return 0 + fi + io::log "Saving ( ${paths[*]} ) to ${PRIMARY_CACHE_URL}" + du -sh "${paths[@]}" + # We use a temp file here so gsutil can retry failed uploads. See #6508. + tmpd="$(mktemp -d)" + tmpf="${tmpd}/cache.tar.gz" + tar -czf "${tmpf}" "${paths[@]}" + gsutil cp "${tmpf}" "${PRIMARY_CACHE_URL}" + gsutil stat "${PRIMARY_CACHE_URL}" + rm "${tmpf}" + rmdir "${tmpd}" +} + +function restore_cache() { + local urls=("${PRIMARY_CACHE_URL}") + if [[ -n "${FALLBACK_KEY}" ]]; then + urls+=("${BUCKET_URL}/${FALLBACK_KEY}/cache.tar.gz") + fi + for url in "${urls[@]}"; do + if gsutil stat "${url}"; then + io::log "Fetching cache url ${url}" + gsutil cp "${url}" - | tar -zxf - || continue + break + fi + done + return 0 +} + +io::log "====> ${PROGRAM_NAME}: $*" +readonly TIMEFORMAT="==> 🕑 ${PROGRAM_NAME} completed in %R seconds" +time { + case "$1" in + save) + save_cache + ;; + restore) + restore_cache + ;; + *) + print_usage + ;; + esac +} diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml new file mode 100644 index 00000000..7932a9c6 --- /dev/null +++ b/ci/cloudbuild/cloudbuild.yaml @@ -0,0 +1,107 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +timeout: 3600s +options: + workerPool: 'projects/cloud-cpp-testing-gcf/locations/us-east1/workerPools/functions-framework-cpp-pool' + dynamic_substitutions: true + env: [ + 'HOME=/h', + 'TZ=UTC0', + 'GOOGLE_CLOUD_BUILD=yes', + 'PROJECT_ID=${PROJECT_ID}', + 'BUILD_ID=${BUILD_ID}', + 'BRANCH_NAME=${BRANCH_NAME}', + 'COMMIT_SHA=${COMMIT_SHA}', + 'PR_NUMBER=${_PR_NUMBER}', + 'TRIGGER_TYPE=${_TRIGGER_TYPE}', + 'CONSOLE_LOG_URL=https://console.cloud.google.com/cloud-build/builds;region=us-east1/${BUILD_ID};tab=detail?project=${PROJECT_ID}', + 'RAW_LOG_URL=https://storage.googleapis.com/${_LOGS_BUCKET}/logs/functions-framework-cpp/${_TRIGGER_SOURCE}/${COMMIT_SHA}/${_DISTRO}-${_BUILD_NAME}/log-${BUILD_ID}.txt' + ] + volumes: + - name: 'home' + path: '/h' + +# Variables that can be overridden from the `gcloud builds ...` command using +# the `--substitutions=_FOO=bar` flag. +substitutions: + _DISTRO: 'fedora-34' + _BUILD_NAME: 'check-api' + _CACHE_BUCKET: '${PROJECT_ID}_cloudbuild' + _IMAGE: 'functions-framework-cpp/${_DISTRO}' + _TRIGGER_SOURCE: '${_PR_NUMBER:-main}' + _TRIGGER_TYPE: 'manual' + _LOGS_BUCKET: 'cloud-cpp-community-publiclogs' + +steps: + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + args: [ + '--log-format=text', + '--context=dir:///workspace/ci', + '--dockerfile=ci/cloudbuild/dockerfiles/${_DISTRO}.Dockerfile', + '--cache=true', + '--destination=gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID}', + '--push-retry=3', + ] + waitFor: ['-'] + timeout: 1800s + + # Pull the docker image. The step running 'ci/cloud/build.sh' would do this + # automatically, and also fill the log with about 2-3 pages of noise. + - name: 'gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID}' + entrypoint: '/bin/true' + + # Restores the homedir cache into /h in parallel with the previous step. + # Won't break the build if this step fails. + - name: 'gcr.io/cloud-builders/gsutil' + waitFor: [ '-' ] + entrypoint: 'bash' + dir: '/h' + args: + - '-c' + - > + /workspace/ci/cloudbuild/cache.sh restore + --bucket_url=gs://${_CACHE_BUCKET}/build-cache/functions-framework-cpp + --key=${_TRIGGER_SOURCE}/${_DISTRO}-${_BUILD_NAME}/h + --fallback_key=main/${_DISTRO}-${_BUILD_NAME}/h + || true + + # Remove the images created by this build. + - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + entrypoint: 'bash' + args: + - '-c' + - | + set +e + gcloud container images delete -q gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID} + exit 0 + + # The previous step may not run if the build fails. Garbage collect any + # images created by this script, and/or similar scripts in this repository. + # The main idea is to remove images created over 4 weeks ago. Because the + # current builds create images with current timestamps, such images are not + # likely to be in use. This step should not break the build on error, and it + # can start running as soon as the build does. + - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + waitFor: [ '-' ] + entrypoint: 'bash' + args: + - '-c' + - | + set +e + gcloud container images list-tags gcr.io/${PROJECT_ID}/${_IMAGE} \ + --format='get(digest)' --filter='timestamp.datetime < -P4W' | \ + xargs -r printf "gcr.io/${PROJECT_ID}/${_IMAGE}@%s\n" | \ + xargs -r -P 4 -L 32 gcloud container images delete -q --force-delete-tags + exit 0 diff --git a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile new file mode 100644 index 00000000..2ad62897 --- /dev/null +++ b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile @@ -0,0 +1,55 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM fedora:34 +ARG NCPU=4 + +# Installs the development tools needed by functions-framework-cpp and its +# dependencies. +RUN dnf makecache && \ + dnf install -y abi-compliance-checker autoconf automake \ + ccache clang clang-analyzer clang-tools-extra \ + cmake diffutils doxygen findutils gcc-c++ git \ + lcov libcxx-devel libcxxabi-devel \ + libasan libubsan libtsan libcurl-devel make ninja-build \ + openssl-devel patch python python3.8 \ + python-pip tar unzip w3m wget which zip zlib-devel + +# Installs Universal Ctags (which is different than the default "Exuberant +# Ctags"), which is needed by the ABI checker. See https://ctags.io/ +WORKDIR /var/tmp/build +RUN curl -sSL https://github.com/universal-ctags/ctags/archive/refs/tags/p5.9.20210418.0.tar.gz | \ + tar -xzf - --strip-components=1 && \ + ./autogen.sh && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd /var/tmp && rm -fr build + +# Installs the abi-dumper with the integer overflow fix from +# https://github.com/lvc/abi-dumper/pull/29. We can switch back to `dnf install +# abi-dumper` once it has the fix. +WORKDIR /var/tmp/build +RUN curl -sSL https://github.com/lvc/abi-dumper/archive/814effec0f20a9613441dfa033aa0a0bc2a96a87.tar.gz | \ + tar -xzf - --strip-components=1 && \ + mv abi-dumper.pl /usr/local/bin/abi-dumper && \ + chmod +x /usr/local/bin/abi-dumper + +WORKDIR /var/tmp/gcloud +ARG GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION="348.0.0" +ARG GOOGLE_CLOUD_CPP_SDK_SHA256="8341a9b21088fd382522be247c7e51c61d8ea4ff86e6ededfa601afd5223e153" +ENV TARBALL="google-cloud-sdk-${GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" +RUN curl -sSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${TARBALL}" -o "${TARBALL}" +RUN echo "${GOOGLE_CLOUD_CPP_SDK_SHA256} ${TARBALL}" | sha256sum --check - +RUN tar x -C /usr/local -f "${TARBALL}" diff --git a/ci/cloudbuild/trigger.sh b/ci/cloudbuild/trigger.sh new file mode 100755 index 00000000..1efdb96b --- /dev/null +++ b/ci/cloudbuild/trigger.sh @@ -0,0 +1,130 @@ +#!/bin/bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# This script manages Google Cloud Build triggers. The triggers are defined by +# yaml files that live in the `triggers/` directory. The `--generate=` +# argument creates files named `triggers/name-pr.yaml` and +# `triggers/name-pr.yaml`. These files can then be uploaded to GCB to start +# running with the `--import` flag. +# +# Usage: trigger.sh [options] +# +# Options: +# --generate=name Outputs CI and PR YAML configs for the named build +# -l|--list List all triggers for this repo on the server +# -d|--describe=name Describe the named trigger +# -i|--import=file Uploads the local yaml file to create/update a trigger +# -h|--help Print this help message + +set -euo pipefail + +source "$(dirname "$0")/../lib/init.sh" +source module ci/lib/io.sh + +function print_usage() { + # Extracts the usage from the file comment starting at line 17. + sed -n '17,/^$/s/^# \?//p' "${PROGRAM_PATH}" +} + +readonly CLOUD_PROJECT="cloud-cpp-testing-gcf" +readonly GITHUB_NAME="functions-framework-cpp" + +function generate_ci() { + local name="$1" + cat >"${PROGRAM_DIR}/triggers/${name}-ci.yaml" <"${PROGRAM_DIR}/triggers/${name}-pr.yaml" <` +if [[ ! "$PATH" =~ ${PROJECT_ROOT}/ci/lib ]]; then + # Changing PATH invalidates the Bazel cache, while this script runs at most + # once when called by a single script, it might be loaded again by a child + # script. + PATH="${PROJECT_ROOT}/ci/lib:${PATH}" +fi + +# Sets the module search path to only the PROJECT_ROOT to force sourced module +# paths to be relative to the project root, thus making it easy to find the +# actual file being sourced. This is similar to how C++ includes are all +# relative to the project root. +MODULE_SEARCH_PATH=( + "${PROJECT_ROOT}" +) diff --git a/ci/lib/io.sh b/ci/lib/io.sh new file mode 100755 index 00000000..b9e80f41 --- /dev/null +++ b/ci/lib/io.sh @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This bash library includes various I/O funtions, including logging functions. +# +# Example: +# +# source module /ci/lib/io.sh +# io::log_yellow "Hello world" + +# Make our include guard clean against set -o nounset. +test -n "${CI_LIB_IO_SH__:-}" || declare -i CI_LIB_IO_SH__=0 +if ((CI_LIB_IO_SH__++ != 0)); then + return 0 +fi # include guard + +# Callers may use these IO_* variables directly, but should prefer to use the +# logging functions below instead. For example, prefer `io::log_green "..."` +# over `echo "${IO_COLOR_GREEN}...${IO_RESET}"`. +if [ -t 0 ] && command -v tput >/dev/null; then + IO_BOLD="$(tput bold)" + IO_COLOR_RED="$(tput setaf 1)" + IO_COLOR_GREEN="$(tput setaf 2)" + IO_COLOR_YELLOW="$(tput setaf 3)" + IO_RESET="$(tput sgr0)" +else + IO_BOLD="" + IO_COLOR_RED="" + IO_COLOR_GREEN="" + IO_COLOR_YELLOW="" + IO_RESET="" +fi +readonly IO_BOLD +readonly IO_COLOR_RED +readonly IO_COLOR_GREEN +readonly IO_COLOR_YELLOW +readonly IO_RESET + +export CI_LIB_IO_FIRST_TIMESTAMP=${CI_LIB_IO_FIRST_TIMESTAMP:-$(date '+%s')} + +# Prints the current time as a string. +function io::internal::timestamp() { + local now + now=$(date '+%s') + local when=(-d "@${now}") + case "$(uname -s)" in + Darwin) when=(-r "${now}") ;; + esac + echo "$(date "${when[@]}" -u '+%Y-%m-%dT%H:%M:%SZ')" \ + "$(printf '(%+ds)' $((now - CI_LIB_IO_FIRST_TIMESTAMP)))" +} + +# Logs a message using the given terminal capability. The first argument +# must be one of the IO_* variables defined above, such as "${IO_COLOR_RED}". +# The remaining arguments will be logged using the given capability. The +# log message will also have an RFC-3339 timestamp prepended (in UTC). +function io::internal::log_impl() { + local termcap="$1" + shift + local timestamp + timestamp="$(io::internal::timestamp)" + echo "${termcap}${timestamp}: $*${IO_RESET}" +} + +# Logs the given message with normal coloring and a timestamp. +function io::log() { + io::internal::log_impl "${IO_RESET}" "$@" +} + +# Logs the given message in green with a timestamp. +function io::log_green() { + io::internal::log_impl "${IO_COLOR_GREEN}" "$@" +} + +# Logs the given message in yellow with a timestamp. +function io::log_yellow() { + io::internal::log_impl "${IO_COLOR_YELLOW}" "$@" +} + +# Logs the given message in red with a timestamp. +function io::log_red() { + io::internal::log_impl "${IO_COLOR_RED}" "$@" +} + +# Logs the given message in bold with a timestamp. +function io::log_bold() { + io::internal::log_impl "${IO_BOLD}" "$@" +} + +# Logs the arguments, in bold with a timestamp, and then executes them. +# This is like executing a command under "set -x" in the shell (including +# the ${PS4} prefix). +function io::run() { + local cmd + cmd="$(printf ' %q' "$@")" + io::log_bold "${PS4}${cmd# }" + "$@" +} + +# Logs an "H1" heading. This looks like a blank line and the current time, +# followed by the message in a double-lined box. +# +# 2021-06-04T17:16:00Z +# ======================================== +# | This is an example of io::log_h1 | +# ======================================== +function io::log_h1() { + local timestamp + timestamp="$(io::internal::timestamp)" + local msg="| $* |" + local line + line="$(printf -- "=%.0s" $(seq 1 ${#msg}))" + printf "\n%s\n%s\n%s\n%s\n" "${timestamp}" "${line}" "${msg}" "${line}" +} + +# Logs an "H2" heading. Same as H1, but uses a single-lined box. +# +# 2021-06-04T17:16:00Z +# ---------------------------------------- +# | This is an example of io::log_h2 | +# ---------------------------------------- +function io::log_h2() { + local timestamp + timestamp="$(io::internal::timestamp)" + local msg="| $* |" + local line + line="$(printf -- "-%.0s" $(seq 1 ${#msg}))" + printf "\n%s\n%s\n%s\n%s\n" "${timestamp}" "${line}" "${msg}" "${line}" +} diff --git a/ci/lib/module b/ci/lib/module new file mode 100755 index 00000000..2d44947e --- /dev/null +++ b/ci/lib/module @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This bash library (even though it doesn't have the .sh extension) will be +# found when callers type `source module ` because init.sh added this +# directory to the caller's PATH. The argument specified on the `source` +# line will be passed to this library as '$1'. We'll look for the caller's +# library by searching the MODULE_SEARCH_PATH array. +# +# This library does not use an include guard because it can, and should, be +# sourced many times. Therefore, this library must not define any global +# variables or functions. + +if [[ -z "${MODULE_SEARCH_PATH[0]:-}" ]]; then + echo >&2 \ + "No MODULE_SEARCH_PATH set. " \ + "Did you forget to source init.sh, maybe from $0?" + exit 1 +fi + +for dir in "${MODULE_SEARCH_PATH[@]}"; do + if [[ -r "${dir}/$1" ]]; then + source "${dir}/$1" + return 0 + fi +done + +echo >&2 "Unable to find module '$1' in search path: ${MODULE_SEARCH_PATH[@]}" +exit 1 From 21ff5cb6f30cbd44db08af9fe1f0ee7444c77982 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 8 Sep 2021 14:58:52 -0700 Subject: [PATCH 08/77] doc: update next version to v1.0.0 (#325) --- CHANGELOG.md | 4 ++- CMakeLists.txt | 2 +- README.md | 25 ++++++++----------- .../cloud/functions/internal/version_info.h | 4 +-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81930288..a468614d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Changelog -## v0.7.0 - TBD +## v1.0.0 - 2021-09 + + ## v0.6.0 - 2021-08 diff --git a/CMakeLists.txt b/CMakeLists.txt index c7307a92..1c1b9e92 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ set(PACKAGE_BUGREPORT "http://github.com/GoogleCloudPlatform/functions-framework-cpp") project( functions-framework-cpp - VERSION 0.7.0 + VERSION 1.0.0 DESCRIPTION "Functions Framework for C++" LANGUAGES CXX) diff --git a/README.md b/README.md index f68b5f30..4673067f 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,6 @@ https://cloud.google.com/run/docs/quickstarts/build-and-deploy [quickstart-cloud-run]: /examples/site/howto_deploy_to_cloud_run/README.md [quickstart-pubsub]: /examples/site/howto_deploy_cloud_event/README.md -> :warning: This is not ready for production. Expect breaking changes. -> We're sharing our progress with the developer community and appreciate -> your feedback. Feel free to start a [discussion][github-discussions] to share -> thoughts or open [issues][github-issue] for bugs. - |Functions Framework|Unit Tests|Lint Test|Conformance Tests| |---|---|---|---| | [C++][github-repo] | [![][ff_cpp_unit_img]][ff_cpp_unit_link] | [![][ff_cpp_lint_img]][ff_cpp_lint_link] | [![][ff_cpp_conformance_img]][ff_cpp_conformance_link] | @@ -100,8 +95,10 @@ See more demos under the [examples] directory. ## Versions and Status -> :warning: This library is considered **experimental** its API and other -> interfaces are subject to change without notice. +This library is considered generally available. We do not expect breaking +changes to its public APIs. See [below](#public-api-and-api-breaking-changes) +for a description of what is included in the public API, and what parts of the +library may change without notice. This library does **not** follow the [Semantic Versioning](https://semver.org) conventions. @@ -137,7 +134,7 @@ will announce these changes prominently in our `CHANGELOG.md` file and in the affected release's notes. Nevertheless, though we take commercially reasonable efforts to prevent this, it is possible that backwards incompatible changes go undetected and, therefore, undocumented. We apologize if this is the case and -welcome feedback or bug reports to rectify the problem. +welcome feedback (or bug reports) to rectify the problem. By "API" we mean the C++ API exposed by public header files in this repo. We are not talking about the gRPC or REST APIs exposed by Google Cloud servers. We @@ -152,10 +149,10 @@ We request that our customers adhere to the following guidelines to avoid accidentally depending on parts of the library we do not consider to be part of the public API and therefore may change (including removal) without notice: -* You should only include headers matching the `google/cloud/framework/*.h`, - or `google/cloud/framework/mock/*.h` patterns. +* You should only include headers matching the `google/cloud/functions/*.h`, + or `google/cloud/functions/mock/*.h` patterns. * You should **NOT** directly include headers in any subdirectories, such as - `google/cloud/framework/internal`. + `google/cloud/functions/internal`. * The files *included from* our public headers are **not part of our public API**. Depending on indirect includes may break your build in the future, as we may change a header "foo.h" to stop including "bar.h" if "foo.h" no longer @@ -182,13 +179,13 @@ name of some object in the file system. As with the C++ API, we try to avoid breaking changes to these interface points. Sometimes such changes yield benefits to our customers, in the form of -easier-to-understand what names go with with services, or more consistency +easier-to-understand what names go with services, or more consistency across services. When these benefits warrant it, we will announce these changes prominently in our `CHANGELOG.md` file and in the affected release's notes. Nevertheless, though we take commercially reasonable efforts to prevent this, it is possible that backwards incompatible changes go undetected and, therefore, undocumented. We apologize if this is the case and welcome feedback -or bug reports to rectify the problem. +(or bug reports) to rectify the problem. ### Experimental Libraries @@ -222,7 +219,7 @@ We try to provide stable names for the previously described mechanisms: * CMake targets loaded via `find_package()`, * pkg-config modules -It is certainly possible to use the the library through other mechanisms, +It is certainly possible to use the library through other mechanisms, and while these may work, we may accidentally break these from time to time. Examples of such, and the recommended alternatives, include: diff --git a/google/cloud/functions/internal/version_info.h b/google/cloud/functions/internal/version_info.h index f17401e6..fb980c9d 100644 --- a/google/cloud/functions/internal/version_info.h +++ b/google/cloud/functions/internal/version_info.h @@ -15,8 +15,8 @@ #ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 0 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 7 +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 1 +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 0 #define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H From cf557acb4f014ce28b6366d2e729d940e9b26e65 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 9 Sep 2021 06:06:42 -0700 Subject: [PATCH 09/77] doc: prepare for v1.0.0 release (#326) Updated the CHANGELOG.md file and the API baseline. --- CHANGELOG.md | 6 ++++++ ...nctions_framework_cpp.expected.abi.dump.gz | Bin 89909 -> 89907 bytes 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a468614d..ce690503 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,14 @@ # Changelog +## v1.1.0 - TBD + ## v1.0.0 - 2021-09 +We are pleased to announce that the C++ Functions Framework is +now generally available (GA). We think the code is ready for +production use, and that the public APIs are stable. +* fix: use correct version macro for pkg-config (#322) ## v0.6.0 - 2021-08 diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz index 8ad4bc327c4af22285cade2750e2c935169e9791..82a724caa79ab7e7f653e2222ed251d69feb3ffc 100644 GIT binary patch delta 62484 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

Y-2wfd-HW1_7{-*c|z9N|R$s0)#WIBBG%n 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≫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 JQSh;D835b^$728h delta 62510 zcmYhhQ*fYNu(loBwrz7_XJRK4V`7_6Y}>Xmv7JnuOl;fs|L*zH01;;(uMz<0G0L06`aWR*BuAQ$a$4ubLzbE z{3~grz5Omd2U%h6`g-EdgJt-{Dh)(3_IjgA)5>MdA(_mT z(UCBVLqq8K(!L~;(e?s8oI$-=t}c8d!HNT8YinqLAD8wra9IPJV8K}Va!kA3#PwX12govV^)~+XC4(l2i9!##o90_Sm|-D3IS9A zcD9mV#k#WXt2FZ2nLu=Dta?p7aUX8=lE#l4$SPUNF+)qp5>B?qE|e4iEe>3@YJPvZ zdj6hbq&XD@=;VD;CJduL9Ler3p?6f)fnPFNJU;)sdZTlKJF}8I5!)DcE^Kznpo#c6 zoH=|(Z+NLnjbSVNCK;uQUp41+9HRl{qWYY$rNr;pZMxGBYMsA7hrp#$QuOYpI`u>r zyt>FKGa;k9AzcFcrvhv+mgaU_?0PN>-QzM!KH$D6!rp$``M};r!>$C?+8eV-TFWx)0m`=neh?`u1%MjT?(0|8kHn6`bbstQ2wV!nDH4 zc_wS!*2I7+JIN)3`tm zD3AJeBt@e@J#Ld|XV{??Fuzc^uAVivFp-9wp#9Xo{_94p_J&2{zrkXIw@lDDkbkaZG!+7w+J9w=)l+4*5jlUnJxwiKc*u8v- znJJQ*D~n*pb<#v~FOof->~KgZ6p1fofV)4c9s0zKVC7jZt~HbQpmc~}*4r%Xh^eY+EZ)fsc6lJv$zUasu8b(_L)zJ}Onqmz7QtQc;xqi{ChU zj;x>c0$A2>XVaHc^VBc<4e01~vYwh}w)eH77Mdyx>Wij}_ervPy1z7%d-c&{0MKN! zPb<+}lE^?)BaOtjPle&T{SfT@m{d4N!Coia(p!dpjHWlOYp@N(#=oi(ltd|Rc+P|sH<~A1qyK5s-;k% zAzJ@DeZtTd)YImqFE2g#@va)i6Y}JPWJSRffK+b5T69Ci#B+4 zHv5<-W}={Kr92$Uh_1fonlhh~Hz~e$tS9}0b@b%ToF1R<`g|b?kFmEmU^=>x=7^1O zT{iK!T;f`L@+=z}R@IegJWf|<&|cs)ru|>& zEtJS@=#i(=uB@qocb*088Lm7k9;x&MrK1k zq@=D@YIGTb3}dBn2bpM){JhjZL~XC=Hhu(OdMM5=(6$DWaKO=dY=gAsK)5a$Hy8Kt@e@y0V zU7k+tU}lnLfL7U2* zAu_hjOY@B5>TKMz(FP0q9g^`gHpF1_WkSqYC_zo zsxkwCZk6`8+^wtTPN!zqRJK}$sWwaCI=ds`b=L9HMpvKd#EM{IIrh@5r{i@llgkbX z-wn9(;OG)Qw)4YLyl6I>xuTs4J0BlLwb{^NERSH|2O4z+v=S<~Q-~l-=973Z1FO#a zSca?!1m!3%-sotepHydb3DeVxC=+G6G9Yc)31Wr7E^U~fzT_>*+8+vy8kKGx*3R`- z$*!Rg(L(1hD`X!(ql)1Ln!aI2 zwcVblw$gGZ!kac~Q3l{`X#M!4V8#tOSHq|Q^XlH1Y5dREQ_+iS6tFJEXPCLV`z`e4}NtRZMxOX0=UF&Ma9|MQ07DXqkl1K3js%mTK3mn(SV~dj9e|+}g*? z$?|@`?4hgByxLSf-6r{qneOelw4(Z6RtwZIWBg|OxrHlM+&+<+rA*6TmR5u?D&UZF zA*jDF(v;?9n2=?UXMksIm{#dv4~#6}E8;Jy^)6dBGvAkQEi6G8*V#LO=C7--&5wt1 z*wsqgCw@eNn(%wR+Q^+=PMY6GIZyz#-RgXweMOzMZev@wJ@;2(MVg&y9r`__cBFgt z6*LC}HZs%t>5R=+-F0T+>%_V6oRQaKz%aEr7|!4> zl7E;W*bMIMg!!IQDf+fJdGpEQaZea{`0lN>cNW>W8;#=59@>DTwKTpzWM?I zNxDxypL$Bf?{!%ryw4jOdF^C5mM^F|AyOZ%NA(N*%MHqVxOS5s^lep&W&~@?)dxPM zHCPq;;LzhtkW=SShi~jNpno%@k1&aUZ4l70XbAFTp`s$8B68fD4TG|Fqm{neqzs)A z?|5*;tA%tz5pqeOcqZyfixnMqXLtk0-!(-&@g|$4bzR;aCnI)UjuK$_C#z@W);Lu5 zF4DPq1%OXa-8d!`xKBFDHr`ql?;yCkE8} zkKBX199uL%4d`M5;1N>$CKUvD{JJxR8kye1xqm}N8x75v1jz4CakX!96RxkT4|8Es zlgLbDGmPH+k!@}i*Nk?~I&8>TOQ1T`W7|9Ls8BG#eY;VzdIf$#V^jv1} zR)b@FcjZ9&{qQHr))iDku3pXNFDU3$1)3%!uxGeyj;~h$$Vn|Ow~E-i)u_ODv2upd zSLF+>i*=$2s-tNgx5OiRD!dNVpH%PQWmM;}zeP7M<6c^oGqW$#weW4d4AssZsEqI$ z97!GV*={yioOWmwx+FJ_c-KukeA)R2O@pn4JVNc7a_}uxtHvR1p&7$qOI>z$hre+8 zaW`s8P=P3n z;PiL|nBN@%U4|(Nl%uc0akOI!Y{ETGx|sB$Z%6NdemMHKDVQN8NU;mePZ5Nwx(#cd zy6%h64@4cuQ~5T-k4q$tZ!_)!at&~=L6#hH%+T(`CGzZZ7(bUOM~>n4vVfjlif}O& zk_C^0gbTB#n!MQqyo^~bVXG3EU5C;i9v#}x*%n_n&}cv_xVME)L ziP|wCwXdGX^Do>CG&+6aT1bfsCF4wRrDfmt(|^~Jfp%51axD8Rd;~_z)=l>#p62Jl ze?+0Ic+8s_h^>cd#&Eq*^WF zx@NuP=WZx&!O)Cc1{UPtq&?0kdO19IhC80Fu+P`R^s7yt1vjT#B*yaVJOc7Auy)*c z!msi3^#rNv_!lQFEI@Kw3G6D>?=0~Y{b)sZPvk-_!mBjkl!oTuW_SuaZfOzNABhutC-AM(>QHA^Q{Qe-`xX@!;u2_MQf%DnJ`7apK~p)*KH(^X9N|> z&O6nZg=0K#4$@=c!M11osi(zvmZ>2d@PAzi`*V3ZCZtg(hgdYM8S7#12^YSKQVS|5 zUl5II*}kC?mYnD*u#XPh;syW25Z;mkN+B8^mz*ZxK-<@`J(_mgkVnqmh7Zl|_8M1W zQklo552Nax{pK9C{q6gvqb|`M)HXtCHp;bvY3|C~z^nXi8o>X1vFCiYLe{1LOb!Qo z7)yp`mh*8D-?F~Xs1K<+ZD*x01auu_yU=99ezGBlw3T<*7livSHh=cmE=D5Y*a)*N zF4w!bvjvx!(bZc1AngFhXV0nl9{DJ&YcmocqZ)E#4L8H?u}khkcL;qxAzldcB!32P>k>bRJbYP! zJ$*55r}9~}(Ss0YBl=@g{{GM3bEau1eyy!lbZ3yHpCULH!&n^`uGy9Fn;foDOE31g zFofhyWw{(DAVtLLbgO;U@Aa$jE?O%49jnMvz9c8l?n#^0*c^Ji zvaiz*NEY(eTt;1BGK46F-237ej2d}QPK*oI)2dwGotm$-I?Hn4*nMy=C3X%7#xBJ& zGKSDKl5nH5n@`r$W|!ZU;POYOr0K?4`PT1q$@BJ?j=JMtZ2tn2!YYoiGgQ`LWVBZB zDJUIh6i-Y8s1eXc5&4W}(wdZGsLts0yskw@o%QKDLl&{s2sYWKWtXp&@8~#%_O;z; z61%oeN`)j^9XRl>y)+(7m+?(xAMpH#)gXEM8Ke>vWV7Vm+9?q77--*uXvQ=}X_=A5 z7)+`2@=Txf`h-Bow-Z7?Yb2tQp^LHTx~@1WSqBogP4_m5SKya<)H@{_Y$9|Vf1)5S zH1$=(rh5hqctqZ&4G1EnF|;?SG&5)^4Ni)8M}F#nH1e*oBDJiS z*o<#*q5oWi)x+P;faAnpint2*7{hFlf+?nQpR(JeJC4ANc_fMV9JL8V7QdbEj8?sJ z*Bk2h)8^v>d{mSE$ko!Y7|n`XAl|xQ#{z2cR4e0Mf$)-ZxSW5n=6WZQhqgU0z}z~+ zkjjyW0DbWN(OHR zMkt9^gd2duVza&nC1!^ilhmH}w`R&=yh*B&=f!RO_s&6090s(aFAccG>adJ##4sC| zJi%KYSh-Nv7JSu4Gfj&886Nc{fl7)ROQ+=DE<9kop86A-DCU96fE}0n-c+@_Re*U% z6!XlS8E&NutXLs%jI-@eqgYUI-P!^+F7IS#D|(qqIz2<^yeZXuhh^gAKwt+$9p$O9 zMxP{`5kF>Fi66DIL3D|vH9DmeI=V4K#&Avzu48;n8}2VhIUj)hO0i`x{pDMdAS$D_ zng;NmfI6CNWZLroE?Ec17Nf| zHgy@V>or@XJIR_F#dCp`565mAgAy!-{|VVHm-aYCnUX;j84Z>tPIr!J=gj*j>KZY| zjO&)}!@AX=9-VNVT{R(kiZ0>rTJ=%9lnHvpBz}|!$I{V)7XKu7>M#Xf>MO?+PTjX{ zaP9hEQ99yZqPjNY4e3n|WQh%cU(TNQXY|mTE}k{=l(94`C{MW|`T8D>H+`}(<$6f_ zC8`bI+9BImr*jM^Ej3xjZ&E+5{XNPY$K^L4eQy{7q8RyNHv5bAeQwt?Ptru4kvEpW zhb<;ZMzCv0Ial^v{_LfUhuJ@7`|Pvtq|eIrU|c@U2%Av121%+_RfD;}yh#l;G?(-E2#5PD+eD~>5P87qi_RI5u=Oh%ANtBjSt! zC|g!dOiws?6svbKq)U%QJ|9U7f+kkHFrM+)0A*kJkoXT=X;(6Q?H)wX943Tel5_C# z;Q16Bm+qJ-Zi8z;Y$z_)jbv|f_yWwfkL+!rucA}Eb-uPDMPWZ5#E-q}?SE`JAH8>6cp-%z>5c~g^1F?H;Yq;_1 zO-vCx`3D@${%Z?bhKAAc@S4zJ$e1cO`d^bS9L&z~r3aA|0+bMf97oKjkoWRhcH49@ zFsES@(C(9+vA=qFU_%AD+PY;=X96*YYx3SK0du@u$Haxb?EqsHF)2sM4)No(?AK2~RV@V3s&@4!Sy`289dv2q*lCrtPiuNyhPB{X4w^ z&nTlLgh~r4q5w6~_sZ_y6mpWABZ|#JvUmU`Jpq$w(~Olyv9J6N0=3^|Jp!91I78F8 z0YAfewOR5pKFR8+E)}k|mWzN$*Xqk0S{MfzkI8@aKT)k7U-%cJ1@wKZD96+{VPD36 zvztTcdmz#dLv!}HUjboyjhuPnuH<9i6YBl;#R&x;*`K9QHy89v9QkK-z1fVSPWTgq zXAHgBRV)4^-(g78CAM6V((`9+g8i5kg^VFw%d!lXH>F_uW%S?hnRB^

))&;e7MLo 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 O3jY5mBeN#4ZW#bLU6l*~ From bbec09f5c620876193e9d5c1fd7547cb1ecf8d78 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 9 Sep 2021 07:23:16 -0700 Subject: [PATCH 10/77] chore: update version post v1.0.0 (#327) --- CMakeLists.txt | 2 +- google/cloud/functions/internal/version_info.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c1b9e92..40b2249e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ set(PACKAGE_BUGREPORT "http://github.com/GoogleCloudPlatform/functions-framework-cpp") project( functions-framework-cpp - VERSION 1.0.0 + VERSION 1.1.0 DESCRIPTION "Functions Framework for C++" LANGUAGES CXX) diff --git a/google/cloud/functions/internal/version_info.h b/google/cloud/functions/internal/version_info.h index fb980c9d..4fb2d171 100644 --- a/google/cloud/functions/internal/version_info.h +++ b/google/cloud/functions/internal/version_info.h @@ -16,7 +16,7 @@ #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 1 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 0 +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 1 #define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H From 98ed8f25ea3f13ab122c8c97bf6074d131e2f5d1 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 9 Sep 2021 07:48:44 -0700 Subject: [PATCH 11/77] doc: update instructions to create a release (#328) --- release/cutting-a-release.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/release/cutting-a-release.md b/release/cutting-a-release.md index a0ff6439..fcbfee1a 100644 --- a/release/cutting-a-release.md +++ b/release/cutting-a-release.md @@ -5,7 +5,7 @@ developers in the `functions-framework-cpp` project. [GitHub repository]: https://github.com/GoogleCloudPlatform/functions-framework-cpp [GitHub workflow]: https://github.com/googleapis/google-cloud-cpp/blob/main/doc/contributor/howto-guide-forks-and-pull-requests.md -[#317]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/317 +[#326]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/326 [#318]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/318 [GCP builpacks]: https://github.com/GoogleCloudPlatform/buildpacks/ @@ -36,7 +36,17 @@ git remote add upstream https://github.com/GoogleCloudPlatform/functions-framewo git fetch upstream ``` -## Updating CHANGELOG.md +## Updating CHANGELOG.md and the API baseline + +We keep a dump of the ABI in the repository. One of our CI builds uses this baseline to detect API breaks (and yes, we +dump the A**B**I, but try to detect only A**P**I breaks). Before each release we need to update this baseline to detect +any future breaks. Running the CI build locally, on your workstation, updates the baseline: + +```sh +ci/cloudbuild/build.sh --trigger check-api-pr +``` + +This will create a new baseline file in `ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz`. Update the local `CHANGELOG.md` file with a **user-level** description of the changes. Do not think of this as a chore that could be replaced with a summary generated from GitHub. This is an opportunity to write a summary of the changes @@ -46,11 +56,12 @@ you a start for this document, but the output is just a reminder, not the actual ```sh last_tag="$(git describe --tags --abbrev=0 upstream/main)" -git log --no-merges --format="format:%s" "${last_tag}"..HEAD upstream/main +git log --no-merges --format="format:%s" "${last_tag}"..HEAD upstream/main | grep -E -v '^(refactor|cleanup|ci)' ``` -Remember to leave room in the `CHANGELOG.md` for the changes related to the next release. Send a PR with the changes to -`CHANGELOG.md` to update the main repository. An example from a previous release is [#317] +Remember to leave room in the `CHANGELOG.md` for the changes related to the next release. + +Send a PR with the changes to `CHANGELOG.md` and the API baseline. An example from a previous release is [#326] ## Create the GitHub release From caebc9c1746ca1ae8162c5a41731bb2359ecc470 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Fri, 10 Sep 2021 08:33:28 -0700 Subject: [PATCH 12/77] ci: update vcpkg version (#330) --- .github/workflows/build.yaml | 3 +-- .github/workflows/coverage.yaml | 2 +- .github/workflows/sanitize.yaml | 2 +- .github/workflows/style.yaml | 2 +- build_scripts/Dockerfile | 2 +- build_scripts/pack/build.in | 2 +- ci/pack/buildpack/bin/build | 2 +- pack/buildpack/bin/build | 2 +- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 370d4023..01adf846 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -6,8 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "7e396645d919f463ef6f0f2ad6a8c5272c1f9b27" - VCPKG_TOOL_VERSION: "2021-02-24-d67989bce1043b98092ac45996a8230a059a2d7e" + vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" jobs: build-ubuntu-focal: diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 9e2edd1a..d6251621 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "7e396645d919f463ef6f0f2ad6a8c5272c1f9b27" + vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" jobs: coverage: diff --git a/.github/workflows/sanitize.yaml b/.github/workflows/sanitize.yaml index 746603a8..56c25452 100644 --- a/.github/workflows/sanitize.yaml +++ b/.github/workflows/sanitize.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "7e396645d919f463ef6f0f2ad6a8c5272c1f9b27" + vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" jobs: sanitized-build: diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index d4819db0..afd33f49 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "7e396645d919f463ef6f0f2ad6a8c5272c1f9b27" + vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" jobs: clang-tidy: diff --git a/build_scripts/Dockerfile b/build_scripts/Dockerfile index b9aa97cf..e0d34072 100644 --- a/build_scripts/Dockerfile +++ b/build_scripts/Dockerfile @@ -73,7 +73,7 @@ RUN curl -sSL https://github.com/ninja-build/ninja/releases/download/v1.10.2/nin chmod 755 /usr/local/bin/ninja WORKDIR /usr/local/vcpkg -RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/9b9a6680b25872989c8eb0303d670f32e5cfe6a4.tar.gz | \ +RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ tar -xzf - --strip-components=1 && \ ./bootstrap-vcpkg.sh -disableMetrics -useSystemBinaries && \ rm -fr toolsrc/build.rel downloads/* diff --git a/build_scripts/pack/build.in b/build_scripts/pack/build.in index 24ba6121..1e0c9521 100644 --- a/build_scripts/pack/build.in +++ b/build_scripts/pack/build.in @@ -16,7 +16,7 @@ fi if [[ ! -d "${VCPKG_ROOT}" ]]; then echo "-----> Install vcpkg" mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/9b9a6680b25872989c8eb0303d670f32e5cfe6a4.tar.gz | \ + curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ set(VCPKG_BUILD_TYPE release) diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index a135ed20..78c228db 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -35,7 +35,7 @@ fi if [[ ! -d "${VCPKG_ROOT}" ]]; then echo "-----> Install vcpkg" mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/9b9a6680b25872989c8eb0303d670f32e5cfe6a4.tar.gz | \ + curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ set(VCPKG_BUILD_TYPE release) diff --git a/pack/buildpack/bin/build b/pack/buildpack/bin/build index 6a01bda1..d2bbb73d 100755 --- a/pack/buildpack/bin/build +++ b/pack/buildpack/bin/build @@ -35,7 +35,7 @@ fi if [[ ! -d "${VCPKG_ROOT}" ]]; then echo "-----> Install vcpkg" mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/9b9a6680b25872989c8eb0303d670f32e5cfe6a4.tar.gz | \ + curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ set(VCPKG_BUILD_TYPE release) From d5cfcaf04e066b20b518d05e665f2422f0471af3 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Mon, 18 Oct 2021 10:36:19 -0400 Subject: [PATCH 13/77] doc: explain why we pass by value (#333) --- examples/hello_cloud_event/hello_cloud_event.cc | 2 ++ examples/hello_from_namespace/hello_from_namespace.cc | 2 ++ .../hello_from_nested_namespace/hello_from_nested_namespace.cc | 2 ++ examples/hello_gcs/hello_gcs.cc | 2 ++ examples/hello_multiple_sources/hello_multiple_sources.cc | 2 ++ examples/hello_with_third_party/hello_with_third_party.cc | 2 ++ examples/hello_world/hello_world.cc | 2 ++ examples/site/hello_world_error/hello_world_error.cc | 2 ++ examples/site/hello_world_get/hello_world_get.cc | 2 ++ examples/site/hello_world_pubsub/hello_world_pubsub.cc | 2 ++ examples/site/hello_world_storage/hello_world_storage.cc | 2 ++ examples/site/testing_storage/README.md | 2 +- 12 files changed, 23 insertions(+), 1 deletion(-) diff --git a/examples/hello_cloud_event/hello_cloud_event.cc b/examples/hello_cloud_event/hello_cloud_event.cc index 03a6289a..0e1141d0 100644 --- a/examples/hello_cloud_event/hello_cloud_event.cc +++ b/examples/hello_cloud_event/hello_cloud_event.cc @@ -17,6 +17,8 @@ using ::google::cloud::functions::CloudEvent; +// Though not used in this function, `event` is passed by value to support +// applications that move-out its data. void HelloCloudEvent(CloudEvent event) { // NOLINT std::cout << "Received event" << "\n id: " << event.id() diff --git a/examples/hello_from_namespace/hello_from_namespace.cc b/examples/hello_from_namespace/hello_from_namespace.cc index 91e4fa5e..f51831ae 100644 --- a/examples/hello_from_namespace/hello_from_namespace.cc +++ b/examples/hello_from_namespace/hello_from_namespace.cc @@ -20,6 +20,8 @@ namespace hello_from_namespace { using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloWorld(HttpRequest) { // NOLINT return HttpResponse{} .set_header("Content-Type", "text/plain") diff --git a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc index aa7de8ef..28ac80f8 100644 --- a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc +++ b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc @@ -20,6 +20,8 @@ namespace hello_from_nested_namespace::ns0::ns1 { using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloWorld(HttpRequest) { // NOLINT return HttpResponse{} .set_header("Content-Type", "text/plain") diff --git a/examples/hello_gcs/hello_gcs.cc b/examples/hello_gcs/hello_gcs.cc index 0a3540a9..27add042 100644 --- a/examples/hello_gcs/hello_gcs.cc +++ b/examples/hello_gcs/hello_gcs.cc @@ -21,6 +21,8 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; namespace gcs = ::google::cloud::storage; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloGcs(HttpRequest request) { // NOLINT auto error = [] { return HttpResponse{}.set_result(HttpResponse::kBadRequest); diff --git a/examples/hello_multiple_sources/hello_multiple_sources.cc b/examples/hello_multiple_sources/hello_multiple_sources.cc index 03330730..99bc70b1 100644 --- a/examples/hello_multiple_sources/hello_multiple_sources.cc +++ b/examples/hello_multiple_sources/hello_multiple_sources.cc @@ -19,6 +19,8 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloMultipleSources(HttpRequest) { // NOLINT return HttpResponse{} .set_header("Content-Type", "text/plain") diff --git a/examples/hello_with_third_party/hello_with_third_party.cc b/examples/hello_with_third_party/hello_with_third_party.cc index bcd5428e..3907e1a9 100644 --- a/examples/hello_with_third_party/hello_with_third_party.cc +++ b/examples/hello_with_third_party/hello_with_third_party.cc @@ -19,6 +19,8 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloWithThirdParty(HttpRequest request) { // NOLINT return HttpResponse{} .set_header("Content-Type", "text/plain") diff --git a/examples/hello_world/hello_world.cc b/examples/hello_world/hello_world.cc index b93ab818..4dbe0a5d 100644 --- a/examples/hello_world/hello_world.cc +++ b/examples/hello_world/hello_world.cc @@ -18,6 +18,8 @@ using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. HttpResponse HelloWorld(HttpRequest) { // NOLINT return HttpResponse{} .set_header("Content-Type", "text/plain") diff --git a/examples/site/hello_world_error/hello_world_error.cc b/examples/site/hello_world_error/hello_world_error.cc index f3cbda42..0bf7cb70 100644 --- a/examples/site/hello_world_error/hello_world_error.cc +++ b/examples/site/hello_world_error/hello_world_error.cc @@ -20,6 +20,8 @@ namespace gcf = ::google::cloud::functions; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. gcf::HttpResponse hello_world_error(gcf::HttpRequest request) { // NOLINT if (request.target() == "/return500") { // An error response code does NOT create entries in Error Reporting diff --git a/examples/site/hello_world_get/hello_world_get.cc b/examples/site/hello_world_get/hello_world_get.cc index 022631c8..973c731e 100644 --- a/examples/site/hello_world_get/hello_world_get.cc +++ b/examples/site/hello_world_get/hello_world_get.cc @@ -18,6 +18,8 @@ namespace gcf = ::google::cloud::functions; +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. gcf::HttpResponse hello_world_get(gcf::HttpRequest) { // NOLINT return gcf::HttpResponse{} .set_header("content-type", "text/plain") diff --git a/examples/site/hello_world_pubsub/hello_world_pubsub.cc b/examples/site/hello_world_pubsub/hello_world_pubsub.cc index 16fcac98..779ef27d 100644 --- a/examples/site/hello_world_pubsub/hello_world_pubsub.cc +++ b/examples/site/hello_world_pubsub/hello_world_pubsub.cc @@ -20,6 +20,8 @@ namespace gcf = ::google::cloud::functions; +// Though not used in this example, the event is passed by value to support +// applications that move-out its data. void hello_world_pubsub(gcf::CloudEvent event) { // NOLINT if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; diff --git a/examples/site/hello_world_storage/hello_world_storage.cc b/examples/site/hello_world_storage/hello_world_storage.cc index db9c6d4c..4687288a 100644 --- a/examples/site/hello_world_storage/hello_world_storage.cc +++ b/examples/site/hello_world_storage/hello_world_storage.cc @@ -19,6 +19,8 @@ namespace gcf = ::google::cloud::functions; +// Though not used in this example, the event is passed by value to support +// applications that move-out its data. void hello_world_storage(gcf::CloudEvent event) { // NOLINT if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; diff --git a/examples/site/testing_storage/README.md b/examples/site/testing_storage/README.md index fa81ff06..c8b1e978 100644 --- a/examples/site/testing_storage/README.md +++ b/examples/site/testing_storage/README.md @@ -18,7 +18,7 @@ We will use this function throughout this guide: namespace gcf = ::google::cloud::functions; -void hello_world_storage(gcf::CloudEvent event) { // NOLINT +void hello_world_storage(gcf::CloudEvent event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; From 4c02a749387a8ae9f7d445780235360d0710392e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Mon, 18 Oct 2021 12:49:20 -0400 Subject: [PATCH 14/77] doc: how-to guide on using legacy code (#334) --- ci/build-examples.yaml | 10 ++ ci/generate-build-examples.sh | 1 + examples/CMakeLists.txt | 2 + examples/howto_use_legacy_code/CMakeLists.txt | 45 ++++++ examples/howto_use_legacy_code/README.md | 148 ++++++++++++++++++ .../howto_use_legacy_code.cc | 28 ++++ .../howto_use_legacy_code/legacy/.gitignore | 2 + .../howto_use_legacy_code/legacy/Makefile | 23 +++ .../howto_use_legacy_code/legacy/legacy.cc | 22 +++ .../howto_use_legacy_code/legacy/legacy.h | 24 +++ examples/howto_use_legacy_code/main.cc | 24 +++ examples/howto_use_legacy_code/vcpkg.json | 8 + examples/http_examples_test.cc | 6 + 13 files changed, 343 insertions(+) create mode 100644 examples/howto_use_legacy_code/CMakeLists.txt create mode 100644 examples/howto_use_legacy_code/README.md create mode 100644 examples/howto_use_legacy_code/howto_use_legacy_code.cc create mode 100644 examples/howto_use_legacy_code/legacy/.gitignore create mode 100644 examples/howto_use_legacy_code/legacy/Makefile create mode 100644 examples/howto_use_legacy_code/legacy/legacy.cc create mode 100644 examples/howto_use_legacy_code/legacy/legacy.h create mode 100644 examples/howto_use_legacy_code/main.cc create mode 100644 examples/howto_use_legacy_code/vcpkg.json diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 41f527bd..84d32a5f 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -150,6 +150,16 @@ steps: 'hello-world-rooted', ] + - name: 'pack' + waitFor: ['gcf-builder-ready'] + id: 'howto-use-legacy-code' + args: ['build', + '--env', 'FUNCTION_SIGNATURE_TYPE=http', + '--env', 'TARGET_FUNCTION=HowtoUseLegacyCode', + '--path', 'examples/howto_use_legacy_code', + 'howto-use-legacy-code', + ] + # Build the cloud site examples. - name: 'pack' waitFor: ['gcf-builder-ready'] diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 6fb5899f..d98ab3ca 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -134,6 +134,7 @@ generic_example hello_gcs HelloGcs http generic_example hello_with_third_party HelloWithThirdParty http generic_example hello_world HelloWorld http generic_example hello_world ::HelloWorld http hello-world-rooted +generic_example howto_use_legacy_code HowtoUseLegacyCode http howto-use-legacy-code cat <<_EOF_ # Build the cloud site examples. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index e7835da5..bf6d907b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -32,6 +32,8 @@ add_library( hello_multiple_sources/hello_multiple_sources.cc hello_with_third_party/hello_with_third_party.cc hello_world/hello_world.cc + howto_use_legacy_code/howto_use_legacy_code.cc + howto_use_legacy_code/legacy/legacy.cc site/bearer_token/bearer_token.cc site/concepts_after_response/concepts_after_response.cc site/concepts_after_timeout/concepts_after_timeout.cc diff --git a/examples/howto_use_legacy_code/CMakeLists.txt b/examples/howto_use_legacy_code/CMakeLists.txt new file mode 100644 index 00000000..09cb5428 --- /dev/null +++ b/examples/howto_use_legacy_code/CMakeLists.txt @@ -0,0 +1,45 @@ +# ~~~ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ~~~ + +cmake_minimum_required(VERSION 3.5) +project(functions-framework-cpp-howto-local-development CXX C) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Threads REQUIRED) +find_package(functions_framework_cpp REQUIRED) + +include(ExternalProject) +externalproject_add( + legacy + PREFIX "${CMAKE_CURRENT_BINARY_DIR}/legacy" + DEPENDS "" SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/legacy" + CONFIGURE_COMMAND "" + BUILD_COMMAND "make" "CXX=${CMAKE_CXX_COMPILER}" "default" BUILD_IN_SOURCE + ON + BUILD_BYPRODUCTS "/liblegacy.a" + INSTALL_COMMAND "") +ExternalProject_Get_Property(legacy SOURCE_DIR) + +add_library(functions_framework_cpp_function howto_use_legacy_code.cc) +add_dependencies(functions_framework_cpp_function legacy) +target_link_libraries( + functions_framework_cpp_function PUBLIC "${SOURCE_DIR}/liblegacy.a" + functions-framework-cpp::framework) + +add_executable(main main.cc) +target_link_libraries(main PRIVATE functions_framework_cpp_function) diff --git a/examples/howto_use_legacy_code/README.md b/examples/howto_use_legacy_code/README.md new file mode 100644 index 00000000..3e53580b --- /dev/null +++ b/examples/howto_use_legacy_code/README.md @@ -0,0 +1,148 @@ +# How-to Guide: use functions with legacy code + +This guide shows you how to use legacy code with the C++ Functions Framework. + +This guide shows how to create a CMake file that invokes an external build tool +to compile some legacy code. This is a complex subject, with a lot of nuances +depending on the nature of the legacy code and the build system used to compile +it. We hope this guide can give you starting pointers to learn more about the +topic. + +We recommend you use [ExternalProject_Add] facility in CMake to compile any +pre-existing code. This is a general-purpose function in CMake that invokes +any external tool to compile some code. Often this function also downloads +the code from some external repository, but it can use code in your source +tree. + +[ExternalProject_Add]: https://cmake.org/cmake/help/latest/module/ExternalProject.html + +## Installing Dependencies + +Because the Functions Framework for C++ uses C++17, you will need a working C++ +compiler with support for C++17. If you are a GCC user, any version after 8.0 +should work. For Clang any version after 6.0 should work. We have not tested +these instructions with MSVC. + +This guide uses [CMake (>= 3.5)][cmake] as a build tool. There are detailed +[install instructions][cmake-install], but many system package managers have +packages for it. Verify your CMake tool version: + +```shell +cmake --version +# Output: cmake version X.Y.Z ... verify this is >= 3.5 +``` + +The Functions Framework for C++ recommends using [vcpkg][vcpkg-gh] to manage +dependencies. This is how dependencies will be installed and compiled in the +production environment, so you probably want to use the same approach in +development. Follow the [vcpkg install instructions][vcpkg-install] to get +vcpkg installed on your development environment. For example, on Linux you +would use: + +```shell +cd $HOME +git clone -q https://github.com/microsoft/vcpkg +# Expected output: none +./vcpkg/bootstrap-vcpkg.sh --disableMetrics +``` + +You should see output like this: + +```console +Downloading cmake... +... +Downloading ninja... +... +Downloading vcpkg tool sources +... +.. +Building vcpkg-tool... +... +.. +[88/88] Linking CXX executable vcpkg +``` + +This will create a `vcpkg` executable in the `$HOME/vcpkg` directory. + +## Compiling a function + +Once vcpkg is compiled you can build the example. If you have not cloned +the `functions-framework-cpp` repository yet, you need to do so now: + +```shell +cd $HOME +git clone -q https://github.com/GoogleCloudPlatform/functions-framework-cpp.git +# Expected output: none +``` + +Then go to the directory hosting this example and use CMake to build +the example: + +```shell +cd functions-framework-cpp/examples/howto_use_legacy_code +``` + +Run the CMake configure step. If needed, this will download and build any +dependencies for your function: + +```shell +cmake -H. -B.build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake +``` + +You should see output like this: + +> :warning: the first time you use or build the framework it might take several +> minutes, maybe as much as 1/2 hour, depending on your workstation +> performance. Future builds, even in different directories, should be faster +> as `vcpkg` caches binary artifacts in `$HOME/.cache/vcpkg`. + +```console +-- Running vcpkg install +... +-- Running vcpkg install - done +-- Configuring done +-- Generating done +-- Build files have been written to: .../howto_use_legacy_code/.build +``` + +If you have previously built the dependencies with `vcpkg` the output may include +informational messages about reusing these binary artifacts. With some versions +of CMake you may see a warning about your version of Boost, something like: + +```console +CMake Warning at /usr/share/cmake-3.16/Modules/FindBoost.cmake:1161 (message): + New Boost version may have incorrect or missing dependencies and imported + targets +``` + +You can safely ignore this warning. + +With the dependencies built and CMake configured you can now build the code: + +```shell +cmake --build .build +``` + +This will output some informational messages about the build progress, and will +create a binary called `local_server` in the .build subdirectory. + +## Running the function locally + +This will produce a standalone HTTP server, which you can run locally using: + +```shell +.build/main --port 8080 +``` + +Test this program using `curl`. In a separate terminal window run: + +```shell +curl http://localhost:8080 +``` + +You can just interrupt (`Ctrl-C`) the program to terminate it. + +[vcpkg-gh]: https://github.com/microsoft/vcpkg +[vcpkg-install]: https://github.com/microsoft/vcpkg#getting-started +[cmake]: https://cmake.org +[cmake-install]: https://cmake.org/install/ diff --git a/examples/howto_use_legacy_code/howto_use_legacy_code.cc b/examples/howto_use_legacy_code/howto_use_legacy_code.cc new file mode 100644 index 00000000..9ff6e155 --- /dev/null +++ b/examples/howto_use_legacy_code/howto_use_legacy_code.cc @@ -0,0 +1,28 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "legacy/legacy.h" +#include +#include + +using ::google::cloud::functions::HttpRequest; +using ::google::cloud::functions::HttpResponse; + +// Though not used in this example, the request is passed by value to support +// applications that move-out its data. +HttpResponse HowtoUseLegacyCode(HttpRequest) { // NOLINT + return HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(legacy::LegacyMessage()); +} diff --git a/examples/howto_use_legacy_code/legacy/.gitignore b/examples/howto_use_legacy_code/legacy/.gitignore new file mode 100644 index 00000000..302a4450 --- /dev/null +++ b/examples/howto_use_legacy_code/legacy/.gitignore @@ -0,0 +1,2 @@ +liblegacy.a +legacy.o diff --git a/examples/howto_use_legacy_code/legacy/Makefile b/examples/howto_use_legacy_code/legacy/Makefile new file mode 100644 index 00000000..8b967b14 --- /dev/null +++ b/examples/howto_use_legacy_code/legacy/Makefile @@ -0,0 +1,23 @@ +# ~~~ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ~~~ + +default: liblegacy.a + +liblegacy.a: legacy.o + $(AR) r $@ $< + +legacy.o: legacy.cc legacy.h + $(CXX) $(CXXFLAGS) -c -o $@ $< diff --git a/examples/howto_use_legacy_code/legacy/legacy.cc b/examples/howto_use_legacy_code/legacy/legacy.cc new file mode 100644 index 00000000..dffeff1c --- /dev/null +++ b/examples/howto_use_legacy_code/legacy/legacy.cc @@ -0,0 +1,22 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "legacy.h" +#include + +namespace legacy { +std::string LegacyMessage() { + return "C++ version is " + std::to_string(__cplusplus) + "\n"; +} +} // namespace legacy diff --git a/examples/howto_use_legacy_code/legacy/legacy.h b/examples/howto_use_legacy_code/legacy/legacy.h new file mode 100644 index 00000000..ce465f43 --- /dev/null +++ b/examples/howto_use_legacy_code/legacy/legacy.h @@ -0,0 +1,24 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FUNCTIONS_FRAMEWORK_CPP_EXAMPLES_HOWTO_USE_LEGACY_CODE_LEGACY_LEGACY_H +#define FUNCTIONS_FRAMEWORK_CPP_EXAMPLES_HOWTO_USE_LEGACY_CODE_LEGACY_LEGACY_H + +#include + +namespace legacy { +std::string LegacyMessage(); +} // namespace legacy + +#endif // FUNCTIONS_FRAMEWORK_CPP_EXAMPLES_HOWTO_USE_LEGACY_CODE_LEGACY_LEGACY_H diff --git a/examples/howto_use_legacy_code/main.cc b/examples/howto_use_legacy_code/main.cc new file mode 100644 index 00000000..28197c0d --- /dev/null +++ b/examples/howto_use_legacy_code/main.cc @@ -0,0 +1,24 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +namespace gcf = ::google::cloud::functions; + +gcf::HttpResponse HowtoUseLegacyCode(gcf::HttpRequest); + +int main(int argc, char* argv[]) { + return ::google::cloud::functions::Run(argc, argv, HowtoUseLegacyCode); +} diff --git a/examples/howto_use_legacy_code/vcpkg.json b/examples/howto_use_legacy_code/vcpkg.json new file mode 100644 index 00000000..42cde824 --- /dev/null +++ b/examples/howto_use_legacy_code/vcpkg.json @@ -0,0 +1,8 @@ +{ + "name": "hello-with-third-party", + "version-string": "unversioned", + "dependencies": [ + "fmt", + "functions-framework-cpp" + ] +} diff --git a/examples/http_examples_test.cc b/examples/http_examples_test.cc index 58af27e8..38e37d89 100644 --- a/examples/http_examples_test.cc +++ b/examples/http_examples_test.cc @@ -22,6 +22,7 @@ gcf::HttpResponse HelloGcs(gcf::HttpRequest); gcf::HttpResponse HelloMultipleSources(gcf::HttpRequest); gcf::HttpResponse HelloWithThirdParty(gcf::HttpRequest request); gcf::HttpResponse HelloWorld(gcf::HttpRequest); +gcf::HttpResponse HowtoUseLegacyCode(gcf::HttpRequest); namespace hello_from_namespace { gcf::HttpResponse HelloWorld(gcf::HttpRequest); @@ -67,4 +68,9 @@ TEST(HttpExamplesTest, HelloFromNestedNamespace) { EXPECT_THAT(actual.payload(), HasSubstr("C++ namespace")); } +TEST(HttpExampleTest, HowtoUseLegacyCode) { + auto const actual = HowtoUseLegacyCode(gcf::HttpRequest{}); + EXPECT_THAT(actual.payload(), HasSubstr("C++")); +} + } // namespace From 6a8b89619dceee7dd2eae92b3a95bc5ecf118151 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 19 Oct 2021 12:42:20 -0400 Subject: [PATCH 15/77] doc: no inline namespaces in Doxygen docs (#335) Well, we do not have Doxygen docs right now, but if we did, we do not want the inline namespace to appear in the docs. --- google/cloud/functions/cloud_event.cc | 4 ++-- google/cloud/functions/cloud_event.h | 4 ++-- google/cloud/functions/cloud_event_test.cc | 4 ++-- google/cloud/functions/framework.h | 4 ++-- google/cloud/functions/http_request.h | 4 ++-- google/cloud/functions/http_request_test.cc | 4 ++-- google/cloud/functions/http_response.cc | 4 ++-- google/cloud/functions/http_response.h | 8 ++++---- google/cloud/functions/http_response_test.cc | 4 ++-- .../integration_tests/basic_integration_test.cc | 4 ++-- .../integration_tests/cloud_event_integration_test.cc | 4 ++-- google/cloud/functions/internal/base64_decode.cc | 4 ++-- google/cloud/functions/internal/base64_decode.h | 4 ++-- google/cloud/functions/internal/base64_decode_test.cc | 4 ++-- google/cloud/functions/internal/build_info.cc.in | 4 ++-- google/cloud/functions/internal/build_info.h | 4 ++-- google/cloud/functions/internal/call_user_function.cc | 4 ++-- google/cloud/functions/internal/call_user_function.h | 4 ++-- .../functions/internal/call_user_function_test.cc | 4 ++-- google/cloud/functions/internal/compiler_info.cc | 4 ++-- google/cloud/functions/internal/compiler_info.h | 4 ++-- google/cloud/functions/internal/compiler_info_test.cc | 4 ++-- google/cloud/functions/internal/framework_impl.cc | 8 ++++---- google/cloud/functions/internal/framework_impl.h | 4 ++-- .../cloud/functions/internal/framework_impl_test.cc | 4 ++-- google/cloud/functions/internal/http_message_types.h | 4 ++-- .../functions/internal/parse_cloud_event_http.cc | 4 ++-- .../cloud/functions/internal/parse_cloud_event_http.h | 4 ++-- .../functions/internal/parse_cloud_event_http_test.cc | 4 ++-- .../functions/internal/parse_cloud_event_json.cc | 4 ++-- .../cloud/functions/internal/parse_cloud_event_json.h | 4 ++-- .../functions/internal/parse_cloud_event_json_test.cc | 4 ++-- .../functions/internal/parse_cloud_event_legacy.cc | 4 ++-- .../functions/internal/parse_cloud_event_legacy.h | 4 ++-- .../internal/parse_cloud_event_legacy_test.cc | 4 ++-- .../functions/internal/parse_cloud_event_storage.cc | 4 ++-- .../functions/internal/parse_cloud_event_storage.h | 4 ++-- .../internal/parse_cloud_event_storage_test.cc | 4 ++-- google/cloud/functions/internal/parse_options.cc | 4 ++-- google/cloud/functions/internal/parse_options.h | 4 ++-- google/cloud/functions/internal/parse_options_test.cc | 4 ++-- google/cloud/functions/internal/setenv.cc | 4 ++-- google/cloud/functions/internal/setenv.h | 4 ++-- google/cloud/functions/internal/wrap_request.cc | 4 ++-- google/cloud/functions/internal/wrap_request.h | 4 ++-- google/cloud/functions/internal/wrap_request_test.cc | 4 ++-- google/cloud/functions/internal/wrap_response.cc | 4 ++-- google/cloud/functions/internal/wrap_response.h | 4 ++-- google/cloud/functions/user_functions.h | 4 ++-- google/cloud/functions/version.cc | 4 ++-- google/cloud/functions/version.h | 11 ++++++----- google/cloud/functions/version_test.cc | 4 ++-- 52 files changed, 112 insertions(+), 111 deletions(-) diff --git a/google/cloud/functions/cloud_event.cc b/google/cloud/functions/cloud_event.cc index d6fb3a87..6bb394ff 100644 --- a/google/cloud/functions/cloud_event.cc +++ b/google/cloud/functions/cloud_event.cc @@ -16,7 +16,7 @@ #include // NOLINT(modernize-deprecated-headers) namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN void CloudEvent::set_time(std::string const& timestamp) { std::string err; @@ -27,5 +27,5 @@ void CloudEvent::set_time(std::string const& timestamp) { set_time(absl::ToChronoTime(time)); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/cloud_event.h b/google/cloud/functions/cloud_event.h index 8e54e134..d4135407 100644 --- a/google/cloud/functions/cloud_event.h +++ b/google/cloud/functions/cloud_event.h @@ -21,7 +21,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Represents a Cloud Event. @@ -95,7 +95,7 @@ class CloudEvent { std::optional data_; }; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_CLOUD_EVENT_H diff --git a/google/cloud/functions/cloud_event_test.cc b/google/cloud/functions/cloud_event_test.cc index 0e3fc092..4ce258b9 100644 --- a/google/cloud/functions/cloud_event_test.cc +++ b/google/cloud/functions/cloud_event_test.cc @@ -17,7 +17,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { TEST(CloudEventTest, Basic) { @@ -116,5 +116,5 @@ TEST(CloudEventTest, DataMove) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/framework.h b/google/cloud/functions/framework.h index a9e0a992..438a7c8e 100644 --- a/google/cloud/functions/framework.h +++ b/google/cloud/functions/framework.h @@ -20,7 +20,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Run the given function, invoking it to handle HTTP requests. @@ -83,7 +83,7 @@ int Run(int argc, char const* const argv[], UserHttpFunction handler) noexcept; int Run(int argc, char const* const argv[], UserCloudEventFunction handler) noexcept; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FRAMEWORK_H diff --git a/google/cloud/functions/http_request.h b/google/cloud/functions/http_request.h index 50e3fc15..bacb22ad 100644 --- a/google/cloud/functions/http_request.h +++ b/google/cloud/functions/http_request.h @@ -21,7 +21,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Represents a HTTP request. @@ -115,7 +115,7 @@ class HttpRequest { int version_minor_ = 1; }; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_HTTP_REQUEST_H diff --git a/google/cloud/functions/http_request_test.cc b/google/cloud/functions/http_request_test.cc index 443b714c..51061f07 100644 --- a/google/cloud/functions/http_request_test.cc +++ b/google/cloud/functions/http_request_test.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::ElementsAre; @@ -74,5 +74,5 @@ TEST(HttpRequestTest, ClearHeaders) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/http_response.cc b/google/cloud/functions/http_response.cc index a571bfd2..8a51ea6c 100644 --- a/google/cloud/functions/http_response.cc +++ b/google/cloud/functions/http_response.cc @@ -16,11 +16,11 @@ #include "google/cloud/functions/internal/wrap_response.h" namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN HttpResponse::HttpResponse() : impl_(functions_internal::MakeHttpResponse()) {} HttpResponse::Impl::~Impl() = default; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/http_response.h b/google/cloud/functions/http_response.h index 3cd146ad..f108eab1 100644 --- a/google/cloud/functions/http_response.h +++ b/google/cloud/functions/http_response.h @@ -22,13 +22,13 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN struct UnwrapResponse; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Represents a HTTP request. @@ -175,7 +175,7 @@ class HttpResponse { std::shared_ptr impl_; }; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_HTTP_RESPONSE_H diff --git a/google/cloud/functions/http_response_test.cc b/google/cloud/functions/http_response_test.cc index bf66fdec..bc1e00c9 100644 --- a/google/cloud/functions/http_response_test.cc +++ b/google/cloud/functions/http_response_test.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::ElementsAre; @@ -68,5 +68,5 @@ TEST(WrapResponseTest, Version) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/integration_tests/basic_integration_test.cc b/google/cloud/functions/integration_tests/basic_integration_test.cc index fb4c8377..edbd842a 100644 --- a/google/cloud/functions/integration_tests/basic_integration_test.cc +++ b/google/cloud/functions/integration_tests/basic_integration_test.cc @@ -27,7 +27,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::Each; @@ -238,7 +238,7 @@ TEST(RunIntegrationTest, SomeParallelism) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal int main(int argc, char* argv[]) { diff --git a/google/cloud/functions/integration_tests/cloud_event_integration_test.cc b/google/cloud/functions/integration_tests/cloud_event_integration_test.cc index e32dc1ee..9ef63254 100644 --- a/google/cloud/functions/integration_tests/cloud_event_integration_test.cc +++ b/google/cloud/functions/integration_tests/cloud_event_integration_test.cc @@ -29,7 +29,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::HasSubstr; @@ -316,7 +316,7 @@ TEST(RunIntegrationTest, ConformanceSmokeTest) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal int main(int argc, char* argv[]) { diff --git a/google/cloud/functions/internal/base64_decode.cc b/google/cloud/functions/internal/base64_decode.cc index 38c9a721..8d8a2625 100644 --- a/google/cloud/functions/internal/base64_decode.cc +++ b/google/cloud/functions/internal/base64_decode.cc @@ -18,7 +18,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN std::string Base64Decode(std::string const& base64) { if (base64.size() % 4 != 0) { @@ -50,5 +50,5 @@ std::string Base64Decode(std::string const& base64) { return data; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/base64_decode.h b/google/cloud/functions/internal/base64_decode.h index d32fdaef..02bb3ace 100644 --- a/google/cloud/functions/internal/base64_decode.h +++ b/google/cloud/functions/internal/base64_decode.h @@ -19,11 +19,11 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN std::string Base64Decode(std::string const& base64); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_BASE64_DECODE_H diff --git a/google/cloud/functions/internal/base64_decode_test.cc b/google/cloud/functions/internal/base64_decode_test.cc index 70fe1252..983d8b89 100644 --- a/google/cloud/functions/internal/base64_decode_test.cc +++ b/google/cloud/functions/internal/base64_decode_test.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { struct TestData { @@ -61,5 +61,5 @@ TEST(Base64DecodeTest, Overpadded) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/build_info.cc.in b/google/cloud/functions/internal/build_info.cc.in index 8cc6303b..a0b690d1 100644 --- a/google/cloud/functions/internal/build_info.cc.in +++ b/google/cloud/functions/internal/build_info.cc.in @@ -17,7 +17,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN std::string Compiler() { return CompilerId() + " " + CompilerVersion(); @@ -36,5 +36,5 @@ std::string BuildMetadata() { return kBuildMetadata; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/build_info.h b/google/cloud/functions/internal/build_info.h index b6804c0e..6c61b526 100644 --- a/google/cloud/functions/internal/build_info.h +++ b/google/cloud/functions/internal/build_info.h @@ -18,7 +18,7 @@ #include "google/cloud/functions/version.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// The compiler version. std::string Compiler(); @@ -29,7 +29,7 @@ std::string CompilerFlags(); /// Build metadata injected by the build system. std::string BuildMetadata(); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_BUILD_INFO_H diff --git a/google/cloud/functions/internal/call_user_function.cc b/google/cloud/functions/internal/call_user_function.cc index b0446581..b5608d74 100644 --- a/google/cloud/functions/internal/call_user_function.cc +++ b/google/cloud/functions/internal/call_user_function.cc @@ -21,7 +21,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace be = ::boost::beast; @@ -97,5 +97,5 @@ BeastResponse CallUserFunction( return ReportUnknownExceptionInFunction(); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/call_user_function.h b/google/cloud/functions/internal/call_user_function.h index 82b5209d..32bf3c51 100644 --- a/google/cloud/functions/internal/call_user_function.h +++ b/google/cloud/functions/internal/call_user_function.h @@ -19,7 +19,7 @@ #include "google/cloud/functions/user_functions.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN BeastResponse CallUserFunction(functions::UserHttpFunction const& function, BeastRequest request); @@ -28,7 +28,7 @@ BeastResponse CallUserFunction( functions::UserCloudEventFunction const& function, BeastRequest const& request); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_CALL_USER_FUNCTION_H diff --git a/google/cloud/functions/internal/call_user_function_test.cc b/google/cloud/functions/internal/call_user_function_test.cc index 12cbe61d..44977c28 100644 --- a/google/cloud/functions/internal/call_user_function_test.cc +++ b/google/cloud/functions/internal/call_user_function_test.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::Contains; @@ -152,5 +152,5 @@ TEST(CallUserFunctionCloudEventTest, InterceptFaviconIco) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/compiler_info.cc b/google/cloud/functions/internal/compiler_info.cc index 8cf88afb..d80972e0 100644 --- a/google/cloud/functions/internal/compiler_info.cc +++ b/google/cloud/functions/internal/compiler_info.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * The macros for determining the compiler ID are taken from: @@ -89,5 +89,5 @@ std::string LanguageVersion() { } } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/compiler_info.h b/google/cloud/functions/internal/compiler_info.h index c711322d..dfc8cc5b 100644 --- a/google/cloud/functions/internal/compiler_info.h +++ b/google/cloud/functions/internal/compiler_info.h @@ -18,7 +18,7 @@ #include "google/cloud/functions/version.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Returns the compiler ID. * @@ -39,7 +39,7 @@ std::string CompilerVersion(); */ std::string LanguageVersion(); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_COMPILER_INFO_H diff --git a/google/cloud/functions/internal/compiler_info_test.cc b/google/cloud/functions/internal/compiler_info_test.cc index 698c54b8..24687c0d 100644 --- a/google/cloud/functions/internal/compiler_info_test.cc +++ b/google/cloud/functions/internal/compiler_info_test.cc @@ -17,7 +17,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::Contains; @@ -48,5 +48,5 @@ TEST(CompilerInfo, LanguageVersion) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/framework_impl.cc b/google/cloud/functions/internal/framework_impl.cc index c7ceaeaf..e53f5a3b 100644 --- a/google/cloud/functions/internal/framework_impl.cc +++ b/google/cloud/functions/internal/framework_impl.cc @@ -28,7 +28,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { namespace be = boost::beast; namespace asio = boost::asio; @@ -153,11 +153,11 @@ int RunForTest(int argc, char const* const argv[], return RunForTestImpl(argc, argv, std::move(handler), shutdown, actual_port); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN int Run(int argc, char const* const argv[], UserHttpFunction handler) noexcept { return functions_internal::RunImpl(argc, argv, std::move(handler)); @@ -168,5 +168,5 @@ int Run(int argc, char const* const argv[], return functions_internal::RunImpl(argc, argv, std::move(handler)); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/internal/framework_impl.h b/google/cloud/functions/internal/framework_impl.h index b95aec64..0a7f6f3d 100644 --- a/google/cloud/functions/internal/framework_impl.h +++ b/google/cloud/functions/internal/framework_impl.h @@ -20,7 +20,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Implement functions::Run(), with additional helpers for testing. int RunForTest(int argc, char const* const argv[], @@ -34,7 +34,7 @@ int RunForTest(int argc, char const* const argv[], std::function const& shutdown, std::function const& actual_port); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FRAMEWORK_IMPL_H diff --git a/google/cloud/functions/internal/framework_impl_test.cc b/google/cloud/functions/internal/framework_impl_test.cc index 75157443..63ec7e35 100644 --- a/google/cloud/functions/internal/framework_impl_test.cc +++ b/google/cloud/functions/internal/framework_impl_test.cc @@ -22,7 +22,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::IsEmpty; @@ -170,5 +170,5 @@ TEST(FrameworkTest, CloudEventInvalidPort) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/http_message_types.h b/google/cloud/functions/internal/http_message_types.h index 3f5865ce..d6d5a91d 100644 --- a/google/cloud/functions/internal/http_message_types.h +++ b/google/cloud/functions/internal/http_message_types.h @@ -19,7 +19,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN using BeastRequest = boost::beast::http::request; @@ -27,7 +27,7 @@ using BeastRequest = using BeastResponse = boost::beast::http::response; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_HTTP_MESSAGE_TYPES_H diff --git a/google/cloud/functions/internal/parse_cloud_event_http.cc b/google/cloud/functions/internal/parse_cloud_event_http.cc index b54aa023..1e3d3f39 100644 --- a/google/cloud/functions/internal/parse_cloud_event_http.cc +++ b/google/cloud/functions/internal/parse_cloud_event_http.cc @@ -18,7 +18,7 @@ #include "google/cloud/functions/internal/parse_cloud_event_storage.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN bool HasHeader(BeastRequest const& request, std::string_view header) { return request.count(header) != 0; @@ -85,5 +85,5 @@ std::vector ParseCloudEventHttp( return {ParseCloudEventStorage(ParseCloudEventHttpBinary(request))}; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_http.h b/google/cloud/functions/internal/parse_cloud_event_http.h index 0d373c2c..374efdf6 100644 --- a/google/cloud/functions/internal/parse_cloud_event_http.h +++ b/google/cloud/functions/internal/parse_cloud_event_http.h @@ -21,7 +21,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Parse @p request as a Cloud Event, assuming the content type is binary. functions::CloudEvent ParseCloudEventHttpBinary(BeastRequest const& request); @@ -30,7 +30,7 @@ functions::CloudEvent ParseCloudEventHttpBinary(BeastRequest const& request); std::vector ParseCloudEventHttp( BeastRequest const& request); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_PARSE_CLOUD_EVENT_HTTP_H diff --git a/google/cloud/functions/internal/parse_cloud_event_http_test.cc b/google/cloud/functions/internal/parse_cloud_event_http_test.cc index 700039f2..94bd0484 100644 --- a/google/cloud/functions/internal/parse_cloud_event_http_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_http_test.cc @@ -20,7 +20,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::ElementsAre; @@ -261,5 +261,5 @@ TEST(ParseCloudEventHttp, BinaryWithUnknownContentType) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_json.cc b/google/cloud/functions/internal/parse_cloud_event_json.cc index 2f979fd9..2bc04562 100644 --- a/google/cloud/functions/internal/parse_cloud_event_json.cc +++ b/google/cloud/functions/internal/parse_cloud_event_json.cc @@ -19,7 +19,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { functions::CloudEvent ParseCloudEventJson(nlohmann::json const& json) { @@ -84,5 +84,5 @@ std::vector ParseCloudEventJsonBatch( return events; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_json.h b/google/cloud/functions/internal/parse_cloud_event_json.h index ab00d733..ab757563 100644 --- a/google/cloud/functions/internal/parse_cloud_event_json.h +++ b/google/cloud/functions/internal/parse_cloud_event_json.h @@ -21,7 +21,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Parse @p json_string as a Cloud Event functions::CloudEvent ParseCloudEventJson(std::string_view json_string); @@ -30,7 +30,7 @@ functions::CloudEvent ParseCloudEventJson(std::string_view json_string); std::vector ParseCloudEventJsonBatch( std::string_view json_string); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_PARSE_CLOUD_EVENT_JSON_H diff --git a/google/cloud/functions/internal/parse_cloud_event_json_test.cc b/google/cloud/functions/internal/parse_cloud_event_json_test.cc index aee30d30..537ce3a4 100644 --- a/google/cloud/functions/internal/parse_cloud_event_json_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_json_test.cc @@ -20,7 +20,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::ElementsAre; @@ -286,5 +286,5 @@ TEST(ParseCloudEventJson, EmulateStorage) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy.cc b/google/cloud/functions/internal/parse_cloud_event_legacy.cc index ee36f740..ddd2db58 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy.cc +++ b/google/cloud/functions/internal/parse_cloud_event_legacy.cc @@ -19,7 +19,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { std::string GetNestedKey(nlohmann::json const& json, std::deque path) { @@ -289,5 +289,5 @@ functions::CloudEvent ParseCloudEventLegacy(std::string_view json_string) { return ParseCloudEventLegacy(json); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy.h b/google/cloud/functions/internal/parse_cloud_event_legacy.h index 222a2d4f..3e6bde2d 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy.h +++ b/google/cloud/functions/internal/parse_cloud_event_legacy.h @@ -20,12 +20,12 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Parse @p json_string as one of the legacy GCF event formats. functions::CloudEvent ParseCloudEventLegacy(std::string_view json_string); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_PARSE_CLOUD_EVENT_LEGACY_H diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc b/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc index 01242e10..14e0ccc1 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc @@ -18,7 +18,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes) @@ -591,5 +591,5 @@ TEST(ParseCloudEventLegacy, MapFirestore) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_storage.cc b/google/cloud/functions/internal/parse_cloud_event_storage.cc index 5a794fb1..2ad234be 100644 --- a/google/cloud/functions/internal/parse_cloud_event_storage.cc +++ b/google/cloud/functions/internal/parse_cloud_event_storage.cc @@ -17,7 +17,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN functions::CloudEvent ParseCloudEventStorage(functions::CloudEvent e) { if (e.type() != "google.cloud.pubsub.topic.v1.messagePublished") return e; @@ -64,5 +64,5 @@ functions::CloudEvent ParseCloudEventStorage(functions::CloudEvent e) { return event; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_cloud_event_storage.h b/google/cloud/functions/internal/parse_cloud_event_storage.h index d3badccf..a9bcd7c5 100644 --- a/google/cloud/functions/internal/parse_cloud_event_storage.h +++ b/google/cloud/functions/internal/parse_cloud_event_storage.h @@ -19,12 +19,12 @@ #include "google/cloud/functions/version.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Parse @p e as a Cloud Storage event if possible, otherwise return @p e. functions::CloudEvent ParseCloudEventStorage(functions::CloudEvent e); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_PARSE_CLOUD_EVENT_STORAGE_H diff --git a/google/cloud/functions/internal/parse_cloud_event_storage_test.cc b/google/cloud/functions/internal/parse_cloud_event_storage_test.cc index 20525eee..d2d67bfd 100644 --- a/google/cloud/functions/internal/parse_cloud_event_storage_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_storage_test.cc @@ -20,7 +20,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { TEST(ParseCloudEventJson, EmulateStorageBase) { @@ -332,5 +332,5 @@ TEST(ParseCloudEventJson, EmulateStorageMissingInvalidAttributeField) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_options.cc b/google/cloud/functions/internal/parse_options.cc index 12f39f87..ba3a2b5c 100644 --- a/google/cloud/functions/internal/parse_options.cc +++ b/google/cloud/functions/internal/parse_options.cc @@ -19,7 +19,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace po = boost::program_options; auto constexpr kDefaultPort = 8080; @@ -73,5 +73,5 @@ po::variables_map ParseOptions(int argc, char const* const argv[]) { throw std::invalid_argument(std::move(os).str()); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/parse_options.h b/google/cloud/functions/internal/parse_options.h index 2e5dd33a..ad5aaed7 100644 --- a/google/cloud/functions/internal/parse_options.h +++ b/google/cloud/functions/internal/parse_options.h @@ -19,13 +19,13 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Parse the command-line options in @p argv boost::program_options::variables_map ParseOptions(int argc, char const* const argv[]); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_PARSE_OPTIONS_H diff --git a/google/cloud/functions/internal/parse_options_test.cc b/google/cloud/functions/internal/parse_options_test.cc index a90d9a73..586b9469 100644 --- a/google/cloud/functions/internal/parse_options_test.cc +++ b/google/cloud/functions/internal/parse_options_test.cc @@ -17,7 +17,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { TEST(WrapRequestTest, NoCmd) { @@ -111,5 +111,5 @@ TEST(WrapRequestTest, PortCommandLineInvalid) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/setenv.cc b/google/cloud/functions/internal/setenv.cc index f342e06a..0be4b6b5 100644 --- a/google/cloud/functions/internal/setenv.cc +++ b/google/cloud/functions/internal/setenv.cc @@ -19,7 +19,7 @@ #include // NOLINT(modernize-deprecated-headers) namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { void UnsetEnv(char const* variable) { @@ -49,5 +49,5 @@ void SetEnv(std::string const& variable, SetEnv(variable.c_str(), value->c_str()); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/setenv.h b/google/cloud/functions/internal/setenv.h index c271f0d2..dac08094 100644 --- a/google/cloud/functions/internal/setenv.h +++ b/google/cloud/functions/internal/setenv.h @@ -20,13 +20,13 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Changes an environment variable in the current process. void SetEnv(std::string const& variable, std::optional const& value); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_SETENV_H diff --git a/google/cloud/functions/internal/wrap_request.cc b/google/cloud/functions/internal/wrap_request.cc index 7c4723b3..3ddefcaf 100644 --- a/google/cloud/functions/internal/wrap_request.cc +++ b/google/cloud/functions/internal/wrap_request.cc @@ -16,7 +16,7 @@ #include "google/cloud/functions/http_request.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN ::google::cloud::functions::HttpRequest MakeHttpRequest(BeastRequest request) { auto constexpr kBeastHttpVersionFactor = 10; @@ -33,5 +33,5 @@ ::google::cloud::functions::HttpRequest MakeHttpRequest(BeastRequest request) { return r; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/wrap_request.h b/google/cloud/functions/internal/wrap_request.h index a39e5da3..ba3e78ef 100644 --- a/google/cloud/functions/internal/wrap_request.h +++ b/google/cloud/functions/internal/wrap_request.h @@ -20,12 +20,12 @@ #include "google/cloud/functions/version.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Wrap a Boost.Beast request into a functions framework HTTP request. ::google::cloud::functions::HttpRequest MakeHttpRequest(BeastRequest request); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_WRAP_REQUEST_H diff --git a/google/cloud/functions/internal/wrap_request_test.cc b/google/cloud/functions/internal/wrap_request_test.cc index 47f4a33f..45cf0239 100644 --- a/google/cloud/functions/internal/wrap_request_test.cc +++ b/google/cloud/functions/internal/wrap_request_test.cc @@ -16,7 +16,7 @@ #include namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::ElementsAre; @@ -41,5 +41,5 @@ TEST(WrapRequestTest, Basic) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/wrap_response.cc b/google/cloud/functions/internal/wrap_response.cc index 6cb56f0d..0a8ebf20 100644 --- a/google/cloud/functions/internal/wrap_response.cc +++ b/google/cloud/functions/internal/wrap_response.cc @@ -15,12 +15,12 @@ #include "google/cloud/functions/internal/wrap_response.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Wrap a Boost.Beast request into a functions framework HTTP request. std::shared_ptr MakeHttpResponse() { return std::make_shared(); } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/wrap_response.h b/google/cloud/functions/internal/wrap_response.h index 33e7706d..6cd3a52a 100644 --- a/google/cloud/functions/internal/wrap_response.h +++ b/google/cloud/functions/internal/wrap_response.h @@ -20,7 +20,7 @@ #include "google/cloud/functions/version.h" namespace google::cloud::functions_internal { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN struct UnwrapResponse; @@ -70,7 +70,7 @@ class WrapResponseImpl : public google::cloud::functions::HttpResponse::Impl { /// Wrap a Boost.Beast request into a functions framework HTTP request. std::shared_ptr MakeHttpResponse(); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions_internal #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_WRAP_RESPONSE_H diff --git a/google/cloud/functions/user_functions.h b/google/cloud/functions/user_functions.h index f5f03a14..4abec06a 100644 --- a/google/cloud/functions/user_functions.h +++ b/google/cloud/functions/user_functions.h @@ -22,14 +22,14 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN using UserHttpFunction = std::function; using UserCloudEventFunction = std::function; -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_USER_FUNCTIONS_H diff --git a/google/cloud/functions/version.cc b/google/cloud/functions/version.cc index 9187d5bf..0aacf5eb 100644 --- a/google/cloud/functions/version.cc +++ b/google/cloud/functions/version.cc @@ -17,7 +17,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN std::string VersionString() { static std::string const kVersion = [] { @@ -33,5 +33,5 @@ std::string VersionString() { return kVersion; } -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions diff --git a/google/cloud/functions/version.h b/google/cloud/functions/version.h index 02e7a8d1..45b9d1f8 100644 --- a/google/cloud/functions/version.h +++ b/google/cloud/functions/version.h @@ -24,12 +24,13 @@ #define FUNCTIONS_FRAMEWORK_CPP_NS \ FUNCTIONS_FRAMEWORK_CPP_VEVAL(FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR, \ FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR) +#define FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN \ + inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +#define FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END \ + } /* namespace FUNCTIONS_FRAMEWORK_CPP_NS */ namespace google::cloud::functions { -/** - * The C++ Functions Framework inlined, versioned namespace. - */ -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// The C++ Functions Framework major version. int constexpr VersionMajor() { return FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR; } @@ -58,7 +59,7 @@ int constexpr Version() { /// The version as a string, in MAJOR.MINOR.PATCH+gitrev format. std::string VersionString(); -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_VERSION_H diff --git a/google/cloud/functions/version_test.cc b/google/cloud/functions/version_test.cc index f2024b09..a90a7640 100644 --- a/google/cloud/functions/version_test.cc +++ b/google/cloud/functions/version_test.cc @@ -18,7 +18,7 @@ #include namespace google::cloud::functions { -inline namespace FUNCTIONS_FRAMEWORK_CPP_NS { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { using ::testing::HasSubstr; @@ -54,5 +54,5 @@ TEST(VersionTest, NoBuildInfoInRelease) { } } // namespace -} // namespace FUNCTIONS_FRAMEWORK_CPP_NS +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END } // namespace google::cloud::functions From 83e3ee5f402320b7b38000c3828574a5b34450b5 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 19 Oct 2021 12:42:33 -0400 Subject: [PATCH 16/77] feat: make pkg-config files relocatable (#336) --- google/cloud/functions/config.pc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/cloud/functions/config.pc.in b/google/cloud/functions/config.pc.in index 21072619..79386b77 100644 --- a/google/cloud/functions/config.pc.in +++ b/google/cloud/functions/config.pc.in @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -prefix=@CMAKE_INSTALL_PREFIX@ +prefix=${pcfiledir}/../.. exec_prefix=${prefix}/@CMAKE_INSTALL_BINDIR@ libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ From 1f0e1a987472d669cb5b4323f22d2f9c07298331 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 20 Oct 2021 16:34:38 -0400 Subject: [PATCH 17/77] ci: pin Kaniko version to v1.6.0-debug (#337) --- build_scripts/pack/cloudbuild.yaml | 6 ++---- ci/build-examples.yaml | 6 ++---- ci/generate-build-examples.sh | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/build_scripts/pack/cloudbuild.yaml b/build_scripts/pack/cloudbuild.yaml index 66d6cb3e..102af423 100644 --- a/build_scripts/pack/cloudbuild.yaml +++ b/build_scripts/pack/cloudbuild.yaml @@ -22,10 +22,8 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] - # Workaround a kaniko bug using the "edge" builder: - # https://github.com/GoogleContainerTools/kaniko/issues/1058 # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -39,7 +37,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['pull', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/run-image'] - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 84d32a5f..8c9b1dd2 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -13,10 +13,8 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] - # Workaround a kaniko bug using the "edge" builder: - # https://github.com/GoogleContainerTools/kaniko/issues/1058 # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -30,7 +28,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index d98ab3ca..9cacb412 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -31,10 +31,8 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] - # Workaround a kaniko bug using the "edge" builder: - # https://github.com/GoogleContainerTools/kaniko/issues/1058 # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -48,7 +46,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - - name: 'gcr.io/kaniko-project/executor:edge' + - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", From 03eb8fb7870d4ec8feac6947efe46cbdc2e2c5d5 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 09:37:23 -0400 Subject: [PATCH 18/77] chore: update clang-tidy configuration (#338) --- .clang-tidy | 1 + 1 file changed, 1 insertion(+) diff --git a/.clang-tidy b/.clang-tidy index 6c1befe6..352da4ef 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -52,6 +52,7 @@ Checks: > -google-readability-braces-around-statements, -google-runtime-references, -readability-braces-around-statements, + -readability-identifier-length, -readability-redundant-declaration, -modernize-use-trailing-return-type, -modernize-return-braced-init-list, From e95a5d83d8fe8666578c4feeb485a80ad0951c2d Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 13:10:59 -0400 Subject: [PATCH 19/77] impl: a generic wrapper for functions (#339) This introduces `functions::Function`, a generic wrapper for all valid function signatures. The wrapper is not (yet) usable, I am missing the changes to `functions::Run()`. The PR is a good stopping point. --- google/cloud/functions/CMakeLists.txt | 5 + google/cloud/functions/function.cc | 45 ++++++ google/cloud/functions/function.h | 98 ++++++++++++ .../cloud/functions/internal/function_impl.cc | 61 ++++++++ .../cloud/functions/internal/function_impl.h | 70 +++++++++ .../functions/internal/function_impl_test.cc | 144 ++++++++++++++++++ 6 files changed, 423 insertions(+) create mode 100644 google/cloud/functions/function.cc create mode 100644 google/cloud/functions/function.h create mode 100644 google/cloud/functions/internal/function_impl.cc create mode 100644 google/cloud/functions/internal/function_impl.h create mode 100644 google/cloud/functions/internal/function_impl_test.cc diff --git a/google/cloud/functions/CMakeLists.txt b/google/cloud/functions/CMakeLists.txt index 3f419614..2b9506b4 100644 --- a/google/cloud/functions/CMakeLists.txt +++ b/google/cloud/functions/CMakeLists.txt @@ -30,6 +30,8 @@ add_library( cloud_event.cc cloud_event.h framework.h + function.cc + function.h http_request.h http_response.cc http_response.h @@ -42,6 +44,8 @@ add_library( internal/compiler_info.h internal/framework_impl.cc internal/framework_impl.h + internal/function_impl.cc + internal/function_impl.h internal/http_message_types.h internal/parse_cloud_event_http.cc internal/parse_cloud_event_http.h @@ -97,6 +101,7 @@ if (BUILD_TESTING) internal/call_user_function_test.cc internal/compiler_info_test.cc internal/framework_impl_test.cc + internal/function_impl_test.cc internal/parse_cloud_event_http_test.cc internal/parse_cloud_event_json_test.cc internal/parse_cloud_event_legacy_test.cc diff --git a/google/cloud/functions/function.cc b/google/cloud/functions/function.cc new file mode 100644 index 00000000..6766a547 --- /dev/null +++ b/google/cloud/functions/function.cc @@ -0,0 +1,45 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "google/cloud/functions/function.h" +#include "google/cloud/functions/internal/function_impl.h" + +namespace google::cloud::functions { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN + +Function::~Function() = default; + +Function::Function(std::shared_ptr impl) + : impl_(std::move(impl)) {} + +Function MakeFunction(UserHttpFunction function) { + return functions_internal::FunctionImpl::MakeFunction( + std::make_shared( + std::move(function))); +} + +Function MakeFunction(UserCloudEventFunction function) { + return functions_internal::FunctionImpl::MakeFunction( + std::make_shared( + std::move(function))); +} + +Function MakeFunction(std::map mapping) { + return functions_internal::FunctionImpl::MakeFunction( + std::make_shared( + std::move(mapping))); +} + +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions diff --git a/google/cloud/functions/function.h b/google/cloud/functions/function.h new file mode 100644 index 00000000..7f8a3c64 --- /dev/null +++ b/google/cloud/functions/function.h @@ -0,0 +1,98 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FUNCTION_H +#define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FUNCTION_H + +#include "google/cloud/functions/user_functions.h" +#include "google/cloud/functions/version.h" +#include + +namespace google::cloud::functions_internal { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +class FunctionImpl; +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions_internal + +namespace google::cloud::functions { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN + +/** + * An opaque wrapper around user-defined `http` and `cloud event` functions. + * + * This class can hold any of the function types supported by the C++ functions + * framework. The framework provides a number of factory functions to create + * `Function` objects from application defined functions. + * + * When using the functions framework for local development applications can + * create an HTTP server using: + * + * @code + * namespace gcf = google::cloud::functions; + * auto MyFunction() { return gcf::MakeFunction(callable); } + * int main(int argc, char* argv[]) { + * return gcf::Run(argc, argv, MyFunction()); + * } + * @endcode + * + * When using one of the buildpacks, the application defines the factory + * function and references it (by name) in the GOOGLE_FUNCTION_TARGET setting: + * + * @code + * namespace my_namespace { + * gcf::HttpResponse MyHandler(gcf::Request const&) { ... code here ... } + * + * // Use by setting GOOGLE_FUNCTION_TARGET to "my_namespace::MyFunction" + * auto MyFunction() { return gcf::MakeFunction(MyHandler); } + * } // + * @endcode + */ +class Function { + public: + ~Function(); + + friend bool operator==(Function const& lhs, Function const& rhs) { + return lhs.impl_ == rhs.impl_; + } + friend bool operator!=(Function const& lhs, Function const& rhs) { + return !(lhs == rhs); + } + + private: + friend class functions_internal::FunctionImpl; + + explicit Function(std::shared_ptr impl); + std::shared_ptr impl_; +}; + +/// Wraps an `http` handler. +Function MakeFunction(UserHttpFunction function); + +/// Wraps a `cloud event` handler. +Function MakeFunction(UserCloudEventFunction function); + +/** + * Creates a function with support for runtime-assigned targets. + * + * Given a map from function names to `Function` objects it creates a new + * function that will, at runtime, retrieve the correct function from the map, + * and install it as the handler. This assignment happens during function + * startup. + */ +Function MakeFunction(std::map mapping); + +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions + +#endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FUNCTION_H diff --git a/google/cloud/functions/internal/function_impl.cc b/google/cloud/functions/internal/function_impl.cc new file mode 100644 index 00000000..06f6db24 --- /dev/null +++ b/google/cloud/functions/internal/function_impl.cc @@ -0,0 +1,61 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "google/cloud/functions/internal/function_impl.h" +#include "google/cloud/functions/internal/call_user_function.h" +#include "google/cloud/functions/function.h" + +namespace google::cloud::functions_internal { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr FunctionImpl::GetImpl( + functions::Function const& fun) { + return fun.impl_; +} + +functions::Function FunctionImpl::MakeFunction( + std::shared_ptr impl) { + return functions::Function(std::move(impl)); +} + +BaseFunctionImpl::BaseFunctionImpl(functions::UserHttpFunction function) + : handler_([fun = std::move(function)](BeastRequest request) { + return CallUserFunction(fun, std::move(request)); + }) {} + +BaseFunctionImpl::BaseFunctionImpl(functions::UserCloudEventFunction function) + : handler_([fun = std::move(function)](BeastRequest const& request) { + return CallUserFunction(fun, request); + }) {} + +[[nodiscard]] Handler BaseFunctionImpl::GetHandler( + std::string_view /*target*/) const { + return handler_; +} + +MapFunctionImpl::MapFunctionImpl( + std::map mapping) + : mapping_(std::move(mapping)) {} + +[[nodiscard]] Handler MapFunctionImpl::GetHandler( + std::string_view target) const { + auto const l = mapping_.find(std::string(target)); + if (l == mapping_.end()) { + throw std::runtime_error("Function not found " + std::string(target)); + } + return FunctionImpl::GetImpl(l->second)->GetHandler(target); +} + +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions_internal diff --git a/google/cloud/functions/internal/function_impl.h b/google/cloud/functions/internal/function_impl.h new file mode 100644 index 00000000..e9371545 --- /dev/null +++ b/google/cloud/functions/internal/function_impl.h @@ -0,0 +1,70 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FUNCTION_IMPL_H +#define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FUNCTION_IMPL_H + +#include "google/cloud/functions/internal/http_message_types.h" +#include "google/cloud/functions/user_functions.h" +#include "google/cloud/functions/version.h" +#include +#include + +namespace google::cloud::functions { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +class Function; +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions + +namespace google::cloud::functions_internal { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN + +using Handler = std::function; + +class FunctionImpl { + public: + virtual ~FunctionImpl() = default; + [[nodiscard]] virtual Handler GetHandler(std::string_view target) const = 0; + + static std::shared_ptr GetImpl(functions::Function const& fun); + static functions::Function MakeFunction(std::shared_ptr impl); +}; + +class BaseFunctionImpl : public FunctionImpl { + public: + explicit BaseFunctionImpl(functions::UserHttpFunction function); + explicit BaseFunctionImpl(functions::UserCloudEventFunction function); + ~BaseFunctionImpl() override = default; + + [[nodiscard]] Handler GetHandler(std::string_view /*target*/) const override; + + private: + Handler handler_; +}; + +class MapFunctionImpl : public FunctionImpl { + public: + explicit MapFunctionImpl(std::map mapping); + ~MapFunctionImpl() override = default; + + [[nodiscard]] Handler GetHandler(std::string_view target) const override; + + private: + std::map mapping_; +}; + +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions_internal + +#endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FUNCTION_IMPL_H diff --git a/google/cloud/functions/internal/function_impl_test.cc b/google/cloud/functions/internal/function_impl_test.cc new file mode 100644 index 00000000..c7e3d038 --- /dev/null +++ b/google/cloud/functions/internal/function_impl_test.cc @@ -0,0 +1,144 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "google/cloud/functions/internal/function_impl.h" +#include "google/cloud/functions/function.h" +#include + +namespace google::cloud::functions_internal { +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +using ::testing::HasSubstr; +namespace http = ::boost::beast::http; + +auto SimpleHttp(functions::HttpRequest const& request) { + std::string payload = request.payload(); + payload += "\n"; + payload += ":target: "; + payload += request.target(); + for (auto const& [k, v] : request.headers()) { + payload += "\n"; + payload += k; + payload += ": "; + payload += v; + } + return functions::HttpResponse{}.set_payload(std::move(payload)); +} + +functions::HttpResponse AlwaysThrowHttp( + functions::HttpRequest const& /*request*/) { + throw std::runtime_error("testing"); +} + +auto TestCloudEventRequest() { + auto constexpr kText = R"js({ + "type" : "com.example.someevent", + "source" : "/mycontext", + "id" : "A234-1234-1234"})js"; + BeastRequest request; + request.target("/hello"); + request.insert("content-type", "application/cloudevents+json; charset=utf-8"); + request.body() = kText; + request.prepare_payload(); + return request; +} + +TEST(FunctionImpl, HttpNormal) { + auto function = functions::MakeFunction(SimpleHttp); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("unused"); + BeastRequest request; + request.target("/test-target"); + request.insert("x-test-header", "value"); + auto response = handler(request); + EXPECT_EQ(response.result(), http::status::ok); + EXPECT_THAT(response.body(), HasSubstr(":target: /test-target")); + EXPECT_THAT(response.body(), HasSubstr("x-test-header: value")); +} + +TEST(FunctionImpl, HttpThrow) { + auto function = functions::MakeFunction(AlwaysThrowHttp); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("unused"); + BeastRequest request; + request.target("/test-target"); + auto response = handler(request); + EXPECT_EQ(response.result(), http::status::internal_server_error); +} + +TEST(FunctionImpl, CloudEventNormal) { + auto func = [](functions::CloudEvent const& event) { + EXPECT_EQ(event.id(), "A234-1234-1234"); + EXPECT_EQ(event.source(), "/mycontext"); + EXPECT_EQ(event.type(), "com.example.someevent"); + }; + auto function = functions::MakeFunction(func); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("unused"); + auto response = handler(TestCloudEventRequest()); + EXPECT_EQ(response.result(), http::status::ok); +} + +TEST(FunctionImpl, CloudEventThrow) { + auto func = [](functions::CloudEvent const& /*event*/) { + throw std::runtime_error("testing"); + }; + auto function = functions::MakeFunction(func); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("unused"); + auto response = handler(TestCloudEventRequest()); + EXPECT_EQ(response.result(), http::status::internal_server_error); +} + +auto MakeTestMapFunction() { + auto a = [](functions::HttpRequest const& /*r*/) { + return functions::HttpResponse{}.set_payload("a"); + }; + auto b = [](functions::HttpRequest const& /*r*/) { + return functions::HttpResponse{}.set_payload("b"); + }; + auto c = [](functions::CloudEvent const& /*e*/) { + throw std::runtime_error("testing"); + }; + return functions::MakeFunction({ + {"a", functions::MakeFunction(a)}, + {"b", functions::MakeFunction(b)}, + {"c", functions::MakeFunction(c)}, + }); +} + +TEST(FunctionImpl, MapNormal) { + auto function = MakeTestMapFunction(); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("a"); + auto response = handler(BeastRequest()); + EXPECT_EQ(response.body(), "a"); + + handler = FunctionImpl::GetImpl(function)->GetHandler("b"); + response = handler(BeastRequest()); + EXPECT_EQ(response.body(), "b"); +} + +TEST(FunctionImpl, MapThrow) { + auto function = MakeTestMapFunction(); + auto handler = FunctionImpl::GetImpl(function)->GetHandler("c"); + auto response = handler(TestCloudEventRequest()); + EXPECT_EQ(response.result(), http::status::internal_server_error); +} + +TEST(FunctionImpl, MapInvalidName) { + auto function = MakeTestMapFunction(); + EXPECT_THROW((void)FunctionImpl::GetImpl(function)->GetHandler("invalid"), + std::exception); +} + +} // namespace +FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END +} // namespace google::cloud::functions_internal From aae4eb9f2bf198412dc9e81f7158f6542f49e646 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 15:42:52 -0400 Subject: [PATCH 20/77] feat: support `functions::Function` in `Run()` (#340) Application developers can use `functions::Function` as a wrapper for their functions in unit and integration tests. Note that we need to change the buildpacks (in a separate repository) to completely support this feature. --- google/cloud/functions/framework.h | 45 ++++++++++++++++- .../cloud_event_conformance.cc | 4 +- .../integration_tests/cloud_event_handler.cc | 4 +- .../integration_tests/echo_server.cc | 4 +- .../integration_tests/http_conformance.cc | 4 +- .../functions/internal/framework_impl.cc | 50 +++++++++---------- .../cloud/functions/internal/framework_impl.h | 9 +--- .../functions/internal/framework_impl_test.cc | 6 ++- 8 files changed, 82 insertions(+), 44 deletions(-) diff --git a/google/cloud/functions/framework.h b/google/cloud/functions/framework.h index 438a7c8e..bc795191 100644 --- a/google/cloud/functions/framework.h +++ b/google/cloud/functions/framework.h @@ -15,6 +15,7 @@ #ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FRAMEWORK_H #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_FRAMEWORK_H +#include "google/cloud/functions/function.h" #include "google/cloud/functions/user_functions.h" #include "google/cloud/functions/version.h" #include @@ -22,13 +23,51 @@ namespace google::cloud::functions { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +/** + * Runs function wrapped by @p handler. + * + * Starts a HTTP server at the address and listening endpoint described by + * @p argv, invoking @p handler to handle any HTTP request. + * + * If @p handler wraps a function with the Cloud Event signature, then the + * incoming HTTP requests **MUST** conform to the Cloud Events [HTTP protocol + * binding specification][cloud-events-spec]. + * + * @note + * When deploying code to Google Cloud Functions applications should **not** use + * this function directly. The buildpack will automatically create a `main()` + * and invoke `Run()` with the correct parameters. We recommend that application + * developers use this function only for local development and integration + * tests. + * + * @par Example + * @code + * namespace gcf = ::google::cloud::functions; + * + * extern gcf::HttpResponse MyHandler(gcf::HttpRequest); + * + * int main(int argc, char* argv[]) { + * return gcf::Run(argc, argv, gcf::MakeFunction(MyHandler)); + * } + * @endcode + * + * @see ParseOptions for more details of the command-line arguments used by this + * function. + * + * [cloud-events-spec]: + * https://github.com/cloudevents/spec/blob/v1.0/http-protocol-binding.md + */ +int Run(int argc, char const* const argv[], Function const& handler) noexcept; + /** * Run the given function, invoking it to handle HTTP requests. * + * @deprecated Prefer using the overload consuming a `Function` object. + * * Starts a HTTP server at the address and listening endpoint described by * @p argv, invoking @p handler to handle any HTTP request. * - * When deploying code to Google Cloud Functions applications should**not** use + * When deploying code to Google Cloud Functions applications should **not** use * this function directly. The buildpack will automatically create a `main()` * and invoke `Run()` with the correct parameters. We recommend that application * developers use this function only for local development and integration @@ -53,11 +92,13 @@ int Run(int argc, char const* const argv[], UserHttpFunction handler) noexcept; /** * Run the given function, invoking it to handle Cloud Events. * + * @deprecated Prefer using the overload consuming a `Function` object. + * * Starts a HTTP server at the address and listening endpoint described by * @p argv, invoking @p handler to handle any HTTP request which *MUST* conform * to the Cloud Events [HTTP protocol binding][cloud-events-spec]. * - * When deploying code to Google Cloud Functions applications should**not** use + * When deploying code to Google Cloud Functions applications should **not** use * this function directly. The buildpack will automatically create a `main()` * and invoke `Run()` with the correct parameters. We recommend that application * developers use this function only for local development and integration diff --git a/google/cloud/functions/integration_tests/cloud_event_conformance.cc b/google/cloud/functions/integration_tests/cloud_event_conformance.cc index ee9e9472..66d04510 100644 --- a/google/cloud/functions/integration_tests/cloud_event_conformance.cc +++ b/google/cloud/functions/integration_tests/cloud_event_conformance.cc @@ -63,6 +63,6 @@ void CloudEventConformance(functions::CloudEvent const& ev) { int main(int argc, char* argv[]) { return google::cloud::functions_internal::RunForTest( - argc, argv, CloudEventConformance, [] { return shutdown_server.load(); }, - [](int /*port*/) {}); + argc, argv, functions::MakeFunction(CloudEventConformance), + [] { return shutdown_server.load(); }, [](int /*port*/) {}); } diff --git a/google/cloud/functions/integration_tests/cloud_event_handler.cc b/google/cloud/functions/integration_tests/cloud_event_handler.cc index 9d0a18ab..48370a64 100644 --- a/google/cloud/functions/integration_tests/cloud_event_handler.cc +++ b/google/cloud/functions/integration_tests/cloud_event_handler.cc @@ -38,6 +38,6 @@ void CloudEventHandler(CloudEvent const& event) { int main(int argc, char* argv[]) { return google::cloud::functions_internal::RunForTest( - argc, argv, CloudEventHandler, [] { return shutdown_server.load(); }, - [](int /*port*/) {}); + argc, argv, google::cloud::functions::MakeFunction(CloudEventHandler), + [] { return shutdown_server.load(); }, [](int /*port*/) {}); } diff --git a/google/cloud/functions/integration_tests/echo_server.cc b/google/cloud/functions/integration_tests/echo_server.cc index 09389232..e5eff03d 100644 --- a/google/cloud/functions/integration_tests/echo_server.cc +++ b/google/cloud/functions/integration_tests/echo_server.cc @@ -71,6 +71,6 @@ HttpResponse EchoServer(HttpRequest const& request) { int main(int argc, char* argv[]) { return google::cloud::functions_internal::RunForTest( - argc, argv, EchoServer, [] { return shutdown_server.load(); }, - [](int /*port*/) {}); + argc, argv, google::cloud::functions::MakeFunction(EchoServer), + [] { return shutdown_server.load(); }, [](int /*port*/) {}); } diff --git a/google/cloud/functions/integration_tests/http_conformance.cc b/google/cloud/functions/integration_tests/http_conformance.cc index 2694d53e..33e6c3bd 100644 --- a/google/cloud/functions/integration_tests/http_conformance.cc +++ b/google/cloud/functions/integration_tests/http_conformance.cc @@ -30,6 +30,6 @@ functions::HttpResponse HttpConformance(functions::HttpRequest const& request) { int main(int argc, char* argv[]) { return google::cloud::functions_internal::RunForTest( - argc, argv, HttpConformance, [] { return shutdown_server.load(); }, - [](int /*port*/) {}); + argc, argv, google::cloud::functions::MakeFunction(HttpConformance), + [] { return shutdown_server.load(); }, [](int /*port*/) {}); } diff --git a/google/cloud/functions/internal/framework_impl.cc b/google/cloud/functions/internal/framework_impl.cc index e53f5a3b..4a4a43d9 100644 --- a/google/cloud/functions/internal/framework_impl.cc +++ b/google/cloud/functions/internal/framework_impl.cc @@ -13,7 +13,7 @@ // limitations under the License. #include "google/cloud/functions/internal/framework_impl.h" -#include "google/cloud/functions/internal/call_user_function.h" +#include "google/cloud/functions/internal/function_impl.h" #include "google/cloud/functions/internal/parse_options.h" #include "google/cloud/functions/version.h" #include @@ -34,12 +34,12 @@ namespace be = boost::beast; namespace asio = boost::asio; using tcp = boost::asio::ip::tcp; -template -void HandleSession(tcp::socket socket, UserFunction const& user_function) { +void HandleSession(tcp::socket socket, Handler const& handler) { auto report_error = [](be::error_code ec, char const* what) { // TODO(#35) - maybe replace with Boost.Log std::cerr << what << ": " << ec.message() << "\n"; }; + be::error_code ec; for (;;) { be::flat_buffer buffer; @@ -49,7 +49,7 @@ void HandleSession(tcp::socket socket, UserFunction const& user_function) { if (ec == be::http::error::end_of_stream) break; if (ec) return report_error(ec, "read"); auto const keep_alive = request.keep_alive(); - auto response = CallUserFunction(user_function, std::move(request)); + auto response = handler(std::move(request)); // Flush any buffered output, as the application may be shutdown immediately // after the HTTP response is sent. std::cout << std::flush; @@ -65,8 +65,8 @@ void HandleSession(tcp::socket socket, UserFunction const& user_function) { socket.shutdown(tcp::socket::shutdown_send, ec); } -template -int RunForTestImpl(int argc, char const* const argv[], UserFunction&& function, +int RunForTestImpl(int argc, char const* const argv[], + functions::Function const& function, std::function const& shutdown, std::function const& actual_port) { auto vm = ParseOptions(argc, argv); @@ -74,16 +74,18 @@ int RunForTestImpl(int argc, char const* const argv[], UserFunction&& function, auto address = asio::ip::make_address(vm["address"].as()); auto port = vm["port"].as(); + auto target = vm["target"].as(); asio::io_context ioc{1}; tcp::acceptor acceptor{ioc, {address, static_cast(port)}}; acceptor.listen(boost::asio::socket_base::max_connections); actual_port(acceptor.local_endpoint().port()); - auto handle_session = - [h = std::forward(function)](tcp::socket socket) { - HandleSession(std::move(socket), h); - }; + auto handler = FunctionImpl::GetImpl(function)->GetHandler(target); + + auto handle_session = [h = std::move(handler)](tcp::socket socket) { + HandleSession(std::move(socket), h); + }; auto cleanup = [](std::vector> sessions, auto wait) { std::vector> running; @@ -124,11 +126,10 @@ int RunForTestImpl(int argc, char const* const argv[], UserFunction&& function, return 0; } -template -int RunImpl(int argc, char const* const argv[], UserFunction&& f) noexcept try { +int RunImpl(int argc, char const* const argv[], + functions::Function const& f) noexcept try { return RunForTestImpl( - argc, argv, std::forward(f), [] { return false; }, - [](int /*unused*/) {}); + argc, argv, f, [] { return false; }, [](int /*unused*/) {}); } catch (std::exception const& ex) { std::cerr << "Standard C++ exception thrown " << ex.what() << "\n"; return 1; @@ -140,17 +141,10 @@ int RunImpl(int argc, char const* const argv[], UserFunction&& f) noexcept try { } // namespace int RunForTest(int argc, char const* const argv[], - functions::UserHttpFunction handler, - std::function const& shutdown, - std::function const& actual_port) { - return RunForTestImpl(argc, argv, std::move(handler), shutdown, actual_port); -} - -int RunForTest(int argc, char const* const argv[], - functions::UserCloudEventFunction handler, + functions::Function const& handler, std::function const& shutdown, std::function const& actual_port) { - return RunForTestImpl(argc, argv, std::move(handler), shutdown, actual_port); + return RunForTestImpl(argc, argv, handler, shutdown, actual_port); } FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END @@ -159,13 +153,19 @@ FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END namespace google::cloud::functions { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +int Run(int argc, char const* const argv[], Function const& handler) noexcept { + return functions_internal::RunImpl(argc, argv, handler); +} + int Run(int argc, char const* const argv[], UserHttpFunction handler) noexcept { - return functions_internal::RunImpl(argc, argv, std::move(handler)); + return functions_internal::RunImpl( + argc, argv, functions::MakeFunction(std::move(handler))); } int Run(int argc, char const* const argv[], UserCloudEventFunction handler) noexcept { - return functions_internal::RunImpl(argc, argv, std::move(handler)); + return functions_internal::RunImpl( + argc, argv, functions::MakeFunction(std::move(handler))); } FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_END diff --git a/google/cloud/functions/internal/framework_impl.h b/google/cloud/functions/internal/framework_impl.h index 0a7f6f3d..70b2be67 100644 --- a/google/cloud/functions/internal/framework_impl.h +++ b/google/cloud/functions/internal/framework_impl.h @@ -15,6 +15,7 @@ #ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FRAMEWORK_IMPL_H #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_FRAMEWORK_IMPL_H +#include "google/cloud/functions/function.h" #include "google/cloud/functions/user_functions.h" #include "google/cloud/functions/version.h" #include @@ -24,13 +25,7 @@ FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /// Implement functions::Run(), with additional helpers for testing. int RunForTest(int argc, char const* const argv[], - functions::UserHttpFunction handler, - std::function const& shutdown, - std::function const& actual_port); - -/// Implement functions::Run(), with additional helpers for testing. -int RunForTest(int argc, char const* const argv[], - functions::UserCloudEventFunction handler, + functions::Function const& handler, std::function const& shutdown, std::function const& actual_port); diff --git a/google/cloud/functions/internal/framework_impl_test.cc b/google/cloud/functions/internal/framework_impl_test.cc index 63ec7e35..b2adf745 100644 --- a/google/cloud/functions/internal/framework_impl_test.cc +++ b/google/cloud/functions/internal/framework_impl_test.cc @@ -110,7 +110,8 @@ TEST(FrameworkTest, Http) { auto run = [&](int argc, char const* const argv[], functions::UserHttpFunction f) { return RunForTest( - argc, argv, std::move(f), [&shutdown]() { return shutdown.load(); }, + argc, argv, functions::MakeFunction(std::move(f)), + [&shutdown]() { return shutdown.load(); }, [&port_p](int port) mutable { port_p.set_value(port); }); }; auto done = std::async(std::launch::async, run, static_cast(kTestArgc), @@ -143,7 +144,8 @@ TEST(FrameworkTest, CloudEvent) { auto run = [&](int argc, char const* const argv[], functions::UserCloudEventFunction f) { return RunForTest( - argc, argv, std::move(f), [&shutdown]() { return shutdown.load(); }, + argc, argv, functions::MakeFunction(std::move(f)), + [&shutdown]() { return shutdown.load(); }, [&port_p](int port) mutable { port_p.set_value(port); }); }; auto done = std::async(std::launch::async, run, static_cast(kTestArgc), From af5534f87098c59181b5a1aa1d5adcad40dd77c2 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 16:15:16 -0400 Subject: [PATCH 21/77] cleanup: address review comments (#341) This PR addresses review comments after an automatic merge. --- examples/site/bearer_token/bearer_token.cc | 2 +- google/cloud/functions/framework.h | 38 ++++++++++++---------- google/cloud/functions/http_request.h | 4 +-- google/cloud/functions/http_response.h | 4 +-- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/examples/site/bearer_token/bearer_token.cc b/examples/site/bearer_token/bearer_token.cc index 803b56c5..fad8408b 100644 --- a/examples/site/bearer_token/bearer_token.cc +++ b/examples/site/bearer_token/bearer_token.cc @@ -26,7 +26,7 @@ namespace gcf = ::google::cloud::functions; namespace { -/// A helper function to perform a HTTP GET request. +/// A helper function to perform an HTTP GET request. gcf::HttpResponse HttpGet(std::string const& url, std::string const& authorization_header); } // namespace diff --git a/google/cloud/functions/framework.h b/google/cloud/functions/framework.h index bc795191..5caa46c8 100644 --- a/google/cloud/functions/framework.h +++ b/google/cloud/functions/framework.h @@ -26,7 +26,7 @@ FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** * Runs function wrapped by @p handler. * - * Starts a HTTP server at the address and listening endpoint described by + * Starts an HTTP server at the address and listening endpoint described by * @p argv, invoking @p handler to handle any HTTP request. * * If @p handler wraps a function with the Cloud Event signature, then the @@ -34,11 +34,11 @@ FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN * binding specification][cloud-events-spec]. * * @note - * When deploying code to Google Cloud Functions applications should **not** use - * this function directly. The buildpack will automatically create a `main()` - * and invoke `Run()` with the correct parameters. We recommend that application - * developers use this function only for local development and integration - * tests. + * When deploying code to Google Cloud Functions applications should **not** + * call this function directly. The buildpack will automatically create a + * `main()` and invoke `Run()` with the correct parameters. We recommend that + * application developers use this function only for local development and + * integration tests. * * @par Example * @code @@ -64,14 +64,15 @@ int Run(int argc, char const* const argv[], Function const& handler) noexcept; * * @deprecated Prefer using the overload consuming a `Function` object. * - * Starts a HTTP server at the address and listening endpoint described by + * Starts an HTTP server at the address and listening endpoint described by * @p argv, invoking @p handler to handle any HTTP request. * - * When deploying code to Google Cloud Functions applications should **not** use - * this function directly. The buildpack will automatically create a `main()` - * and invoke `Run()` with the correct parameters. We recommend that application - * developers use this function only for local development and integration - * tests. + * @note + * When deploying code to Google Cloud Functions applications should **not** + * call this function directly. The buildpack will automatically create a + * `main()` and invoke `Run()` with the correct parameters. We recommend that + * application developers use this function only for local development and + * integration tests. * * @par Example * @code @@ -94,15 +95,16 @@ int Run(int argc, char const* const argv[], UserHttpFunction handler) noexcept; * * @deprecated Prefer using the overload consuming a `Function` object. * - * Starts a HTTP server at the address and listening endpoint described by + * Starts an HTTP server at the address and listening endpoint described by * @p argv, invoking @p handler to handle any HTTP request which *MUST* conform * to the Cloud Events [HTTP protocol binding][cloud-events-spec]. * - * When deploying code to Google Cloud Functions applications should **not** use - * this function directly. The buildpack will automatically create a `main()` - * and invoke `Run()` with the correct parameters. We recommend that application - * developers use this function only for local development and integration - * tests. + * @note + * When deploying code to Google Cloud Functions applications should **not** + * call this function directly. The buildpack will automatically create a + * `main()` and invoke `Run()` with the correct parameters. We recommend that + * application developers use this function only for local development and + * integration tests. * * @par Example * @code diff --git a/google/cloud/functions/http_request.h b/google/cloud/functions/http_request.h index bacb22ad..53c9827f 100644 --- a/google/cloud/functions/http_request.h +++ b/google/cloud/functions/http_request.h @@ -24,9 +24,9 @@ namespace google::cloud::functions { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** - * Represents a HTTP request. + * Represents an HTTP request. * - * Functions to handle HTTP requests receive an object of this class. + * Functions to handle HTTP requests receive an object of this type. */ class HttpRequest { public: diff --git a/google/cloud/functions/http_response.h b/google/cloud/functions/http_response.h index f108eab1..88d0c4a6 100644 --- a/google/cloud/functions/http_response.h +++ b/google/cloud/functions/http_response.h @@ -31,9 +31,9 @@ namespace google::cloud::functions { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN /** - * Represents a HTTP request. + * Represents an HTTP response. * - * Functions to handle HTTP requests receive an object of this class. + * Functions to handle HTTP requests return an object of this type. */ class HttpResponse { public: From 22179aef380eb5eb0127a7a378d365b24849f22e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 16:40:09 -0400 Subject: [PATCH 22/77] refactor: use `GOOGLE_` prefix in buildpack (#342) To validate the framework we create our own buildpack and use it to build the examples. With this change the buildpack uses `GOOGLE_` prefixes for the environment variables controlling its behavior, which matches how the official buildpacks are controlled: https://github.com/GoogleCloudPlatform/buildpacks#functions-framework-buildpacks --- build_scripts/pack/build.in | 2 +- build_scripts/pack/cloudbuild.yaml | 4 +- ci/README.md | 14 +- ci/build-examples.yaml | 152 +++++++++--------- ci/generate-build-examples.sh | 8 +- ci/pack/buildpack/bin/build | 2 +- examples/README.md | 12 +- .../howto_offload_builder_creation/README.md | 8 +- examples/site/testing_pubsub/README.md | 4 +- pack/buildpack/bin/build | 2 +- 10 files changed, 104 insertions(+), 104 deletions(-) diff --git a/build_scripts/pack/build.in b/build_scripts/pack/build.in index 1e0c9521..56619eb8 100644 --- a/build_scripts/pack/build.in +++ b/build_scripts/pack/build.in @@ -214,7 +214,7 @@ generate_main() { } generate_main \ - "${TARGET_FUNCTION}" "${FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" + "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" echo "-----> Configure Function" cat >"${layers}/binary.toml" <<_EOF_ diff --git a/build_scripts/pack/cloudbuild.yaml b/build_scripts/pack/cloudbuild.yaml index 102af423..ee3c2e5f 100644 --- a/build_scripts/pack/cloudbuild.yaml +++ b/build_scripts/pack/cloudbuild.yaml @@ -67,8 +67,8 @@ steps: - name: 'pack' args: ['build', 'test-builder', '--builder', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/builder:bionic', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloWorld', '--path', 'examples/hello_world', ] diff --git a/ci/README.md b/ci/README.md index 45145897..8d667fc8 100644 --- a/ci/README.md +++ b/ci/README.md @@ -122,17 +122,17 @@ Create containers for the Hello World examples: ```sh pack build -v \ - --env FUNCTION_SIGNATURE_TYPE=cloudevent \ - --env TARGET_FUNCTION=hello_world_pubsub \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent \ + --env GOOGLE_FUNCTION_TARGET=hello_world_pubsub \ --path examples/site/hello_world_pubsub \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub" pack build -v \ - --env FUNCTION_SIGNATURE_TYPE=cloudevent \ - --env TARGET_FUNCTION=hello_world_storage \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent \ + --env GOOGLE_FUNCTION_TARGET=hello_world_storage \ --path examples/site/hello_world_storage \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage" pack build -v \ - --env TARGET_FUNCTION=hello_world_http \ + --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-http" ``` @@ -301,7 +301,7 @@ Build & deploy the Bigtable tutorial function: ```shell pack build -v \ - --env TARGET_FUNCTION=tutorial_cloud_bigtable \ + --env GOOGLE_FUNCTION_TARGET=tutorial_cloud_bigtable \ --path examples/site/tutorial_cloud_bigtable \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-bigtable" docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-bigtable" @@ -345,7 +345,7 @@ To populate the database, use the spanner examples from the C++ client library: ```shell pack build -v \ - --env TARGET_FUNCTION=tutorial_cloud_spanner \ + --env GOOGLE_FUNCTION_TARGET=tutorial_cloud_spanner \ --path examples/site/tutorial_cloud_spanner \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-spanner" docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-spanner" diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 8c9b1dd2..cc935bc6 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -62,8 +62,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-cloud-event' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=HelloCloudEvent', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloCloudEvent', '--path', 'examples/hello_cloud_event', 'hello-cloud-event', ] @@ -72,8 +72,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-namespace' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=hello_from_namespace::HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_from_namespace::HelloWorld', '--path', 'examples/hello_from_namespace', 'hello-from-namespace', ] @@ -82,8 +82,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-namespace-rooted' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=::hello_from_namespace::HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=::hello_from_namespace::HelloWorld', '--path', 'examples/hello_from_namespace', 'hello-from-namespace-rooted', ] @@ -92,8 +92,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-nested-namespace' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=hello_from_nested_namespace::ns0::ns1::HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_from_nested_namespace::ns0::ns1::HelloWorld', '--path', 'examples/hello_from_nested_namespace', 'hello-from-nested-namespace', ] @@ -102,8 +102,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-multiple-sources' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HelloMultipleSources', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloMultipleSources', '--path', 'examples/hello_multiple_sources', 'hello-multiple-sources', ] @@ -112,8 +112,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-gcs' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HelloGcs', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloGcs', '--path', 'examples/hello_gcs', 'hello-gcs', ] @@ -122,8 +122,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-with-third-party' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HelloWithThirdParty', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloWithThirdParty', '--path', 'examples/hello_with_third_party', 'hello-with-third-party', ] @@ -132,8 +132,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-world' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HelloWorld', '--path', 'examples/hello_world', 'hello-world', ] @@ -142,8 +142,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-world-rooted' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=::HelloWorld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=::HelloWorld', '--path', 'examples/hello_world', 'hello-world-rooted', ] @@ -152,8 +152,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'howto-use-legacy-code' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=HowtoUseLegacyCode', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=HowtoUseLegacyCode', '--path', 'examples/howto_use_legacy_code', 'howto-use-legacy-code', ] @@ -163,8 +163,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-bearer_token' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=bearer_token', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=bearer_token', '--path', 'examples/site/bearer_token', 'site-bearer_token', ] @@ -172,8 +172,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_response' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=concepts_after_response', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_response', '--path', 'examples/site/concepts_after_response', 'site-concepts_after_response', ] @@ -181,8 +181,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_timeout' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=concepts_after_timeout', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_timeout', '--path', 'examples/site/concepts_after_timeout', 'site-concepts_after_timeout', ] @@ -190,8 +190,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_filesystem' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=concepts_filesystem', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=concepts_filesystem', '--path', 'examples/site/concepts_filesystem', 'site-concepts_filesystem', ] @@ -199,8 +199,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_request' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=concepts_request', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=concepts_request', '--path', 'examples/site/concepts_request', 'site-concepts_request', ] @@ -208,8 +208,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_stateless' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=concepts_stateless', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=concepts_stateless', '--path', 'examples/site/concepts_stateless', 'site-concepts_stateless', ] @@ -217,8 +217,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-env_vars' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=env_vars', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=env_vars', '--path', 'examples/site/env_vars', 'site-env_vars', ] @@ -226,8 +226,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_error' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=hello_world_error', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_error', '--path', 'examples/site/hello_world_error', 'site-hello_world_error', ] @@ -235,8 +235,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_get' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=hello_world_get', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_get', '--path', 'examples/site/hello_world_get', 'site-hello_world_get', ] @@ -244,8 +244,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_http' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=hello_world_http', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_http', '--path', 'examples/site/hello_world_http', 'site-hello_world_http', ] @@ -253,8 +253,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_pubsub' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=hello_world_pubsub', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_pubsub', '--path', 'examples/site/hello_world_pubsub', 'site-hello_world_pubsub', ] @@ -262,8 +262,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_storage' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=hello_world_storage', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_storage', '--path', 'examples/site/hello_world_storage', 'site-hello_world_storage', ] @@ -271,8 +271,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_content' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_content', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_content', '--path', 'examples/site/http_content', 'site-http_content', ] @@ -280,8 +280,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_cors' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_cors', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_cors', '--path', 'examples/site/http_cors', 'site-http_cors', ] @@ -289,8 +289,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_cors_auth' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_cors_auth', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_cors_auth', '--path', 'examples/site/http_cors_auth', 'site-http_cors_auth', ] @@ -298,8 +298,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_form_data' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_form_data', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_form_data', '--path', 'examples/site/http_form_data', 'site-http_form_data', ] @@ -307,8 +307,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_method' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_method', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_method', '--path', 'examples/site/http_method', 'site-http_method', ] @@ -316,8 +316,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_xml' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=http_xml', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=http_xml', '--path', 'examples/site/http_xml', 'site-http_xml', ] @@ -325,8 +325,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-log_helloworld' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=log_helloworld', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=log_helloworld', '--path', 'examples/site/log_helloworld', 'site-log_helloworld', ] @@ -334,8 +334,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-log_stackdriver' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=log_stackdriver', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=log_stackdriver', '--path', 'examples/site/log_stackdriver', 'site-log_stackdriver', ] @@ -343,8 +343,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-pubsub_subscribe' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=pubsub_subscribe', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=pubsub_subscribe', '--path', 'examples/site/pubsub_subscribe', 'site-pubsub_subscribe', ] @@ -352,8 +352,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_gcp_apis' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=tips_gcp_apis', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=tips_gcp_apis', '--path', 'examples/site/tips_gcp_apis', 'site-tips_gcp_apis', ] @@ -361,8 +361,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_infinite_retries' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=tips_infinite_retries', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=tips_infinite_retries', '--path', 'examples/site/tips_infinite_retries', 'site-tips_infinite_retries', ] @@ -370,8 +370,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_lazy_globals' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=tips_lazy_globals', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=tips_lazy_globals', '--path', 'examples/site/tips_lazy_globals', 'site-tips_lazy_globals', ] @@ -379,8 +379,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_retry' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=cloudevent', - '--env', 'TARGET_FUNCTION=tips_retry', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', + '--env', 'GOOGLE_FUNCTION_TARGET=tips_retry', '--path', 'examples/site/tips_retry', 'site-tips_retry', ] @@ -388,8 +388,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_scopes' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=tips_scopes', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=tips_scopes', '--path', 'examples/site/tips_scopes', 'site-tips_scopes', ] @@ -397,8 +397,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tutorial_cloud_bigtable' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=tutorial_cloud_bigtable', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=tutorial_cloud_bigtable', '--path', 'examples/site/tutorial_cloud_bigtable', 'site-tutorial_cloud_bigtable', ] @@ -406,8 +406,8 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tutorial_cloud_spanner' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=http', - '--env', 'TARGET_FUNCTION=tutorial_cloud_spanner', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', + '--env', 'GOOGLE_FUNCTION_TARGET=tutorial_cloud_spanner', '--path', 'examples/site/tutorial_cloud_spanner', 'site-tutorial_cloud_spanner', ] diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 9cacb412..920e0fcc 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -92,8 +92,8 @@ generic_example() { waitFor: ['gcf-builder-ready'] id: '${container}' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=${signature}', - '--env', 'TARGET_FUNCTION=${function}', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}', + '--env', 'GOOGLE_FUNCTION_TARGET=${function}', '--path', 'examples/${example}', '${container}', ] @@ -115,8 +115,8 @@ site_example() { waitFor: ['gcf-builder-ready'] id: '${container}' args: ['build', - '--env', 'FUNCTION_SIGNATURE_TYPE=${signature}', - '--env', 'TARGET_FUNCTION=${function}', + '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}', + '--env', 'GOOGLE_FUNCTION_TARGET=${function}', '--path', '${example}', '${container}', ] diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index 78c228db..6f0dbfda 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -233,7 +233,7 @@ generate_main() { } generate_main \ - "${TARGET_FUNCTION}" "${FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" + "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" echo "-----> Configure Function" cat >"${layers}/binary.toml" <<_EOF_ diff --git a/examples/README.md b/examples/README.md index 4394a87b..c7b80e4c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -41,8 +41,8 @@ Compile any HTTP example using: ```sh pack build "my-image" \ - --env TARGET_FUNCTION=$EXAMPLE_FUNCTION_NAME \ - --env FUNCTION_SIGNATURE_TYPE=http \ + --env GOOGLE_FUNCTION_TARGET=$EXAMPLE_FUNCTION_NAME \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --path examples/$EXAMPLE_DIRECTORY ``` @@ -50,8 +50,8 @@ for example: ```sh pack build "hello-world" \ - --env TARGET_FUNCTION=HelloWorld \ - --env FUNCTION_SIGNATURE_TYPE=http \ + --env GOOGLE_FUNCTION_TARGET=HelloWorld \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --path examples/hello_world ``` @@ -76,8 +76,8 @@ Create the Docker image, with a tag suitable for deployment to Cloud Run: ```sh pack build "gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-world" \ - --env TARGET_FUNCTION=HelloWorld \ - --env FUNCTION_SIGNATURE_TYPE=http \ + --env GOOGLE_FUNCTION_TARGET=HelloWorld \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --path examples/hello_world ``` diff --git a/examples/site/howto_offload_builder_creation/README.md b/examples/site/howto_offload_builder_creation/README.md index b5ea56b4..d2870b24 100644 --- a/examples/site/howto_offload_builder_creation/README.md +++ b/examples/site/howto_offload_builder_creation/README.md @@ -98,8 +98,8 @@ Build a Docker image from your function using this buildpack: ```shell pack build \ --builder gcr.io/${GOOGLE_CLOUD_PROJECT}/functions-framework-cpp/builder:bionic \ - --env FUNCTION_SIGNATURE_TYPE=http \ - --env TARGET_FUNCTION=hello_world_http \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ + --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ gcf-cpp-hello-world-http ``` @@ -116,8 +116,8 @@ Then the command becomes: ```shell pack build \ - --env FUNCTION_SIGNATURE_TYPE=http \ - --env TARGET_FUNCTION=hello_world_http \ + --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ + --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ gcf-cpp-hello-world-http ``` diff --git a/examples/site/testing_pubsub/README.md b/examples/site/testing_pubsub/README.md index 62b80992..889a15ac 100644 --- a/examples/site/testing_pubsub/README.md +++ b/examples/site/testing_pubsub/README.md @@ -68,8 +68,8 @@ This guide assumes that you have: ```shell pack build \ --builder gcf-cpp-builder:bionic \ - --env "FUNCTION_SIGNATURE_TYPE=cloudevent" \ - --env "TARGET_FUNCTION=hello_world_pubsub" \ + --env "GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent" \ + --env "GOOGLE_FUNCTION_TARGET=hello_world_pubsub" \ --path "examples/site/hello_world_pubsub" \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub" ``` diff --git a/pack/buildpack/bin/build b/pack/buildpack/bin/build index d2bbb73d..994c0b08 100755 --- a/pack/buildpack/bin/build +++ b/pack/buildpack/bin/build @@ -233,7 +233,7 @@ generate_main() { } generate_main \ - "${TARGET_FUNCTION}" "${FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" + "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" echo "-----> Configure Function" cat >"${layers}/binary.toml" <<_EOF_ From 2b469e3d0d5bc67e050c5e9e558e705973820c59 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 15 Mar 2022 22:41:41 -0400 Subject: [PATCH 23/77] chore: update .dockerignore file (#343) Add some directories that appear as part of local GCB builds, this speeds up local testing of buildpacks and other Docker-based workflows. --- .dockerignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.dockerignore b/.dockerignore index 97c95cf4..23f96164 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,8 @@ # Common build output directory names .build/ _build/ +cmake-out/ +build-out/ # Used by some IDEs and LSP plugins compile_commands.json From 32cd8677642348524835940beefff188fc9a399e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 08:01:46 -0400 Subject: [PATCH 24/77] cleanup: remove obsolete document (#346) We no longer need to offload the buildpack build, the examples recommend using the official GCP buildpacks, which are available from Google Container Registry. --- build_scripts/pack/cloudbuild.yaml | 79 ---------- .../howto_offload_builder_creation/README.md | 147 ------------------ 2 files changed, 226 deletions(-) delete mode 100644 build_scripts/pack/cloudbuild.yaml delete mode 100644 examples/site/howto_offload_builder_creation/README.md diff --git a/build_scripts/pack/cloudbuild.yaml b/build_scripts/pack/cloudbuild.yaml deleted file mode 100644 index ee3c2e5f..00000000 --- a/build_scripts/pack/cloudbuild.yaml +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -timeout: 3600s -options: - machineType: 'N1_HIGHCPU_32' - diskSizeGb: "512" - -steps: - # Create a docker image for the buildpacks `pack` tool - - name: 'gcr.io/cloud-builders/docker' - args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] - - # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' - args: [ - "--context=dir:///workspace/", - "--dockerfile=build_scripts/Dockerfile", - "--cache=true", - "--cache-repo=gcr.io/${PROJECT_ID}/functions-framework-cpp/cache", - "--target=gcf-cpp-runtime", - "--destination=gcr.io/${PROJECT_ID}/functions-framework-cpp/run-image", - ] - waitFor: ['-'] - timeout: 1800s - - name: 'gcr.io/cloud-builders/docker' - args: ['pull', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/run-image'] - - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' - args: [ - "--context=dir:///workspace/", - "--dockerfile=build_scripts/Dockerfile", - "--cache=true", - "--cache-repo=gcr.io/${PROJECT_ID}/functions-framework-cpp/cache", - "--target=gcf-cpp-develop", - "--destination=gcr.io/${PROJECT_ID}/functions-framework-cpp/build-image", - ] - waitFor: ['-'] - timeout: 1800s - - name: 'gcr.io/cloud-builders/docker' - args: ['pull', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/build-image'] - - - name: 'ubuntu' - waitFor: ['-'] - volumes: - - name: 'builder-spec' - path: '/builder' - args: ['build_scripts/pack/generate-builder.sh', '2021', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/', '/builder'] - - - name: 'pack' - volumes: - - name: 'builder-spec' - path: '/builder' - args: ['builder', 'create', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/builder:bionic', '--config', '/builder/builder.toml'] - - - name: 'pack' - args: ['build', 'test-builder', - '--builder', 'gcr.io/${PROJECT_ID}/functions-framework-cpp/builder:bionic', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', - '--env', 'GOOGLE_FUNCTION_TARGET=HelloWorld', - '--path', 'examples/hello_world', - ] - -images: [ - 'gcr.io/${PROJECT_ID}/functions-framework-cpp/run-image', - 'gcr.io/${PROJECT_ID}/functions-framework-cpp/build-image', - 'gcr.io/${PROJECT_ID}/functions-framework-cpp/builder:bionic' -] diff --git a/examples/site/howto_offload_builder_creation/README.md b/examples/site/howto_offload_builder_creation/README.md deleted file mode 100644 index d2870b24..00000000 --- a/examples/site/howto_offload_builder_creation/README.md +++ /dev/null @@ -1,147 +0,0 @@ -# How-to Guide: Use Cloud Build to create a buildpacks builder - -This guide shows you how to use [Cloud Build][cloud-build] to offload the -creation of [buildpacks] builders. - -## Pre-requisites - -This guide assumes you are familiar with Google Cloud, and that you have a GCP -project with Cloud Build enabled. If needed, consult: -* the [GCP quickstarts][gcp-quickstarts] to setup a GCP project -* the [cloud build quickstarts][cloud-build-quickstarts] to setup Cloud Build - in your project - -This guide shows you how to test the builder by using it to create a local -container. These steps will require you to have [docker] and the -[pack tool][pack-install] on your workstation. - -Verify the [docker tool][docker] is functional on your workstation: - -```shell -docker run hello-world -# Output: Hello from Docker! and then some more informational messages. -``` - -If needed, use the [online instructions][docker-install] to download and install -this tool. This guide assumes that you have configured [sudoless docker]. If -you prefer replace all `docker` commands below with `sudo docker`. - -Verify the [pack tool][pack-install] is functional on our workstation. These -instructions were tested with v0.17.0, although they should work with newer -versions. Some commands may not work with older versions. - -```shell -pack version -# Output: a version number, e.g., 0.17.0+git-d9cb4e7.build-2045 -``` - -## Getting the code for this example - -This example is included in the Functions Framework for C++ -[source code repository][repository-gh]. Download this code as usual: - -```shell -cd $HOME -git clone https://github.com/GoogleCloudPlatform/functions-framework-cpp -``` - -The rest of this guide will assume you are issuing commands in the framework's -clone: - -```shell -cd $HOME/functions-framework-cpp -``` - -## Create the buildpacks builder - -Set the `GOOGLE_CLOUD_PROJECT` shell variable to the project id of your GCP -project, and schedule a build to create your buildpack: - -```shell -GOOGLE_CLOUD_PROJECT=... # put the right value here -gcloud builds submit \ - "--project=${GOOGLE_CLOUD_PROJECT}" \ - "--config=build_scripts/pack/cloudbuild.yaml" -``` - -## The test function - -In this guide we will be using the [HTTP hello word][hello-world-http] function: - -```cc -#include -#include -#include - -namespace gcf = ::google::cloud::functions; - -gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { - auto greeting = [r = std::move(request)] { - auto request_json = nlohmann::json::parse(r.payload(), /*cb=*/nullptr, - /*allow_exceptions=*/false); - if (request_json.count("name") && request_json["name"].is_string()) { - return "Hello " + request_json.value("name", "World") + "!"; - } - return std::string("Hello World!"); - }; - - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload(greeting()); -} -``` - -## Building a Docker image - -Build a Docker image from your function using this buildpack: - -```shell -pack build \ - --builder gcr.io/${GOOGLE_CLOUD_PROJECT}/functions-framework-cpp/builder:bionic \ - --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ - --env GOOGLE_FUNCTION_TARGET=hello_world_http \ - --path examples/site/hello_world_http \ - gcf-cpp-hello-world-http -``` - -To avoid typing the long builder name you can make this your default -builder: - -```shell -pack config default-builder \ - gcr.io/${GOOGLE_CLOUD_PROJECT}/functions-framework-cpp/builder:bionic -``` - -Then the command becomes: - -```shell -pack build \ - --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ - --env GOOGLE_FUNCTION_TARGET=hello_world_http \ - --path examples/site/hello_world_http \ - gcf-cpp-hello-world-http -``` - -## Cleanup - -Delete the images created by Cloud Build: - -```shell -for image in \ - gcr.io/${GOOGLE_CLOUD_PROJECT}/functions-framework-cpp/{builder,cache,build-image,run-image}; do - gcloud container images list-tags "${image}" --format='get(digest)' | \ - xargs printf "${image}@%s\n" | \ - xargs gcloud container images delete --force-delete-tags -done -``` - -[repository-gh]: https://github.com/GoogleCloudPlatform/functions-framework-cpp -[cloud-build-quickstarts]: https://cloud.google.com/build/docs/quickstarts -[gcp-quickstarts]: https://cloud.google.com/resource-manager/docs/creating-managing-projects -[buildpacks]: https://buildpacks.io -[docker]: https://docker.com/ -[docker-install]: https://store.docker.com/search?type=edition&offering=community -[sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ -[pack-install]: https://buildpacks.io/docs/install-pack/ -[hello-world-http]: /examples/site/hello_world_http/hello_world_http.cc -[cloud-build]: https://cloud.google.com/cloud-build From af16ce4ee2b049b240cdae016f650f1fc1a6fd64 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 09:15:06 -0400 Subject: [PATCH 25/77] cleanup: remove unused buildpack (#344) We used to create a buildpack for the CI builds, and a separate buildpack for the user-facing READMEs. A while back we changed the user-facing READMEs to use the official GCP buildpacks, this cleans up the now (largely) unused code. I also updated the documents that referenced these buildpacks when they shouldn't, and I took the opportunity to (a) clarify what is the purpose and intended audience of these docs, (b) cross-reference the docs in case folks land in the wrong document, and (c) create an index of the key how-to guides to have a single thing to cross-reference. --- .github/workflows/style.yaml | 3 - ci/README.md | 44 +++--- examples/README.md | 42 ++++-- examples/howto-guides.md | 15 ++ pack/builder.toml | 31 ---- pack/buildpack/bin/build | 263 ---------------------------------- pack/buildpack/bin/detect | 29 ---- pack/buildpack/buildpack.toml | 27 ---- 8 files changed, 70 insertions(+), 384 deletions(-) create mode 100644 examples/howto-guides.md delete mode 100644 pack/builder.toml delete mode 100755 pack/buildpack/bin/build delete mode 100755 pack/buildpack/bin/detect delete mode 100644 pack/buildpack/buildpack.toml diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index afd33f49..38ae7515 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -129,9 +129,6 @@ jobs: - name: regenerate-build-examples run: > ./ci/generate-build-examples.sh >ci/build-examples.yaml - - name: regenerate-buildpacks - run: > - ./build_scripts/pack/generate-builder.sh 2020 gcf-cpp- pack - name: regenerate-buildpacks run: > ./build_scripts/pack/generate-builder.sh 2021 ci- ci/pack diff --git a/ci/README.md b/ci/README.md index 8d667fc8..a91e3b7a 100644 --- a/ci/README.md +++ b/ci/README.md @@ -1,14 +1,22 @@ # Configuring the CI Environment -We use several Google Cloud Platform services to perform integration tests. -These notes describe how to setup a project to run these integration tests. -The main audience for these notes are developers working to improve the -Functions Framework for C++. They assume the reader is familiar with GCP and -with the Google Cloud SDK command-line tool. +These notes describe how to set up a GCP project to run these Functions +Framework for C++ integration tests. The main audience for these notes are +developers of the Functions Framework. + +- If you are looking for examples on how to **use** the Functions Framework for + C++, the [How-to Guides](/examples/howto-guides.md) should help you get + started. +- If you want to compile and test the examples after making changes to the + framework, then read + [Testing the Functions Framework Examples](/examples/README.md) +- If you are looking for detailed instructions to configure the CI + environment, this is the document you should read. ## Pre-requisites -These notes assume you have setup a valid GCP project, with billing enabled. +These notes assume you are familiar with GCP, with the Google Cloud SDK +command-line too, and have set up a valid GCP project, with billing enabled. > :warning: Most of these services will incur billing costs, probably in the > hundreds of dollars per month. Do not run these steps unless you understand @@ -51,8 +59,8 @@ gsutil mb -p "${GOOGLE_CLOUD_PROJECT}" \ ### Grant the GCS service permissions to publish to Pub/Sub -Get the GCS service account. This will print the service account -as the `email_address` field in a JSON object: +Get the GCS service account. This will print the service account as +the `email_address` field in a JSON object: ```shell curl -X GET -H "Authorization: Bearer $(gcloud auth print-access-token)" \ @@ -65,7 +73,7 @@ Capture the field value in a variable: GCS_SA="... @gs-project-accounts.iam.gserviceaccount.com" ``` -Add this service account to the topic:Grant the +Add this service account to the topic:Grant the ```shell gcloud pubsub topics add-iam-policy-binding \ @@ -102,17 +110,16 @@ gcloud projects add-iam-policy-binding "${GOOGLE_CLOUD_PROJECT}" \ "--role=roles/run.invoker" ``` - ## Verify the Resources -Create the buildpack builder. Note that this uses the *CI* image, because -you (most likely) want to build with the current version of the framework, -not with the last release: +Create the buildpack builder. Note that this uses the *CI* image, because you ( +most likely) want to build with the current version of the framework, not with +the last release: ```sh cd functions-framework-cpp -docker build -t gcf-cpp-run-image --target gcf-cpp-runtime -f build_scripts/Dockerfile build_scripts -docker build -t gcf-cpp-build-image --target gcf-cpp-ci -f build_scripts/Dockerfile . +docker build -t ci-run-image --target gcf-cpp-runtime -f build_scripts/Dockerfile build_scripts +docker build -t ci-build-image --target gcf-cpp-ci -f build_scripts/Dockerfile . pack builder create gcf-cpp-builder:bionic --config ci/pack/builder.toml pack config trusted-builders add gcf-cpp-builder:bionic pack config default-builder gcf-cpp-builder:bionic @@ -171,10 +178,10 @@ HTTP_SERVICE_URL=$(gcloud run services describe \ curl "${HTTP_SERVICE_URL}" ``` - ### Verify Pub/Sub Configuration -Create a Cloud Run deployment running the hello world example, and setup the triggers: +Create a Cloud Run deployment running the hello world example, and set up the +triggers: ```sh gcloud run deploy gcf-hello-world-pubsub \ @@ -221,7 +228,8 @@ gcloud logging read \ ### Verify Storage Configuration -Create a Cloud Run deployment running the hello world example, and setup the triggers: +Create a Cloud Run deployment running the hello world example, and set up the +triggers: ```sh gcloud run deploy gcf-hello-world-storage \ diff --git a/examples/README.md b/examples/README.md index c7b80e4c..d72f4c7b 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,35 +1,50 @@ -# Functions Framework Examples +# Testing the Functions Framework Examples -This directory contains a series of examples showing how to use the Functions Framework. +These notes describe how to build and test these examples when developing the +Functions Framework for C++. The main audience for these notes are developers +*of* this project. -A good place to start is [hello_world](hello_world). It contains a simple example, with a simple function in a single -`.cc` file. +- If you are looking for examples on how to **use** the Functions Framework for + C++, the + [How-to Guides](/examples/howto-guides.md) should help you get started. +- If you are looking for more detailed instructions to configure the CI + environment, please see the + [Configuring the CI Environment](/ci/README.md) guide. +- If you are a developer in the project and want to test how your changes affect + the examples, this is the document you should read. ## Create the Development and Runtime Docker Images -To compile the examples you will need a Docker image with the development tools and core dependencies pre-compiled. -To create this image run this command: +These notes assume the reader is familiar with GCP, the Google Cloud SDK +command-line tool, and with the `docker(1)` +command-line tool. + +To compile the examples you will need a Docker image with the development tools +and core dependencies pre-compiled. To create this image run this command: ```sh -docker build -t gcf-cpp-build-image --target gcf-cpp-develop -f build_scripts/Dockerfile . +docker build -t ci-build-image --target gcf-cpp-develop -f build_scripts/Dockerfile . ``` -The runtime image is contains just the minimal components to execute a program using the framework: +The runtime image is contains just the minimal components to execute a program +using the framework: ```sh -docker build -t gcf-cpp-run-image --target gcf-cpp-runtime -f build_scripts/Dockerfile build_scripts +docker build -t ci-run-image --target gcf-cpp-runtime -f build_scripts/Dockerfile build_scripts ``` ## Create the buildpack builder -We use [buildpacks](https://buildpacks.io) to compile the functions into runnable Docker images. First create a builder: +We use [buildpacks](https://buildpacks.io) to compile the functions into +runnable Docker images. First create a builder: ```sh -pack builder create gcf-cpp-builder:bionic --config pack/builder.toml +pack builder create gcf-cpp-builder:bionic --config ci/pack/builder.toml pack config trusted-builders add gcf-cpp-builder:bionic ``` -To avoid using the `--builder gcf-cpp-builder:bionic` option in each command we make this builder the default: +To avoid using the `--builder gcf-cpp-builder:bionic` option in each command we +make this builder the default: ```sh pack config default-builder gcf-cpp-builder:bionic @@ -65,7 +80,8 @@ docker kill ${ID} ## Deploying to Cloud Run -This example assumes that `GOOGLE_CLOUD_PROJECT` is set to a GCP project with the right services enabled: +This example assumes that `GOOGLE_CLOUD_PROJECT` is set to a GCP project with +the right services enabled: ```sh GOOGLE_CLOUD_PROJECT=... # use a real project diff --git a/examples/howto-guides.md b/examples/howto-guides.md new file mode 100644 index 00000000..1aa7a0f3 --- /dev/null +++ b/examples/howto-guides.md @@ -0,0 +1,15 @@ +# How-to Guides: Index + +* [Running your function as Docker container] - building and running your + function into a Docker image and starting the function on your workstation. +* [Deploy your function to Cloud Run] - continue by deploying a C++ function to + Cloud Run. +* [Deploy a C++ Pub/Sub function to Cloud Run] - deploy C++ functions handling + Pub/Sub events to Cloud Run. +* [Local Development] - use the Functions Framework without Docker, for faster + local development, testing, and debugging. + +[Running your function as Docker container]: /examples/site/howto_create_container/README.md +[Deploy your function to Cloud Run]: /examples/site/howto_deploy_to_cloud_run/README.md +[Deploy a C++ Pub/Sub function to Cloud Run]: /examples/site/howto_deploy_cloud_event/README.md +[Local Development]: /examples/site/howto_local_development/README.md diff --git a/pack/builder.toml b/pack/builder.toml deleted file mode 100644 index c192e3d9..00000000 --- a/pack/builder.toml +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - -[[buildpacks]] -uri = "buildpack" - -[[order]] - [[order.group]] - id = "com.google.buildpack.cpp" - version = "0.6.0" - -# Stack that will be used by the builder -[stack] -id = "google" -run-image = "gcf-cpp-run-image:latest" -build-image = "gcf-cpp-build-image:latest" diff --git a/pack/buildpack/bin/build b/pack/buildpack/bin/build deleted file mode 100755 index 994c0b08..00000000 --- a/pack/buildpack/bin/build +++ /dev/null @@ -1,263 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - -set -eu - -echo "---> Functions Framework C++ Buildpack" - -layers="$1" - -echo "-----> Setup vcpkg" -export VCPKG_DEFAULT_BINARY_CACHE="${layers}/vcpkg-cache" -export VCPKG_DEFAULT_TRIPLET=x64-linux-nodebug -export VCPKG_ROOT="${layers}/vcpkg" - -if [[ -d "/usr/local/share/gcf/build_scripts/vcpkg-overlays" ]]; then - export VCPKG_OVERLAY_PORTS="/usr/local/share/gcf/build_scripts/vcpkg-overlays" -fi - -if [[ ! -d "${VCPKG_ROOT}" ]]; then - echo "-----> Install vcpkg" - mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ - tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 - cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ -set(VCPKG_BUILD_TYPE release) -set(VCPKG_CMAKE_SYSTEM_NAME Linux) -set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE static) -set(VCPKG_TARGET_ARCHITECTURE x64) -_EOF_ - cp -r /usr/local/bin/vcpkg "${VCPKG_ROOT}" -cat >"${layers}/vcpkg.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ -fi - -if [[ ! -d "${layers}/vcpkg-cache" ]]; then - echo "-----> Restore cache from build image" - cp -r /var/cache/vcpkg-cache "${layers}/vcpkg-cache" -cat >"${layers}/vcpkg-cache.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ -fi - -echo "-----> Setup build directory" -cat >"${layers}/source.toml" <<_EOF_ -build = true -cache = false -launch = false -_EOF_ - -mkdir -p "${layers}/source" -cat >"${layers}/source/CMakeLists.txt" <<'_EOF_' -cmake_minimum_required(VERSION 3.10) -project(functions-framework-application CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -find_package(functions_framework_cpp REQUIRED) - -function (functions_framework_cpp_define_target_with_glob directory) - file(GLOB_RECURSE application_sources "${directory}/*.cc" - "${directory}/*.cpp" "${directory}/*.cxx") - add_library(functions_framework_cpp_function ${application_sources}) - target_link_libraries(functions_framework_cpp_function - PUBLIC functions-framework-cpp::framework) -endfunction () - -if (EXISTS "${CNB_APP_DIR}/CMakeLists.txt") - add_subdirectory("${CNB_APP_DIR}" "cnb_app_dir") -else () - functions_framework_cpp_define_target_with_glob("${CNB_APP_DIR}") -endif () - -if (NOT TARGET functions_framework_cpp_function) - message( - ERROR_FATAL - [===[No `functions_framework_cpp_function` target found - -The application is expected to define a CMake library target called -`functions_framework_cpp_function` which contains the target function. The -framework automatically defines this target, *UNLESS* you include a top-level -CMakeLists.txt file in your code. If you do include this file you must either: -- Define the target manually, using the standard CMake commands. -- Use the the `functions_framework_cpp_define_target_with_glob` function to - define the target. - ]===]) -endif () - -add_executable(functions_framework_cpp_application main.cc) -set_target_properties(functions_framework_cpp_application PROPERTIES OUTPUT_NAME - function) -target_link_libraries(functions_framework_cpp_application - PRIVATE functions_framework_cpp_function) - -install(TARGETS functions_framework_cpp_application - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -_EOF_ - - -if [[ -r vcpkg.json ]]; then - cp vcpkg.json "${layers}/source" -else - cat >"${layers}/source/vcpkg.json" <<_EOF_ -{ - "name": "auto-generated-vcpkg-json", - "version-string": "unversioned", - "dependencies": [ "functions-framework-cpp" ] -} -_EOF_ -fi - -generate_http_main_no_namespace() { - local function="${1}" - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -extern gcf::HttpResponse ${function}(gcf::HttpRequest); - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(${function})); -} -_EOF_ -} - -generate_http_main_with_namespace() { - local function="${1}" - local namespace="${2}" - - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -namespace ${namespace} { - extern gcf::HttpResponse ${function}(gcf::HttpRequest); -} // namespace - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(::${namespace}::${function})); -} -_EOF_ -} - -generate_cloud_event_main_no_namespace() { - local function="${1}" - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -extern void ${function}(gcf::CloudEvent); - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(${function})); -} -_EOF_ -} - -generate_cloud_event_main_with_namespace() { - local function="${1}" - local namespace="${2}" - - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -namespace ${namespace} { - extern void ${function}(gcf::CloudEvent); -} // namespace - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(::${namespace}::${function})); -} -_EOF_ -} - -generate_main() { - local signature="${2}" - local full - full="${1//:://}" - full="${full#/}" - local dir - dir="$(dirname "${full}")" - local namespace - namespace="${dir//\//::}" - local function - function="$(basename "${full}")" - - if [[ "${signature}" == "http" ]]; then - if [[ -z "${namespace}" || "${namespace}" == "." ]]; then - generate_http_main_no_namespace "${function}" - return - fi - generate_http_main_with_namespace "${function}" "${namespace}" - return - fi - - if [[ "${signature}" == "cloudevent" ]]; then - if [[ -z "${namespace}" || "${namespace}" == "." ]]; then - generate_cloud_event_main_no_namespace "${function}" - return - fi - generate_cloud_event_main_with_namespace "${function}" "${namespace}" - return - fi - - >&2 echo "Unknown function signature type: ${signature}" - exit 1 -} - -generate_main \ - "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" - -echo "-----> Configure Function" -cat >"${layers}/binary.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ - -/usr/local/bin/cmake -S "${layers}/source" -B "${layers}/binary" -GNinja -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja \ - -DCNB_APP_DIR="${PWD}" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX="${layers}/local" \ - -DVCPKG_TARGET_TRIPLET="${VCPKG_DEFAULT_TRIPLET}" \ - -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" -/usr/local/bin/cmake --build "${layers}/binary" --target install - -cat >"${layers}/local.toml" <<_EOF_ -launch = true -cache = false -build = false -_EOF_ - -cat >"${layers}/launch.toml" <<_EOF_ -[[processes]] -type = "web" -command = "${layers}/local/bin/function" -_EOF_ diff --git a/pack/buildpack/bin/detect b/pack/buildpack/bin/detect deleted file mode 100755 index 1fc97775..00000000 --- a/pack/buildpack/bin/detect +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - -set -eu - -if ! (compgen -G "*.cc" >/dev/null || - compgen -G "*.cpp" >/dev/null || - compgen -G "*.cxx" >/dev/null || - [[ ! -f CMakeLists.txt ]]); then - exit 100 -fi - -exit 0 diff --git a/pack/buildpack/buildpack.toml b/pack/buildpack/buildpack.toml deleted file mode 100644 index 3f37c7f9..00000000 --- a/pack/buildpack/buildpack.toml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - -api = "0.2" - -[buildpack] -id = "com.google.buildpack.cpp" -version = "0.6.0" -name = "Functions Framework C++ Buildpack (prefix=gcf-cpp-)" - -[[stacks]] -id = "google" From 60ff2364ece3b118c8729dd68654bed92eaa262f Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 10:05:01 -0400 Subject: [PATCH 26/77] ci: update GCB scripts to use BuildKit (#348) Use Docker BuildKit to create the build image. Rename the build image to avoid conflicts with the images used in `google-cloud-cpp`, sometimes In need to use both in my workstation, more or less at the same time. --- ci/cloudbuild/build.sh | 14 +++++++++----- ci/cloudbuild/builds/check-api.sh | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ci/cloudbuild/build.sh b/ci/cloudbuild/build.sh index 501e7650..a00172d5 100755 --- a/ci/cloudbuild/build.sh +++ b/ci/cloudbuild/build.sh @@ -284,17 +284,21 @@ if [[ "${DOCKER_FLAG}" = "true" ]]; then # Creates the directories that docker will mount as a volumes, otherwise they # will be created by the docker daemon as root-owned directories. mkdir -p "${out_cmake}" "${out_home}/.config/gcloud" - image="gcb-${DISTRO_FLAG}:latest" + image="gcb-gcf-${DISTRO_FLAG}:latest" io::log_h2 "Building docker image: ${image}" - io::run \ - docker build -t "${image}" "--build-arg=NCPU=$(nproc)" \ - -f "ci/cloudbuild/dockerfiles/${DISTRO_FLAG}.Dockerfile" ci + build_flags=( + -t "${image}" + "--build-arg=NCPU=$(nproc)" + -f "ci/cloudbuild/dockerfiles/${DISTRO_FLAG}.Dockerfile" + ) + export DOCKER_BUILDKIT=1 + io::run docker build "${build_flags[@]}" ci io::log_h2 "Starting docker container: ${image}" run_flags=( "--interactive" "--tty=$([[ -t 0 ]] && echo true || echo false)" "--rm" - "--network=bridge" + "--network=${DOCKER_NETWORK:-bridge}" "--user=$(id -u):$(id -g)" "--env=PS1=docker:${DISTRO_FLAG}\$ " "--env=USER=$(id -un)" diff --git a/ci/cloudbuild/builds/check-api.sh b/ci/cloudbuild/builds/check-api.sh index fb874984..a0762ae4 100755 --- a/ci/cloudbuild/builds/check-api.sh +++ b/ci/cloudbuild/builds/check-api.sh @@ -32,6 +32,7 @@ vcpkg_root="$(vcpkg::root_dir)" io::log_h2 "Configuring, building, and installing the C++ Functions Framework" cmake -GNinja \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ + -DCMAKE_INSTALL_MESSAGE=NEVER \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CXX_FLAGS="-Og -Wno-maybe-uninitialized" \ @@ -39,7 +40,7 @@ cmake -GNinja \ -DVCPKG_FEATURE_FLAGS="versions,manifest" \ -S . -B cmake-out cmake --build cmake-out -cmake --build cmake-out --target install +cmake --install cmake-out # Uses `abi-dumper` to dump the ABI for the given library, which should be # installed at the given prefix. This function will be called from a subshell, From 8612c2d3709869f6826bfe750370877916b38a69 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 10:05:31 -0400 Subject: [PATCH 27/77] cleanup: remove buildpack generator (#347) After the previous cleanups we only have one buildpack (in `ci/pack`) and it is easier to maintain it as a normal set of scripts vs. generating the code. --- .github/workflows/style.yaml | 3 - build_scripts/pack/build.in | 244 ------------------------- build_scripts/pack/generate-builder.sh | 110 ----------- ci/pack/builder.toml | 4 - ci/pack/buildpack/bin/build | 4 - ci/pack/buildpack/bin/detect | 4 - ci/pack/buildpack/buildpack.toml | 4 - 7 files changed, 373 deletions(-) delete mode 100644 build_scripts/pack/build.in delete mode 100755 build_scripts/pack/generate-builder.sh diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 38ae7515..61b88cf5 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -129,8 +129,5 @@ jobs: - name: regenerate-build-examples run: > ./ci/generate-build-examples.sh >ci/build-examples.yaml - - name: regenerate-buildpacks - run: > - ./build_scripts/pack/generate-builder.sh 2021 ci- ci/pack - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . diff --git a/build_scripts/pack/build.in b/build_scripts/pack/build.in deleted file mode 100644 index 56619eb8..00000000 --- a/build_scripts/pack/build.in +++ /dev/null @@ -1,244 +0,0 @@ -set -eu - -echo "---> Functions Framework C++ Buildpack" - -layers="$1" - -echo "-----> Setup vcpkg" -export VCPKG_DEFAULT_BINARY_CACHE="${layers}/vcpkg-cache" -export VCPKG_DEFAULT_TRIPLET=x64-linux-nodebug -export VCPKG_ROOT="${layers}/vcpkg" - -if [[ -d "/usr/local/share/gcf/build_scripts/vcpkg-overlays" ]]; then - export VCPKG_OVERLAY_PORTS="/usr/local/share/gcf/build_scripts/vcpkg-overlays" -fi - -if [[ ! -d "${VCPKG_ROOT}" ]]; then - echo "-----> Install vcpkg" - mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ - tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 - cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ -set(VCPKG_BUILD_TYPE release) -set(VCPKG_CMAKE_SYSTEM_NAME Linux) -set(VCPKG_CRT_LINKAGE dynamic) -set(VCPKG_LIBRARY_LINKAGE static) -set(VCPKG_TARGET_ARCHITECTURE x64) -_EOF_ - cp -r /usr/local/bin/vcpkg "${VCPKG_ROOT}" -cat >"${layers}/vcpkg.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ -fi - -if [[ ! -d "${layers}/vcpkg-cache" ]]; then - echo "-----> Restore cache from build image" - cp -r /var/cache/vcpkg-cache "${layers}/vcpkg-cache" -cat >"${layers}/vcpkg-cache.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ -fi - -echo "-----> Setup build directory" -cat >"${layers}/source.toml" <<_EOF_ -build = true -cache = false -launch = false -_EOF_ - -mkdir -p "${layers}/source" -cat >"${layers}/source/CMakeLists.txt" <<'_EOF_' -cmake_minimum_required(VERSION 3.10) -project(functions-framework-application CXX) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -find_package(functions_framework_cpp REQUIRED) - -function (functions_framework_cpp_define_target_with_glob directory) - file(GLOB_RECURSE application_sources "${directory}/*.cc" - "${directory}/*.cpp" "${directory}/*.cxx") - add_library(functions_framework_cpp_function ${application_sources}) - target_link_libraries(functions_framework_cpp_function - PUBLIC functions-framework-cpp::framework) -endfunction () - -if (EXISTS "${CNB_APP_DIR}/CMakeLists.txt") - add_subdirectory("${CNB_APP_DIR}" "cnb_app_dir") -else () - functions_framework_cpp_define_target_with_glob("${CNB_APP_DIR}") -endif () - -if (NOT TARGET functions_framework_cpp_function) - message( - ERROR_FATAL - [===[No `functions_framework_cpp_function` target found - -The application is expected to define a CMake library target called -`functions_framework_cpp_function` which contains the target function. The -framework automatically defines this target, *UNLESS* you include a top-level -CMakeLists.txt file in your code. If you do include this file you must either: -- Define the target manually, using the standard CMake commands. -- Use the the `functions_framework_cpp_define_target_with_glob` function to - define the target. - ]===]) -endif () - -add_executable(functions_framework_cpp_application main.cc) -set_target_properties(functions_framework_cpp_application PROPERTIES OUTPUT_NAME - function) -target_link_libraries(functions_framework_cpp_application - PRIVATE functions_framework_cpp_function) - -install(TARGETS functions_framework_cpp_application - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) -_EOF_ - - -if [[ -r vcpkg.json ]]; then - cp vcpkg.json "${layers}/source" -else - cat >"${layers}/source/vcpkg.json" <<_EOF_ -{ - "name": "auto-generated-vcpkg-json", - "version-string": "unversioned", - "dependencies": [ "functions-framework-cpp" ] -} -_EOF_ -fi - -generate_http_main_no_namespace() { - local function="${1}" - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -extern gcf::HttpResponse ${function}(gcf::HttpRequest); - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(${function})); -} -_EOF_ -} - -generate_http_main_with_namespace() { - local function="${1}" - local namespace="${2}" - - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -namespace ${namespace} { - extern gcf::HttpResponse ${function}(gcf::HttpRequest); -} // namespace - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(::${namespace}::${function})); -} -_EOF_ -} - -generate_cloud_event_main_no_namespace() { - local function="${1}" - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -extern void ${function}(gcf::CloudEvent); - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(${function})); -} -_EOF_ -} - -generate_cloud_event_main_with_namespace() { - local function="${1}" - local namespace="${2}" - - cat <<_EOF_ -#include - -namespace gcf = ::google::cloud::functions; - -namespace ${namespace} { - extern void ${function}(gcf::CloudEvent); -} // namespace - -int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(::${namespace}::${function})); -} -_EOF_ -} - -generate_main() { - local signature="${2}" - local full - full="${1//:://}" - full="${full#/}" - local dir - dir="$(dirname "${full}")" - local namespace - namespace="${dir//\//::}" - local function - function="$(basename "${full}")" - - if [[ "${signature}" == "http" ]]; then - if [[ -z "${namespace}" || "${namespace}" == "." ]]; then - generate_http_main_no_namespace "${function}" - return - fi - generate_http_main_with_namespace "${function}" "${namespace}" - return - fi - - if [[ "${signature}" == "cloudevent" ]]; then - if [[ -z "${namespace}" || "${namespace}" == "." ]]; then - generate_cloud_event_main_no_namespace "${function}" - return - fi - generate_cloud_event_main_with_namespace "${function}" "${namespace}" - return - fi - - >&2 echo "Unknown function signature type: ${signature}" - exit 1 -} - -generate_main \ - "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" - -echo "-----> Configure Function" -cat >"${layers}/binary.toml" <<_EOF_ -build = true -cache = true -launch = false -_EOF_ - -/usr/local/bin/cmake -S "${layers}/source" -B "${layers}/binary" -GNinja -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja \ - -DCNB_APP_DIR="${PWD}" \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX="${layers}/local" \ - -DVCPKG_TARGET_TRIPLET="${VCPKG_DEFAULT_TRIPLET}" \ - -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" -/usr/local/bin/cmake --build "${layers}/binary" --target install - -cat >"${layers}/local.toml" <<_EOF_ -launch = true -cache = false -build = false -_EOF_ - -cat >"${layers}/launch.toml" <<_EOF_ -[[processes]] -type = "web" -command = "${layers}/local/bin/function" -_EOF_ diff --git a/build_scripts/pack/generate-builder.sh b/build_scripts/pack/generate-builder.sh deleted file mode 100755 index dfa41abd..00000000 --- a/build_scripts/pack/generate-builder.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env bash -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -eu - -if [[ "$#" -ne 3 ]]; then - echo 2>"Usage: $(basename "$0") " - exit 1 -fi - -readonly YEAR="${1}" -readonly PREFIX="${2}" -readonly DEST="${3}" - -mkdir -p "${DEST}/buildpack/bin" - -print_boilerplate() { - cat <<_EOF_ -# Copyright ${YEAR} Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - -_EOF_ -} - -( - print_boilerplate - cat <<_EOF_ -[[buildpacks]] -uri = "buildpack" - -[[order]] - [[order.group]] - id = "com.google.buildpack.cpp" - version = "0.6.0" - -# Stack that will be used by the builder -[stack] -id = "google" -run-image = "${PREFIX}run-image:latest" -build-image = "${PREFIX}build-image:latest" -_EOF_ -) >"${DEST}/builder.toml" - -( - print_boilerplate - cat <<_EOF_ -api = "0.2" - -[buildpack] -id = "com.google.buildpack.cpp" -version = "0.6.0" -name = "Functions Framework C++ Buildpack (prefix=${PREFIX})" - -[[stacks]] -id = "google" -_EOF_ -) >"${DEST}/buildpack/buildpack.toml" - -( - echo '#!/bin/bash' - print_boilerplate - cat <<_EOF_ -set -eu - -if ! (compgen -G "*.cc" >/dev/null || - compgen -G "*.cpp" >/dev/null || - compgen -G "*.cxx" >/dev/null || - [[ ! -f CMakeLists.txt ]]); then - exit 100 -fi - -exit 0 -_EOF_ -) >"${DEST}/buildpack/bin/detect" -chmod 755 "${DEST}/buildpack/bin/detect" - -( - echo '#!/bin/bash' - print_boilerplate - cat "$(dirname "$0")/build.in" -) >"${DEST}/buildpack/bin/build" - -chmod 755 "${DEST}/buildpack/bin/build" diff --git a/ci/pack/builder.toml b/ci/pack/builder.toml index 8c68615b..0e812568 100644 --- a/ci/pack/builder.toml +++ b/ci/pack/builder.toml @@ -12,10 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - [[buildpacks]] uri = "buildpack" diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index 6f0dbfda..55babeba 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -13,10 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - set -eu echo "---> Functions Framework C++ Buildpack" diff --git a/ci/pack/buildpack/bin/detect b/ci/pack/buildpack/bin/detect index b54d3376..22105d91 100755 --- a/ci/pack/buildpack/bin/detect +++ b/ci/pack/buildpack/bin/detect @@ -13,10 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - set -eu if ! (compgen -G "*.cc" >/dev/null || diff --git a/ci/pack/buildpack/buildpack.toml b/ci/pack/buildpack/buildpack.toml index 6c03ba82..8dee294f 100644 --- a/ci/pack/buildpack/buildpack.toml +++ b/ci/pack/buildpack/buildpack.toml @@ -12,10 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# -# DO NOT EDIT: automatically generated by ./ci/generate-builder.sh -# - api = "0.2" [buildpack] From a7d308110c2873483feb4a99dc30a6a784396dc3 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 11:04:45 -0400 Subject: [PATCH 28/77] ci: update API baseline (#349) Also update the script to actually fail on errors. --- ...nctions_framework_cpp.expected.abi.dump.gz | Bin 89907 -> 97277 bytes ci/cloudbuild/builds/check-api.sh | 1 + 2 files changed, 1 insertion(+) diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz index 82a724caa79ab7e7f653e2222ed251d69feb3ffc..abb32d44d19dedea7675a47fcf87e2dd37c1b5cd 100644 GIT binary patch literal 97277 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 literal 89907 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≫2E^#d&>xS1Ejm2uZ=_ZBA4*D zT23D>+405q}9SGQR5&Q3h-XuDd91;eNTec6$uN)|{xj#!`TgjzjbZ z@!*!Y&)b15o&V4zM%{BGzN96?F>%LOVpnKLGa3JBS+p`9o4n_?*oN~ylJR7O&Ute5 zks!;q8ro9&*d0Q)BoGPai%^D%3W{vLC#V>HnRas9r$=(S?{XBg%va)vAa%%Sf@2A_ z9hAe|tm~9f$gvp2As=i5sA2%88o;KeFhZdoN35Ph9=@KxXQuxX}_-j}j6JQa*wfDgJ(V0Fs^IEH=tLIhl)oH1ZrA(~ z;Xmk;@nnGPZeL~iv=9G5oVPB}3j4Bf%6p`JMwxTJ!SxhR<|1Gp`a?Hu>z-{6 zli|Yt^G+=a?SMR@ZGYhMXlgU5*Sb4X6X~|%+IIPH2nEw2zh7p{gpQv^-3OYX*vn7U z7oFp(*P|s~lm?tEq7#90s7VP%BN{kJ6PlOyk8ara*x~W>GZ^G9`IY@zN)yr7F8}7! z*C8Pf(Na`d^a+XLWbTEV=5Ycu{xqPJ{sQ5ZJ|;o*jbt&o4-95*htYr4;!Jd-;K^$h z$^VsUsJtIu@mHi$Y$!Y@WELO09lSpzU*sWSh>Et89(%F!){v%R#G99}6GtqtrXf!w4bUN7UnGZ~u$4}+f@D&edly`_8DeMppMTZH)Dtk=g z=Z&(~LiO10umfGUx$~kKgM0CE;6!ioYsXBPxoGKaC_Y^-txbJd9MSR8Sm@GcZ!x;X zDaeHY(4Eo;q=XR=@cfW^<{A~Qn2KO5c)f%Q$Dyg3R=@E6T&m}%U-S?*_5ikf1{>?b zLF!-u16mVJ?P)X;nwrV#DN@r57|<@A_y+qQ4E8nz-;I#C&IYtQ9? s&^7vb0d34 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 diff --git a/ci/cloudbuild/builds/check-api.sh b/ci/cloudbuild/builds/check-api.sh index a0762ae4..5ed8ba0a 100755 --- a/ci/cloudbuild/builds/check-api.sh +++ b/ci/cloudbuild/builds/check-api.sh @@ -80,6 +80,7 @@ if [[ -r "${expected_dump_path}" ]]; then io::log_red "ABI Compliance error: functions_framework_cpp" io::log "Report file: ${report}" w3m -dump "${report}" + exit 1 fi fi From 18545db9a019635994e25d26787b83948aebbd19 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 11:05:18 -0400 Subject: [PATCH 29/77] doc: update release instructions (#350) --- release/cutting-a-release.md | 96 +++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 39 deletions(-) diff --git a/release/cutting-a-release.md b/release/cutting-a-release.md index fcbfee1a..894384b4 100644 --- a/release/cutting-a-release.md +++ b/release/cutting-a-release.md @@ -1,28 +1,34 @@ # Cutting a new release of the Functions Framework for C++ -This document describes how to create a new release of the functions framework for C++. The intended audience are -developers in the `functions-framework-cpp` project. +This document describes how to create a new release of the functions framework +for C++. The intended audience are developers in the `functions-framework-cpp` +project. [GitHub repository]: https://github.com/GoogleCloudPlatform/functions-framework-cpp [GitHub workflow]: https://github.com/googleapis/google-cloud-cpp/blob/main/doc/contributor/howto-guide-forks-and-pull-requests.md [#326]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/326 [#318]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/pull/318 [GCP builpacks]: https://github.com/GoogleCloudPlatform/buildpacks/ +[vcpkg#19603]: https://github.com/microsoft/vcpkg/pull/19603 +[buildpacks@c693fe898e8d3f418b8060238fa737664747f685]: https://github.com/GoogleCloudPlatform/buildpacks/commit/c693fe898e8d3f418b8060238fa737664747f685 ## Overview ## Prerequisites -The document assumes you are familiar with [GitHub](https://github.com) and with the [GitHub workflow] for forks and -pull requests. +The document assumes you are familiar with [GitHub](https://github.com) and with +the [GitHub workflow] for forks and pull requests. -This document assumes you have administrator privileges on the project's [GitHub repository]. If you do not have such -access contact an existing administrator or the owners for the GoogleCloudPlatform organization. +This document assumes you have administrator privileges on the +project's [GitHub repository]. If you do not have such access contact an +existing administrator or the owners for the GoogleCloudPlatform organization. -The document also assumes you have an existing fork of the repository, and that this fork is up-to-date with the main -repository. If your fork is behind use the GitHub UI to update it. +The document also assumes you have an existing fork of the repository, and that +this fork is up-to-date with the main repository. If your fork is behind use the +GitHub UI to update it. -Start by cloning the repository, we will use `${GITHUB_USER}` as a variable that is set to your GitHub username: +Start by cloning the repository, we will use `${GITHUB_USER}` as a variable that +is set to your GitHub username: ```sh git clone git@github.com:${GITHUB_USER}/functions-framework-cpp @@ -36,55 +42,67 @@ git remote add upstream https://github.com/GoogleCloudPlatform/functions-framewo git fetch upstream ``` -## Updating CHANGELOG.md and the API baseline +## Updating CHANGELOG.md -We keep a dump of the ABI in the repository. One of our CI builds uses this baseline to detect API breaks (and yes, we -dump the A**B**I, but try to detect only A**P**I breaks). Before each release we need to update this baseline to detect -any future breaks. Running the CI build locally, on your workstation, updates the baseline: - -```sh -ci/cloudbuild/build.sh --trigger check-api-pr -``` - -This will create a new baseline file in `ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz`. - -Update the local `CHANGELOG.md` file with a **user-level** description of the changes. Do not think of this as a chore -that could be replaced with a summary generated from GitHub. This is an opportunity to write a summary of the changes -relevant to your users/customers. Skip changes that are purely internal cleanups, code refactoring, CI script updates, -etc. Merge changes that are split across multiple pull-requests into a single line. The following commands will give -you a start for this document, but the output is just a reminder, not the actual list of changes: +Update the local `CHANGELOG.md` file with a **user-level** description of the +changes. Do not think of this as a chore that could be replaced with a summary +generated from GitHub. This is an opportunity to write a summary of the changes +relevant to your users/customers. Skip changes that are purely internal +cleanups, code refactoring, CI script updates, etc. Merge changes that are split +across multiple pull-requests into a single line. The following commands will +give you a start for this document, but the output is just a reminder, not the +actual list of changes: ```sh last_tag="$(git describe --tags --abbrev=0 upstream/main)" -git log --no-merges --format="format:%s" "${last_tag}"..HEAD upstream/main | grep -E -v '^(refactor|cleanup|ci)' +git log --no-merges --format="format:%s" "${last_tag}"..HEAD upstream/main | + grep -E -v '^(refactor|cleanup|ci|impl|chore):' ``` -Remember to leave room in the `CHANGELOG.md` for the changes related to the next release. +Remember to leave room in the `CHANGELOG.md` for the changes related to the next +release. -Send a PR with the changes to `CHANGELOG.md` and the API baseline. An example from a previous release is [#326] +Send a PR with the changes to `CHANGELOG.md` and the API baseline. An example +from a previous release is [#326] ## Create the GitHub release -Once the changes to `CHANGELOG.md` are reviewed and accepted, create the release using: +Once the changes to `CHANGELOG.md` are reviewed and accepted, create the release +using: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases/new Copy the notes from `CHANGELOG.md` to describe the release. -## Update the version numbers +## Update the version numbers and ABI baseline -This is boring, but easy, update the version numbers for the development branch (`main`). A good example from a previous -release is [#318] +Update the version numbers for the development branch (`main`). A good example +from a previous release is [#318]. -## Update the package in `vcpkg` +We keep a dump of the ABI in the repository. One of our CI builds uses this +baseline to detect API breaks (and yes, we dump the A**B**I, but try to detect +only A**P**I breaks). Before each release we need to update this baseline to +detect any future breaks. Running the CI build locally, on your workstation, +updates the baseline: -Create a PR to update the package in `vcpkg`. Note that the CLA may require SVP approval, it might be easier to ask -`coryan@` to create this PR for you. A good example from a previous release would be: +```sh +ci/cloudbuild/build.sh --trigger check-api-pr +``` + +This will create a new baseline file +in `ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz`. + +Submit a single PR updating both the ABI baseline and the version numbers. + +## Update the package in `vcpkg` -https://github.com/microsoft/vcpkg/pull/19603 +Create a PR to update the package in `vcpkg`. Note that the CLA may require SVP +approval, it might be easier to ask `coryan@` to create this PR for you. A good +example from a previous release would be [vcpkg#19603] ## Update the GCP buildpacks -Finally, update the [GCP buildpacks] to use this new version. This needs to be done via a CL inside google -(e.g. cl/393879364), which then gets automatically exported to GitHub -(e.g. [buildpacks@c693fe898e8d3f418b8060238fa737664747f685](https://github.com/GoogleCloudPlatform/buildpacks/commit/c693fe898e8d3f418b8060238fa737664747f685)) +Finally, update the [GCP buildpacks] to use this new version. This needs to be +done via a CL inside google (e.g. cl/393879364), which then gets automatically +exported to GitHub as shown in +[buildpacks@c693fe898e8d3f418b8060238fa737664747f685] From 4818bfcd54a1d344e7018317f4ef73b4fe165504 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 16:53:20 -0400 Subject: [PATCH 30/77] doc: release notes for v1.1.0 (#352) --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce690503..146aa912 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ # Changelog -## v1.1.0 - TBD +## v1.2.0 - TBD + +## v1.1.0 - 2022-03 + +This release introduces `google::cloud::functions::Function`, an opaque wrapper +to represent any C++ function. Application developers can use this wrapper (via +the `google::cloud::functions::MakeFunction()` factory functions) to capture the +signature of their functions. Soon, the [GCP buildpacks] will no longer require +`GOOGLE_FUNCTION_SIGNATURE_TYPE`, which can be error-prone. + +[GCP buildpacks]: https://github.com/GoogleCloudPlatform/buildpacks + +* feat: support `functions::Function` in `Run()` (#340) +* feat: make pkg-config files relocatable (#336) +* doc: how-to guide on using legacy code (#334) ## v1.0.0 - 2021-09 From 3b3f48131848bd477c4492b4509e7e61c9bce5a7 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 18:16:34 -0400 Subject: [PATCH 31/77] chore: bump version post v1.1.0 (#354) Update the version number and the ABI baseline after the release. --- CMakeLists.txt | 2 +- ...nctions_framework_cpp.expected.abi.dump.gz | Bin 97277 -> 97283 bytes .../cloud/functions/internal/version_info.h | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40b2249e..0c442d1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ set(PACKAGE_BUGREPORT "http://github.com/GoogleCloudPlatform/functions-framework-cpp") project( functions-framework-cpp - VERSION 1.1.0 + VERSION 1.2.0 DESCRIPTION "Functions Framework for C++" LANGUAGES CXX) diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz index abb32d44d19dedea7675a47fcf87e2dd37c1b5cd..e66b40e3af0d75e4775568a20921b94bd7b1ca37 100644 GIT binary patch delta 94331 zcmYhib8se3umu|1wryu)n;YBa#?BYpwl^EwcJjrxZJY0R@4K(+O-;?|n(04#s!yMu z`Fep2euV@ON5g>p?*PBlw|Cs&P5bWYC4*;})!(!xJzs*Gh0I!Pf8tOG{?*OSX9%HP zWUpW*qgk|768v@}r;=n(>put2_&Y9UV`GFAnV9IFpFh0z=V|mG^q;%CeZwE8`tPm} zS57v;pI3JwUzTqi!5FEXn{9pH&z)$G-Qd@20COjrMY0TWieAHP)@ZLcQCS$BCBWy3 z8EiDvIA{N*lNfuY_Y0~CJ|Ox7gh^ZkB8Uo!>H7n89otYo<#S))H9z_VzUgsy6!+2S zRO?j=J^c|C``#dxd3%Ow8!!qWGXvy!$axH@u0c@q;syOS~@5A8H;G~u#EdaN5qe-B7W zkXR;2aJ;n!)sH+UAdS!8gNpLoESJ-Qav;qZj_&6hW|`9(n3(M&V?+vSbW94+Wug$2FSnW>baTuJo4SV|9MDitadJ z{#xWeNj)F4S&YXkwkxm9-T))_uT$fLt@k7H8zfw_Z1QyR^4|p+E0<~ z$w-q``ZTtLtj{#X=dABkv721W?!>_Ut5QcaQCh1r9kxQY<2~@zehQ%R(So9rwZvsz z#G<#TtO;mVSQ;BIc#OrOX3{7=n96`-m)}500G8!xG2wdF4dP{aasTkAb4| z22AEktr*CZNz%f4tN>li&sDbpZGNq&raz?=VAUFCTI1_>=zNw#R}87;992!Q3M-jj zvx?+jbY$~oEwTpCy1vpm+89|#bW6dzWWvmnnk!$z@bo4m}r($o0nF3~T+2hZk*9+TxNRwbsQ+?oUu!t=}SwXusb zJJ6#0Q`U4LJx3Uk!AUj7>93DfvdM<{ATix)TGw)TN22JZ%>0&+vYu`*z_`yZIQbm- z)_h|_WjhttX#ivwr-NwVyh(HM{~18@HJ;T1#9fgX$Z7A5Z(n4cI{UCf#Uz5pv_crzj`2L(f-SoaYu6Q-ycTg3|2 zmz8b2?;TsUw>tELk931^ehfl+VhQeLZZeY|qT~7oLrsVr>#d)J5Pbx(nT@0J#x)6t z3b27&mA>b?GT~3J94Cq#s*Rh_c z{~OyzrIdKc;^&TBu0;(37e+6rJZrAJHZNP9-3z3EtcV%b2 z706ze8E#UyUPhxLdzc0uZ~GA&dyaOD0sw=CEnzxtysk)=*W5?kfmRm%DR7qQBAQxR zo$YEsPnTD@SrJW$GeT!5UOS%iU;^_rgnHy(2(!Nkji>Z;Bhr~B$#;}P3JpVfq=@jshe(0ovM0)H(=;L&vLWmgvP06&3q-G`iqb74cl~GMXO= z*qbIlJ_sn13vPU17InZ}!pNVpvF1GMz7gFhuNo~e-U&@qRj@y41D9P01Q_%THX7YJ zPml|-e8A|O_l~ZnOntg8+%{Pd6(>QI?VPGo+)_7; zlDVNKT1$=F;H=A1xhd1{x#NCf+d#3)LJw3a6?8=(TU}y?tndS4ELiTA{%>b1fP{vUBePQ1?CPWVWQ#<^f zVL%zZnwg7vghbD2T+?o?M{;rGJE(v0yrFK<>drjzE?l#Qc+Y&wHIFz%uXApxLnBb4 z?EgX!_zGL_1N?G=Z`=wkmMvQB*RTG|%8I+wl>NsXgm9d)>d}uxU6cuR8V7+LgDRsIILny!G+JW73Dd^}PK+ zlIp5Lq~>N!!WLmLlMk(JU2)RigfJPrFU$k4G#e~{47kRce=z#ZA%KiEJ_?EaO)W>H z291Xlc`;?js*P;i;uARu;@pLDpGG~l${56A2yX2gRW)D`0R~TUSvn5Gs-{J|)qF34 z-%ZP_%vA|;_coUYvkilqKve1Wr$$dzUB;;C7PB&y5_YWMb7b^#O=7_<)?C~mT>$9y z0B&2b0%$uWZaegQ38{&@3ci9{{?!yM*04%C*L@U{G&GX zB8hZX>hTG2-<~U7j>Z{rt`-IHWrh^AuW^cKZukwA;J?(f&#V5!Zp?Hz zC(S9%;rR!Qp9XvOO-pxG5d=3gsX1xfLd(1;KWS`=38c9QQdwa=$({jO?QknOY3?eC z?QYn1FWaxb|KuWU*mfS1mJ|5**BnI=9dPvUJlFKUblRJDLXP)uHWvz|0_sP2-?I#V zV5zr`+ystv(tkz5ZUyCu%%m)`IpU}eK!sw-T-iAf5Z_n*DvNIZ$G=ic1c>`A0Je5f zzHmA6m@+1eF7EXQ>ZXOLgS!xK57B#oZ)>g%)Lj*#c}uFY(}^Q4vy@lC+fEKv(X8 zx}aoPrUYThN{J&i+8wR+zJLqJyVM^NL-WDDODTL5)_@izmL+a8QD%`eT`J&4L>gTY zK+j8nb(2wtI%$XvF#+K1&>dN9@r`!BH3W{d!DW-Hn#%>GuI zSMfoYX|DUlB&#~O{KXTvmAQvBF!%~jRcUD=S_?`+o7eV}AymTsd| z5=m#3Pj}u;nCy1~-2hG=tEnWs%c|S$(`GIo=NQ?npJ(ApVVDraWIy1qB>qMg=_PGj z{$wZ)pMQ+WoORW`Kkxe@Rk={ngw!qicTH}X2m(h)SkrcQONb1_mv}Z8L~zBGh$kC^Ib@t zhaG-Hdhd{@lvpM(T7q0+J2Q`1SBt|HpZ0F=SSN{MtMBiKjvuouHPijv&mPZVmi2=D zYQ}z1etB9p)BEVb(>k&ir)rUu;bWK6lr~@9oFD{Zas=RrS>O<_*XT4J>+lSxL@fS# z!@ab)SBez&D|bxGJCXgNK){UzOkbj0cF zqUKT;EAjwYg*jt6`!La#{;2Avm{rAzh@93K&xbYbt2<@H6B18H z$ueAIv6!s~=4rd_AOMrUOI4k=BQEw?hoX-}+@-EmLG6ycN5iPaJ9ZpK-JaZt>sg0& zSwU`(JYKF{dU;OUq?Ayeqt46@=LyR}L%mG-JvIPJ*2l&DY%gk-S#CLtF5-dZd{3yi)zSGqQ;L|hiTW3 zz;mmWYlb%Q?0M=^o}4_#^+LCF<8m`X+(%)=ns3zwuRjHe-@aZ5>UPagQE!zDgbgAF z{RdF7#wsj362R!#GABaP3D?+t>t+^7zoFQP4J3+{DlCj((2Tcp|5!bp_)&< zF?nMQRqEe6^&wMh;SeN$^Gb~)`a};9=48V7-(TK22bn6t`;Cey!%qiDeBEzpfM%wmrijB*Nq5Lkb$*&e7!S+NaD8Z3DRK zAKW`np(LZ%QC4Duf{_XkWoS$s3nVs4J_w5ttE3vlhI7>pMm~6`)x85yYf=Esu6l=_ zLPWLE4lnjL={Iw{Lt=|xTUs0eIsQDQiS$Y!ot$A7bOj^Svl#O-(h_QqwsF0CV7l3l znUDkUfh|1amVvkP9QJXKwj{07hX6c}<+yne31)X(0c;DAz*{3M4C!bK(yfoghnyno zO>Iw9Q-r_fEVv#L`$1k&wvs-{jH{Hwa}l*y(qu+ zgb*9@73$rq$DbfBs+QE5o9>wOo}cczZ=6*3QW)ryeAD4tfuTzSMHQo1FR>42)$(>P zNjF)KUk7fBjgZaFz029xYPGtL&we>v*32{P2f{smvXMKsdzj?Z0zmD7&Hq*pg=S8e zJk0$^>9~}3vBwjf>>=ib-+xmHm)~4yryh4hN(rALrwSCVI%06^S8TDJ;2gCGbl!0} zZ(q}UCfLYSG=>p?M>;??+w+uzu>NY{LkgQFT&(Vob1b_c8swhr-!u#(*oR<`h{*?X zz78Eq9}veNZ*b8^0WwgeEK#C~e79-5sCOB+i-k%fHzbKd{wzrxHZ;Q2q0Zk8-`TzL zyDAW&M0(CT7vjz$Z9enMA;=6=W8#7$pv&u>%20LNM2qS#4E@{%F=(s|yv*jH`_bB} zu~`pCplhAur9lcbAsD{){q=+@q*-xw`nL~(qCFm)>uLb<24E#|;1J*L*d>iA^i-Q6 zA<{>PfJd}uhW}40^%;XE5NMDmsL5;*uC|#OM0c-EGnMJ5PB4YV^RjYGI1lwKPTa`8OFLY#&9`n^b1m_yHyq=xjIae8n zBn$b2z_>FMHh^r8M(l67bf85+@wBK%XQf+fr;g#T&VRYi?7lem)PGto$F9WMIU`4_ zsajcDs)qZnM0Ib(fPqBZi1S`nLSD26*7T$f?gQai^Z}L6{q6a9Qf0I#b zam0jvPQmBZ=sTx{@6_u~JKySdu~Wo{Kzo-kSEBuk6t(G%ZNnKqEiUD!{hOLsL>d2m zl#jIa^9$+(2k-_p#>y*LXirqMi<-NR*V2E3BG9)Rz3@(s2AibY>qf!b4o&S)zvY|VlZdVb;&_siQCH~y8Gk5`Rxh4es z4vknrFOMsq!=(kNe_r>)T!((+z>N3UJW{KJ+!>7iXMk8fBKc~U6aMRR7w#~9{;h{l z7l~h;=f-%JkJ}welm)&>?Z!J(l7hLAMWAm746@p4B%UfMDi@fj^{Q&spPo^E*J ztChwWB*KcDPB1Cl+w@vnYSe&5n_Z(si&N7EMRs7LysL_%&M8Q3hXk=v-4Qap2{^A{1{6#wQ2X5jM|INKBXtQB6*=5XFKe5N zp1Rf)ibA8TDf+N%lK#^I;`R?n=9=)r5^o2onq!0>BcC3VRf8q)m@^KW7(q(C7fjC zMNW|@`Z!6KiSc!tRbX;Fi3_5yXtvW$uk@KOGa=BQSL)9J^@eQd_OeR2xM3 z1)MLgW$3V*>9vniU&x&r#i;;?H(`rr+!f2!S}%;|t-fL6nJQ8im$h@QSY_Y5c0Rnh z#?Q+5^+xyg&sT3Z5$icd7HzEx@ZYJ$le{`hwyK0Bmui1iZJ4&umIYREBoxPJGK|-^ zqk`)&J(N0UOA2lM-#)RI0UjB%H>l2!_r$Sx*^DQtYX@0Y$^^CD*=LOTZMna7R^hI; zUJ!9bVw56+zAbgR&WdQwaFN{fOzMk?>iCsw&j}E88B^s&?DTwqi|HZ&%~VWUBX3MW zTWe)Yv!3Oodxx3BNTb<>n)`fL+Os$~~ z_U(xbMgnN2S30o;GO;sRI`4$t<2eo#X+Oi1ojc#*Qnz9tFC@hxrBhlA2nTD26Pf_E zyKqqkV)Wwa?FYMzEI1!vlD}_F#_$R!=^>6oCNKW1zs~<03TCk!m&}^{1&yQlKmM^# z=g4mWGQKz!C4W^VJ%Dg1HEU%h!4@a?1%g+NVWCtfsYRO?=qaq1#Tz+FTzjzg6kqX; z!ay|tI0*4A&8JLWc3+>$)MUQoPrwJB{`>=*mllmMc!gl$^&(3pD#K^^oQ(F9_3UI>8q_8h z{+n9$_-Ey#P3_}?PW*iHH!RsOQ72rYBAd!tqui|3QDTaBQOI}WtrlvHYLp*Hsz$^7 zknPQ$%5^h63hkrxM}(Ts6`VLPP`Z3&TdFu!O64rl+nojQkcT}-wlr=}9P~H6>G97d zWuKbQwXF2{rV1{_a8D;%l7@=PS@*>5=}~5iH-+?N+&DamiA=X_Wy(LekZO;K1_41^0Wo_$Qt!m>8R{52f8W2^-ypb5#)4E)bpmys*a zuMH^4KT$cW_m((yDk7;9OMf+xmdWb=$SMi?2MSnJ5Ayc>4n|S`_(AV0f3OYjr;UT8 z4p>lgraKrgHtO)^O(m)^M7k81yyO-L8j6HzPAw!d-e-|qa@xmmJ>T3yb&Vn)rag5{ z%^lZrg2-$kQY!ps+uBG&2D+h$D^)(4*Z8$B5xeZ46RzswWrHfDC|dC=Dkt!FrVu}3 z@j4*F8A`JIsEnl}Crrr&xqO!0{Rx)JM|n|BB06DqY4F11>CdIUfUk!p^2?_BO%|2I^ly0OsI-BjZ+TguaL%$@3ZR@GT{eRa~Sy}w!Wt&N*I(cQ(U*d zM4)r%kGM~7WUjAp1OdDBPSMcDWvO9kqgntch&6T%F<}?@zbJqFOgSO`st7;E{XJar zhT@N(tyg7ci!HjynKwJ*NfEClRaXhhkB~xt+wF)}tuspXld3D=O;D{nCB^2ib%zM2 zI>7ZI$cFUWP%69XK_8P{kO#h>sDhr6kz&?d!{BVP>LW@9Hu8Z3G_3DQ0G7p@em2W?=XSj$m%f5qM{qHtmNpe(P&?RW_H0fHdn*aySx>jv+6791?{cK|oJlQ_`djHsJY2P806 zz8!E7Hla=^Ato}rJT-J672(wLbvXdDusx}nyyOK5ccs+Br9bh45-so`PBv9J98nKz zIW?=2H;Z{G>3%l6Lv~t`Fa2?R^)ND z_8n1|2s1qzomW?fUZ}Gysw^W&M#?nMjAZ_p3{}QjqK4sPhLCc(TDSaau=b(k>iaO9 zdDfEqWAOc`F+|kbJCS-s^`LE^fHngWM1*ts6*0ZsN z{Py+;zejKk>4=AC3mgOyI81Ij?1?Ba3Xp=@NzRBqJL3~-elUZE}oQhW)Be5sd`&soC2|H zDFBo5scOU*zF95f{9~h?3=QVsjF%-4|Q`34ha0{Lt>8y z)e|+63R3ge^72Qkms6#_yN3@+DaOMJN8arpC(GOaFcY>gu&6)m9q%#lP(O9E9FaTf_j$Kax<0CF}&^{OQXz@UXDm{ zQ+jn6Q^$ba&^!PkO%-EBTw8fUTf=Wb)n8_oaHIK}7O#19G~Y;8PiFU4lFb0p**`OyBCOZh%R21BkJRuT zg>7*z_f#lRRaGNt@JY(9t+E@~==)rya+eCVKcBG&%@jUjpz0khA6?S9C98tgpCmTwNxMJkt`?opS_dr|drvNA+4>+r>j{NHcN$5g;w9IoDr75yU5vGfhqV}5A5ax0U% zHm%VlXoH;LOGgz(ooHZT+`0aGMzMD~*M8acTK}Yvfq1mq98Eb$oz9K-Z|Wr?1*iyk zlNT>xA|6bTb4KyWyx=R9dZwViQJ`DT z*l7VB(ADk>Mdk#%l0^a_ZrON@2g21bzrW^*oaB3(qzLAi5u?_$dmbDb!z&$!H9~Rc zbS6kn4Nf(THR!n}jSVD;oC?wtM+wgN`;UK94q`Yb%pzHhBk`!fh!coXrqNy#3Kr8d zc~LXx!YKSbi*TvuSX?F5i{dPGuPgRmN4p2uTwyLPjJPMM?2Ci0=F0gpmoUsfaIP{Y zV%~aSRL{6_P^KLT2ng0MY>o`L%f+YN`^%5j{py>=QD{)K^TBrS=t0H$>?P&u9M@t) z*w6=pDoL0t%afA~bIF&olOgF~@4pEVau%$U5JeLjEy#*Q8?iZ!JR(A=_>*PHf;t1L z%3#fLqoOa;4SQ1tHJEvaMcbMp=0RF)wlbqa18{fc&JH9z8`V>s+mUM|4i3o{$C1%0 zgsZ(;kH{9Y#_{U^lz{}CXw!ihb)+rX{Ck4^vnuyVCqk13=8#bhQK$h|Hdv1lV8ho( z5Qphg%17!qQAI6oS_Lw|m!i|BT#W|Uep?VmJC8+Q5K|LTc0?{S2vXWi(q#6bMT6$5 zHfdUgh+YNQ7*8E(2JPi?QNytxcQENCv54y?DFY?LfgJh))7^H7a}zwjr=-(a8}34m zF%>ZJ!KWqn1$+vxqRA;PfRWY?x*Br`J(~lI_-n%guz?0oMx!-86-IjN_Ok%-s4+KH zNQA|v5->0e9TiYeR>m_p_N|-<4EA_ft$)U%LoT?~grDii$t+@DQaF%$&tBw!JBcrHJQOPes zDTt-jIYeqh30RX;!D&z){_AJcps1!Tb&u%wq=ze9ooL1zOL1I^DZA$L3WVt+vzqWm zh_Rpu43XkQFcldhnfjGb>%MjRo$o?(oA`~;@5Qr(+k8RSXS6a{nQ^HB>Pu%Jg}5hIradVzCUi|jgw>W zPX|R#!Q5K$LH&;eqkTplPX|V>D(FSQj;;GNPpe`Z)Rbb;j#dGrp{XeZgTcRY;zUIj zRrsRGz>e<~Wm(F9-R^Px$F8Bd3k47pCGSNZNB$Mejk~ja)#vhKOYKGId)TY;&Rwqu zTWw-qRNT63H9yQ6a3noyxn(vQ4P4gGA%VY}*lP_9 zR3^NbksvVmMJ8QRF-&r-@@j3kMI$XEGT7{xC*CNoJI)_9pVs?#(=A>-fgRcN<1z5= z46l3Di(z*S^bjuj{CV^Wvk3ov%0qua)AE<@e$ayGP>&hlXW&`o=ghu`N}fb|qTd=SQuJNTHg^Xao}gic-ivK-H;NJU=GGO(tct??PY$EMN=CkS zd7%{}b-3(G+Y=;pcuxh6$oo)L#LMfl-kHu*_SwZ(;dVi`+`6&fug3Ie=E&=srKii} z|KWP4I02lnA6UxzQiS=IWl|+Zy_5UM6lsd?5YT18Ug{a5q|2?o!;dPmN5j54(b)%; zA@tRFx-%=RfGu1T7I+7&w+|@8EBm}uoCVsvB;hkEr*4iFg4f)O(L4!jxD(}LjUm}7 zE`aS63NZ45@EcPWAhC3gCp>BuJfGp;6qds+`vIVePOZSKh3y7sAC6AUmL{&<(j5P*9eCp#dqJ=Ab^K#iR4k*|E#h=Te za0k4~H;XjGUAo_Q!B}O`inN@3N#wUtPT0_$nv1oB#e44YC$+}?$#03AtSpbyjEo+C zwgz52T`wf9Y+Y54&;zl{nhAv9G`Vdj^wI$_EqHlH*Al-Zbzx`NMyEtNqFiHm^Cm;4 zhqK1_-KG<{>F?!Lz&pSj-9hsza|9+z*nR^GZQNZIOE)?B$#{$oNtS5&ofjT#yJT)9Ggi+xWc5Bw>0^tx04A0mBH~FDg z;9QN+HPet=8*ziB&RsE7cGn#*oWJe_4fx;3tESdR*{=foCv`x2RLWYNviqwR>fgmUn@)3WRj zEVgmV1<|wRI_1o33R;T#YZ^*2->9lAN<3fW))|^fhIjG`q4kTqg(>VWX+T!p)|ZH# z<@V%5w|o`20XGSSNT6%wg^#txeVV*~9Z+=*tT0yrao6K5=;+XE=nKkGQ&f=lia)zj zl+zY`>8|xzp_Tqwp%G@at&-A4tSpi~$ndJMLdyOhI+HX^CAl33BH2y*in^Jg2%W8Ga@Q(xyvp_Z zjw|-xT7b?eV%yd?(_|FIolh*!{63!_ zvH_;nF<>}f_0_sx2>d(qHeO)qKd$>iR2xb~pupk8zAYvM+>UygRctWd9-JHYv2%Bl zZJA7SckA%c&lNNlDA>ZV;b&!beE4j)c}RJz0=(ja@iEfw5%jR5=Wzt_DgCh^Z;OT) z4SOcXANJ#lIs!T@oplY!Sc4}ar_MBk*%g6Y$B*c;nol;&5d{(_KE{$#e~Gufu8Vi| z`HPd^CkwvH``vas?7EDgq;e)3(h9o1A+9Q*KeKaATiF~}1Ga=S>4bB+qEly}&f%tq z0HBrzo4;DuTV%|*5Nbi3IEhQSWmQqfqf333%Jf&>zHN(Ag^mmh>tyS>2vE zql9dp3Z0>gJiM8(N~@3I&bOIb{gpJM4L^J2E};3yxn3k*>OLWJM830Z2hp!Pw5g6?<_gA2Mn!K zhf)hiX4eI%QTrXWP}{l?70;o^=(V(KGAyQYsooiTmM-5OB1OiFB=d#{LMfal@F7*d zM`1CB4U&4|A%uh9sv(Dq&0_q|q8v6Dv-UiLi&l6?jzozb{Xa8@l|u{z6gfs=c_IJ{H=-o~v)Bp? zpasB;#hN>lX9(2$%My0)Cm6M3NMh%TTHS>ubt%AAmP2N;<}9$F0<4-)tz1#8Tv4qa zQLG-#=U-PDl2)@^kE*2&9|U*-3So!zx+J`0NdsXmli6C6hHjGO6V#JoW(YrdQRS3{ zKq9Ztajw+cqn=Bt$((!OLdS#UHX5K75-@FlUK=8${%+cei8o@$n!gZIvfZ2VmUkVq zZf)T@w2)vv_|we|@EkU4bv{<&b(c&d@+0&+c=68WpP|}UhhH_jx$ZL4wrk2smw3(o z6)Dtu{{!Yld!MQ`-v6S3jp{_Sx}r__*`SV~>)Q~DE9Pvt*|6hg+PS+*W1vVw&s6Bk zz_$5KTC0Y$w;u4 z9HTP~Hm7p{T4u!he7@8MO-`}T!K>T$OAP{DM3MHc<50#L1)SKVs8KCUKp+ z3T-8eXDx;G3boWm+GtNdmwL}p^mAm(3o@8**tMGat z-3R^j4CV0L1d){3Ja2*&#~x3r2brhq>UK4hD$4X12C#Ur$g%DI@f@N7Sv*#Jl4~Wh zwL}6ym(puYkDk<_^C9%-)Mx3H%u^T1*MltfAz8 zIabsJl2?SVN~bk7tM-f`=QMt@RMMl+n|%3U!=!`t12JhBL4JC!PpUIr0yr$JMR z;%>RPC5AcnE_z&JuXkzNuc)aCCW-ZWA^_a2zxyDe&l(#7_x=k18%Oc-!hPh{+=EuX znlg6HdV-}Z=~}YKaKG_nX?u942c)AgA$DU}b+XlSG%s#s@fh<&BZ8;tIR(*$9g3h_ z6jljSP#Ahw%rDt)ZZrnAcPghf1xgtLCIt~TALFAI*1GP+yN&7IKbhY zF^qc>wf`5}R$Br}m`ejpGbD9;>>a5Uocx8F)vx82gG+adMA?l_Ep$0dl$X!?xu77UB@ajFR z1lh*0`+W?!;eCB8T1l9^71=AJt~ylo+Y+MLW^LNC?J!#Zv*WvifS;dIVrQS%V^z<*^ zsTW(T1`kZMT0u#MocE3QL4d2LKqV;*4eslTN6uLpLwr+7X7Y)TB!ge^p5z3yD_j4f zlgqD_9LZSqL~%k*8!5dP%3lc9d#qrLmqsv~oL*}(cnC54Ha@FRVt%_9@rhkYXr@|kM!qYtX?w!BWWrM0_D1EHFyfgiJisL$8q3iBqWxY>Iwe7ujrI@Htsr~lHMSvOyMAU9w`EIzGz<=Rdz2c~|)*iLb?JR7VTW9>G<6>Ewi}lM zeHedD7tovVIlE+)C?bNuBlRk;bsaEG#o{7rcJnuSO5qn^q7EzfU*#H4tGEo8Tze_L6v8v#iEkjr z|DP4WG2TOL9{<1g&jQT{Q_2+GZRukNfZCku4Smm`(M{xT<-mM?wCNa8XGZT_v_eY$QDzpK~5E3V&)BiaEA0OpiE1$ z3oGe5I%wmE!Rj7KM9#=xhb?|nl?mwXV4ofj*cF4P|N8F_SM{$mjDxFS#r9=iSB`!1 zRtBh>fh}Ak&9wwTo;{C7&(Dz7-4S zIZnYe{=iLA1^g4d9{C!;)|nHT>yoebaRQ%tdO9qgNR(F_*}ygIaI-5MZA7awC*+_9 z*146eYvEf9t-fv9L64f!wC9lVqb}Fjr0c~OlfQYQU;o*>%%I6#sfnP&XTgC%UjI>jxj%oPOknI>pTfXFP2MRsoswpo|T$xEPS=A|^$s&5Hr| zcyc1XQbS07(s@3kQ~xLELVX(r{~i*n64#QD>Nw0dv>$H1q?kZiuplc{nHw;zR%}yV zv20!G^8aG-|6%t3Ve!5A9 zmRwS(cjK;bh^o%2(5Y-J!JEqc%M+`ZWW(W+cFe&mRWY}zowaa^Q7-9XX{}hy{{J~7 z{I3JbbbOXqA-psjmHU5BF=8&t(`Q}xESD+RH$pIKR~u8D7`EBG-4KEkK=Mpqge;dm z=RpBw(`LdWw>M{)hXP>$rTFBkd;qvF)HcLsa!W2hcr8@=FfjyC)GvBy_k ztN-fEk<7Z;@e>X=$q;QIH7`Ym4k?Jo|#ROb+$a8**fI{QRXx3$E6b6 zV>iaDZc@J$FUbOFS9&+GAjs3|Vn963EiRx~t_rDgD`4L+nbzwQ&JaO1>oZ;cn>q7S zL0BRAM~doJ+ZK#Ct1q1DwlH!o7~uEH9RLt}rM8beX^Z;9V5rxy?%s2qP8$mfbh5>&2 z;xT~cY>$CXu;yUn6Ih%0Xu}yo??CMUdl!S4{lH9DHC{p8{#RC*6tRl#zWdPOK9(+X z6odW|>lx_O?nARlpjaY-8rcw$H|V|$1+jYPdMCnR9Fg{ryyBoAYH32BL28_9{UMr;N+JL#K{NpBpl$hKmnGDlCN0d3jjy-rY+t zKj0JO-+PtYAPziausv{`RoV##fx+5EM+)hO?}7GOgz*&MJ?61F3&x`qo9Fl3U) zQS%!RT=W7qw6RRLOZjmV!pdECQ_07L_2*MY5(=scvjps3cQFj?49R=~c%*}*G+xg| zPq93iUf+KM<5k?g`qVZ5DXw==54$qI2)-OTyc44?(59`UrggB1FWrA>;Jvm%`z z%HMGABgWH~tB#R|{`g$dRC1}k3@5|p#!oLDB@kNpBr*wIowF&`bu!rAB+qe|3UM8& z@lX7$`sez|%>@B_8J@lYe+ia}#Xq+{*7FZz(jkM*Z@^vu^|)Px(r4qOczds{*0B&R zC*5y{e8mt`uI*5}SFB4szqBuYI}fvV36%DNF6?kimK+{^uFWg4fc-6njrgJ1_uw4< zp-k^ml0Mjl?n!(QYJ7VVl9eNe{N;|Toj^Z79p_9;nhS{yk z_KZ~aGui)Pe=qq_7l@SRqj#;tYX(4-TI^pXn>bBf zdre%mdBScyXVh{vI`VD*=9ZhVJ%z-o3q^_jxLQV7;x2 zRQ#o4&SgOOqS4Verq&0tewP2S{W|-WQkM&`z7g?z?`y~8jF$z2W$%CcPELO7)(h8e zSxY;U@yfPWITs_vF24}?xyUZ9%DI?3FkjQ&nXl=ybu`?D*&7#uY<(-@?!g#+3&fw})w67gvmw?p z!)Odsqw9qv_HBnBQ{Y_YjN9>$NGZ)i-RY>d=f zMispx^FXhtN8o2A-*Xbmerd0$U!Dc_ctX`H5=#xoU~Oc_2KImCD+$Ci;DTi1Cax#MQhxz)ZsR?TB}-RAnGb1{@F69@cQsDpplI@;KNf#B26mwo&H75Q zTuhw}8SQed-Ecae1!nf(TRZGxr~6PEGtqi*TrsH66UB9hxk{7QQ5+A31-2yXPSUyw z!&D-SQr^@VYB_%#VJNb0^E(%ei2&wmy-9PYH`!xN$3v^AIw5__*y>e_9pzL$$N2XY zzT(FDH}9PP&Ry}(J7%+^AB3(BAI=kwHlG^ip01@kxYiS<@$L% zYfS&jBDp!!H*e7N<5=0eU>2FjUa>| zx{V-&Ao}+yh!a!sjc>TsTn$M`_0Hao38~&`+#&8x%iHgKoLo^zw>wViU+x^>uI6>m z24__TP`+jCR*HtIl1M3=6|-o@fn^h20zVhcne|E+NA=1VM|HVWy2p+U)4Jfg8R=>{ zk#aNA)v|v^z8UFiS$Nk}x_NzOl2yWK@soD9KBQefexJftl-Ji;*ppF{gq z5q9GY&K7p#49*dms&+(8#3jOu#p?b)*sm`81uy>~(oQS84Y`?(+|HMqAlYcbgnYqWtbPi7A&~ zS!USSpG^5R_Sd9$ximJCw(cEg6dM_r3Ne)P*{(bYtd>(&A7!#~gISxf9}Po>QjV24 z`44|{T(vpsc6Iy_j%%r7H39cr)Ww-+;;w)?1cl;YH2n~7fj%Q#caGhnSBt`51F6&~ z8$gtbhU-nxrE(<2fS)0|1hY0_S7$+K6|Ln8YVvRo;pa&1)(oC23hGVsAc$v}Uu zcc{E+yj6D7_%(0R+;Q>j8qFaQ(GBol8aIE#{!+2=!Ti`5+nG``>ms$Pg|Ag>e`+?AE@6+G z{O4O$9yd+RxVy?Vt=ApOx|+G3qT)m5TVqrwNXpbrQstN5YH9veP`UZ_>mXFFez{0< z$Dh)~vwbKfk`Y_{!#27UGh|}gn#>~ieN-|lEzDYcV#nb5Met%(5ZW$VtQbC@s3G)O<7X=*=HPJji5q2z_T z@>w%)mNnUn4dgQ*dCfx3Ko)=frXle?2ym6F*pY$s=o|b_*@~}hN0>b3maU^g0Jx5D zM?+hCBeb-5<0eQQgXfHr6nPb~%WUz7oK}{mW$nlzV??+ac^w7_G36 z+0=f&_)8I@POehDK!H(R<5Pb-Q5E32kVL0+Q@2WS=x$a$FND1H!c0K={jJAw*J4EEjq2hi z)nC8V!Z6jsDAJ?aRUa$hb*nsv+#^F~;H&b=pzEKKcU&DLu8M6_CEF;CtTM_tJ-|}R z%6PUXxT=orB<0OdgSAEYU%ZQDjh`N!KzYw;3!W+933+jV?7V+ltsu7NUg)JSCs<_m%%|%)&>&!&+w_uqH?ZGll!O!t=pag{ zrJwcog!PIg1-cHg93-BmUb?y&m4a)H%^^U4cth?*9$9oWxTYPw(q%iJ}olZSleP6QJj(W^dyNR-*eu< zC}ymU*j~-yaXGl+^RmzM5}-S|Ji$#ZX)@EQ%L5VhHzgZ7S-&Vu-^6}e@_iI zp?wd6IA{K!omj_9X9!IF>O5VsG>!z$w={<3vH#Y^Fo!KZFs(o zvOZ$9OkIC0ALoXL(kd(^jM2C%2%G79=&%6ok|-XrizSSX2m=Jhpc{o7$0<}8aCgIi zyB~^3;8MW=%R`c>G$a+`>h8{~k2iNY^Z-{JC3f<@+PiRaHi$4mzhYuzp*UmWsEg`s zXt*QUMSZD_iz+EO*!ZceRg^C7ECZbo_=6h8MoWKo)haq;D(f@Z8U*6?e1v}wI;~+( zhml*tcv~(5IUcu61uqO3|Ptg(M{a9Tweqr#N^<6QSR*J%vteBM;>4scs* zR{JZD8hTmPHh?-aH~XOp&J@l#1Ewhmk0tfj>c zNca-}gd(F39GbVz;g=RhqwV7`Q6?Tf4ijUVV(U}k=$Ma92yV~8^yR#P- zfXR%m?R(E5WlfbR;Ytq7j`cklSo!3Aj)>0kd??^}~;x$Js}j*qUZ2=>iK?K!}8m1D)Zw)J2~ zlj>FXT%5~F-A!pb0%XbDXL5Mh^vy!)`6L>qZU&(4(d*lQqYqYH=z6AsjsaimA0onjbfIWV; z#$L$OtnS>1rn?cI9gi}8oQ!`OX;oI~w=Fi^%fJmK^hhE1r$+AB<#(e1DMj|SSbx-C ztQVEi2VCqQ^%04F)w9JHWfY>6dr|pSMOj%RAFz}M9QJm%clYc#X2p~qyB;fH%3e=i zO<3{@@zv&h_dT=&5WgTx^5xH?Biq1N<1IfCk3F-o1pLR8n62$YC{uru*J)!Ica^7n z;uIk4tU4$lTh_t+mkkfL$DJ>-GzQrs_E$F)iL+n+hB3q!RO4d)sK@M)tu+#7c+7sO z$2>_)f1r!0!W*81wu_3^sG%VmwUV%DRb^6|f~}8e+jSD{CfJkx-ie&ZzH@e;llmA* zr%p!Fsg-EEbrNm2R-%9H)e3FDPKMC0m1qaG5N&=A7^IBH$~SR>SDp63hfPva%cFwah)p=N9p4cQfPjeZ zMQU`!<=80=U^IC7>?kg~Ck{R;3*t>MWJFdx7sJrsQaoAjVng6;I8M=PIx25kM@`WfIg@$9D~R_NSM z2g&_=8{dJRfzZ?)p%O2D20Rsx{tS59`1#$xf`$pysx$(1}V0G6^oAx^uD3lPDnBibC96C6X5&L1rcI{O*7FtMhi*i| zC|kR65J9Y;W7ss)M)esrFB35X810?gMa~O+sX6jyJzsfo(McN z*ALt4hn@Aq?)qVG{jk5WqqWMQr(}05On@mCHu?X>^}0rjjM!NwhDqS*Uj8z_OJpi} z!PQEKuMVOPokEANjSfGq!@+zJIxNRDy8M4pln^Ki>}Q&cc62()dP~aQP@cEuY>Pkn zx?td8z?CCZ-VWx*X!41$^8r={6u7<@QqXLdT$DR9B9BCr|E8jNTXh(u}`Z<>$R}cSqZ}stL_KSaH z_H&~(-L*z4_CGLUNXqNI*eRhwoV}C$B51jV;fk_pY}u<9E~DQxF>cy;*a=lXh}9F! zTH|s9l6IiXo(jxe3w5F(06E^W4lKhI+>$h~eP7$yn4eBzivJUSNQJ}}eknP5t(a1B z^4cqcOwrah=I}e81F*c}IGg+!5XgVRpQGemu3FcN<1=?fQo44_smfMzIaMrOclpti zYr>Wab<=+evYUs^NSiP0+llkyE$Og0K{f?3BzBn2qa+}&o}0ahgRchQ;Mti!yerHr z*v{z3kdWta!M!m!wPNXkw1omObEwcH5+kBO&yzZLHD>Ic>X^HQ^4&TK=zXw1a zvfrmEdE(hbD9c%FK=g3w=`WE(rgRA7lua9ALG)1R%|HW>pn^wCf`}@|83XGx<0fR| z+UP^4^H^3aZK1;&&m`-_wwHfY9jiE#iUK_N01CkDLKi;XZc1-AxaB||+OC_>G>zuh zs9t+})hj#Wvr|&NwlA+#WBwnOtZ$pF(d5Dk&4-qomAupVc=DO8xKo+c`ySsl8MK17BeZq_x zej9B&Wy}BAJr2=p$e#Ty%fzpZz3ceYmbMK0`f%Mv5WM%pC=3_!O604C>myZrg66=^&pg>8WtMbZoK>>C(K3u6T2dmsHhiC~^Z4~(c0W4ZG{1-u zO&N>$QBW1D!Ke))u8#}u+h4T9IdO!9~D*PQr0O`TF4Z#k)OBi z14PYy>nz^#xPRDR>LPKxPYK^vlWzv`=4AADn57AO((qDJtU?-1{)R6Q-)4FF-G;ZU z1oP${g?amq0;lv)$6n(olq&(L5?99FZ4V()@gq3F<%RRq==FaN0G;6#l7gBN9#OJL zK?!3FaY`u8NKiuJ$-}Y^h+oMf^_J8y*e)zeiyhr9GMK&O10R8-y1%5GuF-T_o zyTZt&#o&Hg@_P)d?_#+jMC9Kj;IFe#DeivjyYr0i)cF33ZOK~l8_ta1lx-6a*gbew zz%~PjuV~r+bHsl?omyRMX&G%VOlgvl8J$N76-e5Gr((6<#3Euh!FV!|<^9$o?dKw8 zKoc)}3DVI~@cL${X2yi>hI4$Y;b)L70F1mo=-O9w+}Hmw7<#{1G(N8YEvkOUsf!}Vd` z2)2&L7g(*ddz%$;WMXh+wpOFiVZp<89Ga$v;nI~;#2=QBuT05s?UiK~%4bRf@~tfT zO~VZ_u;(}{DZ3|{KUbC-S|5{FkE{g5n`k968mWJhQQP&{K4Hj6*y1wM`UXohJDitnhIhHmb zeGcE+SP70qRtNX31T(iC8|ol_Fb%pHIJ`*gCwAyYL9QP5Mg{;#umXDwlJfbXXRJW$ zL%4r{+Rl}qUDaJuajafO+6*rE#pP$rqvX|2++E2%!W(onvYHAI!}bDC(?QrJ{=_2e zAU4R2{H>m4*H}-o@Xd`$pWxXr*#tC74%W0QPdt}-tQun?P~i_86>^Pv|57w%wKtUYz&dJT&R1mE((YMO&!>4Gd`g__RL+{b$yMeeywHE8 zZ$>B0e3D5(-TrS8wuG40)!Q{!$HnF=HhCMw|lxOk@Dp zbXom9mo)^J)h%&Zoy%R;x7=l!YnQb?u6OdK!exo|1>3TgA0IyGw6q0%$ZaVGJyVWg zsR{x8XH-gf)1C0{IDc1v{f?r#nX-T421eOXTDp5SRCY7T0la(#>$So5o}=j5r(MU7 z7Ot^6&r>YVPD0!7EDb1ETMtnXdp;z%?&mHaCD&K+sZhp?@N1MzX_{Hy(<3CxLTIaH zfGL09;A{RTk1?xn8-1NE`KdAwWb}3EDHEvqnV*sOh4Sb2ROp3dM?rt=8|Gj3 zZ@Q8-VBNfMhpk%D0cHOWnz8>|M@&T()+akj=}(bvEJP>u*;-@f=wl%kie8Ve6T)c3{UBWx)r1(1by*qbgFk4Prjb8msR3jODTP)+v5@<38 z{yQoJ*{wl48v8dIsV@lZ(%wi7bQ-CeV%x3iB>T62?4&4CZ+Gh_Raeo;l0+uwspcbq$WE2h3SZsGTQg$pLbG@NU`;h((r+a^3%emj|f^U zfCl$}Myq||O}oSmQk{ApapeNE#*Js9Z>)#d%#>LU8Zns2PogEbYieDKwmP4;{}^p4Y$HxUI2qHttJTNV&jePo`u|(v0layl_rf zwG?K!>y=-EkD1I{dT$ARL7;kTdqu+Z3wwDijTleofe(0xTxmkKut zC~eHC5K>CWP1|L?DTc*tVQa5*%``ejM@`h=Y>cK;*_`Q|RTV57nmczkPrjH)%XFZ5 zGk&9Fw^?KpMEfXvbS_OR_lAI6y$4I?6v!n~saUdyi8Q@xKB4nNl_psNELu~4vT*{O zlc0r%9Y^XxLxhq^@xOF)DOc4cHqFcKr~RFI^-d_`Vjj z!y{S~u-O3Qe+e^E@jS7tulr@k=N|8Wja_<-&G|`Q@&g|W*v8!T7i^FuR)_z0o|}}d ztQ^!uf7_OwZL^$2$PW|$*@KsV2f>QjPuL-a)4a!j9Q_C_55D*Zn|5rpPql5iK6Do7 zdfBWgY>ZQ~zOzxV;d;MT^ni}cTP)0g=Keu&KvJvomCc$zNc@y9yvB=K)q~dmo1~d} z1AXupekMGE1$5d*Za{KOL#tCLAA5%@HQP-QKZygB<0r5A3)1z#4?m}W1V8W4H$EZ_ zk@834V-aN(icUK6ej5w&bn{~fQ22#|y-njA&sA|d{2z4o#neRu$97*d9IyV|1rlJFFA!=muDo1EV%ZXTg{?9^{r_<3aYKBxbt| z!%?~sjaRuUhhBY{;uq6@V0K$D!cQ?8Il|9CnmEEwL7F+jPf;2=!p~ruI>P&GOq)Eq z_xKDQG<$%i4wwNDX9R}_8#XI2Xg_~|%OUeQ@pHOnk3a=X6EO8+@{%9!ZDnn#nbk69 zBYjA~G9~NZm;hdk)hrj-DYzSaV7=-d>b1XzZg72lSQ4C{I3lKhsi!fnloMRn`Qdt| z_~A~_U+0LcujvMe8JnfdZkQy`t7SX9w$-pdjJtL(UVp8@x;QZI>`}}wj1NlxxDqy8 z#)D-K{B^8G)c&e$Fj3Rsj?S}X4Uo;5hiMpMt3{lZ+FAGj-pPW)EO_>(T%Rc#hn2j4SaTIz~S`*P(~sg=hXK+e?2n_&r(JZYvq-S zYwwD5pNMgo0vVptcOlZ+Z`C(pq(a)Hcu8J-vdlRodxisq<1O-WmU~{0Eqr2`ee`fG?~)rZ5njS&0Ap_1mwpnleN%u!8nZoAz70*# zv{%s?z+S(98s9d~@rwcUy$(-5f8B1LBq)N-#xfD^C>)k=nlhDM1yVnkJwxc~X=B8N zjcZ6=s1J#Uwd|cMAgJe|4R!gQAC*A$cMGif0wzzC!V< zhPmerG|Jg=#Yy$<#9Ggcd;x`8HXvI^m^@LxXkH};r)?{j+z$DDdp)8bH?CgxWR;_2 zj#3;y5#_QUHLhIt-EI}9PpgQ;xoY{(0m$dz=(xz)EU?6rvhHq0Il~#T2Me5`Jf&;O zD~&9Fw+QyQ0ms9__%V(HORcTs{Xy6gs+Qs+0mw7kO!9)Qc`5Al-T)32;1XDM?_ZE+2o=5 zLMWxUXP$Wr@_+`y!CWhutk1?qgkKQnF_YJSQIe3;xTVNNC=So!+Aic4GhpRuY|EhA z3_8@?N;39n%dmIxav5&f+&#yuF!v_R&~@3OqWOqBi9+zm@OJU;#z{`+TONhoKEmA> zHV0;8uPu{@gG{V_o{6=OBt(o}CDY7|xo2j^L^3mDR+t%L;%BDV>zQ%JcUD+Zc~>WY zu7zQWb)3Cn>grZm_^iz~QZsBLHN!SiGi)O@#5Ph>Y$G+!Hc~TeBQ?i1(vM&pyQ}y> zCQX*{41^B5cmhI`IXXe1%NU)&&~A#3@n|wc#~?JCp%Wl7jL;{gMre&wif19oP=uHK zrrM-dnH^<_on0^uk7#s-wNkH=PRX2qPzBj1LT|M{EG&dllX-SC!|rCQS(ej$l@qiK zu}>CB7?3nGU8^dtBwC#?iJuS{JPqnq1xQV>hgBh4yh6#royv^7S#!uq45wP~R4?}{X15x7VB=?#xSy=;{!zaxo&IKq0 zS2=_U*%$$Df0dru_IPC$dp)LaG(NQ(5B}6;hQmeU&2+$i7?@x|U}&(uJ;S;wvHIp< z9WtziS*fD7`Fg7FgZOZNhOw_4W8aSg$T9&d7UDk_xjK|NHBV9WXeJ;a%quvEl+vsxBRQ4g6 zDeE*?BF0Qv<9syxF|#0lDBF}e(K19mo{4G1UzL~Rw2Nl6pQa&yWuQir_bB{ALyJ8*c|;RXqn-%GnU3TgS06~)A06A`i7>`6 zeSGTLXft86-6y20AL^mAjYiis8l7V_x}MSKT%*zTO+z;tKQPN$tiMJZe`=!&Gx&!t zGq^bb?N8W3+9)%UbsB%KK&R0RR-@Bz264P~q+XSP79_{R_%^1{_X<3P^vx7=vba%0S~FOX1tel9*41zp4@ zz460(^4MWNS?tSZU+}8KzIyD-Z96G`csAREDskB#9ueHK7qomTnfcN#kvFBt{#_4V zA;ly;fV7WRhYEj}HF?Rcp|DwH>PLQycEk+S+WYZO$MgE)4Z?li0 zIeALbt=!}~Z#LhL7!UYK`YnwLAWls3V5X0VllC<-(FcEh6layX$T)|fl#ffvj^z%{ z-i%;KMmSr|=OoQg#{Q)*+_p12QM}0b;C6BJC$E>e$n)jCpyy&0KckHP3+L}5Z8NM? z;*2dq_)hd>unXgEE zH&H!WL)=~GYEdVeyenTr4BoZyj6?Rf?z(lE7t=JRT6E_??o&z3>e<`z>+69FI(VCC z&1$8#-ZYU5U7ArToTi?s#-fIq#$(F@MJQaVk<%s9XN&ta8?};Xf$S=57DeX?U zBB@kpzHAvj!iXuBx*u`qydv617()l*wSO=j2%~jWU0AYMuWTWDh<(;tptzOWQ@471 z+JggU@!g=I+ETv6_?H&Y^C39XXjEFl(A`qK#gS<8ZnByr?rytoAn$I(uBPhuwq`uo z?{0siUZq1=p6|b@<>8e4&h~^8pwUWH%h>iRlH-L25IjgDJ^8mPrb zXm1#)&gn=sTe8aJ>SlT6J>9G0?)9Hl}$ND$jWk|XO*1ctD>AyRiN zYoy@6WuL?M-@Efq7-*LkTv&Z~Us-+g@Y#P_R&r3en;%r~=2~n6^nP>PTm1?==!p+N{1CstIN?WujJ9 zN5h)ftCx@}VfD;VC~UP#@eT{hTNW>UAyWDnfyfDPj*UPfveg*@rLa8uuvpJz%L{*9 zEiakPanp^$D{7_;Y8C+gQ0!AST5RI0hK01d0<(ZHr!XaG~ zfksxXnYYl`-387>B9u5UDhBA~$Huw&`XnkP8V|E4Dy0~YlfHOxB;VsNY6M{-QM@)- zDrz3^!@Gl#s&bGX;;>I}pjFJvdPsjPEq;KgT%-@-7bHqmlxbJ24*9jBY-%F0s8f&J zY@6jIvWl7(kf=;rGL||Z=@H6ai82m&Eiwg)_8L;VTNI5)r?@mzC^y5;l^|5*_&J2L zAUNQ|u)|Ger6q&)qsZ}xsKi=(x5Fwk4=P1uy-HL!BKaZ-6z+nqMCRr=m05pp=KxWu z$NTO(o&{$~uze-vYn2fEO21_<@it6wAbjj{B`F4Kw{z;K*@e3B%$9>Cdlr#6kQm@o zrU>kpb)6_9lHdr1G-6;F9jRZ%C(!>Rvf1*|m+3`$H$2yu>%=Gk4$8!eR#zz3I)~!c zkm%T1Vp_AF(GZDCjF6X^;1qwVt}^xQ?UFbayKQZv-JZi4#@YnVD(dEI<|kd2gR_i2 z#Uh=h00310+!@>Ipd6||fiG>JZ5n=e&JsuS{Qf_u52y#V1MCt1QKbGKPsjYd!=fYN zW6f&>RCNQeaIrAh@7GCpojsysSg35CsMOZkMQy!zfaVV1ue!Teli7biD92B_`ei+N zm}wfa#dgvb|B8K!+-#s_lg=9(@(xn66~6`!E%2z?bYH-vev^Fxh&yN6Oaj%-mfH`H zj(u5mX^W=I-MpRU!6g-CR_{PTC3EpMAj%P)s;CB3+SIfXja&!NYb~qt`W$1htwU38 zOs8CcrLuP}KrpJC)SG`e+kPT3NujKPzMi>&K~vYffktNE^l|Dh=$Z^mUsPrdAl6|X zCYyZ`2e}Khf!F}x5SHq<-(GSM&mC#q9@W%4k7|-yNqo3lkH61T)JNh9sb_WI$X=}K z+k@Hxf-_~n+_1%xK-@bEp_|AXXs=sso!rg7kbxN0{ zpoia-=%F?VL3h8a)?MyhP_0J1QRq=yL63^YfZVPca`&^dyE`<(0bUBFf+*mWtl4x) zc4tbXpF@P6;uTjNra^I%MsT81zCC{M>!=pL67Ur~XqL5N%@vD$7)avNvm7|hg7{>T zlGvBn`7I)abE1EQ33Vb{RzTGDvQpV79O(E2JjmRbhTxN92KiB5ndrT&<<6k9Q|vkR zaX>^3MCHouLyLBwt($`+LfH4A$QpYP0I(*&lRcTbDC7sRGpGf~RD7YNE0Q$Ep|iHw!0P>lm*0x_M$s~~I^RkD2Q&B~ zxTEw%YF~c|-~G%iR-5tvH^s{d$(HOb!tr;(zQNgbg#Sro+(&8v8I6rXCNJQ%E~37O zKFvzsyFti`U{QI<2631yA{@t7M~uCHGBz})c{jq#o%g8DigXr6!4&fe3I`#ZpHhlL zn6$u8GFq^w7O>lKamL<)pzJkfPsF)5`)D%4?Ja*cWeu92vNQ|k1gmK2QGW)PHHu^5 z;!u7eY&y!Dx7C`3E^fi{4rR-xk0~C6rv0F7k?uVrE-CxweK`FsW&QFS$SPK^k`B5x z%SK;D5A124vvd3?vFi#W*9*x@vH4Obud|oexdiR z!gqfl?XFL|$Qy$q=^km1OAVXzcD(=^hChCE0>&9e*a2O`O z@Oe6TmW7rb<{7d(w$?cHBw-NtJg@4#%V z&K~O{BtdBdzh{^=aV-3gRwrYFjs$3#rz3xHKjJiMqX=3<0m=N7E`?%frTV?lO=o;q z{Ln_qFJafq`P-pL29SFNNUbbh2=uDb0*UwC4CpCSh|r`Bb>amy_E{acrZKxYg}MQ# z8&jEm1+F$`2MCo(r_mocTc9`z$S!jFp^lo2AFf^X4f#v|CNXi~oW=9R<#~;r_YQyT ztpu${@5V=p*V`)|52n#dWh)hc4aF{+%-BdIL=511(Q772@GcW{aqZ~v^UYaEkT^j4 zNJ4`%UesjySYmN`^oiqZZCj6ljx@>~sgl`6kmvR(W*c{Ll~CKV$8#Ck%Uni$keTxK znY=g%)CnAsh{;@UT2$RR@4>2zSXFmA~zoKLfX=<_%$ZN=@FY@V!ZSC>UWSvN{mKxqFgxSYHQEjB#zdu zx#E0f586RxegS=bP-mvtOTcfuiA2urmq3r=)HtIs2!6fGxw>?v9@-WW8&Q8RYzfq5 zs2*zj*O(1TphK-2gs(%@8-#DP`WwAJX;=!Qhrx9s7(EoO6G6*x_(=QQkF_^!>2~V9 zu(jBtcVgCJe2fZngugHyaYjb^mCsO8G^)0tjA$7+ZFl#y+uPF|`gSXimepQkjyB^| zzYU(k=Fsa<{Z_d-+vDZj)QW%5mqjZSb>RWfJX3PL*}go1XS=6&L}h`le@EWQrGP03 z*=VpbDAqmTncsLuRJKoJ%`O;j{_{_^y08Z5ucSz>kKi4+u@7(99rU%R1;XD9_`Bs> z;}meD1YSeSB&7aU{JH*~mQrN6A0Sc}ihBY!`U^q9a~@{uMU!bCHD7-y;od{<=%F6# zq1noRCb`Jp$182I|LPtD{TB&fz9UJs6Ym|^WCz{{m{I*REKT5y%#)PdEuo(n&4!%PjLEBCOF|g{j8K6Ey1_- z1o}*3gnXcf=v`E7Lia+F1XaS| z1)nJ5SyX?6+RUpL=99C~dbBE)DI{|sTr7(hLA&kw8`~#k1o8M5vr!p9wh9=O09twh zxa(`z62yHcwMZasgoq!V_=w8EM~5+1aZSpO?GGNblnXv+WKC1hn}w@11-@wnNGSMD zlwjqfoc@L4C@<*zykVHkW$tGQYS?>nLt9`%-jRPDu`=TXPg$Cz#(>_0Ws2_tb$AZZ zzfHr;U-BYcpde0zuXMbjJ6~Z%hK!(g;=0B&HE<&?cbltiWFK%=zd zWA1;-IZ$Xj1+1v+;8ABtfbXFA=-RQpqVEE#smWe5e_p*V%ryNV2=iRj9Or3aZi64Y z=(QXMH^f##xlrKeod8+TojDDqEIzFEEIKZ21R=H~b2@xLJ9u>L2prUH(hC%-7-S6V zJPe)-icVgV{&EXoR ztD*wz+ZwPy9ALwRzicIT8gn>&S7NLIOx6{8^`bpGRZN&Qt^scA0>AfHdUke@u9D)4 z5p=(XFZksymU`V#0^b?X?fTslQrajK^3AR49_YH>mkQ8zrSu*e4k}R?>B)~-pcjAW z{*(g0;0u(8MOzehU?!Jc+(m(eQsjjIg|lLMFsmvp$CxTl__vHS3Phb$Excjo|4iqD(_K1uF!9th>gT@DCE zOG%!FvziEy%aE$%(U+l9%A*^Ar;-U?22aitzE!JEevl(8XVbFBvebWvU2Q5{$*cAe z&kL%JBs}Z&PSS3MoX1veCRp?ZDSc~1+ky!iN6SG%dYX4sez0Ex+A~+tDk=z-;*-vnOx8ck|hw6lGh{+NHbIs zOy~6eBf9@Xnk~>Wixz)=_Ohl8YRu6w+1`q{Ic!j~11+Se?ljQu`WB`!Iq&*C)R@+G zSsxliGB+JXc~Fp~nc(1!iU4CCJxB8}KbqS!T181=nC`mH#zbNYfHpvg9Xjc*I~lYu z{PfUd9wr4ga3{x#_^6F!ptoc?1Z~3~#1mSdgk{Y1uth)q{%?Qx9mdqcax_lAg&CTq zE3C`iemagM{l2^NecJaxR6&^>^o6Ofa=@=D!#jNh;uI=5@C!5;tNqL|bb?CKP{hq0Le>M!Y*>-+4^a$2hcuI9<&*$w;~NY#`HJPw6?t`@LmU#h(G2j_@=Vj5?sK zGoaHAHJkyV5k@FWQ!#llN-*k*$-shAM~ndmlscp4lOC28Y6rM^hq!siH52cIX5w`~ zGhrt{7lbl9R-F)K>}cs5uHnP0E0T>Jv(AVEcGRSag?IyK93KE@Zh^Og|?F~VIp?O&NQH%lk+0UOU3h@lsXx|Zb{CQ@SJRu3ci{c4ed^dzI#lIq) z$Kwz8K|Fj6i^=C`KoXut4{7$z&*qbRG=5l;I>z6opT!=&g}#s%05f5Q>jDhQOE4ED z#I?m(&`6ps#x{DF`N7w)_|-3hr*N+lVlNl4f@^UR>r!Zb(bCbBk>O8O2oUV<;4jx0%FXkj3#)enx zj)RBB-@{-<8)bM1Jtiv(EQUErvjskf4FkOW6tqHy{Nc;gMqa*}p#||QlsTni^38wa z&YZD9QaZk+*}U}X`_6s04&Os>lNZ{e zf^dI72*O;{Mw{X?-KIi%qzE2gnumWBn;Uo&@IA=eZ!=V9{N5n&z&8xx0SNqZvnNDzgNjuvP78~Rr-a47ONHG_XbH62VX z=%D;Q2!1I|AP`D}`q+zF=V7+t7Y6V23&9s&7bIW9Ns4_ix*#d&B-{8GONj;VU*v#C zAKI9j(MF?tBkG~Hf<-o6PIu6ke}B)xq7hxB-eq@L)CIb9CG1RVem zMB33v5P#r-NDz&_97!SG)MbB?%Q7hwBDHx?L<#aqk)8@_m_0SN)DZPZE^RC5C2+A+ znhq@VFu3@u*5HY{NBVKw!>agp$xebqI2d?(Q%}%+0|QSM^|(Y=^X{e+ud6(auI`Ma zJqmdkb>fVs14M)~mCtMc=Q|NTKG9^oRZt#nur5k~;0^(Ty9EyfcXxM(;O-g*cXxMp zC%C)2y9E7kx5K~I*;Tu0Urf(?Gc{FHbJ6`++qp(BnuwWi^muL{g6g0h*^Z=r0lFus z*9I2fOPAm#lOeOUT+cPsPWfJ%psJs{JnAs4lcxO;L>}-0VjSoq4Gpzv_X?8c(QHg z9NPvAXl{A&{yL}o`tiszvW*TYKnCc5A8;zr?a~H0WJC7}&k^bDehrQ3m3zUOMV(zs>d1t4c}l>WO1{MSy_meXJ9v*1|Q8#&fUP-|m8adGQ@?1AH@_ zPK@t07}EwVUC8k``T3}5mFH9WZ|+AIQk61R))LFj#V{}T zECyRy6lZHohZyIFuoGS0jzm-xS%he`47>GWlw zUzvSxft%KGn06Z$?oF^gqw2TW`nE!eXlr&_st|9-LCSH~UF2VONg?GPX0k6P}0k zFWlopuxHC-Wg-i}A@T7(YyorpBI}v$6cIY^_VA#DE!tayL5P9#tZ7 ziBo)LHc9nEP7ENUNSfVNhvf-;I)1*>|K z_0uk3>gV)FOxVtCc`x;9&Rqpq+vkvfS9Rvm*?ocY{6cHwqA&a_lMt0c*mPE98dr>XjGx*u8Zyk&gua)W{<#W zXC(VYR~E34FY3SS-CE%4B8Vjpy9^Pom@!h9|7m1}T{5npvlYj~1(nW0rr?S%mi-<9 zf(G}XFl^src?=^^^Zu1B4ewb?(|gfye&|FLFfP{ov(Sc;#&q{c*H2eVC0UR{*EWLI z(B6PKt~|Wj>h1)x@GN@+NZ6^AQ2PF)_32}{aRaznQQkkr6$C&z=DyXhGp9D< z9+4Bis6yW%=CZ(q{I@Dc3*VTDS88Uesk&1zjK?^bt9+H^;YWT2_^;;9!ChVyGXOf^ zp2BT5m0T`4fn6B01IP&a0&=iOyd2e*a{}Ez^j=tAjj+yWy%4%=bLS8KTykmV@l)+&Hp=Oc$VZiYGI!AkY~K>jDKYjz3L1k8flw{D%1x&?lLd@SL^%(E z8!$3ku*u)SYPcG?{0_Z$Tm$^^dV!5dc+flp`?<@;w-V&}yejRh8BhdUuL{+zjy@gD zJSSMqhECj^r}vLREo1}_w&iRD6Rf?7-Mv}5ETllf1CJM@3bDg?8eRRyW&~Epj>Hmp zXSu;TC2E;+9&hsnR#`86OzfQ9yk#Gvu(MGx=%N}h2BHuLYIiNU@#3iaOkj~!Ft08` zo(eM0!uk8G1?;-$|&^9$|9W;Gv?;8>KR!ciZcq_UZ+`pwec z2v-~YcYC*_|-IA~JX@4d1mr%gkNecD~Zp9I>O3g{+yA zmDuLYZM)u6E13!gOE83oHvyKX z&R`%7(_?-u>zN_X_Ps@4%0^Ym_iDw!iSb7@V1hMcD7fN*T;3Q9#ftTP)!Y>{`_==c z>Xu;YEtmGeUS+itgi6}%R6garF6VW40{og}+Av3%?LTJ)4+Z(Lga8MOf-$TH@$5bc z4rd3S39Gr0*WX$6F@%r?S@|$R|FEckk-QGow!I@r%v;PwHsGys@;{h8f05Y==RoFd zhq;vvQ-FONIBcfqK`j`xRNjOu_uCOHR3T1m=E!jsSH@0(E~hS)_=EK=JzGhsEMQqQ zPg+toga^)kWz-eoffpdLq{Z_K!J|b8TI-*ac)Tar@a~=Z^Bmjmd2R>4h=N3YXS_iS z1%q`>%u*Gwc4lLhA`&)g8;jZKnoV-$xeM*j2G@_!xUn{Nb;Io;J?Q#nQ=!+zK7|`o zZcpobdZeFI?QMO`Sx_i7$byM==~#%G5Reux~`h15{} zT)#%%&lkX);j<;e+Wmm?UoU^p!9RkIQC%u|wJdc+!wytup3uJ~P?g}%VWL=T^UN5B z?ye4J2|4X@&ICS&Rw14${E#Y1=pi+UMFlO*y3U1OBKcorSR2yIZp-3F?`Pr7Isbgg zxw{QlO-{sa!*C!T@Og>B^(?Rg@eji35~y&?<3L-%S2ccp$SScr;YS*+48+h*J=#jB zSDnCF%^=@NG`<vsB^11@VT~28s02_5wPTNV@g@ESP&}-=L~<97OCd zPvo|CWbs+8+e^7DaTg?{xqfaR0Cf0N`?mY|aEfPvq_MzF@;5Y{{#*#@7nteiE=6QL z#95CQ@0LY=MW(mrFTS9l+1!uF^B}|A57JpZ_h~7eWj2(?W`9}midvl+ltUYBgh=PR zAVydJNxB(^pGQVZs2#piY`fTo`XJ z4a^NRxy;thM|#)Db{&sDnQ@nCBe&?s8PDlF$pF~W2FM_=ODb8^bu9SX`{blWfd0F+j699kKOEDNZ{+Ssk1EfMoG>%(o#A~^`j2e zPvDNC|3@b(w8`t#^|;%HS?(gn85pbX)n~qkCAo!Yq}nU3?iH@vz_TA7Vvo%3t@#dR zC=(U&8_y87O!!W(o=wR#RIWyQirgPb-m&Zu!%#R7+VRy$EcS;mu@^eyH<;H8E{VIp3s$^& zp|a{Fq>8|2H?K#3P;kwv>Ts!4&*tUv7Un~ihER8QKw|VSf0LOWu`!1Fe2axi^DiHD zF2^$b@zpJa^Ru`yMoR#-fzSCIcq+GwIyor+uK6f(>0}SNU+fdqoi-Ktqt>I^=Pa%! z&R(_Iqn~xCPF8`^%Q)l01WwQ2bJc|1i0lDXQdsQdxPeI&U)UF4qL_!FhM5{y9;GPA zie%v-(brZUO|xmIYx7=QwwJ#h>+BI!G`dl!UAM$Kb)SX0Hj!x&+i{nuYPF&Nn9cLp%v3%h|ej_wzn5vKNGDS!vpevgm88A$wi|_txc9)0sw70dXnT6q0$U~2${-4l5 zE!>ZEd;_6Z`f)XT0X~*@X4cqn-T?a$I-go>o=d#pdB;@4k&p*5@Ao*!>*GW3KIl+_ zSt~R-c-%EWK!NiK57+4RLZ2~bN1|Qu?g^1vBx!NH z!9eXeanbyH+Il)N1Xavek^O$-=EW6{_!jK@ijGBbGI>rdxxethf_R(6P2wRVbX|vO zo_CU(2_`z~o4u+v*z;fcimh_tdCmO`YW^1JbNKNmwyiz^z3PH;Px5uEpy<-2OE+YJc~A&4e}eP4bvxmHK;ZmI55MUNLS~7hj)5;Tvc&qI9R@9qMjJkW zwWE^YZ86&%O%vUUUZ46m&(jn7M8Z&$@#7GjR1*o^2gnwm;_Z3YVv2l{rdEkO9Vy%HQfePAO>}XnnZYu^)MDv5-LEPE|pO& zfW)eQT_OAs&v*wylnPcbEr*hXyQ2$;rZy!6B>nnH=p(WZdM4FN@6!L?D?Z1^MD3TZm0u`l-dY) zhT1e$A!1MvOx+OU92gEMX+RI&D>)J?J59WH22~G~v~s%{KY`;8Aa-+v3VakXP5bgf zW?jCZS@KBae&trkL+2K90N&L_417BuKUWa(V|t%IF(ZtQ8sR@it8@u!YFm_hhc@^O zZ;mox6uVdT)UJpmw38V`iD*2=nB+ncMZzRrAE9dfR)1UC>-ltj4+Ujj|M+c$ZdTgU zVK2E;m_<~@t2jTv&G8C?1_Gb=u0oixp_A79<%gkci%wT4Id#10T6rvzdrXD%Qfz%M12)`l?hd(Wal{Lhv*7AhN+;I8Kry$r^ z2|@yQt_UffzDWj=A~GVKPC2YH9f!zbBAt$?>^z;0>;y3bhjx@M1E8bDNnvm6rfRZx z@r^axAHQl;FVAHb6rOPlA+Kwwge-hIv%PEMt}txTk|5FNcGDk;UzWs1aM>4<&A25S-vG+JMc&7SS)KZnCM`35tE0 z5HM|dq!1MO0W!VibjhpY>FnUtWnGGwHrV`+&0l$D&Br&&_fh#HCWk08$yDNM5_i^K z-DAthy(3uvm}Cg|rjd4?SlNDkn|Qj1=#1W>Rx5BV|a6f%f@oqaXW-?i~0cy1m>Hj3M|FD)3E*SvtKc;ly;J7{3f zZhC$IdozsMFg|qa$|xa%P$-e^eG_2xh!4*HtARK z%Kli8pw@mx3FD%Ka~3n0>Bj~S*E#c(*~7Kj8IL#D9>yxNFDG+8piw} zJ(TfX-I24Ymj%6SWBA*+elKSB)0ZCSuavoF_X7>8K>>^KvyfXMD)KQuuEyLvsd;IE zHmtZ}QWP&~dxvVSNFho_cC*=yZ!T^yZer@Y#M`a)1EeUHlQ_u4AUx0Z5I@CxMZ|5~ zvvCo^oW4*mn@{h|<|mD3h?yW9t*Cp)kr@g&_OxH~cCPe;wnCYq@6s(FQ{QkiZ>^l7 z*(D|BOa>1-@$72wV$59|{Ze~8u;KuukWtmk<-%?I0=O(y#x|}8k(;)Yy?kaxB4$4)U@`b-@-~oB2e7b={ zSqs>F<;XNsN(6^%$&a00p+=1i3IvCsN#CxpzN)T=hsg8qvuWSf7_~f2*4+;oSy5(m zqz3M`pSp&oK6FfN`w46i1PUJ195S@B?wj__FSy3%?(H01LC1;fGn{%JQctsMlF06W zb;Tjd!XT}iqEU|;e{vj=Cs6T#Z_;7g=2CA`fp9 zLQln5ft4TbbGJXEp)DZpoW7-@P0$GpOel{rYz=xhuLJhGW9V#v&!F85ZqCsaK~DH1cW z2j72N6k~R=Phh)9}CJ0{H-=oF82*^OZ{pJ4jAL+-qhKO#wWAxbJ zQph_6l@1K4Ah!a6*^ki%L3$oLv4KY^NNFWL&8{=m2hj?xWKMl{PKXl7d)VYt$7(dQ z7VPg7e)S=O18#`_jJ1c{zgO@4`Mz}18L@QP8FA{SH)t87H+VP9u*dp&dF&@&;p`{d z^IVU)AzqJ7Yk8+0@icu)b=ru+SLH&e-Y(#Ls8}^vz5?P;3c4+VcfMuJJ9kk>9wbC= z8hc-|(pG6GH;P_!PL?}Hm$Sxg@Kwu(RW6F_4!P^Ry(m(2EpjNXJ?f_>O@{}@T(V%e`Q`l+>yB4h%YU|z>QlP1j0r4mhbDv1k7{o@28-2Pu0v^> ztG2+3rw6*y@ufMhnO*cjqZ_XBOBe0_t=>zpP&zGpkg5W%Ya$nUh7goIJQf-gs^R3C zBWrWo7aVe3@+X zAiJpncO9E!?Gq)-&Zdqh5e`>I>BZQQSD7iOpw01YHJ3<2(oZ^%`-2fhsKQ9=`*jl< zbJPZ&mHPft%)BgJlDFs&e4}>Lu|*N`4^;cjyzX-Z;|UuD)%i@iA8(k)KT%J5mTW%} zY@mYF?-2`cJnHZ`&x1qjTk$2~khD zla$ApG+*8^bZQBX^<aV!*e=83Bp6+qF(#^cI8!$a}M=!v?gwrBD&{AYz(Hg zm3rzLg+d!|o69dpoqW{5?3U;)A&eoaQpN^0Y}G9rXIXff;S1Qc{^9jMt!%>j;8LEu z1s`NT*kO^m?g9wmNmtD(_+Cwd%>i4N^n1fR_+sCLRM+C3%(xKHh~=X!h&3VA{xMDV z5h4G07M5`T%J~i90hQBTQrA@O7*2PUS8&NyGBa*JJz{Wjs~j#i{$b>N_K&8ix$aPD zhWkM#*EfS|&({9#s<^y}@f<3RL2ndUnu-3bKyO`jIgwhYMMr-BVwLN}CLrDU<}z9( z1#*Y;=AYvRoq67r`QTY>W)2!qUYq<)pI%$^l{K=vuYPyXNs^i~ zg87v+h#&*5E2*BY-p*p^APAr)PJ;RkNz<=F2Sk-HkJ|fi-dV5t>HD2b{H#$=39zg} zORKDE=s44^dzy}pMqxhG4jC>4UoYdi+i66H{ZkerYRC=oe+Qg1E+nBg35%(TE~DYE zL`?rLh9hA-oi5r+lT@B}EkXi-7?^b9b94?(6FExg+UBAEkV^w9@VBgn9h}oboc@d8 z<||g(@CC*{Uo`au;Qu^5-g`0h)ZXXf`94w^3>jX|gml3P$aD5#_y<}cQ9;2g&>}vG zw05^Y7^vv~Rh1y%q1f@desZ0w5l!N9qIKo|C83nXe)n%!?y#hr8}`Elb%3fDj=g6J zHmiEe@3VVE_L|@Hdf_$H#{)Alu-VEq$*@T1O5`dhp5yrRLDDoB^yc zjMKM<8tagEYaA2ZfcMw02B$=ioSkAus4ZXf-}>L&AGfP_!O4e9>K-;^?%xkh>7 zS^jK^2#QLFiy3#}iBfY8QakyfRpesV1i=FG@4Fd z$egV~kVy*q#E`3?iM55#A!GkCtiBIUjtP(Ol9$6htye?vmO%r6hxLq_^jY9p2~yFZ)~r{Ac4wsqH6sL{`H}50rJ~? zBb?9>T^2=@8M&VZV4Vr6B%Jmm;9d0z09%`k`@~;vh@;jKWz6X|DQB9>0H!CIatTUc zB;3wG-5{y(JKQUYmvlWALOPQ=`3zxsjRlKEj`KoVD%MS=Uc+Kf3bVNGeRe?<1o{UK zVg?$wYhhiW85?(OvlJ=WzY~zoeA6M z7WND19<`%S(eHhQNF6IEl;YC@U67X8b<5{2;s3eBP5FI-3^=8c7+>&Sx+%ql##lB4KI>I3qbp~byTo|+c9?^c|Bc%579NaHXD=Qb-0#?AO5dLge^<% z4BVddYs;7PSHa!T2(R7DA}>R%!W-mw>w4&q@FryMNGo{W>X#>0gXJX$z}wXp5&jPx zXcLKt*~U**D*|W}>w+yU1@m1hy43Wq>OM`l#KHGn!b`f0;smR%39VZ9(aF~TsTZ$r zY1)0{?OiQeV{WP_pVLr}IL%3%%Z#c$!ETP`vno^&ME4CSaQ62r-MUIkBdA`9 z++)4t)s0=36`N?LlYV!4P48Blw$Xm`bBIO_D|pm-)Ym>j%wPG!nTB@E&chjFVUeKA zcfGeW8NDVW)X@iT5r(|jDjc2CE_h~+^TN6t=zQ6%64yz8w9wNHoJ5D@ZduvM6EQM= zt^n0MksEAhzIVgRUg{+9I$X)^S!AN5LcMzK?( z*e;eDTAh0XvGaroJyx~3rAl7a{rl}>#KkA9(rmLpnBs(O^wtiq@7bvH}U$< zUSVrH2<}5c%B%nHI}sTA?#CK2x?>N@>g?+ll|m2IhCvWMKWFh+zqRnVq(31I(jdGg^3>? z;Lsgs`MS6^t){HO2a}TbM1yQb!eRNs2?I`G9&ezJ{#CE%!fCd#BmD&iGj_hC96@9HXt9i$P0s&h1 zKcdsOgF0WpLM<1~p(8j2zMd%Go|e;1boqLc2DQyMr&+g(E(oMTzhhgO!5h%>MiKOO z-K(Mr+y77bIa9d9LzZ1e<})_AXsa@uqANE#erj(m8uh9onk{!I*KF&V<3E(30qaOi zbD!fIe)AAjOkfDuMgk;fpB>X{$A|tfC9+sgQvslehi!FUVr|ncOE616(?-3$s<5sJ z!6T!lfs&Qak)$oS4ntx9qHmc%iqo1s@3c(RB;J8*hOQ80&pk1)gb~pjy7vjC&|wX9 zw)H#l@S!<()JBva*s|s>SJAGGCUOf@spjvI>cOM;BA%qsCmI;n2LGz~0pALxtltax^#pyS3>$OC!-9F$#4<~JJAPBZ2BA<{y5ms=x zR278NYGxJ7^k75+i^$SKNTdl>0bBJ#1={xR_=|)eVPGmdzo{=FFicr%=j-MqRl9pW zoV1v2kOa5kIM$iM(MRnPT;0z*r{DQ|zZh^{47*sq#jhP`V!MDylOF1|CBXfIJzQ5F zM{Zm>_hcz*n>f>%Jy=$syMFNl@ z41&eDl{YbA2p)KR?mDj(PQwcqW!vv4{i4G1w-iTPNrzt4{Rc*0?z3b`C$gqC)E%3^ zF{``>^t=V@$${}5SV)|fS}3)!UJ=Aq*@f{khLTw2ewCYl)4%)-+eF@fxo78=QDWp7 zj;6rZ@%pANPNXLIfV^;ZXu%ary97X2RP0#AX@2XA*dbz$irqPh6HBvWL%>i3Xe3*Vqtjb1K`Df<7=Mxie)M<-|IHjw+y z+W(`*cMYCxR`1`q~ zn)l69c<{7QU7iXiX+Ye6GI9K~c!uk;(=ANwO$2qhkqAVqA` zFsYcej|+1BjB4Ak6*?4LRoWd5riOGiv$-PVK3R(7CnSrKzklP2lFD)L?foxR#Kz9u zp_sN8Wz}Lm_#h<=?m(bNZI$!;fC00vnKdW=`JFTr1?}uV56j1(;Ggtd!qMa|AwhY4 z7)C1G#>dT-b&CRb%Xr%m8x1Wt@f<;(PY(OSwqvHjGO1s!k1MHpg?cNU6KOHe-Ad`4 zp4b46PIRRh_%As;@PuE^O=YR<#Q)bA_rb!zI;O4zJ$`s8LE$E1X&z&?2xgIA-mcSC;O#Du6-LL z0HlooUweH9judLI=%nu*RYd3b{%jf zI9BAGG829v3HV%t2Fu-NL=%S))DNR86OWDd6#CIJhbS9oDk5a>oh24M^2l~jhJ=3k zf}@o=nJKUrVDZbUD9s?j+PzG}vElcz{sb`^A+|AeX<1gB0WoW^WR~hGUXjk7lK2nM zV$DqItOve9>GKJ>m1Igoe!S{Z#^my1gm6)i+Q>X`Nn>6_GFD5Ay*(4b`>xzpOhKM< z!BY|Eb7m!7bQHkqh9PJOy*U$&p^i=tS6cf%&_0~EZ;v*u8?rnvEOIC&62%wFhpp_g z@44FQ`+A%`MEf^;fH080B>i+2GjB@TJ9n%9^h3!_uu1nfyTRjYed^AQ980G7PcJ75 z4Y?X%4l@3CpoL#0Exa1KQ{hT!+O}4`FVMH;7HFn)e5rYvWSD;9SB|j9kFH&aZPL2^ z95$&^b9eZEP5KFrrz`wLOm6=>=^Lis)Y_V;7p5A(vi)2Z;3-==NzCYtNJv=yW>Ny_ zNa*6$?*PLVI#(Q+O*WY01uS>{dwi4okK&hANDt-<$GRz%Yl%3RG76abduEmz$@Ig$ zx9g6j>MHn6?U6V)`m*CvtOWmX-+z*u_LYiYX4OnNLhlD1=!m^cE$roN!H^edOc|=i zycw_@XjhKbgFYF$Riim(D6hVd2zDbHfz%tgOd=8|fZ^gJpBoU$bAvqZ7XSuV_- zVnyxc^21p)Z&_M}^A!nCLK`UJ9?c3JFbe;IB^n)9Y5ma!2`X=#TNVZBLzjEJ_H$Zk z1sR?hQ5y@wFSvcFOsrh~&B^mFc8UFsAmqW?v#sIWdZ&p8dAgwWm^f@t5>n4Z?icj~ zL3no2K=8cxg3{YFKvm|kD{v%UY-Sx=U2x9K-krxq?+-4WMmP7sP9YO6ruj1?e`&FS64vwCy$j(s*{0yQqiZ&TmaUUzvE<$UstmTb0xDZTdO#*;K7_ zjHM$FTo)+=r@*-TKI~(7Jc`W0>BMz$BM2co9W<=pg)8z%yl**ds0=ue{0b-k%-zJ=5;u=Hx&uq(}fhC5MXI*+l2Y+*`7 z?O&l#PCt)ePR)Xwh$trx{rk)wC)`EJ21-Xv9S9kc(Z|L|ESE9bP>PB6t6_fEp}J1^`JxJynyK{)dNkzx_`chALb5_OZh< zbB=kPjLLatoR18%;eth``o~2zY~Sqq_i&LBkrG-gG7rMVuaqi3ux?TuER#knsRdei z;FlDfr>q89q?MaSP{MmESKF_Vhh#5=+&u_|v$K%?W~0y&rftL`lX>o{tjFdvlorp@ zCjtR$>~p=E&k9lx@%~gf`9^Zy%DnD7?sfVwcpcICCJ*)jMOlw8Fo71Ot^@8h{`UV$q>%%Ya=lV$85`q-ZZYo z?^i{Ku1wwmgk%2bo6FkhXm}R{HAQ_lSU|;y)M;NOw8Xw0`v5!KVf18QnY!`Lz6Lau zJ7fyI-LO!N$ksS17hDJB&-Mv~>_L=l(T+=@#i;%D*sf>Z!D!QvO_4Q>;8Zshaaih7 zE`IFeA+ii~B5t^To2IWVPD=b~}+ac)sv8{%k^ zhAZzL=-;jMtjZ3+ZR^;-3t7yk*aF0HYc?6tqUOePkUp@#+GhlqeM*E(Aq0jK^__cg zC_JR1uc_05Q}yc_{3WnB-!wJdS7@jfNex83F}X#ia+^E%S`7A(DV`uYpO3Uy7_unz zis+fwH4CiukY-&ssD7 zj|N2ZUix6d71je_A@csCKW5=zP$yy9r5=YyqbVECCh0#S?9(=OhxkQVG{J2$+vv+| zlJ|Zak&g<+yQg3%TnYY=EeiY=?5_Lnu2adj48=~_K)VCq6oQan7YM{V5yUMpN-fX3 zT`0S5p~c(XkY1n8PiMUQdG~qk>IP8Cpc$Ny5%H=>C!KZ=oN>~3pI~f?jq+E+e_UbpN#vwtD44=ntZC%l9$4DFnM^L-{5Sf$TVs9V1E&nreMa0 z=U`J3OD1S$^qZB0*#jrn9I={{MDU-+<&hwA`L7qY&6@9vd;=f$)z#kYB6|#EeNBeoQ&8mkQ?5TW3X*haY;gQhvz{>eZwb`A@}>tI^u43anPf&T|@Q-_zu`p*tCmhy^bEye!!O~yO7 z_Ah#!=oEjWorh{{Vk8D{mdE8K5Ja*RY{`rJe9eM6}V72{K7r%#P;szzO?hd6x zv^cqmgGn%Uku_G7Z1&k?D`enVdUVoK>6R<`A88!+h7?kqP-GUiW-)Q-;ENMz)^aZi zU)n8BI4TRLngQnV#P3fveM#}3%Sm_OKhtIZqE>5~CvrJi4vf|m6!S*(f*$hBn_UPf zIJ_6+f7lB;3mJ57A$$#9DreS5{~9r$Bv$`zh#n#h5W9v zRb`bqjBvcleq-G$-o9;q#~~m#oRfdH6%#sso8Xq1m-_MmxUg+k#gvsF)B(jbR4QVP z+ozl$$x*N)+M!Z^S=O≪&`GK)*7g3Wv~Y*9=Mc@kU_GJs(3r!^cWsj0+`l$tcGW zviSNJXZD{0r~_`-Snn&ouU}bzpNkLcA=;nKvdt>}qjDBq_`5jrZ$r%>FcZSSEQ42uBs4cwE^C;3Oy5Y!WCi(cUIUn1DQ#eSk(RyYhP1fn% ztU;Zw6+6UGlvPp}q73@a@{pRN0rF~{9=e52X@==Q87}Kpg?eVCi)*!5l1o`s=GWS> zZzpO_VfbY{rUI7Y(!uO9W#~T;LxfZ=`gdf378+}tuBgYiqJDzY?hnB0tC{XhBX3mR z6Q``=&H8sR4Ckp}KmMyQ*(-G;@P~OH=w^r+INg2Rp+j$urNrD~WjgWu6RHKW%)@N4 zIrA!U2HQAr$5m2ynM3t_8#FbiYgxKF-N~WXLd~5F%jdGc-Jz=AK_l)zs{_E!W*dt! z!vp@X&acX;lNPFpQK|sQsHrgyyzvv~!W6haLXnF3YDM9vC?ftoe_CV28f5Qx4SJBt z$gh&&zuO{KO|W*bq_Fg6m9z=tgDC0}7ld_&UyTIn+MXh5)vx!-TA%-sF~pJ?l>0lOx?N3wywJcf0=MrrGUylG@j?bY!t4%DN6&1pZUWUx|%Ujlj;NNBB#ykh`W+vP$f+;Fi>4t(H%q zqkyE9TJFL_>BzGpt(M?f^e5_jXpxG*+n1t?CE&0{wzZBmae2D|o_!3VhN7klN2CFeRdvz1JK6;Dq*l!eddj70c0OII1I;i=8| zh0QXS9*(sS=2(>~B)-m1iT%i_k`K35ggtO>Ml1U&f};Wm>+Hy|EBxEZq=j!)CFs$* zygs(-8B0{GO#cc;cL_OC`r$-eoMq!p@${(4pb$Jasii*_?+tP$ddtWp!xtAa6)QtO zJ~}gVCXH@G)HS_ssg}Dqb<$C7rZW9girW4 zU2*$4Gq8Y(C>yow{51m?PPyl2VTb0qkd-UCzG5}X$ZAGu%^;!bi-IZ!ewV-zC$w9tA;%7`HFo=1Kl(t_mPgEn5V=3}fJ=m7s=8S)9=BMb@T5XY#!q##rh#&ejG$N)LYf`A5jI$o6RD7Lg~lbLMN2tv1sf8_;0#9F!%!6*F+l)`a048g@^LcSiZO zt2cY#z&k_04%$A&w(z|5%5=wg!vReoR`zoAcRD2k?c2{Momc(Y&+JT;r!P=(UR!uM z$SV7O?^d#aI3H7)ffjMC$yi|`_x*GO9uO0a6;MnxSCT2t|FO6C!hve5!gYl2jiT}B z1GG5Yk#PqQ#DC+#_Y#*#qhoabW%6)doHKEZ+Piji8L1Go&yf5nOM6DLen$BY7&3KBBPC(ri+UU*bo*>)M+l+ovqu*EEi>v zk^5f#4r%%$k4-;lV{U+}oyi?A9>$_O1S(@q{+Qd8j(O>wpIj)KTbyr@$8FE(QC^d; zA{{}YLgG^HhVpxS=uV$*CgHnn>iCy6`Gf4w^G@O3k;0ZrDDa5fgg5o(h&$$n7ebAoKjx`&3p}Mkh)!~|g^V~sIyO>~ zZhX`Zee_H2A#Y;;_2aqTgs;UUg-DK+u)))AohBtHY>-MqNZ+jQYRI$ke7ULI_NGx5F(kmoiB_0GKp64MM3YT-Zo? z5K`T3^EZ7OVOhOy-%aADX7nqvaf9BcsK=;1>dxXsYSOF1F;GwI`Ro!^*fhhSJuS0X395WPoqRnrI)4e3X<+H7B#}AJXQx7y$CB!m z@l{YIQ81^dd$iA-xtDHo;Gc9l{IrXosKdl`i@($XveW~BL$XvG^+Bmg; z9ee;Ea39Yn ziLbl1PiPvl?Bx=`8_$n`jdM0qG}ypmJDUVMU$ zsS2FR#eqWY>$New`k%qn&H>Xx7jpy5VGM;`Nk9LEodtSW1`+_4jxlByF0y2>MX3~w zsK@t1aM|X!D1oggqj?GvWi?nc_3E9e~i}%pQD>q)Q z=e56Qtfr}>U1$oT>i60q$>0(8S#Ww9=vo`BLk?pzgQgU#GL)hEwnpQyg@-ogiq_=F zXpV!A_57=k=|>=ypn*3s-rkt~yPBJ;>#`BH+>oW{LLJcKf>X5+`>gyO^JS@WeRS;$Y(b+e}ffdC8WIsEN z+utjsQa~cfLVO{~SZ_2M8kbgJ$LHNS6#}1OGH6)H2uza69XU? zO2tIyu5)q4n@6Wiek=`t$?uTI+QnQ+j^@l9d$Ld={S7+h124C!ggjTxne>aF;xqJ{NBv#z%U^a}xdV%Y3mT>z(bHw==z!j`;BxC7L4jLmmfG^$v$2C#_{ z<%7*I*|gL1E_@#JFi`XEe=$ntE?#_01K*nu(R^N}W`KK7KWw`6rGFs9E#WXBSKVEm zJK~sZ1NMD!NJOAj@NmvIM5}#s{vC57oRV14r6aIjGRlZT|Nmp@8lx-enr>_-6Whte z&cwEDo0ExkW81cE+qN^YlZox`KJWVe)atHtx>t4gy=&E}vup2JmdmkNo$>p60eVK5 zuR1JBRa|l8#P5E1qb)=}lbCB1_HseMi$Wo_M0+nxI4@;yZgAuSw`f1>`i5gguW={K zl(4O*!qxm*!MftbcXTNstp<6df^WY~90j<*6D!=v13l^Y=;Zo6(~ZHY>ic8pSX23Yuwxq8PX#fe&CDO@P8P zQjPB~_*<8%^_KP;Nh`v^Nt+G`W>4ZBBYgvEN{xGi@a;WT2%Lh}wW{MGlFH=PUuNZi zbt!{S^rHDIAUISY%gZgzfbJ?thfCLgYf(PY=M6J$`@%Ja#uJ8bGo2$BsKS8n{Ufqz zuPh>-c%jHOyWkE6Hzk|Ga~c#vSAJEAu_mupr#zfb+Ir_i%Cm;7TEYW7@p_geeN<#G zN(6nQ%ERvGY@r>H-z$^ z_Y%KZdbuWWmKP@Q3jm!sAuPO>&pYZ)Y$Mwuhq(ieg{JMaLnfan!_3lgvBmqO*gJ*g zLN9MX#srZs9CE9#Bww3L67wr2G9m_(4ugOJW)?l{4);WNI<}G8TjQUzvT{$;JU(OupSvM|=zWvm0r?m|MG-+vgjsGfT2wQG2M;pgDV*Z65v4;R{m)@-&owu8 z3=W#+j+Iq$qEf{5kUI_&(tl}KjxfMuU9af}YCmpA2ICmR7R{};5MgZYbvPP;3hwR* zPGEQ?Zd3>n;93dw-bkb}$Go=K3Ul%8_FRGuamV(vL-LL5GsG>kxYBfcg+7oyi}A(4 z@cSuEQ*Q|}u(}46qzhzDW6}({!>G&4gNRR}o^EX#w~`H}c4#WDfn5bb zXYidbWY`>G$(ZS@TFulCNU2%(LR|ak+e}WwV2b+_U={c==^VsQ$K2d^VHz_4xF{HR zI6XMLe@O+x8AynvrV9uo4(7Bb@_FRA+v}Ru*#O)r=qI{GADc5KZf}Q&`y+h^H_w*B z2ZO)6sv=8|U2z*1sY+<{kD(Y7++6i6ROHtIO>`OzmpIr%-#%1DkiGGDkIdt_$prqnqsbIxg*d;`^o(e?9M-x^rkl z4>R|r?hCOMkx3rs2v@9_=Y=2Q5@W`zl@57Hhd=+IC=p>xmp9$}sSNSYekmbduLGxs zO`0GinL)&2GT_PzehWS1O6upSbK-ZkVIuXn+wOrJ!y@98%D9=+o^712Yi!VA$0hh7 zfb#cS(@o+Kb`tSNjtNM~u;U&hXKV-Jeb)ad(LxPh@3D`JFkgQ^Sfs`Oy+h2*1N0w{ zP!9fM*?G~z+?kVkK7y>SzPnfFZl66|mZEBvZkAmcUR`Xc5W$vgV9~bHODQrzv(l&J zam``7cXHE#j+~$yQg#yA+#S2mcasN*Vm^WLN>6P$XayFr3SJX&SV=?Yl{x3)YFDe> z^DJb_R}GB7?4o|^62@I({6N@|tb3u`J4mF$o@xyUmWDM~v^O7fpG)$X-1vtLo!aL1 zheO`WE^PluOY->r2MGJ(}RdUD7*+_n!#5t_ODst^@GPyndA z1M&o=W`qgp)CTG#T9k}Wym|U_X2hDl|Iw1NN!w8&vm~LPe!+z%dPdD~adx2IK@pNt zbO1q$e(}08t5DXobmqu1f2?FqOfq{iuE|KNhj_!Kzx1Hhti<2D|9tE)#k=ysbFSg* zY}WEkLC(=`lk+18PPDEj4nGnw-o_O`J`zCPanyo|ri|=iyP1LyKrH_`qR0(J6WSc$ z@qxSRW-Oax0>UWCSY)lE5+x5X-2^Wb{(&*t#UeqMgVvCr=6DZkIwEEdcGln#JH(1c zx~wR_`4U;-KlBar`j&!1Y)YPTDd(4juGTgo9KKjEboVlV))v^JUzEL! z^plb%ps6xV5yHQMGM4zo;TJRffdtZPGI5&@7cJzVR?^Elyg8ch3N^3mzw~+S#fm;P zkgz0~#Bt4?58Iie^rD6wT-O58Pll?|BYH@|q_*M(TbZgB`Nj@6Au{UNwh3~P4Rwlb z&!k=dCRa9`!Uh~|ZUkz8Q1pcP@T?eS-9BO#`g_Amhs+DaR#V~4nUy~Qq?!%-Kk6Yg z+d7kXTBZSczx==-t}q$%(KZgQ;nNurYgOgkne3f|=F>CvS}LfS?2m?xB|Ww)OIg$Q z2kv91g1fzZL$o5_p^9$QFSDRsPses|#;Vc+&0iO~ox4`a-o=WY+#YhU=_~&h^`mnyT8Dwpzqothsobqa0lTiFDV>d; z_#`jM)r+_?W0Ju?l20&nW^HdfqJ5$x{stt(s{`hLM5|=A<)wM5Ale7tJvuKuz(s)f zGQ^8PdT$r}J;j%jyBfqAHr=upXSB0gT(|_qyksXbtvodWe%tAr1zD%YR(iTcBRX$4D zS?fi*B&1bySWNV7($1Hr_SiRnYZhlPyVsaZ5~+>6_1#FVisd7aPKI^3?-HrdM#H65 z3Vf|9@S3S59I~%Vx&UHF@ccC`_37})_Np+4u@TU|X`h*=neo*m^Z4SL*>a;KTPe`L zmUDOS0o3qvAiLzq$OOthp0;rs091 zPX8w>M#yt4tymtfSnauidxT_$9{#SCN}QnUO$4A=U5f}+ofLt{ikSrBgzvr^-^gB0 z0|P+($m2XP3`f09GiS`ajkw4?3`q>0HA-Qv3s|WRoSj-HAn^Ou^G;rbamA%ogv=rk zQwMYKO+BzHG8ub77SNj2ck-|A`d}{nl*y>)f>@A| zV*ta#aW2uQYFyh!(C*^;^^2gQ43=v0sSw~!DaYY@o<5zCn0#mm`c4QcQM=AVCG8j3 zC(TX><}PR5NoXcHiP(CJoQ6#@Va zbh3>(I$aFO7s3`Hjd4V#mhiJg0^l+IY>SSy2`Z+1kSJ3U7r%ZCRGS#{g1(YS!!VxO zievWsD|@5PkO`1@2qP<{ME;W}K}i%r#*1HuJ8c{LJS zNdC|`Au@WgOzR~|=!}jPB>V|-ycgIT0guaPbuWl@WGn9DzXeFE070toHx%X|%>LW< z$eRoa%TOytAuk0T@UffZ;>WKEk;#e$HR$Nabnrq5IrQ4%9T8BmUX^QvYs44S;=~^F zP~2>j9c*Q?@$LPp%9ztkHV_L4NV7yM{3RkjtMqb-twCraX7N$W1v4_FC9FLhQ_l2C zU1aPjNs6#JkqbTLJgHrn5xp_<_{XrX)@%4L9JN7!=z$>YJo1n3uCZKNq6S(ZCSGsl zfHKt0ziVY7Js;v(9W`O_-4?!U7W(`g^cO*zI#g8ffVep#^L)gxEL9SKSHNNH9!E}q zh9Y)*W_Hg+QcGI)CKcCPf@LA32^e56eL-93+RFX6r@W4(lr^Xz3(r+86TakXnH&G5s7PS2X2PXYJ zv_Iw@Va#lblKkTJ-46qhCyX(+Xyy|Fg_PO9G2!Qvt7GL{qd-1W%P~+v==2O&!ELqb zmJXn`wt9pP8Q*hQnbJ z|B#)sx+LD@WJ7M5R;DJ8qqxBzCjKq35J14pwSe^9AfXj$T8ok2$${Fu72i+pDj1Ui zCD?F7G9}sSus{MRTKemYZp3pd*vo_5X0yxbuNg#b9Q2Z>FG{nNg(&+A>?3?%o<7fk zY4Lz14NTd~t$&F;Zp#lNcPL)ixIh+M6tb;&C2YT1?!f^LbHDrWh=b1|VqYC#$p4nPLa0EM)Nx2amBrtV zH4L26obUaXR@9^ICXp0w=^XMB49t2bjM_yHI?fFoodC2WI6fb8%}WSv*f4h=OTvz% zm`*E>kT}oG3X=IiQ6w259R+1;(H)=OEZ@JEY_IdFwF@->3{8|1riLuCZci4EeNZ;b zQ*9oKH+3r%Q>Mhh(~#xL^imomV^F8+p<^2dN;pzWKTeBwnA=bm zwy%pIgL)1$%%Q^HlDkQPo~WH?zJpMlc@Y8Nk6Dqfitv)eic=-gIP!8bb}I$P-9hzy z#eYk#o(1(;jXyU#feYI)vqiO^pet^K;v0FFp>o$nO*r9SRdtoDXYY-4YtSTt|EF4N zx%`uk^7?T!D9;fp&<&00G>^VH(W~?c)?nAcNsy~jN(R&))3sWHnH)%eLR#(g+XVuE zT=VS1(2ym@Hl#k%HB#+opD< z)yEUdK{d!N`+-24gQ428V*I`UvmE8)iUcCU3sR@$Z{5r&m8uh9);;aOiyQ%wQV&^d zW}-CgZ43|CgffiK8qz{yM(G6Bb{`U$#E zGY(r&1Ho6`Y$-aA&Qw8Sh0b@8gTS%`j=eubw-+x-Zl~JkMdD(xK`KkRn8YQ+{ZD;j zxjRlgCChLb7n_#iFE^qh$)0>5MXDp{mW*F%Vb7>1x<5>EqSNM#1KMBPMyTx+%mP>K zph&~|tlj8>O@-&vlz)vV_4Bjo7sLQ}$F5A+ z$XgHpSStHrC449u4l3X>?Yt^OY<`ai6v zD`0jpXy`_!b~=w7;`KOaW=+dp(O#tXf2>d)4M50fQm7X9GAEg?(_IkYvb;lm^Pqy- zDkVvFK!T_-=i9rVcHAp+Ms^(udPXtI1uo!&@Rt_{Ul4ArWNJ z^T|EJbppRE|M0=4m#sE@-QGnfo$0^3VBD0WPv-w^O@c|L9F?iO^0JN*6qLbR?&yhp zxb5&2a`#9tRlD*}nV zAAn7KfOpR@gaJ=F711p;RI!8!9tZQhURq+5lqZBi2_~sNeFATKbbSU(Pj)n*eOMvD z^2>o)#Jy)w5d~xp$T0ln8Ve+hKqqamNi$~9<~7R~_Man& zJ6)7U3pf}<$?-S-E%D8FNbl7Rc^G}-1t5H++Ew;O=e$4?fqVtGhMjkM2^1mH0??TU zCv}X5Py3MvjPJsoA4xY+o5p0>lv9s}X!xn!Hz&TGBx;|@r{{qs=ozlufx;6icdS3C z3=97ti`RLl%3Pw)cZ4D_GW(U%!q@edcLAW8m0fFG6L zZ=3W}Cp2kL4jS|%Xl{xH5<3%tYzSq+Kl%u!tcy8*9VQ#I9J;SrUBv3&gazcs@-;7U zy1!BRaA4&_mk4GhtAz--9`J*AD3?6gF!xOPkt94O8g*zjXVC2VO0*aZPy9M|`kddT zP=@89RDOVq?~tpOM}%QdTA`S!0f1x)lfrcy8BdJIaNqaVFAx?Z1ZgP}B#S($Kb% zsQXeumNyyD;JeEv`3y<~0U1)vj+J)29n&>q0o(s_%$TNK*%*WOdl4ic@jC}?WF%!} zXvlL5*S(74{^{J2&RFP?%H9Dv!GzlA>M|n6$g;=;JcRsnu?}c`9}LJ;23A5xMrdC% zigpst@gnl;vHs(!v00?jK$OS)s*jL#X~kUn{V`1EsassBi|&2{AQAhM+X4>*WUj#& zJP?NshS}SR}Kh&Vis~|7TQW-u%FS>Wa47D^Q;VDPcWy*y| zI|y(gSiZ=CKQ0@E)cWpf6LP~6dk@9hn5OQ&8*m_*l@A_JH}jT9?w;5Wm^|omFl@7G z;F9?BrW6Q8((xRIDsuU1FpZR9w!BxXP>nXTBhs+Rr+@1M``@a;K>IV8T43Ild1mBAT1y$BMV9(Jy_#4bHdCNDK&#>6`mBwbO^-u84q)U^a4qwlKp?rG?JsoH2RXK`?+_r;0&@N2cCfO z1vArp{yh!U7QC0EWs~EzM(eLHzSeX}WcsUiyK6rapuQCWaWH2^<edb*ec+J>yFE$cX0=W$ zx4Ucwv6&8(0yE4U-=IcoM|DBK3#6vd`YHC(&D51JV{^hpzn5*e!5=H|&A+C&idz;k zoB%QjusmQk2xO};h8t*o;z$`1Hwh> zJ<`SN4tG+?HHFamu`VuzPCFt$D9&>msV?RQXdwy#lIEdqXO)FD#I?{mY3S- zn%8cMOF(Uu`biSplQJF01)%boWO5<)gbZt=DQ;o2P8p%nLH-=T^8d?^=i#`fQw@>H zfwxZXxl?jN!jRDf9_B?q8T(?{K1HxZbJu)4}z>VH+v)#yEu(H0``8eZ5#FsY0=2eFO?) z{J&)6iC*Mo&Cy|Y=MQ;q-?b!iTjJhz09S3y_IJh%frbC@{~?0%UsQiaw+^jobnKm^SGv?ET1xzx^^8q_F0bXj zPX?IUo}vr#f_P~9>-I;~fvFb>;W{kJ4)M2x=R-tZKPVq~p>h%0TH~JDeI>-HQ0XK> z6tb<`GGHGlEw=#f=#HhE+cu5E05kZ|Sl}bBwvhafhesN{FgZ`)k6JI-zP0S?U%Ys> zU(4tWA|h=Fa%X0il8hpY?`D>sy$EvGsU)}mQM#CC%0>x`evIb8j_C)+iDAQhZr`?D6$KVOe`=Tf#^{Oy$SHwvS$5$0 zSwcXTk@6Rh`&~>B3e-?u!>*6xuiWZk;zXcjqXu*2l2k831J07C5LGjyqnc>bi1 zSNUmLC|X_!l885ELldbuSIzBlMwo{7IJsbfMCIKc@aUyZ$Rn>p- zqTj_8;D3(LWspkV=(=42h5?MF>jUtWG!izVcyT?`dt58Hs4UaPkmSuPVb;Xl+qmbOl?HjceCuHPeEEbjQsw0dXr@ned@=e zp9Y*teGq6BT?R$DUX7Y5vQovquLx=>TaC&G33Ame-ee{TNLs8$rPmpFvd|{eMk7=& zTnTG|5N5N9hN*mMwvV=yaqphiCYvB0dtC`jvHW}%wHe9}@`-H`$B#IUDg}~VA9l1^#a@tA9os72Bud?cs6!^b@os4& z%I%d4u#BcY$;bs-i+dGdBs5)@sy3oho&WPZ17i!e{6?roE&c~+VJ|?LPAF$Dz=xS> z6~{1!U~Lgk0v{Y+2@{^G!K_9#5@EpyPRBm3)**v~1!=O6riRQo26|qA$SiUE3B?Qs z;AMA~3c!=_wJISSQIeL|Gr&q1*x^EQt2mn+XxE*pgQ$w%6~r>$Z*oC*p+|8H#LX7Y z0+15tF3tkK=#3|FjQH|7podG7;aMDmIGpiG93O6%AJLNx336jdb-5I=wd z9=n&}0%z@!8=pl}52!hobM7npmHC}VQwv8iKZs+Xw)XtR1N^3b12&^XQ%4OppG8~3 z*MaqUk#!WbL7F&-qUt9BZy7vZq7J-S8%>%Q*#@vq61E*i*8fjd(m_;#iOO;l80t$0 z!2|GnbZBFFl0~>5-FcA_uD==suiwDd0a_z;)NWKg(4>wzyx-JE>bD~CB8!3e z`*RMk9Y&g9KKlrK4ny`6FR}<2TDDVQgp(G)paV)-9>tp=Q2fd{3t&KyyvPE2h+?+G z>ipGufVM_?252!EEF47r``E6cVKQ;&^EgSXgtv+~N$F-C7VwmAVn#j5258Nry~qaO zIB2?2`Ra)cfHQwa0N)?P5euRhfNWrd1sga#f{yzj9&}_?4LmNXXaY_`gaUpJ%^g%- z2T`A07PjKle3EWp4Cj!kF%Jv3z68Mc42>n>APTK&1#%u;2CEnnlf*)<6j94r(AGJ# zil;=>W_n8pj5N;?_-bLSmw-356v5pFM(1z52S8McG2jmY6x|U0tb}8EW2}ZhP?f_H zAM|5`Rc$q56HGKtel}t|)MLVl#-=DJRG<%`$J!4-e$09RrIqBujVD9j< z7XHH(!)~IAAXSZ1h$|`2W&#nl_>~DfF$!4lZ^bJFO^@Bg&q}<+R_p&$K~zZUF3)MI z3OP3(6BPjf`L&v$geZyS$x;D!ZmS|LCdhs^Q5K@aVKZqd==y1ifG1-h&c4*B2J*Xu zwJ_^*w#hsROt5e}3XPw1=&FbEwHx7gOZNu)3Kf%m_PM=R_17X$67W4lrz1``8t>K}4MTz2VsXk6fNAt0Ik zYKa;;>$n=X_%E)`TTH4BJKX%Xe6ux1z@J3*=(y#x%xHxcYYhM6@|HkSra)_+GNhJC zJ7}>%j>Kjqa;L(Q%f}!)pOWsJFpZVG?wmHe+16F`*6Z{q&jAj*IelcOgw6Es*w)p= zrq^+x?+Mz{1xP8*X6r)b`CeEJxC*LoQzsY_6&YOal7ZjV%yhE?eTYBSE7<#GxlLg^ z2tVB^%6nlx-5Io2V7t{QTIYqj)fg0aF8of1+T?GOOM%7p^rVH`=hows0s}JJG>g`6 zKGQmj7Pi;^q*X_=@$a&6sL&_>zrnQ)3s^4yKzWL~c;Xn~;M!gDEI=7-viwQQ+K+pl zA70b1^&%G%K{OCbyUt>+$Uo(j02$8`cKcQnoW5Tt$2yO~Rfhzz$*{VD1F!Z#elRA9U4cRY>D5v@idPGA^PJpR?DdoW?6hT9**LUp(<6&}8 zJlE6LgA1PSBvf>t2GGyjZ6tIb+W(R+46>FSZv_y!`Z|%0FkRfIqoX}_>KKxOwVLrG z3;C7fakrsgGmIrl%AdBhcvdIn2Nm=SED5MdWoeKHUX0|gEMKm2baOuLg2qC^#tI#H z4DC_$9Ek1tTckKgU1C$&Qn32Kk*0LDJO}5T#ubg_k&S1k03Zy$pa-Ie06B||B)4$^ zLyE_!YHVr7E-=|xtqp;Sh`_tNWV2K+#*LaORGyL2!f@E2rgW%Th;z2Y1s7y0optR_ zmPwA4rzD)2$mhOB;NQr@`ZCr(R`#E}~HY7dRSUUq%SfcKou3vt$VeZ_$DJjfu} za4P`jkAjP!0N~MyX$nIZffUCMnlo}n3qdF78;T1cKpxq$e|aCe)E%Yp7H z%P~UA|6w{+U6dDdhDYKZUQ)q!^n+4nrWg*v)9xcl2M{jkQrZ$rmIQRg!IL34o#m14 zE?{E+NQ%d|w?d4D+ZdBgvxklVs~D3{wMUHB-H>!qWECNa$8-`-Mtn|*Y>g5$Tb!ma zVIYxRcmC6!HVLQP079GwMp}{na!%Y3|6`!0G zAg~CN0+3{)`{w@jvRVcgnp=32$viaxq(3e&!{is;8I8P6RrrnovWKrOkwt0A{U%*I1}|VxbyohP@|xObMEreIgFp~T8^#f6GPU{xs%xC z$N&Lc?$csJl1d7)jzRN97WBra!};K;xf5P%OZQWs z4o&e}ikDF+P~MLo@+;3S&&Tj2?8JLHv|`V8na_ywoxZGl2Z` zsf*E%VSWKt&K$9GLbiXvfAaSDkAnalEI{egroo4p=GE)Y_velP zTOku<$p=b{QaxtubUzUQ*Zb}}N9PL~s?J7Hpme?qXN^9;2jsz!seukEU{Rr4AytXX zqI*f;BdXRSZ9cX-!Q-XxW`0&lc`v5AHe^&*psmosJ8}=&IbnlbNmDPLU^&5 z$X3JT^}!Ak2=x4Z+6qdyUOb&;Kd0l_-g!&!HRN6IW{1)x+NlBDvwPDp3+ARGaAj%N ztnoq&GSkn3Yu>HLPX3stjM|-Al`{AEQlW$H?EmulcjBSq&Ugnp>!|q(az;7+Tg;cq z7X6+mO-6jB@=^E`i2ULD>J-8p0c+89>GR;T-`GM)c?TUZlM4)A|G;H1=fwgIn*WHi zb^jDeI)c2O|BeIj^B&qnoA-5VN88{O=8w9>V_yv-A<$JUpQ*Jt&kPdFX+rGXLS6*5 zkkHt9JcY&11rXWj@r|ns{T6A)Fuwd!J^xv}{BbPDXMT$gtML)|w&L5>{$RtYx9Egl z`EEVK2mj35j88sjIn9!nHp1W`t9a+w>(p+&nbhM<-8~Ip!q@58K2B?ywr0=Kx?V2V z7@0d_GXCU}2WR;;qsMw)ZD!&D08fA-_kYCG@`mc z0qZ87bibsIt1B;dd=W0-=)hgJP?P$$8Ql8*T?Q!KMXyMIJ%!H}49)6u;QYeMeLB+k zJV3N!TW${B(u($auh}t=t>gEFp=uFl@RcR{%=)MXoDH5QaW~JT@SAZ^Rar81_uHf( zq{eduWb6#Uj2Zv*NYZxZ| za(Qsxg_p`8Ot^#eVI7yQUp2Cjh@KFruRF?NHqZvoVFm9%c57+zM9MgNWQ4AEh`iaiE@~_G8FYGY$)TC^_?2u_x)fmrM7vbV9gS=WSrO z=RupB;vi3%-KtshlK(>SWlgC}qON|l-gt|JPWEpKqHscSv9!zZ(A7)^A4mjzuE&F9 z0F}(*>efJZUGV6=IC#pFwxI2fk?}j#fLuU2_!p$`&xL$+>F?FBY#Kw!Oc{x#K)GE%i3-?)r89o>vc*#vygM}aBXy_O0l0d~4I#Z}M#!LRVsGq*SLxZ+n@9&U6 z`JXorm(~xbUhF-O8nq+v$_Hn7Cu#?J0LoQ(mnE64|!on~ydE1qbFi8`KYr5i7U zs(n)J7a2c!*z88|8gk-Ii=WrEiy9qplG#OB(JB;0!I}+f!h`!tutGTG^D6@sfNayL z$|o9=zdtVQ;)Tg_%_0||yFvd5XcS-KcPU-CB0ZcRzGMXbG43i$YZF^?=5s>Yk=Ua~B#+Fan4jF(!B z+rQMej0HFc8@QbyRQ`1AdI}l5RiNR-kLsVZIVw9e8mKPu&ef`w@sTzHBr!B@ZXx8Z zqv^!dQc3rvgReTi+9zyyv<);Tsu89%U_2mb4gI}cK3_R>JajZKXyFx!<44|~z0o-Z z{BR7DHGz#`g!YO^P@6t$Ag5j7u+WrtRaiI8gjur5q?38tIPPl+nVPPD!qnXmM}?V4~qy7wE~C0sxFQ8nZvuOF#7fJkOX7c!~e~Ce6**A-(f5 z?_MoEM*fF%{<@!Sf{TYd#AE))bF^mDeQW@F+AeefXPctBF~#Xl+DWcPP-dCMZ-XjR zSGQqxA92vk?$bT)uQd2J90qNTI^l=+({v^i64qK1h?Gt8)C)TTKo<|nW2pf#ljC?P z{ZT*HXb`h^%_~ILt!LGlq54*uEqexT2i1#%FYd+^ZLM|)C;ztxMGq~ZL8#;UQL>NO z(b4SL`2PFE1lh$yaO zD9M`otLXeLx*~F(fRD03GG@1j1Lr3%Y|AS0&6xQk-ChFiRK95E(zXlkEIETD^W#fJ z@9DQWmgof1B`$_b?iAdLz^Q@F;y19ycBaML(gnlOY*d6kb;p!2J+%TSj| z3tM5Q^B?tZ(o+!{OU-s;h7tSq8)E_CN5%px!%L$WFl%QQz}^D{PDD%vGc$vVP*upU zOZkz!O>&Lj+OU$z2N>^(*5V zO$t9m%HxaFTaG=fgz|Aak>Kx6Budm(O>$3!Nn0EY3S=5i6R(oN5zqztrg)Mh!6h^~ z*0{q{+;FY~Kxl{Nxh9@`qN5zSBv|?QBNS)FJnvK_oe!!|K@BysQG>Rs@`;APEzuxC zvCINd7R-u04XQeiKj#RBUxHhq|M*``5bniA7IE);b5pFMDl$M5OovI=qU|`ZP`1VcVCWTrY1I**QUPNw%Cv@thX<>a zGEAu9NM~o_0%yi3DkSRc&TBQIgpghQur6T#L-$8Wa%+&8mEgugN3Wz>=2jbkfW8Jb zdY;0!OCCu}U;y|ta~04)=Ox%-y}dlqQ7Sc^?zy>nDP^0B5TDu-=~z8_qZ|FVeiY2E z58IgpcnJ`~(*vp!+#-$8z*6)1=!h3y+&dVU*V=F~ILnPJT9WrhD&rmOPkGkXuC-kk zs8+8RGe|R71Uu}Am9JO$U=^F_N3R~toNmG=O+J1_-2)8*=of;U;Vp+UEg~)CujCtX zX)LYk0DbAaf8P-ZWUCEn1b;w6P&>I@&AS1s7T7?!J!id~DSZ{%)Qh^G=&J5sDK^YM zZM^n3IjWU5)sG*3l*ruWe7qQwg=7Mpdti3%u~m#;l(Dq$fjuDnfjQoNhG%EYzCHAb zwzFif=*(-*@$juf&RXw6R~R{m^CoCB4y2f~(w$wKxS*7<+}0n){*t?hnnV*R5RCw~ zXr25Slr!|ux41eLjwOIh~6?KRL=Y+m`y9t#75j!Xl<(BfLu=FLD5CUiZjQ z%!}>n+u3q%@~(`5n58=;SMWHR*q$MFthqlK--q#ZM9>yMO!~m8Ee)?2{>~2!?``5O z{#{{9i$z?^f#N9hf81}eW{y)wuvZn)S?=^~*;^x-AQ+Q%a^NuC|DFii@2VqjLNnIRu5BIKJ9OVF}KJ)R zRh!!moaZ^EJ|Oz@w~*&;%49i`R(-ZvCzQEkjbcgw0)bxssm2uc!W7`pEh6$^PHVfb zj!R^(g4elJlf7!OCh~60#EZ`p_OM#ve1~78awF&5*2_Lx!?#Rmq zwg-u#vYOX$k;TPPMn8C^D3MKRq;M(?vYJ8uJM1^C>M7V%<0_qcNwxk$jx@1|hy4@d zf&=n*Nuse~xS1B&q6&_0uoK);*dxCl-6ukZGWcNgi@D5SM^pgZ#F-x1k`Afbu0if3 z_vCZQ1tCXddlfP%8w(RJdc@=3B_G?a_0Pjfp9+mm#l?0Ce=>eM=6hZ@2+gqe{)kqo zH95Be&6q*cRJ|LY#}K(ygv^YcgtQNVdg2i~%tx%!PArKGDPVr+__)HvVXT-}Z@+D& z@GxhbQ#oW1Y6(C_G=F|RdsKyX>C_9Q=3WoTXRBwF?`jIk+ZXkz9jdI>G`;+q7%u|U z;bWaU`PZLdmX6L{yT13IAl$pg_%}n3chTVCCy5U@IjiB67%%JD;~v?a}xmaZBWA_<0^8uEAPD-ZKj z@;vMq88LwL9pzWwdXA)EdFV}gXy}Dr z*DaUdJR*VXbAHzG18hY)x!P|8scf)?XL=7;2zmf{csUQRq%xRBKH%y^vOVU(IV^qF zCot));eu**V#%!()oa_bkBI`-HaCmc|^9L@NWY?_xma@0on!m?m|>)XvVf`so~ z>0}}PgJlKa-H9Zb`C` zL8gUTp?I?|C;znkD)8E$HQ;AmT$USLov@Jb;jgK^O zn`WKXrd-?Qq`YUMDcFb9R|utE^SV?wx{j=6bf4~V=VK3iB0pae?T)u`;%qvjI%ogv zcnkOB_`-FTr4M~lK|PZ0>HM~aK5quV=4Ry2iSl9!39pg1JJcxCa! zWV3Vf7a4F}V}?s1Hl_&X?W9Tkp(z}e9zaKiwYl9F`8;c+8vA^`GiDC+Irvu~gjTQS zJ@p{b*fj4Gk@uy;8C-6*kwAqxr?XbUZ|7y$uI@bVD6>pktwlXC-3W_oEp>pk>BHr|L`}Vwy_~ptd@&_ z|7{tN9$bb2YZYQXU*kyZv^R=JN9wsZXNn3s0Lse0)s`b3;Q#oUrH!oZ>Z-+r01ckV zT@NeBgbmCM@jtj4^C-EAFCi}5DGW-xF04ltZ$T@lJ>+{ExN_vHwUGfTi0KonF|``8 zDu~c2^X1_X&00*Vh;Khv0=`y+*u&<%YAXrZq6yJ^HHD}M(!gy@U8*#wZ5=DT)3W-@ z1uW^hgy3{ikzCyir8xU3Avq2N#LslDQ+# zP%IJYLzl_GS?}Vj`G^6v^3Y_dqL$8mI1+WR5}lq|?E4qgjGh=)mD}pkp&$)^)fpaR zExdP^5kU`EUkw}MH)fxq?)*SG!T+8?o+65O5hm6kJu|f96%zAWf?0aW)*^|=vAC$A zPLXd?{Q2z+f-%seL%S`F?WWWGzVB5>AhH}roFbdO0$QV$F+u=vK7XjM-UwjdGxH2w z)e{OJvYq5_@wquhiAX`X`J3Q#Q!-BVzKeKYAsom#lc)3N@I2=i>HhbIgnb76LjG8^ zO$%i8U?vGBo?CwuVXE}>49Mg}b(NB)kl{J3J!f}2+z}&1Y>)iOha-Ie!>!LU*A+d#EFYvwDt8U5 zqb5+zxjlvMmkn$3qw+qmHLku3{#!Hnu%Gk&2)M!@Hl4hPvmCwKXP<5aR}yiPRUO^4 zlPgs#AxMJi5Gjm5a4@QPsj4C>UYuKY9xT>Z_GK*cc(jnA(cqOMQ)Ov zG)Da)2MG^I7Vg$B+1s%TwJ4xRd`;mqTwd>T{$uf*RkxEl{=8(7UK=0tmbLMT{ ztwBY#?zF8hV~3~MgXh?>Dc_Q5g8X_MC&}>JrkMRRS;)#*+IL>a##nk`PSp-fHgj`4 zqfz3jlK#4Yu`}4d4ssMf3P>2W-Vj8uArBg8nd<{^|E<^=7`ZGSLa?swujzEd+U3fFyt z{~|gFo|bj4&abBB)|ngJiIS3C@Su*vdib07sv*(l&+Ysx#RPf^(RQ6NQVm z8L$kv#6)|ksO~rHJ0tHtd#Q9yyEpI59C^&~27KVR;QS~I6nKFvIGtP9nsKyT(?A!+ zO3Yd&;pDbO*dj=;>f!h6s=}mu1TKykw&}%b#)&C_6KkYBwIUhNkDU~AW21d z=*YA9=PRC;fhM?(uW`E)-P@-?t=W7P4N%QHc#H>INIM_F@$FCp`S_}WwR)=jm9$zM zKrr_~<6x*+p}QXSIMLx8_jhmHBi{UrOb}jb?iH!?K2Ch4Oyy5U*=+}B8@|A&V+`gC zTovKlQ1E%9&eIH6`Ps54dq-M3NLHh$8p}3<)}Yy4;b{`dWYv1OwD*q+sRJQ!0|#sBg2jnS1oPuH>SOl;e>Z9BO! zCf4M}$;6r1wr$(Ct%)(2Xx{t#KWn`ot5=_U&sklkyQin+H!-|&>H2qKqOG2L1A#&xbbEH&xX)%E_hoMuj&>Q)iO+{%?{ z{fDu^s~THFP%Hj!&V;x*ET-t#oFj$S2-7_E4PwEPLemr1a~)(uqdD=|UbsZ0 zLq6zc@UpeI$XTHvB{2r9lBLEX(aM1EAsS6auFPuU*3&qyp&G4^HB$J!{V2~zK z$k}-Cqnqr~y*}qUJF!e<#jqm#92$cv4)~aQPMCL1e4#cF4~!MXj+1oz-g4>h(ld9qRe)D#`zkR zYD);sLio)vi(Dq3*S3rG0&fXi-iy`obO1_phRy&dqd%4cJ$tn3M&AesBDN^BYn`g- zPEaPXwuwof@rvE!Jv&aMp6dm^&a9sI5AhJzDQuMHqwcwOuhDOx@cw%%o9&KkFB5hr ziuZz$v(D=j;`GJeJAM9h+qdzJ$opUJNzZD3?NT8ke*$J|1)h!o4WsTJdtwSzH?ppk z=ScW%uWw7hx6<0Gy3n6MuNgH+f(fFH7ul6;-61^BM);Dz4tNjvhM0s^CMKpK0@s)E zUmJ^!b|pfnh$2yY-4kq(V})e0I*cvY5sLoSdeAfUdiv`K1Y#F4giBf@!n&@coQK3* zT6aErcRXn58PPIfLHruEFR$J z``*{ve;@XM?_0 z1fEl}U@;G>t>;0^#l)@(bN2P?zh=wL*p6o@AtD3E>Lm7oC-+jjCW*D(1NhMI?Qltl zWlI{r4z(g5Tn=cYu(nyfPF7TQ>wgjm!D4PdzF&J1p@&-l0P$V$#ny$IxZxubM4cAJd?*vWZ>Rxza z-EU$JGPcs$)sd&Kx5Tinn--33KO#2n_cTElPz<#iX{~M~P-Q9S(MFj@umTRG#&Jjm zdyDsZ8ENW(YWv79n5mN;N8h|6o~-6w7ywwg1NwiFQfthbHX=J+qI7VawH^u^%n6TZ z-jYX;3-1Y*s}&1RSj~jeB}kCzaW8y1WsO|S|3TkKQ-!~dg{!?cJh%*xyC9t&f2ZXG zG>$m=v8_6E%tkjL*6M>*w6;l{HLo*ZXp-x-(UExqe=wQX>0nj>!&Ya8wZC@}Ab> zn6LZwIq7!w37<~*RlqRcUBuOP=}C43SjMMw(8LdW{7j`%r)_+}3qzMi$~n$V)K8(e zYf2Qw)zYlLeb%$s@w~1&({QR2pa}@N3%S$zj^6lGA=FUaUhKU@;F9`jTH@L5I^z(wcq5Lv;{M#Sy(K$JmJ-^@LbKZZcmboj*K2y2ukwoZ4~`TH6*FbhY_-$%F% zuvun~iIj@1+gUco2?|`Ml0`)##SNY0+WuPvntgJlpZ@On9(rnskPL$5jiQaJR;3!2 zrZ}8A;!F2!GB8|o9=Ituu^wsmPqN%&5Xx4xbyh4R>Tr-0hRU2)r)^ghk@R=oR|j#i zdS|U0c6B6#0jmp%m%MC?XD(gR{erYLNW1p2n3wQv|nhI=?=s3i-j)ynZc^&!63k zX5D2|gHQfPmbrn8m--@jyDITLdKHBgxUg|#_$+dr`J&6!V2G1(OiW93$NOhSB@;N| z7yv;yN2JH?b(>Tf66JrkFmK)%e4yK(#iJFC0k!-giNMlXSxQ5ZG*dTyHuE)rr%$m; z%uu!p@%Yr}mOH9g_KaBb?in$2JE=^ND1n*an3L+ZYao)Ktu*=?#^^0UC~o%y=r_}h z8H~FTd4|&7G8{vZ+U#; z+8A>t>S$jMU+hP@`1rm)o6y4soZ9`a3(AvHar)|fYyGA_pR%Rh4hQ}jY{cBK{F?BC zwP7?{WRE`KH>0Kd`fBT|#ZXMQYhL?5@}|0A4v}3`_0JO)paqBA^M$oe9-3%p{rx7u z(MU^_`GQ}ZVv2|_o7nT7=y^PrMO$ysPIf1-n|o3Ap*7GFkUL^b2mIbYP58kA$1&te z^>wA?!anz%mlwZe$VYj#ss2IXCAw@RbSL2XrJwlw`_gs6kaWcLwJ{anb(^2WHo`wY z8}<`c(d4Y28TNnBaoNquVJ2cU_-7BUBVDx-0<#Gz6ySeN(?>0?7L*M|kNb>ANdO!- zw)%seNd)0%-??d=VSz|7ag49O5k&lu{#qA+_?~_cjlrs8kiWjBeko+Xxvf7!$_}g@ zf{BS21f$;lj4CF41v4`t<(}d**l80I131qwXoV{D5mp)KHoXbWn9hB-am7_#o=Xg` z)+D5G)7o3mq9n3N?kAz}qNn)H7KIdei$|RXQ}khoHPra}kJ?m1@2>a@WA`hdob-j}-lgXj;&m)!xXoBb=on%9T4M;%W-n%<~m>XbP>@~s6 z%kP6!l7}@h2^Q$%7j!Yfx!av#>cnKoWp<{@bXM2Tnx9IKY@f&{8O!JWvm-S81>@orUOnjIFmN3OMT#Ki?`ugQMq3g)-wGwQpDPp zK09SW#OyW|M({MF5II3Y#zt0qUd?43VJbT>sWT;_ggNg9@WkvT_ru|Xkb2}<$f-4$ z$IRFP_1}=+En!H-E$VcSMJB?q_ig0m)*i1K&#YxGChBlSI&%f_rtNL5;6Hp-oIo35 z=fko0%`hNo{K;;>BEI;o`vbKKte?yaR zs;#l6`(Y5SA2kn3f|N5&bSDY_PWa0(JmJd|0a-9MEgiml$l6%2KIv!Doj~W_aQnYb ze8{xj*4nxyEwdV?a#O)lO0@t`e-|W?I4j20qP`JDS~R9AXkVIme2Wt>f5^RV;e0h% zsdzIPE*}ctB!sqn=5hX-Rfp;}7`^0k(5u|Geqcj5;*-F>I+6IUdnNDVGPkJVU-;JnnhHLcHjemU$icQ9$Wlyi^OL!Va4^sOGL#*GOj zw9l03eZUH~Jb)>N*QkH7$KQKz4V&%Ww#Hl%o+!DtNQnw13Q8KQ`#LFveISY4GKv|! z2(JGK?u1lmPxW49bG3>p9N8?tuCEvcMh<8!?jD#t{xLvOsoYh=sA0W8f@KR$+IqLJ zrV>{%KmSgll)@HF&r@Kdt%=^p=9kXS5=YO5^ zz+kmbv3hYEQ8vxKFHSWSFe1Mmxq|BLGAS9GR2|yD8o#3vutJY#0sAfTyE5?*Cr$0K zR^&Q?zn+#5_KS}HA6^+(alqgz@X^#LSNOJu+!bv=YGEwpv6NXNPGu(}$1cXZF;z-A za0^jxxeQQrM*FeaGT|`OBJC*MK)GbsfNm$)2>b0H4D=ug~XE6Kjgc8ArG056Mtolmqscx7%+XPpoM@eqaGeT*Ar; z{VxSQy9oV*`fYV@9}mqd@Ra0iHGuSI<6o6A5$_>(#rI*n+s)jEEH2g-@l&1e16O9Apdt|+oLOQ%5fT6fsiq-ATFm66v z>i||Jtt@7w(&)g5OtH9qHrVj9d#%HXt0RpIxW5XSb~~vu0W5b-Z5J~Hj5Z%yhWVH8w(Rk;HMn}m&Q^h;&4Yg*CQ7e(PuRm- zx?=bQ8>V>=ZEF1sfnoE|p@SmYudSnI>Irk7-iK>zV71n6Jkl$84m@}=UU|KWu;cZA z7Eb%$Bsrc=b@N2MiJdMFGG;wt4-obSJk@G3wbxQUA@~>=n!Ck@Z{7uL*;J7S;+BpZ z_&%jq^pDQDbzSB!C2#*AMhd>F5zcNHH)#Y!URh>6pYkJq06SsV^mMU#wjK=AHlkZe z`j}&(y_E`%dO~If`ic4EW6A?C^f~~JtEF{rU0zle>RqO(Dbs{6Pofdqi@6l^%5{iG zgKQjY8T&E@kPcznvjdJ)+rV7 z?q~RclYks@{rF!v$3%zLMd(G1B|2@&A1-V&d?&QGz>w{@!^=I2zl&!=hgU(*>&!i4 z$|6!pEf!O~fJ3ARX$8Nalf+3ab<+qIQ+5LiWoR^mXJrNJ3F<&Oh|GUm4Z4GVT>AWq zbO3|#JwV1k2Kz_tYrEV3Fg1@T5sS8QonuYGpd4N3GxM}_g!IfB%L@Tra6jM{}? zVbXH zx$Eq3!c;h$7TyPCll4e_vrwa8O<@inA~n*N4$+@XMNDpzj$^Y#(Z1DiKIhv_pmPDT z3YiLd#qCO9VOxeOXQo)GD~MEnNjCoJB^Y(e0cz_BN{O_~O&9_$C;;8GMzwWac~X>K zxN0r$Bs~8}iv|Z@gFX-2dj2xieU)Ik8@T81dF_lc5;45sa~>I{wSL`3yVuJI5|dEt zFoiI*UQLQ~{jHZkfNZ)_mlcFDk%{M1>^uu}xam57V`3l@B&vQ?SlE3aEv$9JMOZi6j_;U5yo;~icbBGdGs0_^q;dL;&&g~xeapojqDh)^4Hr_ z4%AL^RYJBU7ildZSfL@Hl0erum*ay%O<^}Nsy3SJ=3y>2uXx{y)Fhb2GhD?h+FIg4 z{L7a^*LYZdoJXi6mGNjrR4E7(EI8n*c(_hQ6(rIYT*z36OgDgsWzWk0vj*SM+b;62)@ z=>db4pF?I^t>LYS(3(J}YOHu&?iE|gKSOih7t?;>)z|(NHWwIfh5dJTo5CNehd_3X zt!Nop6d6`6Tq9xbA;QMfAB23|Q&xx!kx{fgl|ycLm`eIw5ute37RZ_JuPS)vSvS#F zxp8BD?2V2^u7hT;IrM)Y?OxW)V@v$D1tHkl{g5l(f2{L2siGX+#9)HJl z9vwXs!a3#sEg0`Sq@i(r9B1QpXCOru(?3U%hy=1~1lO%_B*L0&M}{E<#+ClhA6x!L z-Okk>r|*Qbcio;z8dLLRD~ste_YQQt4m`IwPQmdbxzW3|Mm+P$Tdff-T9fs^h)YE9 z??L_Brk~gxum0_V!lX^y8R4%sNzo0@=KgvO%>;Z6+sbr2Q!!T>h{EspnZWLxxCY0I zk03ANvshhz=iIziv({GTKhgeaYCI7K`8Z3Q7QJ{vaA#-<r>=wHt|N zF5e4r=7JB@2-9i?G*YQAvUnb`QyM2!im_+o&yJZDnor7&4V~!pAUI~wmQ^A4!WfeT zlo{Jt@M|UQcEk0OAuLOm^MLFN4JJh~6pS%bf)*Nlrj*5NPPF#+Fp+?k?Vq7-s!?D0Zcaqm@0i-1{IyK=OVpkB)PA46A{4j%{ycC|CpE2K9e z_D%U;2%KKV_)Lm!UO8lG?K%}5xC`WxoT3j)J}?g!ezARPe+d}DLHO%FYm4_Xoa#L{ za^*V7tAF)}#5*lz4}Sg&r*V}Z$$#$4Kd4TQEA?w<4zUCZ9;ObmxAtHc_nR$VbLIKp7-R9eAjxto=nN@pFWV$YwbG zYG#EtfBFu(0kMGoRjLsM?8ibqKKtu3LySNsgf*B(g0VHKU>gv!5ODQJfa1HXjO#Ds zsN6z6=T^>0(<)1hB2o2}GlaBJXH>?d`%l^!13ku>O%$yBJsSZbkRD zNzW^t6HoK(cNXNGxj*^%G&{~=>TW_I>M&bnt-IG=2HKCthlz0mlN4fwPm0^h5#_&Y zaZdV%E9&eiu}OfJ2`sRU*tDc7{%Nyj59cD``R=DTo=|+Fpo*(6!(ElZw&tCe-0!9s zz4McRkUHgXEj9{HJ&rZe;;gk=Yrb)g5fNgR)DgtYp8EF6_^mt)?-4D_wiI%mFC`A- z)btupUrkx&%3l5CiIlRUSR5&VD|>k>;|WTIkV;g-<9*=t68TKMG=u)uCCV9~>UdRE z?R~9EYxzqm7b@ZDY2BChX01y%e8nFJT^7z}J{y)@vMMOES~MKFbNhUdds-|@o*sp$ zB241?$=ro#VI)cpPRVn85vjgnX4#MH2_v;fCj=P5&Jr!BFAmpz>L%AbOs*ab) z*M+^iuL4f<(Ujr(DP87qnd4DcRf@BapID_9U&|L`AhB$y%a|5;0gn~L`C_@6K%xgr>V&6s8*s4~0N z@*j3nS?>B+km+<6f6Fv;!@EELJlrTVd0A=&-P;$1LvD|?C-oe$<_eAX)U#AWSD!Kq z4DdYKE)8czyhNyH9fn}GY8`qm^Qhi?^(BTI=DAa0(&IMZqWT@W{$+wv+1fMJzmI0x zQn2==NPWGwGf<5#bUFspwXPOP$7!veBc;a`{Ne|*b=tfU{d`=H&LJ6iEeM+5O+bW-sE`bM`IF(ys_si)n?U=qje!?fMq9{hKg8zph?I6!Np- zP$};XcP$gnI=f3+OPX2IQO$uVtjj;ttFFuMtk1_8zF{c$#_8Hcs3dD3Fe&;abC-Ix zVd_v_zdMywl!zCoos3axB(>Bnwxt% z3|W_D6B%-z1mOa$VNN`AaB6&CDRDux`WN=W2}Y`eRm2P6!s4^A%ku7QJ$askSL_7t z4%$g(eU0*XV zyJBWv$v;$J)~6nHi$4U;VPLni2XQW?f9(3E9A05vLJv7*g1TZNbs}+WaDdIhI@h!^qM@}wHc5LtbqY#B9&RLrkmAFY+~soUC|%Y zz5!^VJ|hgNdiwiYLpxsW`fn>%kw_iMwbpMgb-Y5we=v2Xo-e2=NgR1u$3x7N%pCry zd+Gb(Go~eOp(AJ)HXX6a_d+K32K$P8-L!H&31(FlRNi&wEoG8sMud@!ysC)2|HYJF z^pW+TKLuKD3=PblOe!L_ob{nq)H&#Dgm^i}rsqK}cUilR*u353jmIM0#V)@-XVvby zt*;vgfHYiSRSr~MbtG_Rs;&$JO^_j%hCDm76NbS2;d$If`GAsXgd(P@*&MOm+e>6`P0AJkdL(Q zq}_^bL&hI`T&hc5U4rI0rk1pDLi5i6CIbUvmMoD%yy6t|798vPw1fuApB-XP-RK|t zsb+z>LyYl@P%j^~2RmY~*CV+k6Dnja-BRgTa3AQI#C6(6a}tFVRVO6mMbw`D==Txn z7QlC#gAn4q`Jmr+HRrFS)Mjv}1yvijW~%*mOsCj{M3MoarY&Kd5|BbXrJcn^Q{XQK z4n9t36xft5isNo>NV~}f^M6LaHnbtZGC?f~UXKEO5y#TNA@C`8b#$fERWG{D?-oe@zBr!#7TA1tbC#2fPA6`M#pUvEO$ zQ{+o4BeuMwkqoiF?ToU&rwih!dL?tf7Dv5E*MsmD z+g!w?M|+O#sW&dMb2hz1&j{yT$^)L|_5~^vzsQ-|A5|5lS8!9GErMAbQk6{=eUAES zc5j9!#aDlBQ+;xTtxd*IQn6G+dlfIZD#w5>O^K;Q%tR{yfjZl1<(trPOC)Z5?8(Q$u$E+eKRwY|Q z2zWV(sGZ@akuBAAH~0EQw8;pfFIe_x*G>@6T^su^F{ZkZ11B(=X9^^I%xXC2Q;Wr5z zsv&CN{5!$EDgH{pMQ8XrhM45=I&nCWX6DbrA6QJJ6@}%|+}=Yd()OA@&VLt|QROMW2%)_`jtA-Sr~d?F?7Ac?6q7Xt8^3 zrMt+(s0sFpNr@Z5Jyy4=3=*Z9u*tAFa~Q4MgK2|%HcFP(Y=R!n+3usYVCLtn)6}EF z@Aq@aE|r`;>98#h+Mg<1BvsJy@$Mm%SeO|e!Xu1DmFlma1~1<%PBE{|aYTpfy=X^r zhSoCG(X3K{JY}@dDzrNI1?g2s%GK`4su&~W)+{qGSfL9BsE&pI(N_hO*hk2N+`{i0 ze0@}F+ix=Y5AUjD$UR15jb9;l5Q>H0RvMGHs2Wu0txglj`Uy9G(aYam>yNVBIe-om zD13;Re5MhQC>dgh*<>}zsoG+hHotNm>)huUniLT12-*|AbQ;P0deYmqqzFo(>0FI* zO9z0B4^dsnbkGQPg>&bxn4x3|*Yfi}*49BvFxBA~xYB7(_Rvh}!sB9g$O$w%QY$m% z%!z@l-Eek4IBCqSrih1Z?%gT%8@8J+%R|k+O-#9RG0h$NI|VCxjxfc7QdKDy@HcuB zdtfC2aTI(@Bz+Y8;Y%rd)i{B2DW)ku)Awm*q zj?4tb-O4w5j-c>6YP3?dmqw@z+b#u4EA2V7-Ai~7W16e?0FNf%n6<1mPrpLCcn}t7 zJBgG@)-8q^U=j}Q9%)`a9g07g#hNaT-aW~w323TU_7Lb;B>rhUpWSD91;|sJ1Xibz zb+=$ZD1Plw#IqBGbtHc+%Nslh7E4ALGC|97TD?r5?F#$IHaRz6LS)KLI$+{ecusKp z6l%Hjd%~CH+pDm9cS(vS45$N=bnmz)EYd^qQ(bI`M;F{8PmFMwmyj|`3?>z^R@tAE z7*=ex8JnKSq6(fN6f$B5w`nexf$|3QLM0p`hy^oP3K<#Z16gz`XddZ)PilZ--8<zhJDAB^Po1=;Td6{SpT5%fvd?Frqd3z*i@+db1E5BL&AoChUE?9KX2v$W-uo3whT?? zrn<{i45ihPplSZ%p7omMuci!bw9QVT)5GtX}#_sspNHpzs(%W&hfx!s>B`;CNG5QBTPR zPKeXC$cHY-XRNSen6~_0kRRvJ1hlfo>j<={$C}!1;NxUUPl94Fuqi6!-a_)vZ^0UJ z8K3OIZ6-LvygtbpOcdTtRtG>CEl0%WEYsp?*PsrmGA1CdI44}hDM|;gvz8yo`xv7^ zT-#FeMg0(j?zQY&BVlbut2M?GJHaek?kV`J%-!G=)eN;&)4|^ln9{jY&dViC`RSTW z487k$PPP99p_8$2I7q-`Ma+qiI|#NZaYNsvW$0~CqD(_s>Ks%x?ezWNIu#n9mcDc; zscPEQ448Z8Z&&gy2SmF4v8Y!_E*~8o6W}L1c>YjYFPzfj%OV z^|zX0h7Y7f{nDwD_AD4KX2wCWzF#3ctJ^pi;-ZgqWSdXHM7AQAd;v*$+4T866rK>( zNh*s?Mi}^oF>G$-EnSnpAb2WjfzGRtVZx2WI7t710al6CN;-k2AC4YgJHfd2v4wX0 zhZ_D`F8k0prYRo!rqJIBLFz&d`3G_XXmaUZ-^pq!mB1Fs@>Xn!!^qNU_XntSWsgF5 z7hUhk-_$CBJCc!F$ozwE(E6jo%@orb01=r4u!wT%{-9o_OduRq&1GbYR5EpHb-@GK!t6t{*j$!Ddi5}^5L&xQ#Y^k^ z6H*N4lsy_JfO>YEGO&s~gOq~9WJcD?F6XGs%?8LFWQ@H7wVnyxVWYc18yGzVUtc*6 z<*ZG8V4*L$?{NU7sU;cQMxJzM@RbfMsiJy~*0AEvg!FD=lZ&EKDxgF`c-4l4veX(5 z<{|Kkgx*_746KdB(E7nXw2^;LFHWf_R=lz*9ymb1F`e!FH~^DCyC*$$MlPSD!r z(81NQefF6$OH9DpE@@ON3sJj;nve$S;@Lw+LV0vqeV~f*FlDtC;DEc@deUNXP@EuE zpvppw?w^f{kFtU96PkeZ{_%IBAxrqJ!%UsoHX7t^qsF+u2y`u!U{#$`cb*gMk0iLl zoMFj&6cXO{mU2yH1$4#JPk4h_#8XNEd=F_;c-`?FL3-FNQ0t_6uY}al8R|6djVwV% z*eg)!)aDOJ5tGwN1wgPz%IMr8FymdiCbe(~hh$elcltqi(6L&M1dRtm78Z*kIF=%% zWY9@~1LUPB(6w(>Gio3x9y}dV1dZ1E`!^Z0F=~Z=Laj4ibv=zC*hBTFO{fDJb;%V| zqtvzdusLgz@mW&gj;KDr$l0Z))dAzW*_TE!K$$Dx zI~J)823?Z_BY3KkTw&b-qQ3Nejv-uslq~enoR>ou#L3)84VmZp(8SP|hD@MdlV2je z3XOac-sUKQ~5yHgbl& z>~2gVflSqj!F3>d@`yPDhmM1{8?=4OJz{216)<`7Hx^!NvvpauE7%X)2+?fC3L&3; zvu_A=44Ir%U~j_)M$!9*MiXCKBY-T+;p!t`_53k;1eR#p=ppZ!SsP*Ula~Xz#%ud9(IEy9;?(#@CWSOKq8c`mL-PSz`Q3k z#AUh6q(eG-H*(TD>ip=GY{or%Fpu#AaGx%_?yz2ytAMU#IskuQi-kZQ`-_4zCpm+e z!h4Ad74iuUX8<#E$XYQzSr0TcWu;Id#SeR?KB<_7-hI(nqKUHS2`HWp2#$)=#a@T=O5ZVAjf1;uN0$7CGyA~#`V9vT@USS{lZ?;I+=0=08{M{4jDw|@RgY!DSAA$U{`<$bMr<6Lo4YxhW>H* z5bTQ|fsrjufve4iR-SPTgR}7HbUfjuiR_4D*k%WCaFgwmj08HNR!Iq87ISx>(uP(5 zWTcc!z>MpKwV8VVu(((GupF@Xg%iVU!*XsP)K>*q@Fr)>gn+hv;|j)c$YmE8#WWkM zuCNqOlFPU_{K;w*RXK#p2?{qDbHTExlZ{V_l$)^Y`WaFUU>Bv6&Yts=+iW>UwR-)t_Jeq!BMicg7m zjN^p{I!`j9K<*y)bLxja!g;q71!-c(?$4ko7Fj(B#T0y!hqGTnN^?{ikm%iE2|ZrL z2|OJv#{xGsV0T~pb!@ggz+S&)Oe&&b?m`WOzTr?kK4m4~TGMk#D|%a4w)ju`pI<6K zl+$Aj7*JOIM!!m&|I*u~>nEfPZj~_^S614$~!W)?FT(<&OQ?cIw-w}1;Y-yod;T{!sAhKAJ;&f<)e3Vkr(5*j2kE~ z=1Q`v|C`6jpde|5{&pL9{el(TCX+kB6tK(5jq=cMK(-gjnk5sz?`Rs{jn0L_K43t) z_rVzCweYa{`QI&x_WpRMc4<6MNTc~akFbmNH;z>A4{<>A3eLIscaowirBnH|3;rMh^E+qs=kfOw36(O6gsMXP zZnCC=3|5jU)eJRA3PP`#Z`C5hWaN86j)|iT_*+YGyVZZ=h}l1IlbOX3GGE|JriUB$ zm9lSb(6ONd+~x%*)d2^(cQ~_N&Hjdkg1}&$fK+yZvEa7vy+ue(_h(w**BbT7dOWFc zSJctOgN*w7JZT67)Z+i`4(Q>^=u8@FZ3-DV7C-CVqNdBZ(&lH~6fzt^rep3srhg=a zNPMss&eva>*BW)esxHLzH+$B64*|;$c}^PT>IgW&pcQq%iY`QTCjZ2w8tgpq7-aUd zzEWt<*zv(Se@RzY&1+)q)p znx*8)L4RyW)<+_9y39EUtl3QpoYlgw(2J=y2@0v4T(RZgAx}3^^jH3{*QcP>ryytU zHhT5sIshj-|HD~Ya;RD@2tF;0^8#9EojwkyLjo~8(?B#p>iWEKn2tlZWnO0W5`giA?3; zUCvb8AC=sv5yK0K0pB4@AWwpzrF56g=S6;f_r6t?O|%8ag0IwoTRlBQ{?|;6)NO`d z)}PAnd|t-oxQ`s|-T?Nq{w6^t(a~&Z3+KWdUncaqA44_~7-Tj?fM@$Fl$9dQ6RvoC z66`=ILK{XC+Av4bpAmFt`!zB23^Vc3tO_3xoru{*5Xn7&R1Bt0=y&qNA01KC7&@VP>gaGkqN8XWMo#L#E9duVMGB$7i8LG!SlesM5bVc}zwhVpUJrv{+Aygz{orW7jnmw^UYk9PwmBPkki zPcS}FzY$QkYx_A7ni#W-eDExApn$9e_7Tca(}<|s-MUGzK~wB1iAD!OTiEH+VW@cr zXLOBBf-YO;aT{C?Pb(Uhdfxk~BZAZCcUcjPM*Y8J6T=P$4Dig16NJO&l}S|+3l0Vd zzAZrFSW{Mv#}_Qs2}*HCz&gA2PkU~W#gSVKh465LUbh_&G)HATCS1OYYakjm-?(Zl zQQ`e28I$mg=s8KRLnH>Mm1>4j>G5zTOYc1CpAh!Q!%S8LZH!(nzL8reB{IpyV1#`m zqi3`fjP}@WZ`S+@Qh2;_kq85tuHg@n?Ic#x&vm?{;*0wnsyEc4APWw!xA%jy`7!dO z0J{`Zrd;r!b83yFJ7!{EYd{yaBX1{>Ks@i~`{ju>%Fj_I#4D9wbG7zUBcj!vMpA-| z;!tvU!V$#nw3ZxD3-kpqY7!pR@^z1X=Tf>0rpLYG1lDwEEXSzlfD=U28b>~AYYF?}}INSrYZ-a^uo zExj4QkV#xH9V9?D`OJ^ZErQ@Kx1(n#Qhb#hE@OSotPQ-4Ctn(X;vvE@gE15V(6bXL zx-^-Q^*ga*Zy-|x+jkO*rJlg1J+MF)$fyGp=R3iCG-KhTQn%mN%R{NjCPJG98=&2N z5o#oYgOe}XC;K4$aGJ8S{)opwG>3B%W7L^1^e-O|$BT*-c>SI}{bQY(RYJ;h7;QT) zvIuGwmRHkK3~7KV^1tWNN^%I)yT{1al=;kNJ70hYDg@YTe6~ZKE7xgJY~Of!hdD8& zEHY>7%&Q}G<`P)~>fY!*&!e(Qja&_O0#kUIgpsmIUI_tBPGzwA--==5(gkuMN?^bJ z@ZHBQh5e;WpwpB@!5 z0Lw8OXeRs-JjqJu64b`0n(_l1`yy@rXKcEqSo&GNn+visU71R-MTtrwxqj$8Hc=}53W4w%n`}}9F9f$z zbx`GRGnb`fHl@Ih*2*u!yN;B<#UJ<#H+HVQ#a)ZiDZ={2FR!cRxVk~dfUnP}^ux>*Qm{-43k(s7gc|cL`ctl=? zWyR%hw$R&oQ2?ZRH1pV{*B2V7;#0~018Lwo)LKoHrqT>Fg;)q*?Vyd;)lzDtGG}I{!>3eXi(De)@MZU4GfH%E z=~cws$0toKiP}N55jhjFSde|Lir|#^{(3%^ZWn;EW3tN(-l^^a7qFpSa-=V!*ee zgn=R3rd1-jvHyZx0WEVCw6`4Fiy{oBp{O=I0K?;+`^or#`AaOdj250`iF{B8S^KD2 z>qK^AA4WO(xGExoHh&VRWn7$r>VULasb1vZl0>b%M3or<{ag=;DVHb%(>bD?kqqZJ zR6arM*6)Zn*ng4G!uRy4mhyEJn8hro>#xvMr@qMTsC6NV(v7Z>SmUZ&^GuJPnn%xp z-+84KT&Jb=B_4b;M;7%fg3};Sk$A_-)b7ns+-pc)y&OQ+wX6nQaz*W=)5bY9BMTSJ zzW$@{kJm1OBJ&u>2 znhDrs-QgO^H6lFek2tHhxgJZ~66#4Tj1wT@?Wy!9dHOJfefkKOkWp$BQOs#we`Js) zHw{{>o?HwTk{b&A5%nQMH^bz*8OOB53hb1oSn&{WE_soLVOy~vX(D7L2(;Xn@?mui&(!c-IUmuSwMaVgF8WL-f@_wDu0cM3wt;X5 zcY#r87rq49ypPM{Iy8s);YaZD`0f3ELyaG0XT5$TJFX^OCCuQ2C4_8ig?DZy7P6!I z=MxoBeRe4q65#{K5}_6_CPTPb#nB~sJun18OgXaiU7mWd+s$1W*DQc*V-)=CpV`1( zNi>~8uy|=92E2bi*UG>zWvhKSs}rxkhiz@q1(PaEHk7?sXZGj*zW`D!t<#zfcx;~G z8jj0%aO|ILe%3WnV%`81R|X4 zjF?LadG&Iln46XhRDxD5DZu%^UK&#EZy5t-5oa7a{O)jV7X6Yt_6n5-P>jjJLJU>;_7F-$~yj&F^5T&8?d3>Xeo{a!uZ%cHyu0z#693=F*R{((Xhk z_<#Q0Fm@|yN*k2Qlph&BQ2p+i-?(8jY!8$kygt*%+Z)DpmBeGpK7>eO0?T5mr7@v< zCJuaRJy3?jQA`3>ZL>on?hJ?r33~>w=AlRsqPrO?vJe|s*nhsF?pNjVv5OLt#X+yJfMiLJKDl1~Wt0Z- z>*oF*`?&Eve~Rbfb(n4#kn~_m{n=$Py7CtMD}=acSumxuA7L|^BB($2YnzdD`K?(4 z_L1xdzROZyQ}NpDYkY0fFn;J?+SR=@!&7C`3{5sF^fpb?<#ucu%XGSK)6kdSU4NF* zTQ+=Oy=8MF)Uu%*g4?oTD{Y68AuLh$GrE?397c$JqaT|3b3%c-m&HCQVLkRNXwom%a!qJFz6v-GG5DebZoC^U!xihM=py4 z7pOMKWk|FIsm>;i1^fEI{g1ZG-xgP%UAE}sywQd+VnPP!Mz`#i-TFq;c8mR$-v4Mj z1}*YR4;}e6uWkAPpINUw8WymZalXtrvO9c*98A!LhC!*n^v+kaeh-?1#r zS21vhUV|;?;OKhw_=GcZx-u^1nD{K`v;Xwq$9ec;+Y0us_YP%p(CXPcG|KOQMpW;z zCvU+0TyE%eAsA__(a4OC^hJP@yHbKUN!04&>YKG1hHG$IQieD3SehjOsa|B#2^d4h zGH;nCIcy^k`8__Ea)-p3GJn{}Wo`i6n=*T!k^P=*CRbZ;$uKP0TQa9s>E5gga7)G> z@)ZzjVaXKPsyAeseXciTm{;5wGTd5vZ^&Hw>Z~Ets!0q`+Lz(-rF|ii$AmDe4EweX z=Re!7p`pI1+yCmjHXL85MxwrJ10$=v$Sa3tyIA9{(}&I50Oa&x3V+#Oa{92UJQ^yW zy7+urG*4DLwVbIT?uD+yQB15@n0xdpI|G-4{HawizjgK& z>5)Za*^Ji+B$3@2Fz6_+BavOxEcUY0fnzn5+0ggVf~C!Gp9#IU=E(3|cEwkvmSP$p zlTsGxbBN|);YaueM1S)zDWc-#C*CnC0B+kFV4CYaI(lvIq1}gM=v8;zhoBm$IW&f9 zrq-HFbrpI9UTcFP(rn?!D2|e^+;K5Fv=Jiet~RJy>vQZsgy5v%d!lNmu5L-=uZk3{ z5@_P^jk=Q;OAV9NVlADc1T(TcdJajkM)DOc(mB-V(#_J+rGG1vUA*P#V@ww~j_xYr z=p9U@*}ly8Q5LLXKl>cz#oPEX&7$II!5yi*KIXor(^MRx)UbL3yd~Jbu$F+IRXB$u z(=MGjlk{3s3VbrchEki`6@%WcU9xd%`>n|aqD<7u_BMIh&$CZk2l5&{|fn4fKccGZTf&{({(lh(SH-kbWcwZHZ(dk1~zX$ zY>kRfN`IE{GktHc6+f>xd_43x6BzLt7Rz91D9+AQx_^+tc)cwB%^Tnt+|^O&l_r^% z@3h5R=ZW%-OvmtG{N{AMSJ&U5ZKn1`4Hg6BlZIJ45BkVkKJnZjs-HE`9lKux{RJP5 z2;I?ih6BzhQkV52XTY3io|*M z-3H(Vx#SgJjof|BG6k~Lp=sGe`J;k{BV!2F0IwG*7eB}+Qfj|Uhwajo&9%tj4krJ- zb*tY!(IvJ$1zkVxGqkQ)LY7RamykQl^?wr5v^s)^p=Lp@T4vKbX82U!e1-q4Wd z#oVD`pD?QxI~JEPJ9I`@DLL7G6f%NPg@2i1xGkr{opexa`f>j>fOIYNk*cQaY&;71l)r)} zZC6ttbSlT|u5)6<>|2FsieNKmSD#rA)T7&0FTyxEAacK4Z-WzWsPU#FUTTsN1Qeiq z43jX60;(DObTp)MvWLo<=nr1V=(aTJezOPC4ij9IxO#~aebOhiZmn^>MSoXSUrtr@ z0dX|$>wv%Ft90!;U~7s41-G{pUpor~Xx=oKrBi{bM9mvC*VQpBR&^1|+-3??H!!!C zDgH~Cp)8z5$$TB#KcjVt=%Ljc=S|nyu!-9OI4jb2ct`r^r2hO1TI(U50K3EOVEqh^ z;jk)R`+1}GV8mu40=R+ntkkUqcPWF;1zl zih`GMUs1MSi+^s;Ft^ZVy7;=)QIOF~iPn`ABdo$+MI}WXJ^&LMwvs{_p`n|!X3^sl zFr`^+s1wU+L2BrBuR$8887!%p>e7xcx2xKXIJ-3pj*m33;||4qm#woa2r%?X++qxo z5o;gVzN0-Bci|ireJlHNl`UCju^)VeB@AZ|duf8?M1Nn~LoxE^4He*^wkw~ox|X)L zRKw$Qs+5iy*-jN3tlII|brVwWsKJfX#0TP9%$cexD;^yWIN-4!9d($&gQCSUz5?aB z`=O0qcNU>LyXHtil6nh9H)U_q}flwlb_Kt$}kQWVNx(PBt6=`bYr6$tDfOAe8DsPdsxGC zFmi0}(VqIa_xef5=ho>v12qK!ycd(6e&^Qo0q>jy-Z9BAU5_O%?HrpUWg z@TR~5X$s#IctfuK1s(sKxEExy5ARfvs-s6Q2tNqIymEUl%S*uB_F&scVeS{c#(xdM z@KtfU(wO0dW1H3{cgCasBYs_Z^oW&|n>bA#t7NesZ^#1OHXJ)Y{^o~&lV&9%T*_r^ z@LFt0dg$;@JbS3n$qDXue_v@O_gE=;1!Xb%c;8Ds=4V>s088`^IXPexn@q!&pVB#W z27Toa&&;O|s^VL+{+Orn_4~oJZA_ zUp?O@rTENxuTKZIy4{+1N0rgriEQwVp0iunD9$5N+_2TRtae5VaIDd33<`S3A zl(^xa^%ZU`U$3;ntxJAj=;uFDpaeT3lhy7%vtE~!;J(7Gsd{j^7t47)Vc3_tv3&JO z+h+mkPN^GhLVGna_rBEa0tkJn+j&4n5Xqgt^|Olw-{wphhQl!wxi ztf{@+7rU{1^?K7;Ksr$DMt?nEua{$vT8%8I7v>CIrfI-H92aiZy-HRquiUKzvIJ(< zA(LNOSaf+fa$99s?mR5=IORVq*dkJ84@*qVTmOuXeNNmnBCht?Fks!d^ufOIjXO)WD(q1-K~;Ebq|=;R6Dg! zU$Q8yWU)n8WTn{_Y{hyE*%ovdgV>DBDi!nZeJ|naV_GVmeW2jTIy(s#w*@To9od7? z@QOMbTv@CiJ{Lm!Sbu+))B)JYRf`2`a4truUci1K8I)? z7Jd|C(C2uEsCeOqvK&tw_c|EEm!MD}yqaMd!_oDqVxPj7D}M}efoo%e0;MCvbDb-S z1m1-#EfG#Fw;$MgwQ7{@shJn#GUb8j*4pI>B-SUeqsz$QywnRz8T0|YRj`(6fB^sL9mLS ztGK?xn^0c`l{)jtVT&5AforsyFv}UJw1+@x?l;g%X*>0%ov-rDdK;X0?WLQJDB9)- zx@}Fxm&{J`CCF0E-r3jUt9SM_1f(y_Yz70ki*7?F5`VtFrr0%jP_}m;UjPBT*t2&Z zL)+t);d%;E3Wu(v>x`JTntB_X=gfMqPE)symJXInnmT&&gRie%TQ57Q?6p_91{J>V zt+Kalufj8|-K+2o7QS8;zV9B=3$fOlBw?aK=w0GSZIeJRksG!285c>uJx zY+==&S%2@|}_-VAH@)tg~Wzj`x_ZN=UUJG*9YhFxB> zH^a`Y)0<%e%`o%BTN%rU_x0Ac%!7()Gwfm1UEdK;|8S8szg1f;jY zn!(W9U`+w(hYehYqaQZFwNh_`HC(c{!7i@bO@A8yw?8+@_*_fmmVaT$dO>2*SM56qcoQ;co7-?L1RL^-h>?D@6%G|Qpa)!JE(MRZ)` z$Q+o)U}#!z-mI|fW*g9W!0iv0Wm>JhGrO$-Xzy~mECM`hz?}RABm#!RUIc6wtwqeV zmH@Uj;tV>d<{&)-0c0SKYg-n(4!LJ@3_ZtknZh;uW&paIp|W5GTXtJZe1GXj7j5#= z#NO1ZEVJ}6^A{*xQd<$5h<+CNv$z`IOFdj@8paQ$p~wVuJ412j@aUdUhv%7?@T#~! z;~Uh4`)?UF`jtAIHRjg%gogv(A-yvBb>({AebV%u?LF)>&-sQW#evTi0LIK2*#UoU z16XoHEv}620Sb126C7GbgMZoXZ`&H+%lw(XUOwUKc_WuiRRH4eOvR0-1v>NV$3G?% zKuflP=SLWUG#;dciL@Oh)8N*c25as5{;gf>CJOHD5JnMgb8m@S+27gIpA&j#hs=pq zhj*6Ve3iH78jO-5Nn%oCl$bV~sO*iBrpxUbC6>!K_g%eF(wifj&wusiNb|3bnUN>15g zDiC7hmHk;a`?_$}SgEjG-t?L^U%2WQ-C?$k`K@I@95P`Gui!y<_ozK%!k>;MSQgPDtd&>=LGkCCH>3mSe}B>>oIG^UAI>HxUyDE7 zGdzm~%wDfcoV;ges49b!HH%r7V5Q*vdGsq{()o_BCoKHw87@A!PUU1$3B5|9KS(H} z97)iE@BauUK>CnsqeWhk2x$!zR3EE4kv@PEsni-fC1)Y4OfbtF3`XpcXBaU%>ZX+4 z5r|Ki5|nYn3V+7G=5xRB|8`@zmgS5rYcLv)2A*vjj=>bcJiZg~3s9CaM6MyC!&Hq` z{JN#!br@2U`FB_jUryZsSQ4!DuVx~ZJfU8wLL0B{U^rwi{^lHU&{~|ITT+BcSuG7Y z#7>3~f>C;~C%@`t}0+)aQBu&bs7v3UCot zZZE#eM1K<{;=6_3aBj)h>4f!0TxA#qkw9(StG(Q5vA9eY)DgqB+SNpHGQn1< zq34!-olMXiw67zqspH%HMUt}8=Px$<>~-WL-r<3joAbJ z=AW29ym>QOEaS2V)8GH`;|&HZ?U}b-hfF`pIQ>IjH$x`6D)TOPeE-e5#>XdxkKBzC3Q(XZl@icTYvJE z<_C}3Pm(w<%6lQ+__JFf&S)R?LY(!h7vk(o_Cmb9@%Y30bQy(ncAfyl-c7dgL>dNj ze#N39&HP85r@(pU$hHS=cS1VN?C`Q;SGpYMPIpjihqI-*_adD2tJ^}vb4+%pE|4%_ zoU5dzFbGyUhxR?wbsfv@ydd~OWPiZAXTBmaa0TXE?~>hFvbW|~7w@e(fr7Y2ulv1_ zcIDVrVAr{Pli9W8^kge)e9&7D#rE~Wu>(FuLGwY$lN&j_lY!P6^tEa`T_5tb7VOev zU3lYBi-F$fmhAhmuD_t9mciCGR6hgsA30tgL06lM9fA-p1zyGUejmH50ojP97DR9~F6d3z*hxXX&>U#ceEnZV3z`eShmIIGD)yoWgfU z8yy)IkJxP?a+`|VcB1yeyYw8Jk@dE>uIjcGgV&DJvVysBHLGfhvXD1O^#e_}2e7Hz zIgmh{N4qqc#eVP=kSbgzp}<$T!}`NywWzd)yBX&DVTgh>P8kxGxjek>jj*~2#<1U( z1C24}4NvGI2Xa|CP=BiuD-gbA3>dt~x-qU_Suf}D6(LSP`bxWX1K$qdnjXP3-z_y9^|lQ;UI0hO7}=wplQP&tbppFqhx?9bKMJh zaA)xM2vUft^X>7xd7k?SaitifTkB-?i&u&@gXPGT8p*#>EXsS6D@8NI`-=s5v0OIK z=b>Yp+DGs*=Z3NHfL{c#R2^KVDyswld2cKM2K}tRr;-HPnt$$fn1A$%1?dXb1mwqq}iY%72UCBE0yT&G~k?Wb*h6F)PmI zywprR{&Jg1!FJv92VbW^YYz|z_iwS}A|(&3taA44Pq(*ZxSqFxu4NS?xALOs!s?&?p!hB1@h!LAc<1vvLu1O5!q;G|5=V)3G7JQ{0lQ zk=Y;7!(B{Js8{Q}jUa61ZA_@$9E~e{vnp|7elu$`XPP9LC99>{TbphL%lL z!bM|?Xd-9P{Tc7N5qU+9{p(M}`cKTWT<`KUBDvDXqg zo*KJP_)XFM6~8I6ywEGZDXI^ld)73)-qn{G6LbCS^>Sa9)zt19uNV8unBLx>*;iEN zHow7cosU4%o!cLQXr6zN8FfT`-beg3@_^oQpWf2aTY6-dpJwQbopzF;KNiMGiVa1% z?0_}5saOgJs$#AuX(2OCS3zL! zq}Zz_(-*y`8H4LSiH#gFmaacGCkv9@dR4hBkFBNkr?U(f2mJyYx|rf*%E|FwokO+s(aZou1s(trqG!D?`+6NE&1%J5v^nTYW>XUB_^W*o> zajJU{7pBAwu3~fcdVIVW!MIE4a8_yimir0pPKO=V!ONcXK?@xzWo_UPyWFy}7k|7& zC1TF-Q{F^}PI(I$JLN+{)_cqv5kcsZjWX@Ny7h+&dRAJgNN`C!fcO4HKEfD!Chy^+ z4X6Y7UWbp=U3_Tfy$C`g0*QpRH^@W_15MZgJksZ)wDbSe0q{{XRAS^pZX+Ddcrp zsl;x`Nfzs|`{U&2EQstc^W#$-67!uQ*?c(I{D`1Z`1yf`mq!L_HW5qGReyKm?J$OT zG%x%>^gEq#$KZ0#1XE_xHyn@*wt46wPeC!pjg+{-hqV9^no0UH6mq$*dAbyUbr$*+ zwcVdNg=yS1F7&RY0SX=_@F-g&CNXqk^|LZE9E@G#z;?#XY_TO^{#Ub{Q_Ny)G+?&eIkhax#uh)_Y+p$Tu59adl^bQX zX$?NH8*4<6F8Z0{z!gB8QKXR+1*?m4J_N}RFqP2ihyRi0M-WY)Poqm4x|j>^C9`Jf z^-OY6GG$C=zctZ@rGM8`sl2yAE){e2E(C8l6Yw+AAJBN~Z=^e+O zv1fq{wlTj2e= zas(!DWxv!t%st_7Z>uu5`rqh;+E55kO?>ptwgMD2HGg(4$iHlpx9Li=^8RjNjGji( zX=n9=4wy(mnc3u72C8AG%Wk)*_L&$U^1744rd$kFs%a}li976!NRv7Z<>)SWuvX6Q zXtamoBY7N_y&VM38HFI-K3pUD0v1yVe)+n2q&FHe3 zPH3+OOmT4CQlVi7D3z>;V4EGY7Y^vq5DIS^n%x?1BoXOu!lozYDIO5mRE?kLb^<{$k!J5U$T8fm=1gZ?u+!1821nlJctsvgUl7D25|7EFEuP2S^%xIZGnI2; zJby5dS$|WNMy(~3=}BWUuBbHLr)I8Q(Zk&%dDy+Jh?|R})UHL97xqZ-g->R zxSR})_QNeJCvVdm^wI3dF@f0_?@;aj4Dk z1}M7WfZN??VdFh$hKWMnTBj($lO`yN!1ih$1-QEx#UM@_r+#-R9D=eypgf+Rr+)-9 zERJz}V+Ih6<5SxjwRCNZOLsv*xR}WZv6^ibHeg(dvL4`DQ*R&<)& zL#|lT42RQ7jqL2!S0s=;Z?Qzc*ne&s_S$-u@OAbe2`|FV@=DDKo78E0)+OEveCH-& z4XoKK*QjA`)fi@Qt}~c5eCaa?k%<(FH{-$_NPjZa0?usC23khvRiez9JCzD0IBP`u zN5vI`Vy>T>0%6)30#YcRCu((cS-Xq8I{d;K&> zxf<6)NY_t&XPb4aeCD|n>nATrXBe-qq+qI)R;TI}SquPEnenOdZ;Vr&vGrpfEZt7% zu&WSBT~Jae`MSbfw2-169C=}@brUdz*yyYzbEe%}dAnKd3av`{Li6FbKi%G%*&K8R zlgqSon1tHXp!+qNa*=kALVp>;mZzC40bEa_XH;mwcA8~UDgcZu7{G>^+2aoYQ!@4ffYB@ih=4h}nOHz@ zN=aXg5e?Wr^V}ty07RS5h#iua=8$Et06bxAtwJMQ0xl^+2l3KnmVYCF$|9iv>C22H z6d;%x2nQet880>Bn5gqesYGZ!hlSEbIm>Ad5Il=hthP8^UB()iTrL3n)c}8kyHpvxZni>MIvmiO@zkio|H_LOw!$rbC=Fh3pZt@R&oVKwQ+DTq;1%r z0NmUbD8}1uLMB?PgMUSZh_FL$Ei4Y!C~Wu2cw??R3Oa6~K_S%*UdnVrpK*Bh-Dn(I zUTOA<7uy;ZE3-9bOISgemB6CfD-Rr+(eHUuHZ(v-%2qK7@DvnVLgMr#6KP(~5kQ#0 zQdtL9X+!hDnaog-%S7Lw} z(+uOM8l(&n@G&?7wM?QJ8R-(JfUS|1h-1m(09^1I2L)6ikgOo6*@1&{-7T6qnOYLq z6`aiEk^$6SB~S*-Qt@Mcx=){U(Hc{^B<|wnE%NflW(rS*?#Y@fBxfdFb14q HjT#&P8$FoC delta 94279 zcmYIv1B@oV*Y()Oj_n=Wwr$%spD}lA+qP}nw(Z%$xBp+><88yhi2eCETm)@<^SH15Y107g_;z4p zbkQhH-K-W?9ZSg`H>s=XS&E}AHSabT(YabVOeZ3#hPAhsgC$=$<4r2q1Ws3 zk2mjxx9}4ofbqc^sCA|jDS;^grLg8D&q}oR!Jl(k=-6I15)55IC>xDc|#-Y{g3L#Z20I2czl{?Cj+ZZF7{2{YgB014o$E z^r9dNCN|Jnm_Wq%AK*Pea5mW|aw{L*P}AIkOXIl&`e9$wo+3I$Is72N%a4s>1_n1- zE(@0#c3g?>`M5Y>R7izE8Hwoi0fkT4T5`zQQxhqRGs1xnLlojzK{AQjth3972W$w~ z3=2#cQM%2FbH_`^IyEp0+(c*MxY#sbpJuY7tBHsSujFlk$#K@m%v`ep zIG53}TJ^!AoTIoNe`5q-a?VG_FJ!D$4mJ78W04=(ez}aN>1;v2J+V&2WV2hDh!>hq zurk)mv~7C)5s#&o?A??_ljW2igd}I!-f|E@??aUwB$Fbip+Stg8>?`iHKm+H!NyNr4eJgs9tS8XdQ3QyMGVRaY^CTf%q+Do^Dh| zr#7Xg3uK*L5uYr0jYB1;LnAht$w)iJV9P8(Ug&n<7dOQPlHb*s>Pvv5TI7cL{n_r5)sX8E=JT1FC% z?tNw-f-sx|v+I@K55OatG>snTT&SUZvX`k@VS?szLr#cw<*MS7k?xEF;9+^B4SSh| z=9b1al66l2ByRt_9IYJ_F#iPKAfu{9cfHMaIB~Dar&4@M)R7iH);gc zC}58>-@m7Z9|@v=+t`3JxdbTwi9*B>G+#fM%=`l{W! zrWL7T|1$#h{eI{AM`YY1&0rFGAnohVk}Y0zJZ_pC$A=fYm==>DkYnI9fee#NyOl{a zGSJEv9O|OA3H&Je_pF0QsRA=3B_}t|7&WSP&(LzgK1r4f56cC-Bol24_1?}<+{CLP zpam)43^+5POSTtt_Bf-VRK#d?geHB%F>g$Oi~ILr;BU*MYbqycg^V)9U^h*D zo`A9hQ;d^^g@6jzgtu~`C1SrRuPQA48UYF(Mm{p1dsv}<;f7pSiC&OOlqGqP5NRtTl({EAl(JaX959w@=fu82b)mCdxTh?^UV!=Rhu-gv{VxfKu#8 zi)$)l?zqu)ncg>)3v)2JfnD$Ypm+mieZ4U_iTSDBlora%rq*>@Rp?QrwXsX1lU#Gf zyz~A(u{Rx!hKc=G3RQCVv$n7X0R6z7A= zuE+}{qI?0ztu}!wtys0d3MS5KRB2<^I>`n?>G135Zr0Ey4~U2_K#p!4E2cQ3)4$>G z;p|Y4!zuEkr@(x1|N1%xQEQ-86yt^Z+kvri@)qYU0C4fS06qVn zCWA*i0~Atky1c_RNlbhbLy%%|b#6N51m-y1pMrS}c8S2}5~a__w?sv@NWTG0*eFT= zb=-e5gK+WXx zPry{jhAbS=dF0X?Jn16S1a`VP} zkP4E0;8D>=H6iV)W)jgbv>&PB!fN|)&s+b=!mKkpCvicaq(fn` z(zEtt`0>8z#003(SnWa35;TXJ4C5G&se>t=^_I1J^-1Zy!n&g%3dSv1vyuyMwI4$zRx*Zj1NP`MqPtD;?2v>vE5Fu)*ff#xag6yO!f*D!mONOsRjk_P_B9mp zudIbDQgSk+iG(m1Fn~C& z;-uKY#&vf0$j+F6mY&PBY1&a^^i8+J%J1)k#clnnvA~)jH^dsZ!*3(A1go8%?PtUmIA}@TI%RU}TgrvqgFy6Jty&EAf ze45CT(|)1%w!QuzlkuPnfk8UQ?qpg3`8|?ZXX+RX;b=fyYnQ+X9n=61#KIejW=J;@ zI0)fY$^;anN_f&uq|cn3eI!DXEE*vn{|0J54iN~GQ8PkKvUSC8=szI(^%|N9{%{la zK2tfmEV`>2Vn?p)iCOIYNTA&#sy}_Kx1AI&t~L})b>T$!?JNKvzhQ#H9R3&phRXx$ zt$>0_`HO7v@)v`dorb-0aqd+KDvz*4kd{hjDO!t;_A2UOnzg&4?e_)Z@$xc(__(`9 zhEG`S*lR8CJ3jr{(-Acysp8GJyL^6jt8+WKzAQ4jXodF>MIe+{WeFQdrEz%ZPQ^hD zoz(2TG+7BZHsT*Y{@Z_RHX|F*^FHnK${%#Cw)<>;?* zjWq%Uv38H#1cUKoK4y=;o94VxdhMU2GsRr;sdgS1d9bA#(Qt7ch){=#(aB031O z^ab>mZ6imF5l$Bgr-&5bUoG)Q!F$B^)&)2Hwjrp%94LFy*0oi0sAC3TdckP04y2_>397h&Ru6!((T@O7#Hq+zTjGIAF1YN&$uuAFL};GpSM6(D%10J8z)98M-cmVC z_AZEEW$C+6B5@`wm##;jQ^g06hd=DW?b!0V*bA`^;5-GpcN98;+LS<9b;hc>A6not zOS)z}t!22RJtaA7_;UM+w3YTqk!7cSs1)~-nb}ADi(6VA+Yab1t#oY_b`tcZ=%Aop zPeVu|d@@f<`r|=u3U=gTo+s$ujhut~!s98Gqe6BM*P59XNP#6;vB)#NA(8~PFS}K; zoEe@hbs;-cK=w>-^l=XN9I;1}0%m;M#*Qov;2KQqj_@cO+7aO?rsj=X4w&m)fULnp z`!lb>dL|n*cn@%$4W=*=(p5_Cf47b21V(L0P$^B1s~+ZvV=wx)M~=*+9!5()`z0Hn)}T3V2Xtg4(r=)Is-E4dDv z>PmotY75CP=+>u2cr8>@-Nl)`VbZI31h~P_F&7*QuR%v(N}BV(boqi+w=Ci-`*G+sbH#!*7|>^ z@hThK0Ricf7x48L0Y&L2T{yiouNa77y3hs2B*)p8GHk82a`o7QxqfdZ8iIF3 z5Bxx%h|Jxj%hxTa0S<>@u&D8y6${$f`ueX8?Q@ZOtK#1;h%!OKk%$bKUB|#94qA|N zp*%tWM_xqV+1Oe%HQEnQq_ZcqH;)80A{xc6x~>*{>oyU4{u%KFXmfi)jhP8Y_ym795F}!Y z_Z(Y7=M}=OpCGfhb`potF*wC1cF5^h9hPOVaPeG9M>K&-OSkdmu6Eewh>iYI$)=h* zK*)u-i|fJ4Px(Z;>YCVZidn`liQhUj*yRs1PoElt1^Js2(TMD;38d!`HLNKY-ilm~ z$+6#vvqY;hnRbH{XzE`w#ak}R{P?x2ZhaN$*t{PFr_t6k8})x)h%C}XXaMI#t8d`K zfF?ruQ9?W~m)#a-yf0puh|61%k%g!%Ksx00d?BOC0p9kE0=eFz0}VUVq<^Uir<)-k z#RSw6s(L$XItW!TEFi>o2uUvc)Q~x;6(z zFgof0yJ`NdZRHm>w^py2l2rtPwG}g31H76|vH6gjm)KF4`B3KUj8$yNMw~q%AO=CG z%^oh4-IWKj-#K${2x~Q3RVumnZIZ#NU*(ta52aew z$tM1)Y^e95D}~*+S-xR6V?q1{;3q&g(N&yXXnTR;bKCbK>smvjbN8vwH@S|AKYFbU zsTaQerQ4$2|F!QN^cJsCh0AP&k$au#2WS|H=5w68Dk zOEM5_B4})-HHN6aP<*sTfXM=*BuhSa`m4~$Q(`x$FShP5mj?PhOEUQ0V6d34;iofzPiu|9B{Ayn;6k=aeW0vt?QDPbLV7&k6|Hqx5#?tov8L09hKY<2kK00eY*rD&Yn(=3*A zV6isE@8t!@_`@%cF1n8G)^gn*@l7Oo#aDOZc_62c<20`t9^k7L+zd;9>|6omF+w7E z#ray!?@(A9+XeGqQ1oCMCp5X>1JbKaoQt&qTU?3OJR00mplID|rcXL$;NSy6S_*`; z6(KIS;xo>XC9){90HS>{a$AH%+ypk$1bA6|4h@QHJ`D;yE{)YK&yH+cZQ@CdTwQzl z5hnPFMLL4SLpgL_Y%70raXIUP~m5nCU2ZguuJhoGy z_2KWwUy3VxrPHcJ)ryG;Vhy9RcIG<~CKo(|>Ve1J$KsCTfD%@GGui7WT%r~&%fXm55l^{~LCP7d|7vXn6MmR3=&s^P2tAFvlo z0dyy(JM|q;gWOU(ompNn?U$@jsbdhFu`^*H2oBL?07o(+(i~~M@oc%{zITHt`agI%> z-C)_DivA!B3AKkA<-}I4$>*o6{_)O&F8I?|)u34|fMN^w=xb5}_(XAq3E>J;N=F{W zX7zD~aic&x0q66S4V`$*wM;2Pa1MCbJzRrB7g=DF?=Cw4fm6{V;zyWmCAz3gcp-DRC?cPIa2M*`uiJTo#UWb~M4`3|VyAUY zFb(K)z~_Mnn-6{mIbyg7k7fHD+!>IacQ#ol>HbdSAD~cZa=IhZM8#&&{2I#xfT!TE zDC>Q1iQPewz~G_LTIf%saX^geq^JV6Rc)*T)Sjv(Q|PR1nJ7y^E9;W*Io zt#lp^#+3NW|3-oVdLSgUF*(5YIfwrMEFMb(K<%_Hu|?dxt%vI0t1}*iAIScenLI;V zbT!*C1a=B?C93wUON%g2jD@v!1o8=YG2)TDsyS8>J>2q|ZW;;>)VA@hR zwAhSY3%56ik5-emGPKYP_gxF=-wKZh;IcDQAsM^W-15@~{c2^q4O!YLnWB||nc43o zbsI~})5|{)QnO;(@oXc$C#1nIB8#;Es08XTzMhe`+NtosMwN%eo`gR%M`d3%@$OFT zA&Z@Lp7z`kJ4EOtjY0o{HzxWy1(#o?2208!n0X@RR%bjCGRJ;q9vxVQ>a}UQixErb z-F<7{ar)LvlGCBJBuz&c`%(9xw4(f$Cb5;%ceaj&SV7u21Sa!+Xj7#cLefeK6wc+; z+oTj|cbaR)$`=P*{nJYkF=YD`^t)$Pp=c{NtuW)GMjH7iXkam2D%gQplkMuLAa2g16xgTL0vlC=2g5c?zP*v*@2BVK2;3c zF_FIT=rp}jAo;-BlH**hkOklR_iTyJs!#QFTTT7oR$yg<+LjKK2g!#V=6^qIyX(|X`?Kw^2jdD>&3NNU2ozeGy5`E_XzOvsv$L4zg` z(T&?$Ro;WGfLanAiPODy<@a1jsd(_a10WU!W)7?1o*Kh&wBtczgR{iG|pCRdwG7>&tU3bTCjh(zdQ_edYJYCB$g*bI$ zCKrJgC#FO7i#A7)ySyzzzEUHxi@zo)b>A30tZ)H|G`t@Z1(PqIn%@{KP76Q&Z5pkzKDR|zG6FjLyvoq(E9o~Z=)gGKh)dS7Ba zvr@HOMDLN<=A4$Xw~u01U_g!tFjic;`@7-G9TA07dE=B=ZHyrj%GAP?S*x(#_9a@G zvVf2-iupK{0BRu)#k{i-Bx&S&okTQ3FMnbYOWoiUXjb;qatsmYtwiF{dm296WvQLN zKz0UzD1pt1UXVGXX`Qy_VdM}zPiDJnY-uKvbV|SvEIL$;^ssFSF>hYV@CD2|IQal8 z9CE0*JkjIxo-0T9r|bf;|A0uAUuG}136wSPH^C%yR>0(vLO@9j49l|$VFC$1C{heP zKORz>bMXnw6oJJtC$*p@)$e2BT97oYQ%z`qlsI06d+u?c%Ev5>2nybrwbAI)biU&V za(dOQS=epYs+p#5>IX|D$|yi_W~4l-8&0LLXXXXk5C8E{WoDWY4BNyJWydGh0-}7 zpre0awrj04xD{5JH|rT#MQdCN(Y-rXy1BPTsAvW+nNaDfz7px2lq8w26D(Q{U$UG+ z>Wm*Y7JZ+qcnwm)l8jom>jj_gSg#W#UMRLHR-$>eMxZG1PmBZX>v}PIVAI~ zCo-*4_0|iKhL@x?;;1f&O!H|?aM28aHd#>Vs*{??l8h{QrxPwlFGsRmJaB2(`90EA zD3Mf(<$f2^;GB$B_VbmG;rP1~CP8Rc1w^v>rzWr{IVtJm7KOvhlRO#UaxVlIDd6>Q zL2O|dBtM)Cd&K$vuylU;%ORvd`J>`-9@^gr&^(sJBq@L%f&{yK@tkmaHHZSBM?{UF z)(4#7BCk60^SShG0vudAG=I1|@-IVn44kPj5NtcXYsUD0^0RzJA5^)=nRJ7h%EBV_4TR@krEbNpY zO0oHeA2^Gv*9|l4K*IrqLl!_*%0!0?QBql|e7^s2+_y70<+n&8krl3>jdg)cj$o{U zMMs{lY=$2 z^w<3%X;Eb17#3#o``{u&MKqW&R7YPo5NMu1MN$0%8HragS234fD6F;*7^(-Q)dMM1%aYRZkEuW$uQ4kaOREA5 z@G85Su)=R}ky{NZy=s7Y-y;+r_cQS#WycJaY)X!>kLakSYYCmzTfL#<$8 zSUsl3Rb;=US+}5oYfksA!p!USn^2du$bganD2P9!vY!y~3{=2{QIDtay7<;o40I6f zN4?eM1`}x+rN5d3A+T?vv{E2X4HHt3G6gK>umU8{%YztxQqm05@9Bz@Q`h8GMN$v` z^-S5M69}nvWC9>r$dSvt;Gt}IT$Jn(eRTLTR)MwdL9+2=`Igm9>1=`ignqB@kyPLI zn=|@Xgm44_=cf&qG#+UcW2^Ayl00r1okb>F4&p|Br3DLd%z#CFyoDSJw@=CME(K0s z(N7Y@ciWA&L+dEEgSU;6%CVWdE9>UX9l0C~V0dP5<0}9VM2OQI@qv2(0Cp(ZlWX{= zYTZ%<_^fd9oEnD`S&YJAx*2Iq7ZPs&nPb9p_E_-@6HYf*sGtOcG&6T0Y2(}RdSVXE zw*7V#wc_li%h9<@W(?0)dS=v`IKMzZFo(VUKk>gvVZKE3AY_&#Y`JYFDm#v*zMBS* zb7d%0KLxilF5eyy=41aKyZ8C3dV!d#bC3%ZZ#hHS;BjBojSM;%;<^28EJ+D0#Gupg&6R zg^BWjOV`E?UW+Xz3FNmDBrwho-r_vAok99q`!BvH;hxzj5+5y7%Bgt(?Zsya9kS=w zS^bm69RmLyMjPT4!y{%N8JHWX#Bo^iDFt#Tiz^C!uYd$+g`wjc5PlWS0acGYgvp8N zFX`{ft4r5a6Man%0J#4{ALDFWgCBXL@<{x1z2edizNpwFZ1+^q)tmnBSze3&i#gcr zV8FxEPYYIvjKKm?BK_5A3l{5buwr_85I)?*r0mOq0(EZ|m6TH9Y~(W<;k!%7G#4fX z;prMO#8D@WO5IO=tX#uR0+$R}B9SqQpKwh9v~z9iK$hi0QqWX4=`mPt(xbazJ2# z%vX-kvv=FYY*65v^HBD*yeIQXXAm`D(XfM8TTbkyo_Oc0He%G)2s#3 zUpFy+cTeM?4@O3b+g6MYQeoykJOji{N;>N=IX>hjEn9-#Dcw-<@k~~X+%4IR(J^DM zeBFg`JBw775(1+Yj6{xn=iBI#jM;0KU;DQVUht0;Z+kU3dQ=aXygq!chU8s8()GNFe;c7&F62?XGH~9G&=BtT-y!7DA3jGJ$T~(v`oDbvsNt1IxXXJl z;gx9I75&GXK6{9c4w-z31>SR3?6g`Vz;>h?pbD+!^Gpa!kx0w**8t?vCu#2?cRrH00`LxWJnbJ9M*Vqe0vg(<5X^FD%cgd^&s^d{rhHB1q_K|B|aX zk`RF*A{C?bgPncmj)MgEhlPkam5dk;3~AwLyn$j3V=GARic(sl+7&%TURxUqDl$1V z|LyjnSD^`FUj3kL6o4i$Kz#l~MqJrQb7%1om3!Kj#-{bjg6eiO7%mDFE_$Bya;U}K zu=Engu>S|gsIl@7*;$N`70L-}|#Pr_FPLGEJ~_6eYYtC154HTmvc%xF?BEFPL3h zlq&V_o)(K7olx~BVLr@KhP(DZSYCw;8wLa9ky8u;RAQ}J?WUCr6xKadixO-^wHLZB zg=AIi&xI=uT-E|QwXacc-hsN%I^`wAG6F-`C0q^;xBPoQn;)Jue}{vSR|FmG`NjW& z>}`nF^SL1vKv;an0ob8MJT{8FaFZOPb6g_}SLv zFRbn?)a5@eSR^>|7JBn4^^AKqq&tlm8$BFC4LMn9CoQJv(|eP>rgITZu?#s)%k^ z9i=cM#oG|FMd3Q^s(k{o(!U7}O32WWkQNha7#61^01}LkY5uO*uPAsWA9pi}Yr?h|?U_0cZn2xp<>m1ukIG5z%IYiNT85 z&SO?`d+bIwM#CDS?Q+4-9s-4df!h=D4#X zTFjd3DqAt?bq#O$h;Dri4F9SwH{zFQ(B(nLnqOhmHFn2ZVQ;3HqR`{|S!DErff~SA zFW7e1F4%45g$h%jn!!l0>l4L_+Wwc#b~G2+-2&>)Qy$u<1zXlGg||e4#q+x(gND(0 zJ4++)E+$RGyMgM%v~Adc_qw1*d}6;ng;sF-a{+$Ry4Q(=&~=<31d@gSz!EUH(Gzbl z2t6r*Pyj}$Gur#l)c%Y@#IJV;B0T`o-@;o#$j^q?NZ6WNFuF_@h7D)>rv)Q$GyF7n zd(f5<0)E!F01X=8>-hN@DJc)L1)?ijJdepEYUEpS9uHG>a$ZNiXq;l|dY`PHd?!Dq z3@|+lP*m2_Qu??1!n=1iG?qGFelM~phWuGQ7_S1lmR2oeA-{Vr6WYPZj5XE`>OqNqy3JIRdBMk66FMqCxh}}m%UDLgwgId@J4x&` zX4d$4lc<|#`V+Kyp}dnHAG2S{khsxUScWA^c^Q90DybLQzk6l@AiZzq8QifwxVqQj zils5lpP+PsJbVJ^D$@LQ!G)ILdIz`yvMie#t{JG=y*2~C%#FT%9z=CK8kcMDH-E4a zqKWD0y=A~v-w6xt9p1)b0canp8ps7uV@ zXi5FXyLe*pslT`f0KOb%8j8aVc<=?)s`K^^pMF~9jXYp9Dr9)ACUcHO)szu;Dy~P- zyq`kQql4;Oh3Svixp&5VAH(p^GRH5q__ujx6)H|on~Rb*Et4o7YKgwx;(21nwWC_& z!WCjTbnOo0X-T87Srr_W%04@a*(m?ebQBZs9sQ>W?S`rnK%gF*iS=7J#tez)CDf~B z=2%z8g-3E*nN4m=m)^akj#XEJPk`3seW8PEW6PB5`=~|bzUGZyuyIrJ9gXuA zZc(MgXxZVo%$ZJAIZe$EllDOy`3c_ph4kj(y8EhIzEVRDIeE@=c1+D|OkSwFHC2b7 zkS|QeGD?;MpzvW}Z#2)6icwiV;{2RjLH8W1?kOpSx4)Ub@mS=Zd%w1Znv|_qG86}3 zbb|MJ=1z{WlWEmW?nbktq;%M@e6P%Oe(Jgzs_-5LulPRAn~UOh6xg&(03~xbQ**qW z5Yh#r-;C+HFzn`CPy*o!jhcbAq)B68qd=Bj?1jAy82)o+s&U#FV6F2=3gb~YPXWsG zNXL7u@QcUqIr5cWHd3dAf>O94Zk~Y_dv`OfswZ_s#wVrfIVSZ`%6K#1qirfByJW{% zqHn+m0Q~l?xyEO}?7erPGuM61Ve@-*(qf<`J$}ls<VbKQx#p40eWy;eSM(q{rhDN@vOxWzV}OWpDbM&{#&--7QS} zTS$xPs>eGNCe;C1to_CiP@?Y${#&JyO#u&Jz3b9xw95h;V515HeWJ&mhC>1snn;Hwk59KN^_6H}Y=--k z7+ep!%XKm<3+>%9SQ0Ou_|rhUiR3=2EWD!hm@ELP4H5#pFpGGJ`TuWF0Mbp=Bg8p2 z9+p+a&C9Ut=fRr~L;J5featt18NT>&a}cL&A0on+arG4UEtbs_-G=MCia~~`MT501 z6Z(9r&b9_jOFW9SSMfw~5G;qxDufu#?aWC&P>pq9vMU8px9}&-k)t%8Zn-?B0D$%( zY|ll64Eg))oAM@UZQ>6S;B6hpMeI^fEE|ot>z9{<+)_}X7Gfz>@0Sd-rQ~Eep$OY< z;yI37prKJe2UV4E`3Wh5kf^S%35g0Bs+|3Zy*%f7d{Zn(f~_`=Fx|M$U-LWC+;r<7 z5X7D%y5llX^v!3t?UUH%&ChzbO#T(S$I%VjZ;j4r0_s+(h2&Z=0O{Xdu?F>&s&xsq z7!%EA<|9q=pK)cvsJjmcjZe;y++Ux}d%4g*Ys&w)uKVr1mc_ul2rBy_?^EJcwFlxg zsrCsku5Q<;8Ahqeq>ZI|Y3J(lIqC}NhHU-_>f;03Y;Gl+yyR?TE>YcL0?N!jH}k$E zN!ufsIa^?-goBL*fWJX;%e+t{=SnSmhB_;WjqqLJU5C1l9A@v^q6=Mlga+pt`3+fe z7t?7$J~*mYb_n)LoQ0VGJZN?aa`zH~&m2xslleXQKsa^Rf1AaSU-|G)iP_G_DtuBo z$dYBF#=A{k&7KUd!^v>8bER#jh}qyB43hezp;sXbdVZG$phG=+!!`T1mt5;z`5S!W zg|%d|4`qWg#R0D=)A_Ku-^R%3M#mEc9j++Ih)^A}r!l4=1~+XC*X4M+F9^?7@k)Xm z@vpSA)y(Wp2G0BElY*M3fBUn-6nsSXf~aBZpzitx{rlE)JqB)o>Wg9(N^WC?Y83mp z^{|rYd)IGW0P$)IB;|-Vpwj+%PiGipYoFL8Q^I({JeKVwh%Qa#;t?y`Zk%)hlI{Z~ zQ9@0AFZlL@&iTtUf@5gP^BC-}s@kDV-D~sBRWc2RfZ;5{Ej*t_Y$1aIT`(V%~@YH?XwdfdfeX*?|L0_WqxNH|3a0v;D~;LdNDlP++Rp_*Vz8 zgqe$g8HF3{5GC#K6SjE9of5qX#pDEkf5Xl;#Jg+vDQZ9p`TJ-vPkwNc`4|dMJ}bGI zk^t^cs?ct|sU)xcV>FVP7}o{af9-lr%#28LZesr9FiCZ)uRT2d<-DmM+axBS5D}8@kL>1^=?A9N#Re%g~C$8svmW z4G_Z#5Q7X5!w3*V3=q>NkB*%tj;NMY-vLBEvF;W=u9`^nG=LY75L4M$Om;;Kf2x`% zb@&X}NQ~UwmZxc)%ZJ4NXzy@>FvJPH696weC*0O1`Dul#BV@wDS$8 zem!!^N?d$Nr{A8>lx3TViSxi~vVHD)2dT@rQJa4k8JnA&&#%t2`_;CNKiUxMH3R%* zUv6fkQ-;MRJvD=SBNE@7sekC>Qi=5=igA7HU6GMb1AMbp2k5nj>xL<`(-=u#hiU)n zvbVs-L?0XnHyof$j4CzWp!VFh*In_H&G24yo=b?#?N|@Q(6PaN+xS`hARcd%(5N^PhXL#gDv-v{`_DUsgplO{u7wP}C=orTU!UKmgHVN2 znZ1dgNuLnm5CSHM(7Fvccn*T&m$Ir#Nh`G|Xkoxd9(q@c&-GK~U7D4kEM(FxNhLb# z8De^gVl(y`_tYRpieD|^=fl@i5uz{i&4ca-qByG-{NdNzVv|uY!UphcjsQtUj=-2V zGwcq>qYy0a(Xj@z1ClKafn`|vpKS8DWp|NO56Q%-%=e^hbe0qQ?N+u)6l-5vc`NGo z!2`xyL7w4j)?v}7d234N?nA)}CvkIh)$zkcnzD62A=_6xnki}K^_$v+DibXA_+%Or z`d{win>Cqr)JjJ?5x)KiiF;AT9}B+D@ALA<)c57-qJyl>WTD3jo9bC12vs{%tmYa4VL$tcZA2Uk3PDWc4O(#I3h zQk*qY$Uw;Xef_1V^aWUsl#7_68!+EK$KOix$f&}#stcteyvux`TXXiU`c&FM2NJ*O zM0sW_UfSF>Jlb6S4(Eb7%X(NW39S$f?RXPrH zE|)ngOac+^XubeGUZ??u=fNudVl*tYAqPd2g0@4#CME$Ou%xd^E+o|0mV3s|{8xEX zcNA;A3b5lW0S;}rH4qh{p2^n&@SNR_0$zA>2`aY_9O}mvFp?X$Lq8Jfm%NdjD?LmB zC<}aQ4kU7++{VZn+iHu%TKD!oF*$>a86O&bRWeOyzZWA7`b}sUEnq5ilrVCfAGRZ} z5LA=8XBr-`kScm2R?9K(n#rcLwMA4hz*GN+{+4izuk;8>5m$~I$^SvSNR*`f_taVN z@wwtc@x!J=ALt2LE+q0t)sF2j4|f9DxIm0?Om_h?&4BxZ9cIg=oxt`Dy!IqT`D7VF zpO!#*E3~yeUpQ^90%?P;4aF?S9T|Z)wV>5lFnJ(gw?WmkE=_-1VC2invRjP?+2*I@ zc4cvu!fp6|A;E3s3we!~{)q`hVT>mtaKcmFTC=&sA_{MWMf;+SadF7bdL_JZ5&lz+ zW5?~-)wtr+zo)_JR=<5G`kM7NA&`vnU6q8Nntn}>;LSzE(DkrJN*^@)shQF2iK(HB z{yYTm7|uQr@3igP!I6IP{X~v3NEWQf!KPinp6xZ8e;pNyq-Lulh!b`jnZ77E-#R@D z(~oIN(ZRf=w-k});H6R;*kAuI8+k9yF;;$XN|W*WaRvx1id1vRW>twk(z0!yN;g7sI8nPKM z)a)pi;U@dF6>9boH*PNZWQTVs#5ottg{Fs!Q^4I%d?+4%(y^=$|3xFK{`a{r!)Djq zIxB0pII{_kCq4aS=CH%|OlpFwqn$Ph`M-orF`Gi`#q~^~n?ZsGErtWA=qo`2C zzsIsMlaJ)KB~h=z40FCxJlbur@(N zPBaO(@4@764SA#NK&fBWWSZ>@)ud5mN6UfmEoolKH;q~_KI{Cjn-r5{&g;*pwoK;} zI>w&FhI=@PTK7}Nbd zJ>wRph2yEyGj9!frG=kpuvUlUB-twX@@9>$Yk>6~4?||Z;^;KrnLcis->mOsAujV9 z;3%GU#f@?h9txH+1(_7P;=7+=#}Rd-e_^2w#W@Gh1|Rnby8(UJOEA3vcD^Wl{t{RD zVD(JNl+7+yJPk*A`*fb~Z2F-T4!+$Fi0+hXcNdx%9x7^|LaND+FCID>rCo&C7TT0g z_*o?R@=tshD!zPC{;mJdiWgq}ReWjt5A#Pi+zPE%f!IscdMmjpdu_)zWG-CBByA_@ zxfflPJav$mvIB}&@u)hfx~(d&j>V{+d!uixN;<>D+?$uT3I5^A&e8vH?0>dxUf0(3 zl_1*1oI~+5halQ}op@9-^N!X3`MBuctGi%R5y5iA7PA!D5w(ic@JgV*K8p9Em9NMNhyHrag6sk!RBY!)?r~jGEt6k zhwm)OdRknZgwJWx=#FkH8`v!w{{3`4#rXKIKHrd{xOj|LCaxo5CGJ8UCA9={HD5!c zIZ2o54w)t(hWq(ojpcAE+R%x2JL+RJ%iF(`3mrY zfY1b$LX7@(I6_vp$=hx^^6I5<>|4@_A}EP-6Z)>-%p%>H+&cI+?z@9Nsc${)QqRMJUTP0elQv zp$YB!cq+qMky2rm-NMEGpJ)3&-@^HS?f>&F9RJt;pD(t$mP@fxp;cX$t#@Uwu#2qj zRCHDTC+byX8eQ6{Y@=zr7haUCRRGE>nz^Ja=C?F67SBk_#hlG8wPd&^PvAz(R_Lo_2O^2v@dP zcEu9sxR>+=10=K&Lx&>@FNK=`v7fT3NoFNK3IeNmoj z5NA#mqS@Vx8Rl?lKT6+uG;SU4pl5x5Jb6oM@ty0P?HwTdQ=0Z|fr25_HiSSy{eQB; z7;bRO8cuJmt8q;52b;?s{}FXpCOAz#grpL@kwF*U(9!aw9+ZEHec^4uywM*Q^Ch`P zAscD#`zr<4 z3v!5j;G%|b?eTaZSa6x*N;o@}CJOd2%X`UvF}`l-AMZc1!2HxqSled?2Lpw=nVBU1 zl+7B-4I=e038|$EwhK57tR+bPq*Pr+)Nysa02EbwE6Kb%-8#$Pl>8twW*e2`8J1HE ztI+P+H^<+8VIAhl%{=Lm?A)a#aE0J1z4ea9G*}6{>hq+}y`SmmBCH#>V4OcJ*3dnI zbxtL}i!7di3*Htx?!mpW_%eIv`O$g;hDo=w-VroXXtLf z=iS@ud7r1^2iDuVNX1_&=3EAZFB%u32N+pn{4DRsF3>l+cj_r7*a&Ujfc zSoXf}RW8wX`!CuWWmjb1_ov@(Y1~pNs6$s+@}%h{=c{)9YuZ*S{E%l9%&m zOFzK~l$tCcek9^|HATZ97rjx)=b2=it-4(=!~7nYhE=i_ z(_#yGnT`T2&^#EjZhAWxh$$J!zFTNjIDys$^EK_A`ISu9*0&<=9*og{ zw?O2TNlRegSJhX~`suR+; zjICa^*ila9bBupa;VW*OfAh}y@7xvt+{0{yhHkcqeG2I~PjgtGKL4OqE|S^zS*sDr zu1Jhq6v&?6a7Z1|;1yHK4`gE1TT8;!Zi=bA z{oZ8WX9=R+2to*=+XzAkqJN)%f;cf1-}r`G&DD^ERPXHVn2_q7#vS7Bw7mV!$H^6i zbi3oE{^iaA?rL85Y;aap0Oec8Zl!3bDv6Y`Suu-d99TBdCGd06oLR4Qaa6B-aa5N} zrF-nyFs%!&n~|=T6Dc<%T`g4K_lkti}{4U%EqUg0#;M;Hzn=m;%{o( z%Vc-F3DbBE{l(vSj?2Y=-*}FTWY@IEPLtcgJ{kMnG=5H%leM=I)t7(i~Rd}U2 zeYeShB+BnzlbCY(m1TyF{mGPHV}DJ0mrG+KY3tr`MzN7`sSraspY6(nz-l>V^-(4( zH<+~v`_V9DDCJm*lm9TsRhy%3SH~aWxRyFr6L8N(U7UF)?h2@XLr^FVM$-@R7U(m= zb?4YEdbKG0HIPb;vH?V?Xt>@4T`EUX4EPzcOE7B_c6An%R?%9npe7IZ5Ppv2Zq4Ai zqM+_%@R)Zqc=Rd*uEyr7ZupYl{4r#|KHZ{5R|N+ut64<0@AnLrY=X5#cJKZC+ws4{ zr#E_xt-yXGuJ`PJWvLZdX~uHAvWr348T?Y2=;u=R?LslR=)1P>M~>uUzbmOD9Xno4 zKTc?DC(7tcznQk0vh1s9D=B|b#`72XJQq_6%!B0<3%OV9ZhFO(7?$uMxu-CV?T^~7 z9Ye?(jUSoIm<;54hsvAATV*$mU-Kr-9T(58(Hs&nP0~$&DI{%@N2ZpXgI5S3zTF|? z=G`&Qe&4y#?}*?It$$YnH5vvLv+3;vv+4XAj6*K3Q_Y{Yt1vF7)$H|_vQz>Qy!EZ@dKoGxE+u5mN$FBKaf%#V$+ohdc5E>f#n z_*%90r)EQc=@Rz1$$!38<#E&0jJvB`(|X;ZtgD&pDJni>zBNX5f}~8{BvpR-t(N9r z1(lm$zYap>>X(Z&cl;?$Jlls-A{nv8KWw8*F+(P%t;sBM-$y00(!#98Cw2^;Uj#2! zHICWq#Te`JF+kENpv1R>nQO0QFkBI(b^vd2e$xzpUbTqn#qG?AE%w;x+TlC#B0}G& zv&f<(A1+HELwf0Zn$f^$(Ikly;zTaBB;PbIU5Gd{;PTm+gXTjoQ?~9*I*0jkOoQ|T znx^(M&o+`n8V zK)H9e9l{QU(F*&RP3`xKzZ4;HLM}E9I#~d^$*ANY$w5IzF`%RROLGNpwm#b*mJI?q=2VLdaV$%mk!= z-`{#1cP&Ol-l#5aQvLNyEeumFj3Pa%UG=d7Ubo6)$UQP-2EHn<47&a)dB@d3;;Ps- zRkDrJ$SR|Z(*rD}tc+)Sf~)G-PEy|dG+0}N|HZpl*7)hs36%Gow&0lpo{$#@$j-af z3SxWigP$Fy|9v3#!Gu?`<`p((;}mPjkPVN z5ycr)BF9Euf%M;wxk|r~)x;zk3e^audLv9fK zZw%_uERFb-NCHnrA*bGBr*gMf`HlJ-!W&dp2!@a`1HeU@_c@BfceT0~- zp0@G{>uoRc_tan$+V>!cbLRhl*@;#B*Ou&7%XYZbrY0#_ATVw71p>+h+U4f0;gX3T zlWa&s9_GFI=%ofu$jJx4hzsOiQ*A|yI8{Lh%i84 z47yRcahyVh0e3eHxci}q1TGZ}uskH0N<&g1uI}!<`gn7fLl1DpQDP_WtGx>+XM+e6 z^eZMd7K$?_j=HGMhK4(mUDTJ_xTunngN>icT1DyN&N9#mfj_8WY_w!ot)ergvObfo zK_FhwNBH-k(;D`47`Y{XjJE~jP_}{Xhbz`S4Y8W$X0M69Wi(`%)pyWWkmsHccD-Tu z*K>{H!Xu;a(SH`U&o}?Lo?~Zt?3v~sdm=TtAsz?mZ!ad%YdQjxVw--ZWYUvAiIr0y z@)YExmEFgqQSB?>p6Dj8_cN4DGg?+Jq3OcUa2qRUVw1nJWDUrFI0VRO2Q+($++r!L zMvb}?Ip_%n_**)>*{BV&e5I~VGTms2pP!ks{Xd2og`)ewGyN*wxCg0JpV&X0^ZasG*ltZ3Cz?g9Bi2y*fm27~E#$Fk35LH~r6za{FM6b~b4n z7C)7wV(YN=&01RQfP^pcPbf0#z@d5T9DZqGG}=B66J_Gz<1jI%DYgzpxZ=)!-izJX zlBQxenl#?J`NbL}w%`58cGaE>B8$y_zS$CCpXHF>Lc_a%1~|3%YIe@I7a$} zdOZIWx~tuty*qnh0hr9_+P?Q3Qr1+760YRH>{#D}ft63rTh^33Ne&N(q;;I}PG0>U z<7=P~TLx*jc8y@g0G}@y#PD81L$?-cx&}YmsE09BIvVxY#M#hw5jw)%5#61;BZ?~w z`68w=*%-Zl)}2d-{k~l>L0YnNs%1y31IrtsD?cT^k^c3M^}aQkmdmbp==kWmieTS- z)Sd%eS2 zRTom!g4gqBQnYUxpEK{Ef5C7CZgf#iJXS9!`OP65Kss)GWuWgX0a+3;Y0d))aVOJk5NVt;i*kvRM1Zx};-K{YPs zk9y1=*;*rUhR5uedd!o=^ar|_D!k!IXuGIrjT#!FQ7Z|XR#hgYDcJgmwp}ODZh}48 z@14kr>^o=oIjN74bn0Xzomz>uTPM+WYbDxVts zcm=Aarizo=&bjnU?wvqqi%t%h^~tipJ#|4Ri!ke?uXYS&vmr?Wr9{Ogd)Oo;wLB`w zjo5@U+wmR200@ZaUZh4xT#lX607iqC&yL~(E5((!SBOhfC-L}WZLkgV2Wr8Y_%Gs-xO=Cd{Nb-|{P1|)@n-ZRl-|?xxQu{ZM_bIzZ z7@2w>EGtVQbguh~_>~{Q_b8&x1KE zQ|xa@mDPeIJ~en729%v38+HLy!g88y$R^JK`#jPXbDv@MBL_;!njs%Dbu{8sUSTK+*ob1F34Qg)7T0XJ&w(>cNI7|3GgeP&A zSc`1WR!CZeaG05svye%eu?);t%U@7Yp;=H|o8Ah>+v)J8S zc^3K%lCms$FTM)Wn%Q{Lmm4t59%v-LqdOPdJc$C5y?CkhuUyjoLUvw$2cYi-9&@~D z;*^PrE&5?gk1gqwI3Iu}I|5t|%}-^WrN0L)It?1n+8!Ng_fTGr%hVHBvbvLRHa_HG z+GHwiJzoKS=td-rvb7t3ClMqiIU{VP6hBs`;%)g>F4^As2u4!_j73^Ba$X^-waLuu z&AiYhEGlMf;i*fVWya?`*Y|;v4hiO7#|h^B5j#gSGuwm|Z?$K@gzbpWj9wkXAS9Tv z`$H)(!}hj4J-$x9kTLvwawcEl0ox4DE~xFYt8WMVp6f18jYdy@P+Ir%Z-(#UI|vwn zww*kWzIz7$>xsZabN#Tre%M(*?5-d7)(`s|J6fv@dP;W3!UULNVUzz~T(4`i$cUX~ zVweP;?&UA@yF{jv7hJ7$`060)&?$8I+UW4(IvmUwp~G@aqst#f34x-(ex}K2N2iml zx1{V1<#}t)w)m5OuL}kq23$Ep^`3SFA;}N?T7_9WM@yYxAJYXjdmnxr=N5A zarN+z_f{W|X1_>gKQ~&_U2CLb{{th2q`cmXoe~%cNh!7WJx+xNANjrr*mruaYM zhg3*x;g^z=*NQ16C$GIC$P{gDV-CObIRMKmjP&fUjAiH_kjI{Z}zMVKP-jWWB6J%2mLt=;NJW2xc>bcpA zIQVJ+4xXL)!@I(~g6)ic3<-G-7u*|zQx4%HtRI9rD8IXs%oB24ul1 zy1N@uB@0>QE)RgDXRo=pC;PwLVg{Cuk1r{LGUrQf5il#aSiG8!f{Kq9rB5Ys2@+ zI*(ruX7{7hP4kNw(Uh@>9|cvhI$Rm=Ug644N#CqN+27_~4Vo_w8?CFz(YlKKQBg&I zE@hoErG-o(8~J(LK0wsWx6a}%kNb!Hr7jZ3`;_o)HTh-`Z%#&khgq7iCk-zp#VVxH z3DKDX1yo5haThlrY8+r-b5+1SKSYo;)n;fcTXxQg2BOgYCkiwAj(zB7@mWJ}ysK z3eeAQS>P8l7=vWSzblMfS`6-|CBMhO`Yx6mLPY*e0{%J+mE!KVzB|wOPL1!s*p{p% zzv0aIP1!c_fZc;<1#B~b_==Y8KS%u2snxZXmeKaYlqMOO(Rq|mfut>XDpu=%O)MgI z6O1PVS>A6g(ta*d1~l=qmmnP-6%Vj6i`X^n`E5s|)9++p-@Q6sl?jb~f1L4E?C~i| z+!pn&4g5(~N`^3Wh8lUU#QU%LdV9}>FY&VXV!=8@ro55Ox2PJ%hI~f+6okotS+n}- zaq=HBew>nt(Pme<&m?W}{-_FnyI^f8wJMnzh_f5a7F&f#z*tE_XSQ#L4rSTwK-zZZ zO~!IqXED|>*Ffz#JO6=kx=1K6kiz(4XHqTg#IqqqKE%Gn!M9rC*()9r+qGknWwCo1 z6S|~Hy5SRKE${_SzwqM0SftGK=Qi65%PytnKbFy9D~#Du>@=YuQF%UpzCJP$ZM-jy zb>w{t3`yXzJX|04jbQ6|e1X+UySG^pMp?sz!Am7TO-!$A11AC6MlCpcE`EzBdq4hC&^~g#s4!@A@M~9uR#~AX-Nal9tW76vKi{5lHB`7P{0Y8w` z>m{jmtWx2EmSbu2(dY23jg{a?WOZ=gN-%TVv7rv)2h*UNfy0Z$eqx7i6y)k*Z)5;~ z1S_z|ASs_8dd3R0K7EjJG#!Lp;!iBX4q}7c$lvN&c8&EUD?c=qpDV$hfNvxfUptzTX@}L(ZO9vXb{zZf zCht|6rt<E1P^HtnDafX!HN&o6);FhBkutLQXO@$kZfL*1KYFoDkNxoOa2y zN2Yx;mD#Q<^cgCDwfF9Zy|Y6^;MWm*w?NH*5cnTx0))7&XtQ0R=n7>%62r9pSNlCB zEH8x8^e=vF%xNn8t3-wW1r`3lQ6blu_b)|LR(nHP53Hjm=6pqlE$yBq^?aK5!KcKz zPUWo0n_Ois!V6vcW^~fbC;9am@ONK4bZ`5JCu?F5m7=|WB%#n0a`h%}#gJ!;=`YpL z7c)lEZ^StOz(fXcO_$Z*b6G=hS=|zs)w$edeal^zxprCW<9a7wDqNOWU$8A}`SIa{ zPD@+RhuoH8&@<%-mZ}iYe@3N*H{A*Ej`Mf**Y7B*n<*=9V3ZA|rMqWCWjB)?z{^*# zUK?!hIf|ZtecE;WXyF>G^E}1!>?E}P&e9-;(Rzr2*z+O5bw79cD7n6hPlYmGgkPg% zO4H2po*p4l7D8Js15Ek*24C|(d5l?o+vw|T$xoGeAfvBKPnkf?&-{$MFO;9(r^k^G zr$R3zI|^doF#ocD)0M0N>*j?!Y}JwuDEoiVjQ!t#I$|oSus+#IN`H!UBR6VAP}-jt zp6~tzISgB2r+Tcn3%B#tx1UqhXu1WO|I#Fd*OlY>Zimkc`<8@oYb!X$pw>1T{;ScUI`mBKQ4($K#*aS%3S9=g8_w)V#9Mp9T} zc7`cjSsKGLY)yX;p4+qhS{x34O0$9g&)&5*Cyp!azl4o3@Nq7lSvIqCD9F2~>U>cN zTLf)X(kI*n9KvF%oMlKoqMc2X3nx4ZR_ zE`NAoOOR@q%QiJj*o?-THY&pRncq}X~$ zY52fI`DtO(M+7YvK!baKqt!m~rd{F&sZKqQxN-qn}m zMU0ySk3#DINf`%!Y|a>edqm@hM+=RiaPZgVqm8`rgFo$|aU^wklV8nVcw>{`!v!Vb zlOwZM-;ELHy7Mt3M0%$W{R$brNtdB9Ki3t~{2^PKnilVEGRMem5?*PD4VAJvyLP*OfZxz`BwN6mL+o~8z96ag z0)){!=)NMUONE;Rls4v62q`7xrtPxc6vJY+u(j8@W*Qx%qb6!_Hb&E_Y|eDfstT43 z&7C`&CtpmYWjfHj8NX4o+bpsPqJ5M-I+v!EdqY63-h(A`3gi;0R4m!UM4DbTpV0ZC zN|P)B7Og3N**F2taq}TIZ?~J#e~E^6dn8)sTOAG0(?7_=_gJ8w%C+v{IY2M>Mj(&ue2VeYy zO*=N)r`on$A36(ky=>MLHpVGg-`ObGaJ^qEdO%0!Ef!`#bN?VXAgR^)%4W?UB!0>l zUgJfr>Ot%OP14M~fj;;PKNB9o0y=FYHy}Btq17prkG;c{n(d~DpTq&m@srp51?hU= zho4h_f}eNj8y}H|Ncki2v4}DXMJFA3zl{ZXy7@5#DEz{~-lp-5=c>3J{tr6)V(OxS zW4kXJj@Y;_8un}$IQ;>v)=qx_{=-gxPHC*C$tv}UF}hQ&9oC6_y)J;MRQ@fP_w z%RR5h7Cy1eK6<_ReoAt-I@_oNa6YhC@pGJP;^GDMl)R0|0G4{uD$MCJB%+RgOJ)E~ z=a5X`DJ8#F6l{Po>U0jt0G?bN&FIrAS!L!BRe{L_rkHlqfbU2VNz)`XfvIy$1~4_C zF~^12^I=hMNBvBFPZGF5xnPvE77|`2H&8cgYQy2ruC>fHAl1OFxO& zz9~QSnq671JANG_gaMVnE{{NJ*A|>9HxVLD9p@ zkh~Co#j^@}b<3$b-uYDJim5O6+_i zgzfR7BO)v7Z1T{2A(T?wGtayQc|Zftz# zk(y&0=|`}Q-Bo-blP1e}2118jJOQD}9G#%hWsFW>Xg5X2cr+QJV-On6&M*^TB%n_r({llsDkVhp|{!}78XLO$vnH6 zVRy6DEX!%W$_ZMA*e8o53`m-pu2mIR60J^{#7_teo(A=*0;DEa)=h}!aK@A)J+nd; zBDX*U2W1h-NooWv+xBss#5_VYpcxw(+au1XPH^34vTfn`?6Ge47d3&;W;31G2fO>~ zTGev6vvBHvM@iL{Ys;R~I6!Q9$HQ05@7gLMY*!8 zWe?GqElsD%KU#70i`Ue3rEO!jph~fyqobudeKFi*+cpnIWU8Mp%FzIp#_FbouMCBs zp{5kmp|W_Ci-PnH#<><7dI?!uSK$}s;Y{yWP)2fp-mk>COv#+S7=u!BsOA}r;c<2z zHXR1UU*~8+!X-(Wa`hy6ag|M1Z;7~RzlhyV#TCfIRa;NEu5%ucyOL5xv@WzhXgy+k z!re8_ax5xaNR%1Q2CIBN*r~^yS>@d71PNNj*@Dj5;>NNNikRKT%xdRjf7(M6_GJQ0 zi@_v+F?&s^EBrM?-2iUqz94b$!3<0;!-T^P-eznE<0tXj2w3~uhathxfhh5Fl6%dU ztgL~};ge<(=K>Uhs~p0FY>a@nze>++d%QA>y&lsy8lT#Y2Y>1^!{MUwW;$R$3{0>f zFf>@-o?+dTSbcM_4jI(T`5o4yTaXy;;m|2iNlx<3#Xc?j&&%`w1ugc4D+C?+kPt%Zp zGEk$*`*0PjJk^rM|Rbr2mp~aq@JfaDxQBQ>8Oh@vL zs}CgYkB)8eL>Ob3K0bAAw3)Ek?i1405B1R5Mx*N*jm|L|UC(HAuF>fFrlA{+ADCq= z)?cHIKebVX8T><+8QdIz_9tv1ZIl@VyaJs@lmB!Zf2+~yH-k9dI#RDnKns%N_@D__ zoW|8!uzT_uco#g$xlgXcw>ibP0el-%=z9g8Li%P3xtOUGj4Bk2$`;H)(VTXpxivc6 z=vSn(E>ukX3S$wr_C02ep-SNCE`Gv{cWr;cH?aGD=#8gC#CHEO1$X>t-UpzTUHU&E z`;MEEe+(`|Omn-7cAn8)oD4j|Ca9xn&4Z&fSm6)RgnhBK{b%;WXXH7MrgHRfI=M0C z*cV7BK0g6|k2~1rR4Dc`(yQ#7X-andpN)inB^x ze`K6PP|C-pWXEy`XKzL@BqN-y=5vx}C}aQ97jD~`ohV*pd~mxs`jgkoT;%z3U(j>0 zil0$N|Aq5+k+vCDDsjdZA^gAdtx5TupN4Y}78LwA((95~-bF^eqOsPWsEmrax`l)9 zAH4&QWHhfQO98F&?Uc-UIbC?WQcmIPf88-udIIK@gh4hE+kSVGLK0ES;;$BomVYuH zjtJr(@M;yy(9BmPzMH5Xts(BNbG4`wP2QESAqMYSc*Y_7TX)^M%!_FnQ!To4Aor;x zX7%jt`1SR`1s%Liv}UzZTW^}kg)Ysg6i!pmRAW)YOk-OX`((@FBAyD_a>R3Ge25_h*< zH;{KXVpmi3ds{Oe?02_OuhJnbf6w>d)bemjerJ2a3D9UIs%7k6JO(giG`|L5BeXY+ROfW08m{)z_-!de_&+i7g_`?~1F2-@69i#4taNzUyUO*4m_Pm)vKUBTU<*6?LRDv-cW_ zC~a2X4b=oQnKDtUs-s~|?A1$1m9TndC=|9@rFe%0Ysz7Q#Wj6mcBILAgH5!vdD zfKpfK`fbvYp65)`pi9jQ(*34UI?Ct_*A`wcQ7Zn5a@?+!Ne0>s?5{-x16O~eo$4Os2 zIFj%27d3(~ktkjpEEP2m_~G5bNL4vV4{_KhIM6EQWj!R87C%5#e=gF8@Cy>9D$2Ag zR)_prQ8qP^Sk$RUZnn*G5?Mt}3rJKZEg4H4kn{*;uS6LKycU@PMSBgY-7Sj7qf=a( zDU_Sx=SmQ&a{L^^Sr8oXVc6j&v(l2m`cdTgLsVj|z1v}xnFp03vR);s8Z=;uGlq5!q~c>C5z@yc?eD%XMND z00(7aMXM{6Yn?-JYe;nLEHSNF&uECmB}T~0OmGTSSDE_ue|AY6i`}+1(QeP-3}bBq zXBBnxHS?1$%fVSjpJI{DQUHJ|0Pc)!bx;mfpum^5&o&LeJ7@K@d4 ztI6yil;bB|fBmwaJj^r=*ppvOiAz*5;e7a$nbP3ldYZ9kEif22^>Kwr;Xz@VvX-asR>Z~8d( z7j#XAr7tS81`z8o50lNlh=be(+CXdoa0pBF+ix#9i06*9ZjWl}okulEtt39&t;gTz zDe5C}h19b;aAYr5_3c6Jhu-v)tb2XUqh0^?bNU(ef>ji4y>IKay!!4(*l*uCJACJC z)!#XPf8p*nDc>GH_;pl^UkUgM9yH5ZvF3_J zJ`5!B=~)h(W;OhfR=F@yXl zuT1n_)^cai*(vrM`#2z?2BLE1_Mt_)&(_UB5+UsSP-Klg2mn|U;K`m$T@>;FP)t_JEOU)=~y#Y9Hr={!5fm(LJDonQW;yezZ#``M%B&?oZG-ATO4atew-%~BzK>ZC(V3opMF z?~S5mXm!4m{10aELvTmwi`2dnzWbS3f2=m+|8I(y6Ot|2TZH59f_;Ot>j?jo$heQx z05TdIg-l++Yh6Tr5q+AKzITI=6~UtNkPYH6SwuLFt&SLb|72`vPV;VrmpkuKofYXU zjDjiV6BG_YHb12lhcIb@pJcRPPc2}#My?lVe+ zA5GK)+t!WA2H`MFeBtwS@GJ{0JIpg=cWkTEwH>RQ(}?UhS-zkDYjqw|9A_dR(6cP` z7u&nP$hwW!G~R*PSe-rAM@WLw27b>lYvNe=AFWQt1|12|GEYb1e#B|ie?}3sh60lL zDP0Q1&`R}tp_|V5u=t^klwZQGm-DwnkqjXB3Xob^yb$PBr3Di2yBW|^rVyb?8|uUh zXza5(a7|-&a|(3>P&cMB`wCob%nlGLlTM>QaJE2k5|CZw^g|sr89!XR>KpQx{!L=y zz&VTOiOcgEJMSIXTM1f^f8LFc6tA~eJRVG=mC9Bs02_*3G?}rHNQfA~^`h5IlHgq? z=;GSZ;pdyPkRWk@^pS)HXS}G%^0CC?^5_%C*V?uo1089UIZ`FFiy+VKQ_ME*;wquG zWsm1FvX{Ax_#iXo?K63C5U3M4A`z3h-n6K?bKZkh7qO~lYfXKje@eVob{|}d5v3(s z+CfJGw6hBUdMl|1;A$wZjKZjO{BCv6q0~coT`7+b@A0#i?;dVG#U!mveRL zNmpn0a`db53b0?&3& z?}*9*UH^`}lS=_p60*@?Wl*epz%#$`jHqm%#+qF)-2CUCY;|D`&|gWBTpz(ZaAP0d zusi5$Q455>8Sr<@x5g>pNC~`#mPttct@v~OJuRika6dq#E)@3!Z1fj`g6BNU)Qcw5 zK5D*D!o7#yf6+rd)LG)zep4&r_V7wr%a4Mz-6 z1yTvgQvqqjw3{wNO0rQPS_))T@qwmRG5xh7{G4)tM*l(IMnAmqH#%nBBCYn@NxQY@ zP4;)3vZiLh`Zg!RH`P+uQZkdBfW9GghQ0PbhIurv1nel|xlzdede$<;Mrnn;0}S;B zTA~-%e}OiNXQzZaO;)K-+QRg;u%(Sci>(a-H7`L^e?ta~SGb487vYd|^>MkskKGF7 zY$+^|M_4*^8~x3Xhl;{KwSqH?Fcu3Gx=nc1DM(G!XK{bpkyl2@b*>NhYmWezLi|jT z;JUb*uBLH$JIMcM?_GNv$FW7xzmiYWGlSk6f0iuCQlT+GJzUf7s;5FrJ`z0yamfxbd_>iNZA5}?AuC++6_d_u~Pb4@UyBSAuuxWym**?MP zLz&=&|Mas`a#(Ase^b_#F;v3P*d!>U+irR{ml)T}u%6ozx`Pr zk{Sbg6P78y3)JB`ME^DoGk?j8aDjq24ZhOxhVFcY6(QpBjHiW7|2X*^8)Ncs`6cy? zL?9sd&_!S%_ZEGZdgR~bp3ir&#LU9yFw0py3w)KMBeae#3$#kuv1(UmCk}(r#sRp2 zQI=Eo3Q-c3mIIB_j*q!3=Rl$De-yByu7gLNApyRF;-hQF_KLm>sHP@+&HQ=wx-ir9 zgCNXvQFEN9g}DuW?4s9l7~BwB3FSh8pLYUeL3idfl(P7++Oz1mv=M~Zj?C%s0qx+? zu_JI$w@EKhsA7;Ytn)B5;1-0M@eAK`RGC zS$8f5DoO?}sKgY++jCMH2T&C!F8TuoqR3INr=o?&gN5f}g@g4MjieY3T`rH3AVlFZ z4W6_HUIENaNVy?s#e5WlqZ$x}`wtzAzIYJU6=GZksHEXz@Dv7Le^DGJ@6Pq0F$IYzm;K zG&u#XMm+l@i27W}Qy^-^drkqV8UHy6rd~Yg6qus<5LAl~x$FoCYVmq55TFux6A+{_ z)Jq^xC2;^CXtiMkf0tV2XvzsLfUOZLxB#h6yx;<;S}}tQu%%<|_k%EPRx zv>aoqJmKGZ8rM*j!PC<6fGrr8qR7WKrTb7l1E>LPAQLW0G>)Fco{r7Pxw}?I{874tej2D z9?Mc6cD1Q+enO8FC(5wV7bi7nIMCb`YQYg-;#U_#3zPNK7BT zy^Y0P#4RVv!pHFYmhl))oTgt_OBBR@o+thyq%FI~U#12!2I!9b_OE{ab$n0Cpl5PH zD@c|=OiEspG$74TMKGPy`;X}U4{5eQ%Pd;>*~^+Xf2c7>$7Fje;^weH%?`AXqPo*S zyX#w+#^k)~_fTV6+hu)d5Xszh6y-rdl4gQ~H!1>*dGs93!~AG&&uA4Tg<-nuIvW#- zDFE64A$I7byY6JrzVOpSlX;jF*ub3}E8?Rzl7Zfm=@7IHe-KY-eG-;2)58}1`1`-z zcNkL(f6LK0{T60umaecacl+r$lJxuT&i85G15pKKa?ls1zRCf=stoV+5r|W$b}>L|S8+Bob|{1({I9g*Hpke;D!Zh<)cVO&{aX4&rn*-y|dD*0X^O zcRi)&5bqC%czYop+KJYL*=($O=s*J^AZKlkwb-QzAP_k>Hz)zl@`67fcy!tF4pU?4^Z ze-wWPY&yczSTO2{xX|l(D0wZ@7jJudYZocFZ~>4%ktXCKloipmBTv zoVf+A>?LY8HoMGoW|twB)3f8Wwl@R;e}?8^;YTqBC1_!jy? zUI5I56|M^~C@;ZWln~bzV?iTnwiw&!UFHX0!{S%J2%f^dN{GE&zzVKGX{!0le`WkK zCissCHjkMfmos_%q?pX;uW1Lm(M`~e?o!>*iRx6C1#7X+sU|sy8`oogMv}opOjUm(?Q%yKLR z!it{c_l>PSR3aYu_z_I#2ZYp$f4m-Y+r;~~BAf+pJ`cZ-?>>>GoEpVxJbE(y8TIrQ zK<`CQPY!yHD&{L(Un5j3XnKZzRCL2XR#>PPDWxPIRmmqtHEb&+*2+-H0>XH^A@rE6D6kmjB+VB195xK__EXRb8S;lOQyY2t zYK9iXvry)gj>$KVJ9EYce@W^1mS*$PtM6xG8W8AA1w$Sc_#T|t!FcXEBX#nT1W#5; z^atjXwEb`65dr_fJZ_Raq|5(FMd}$t1Y;NF9f57)3Z@I|BSHLu2O>c<`f?K^IGZ4ayB+a)^*65(Lr=}kRB_YDj@S=8ea zUCq0jO1!S}FuJ-klJ+R%VbqB;nhp>V&Qw0H{h#kd`1nM_-91{H9i?>#?{zo0%O1?# zpfd%wweaH1XGUPIvM_GOft`%je_KV!~jmPFOR;Cg)xVI zU5S;4jjxjmKZ)_B42s-_$@^8^#~v~#F^ymp-m*QgqCmiq%)$^vu<7R&TD9`!?4fgL z;WKmMJ}=t$59^TLicmy!t4Ih^5M<|B7&UQfO#yocX5zixom$3x3E|Ncf?Oi7$VFj= z&W)s{#OJiX23EgcH)Wq9jj*ul@^Ee13@i}!(P9QOVFzvfbf)1>J`BPy z#fKe?Pw~^~o~J%l;jsM=LH~8Ax-O)5-{lP`lAB^7f|5BDn*P^06Cr|G!|IoUt`|YW zOq*YTW%r}f2~y1NmIV?xY4scFU*4nrs}AVbFJ*-|B~C6U5)$HZ<2*m26X#3cY4`U1 ztXz{=mH=&D(f9kGy^fS3_%EQi;SWD&KjhniXrVy)j0;ze=om@q`bMGHhr`@1rUuTM z1`3nSEYh>pxnN)K^lE#f47K_UDu=~tpzSASD*?+HpBMTe{hgZBOm?t;!clnZio%Xp zhMwYqZEH#Este*HmRFOEZg=UcV%Ko9?h75%E#62~g?oB@z`A?(1q+W?Dd}fao0%Tq zk}!BV!Vl9I@w+7ajr)adTp2(9xd$6T{_a@H=dqXwnZR;9VlD zVy6KdQZIm*qQZT6joKvbRM{b&b-NvKo!R5MbG-5V+N4SYHORa@+eLW(# z-r<^av{lwU^&1Vwo~j!I%Mv_9HO8ma9NR3UONt6w5Z_QuYP3bHyG)>@wvq}exYaita--Nbh<*uS6O!F0Q4&I1%DO(BTF4^hV zqE4iNsiS%&?1XIv%p`*5vvj^=+cJy?<)bt6RiZ!#C%{t}yzYKWWd%tkjA1%F+c)47 zQ`v^-!Innx6#bS$q8$UeF^b6B%%r-ENPl;70gE*KvYBAuT;R>MkNrl_OefW|_}O?y zSH0fGG{kb$9nAyb!BZ-dhS~?f0a}-DUgDwDy=160lCdTt6HzrLIjlheesT|I*fs}o z;_I&XzAtR8M9@cR;ny*9TXbGux?mqxhO>b(=&rfOjJW`0R-*OE#MVD0nGyNkFkZGA z2C!)!9W1rs10f^Qm5iOW3*~5uwSe2FN@x?Mg881k!AkSg?)ALzQxnj^oXbNv)3*ow zCY`!E?4Xun`6KLKdqpzdOAaj~q}rA#dxbZmRuh?GPQBOg2WsPt`6|zF;aOoosA`e_ zEgZbyM(*Mi9Li{A7cwmK3NnSiN>5}PCbv6-0MZcD-akx--`aBjkQ=g!;!lNtpkccD zo!zhNXgIL7GwLl=LUMq<9amt`KuUEe%ZzR7oPNAdv|Mi;-obJdhIvibsXH|1bQmln zpb`zs2D(Pl$6-@$iA8Z4{p}HwvwVR2-$0;&z!;LuPm!gFe0Ion zB^hvzP@O(~P&OYn59SA@Q4v@@T%J`RN0=h)dFBoc+fBy|EH!^l#D*Yedx-aH0pwnMNHc=3rpxwC`o7I4>t@>40tsFt+U#(69Qf+J- z&|10E?g0%Y%BSDD-P~mqFP|&0?FE>R){OzyRD&q4U$Jsc9=zy&iKpkWHH2xe}OWfD4+Q$Bozf8dbscY%L@Kbw1+x>}03-@dVSh9In z+;x|rBSryM(Ol&4vW9IY@|Q<>r2W2|CU25`#fdEzjb5;<;tuD94MPx20!h)-WLhvc zoifR`Nw4DHEdB0aN#P<=C~@xR0o#k0qg--93$L?mUmJgP_Vy#$JRLAB1OC_uHDP__|~B>V01#;h#VV z!+i-$1ZOP95ks=^N`nNjD?UdR#N3Ns4IYdB<%TgQa1hIQ2a+83n@MT7G&m3g_z{&j zMk8RF)EALze|`jnvrd8PHo>!1*bh0_GlmrYk5R#L_!ZI6#S7b4PnrVPtdq^@xApvE zD0W|_1OBHg(rG>#Ns2qHjLmd#sW{v!6;Haqu%U2Cnjz{N2mTu*DkjE+e~Stz?+w&# z{1g>RQBCn8SZR1j9;o}x={6D8Uc>*^I6woWPSwoVc4$ge+pFF#uP{Q7$5J;J4SfvS zV%!DuDXwAI#QMWw)6J-Mb!{~!m^8Fq61wwWjN5mnvkJB%;t-sy8zwcIiHhGw)xlt@eu!l8yY7#hw4s~i#A zU-ZH;(%!srhcThJSV$f5&-MWQ@J~E=r>d7Aw;Up2U4#6as=`SbV|3FI_MjPWZ3>Wp z!Bm^e3rAL>Z(WSD#Fd|mt{+6!NP9pXEN^{eGqObpHcUnCdn3|07w9?H!n9r4Y`G%s zsvJ|n@g0Q!;vAE%fu`x1>Tn1;*oBzgS$u5^7!I9>r~0+9C4M!-S9S85cV2HP7!P$5 zrmBN^9-ua<%VBNdoE)r`Ji%lg(jZD(PaLrRSL5EM`IUSS7Zauq+Wil=#{_^ls~sh$ zj@=$OiZRerF60}==Q>}1U3Br+R-KCFeB3|fv%w`Nt}EW1TDk@+M*L&KNK@JcB@B`I zoJ{!iQ&zx-L;Cdmbzc`uX5elU61){pHtd6|5ic_2BUT#N7h!TW*%Y4NK;(s~9(0os zOKo#xVP9Op>s>?OJ*}wA1_$)qUE?9H?DWys7Y5b*-FFRLc2Qk|kjA##rNA$u4AyPkOMwykm8xEgX+7tg#j2Jj0U*t3`Ckw zd~)6s++=uX>v?Sli&GR=99#fnP*uzO9B6>uI&jXA0|$L%0crr*A_u-W4c!Xw6b8M< zV8W!)&P7*+OUv$oO}y3w?}w(b4hCObqJz5SZ{^AKX#3kPv-Mw++EOB3Y2AS?SSbw! z(pg=u_-ho%BxMq!7tr|zxsPA~qHk7OwmiEZq;6DGxcu?MU%e)G9bfe&oIKrIKJK_I z+2SSjcx>U8{$7KHW1l#^ES?o(2rXJWriCS@*LqHp{>Q5%J&^?&=1p<-0uO;pejqEK zzP)Jsj(hI-+d>9%)srNC>b1}q+pcSVh^|^S*u2NUrFcbB34p_4cwOf)V84ZN3g^TQ z&J{6N9Fk2wm=k>Wh;PQu5DEvhjjTwdDfG$W;9KvZo0j&6|v@#Rj~VilZwU>Tl;+thUe?8Xg?k=f*<%50+>J% z_0LPajh9wgfio|{@P+U4w<135lNEf{YWoM@LR;We#gmXipnhm%AtI&@Ak=_`r~m|c zvMWnOvJ;p2)i6K~v)fj|gyNdix@YUdN`tBI%iR;oJ3ljm@xlmCH+@RP zCmo=*a=o&HI_oDWOZa2F5`V6e96K{;d=M@yGq$7R*QBUX2uh3R2C-d{A>7FSJhXR@ z7T5@jq~g{_sBdaPc8bVY{0sf`S|#Iw0lPM=-fhdEbx&~`iMgb|O+R1l2xu=aBEM=~ z*N?ade13SR6;}=yRWw%R3EUXE?N6pO<;owBL>c7#4_|czcSOGs_FgSpI;tBd{|_g? z9XCEzxeRi?k9AF4AGS(b$VKB^b!x|1Ac-Z_jA;c8@M(`i;Fyq5AV2{-`wk!$C zScI?Nub;E7fSKS(@0Sn)E}xuDVO$I7$B^MvF(%eAYkvFsGRI^bdyJvfLu_ce;jMYb~e!>MNcJhm_v8(^qeFmLk zbJm72wg=Y5HFHG?mj{AZRq>n(fh!GP1skqCBbO9TEV1C$?OEQ;bXw?@p#u`XNUgB}rvvbPsUX3^w1BtWX3#x z{M}giuhqa1?Oz+WV1(;7W}^X!_vxpxd2z-U+8o)ivzGq4QghhM$yOINE=#MC&cayF6=) z)FT*qcKF`pgqrwW*{bDs;cF_Uj@R0pW1rT$ z2|waM7#Y(oh$#E%28vAsthx8IP4aV?JB2cH03Fb$US6N@qSiy%WuJu|#~dU9>>F#ll_13W}{m zQq(ICG~g?TKFdz3O{mDQZ&v_ZrHxGRo5~_f)3sk58m4MF6xg3qHkZ6f*AR$Nesagh zkS?43`PTROyGE}&Ko2OAu~4XP@h^{});R*4E{ky496}(DcRK zT#hg|5|YY?wH-5w+F2J%n@sf%Q6FFSFC*?uW9?y`p_7P9*tAN3i%5Pi4oCJ~N|i#T z#z7`+_};6J5?PJnEX9!SoEUSnYMu|ni*Q)dJ2Jx% zMNX?}?fO+x-dOi5=dh*g7qR~D1=8^=z1VyR&y}I(`k?1Jlh)lDmTo1239+3hS~As7 z^U`3-(HVLJidzRmk^DqXY+TY|!ajL0i>N4MNaw2*?)j|}c_+s_a6D#}>pT$8@sLk~ ziF~QIj6q>2;04*E_fqcfJ$VS`m3V~W75vEivl&JR#LEsavjwX2)NnY)OidT-x+SFf z4r}RHTJb_L3rgxu*QK0!&;t2Y;-GT#JD3O4d|NC%1lOOPRDCpG$|m0A-Y6F8=g$v( zJh#!RxM+o(LdeHKnvfK)z~&ce6|CF6t2QF^lh`3LVAL3Uxv?0E{+CN(7%d3*)J?fc%x5(t!LB3AG?8q=X{GI84q7LE+KpZ~}jqYAdU6mZppI#IpmH zr9lM|CUs!H36m8N$Zh2_c;#D{IXP0j z!s1qHVqdDF`FRdz9{Full1Nn5U;8V{E;-p9m_uo$IA^syOvT4D1y8v?pFf4)!c5Qm zcd`wVz(2&95ywRW>L9{HEGmqV;A3J>JCH335dJXrPCL7#jQa3i4bNLIno|467ekqm zCdO`%M{Gc`&~y#LWF`bnWt2I@?i(e>7e2SJwye&6xJq|rL)=#l+^3xOXRv-&+Z_7= zo!6PwU-*C5nyB+v{H{86yue&cRPEFI zyF;owxcxxJ6MFWn31a-jHC`sjHD1e}06FMzSoPuZmXR7G>|r+B5n#wV%Vo8bH)4OZ zyLbEaVCM4cv0#)!gLzXassky`P7Uo1;F}}CRT>5c)xh4}s_+%n$hdiK))1@-1)mDy z2Q%HKa`s!WV*5nYu*^K@ioz8r{f1&ySpDEN8lSvBdyW(cV|IRUaPyU)NxS^|oHkjD z$u37=zJf_vcT;S3Z4ZEpdBPb~Q{lsv|NdhbAc^fwx5W6U;0zP)Opw zFTca@mxmN<=a#cx$;XgnFpu6N?DZLO!nnf>PSUur0P)37P3vh2Nu2^h{-G>*~7g_50xyQTq~l1_3B(MnjUk6feq@Y!!put zjBw~Kd@>5@*;t1oqh#wTE!LerW;s+N4|eCbhlrCN==(RGX+Y(xm?j$5aL|Xnypmbn zRvJC*iax^#hkB&qy0$OiQ)CQx-5~;cei5hRj@njG6#Jum!xwc<7Y9`rV3J1jA=4BQ zsqAOkJuiH!emggm&WaJfVi_3exL`;8)4i1=z3`uw z&w-pn;(l5euUnFGEJ*vIfDs1WK9oL+)IOv>(*OeQA3Ne*4d94AMIb_W=--)4du#7c zCDI&$d;x@(i_8b|Jp%Ivh3grR46vbR;(nI6Lm|vL?np})d zh}s=lImzc_k4Dc_Z=*oG7tB5RSaQ6)tmKUhE7?o}{l%olah1%UKKYU?)zm>&*q|%D z#4tSye2lqXM$Iwq%r_^ldufKp&mhXKX^zDdIYzM^VZZF3Ky$rNQTcPQ&CM3*cVt4!((xt80TO;s z=G{vqE&=CK3+tb*v zH$NT2v)(;0077p~v$wy3CHzXBsrE)YuQwDi3!UPgscn2vAGC;V9~+xojX$NWHEsHA z&eI$Z)B5Ix#oZY&mVypH357o0|8$^uH?x4pZy1d@+Ig<5{x0sgWL8@3n^F$22RhF$8Wkc3ei{wVF5nNkEQYv#2SVrBcOi=-Tgksyya z;~qf4C>I%$=r0fzzN>zx5+*@99H=R;jthMfohz?acEi9_trU$s#(nv9{=I7px{WM) zkQrR`08nHVW>&zsu%|8dFHHvhKvyGHZu-<${#p5>jVZ;{ZR$TshjjwSsqbjD=8xmc~LXyY7rxE&Q zILHN}%o6#FjY_4cUa?}wRoIfj|U?4Ql^9+x%0&${xtX`eH<2PT}X)mep^3@Mc*fR+OU zp;`{AOYcSO$!eTlDbGDi)y+Rt7H~&SxvM4xDi@{QKHGU|8gTxgRWb|lNSRjY?u8QG;N4=Tda;> zkqDW0cO~W=dJM@H6!uEa9f$ny$-^tI;uGb>ctcJPWcGg7Z3P|jCf)???mlKk%b1^p z44QD`XySXuS!*1!;1?$d6m-<6Z0mmZ}dPg1pc}# zywW}LXm&OJb7UmCz?Q-L!lM_{EoZ*z(w~V^w$XuD+bmP|L3dNhW^XpY@E?a?)EhDM z?OUHPd`*n4`S7ajFt?j?wMo2@m?~d`_6tshOVo81gC17Wn^eE&FVH5oM2tx?XBeNI4H`7u1yxSA@ng$Vg{EF0MCPHI{ zKc)wTqyyDwc(l8mVK`=Bdk-%n`krT1&r|M}B(!nBznOci_fMKN`{x+Q`Myjmy3D0l z96vq=1K5m4AVV=#<7`1 zmJ#RPGlD`_303TEYEi7C1(aiJx_wEa-V`KjRFC(~`n7W^I<|{cXulQW%Xx85(w+es z3udt%yJX&i?Fws3(+OaXprT%SXJbgUKI$hlX*XDZn!%a*5QlwUU6EY_X&(($0j3}W z%&%M}rZ0QP2G?7d^^LA^My%ZbYp6^6@?25Bjr+b4=5b5PgyeSgRKK{DJL@Wo_$e(@ zN*-Lyb&!CfX|JGBy;JG*$apN5QoU(o&q$iRZ*%dIAKd}{36rYG=t4@D5$4-x^-SB$LYF*7fptN?Xog|WPerI?4Fw_Xo zY*(^NxtQaXyX95fAE&!qD~0x6pQC_uOF}pQ4k{B}#G+)J_DvPv1l`B@xa@h7VruPP8wEZ!5tXW5OR!+>p z0~Y$L=YA6rT5_3Zg&C3?>ETH!;2#jC1#C?}F4 zHZ+@G+K$EoX>@R?>+|CkzRuGbg>m)_ zqVOO8_=VsMZzBjpr*@I{WpRkD*q!|x^DXJ!ArrJ7RL|120Pe402JCaHi>W>+00WC! zL^7%4(ysQAOUPOWw=U=Sl@XQIRF|Ljb)Q*whD9+KEzuZZz@J0^X-t!5JKFi{y9A@#v>kWM*oo05376c*^WI7M8L~#BhVt2#L*x-8Vd_7#3=w8}FF=XPOoCO0%t> z|1HqE-nt7$6eb( zu1Hqv;GPg>5Icg9h_tyx1as2jcX{!F;eP2bU{{6X=ra*=m`{HS+yB{)S_6aoIKoQ` zMYaAL24!lN6j3Agx(fdfU)2X&M?aywg|%&#-eJ5P)k7Qcp&g=;uL4%_<$!8Wy?o1S zKpadIxvBjmcg0VATC&(m+-jjqVi0fJj%YW)C80SWJTRGgAiU7$&m)9kHznzD$s}h3|XO}r3U-`8n079< z89%t2#FCpfSK?2*?hfMD+3D6E8nOHSCQju3l%$&2IQr9QpBN^2j{U^3ksONu&asJk zuFa3c*m~__iWQDWGmNmjhlQ&2eGl!DeIKoj`VVkrpCRyMRPTFb{ax?MbA74`rmr*k zw$0mG8#q#Pcyv38cSNgSF@0MVcu|m6fPil23|Yc;fiNr%UOIwqKd26Np9k>>QE=IZ zJbMApcuoh`;{%g?y!GY?RNzYp1TFky>%RyClN7OKH7Ij>)!-F(>FOId#LV}}xXIz2 zl6~i!!jY*kVXw#cuo<$ts0^z=XFI2a{S_%p4WK=(NyJnyjhOsN{7x5*nhs4)UV(=$ z{~oh6f9Ek_hhJ6tcpbUt#%tASYjRV(y9wSI=(c-;mFOL%Og?bg3$-h1k3E4nJ(DOs zbUYKFu9koI5>JHW?zd)#dqQBStmad_Na5ALhheHTw_Jt7^f#!h;`g1aNEITaCLj*~ z4*UoT0u2aIff|}u1y~P~YKC^7+A$xXe{~3+p?a4f4-m1rajfUCg?0A37Gn?{!}v7*mf-5ugIYUwtMiYbEFt>B=*26-UxZM;|uw z#oA^H_%^@l#vtX~bw%^{$&B+w7;}@x9%%oP-p<|>xTpXAW1R3jLN;=u@1D(2K0i7- z?hb9V)FYPedt3Jm$))}jtGh!scn<}Viu}2WS*;*vheVWW6#PY!hWfS)h2k(;SliR< z22~{(jn?WrxeC#Tgu7vvoJX1<=M3D!5lYio>+LJyDN}W=`Ibd~RkvKDbhmxu1S}7- zLj3TH3nD;tpT@3Di)gAhLOb(DUqrgmC$v0;(MEJumqd`Sq%+{bGN_+m{fZMRCH8%~ zMZ7b$qRIKazHRLb`uO=PB!Fgy{bLKke3lr2#l!{c7^@NgP8bwGTVxG|??K9=73ChW zUnX$&`Yi-Ugc#2b>D@>!(8CM4Qd@u=OUpYep<1fOp(G*|NA)Il%zd z`*$Sc=UgmjDOi=Wvc!VLvzO#23(mckRLvuTXg=R^oN{^ZaBm?Nh!HhW~I^~e~W&pGb_QVv#B zFd_u5KVL5r!(OVf{);P7Kg!a37#PPv>VGrIw7e2~~?$)#!A>yiM@{@F?4`qE0~X~NYoAr6uYGsn#4 zLBIAh_(BGl#27xM<7U3Z#ru}?0L|Nx6m@oXl5NtRshPZ{2e^qOIjmpoBINxX&*lVf z8IMc}xZKip)%52?n>&}=ePoBlEW=`V zbRP};;}%A3HyKk#{K13?7!|eHB#HkGzfBXn)IY@8p=sVBdg*}CygfQv)jMQMpB4uB zPuE{;E75`ERUG7>SbuYW`*|#UwJ(^8ZSzRn-p!v9zmtrR#^OjOHvYM*>8I5bJBdWG zGz)7uRzNY(m~N&QX@mX{4vv{ZB{) zfvNRZ-TXJ0b^H}L8zfslq(HFd1fS9ohNE)6L9c$VnkoxXxI!ziD^uJD!9^JWi173bx#1O zT)1T`^Mbba{?;ZC)Zn@eePRp(h8tV-z)z^Apz!lvU3m@;d%E(^6YeV!`&U}&X2aGO z+g|UDIz7)<=8mcBOXf}0(;0ZQA+uJ=?BoWygeWzoXj*6ueh%M_D>ms$Sgnbt=%uT?4a8^kCFA;-!N3b6V+IuPxI$?N9go|40szh8Fz?$$}V`Z!z`ty z1FW#`4n#5W{4fOoEB*(6tk}4n^6*9m-_?mZ8&nnT@?7TXPE&+k>zG|@3)~y@Tqpe? zgk?DUjXo0%%vqE-5c^B5P{Ud)eEi!#5zp=!iZzFSnDpiFT03408P($1PlOscYH*)V2idF!{b7~VOEI9Jtl#-NoDxtxR*7o2%U zWp%89W7JgD63=fM9ALF?bZHNO^cD`GTKsora>*;J^!~VErMIa+b`HP!>2M=&Z~49C z2fJvrTvPowmzGalF5q#g)ay*x7U1)3#?&U#^C{$@tP$g%x~ci3HSQDP;YxYbZ|Y|c zn9s|yMRgsULZc@W7f+$(7POd5)OrgD{?xY~xC}P_AZO)hmn{m_l3~LDbYjeVzQz8y zyDnZ4;GpU8xim=v|NhgARf6hoPd+j#-&KrXL3cW}igffn(}4sgMQnoqgJ^#dB`vEE zt<#&#TTf0c+2-6L!k*G6|Bs$``VVRsk#+r)Mr7X~H*oKihM(EJXtnpGeK388*%R>D zK;E%<`gT6sh*#hr%2aYXKpoA-T&Fobhi*b~0emwZ;SKL&kWM^9Hf$-d34K)^OWzzD zDt(J~fO!sLNz0`&u!8IVG7IEn{{JTZ)y!C5wm#Ykc)8}Z9>f!s4$Z1P^dAKU^OekE z6sfP(ePqdE%`%yS3~%Htko$cf0z;PopbL-n;S{;T|EANPs^mLr{zdVV`3#y%joC!$ zjG%o~6gx%>optph!T1JWh6stCGgA?{{HNK!4queaH+|E!bd(xW=}=w!S%rD~Tt2|> z*O1C&NOw@^^~S3#RMe#^1L*krD(T)uXc^rX%)tD~DPGYj(^wHxD!f%szX#Y`rSm_lCFN5OK$PIixv!txI$`CV*cq{Lfb(fD>{2b7 ztg@n;5y{b@>6Q$_Syb2zP|h7+3k439TnV?^udWu_+QT)Sd-_u@C?KieYmq*&de_Rd zJZitOGYA$ulxLkRNvSNLApxRNyb{)OJ`}boJs_CtjyUMXvo>j+LoAlM{IluX__mE} zI$IFdtku;g+&W#y5K}piH&pY@WZdEWH`MaDA8VhR`i*tf8hxP_taCf6+CokvFgH^+-iz=1hyXR)SeN&YlH+@H zL(y)K3=b?^CVPYy z^d*BRB-oZ&T_%Ft{6;C)Jner000r#igGp_ASw>Ow7UG%LYDVr--Imm$M7=t7I|Z20 zbDidxGVdR3MJ9Q*3ZdHYb_)kd0JobL(dgVO@yne{_j|DM^YmGa5Ai>=s+|~oUm1ZU zw^H)8!8A-@aW+=BH5*?Xgn+>NCjVvxZYlvnZ0pDupQA07jQzfUQ;J$$j$!5$wBUyp zF^08AfC$Yzw4NBwbVuN7t`wvNvtQ%&WnJ^tdgLM}H22tS(~(LtP@kPC%M8tdC|;g&A=9PXr1_HO0$3 zOxEoZAVwI-@bZK3pUROy+P3YFC-%@M_LC5zS~v2;n74&T7C(NmJI0kF?(zO0VOeRJ zb&y_ZA{ZOT4(N@=#*IFg)_V5An7H#n! zvq=DD9K6lB_dGiDc{J*e&-k1XrN7I`?}g~N#u z`!ldgFkxo6slvBcJw^i|*&c?74os#P>VDolE{! zMjd-t${03&HC1E4@<9Z$~5k1`#LV#e){D1TTkM zWS-IUN>rNR9|un;B#>{NK3=NmoM48Lw4>dd?1J{do9vyvB>^I#AC7wqZqr?>l;{6daN;0#A;Fc{}DfWnoL# zDPzoOW-EdzW<~5Rm5ON&ONslo0a)>WmN1`c7b`&J#ceV$n02l77B*YLDSNCy(4(o0 zhuH&5m?iIxB&SrK5P;r-5a3G)-vH!hmF~u;uMm`$uE%GM7i?bb+5h&aH3+kA^x{?+ zL;}k_00Sd7wWWg;4#rhCjMo$ncaYpN=oQlR4#QO`MrTkE*wcYTn_UO9wRLjAea>f)#sTxFPpgvU} ze1IE9C2xL*TvALUN-bq7VjggU)RETRP^Hv5z4l84fsOnt)4N#21MAUox6k{py-wpw z>pziCrut!vBC}w{+SH(d;J=xeFwaL?A)|c*!gC^5x`Yc=v8ot6w}Tb`C()>dvNm_x z0-aj&;PLaCl<0ru?i(dNH=O0GlpoQGuQX%cm=%y5gbO1G$` zWDxuJ)s5S=SLAPkJ;wDUMKY!`WMRa+otqDe9;UzBUHDHCzgLdo_Ht-ma66-Flsjl| zO`xjCVm>N&Bx-jeUV-~als3k8=`!D;w7W*#tx+F%#$$9j{t>OmbgNVYEK`Gr825j0 z8|L;+$%f~n5i;xg=3eb4Om%lGw^-B$m?)fe@TdQ#NUZ`=ey}_GAxyJJ_2n?%n6mo1 zhhMcJ_NRyJRyz9Ya$o$+U%6yQUo@pbE#B;fpP0pHoV^IXdk2UC-|t3To|@(b-akI|W8oDGgXBLf@U(%|wvnx(T|m?;dEd zeic6E0MLb?HAIUO8CLN($xEl=ymM`E$MRLTpjjhb9=0~wbU(qEu1=tfEVII-6Dz`w zICwkiCn8WH>nkJJN#hr}zGRP!KULifGx9cD_=)2Cj|`pS@U8Cpr+E=%*f)xuQw;H% z&Ww8#$er%yJ$yyFwXn{-T}1@WgWM<0(gg=efX0p4g|+_#x)RG?oN?QJe?Pp!FT%uJ zg!Iwfh}f~*eoC=dj=f(oRYEbfN>+`G%M+l<0>wf798YLri7U08`y|h1&$uop){;X>QaSu^9U`P?r5Gmya z${>uE9JN#-g@5uW61bGn3=7GqA-|IqS(S|9%zi{;>d0R*2G@Ujk`%m8eO>rGg*7Hc z0O1|PlD;&UNb13auB$1;J*E;8YbntWt8lZF&iE`|sZzGG!3IUaDac)>IU^)q`#;mh zHTpb-{U^(|ass(i-pA}*s$;mT2K2zXn0B^_F`}}m8>m?CC2Tp7n+Pnp7>(yM(=)(;v zmAmrP&Xmu2;B>`IdHXF@|7cqZRKg1sT8Y$ZNtIF_vw!lZ zD>_Sfc_yHz&Jm7Svku|9CN$?IxLd{FI|&{zEx;b?&uI-nDAtcUC{1Q~Qh*z$R0=d` zlb@C6F8cN2(sc0hmU@K`2PXozX*PCLtpBuST)5vOICMQYP5Qr7;%a<(uC-W5aDK!z z5ncMj9@Y-FmB)oW1t<^V>l7yrT=5luDNjTXh~R#&PuPF&`AtPNvmitjAAtViE@vuS z1cwlyJ$)=(P6X+~JJTNqlg)PSSvll9yFbVWZ&6uiDl>d(Rh#*s>Wc?RozNgu4o6za zg_UVIL#buqL?jd*-xrj+wDM`v@mJwa#JJR(_8+;Jbl;aCu3v~QAkLHz){Wb?;ocub zIxUatH=OdMosRry&0AwTcOI8!uYf(d%-vW-w$wLI2i^Q}576FNl4F2KuHR(JhN47W=O>0YiC7eYM^q(#6; zMR(gfl@4jME7MFBXmk7obwON1bZru3sjJ$Olo_aJOGr;(?R$X;UZl(KI@1j|&>Mj% zN6I-4sH7F&i{W_gU2fS%hL*e{cr)ELK=rcjoU6c&56{Stg>iZLRR2gz z{gf)l^IWsN;!T+H_4P6;zHR+CQ*r2SWboaEsjH=?DQk8I_Wj=WIN-jn^1!=^Ocm;; zbCq~;yWPUgrR_IBw2oLe=Q+DX^}FqlXJpVT_GQZV?9N>9gPQxmX2*z_;eU-n=d~0g>8D}!_KT66X#*tn&-ZlIl zioFO;O8!lymXZ`aXBZIn?&G*}@016q6f*XGxCL}~xp4A1?ux7vzAanAZftwMd08Hw zxjWHz#S)#D+G!F=bJ6w0SXWrOEe^a#Ue0>O{iCA{n6q#^j}?r-AfI$uH92@ z7f6>gv5J_YkTK4R2M?VtAB#bDFPSB7f9nfTF7zZ(x0Hp}Xv~@5;rzQUasv*)Din}N zTH96O=^yG;6DNnz=Cb}L6E)Um>4DdT+iG$OzU;g``nsRwMG!IBE5VCZI(hlVi%?fF2q83!KO1r#<0 zdcUA%%B3KRLOV;u58NHeetFE7TPy||rcu{nxMbrW>yY&Mw2698Mq-K2BWB!)pa=o& zD?{Hc-c!MoajpXk|CzB?rXJ(zviXWB71?!+aoqvmUqb1Nx@rnb z86S7y1Np-HeCTYKqJ`j?PLmU$BV7WuC|CJSjE}QNE_a|3Cgtox zhLM=#_FfOZ`IeAk{b&3Zdx=m%ScQ$?&||FFs|hRGe+u$xC+3GplROs(eIX*+oQm)$ zUlF;y3L5T(8c!;x+6MkJOCKF?iOJ5|1eDgXwAl+m*eb>%Z%BsON3oIvEm1~;bM6+m zvD%4EhhnD{l-Pq{DWS5DE6uPdS_{Te5~JjSobN!R#Ap|>iDR%`d?NW7C2HAOs{}?$ z^7(~6hnJ<-sK-4Ow;oCd2-{f};4Eiw@M@(6q{ymSUoysn z$A0j}GtIaObA=NxbE7DM&%Qne8a_6jb>Cj#sy7h0#9Ct+XkEE0w@Y$tf9oN;`AA2+ zc7?eh7*~=ru7QfmW&8u;_m-OMyCmL1Nd0cJw_mPve2{9qcJ&yvD;P0V2pq=vc)tn2 zYkJ(Svd07hDc36@Y;96=Fs=F7M6(nutk1A;EifM+@87Bv@%f&LC1EJm&7ACWyni!> z%rKuh=~?x^%EaTjwM>eg3H^u1VeenJgfM7a9S-+QRc<~Nc`w1cekBPFaT*RUFRxAz z(GbMTCS^EfITJ6#^uP03$zw^H0tw`koSmJe<7Ps_!^O! z$lnLIOhCKnNRtwL6{woxD1O-jOJrSq?0vKd_w21A*Xs$Py&iToN|I%wWm-S$ltBs! zM*G)#9FPgLK{pDsh$dC<&iG9?)NC#<1OCo_OvoJwA7pMRSumkjHe<4i56yc+CXd#4rg=TOJMD}haW$aM znN)^(f;}KYx=Bd$Nj^V}dOk!MGg?+Pq$50Qz{!-e_a2t9(foSd5Ja0yjT)$2AXt;nTul!&M*dbxTluASGFd^)Fcn#+7b zJtNVw;L{=FH!Bwq<$OAHj=MaI35aGtDXGd*X)Ju=zmihM9K7OMVoa@z`2Bu2wV?^T z=y$v2DFF-NXqix&Y#&}Y+R@Z}yomI!5XbJ8c*0*^cPlqrJmGRA+ps6P&WuJLuC>Ud>%qyY34wx+uc|N15E z(XvV9?9qq{zYeZ^1$(s1nWCnMDV5@;2qtCeB!#!~F7=JftSGfNoQO*mpuI_^?&AKg zYv%EKeIDaq)tJ~^FH^7O(@=;9`^X!Tsk~TjGP_~tSy#RhQt9T>^LJHe!|7ys zwI053?$(K$A_wq(z{9Z-0qKFtimRO|^q$B^i*iJaS3ye$nUJ8_R;vScwc1@ounm!z z@t{ASy%>IAv~R~mp6Xcfs!5O$b{2y*8&Q01=f3En$-)Vd^NuixY)B7G)H;@+lwLVvovBVDfO+a@hC)EF2 zxOAgd;5TIy&nsxA2N5zv>c~F7qAe5Q)nofkyos!HNG$9jI{T9Q20bP-B1CMw8o7! za5PA^;+L<_XJ%x0Kc8CELs&||w{XVX&LYIso;3zoPkAsa*!)I-yZl;Mj4`jDB0cqg z8xpTxTq&$;P=yh27{?*qQwyV0dMelr?TX{HRryCk0E~G7BLdkI&@<>-^-m#0zwYJ@ zb0p38D4Wwqw7p~;g|B2NZ$o!wAA8FJR|Ft{lC(<1=PYx*9WY(U-LrBYU(}=IV~8RE zsaO~b%IsTXQimK|afIQGR(qBjj|kUbCk_`OBW@zsQH9i^nVC4YAXlW;7I*Ci=X5p)?OOv(mxjg3HOmS=o=aQlb2*(!x|y{p082=ogf|nv)CUo zz^kJIF|;zN{u*l-KDPzkR*2THcSdp_tArOmXW)mWUEX3CmcEDo(<1C1UM`;vpSkLE z?$F%fqWu(62bKGg`ZlaMQilj=C}esjAo)fM!6lzmB__BGrHWAu z@TNt_?0+SYg&$bG<=@7=pCyudD1F3rfZSRB6ZjVwI}FZ&QYUdCbiC9(YB_-?s`V@y zBZ1wLl7Y&)g}v@t`=nv-kafHn^dX3x9(!ie)fGC99GXa$7leEPbzia-SqqI-0^c04 z`z-WNT<{+SdegNZRrCp!!c{-$zkh4HH+cZY)4Cu-Dx3%lEnBjIg{^g}xF&g8i`?Kj zpNT9|z?08xzx`BP-@Ba5uk0u#Z_1HLKL?GUW!NLy`{d+JL3J3^%G|QIkn6cz_$ti3 z`-iuD(kqW*9E18RbxQ~@f@PgH+gdK*Gc6#dKc`1bgezhOv^>X%A#DF@<34Jq6sy%GTFqd|B% zxGtp=+Ltz_tgi?mW$tM2mTwf)o1`VilLB7oj1t1O#l(1Ub#uYnWPKLrDarA!D?#TX zB_$>Y1VL!81S$?;%%O=6FI($kS~fqE>>V?Qdwf^pC3oXUo6F78b7DyC6U$ z5UCYZ z12!829w>U5fZFNAHp+6>0in+0Fqv&szz^dZ)5J02%tx{S%@fmx#STzpb2)G0_7Dwb zo3qpoNjca!&rKBr+=GT#K#VWM{DP*`%nm9`whB}qR>e)eqb%K3OT~m=Fz!qOs~1nA z?^c)+b+s^UU#xh+Smlh(t&QOFZTV3WC{REUjZv4sMIQAa6u zYha(S>>TXarm1fuvkk8yx*ZG*<~GT>trO!u6t!~P?Wz?f4fH)ZDXRDbf(gm<(w7Zn z_=%Da%If&g(Bn@?ldjLhl8{bJBvTR__?>Z@EZXmJZ ze@k|oui^p2X3&JWy#4w;=(H-*jDe0UA|rt%Q`#%0 zqnvF+-II&~m$ z1HVJN1ppxGILcresp1CV<48%WkAT+2^&HsMte|ToSn`(xyf#>q;cVk;WGtL(Kz=l? zVtfK=7>Q9#B`wo^^^WmONO)Z6C1AzagXx7Y{)804Pu_#i*TC}Q_tLSzAHk|gP_!Ot z7q14UJjnyZ7Xg+5R+~Nhlqy64F2P3{zek3Ve~c(FMCa*Ro8#g<$BZ^xj$W-Kb(lgX zm?XKX(5DVpfqGGm8t_2fg*=H>H!}>K-$^$Ku+S^=I8Tzf4DXWS;D>`U5s6sn9Z@Ay zr@hE>;*rWj95+VvRN%?JB*GS zl?*lT8W6#vKN-JA-cQV&=x522pO)%S$uHat_~`AZfeMD`l1;S@n_V)NyJ2yJJcd*$ zuoqfr?p6xH5Q~}%$FY*9=OzpUp)FO|e*t{y8~o7i_OjMehgWq5D9=jpgXQI6uc*qj zGW8{hQ}hGzH`V=-T|waRtLjANqHOZPI8-6Y-&vQaU;#eU zEJRp9E2NMEC3kKDP>CRXqVQWEm;q?IHb+q73{;@#!iQ*J!B~rU2CkB1S3z=Fwy2K2 zJ(UYQ!yrx1n+eJCQ=zAD0U#k@xxBzqOh6MU0XZ_xlWQ{ ziM>RjO-EF=5<@Bq4#I>9D1&>(lmHvh>~f1K)cn(Zm;=Pwp{%4iW=E%GMA0S`y-l*_ z^_8=U^BQ3>-ocQVpyKo-$K9{h{2}RnJm+eN31RJ{=oE6Cly(U-%IWlzSs}q{o^}bDu3g{`AsOyk|k^tpXA+rfHRbsHADIxYiR9Fsj96B7iVaK2x* z2X;Mv9s(*U`o1SVj&;%)?qUZjN%}_g%Xd00iYfzs^U`Qis0nBHXFR<6XGgvnt=(s|TedO)ih?R!P`-H}t8PpKA zZdf{<6`is;eWv){q4lz~Kqsmw!Nbv3?sDldP%1cEb7^Il3>p@`hs;4B7KW%}MIO zyYBDaiNZR|^h0O31(6Y2mkp}wj?`%;1P5EqxL!V{i@jyS_drV@8%FbD73;M6Jg~UK zKG4{#YAIPE^F7FJYyhN8RM?Lm&3csjpKmgbELv}b#w>sICR==O)0vwypryNQO5$Ss z(Qy)=xHpF&F|2P1WC%hnUpzwOu46EMGe}>;P&v`jcGNkhK?;(=D^BaFyzsFGE|?5M zy5MAb61YHA=Xmz-56+T+p=AoN+!^0d$N;U5yb4jogxGs;FF>sAxHm8{F$I4dB6HeO zz;x!o67re+8+#K_uRou_78z5yUt_dSr%i7;`jFYZJDKnwUXybUl@RE%)l|oW`&+A0 z4_mmiSOuXquodz?VkXE=idhk~Q7Q|wTsrd*eg~5|A#D;UGaRVu1RCMM6kjz3dYD}O z`WXO9l8M0&{$T6CrTh;jH%nIV2a$-j``0VBJzPn8h*xqJ$tAU)KEKv#Ig%|t>LK(P zqN1?7kQqw@6hhKLq&>kK^f;<#Si>J?c*}lTsVtBA7 zZ{>d=ds-VCl=?S|235fA72v^8 z8}81IMygNCX(jDFWN93vxsi?_ORGR1`$^Wa+8MDzK!dPHU#N&?T91{{RHjWo;TEAT ziJOuu9f}yLbuMXt<1T)kPL_J!RpBH1q78{AVgZ)1nLT3$>_*$}v3_wM0)~YcDP~X> zXk32>k4q4vFN&ZTtf_tR>X&G*;4E7&xz^-@g8FX%I#CmRLm|U~ln(PPJ3AKpQhAG0 zRTQbaY#`v^>ViFLPMLutZ)=T+!`m^_-t*yCP)D3Q?`vY#r$u9Dwh9YZqc!EuKYH^J z$pOroze`bjJi7WK5DpsNdoW>r-)na+?eQeUvlrnjC}4#~GE!4~i%hs%*(jcY?bVAt zEZ&GFZQ9hg{lCg#-v5{eJhA-$qW%gKhC!Vf9Q!R+kJR!qfF9DUHgSrTNKyr6n5m4U z@J@*#aiWYCNgP-kzu&DjM}u) zCcCJL5v1-BGVQQ*iFT_+o_Zbkh$CbpcOTGoU0DOe zg)EXut!5}*t)&`E$*mK5Lu%RlJniN-n8F<0~edB z!;UPvZR#pvFG$uV{W0^dcAW5Ac>Ylr{Eo-C3hR$|eNE+?&?56HhT3ipFT0L`qo@aU zTw(=E2u3sz@9;@PATB<6&ICYhhC{w@d-Umm_CgPlh$52?K|Ya4=bu>XFCg#9qq$iE z`vj&Fr1qo5ZFItxQ21X#6upwgprN3e;1JRD(KU;s+1dQa-P9rR7seH@$|Z-?>kt*x z%uc?BDGbOTEZ$>qS2LpS<*gfz)S%IzU(sp7QiHo+lG*`@XCQw2AL+jDiVLTS(ca}49Xig0a|A7y^+uVB`jf56Q)FEV#uNeeywo!&{ zda!huQ9fbaN99AH7zo%FYg?GyHWKSRHMpZgsiVc79xnJYIO=A+Gdmg<_-~W?FQ4$3 z{K?NA>!(oyMi`iYbx?t&0!2h&ZIYnTf+Z>-H6dn1tU*;l)V&@$oNHgc{WAC6gMe?r z=PY)_C{vi(cPHqXkBkJgtN<$08&w?bg;jB@P}E`GnIwWL9>B?4z38qban}?SHVnh^#NvmC3 zF7T=h?CsB<81>k-rQK{FFACy=ZwQ zku=cB^_-|bf}poDyy#@UkLBCgcKFH@V???sRFlGV5x}soG;3U+FN1AFKq5w7X>6Xa z-R&iuvi^Ye%CbL6cCI}Txzcz51qok3-}JwtYj&%M1Ddj0Fi=f(R(uh}Qm5A_7Riy7r0(|J zw@!fgW7-1Z7UmNdf+v70l8e%$c611L>{eUkSTucD4q`%_qgz}7_0@!jzvJmZwc{+v zjz<$0_Kd-SnZjLBUPCj+W~z9Z=~bf>5Y_>(-!zO$rH@p{77Fd9jqjm{0$E)Y9TgpJ zB+Ut`_Uk4)kn$ACjANMp>nG{(KL)hx+)x0x&7z;3@P2{C6UV}eq-X@}IA^99xVLG1 zB!AFrLMg+C2kIzZ@Ocwth#NISwGL%iT6iZ>=kby);331xcNb&$F zIV2bIGpTAZ(uf>CMR=*qGtC#{xO{>>BuZ20SWyy-LXaKU@_!2$2F&RtLz)u?tx7dF z!K@8OV3jL<3e@{E7Je|$ZaB2kr=r_64MdxgN(cmo;DPCs~&1wEWImWlqQ!|ihK?*$B?_U&{9%{eX%c;R$ueCPd)8=uA;T7mFLzkG!?)E=o8-=&bFl^l& zm|xoIv^rUmgGw3KppLj9X+U#UEv-INwFKd+!2N8Zo~_yqbp(<1HT zO&O@BPYlGXtyI1dw2Ic?Vg`Os-3&OuEd=WHy+C~<-Nde^&oYv_+3k{w-eZIF0!L{B zCPh;d6=3S5(tn`g)bR)wxc|<{;y^MU42d$+pTU;!7kyjyCr*#R>)&6H$eG+6heMAd zBG1Mp?YWC?+{G>7FZ%LNsXo~AXA0|~C?6a+CzNxxmHHi1>@S(79f5fump&m%Hsu4T zT$$4Xh_t#o)GS%Tiv^h%b>;VW-1`D4I*t3STA)pElmYwS&7~enVu7v;~f{ z*<9`QWj5B2#AI@*9p7EWtv9yZ!mUfiM1EZAdmTI~`7y-E{PRJDyf2dF3^sNE-3%xf zO7-#)U&$apKs5!!NHr)018S1AtS(IX4TT-b!SqK8PP8AMGR*8U^-Vw>O3852Usplk z9d3x`11A2UV|TIO!-Y{H*M1ScaM9fw!(vT;GWpvr?Hm5as)|;0Hs{40GMLUE(&!v#^aUbPXZ&jd=m@5nSd?H9 za7a^$LVf#oG3B5O8zZbBsmh`^`B^-SED&j!us+D#iLhj|Wd}Id6Ae-xQbE_J+@n;M ztekNg|F`9*4!dEmQADkU#MSUyCbWRC7Em_m)r8)+hcu59x?2deDBRArxlZ2Qmj%{9W6@#B%W@5i~FkdLJ#|Pk7QL2-eU>kLz}7t&5SHy zk2kjUF(*sp^0M)d-m2X==RIFWnBry>4@v1oV4+iy^l3x6gVa9S0lQOdiL|@xbE6Jfn`1 zIzJUBTms3kQ_8nEP)vl1q4OE7$PC)AiGXx-!f3isBf|=nz}QXx_6`=5pUWr5FCo6%CcXs>f7i(oWfEogPZ?)+@b_O`xptXJH4Bhh zInuS6CeLKB&EG5H@ng|tMr&B2)Z<#z1GmBZ$){ zZL@PT&+&tcUZi3AGlil>ondbdS^QGBc=!fb$!a}+ok@0QWLnDx&v=56_?nsh=U((w#>gXmZ-pn zzLxa}{J~T1;SC&i4AP6?8NXq*6Wk1Xh6G@aff}*x($rIr%&Oe0gzAE}0ZE?}pCf*2 z3m_g}{UPF7yzxvBC~id;SyT9KiIv6H?c>y%4_efl84x4R;qlcfMt~az*o69gd7wL> zBLi?p@LvNk8u1VoU9v35|BeuXP-uG=WukAz_T1~rE%I95WQ66itz}W77K|I)^`j(I zH^0Uk(|#=<*hUg_JK_C-17K~|qrWaCrv3*)+CW_T;rG9GuV}nISl7L&%eTS7?=!O& zr{)uP!^z&J=AVBuvv%u+4E_6&bV;*eW`cqDUx-m^s6l5@V5Tzp!86H|aA)XLvfH0a zGH9k&!v6_46MN)&ysYTsSoS>nRd^Vs~&^IA+J)OqozLf*58CkGl4@WD}+N9im zTtd_NTV@Q znvE-ABH(#U&Ek(}Ky9ly^C`rNa;@S`0Bh*YT#IOPDR+%%Ez%7XsQD^3lB$E%pQv>E zPwZCFRDndN+N4?qPrInq$e}3Dd>c3pR2eKemeEv3hd)!&A*+9xTZtm$LR&|lg)5+D zwuqxS(#UF)PON|Yv=gV;{mksx!oPzvkCH#fZXHc!aa&l8e0=3oz*dlD1@QgvFfHFK z-c^E6?U9)xAsCxt}~PEOpMJsSc7SZ=>Cf zPa}WEn;TjGltHqhkK)eY3KzmZvjOeHuHY(yl?Go$bE4SS3VM-7NM-=|R{uMX<*eIi zDw49fyq^r|a{o&@XJQF=9z_tSWG9RSi1R8M>fM*qlXL(=?d_-Rkmm9t9nfma>P7|! zS#0AVv9=Tq+zG3LaY_6sd3&YoMEiLNE~B9;)7WmJp?<9uJ&HdL1$eh}kW^81Y~dm& zO|t%k#GTX!{CAKypTk8?DQ*7gnpv^X!9l``rO=IR;3Hw*jr`<4IhUjx67tA>6o;aKObUzP&&GnEdseQ{VmdH`jtJ)O#v*Ry`<|YUng>@w%@}m3!Y(wFw4BCT z7IZAYCe_b+-nE{_f=5k4=-S4DAM@Ti*~_vXErZEX{=`D>cj_Q6r16t;HC6$eYfp&+ zSPFK`B`TsTm}N54fK*7Si?c;FXljdtHe5;=t!cb7SLEkZgM=++V;^4uO4tg~fN-8n zlc2_nPohwSxHhvD3GgsCS)_rFy#eBPL|Nu@R3?Xo_&CQ`-c@3SN!jwx=4g%o>M5e* z*bu(?&*}WE7R&{?TW~>ml{>u1yj}_cJ~+|-P(Bp~h2qq1kM4!yV>@?d&-@!@ieZRF zKaKJeJCrzV6G9)Nh2mV9xt2>*7B9-tIK^E}KjrbBZ--)G(WgASWzg>w{`T*6@n|I~ z`xeDQJg6BC%cOf4dN#`>;n2yS0e%kciiKIE7IS5a5&Uy)KV7P;97@FjTzjl`%T&iJ zYYT2&TNR37&#o1!g-BVMO_o7ba=X^v4XTAutn$tHX#UtLn?f#iI<`DiI4$W_(IoM> zY&Nx&)|V{TPoiB75Z6ybHeNm5Ic+|(O{=Ia7J<*6afw?qS3X_cIYra*EkA7nf|Wc5 zsRag=JoB4`HZGJ=!_9yTA_^RwniCx@pwW#k8Q8p7)>{<#RiOuZ16*D69r6QB4yzsV zAq>sAQj9Fv+z9lKmTak`|4X~7l3*mt{X*x+)I2?pxB*yd{PAAW}9aN zWamxoa>)sq^~CG_di_67Xfu8vP=v!14W_KMRGZ5Nhb(Arlq^7#MNg< zx*j5wyZ)jaxlmaUR-z^3Jl4D=p?@IwR4!0Sj?&pQq3ZHAiE+^R>0DT>0%N4zghO+Y zxHL~q+#4yvpqBWdGF;tqPg4r=^@(xirR#4P=s0mVAOJr@D)$k4^95ZAq;>av6p>$* zZ<;wa%Oqju`g`Rix`i=x6X9!c(#uUvF2t$T5hSBH(~_klibQ0}2i~K&>tyXf(I^{P zSN(+{oTdHoQrVvntV$LRb?wGeZajNq;y!k6>utA3#FC>vZf@gkgs#8|(ceFg9&`Hc z8|#imVt_0x8pZ*lAcVq1#;h|SiV(CbeW?79O7^T}Z?EyS$_QzDp`r}&1`-r+BI?qF zB6Bc8$%=BaX~<#dL`UxN2!8v4q6|3{Qp7C<>XPKGGEksD6X)bCmM}o6mY&r18G%Bj z8Ll)1+V*?YB{>6rpsaBb)YR--b07%gk8vl=1^`eYX7r=rKUfBFGLY!NsV#kFc~M99 zGFIj)bK<50&O8ce3SzDu&Q|6}3*r@l8Q3u4O>w9d)@`kSx=g@mGHvOxouCaSN-`&h z|ER?!fCKfTAu$b$vd#zfRVB@^EQ@BAmk1VRfW!;Jc%!&GL<_C&MphM}eWZ)mi3S+F z%>w58d&N~bKk$NgqYNU8-+cxCvhV>)Q~^{6b(+ zoLh><&!vCB494$vvDnH^z?ga^KPPzSLB2V|b5Q)2Irq`}bD1Ha^i%xy-_uhrzzp>L zc1^68Z?nn^Af2t@lC~~_v%pAecFTf79 zxBo)!5Q}Wbf}s&Pe$pIe=C(MX^{y!Xql1A{vsQ|DBK7SQJMtaKwcIAmmNi9A=s6r)G#Oj)X$9qe2^Uhz#8X)E{~2;{XcKc z0tWxGKGtZQo!(tPplN-|_0ZWG02hZ)llVtn6z9J)hRL2aZK3K~5-F|=NV+T_+9*5RN zM>M-zBYe&6C4RpEw(fs?Pjmv`xuQ>|`)r|~!1Evj<4u^5vV1RmI-&-+E{nhR&Aj;r zqkOHCrv@QIVtr#0VBD;I*mzCf`{{}w48Km`-(6Jo&qdPCl8wh)o%t#E!%ovhk39kxReMV*8i4_*=$&@#Bk zeuX~n6YE(4SV3==E&ohn!SmHb4%rjB>gy|3%hfg%I}t!w43I#@GH6gX!An_8HcEI0 zVSH#@UP!gTMBr8wBU!zaD(O*IpK#b+Fh%A{wjB^IwLTwC7wdJNXQUizY^yunXtte} z9}{7VTcrRGv$~EO1tf(2OP*BSEO{&zIkySfUt4$ru#Yy`s8!xgdDhBxGl$TJB43U= z;KUga3fL5bCqtwL36axT&fh4BtL*O9XiLRJE(E*uXWoPt&fsj1-xQxO(VZi4K(Y^+owkV4 zRzr;e?*$$`6MM-PoI0+R1$t7RrY8c9oy)`RA8=-@jGbqXJi|TxAAZ@WQv{1f^HR)q zIy&FaMjGn+*kzY7d0@}3?VzT1m{AFKO=|b8^4=KazRwNgbM3E9480eGc9MnVHGEey zmRp-{pX^>iPj@1m^=yuJM(<~*M|QG=YNbP9XDvA}b9-A3cOqtn`^cnPzW z%Y@6{#n^1l>11OL26&+!zKS4ja%Mds^PY&Aq^})?gE`}P3V!pcbQpKFg{7c+k_(S< zNepM1Qfd+12s}KNDqrEjbT3hF3pjtH-cYw9{d$IVPUcVgR0j*`7H2SiXC!{#=p zqIJVZ1IuaWO)b-uU%Wn0A-&>o}gjdVBquqfxJ3=;{ z^p(X3N%S^ud^#CN_m)@EEqt37QNP|K9~o%|tmS#TcAU?D>F@QG6V~!-X7tY7$T4F4gZZVDjVqDZ(~#&X#;n#A4Q5 zjK~EmGu#z`beQdDNe2fTb1}8-t_gQ#$dh=j8P0RqweVIB*|vxd*!^dSjyXS|2jVP! zmW6Lm4!q8V_M*P{2a$(~|Mxi3O_PrJyQhuLAnV&B?K-@`3WjD}&ELzL zECUztnAIJ7&M)fYkU%CZ&uYA6-rsG@Nw+MQF6HvnQ41!notc1r7Hz}HyC+d-PNzK_ z`dwKi9z^vv*M^BfrIdgi;>a|f9;Re4iY892Tm2e3o-jCiZ?Bfd-HW7NtDBwn-|n;K$9hM~589%>vsEweOCSE*LVS8% zPQQ%~{oO~c(ap=XAQb)?Cq~LVYjqj4RaFxr zCTLsqY5NNgFHZ#K&h~hqj_iYEVh~wWCt&x6_*)GU#cBas3>HVSxEpsaS*+I%Fui8u zE@xgcW{TN#!%G%5_jwFwOCV8leuMl=<|JjMuN_h!KDjj<|| ziY0WhCp!Ve_-4)cB7#OI8*egoWL>t3TsD-(-=Mkig*Ki?E=+adN7QN(YLzG|1>uYq z^NlKrxWs9?cdF>=vtydRFK)5nEnbHK_eh83(I+=ESo}CzmBpmFO{JJRr`pb3=z;lA zfy4h&pBi4H!_~c#DEks)g|Fh9QWT7?q0h=85}5}mvQdnf(1a~3m}!$&;^~LAbBLZMd{Pk)2Le|o_O>EaKAp7d?%mGaE-?~j zw-a?0kmPa{iy`C|<(5I0PFeO4k;9n_e1Zdr89WLH$%vm~Gch|oSOQ~`Z1KL-_TU@j zikgpO((%33nqMj$3ByxU$jYr8sJl<8qlK5$)_TD#w`|0HsVy94D`4svid`KizLZ#7 zo*2A2wG1dd^rGnb^!{~`RJD#tK=7Rep*0`Y?j`xs@hA5rdh*Hzel)md+#M(S=*Q#4=uejB?Grlgi%wDnTj!G4_;JrN^*?dID8=c&p&&n;{pFMr4Oom>aspMtnAcOQXvM_jsCs93NRWk>Ryq*8TG20H0e zFW%rt3!~8pp^wp!V|3={%7P=E*8!x}OeU^dNgq4nyP5>R*v&f9nVQ(hdvBJoS#C~b z^$a*m?IaTFSr6Gi#Li&udl48(!|7cJTM=k8?3&FbB4W|<@r}&3nj~C%kO4>_GU*-n zQ_|?I1je!l5`WaI2Hs?c4m2%N-Ly&j$cQDP^=OfxyMQl6))VwoN*sPIVFO5f4ipGc zTqi=fhge#%2Nc<~NPifiP?Nq76wtlI0x^qy3=369Yu9>TraI%dx#uwUza$0Uk*hqL z7PX9x|H3m^mg2IhM{8M%r|#rkx>teoevIT@NBvgQn@E2G&hj%qWD49r(j&G)ciewxD;(UUjLquB$b z`4BGJcZAY`!NR*GRRTb0u?|Ss0%*yTVCL%Fvx^rf?$kgCdwu_|uQp%o^=E5yBkq}J z%{VU!zVND3C@Jbi%pAF1sql!YQzdH$E({SxqBbh>PzmZKxjz}sj;v~&+?^4{U?-h&zGyVamv|7BWI35`Co8~2{R(moX)d_xO4!L2#HHiI$e%K0&WAHeNroLqu4Uq1EsfTzeLq&W6H0OUKh(p|2yBszx7ZIkhj;?+Nn9)pGpawyp*Lui zAuby(iUeNPwGs^eT~AV(exk>-H+U}+?)u4RM%T`YXUxa>7r&eZ_67W5bo@M?GlnOcmSr}Sp^d3#r@zGBulIMImEdUW zX|0SsX$ET*Smrh(}Z#&N0gQiTW zPeMWB5Fuv5^*NaxvC$lzx!%q4PnMXL+^uBxL#1@4Ij1o|uuL2pckIxe=W=M14rx~n zusyXqb>|rdKQ~R3#BWNBp|-_$!FMdFG&PASW>m?F7r8Z*{#q)4@>I#xdR@rT`doy}u)wUj2`Xge>p|B1;*%ib?$gx(%AU@w{#G%M3t!2O&|b^?g$esv zeMmxEv+5k2sHBc+Q$>ZNH;wj9zANAK9ttA(^CrOY&*b&Y2UcCu;N^An0W&i8EB z!sYD{x<%vEO&WZiO$qO&ku3}OK;L=;9Gk(OuoB!p3*0bUC!S|a|BHrkEE+17lm#u- z%&^i@=WplOo6 zkeq-`RA{OvB>o5cm+pAAs%<7D{X-bh-9-GaU|CMEX%6e{s%}}L&neG5;_DPn{}XKC z5^Prz@!1r^vL7cM4!cJdyP{)qX?d9|yG-9!*#xdF?&Q07IEyw`aeMOKPI_B2b4FYo z1v;g)5a&x}ncl+$3Io>e$erx`NsD}HyI24Ux)fKDIlPFblI0K~JAdlCr5x>cj6wq*pN}p0_@+grosXWTfPImAyqg)QBAx3*FRp&f6 zW@DCR7kA3K6QOVMm0Z+!@sO+ffI$vnT`f$zOZZPb)U%J!*PI(@*C0}(u^n=F^Ve}d z*|bZ;)9^HuPAgtZKKrCC?8%#i<1hf>_kbSz*kId6e(LICN15G`mo>3Jh7)F}E{GdS z@kfmIbiN48Q6>n4c6y`2h?H})efZh+!Sds>!(#+_qHO zweS5v`|`AHyj=Tj7BFJ@7xYTZ6@5l?gMgPppcjE5$COX1KK4mxd$c^RvlW0}X`_$F zjGBbAJTJF3wX)~9gnyxvU=|8~jDk_PB!qi~gY?V8hil6960d-x!&Qw(iRL62?#GBR z0fm@KSKsA161Z3GHqDjK-4l52I%aLD>0FLzc19V8qwGxx`=@AkiJrQE;_QfCU`+Y( zoG(qmpK-Sry=%d4_WeXBnP&j#6TOcMIdh?Dp01tdl?DcWrsZm`u2*LrA>HWRa%@Va z543ZH7N}9t81+TH$HmiQcu$9@j-yFPR!5$*8&%1$Dnw^Z=%Cfv!bO9s>@Jm=qXjyX za=ftVeNh~n*HxTmA;_9cE`q0sUBkR(*#QPYB&(%e6wFwe;FMl1e!E+3HgZ&aap(&gLHTPX^zsn;J; zFV!~h+@qy%Oq2!UT3g6QC#3R+sx;Rzdo7=4@#+4MCH{awv!x@~QzO>UAfYcGVT0{$ z1Y_q6+qfJ2Msw0Sy$yL4-nw+7B4cXV%XQpHahJrBqSsMlt znqe%FK^A4_@wFaZCb{WcW6|&nqLa^_t7D8VmaASGR1hn_Z2<0`E*vWM``MRMb_59+_e}kGx`Dd;!&Z$JmiKqa-HgzJAZ3AUV$YZRp_EE$XadrWJB{gM5d4JK z++>Eep$}~~Xe?BA=v{hsg{LaZ6V&C7!L-*nV!L4QikR z^@7OB8U?1B|FD(%H{FqKVrS5owS|91U@pguC_q-plkdzW|t_ZCbqh$<_mQ(jN3{QO_T_stY zCf|^o59vZw%e`=jAW>3*d|DkzX+_tU_!oC0bGKN>+YQu~@YqBPss$i;YSdMi9$v%N zq)KiE>-n0=6fVV$2!0=sgUkAT0mZ=>DmUtQ<=5_SgR5QwfwvCw$e{Ggu^8L6xAN23t*Tuq&ntdFHy(AYdQIB1blYq@8G zQmYxM)ojJfC7@Qmsbb|yt038I&6^ZpphB)SfAT%uoW~EiIKa`F$i44SsRPXrIEIIl zN&b~tudA7gkif&s#jr3105d0s=H4}MBUl*2aj}%cWYc|tNIfhioS6sF^IsOpZBy`Z zo!r5uWb4i-6USu1^m9rnlOD+=wrczBin#6d_Uzs$}bP7Qa9-+ zoWLUW($_1bcVb^IsN^0`X6+1Fkpc=)bt8y?$Q!3S+g$07bO!Hd z4V!7{`-FH3FYR}32G5yV{XZmKWmua%+s579rMSE6aCdht?lQc%yN%-R?ml!_VYm#2 z47b5>hV0{czkf}SGi{jDVl4!E&=@K_bUQLi5rKW;74S8tIgZV2XnwnG&(}z zu*kSF13MFd4_zwNo9`CtR;f#uSU?|i^obNB7&yQ#d%D?C3y-7joa6|9R|C)Pc2c4C z!f}1nzH3$0ChB8vEDTK1L@o9_EPl)6WY_K4ovLl6D7 zk@9csLPpEdBOGPlu$G3-7Z^0ASeQRuY^!BEdEF4;zYYNd-wS*M292MHk#Q*o+YU}i zF)z7obev|wHWL>3UV$-N@msVk_g6TEqb~79G=s*HyrkgxfX>M|y53BX;A_iYxhwL4 zX1O9QZvu=+xXID_PoRM{GLQnWA4m_^b=uNoBiH(h*MD z2S|7fE`;>t*20pf7?rc4IZ)L?wle_SZV%e;F-*-HYgg-Z?Z*7h2g06!!u3!JuZ(3C! zUG}-p;{4MniJ-F*W}_l5sj+xm*8;*Sc z_napn1l%>?g*%O}==_x$cg0#)Y)Ge!YHUfvSdeDjTf2^^j1eifRaS{2&Vl-l005Bw z>5HD(s48|bXtQOL*tb9BXLJclj~Q9?#FxZ2Hb;fkhHeS-U#U1+?+%+l zea|~566VgJzvpVto6!T0n`LKTCcgiRLDbL}<#LvPrAVd=N!c&|dv5NEG@A5br+Gv@ z%bw3Aw(&9*)kglWC|jkEt81{j%DOJeM~gnEa8Ad?_vD9&Xc#93p{3TVcYu;sKZ+&= z`)he@IO$Pi|KBN6evh(ai}1jZuRj}UM%*v3-JUv@KpDuBZ9vM+UUOBAg*13-s&7L_ z?;=$OoxhMErm1tc@QU?{4KJ}CaEs%l7e?&Xftlj*>sgGYBJR&HEI*S0W`R;U6Iy+rF*nWDuU6W)-B z+$_a*GWvQ%uamM*hXB(Qgc?+}i?2gJtH-eZt#dj`=uspS5hoAli(=4CsC2HoaD2;U zTl44g9o9vqT6yq2$tMVu4OgN)=cgNMY?6iCKZ8(aABhwNz34mkVJ5a#q|gGd*3g|E z*Cs^$IaY??#eXjNe0WE#rCeZp9UY`~voEyDpvbOLlyQ#4mSmXlXw_-Sy71$il*Xex z42V0`Z#D+s2Tfo49FK8eg={7D7HkD9#qr>?;w?wdta|8v56#Tc z?_ez-jkGIK5+fBoPBK)#+e$~x@X*{Mg*{pQl{*`o*5|C}{tXEtX{WIt)`!bR7KLWM zb4xj=?I9&TJHMNsO*b59Jndmx8v zwqSwWwi?c*I zG)UH|3nVZ$iCYDL8zLA^f}rM&#b1xQ-+fYgiVBzP)kL2_EO`rWvfTbxP)T$uM!*&m z1~j_yoqrE&y5Y#$Ne=;e{lz`zPrB|$6QnA&UtbU1oat-C-!9H@VH61Y%{J>B>QE-> zOy%uudT3&nM%f3;D0=>kGbJ$&n~-6Qn{QZR;#_7&+jGe;{~Eph4ppXaGg+ zNC*Rwq0C$G`&0mdUdU9)pZ1*Q&8BUNbsAStubB7xN%O$ZI@+o?U$wx<0jNhK*b%AG|}oHhs}Fa(O}$%u?ffl=og zT3jX=h);5i2 zBE9kD)`>Vz)(2{~kz#Ub(AVUn2a6V&MG02^gzqgV;2ZSEB@n~h6+mozYE^u|WpzvT z#ePhP+4*^c6)>f`S>(@I9oG{08iWoE zXgByKoOc>Meu}oL+IXn^%I5JZJ7{6;@f4r#L=!l4@fcXdUgkcRD1=1Gec_ry8F_+0 z?|DPz#=$8D27SvDz=bqK)zM#&)gHd$6Co^XRamld$5eA6a&Uc_pEr||2t+QZr}b|8 zG7mA6;s``;xS;cHbu$>Bn+sZ_yHtDD%nMoE44MZN@j(6_v)*te$G@t&1*R?IfV>92 z33QpBA*2FM(dFu)g^7|Z+%g?rZl#>&yOck|#r z8L3oog}e>C*3^(#yee~E5ITIBL)*0BWaGz`}4zUr%=c^}q6 z%hskkNLc!$Ao<_!nHlB+w0ZPq>h~1y2VF8BI^y4ZF)USDZ*4AtbTB=NTf_5vI>Dmf zJ&cdM4`e?eD78>$uF>(V|2s=Rns$9hoHZD72RHUJR~+}Kpl6dVWerHmh@6oic&UfO z2IlMK#Hz{uMO6mVNPw^Gqr|0a_GP8=64^kF7|1SY(Pqj#75zg?Kcg`v!2eDje)74v zrjta^ELI+bmRGM{go%0I>?chv+<*EC>!GshIi>Vgr#9*#ud>}Xkc|MU6W0BgK;*No zkyjR4|9&*PV;CR$dB#92hD|x^MMYfBQq->6Y9NRa!zoyP6z2TvtDjeAgiKC7!OC|~ z$UW{qE{H}i8c&fZN+s+b`*if#MZbRf>?U1T1q#N>5mD!m$^FS%0NM1PZbY1}XWoQ= zp;dYmp;OJe)858$RMBiVAnhRMUm@c1Q~DtSdUbjaN!U|d5m73|r!Ux}igx!51UX-p6SuFf zE`Sq`oq1}RUyhx7DMm*lgzN}LE{ksGGehRk3fVl4A&ypL{BeB5BMzL$5UK9JLi^Uf ztfv!@q3&_=+gPsUfXPlnJlq^>V2}RG_vfs_HW!b0yXmLHLLTM&`C*|l!Mj_~+H^np zs!q%3lCKSmHS4Kx$5P0E`j0a zwN)eU@mCbb3Tl%o>j4z?GfT&y0bLmkKsV#xZqMyy+sQvQB5m49*y^jTlgRFY)Ny~8 zo$o%NiM{;bhMv{xS^Lh}1MNGCrQE>RQ?bv)WI%@FJt*=I!P(AzjqWCNI+2|%?y`V@m`;RPd*w{zKqf^>4%*b zYm+Uy3?Hwx+{LYcTVcG_^U*9!-Q&CUlXhCe2&G%{+qdL!A?0HZo#EFO2pa$-BYPw- zYj#$!^7wcJxAVHc^#c<`tI7ZG^a;_;AljjbXy0^GJERSvQg8B=nLRVT&$>2k(?d04 z4S^=3t&A5_iqpR}5D6Wz-&y;~gy~a*LbD_#H^aAE)Vtw%=+hgs#x>NtTk`?QouFp0 zBNSL?jSifI>Y>+Gd2#rl$5{*ZCWKA2$_mG& zs9|sHYYm=BY|*2kYtca^QUBl|W^!uKRD%1TBh?R{VstYKj(Ft;>et_zjV$JuyJvqV zuQeMsZziwcLmv1C{3GC#zQ&{K1WTwMVb|OP5?&k7Qd9K=&BZso$*WAhHT!9VgKa!(w9>x;two3nL&|# z^fuW!F4Ff=RWZ?}jo(xzdm`)X(>^0-y{+a{cD7O30K+;dcWfZRJVpz!3`;lYhtza}NtY7zKaox$o0{i^6Jb z)N9L}Yc7WOOTRkvTIqD&ovp@EvR4XKksSu7ZfcsmfdXmG|MtrVi8WJfRy?ksR@t}u zI&ZA01RT5u{TLlOw7;MyXyGyPIa z0%J?V6XzA%T2&lRegd` z*G2^Sk8=!zkK-{ix9md?&-Y;)8MY0<=^W2SHCCitCbKV=*><xWn_hGYOr4Y1n`q}K~@6r1dW zEEK`k?@wYx8Ej=Stie`l^nK^~kRLM=sNkTO>{-wnhS4HlubiMHMpF``7$IW~s&GzG zyvR{2hWwmv~Z*)5DPHv~iuD#B20$5b)_ItKnh0!{59 zRi2g3OaODFSNl_FCV)N8mhhU`75YAY7}lkVbw{aKWx@5IyeR)6OFJ(Gd;DDb7tX2>M)qcz9e<#LBF)z^`oo83Uu1il05cfKP`DeBNF-M#DISB;?I6`6Z-8D^LfJl z2D0BK)K!Khk>Sj*S=2`to3_KRm!M-T?nvEFuA8Z0WgP=9wtjIHB;8-#@|qGJlRD;t zibjbG*IYdviG|CJNNyPm+2CU?kA9A*Ubn1!Eo^q2BjkE+J~VeK5$i3M-7(O-|M^B# z|J4ei2=mJXqRlG(5*DS4Cs(IgA_q&hFAYQXCetAh>=EoZY$sus(Y3_Y$p$KrxSreZ z$5uX`yGw`}7&$yO3(*yxlkDv85Mly>`4Z9OOA4j<@7 zvlM1GITN%(A(?-*>4hJhGC>}ZQ66ABXJ*92$h#ltwl1?!f7A^M_lemV6aOe3gV~G| zOuJJWZCms_YTA6zt>+&A6eu=#ZeBk{kl{T@g5Z1I{7egy%&ARgJHS08W5Mn&1k2`O zM{_J?Q4YTwc@A(MnfV?8Mv<`y3L(PZB}1H>{yYkUBIt&E-XEQv|ACgn?*rAwPP6Ra zDD}3=`W|#bQaFBWX=WAOh*M;JEzdX6o#`;lw_?x<5z6;^d66W^_eJ}sMO}{DA7HSC0jem#`|>B=_V14tKIp8mg0W3(_2sgxtw^lgQp|?j1hW75 z>2Q9Y`4KdZ40fa#-$6quz6^+*7t$wF4LCQ)LRT-byyvMWI z2-wb9Dpq(3wKpbvi%*wfw%mi1Q64M_6^5H(Fn6RbRmT(UxrDL_wp-ohpO4E3CB`qK zSA~98l)OAs@a~ttG-x$5V?^7Egf&RV6i#AMCcl<@C*1_~whst4`wiUG$ zlquO2{RHlw8}IgoQhU2#)fxy3*v3KQJ}iPP-`}X5cok$X>ty_MZ_7Dri-g(nUqDCv zkFS#%Q0avf#+c)80faNnx!(aW$k6Dyx02EJd>R?}lg*#LkeaSX3)yQcj+fAMxK|gL zp*7O<8gL<(Oko)2Li2Zk1Dc}EMp_>oudg(YY`GMbk;2x3*yDVKFw57p6M=PzY+jVp z)c%)*+FwA+z0wD@6?%g5VJZGLV@_)c)4Y2SY1?;3sefU!|CSBpm6P!i1XVz=9^ja)@l=) zsRVe-O!B8$;DmlpwM%z$Jik9{2DDnsn}^iICq&Tc4LsZ8@ioJK)3=?FexX;6xBGS+ zoZw%zK$u@*;u7;fhx+~c6pn6}GXDsUg^q&}9ILOhw}+P`paJ%fzCk87vnP{Ep) zi=`l=>h>zaO^Z=~{Jvd7FEWDfKMEJV6`Orl?D_qZqrm4Y)T%gm>=ZJWe)Sj$PMlZ? z(LveNCFEp|N(FmJ{a(r1o4zFRt!&k2ryBTvc!ATa4F99$QAw0`Xk}!STHmcauTcq- zHY_OF*+j4^F6f*b9YjaeyWE3RO>pEK`gsL3KGNzFr{;jeidLsjM-t?-bZ(cdq8>Gb zXA;W#aynD%u$oh0Di7ve;nV4lX-v90R|E6fdaMKv>38U=s1HUKHxIiQ_?Hg1rs`c+M93eJfw62HRX9Ny1u=3v{6h!5s# z+4Ir$UTGgOb1SEeCiX9eY~Z1?>0eFX7K?;zr-m8#xkp-RFtX*VyR^g&A$_PZ{M6^< z%SMMja9+Yh^jCz$8q@w8uqSZB`sY0)z@6LZddrexsxyN~z@|s|MZNs&83Z;9!Xjll zvU^hf4;Kh2-fCPb)x|72_=RQ47OaZZimK$dLL)pRKlvPL6vtlqxTNN13XDjeb>zO# z$Ny5VGh;Vp5VQ3j*Ul_6=q;Em;I0bv@TfK-I!c||^w8=kKDfY7yg47)^N+S{^Arn# zx3)pcHyhSyvJkC2wI;Iync-Klyhg<6;$Vpgf^LsCB%gkNW!RyVh*4aq!ysG@)gte# ztmPpid0@eRD&!*LY^%_FV+%DaUoq=ik8Tja^lA`j2Q>~ff*jDF5RH+Se)k(x3Q9$M z+z-n6KV(Wykoc=SLLHs9b}Oi(YR3x9h}T@4?CVY{O8P-(crLYqR=gr!oHrql#0OHn zXtv+_iR&eU+y!E?+UrQe9)LiaZN}BPiTDiQ3Vs2rq)yw9n zsLM0(!SL?FyUMl0BQaLgs}*(~03x(bI?i4A+c*&9=2}hzNTz%GuX%naa+HM6{YvoZ z3VP&h3i+~%sflw4QZF7ma*?h;Zu#U{^AH#^tNAzdN`UP*B3JPAo1WW;Q^02|Z`ZMi6>#+VZ&@!B2(fbZ2M%uJb4%ak_xfYR zPdWPiR^STwL9wmin7Rsc)9A@m<Q3j4wE8Rshfpp*a%UgRlIKx96nVY zUxq!2d&o;H=!8Wm$__*%Pg$xNypLUtrN6iJkkq0yy$CfRm--t#X(s-=Yb%l{p)H8f zsj^bb79+bb0X0I}H3HvJ)Ba9Z^6~jSuEstKNe%?k>nB!Ty~k}$LhUFdnSVV!6N^c@ zJVd;c2)V|4j|B1AEcExz!9T5Va*8=u%^(Y*4SjKk-GTd6xs4$8$wlZbhk&dI56t;9 z^i3)&?Q-K1b!|o%=cqNUvmwtoGtmS<)q=B*gtWjG3aa2$NT^Kin?svs_21-lg?HnX z&*hJ0Ekc}dWJV-J5^EDRwf%$?;QD}1MkezRz8*ot3nRuK(GWG#a=2VXD)XIm7}J#) z;Y0{>!>DTU{fcCpJaWhE;yLXV??X#2QZa0ZvgGuSue8yq9&YvT!e%#n1Usy*<*ZWl!^d{D*y7rns(UvC2yT<-+PnpGI^7i?U~ZLQI(F6e6X zh7H2P+P*6PUh_1j%Yb?2bjadO!EE#X6&I|F#tS;~b!}aEgz>pdYp}_wopnEK+8OO( z!~ZUDI_4LD|+|d_o~^#7Zur+*M)M$ilK~ z;w(X6Y|}(0@}kYS>N!;jVHj~*WHYgM!rdrm4{ZPBB#w(tiury zy3>*WVxI}EtawMdZ>3F%=DO@`^4y?R z9n$rAOZ}T3bq-XbtfSmqVKmRMcH#jf&ww!G>*Jge z1>Eh0RkpEmNGHpiKY(qZdMSQ_CG(+zrWwNdLz}P_y6n%Seq(A*t+3Mt3q$P&6A02W zBXX?Jg>~xb#V%xgv*|=&n$1(k_JX51*Bv)3JdobbE01buM1}mrnan&MJEH^%+E41X z5`;1s?_T(O=I7k<9UL=#A`lb0c@$QNz3E@s7e*sVEm=)Mm+NS984@FBA5i#qjFT*ECR=BqQs+`?xkPDxZq{pgi!PAc~Z+0c2vG{0++m($26bl^IjN&XS_ z^az!aoTXN1Mnad5Y@lZtui*{@VMq*i3%*7=!Gbj2(;dfYE0)JfH>lRd)z2PLlR0Q9 z(N`8lm48t2lc){sS$&UkCm;dHBE@VkY&d-arwR9=`(4$v0CV^sAg&Irxad231s?kT zu!!_>-u8tS^S2R?Q|-OjLI5}CFZf(D6TJg;%z@Bci?!3JmHP<@!;f*+&{)eWjd+om zCcX-)X=XPyO_V|nP$Rb#m;OY7!6{=2ZM^K9S?(nhQdt+p4;gTgX!NVn8b+4j%E|*T zjs?Dp+lF-J(;vMl#6iRUN?ODfxEvY2T3eIIGp2uwWoBkRwBl00%YaG}hg zvkAh?4QC*0JYoyI%C`HQ!<{#Y<%ny$C!G_e2vr<=iLC;5utDNWl9^JpMM$S!mYg2R z=go)^7(lmuz)Ga=w8K0Ua_Rq4v1PsWd1|aCq=O+{Bci%jclXP*4iE(_rCJhi26Lx7 zxT+%{iihh6!q&yZ9lKPu)k|YqX0EM{{>NiiJ0;jLg)y6HC|9X5Q(a2@O0Eqg0!yKn zv9jtJhG&Nii{%9sSxvJ7w5w%lkA#?cVpU2IuwO-VfJor$Xbr&>K&e6`uNtZgPwsRg z)sbdlm0oQc%K6=RFR3tZNhYxb=h>*@ehh&{i1dg5$Xts?;wzD$_*ji}I|FII5FY&} z;godw-8w!UAPoARDwRsvg)K7olJ6IV>H0$I{uNx{$0^r!xLY-3(o)SuqC+c5Aqw+- zF_V~A+Ao6sbr22q1Z!LajLZ`$V96N;@XKo!R_B4gLL5eq5lX84^hE}BfACEzaL0ZHo;NLXgPv3CGTr4y zrfxU%5=ZURTA|IgZ(Jx3gF1>Z2XX|no}!e`j+5kh;%&S?Rw4X&e6N;HL2 zC;&KR3F%NK-Ap|CtbShbxGahp8juDpVC#_kwKDw-fVFT@sCjB+3bL7jwrw*E`kX*O z18vUo{@&T(0O!_eL6TO|daFxTIs(GG!EmwVPe6BTvj}g%DS7>=2kc+J{)P&A$q7DV zY%_ND>!UNmA`Ii$#b9bPbM`xzH6hMxfOxmS=ddfLvS)i3L>j0YNPWiKJ^%E1RGJwY zs3H~ZkrD0+{fX%vS+aqNZYXC1q`|C2F;rBKIYwiD&HI7^#l1vyi+F~}VhRtB;1*k#LJ|DKQ(h?}bcnocA@+_sNv zv5Hgdh(pNuJvM)*1so8(UR5Te+coq~=FW@q$2qFW@hETRRh zOx&HtQ!2ePhB50D`j|IRA{-HOq!Lxb%42Lf#DEx?Qx7Ta!$b_T)gFQET5eh;I}Iu$ zO2aV=sVs}T&X#t_aic6N)vg-iY)R4N>sUcDyx7Xa%A1sF$W8;DtxOUmEBluZt}31T z#TL%(D{GMZ4I_`S+%<4!{_4+49EVFmCZj8}r1F?*yv7RD@y+|y&b_F*hsz>r`M zpc0=c7X~kQVq)8wfa=y)Z#>tM5zZqB-`-LE>pBr7X#aJ zy)1|O79rZAYBsMvADW$>dsMOGK?c|2DAkFe{5BEG?N%y72>c;8BcY)VUf4(G3{aY8 zGoR;1g}ODo7Brw0{k1^huMhEBahL`q*~XBOQM98GW3${o~sKCK>tzaW`*D7$Oi;UI>y zLTm}xURCnb6ruEGxj)GP2XoV=mxU+PkLTZ=VFs9ck(>EYJr|lwHK7P&a4mGxkhkkq zMkd;0ht5Zkt7~K7++^wZx?Z`I^_8y)t3cDvyolF8>vTNjTq#8|yz2%8q{-S?csKsv zSg3<#G|-0lAHnS#ttytwBlhs;6zc2RQoR0>oVlA!URh{6o#~5DM0D-0k5E-eH)<)) z>coEM^oIgjk8x#?AgB)u7!$7&t9m-taE{RbHu`!Qe7#igXg}At%^=ZBUp{ zEP`8o`GzPYmLBTLMZo_!$^#2!+eEQVULx)tPb13eW{zXG7`J~MX4%d@MQXYpzxcOG z4Bkjk{9G~WF)vgB+q4C*fAl;vo?8(;#@TQl2kF_c`ZTBi%$N`oyj!m`5*@SZ_5qvb z9@Q797hBcFBroz@qiHl^BHcRINlYA0Ei24IRf7;AJ`IxTqL!@4%Q=i{4><<8334a z=9?j7UgfV)t}E)rI~G3{-(+p#b1ERIEiy#hfy+2cykVh@@%DfVFy8`5;X5_9p>;O5^fw&K zNi0uGhn!4ntP+O`NbyH)-bg*n67%{Ykr`}1T}`D}!w4o_r$J~{R@=%Xx}kQ%*E#N6y)qWyr$c-=UR;Wb1%(Inb6x z%*@|kk{;Fa55Sl(t_S=;fF7Z&GVc@e!s;_+Z7^{iyt$}AbK7$>&%%dFiKVAw%_7uMhr@9aP$N(KXwB$Y#=IKHlyk% z@ZqmmP_qeRP2@7X$TTaVeB_}NGCU|R6U@$e<+|pL+y*xzG87Fj(*7&R?~;jbBz|hi zPxe-?5ODnsgU0q7L?MzZLh+sqr~nyrfoWy7isQ71zkq+n+>M|?ZmylA9SJYFM1fn@ zOv&8fr12xAf21r<`jW=I|FJdoAN;>8D5%C!N?Qs1#vR^e&Y#KrDsL~$#A7OVU8zig za6-)*&cGYHDrUA5C!lXj8{eS21oO)j6bP( zI|Ek#M(co*jTzguu4k4Z8+-qX6yrTx{^5W6p;(ZEir@ey9upJ4QQI$O-t0gShD2Vf zWMe$=S`WfLI~YArQe6kh_JCjK78%3Q;X7w;b2Wipoy8a*v+3%dP9)P0O~XZCS$u)Q zcCv$RaOj!7Ak&X5zy)ZzqN&o@5+t*Xj9_DBdSn^$HzLi@Q@>3V?!6>+PeVwEm{(?V z4;R0Wl!wMe{nm)fP`GrU9ccwk6%JG8RY6Ms$Qba#qb%Mz!LhB2+WICkj3gUsPesya za4(JHTK3}U#!%XSq#K5!(EQ4oD5sy!n0T~Bp@Gx63MWj{33&Ys2~`l8KX5sWe^7+q ze=)Twi$ePw}O85o3I zESn#uhs8g^^p-LRVp(j)5&23(>B<72qklSPheXk*GH1Ace81QLoF``a?;nO^G21|Z zO8G;SI+#i4WbZC?BdLOW~J+Asm)GR2?hK>3Gmsl3sx|Q0R*^RwL8NfZ6Y& zC6mBu`iVs`np=4+v`Z$wIy4y>i&GaHX&WP~QIeLkwiKfugsoLRgVfCi4XuqIwwsg+ zxGf_Ro>%>E6n-?3y~z|KXiw=@(fv+f~FwpiY-~>n>Bk(Hi;ZlhGQ| zjw+1)KVhJz`Ob5wYd-EQFcp12ayarmo6^y#05!*)4lpt2`rD-AbI$Yp$`?2dUE1(2 zg%6jQRhp8wwtnqUAq66wG=Icok5t5M3hIjNNl>JHRhvAWZ8Va`&a!Y;;T!9X zLzVJ17OC5d4u(&4<*e0^4qCSAMxzoJIM2 z2^+V(xHBs6HuUBt6P#O$XoT@=zk@T`L0Fg6Ahsoc3dQi|5Sl-YBbiNjm*n8HA$d6O`b|$md8&TD9vLj zo?XISh9D>Sn~2W<6e}$=2)hYL(&z51!tOV`B^R@K;$Sol$K$=kRRYIZ59bN)EC85M zUXP0XGb*RZOl_{L*sH1pVv&aJ zLvHN&{3?HGprZo$Xhch%i1~vZb&k{RWTmxNA z#ZZ6P1s}T<@#zbar=G)2C=d^^BciVTS7~-xZAjQJ>KjZ7q=L>cww=K>i_P;Ljl)5D1T028%|+&oLzOx8O>+y zZ4f#$VBIci`OH-76GHa6f5eW&I^BL3Jcazz_`Mrb*HU zM^%z*n+U_9oo|*g-0@myp#UwP>2j}km}K%r#v3h|sA9)*ZO(@l<&HLaC8>ZV7)BhODy;h1ang4ORU*GpfLa)v&-T2! z(~luif>SGK9Lt~7DS*w9=q|R!aqeWK^Dw$p0PJYA0Oulz7THpc{Sr$dEem=i5TgOD z8l_t}?#V#I31--sSXVEXlF%~y3ErDfP(H0^Zzzuxzha2|dosXjG^~rC8E1A>bh4CA z(A*P`m<*$TxTR7jlVeFVyebng^HD)`HPguUy2W2U?fK)Ul=$GG+JVoL<nyGd#B zD*vTcAZ`m#Y}q8c2i!W{c`mjA3{$HL8FV(XpXMw^37#QiG7@SO4oZF52nHB$gNf?u za$YUWO34T3&p`Jo91gH*%<{%SG;F&x4S;J)3z3Oif-=)5VdB=78-ZkwZ$(#p1XLSZ zi0BmOTD0v3jcoLkLXIVj4sEYAtt{~4vmr?9FRXg(|{mTwu2fR{0Ri=uLK8Uu$TW^NS|XizjV zbuzLtxhz2(%MbwC9_6bvi7b6As%tppjm*H0iCfsjz04Y8;UzeRH~s>ZaBGmNJnX!- zRhmW?AsW@y0`g{OFwMx#EQ#c0ufzHV*nK!%I~|oTTwR9lVm#W5_!`erg>`~{gSUZC z(QO*$fCn@bl)vTt#)@PiwT4lE2LcmPbo;l^W5Rr~Ed=z9z;>~4CZSM@kABy-G4|W- z94BjYT0g0)nryuuVoUJPS=bZ6H0%wfO9P;eMs#tG^iu_+loUu70;ESH1b9mkS?3hA z(kP{?%>Cn?F)+7}Lcy1v(qyvVq7mJkW&9=k&Z&Ona~iRGE^bn*c&3(+fJ9{WJEV<* za>M2&f;O<|K16TwK1_qh^90)F8U6(_#~_3h7A2ndSn`fR@@qe<~^k}<(*5p9v_T6RL1flpt&pFt#2I%iO{ ziPK2v3*3-XGrDXe6zmp$^AibFj5)gO(N}2KcMh%HX>sYa6}M31w;5JbaT(KO}kH^&DKvZQiS%QzkpC%kX|BA_VfuSVO8?oS$rp+GdE;s@x@17v zaHIgq;NMT!V)F3L8Y?{a$w@7P;uY4%t9(n1)z?=by4lU2~`4MVPwkJ z7;o|ZZe_2`JyFsTjA3ns8#ETnK5L|*bKzlszTW2qzcia#M8{vmQg@SM%Olrgx>rwz z6NMXN{WqRk`VFYIUv!c+$$y2c=gV-jUso&tdVrAU3(V@|x_@3>qx>{tt}qpBDz3ou z7899-nBD7M%;O7v>OJV}g=XTLqd`yb zS(YHJT^Kj7VrDwnt;7@p`z+}UdEGG>@t9Qc4qLL)U8W?M-N8+1wQmiY?9@|>1!cB5 zY_D)$zlr!^_{pl3>=05g#miZC(W>_(b)|TMf;iDMjYOdZ=qNFCDtIFhkuusP6TH<( zx}?nkx(>6~iqZbD*@l0~bKz^0G@JH%^ZWV?rI z%ZjkcJt=IV%zg}@RxrCjZ&7T-25V+&Weq~PWUHY@E4vgV;V5=~DrNtU^vPJeLKlTgb-L5<9j*H~uVUJVg$k5LL?5dlxX4_U?@JS( z#Indyf=kLZ70&rR?0Aq*8o;`V|2H2 z$~qUy%SHE1XxEE;X3r)3sl8T@Tp9$8PAK&{edNu|8E{=jl&@3UYB$V=>pVPOBOx!F zTe==Ir_rUu_lIcY(Q>jhU4iMkm{wVr2JutwS` z347c|^OnE5YFzST&ztYSu;3-8i9i!PwDV)EoQ+$BJ5(IW`CY0dtC^+sgZ z2KbxC4ql~=Oful=?xy{_}JebAK{k`J$q9%b~>km#a3Qh8d` zvVbTl25jMHPo?2)7AAGPVl&h9VKAit{8ac&I7T+HTL z+q&t9)?sw=bhXFW=OqEk)v*@c3dxOKdJKOTO{~(~3t0LrK-&gFmuGDrEp4i6ol;!u z@Fl4hYVs=V*Ba7b@*t?noYL3`bk`Hn7sCSv+6Y#4%@4e`Y-AHj{WpiY>9mj5^BJe~ zF)=kIv+DX4cqrFFMD4m2av#r7&97AE#Y8=`M5Ip#q@Z~x6mTch62AWrtyZoqK3?uWSsRS4wHXEJm0$3$p+SFFYLCoW6`f^j-FZ4x&87mUu-T`_4w1)6sC#t#6{&*JBbTqOnZQk!U z+8?hF659vkud}2#@;WvlItO=~|EdSoYvYLpj zOfr~B1nQrdaR1(rwe_muTnM&I@$*vIR7xi;UbXds`MIQw_K{weCyR5Qxh9Fbt#Ob% z;3WCAbs8ZX^LzB+vuRJ$4@aUpypA%OY(M)?dbCR$?THf26DhA2;532c=-lQ6vHcnWeyho>;f<|G@?1HoW^f$S4(zrO;_-5NJd!6FN z`UI!LFuz+a{7B*G3Jjo;CI2k!9-#Xye)8Odaq^5FlbmY<$`N*HIo3~=8G@-W%&LG7 zOpk_s!Fx{8$~8V{CpWINeD_Y0t3CJKR=P|=v#OmC2MSs6BY3SD5Q+KoUfdt#k-Mh& zgWA3Y+*ll-2~|m%v=x%UpxP0z+&noN<(m?=+wAHi*6N@~vmYC9US`z_xY^qzb=d!F z4To=B470anJ<8xLx#IjXtv&IJfNa!9w6Yj6c5asw8*>+klLo;N()-K=cB7rN1>X3$ zx?w)!4#K*xfqTp%cGS1!yu{nKzp2kTf#SB@%WrdNV5^nF8WGQ4+!B`DccJmA7w`E6 zJ&tP9n$*U4&?ay*x!uDaqivtnzXv~x_Z|-VDx1OxDhXLN%I+NxeoIa4n9tBg4q0Jd zib0E*ib0w{`?wWiR3KEA2t?NDaK@fUZa~JO<3As)CosF2}C&888Md<^6KS8 zF*hw2s06KAQh@V+y)>lS-!cZwBF;E;_}$^!EczvP>=h~vpdPV_GKfwyps~`OgaTv4 z8E{ir& zlr|`pDL*oNp!(f2zj4E6*d8c7czvdiw>OOIDv8IGeF%}n1eV2AOJhR!OdR;sdY}x4 zqnHG&+GdAD+!+uz@Jym@q8A&ZXzS6rs1$lbm%ZU9l-9xIt=3WNK)<3Sodfh@5vF&L z6ZQ;V%|nqOM0Yb(WFa=Nuzf|{ugc|rV;3bPi-TTc0m+gceR93}%P0-v*UkMs_HpBT z{uIx{>oDCgAnC!B`m@VobmcAhR|s*@vS3PQKf-1-MNoh4*ES>R@>{b8>?7F^e3zxZ zrsB2P*ZA6|Vf@g)w5xk*hNsG=8JcWV=xv&&%k9`Smg#ierlBvtyDX!(Z1}!^dducU zsAWSr1h-|wR@x3FLs+8hXLK$7IE)bcMn5$5=Y#@vFN=Lr#-Wu%H8=$?Z^-7!=+w)D zwRQAE@io6X)?URRDYk~q@LH}v$2JR>=qb`Q%hqrmhbz>1wOO|0+~O4U+?e>nvBm1= zHsb3{tuo2>!zyEJ)O|UTmOW8_mMi1cV9-OvWW1K`=-6J-zD6}1j$9T8E>LZd%aCXb zQk_j23-XaDKJkMr=ywiWDM?;XnIpw+W?Xq4Xpji}ybPu_t0x!lm{ zLNL-;qmdaO>5Bj*cclbzlBm_k)i-N34AvAWrCN(*1K3e(UTl(j$w;vKg-t zNFuv4V9-%sMj(5vpa4?#6hb7&0JOszGU>MHaI zyw(Ooq}jrcQ5+>-x#MDVXd^__U2Raa*5}xN2*F9i_e9lBUEPw#Ull1@CD6p-8+9iy zmKr9j#acQ?31(z@^c<36jpQp@q;sgzrJJRtOIIelc+1m&$Cxf~9NksK(L0z*vwfNG zqbyj(e)c)ai?{J(nnlIaf;&=qeawALr>QtXsbTd7cuTNL5Ch4`N z6!>I>4W%}>D+aw?yJX|k_FIz;M470Q?QQb1p%E;JIA`bTqHYo4B$QQgDqbzg1TwF) z&ePMyB25H;l8LJmLu)dD43(~t>0N%Gg`pSJ>b`%9cWRGjSB+tbA)pA?Ajt zM^~w_?B`e-zl42(<5 z0ZEstA8i$ld<+Xz7LlN*G$#Ke@A0R@56qs5%#VtkJ8b#mQNL?m(5~gE+T=Nn=70ak zk2iy3zg=C+A8(8m{uT180HM$W+Vla@rt541qW>n6>7Je-Y-n_73~b(h*cug|lq}(A z`rcrFD}G*Y_;~1XCNSbPESAC2P@J8qbpIfO@p@VMn>WBQxT~YkD@`&j-)W1t&J*Pu znU3MX_|55hudcsA+f40?8Y~9LCk?Z99`up7eB!x5R6lE=J9fVY`U^f95xS%43W}tB#$0{lW=|$r^#b)NNU6j-jgb8KPf0qpaxRk z+iicH4bcg)@7YxDQ)|`;ZVz2`Gy+oCYAN4L-q2Ia^#(f@Os>Nk(o`y#hD=;lx1>TU z{XiQraZiKFvvEnthUh4IXlk4<)2DqMK;io9wSvVMf zjckyVwsO5!=PWc$CVy6ws7N?V(ZebUige#c$nMm~&lCmeV(Dk$6^ZliyA8k#a>*;c z8oB$LWeQ}gL({T{@<#;?N5&AU0bVasE`E?tq||sG&eqDyRh z3c7yWXJ}oqge;j-FCll9>m{UVc^313R1>|!hkB$8Wiu*H4zd`2yrCh@i@8I?K4DfX zb}TMocIb?*$Yt0k%)*$yCHhB?49?nilg00_+jeyALMQnDa zU;Dnxm%lEWDP#np3NyuUTTX|6JL#a<^yB_%0O?xjBUMe;*?1K2DSrh|+ODQP=v0o^ zUFXDz*|!SO6v1ZBu0FFKs7JT0UW9RSK;(Y8-UcV$P~%NUywoHk2q-}J7$#vB1ynQm z>1asjWDk`y(I32!(QRqc{bmoO9VWOaarF`<`lL^2-CE;%i>|7^oT})51LA1h*8zXU zSLxbyz}6H83T|&HzIGM}(7b6dOQ!-=iJCWPuB&5Mtm-0^xy=-)ZeVUNQ~Z}OLs>YB zlKDEee@5#P(L<{@&YP~YVH39na8{)4@Q(D+N&Wd3wAMp90d|Mm!TK2-!(mmt_VY&V z!HCU91Y(z9iKFfLq=3|aOgT(jLBkMHxsNRxc>?9{G1=|9rST-;_d?$mLikwCftpw| zbVkrJ3!h;L&GPP!uLetKY2n5*fu&t$*lGQ>`|iMh<3qSD<(PhoYP@=*CywNl-a zp6Je`D4f&O_TTxNH#AtVWHOj8>tHo~OWIcn!9Tp$V zNmei{a0JZ)%d}`2GX1!OZTQX&T-(7avY)V3o>XqBFfR6LO&TEd07v|J*yS#76H`u(x*+gVwmweXe z4s9TX`39QxwNB%A*(buDS+7syKmWnTY5aD(hEC_z;9;kQz!fx{=|DdJ6?Jmgy1h@I z&wuu-&*yKrWS`G}ab1!5{Curnx~ze-Hu>7mnHabxgFvr;X-@tukFjxElG9=g}1MvXz|t8P@IQD`x*+`3bs2E2H3yt40(HR+k=s7zlIu$W1Lc96$LNjzM^cu z7Tug-ZlTS8bn$hoqadS~60IvKMp%Wtib{$&d;lgiY$b&n5b$QG*+&i4VlJm@`#XRy;Z$aKK|dI_fZk2StlzdytSyw9CyM{ z=I~Qm$Q$OmuzpPV{%2&%8_7*x4t;^w+UDg7!l(k;yg+1f>LZo(tQqRC0AVh|1?on? zR9G*f&5NKy*S=1G<*PIOUTEF_E9DZyfyX|7LIpt0WN)=_X1!OZX1XJ&uyr23mUb`Q z*C6|LFObEiLt`*xHn3rmPM}9M(;8Gi!Kw-=PR;R^|EYIIvVOsBdGiRz1UK_=0En_ppZPVC2}`qdoO; z@AZ?A&#lvU25JfdcrPYB{m!lF1Kv3ayknAKx*khj#;FxMIRF`0i8a`h;9)XrEQ6^P zKm(m>;eQPg(S3v{RVR()Zo9R5t?A}}nzbf)pI_`7jT?mFtKxQlr7^<^ z$2P4^?u@*N-jD^lZ8&y*{LK&lCe2DjxRlG-;I-J0^w8m* zc=k}ClM~$S{=U*m?y*wx3d&;i@xGUO%+IvM0hZ_;a&o{XHkpPkKc#c%4Eo9;o|#V_ zRK>Sy^8!7URM1&-b~xLRO4FQwPliaYO@V&%CQH)-E#p;AJprI@jB6uS3lo9aK2Yja z0e1D9>|?I?o6-$Q4V83JFaYaHcWqAqgGVV`mBb=&*XOknOn0|}IFG6;zk0q+O7WTX zUY`zZb-Ok3jw++K6WQP!$=R#I0z?}PJ+Sou>c!bP;`A!;aOhafB`%$RDRIL;>nq$? zzFujCTbKO6(9eIQKnZq6Cac|jX1y*c!F`2WQ}y6-FP8Iq!muxOWBKZnw$B36ol-a2 zg!XD;?tQ7-1rYjDxATC!!cw>4>(ypQHgh}&Mzvy_nAWt?ZLx}rC=aD2SyOwtFLq=3 z>h-3xfOMePje5XdFUK5zwHjGaFU%RbOw)jYI4<0*dzGwKUb$NbWC_fyLngnnu;}t| z|FmVABky(kr-4SMwj8N*yf_Xn^iotT#G*>9_1t z`10EWC7E8;Jo>o3-K-twsdj3ezGP8Y$zqGH z$V#&<*oyTSvMuN^2C*5LRVwD+`(DD;$Fx*B`#`~wb#@XgZVOoEJF*9(;T3f>xUyJ3 zd@h9cvHmWp1F(^Qs}?z=y*|*||J6t%=uN;`>|=!-1>NBD(5cSyOri_xz!|r4^mnKLUbV_1eGbt)Ec__OpwICR zQSrhJWjUTW?sYJRFF~O|cs0W^hNJ6I#Xf~ER~X^~*Tw{Y1xiPT=Q>vu3A_tgS|XfU zZa=W~YSk#)Q!_8fWy%B5t+mS&NUTp_N0*Vqd8sw%=rYR-;_VuCG84?cf?Tcck4W!x zwa%}zq0`&=F$H&bkkVThwDk6h)V)4w1YVgTLQl3&s7+UuGwZ!RpAb`8nRc2WY4WGF z9>^)BdOZ+-Mi0b5RV`{k%apEyHo7ae!o*d(c3ky_)Rt$nC|E#MgJ2auS8;uXH=(`? zDs|?O!xlAK1J`IZVU{ycX%B(Y+;5 zOOU0Sy|b^ySMTg=2uNR;*$f777u|+VBz%2Mv1{;uplt6xz5oJvv1ji-hPKBo!}S!T z6b@ZS*BLQwHT5<&&zbdJou+OZEgdYEG(HG`qI!I}cn z4;#1)M?Y+UYo*=>Yq(@@gI!#=n>HBacn8aW8CcS5qKpyqaJiFf!I@v3Fupvd64L|Q zD_ks#7qtFAZPs|yI>FY@sOpkK2zNKN)bp*AQrmya5OpPykcLTnnVHM*m*C#tG zxlKj=0_M=VGHaXm0fpWJ#5NBcwF=wnU3KxiJ1nOv8d$N<0E6ix=dw%I$42_%H^Oe04leiP}1QO7!6p<5!&02^)!By zL1(F*n4hG{f0f6^@cGtSc{@*H+f=DbM`c<@tA4s$aBSOl?AC05=Mh}6#D2V?zd-)D zPOYg7wBwKI<{trxU`iIuU?SNaxE?1XbKKF;Z8?wWF-;$1EFFS4U191ztdgLAh%h}7 zWfh4Zzj^a)Abd{m2#>o9|5$~2anogryQXO{T4wtyq|2fJfp9%%#Gte8KfUsCq30<4 z#<)n$v4K~T%{LiLrq*2_FWr^l$Yvf`%i}2BZK%x@$mjKyLOF9pcuVW<(m3Vzl>$3U zcWixkWN@ZTwDp4kIh;hF-%|vCe10qv<-~HZ=hx=bEQelKYiBtY(Q%O@b6^^Sp=rH& zv%<2QZ9wAzw?AB#X|?vw?6v}+z02vc2=J@{bMhCE2pA4~5wKab7BSOW0@&7wGw7h2 zgY*mpkbyX^ZCUI(4&3fJtL0qAaq%7Phe*=;THr5|0i$x9P|dsC~j%+klq zU!ZhJZAEM%`dQ@9;%a~|^>CqS7(bMTA`{T<48@(pqkBRfo@ZjhtK$BQZ%`NRzh%_u zSL$%qm|No$9u9bi^vdMdmFs!;Nz-?>_pr}A=Npz32R>H-7&B*N2mHAWV95=&xH7s2 zDA)l`aA+9~X1l*_Yk)6*^Jn^c`Gl+Ija)WW0f@gd6*rz1=*+Jl|Cmq!E!hU1A7KR2 zc#sk%(sq%v)MrNVZ3(`(jz;i_MBhuJpfx0V5M$b>Dtf(PB*qxOuEXIt!gE{t2jY0m<-4sg7? zzlsYq596>1e>#?6SwxGlR$>(d#h-89kPe*xNt1B$&_REHIGdb&E&g!N@GKHAd%Z4k z@}8ZcstiijEM{GTm4fr<(XWU}=R3Zhu<)m6xcJ~Ym6J&&^eTz|Afb$MBtZ+l|09?H z=|ifG7I{S?q%}}beXQz4`T$O(Qfus#oQ141!7Oty7_mp5VZ`jHn^Ja1AUz0DoVMtBp z-(fj?IdubINwC(xnu%2MgnFS0ZM?dJ;gG%fn{&iLYjJ*VNf9PxwKU`qI~hUXMMw`*6SsI-*#CdfE-hmJ!y>CSnF#tD1kk# zp5^gQv(vz891zLbLQ4L3)poLf?c>C3HAldrCrzNW?2cHpw<+Y9hhpX&uU>ypfxg}qx6V@AXm0=V_0=03k_Hw7uBH(hT=Yk?qM-1C)R};m_1Y4zso?G&DGC_0D zzK*b_j&Ji9NyC@WSzM@rWZ)^P&D?%|5xqmm>-_oycC2;F0U zB;m}DAID$+azog6lsu$24{6pW{Qb9^|Be20Klx&j&l+a^v&L}evljWNG1z`|{C`@? zipE0XvN}Ti?rq%8_Xn!4G#SJ)vK@lUGY)OPM0C?~467Z{xzsUdI54aclr2S<1Wvta zov&nCBg)l7H`&G$X&B7;6^n{A^B;Ad z0_T|{+a9>x3F$Pm!^?_Y>2jPq-9fD#&X(rhi*VMjZVM65G1;BEK*E4=u9B9*AXw=f z+V@P?bu7E{g5V300qdUmip0Qw6_|6qOLk|;-kM`wytn2A3gQ;M?)O64m19?dUFY&m zX4jI_ldY)nL2o@2+t&-n4)_!W%?Bk31?vn+B~ILXCVqQrJy7p>>AQ1 z&Qy670Ko&s_7>fXoOQhJbvSTFEqh$y&RCoT^;c~oS6ROIC?U|O%8rQcQ*x3TcKB`}Eet*78%BHwd=3f~=VbYxgOVz-6J zZ7OctiP{VA(sOJ^*4y5?s@ql!UOP_93g*Vutg0!>Lf#a8#z@~2JKmu_d?b2ix z`@vU0s&JWv0$kpIFqS6}fW|;4XAqvtsWk^`&^6<7d!s;d%!+u*1G{%@WJfVvm z$Ytd~txBvw_?9t$VDKXA#<+fEy`0BagmeYfZC)yhy3Y!KMN2;m6W*ke9Wpa1@W&Rb zlX*1Y3R|=!Gej4jT{6ev11OPA-sp!0RAx4#k1eu8n+z%#sv^9S6f& zRiF+W;#KI9x-evTC2gI9mox@)=xiFpuCs^?XmnUC5E#{eVaRySbuZ+>ox$HDNFk=q zx5xA5dF~^`m12-?t&`O+UMbcLmLpecB>zgWDDO?K6wM6pFBag%a@jnehmLJ(AHmC< z8^*!|ei6V@b#R%gtP%j^y|Dxs^t1k+N)l*m{<+s-{?R8Eq$^kxkUNjP-jCiLbyjI+ zy~OG@W|ka(ht?YN$zR){{15*ktPk_E`SfKmOXIxp<^Lg$W)G_*C?d?o(L;ub`Yp}A zqF}lF?>znQ|G&FyYi`@d!teV>@|F>G@n!a+3JLxGTtm;_i5l&sF= zzZU>?A$3V?ZTJ!1H1X7O+V2B!aB$ASIR}CH=SMbw=iA|u@%?YatT>zVLNj&$+f6D3 z+jYzD{g?u+JwPDbzr~V^gxs;B%-Bz#Zf?k6J(WKm>%X6GBOL^(oO4Q;Qc?|dePo=cY!`25B*^1kO?*0dM?!}=oyurv7(6Q?BmGY=7+pa z=zTwbXp_^3TD?4`VK6X6mONpCaKZOx<$cg9iHlUyIAwjFj0_2$;Fe^K%>E4TZX<$1 zyjF(5*N2nxQXt+DV4~SQsZM))eKk3!0-k&1pG* z`-UgmnLT+`=V-pNIP;O_bwyKp%JXVdvDEL8iL$X(#avI)T&A3^g23KMv1d)DPkK)? z23K7Y8#-bvS$}L!79_j%s&ZKzTTAOtrztKD`W-fOF~!N0ljEBJ7m?inVrIKS>w|~) zGjw=A_fcrvU7#5CqGGDYX&Bx`{O-PgX>wn;2QLSCsY8kxs~pYJvUo&ItxSt>^2?o3 zq(&{cq@AcoLL4^7L1h@I=G~{!I6$9kAH3f!_}%U2*Sl6>mwY3bAHRo=Q{8*GFePqq z6`Ql?ahD&@UkO)&_G8@SrfRAU2a+03tpmPF=zN6DX*hL zr@R4-o$>)8>pf~Ve@=&w)LnbXK(k~-jB80*ZqrU} zMM^MeertVC#ZqRphaqJMefT&g!TZ7cV9+70Yr`r|62)d7k+KS|$);6lz2IUIr#vCC znwJ?98m?fEG4Ni;9*{=v^FwgxiQK;;B-S!BOJZyU;-FVTww;sJ z*x&@%GpQC#lXcd!&mub@kr9C0*i`1Hg^^gJ3!+P(MRvGTT_i4_ZAOsCVv8*S^S_$q zoMIMZqXDz!&Z%WlHn#ZrdizR3aA{kwf2+(Wt4(Y0vE5ihf^^Z(90#rd;*27VIL}#C zl=CJ?zJaNPRzLiYG~a?~`g|H)*wDpXcrTe1ORr~=i-IX*GW)HGHY~lKO69!`a-o>3 zcky`|x21s-pGj_l4lgv8qH8jt(Fc#ur!z(rUD@CNUqf=g-@uTv%yWCkFf}TBf5Ci? z8eG|Ie(!w+mtpZ1EOAG)GI=}~PRo=kW^X0#d|&#kbhjtIN4Kx@vUnuZm_CIbpW8P< z_`BDVS!E7+9&WElX8yB$6AV2UM~~f^g8~Y#*u|0Oy2cRn+Uu_}8hoBXWc!WRv&(<= zdwmT*&)3&5?0)`Ew%zdLPVRJDe~=gZ-^*=~Wa&eY9_H!p9mV`I0)O3-iu>@|39lbu6Jyzq`=NAkGo(DLGmw6!MW;8g7s<9>yqD}@}( zg8ZH{k;#O4Kca4@{e{h!I+EYlkp#~qHPS^Fdc34TKu9(%Z0w9^+X4sGe|F;}2VgCs z(J=|3adA-8)F$Spam#QlxCUn2H-UkP_gmoox^e_2aAm*OJXE44%BVngWGJ4T%ny54M~T7Rs)KrRBk)+NhHboITff3k^%E`nZFL~KiG zLzp)1_crwEowS;dShd$itBzl9D+ODf9elmTQU~zGs?aPuI{Ph}0sY|yf4_SJZVE>A zLvHg-ptFcj&D>nmf{k)gY#OJrHOgjYGrDZ16WZ$zQyg5iRH)ejO2sQ8*k;G>w1BIZjYeMmvF^m`KuB8{`;nmvg35F4*bl zSdAlZa=avWr!NSiA&Exh-WJc}?s|-et(nTWFdi7ltiLV`qt;@|^td(|msA?>Q#04D z=>`l;7Jn{ zMPPe1j{@A?i((L`wNt-66b?aIAW-hl&r^aK7RNZgFarq2@u6vrTDrEyrMsXYT+C#M zSj{F28!#`p4@8WzTV!1^>DVlO=*~WUI4_YFIyJs4f1hIsxi#qTxT$A_|iuZA`=M| zZ^nf=e~|uSs0EzaoDH;$&dXStGj}Q#N^sVQ^v{wj2E|-IH3h=7H3TGAJd4%p=(4sK zd3E@?HJ}$<=`v11Ltf_%gV0b|$;uqT?p+s%ay71pkglKl&NgdT`OGsZ)=yrL)-ax* zNzPOutxnY|vgiS(GUZd_-x#MlW$VX0ShAhae?eOzlB%F2SMqsEa_XH;mwcABM9 ze<}cs%o)Ijnc3qH08=pb1c1>j1&Dw-yO~%(a0*GEj1djkKJ&~an*cMueLaCUB()iOfCTX)c_R?f1rS}Co2g69GL*rLLQe0OE~8_0!1Qhtxbf+ z=$?d3m5h_!jdPpMQ3E$&g;sI}MzwKpFr;nR9|PRn1}MhctwY9ItAj;_h_FL$EG!Pz zC~Wu2cx|p*3Oa6~K_S%*Ucz)tA8~m0-Dn(IR%-T)7uyOJE3*}5Ls&tWrNE-ve=83h zn$hoBT+}o`OUhO;3h)#ZTSDUW1rteD%n?ACz*12KmL%dTrFblLB9{O?X@uL>?n3;M zLgb1I4e%N4LP18P6@3JF+!hDnaog-%S7Lw}(+uOM8l)5v@G&?7wM?QO8EF$Jhpmy8 zh-1m(09^122L)6jkgOo6*@1&{K-DgqIhh&~*cO~j<&pu^UMWxp%Tn=Ue&mlt`TE`e k+1L80-u*|aB;tQD$K>7ByY0`u{_`Jy13o_yTa6kV0FSgM-~a#s diff --git a/google/cloud/functions/internal/version_info.h b/google/cloud/functions/internal/version_info.h index 4fb2d171..2dca1acd 100644 --- a/google/cloud/functions/internal/version_info.h +++ b/google/cloud/functions/internal/version_info.h @@ -16,7 +16,7 @@ #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 1 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 1 +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 2 #define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H From cbda5a19d58ccd5d2c41cae2af7c9f506391d8f8 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 18:41:54 -0400 Subject: [PATCH 32/77] ci: automatically insert code snippets (#351) --- .github/workflows/style.yaml | 5 +++ README.md | 9 +++-- ci/update-markdown-code-snippets.sh | 39 +++++++++++++++++++ .../site/howto_create_container/README.md | 6 ++- .../site/howto_deploy_cloud_event/README.md | 6 ++- .../site/howto_deploy_to_cloud_run/README.md | 6 ++- examples/site/testing_pubsub/README.md | 9 +++-- examples/site/testing_storage/README.md | 7 ++-- 8 files changed, 70 insertions(+), 17 deletions(-) create mode 100755 ci/update-markdown-code-snippets.sh diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 61b88cf5..9f402493 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -126,8 +126,13 @@ jobs: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 + - name: install ninja + run: sudo apt install moreutils - name: regenerate-build-examples run: > ./ci/generate-build-examples.sh >ci/build-examples.yaml + - name: update-markdown-code-snippets + run: > + ./ci/update-markdown-code-snippets.sh - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . diff --git a/README.md b/README.md index 4673067f..507fcec3 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ [CloudEvents]: https://cloudevents.io/ [docs]: docs [examples]: examples -[examples/hello_world/hello_world.cc]: examples/hello_world/hello_world.cc [Google Cloud Run]: https://cloud.google.com/run/docs/quickstarts/build-and-deploy [Google App Engine]: https://cloud.google.com/appengine/docs/go/ @@ -56,9 +55,10 @@ language runtime, but we're working to make running on [Google Cloud Run] as seamless and symmetric an experience as possible for your C++ Functions Framework projects. -The framework allows you to go from: +The framework allows you to go [from][snippet source]: -[examples/hello_world/hello_world.cc] + +[snippet source]: /examples/hello_world/hello_world.cc ```cc #include #include @@ -66,12 +66,13 @@ The framework allows you to go from: using ::google::cloud::functions::HttpRequest; using ::google::cloud::functions::HttpResponse; -HttpResponse HelloWorld(HttpRequest) { // NOLINT +HttpResponse HelloWorld(HttpRequest) { return HttpResponse{} .set_header("Content-Type", "text/plain") .set_payload("Hello World\n"); } ``` + To: diff --git a/ci/update-markdown-code-snippets.sh b/ci/update-markdown-code-snippets.sh new file mode 100755 index 00000000..276d1a12 --- /dev/null +++ b/ci/update-markdown-code-snippets.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Copyright 2022 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +declare -A files=( + ["README.md"]="examples/hello_world/hello_world.cc" + ["examples/site/howto_create_container/README.md"]="examples/site/hello_world_http/hello_world_http.cc" + ["examples/site/howto_deploy_cloud_event/README.md"]="examples/site/hello_world_pubsub/hello_world_pubsub.cc" + ["examples/site/howto_deploy_to_cloud_run/README.md"]="examples/site/hello_world_http/hello_world_http.cc" + ["examples/site/testing_pubsub/README.md"]="examples/site/hello_world_pubsub/hello_world_pubsub.cc" + ["examples/site/testing_storage/README.md"]="examples/site/hello_world_storage/hello_world_storage.cc" +) + +for markdown in "${!files[@]}"; do + source="${files[$markdown]}" + ( + sed '//q' "${markdown}" + echo "[snippet source]: /${source}" + echo '```cc' + # Dumps the contents of the source file starting at the first #include, so we + # skip the license header comment. + sed -n -e '/END .*quickstart/,$d' -e '/^#/,$p' "${source}" | sed -e '/^\/\//d' -e 's; // NOLINT;;' + echo '```' + sed -n '//,$p' "${markdown}" + ) | sponge "${markdown}" +done diff --git a/examples/site/howto_create_container/README.md b/examples/site/howto_create_container/README.md index 9b03efcb..41000677 100644 --- a/examples/site/howto_create_container/README.md +++ b/examples/site/howto_create_container/README.md @@ -25,8 +25,10 @@ pack version # Output: a version number, e.g., 0.17.0+git-d9cb4e7.build-2045 ``` -In this guide we will be using the [HTTP hello word][hello-world-http] function: +In this guide we will be using this [function][snippet source]: + +[snippet source]: /examples/site/hello_world_http/hello_world_http.cc ```cc #include #include @@ -49,6 +51,7 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { .set_payload(greeting()); } ``` + ## Getting the code for this example @@ -126,5 +129,4 @@ docker image rm gcf-cpp-hello-world-http [docker-install]: https://store.docker.com/search?type=edition&offering=community [sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ [pack-install]: https://buildpacks.io/docs/install-pack/ -[hello-world-http]: /examples/site/hello_world_http/hello_world_http.cc [Google Cloud buildpack]: https://github.com/GoogleCloudPlatform/buildpacks diff --git a/examples/site/howto_deploy_cloud_event/README.md b/examples/site/howto_deploy_cloud_event/README.md index 87560ce4..fb7369aa 100644 --- a/examples/site/howto_deploy_cloud_event/README.md +++ b/examples/site/howto_deploy_cloud_event/README.md @@ -28,8 +28,10 @@ pack version # Output: a version number, e.g., 0.17.0+git-d9cb4e7.build-2045 ``` -In this guide we will be using the [Pub/Sub hello word][hello-world-pubsub] function: +In this guide we will be using this [function][snippet source]: + +[snippet source]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc ```cc #include #include @@ -49,6 +51,7 @@ void hello_world_pubsub(gcf::CloudEvent event) { BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name); } ``` + ## Getting the code for this example @@ -207,6 +210,5 @@ gcloud container images delete \ [docker-install]: https://store.docker.com/search?type=edition&offering=community [sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ [pack-install]: https://buildpacks.io/docs/install-pack/ -[hello-world-pubsub]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc [gcloud-eventarc-create]: https://cloud.google.com/sdk/gcloud/reference/beta/eventarc/triggers/create [Google Cloud buildpack]: https://github.com/GoogleCloudPlatform/buildpacks diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index 41f7160c..c05e45e8 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -9,7 +9,6 @@ [docker-install]: https://store.docker.com/search?type=edition&offering=community [sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ [pack-install]: https://buildpacks.io/docs/install-pack/ -[hello-world-http]: /examples/site/hello_world_http/hello_world_http.cc ## Pre-requisites @@ -39,8 +38,10 @@ pack version # Output: a version number, e.g., 0.17.0+git-d9cb4e7.build-2045 ``` -In this guide we will be using the [HTTP hello word][hello-world-http] function: +In this guide we will be using this [function][snippet source]: + +[snippet source]: /examples/site/hello_world_http/hello_world_http.cc ```cc #include #include @@ -63,6 +64,7 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { .set_payload(greeting()); } ``` + ## Getting the code for this example diff --git a/examples/site/testing_pubsub/README.md b/examples/site/testing_pubsub/README.md index 889a15ac..542f1531 100644 --- a/examples/site/testing_pubsub/README.md +++ b/examples/site/testing_pubsub/README.md @@ -1,15 +1,16 @@ # How-to Guide: Testing Event-driven Functions (Pub/Sub triggered) Event-driven functions do not return values, their only observable behavior are -side-effects. All tests, therefore, are looking at the side-effects of these +side effects. All tests, therefore, are looking at the side effects of these functions. Depending on where the function is deployed this might be more or less involved. ## Function under Test -We will use this function throughput this guide: +We will use this [function][snippet source] throughput this guide: -[/examples/site/hello_world_pubsub/hello_world_pubsub.cc] + +[snippet source]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc ```cc #include #include @@ -29,6 +30,7 @@ void hello_world_pubsub(gcf::CloudEvent event) { BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name); } ``` + ## Writing a Unit Test @@ -110,7 +112,6 @@ env "GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT}" \ [buildpacks]: https://buildpacks.io [boost-log-gh]: https://github.com/boostorg/log -[/examples/site/hello_world_pubsub/hello_world_pubsub.cc]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc [pubsub_unit_test.cc]: pubsub_unit_test.cc [pubsub_integration_server.cc]: pubsub_integration_server.cc [pubsub_integration_test.cc]: pubsub_integration_test.cc diff --git a/examples/site/testing_storage/README.md b/examples/site/testing_storage/README.md index c8b1e978..ba3beea0 100644 --- a/examples/site/testing_storage/README.md +++ b/examples/site/testing_storage/README.md @@ -8,9 +8,10 @@ more or less involved. ## Function under Test -We will use this function throughout this guide: +We will use this [function][snippet source] throughout this guide: -[/examples/site/hello_world_storage/hello_world_storage.cc] + +[snippet source]: /examples/site/hello_world_storage/hello_world_storage.cc ```cc #include #include @@ -34,6 +35,7 @@ void hello_world_storage(gcf::CloudEvent event) { BOOST_LOG_TRIVIAL(info) << "Updated: " << payload.value("updated", ""); } ``` + This test receives storage events and logs a few of the fields in these events. @@ -133,7 +135,6 @@ gcloud container images delete \ [buildpacks]: https://buildpacks.io [boost-log-gh]: https://github.com/boostorg/log -[/examples/site/hello_world_storage/hello_world_storage.cc]: /examples/site/hello_world_storage/hello_world_storage.cc [storage_unit_test.cc]: storage_unit_test.cc [storage_integration_server.cc]: storage_integration_server.cc [storage_integration_test.cc]: storage_integration_test.cc From ae3fd9c54e021bb348c4b699f6db577b86c485df Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 16 Mar 2022 22:35:35 -0400 Subject: [PATCH 33/77] ci: update baseline on check-api failures (#355) When running in the CI systems updating the baseline has no effect. When running locally we often want to just commit the updated baseline. --- ci/cloudbuild/builds/check-api.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/ci/cloudbuild/builds/check-api.sh b/ci/cloudbuild/builds/check-api.sh index 5ed8ba0a..ac0a0dde 100755 --- a/ci/cloudbuild/builds/check-api.sh +++ b/ci/cloudbuild/builds/check-api.sh @@ -62,15 +62,17 @@ io::log_h2 "Searching for API changes in functions_framework_cpp" actual_dump_file="functions_framework_cpp.actual.abi.dump" expected_dump_file="functions_framework_cpp.expected.abi.dump" expected_dump_path="${PROJECT_ROOT}/ci/abi-dumps/${expected_dump_file}.gz" +exit_status=0 if [[ -r "${expected_dump_path}" ]]; then zcat "${expected_dump_path}" >"cmake-out/${expected_dump_file}" report="cmake-out/compat_reports/functions_framework_cpp/expected_to_actual/src_compat_report.html" # We ignore all symbols in internal namespaces, because these are not part # of our public API. We do this by specifying a regex that matches against - # the mangled symbol names. For example, 8 is the number of characters in - # the string "internal", and it should again be followed by some other - # number indicating the length of the symbol within the "internal" - # namespace. See: https://en.wikipedia.org/wiki/Name_mangling + # the mangled symbol names. For example, 18 is the number of characters in + # the string "functions_internal", and it should again be followed by some + # other number indicating the length of the symbol within the + # `functions_internal` namespace. + # See: https://en.wikipedia.org/wiki/Name_mangling if ! abi-compliance-checker \ -skip-internal-symbols "(18functions_internal)\d" \ -report-path "${report}" \ @@ -80,10 +82,11 @@ if [[ -r "${expected_dump_path}" ]]; then io::log_red "ABI Compliance error: functions_framework_cpp" io::log "Report file: ${report}" w3m -dump "${report}" - exit 1 + exit_status=1 fi fi # Replaces the (old) expected dump file with the (new) actual one. gzip -n "cmake-out/${actual_dump_file}" mv -f "cmake-out/${actual_dump_file}.gz" "${expected_dump_path}" +exit ${exit_status} From 498a3aaa6e1f2d106cfd955103efc62fa75c4426 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Mon, 21 Mar 2022 13:22:43 -0400 Subject: [PATCH 34/77] ci: support declarative functions in examples (#353) This changes the buildpack use in our CI builds to support declarative functions. I modified a single example to show that this works, and updated the instructions to use the right buildpack. --- ci/build-examples.yaml | 1 - ci/generate-build-examples.sh | 15 ++++++++-- ci/pack/buildpack/bin/build | 52 +++++++++++++++++++++++++-------- examples/README.md | 5 ++-- examples/hello_gcs/hello_gcs.cc | 48 +++++++++++++++--------------- examples/http_examples_test.cc | 19 ++++++++++-- 6 files changed, 93 insertions(+), 47 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index cc935bc6..0e70f824 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -112,7 +112,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-gcs' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=HelloGcs', '--path', 'examples/hello_gcs', 'hello-gcs', diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 920e0fcc..160ac666 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -92,7 +92,11 @@ generic_example() { waitFor: ['gcf-builder-ready'] id: '${container}' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}', +_EOF_ + if [[ "${signature}" != "declarative" ]] && [[ "${signature}" != "" ]]; then + echo " '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}'," + fi + cat <<_EOF_ '--env', 'GOOGLE_FUNCTION_TARGET=${function}', '--path', 'examples/${example}', '${container}', @@ -110,12 +114,17 @@ site_example() { signature="cloudevent" fi local container="site-${function}" + cat <<_EOF_ - name: 'pack' waitFor: ['gcf-builder-ready'] id: '${container}' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}', +_EOF_ + if [[ "${signature}" != "declarative" ]] && [[ "${signature}" != "" ]]; then + echo " '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=${signature}'," + fi + cat <<_EOF_ '--env', 'GOOGLE_FUNCTION_TARGET=${function}', '--path', '${example}', '${container}', @@ -128,7 +137,7 @@ generic_example hello_from_namespace hello_from_namespace::HelloWorld http generic_example hello_from_namespace ::hello_from_namespace::HelloWorld http hello-from-namespace-rooted generic_example hello_from_nested_namespace hello_from_nested_namespace::ns0::ns1::HelloWorld http generic_example hello_multiple_sources HelloMultipleSources http -generic_example hello_gcs HelloGcs http +generic_example hello_gcs HelloGcs declarative generic_example hello_with_third_party HelloWithThirdParty http generic_example hello_world HelloWorld http generic_example hello_world ::HelloWorld http hello-world-rooted diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index 55babeba..ec35f33a 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -130,11 +130,8 @@ generate_http_main_no_namespace() { local function="${1}" cat <<_EOF_ #include - namespace gcf = ::google::cloud::functions; - extern gcf::HttpResponse ${function}(gcf::HttpRequest); - int main(int argc, char* argv[]) { return gcf::Run(argc, argv, gcf::UserHttpFunction(${function})); } @@ -147,13 +144,10 @@ generate_http_main_with_namespace() { cat <<_EOF_ #include - namespace gcf = ::google::cloud::functions; - namespace ${namespace} { extern gcf::HttpResponse ${function}(gcf::HttpRequest); } // namespace - int main(int argc, char* argv[]) { return gcf::Run(argc, argv, gcf::UserHttpFunction(::${namespace}::${function})); } @@ -164,11 +158,8 @@ generate_cloud_event_main_no_namespace() { local function="${1}" cat <<_EOF_ #include - namespace gcf = ::google::cloud::functions; - extern void ${function}(gcf::CloudEvent); - int main(int argc, char* argv[]) { return gcf::Run(argc, argv, gcf::UserCloudEventFunction(${function})); } @@ -181,15 +172,43 @@ generate_cloud_event_main_with_namespace() { cat <<_EOF_ #include +namespace gcf = ::google::cloud::functions; +namespace ${namespace} { + extern void ${function}(gcf::CloudEvent); +} // namespace +int main(int argc, char* argv[]) { + return gcf::Run(argc, argv, gcf::UserCloudEventFunction(::${namespace}::${function})); +} +_EOF_ +} +generate_declarative_main_no_namespace() { + local function="${1}" + cat <<_EOF_ +#include +#include namespace gcf = ::google::cloud::functions; +extern gcf::Function ${function}(); +int main(int argc, char* argv[]) { + return gcf::Run(argc, argv, ${function}()); +} +_EOF_ +} +generate_cloud_event_main_with_namespace() { + local function="${1}" + local namespace="${2}" + + cat <<_EOF_ +#include +#include +namespace gcf = ::google::cloud::functions; namespace ${namespace} { - extern void ${function}(gcf::CloudEvent); + extern gcf::Function ${function}(); } // namespace int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(::${namespace}::${function})); + return gcf::Run(argc, argv, ::${namespace}::${function}()); } _EOF_ } @@ -224,12 +243,21 @@ generate_main() { return fi + if [[ "${signature}" == "declarative" ]] || [[ "${signature}" == "" ]]; then + if [[ -z "${namespace}" || "${namespace}" == "." ]]; then + generate_declarative_main_no_namespace "${function}" + return + fi + generate_declarative_main_with_namespace "${function}" "${namespace}" + return + fi + >&2 echo "Unknown function signature type: ${signature}" exit 1 } generate_main \ - "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-http}" >"${layers}/source/main.cc" + "${GOOGLE_FUNCTION_TARGET}" "${GOOGLE_FUNCTION_SIGNATURE_TYPE:-}" >"${layers}/source/main.cc" echo "-----> Configure Function" cat >"${layers}/binary.toml" <<_EOF_ diff --git a/examples/README.md b/examples/README.md index d72f4c7b..c3ad8448 100644 --- a/examples/README.md +++ b/examples/README.md @@ -16,14 +16,13 @@ Functions Framework for C++. The main audience for these notes are developers ## Create the Development and Runtime Docker Images These notes assume the reader is familiar with GCP, the Google Cloud SDK -command-line tool, and with the `docker(1)` -command-line tool. +command-line tool, and with the `docker(1)` command-line tool. To compile the examples you will need a Docker image with the development tools and core dependencies pre-compiled. To create this image run this command: ```sh -docker build -t ci-build-image --target gcf-cpp-develop -f build_scripts/Dockerfile . +docker build -t ci-build-image --target gcf-cpp-ci -f build_scripts/Dockerfile . ``` The runtime image is contains just the minimal components to execute a program diff --git a/examples/hello_gcs/hello_gcs.cc b/examples/hello_gcs/hello_gcs.cc index 27add042..3d1a2052 100644 --- a/examples/hello_gcs/hello_gcs.cc +++ b/examples/hello_gcs/hello_gcs.cc @@ -12,37 +12,35 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include #include #include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; namespace gcs = ::google::cloud::storage; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloGcs(HttpRequest request) { // NOLINT - auto error = [] { - return HttpResponse{}.set_result(HttpResponse::kBadRequest); - }; +gcf::Function HelloGcs() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + auto error = [] { + return gcf::HttpResponse{}.set_result(gcf::HttpResponse::kBadRequest); + }; - std::vector components; - std::istringstream split(request.target()); - for (std::string c; std::getline(split, c, '/'); components.push_back(c)) { - } + std::vector components; + std::istringstream split(request.target()); + for (std::string c; std::getline(split, c, '/'); components.push_back(c)) { + } - if (components.size() != 2) return error(); - auto const bucket = components[0]; - auto const object = components[1]; - auto client = gcs::Client::CreateDefaultClient().value(); - auto reader = client.ReadObject(bucket, object); - std::string contents(std::istreambuf_iterator{reader}, - std::istreambuf_iterator{}); - if (!reader.status().ok()) return error(); + if (components.size() != 2) return error(); + auto const bucket = components[0]; + auto const object = components[1]; + auto client = gcs::Client::CreateDefaultClient().value(); + auto reader = client.ReadObject(bucket, object); + std::string contents(std::istreambuf_iterator{reader}, + std::istreambuf_iterator{}); + if (!reader.status().ok()) return error(); - return HttpResponse{} - .set_header("Content-Type", "application/octet-stream") - .set_payload(std::move(contents)); + return gcf::HttpResponse{} + .set_header("Content-Type", "application/octet-stream") + .set_payload(std::move(contents)); + }); } diff --git a/examples/http_examples_test.cc b/examples/http_examples_test.cc index 38e37d89..23a7d31f 100644 --- a/examples/http_examples_test.cc +++ b/examples/http_examples_test.cc @@ -12,13 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include #include #include +#include #include namespace gcf = ::google::cloud::functions; +namespace gcf_internal = ::google::cloud::functions_internal; -gcf::HttpResponse HelloGcs(gcf::HttpRequest); +gcf::Function HelloGcs(); gcf::HttpResponse HelloMultipleSources(gcf::HttpRequest); gcf::HttpResponse HelloWithThirdParty(gcf::HttpRequest request); gcf::HttpResponse HelloWorld(gcf::HttpRequest); @@ -36,9 +39,19 @@ namespace { using ::testing::HasSubstr; +auto TriggerFunction(gcf::Function const& function, + std::optional target = std::nullopt) { + gcf_internal::BeastRequest request; + if (target) request.target(std::move(*target)); + + auto handler = + gcf_internal::FunctionImpl::GetImpl(function)->GetHandler("unused"); + return handler(gcf_internal::BeastRequest{}); +} + TEST(HttpExamplesTest, HelloGcs) { - auto const actual = HelloGcs(gcf::HttpRequest{}.set_target("/")); - EXPECT_EQ(actual.result(), gcf::HttpResponse::kBadRequest); + auto const actual = TriggerFunction(HelloGcs(), "/"); + EXPECT_EQ(actual.result_int(), 400); } TEST(HttpExamplesTest, HelloMultipleSources) { From fead12b182b373c3b0c616efe2ed41032e99a5de Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 22 Mar 2022 10:48:16 -0400 Subject: [PATCH 35/77] doc: examples use declarative configuration 1/N (#356) This is the first in a series of PRs to convert all examples to use declarative configuration for the signature type. --- README.md | 16 +++--- ci/build-examples.yaml | 9 --- ci/generate-build-examples.sh | 18 +++--- ci/pack/buildpack/bin/build | 2 +- examples/cloud_event_examples_test.cc | 57 +++++++++++-------- .../hello_cloud_event/hello_cloud_event.cc | 16 +++--- .../hello_from_namespace.cc | 18 +++--- .../hello_from_nested_namespace.cc | 18 +++--- .../hello_multiple_sources.cc | 18 +++--- .../hello_with_third_party.cc | 18 +++--- examples/hello_world/hello_world.cc | 18 +++--- .../howto_use_legacy_code.cc | 18 +++--- examples/howto_use_legacy_code/main.cc | 4 +- examples/http_examples_test.cc | 40 +++++++------ 14 files changed, 129 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 507fcec3..9f03778e 100644 --- a/README.md +++ b/README.md @@ -60,16 +60,16 @@ The framework allows you to go [from][snippet source]: [snippet source]: /examples/hello_world/hello_world.cc ```cc -#include -#include +#include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -HttpResponse HelloWorld(HttpRequest) { - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload("Hello World\n"); +gcf::Function HelloWorld() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); + }); } ``` diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 0e70f824..b65ec1c9 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -62,7 +62,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-cloud-event' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=HelloCloudEvent', '--path', 'examples/hello_cloud_event', 'hello-cloud-event', @@ -72,7 +71,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-namespace' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=hello_from_namespace::HelloWorld', '--path', 'examples/hello_from_namespace', 'hello-from-namespace', @@ -82,7 +80,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-namespace-rooted' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=::hello_from_namespace::HelloWorld', '--path', 'examples/hello_from_namespace', 'hello-from-namespace-rooted', @@ -92,7 +89,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-from-nested-namespace' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=hello_from_nested_namespace::ns0::ns1::HelloWorld', '--path', 'examples/hello_from_nested_namespace', 'hello-from-nested-namespace', @@ -102,7 +98,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-multiple-sources' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=HelloMultipleSources', '--path', 'examples/hello_multiple_sources', 'hello-multiple-sources', @@ -121,7 +116,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-with-third-party' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=HelloWithThirdParty', '--path', 'examples/hello_with_third_party', 'hello-with-third-party', @@ -131,7 +125,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-world' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=HelloWorld', '--path', 'examples/hello_world', 'hello-world', @@ -141,7 +134,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'hello-world-rooted' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=::HelloWorld', '--path', 'examples/hello_world', 'hello-world-rooted', @@ -151,7 +143,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'howto-use-legacy-code' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=HowtoUseLegacyCode', '--path', 'examples/howto_use_legacy_code', 'howto-use-legacy-code', diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 160ac666..1849601b 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -132,16 +132,16 @@ _EOF_ _EOF_ } -generic_example hello_cloud_event HelloCloudEvent cloudevent -generic_example hello_from_namespace hello_from_namespace::HelloWorld http -generic_example hello_from_namespace ::hello_from_namespace::HelloWorld http hello-from-namespace-rooted -generic_example hello_from_nested_namespace hello_from_nested_namespace::ns0::ns1::HelloWorld http -generic_example hello_multiple_sources HelloMultipleSources http +generic_example hello_cloud_event HelloCloudEvent declarative +generic_example hello_from_namespace hello_from_namespace::HelloWorld declarative +generic_example hello_from_namespace ::hello_from_namespace::HelloWorld declarative hello-from-namespace-rooted +generic_example hello_from_nested_namespace hello_from_nested_namespace::ns0::ns1::HelloWorld declarative +generic_example hello_multiple_sources HelloMultipleSources declarative generic_example hello_gcs HelloGcs declarative -generic_example hello_with_third_party HelloWithThirdParty http -generic_example hello_world HelloWorld http -generic_example hello_world ::HelloWorld http hello-world-rooted -generic_example howto_use_legacy_code HowtoUseLegacyCode http howto-use-legacy-code +generic_example hello_with_third_party HelloWithThirdParty declarative +generic_example hello_world HelloWorld declarative +generic_example hello_world ::HelloWorld declarative hello-world-rooted +generic_example howto_use_legacy_code HowtoUseLegacyCode declarative howto-use-legacy-code cat <<_EOF_ # Build the cloud site examples. diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index ec35f33a..61cb5103 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -195,7 +195,7 @@ int main(int argc, char* argv[]) { _EOF_ } -generate_cloud_event_main_with_namespace() { +generate_declarative_main_with_namespace() { local function="${1}" local namespace="${2}" diff --git a/examples/cloud_event_examples_test.cc b/examples/cloud_event_examples_test.cc index 7b4729f5..e47c3539 100644 --- a/examples/cloud_event_examples_test.cc +++ b/examples/cloud_event_examples_test.cc @@ -12,37 +12,48 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "google/cloud/functions/internal/parse_cloud_event_json.h" -#include "google/cloud/functions/cloud_event.h" +#include "google/cloud/functions/internal/function_impl.h" +#include "google/cloud/functions/function.h" #include namespace gcf = ::google::cloud::functions; +namespace gcf_internal = ::google::cloud::functions_internal; -void HelloCloudEvent(gcf::CloudEvent event); +gcf::Function HelloCloudEvent(); namespace { -TEST(HttpExamplesTest, HelloCloudEvent) { - EXPECT_NO_THROW(HelloCloudEvent( - google::cloud::functions_internal::ParseCloudEventJson(R"js({ - "specversion": "1.0", - "type": "google.cloud.pubsub.topic.v1.messagePublished", - "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", - "id": "aaaaaa-1111-bbbb-2222-cccccccccccc", - "subject": "test-only", - "time": "2020-09-29T11:32:00.000Z", - "datacontenttype": "application/json", - "data": { - "subscription": "projects/sample-project/subscriptions/sample-subscription", - "message": { - "@type": "type.googleapis.com/google.pubsub.v1.PubsubMessage", - "attributes": { - "attr1":"attr1-value" - }, - "data": "" - } +auto constexpr kBody = R"js({ + "specversion": "1.0", + "type": "google.cloud.pubsub.topic.v1.messagePublished", + "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", + "id": "aaaaaa-1111-bbbb-2222-cccccccccccc", + "subject": "test-only", + "time": "2020-09-29T11:32:00.000Z", + "datacontenttype": "application/json", + "data": { + "subscription": "projects/sample-project/subscriptions/sample-subscription", + "message": { + "@type": "type.googleapis.com/google.pubsub.v1.PubsubMessage", + "attributes": { + "attr1":"attr1-value" + }, + "data": "" } - })js"))); + } +})js"; + +TEST(HttpExamplesTest, HelloCloudEvent) { + auto function = HelloCloudEvent(); + gcf_internal::BeastRequest request; + request.insert("ce-type", "com.example.someevent"); + request.insert("ce-source", "/mycontext"); + request.insert("ce-id", "A234-1234-1234"); + request.body() = kBody; + auto handler = + gcf_internal::FunctionImpl::GetImpl(function)->GetHandler("unused"); + auto const response = handler(std::move(request)); + EXPECT_EQ(response.result_int(), 200); } } // namespace diff --git a/examples/hello_cloud_event/hello_cloud_event.cc b/examples/hello_cloud_event/hello_cloud_event.cc index 0e1141d0..648debae 100644 --- a/examples/hello_cloud_event/hello_cloud_event.cc +++ b/examples/hello_cloud_event/hello_cloud_event.cc @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include +#include #include -using ::google::cloud::functions::CloudEvent; +namespace gcf = ::google::cloud::functions; -// Though not used in this function, `event` is passed by value to support -// applications that move-out its data. -void HelloCloudEvent(CloudEvent event) { // NOLINT - std::cout << "Received event" - << "\n id: " << event.id() - << "\n subject: " << event.subject().value_or("") << std::endl; +gcf::Function HelloCloudEvent() { + return gcf::MakeFunction([](gcf::CloudEvent const& event) { + std::cout << "Received event" + << "\n id: " << event.id() + << "\n subject: " << event.subject().value_or("") << std::endl; + }); } diff --git a/examples/hello_from_namespace/hello_from_namespace.cc b/examples/hello_from_namespace/hello_from_namespace.cc index f51831ae..6852e967 100644 --- a/examples/hello_from_namespace/hello_from_namespace.cc +++ b/examples/hello_from_namespace/hello_from_namespace.cc @@ -12,20 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include namespace hello_from_namespace { -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloWorld(HttpRequest) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload("Hello from a C++ namespace!\n"); +gcf::Function HelloWorld() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello from a C++ namespace!\n"); + }); } } // namespace hello_from_namespace diff --git a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc index 28ac80f8..d67ec52a 100644 --- a/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc +++ b/examples/hello_from_nested_namespace/hello_from_nested_namespace.cc @@ -12,20 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include namespace hello_from_nested_namespace::ns0::ns1 { -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloWorld(HttpRequest) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload("Hello from a nested C++ namespace!\n"); +gcf::Function HelloWorld() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello from a nested C++ namespace!\n"); + }); } } // namespace hello_from_nested_namespace::ns0::ns1 diff --git a/examples/hello_multiple_sources/hello_multiple_sources.cc b/examples/hello_multiple_sources/hello_multiple_sources.cc index 99bc70b1..5d394df4 100644 --- a/examples/hello_multiple_sources/hello_multiple_sources.cc +++ b/examples/hello_multiple_sources/hello_multiple_sources.cc @@ -13,16 +13,14 @@ // limitations under the License. #include "greeting.h" -#include -#include +#include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloMultipleSources(HttpRequest) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload(Greeting()); +gcf::Function HelloMultipleSources() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(Greeting()); + }); } diff --git a/examples/hello_with_third_party/hello_with_third_party.cc b/examples/hello_with_third_party/hello_with_third_party.cc index 3907e1a9..975520b2 100644 --- a/examples/hello_with_third_party/hello_with_third_party.cc +++ b/examples/hello_with_third_party/hello_with_third_party.cc @@ -12,17 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include #include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloWithThirdParty(HttpRequest request) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload(fmt::format("Hello at {}\n", request.target())); +gcf::Function HelloWithThirdParty() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(fmt::format("Hello at {}\n", request.target())); + }); } diff --git a/examples/hello_world/hello_world.cc b/examples/hello_world/hello_world.cc index 4dbe0a5d..01ccaa81 100644 --- a/examples/hello_world/hello_world.cc +++ b/examples/hello_world/hello_world.cc @@ -12,16 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include -#include +#include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HelloWorld(HttpRequest) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload("Hello World\n"); +gcf::Function HelloWorld() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); + }); } diff --git a/examples/howto_use_legacy_code/howto_use_legacy_code.cc b/examples/howto_use_legacy_code/howto_use_legacy_code.cc index 9ff6e155..a4cd3df5 100644 --- a/examples/howto_use_legacy_code/howto_use_legacy_code.cc +++ b/examples/howto_use_legacy_code/howto_use_legacy_code.cc @@ -13,16 +13,14 @@ // limitations under the License. #include "legacy/legacy.h" -#include -#include +#include -using ::google::cloud::functions::HttpRequest; -using ::google::cloud::functions::HttpResponse; +namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -HttpResponse HowtoUseLegacyCode(HttpRequest) { // NOLINT - return HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload(legacy::LegacyMessage()); +gcf::Function HowtoUseLegacyCode() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload(legacy::LegacyMessage()); + }); } diff --git a/examples/howto_use_legacy_code/main.cc b/examples/howto_use_legacy_code/main.cc index 28197c0d..7e584ff5 100644 --- a/examples/howto_use_legacy_code/main.cc +++ b/examples/howto_use_legacy_code/main.cc @@ -17,8 +17,8 @@ namespace gcf = ::google::cloud::functions; -gcf::HttpResponse HowtoUseLegacyCode(gcf::HttpRequest); +gcf::Function HowtoUseLegacyCode(); int main(int argc, char* argv[]) { - return ::google::cloud::functions::Run(argc, argv, HowtoUseLegacyCode); + return ::google::cloud::functions::Run(argc, argv, HowtoUseLegacyCode()); } diff --git a/examples/http_examples_test.cc b/examples/http_examples_test.cc index 23a7d31f..e17155ac 100644 --- a/examples/http_examples_test.cc +++ b/examples/http_examples_test.cc @@ -14,7 +14,6 @@ #include #include -#include #include #include @@ -22,17 +21,17 @@ namespace gcf = ::google::cloud::functions; namespace gcf_internal = ::google::cloud::functions_internal; gcf::Function HelloGcs(); -gcf::HttpResponse HelloMultipleSources(gcf::HttpRequest); -gcf::HttpResponse HelloWithThirdParty(gcf::HttpRequest request); -gcf::HttpResponse HelloWorld(gcf::HttpRequest); -gcf::HttpResponse HowtoUseLegacyCode(gcf::HttpRequest); +gcf::Function HelloMultipleSources(); +gcf::Function HelloWithThirdParty(); +gcf::Function HelloWorld(); +gcf::Function HowtoUseLegacyCode(); namespace hello_from_namespace { -gcf::HttpResponse HelloWorld(gcf::HttpRequest); +gcf::Function HelloWorld(); } // namespace hello_from_namespace namespace hello_from_nested_namespace::ns0::ns1 { -gcf::HttpResponse HelloWorld(gcf::HttpRequest); +gcf::Function HelloWorld(); } // namespace hello_from_nested_namespace::ns0::ns1 namespace { @@ -46,7 +45,7 @@ auto TriggerFunction(gcf::Function const& function, auto handler = gcf_internal::FunctionImpl::GetImpl(function)->GetHandler("unused"); - return handler(gcf_internal::BeastRequest{}); + return handler(std::move(request)); } TEST(HttpExamplesTest, HelloGcs) { @@ -55,35 +54,34 @@ TEST(HttpExamplesTest, HelloGcs) { } TEST(HttpExamplesTest, HelloMultipleSources) { - auto const actual = HelloMultipleSources(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Hello World")); + auto const actual = TriggerFunction(HelloMultipleSources()); + EXPECT_THAT(actual.body(), HasSubstr("Hello World")); } TEST(HttpExamplesTest, HelloWithThirdParty) { - auto const actual = - HelloWithThirdParty(gcf::HttpRequest{}.set_target("/here")); - EXPECT_THAT(actual.payload(), HasSubstr("Hello at /here")); + auto const actual = TriggerFunction(HelloWithThirdParty(), "/here"); + EXPECT_THAT(actual.body(), HasSubstr("Hello at /here")); } TEST(HttpExamplesTest, HelloWorld) { - auto const actual = HelloWorld(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Hello World")); + auto const actual = TriggerFunction(HelloWorld()); + EXPECT_THAT(actual.body(), HasSubstr("Hello World")); } TEST(HttpExamplesTest, HelloFromNamespace) { - auto const actual = hello_from_namespace::HelloWorld(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("C++ namespace")); + auto const actual = TriggerFunction(hello_from_namespace::HelloWorld()); + EXPECT_THAT(actual.body(), HasSubstr("C++ namespace")); } TEST(HttpExamplesTest, HelloFromNestedNamespace) { auto const actual = - hello_from_nested_namespace::ns0::ns1::HelloWorld(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("C++ namespace")); + TriggerFunction(hello_from_nested_namespace::ns0::ns1::HelloWorld()); + EXPECT_THAT(actual.body(), HasSubstr("C++ namespace")); } TEST(HttpExampleTest, HowtoUseLegacyCode) { - auto const actual = HowtoUseLegacyCode(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("C++")); + auto const actual = TriggerFunction(HowtoUseLegacyCode()); + EXPECT_THAT(actual.body(), HasSubstr("C++")); } } // namespace From 11e380c024d92888ad3c49c6e65d85072b59c9d7 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 11:28:45 -0400 Subject: [PATCH 36/77] ci: update base image for GHA (#365) --- .clang-tidy | 6 +++- .github/workflows/build.yaml | 10 ++++--- .github/workflows/coverage.yaml | 8 ++--- .github/workflows/install.yaml | 29 ++++--------------- .github/workflows/sanitize.yaml | 6 ++-- .github/workflows/style.yaml | 20 ++++++------- .../site/http_form_data/http_form_data.cc | 5 ++-- .../cloud/functions/internal/base64_decode.cc | 1 + .../internal/parse_cloud_event_json.cc | 2 +- .../internal/parse_cloud_event_legacy.cc | 1 + 10 files changed, 39 insertions(+), 49 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 352da4ef..3a5ab5e8 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -39,6 +39,8 @@ # meaningless). It would also warn if `F` accepts by `const&`, which is # another detail that the caller need not care about. # +# -bugprone-easily-swappable-parameters: Too many false positives. +# Checks: > -*, bugprone-*, @@ -57,7 +59,8 @@ Checks: > -modernize-use-trailing-return-type, -modernize-return-braced-init-list, -modernize-avoid-c-arrays, - -performance-move-const-arg + -performance-move-const-arg, + -bugprone-easily-swappable-parameters # Turn all the warnings from the checks above into errors. WarningsAsErrors: "*" @@ -87,3 +90,4 @@ CheckOptions: - { key: readability-identifier-naming.StaticConstantPrefix, value: k } - { key: readability-implicit-bool-conversion.AllowIntegerConditions, value: 1 } - { key: readability-implicit-bool-conversion.AllowPointerConditions, value: 1 } + - { key: readability-function-cognitive-complexity.IgnoreMacros, value: 1 } diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 01adf846..ba6a0401 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -10,8 +10,8 @@ env: jobs: build-ubuntu-focal: - name: ubuntu-20.04 - runs-on: ubuntu-20.04 + name: ubuntu-22.04 + runs-on: ubuntu-22.04 steps: - name: install ninja run: sudo apt install ninja-build @@ -51,8 +51,8 @@ jobs: # Verify the howto guides compile correctly, they need a special setup to use the # current version of `functions-framework-cpp` through vcpkg. build-ubuntu-focal-howto: - name: ubuntu-20.04 - runs-on: ubuntu-20.04 + name: ubuntu-22.04 + runs-on: ubuntu-22.04 steps: - name: install ninja run: sudo apt install ninja-build @@ -89,6 +89,7 @@ jobs: cmake --build "${{runner.temp}}/howto_local_development/build" build-msvc-2019: + if: ${{ false }} # TODO(#366) - disable for now name: msvc-2019 runs-on: windows-2019 steps: @@ -133,6 +134,7 @@ jobs: run: ctest --output-on-failure --timeout=60s build-macos: + if: ${{ false }} # TODO(#367) - disable for now name: macos-10 runs-on: macos-10.15 steps: diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index d6251621..c59de191 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -11,7 +11,7 @@ env: jobs: coverage: name: coverage - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: install tools run: sudo apt install ninja-build lcov @@ -52,10 +52,10 @@ jobs: - name: Setup Go uses: actions/setup-go@v2 with: - go-version: '1.13' + go-version: '^1.16' - name: Run Cloud Event conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.0.0 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.3 with: functionType: 'cloudevent' useBuildpacks: false @@ -63,7 +63,7 @@ jobs: cmd: '${{runner.workspace}}/build/google/cloud/functions/integration_tests/cloud_event_conformance' - name: Run HTTP conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.0.0 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.3 with: functionType: 'http' useBuildpacks: false diff --git a/.github/workflows/install.yaml b/.github/workflows/install.yaml index 8ed291fc..ad195add 100644 --- a/.github/workflows/install.yaml +++ b/.github/workflows/install.yaml @@ -7,20 +7,11 @@ on: jobs: static: - name: ubuntu-20.04 - runs-on: ubuntu-20.04 + name: ubuntu-22.04 + runs-on: ubuntu-22.04 steps: - name: install-dependencies - run: sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev - - name: install-abseil - run: > - curl -sSL https://github.com/abseil/abseil-cpp/archive/20200225.2.tar.gz | - tar -xzf - --strip-components=1 && - sed -i 's/^#define ABSL_OPTION_USE_\(.*\) 1/#define ABSL_OPTION_USE_\1 0/' "absl/base/options.h" && - cmake -GNinja -DCMAKE_BUILD_TYPE="Release" -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=yes -H. -Bcmake-out/abseil && - cmake --build cmake-out/abseil && - sudo cmake --build cmake-out/abseil --target install && - sudo ldconfig + run: sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev libabsl-dev - uses: actions/checkout@v2 - name: configure run: > @@ -40,20 +31,12 @@ jobs: run: "${{runner.temp}}/test_install/build/test_install" shared: - name: ubuntu-20.04-shared - runs-on: ubuntu-20.04 + name: ubuntu-22.04-shared + runs-on: ubuntu-22.04 steps: - name: install-dependencies - run: sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev - - name: install-abseil run: > - curl -sSL https://github.com/abseil/abseil-cpp/archive/20200225.2.tar.gz | - tar -xzf - --strip-components=1 && - sed -i 's/^#define ABSL_OPTION_USE_\(.*\) 1/#define ABSL_OPTION_USE_\1 0/' "absl/base/options.h" && - cmake -GNinja -DCMAKE_BUILD_TYPE="Release" -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=yes -H. -Bcmake-out/abseil && - cmake --build cmake-out/abseil && - sudo cmake --build cmake-out/abseil --target install && - sudo ldconfig + sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev libabsl-dev - uses: actions/checkout@v2 - name: configure run: > diff --git a/.github/workflows/sanitize.yaml b/.github/workflows/sanitize.yaml index 56c25452..740889ec 100644 --- a/.github/workflows/sanitize.yaml +++ b/.github/workflows/sanitize.yaml @@ -14,7 +14,7 @@ jobs: # the web UI (e.g. "sanitize / (address)") than # any other alternative we tried. name: " " - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: sanitizer: ["address", "undefined", "thread"] @@ -47,8 +47,8 @@ jobs: # -DGRPC_* flags. run: > cmake -S . -B "${{runner.temp}}/build" -GNinja - -DCMAKE_CXX_COMPILER=clang++-10 - -DCMAKE_C_COMPILER=clang-10 + -DCMAKE_CXX_COMPILER=clang++-14 + -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fsanitize=${{matrix.sanitizer}} -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 9f402493..abc2cdfe 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -11,10 +11,10 @@ env: jobs: clang-tidy: name: clang-tidy - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: install ninja - run: sudo apt install ninja-build clang-tidy-10 + run: sudo apt install ninja-build clang-tidy-14 - uses: actions/checkout@v2 - name: clone-vcpkg working-directory: "${{runner.temp}}" @@ -45,18 +45,18 @@ jobs: run: > git ls-files -z | grep -zE '\.cc$' | - xargs --verbose -P 2 -n 1 -0 clang-tidy-10 -p="${{runner.temp}}/build" + xargs --verbose -P 2 -n 1 -0 clang-tidy-14 -p="${{runner.temp}}/build" werror-build: # Using a blank name produces better output on # the web UI than any other alternative we tried. name: " " - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: compiler: [ - {"cxx": "clang++-10", "cc": "clang-10"}, - {"cxx": "g++-10", "cc": "gcc-10" }, + {"cxx": "clang++-14", "cc": "clang-14"}, + {"cxx": "g++-11", "cc": "gcc-11" }, ] steps: - name: install ninja @@ -99,17 +99,17 @@ jobs: clang-format: name: clang-format - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - name: clang-format - run: git ls-files -z | grep -zE '\.(cc|h)$' | xargs -P 2 -n 50 -0 clang-format-10 -i + run: git ls-files -z | grep -zE '\.(cc|h)$' | xargs -P 2 -n 50 -0 clang-format-14 -i - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . cmake-format: name: cmake-format - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - name: install cmake-format @@ -123,7 +123,7 @@ jobs: generated-files: name: generated-files - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 - name: install ninja diff --git a/examples/site/http_form_data/http_form_data.cc b/examples/site/http_form_data/http_form_data.cc index 58254c23..2bd058bf 100644 --- a/examples/site/http_form_data/http_form_data.cc +++ b/examples/site/http_form_data/http_form_data.cc @@ -80,10 +80,9 @@ gcf::HttpResponse http_form_data(gcf::HttpRequest request) { for (auto& p : parts) { std::vector components = absl::StrSplit(p, absl::MaxSplits("\r\n\r\n", 2)); - auto const body_size = - components.size() == 2 ? components[0].size() : std::size_t(0); + auto const body_size = components.size() == 2 ? components[0].size() : 0; - std::vector part_headers = + std::vector const part_headers = absl::StrSplit(components[0], "\r\n"); nlohmann::json descriptor{{"bodySize", body_size}, {"headerCount", part_headers.size()}}; diff --git a/google/cloud/functions/internal/base64_decode.cc b/google/cloud/functions/internal/base64_decode.cc index 8d8a2625..958f55cb 100644 --- a/google/cloud/functions/internal/base64_decode.cc +++ b/google/cloud/functions/internal/base64_decode.cc @@ -20,6 +20,7 @@ namespace google::cloud::functions_internal { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN +// NOLINTNEXTLINE(misc-no-recursion) std::string Base64Decode(std::string const& base64) { if (base64.size() % 4 != 0) { // This should be uncommon, to avoid copying every time, pad only when diff --git a/google/cloud/functions/internal/parse_cloud_event_json.cc b/google/cloud/functions/internal/parse_cloud_event_json.cc index 2bc04562..4687119d 100644 --- a/google/cloud/functions/internal/parse_cloud_event_json.cc +++ b/google/cloud/functions/internal/parse_cloud_event_json.cc @@ -46,7 +46,7 @@ functions::CloudEvent ParseCloudEventJson(nlohmann::json const& json) { event.set_time(json.at("time").get()); } if (json.count("data") != 0) { - auto d = json.at("data"); + auto const& d = json.at("data"); if (d.is_object()) { event.set_data(d.dump()); } else { diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy.cc b/google/cloud/functions/internal/parse_cloud_event_legacy.cc index ddd2db58..6ed0acba 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy.cc +++ b/google/cloud/functions/internal/parse_cloud_event_legacy.cc @@ -21,6 +21,7 @@ namespace google::cloud::functions_internal { FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { +// NOLINTNEXTLINE(misc-no-recursion) std::string GetNestedKey(nlohmann::json const& json, std::deque path) { if (path.empty()) return std::string{}; From 6805a82436f32b71c44f48f0d1b4e130e9493d31 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 12:59:42 -0400 Subject: [PATCH 37/77] ci: update Kaniko (#364) --- ci/build-examples.yaml | 4 ++-- ci/cloudbuild/cloudbuild.yaml | 2 +- ci/generate-build-examples.sh | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index b65ec1c9..fbce570c 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -14,7 +14,7 @@ steps: args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + - name: 'gcr.io/kaniko-project/executor:v1.12.0' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -28,7 +28,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + - name: 'gcr.io/kaniko-project/executor:v1.12.0' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index 7932a9c6..39b345d7 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -45,7 +45,7 @@ substitutions: _LOGS_BUCKET: 'cloud-cpp-community-publiclogs' steps: - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + - name: 'gcr.io/kaniko-project/executor:v1.12.0' args: [ '--log-format=text', '--context=dir:///workspace/ci', diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 1849601b..5b8c06e4 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -32,7 +32,7 @@ steps: args: ['build', '-t', 'pack', '-f', 'build_scripts/pack.Dockerfile', 'build_scripts'] # Create the docker images for the buildpacks builder. - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + - name: 'gcr.io/kaniko-project/executor:v1.12.0' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -46,7 +46,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - - name: 'gcr.io/kaniko-project/executor:v1.6.0-debug' + - name: 'gcr.io/kaniko-project/executor:v1.12.0' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", From 976198752b48a87f0a406ca33ed1b7a305dec77b Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 14:57:27 -0400 Subject: [PATCH 38/77] doc: examples use declarative configuration 2/N (#368) Change the How-to guides and associated examples to use declarative configuration for the signature type. --- ci/build-examples.yaml | 3 - ci/generate-build-examples.sh | 3 + .../site/hello_world_http/hello_world_http.cc | 9 +- .../hello_world_pubsub/hello_world_pubsub.cc | 10 +- .../hello_world_storage.cc | 10 +- .../site/howto_create_container/README.md | 10 +- .../site/howto_deploy_cloud_event/README.md | 9 +- .../site/howto_deploy_to_cloud_run/README.md | 10 +- .../howto_local_development/CMakeLists.txt | 2 +- .../howto_local_development/local_server.cc | 14 +-- .../testing_http/http_integration_server.cc | 4 +- examples/site/testing_http/http_unit_test.cc | 8 +- examples/site/testing_pubsub/README.md | 8 +- .../pubsub_integration_server.cc | 4 +- .../site/testing_pubsub/pubsub_unit_test.cc | 4 +- examples/site/testing_storage/README.md | 8 +- .../storage_integration_server.cc | 4 +- .../site/testing_storage/storage_unit_test.cc | 4 +- examples/site_test.cc | 116 +++++++++++++----- 19 files changed, 159 insertions(+), 81 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index fbce570c..059d5e0d 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -234,7 +234,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_http' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_http', '--path', 'examples/site/hello_world_http', 'site-hello_world_http', @@ -243,7 +242,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_pubsub' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_pubsub', '--path', 'examples/site/hello_world_pubsub', 'site-hello_world_pubsub', @@ -252,7 +250,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_storage' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_storage', '--path', 'examples/site/hello_world_storage', 'site-hello_world_storage', diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 5b8c06e4..33483354 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -113,6 +113,9 @@ site_example() { if grep -E -q 'gcf::CloudEvent|google::cloud::functions::CloudEvent' ${example}/*; then signature="cloudevent" fi + if grep -E -q 'gcf::Function|google::cloud::functions::Function' ${example}/*; then + signature="declarative" + fi local container="site-${function}" cat <<_EOF_ diff --git a/examples/site/hello_world_http/hello_world_http.cc b/examples/site/hello_world_http/hello_world_http.cc index 26ce9ca3..eae24855 100644 --- a/examples/site/hello_world_http/hello_world_http.cc +++ b/examples/site/hello_world_http/hello_world_http.cc @@ -13,13 +13,12 @@ // limitations under the License. // [START functions_helloworld_http] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { +gcf::HttpResponse hello_world_http_impl(gcf::HttpRequest request) { auto greeting = [r = std::move(request)] { auto request_json = nlohmann::json::parse(r.payload(), /*cb=*/nullptr, /*allow_exceptions=*/false); @@ -33,4 +32,8 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { .set_header("content-type", "text/plain") .set_payload(greeting()); } + +gcf::Function hello_world_http() { + return gcf::MakeFunction(hello_world_http_impl); +} // [END functions_helloworld_http] diff --git a/examples/site/hello_world_pubsub/hello_world_pubsub.cc b/examples/site/hello_world_pubsub/hello_world_pubsub.cc index 779ef27d..7eaf20c0 100644 --- a/examples/site/hello_world_pubsub/hello_world_pubsub.cc +++ b/examples/site/hello_world_pubsub/hello_world_pubsub.cc @@ -13,16 +13,14 @@ // limitations under the License. // [START functions_helloworld_pubsub] -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -// Though not used in this example, the event is passed by value to support -// applications that move-out its data. -void hello_world_pubsub(gcf::CloudEvent event) { // NOLINT +void hello_world_pubsub_impl(gcf::CloudEvent const& event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; @@ -32,4 +30,8 @@ void hello_world_pubsub(gcf::CloudEvent event) { // NOLINT payload["message"]["data"].get()); BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name); } + +gcf::Function hello_world_pubsub() { + return gcf::MakeFunction(hello_world_pubsub_impl); +} // [END functions_helloworld_pubsub] diff --git a/examples/site/hello_world_storage/hello_world_storage.cc b/examples/site/hello_world_storage/hello_world_storage.cc index 4687288a..428bca64 100644 --- a/examples/site/hello_world_storage/hello_world_storage.cc +++ b/examples/site/hello_world_storage/hello_world_storage.cc @@ -13,15 +13,13 @@ // limitations under the License. // [START functions_helloworld_storage] -#include +#include #include #include namespace gcf = ::google::cloud::functions; -// Though not used in this example, the event is passed by value to support -// applications that move-out its data. -void hello_world_storage(gcf::CloudEvent event) { // NOLINT +void hello_world_storage_impl(gcf::CloudEvent const& event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; @@ -36,4 +34,8 @@ void hello_world_storage(gcf::CloudEvent event) { // NOLINT BOOST_LOG_TRIVIAL(info) << "Created: " << payload.value("timeCreated", ""); BOOST_LOG_TRIVIAL(info) << "Updated: " << payload.value("updated", ""); } + +gcf::Function hello_world_storage() { + return gcf::MakeFunction(hello_world_storage_impl); +} // [END functions_helloworld_storage] diff --git a/examples/site/howto_create_container/README.md b/examples/site/howto_create_container/README.md index 41000677..c0e22ba0 100644 --- a/examples/site/howto_create_container/README.md +++ b/examples/site/howto_create_container/README.md @@ -30,13 +30,12 @@ In this guide we will be using this [function][snippet source]: [snippet source]: /examples/site/hello_world_http/hello_world_http.cc ```cc -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { +gcf::HttpResponse hello_world_http_impl(gcf::HttpRequest request) { auto greeting = [r = std::move(request)] { auto request_json = nlohmann::json::parse(r.payload(), /*cb=*/nullptr, /*allow_exceptions=*/false); @@ -50,6 +49,10 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { .set_header("content-type", "text/plain") .set_payload(greeting()); } + +gcf::Function hello_world_http() { + return gcf::MakeFunction(hello_world_http_impl); +} ``` @@ -85,7 +88,6 @@ containing your function: ```shell pack build \ --builder gcr.io/buildpacks/builder:latest \ - --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ gcf-cpp-hello-world-http diff --git a/examples/site/howto_deploy_cloud_event/README.md b/examples/site/howto_deploy_cloud_event/README.md index fb7369aa..4f234d49 100644 --- a/examples/site/howto_deploy_cloud_event/README.md +++ b/examples/site/howto_deploy_cloud_event/README.md @@ -33,14 +33,14 @@ In this guide we will be using this [function][snippet source]: [snippet source]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc ```cc -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -void hello_world_pubsub(gcf::CloudEvent event) { +void hello_world_pubsub_impl(gcf::CloudEvent const& event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; @@ -50,6 +50,10 @@ void hello_world_pubsub(gcf::CloudEvent event) { payload["message"]["data"].get()); BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name); } + +gcf::Function hello_world_pubsub() { + return gcf::MakeFunction(hello_world_pubsub_impl); +} ``` @@ -87,7 +91,6 @@ containing your function: GOOGLE_CLOUD_PROJECT=... # put the right value here pack build \ --builder gcr.io/buildpacks/builder:latest \ - --env GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent \ --env GOOGLE_FUNCTION_TARGET=hello_world_pubsub \ --path examples/site/hello_world_pubsub \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-pubsub" diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index c05e45e8..e6e4bc44 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -43,13 +43,12 @@ In this guide we will be using this [function][snippet source]: [snippet source]: /examples/site/hello_world_http/hello_world_http.cc ```cc -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { +gcf::HttpResponse hello_world_http_impl(gcf::HttpRequest request) { auto greeting = [r = std::move(request)] { auto request_json = nlohmann::json::parse(r.payload(), /*cb=*/nullptr, /*allow_exceptions=*/false); @@ -63,6 +62,10 @@ gcf::HttpResponse hello_world_http(gcf::HttpRequest request) { .set_header("content-type", "text/plain") .set_payload(greeting()); } + +gcf::Function hello_world_http() { + return gcf::MakeFunction(hello_world_http_impl); +} ``` @@ -100,7 +103,6 @@ containing your function: GOOGLE_CLOUD_PROJECT=... # put the right value here pack build \ --builder gcr.io/buildpacks/builder:latest \ - --env GOOGLE_FUNCTION_SIGNATURE_TYPE=http \ --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-http" diff --git a/examples/site/howto_local_development/CMakeLists.txt b/examples/site/howto_local_development/CMakeLists.txt index 455e2e99..8cfdd3e5 100644 --- a/examples/site/howto_local_development/CMakeLists.txt +++ b/examples/site/howto_local_development/CMakeLists.txt @@ -18,7 +18,7 @@ # CMake-based projects. cmake_minimum_required(VERSION 3.5) -project(functions-framework-cpp-howto-local-development CXX C) +project(functions-framework-cpp-howto-local-development CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/examples/site/howto_local_development/local_server.cc b/examples/site/howto_local_development/local_server.cc index 9a511e17..0cd00951 100644 --- a/examples/site/howto_local_development/local_server.cc +++ b/examples/site/howto_local_development/local_server.cc @@ -19,14 +19,14 @@ namespace gcf = ::google::cloud::functions; namespace { -gcf::HttpResponse HelloWithShutdown(gcf::HttpRequest const& /*request*/) { - return gcf::HttpResponse{} - .set_header("Content-Type", "text/plain") - .set_payload("Hello World\n"); +gcf::Function HelloLocal() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{} + .set_header("Content-Type", "text/plain") + .set_payload("Hello World\n"); + }); } } // namespace -int main(int argc, char* argv[]) { - return ::google::cloud::functions::Run(argc, argv, HelloWithShutdown); -} +int main(int argc, char* argv[]) { return gcf::Run(argc, argv, HelloLocal()); } diff --git a/examples/site/testing_http/http_integration_server.cc b/examples/site/testing_http/http_integration_server.cc index 5d8e3abd..09727aec 100644 --- a/examples/site/testing_http/http_integration_server.cc +++ b/examples/site/testing_http/http_integration_server.cc @@ -15,8 +15,8 @@ #include namespace gcf = ::google::cloud::functions; -extern gcf::HttpResponse hello_world_http(gcf::HttpRequest request); +extern gcf::Function hello_world_http(); int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, hello_world_http); + return gcf::Run(argc, argv, hello_world_http()); } diff --git a/examples/site/testing_http/http_unit_test.cc b/examples/site/testing_http/http_unit_test.cc index 040592e3..ce13067c 100644 --- a/examples/site/testing_http/http_unit_test.cc +++ b/examples/site/testing_http/http_unit_test.cc @@ -18,20 +18,20 @@ #include namespace gcf = ::google::cloud::functions; -extern gcf::HttpResponse hello_world_http(gcf::HttpRequest request); +extern gcf::HttpResponse hello_world_http_impl(gcf::HttpRequest request); namespace { TEST(HttpUnitTest, Success) { - auto actual = hello_world_http( + auto actual = hello_world_http_impl( gcf::HttpRequest{}.set_payload(R"js({ "name": "Foo" })js")); EXPECT_EQ(actual.payload(), "Hello Foo!"); - actual = hello_world_http( + actual = hello_world_http_impl( gcf::HttpRequest{}.set_payload(R"js({ "unused": 7 })js")); EXPECT_EQ(actual.payload(), "Hello World!"); - actual = hello_world_http(gcf::HttpRequest{}.set_payload("Bar")); + actual = hello_world_http_impl(gcf::HttpRequest{}.set_payload("Bar")); EXPECT_EQ(actual.payload(), "Hello World!"); } diff --git a/examples/site/testing_pubsub/README.md b/examples/site/testing_pubsub/README.md index 542f1531..2bcd6958 100644 --- a/examples/site/testing_pubsub/README.md +++ b/examples/site/testing_pubsub/README.md @@ -12,14 +12,14 @@ We will use this [function][snippet source] throughput this guide: [snippet source]: /examples/site/hello_world_pubsub/hello_world_pubsub.cc ```cc -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -void hello_world_pubsub(gcf::CloudEvent event) { +void hello_world_pubsub_impl(gcf::CloudEvent const& event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; @@ -29,6 +29,10 @@ void hello_world_pubsub(gcf::CloudEvent event) { payload["message"]["data"].get()); BOOST_LOG_TRIVIAL(info) << "Hello " << (name.empty() ? "World" : name); } + +gcf::Function hello_world_pubsub() { + return gcf::MakeFunction(hello_world_pubsub_impl); +} ``` diff --git a/examples/site/testing_pubsub/pubsub_integration_server.cc b/examples/site/testing_pubsub/pubsub_integration_server.cc index d8f4a21b..2d71cef4 100644 --- a/examples/site/testing_pubsub/pubsub_integration_server.cc +++ b/examples/site/testing_pubsub/pubsub_integration_server.cc @@ -15,8 +15,8 @@ #include namespace gcf = ::google::cloud::functions; -extern void hello_world_pubsub(gcf::CloudEvent event); +extern gcf::Function hello_world_pubsub(); int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, hello_world_pubsub); + return gcf::Run(argc, argv, hello_world_pubsub()); } diff --git a/examples/site/testing_pubsub/pubsub_unit_test.cc b/examples/site/testing_pubsub/pubsub_unit_test.cc index a0dd1b07..140d83b0 100644 --- a/examples/site/testing_pubsub/pubsub_unit_test.cc +++ b/examples/site/testing_pubsub/pubsub_unit_test.cc @@ -24,7 +24,7 @@ #include namespace gcf = ::google::cloud::functions; -extern void hello_world_pubsub(gcf::CloudEvent event); +extern void hello_world_pubsub_impl(gcf::CloudEvent const& event); namespace { @@ -65,7 +65,7 @@ TEST(PubsubUnitTest, Basic) { event.set_data_content_type("application/json"); event.set_data(test.data); stream->str({}); - EXPECT_NO_THROW(hello_world_pubsub(event)); + EXPECT_NO_THROW(hello_world_pubsub_impl(event)); auto log_lines = stream->str(); EXPECT_THAT(log_lines, HasSubstr(test.expected)); } diff --git a/examples/site/testing_storage/README.md b/examples/site/testing_storage/README.md index ba3beea0..edb0b78a 100644 --- a/examples/site/testing_storage/README.md +++ b/examples/site/testing_storage/README.md @@ -13,13 +13,13 @@ We will use this [function][snippet source] throughout this guide: [snippet source]: /examples/site/hello_world_storage/hello_world_storage.cc ```cc -#include +#include #include #include namespace gcf = ::google::cloud::functions; -void hello_world_storage(gcf::CloudEvent event) { +void hello_world_storage_impl(gcf::CloudEvent const& event) { if (event.data_content_type().value_or("") != "application/json") { BOOST_LOG_TRIVIAL(error) << "expected application/json data"; return; @@ -34,6 +34,10 @@ void hello_world_storage(gcf::CloudEvent event) { BOOST_LOG_TRIVIAL(info) << "Created: " << payload.value("timeCreated", ""); BOOST_LOG_TRIVIAL(info) << "Updated: " << payload.value("updated", ""); } + +gcf::Function hello_world_storage() { + return gcf::MakeFunction(hello_world_storage_impl); +} ``` diff --git a/examples/site/testing_storage/storage_integration_server.cc b/examples/site/testing_storage/storage_integration_server.cc index f8781910..ee480736 100644 --- a/examples/site/testing_storage/storage_integration_server.cc +++ b/examples/site/testing_storage/storage_integration_server.cc @@ -15,8 +15,8 @@ #include namespace gcf = ::google::cloud::functions; -extern void hello_world_storage(gcf::CloudEvent event); +extern gcf::Function hello_world_storage(); int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, hello_world_storage); + return gcf::Run(argc, argv, hello_world_storage()); } diff --git a/examples/site/testing_storage/storage_unit_test.cc b/examples/site/testing_storage/storage_unit_test.cc index af1393ab..77781680 100644 --- a/examples/site/testing_storage/storage_unit_test.cc +++ b/examples/site/testing_storage/storage_unit_test.cc @@ -24,7 +24,7 @@ #include namespace gcf = ::google::cloud::functions; -extern void hello_world_storage(gcf::CloudEvent event); +extern void hello_world_storage_impl(gcf::CloudEvent const& event); namespace { @@ -74,7 +74,7 @@ TEST(StorageUnitTest, Basic) { data["name"] = test.name; event.set_data(data.dump()); stream->str({}); - EXPECT_NO_THROW(hello_world_storage(event)); + EXPECT_NO_THROW(hello_world_storage_impl(event)); auto log_lines = stream->str(); EXPECT_THAT(log_lines, HasSubstr(test.expected)); } diff --git a/examples/site_test.cc b/examples/site_test.cc index b7f18cb6..852a503a 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -12,9 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include "google/cloud/functions/internal/function_impl.h" +#include "google/cloud/functions/internal/http_message_types.h" #include "google/cloud/functions/internal/parse_cloud_event_json.h" #include "google/cloud/functions/internal/setenv.h" #include "google/cloud/functions/cloud_event.h" +#include "google/cloud/functions/function.h" #include "google/cloud/functions/http_request.h" #include "google/cloud/functions/http_response.h" #include @@ -26,6 +29,8 @@ #include namespace gcf = ::google::cloud::functions; +namespace gcf_internal = ::google::cloud::functions_internal; + extern gcf::HttpResponse bearer_token(gcf::HttpRequest request); extern gcf::HttpResponse concepts_after_response(gcf::HttpRequest request); extern gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request); @@ -35,9 +40,9 @@ extern gcf::HttpResponse concepts_stateless(gcf::HttpRequest request); extern gcf::HttpResponse env_vars(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_error(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_get(gcf::HttpRequest request); -extern gcf::HttpResponse hello_world_http(gcf::HttpRequest request); -extern void hello_world_pubsub(gcf::CloudEvent event); -extern void hello_world_storage(gcf::CloudEvent event); +extern gcf::Function hello_world_http(); +extern gcf::Function hello_world_pubsub(); +extern gcf::Function hello_world_storage(); extern gcf::HttpResponse http_content(gcf::HttpRequest request); extern gcf::HttpResponse http_cors(gcf::HttpRequest request); extern gcf::HttpResponse http_cors_auth(gcf::HttpRequest request); @@ -59,6 +64,18 @@ using ::testing::AllOf; using ::testing::HasSubstr; using ::testing::IsEmpty; +auto TriggerFunctionHttp(gcf::Function const& function, + gcf::HttpRequest const& r) { + gcf_internal::BeastRequest request; + request.target(r.target()); + request.body() = r.payload(); + for (auto const& [k, v] : r.headers()) request.insert(k, v); + + auto handler = + gcf_internal::FunctionImpl::GetImpl(function)->GetHandler("unused"); + return handler(std::move(request)); +} + TEST(ExamplesSiteTest, BearerToken) { google::cloud::functions_internal::SetEnv("TARGET_URL", std::nullopt); google::cloud::functions_internal::SetEnv("GOOGLE_APPLICATION_CREDENTIALS", @@ -190,16 +207,17 @@ TEST(ExamplesSiteTest, HelloWorldGet) { } TEST(ExamplesSiteTest, HelloWorlHttp) { - auto actual = hello_world_http( - gcf::HttpRequest{}.set_payload(R"js({ "name": "Foo" })js")); - EXPECT_EQ(actual.payload(), "Hello Foo!"); + auto function = hello_world_http(); + auto actual = TriggerFunctionHttp( + function, gcf::HttpRequest{}.set_payload(R"js({ "name": "Foo" })js")); + EXPECT_EQ(actual.body(), "Hello Foo!"); - actual = hello_world_http( - gcf::HttpRequest{}.set_payload(R"js({ "unused": 7 })js")); - EXPECT_EQ(actual.payload(), "Hello World!"); + actual = TriggerFunctionHttp( + function, gcf::HttpRequest{}.set_payload(R"js({ "unused": 7 })js")); + EXPECT_EQ(actual.body(), "Hello World!"); - actual = hello_world_http(gcf::HttpRequest{}.set_payload("Bar")); - EXPECT_EQ(actual.payload(), "Hello World!"); + actual = TriggerFunctionHttp(function, gcf::HttpRequest{}.set_payload("Bar")); + EXPECT_EQ(actual.body(), "Hello World!"); } TEST(ExamplesSiteTest, HelloWorldPubSub) { @@ -228,12 +246,17 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { for (auto const* data : {"dGVzdCBtZXNzYWdlIDM=", "YWJjZA==", ""}) { auto json = base; json["data"]["message"]["data"] = data; - EXPECT_NO_THROW(hello_world_pubsub( - google::cloud::functions_internal::ParseCloudEventJson(json.dump()))); + auto response = + TriggerFunctionHttp(hello_world_pubsub(), + gcf::HttpRequest{} + .set_payload(json.dump()) + .add_header("ce-type", "com.example.someevent") + .add_header("ce-source", "/mycontext") + .add_header("ce-id", "A234-1234-1234")); + EXPECT_EQ(response.result_int(), 200); } - EXPECT_NO_THROW(hello_world_pubsub( - google::cloud::functions_internal::ParseCloudEventJson(R"js({ + auto constexpr kBodyDataText = R"js({ "specversion": "1.0", "type": "test.invalid.invalid", "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", @@ -241,10 +264,8 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { "time": "2020-09-29T11:32:00.000Z", "datacontenttype": "text/plain", "data": "some data" - })js"))); - - EXPECT_THROW(hello_world_pubsub( - google::cloud::functions_internal::ParseCloudEventJson(R"js({ + })js"; + auto constexpr kBodyDataJson = R"js({ "specversion": "1.0", "type": "google.cloud.pubsub.topic.v1.messagePublished", "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", @@ -255,8 +276,27 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { "subscription": "projects/sample-project/subscriptions/sample-subscription" } } - })js")), - std::exception); + })js"; + + struct TestCase { + std::string name; + std::string body; + } cases[] = { + {"text", kBodyDataText}, + {"json", kBodyDataJson}, + }; + + for (auto const& [name, body] : cases) { + SCOPED_TRACE("Testing for " + name); + auto response = + TriggerFunctionHttp(hello_world_storage(), + gcf::HttpRequest{} + .set_payload(body) + .add_header("ce-type", "com.example.someevent") + .add_header("ce-source", "/mycontext") + .add_header("ce-id", "A234-1234-1234")); + EXPECT_EQ(response.result_int(), 200); + } } TEST(ExamplesSiteTest, HelloWorldStorage) { @@ -291,11 +331,7 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { } })js"); - EXPECT_NO_THROW(hello_world_storage( - google::cloud::functions_internal::ParseCloudEventJson(base.dump()))); - - EXPECT_NO_THROW(hello_world_storage( - google::cloud::functions_internal::ParseCloudEventJson(R"js({ + auto constexpr kBodyDataText = R"js({ "specversion": "1.0", "type": "test.invalid.invalid", "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", @@ -303,17 +339,37 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { "time": "2020-09-29T11:32:00.000Z", "datacontenttype": "text/plain", "data": "some data" - })js"))); + })js"; - EXPECT_NO_THROW(hello_world_storage( - google::cloud::functions_internal::ParseCloudEventJson(R"js({ + auto constexpr kBodyDataJson = R"js({ "specversion": "1.0", "type": "test.invalid.invalid", "source": "//pubsub.googleapis.com/projects/sample-project/topics/gcf-test", "id": "aaaaaa-1111-bbbb-2222-cccccccccccc", "time": "2020-09-29T11:32:00.000Z", "datacontenttype": "application/json" - })js"))); + })js"; + + struct TestCase { + std::string name; + std::string body; + } cases[] = { + {"base", base.dump()}, + {"text", kBodyDataText}, + {"json", kBodyDataJson}, + }; + + for (auto const& [name, body] : cases) { + SCOPED_TRACE("Testing for " + name); + auto response = + TriggerFunctionHttp(hello_world_storage(), + gcf::HttpRequest{} + .set_payload(body) + .add_header("ce-type", "com.example.someevent") + .add_header("ce-source", "/mycontext") + .add_header("ce-id", "A234-1234-1234")); + EXPECT_EQ(response.result_int(), 200); + } } TEST(ExamplesSiteTest, HttpContent) { From 6a9c412272ce53cd2ce044f4e6e7e2e205d4147b Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 15:58:43 -0400 Subject: [PATCH 39/77] doc: examples use declarative configuration 3/N (#369) --- ci/build-examples.yaml | 5 --- .../concepts_after_response.cc | 22 ++++++------ .../concepts_after_timeout.cc | 15 ++++---- .../concepts_filesystem.cc | 23 ++++++------ .../site/concepts_request/concepts_request.cc | 15 ++++---- .../concepts_stateless/concepts_stateless.cc | 11 +++--- examples/site_test.cc | 36 +++++++++++-------- 7 files changed, 66 insertions(+), 61 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 059d5e0d..06577562 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -162,7 +162,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_response' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_response', '--path', 'examples/site/concepts_after_response', 'site-concepts_after_response', @@ -171,7 +170,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_after_timeout' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_after_timeout', '--path', 'examples/site/concepts_after_timeout', 'site-concepts_after_timeout', @@ -180,7 +178,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_filesystem' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_filesystem', '--path', 'examples/site/concepts_filesystem', 'site-concepts_filesystem', @@ -189,7 +186,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_request' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_request', '--path', 'examples/site/concepts_request', 'site-concepts_request', @@ -198,7 +194,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-concepts_stateless' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=concepts_stateless', '--path', 'examples/site/concepts_stateless', 'site-concepts_stateless', diff --git a/examples/site/concepts_after_response/concepts_after_response.cc b/examples/site/concepts_after_response/concepts_after_response.cc index cba26f87..7f2413a7 100644 --- a/examples/site/concepts_after_response/concepts_after_response.cc +++ b/examples/site/concepts_after_response/concepts_after_response.cc @@ -13,21 +13,21 @@ // limitations under the License. // [START functions_concepts_after_response] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_after_response( - gcf::HttpRequest /*request*/) { // NOLINT - (void)std::async(std::launch::async, [] { - // This code may fail to complete, or even fail to start at all. - auto constexpr kIterations = 10; - int sum = 0; - for (int i = 0; i != kIterations; ++i) sum += i; - return sum; +gcf::Function concepts_after_response() { + return gcf::MakeFunction([](gcf::HttpRequest const&) { + (void)std::async(std::launch::async, [] { + // This code may fail to complete, or even fail to start at all. + auto constexpr kIterations = 10; + int sum = 0; + for (int i = 0; i != kIterations; ++i) sum += i; + return sum; + }); + return gcf::HttpResponse{}.set_payload("Hello World!"); }); - return gcf::HttpResponse{}.set_payload("Hello World!"); } // [END functions_concepts_after_response] diff --git a/examples/site/concepts_after_timeout/concepts_after_timeout.cc b/examples/site/concepts_after_timeout/concepts_after_timeout.cc index 67206a2a..a27c8dde 100644 --- a/examples/site/concepts_after_timeout/concepts_after_timeout.cc +++ b/examples/site/concepts_after_timeout/concepts_after_timeout.cc @@ -13,19 +13,20 @@ // limitations under the License. // [START functions_concepts_after_timeout] -#include -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request) { // NOLINT +gcf::Function concepts_after_timeout() { using std::chrono::minutes; - std::cout << "Function running..." << std::endl; - if (request.verb() == "GET") std::this_thread::sleep_for(minutes(2)); - std::cout << "Function completed!" << std::endl; - return gcf::HttpResponse{}.set_payload("Function completed!"); + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + std::cout << "Function running..." << std::endl; + if (request.verb() == "GET") std::this_thread::sleep_for(minutes(2)); + std::cout << "Function completed!" << std::endl; + return gcf::HttpResponse{}.set_payload("Function completed!"); + }); } // [END functions_concepts_after_timeout] diff --git a/examples/site/concepts_filesystem/concepts_filesystem.cc b/examples/site/concepts_filesystem/concepts_filesystem.cc index d1ef30e2..0a4a7c72 100644 --- a/examples/site/concepts_filesystem/concepts_filesystem.cc +++ b/examples/site/concepts_filesystem/concepts_filesystem.cc @@ -13,20 +13,21 @@ // limitations under the License. // [START functions_concepts_filesystem] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse concepts_filesystem(gcf::HttpRequest /*request*/) { // NOLINT - std::string payload; - for (auto const& p : std::filesystem::directory_iterator(".")) { - payload += p.path().generic_string(); - payload += "\n"; - } - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload(payload); +gcf::Function concepts_filesystem() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::string payload; + for (auto const& p : std::filesystem::directory_iterator(".")) { + payload += p.path().generic_string(); + payload += "\n"; + } + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload(payload); + }); } // [END functions_concepts_filesystem] diff --git a/examples/site/concepts_request/concepts_request.cc b/examples/site/concepts_request/concepts_request.cc index 9c021689..a601d50b 100644 --- a/examples/site/concepts_request/concepts_request.cc +++ b/examples/site/concepts_request/concepts_request.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_concepts_requests] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; @@ -24,11 +23,13 @@ namespace { unsigned int make_http_request(std::string const& host); } // namespace -gcf::HttpResponse concepts_request(gcf::HttpRequest /*request*/) { // NOLINT - std::string const host = "example.com"; - auto const code = make_http_request(host); - return gcf::HttpResponse{}.set_payload( - "Received code " + std::to_string(code) + " from " + host); +gcf::Function concepts_request() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::string const host = "example.com"; + auto const code = make_http_request(host); + return gcf::HttpResponse{}.set_payload( + "Received code " + std::to_string(code) + " from " + host); + }); } // [END functions_concepts_requests] diff --git a/examples/site/concepts_stateless/concepts_stateless.cc b/examples/site/concepts_stateless/concepts_stateless.cc index ad65e81d..9e3286a3 100644 --- a/examples/site/concepts_stateless/concepts_stateless.cc +++ b/examples/site/concepts_stateless/concepts_stateless.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_concepts_stateless] -#include -#include +#include #include #include @@ -24,8 +23,10 @@ namespace { std::atomic count{0}; } // namespace -gcf::HttpResponse concepts_stateless(gcf::HttpRequest /*request*/) { // NOLINT - return gcf::HttpResponse{}.set_payload("Instance execution count: " + - std::to_string(++count)); +gcf::Function concepts_stateless() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + return gcf::HttpResponse{}.set_payload("Instance execution count: " + + std::to_string(++count)); + }); } // [END functions_concepts_stateless] diff --git a/examples/site_test.cc b/examples/site_test.cc index 852a503a..42641aff 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -32,11 +32,11 @@ namespace gcf = ::google::cloud::functions; namespace gcf_internal = ::google::cloud::functions_internal; extern gcf::HttpResponse bearer_token(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_after_response(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_after_timeout(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_filesystem(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_request(gcf::HttpRequest request); -extern gcf::HttpResponse concepts_stateless(gcf::HttpRequest request); +extern gcf::Function concepts_after_response(); +extern gcf::Function concepts_after_timeout(); +extern gcf::Function concepts_filesystem(); +extern gcf::Function concepts_request(); +extern gcf::Function concepts_stateless(); extern gcf::HttpResponse env_vars(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_error(gcf::HttpRequest request); extern gcf::HttpResponse hello_world_get(gcf::HttpRequest request); @@ -156,28 +156,34 @@ lUtj+/nH3HDQjM4ltYfTPUg= } TEST(ExamplesSiteTest, ConceptsAfterResponse) { - auto actual = concepts_after_response(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Hello World!")); + auto function = concepts_after_response(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Hello World!")); } TEST(ExamplesSiteTest, ConceptsAfterTimeout) { - auto actual = concepts_after_timeout(gcf::HttpRequest{}.set_verb("PUT")); - EXPECT_THAT(actual.payload(), HasSubstr("Function completed!")); + auto function = concepts_after_timeout(); + auto const actual = + TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("PUT")); + EXPECT_THAT(actual.body(), HasSubstr("Function completed!")); } TEST(ExamplesSiteTest, ConceptsFilesystem) { - auto actual = concepts_filesystem(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), Not(IsEmpty())); + auto function = concepts_filesystem(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), Not(IsEmpty())); } TEST(ExamplesSiteTest, ConceptsRequest) { - auto actual = concepts_request(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Received code")); + auto function = concepts_request(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Received code")); } TEST(ExamplesSiteTest, ConceptsStateless) { - auto actual = concepts_stateless(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Instance execution count: ")); + auto function = concepts_stateless(); + auto const actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Instance execution count: ")); } TEST(ExamplesSiteTest, EnvVars) { From 63312c2bda7fa091b8c809b05e34788d7c1ff210 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Tue, 4 Jul 2023 18:11:02 -0400 Subject: [PATCH 40/77] doc: examples use declarative configuration 4/N (#370) --- ci/build-examples.yaml | 10 - examples/site/env_vars/env_vars.cc | 13 +- .../hello_world_error/hello_world_error.cc | 63 ++++--- .../site/hello_world_get/hello_world_get.cc | 15 +- examples/site/http_content/http_content.cc | 39 ++-- examples/site/http_cors/http_cors.cc | 35 ++-- .../site/http_cors_auth/http_cors_auth.cc | 39 ++-- .../site/http_form_data/http_form_data.cc | 9 +- examples/site/http_method/http_method.cc | 23 +-- examples/site/http_xml/http_xml.cc | 27 +-- .../site/log_helloworld/log_helloworld.cc | 25 +-- examples/site_test.cc | 172 ++++++++++-------- 12 files changed, 244 insertions(+), 226 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 06577562..b01ead98 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -202,7 +202,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-env_vars' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=env_vars', '--path', 'examples/site/env_vars', 'site-env_vars', @@ -211,7 +210,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_error' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_error', '--path', 'examples/site/hello_world_error', 'site-hello_world_error', @@ -220,7 +218,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-hello_world_get' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=hello_world_get', '--path', 'examples/site/hello_world_get', 'site-hello_world_get', @@ -253,7 +250,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_content' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_content', '--path', 'examples/site/http_content', 'site-http_content', @@ -262,7 +258,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_cors' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_cors', '--path', 'examples/site/http_cors', 'site-http_cors', @@ -271,7 +266,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_cors_auth' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_cors_auth', '--path', 'examples/site/http_cors_auth', 'site-http_cors_auth', @@ -280,7 +274,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_form_data' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_form_data', '--path', 'examples/site/http_form_data', 'site-http_form_data', @@ -289,7 +282,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_method' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_method', '--path', 'examples/site/http_method', 'site-http_method', @@ -298,7 +290,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-http_xml' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=http_xml', '--path', 'examples/site/http_xml', 'site-http_xml', @@ -307,7 +298,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-log_helloworld' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=log_helloworld', '--path', 'examples/site/log_helloworld', 'site-log_helloworld', diff --git a/examples/site/env_vars/env_vars.cc b/examples/site/env_vars/env_vars.cc index 6f40bce7..571f7381 100644 --- a/examples/site/env_vars/env_vars.cc +++ b/examples/site/env_vars/env_vars.cc @@ -13,15 +13,16 @@ // limitations under the License. // [START functions_env_vars] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse env_vars(gcf::HttpRequest /*request*/) { // NOLINT - char const* value = std::getenv("FOO"); - if (value == nullptr) value = "FOO environment variable is not set"; - return gcf::HttpResponse{}.set_payload(value); +gcf::Function env_vars() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + char const* value = std::getenv("FOO"); + if (value == nullptr) value = "FOO environment variable is not set"; + return gcf::HttpResponse{}.set_payload(value); + }); } // [END functions_env_vars] diff --git a/examples/site/hello_world_error/hello_world_error.cc b/examples/site/hello_world_error/hello_world_error.cc index 0bf7cb70..39838d4b 100644 --- a/examples/site/hello_world_error/hello_world_error.cc +++ b/examples/site/hello_world_error/hello_world_error.cc @@ -13,46 +13,45 @@ // limitations under the License. // [START functions_helloworld_error] -#include -#include +#include #include #include namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -gcf::HttpResponse hello_world_error(gcf::HttpRequest request) { // NOLINT - if (request.target() == "/return500") { - // An error response code does NOT create entries in Error Reporting - return gcf::HttpResponse{}.set_result( - gcf::HttpResponse::kInternalServerError); - } - // Unstructured logs to stdout and/or stderr do NOT create entries in Error - // Reporting - std::cout << "An error occurred (stdout)\n"; - std::cerr << "An error occurred (stderr)\n"; +gcf::Function hello_world_error() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + if (request.target() == "/return500") { + // An error response code does NOT create entries in Error Reporting + return gcf::HttpResponse{}.set_result( + gcf::HttpResponse::kInternalServerError); + } + // Unstructured logs to stdout and/or stderr do NOT create entries in Error + // Reporting + std::cout << "An error occurred (stdout)\n"; + std::cerr << "An error occurred (stderr)\n"; - if (request.target() == "/throw/exception") { - // Throwing an exception WILL create new entries in Error Reporting - throw std::runtime_error("I failed you"); - } + if (request.target() == "/throw/exception") { + // Throwing an exception WILL create new entries in Error Reporting + throw std::runtime_error("I failed you"); + } - // Structured logs MAY create entries in Error Reporting depending on their - // severity. You can create structured logs manually (as shown here), or using - // your favorite logging library with suitable formatting. - std::cerr << nlohmann::json{{"severity", "info"}, - {"message", "informational message"}} - .dump() - << std::endl; + // Structured logs MAY create entries in Error Reporting depending on their + // severity. You can create structured logs manually (as shown here), or + // using your favorite logging library with suitable formatting. + std::cerr << nlohmann::json{{"severity", "info"}, + {"message", "informational message"}} + .dump() + << std::endl; - std::cerr << nlohmann::json{{"severity", "error"}, - {"message", "an error message"}} - .dump() - << std::endl; + std::cerr << nlohmann::json{{"severity", "error"}, + {"message", "an error message"}} + .dump() + << std::endl; - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello World!"); + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); + }); } // [END functions_helloworld_error] diff --git a/examples/site/hello_world_get/hello_world_get.cc b/examples/site/hello_world_get/hello_world_get.cc index 973c731e..ac508186 100644 --- a/examples/site/hello_world_get/hello_world_get.cc +++ b/examples/site/hello_world_get/hello_world_get.cc @@ -13,16 +13,15 @@ // limitations under the License. // [START functions_helloworld_get] -#include -#include +#include namespace gcf = ::google::cloud::functions; -// Though not used in this example, the request is passed by value to support -// applications that move-out its data. -gcf::HttpResponse hello_world_get(gcf::HttpRequest) { // NOLINT - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello World!"); +gcf::Function hello_world_get() { + return gcf::MakeFunction([](gcf::HttpRequest const&) { + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); + }); } // [END functions_helloworld_get] diff --git a/examples/site/http_content/http_content.cc b/examples/site/http_content/http_content.cc index 2e59fe00..e52b107a 100644 --- a/examples/site/http_content/http_content.cc +++ b/examples/site/http_content/http_content.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_http_content] -#include -#include +#include #include #include #include @@ -29,25 +28,27 @@ std::map parse_www_form_urlencoded( std::string const& text); } // namespace -gcf::HttpResponse http_content(gcf::HttpRequest request) { // NOLINT - std::string name; - auto const& headers = request.headers(); - if (auto f = headers.find("content-type"); f != headers.end()) { - if (f->second == "application/json") { - name = nlohmann::json::parse(request.payload()).value("name", ""); - } else if (f->second == "application/octet-stream" || - f->second == "text/plain") { - name = request.payload(); // treat contents as a string - } else if (f->second == "application/x-www-form-urlencoded") { - // Use your preferred parser, here we use some custom code. - auto form = parse_www_form_urlencoded(request.payload()); - name = form["name"]; +gcf::Function http_content() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + std::string name; + auto const& headers = request.headers(); + if (auto f = headers.find("content-type"); f != headers.end()) { + if (f->second == "application/json") { + name = nlohmann::json::parse(request.payload()).value("name", ""); + } else if (f->second == "application/octet-stream" || + f->second == "text/plain") { + name = request.payload(); // treat contents as a string + } else if (f->second == "application/x-www-form-urlencoded") { + // Use your preferred parser, here we use some custom code. + auto form = parse_www_form_urlencoded(request.payload()); + name = form["name"]; + } } - } - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello " + name); + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello " + name); + }); } // [END functions_http_content] diff --git a/examples/site/http_cors/http_cors.cc b/examples/site/http_cors/http_cors.cc index ac998ced..46647dc9 100644 --- a/examples/site/http_cors/http_cors.cc +++ b/examples/site/http_cors/http_cors.cc @@ -13,27 +13,28 @@ // limitations under the License. // [START functions_http_cors] -#include -#include +#include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse http_cors(gcf::HttpRequest request) { // NOLINT - // Set CORS headers for preflight request - if (request.verb() == "OPTIONS") { - // Allows GET requests from any origin with the Content-Type header and - // caches preflight response for an 3600s +gcf::Function http_cors() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + // Set CORS headers for preflight request + if (request.verb() == "OPTIONS") { + // Allows GET requests from any origin with the Content-Type header and + // caches preflight response for an 3600s + return gcf::HttpResponse{} + .set_result(gcf::HttpResponse::kNoContent) + .set_header("Access-Control-Allow-Origin", "*") + .set_header("Access-Control-Allow-Methods", "GET") + .set_header("Access-Control-Allow-Headers", "Content-Type") + .set_header("Access-Control-Max-Age", "3600"); + } + return gcf::HttpResponse{} - .set_result(gcf::HttpResponse::kNoContent) .set_header("Access-Control-Allow-Origin", "*") - .set_header("Access-Control-Allow-Methods", "GET") - .set_header("Access-Control-Allow-Headers", "Content-Type") - .set_header("Access-Control-Max-Age", "3600"); - } - - return gcf::HttpResponse{} - .set_header("Access-Control-Allow-Origin", "*") - .set_header("content-type", "text/plain") - .set_payload("Hello World!"); + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); + }); } // [END functions_http_cors] diff --git a/examples/site/http_cors_auth/http_cors_auth.cc b/examples/site/http_cors_auth/http_cors_auth.cc index 6ace8302..155d5600 100644 --- a/examples/site/http_cors_auth/http_cors_auth.cc +++ b/examples/site/http_cors_auth/http_cors_auth.cc @@ -13,29 +13,30 @@ // limitations under the License. // [START functions_http_cors_auth] -#include -#include +#include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse http_cors_auth(gcf::HttpRequest request) { // NOLINT - // Set CORS headers for preflight request - if (request.verb() == "OPTIONS") { - // Allows GET requests from any origin with the Content-Type header and - // caches preflight response for an 3600s +gcf::Function http_cors_auth() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + // Set CORS headers for preflight request + if (request.verb() == "OPTIONS") { + // Allows GET requests from any origin with the Content-Type header and + // caches preflight response for an 3600s + return gcf::HttpResponse{} + .set_result(gcf::HttpResponse::kNoContent) + .set_header("Access-Control-Allow-Origin", "https://mydomain.com") + .set_header("Access-Control-Allow-Methods", "GET") + .set_header("Access-Control-Allow-Headers", "Authorization") + .set_header("Access-Control-Max-Age", "3600") + .set_header("Access-Control-Allow-Credentials", "true"); + } + return gcf::HttpResponse{} - .set_result(gcf::HttpResponse::kNoContent) .set_header("Access-Control-Allow-Origin", "https://mydomain.com") - .set_header("Access-Control-Allow-Methods", "GET") - .set_header("Access-Control-Allow-Headers", "Authorization") - .set_header("Access-Control-Max-Age", "3600") - .set_header("Access-Control-Allow-Credentials", "true"); - } - - return gcf::HttpResponse{} - .set_header("Access-Control-Allow-Origin", "https://mydomain.com") - .set_header("Access-Control-Allow-Credentials", "true") - .set_header("content-type", "text/plain") - .set_payload("Hello World!"); + .set_header("Access-Control-Allow-Credentials", "true") + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); + }); } // [END functions_http_cors_auth] diff --git a/examples/site/http_form_data/http_form_data.cc b/examples/site/http_form_data/http_form_data.cc index 2bd058bf..06f4aee5 100644 --- a/examples/site/http_form_data/http_form_data.cc +++ b/examples/site/http_form_data/http_form_data.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_http_form_data] -#include -#include +#include #include #include #include @@ -59,7 +58,7 @@ class FormDataDelimiter { } // namespace -gcf::HttpResponse http_form_data(gcf::HttpRequest request) { +gcf::HttpResponse http_form_data_impl(gcf::HttpRequest request) { if (request.verb() != "POST") { return gcf::HttpResponse{}.set_result(gcf::HttpResponse::kMethodNotAllowed); } @@ -118,6 +117,10 @@ gcf::HttpResponse http_form_data(gcf::HttpRequest request) { .set_header("content-type", "application/json") .set_payload(result.dump()); } + +gcf::Function http_form_data() { + return gcf::MakeFunction(http_form_data_impl); +} // [END functions_http_form_data] namespace { diff --git a/examples/site/http_method/http_method.cc b/examples/site/http_method/http_method.cc index 13e17f91..c5a15aae 100644 --- a/examples/site/http_method/http_method.cc +++ b/examples/site/http_method/http_method.cc @@ -13,20 +13,21 @@ // limitations under the License. // [START functions_http_method] -#include -#include +#include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse http_method(gcf::HttpRequest request) { // NOLINT - if (request.verb() == "GET") { - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello World!"); - } +gcf::Function http_method() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + if (request.verb() == "GET") { + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello World!"); + } - return gcf::HttpResponse{}.set_result( - request.verb() == "POST" ? gcf::HttpResponse::kForbidden - : gcf::HttpResponse::kMethodNotAllowed); + return gcf::HttpResponse{}.set_result( + request.verb() == "POST" ? gcf::HttpResponse::kForbidden + : gcf::HttpResponse::kMethodNotAllowed); + }); } // [END functions_http_method] diff --git a/examples/site/http_xml/http_xml.cc b/examples/site/http_xml/http_xml.cc index bf15227f..ac1062aa 100644 --- a/examples/site/http_xml/http_xml.cc +++ b/examples/site/http_xml/http_xml.cc @@ -13,25 +13,26 @@ // limitations under the License. // [START functions_http_xml] -#include -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse http_xml(gcf::HttpRequest request) { // NOLINT - std::istringstream is(request.payload()); - // Use the Boost.PropertyTree XML parser, this is adequate for a small - // example, but application developers may want to consider a more robust - // parser for production code. - boost::property_tree::ptree data; - boost::property_tree::read_xml(is, data); +gcf::Function http_xml() { + return gcf::MakeFunction([](gcf::HttpRequest const& request) { + std::istringstream is(request.payload()); + // Use the Boost.PropertyTree XML parser, as this is adequate for a small + // example. Application developers may want to consider a more robust + // parser for production code. + boost::property_tree::ptree data; + boost::property_tree::read_xml(is, data); - auto name = data.get("name", "World"); - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello " + name); + auto name = data.get("name", "World"); + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello " + name); + }); } // [END functions_http_xml] diff --git a/examples/site/log_helloworld/log_helloworld.cc b/examples/site/log_helloworld/log_helloworld.cc index 71309f15..9b1abb33 100644 --- a/examples/site/log_helloworld/log_helloworld.cc +++ b/examples/site/log_helloworld/log_helloworld.cc @@ -13,23 +13,24 @@ // limitations under the License. // [START functions_log_helloworld] -#include -#include +#include #include #include namespace gcf = ::google::cloud::functions; -gcf::HttpResponse log_helloworld(gcf::HttpRequest /*request*/) { // NOLINT - std::cout << "This is stdout\n"; - std::cerr << "This is stderr\n"; +gcf::Function log_helloworld() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::cout << "This is stdout\n"; + std::cerr << "This is stderr\n"; - std::cerr << nlohmann::json{{"message", "This has ERROR severity"}, - {"severity", "error"}} - .dump() - << "\n"; - return gcf::HttpResponse{} - .set_header("content-type", "text/plain") - .set_payload("Hello Logging!"); + std::cerr << nlohmann::json{{"message", "This has ERROR severity"}, + {"severity", "error"}} + .dump() + << "\n"; + return gcf::HttpResponse{} + .set_header("content-type", "text/plain") + .set_payload("Hello Logging!"); + }); } // [END functions_log_helloworld] diff --git a/examples/site_test.cc b/examples/site_test.cc index 42641aff..b37a6759 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -37,19 +37,19 @@ extern gcf::Function concepts_after_timeout(); extern gcf::Function concepts_filesystem(); extern gcf::Function concepts_request(); extern gcf::Function concepts_stateless(); -extern gcf::HttpResponse env_vars(gcf::HttpRequest request); -extern gcf::HttpResponse hello_world_error(gcf::HttpRequest request); -extern gcf::HttpResponse hello_world_get(gcf::HttpRequest request); +extern gcf::Function env_vars(); +extern gcf::Function hello_world_error(); +extern gcf::Function hello_world_get(); extern gcf::Function hello_world_http(); extern gcf::Function hello_world_pubsub(); extern gcf::Function hello_world_storage(); -extern gcf::HttpResponse http_content(gcf::HttpRequest request); -extern gcf::HttpResponse http_cors(gcf::HttpRequest request); -extern gcf::HttpResponse http_cors_auth(gcf::HttpRequest request); -extern gcf::HttpResponse http_form_data(gcf::HttpRequest request); -extern gcf::HttpResponse http_method(gcf::HttpRequest request); -extern gcf::HttpResponse http_xml(gcf::HttpRequest request); -extern gcf::HttpResponse log_helloworld(gcf::HttpRequest request); +extern gcf::Function http_content(); +extern gcf::Function http_cors(); +extern gcf::Function http_cors_auth(); +extern gcf::Function http_form_data(); +extern gcf::Function http_method(); +extern gcf::Function http_xml(); +extern gcf::Function log_helloworld(); extern void log_stackdriver(gcf::CloudEvent event); extern void pubsub_subscribe(gcf::CloudEvent event); extern gcf::HttpResponse tips_gcp_apis(gcf::HttpRequest request); @@ -67,6 +67,7 @@ using ::testing::IsEmpty; auto TriggerFunctionHttp(gcf::Function const& function, gcf::HttpRequest const& r) { gcf_internal::BeastRequest request; + request.method_string(r.verb()); request.target(r.target()); request.body() = r.payload(); for (auto const& [k, v] : r.headers()) request.insert(k, v); @@ -188,28 +189,32 @@ TEST(ExamplesSiteTest, ConceptsStateless) { TEST(ExamplesSiteTest, EnvVars) { google::cloud::functions_internal::SetEnv("FOO", std::nullopt); - auto actual = env_vars(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), AllOf(HasSubstr("FOO"), HasSubstr("not set"))); + auto function = env_vars(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), AllOf(HasSubstr("FOO"), HasSubstr("not set"))); google::cloud::functions_internal::SetEnv("FOO", "test-value"); - actual = env_vars(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("test-value")); + actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("test-value")); } TEST(ExamplesSiteTest, HelloWorldError) { - auto actual = hello_world_error(gcf::HttpRequest{}); - EXPECT_EQ(actual.payload(), "Hello World!"); + auto function = hello_world_error(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_EQ(actual.body(), "Hello World!"); - EXPECT_THROW( - hello_world_error(gcf::HttpRequest{}.set_target("/throw/exception")), - std::exception); - auto error = hello_world_error(gcf::HttpRequest{}.set_target("/return500")); - EXPECT_EQ(error.result(), gcf::HttpResponse::kInternalServerError); + actual = TriggerFunctionHttp( + function, gcf::HttpRequest{}.set_target("/throw/exception")); + EXPECT_EQ(actual.result_int(), gcf::HttpResponse::kInternalServerError); + auto error = TriggerFunctionHttp(function, + gcf::HttpRequest{}.set_target("/return500")); + EXPECT_EQ(error.result_int(), gcf::HttpResponse::kInternalServerError); } TEST(ExamplesSiteTest, HelloWorldGet) { - auto actual = hello_world_get(gcf::HttpRequest{}); - EXPECT_EQ(actual.payload(), "Hello World!"); + auto function = hello_world_get(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_EQ(actual.body(), "Hello World!"); } TEST(ExamplesSiteTest, HelloWorlHttp) { @@ -287,7 +292,7 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { struct TestCase { std::string name; std::string body; - } cases[] = { + } const cases[] = { {"text", kBodyDataText}, {"json", kBodyDataJson}, }; @@ -359,7 +364,7 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { struct TestCase { std::string name; std::string body; - } cases[] = { + } const cases[] = { {"base", base.dump()}, {"text", kBodyDataText}, {"json", kBodyDataJson}, @@ -385,41 +390,47 @@ TEST(ExamplesSiteTest, HttpContent) { .set_payload(std::move(payload)); }; - auto actual = http_content( - make_request("application/json", R"js({ "name": "Foo" })js")); - EXPECT_THAT(actual.payload(), "Hello Foo"); + auto function = http_content(); + auto actual = TriggerFunctionHttp( + function, make_request("application/json", R"js({ "name": "Foo" })js")); + EXPECT_THAT(actual.body(), "Hello Foo"); - actual = http_content(make_request("text/plain", "Bar")); - EXPECT_THAT(actual.payload(), "Hello Bar"); + actual = TriggerFunctionHttp(function, make_request("text/plain", "Bar")); + EXPECT_THAT(actual.body(), "Hello Bar"); - actual = http_content(make_request("application/x-www-form-urlencoded", - "id=1&name=Baz%20Qux&value=x")); - EXPECT_THAT(actual.payload(), "Hello Baz Qux"); + actual = TriggerFunctionHttp(function, + make_request("application/x-www-form-urlencoded", + "id=1&name=Baz%20Qux&value=x")); + EXPECT_THAT(actual.body(), "Hello Baz Qux"); - actual = http_content(make_request("application/x-www-form-urlencoded", - "id=1&name=Baz%Qux&value=x")); - EXPECT_THAT(actual.payload(), "Hello Baz%Qux"); + actual = TriggerFunctionHttp(function, + make_request("application/x-www-form-urlencoded", + "id=1&name=Baz%Qux&value=x")); + EXPECT_THAT(actual.body(), "Hello Baz%Qux"); } TEST(ExamplesSiteTest, HttpCors) { - auto actual = http_cors(gcf::HttpRequest{}.set_verb("OPTIONS")); - EXPECT_EQ(actual.headers().at("Access-Control-Allow-Methods"), "GET"); - - actual = http_cors(gcf::HttpRequest{}.set_verb("GET")); - EXPECT_EQ(actual.headers().at("Access-Control-Allow-Origin"), "*"); - EXPECT_EQ(actual.payload(), "Hello World!"); + auto function = http_cors(); + auto actual = + TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("OPTIONS")); + std::cout << "DEBUG DEBUG " << actual << std::endl; + EXPECT_EQ(actual.at("Access-Control-Allow-Methods"), "GET"); + + actual = TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("GET")); + EXPECT_EQ(actual.at("Access-Control-Allow-Origin"), "*"); + EXPECT_EQ(actual.body(), "Hello World!"); } TEST(ExamplesSiteTest, HttpCorsAuth) { - auto actual = http_cors_auth(gcf::HttpRequest{}.set_verb("OPTIONS")); - EXPECT_EQ(actual.headers().at("Access-Control-Allow-Headers"), - "Authorization"); - - actual = http_cors_auth(gcf::HttpRequest{}.set_verb("GET")); - EXPECT_EQ(actual.headers().at("Access-Control-Allow-Origin"), - "https://mydomain.com"); - EXPECT_EQ(actual.headers().at("Access-Control-Allow-Credentials"), "true"); - EXPECT_EQ(actual.payload(), "Hello World!"); + auto function = http_cors_auth(); + auto actual = + TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("OPTIONS")); + EXPECT_EQ(actual.at("Access-Control-Allow-Headers"), "Authorization"); + + actual = TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("GET")); + EXPECT_EQ(actual.at("Access-Control-Allow-Origin"), "https://mydomain.com"); + EXPECT_EQ(actual.at("Access-Control-Allow-Credentials"), "true"); + EXPECT_EQ(actual.body(), "Hello World!"); } TEST(ExamplesSiteTest, HttpFormData) { @@ -438,16 +449,18 @@ TEST(ExamplesSiteTest, HttpFormData) { ; // Test with both quoted and unquoted boundaries. + auto function = http_form_data(); for (auto const* content_type : {R"""(multipart/form-data;boundary="boundary")""", R"""(multipart/form-data;boundary=boundary)"""}) { SCOPED_TRACE("Testing with content_type = " + std::string(content_type)); - auto actual = http_form_data(gcf::HttpRequest{} - .add_header("content-type", content_type) - .set_payload(kPayload) - .set_verb("POST")); - ASSERT_EQ(actual.result(), gcf::HttpResponse::kOkay); - auto const actual_payload = nlohmann::json::parse(actual.payload()); + auto actual = TriggerFunctionHttp( + function, gcf::HttpRequest{} + .add_header("content-type", content_type) + .set_payload(kPayload) + .set_verb("POST")); + ASSERT_EQ(actual.result_int(), gcf::HttpResponse::kOkay); + auto const actual_payload = nlohmann::json::parse(actual.body()); auto const expected_payload = nlohmann::json{ {"parts", { @@ -460,34 +473,39 @@ TEST(ExamplesSiteTest, HttpFormData) { EXPECT_EQ(actual_payload, expected_payload); } - EXPECT_EQ(http_form_data(gcf::HttpRequest{}).result(), + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), gcf::HttpResponse::kMethodNotAllowed); - EXPECT_EQ(http_form_data(gcf::HttpRequest{}.set_verb("POST")).result(), + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("POST")) + .result_int(), gcf::HttpResponse::kBadRequest); - EXPECT_EQ(http_form_data(gcf::HttpRequest{}.set_verb("POST").add_header( - "content-type", "application/json")) - .result(), + EXPECT_EQ(TriggerFunctionHttp(function, + gcf::HttpRequest{}.set_verb("POST").add_header( + "content-type", "application/json")) + .result_int(), gcf::HttpResponse::kBadRequest); - EXPECT_THROW( - http_form_data(gcf::HttpRequest{} - .add_header("content-type", "multipart/form-data") - .set_verb("POST")), - std::exception); + EXPECT_EQ(TriggerFunctionHttp( + function, gcf::HttpRequest{} + .add_header("content-type", "multipart/form-data") + .set_verb("POST")) + .result_int(), + gcf::HttpResponse::kInternalServerError); } TEST(ExamplesSiteTest, HttpMethod) { struct Test { std::string verb; int result; - } tests[] = { + } const tests[] = { {"GET", gcf::HttpResponse::kOkay}, {"POST", gcf::HttpResponse::kForbidden}, {"PUT", gcf::HttpResponse::kMethodNotAllowed}, }; + auto function = http_method(); for (auto const& test : tests) { - auto actual = http_method(gcf::HttpRequest{}.set_verb(test.verb)); - EXPECT_EQ(actual.result(), test.result); + auto actual = + TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb(test.verb)); + EXPECT_EQ(actual.result_int(), test.result); } } @@ -496,24 +514,26 @@ TEST(ExamplesSiteTest, HttpXml) { return gcf::HttpRequest{}.set_payload(std::move(payload)); }; - auto actual = http_xml(make_request(R"xml( + auto function = http_xml(); + auto actual = TriggerFunctionHttp(function, make_request(R"xml( Foo Bar Baz )xml")); - EXPECT_EQ(actual.payload(), "Hello Foo"); + EXPECT_EQ(actual.body(), "Hello Foo"); - actual = http_xml(make_request(R"xml( + actual = TriggerFunctionHttp(function, make_request(R"xml( Foo Bar Baz )xml")); - EXPECT_EQ(actual.payload(), "Hello World"); + EXPECT_EQ(actual.body(), "Hello World"); } TEST(ExamplesSiteTest, LogHelloWorld) { - auto actual = log_helloworld(gcf::HttpRequest{}); - EXPECT_EQ(actual.payload(), "Hello Logging!"); + auto function = log_helloworld(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_EQ(actual.body(), "Hello Logging!"); } TEST(ExamplesSiteTest, LogStackdriver) { From c2030c0bd0975106dd78f4137525cfd27826143e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 09:20:59 -0400 Subject: [PATCH 41/77] ci: use `allowFailure` for optional steps (#372) Simplify error handling in optional steps for the Google Cloud Build config files. --- ci/build-examples.yaml | 4 ++-- ci/cloudbuild/cloudbuild.yaml | 7 +++---- ci/generate-build-examples.sh | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index b01ead98..90c1c148 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -426,6 +426,7 @@ steps: # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + allowFailure: true entrypoint: 'bash' args: - '-c' @@ -434,13 +435,13 @@ steps: gcloud container images delete -q gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID} gcloud container images delete -q gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID} gcloud container images delete -q gcr.io/${PROJECT_ID}/ci/hello-world:${BUILD_ID} - exit 0 # The previous step may not run if the build fails. Garbage collect any # images created by this script more than 4 weeks ago. This step should # not break the build on error, and it can start running as soon as the # build does. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + allowFailure: true waitFor: ['-'] entrypoint: 'bash' args: @@ -453,4 +454,3 @@ steps: xargs printf "gcr.io/${PROJECT_ID}/$${image}@$$1\n" done | \ xargs -P 4 -L 32 gcloud container images delete -q --force-delete-tags - exit 0 diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index 39b345d7..201dddf2 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -63,9 +63,9 @@ steps: entrypoint: '/bin/true' # Restores the homedir cache into /h in parallel with the previous step. - # Won't break the build if this step fails. - name: 'gcr.io/cloud-builders/gsutil' waitFor: [ '-' ] + allowFailure: true entrypoint: 'bash' dir: '/h' args: @@ -75,17 +75,16 @@ steps: --bucket_url=gs://${_CACHE_BUCKET}/build-cache/functions-framework-cpp --key=${_TRIGGER_SOURCE}/${_DISTRO}-${_BUILD_NAME}/h --fallback_key=main/${_DISTRO}-${_BUILD_NAME}/h - || true # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + allowFailure: true entrypoint: 'bash' args: - '-c' - | set +e gcloud container images delete -q gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID} - exit 0 # The previous step may not run if the build fails. Garbage collect any # images created by this script, and/or similar scripts in this repository. @@ -95,6 +94,7 @@ steps: # can start running as soon as the build does. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' waitFor: [ '-' ] + allowFailure: true entrypoint: 'bash' args: - '-c' @@ -104,4 +104,3 @@ steps: --format='get(digest)' --filter='timestamp.datetime < -P4W' | \ xargs -r printf "gcr.io/${PROJECT_ID}/${_IMAGE}@%s\n" | \ xargs -r -P 4 -L 32 gcloud container images delete -q --force-delete-tags - exit 0 diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 33483354..38dda597 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -212,6 +212,7 @@ cat <<_EOF_ # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + allowFailure: true entrypoint: 'bash' args: - '-c' @@ -220,13 +221,13 @@ cat <<_EOF_ gcloud container images delete -q gcr.io/\${PROJECT_ID}/ci/run-image:\${BUILD_ID} gcloud container images delete -q gcr.io/\${PROJECT_ID}/ci/build-image:\${BUILD_ID} gcloud container images delete -q gcr.io/\${PROJECT_ID}/ci/hello-world:\${BUILD_ID} - exit 0 # The previous step may not run if the build fails. Garbage collect any # images created by this script more than 4 weeks ago. This step should # not break the build on error, and it can start running as soon as the # build does. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + allowFailure: true waitFor: ['-'] entrypoint: 'bash' args: @@ -239,5 +240,4 @@ cat <<_EOF_ xargs printf "gcr.io/\${PROJECT_ID}/\$\${image}@\$\$1\n" done | \\ xargs -P 4 -L 32 gcloud container images delete -q --force-delete-tags - exit 0 _EOF_ From 882d0c0ba012e0d024ce6c396aeb76790331dce1 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 14:08:48 -0400 Subject: [PATCH 42/77] doc: examples use declarative configuration 5/N (#371) --- ci/build-examples.yaml | 8 - examples/site/bearer_token/bearer_token.cc | 7 +- .../site/log_stackdriver/log_stackdriver.cc | 24 +-- .../site/pubsub_subscribe/pubsub_subscribe.cc | 12 +- examples/site/tips_gcp_apis/tips_gcp_apis.cc | 7 +- .../tips_infinite_retries.cc | 26 +-- .../tips_lazy_globals/tips_lazy_globals.cc | 11 +- examples/site/tips_retry/tips_retry.cc | 22 +-- examples/site/tips_scopes/tips_scopes.cc | 11 +- examples/site_test.cc | 161 ++++++++++++------ 10 files changed, 178 insertions(+), 111 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 90c1c148..5715083f 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -153,7 +153,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-bearer_token' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=bearer_token', '--path', 'examples/site/bearer_token', 'site-bearer_token', @@ -306,7 +305,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-log_stackdriver' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=log_stackdriver', '--path', 'examples/site/log_stackdriver', 'site-log_stackdriver', @@ -315,7 +313,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-pubsub_subscribe' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=pubsub_subscribe', '--path', 'examples/site/pubsub_subscribe', 'site-pubsub_subscribe', @@ -324,7 +321,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_gcp_apis' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=tips_gcp_apis', '--path', 'examples/site/tips_gcp_apis', 'site-tips_gcp_apis', @@ -333,7 +329,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_infinite_retries' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=tips_infinite_retries', '--path', 'examples/site/tips_infinite_retries', 'site-tips_infinite_retries', @@ -342,7 +337,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_lazy_globals' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=tips_lazy_globals', '--path', 'examples/site/tips_lazy_globals', 'site-tips_lazy_globals', @@ -351,7 +345,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_retry' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent', '--env', 'GOOGLE_FUNCTION_TARGET=tips_retry', '--path', 'examples/site/tips_retry', 'site-tips_retry', @@ -360,7 +353,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tips_scopes' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=tips_scopes', '--path', 'examples/site/tips_scopes', 'site-tips_scopes', diff --git a/examples/site/bearer_token/bearer_token.cc b/examples/site/bearer_token/bearer_token.cc index fad8408b..8e2238d7 100644 --- a/examples/site/bearer_token/bearer_token.cc +++ b/examples/site/bearer_token/bearer_token.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_bearer_token] -#include -#include +#include #include #include #include @@ -31,7 +30,7 @@ gcf::HttpResponse HttpGet(std::string const& url, std::string const& authorization_header); } // namespace -gcf::HttpResponse bearer_token(gcf::HttpRequest request) { // NOLINT +gcf::HttpResponse bearer_token_impl(gcf::HttpRequest const& request) { static auto const kTargetUrl = [] { auto const* target_url = std::getenv("TARGET_URL"); if (target_url != nullptr) return std::string(target_url); @@ -61,6 +60,8 @@ gcf::HttpResponse bearer_token(gcf::HttpRequest request) { // NOLINT os << "Error creating authorization header: " << std::move(header).status(); throw std::runtime_error(std::move(os).str()); } + +gcf::Function bearer_token() { return gcf::MakeFunction(bearer_token_impl); } // [END functions_bearer_token] namespace { diff --git a/examples/site/log_stackdriver/log_stackdriver.cc b/examples/site/log_stackdriver/log_stackdriver.cc index 7997a1c7..219d8bcb 100644 --- a/examples/site/log_stackdriver/log_stackdriver.cc +++ b/examples/site/log_stackdriver/log_stackdriver.cc @@ -13,22 +13,24 @@ // limitations under the License. // [START functions_log_stackdriver] -#include +#include #include #include #include namespace gcf = ::google::cloud::functions; -void log_stackdriver(gcf::CloudEvent event) { // NOLINT - if (event.data_content_type().value_or("") != "application/json") { - std::cerr << "expected application/json data"; - return; - } - auto const payload = nlohmann::json::parse(event.data().value_or("{}")); - auto const data = cppcodec::base64_rfc4648::decode( - payload["message"]["data"].get()); - auto const log_entry = nlohmann::json::parse(data); - std::cout << "Log entry data: " << log_entry.dump(/*indent=*/2) << "\n"; +gcf::Function log_stackdriver() { + return gcf::MakeFunction([](gcf::CloudEvent const& event) { + if (event.data_content_type().value_or("") != "application/json") { + std::cerr << "expected application/json data\n"; + return; + } + auto const payload = nlohmann::json::parse(event.data().value_or("{}")); + auto const data = cppcodec::base64_rfc4648::decode( + payload["message"]["data"].get()); + auto const log_entry = nlohmann::json::parse(data); + std::cout << "Log entry data: " << log_entry.dump(/*indent=*/2) << "\n"; + }); } // [END functions_log_stackdriver] diff --git a/examples/site/pubsub_subscribe/pubsub_subscribe.cc b/examples/site/pubsub_subscribe/pubsub_subscribe.cc index 76c2771a..952e82a6 100644 --- a/examples/site/pubsub_subscribe/pubsub_subscribe.cc +++ b/examples/site/pubsub_subscribe/pubsub_subscribe.cc @@ -13,11 +13,15 @@ // limitations under the License. // [START functions_pubsub_subscribe] -#include +#include #include -void pubsub_subscribe(google::cloud::functions::CloudEvent event) { // NOLINT - // The framework converts the data from base64 if needed. - std::cout << event.data().value_or("") << "\n"; +namespace gcf = ::google::cloud::functions; + +gcf::Function pubsub_subscribe() { + return gcf::MakeFunction([](gcf::CloudEvent const& event) { + // The framework converts the data from base64 if needed. + std::cout << event.data().value_or("") << "\n"; + }); } // [END functions_pubsub_subscribe] diff --git a/examples/site/tips_gcp_apis/tips_gcp_apis.cc b/examples/site/tips_gcp_apis/tips_gcp_apis.cc index 2fbfdebc..5ce1843c 100644 --- a/examples/site/tips_gcp_apis/tips_gcp_apis.cc +++ b/examples/site/tips_gcp_apis/tips_gcp_apis.cc @@ -14,8 +14,7 @@ // [START functions_pubsub_publish] // [START functions_tips_gcp_apis] -#include -#include +#include #include #include #include @@ -44,7 +43,7 @@ pubsub::Publisher GetPublisher(pubsub::Topic topic) { } } // namespace -gcf::HttpResponse tips_gcp_apis(gcf::HttpRequest request) { // NOLINT +gcf::HttpResponse tips_gcp_apis_impl(gcf::HttpRequest const& request) { auto const* project = std::getenv("GCP_PROJECT"); if (project == nullptr) throw std::runtime_error("GCP_PROJECT is not set"); @@ -65,5 +64,7 @@ gcf::HttpResponse tips_gcp_apis(gcf::HttpRequest request) { // NOLINT } return response; } + +gcf::Function tips_gcp_apis() { return gcf::MakeFunction(tips_gcp_apis_impl); } // [END functions_tips_gcp_apis] // [END functions_pubsub_publish] diff --git a/examples/site/tips_infinite_retries/tips_infinite_retries.cc b/examples/site/tips_infinite_retries/tips_infinite_retries.cc index d5f64acd..6cc6f296 100644 --- a/examples/site/tips_infinite_retries/tips_infinite_retries.cc +++ b/examples/site/tips_infinite_retries/tips_infinite_retries.cc @@ -13,7 +13,7 @@ // limitations under the License. // [START functions_tips_infinite_retries] -#include +#include #include #include @@ -23,17 +23,19 @@ namespace { auto constexpr kMaxAge = std::chrono::seconds(10); } // namespace -void tips_infinite_retries(gcf::CloudEvent event) { // NOLINT - using std::chrono::system_clock; - auto const age = - system_clock::now() - event.time().value_or(system_clock::time_point()); - auto const seconds = - std::chrono::duration_cast(age).count(); +gcf::Function tips_infinite_retries() { + return gcf::MakeFunction([](gcf::CloudEvent const& event) { + using std::chrono::system_clock; + auto const age = + system_clock::now() - event.time().value_or(system_clock::time_point()); + auto const seconds = + std::chrono::duration_cast(age).count(); - if (age >= kMaxAge) { - std::cout << "Dropped " << event.id() << " (age " << seconds << "s)\n"; - return; - } - std::cout << "Processed " << event.id() << " (age " << seconds << "s)\n"; + if (age >= kMaxAge) { + std::cout << "Dropped " << event.id() << " (age " << seconds << "s)\n"; + return; + } + std::cout << "Processed " << event.id() << " (age " << seconds << "s)\n"; + }); } // [END functions_tips_infinite_retries] diff --git a/examples/site/tips_lazy_globals/tips_lazy_globals.cc b/examples/site/tips_lazy_globals/tips_lazy_globals.cc index e6f0898d..76db078a 100644 --- a/examples/site/tips_lazy_globals/tips_lazy_globals.cc +++ b/examples/site/tips_lazy_globals/tips_lazy_globals.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_tips_lazy_globals] -#include -#include +#include #include #include @@ -27,8 +26,10 @@ std::string h; void h_init() { h = "heavy computation"; } } // namespace -gcf::HttpResponse tips_lazy_globals(gcf::HttpRequest /*request*/) { // NOLINT - std::call_once(h_init_flag, h_init); - return gcf::HttpResponse{}.set_payload("Global: " + h); +gcf::Function tips_lazy_globals() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + std::call_once(h_init_flag, h_init); + return gcf::HttpResponse{}.set_payload("Global: " + h); + }); } // [END functions_tips_lazy_globals] diff --git a/examples/site/tips_retry/tips_retry.cc b/examples/site/tips_retry/tips_retry.cc index a70e557e..3c71beae 100644 --- a/examples/site/tips_retry/tips_retry.cc +++ b/examples/site/tips_retry/tips_retry.cc @@ -13,20 +13,22 @@ // limitations under the License. // [START functions_tips_retry] -#include +#include #include #include namespace gcf = ::google::cloud::functions; -void tips_retry(gcf::CloudEvent event) { // NOLINT - if (event.data_content_type().value_or("") != "application/json") { - std::cerr << "Error: expected application/json data\n"; - return; - } - auto const payload = nlohmann::json::parse(event.data().value_or("{}")); - auto const retry = payload.value("retry", false); - if (retry) throw std::runtime_error("Throwing exception to force retry"); - // Normal processing goes here. +gcf::Function tips_retry() { + return gcf::MakeFunction([](gcf::CloudEvent const& event) { + if (event.data_content_type().value_or("") != "application/json") { + std::cerr << "Error: expected application/json data\n"; + return; + } + auto const payload = nlohmann::json::parse(event.data().value_or("{}")); + auto const retry = payload.value("retry", false); + if (retry) throw std::runtime_error("Throwing exception to force retry"); + // Normal processing goes here. + }); } // [END functions_tips_retry] diff --git a/examples/site/tips_scopes/tips_scopes.cc b/examples/site/tips_scopes/tips_scopes.cc index 4f5a1184..fcff43aa 100644 --- a/examples/site/tips_scopes/tips_scopes.cc +++ b/examples/site/tips_scopes/tips_scopes.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START functions_tips_scopes] -#include -#include +#include #include namespace gcf = ::google::cloud::functions; @@ -27,9 +26,11 @@ std::string light_computation(); std::string h = heavy_computation(); } // namespace -gcf::HttpResponse tips_scopes(gcf::HttpRequest /*request*/) { // NOLINT - auto l = light_computation(); - return gcf::HttpResponse{}.set_payload("Global: " + h + ", Local: " + l); +gcf::Function tips_scopes() { + return gcf::MakeFunction([](gcf::HttpRequest const& /*request*/) { + auto l = light_computation(); + return gcf::HttpResponse{}.set_payload("Global: " + h + ", Local: " + l); + }); } // [END functions_tips_scopes] diff --git a/examples/site_test.cc b/examples/site_test.cc index b37a6759..1d91e000 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -31,7 +31,7 @@ namespace gcf = ::google::cloud::functions; namespace gcf_internal = ::google::cloud::functions_internal; -extern gcf::HttpResponse bearer_token(gcf::HttpRequest request); +extern gcf::Function bearer_token(); extern gcf::Function concepts_after_response(); extern gcf::Function concepts_after_timeout(); extern gcf::Function concepts_filesystem(); @@ -50,13 +50,13 @@ extern gcf::Function http_form_data(); extern gcf::Function http_method(); extern gcf::Function http_xml(); extern gcf::Function log_helloworld(); -extern void log_stackdriver(gcf::CloudEvent event); -extern void pubsub_subscribe(gcf::CloudEvent event); -extern gcf::HttpResponse tips_gcp_apis(gcf::HttpRequest request); -extern void tips_infinite_retries(gcf::CloudEvent event); -extern gcf::HttpResponse tips_lazy_globals(gcf::HttpRequest request); -extern gcf::HttpResponse tips_scopes(gcf::HttpRequest request); -extern void tips_retry(gcf::CloudEvent event); +extern gcf::Function log_stackdriver(); +extern gcf::Function pubsub_subscribe(); +extern gcf::Function tips_gcp_apis(); +extern gcf::Function tips_infinite_retries(); +extern gcf::Function tips_lazy_globals(); +extern gcf::Function tips_scopes(); +extern gcf::Function tips_retry(); namespace { @@ -77,18 +77,51 @@ auto TriggerFunctionHttp(gcf::Function const& function, return handler(std::move(request)); } +auto TriggerFunctionCloudEvent(gcf::Function const& function, + gcf::CloudEvent const& e) { + auto payload = nlohmann::json{ + {"specversion", e.spec_version()}, + {"id", e.id()}, + {"source", e.source()}, + {"type", e.type()}, + }; + auto if_set = [&payload](std::string const& name, + std::optional const& v) { + if (v.has_value()) payload[name] = *v; + }; + if_set("datacontenttype", e.data_content_type()); + if_set("dataschema", e.data_schema()); + if_set("subject", e.subject()); + if (e.data_content_type().value_or("") == "application/json") { + payload["data"] = nlohmann::json::parse(e.data().value_or("{}")); + } else if (auto const& d = e.data(); d.has_value()) { + payload["data"] = *d; + } + + gcf_internal::BeastRequest request; + request.insert("content-type", "application/cloudevents+json"); + request.body() = payload.dump(); + + auto handler = + gcf_internal::FunctionImpl::GetImpl(function)->GetHandler("unused"); + return handler(std::move(request)); +} + TEST(ExamplesSiteTest, BearerToken) { google::cloud::functions_internal::SetEnv("TARGET_URL", std::nullopt); google::cloud::functions_internal::SetEnv("GOOGLE_APPLICATION_CREDENTIALS", "/dev/null"); - EXPECT_THROW(bearer_token(gcf::HttpRequest{}), std::exception); + auto function = bearer_token(); + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), + gcf::HttpResponse::kInternalServerError); google::cloud::functions_internal::SetEnv( "TARGET_URL", "https://storage.googleapis.com/storage/v1/" "b?project=invalid-project-name---"); - EXPECT_THROW(bearer_token(gcf::HttpRequest{}), std::exception); + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), + gcf::HttpResponse::kInternalServerError); // This is a syntactically valid JSON key file, but the key has been // invalidated and therefore presents no security risks. @@ -148,10 +181,14 @@ lUtj+/nH3HDQjM4ltYfTPUg= google::cloud::functions_internal::SetEnv("GOOGLE_APPLICATION_CREDENTIALS", filename.string()); - EXPECT_THROW(bearer_token(gcf::HttpRequest{}), std::exception); + // We get different errors in the CI builds vs. development workstations. + EXPECT_NE(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), + gcf::HttpResponse::kOkay); - EXPECT_NO_THROW( - bearer_token(gcf::HttpRequest{}.set_target("/no-auth-header"))); + EXPECT_EQ(TriggerFunctionHttp( + function, gcf::HttpRequest{}.set_target("/no-auth-header")) + .result_int(), + gcf::HttpResponse::kBadRequest); std::filesystem::remove(filename); } @@ -257,13 +294,14 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { for (auto const* data : {"dGVzdCBtZXNzYWdlIDM=", "YWJjZA==", ""}) { auto json = base; json["data"]["message"]["data"] = data; - auto response = - TriggerFunctionHttp(hello_world_pubsub(), - gcf::HttpRequest{} - .set_payload(json.dump()) - .add_header("ce-type", "com.example.someevent") - .add_header("ce-source", "/mycontext") - .add_header("ce-id", "A234-1234-1234")); + auto response = TriggerFunctionHttp( + hello_world_pubsub(), + gcf::HttpRequest{} + .set_payload(json.dump()) + .add_header("content-type", "application/cloudevents+json") + .add_header("ce-type", "com.example.someevent") + .add_header("ce-source", "/mycontext") + .add_header("ce-id", "A234-1234-1234")); EXPECT_EQ(response.result_int(), 200); } @@ -300,7 +338,7 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { for (auto const& [name, body] : cases) { SCOPED_TRACE("Testing for " + name); auto response = - TriggerFunctionHttp(hello_world_storage(), + TriggerFunctionHttp(hello_world_pubsub(), gcf::HttpRequest{} .set_payload(body) .add_header("ce-type", "com.example.someevent") @@ -364,18 +402,20 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { struct TestCase { std::string name; std::string body; + std::string content_type; } const cases[] = { - {"base", base.dump()}, - {"text", kBodyDataText}, - {"json", kBodyDataJson}, + {"base", base.dump(), "application/cloudevents+json"}, + {"text", kBodyDataText, "text/plain"}, + {"json", kBodyDataJson, "application/cloudevents+json"}, }; - for (auto const& [name, body] : cases) { + for (auto const& [name, body, content_type] : cases) { SCOPED_TRACE("Testing for " + name); auto response = TriggerFunctionHttp(hello_world_storage(), gcf::HttpRequest{} .set_payload(body) + .add_header("content-type", content_type) .add_header("ce-type", "com.example.someevent") .add_header("ce-source", "/mycontext") .add_header("ce-id", "A234-1234-1234")); @@ -413,7 +453,6 @@ TEST(ExamplesSiteTest, HttpCors) { auto function = http_cors(); auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("OPTIONS")); - std::cout << "DEBUG DEBUG " << actual << std::endl; EXPECT_EQ(actual.at("Access-Control-Allow-Methods"), "GET"); actual = TriggerFunctionHttp(function, gcf::HttpRequest{}.set_verb("GET")); @@ -572,13 +611,18 @@ TEST(ExamplesSiteTest, LogStackdriver) { }}, }; - EXPECT_NO_THROW(log_stackdriver( - google::cloud::functions_internal::ParseCloudEventJson(envelope.dump()))); + auto const event = + google::cloud::functions_internal::ParseCloudEventJson(envelope.dump()); + auto function = log_stackdriver(); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); // This is just to fix the code coverage nit. envelope.erase("datacontenttype"); - EXPECT_NO_THROW(log_stackdriver( - google::cloud::functions_internal::ParseCloudEventJson(envelope.dump()))); + auto const bad = + google::cloud::functions_internal::ParseCloudEventJson(envelope.dump()); + EXPECT_EQ(TriggerFunctionCloudEvent(function, bad).result_int(), + gcf::HttpResponse::kOkay); } TEST(ExamplesSiteTest, PubsubSubscribe) { @@ -604,19 +648,23 @@ TEST(ExamplesSiteTest, PubsubSubscribe) { })js"); // Test with different values for data.message.data + auto function = pubsub_subscribe(); for (auto const* data : {"dGVzdCBtZXNzYWdlIDM=", "YWJjZA==", ""}) { auto json = base; json["data"]["message"]["data"] = data; - EXPECT_NO_THROW(pubsub_subscribe( - google::cloud::functions_internal::ParseCloudEventJson(json.dump()))); + auto const event = + google::cloud::functions_internal::ParseCloudEventJson(json.dump()); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); } } TEST(ExamplesSiteTest, TipsLazyGlobals) { - auto actual = tips_lazy_globals(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("heavy computation")); - actual = tips_lazy_globals(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("heavy computation")); + auto function = tips_lazy_globals(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("heavy computation")); + actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("heavy computation")); } TEST(ExamplesSiteTest, TipsGcpApis) { @@ -627,37 +675,50 @@ TEST(ExamplesSiteTest, TipsGcpApis) { #endif // __has_feature(thread_sanitizer) #endif // defined(__has_feature) google::cloud::functions_internal::SetEnv("GCP_PROJECT", std::nullopt); - EXPECT_THROW(tips_gcp_apis(gcf::HttpRequest{}), std::runtime_error); + auto function = tips_gcp_apis(); + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), + gcf::HttpResponse::kInternalServerError); google::cloud::functions_internal::SetEnv("GCP_PROJECT", "test-unused"); - EXPECT_THROW(tips_gcp_apis(gcf::HttpRequest{}), std::exception); - EXPECT_THROW( - tips_gcp_apis(gcf::HttpRequest{}.set_payload(nlohmann::json({}).dump())), - std::runtime_error); + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}).result_int(), + gcf::HttpResponse::kInternalServerError); + EXPECT_EQ(TriggerFunctionHttp(function, gcf::HttpRequest{}.set_payload( + nlohmann::json({}).dump())) + .result_int(), + gcf::HttpResponse::kInternalServerError); } TEST(ExamplesSiteTest, TipsInfiniteRetries) { + auto function = tips_infinite_retries(); gcf::CloudEvent event("test-id", "test-source", "test-type"); - EXPECT_NO_THROW(tips_infinite_retries(event)); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); event.set_time(std::chrono::system_clock::now()); - EXPECT_NO_THROW(tips_infinite_retries(event)); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); } TEST(ExamplesSiteTest, TipsScopes) { - auto actual = tips_scopes(gcf::HttpRequest{}); - EXPECT_THAT(actual.payload(), HasSubstr("Global: ")); - EXPECT_THAT(actual.payload(), HasSubstr("Local: ")); + auto function = tips_scopes(); + auto actual = TriggerFunctionHttp(function, gcf::HttpRequest{}); + EXPECT_THAT(actual.body(), HasSubstr("Global: ")); + EXPECT_THAT(actual.body(), HasSubstr("Local: ")); } TEST(ExamplesSiteTest, TipsRetry) { + auto function = tips_retry(); gcf::CloudEvent event("test-id", "test-source", "test-type"); - EXPECT_NO_THROW(tips_retry(event)); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); event.set_data_content_type("application/json"); - EXPECT_NO_THROW(tips_retry(event)); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); event.set_data(nlohmann::json({{"retry", false}}).dump()); - EXPECT_NO_THROW(tips_retry(event)); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kOkay); event.set_data(nlohmann::json({{"retry", true}}).dump()); - EXPECT_THROW(tips_retry(event), std::exception); + EXPECT_EQ(TriggerFunctionCloudEvent(function, event).result_int(), + gcf::HttpResponse::kInternalServerError); } } // namespace From 4059977d2ab596c589c6b05dfe95a3a0da3448ef Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 15:27:43 -0400 Subject: [PATCH 43/77] doc: use modern CMake flags (#374) --- examples/howto_use_legacy_code/README.md | 4 ++-- examples/site/howto_local_development/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/howto_use_legacy_code/README.md b/examples/howto_use_legacy_code/README.md index 3e53580b..5b3e7e11 100644 --- a/examples/howto_use_legacy_code/README.md +++ b/examples/howto_use_legacy_code/README.md @@ -86,7 +86,7 @@ Run the CMake configure step. If needed, this will download and build any dependencies for your function: ```shell -cmake -H. -B.build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake +cmake -S . -B .build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake ``` You should see output like this: @@ -130,7 +130,7 @@ create a binary called `local_server` in the .build subdirectory. This will produce a standalone HTTP server, which you can run locally using: -```shell +```shell .build/main --port 8080 ``` diff --git a/examples/site/howto_local_development/README.md b/examples/site/howto_local_development/README.md index 2e8de3e3..2792bcaf 100644 --- a/examples/site/howto_local_development/README.md +++ b/examples/site/howto_local_development/README.md @@ -74,7 +74,7 @@ Run the CMake configure step. If needed, this will download and build any dependencies for your function: ```shell -cmake -H. -B.build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake +cmake -S . -B .build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake ``` You should see output like this: @@ -118,7 +118,7 @@ create a binary called `local_server` in the .build subdirectory. This will produce a standalone HTTP server, which you can run locally using: -```shell +```shell .build/local_server --port 8080 ``` From 359397c9e6e79d66a341c4d89b31a05742581b78 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 15:28:04 -0400 Subject: [PATCH 44/77] ci: simplify `git ls-files` (#373) * ci: simplify `git ls-files` * Ooops, missed -z --- .github/workflows/style.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index abc2cdfe..8d8488ef 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -43,8 +43,7 @@ jobs: -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - name: tidy run: > - git ls-files -z | - grep -zE '\.cc$' | + git ls-files -z -- '*.cc' | xargs --verbose -P 2 -n 1 -0 clang-tidy-14 -p="${{runner.temp}}/build" werror-build: @@ -103,7 +102,9 @@ jobs: steps: - uses: actions/checkout@v2 - name: clang-format - run: git ls-files -z | grep -zE '\.(cc|h)$' | xargs -P 2 -n 50 -0 clang-format-14 -i + run: > + git ls-files -z -- '*.h' '*.cc' | + xargs -P 2 -n 50 -0 clang-format-14 -i - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . @@ -116,7 +117,7 @@ jobs: run: pip install cmakelang==0.6.13 - name: cmake-format run: > - git ls-files -z | grep -zE '((^|/)CMakeLists\.txt|\.cmake)$' | + git ls-files -z -- '*.cmake' '**/CMakeLists.txt' ./CMakeLists.txt | xargs -P 2 -n 1 -0 /home/runner/.local/bin/cmake-format -i - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . From 386b2969b9af9327cec896bbe48b1ba64fd5091c Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 15:50:44 -0400 Subject: [PATCH 45/77] ci: more cleanup around ls-files (#376) --- .github/workflows/style.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 8d8488ef..28021eb9 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -117,7 +117,7 @@ jobs: run: pip install cmakelang==0.6.13 - name: cmake-format run: > - git ls-files -z -- '*.cmake' '**/CMakeLists.txt' ./CMakeLists.txt | + git ls-files -z -- '*.cmake' '**/CMakeLists.txt' CMakeLists.txt | xargs -P 2 -n 1 -0 /home/runner/.local/bin/cmake-format -i - name: check-diff run: git diff --ignore-submodules=all --color --exit-code . From 3378093a47373cdd0cb9f7296af3a1b6c18d430a Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 17:02:53 -0400 Subject: [PATCH 46/77] ci: always save vcpkg cache (#377) Save the vcpkg cache immediately after it is generated. This makes the next run faster if there is an error compiling our code or running one of our tests. --- .github/workflows/build.yaml | 26 ++++++++++++++++++++++++++ .github/workflows/coverage.yaml | 7 +++++++ .github/workflows/sanitize.yaml | 7 +++++++ .github/workflows/style.yaml | 14 ++++++++++++++ 4 files changed, 54 insertions(+) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index ba6a0401..df09849e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -42,6 +42,13 @@ jobs: cmake -S . -B "${{runner.temp}}/build" -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-build-ubuntu-focal-${{ hashFiles('vcpkg.json') }} - name: build run: cmake --build "${{runner.temp}}/build" - name: test @@ -82,6 +89,12 @@ jobs: run: > cmake -S examples/site/howto_local_development -B "${{runner.temp}}/howto_local_development/build" -GNinja -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + key: vcpkg-${{ env.vcpkg_SHA }}-${{ runner.os }}-${{ hashFiles('vcpkg.json') }} - name: build-local-development env: VCPKG_OVERLAY_PORTS: "${{runner.temp}}/quickstart/vcpkg-overlays" @@ -127,6 +140,12 @@ jobs: '-DBUILD_TESTING=ON' ` '-DFUNCTIONS_FRAMEWORK_CPP_TEST_EXAMPLES=OFF' ` '-DCMAKE_TOOLCHAIN_FILE=${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake' + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~\AppData\Local\vcpkg\archives + key: vcpkg-${{ env.vcpkg_SHA }}-build-msvc-2019-2-${{ hashFiles('vcpkg.json') }} - name: build run: cmake --build "${{runner.temp}}/build" - name: test @@ -167,6 +186,13 @@ jobs: cmake -S . -B "${{runner.temp}}/build" -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-build-macos-10-${{ hashFiles('vcpkg.json') }} - name: build run: cmake --build "${{runner.temp}}/build" - name: test diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index c59de191..a22257f2 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -43,6 +43,13 @@ jobs: -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-coverage-${{ hashFiles('vcpkg.json') }} - name: build run: cmake --build ${{runner.workspace}}/build - name: test diff --git a/.github/workflows/sanitize.yaml b/.github/workflows/sanitize.yaml index 740889ec..bed854c7 100644 --- a/.github/workflows/sanitize.yaml +++ b/.github/workflows/sanitize.yaml @@ -53,6 +53,13 @@ jobs: -DCMAKE_CXX_FLAGS="-fsanitize=${{matrix.sanitizer}} -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-sanitize-${{ matrix.sanitizer }}-${{ hashFiles('vcpkg.json') }} - name: -fsanitize=${{matrix.sanitizer}} / build run: cmake --build "${{runner.temp}}/build" - name: -fsanitize=${{matrix.sanitizer}} / test diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 28021eb9..8cbc9438 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -41,6 +41,13 @@ jobs: cmake -S . -B "${{runner.temp}}/build" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-style-clang-tidy-${{ hashFiles('vcpkg.json') }} - name: tidy run: > git ls-files -z -- '*.cc' | @@ -90,6 +97,13 @@ jobs: -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" + - uses: actions/cache/save@v3 + if: always() + with: + path: | + ~/.cache/vcpkg + ~/.cache/bin + key: vcpkg-${{ env.vcpkg_SHA }}-werror-${{ matrix.compiler.cxx }}-${{ hashFiles('vcpkg.json') }} - name: compiler=${{matrix.compiler.cxx}} / build run: cmake --build "${{runner.temp}}/build" - name: compiler=${{matrix.compiler.cxx}} / test From 3c6271cdd46a69883465efa2d0b5333d459fb4fd Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 17:50:43 -0400 Subject: [PATCH 47/77] ci: save trigger configuration (#378) --- ci/cloudbuild/triggers/pr.yaml | 12 ++++++++++++ ci/cloudbuild/triggers/push.yaml | 11 +++++++++++ 2 files changed, 23 insertions(+) create mode 100644 ci/cloudbuild/triggers/pr.yaml create mode 100644 ci/cloudbuild/triggers/push.yaml diff --git a/ci/cloudbuild/triggers/pr.yaml b/ci/cloudbuild/triggers/pr.yaml new file mode 100644 index 00000000..a11e45fc --- /dev/null +++ b/ci/cloudbuild/triggers/pr.yaml @@ -0,0 +1,12 @@ +createTime: '2021-01-12T17:18:16.451278761Z' +description: Pull Request to functions-framework-cpp +filename: ci/build-examples.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^main$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +id: 18ddf837-91e7-47c7-850e-d52d1e701d17 +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +name: pr diff --git a/ci/cloudbuild/triggers/push.yaml b/ci/cloudbuild/triggers/push.yaml new file mode 100644 index 00000000..2df019f6 --- /dev/null +++ b/ci/cloudbuild/triggers/push.yaml @@ -0,0 +1,11 @@ +createTime: '2021-01-12T17:19:25.822590886Z' +description: Push to branch +filename: ci/build-examples.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^main$ +id: c609a1b8-8acc-45ed-8aeb-c1ae7b070911 +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +name: push From 84de1d8350d336a85340e790c363ddfa5f8687c4 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 17:50:57 -0400 Subject: [PATCH 48/77] ci: post build logs to GitHub (#379) --- ci/cloudbuild/triggers/check-api-ci.yaml | 1 + ci/cloudbuild/triggers/check-api-pr.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/ci/cloudbuild/triggers/check-api-ci.yaml b/ci/cloudbuild/triggers/check-api-ci.yaml index bd990ed2..ef56772b 100644 --- a/ci/cloudbuild/triggers/check-api-ci.yaml +++ b/ci/cloudbuild/triggers/check-api-ci.yaml @@ -9,5 +9,6 @@ substitutions: _BUILD_NAME: check-api _DISTRO: fedora-34 _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS tags: - ci diff --git a/ci/cloudbuild/triggers/check-api-pr.yaml b/ci/cloudbuild/triggers/check-api-pr.yaml index f234fcee..1b337f98 100644 --- a/ci/cloudbuild/triggers/check-api-pr.yaml +++ b/ci/cloudbuild/triggers/check-api-pr.yaml @@ -10,5 +10,6 @@ substitutions: _BUILD_NAME: check-api _DISTRO: fedora-34 _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS tags: - pr From 476644e18c8fd50cde699a75cb45d34e539eae07 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 18:06:12 -0400 Subject: [PATCH 49/77] doc: examples use declarative configuration 6/N (#380) --- ci/build-examples.yaml | 2 -- .../tutorial_cloud_bigtable.cc | 14 +++++++++++--- .../tutorial_cloud_spanner.cc | 15 ++++++++++----- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 5715083f..02782f5d 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -361,7 +361,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tutorial_cloud_bigtable' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=tutorial_cloud_bigtable', '--path', 'examples/site/tutorial_cloud_bigtable', 'site-tutorial_cloud_bigtable', @@ -370,7 +369,6 @@ steps: waitFor: ['gcf-builder-ready'] id: 'site-tutorial_cloud_spanner' args: ['build', - '--env', 'GOOGLE_FUNCTION_SIGNATURE_TYPE=http', '--env', 'GOOGLE_FUNCTION_TARGET=tutorial_cloud_spanner', '--path', 'examples/site/tutorial_cloud_spanner', 'site-tutorial_cloud_spanner', diff --git a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc index 0bbdb6e6..2db99308 100644 --- a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc +++ b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc @@ -14,8 +14,7 @@ // [START bigtable_functions_quickstart] #include -#include -#include +#include #include #include #include @@ -25,6 +24,8 @@ namespace gcf = ::google::cloud::functions; namespace cbt = ::google::cloud::bigtable; +namespace { + cbt::Table get_table_client(std::string project_id, std::string instance_id, std::string const& table_id) { static std::mutex mu; @@ -42,7 +43,7 @@ cbt::Table get_table_client(std::string project_id, std::string instance_id, return *table; } -gcf::HttpResponse tutorial_cloud_bigtable(gcf::HttpRequest request) { // NOLINT +gcf::HttpResponse handle_request(gcf::HttpRequest const& request) { auto get_header = [h = request.headers()](std::string key) { std::transform(key.begin(), key.end(), key.begin(), [](auto x) { return static_cast(std::tolower(x)); }); @@ -77,4 +78,11 @@ gcf::HttpResponse tutorial_cloud_bigtable(gcf::HttpRequest request) { // NOLINT .set_header("content-type", "text/plain") .set_payload(std::move(os).str()); } + +} // namespace + +gcf::Function tutorial_cloud_bigtable() { + return gcf::MakeFunction(handle_request); +} + // [END bigtable_functions_quickstart] diff --git a/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc b/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc index 88140d81..3b5efb25 100644 --- a/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc +++ b/examples/site/tutorial_cloud_spanner/tutorial_cloud_spanner.cc @@ -13,8 +13,7 @@ // limitations under the License. // [START spanner_functions_quickstart] -#include -#include +#include #include #include #include @@ -25,6 +24,7 @@ namespace gcf = ::google::cloud::functions; namespace spanner = ::google::cloud::spanner; namespace { + auto get_spanner_database() { auto getenv = [](char const* var) { auto const* value = std::getenv(var); @@ -38,10 +38,8 @@ auto get_spanner_database() { getenv("SPANNER_INSTANCE"), getenv("SPANNER_DATABASE")); } -} // namespace -gcf::HttpResponse tutorial_cloud_spanner( - gcf::HttpRequest /*request*/) { // NOLINT +gcf::HttpResponse handle_request(gcf::HttpRequest const& /*request*/) { static auto const kClient = spanner::Client(spanner::MakeConnection(get_spanner_database())); @@ -62,4 +60,11 @@ gcf::HttpResponse tutorial_cloud_spanner( .set_header("content-type", "text/plain") .set_payload(std::move(os).str()); } + +} // namespace + +gcf::Function tutorial_cloud_spanner() { + return gcf::MakeFunction(handle_request); +} + // [END spanner_functions_quickstart] From 9e3cade6cba9c0bca56875139e0bf2dde86d088e Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Wed, 5 Jul 2023 19:55:02 -0400 Subject: [PATCH 50/77] docs: use working buildpacks (#381) The newest buildpacks don't compile the C++ examples. Probably an omission in the buildpack. Change the documents to use the correct version. --- examples/site/howto_create_container/README.md | 2 +- examples/site/howto_deploy_cloud_event/README.md | 2 +- examples/site/howto_deploy_to_cloud_run/README.md | 2 +- examples/site/testing_storage/README.md | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/site/howto_create_container/README.md b/examples/site/howto_create_container/README.md index c0e22ba0..34e8818f 100644 --- a/examples/site/howto_create_container/README.md +++ b/examples/site/howto_create_container/README.md @@ -87,7 +87,7 @@ containing your function: ```shell pack build \ - --builder gcr.io/buildpacks/builder:latest \ + --builder gcr.io/buildpacks/builder:v1 \ --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ gcf-cpp-hello-world-http diff --git a/examples/site/howto_deploy_cloud_event/README.md b/examples/site/howto_deploy_cloud_event/README.md index 4f234d49..80c1b6c2 100644 --- a/examples/site/howto_deploy_cloud_event/README.md +++ b/examples/site/howto_deploy_cloud_event/README.md @@ -90,7 +90,7 @@ containing your function: ```shell GOOGLE_CLOUD_PROJECT=... # put the right value here pack build \ - --builder gcr.io/buildpacks/builder:latest \ + --builder gcr.io/buildpacks/builder:v1 \ --env GOOGLE_FUNCTION_TARGET=hello_world_pubsub \ --path examples/site/hello_world_pubsub \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-pubsub" diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index e6e4bc44..ec58f57d 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -102,7 +102,7 @@ containing your function: ```shell GOOGLE_CLOUD_PROJECT=... # put the right value here pack build \ - --builder gcr.io/buildpacks/builder:latest \ + --builder gcr.io/buildpacks/builder:v1 \ --env GOOGLE_FUNCTION_TARGET=hello_world_http \ --path examples/site/hello_world_http \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-http" diff --git a/examples/site/testing_storage/README.md b/examples/site/testing_storage/README.md index edb0b78a..a0aff3a5 100644 --- a/examples/site/testing_storage/README.md +++ b/examples/site/testing_storage/README.md @@ -67,8 +67,7 @@ We will create a container for the storage "hello world" function as usual: ```shell pack build \ - --builder gcr.io/buildpacks/builder:latest \ - --env "GOOGLE_FUNCTION_SIGNATURE_TYPE=cloudevent" \ + --builder gcr.io/buildpacks/builder:v1 \ --env "GOOGLE_FUNCTION_TARGET=hello_world_storage" \ --path "examples/site/hello_world_storage" \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage" From a572d4dd2d38f97caf482cd04164d481c24a9c58 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 6 Jul 2023 18:17:47 -0400 Subject: [PATCH 51/77] ci: make `check-api` build functional (#383) The most important step in the build (running the build!) was not configured. I updated some tools and enabled GCS-based cache for vcpkg. --- ci/cloudbuild/build.sh | 1 + ci/cloudbuild/cloudbuild.yaml | 23 ++++++++----------- .../dockerfiles/fedora-34.Dockerfile | 11 +++++---- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/ci/cloudbuild/build.sh b/ci/cloudbuild/build.sh index a00172d5..78836b16 100755 --- a/ci/cloudbuild/build.sh +++ b/ci/cloudbuild/build.sh @@ -265,6 +265,7 @@ if [[ -n "${CLOUD_FLAG}" ]]; then "--region=us-east1" ) io::run gcloud builds submit "${args[@]}" . + exit fi # Default to --docker mode since no other mode was specified. diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index 201dddf2..d63250a1 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -62,19 +62,16 @@ steps: - name: 'gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID}' entrypoint: '/bin/true' - # Restores the homedir cache into /h in parallel with the previous step. - - name: 'gcr.io/cloud-builders/gsutil' - waitFor: [ '-' ] - allowFailure: true - entrypoint: 'bash' - dir: '/h' - args: - - '-c' - - > - /workspace/ci/cloudbuild/cache.sh restore - --bucket_url=gs://${_CACHE_BUCKET}/build-cache/functions-framework-cpp - --key=${_TRIGGER_SOURCE}/${_DISTRO}-${_BUILD_NAME}/h - --fallback_key=main/${_DISTRO}-${_BUILD_NAME}/h + # Runs the specified build in the image that was created in the first step. + - name: 'gcr.io/${PROJECT_ID}/${_IMAGE}:${BUILD_ID}' + entrypoint: 'ci/cloudbuild/build.sh' + args: [ '--local', '--build', '${_BUILD_NAME}' ] + env: [ + 'SCCACHE_GCS_BUCKET=${_CACHE_BUCKET}', + 'SCCACHE_GCS_KEY_PREFIX=sccache/${_DISTRO}-${_BUILD_NAME}', + 'SCCACHE_GCS_RW_MODE=READ_WRITE', + 'VCPKG_BINARY_SOURCES=x-gcs,gs://${_CACHE_BUCKET}/vcpkg-cache/${_DISTRO}-${_BUILD_NAME},readwrite' + ] # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' diff --git a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile index 2ad62897..4ef17d42 100644 --- a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile +++ b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile @@ -41,15 +41,16 @@ RUN curl -sSL https://github.com/universal-ctags/ctags/archive/refs/tags/p5.9.20 # https://github.com/lvc/abi-dumper/pull/29. We can switch back to `dnf install # abi-dumper` once it has the fix. WORKDIR /var/tmp/build -RUN curl -sSL https://github.com/lvc/abi-dumper/archive/814effec0f20a9613441dfa033aa0a0bc2a96a87.tar.gz | \ +RUN curl -sSL https://github.com/lvc/abi-dumper/archive/16bb467cd7d343dd3a16782b151b56cf15509594.tar.gz | \ tar -xzf - --strip-components=1 && \ mv abi-dumper.pl /usr/local/bin/abi-dumper && \ chmod +x /usr/local/bin/abi-dumper WORKDIR /var/tmp/gcloud -ARG GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION="348.0.0" -ARG GOOGLE_CLOUD_CPP_SDK_SHA256="8341a9b21088fd382522be247c7e51c61d8ea4ff86e6ededfa601afd5223e153" -ENV TARBALL="google-cloud-sdk-${GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" -RUN curl -sSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${TARBALL}" -o "${TARBALL}" +ARG GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION="428.0.0" +ARG GOOGLE_CLOUD_CPP_SDK_SHA256="a665909d2ff9cd3a927d84670c5a8d11f0c5fbcda2540bbea44e0d6f77b82e27" +ENV TARBALL="google-cloud-cli-${GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" +RUN curl -fsSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${TARBALL}" -o "${TARBALL}" RUN echo "${GOOGLE_CLOUD_CPP_SDK_SHA256} ${TARBALL}" | sha256sum --check - RUN tar x -C /usr/local -f "${TARBALL}" +ENV PATH=${PATH}:/usr/local/google-cloud-sdk/bin From d31c3e1e435306729935311b1190156431fdff12 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Fri, 7 Jul 2023 09:13:38 -0400 Subject: [PATCH 52/77] chore: prepare for v1.2.0 release (#384) --- CHANGELOG.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 146aa912..3a200de7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog -## v1.2.0 - TBD +## v1.2.0 - 2023-07 + +* docs: use working buildpacks (#381) +* doc: examples use declarative configuration (#380) (#371) (#370) (#369) (#368) + (#356) +* doc: use modern CMake flags (#374) ## v1.1.0 - 2022-03 From 0ef66d561a6336ce2dac81ad508ed1daa6cce6f3 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Fri, 7 Jul 2023 11:41:09 -0400 Subject: [PATCH 53/77] chore: bump version numbers post v1.2.0 (#385) --- CHANGELOG.md | 2 ++ CMakeLists.txt | 2 +- ...nctions_framework_cpp.expected.abi.dump.gz | Bin 97283 -> 106320 bytes .../cloud/functions/internal/version_info.h | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a200de7..a4f458ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ # Changelog +## v1.3.0 - TBD + ## v1.2.0 - 2023-07 * docs: use working buildpacks (#381) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c442d1a..cc123fee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,7 +34,7 @@ set(PACKAGE_BUGREPORT "http://github.com/GoogleCloudPlatform/functions-framework-cpp") project( functions-framework-cpp - VERSION 1.2.0 + VERSION 1.3.0 DESCRIPTION "Functions Framework for C++" LANGUAGES CXX) diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz index e66b40e3af0d75e4775568a20921b94bd7b1ca37..1f33e3bc226a421a35a1d5171e40b0b3e9dd67e0 100644 GIT binary patch literal 106320 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 *zu}n#nRoKACUt}$S-A*ql=1niWMDZ<+ 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

bysW|)B@W6&Rb79F+j3; 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 BO3wfQ literal 97283 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

bysW|)B@W6&Rb79F+j3; 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 BO3wfQ diff --git a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile index 4ef17d42..faaeb6ff 100644 --- a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile +++ b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile @@ -26,6 +26,9 @@ RUN dnf makecache && \ openssl-devel patch python python3.8 \ python-pip tar unzip w3m wget which zip zlib-devel +# This is needed to compile OpenSSL with vcpkg +RUN dnf makecache && dnf install -y perl-IPC-Cmd + # Installs Universal Ctags (which is different than the default "Exuberant # Ctags"), which is needed by the ABI checker. See https://ctags.io/ WORKDIR /var/tmp/build diff --git a/ci/etc/vcpkg-config.sh b/ci/etc/vcpkg-config.sh index 3045c56d..3871651a 100644 --- a/ci/etc/vcpkg-config.sh +++ b/ci/etc/vcpkg-config.sh @@ -23,4 +23,4 @@ fi # include guard # # Common configuration parameters. # -export VCPKG_RELEASE_VERSION="7e7bcf89171b7ed84ece845b1fa596a018e462f2" +export VCPKG_RELEASE_VERSION="2023.06.20" diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index 61cb5103..dce67dde 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -31,7 +31,7 @@ fi if [[ ! -d "${VCPKG_ROOT}" ]]; then echo "-----> Install vcpkg" mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ + curl -sSL https://github.com/Microsoft/vcpkg/archive/2023.06.20.tar.gz | \ tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ set(VCPKG_BUILD_TYPE release) diff --git a/examples/site/testing_pubsub/pubsub_system_test.cc b/examples/site/testing_pubsub/pubsub_system_test.cc index f010d725..d0f6365a 100644 --- a/examples/site/testing_pubsub/pubsub_system_test.cc +++ b/examples/site/testing_pubsub/pubsub_system_test.cc @@ -71,8 +71,7 @@ TEST_F(PubsubSystemTest, Basic) { {"World", "Hello World"}, }; - auto publisher = - pubsub::Publisher(pubsub::MakePublisherConnection(topic(), {})); + auto publisher = pubsub::Publisher(pubsub::MakePublisherConnection(topic())); for (auto const& test : cases) { SCOPED_TRACE("Testing for " + test.expected); diff --git a/examples/site/tips_gcp_apis/tips_gcp_apis.cc b/examples/site/tips_gcp_apis/tips_gcp_apis.cc index 5ce1843c..dc5b9fa8 100644 --- a/examples/site/tips_gcp_apis/tips_gcp_apis.cc +++ b/examples/site/tips_gcp_apis/tips_gcp_apis.cc @@ -37,7 +37,7 @@ pubsub::Publisher GetPublisher(pubsub::Topic topic) { auto [pos, inserted] = connections.emplace( topic.FullName(), std::shared_ptr()); if (inserted) { - pos->second = pubsub::MakePublisherConnection(std::move(topic), {}); + pos->second = pubsub::MakePublisherConnection(std::move(topic)); } return pubsub::Publisher(pos->second); } diff --git a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc index 2db99308..8503dfb7 100644 --- a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc +++ b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc @@ -35,10 +35,9 @@ cbt::Table get_table_client(std::string project_id, std::string instance_id, table->instance_id() != instance_id || table->project_id() != project_id) { table = std::make_unique( - cbt::CreateDefaultDataClient(std::move(project_id), - std::move(instance_id), - cbt::ClientOptions{}), - table_id); + cbt::MakeDataConnection(), + cbt::TableResource(std::move(project_id), std::move(instance_id), + table_id)); } return *table; } diff --git a/google/cloud/functions/CMakeLists.txt b/google/cloud/functions/CMakeLists.txt index 2b9506b4..631799f4 100644 --- a/google/cloud/functions/CMakeLists.txt +++ b/google/cloud/functions/CMakeLists.txt @@ -81,8 +81,10 @@ target_include_directories(functions_framework_cpp SYSTEM target_link_libraries( functions_framework_cpp PUBLIC absl::time Boost::headers Boost::program_options Threads::Threads) -target_compile_definitions(functions_framework_cpp - PUBLIC BOOST_BEAST_USE_STD_STRING_VIEW) +if ("${Boost_VERSION_STRING}" VERSION_LESS "1.81") + target_compile_definitions(functions_framework_cpp + PUBLIC BOOST_BEAST_USE_STD_STRING_VIEW) +endif () set_target_properties( functions_framework_cpp PROPERTIES EXPORT_NAME functions-framework-cpp::framework From 951c0fb5da38688d5d3f51022056c87c668e3aa4 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Fri, 7 Jul 2023 18:59:33 -0400 Subject: [PATCH 56/77] ci: update `check-api` build to Fedora 38 (#388) --- .../dockerfiles/fedora-38.Dockerfile | 59 +++++++++++++++++++ ci/cloudbuild/triggers/check-api-ci.yaml | 2 +- ci/cloudbuild/triggers/check-api-pr.yaml | 2 +- .../cloud/functions/internal/parse_options.cc | 1 + 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 ci/cloudbuild/dockerfiles/fedora-38.Dockerfile diff --git a/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile new file mode 100644 index 00000000..12aefcc9 --- /dev/null +++ b/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile @@ -0,0 +1,59 @@ +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM fedora:38 +ARG NCPU=4 + +# Installs the development tools needed by functions-framework-cpp and its +# dependencies. +RUN dnf makecache && \ + dnf install -y abi-compliance-checker autoconf automake \ + ccache clang clang-analyzer clang-tools-extra \ + cmake diffutils doxygen findutils gcc-c++ git \ + lcov libcxx-devel libcxxabi-devel \ + libasan libubsan libtsan libcurl-devel make ninja-build \ + openssl-devel patch python python3.8 \ + python-pip tar unzip w3m wget which zip zlib-devel + +# This is needed to compile OpenSSL with vcpkg +RUN dnf makecache && dnf install -y perl-IPC-Cmd + +# Installs Universal Ctags (which is different than the default "Exuberant +# Ctags"), which is needed by the ABI checker. See https://ctags.io/ +WORKDIR /var/tmp/build +RUN curl -sSL https://github.com/universal-ctags/ctags/archive/refs/tags/p5.9.20210418.0.tar.gz | \ + tar -xzf - --strip-components=1 && \ + ./autogen.sh && \ + ./configure --prefix=/usr/local && \ + make && \ + make install && \ + cd /var/tmp && rm -fr build + +# Installs the abi-dumper with the integer overflow fix from +# https://github.com/lvc/abi-dumper/pull/29. We can switch back to `dnf install +# abi-dumper` once it has the fix. +WORKDIR /var/tmp/build +RUN curl -sSL https://github.com/lvc/abi-dumper/archive/16bb467cd7d343dd3a16782b151b56cf15509594.tar.gz | \ + tar -xzf - --strip-components=1 && \ + mv abi-dumper.pl /usr/local/bin/abi-dumper && \ + chmod +x /usr/local/bin/abi-dumper + +WORKDIR /var/tmp/gcloud +ARG GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION="428.0.0" +ARG GOOGLE_CLOUD_CPP_SDK_SHA256="a665909d2ff9cd3a927d84670c5a8d11f0c5fbcda2540bbea44e0d6f77b82e27" +ENV TARBALL="google-cloud-cli-${GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" +RUN curl -fsSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${TARBALL}" -o "${TARBALL}" +RUN echo "${GOOGLE_CLOUD_CPP_SDK_SHA256} ${TARBALL}" | sha256sum --check - +RUN tar x -C /usr/local -f "${TARBALL}" +ENV PATH=${PATH}:/usr/local/google-cloud-sdk/bin diff --git a/ci/cloudbuild/triggers/check-api-ci.yaml b/ci/cloudbuild/triggers/check-api-ci.yaml index ef56772b..18093ede 100644 --- a/ci/cloudbuild/triggers/check-api-ci.yaml +++ b/ci/cloudbuild/triggers/check-api-ci.yaml @@ -7,7 +7,7 @@ github: name: check-api-ci substitutions: _BUILD_NAME: check-api - _DISTRO: fedora-34 + _DISTRO: fedora-38 _TRIGGER_TYPE: ci includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS tags: diff --git a/ci/cloudbuild/triggers/check-api-pr.yaml b/ci/cloudbuild/triggers/check-api-pr.yaml index 1b337f98..d9f38968 100644 --- a/ci/cloudbuild/triggers/check-api-pr.yaml +++ b/ci/cloudbuild/triggers/check-api-pr.yaml @@ -8,7 +8,7 @@ github: name: check-api-pr substitutions: _BUILD_NAME: check-api - _DISTRO: fedora-34 + _DISTRO: fedora-38 _TRIGGER_TYPE: pr includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS tags: diff --git a/google/cloud/functions/internal/parse_options.cc b/google/cloud/functions/internal/parse_options.cc index ba3a2b5c..b466ffa2 100644 --- a/google/cloud/functions/internal/parse_options.cc +++ b/google/cloud/functions/internal/parse_options.cc @@ -14,6 +14,7 @@ #include "google/cloud/functions/internal/parse_options.h" #include +#include #include #include #include From a47af20dc454f627897f0252265356e1da05aa95 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sat, 8 Jul 2023 10:06:35 -0400 Subject: [PATCH 57/77] ci: move sanitizer builds to GCB (#389) The builds on GHA are too slow when the cache is cold. And it is too difficult to run the builds locally. --- .github/workflows/sanitize.yaml | 72 ------------------- ci/cloudbuild/builds/check-api.sh | 15 ++-- ci/cloudbuild/builds/lib/cmake.sh | 50 +++++++++++++ ci/cloudbuild/builds/lib/vcpkg.sh | 15 ++++ ci/cloudbuild/builds/sanitize-address.sh | 36 ++++++++++ ci/cloudbuild/builds/sanitize-thread.sh | 36 ++++++++++ ci/cloudbuild/builds/sanitize-undefined.sh | 36 ++++++++++ .../dockerfiles/fedora-38.Dockerfile | 4 +- .../triggers/sanitize-address-ci.yaml | 14 ++++ .../triggers/sanitize-address-pr.yaml | 15 ++++ .../triggers/sanitize-thread-ci.yaml | 14 ++++ .../triggers/sanitize-thread-pr.yaml | 15 ++++ .../triggers/sanitize-undefined-ci.yaml | 14 ++++ .../triggers/sanitize-undefined-pr.yaml | 15 ++++ 14 files changed, 269 insertions(+), 82 deletions(-) delete mode 100644 .github/workflows/sanitize.yaml create mode 100755 ci/cloudbuild/builds/lib/cmake.sh create mode 100755 ci/cloudbuild/builds/sanitize-address.sh create mode 100755 ci/cloudbuild/builds/sanitize-thread.sh create mode 100755 ci/cloudbuild/builds/sanitize-undefined.sh create mode 100644 ci/cloudbuild/triggers/sanitize-address-ci.yaml create mode 100644 ci/cloudbuild/triggers/sanitize-address-pr.yaml create mode 100644 ci/cloudbuild/triggers/sanitize-thread-ci.yaml create mode 100644 ci/cloudbuild/triggers/sanitize-thread-pr.yaml create mode 100644 ci/cloudbuild/triggers/sanitize-undefined-ci.yaml create mode 100644 ci/cloudbuild/triggers/sanitize-undefined-pr.yaml diff --git a/.github/workflows/sanitize.yaml b/.github/workflows/sanitize.yaml deleted file mode 100644 index f4661ba8..00000000 --- a/.github/workflows/sanitize.yaml +++ /dev/null @@ -1,72 +0,0 @@ -name: sanitize - -on: - push: - branches: [ main ] - pull_request: - -env: - vcpkg_SHA: "2023.06.20" - -jobs: - sanitized-build: - # Using a blank name produces better output on - # the web UI (e.g. "sanitize / (address)") than - # any other alternative we tried. - name: " " - runs-on: ubuntu-22.04 - strategy: - matrix: - sanitizer: ["address", "undefined", "thread"] - steps: - - name: install ninja - run: sudo apt install ninja-build - - uses: actions/checkout@v2 - - name: clone-vcpkg - working-directory: "${{runner.temp}}" - run: > - mkdir -p vcpkg && - curl -sSL "https://github.com/microsoft/vcpkg/archive/${{env.vcpkg_SHA}}.tar.gz" | - tar -C vcpkg --strip-components=1 -zxf - - - name: cache-vcpkg - id: cache-vcpkg - uses: actions/cache@v2 - with: - # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: | - vcpkg-${{ env.vcpkg_SHA }}-sanitize-${{ matrix.sanitizer }}-${{ hashFiles('vcpkg.json') }} - restore-keys: | - vcpkg-${{ env.vcpkg_SHA }}-sanitize-${{ matrix.sanitizer }}- - - name: boostrap-vcpkg - run: ci/restore-vcpkg-from-cache.sh "${{runner.temp}}/vcpkg" - - name: -fsanitize=${{matrix.sanitizer}} / configure - # See https://github.com/grpc/grpc/pull/22325 for an explanation around the - # -DGRPC_* flags. - run: > - cmake -S . -B "${{runner.temp}}/build" -GNinja - -DCMAKE_CXX_COMPILER=clang++-14 - -DCMAKE_C_COMPILER=clang-14 - -DCMAKE_BUILD_TYPE=Debug - -DCMAKE_CXX_FLAGS="-fsanitize=${{matrix.sanitizer}} -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 - if: always() - with: - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: vcpkg-${{ env.vcpkg_SHA }}-sanitize-${{ matrix.sanitizer }}-${{ hashFiles('vcpkg.json') }} - - name: -fsanitize=${{matrix.sanitizer}} / build - run: cmake --build "${{runner.temp}}/build" - - name: -fsanitize=${{matrix.sanitizer}} / test - working-directory: "${{runner.temp}}/build" - env: - ASAN_OPTIONS: detect_leaks=1:color=always - LSAN_OPTIONS: report_objects=1 - TSAN_OPTIONS: halt_on_error=1:second_deadlock_stack=1 - UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1 - run: ctest --output-on-failure --timeout=60s diff --git a/ci/cloudbuild/builds/check-api.sh b/ci/cloudbuild/builds/check-api.sh index ac0a0dde..8f1e6cb9 100755 --- a/ci/cloudbuild/builds/check-api.sh +++ b/ci/cloudbuild/builds/check-api.sh @@ -21,26 +21,25 @@ export CXX=g++ source "$(dirname "$0")/../../lib/init.sh" source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/cmake.sh source module ci/cloudbuild/builds/lib/vcpkg.sh INSTALL_PREFIX=/var/tmp/functions-framework-cpp -vcpkg_root="$(vcpkg::root_dir)" # abi-dumper wants us to use -Og, but that causes bogus warnings about # uninitialized values with GCC, so we disable that warning with # -Wno-maybe-uninitialized. See also: # https://github.com/googleapis/google-cloud-cpp/issues/6313 io::log_h2 "Configuring, building, and installing the C++ Functions Framework" -cmake -GNinja \ +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ -DCMAKE_INSTALL_PREFIX="${INSTALL_PREFIX}" \ -DCMAKE_INSTALL_MESSAGE=NEVER \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_BUILD_TYPE=Debug \ - -DCMAKE_CXX_FLAGS="-Og -Wno-maybe-uninitialized" \ - -DCMAKE_TOOLCHAIN_FILE="${vcpkg_root}/scripts/buildsystems/vcpkg.cmake" \ - -DVCPKG_FEATURE_FLAGS="versions,manifest" \ - -S . -B cmake-out -cmake --build cmake-out -cmake --install cmake-out + -DCMAKE_CXX_FLAGS="-Og -Wno-maybe-uninitialized" +io::run cmake --build cmake-out +io::run cmake --install cmake-out # Uses `abi-dumper` to dump the ABI for the given library, which should be # installed at the given prefix. This function will be called from a subshell, diff --git a/ci/cloudbuild/builds/lib/cmake.sh b/ci/cloudbuild/builds/lib/cmake.sh new file mode 100755 index 00000000..e7a5f8cb --- /dev/null +++ b/ci/cloudbuild/builds/lib/cmake.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Make our include guard clean against set -o nounset. +test -n "${CI_CLOUDBUILD_BUILDS_LIB_CMAKE_SH__:-}" || declare -i CI_CLOUDBUILD_BUILDS_LIB_CMAKE_SH__=0 +if ((CI_CLOUDBUILD_BUILDS_LIB_CMAKE_SH__++ != 0)); then + return 0 +fi # include guard + +function cmake::common_args() { + local binary="cmake-out" + if [[ $# -ge 1 ]]; then + binary="$1" + fi + local args + args=( + -G Ninja + -S . + -B "${binary}" + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + ) + printf "%s\n" "${args[@]}" +} + +function ctest::common_args() { + local binary="cmake-out" + if [[ $# -ge 1 ]]; then + binary="$1" + fi + local args + args=( + --test-dir "${binary}" + --output-on-failure + --timeout 60s + ) + printf "%s\n" "${args[@]}" +} diff --git a/ci/cloudbuild/builds/lib/vcpkg.sh b/ci/cloudbuild/builds/lib/vcpkg.sh index 0fa8d8a3..d7f4bc40 100644 --- a/ci/cloudbuild/builds/lib/vcpkg.sh +++ b/ci/cloudbuild/builds/lib/vcpkg.sh @@ -43,3 +43,18 @@ time { function vcpkg::root_dir() { echo "${VCPKG_ROOT_DIR}" } + +# Output common CMake configuration arguments +function vcpkg::cmake_args() { + local binary="cmake-out" + if [[ $# -ge 1 ]]; then + binary="$1" + fi + local args + args=( + -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT_DIR}/scripts/buildsystems/vcpkg.cmake" + -DVCPKG_FEATURE_FLAGS="versions,manifest" + ) + printf "%s\n" "${args[@]}" +} diff --git a/ci/cloudbuild/builds/sanitize-address.sh b/ci/cloudbuild/builds/sanitize-address.sh new file mode 100755 index 00000000..69b60cab --- /dev/null +++ b/ci/cloudbuild/builds/sanitize-address.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +export CC=clang +export CXX=clang++ + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with Address Sanitizer" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_FLAGS="-fsanitize=address -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" +io::run cmake --build cmake-out + +mapfile -t ctest_args < <(ctest::common_args) +io::run env ASAN_OPTIONS=detect_leaks=1:color=always ctest "${ctest_args[@]}" diff --git a/ci/cloudbuild/builds/sanitize-thread.sh b/ci/cloudbuild/builds/sanitize-thread.sh new file mode 100755 index 00000000..d438389b --- /dev/null +++ b/ci/cloudbuild/builds/sanitize-thread.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +export CC=clang +export CXX=clang++ + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with Thread Sanitizer" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_FLAGS="-fsanitize=thread -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" +io::run cmake --build cmake-out + +mapfile -t ctest_args < <(ctest::common_args) +io::run env TSAN_OPTIONS=halt_on_error=1:second_deadlock_stack=1 ctest "${ctest_args[@]}" diff --git a/ci/cloudbuild/builds/sanitize-undefined.sh b/ci/cloudbuild/builds/sanitize-undefined.sh new file mode 100755 index 00000000..6135325c --- /dev/null +++ b/ci/cloudbuild/builds/sanitize-undefined.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +export CC=clang +export CXX=clang++ + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with Undefined Behavior Sanitizer" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_FLAGS="-fsanitize=undefined -DGRPC_TSAN_SUPPRESSED -DGRPC_ASAN_SUPPRESSED" +io::run cmake --build cmake-out + +mapfile -t ctest_args < <(ctest::common_args) +io::run env UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 ctest "${ctest_args[@]}" diff --git a/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile index 12aefcc9..07f9d300 100644 --- a/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile +++ b/ci/cloudbuild/dockerfiles/fedora-38.Dockerfile @@ -22,8 +22,8 @@ RUN dnf makecache && \ ccache clang clang-analyzer clang-tools-extra \ cmake diffutils doxygen findutils gcc-c++ git \ lcov libcxx-devel libcxxabi-devel \ - libasan libubsan libtsan libcurl-devel make ninja-build \ - openssl-devel patch python python3.8 \ + libasan libubsan libtsan llvm libcurl-devel make ninja-build \ + openssl-devel patch python python3 \ python-pip tar unzip w3m wget which zip zlib-devel # This is needed to compile OpenSSL with vcpkg diff --git a/ci/cloudbuild/triggers/sanitize-address-ci.yaml b/ci/cloudbuild/triggers/sanitize-address-ci.yaml new file mode 100644 index 00000000..96b6ae38 --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-address-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: sanitize-address-ci +substitutions: + _BUILD_NAME: sanitize-address + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/sanitize-address-pr.yaml b/ci/cloudbuild/triggers/sanitize-address-pr.yaml new file mode 100644 index 00000000..a910f505 --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-address-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: sanitize-address-pr +substitutions: + _BUILD_NAME: sanitize-address + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr diff --git a/ci/cloudbuild/triggers/sanitize-thread-ci.yaml b/ci/cloudbuild/triggers/sanitize-thread-ci.yaml new file mode 100644 index 00000000..358bcab8 --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-thread-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: sanitize-thread-ci +substitutions: + _BUILD_NAME: sanitize-thread + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/sanitize-thread-pr.yaml b/ci/cloudbuild/triggers/sanitize-thread-pr.yaml new file mode 100644 index 00000000..bdb4efe9 --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-thread-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: sanitize-thread-pr +substitutions: + _BUILD_NAME: sanitize-thread + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr diff --git a/ci/cloudbuild/triggers/sanitize-undefined-ci.yaml b/ci/cloudbuild/triggers/sanitize-undefined-ci.yaml new file mode 100644 index 00000000..76b943cf --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-undefined-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: sanitize-undefined-ci +substitutions: + _BUILD_NAME: sanitize-undefined + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/sanitize-undefined-pr.yaml b/ci/cloudbuild/triggers/sanitize-undefined-pr.yaml new file mode 100644 index 00000000..6141eb18 --- /dev/null +++ b/ci/cloudbuild/triggers/sanitize-undefined-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: sanitize-undefined-pr +substitutions: + _BUILD_NAME: sanitize-undefined + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr From 7b043f91cc66da779b0a237b5cfcb343f3c28d51 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sun, 9 Jul 2023 10:27:42 -0400 Subject: [PATCH 58/77] ci: remove unused Dockerfile (#390) * ci: remove unused Dockerfile * Remove references to fedora-34 --- ci/cloudbuild/cloudbuild.yaml | 4 +- .../dockerfiles/fedora-34.Dockerfile | 59 ------------------- 2 files changed, 2 insertions(+), 61 deletions(-) delete mode 100644 ci/cloudbuild/dockerfiles/fedora-34.Dockerfile diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index d63250a1..9e09bfeb 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -36,8 +36,8 @@ options: # Variables that can be overridden from the `gcloud builds ...` command using # the `--substitutions=_FOO=bar` flag. substitutions: - _DISTRO: 'fedora-34' - _BUILD_NAME: 'check-api' + _DISTRO: 'unknown' + _BUILD_NAME: 'unknown' _CACHE_BUCKET: '${PROJECT_ID}_cloudbuild' _IMAGE: 'functions-framework-cpp/${_DISTRO}' _TRIGGER_SOURCE: '${_PR_NUMBER:-main}' diff --git a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile b/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile deleted file mode 100644 index faaeb6ff..00000000 --- a/ci/cloudbuild/dockerfiles/fedora-34.Dockerfile +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM fedora:34 -ARG NCPU=4 - -# Installs the development tools needed by functions-framework-cpp and its -# dependencies. -RUN dnf makecache && \ - dnf install -y abi-compliance-checker autoconf automake \ - ccache clang clang-analyzer clang-tools-extra \ - cmake diffutils doxygen findutils gcc-c++ git \ - lcov libcxx-devel libcxxabi-devel \ - libasan libubsan libtsan libcurl-devel make ninja-build \ - openssl-devel patch python python3.8 \ - python-pip tar unzip w3m wget which zip zlib-devel - -# This is needed to compile OpenSSL with vcpkg -RUN dnf makecache && dnf install -y perl-IPC-Cmd - -# Installs Universal Ctags (which is different than the default "Exuberant -# Ctags"), which is needed by the ABI checker. See https://ctags.io/ -WORKDIR /var/tmp/build -RUN curl -sSL https://github.com/universal-ctags/ctags/archive/refs/tags/p5.9.20210418.0.tar.gz | \ - tar -xzf - --strip-components=1 && \ - ./autogen.sh && \ - ./configure --prefix=/usr/local && \ - make && \ - make install && \ - cd /var/tmp && rm -fr build - -# Installs the abi-dumper with the integer overflow fix from -# https://github.com/lvc/abi-dumper/pull/29. We can switch back to `dnf install -# abi-dumper` once it has the fix. -WORKDIR /var/tmp/build -RUN curl -sSL https://github.com/lvc/abi-dumper/archive/16bb467cd7d343dd3a16782b151b56cf15509594.tar.gz | \ - tar -xzf - --strip-components=1 && \ - mv abi-dumper.pl /usr/local/bin/abi-dumper && \ - chmod +x /usr/local/bin/abi-dumper - -WORKDIR /var/tmp/gcloud -ARG GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION="428.0.0" -ARG GOOGLE_CLOUD_CPP_SDK_SHA256="a665909d2ff9cd3a927d84670c5a8d11f0c5fbcda2540bbea44e0d6f77b82e27" -ENV TARBALL="google-cloud-cli-${GOOGLE_CLOUD_CPP_CLOUD_SDK_VERSION}-linux-x86_64.tar.gz" -RUN curl -fsSL "https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/${TARBALL}" -o "${TARBALL}" -RUN echo "${GOOGLE_CLOUD_CPP_SDK_SHA256} ${TARBALL}" | sha256sum --check - -RUN tar x -C /usr/local -f "${TARBALL}" -ENV PATH=${PATH}:/usr/local/google-cloud-sdk/bin From 917a9cbc60cb88d10e4f2e8b7fa428d0db57d72d Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sun, 9 Jul 2023 14:13:24 -0400 Subject: [PATCH 59/77] ci: move clang-tidy build to GCB (#392) --- .github/workflows/style.yaml | 44 ------------------- ci/cloudbuild/builds/clang-tidy.sh | 31 +++++++++++++ ci/cloudbuild/builds/lib/vcpkg.sh | 3 +- ci/cloudbuild/triggers/clang-tidy-ci.yaml | 14 ++++++ ci/cloudbuild/triggers/clang-tidy-pr.yaml | 15 +++++++ .../site/http_form_data/http_form_data.cc | 4 +- .../testing_pubsub/pubsub_integration_test.cc | 4 +- .../site/testing_pubsub/pubsub_system_test.cc | 4 +- .../site/testing_pubsub/pubsub_unit_test.cc | 4 +- .../storage_integration_test.cc | 4 +- .../site/testing_storage/storage_unit_test.cc | 4 +- examples/site/tips_gcp_apis/tips_gcp_apis.cc | 2 +- .../tutorial_cloud_bigtable.cc | 2 +- examples/site_test.cc | 4 +- google/cloud/functions/cloud_event_test.cc | 24 ++++------ .../cloud_event_conformance.cc | 2 +- .../internal/parse_cloud_event_legacy.cc | 2 +- .../internal/parse_cloud_event_legacy_test.cc | 4 +- .../internal/parse_cloud_event_storage.cc | 2 +- .../parse_cloud_event_storage_test.cc | 12 ++--- .../functions/internal/parse_options_test.cc | 8 ++-- .../cloud/functions/internal/version_info.h | 8 ++-- .../functions/internal/version_info.h.in | 8 ++-- 23 files changed, 111 insertions(+), 98 deletions(-) create mode 100755 ci/cloudbuild/builds/clang-tidy.sh create mode 100644 ci/cloudbuild/triggers/clang-tidy-ci.yaml create mode 100644 ci/cloudbuild/triggers/clang-tidy-pr.yaml diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 5a64ad8a..5c28bb9d 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -9,50 +9,6 @@ env: vcpkg_SHA: "2023.06.20" jobs: - clang-tidy: - name: clang-tidy - runs-on: ubuntu-22.04 - steps: - - name: install ninja - run: sudo apt install ninja-build clang-tidy-14 - - uses: actions/checkout@v2 - - name: clone-vcpkg - working-directory: "${{runner.temp}}" - run: > - mkdir -p vcpkg && - curl -sSL "https://github.com/microsoft/vcpkg/archive/${{env.vcpkg_SHA}}.tar.gz" | - tar -C vcpkg --strip-components=1 -zxf - - - name: cache-vcpkg - id: cache-vcpkg - uses: actions/cache@v2 - with: - # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: | - vcpkg-${{ env.vcpkg_SHA }}-style-clang-tidy-${{ hashFiles('vcpkg.json') }} - restore-keys: | - vcpkg-${{ env.vcpkg_SHA }}-style-clang-tidy- - - name: boostrap-vcpkg - run: ci/restore-vcpkg-from-cache.sh "${{runner.temp}}/vcpkg" - - name: configure - run: > - cmake -S . -B "${{runner.temp}}/build" - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 - if: always() - with: - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: vcpkg-${{ env.vcpkg_SHA }}-style-clang-tidy-${{ hashFiles('vcpkg.json') }} - - name: tidy - run: > - git ls-files -z -- '*.cc' | - xargs --verbose -P 2 -n 1 -0 clang-tidy-14 -p="${{runner.temp}}/build" - werror-build: # Using a blank name produces better output on # the web UI than any other alternative we tried. diff --git a/ci/cloudbuild/builds/clang-tidy.sh b/ci/cloudbuild/builds/clang-tidy.sh new file mode 100755 index 00000000..9f961218 --- /dev/null +++ b/ci/cloudbuild/builds/clang-tidy.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with clang-tidy" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_CLANG_TIDY=clang-tidy \ + -DCMAKE_CXX_COMPILER=clang++ +io::run cmake --build cmake-out diff --git a/ci/cloudbuild/builds/lib/vcpkg.sh b/ci/cloudbuild/builds/lib/vcpkg.sh index d7f4bc40..3b64041e 100644 --- a/ci/cloudbuild/builds/lib/vcpkg.sh +++ b/ci/cloudbuild/builds/lib/vcpkg.sh @@ -35,8 +35,7 @@ time { git -C "${VCPKG_ROOT_DIR}" checkout "${VCPKG_RELEASE_VERSION}" pwd fi - env -C "${VCPKG_ROOT_DIR}" CC="ccache ${CC}" CXX="ccache ${CXX}" \ - ./bootstrap-vcpkg.sh + env -C "${VCPKG_ROOT_DIR}" ./bootstrap-vcpkg.sh } # Outputs the root directory where vcpkg is installed (and bootstrapped) diff --git a/ci/cloudbuild/triggers/clang-tidy-ci.yaml b/ci/cloudbuild/triggers/clang-tidy-ci.yaml new file mode 100644 index 00000000..650d3339 --- /dev/null +++ b/ci/cloudbuild/triggers/clang-tidy-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: clang-tidy-ci +substitutions: + _BUILD_NAME: clang-tidy + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/clang-tidy-pr.yaml b/ci/cloudbuild/triggers/clang-tidy-pr.yaml new file mode 100644 index 00000000..17344ead --- /dev/null +++ b/ci/cloudbuild/triggers/clang-tidy-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: clang-tidy-pr +substitutions: + _BUILD_NAME: clang-tidy + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr diff --git a/examples/site/http_form_data/http_form_data.cc b/examples/site/http_form_data/http_form_data.cc index 06f4aee5..2f5e8e72 100644 --- a/examples/site/http_form_data/http_form_data.cc +++ b/examples/site/http_form_data/http_form_data.cc @@ -73,10 +73,10 @@ gcf::HttpResponse http_form_data_impl(gcf::HttpRequest request) { auto delimiter = FormDataDelimiter::FromHeader(header->second); auto payload = std::move(request).payload(); - std::vector parts = + std::vector const parts = absl::StrSplit(payload, delimiter, absl::SkipEmpty{}); nlohmann::json result{{"parts", std::vector{}}}; - for (auto& p : parts) { + for (auto const& p : parts) { std::vector components = absl::StrSplit(p, absl::MaxSplits("\r\n\r\n", 2)); auto const body_size = components.size() == 2 ? components[0].size() : 0; diff --git a/examples/site/testing_pubsub/pubsub_integration_test.cc b/examples/site/testing_pubsub/pubsub_integration_test.cc index 51fa2df0..e0fc489c 100644 --- a/examples/site/testing_pubsub/pubsub_integration_test.cc +++ b/examples/site/testing_pubsub/pubsub_integration_test.cc @@ -92,10 +92,10 @@ TEST_F(PubsubIntegrationTest, Basic) { } })js"); - struct TestCases { + struct { std::string data; std::string expected; - } cases[]{ + } const cases[]{ // The magic string was obtained using: // /bin/echo -n 'C++' | openssl base64 -e {"Qysr", "Hello C++"}, diff --git a/examples/site/testing_pubsub/pubsub_system_test.cc b/examples/site/testing_pubsub/pubsub_system_test.cc index d0f6365a..97cf512d 100644 --- a/examples/site/testing_pubsub/pubsub_system_test.cc +++ b/examples/site/testing_pubsub/pubsub_system_test.cc @@ -63,10 +63,10 @@ class PubsubSystemTest : public ::testing::Test { }; TEST_F(PubsubSystemTest, Basic) { - struct TestCases { + struct { std::string data; std::string expected; - } cases[]{ + } const cases[]{ {"C++", "Hello C++"}, {"World", "Hello World"}, }; diff --git a/examples/site/testing_pubsub/pubsub_unit_test.cc b/examples/site/testing_pubsub/pubsub_unit_test.cc index 140d83b0..b9f3495f 100644 --- a/examples/site/testing_pubsub/pubsub_unit_test.cc +++ b/examples/site/testing_pubsub/pubsub_unit_test.cc @@ -47,10 +47,10 @@ TEST(PubsubUnitTest, Basic) { return be; }(); - struct TestCases { + struct { std::string data; std::string expected; - } cases[]{ + } const cases[]{ // The magic string was obtained using: // /bin/echo -n 'C++' | openssl base64 -e {R"js({"message": {"data": "Qysr"}})js", "Hello C++"}, diff --git a/examples/site/testing_storage/storage_integration_test.cc b/examples/site/testing_storage/storage_integration_test.cc index d43bbf1f..e7252cb6 100644 --- a/examples/site/testing_storage/storage_integration_test.cc +++ b/examples/site/testing_storage/storage_integration_test.cc @@ -99,10 +99,10 @@ TEST_F(StorageIntegrationTest, Basic) { } })js"); - struct TestCases { + struct { std::string name; std::string expected; - } cases[]{ + } const cases[]{ {"object1.txt", "Object: object1.txt"}, {"object/with/longer/name.txt", "Object: object/with/longer/name.txt"}, }; diff --git a/examples/site/testing_storage/storage_unit_test.cc b/examples/site/testing_storage/storage_unit_test.cc index 77781680..2538a8f0 100644 --- a/examples/site/testing_storage/storage_unit_test.cc +++ b/examples/site/testing_storage/storage_unit_test.cc @@ -47,10 +47,10 @@ TEST(StorageUnitTest, Basic) { return be; }(); - struct TestCases { + struct { std::string name; std::string expected; - } cases[]{ + } const cases[]{ {"object1.txt", "Object: object1.txt"}, {"object/with/longer/name.txt", "Object: object/with/longer/name.txt"}, }; diff --git a/examples/site/tips_gcp_apis/tips_gcp_apis.cc b/examples/site/tips_gcp_apis/tips_gcp_apis.cc index dc5b9fa8..61821584 100644 --- a/examples/site/tips_gcp_apis/tips_gcp_apis.cc +++ b/examples/site/tips_gcp_apis/tips_gcp_apis.cc @@ -33,7 +33,7 @@ pubsub::Publisher GetPublisher(pubsub::Topic topic) { static std::mutex mu; static Map connections; - std::lock_guard lk(mu); + std::lock_guard const lk(mu); auto [pos, inserted] = connections.emplace( topic.FullName(), std::shared_ptr()); if (inserted) { diff --git a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc index 8503dfb7..507e0fbc 100644 --- a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc +++ b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc @@ -30,7 +30,7 @@ cbt::Table get_table_client(std::string project_id, std::string instance_id, std::string const& table_id) { static std::mutex mu; static std::unique_ptr table; - std::lock_guard lk(mu); + std::lock_guard const lk(mu); if (table == nullptr || table->table_id() != table_id || table->instance_id() != instance_id || table->project_id() != project_id) { diff --git a/examples/site_test.cc b/examples/site_test.cc index 1d91e000..13d9970e 100644 --- a/examples/site_test.cc +++ b/examples/site_test.cc @@ -327,7 +327,7 @@ TEST(ExamplesSiteTest, HelloWorldPubSub) { } })js"; - struct TestCase { + struct { std::string name; std::string body; } const cases[] = { @@ -399,7 +399,7 @@ TEST(ExamplesSiteTest, HelloWorldStorage) { "datacontenttype": "application/json" })js"; - struct TestCase { + struct { std::string name; std::string body; std::string content_type; diff --git a/google/cloud/functions/cloud_event_test.cc b/google/cloud/functions/cloud_event_test.cc index 4ce258b9..1b98ac02 100644 --- a/google/cloud/functions/cloud_event_test.cc +++ b/google/cloud/functions/cloud_event_test.cc @@ -43,8 +43,7 @@ TEST(CloudEventTest, WithVersion) { TEST(CloudEventTest, DataContentType) { auto actual = CloudEvent("test-id", "test-source", "test-type"); actual.set_data_content_type("test-value"); - ASSERT_TRUE(actual.data_content_type().has_value()); - EXPECT_EQ(*actual.data_content_type(), "test-value"); + EXPECT_EQ(actual.data_content_type().value_or(""), "test-value"); actual.reset_data_content_type(); EXPECT_FALSE(actual.data_content_type().has_value()); } @@ -52,8 +51,7 @@ TEST(CloudEventTest, DataContentType) { TEST(CloudEventTest, DataSchema) { auto actual = CloudEvent("test-id", "test-source", "test-type"); actual.set_data_schema("test-value"); - ASSERT_TRUE(actual.data_schema().has_value()); - EXPECT_EQ(*actual.data_schema(), "test-value"); + EXPECT_EQ(actual.data_schema().value_or(""), "test-value"); actual.reset_data_schema(); EXPECT_FALSE(actual.data_schema().has_value()); } @@ -61,8 +59,7 @@ TEST(CloudEventTest, DataSchema) { TEST(CloudEventTest, Subject) { auto actual = CloudEvent("test-id", "test-source", "test-type"); actual.set_subject("test-value"); - ASSERT_TRUE(actual.subject().has_value()); - EXPECT_EQ(*actual.subject(), "test-value"); + EXPECT_EQ(actual.subject().value_or(""), "test-value"); actual.reset_subject(); EXPECT_FALSE(actual.subject().has_value()); } @@ -71,17 +68,16 @@ TEST(CloudEventTest, Time) { auto actual = CloudEvent("test-id", "test-source", "test-type"); auto const tp = CloudEvent::ClockType::now(); actual.set_time(tp); - ASSERT_TRUE(actual.time().has_value()); - EXPECT_EQ(*actual.time(), tp); + EXPECT_EQ(actual.time().value_or(tp + std::chrono::seconds(5)), tp); actual.reset_time(); EXPECT_FALSE(actual.time().has_value()); } TEST(CloudEventTest, TimeString) { auto actual = CloudEvent("test-id", "test-source", "test-type"); - std::string valid[] = {"2020-11-30T12:34:45Z", "2020-11-30T12:34:45.678Z", - "2020-11-30T12:34:45.678-05:00", - "2020-11-30T12:34:45.678+05:00"}; + std::string const valid[] = { + "2020-11-30T12:34:45Z", "2020-11-30T12:34:45.678Z", + "2020-11-30T12:34:45.678-05:00", "2020-11-30T12:34:45.678+05:00"}; auto to_system_clock_tp = [](std::string const& s) { std::string err; absl::Time t; @@ -101,8 +97,7 @@ TEST(CloudEventTest, TimeString) { TEST(CloudEventTest, Data) { auto actual = CloudEvent("test-id", "test-source", "test-type"); actual.set_data("test-value"); - ASSERT_TRUE(actual.data().has_value()); - EXPECT_EQ(*actual.data(), "test-value"); + EXPECT_EQ(actual.data().value_or(""), "test-value"); actual.reset_data(); EXPECT_FALSE(actual.data().has_value()); } @@ -111,8 +106,7 @@ TEST(CloudEventTest, DataMove) { auto actual = CloudEvent("test-id", "test-source", "test-type"); actual.set_data("test-value"); auto d = std::move(actual).data(); - ASSERT_TRUE(d.has_value()); - EXPECT_EQ(*d, "test-value"); + EXPECT_EQ(d.value_or(""), "test-value"); } } // namespace diff --git a/google/cloud/functions/integration_tests/cloud_event_conformance.cc b/google/cloud/functions/integration_tests/cloud_event_conformance.cc index 66d04510..88b947c5 100644 --- a/google/cloud/functions/integration_tests/cloud_event_conformance.cc +++ b/google/cloud/functions/integration_tests/cloud_event_conformance.cc @@ -35,7 +35,7 @@ void CloudEventConformance(functions::CloudEvent const& ev) { struct { std::string name; std::optional value; - } optional_fields[]{ + } const optional_fields[]{ {"datacontenttype", ev.data_content_type()}, {"dataschema", ev.data_schema()}, {"subject", ev.subject()}, diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy.cc b/google/cloud/functions/internal/parse_cloud_event_legacy.cc index 6ed0acba..4fbc515d 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy.cc +++ b/google/cloud/functions/internal/parse_cloud_event_legacy.cc @@ -234,7 +234,7 @@ functions::CloudEvent ParseLegacyFirebaseAuth(nlohmann::json const& json, gcf.subject = "users/" + uid; auto modified = json["data"]; - std::pair renames[] = { + std::pair const renames[] = { {"createdAt", "createTime"}, {"lastSignedInAt", "lastSignInTime"}}; auto& metadata = modified["metadata"]; for (auto const& [old_name, new_name] : renames) { diff --git a/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc b/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc index 14e0ccc1..91927a00 100644 --- a/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_legacy_test.cc @@ -162,7 +162,7 @@ TEST(ParseCloudEventLegacy, MapEventTypePrefixToEventType) { struct { std::string gcf_event_type; std::string expected_service; - } cases[] = { + } const cases[] = { {"providers/cloud.firestore/eventTypes/document.write", "firestore.googleapis.com"}, {"providers/google.firebase.analytics/eventTypes/event.log", @@ -208,7 +208,7 @@ TEST(ParseCloudEventLegacy, MapEventType) { struct { std::string gcf_event_type; std::string expected; - } cases[] = { + } const cases[] = { {"google.pubsub.topic.publish", "google.cloud.pubsub.topic.v1.messagePublished"}, {"providers/cloud.pubsub/eventTypes/topic.publish", diff --git a/google/cloud/functions/internal/parse_cloud_event_storage.cc b/google/cloud/functions/internal/parse_cloud_event_storage.cc index 2ad234be..27d87be3 100644 --- a/google/cloud/functions/internal/parse_cloud_event_storage.cc +++ b/google/cloud/functions/internal/parse_cloud_event_storage.cc @@ -58,7 +58,7 @@ functions::CloudEvent ParseCloudEventStorage(functions::CloudEvent e) { event.set_data_content_type("application/json"); event.set_data_schema("google.events.cloud.storage.v1.StorageObjectData"); event.set_subject("objects/" + attributes.value("objectId", "")); - if (e.time().has_value()) event.set_time(e.time().value()); + if (auto t = e.time(); t.has_value()) event.set_time(*t); event.set_data(Base64Decode(message.value("data", ""))); return event; diff --git a/google/cloud/functions/internal/parse_cloud_event_storage_test.cc b/google/cloud/functions/internal/parse_cloud_event_storage_test.cc index d2d67bfd..6865bc1c 100644 --- a/google/cloud/functions/internal/parse_cloud_event_storage_test.cc +++ b/google/cloud/functions/internal/parse_cloud_event_storage_test.cc @@ -24,10 +24,10 @@ FUNCTIONS_FRAMEWORK_CPP_INLINE_NAMESPACE_BEGIN namespace { TEST(ParseCloudEventJson, EmulateStorageBase) { - struct TestCase { + struct { std::string event_type; std::string expected_type; - } test_cases[] = { + } const test_cases[] = { {"OBJECT_FINALIZE", "google.cloud.storage.object.v1.finalized"}, {"OBJECT_METADATA_UPDATE", "google.cloud.storage.object.v1.metadataUpdated"}, @@ -210,9 +210,9 @@ TEST(ParseCloudEventJson, EmulateStorageMissingData) { } TEST(ParseCloudEventJson, EmulateStorageMissingAttributeField) { - struct TestCase { + struct { std::string field_name; - } test_cases[] = { + } const test_cases[] = { {"notificationConfig"}, {"eventType"}, {"payloadFormat"}, {"bucketId"}, {"objectId"}, {"objectGeneration"}, }; @@ -271,9 +271,9 @@ TEST(ParseCloudEventJson, EmulateStorageMissingAttributeField) { } TEST(ParseCloudEventJson, EmulateStorageMissingInvalidAttributeField) { - struct TestCase { + struct { std::string field_name; - } test_cases[] = { + } const test_cases[] = { {"eventType"}, {"payloadFormat"}, }; diff --git a/google/cloud/functions/internal/parse_options_test.cc b/google/cloud/functions/internal/parse_options_test.cc index 586b9469..75d7473c 100644 --- a/google/cloud/functions/internal/parse_options_test.cc +++ b/google/cloud/functions/internal/parse_options_test.cc @@ -43,7 +43,7 @@ TEST(WrapRequestTest, ExceptionOnUnknown) { "unused", "--invalid-option-never-named-an-option-this", }; - int argc = sizeof(argv) / sizeof(argv[0]); + int const argc = sizeof(argv) / sizeof(argv[0]); EXPECT_THROW(ParseOptions(argc, argv), std::exception); } @@ -78,21 +78,21 @@ TEST(WrapRequestTest, CommandLineOverridesEnv) { TEST(WrapRequestTest, PortEnvInvalid) { SetEnv("PORT", "not-a-number"); char const* argv[] = {"unused"}; - int argc = sizeof(argv) / sizeof(argv[0]); + int const argc = sizeof(argv) / sizeof(argv[0]); EXPECT_THROW(ParseOptions(argc, argv), std::exception); } TEST(WrapRequestTest, PortEnvTooLow) { SetEnv("PORT", "-1"); char const* argv[] = {"unused"}; - int argc = sizeof(argv) / sizeof(argv[0]); + int const argc = sizeof(argv) / sizeof(argv[0]); EXPECT_THROW(ParseOptions(argc, argv), std::exception); } TEST(WrapRequestTest, PortEnvTooHigh) { SetEnv("PORT", "65536"); char const* argv[] = {"unused"}; - int argc = sizeof(argv) / sizeof(argv[0]); + int const argc = sizeof(argv) / sizeof(argv[0]); EXPECT_THROW(ParseOptions(argc, argv), std::exception); } diff --git a/google/cloud/functions/internal/version_info.h b/google/cloud/functions/internal/version_info.h index 38d19683..70c969b7 100644 --- a/google/cloud/functions/internal/version_info.h +++ b/google/cloud/functions/internal/version_info.h @@ -15,8 +15,10 @@ #ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 1 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 3 -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 +// clang-format off +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR 1 // NOLINT(modernize-macro-to-enum) +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR 3 // NOLINT(modernize-macro-to-enum) +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH 0 // NOLINT(modernize-macro-to-enum) +// clang-format on #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H diff --git a/google/cloud/functions/internal/version_info.h.in b/google/cloud/functions/internal/version_info.h.in index 0543aff6..0224465b 100644 --- a/google/cloud/functions/internal/version_info.h.in +++ b/google/cloud/functions/internal/version_info.h.in @@ -15,8 +15,10 @@ #ifndef FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H #define FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR @PROJECT_VERSION_MINOR@ -#define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH @PROJECT_VERSION_PATCH@ +// clang-format off +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ // NOLINT(modernize-macro-to-enum) +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_MINOR @PROJECT_VERSION_MINOR@ // NOLINT(modernize-macro-to-enum) +#define FUNCTIONS_FRAMEWORK_CPP_VERSION_PATCH @PROJECT_VERSION_PATCH@ // NOLINT(modernize-macro-to-enum) +// clang-format on #endif // FUNCTIONS_FRAMEWORK_CPP_GOOGLE_CLOUD_FUNCTIONS_INTERNAL_VERSION_INFO_H From 25f92d2f30f65895e3d41e69ee0209b3c079aede Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sun, 9 Jul 2023 15:36:11 -0400 Subject: [PATCH 60/77] docs: simplify GCP API examples (#394) --- examples/site/tips_gcp_apis/tips_gcp_apis.cc | 33 ++++++++----------- .../tutorial_cloud_bigtable.cc | 16 ++++----- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/examples/site/tips_gcp_apis/tips_gcp_apis.cc b/examples/site/tips_gcp_apis/tips_gcp_apis.cc index 61821584..da8616b4 100644 --- a/examples/site/tips_gcp_apis/tips_gcp_apis.cc +++ b/examples/site/tips_gcp_apis/tips_gcp_apis.cc @@ -15,7 +15,7 @@ // [START functions_pubsub_publish] // [START functions_tips_gcp_apis] #include -#include +#include #include #include #include @@ -26,20 +26,13 @@ namespace gcf = ::google::cloud::functions; namespace pubsub = ::google::cloud::pubsub; namespace { -pubsub::Publisher GetPublisher(pubsub::Topic topic) { - using Map = std::unordered_map>; - +pubsub::BlockingPublisher GetPublisher() { static std::mutex mu; - static Map connections; + static std::shared_ptr connection; std::lock_guard const lk(mu); - auto [pos, inserted] = connections.emplace( - topic.FullName(), std::shared_ptr()); - if (inserted) { - pos->second = pubsub::MakePublisherConnection(std::move(topic)); - } - return pubsub::Publisher(pos->second); + if (!connection) connection = pubsub::MakeBlockingPublisherConnection(); + return pubsub::BlockingPublisher(connection); } } // namespace @@ -51,18 +44,18 @@ gcf::HttpResponse tips_gcp_apis_impl(gcf::HttpRequest const& request) { auto const topic_id = body.value("topic", ""); if (topic_id.empty()) throw std::runtime_error("Missing topic in request"); - auto publisher = GetPublisher(pubsub::Topic(project, topic_id)); + auto publisher = GetPublisher(); auto id = publisher.Publish( + pubsub::Topic(project, topic_id), pubsub::MessageBuilder().SetData("Test message").Build()); - gcf::HttpResponse response; - if (!id.get()) { - response.set_result(gcf::HttpResponse::kInternalServerError); - } else { - response.set_payload("1 message published"); - response.set_header("content-type", "text/plain"); + if (!id) { + return gcf::HttpResponse{}.set_result( + gcf::HttpResponse::kInternalServerError); } - return response; + return gcf::HttpResponse{} + .set_payload("1 message published") + .set_header("content-type", "text/plain"); } gcf::Function tips_gcp_apis() { return gcf::MakeFunction(tips_gcp_apis_impl); } diff --git a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc index 507e0fbc..4ffb0aef 100644 --- a/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc +++ b/examples/site/tutorial_cloud_bigtable/tutorial_cloud_bigtable.cc @@ -29,17 +29,13 @@ namespace { cbt::Table get_table_client(std::string project_id, std::string instance_id, std::string const& table_id) { static std::mutex mu; - static std::unique_ptr table; + static std::shared_ptr connection; std::lock_guard const lk(mu); - if (table == nullptr || table->table_id() != table_id || - table->instance_id() != instance_id || - table->project_id() != project_id) { - table = std::make_unique( - cbt::MakeDataConnection(), - cbt::TableResource(std::move(project_id), std::move(instance_id), - table_id)); - } - return *table; + if (!connection) connection = cbt::MakeDataConnection(); + + return cbt::Table(connection, + cbt::TableResource(std::move(project_id), + std::move(instance_id), table_id)); } gcf::HttpResponse handle_request(gcf::HttpRequest const& request) { From 6fabe85fc16e256e191118fe2594ec2b75fa21e7 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Sun, 9 Jul 2023 15:36:34 -0400 Subject: [PATCH 61/77] ci: move -Werror builds to GCB (#393) --- .github/workflows/style.yaml | 57 ----------------------- ci/cloudbuild/builds/clang-16.0.sh | 34 ++++++++++++++ ci/cloudbuild/builds/gcc-13.1.sh | 34 ++++++++++++++ ci/cloudbuild/triggers/clang-16-0-ci.yaml | 14 ++++++ ci/cloudbuild/triggers/clang-16-0-pr.yaml | 15 ++++++ ci/cloudbuild/triggers/gcc-13-1-ci.yaml | 14 ++++++ ci/cloudbuild/triggers/gcc-13-1-pr.yaml | 15 ++++++ 7 files changed, 126 insertions(+), 57 deletions(-) create mode 100755 ci/cloudbuild/builds/clang-16.0.sh create mode 100755 ci/cloudbuild/builds/gcc-13.1.sh create mode 100644 ci/cloudbuild/triggers/clang-16-0-ci.yaml create mode 100644 ci/cloudbuild/triggers/clang-16-0-pr.yaml create mode 100644 ci/cloudbuild/triggers/gcc-13-1-ci.yaml create mode 100644 ci/cloudbuild/triggers/gcc-13-1-pr.yaml diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 5c28bb9d..a68df7aa 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -9,63 +9,6 @@ env: vcpkg_SHA: "2023.06.20" jobs: - werror-build: - # Using a blank name produces better output on - # the web UI than any other alternative we tried. - name: " " - runs-on: ubuntu-22.04 - strategy: - matrix: - compiler: [ - {"cxx": "clang++-14", "cc": "clang-14"}, - {"cxx": "g++-11", "cc": "gcc-11" }, - ] - steps: - - name: install ninja - run: sudo apt install ninja-build - - uses: actions/checkout@v2 - - name: clone-vcpkg - working-directory: "${{runner.temp}}" - run: > - mkdir -p vcpkg && - curl -sSL "https://github.com/microsoft/vcpkg/archive/${{env.vcpkg_SHA}}.tar.gz" | - tar -C vcpkg --strip-components=1 -zxf - - - name: cache-vcpkg - id: cache-vcpkg - uses: actions/cache@v2 - with: - # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: | - vcpkg-${{ env.vcpkg_SHA }}-werror-${{ matrix.compiler.cxx }}-${{ hashFiles('vcpkg.json') }} - restore-keys: | - vcpkg-${{ env.vcpkg_SHA }}-werror-${{ matrix.compiler.cxx }}- - - name: boostrap-vcpkg - run: ci/restore-vcpkg-from-cache.sh "${{runner.temp}}/vcpkg" - - name: compiler=${{matrix.sanitizer}} / configure - run: > - cmake -S . -B "${{runner.temp}}/build" -GNinja - -DFUNCTIONS_FRAMEWORK_CPP_ENABLE_WERROR=ON - -DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}} - -DCMAKE_C_COMPILER=${{matrix.compiler.cc}} - -DCMAKE_BUILD_TYPE=Debug - -DCMAKE_EXPORT_COMPILE_COMMANDS=ON - -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 - if: always() - with: - path: | - ~/.cache/vcpkg - ~/.cache/bin - key: vcpkg-${{ env.vcpkg_SHA }}-werror-${{ matrix.compiler.cxx }}-${{ hashFiles('vcpkg.json') }} - - name: compiler=${{matrix.compiler.cxx}} / build - run: cmake --build "${{runner.temp}}/build" - - name: compiler=${{matrix.compiler.cxx}} / test - working-directory: "${{runner.temp}}/build" - run: ctest --output-on-failure --timeout=60s - clang-format: name: clang-format runs-on: ubuntu-22.04 diff --git a/ci/cloudbuild/builds/clang-16.0.sh b/ci/cloudbuild/builds/clang-16.0.sh new file mode 100755 index 00000000..98ae5c60 --- /dev/null +++ b/ci/cloudbuild/builds/clang-16.0.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with clang-tidy" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DFUNCTIONS_FRAMEWORK_CPP_ENABLE_WERROR=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=clang++ +io::run cmake --build cmake-out + +mapfile -t ctest_args < <(ctest::common_args) +io::run ctest "${ctest_args[@]}" diff --git a/ci/cloudbuild/builds/gcc-13.1.sh b/ci/cloudbuild/builds/gcc-13.1.sh new file mode 100755 index 00000000..8ede57bf --- /dev/null +++ b/ci/cloudbuild/builds/gcc-13.1.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -euo pipefail + +source "$(dirname "$0")/../../lib/init.sh" +source module ci/lib/io.sh +source module ci/cloudbuild/builds/lib/vcpkg.sh +source module ci/cloudbuild/builds/lib/cmake.sh + +io::log_h2 "Building with clang-tidy" +mapfile -t cmake_args < <(cmake::common_args) +mapfile -t vcpkg_args < <(vcpkg::cmake_args) +io::run cmake "${cmake_args[@]}" "${vcpkg_args[@]}" \ + -DFUNCTIONS_FRAMEWORK_CPP_ENABLE_WERROR=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_COMPILER=g++ +io::run cmake --build cmake-out + +mapfile -t ctest_args < <(ctest::common_args) +io::run ctest "${ctest_args[@]}" diff --git a/ci/cloudbuild/triggers/clang-16-0-ci.yaml b/ci/cloudbuild/triggers/clang-16-0-ci.yaml new file mode 100644 index 00000000..b096960c --- /dev/null +++ b/ci/cloudbuild/triggers/clang-16-0-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: clang-16-0-ci +substitutions: + _BUILD_NAME: clang-16.0 + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/clang-16-0-pr.yaml b/ci/cloudbuild/triggers/clang-16-0-pr.yaml new file mode 100644 index 00000000..d6dd3b25 --- /dev/null +++ b/ci/cloudbuild/triggers/clang-16-0-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: clang-16-0-pr +substitutions: + _BUILD_NAME: clang-16.0 + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr diff --git a/ci/cloudbuild/triggers/gcc-13-1-ci.yaml b/ci/cloudbuild/triggers/gcc-13-1-ci.yaml new file mode 100644 index 00000000..45c257e8 --- /dev/null +++ b/ci/cloudbuild/triggers/gcc-13-1-ci.yaml @@ -0,0 +1,14 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + push: + branch: ^(main|v\d+\..*)$ +name: gcc-13-1-ci +substitutions: + _BUILD_NAME: gcc-13.1 + _DISTRO: fedora-38 + _TRIGGER_TYPE: ci +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- ci diff --git a/ci/cloudbuild/triggers/gcc-13-1-pr.yaml b/ci/cloudbuild/triggers/gcc-13-1-pr.yaml new file mode 100644 index 00000000..45190c1d --- /dev/null +++ b/ci/cloudbuild/triggers/gcc-13-1-pr.yaml @@ -0,0 +1,15 @@ +filename: ci/cloudbuild/cloudbuild.yaml +github: + name: functions-framework-cpp + owner: GoogleCloudPlatform + pullRequest: + branch: ^(main|v\d+\..*)$ + commentControl: COMMENTS_ENABLED_FOR_EXTERNAL_CONTRIBUTORS_ONLY +name: gcc-13-1-pr +substitutions: + _BUILD_NAME: gcc-13.1 + _DISTRO: fedora-38 + _TRIGGER_TYPE: pr +includeBuildLogs: INCLUDE_BUILD_LOGS_WITH_STATUS +tags: +- pr From e79a2125abdae3ef66b83f55fa854e18f1bfb926 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Mon, 10 Jul 2023 11:12:56 -0400 Subject: [PATCH 62/77] cleanup: fix GCC warnings with Wall (#395) I was too optimistic about the state of the code with GCC 13, while the code is clean with Clang, there was a useful warning emitted by GCC 13, and a number of useless warnings too. --- examples/site/http_content/http_content.cc | 2 +- google/cloud/functions/CMakeLists.txt | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/site/http_content/http_content.cc b/examples/site/http_content/http_content.cc index e52b107a..5d586e7e 100644 --- a/examples/site/http_content/http_content.cc +++ b/examples/site/http_content/http_content.cc @@ -66,7 +66,7 @@ std::string urldecode(std::string const& encoded) { auto const* end = encoded.data() + i + 3; auto r = std::from_chars(encoded.data() + i + 1, end, value, kUrlEncodingBase); - if (r.ptr == end) { + if (r.ec == std::errc{} && r.ptr == end) { result.push_back(value); i += 2; } else { diff --git a/google/cloud/functions/CMakeLists.txt b/google/cloud/functions/CMakeLists.txt index 631799f4..d35a0026 100644 --- a/google/cloud/functions/CMakeLists.txt +++ b/google/cloud/functions/CMakeLists.txt @@ -123,6 +123,18 @@ if (BUILD_TESTING) functions_framework_cpp_add_common_options(${target}) add_test(NAME ${target} COMMAND ${target}) endforeach () + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + # GCC turns on -Wmaybe-unitialized with -Wall. This results in false + # positives in this test, but the warning was useful in other tests. + # + # https://godbolt.org/z/xhj57Y6qG shows an example of these false + # positives. + # + # It seems the GTEST_*() macros trigger a new version of: + # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635 + target_compile_options(cloud_event_test + PRIVATE "-Wno-maybe-uninitialized") + endif () add_subdirectory(integration_tests) endif () From 99c7e46b0c81cf7e4e45ad63020d26d439e358d8 Mon Sep 17 00:00:00 2001 From: Uilian Ries Date: Fri, 8 Sep 2023 15:21:13 +0200 Subject: [PATCH 63/77] fix: add `nlohmann_json` as required CMake target (#397) Signed-off-by: Uilian Ries Co-authored-by: Carlos O'Ryan --- google/cloud/functions/CMakeLists.txt | 7 +++++-- google/cloud/functions/config.cmake.in | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/google/cloud/functions/CMakeLists.txt b/google/cloud/functions/CMakeLists.txt index d35a0026..ef70c03b 100644 --- a/google/cloud/functions/CMakeLists.txt +++ b/google/cloud/functions/CMakeLists.txt @@ -23,6 +23,7 @@ configure_file(internal/version_info.h.in find_package(absl REQUIRED) find_package(Boost REQUIRED COMPONENTS program_options) find_package(Threads REQUIRED) +find_package(nlohmann_json REQUIRED) add_library( functions_framework_cpp # cmake-format: sort @@ -79,8 +80,10 @@ target_include_directories(functions_framework_cpp target_include_directories(functions_framework_cpp SYSTEM PUBLIC $) target_link_libraries( - functions_framework_cpp PUBLIC absl::time Boost::headers - Boost::program_options Threads::Threads) + functions_framework_cpp + PUBLIC absl::time Boost::headers Boost::program_options Threads::Threads + PRIVATE nlohmann_json::nlohmann_json) + if ("${Boost_VERSION_STRING}" VERSION_LESS "1.81") target_compile_definitions(functions_framework_cpp PUBLIC BOOST_BEAST_USE_STD_STRING_VIEW) diff --git a/google/cloud/functions/config.cmake.in b/google/cloud/functions/config.cmake.in index 6c8c3e34..aebc8d38 100644 --- a/google/cloud/functions/config.cmake.in +++ b/google/cloud/functions/config.cmake.in @@ -16,6 +16,7 @@ include(CMakeFindDependencyMacro) find_dependency(absl) find_dependency(Boost COMPONENTS program_options) find_dependency(Threads) +find_dependency(nlohmann_json) set(FUNCTIONS_FRAMEWORK_CPP_VERSION @PROJECT_VERSION@) From be704325f43590b673f815bcfeb2731db6df98d7 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Wed, 1 May 2024 21:18:38 +0200 Subject: [PATCH 64/77] chore: Configure Renovate (#399) Co-authored-by: Carlos O'Ryan --- .github/renovate.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/renovate.json diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..5db72dd6 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +} From aacdcf21401f3a6e61d9aef9025df77da788ccf7 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Thu, 2 May 2024 01:06:09 +0000 Subject: [PATCH 65/77] ci: pass codecov token (#403) Recently codecov.io started requiring an explicit token. --- .github/workflows/coverage.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index fec6da13..ad05c262 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -79,5 +79,7 @@ jobs: - name: coverage-upload working-directory: ${{runner.workspace}} + env: + CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} run: > /bin/bash <(curl -s https://codecov.io/bash) -X coveragepy -x /usr/bin/gcov From a09b1742c7dbac32633f0575d4d790bac9e5dc89 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 06:21:09 +0200 Subject: [PATCH 66/77] chore(deps): update actions/cache action to v4 (#404) --- .github/workflows/build.yaml | 16 ++++++++-------- .github/workflows/coverage.yaml | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 21623aa4..80e240c3 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -24,7 +24,7 @@ jobs: tar -C vcpkg --strip-components=1 -zxf - - name: cache-vcpkg id: cache-vcpkg - uses: actions/cache@v2 + uses: actions/cache@v4 with: # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache path: | @@ -42,7 +42,7 @@ jobs: cmake -S . -B "${{runner.temp}}/build" -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() with: path: | @@ -66,7 +66,7 @@ jobs: - uses: actions/checkout@v2 - name: cache-vcpkg id: cache-vcpkg - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: | ~/.cache/vcpkg @@ -89,7 +89,7 @@ jobs: run: > cmake -S examples/site/howto_local_development -B "${{runner.temp}}/howto_local_development/build" -GNinja -DCMAKE_TOOLCHAIN_FILE=/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() with: path: | @@ -122,7 +122,7 @@ jobs: - name: cache-vcpkg id: cache-vcpkg - uses: actions/cache@v2 + uses: actions/cache@v4 with: # Preserve the vcpkg binary cache path: | @@ -140,7 +140,7 @@ jobs: '-DBUILD_TESTING=ON' ` '-DFUNCTIONS_FRAMEWORK_CPP_TEST_EXAMPLES=OFF' ` '-DCMAKE_TOOLCHAIN_FILE=${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake' - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() with: path: | @@ -168,7 +168,7 @@ jobs: tar -C vcpkg --strip-components=1 -zxf - - name: cache-vcpkg id: cache-vcpkg - uses: actions/cache@v2 + uses: actions/cache@v4 with: # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache path: | @@ -186,7 +186,7 @@ jobs: cmake -S . -B "${{runner.temp}}/build" -GNinja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() with: path: | diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index ad05c262..8419835c 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -24,7 +24,7 @@ jobs: tar -C vcpkg --strip-components=1 -zxf - - name: cache-vcpkg id: cache-vcpkg - uses: actions/cache@v2 + uses: actions/cache@v4 with: # Preserve the vcpkg binary *and* the vcpkg binary cache in the build cache path: | @@ -43,7 +43,7 @@ jobs: -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS=--coverage -DCMAKE_TOOLCHAIN_FILE="${{runner.temp}}/vcpkg/scripts/buildsystems/vcpkg.cmake" - - uses: actions/cache/save@v3 + - uses: actions/cache/save@v4 if: always() with: path: | From 700640af915a2f739c9129df48973e39b2f9e6fc Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 13:05:01 +0200 Subject: [PATCH 67/77] chore(deps): update actions/setup-go action to v5 (#406) --- .github/workflows/coverage.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 8419835c..acf43903 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -57,7 +57,7 @@ jobs: run: ctest --output-on-failure --timeout=60s - name: Setup Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: '^1.16' From ecf89aceea83a5d43c57813a78976f529f53f703 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 16:34:13 +0200 Subject: [PATCH 68/77] chore(deps): update dependency windows to v2022 (#407) --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 80e240c3..12f2c9f5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -104,7 +104,7 @@ jobs: build-msvc-2019: if: ${{ false }} # TODO(#366) - disable for now name: msvc-2019 - runs-on: windows-2019 + runs-on: windows-2022 steps: - name: install-ninja run: choco install -y --no-progress ninja From a1c4d4c707b2abe41905832d6ba0ae0f880a0a60 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 17:51:59 +0200 Subject: [PATCH 69/77] chore(deps): update googlecloudplatform/functions-framework-conformance action to v1.8.6 (#400) --- .github/workflows/coverage.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index acf43903..ca8678b7 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -62,7 +62,7 @@ jobs: go-version: '^1.16' - name: Run Cloud Event conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.3 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.6 with: functionType: 'cloudevent' useBuildpacks: false @@ -70,7 +70,7 @@ jobs: cmd: '${{runner.workspace}}/build/google/cloud/functions/integration_tests/cloud_event_conformance' - name: Run HTTP conformance tests - uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.3 + uses: GoogleCloudPlatform/functions-framework-conformance/action@v1.8.6 with: functionType: 'http' useBuildpacks: false @@ -78,8 +78,7 @@ jobs: cmd: '${{runner.workspace}}/build/google/cloud/functions/integration_tests/http_conformance' - name: coverage-upload - working-directory: ${{runner.workspace}} - env: - CODECOV_TOKEN: ${{secrets.CODECOV_TOKEN}} - run: > - /bin/bash <(curl -s https://codecov.io/bash) -X coveragepy -x /usr/bin/gcov + uses: codecov/codecov-action@v4 + with: + directory: ${{ runner.workspace }} + token: ${{ vars.CODECOV_TOKEN }} From 6c3524eaf22c69d54e4aba4e59a804c36952594c Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 18:43:47 +0200 Subject: [PATCH 70/77] chore(deps): update actions/checkout action to v4 (#405) --- .github/workflows/build.yaml | 8 ++++---- .github/workflows/coverage.yaml | 2 +- .github/workflows/install.yaml | 4 ++-- .github/workflows/style.yaml | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 12f2c9f5..2d103db4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -15,7 +15,7 @@ jobs: steps: - name: install ninja run: sudo apt install ninja-build - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: clone-vcpkg working-directory: "${{runner.temp}}" run: > @@ -63,7 +63,7 @@ jobs: steps: - name: install ninja run: sudo apt install ninja-build - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: cache-vcpkg id: cache-vcpkg uses: actions/cache@v4 @@ -132,7 +132,7 @@ jobs: restore-keys: | vcpkg-${{ env.vcpkg_SHA }}-build-msvc-2019-2- - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: ilammy/msvc-dev-cmd@v1 - name: configure run: | @@ -159,7 +159,7 @@ jobs: steps: - name: install ninja run: brew install ninja - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: clone-vcpkg working-directory: "${{runner.temp}}" run: > diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index ca8678b7..154a16bb 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -15,7 +15,7 @@ jobs: steps: - name: install tools run: sudo apt install ninja-build lcov - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: clone-vcpkg working-directory: "${{runner.temp}}" run: > diff --git a/.github/workflows/install.yaml b/.github/workflows/install.yaml index ad195add..604b6fc3 100644 --- a/.github/workflows/install.yaml +++ b/.github/workflows/install.yaml @@ -12,7 +12,7 @@ jobs: steps: - name: install-dependencies run: sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev libabsl-dev - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: configure run: > cmake -S . -B ${{runner.temp}}/build -GNinja -DBUILD_TESTING=OFF @@ -37,7 +37,7 @@ jobs: - name: install-dependencies run: > sudo apt install ninja-build libboost-dev libboost-program-options-dev nlohmann-json3-dev libabsl-dev - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: configure run: > cmake -S . -B ${{runner.temp}}/build -GNinja diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index a68df7aa..3e492920 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -13,7 +13,7 @@ jobs: name: clang-format runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: clang-format run: > git ls-files -z -- '*.h' '*.cc' | @@ -25,7 +25,7 @@ jobs: name: cmake-format runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: install cmake-format run: pip install cmakelang==0.6.13 - name: cmake-format @@ -39,7 +39,7 @@ jobs: name: generated-files runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: install ninja run: sudo apt install moreutils - name: regenerate-build-examples From dbc2f5a2618c35d7df18a63d3baff92516769562 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 2 May 2024 19:22:40 +0200 Subject: [PATCH 71/77] chore(deps): update gcr.io/kaniko-project/executor docker tag to v1.22.0 (#401) --- ci/cloudbuild/cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index 9e09bfeb..2b941216 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -45,7 +45,7 @@ substitutions: _LOGS_BUCKET: 'cloud-cpp-community-publiclogs' steps: - - name: 'gcr.io/kaniko-project/executor:v1.12.0' + - name: 'gcr.io/kaniko-project/executor:v1.22.0' args: [ '--log-format=text', '--context=dir:///workspace/ci', From 84dc3108ad6d3db6932469ab0011d646deb6bffd Mon Sep 17 00:00:00 2001 From: Darren Bolduc Date: Mon, 20 May 2024 20:44:05 -0400 Subject: [PATCH 72/77] ci: run builds on trusted contribution (#410) --- .github/trusted-contribution.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/trusted-contribution.yml diff --git a/.github/trusted-contribution.yml b/.github/trusted-contribution.yml new file mode 100644 index 00000000..31a45ab2 --- /dev/null +++ b/.github/trusted-contribution.yml @@ -0,0 +1,3 @@ +annotations: + - type: comment + text: "/gcbrun" From 0193df34b0439db13528f6f0e0173c94be7ab6c1 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 21 May 2024 06:14:15 +0200 Subject: [PATCH 73/77] chore(deps): update gcr.io/kaniko-project/executor docker tag to v1.23.0 (#409) --- ci/cloudbuild/cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index 2b941216..f84a5b86 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -45,7 +45,7 @@ substitutions: _LOGS_BUCKET: 'cloud-cpp-community-publiclogs' steps: - - name: 'gcr.io/kaniko-project/executor:v1.22.0' + - name: 'gcr.io/kaniko-project/executor:v1.23.0' args: [ '--log-format=text', '--context=dir:///workspace/ci', From 1a595cc22039647d7af14af35e051eb3bb986c33 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Mon, 10 Jun 2024 17:50:26 +0200 Subject: [PATCH 74/77] chore(deps): update gcr.io/kaniko-project/executor docker tag to v1.23.1 (#411) --- ci/cloudbuild/cloudbuild.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/cloudbuild/cloudbuild.yaml b/ci/cloudbuild/cloudbuild.yaml index f84a5b86..15cf6248 100644 --- a/ci/cloudbuild/cloudbuild.yaml +++ b/ci/cloudbuild/cloudbuild.yaml @@ -45,7 +45,7 @@ substitutions: _LOGS_BUCKET: 'cloud-cpp-community-publiclogs' steps: - - name: 'gcr.io/kaniko-project/executor:v1.23.0' + - name: 'gcr.io/kaniko-project/executor:v1.23.1' args: [ '--log-format=text', '--context=dir:///workspace/ci', From 2e3d900cae927e2d0c77f3e55a66b55bec7c50a3 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Mon, 4 Nov 2024 15:00:50 -0500 Subject: [PATCH 75/77] chore: modernize repo versions and dependencies (#422) --- .github/workflows/build.yaml | 8 +++--- .github/workflows/coverage.yaml | 4 +-- .github/workflows/style.yaml | 2 +- build_scripts/Dockerfile | 24 ++++++++++------- build_scripts/vcpkg-overlays/portfile.cmake | 10 ++++--- build_scripts/vcpkg-overlays/vcpkg.json | 12 +++++++-- ci/build-examples.yaml | 14 ++++++++-- ci/etc/vcpkg-config.sh | 2 +- ci/generate-build-examples.sh | 14 ++++++++-- ci/pack/buildpack/bin/build | 26 ++++++++++++------- .../site/testing_pubsub/pubsub_system_test.cc | 8 +++--- vcpkg.json | 2 +- 12 files changed, 85 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 2d103db4..07b514d5 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "2023.06.20" + vcpkg_SHA: "2024.09.30" jobs: build-ubuntu-focal: @@ -53,7 +53,7 @@ jobs: run: cmake --build "${{runner.temp}}/build" - name: test working-directory: "${{runner.temp}}/build" - run: ctest --output-on-failure --timeout=60s + run: ctest --output-on-failure --timeout 60 # Verify the howto guides compile correctly, they need a special setup to use the # current version of `functions-framework-cpp` through vcpkg. @@ -150,7 +150,7 @@ jobs: run: cmake --build "${{runner.temp}}/build" - name: test working-directory: "${{runner.temp}}/build" - run: ctest --output-on-failure --timeout=60s + run: ctest --output-on-failure --timeout 60 build-macos: if: ${{ false }} # TODO(#367) - disable for now @@ -197,4 +197,4 @@ jobs: run: cmake --build "${{runner.temp}}/build" - name: test working-directory: "${{runner.temp}}/build" - run: ctest --output-on-failure --timeout=60s + run: ctest --output-on-failure --timeout 60 diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index 154a16bb..bd5cab46 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "2023.06.20" + vcpkg_SHA: "2024.09.30" jobs: coverage: @@ -54,7 +54,7 @@ jobs: run: cmake --build ${{runner.workspace}}/build - name: test working-directory: ${{runner.workspace}}/build - run: ctest --output-on-failure --timeout=60s + run: ctest --output-on-failure --timeout 60 - name: Setup Go uses: actions/setup-go@v5 diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 3e492920..dc2ab80e 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "2023.06.20" + vcpkg_SHA: "2024.09.30" jobs: clang-format: diff --git a/build_scripts/Dockerfile b/build_scripts/Dockerfile index 01f9cc36..58ab228c 100644 --- a/build_scripts/Dockerfile +++ b/build_scripts/Dockerfile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM gcr.io/gcp-runtimes/ubuntu_18_0_4 AS parent +FROM gcr.io/gcp-runtimes/ubuntu_20_0_4 AS parent ARG cnb_uid=1000 ARG cnb_gid=1000 @@ -21,18 +21,18 @@ ARG stack_id="google" # Required by python/runtime. RUN apt-get update && apt-get install -y --no-install-recommends \ libexpat1 \ - libffi6 \ + libffi7 \ libmpdec2 \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Required by dotnet/runtime. RUN apt-get update && apt-get install -y --no-install-recommends \ - libicu60 \ + libicu66 \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Required by cpp/runtime. RUN apt-get update \ - && apt-get install -y libc++1-9 \ + && apt-get install -y libc++1-10 libc++abi1-10 \ && apt-get clean && rm -rf /var/lib/apt/lists/* LABEL io.buildpacks.stack.id=${stack_id} @@ -53,10 +53,8 @@ USER cnb FROM parent AS gcf-cpp-incremental-0 RUN apt-get update \ && apt install -y --no-install-recommends \ - build-essential g++-8 gcc-8 git libstdc++-8-dev pkg-config python3 tar unzip zip \ + build-essential git pkg-config python3 tar unzip zip \ && apt-get clean && rm -rf /var/lib/apt/lists/* -RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 \ - && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100 # Install cmake, ninja and vcpkg. The first two are build systems for C++, the # latter is the package manager we use. In an open source builder these would @@ -65,7 +63,10 @@ RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 \ FROM gcf-cpp-incremental-0 AS gcf-cpp-incremental-1 WORKDIR /usr/local -RUN curl -sSL https://github.com/Kitware/CMake/releases/download/v3.19.4/cmake-3.19.4-Linux-x86_64.tar.gz | \ +# Depending on the version of vcpkg, vcpkg may or may not prefer newer versions +# of cmake and will try to download it for every build_example. Instead, make +# sure we have already installed a suitable version of cmake. +RUN curl -sSL https://github.com/Kitware/CMake/releases/download/v3.29.8/cmake-3.29.8-Linux-x86_64.tar.gz | \ tar -xzf - --strip-components=1 RUN curl -sSL https://github.com/ninja-build/ninja/releases/download/v1.10.2/ninja-linux.zip | \ @@ -73,7 +74,9 @@ RUN curl -sSL https://github.com/ninja-build/ninja/releases/download/v1.10.2/nin chmod 755 /usr/local/bin/ninja WORKDIR /usr/local/vcpkg -RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/2023.06.20.tar.gz | \ +# This version of vcpkg should match the version in ci/pack/buildpack/bin/build +# otherwise the contents of the vcpkg cache may not be used. +RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/2024.09.30.tar.gz | \ tar -xzf - --strip-components=1 && \ ./bootstrap-vcpkg.sh -disableMetrics -useSystemBinaries && \ rm -fr toolsrc/build.rel downloads/* @@ -141,6 +144,9 @@ FROM gcf-cpp-incremental-2 AS gcf-cpp-ci-0 COPY . /usr/local/share/gcf RUN find /usr/local/share/gcf -type f | xargs chmod 644 RUN find /usr/local/share/gcf -type d | xargs chmod 755 +# More recent versions of cmake error when attempting to run `configure_file` on +# files owned by root. Changing the owner to user cnb fixes this. +RUN chown -R cnb:cnb /usr/local/share/gcf RUN VCPKG_OVERLAY_PORTS=/usr/local/share/gcf/build_scripts/vcpkg-overlays \ /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug functions-framework-cpp diff --git a/build_scripts/vcpkg-overlays/portfile.cmake b/build_scripts/vcpkg-overlays/portfile.cmake index a9d34c23..1da9e3fa 100644 --- a/build_scripts/vcpkg-overlays/portfile.cmake +++ b/build_scripts/vcpkg-overlays/portfile.cmake @@ -1,10 +1,12 @@ set(SOURCE_PATH "/usr/local/share/gcf") -vcpkg_configure_cmake(SOURCE_PATH ${SOURCE_PATH} PREFER_NINJA - DISABLE_PARALLEL_CONFIGURE OPTIONS -DBUILD_TESTING=OFF) - -vcpkg_install_cmake(ADD_BIN_TO_PATH) +vcpkg_cmake_configure(SOURCE_PATH ${SOURCE_PATH} DISABLE_PARALLEL_CONFIGURE + OPTIONS -DBUILD_TESTING=OFF) +vcpkg_cmake_install(ADD_BIN_TO_PATH) file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/include) +# vcpkg_fixup_cmake_targets is marked as deprecated and vcpkg_cmake_config_fixup +# is listed as its replacement. However, for our purposes, it is not a drop in +# replacement and additional work needs to be done if we are to switch. vcpkg_fixup_cmake_targets(CONFIG_PATH lib/cmake TARGET_PATH share) file(REMOVE_RECURSE ${CURRENT_PACKAGES_DIR}/debug/share) diff --git a/build_scripts/vcpkg-overlays/vcpkg.json b/build_scripts/vcpkg-overlays/vcpkg.json index e78ae9ba..1b35e8b2 100644 --- a/build_scripts/vcpkg-overlays/vcpkg.json +++ b/build_scripts/vcpkg-overlays/vcpkg.json @@ -1,6 +1,6 @@ { "name": "functions-framework-cpp", - "version-string": "0.6.0", + "version-string": "1.2.0", "homepage": "https://github.com/GoogleCloudPlatform/functions-framework-cpp/", "description": "Functions Framework for C++.", "dependencies": [ @@ -8,6 +8,14 @@ "boost-beast", "boost-program-options", "boost-serialization", - "nlohmann-json" + "nlohmann-json", + { + "name": "vcpkg-cmake", + "host": true + }, + { + "name": "vcpkg-cmake-config", + "host": true + } ] } diff --git a/ci/build-examples.yaml b/ci/build-examples.yaml index 02782f5d..fdd24a50 100644 --- a/ci/build-examples.yaml +++ b/ci/build-examples.yaml @@ -1,6 +1,6 @@ # WARNING: DO NOT EDIT THIS FILE # This file is automatically generated by ci/generate-build-examples.sh -timeout: 3600s +timeout: 7200s options: machineType: 'N1_HIGHCPU_32' diskSizeGb: '512' @@ -15,6 +15,7 @@ steps: # Create the docker images for the buildpacks builder. - name: 'gcr.io/kaniko-project/executor:v1.12.0' + id: 'create run-image' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -26,9 +27,11 @@ steps: waitFor: ['-'] timeout: 1800s - name: 'gcr.io/cloud-builders/docker' + id: 'pull run-image' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - name: 'gcr.io/kaniko-project/executor:v1.12.0' + id: 'create build-image' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -38,20 +41,25 @@ steps: "--destination=gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}", ] waitFor: ['-'] - timeout: 1800s + timeout: 3600s - name: 'gcr.io/cloud-builders/docker' + id: 'pull build-image' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}'] # Setup local names for the builder images. - name: 'gcr.io/cloud-builders/docker' + id: 'tag build-image' args: ['tag', 'gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}', 'ci-build-image:latest'] - name: 'gcr.io/cloud-builders/docker' + id: 'tag run-image' args: ['tag', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}', 'ci-run-image:latest'] # Create the buildpacks builder, and make it the default. - name: 'pack' + id: 'create builder' args: ['builder', 'create', 'gcf-cpp-builder:bionic', '--config', 'ci/pack/builder.toml', ] - name: 'pack' + id: 'set builder as trusted' args: ['config', 'trusted-builders', 'add', 'gcf-cpp-builder:bionic', ] - name: 'pack' args: ['config', 'default-builder', 'gcf-cpp-builder:bionic', ] @@ -417,6 +425,7 @@ steps: # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' allowFailure: true + id: 'delete images from this build' entrypoint: 'bash' args: - '-c' @@ -432,6 +441,7 @@ steps: # build does. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' allowFailure: true + id: 'garbage collect old images' waitFor: ['-'] entrypoint: 'bash' args: diff --git a/ci/etc/vcpkg-config.sh b/ci/etc/vcpkg-config.sh index 3871651a..60a84114 100644 --- a/ci/etc/vcpkg-config.sh +++ b/ci/etc/vcpkg-config.sh @@ -23,4 +23,4 @@ fi # include guard # # Common configuration parameters. # -export VCPKG_RELEASE_VERSION="2023.06.20" +export VCPKG_RELEASE_VERSION="2024.09.30" diff --git a/ci/generate-build-examples.sh b/ci/generate-build-examples.sh index 38dda597..93b0605b 100755 --- a/ci/generate-build-examples.sh +++ b/ci/generate-build-examples.sh @@ -18,7 +18,7 @@ set -eu cat <<'_EOF_' # WARNING: DO NOT EDIT THIS FILE # This file is automatically generated by ci/generate-build-examples.sh -timeout: 3600s +timeout: 7200s options: machineType: 'N1_HIGHCPU_32' diskSizeGb: '512' @@ -33,6 +33,7 @@ steps: # Create the docker images for the buildpacks builder. - name: 'gcr.io/kaniko-project/executor:v1.12.0' + id: 'create run-image' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -44,9 +45,11 @@ steps: waitFor: ['-'] timeout: 1800s - name: 'gcr.io/cloud-builders/docker' + id: 'pull run-image' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}'] - name: 'gcr.io/kaniko-project/executor:v1.12.0' + id: 'create build-image' args: [ "--context=dir:///workspace/", "--dockerfile=build_scripts/Dockerfile", @@ -56,20 +59,25 @@ steps: "--destination=gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}", ] waitFor: ['-'] - timeout: 1800s + timeout: 3600s - name: 'gcr.io/cloud-builders/docker' + id: 'pull build-image' args: ['pull', 'gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}'] # Setup local names for the builder images. - name: 'gcr.io/cloud-builders/docker' + id: 'tag build-image' args: ['tag', 'gcr.io/${PROJECT_ID}/ci/build-image:${BUILD_ID}', 'ci-build-image:latest'] - name: 'gcr.io/cloud-builders/docker' + id: 'tag run-image' args: ['tag', 'gcr.io/${PROJECT_ID}/ci/run-image:${BUILD_ID}', 'ci-run-image:latest'] # Create the buildpacks builder, and make it the default. - name: 'pack' + id: 'create builder' args: ['builder', 'create', 'gcf-cpp-builder:bionic', '--config', 'ci/pack/builder.toml', ] - name: 'pack' + id: 'set builder as trusted' args: ['config', 'trusted-builders', 'add', 'gcf-cpp-builder:bionic', ] - name: 'pack' args: ['config', 'default-builder', 'gcf-cpp-builder:bionic', ] @@ -213,6 +221,7 @@ cat <<_EOF_ # Remove the images created by this build. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' allowFailure: true + id: 'delete images from this build' entrypoint: 'bash' args: - '-c' @@ -228,6 +237,7 @@ cat <<_EOF_ # build does. - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' allowFailure: true + id: 'garbage collect old images' waitFor: ['-'] entrypoint: 'bash' args: diff --git a/ci/pack/buildpack/bin/build b/ci/pack/buildpack/bin/build index dce67dde..b6802074 100755 --- a/ci/pack/buildpack/bin/build +++ b/ci/pack/buildpack/bin/build @@ -31,7 +31,9 @@ fi if [[ ! -d "${VCPKG_ROOT}" ]]; then echo "-----> Install vcpkg" mkdir -p "${VCPKG_ROOT}" - curl -sSL https://github.com/Microsoft/vcpkg/archive/2023.06.20.tar.gz | \ + # This version of vcpkg should match the version in build_scripts/Dockerfile + # otherwise the contents of the vcpkg cache may not be used. + curl -sSL https://github.com/Microsoft/vcpkg/archive/2024.09.30.tar.gz | \ tar -C "${VCPKG_ROOT}" -xzf - --strip-components=1 cat >"${VCPKG_ROOT}/triplets/x64-linux-nodebug.cmake" <<_EOF_ set(VCPKG_BUILD_TYPE release) @@ -131,9 +133,9 @@ generate_http_main_no_namespace() { cat <<_EOF_ #include namespace gcf = ::google::cloud::functions; -extern gcf::HttpResponse ${function}(gcf::HttpRequest); +extern gcf::Function ${function}(); int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(${function})); + return gcf::Run(argc, argv, ${function}()); } _EOF_ } @@ -146,10 +148,10 @@ generate_http_main_with_namespace() { #include namespace gcf = ::google::cloud::functions; namespace ${namespace} { - extern gcf::HttpResponse ${function}(gcf::HttpRequest); + extern gcf::Function ${function}(); } // namespace int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserHttpFunction(::${namespace}::${function})); + return gcf::Run(argc, argv, ::${namespace}::${function}()); } _EOF_ } @@ -159,9 +161,9 @@ generate_cloud_event_main_no_namespace() { cat <<_EOF_ #include namespace gcf = ::google::cloud::functions; -extern void ${function}(gcf::CloudEvent); +extern gcf::Function ${function}(); int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(${function})); + return gcf::Run(argc, argv, ${function}()); } _EOF_ } @@ -174,10 +176,10 @@ generate_cloud_event_main_with_namespace() { #include namespace gcf = ::google::cloud::functions; namespace ${namespace} { - extern void ${function}(gcf::CloudEvent); + extern gcf::Function ${function}(); } // namespace int main(int argc, char* argv[]) { - return gcf::Run(argc, argv, gcf::UserCloudEventFunction(::${namespace}::${function})); + return gcf::Run(argc, argv, ::${namespace}::${function}()); } _EOF_ } @@ -266,12 +268,16 @@ cache = true launch = false _EOF_ -/usr/local/bin/cmake -S "${layers}/source" -B "${layers}/binary" -GNinja -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja \ +echo "--> cmake configure" +/usr/local/bin/cmake -S "${layers}/source" -B "${layers}/binary" \ + -GNinja -DCMAKE_MAKE_PROGRAM=/usr/local/bin/ninja \ -DCNB_APP_DIR="${PWD}" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="${layers}/local" \ -DVCPKG_TARGET_TRIPLET="${VCPKG_DEFAULT_TRIPLET}" \ -DCMAKE_TOOLCHAIN_FILE="${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" + +echo "--> cmake build" /usr/local/bin/cmake --build "${layers}/binary" --target install cat >"${layers}/local.toml" <<_EOF_ diff --git a/examples/site/testing_pubsub/pubsub_system_test.cc b/examples/site/testing_pubsub/pubsub_system_test.cc index 97cf512d..2fa05d9a 100644 --- a/examples/site/testing_pubsub/pubsub_system_test.cc +++ b/examples/site/testing_pubsub/pubsub_system_test.cc @@ -13,8 +13,8 @@ // limitations under the License. // [START functions_pubsub_system_test] +#include #include -#include #include #include #include @@ -26,6 +26,7 @@ namespace { namespace bp = ::boost::process; namespace pubsub = ::google::cloud::pubsub; +namespace pubsub_admin = ::google::cloud::pubsub_admin; using ::testing::AnyOf; using ::testing::HasSubstr; @@ -43,9 +44,10 @@ class PubsubSystemTest : public ::testing::Test { // Automatically setup the test environment, create the topic if it does // not exist. - auto admin = pubsub::TopicAdminClient(pubsub::MakeTopicAdminConnection()); + auto admin = pubsub_admin::TopicAdminClient( + pubsub_admin::MakeTopicAdminConnection()); topic_ = pubsub::Topic(project_id, topic_id); - auto topic_metadata = admin.CreateTopic(pubsub::TopicBuilder(topic())); + auto topic_metadata = admin.CreateTopic(topic_.FullName()); // If we get an error other than kAlreadyExists, abort the test. ASSERT_THAT(topic_metadata.status().code(), AnyOf(google::cloud::StatusCode::kOk, diff --git a/vcpkg.json b/vcpkg.json index e43d0c8f..453e222a 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "functions-framework-cpp-dev", - "version-string": "0.6.0", + "version-string": "1.2.0", "homepage": "https://github.com/GoogleCloudPlatform/functions-framework-cpp/", "description": [ "A functions as a service (FaaS) framework for writing portable C++ functions.", From ded5e8997f32ce4c511c5dfc05c40b0a0d9a0312 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Mon, 4 Nov 2024 16:49:58 -0500 Subject: [PATCH 76/77] doc: set gcloud project once in config (#418) --- ci/README.md | 32 ++++++------------- examples/README.md | 10 ++++-- .../site/howto_deploy_cloud_event/README.md | 13 ++++---- .../site/howto_deploy_to_cloud_run/README.md | 10 ++++-- examples/site/testing_pubsub/README.md | 8 +++-- examples/site/testing_storage/README.md | 9 ++++-- 6 files changed, 42 insertions(+), 40 deletions(-) diff --git a/ci/README.md b/ci/README.md index a91e3b7a..301a4c57 100644 --- a/ci/README.md +++ b/ci/README.md @@ -27,8 +27,14 @@ the name of the project you want to use. ## Enable the Services +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + ```sh -gcloud services enable --project="${GOOGLE_CLOUD_PROJECT}" \ +gcloud services enable \ bigtable.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ @@ -44,10 +50,8 @@ gcloud services enable --project="${GOOGLE_CLOUD_PROJECT}" \ ## Create Pub/Sub Topics ```sh -gcloud pubsub topics create testing \ - --project="${GOOGLE_CLOUD_PROJECT}" -gcloud pubsub topics create gcs-changes \ - --project="${GOOGLE_CLOUD_PROJECT}" +gcloud pubsub topics create testing +gcloud pubsub topics create gcs-changes ``` ## Create a Bucket @@ -77,7 +81,6 @@ Add this service account to the topic:Grant the ```shell gcloud pubsub topics add-iam-policy-binding \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --role="roles/pubsub.publisher" \ --member="serviceAccount:${GCS_SA}" \ gcs-changes @@ -98,7 +101,6 @@ readonly SA_ID="eventarc-trigger-sa" readonly SA_NAME="${SA_ID}@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" gcloud iam service-accounts create "${SA_ID}" \ - "--project=${GOOGLE_CLOUD_PROJECT}" \ --description="Event Arg Triggers" ``` @@ -158,7 +160,6 @@ Create a Cloud Run deployment running the hello world example: ```sh gcloud run deploy gcf-hello-world-http \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-http:latest" \ --region="us-central1" \ --platform="managed" \ @@ -169,7 +170,6 @@ Test it by sending a request with `curl(1)`: ```sh HTTP_SERVICE_URL=$(gcloud run services describe \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --platform="managed" \ --region="us-central1" \ --format="value(status.url)" \ @@ -185,7 +185,6 @@ triggers: ```sh gcloud run deploy gcf-hello-world-pubsub \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub:latest" \ --region="us-central1" \ --platform="managed" \ @@ -199,7 +198,6 @@ PROJECT_NUMBER="$(gcloud projects list \ --filter="PROJECT_ID=${GOOGLE_CLOUD_PROJECT}" \ --format="value(project_number)")" gcloud beta eventarc triggers create gcf-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --destination-run-service="gcf-hello-world-pubsub" \ --destination-run-region="us-central1" \ @@ -210,7 +208,6 @@ Test by sending a message to the right topic: ```sh TOPIC=$(gcloud beta eventarc triggers describe gcf-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --format="value(transport.pubsub.topic)") NONCE=$(date +%s)-${RANDOM} @@ -221,7 +218,6 @@ And then verify this message shows up in the log: ```sh gcloud logging read \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --format="value(textPayload)" \ "resource.type=cloud_run_revision AND resource.labels.service_name=gcf-hello-world-pubsub AND logName:stdout" ``` @@ -233,7 +229,6 @@ triggers: ```sh gcloud run deploy gcf-hello-world-storage \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage:latest" \ --region="us-central1" \ --platform="managed" \ @@ -244,7 +239,6 @@ Create a trigger for Cloud Storage events: ```sh gcloud beta eventarc triggers create gcf-hello-world-storage-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --destination-run-service="gcf-hello-world-storage" \ --destination-run-region="us-central1" \ @@ -257,7 +251,6 @@ And then verify this message shows up in the log: ```sh gcloud logging read \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --format="value(textPayload)" \ "resource.type=cloud_run_revision AND resource.labels.service_name=gcf-hello-world-storage AND logName:stdout" ``` @@ -268,7 +261,6 @@ Finally verify this works by running the Cloud Build: ```sh gcloud builds submit \ - "--project=${GOOGLE_CLOUD_PROJECT}" \ "--substitutions=SHORT_SHA=$(git rev-parse --short HEAD)" \ "--config=ci/build-examples.yaml" ``` @@ -314,13 +306,11 @@ pack build -v \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-bigtable" docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-bigtable" gcloud run deploy gcf-tutorial-cloud-bigtable \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-bigtable:latest" \ --region="us-central1" \ --platform="managed" \ --allow-unauthenticated BIGTABLE_SERVICE_URL=$(gcloud run services describe \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --platform="managed" \ --region="us-central1" \ --format="value(status.url)" \ @@ -333,7 +323,7 @@ curl -H "projectID: ${GOOGLE_CLOUD_PROJECT}" -H "instanceID: test-instance-0" -H Create the instance: ```shell -gcloud --project="${GOOGLE_CLOUD_PROJECT}" spanner instances create test-instance-0 \ +gcloud spanner instances create test-instance-0 \ --config="regional-us-central1" \ --description="Test instance for CI builds" \ --nodes=1 @@ -358,14 +348,12 @@ pack build -v \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-spanner" docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-spanner" gcloud run deploy gcf-tutorial-cloud-spanner \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-tutorial-cloud-spanner:latest" \ --region="us-central1" \ --platform="managed" \ --set-env-vars=GOOGLE_CLOUD_PROJECT="${GOOGLE_CLOUD_PROJECT}",SPANNER_INSTANCE=test-instance-0,SPANNER_DATABASE=test-db \ --allow-unauthenticated SPANNER_SERVICE_URL=$(gcloud run services describe \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --platform="managed" \ --region="us-central1" \ --format="value(status.url)" \ diff --git a/examples/README.md b/examples/README.md index c3ad8448..65ac5666 100644 --- a/examples/README.md +++ b/examples/README.md @@ -80,7 +80,7 @@ docker kill ${ID} ## Deploying to Cloud Run This example assumes that `GOOGLE_CLOUD_PROJECT` is set to a GCP project with -the right services enabled: +the correct services enabled: ```sh GOOGLE_CLOUD_PROJECT=... # use a real project @@ -102,11 +102,16 @@ Push this image to Google Container Registry: docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-world:latest ``` +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + Deploy this application to Cloud Run: ```sh gcloud run deploy gcf-cpp-hello \ - "--project=${GOOGLE_CLOUD_PROJECT}" \ "--image=gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-world:latest" \ "--region=${GOOGLE_CLOUD_REGION}" \ "--platform=managed" \ @@ -117,7 +122,6 @@ Fetch the service URL: ```bash SERVICE_URL=$(gcloud run services list \ - "--project=${GOOGLE_CLOUD_PROJECT}" \ "--platform=managed" \ '--format=csv[no-heading](URL)' \ "--filter=SERVICE:gcf-cpp-hello") diff --git a/examples/site/howto_deploy_cloud_event/README.md b/examples/site/howto_deploy_cloud_event/README.md index 653252ca..cc68cd5f 100644 --- a/examples/site/howto_deploy_cloud_event/README.md +++ b/examples/site/howto_deploy_cloud_event/README.md @@ -117,9 +117,14 @@ To deploy this image in Cloud Run use this command. You need to select a Cloud Run region for your deployment. We will use `us-central1` in this guide: +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + ```shell gcloud run deploy gcf-cpp-hello-world-pubsub \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-pubsub:latest" \ --region="us-central1" \ --platform="managed" \ @@ -130,7 +135,6 @@ Verify unauthenticated requests are allowed: ```shell gcloud run services get-iam-policy gcf-cpp-hello-world-pubsub \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --region="us-central1" \ --platform="managed" ``` @@ -152,7 +156,6 @@ proceed run this command (maybe with an addition `--topic-transport` option): ```shell gcloud beta eventarc triggers create gcf-cpp-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --destination-run-service="gcf-cpp-hello-world-pubsub" \ --destination-run-region="us-central1" \ @@ -163,7 +166,6 @@ Find out what topic is used to this new trigger: ```shell TOPIC=$(gcloud beta eventarc triggers describe gcf-cpp-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --format="value(transport.pubsub.topic)") ``` @@ -181,7 +183,6 @@ to verify the Pub/Sub message was received: ```shell gcloud logging read \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --format="value(textPayload)" \ "resource.type=cloud_run_revision AND resource.labels.service_name=gcf-cpp-hello-world-pubsub AND logName:stdout" # Output: Hello Event @@ -193,7 +194,6 @@ Delete the trigger: ```shell gcloud beta eventarc triggers delete gcf-cpp-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" ``` @@ -201,7 +201,6 @@ Delete the Cloud Run deployment: ```sh gcloud run services delete gcf-cpp-hello-world-pubsub \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --region="us-central1" \ --platform="managed" ``` diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index 897392fd..c1642ae9 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -119,9 +119,15 @@ To deploy this image in Cloud Run use this command. You need to select a Cloud Run region for your deployment. We will use `us-central1` in this guide: +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + + ```sh gcloud run deploy gcf-cpp-hello-world-http \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-http:latest" \ --region="us-central1" \ --platform="managed" \ @@ -134,7 +140,6 @@ Find out what URL was assigned to your function, and use `curl` to send a reques ```shell HTTP_SERVICE_URL=$(gcloud run services describe \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --platform="managed" \ --region="us-central1" \ --format="value(status.url)" \ @@ -150,7 +155,6 @@ Delete the Cloud Run deployment: ```sh gcloud run services delete gcf-cpp-hello-world-http \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --region="us-central1" \ --platform="managed" ``` diff --git a/examples/site/testing_pubsub/README.md b/examples/site/testing_pubsub/README.md index 2bcd6958..d572b754 100644 --- a/examples/site/testing_pubsub/README.md +++ b/examples/site/testing_pubsub/README.md @@ -80,12 +80,17 @@ pack build \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub" ``` +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + Deploy this function to Cloud Run: ```shell docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub" gcloud run deploy gcf-hello-world-storage \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-pubsub:latest" \ --region="us-central1" \ --platform="managed" \ @@ -96,7 +101,6 @@ Setup a Pub/Sub trigger: ```shell gcloud beta eventarc triggers create gcf-hello-world-pubsub-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --destination-run-service="gcf-hello-world-pubsub" \ --destination-run-region="us-central1" \ diff --git a/examples/site/testing_storage/README.md b/examples/site/testing_storage/README.md index a0aff3a5..2a4a8ec8 100644 --- a/examples/site/testing_storage/README.md +++ b/examples/site/testing_storage/README.md @@ -73,12 +73,17 @@ pack build \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage" ``` +Set the active project: + +```sh +gcloud config set project ${GOOGLE_CLOUD_PROJECT} +``` + Then deploy this function to Cloud Run: ```shell docker push "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage" gcloud run deploy gcf-hello-world-storage \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-hello-world-storage:latest" \ --region="us-central1" \ --platform="managed" \ @@ -105,7 +110,6 @@ topic: ```shell gcloud beta eventarc triggers create gcf-hello-world-storage-trigger \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --location="us-central1" \ --destination-run-service="gcf-hello-world-storage" \ --destination-run-region="us-central1" \ @@ -129,7 +133,6 @@ Remember to remove your deployment and the image once you have finished: ```sh gcloud run services delete gcf-cpp-hello-world-storage \ - --project="${GOOGLE_CLOUD_PROJECT}" \ --region="us-central1" \ --platform="managed" gcloud container images delete \ From 3df97eb4fab12bf0bbf9427ee73ddf42fbe4bac2 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Mon, 4 Nov 2024 17:12:22 -0500 Subject: [PATCH 77/77] doc: fix spacing (#423) --- examples/site/howto_deploy_to_cloud_run/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index c1642ae9..09622bdd 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -125,7 +125,6 @@ Set the active project: gcloud config set project ${GOOGLE_CLOUD_PROJECT} ``` - ```sh gcloud run deploy gcf-cpp-hello-world-http \ --image="gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-http:latest" \

+2&=(aeq%#&;<(oX4*7 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 Date: Fri, 7 Jul 2023 12:59:26 -0400 Subject: [PATCH 54/77] docs: ask customers to follow the released instructions (#386) From time-to-time we need to update the instructions in the development branch to match the next release. That may invalidate the instructions if they are used with older releases. Put a warning in the "How-to" guides to avoid the problem. --- examples/howto_use_legacy_code/README.md | 8 ++++- .../site/howto_create_container/README.md | 7 +++++ .../site/howto_deploy_cloud_event/README.md | 11 +++++++ .../site/howto_deploy_to_cloud_run/README.md | 29 +++++++++++++------ .../site/howto_local_development/README.md | 7 +++++ 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/examples/howto_use_legacy_code/README.md b/examples/howto_use_legacy_code/README.md index 5b3e7e11..f3d9d3d9 100644 --- a/examples/howto_use_legacy_code/README.md +++ b/examples/howto_use_legacy_code/README.md @@ -14,7 +14,11 @@ any external tool to compile some code. Often this function also downloads the code from some external repository, but it can use code in your source tree. -[ExternalProject_Add]: https://cmake.org/cmake/help/latest/module/ExternalProject.html +> **WARNING:** The development version of this document may not work with the +> released version of the functions framework. Please use this document as it +> appears in the [corresponding release][github-releases] if you are using a +> released version of the library. In particular, buildpacks use the latest +> release. ## Installing Dependencies @@ -146,3 +150,5 @@ You can just interrupt (`Ctrl-C`) the program to terminate it. [vcpkg-install]: https://github.com/microsoft/vcpkg#getting-started [cmake]: https://cmake.org [cmake-install]: https://cmake.org/install/ +[ExternalProject_Add]: https://cmake.org/cmake/help/latest/module/ExternalProject.html +[github-releases]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases diff --git a/examples/site/howto_create_container/README.md b/examples/site/howto_create_container/README.md index 34e8818f..d4d7ca10 100644 --- a/examples/site/howto_create_container/README.md +++ b/examples/site/howto_create_container/README.md @@ -3,6 +3,12 @@ This guide shows you how to create a container image for an example function, and how to run said image in a local container on your workstation. +> **WARNING:** The development version of this document may not work with the +> released version of the functions framework. Please use this document as it +> appears in the [corresponding release][github-releases] if you are using a +> released version of the library. In particular, buildpacks use the latest +> release. + ## Pre-requisites Verify the [docker tool][docker] is functional on your workstation: @@ -132,3 +138,4 @@ docker image rm gcf-cpp-hello-world-http [sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ [pack-install]: https://buildpacks.io/docs/install-pack/ [Google Cloud buildpack]: https://github.com/GoogleCloudPlatform/buildpacks +[github-releases]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases diff --git a/examples/site/howto_deploy_cloud_event/README.md b/examples/site/howto_deploy_cloud_event/README.md index 80c1b6c2..653252ca 100644 --- a/examples/site/howto_deploy_cloud_event/README.md +++ b/examples/site/howto_deploy_cloud_event/README.md @@ -1,5 +1,14 @@ # How-to Guide: Deploy a C++ Pub/Sub function to Cloud Run +This guide shows how to deploy a C++ function consuming cloud events to +[Cloud Run]. + +> **WARNING:** The development version of this document may not work with the +> released version of the functions framework. Please use this document as it +> appears in the [corresponding release][github-releases] if you are using a +> released version of the library. In particular, buildpacks use the latest +> release. + ## Pre-requisites This guide assumes you are familiar with Google Cloud, and that you have a GCP @@ -215,3 +224,5 @@ gcloud container images delete \ [pack-install]: https://buildpacks.io/docs/install-pack/ [gcloud-eventarc-create]: https://cloud.google.com/sdk/gcloud/reference/beta/eventarc/triggers/create [Google Cloud buildpack]: https://github.com/GoogleCloudPlatform/buildpacks +[Cloud Run]: https://cloud.google.com/run +[github-releases]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases diff --git a/examples/site/howto_deploy_to_cloud_run/README.md b/examples/site/howto_deploy_to_cloud_run/README.md index ec58f57d..897392fd 100644 --- a/examples/site/howto_deploy_to_cloud_run/README.md +++ b/examples/site/howto_deploy_to_cloud_run/README.md @@ -1,14 +1,13 @@ # How-to Guide: Deploy your function to Cloud Run -[repository-gh]: https://github.com/GoogleCloudPlatform/functions-framework-cpp -[howto-create-container]: /examples/site/howto_create_container/README.md -[cloud-run-quickstarts]: https://cloud.google.com/run/docs/quickstarts -[gcp-quickstarts]: https://cloud.google.com/resource-manager/docs/creating-managing-projects -[buildpacks]: https://buildpacks.io -[docker]: https://docker.com/ -[docker-install]: https://store.docker.com/search?type=edition&offering=community -[sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ -[pack-install]: https://buildpacks.io/docs/install-pack/ +This guide shows how to deploy a C++ function handling HTTP requests to +[Cloud Run]. + +> **WARNING:** The development version of this document may not work with the +> released version of the functions framework. Please use this document as it +> appears in the [corresponding release][github-releases] if you are using a +> released version of the library. In particular, buildpacks use the latest +> release. ## Pre-requisites @@ -162,3 +161,15 @@ And the container image: gcloud container images delete \ "gcr.io/${GOOGLE_CLOUD_PROJECT}/gcf-cpp-hello-world-http:latest" ``` + +[repository-gh]: https://github.com/GoogleCloudPlatform/functions-framework-cpp +[howto-create-container]: /examples/site/howto_create_container/README.md +[cloud-run-quickstarts]: https://cloud.google.com/run/docs/quickstarts +[gcp-quickstarts]: https://cloud.google.com/resource-manager/docs/creating-managing-projects +[buildpacks]: https://buildpacks.io +[docker]: https://docker.com/ +[docker-install]: https://store.docker.com/search?type=edition&offering=community +[sudoless docker]: https://docs.docker.com/engine/install/linux-postinstall/ +[pack-install]: https://buildpacks.io/docs/install-pack/ +[Cloud Run]: https://cloud.google.com/run +[github-releases]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases diff --git a/examples/site/howto_local_development/README.md b/examples/site/howto_local_development/README.md index 2792bcaf..bbb8a47c 100644 --- a/examples/site/howto_local_development/README.md +++ b/examples/site/howto_local_development/README.md @@ -4,6 +4,12 @@ This guide describes how to compile and run a function locally. This can be useful when writing unit test, or to accelerate the edit -> compile -> test cycle. +> **WARNING:** The development version of this document may not work with the +> released version of the functions framework. Please use this document as it +> appears in the [corresponding release][github-releases] if you are using a +> released version of the library. In particular, buildpacks use the latest +> release. + ## Installing Dependencies Because the Functions Framework for C++ uses C++17, you will need a working C++ @@ -134,3 +140,4 @@ You can just interrupt (`Ctrl-C`) the program to terminate it. [vcpkg-install]: https://github.com/microsoft/vcpkg#getting-started [cmake]: https://cmake.org [cmake-install]: https://cmake.org/install/ +[github-releases]: https://github.com/GoogleCloudPlatform/functions-framework-cpp/releases From 4203783f34890eb084b9882a59d97b6d95ad4a44 Mon Sep 17 00:00:00 2001 From: Carlos O'Ryan Date: Fri, 7 Jul 2023 16:40:21 -0400 Subject: [PATCH 55/77] ci: update vcpkg version (#387) --- .github/workflows/build.yaml | 2 +- .github/workflows/coverage.yaml | 2 +- .github/workflows/sanitize.yaml | 2 +- .github/workflows/style.yaml | 2 +- CMakeLists.txt | 6 +--- build_scripts/Dockerfile | 32 +++++++++--------- ...nctions_framework_cpp.expected.abi.dump.gz | Bin 106320 -> 106305 bytes .../dockerfiles/fedora-34.Dockerfile | 3 ++ ci/etc/vcpkg-config.sh | 2 +- ci/pack/buildpack/bin/build | 2 +- .../site/testing_pubsub/pubsub_system_test.cc | 3 +- examples/site/tips_gcp_apis/tips_gcp_apis.cc | 2 +- .../tutorial_cloud_bigtable.cc | 7 ++-- google/cloud/functions/CMakeLists.txt | 6 ++-- 14 files changed, 35 insertions(+), 36 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index df09849e..21623aa4 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" + vcpkg_SHA: "2023.06.20" jobs: build-ubuntu-focal: diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index a22257f2..fec6da13 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" + vcpkg_SHA: "2023.06.20" jobs: coverage: diff --git a/.github/workflows/sanitize.yaml b/.github/workflows/sanitize.yaml index bed854c7..f4661ba8 100644 --- a/.github/workflows/sanitize.yaml +++ b/.github/workflows/sanitize.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" + vcpkg_SHA: "2023.06.20" jobs: sanitized-build: diff --git a/.github/workflows/style.yaml b/.github/workflows/style.yaml index 8cbc9438..5a64ad8a 100644 --- a/.github/workflows/style.yaml +++ b/.github/workflows/style.yaml @@ -6,7 +6,7 @@ on: pull_request: env: - vcpkg_SHA: "dfcd4e4b30799c4ce02fe3939b62576fec444224" + vcpkg_SHA: "2023.06.20" jobs: clang-tidy: diff --git a/CMakeLists.txt b/CMakeLists.txt index cc123fee..75d33464 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,11 +14,7 @@ # limitations under the License. # ~~~ -cmake_minimum_required(VERSION 3.10) - -if (NOT (CMAKE_VERSION VERSION_LESS "3.14")) - cmake_policy(SET CMP0091 NEW) -endif () +cmake_minimum_required(VERSION 3.10...3.26) option(BUILD_TESTING "Enable tests" ON) if (BUILD_TESTING) diff --git a/build_scripts/Dockerfile b/build_scripts/Dockerfile index e0d34072..01f9cc36 100644 --- a/build_scripts/Dockerfile +++ b/build_scripts/Dockerfile @@ -53,7 +53,7 @@ USER cnb FROM parent AS gcf-cpp-incremental-0 RUN apt-get update \ && apt install -y --no-install-recommends \ - build-essential g++-8 gcc-8 git libstdc++-8-dev pkg-config tar unzip zip \ + build-essential g++-8 gcc-8 git libstdc++-8-dev pkg-config python3 tar unzip zip \ && apt-get clean && rm -rf /var/lib/apt/lists/* RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 100 \ && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 100 @@ -73,7 +73,7 @@ RUN curl -sSL https://github.com/ninja-build/ninja/releases/download/v1.10.2/nin chmod 755 /usr/local/bin/ninja WORKDIR /usr/local/vcpkg -RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/dfcd4e4b30799c4ce02fe3939b62576fec444224.tar.gz | \ +RUN curl -sSL https://github.com/Microsoft/vcpkg/archive/2023.06.20.tar.gz | \ tar -xzf - --strip-components=1 && \ ./bootstrap-vcpkg.sh -disableMetrics -useSystemBinaries && \ rm -fr toolsrc/build.rel downloads/* @@ -96,29 +96,29 @@ FROM gcf-cpp-incremental-1 AS gcf-cpp-incremental-2 # These are needed by the Functions Framework, do them one at a time, easier to # rebuild the Docker image if one of them fails to download or something. -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug abseil -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug boost-core -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug openssl -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug boost-program-options -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug boost-asio -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug boost-beast -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug boost-serialization -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug nlohmann-json +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug abseil +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug boost-core +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug openssl +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug boost-program-options +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug boost-asio +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug boost-beast +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug boost-serialization +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug nlohmann-json # The following are not needed by the Functions Framework, but are used often # enough that it is a good idea to make them part of the base development # environment. Note that this automatically pulls abseil, grpc, protobuf, curl, # and a few other libraries. -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug curl -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug protobuf -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug grpc -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug google-cloud-cpp +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug curl +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug protobuf +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug grpc +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug google-cloud-cpp # Warmup the vcpkg cache for `functions-framework-cpp` using the release version # of the framework, this is the recommended path for users of the framework. FROM gcf-cpp-incremental-2 AS gcf-cpp-incremental-3 -RUN /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug functions-framework-cpp +RUN /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug functions-framework-cpp # This is the development image we recommend users create in their workstation. # It includes all the development tools, including cmake, ninja and vcpkg, as @@ -142,7 +142,7 @@ COPY . /usr/local/share/gcf RUN find /usr/local/share/gcf -type f | xargs chmod 644 RUN find /usr/local/share/gcf -type d | xargs chmod 755 RUN VCPKG_OVERLAY_PORTS=/usr/local/share/gcf/build_scripts/vcpkg-overlays \ - /usr/local/vcpkg/vcpkg install --triplet x64-linux-nodebug functions-framework-cpp + /usr/local/vcpkg/vcpkg install --feature-flags=-manifests --triplet x64-linux-nodebug functions-framework-cpp # This is the image used for the CI builds, includes a binary cache of the # *current* version of `functions-framework-cpp`, as well as binary caches of diff --git a/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz b/ci/abi-dumps/functions_framework_cpp.expected.abi.dump.gz index 1f33e3bc226a421a35a1d5171e40b0b3e9dd67e0..14cba8060db36e98d2914c387911f901e2af472e 100644 GIT binary patch literal 106305 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 *zu}n#nRoKACUt}$S-A*ql=1niWMDZ<+ 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