From 3a38024e741af9ccb150f5a13aec8daaeba381b9 Mon Sep 17 00:00:00 2001 From: Frostebite Date: Sun, 26 Mar 2023 03:29:44 +0100 Subject: [PATCH 01/15] Link fix (#380) --- docs/03-github-cloud-runner/03-getting-started/02-aws.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx b/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx index 3c9a2d08..0ff91648 100644 --- a/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx +++ b/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx @@ -87,4 +87,4 @@ combinations: _[Custom Steps](../advanced-topics/custom-jobs/custom-steps)_ A full workflow example can be seen in builder's -[Cloud Runner GitHub sourcecode for AWS Pipeline](https://github.com/game-ci/unity-builder/blob/main/.github/workflows/cloud-runner-aws-pipeline.yml). +[Cloud Runner GitHub sourcecode for GitHub Pipeline](https://github.com/game-ci/unity-builder/blob/309d668d637ae3e7ffe90d61612968db92e1e376/.github/workflows/cloud-runner-pipeline.yml#L109). From 4bedc56df1a17909e611c81f8838c43207c239b2 Mon Sep 17 00:00:00 2001 From: David Finol Date: Sat, 25 Mar 2023 23:27:50 -0500 Subject: [PATCH 02/15] Update steam docs to mention TOTP (#375) * Update steam docs to mention TOTP * Run prettier --- docs/03-github/06-deployment/steam.mdx | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/03-github/06-deployment/steam.mdx b/docs/03-github/06-deployment/steam.mdx index 8a3dbbd8..c5425268 100644 --- a/docs/03-github/06-deployment/steam.mdx +++ b/docs/03-github/06-deployment/steam.mdx @@ -116,10 +116,19 @@ ssfnFileName, and ssfnFileContents with these steps: 1. Use `cat | base64 > ssfn_base64.txt` to encode the contents of the hidden ssfn file. Copy the contents of `ssfn_base64.txt` to a GitHub Secret `STEAM_SSFN_FILE_CONTENTS`. +If your builder account uses MFA through the Steam Guard App, the `steam-deploy` app can use a TOTP +instead of the above configuration. Generating a TOTP is outside the scope of this guide, as it is +simpler to follow the above steps. + ### 5. Additional Configuration You can configure these to better match your use case. +#### totp + +Deploys to Steam using a TOTP. If this is passed, `configVdf`, `ssfnFileName`, and +`ssfnFileContents` are not required. + #### buildDescription The identifier for this specific build, which helps you identify it in steam. From f507feafd91cbbf8d284dffe4a736912c6747fe4 Mon Sep 17 00:00:00 2001 From: Webber Takken Date: Sun, 26 Mar 2023 11:10:15 +0200 Subject: [PATCH 03/15] fix invite (#381) --- firebase.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase.json b/firebase.json index 391f101c..9518e5a1 100644 --- a/firebase.json +++ b/firebase.json @@ -5,7 +5,7 @@ "redirects": [ { "source": "/discord", - "destination": "https://discord.gg/ZjpyhCRd", + "destination": "https://discord.com/invite/WyPN5r9", "type": 301 } ], From 77891b4b0bf7cd029eccdbe74e6c03334fb45b4c Mon Sep 17 00:00:00 2001 From: Frostebite Date: Tue, 28 Mar 2023 00:16:15 +0100 Subject: [PATCH 04/15] Cloud runner 1.0 (#382) * Starting docs cr 1.0 * Delete what_does_cloud_runner_do_basics.png * Update 06-garbage-collection.md * Update 01-command-line.mdx * Update 02-performance.md * Update 06-garbage-collection.md * Update 01-command-line.mdx * Update 01-command-line.mdx * Update 01-command-line.mdx * cleanup * order fix * fix * Update 01-command-line.mdx * rename * cleanup * New format * cleanup * fix * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * updates * updates * Removing point 3 - flexibility and retained workspace of cloud runner mitigates this completely * cleanup * Update 02-retained-workspace.mdx * updates * fix * Update 01-caching.mdx * Update 01-release-branches.mdx * fix * Update 01-command-line.mdx * fix * Update 01-caching.mdx * Update 01-caching.mdx * Update 01-caching.mdx * Update 01-caching.mdx * Update 01-caching.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * reorder "Modes" * Update 02-retained-workspace.mdx * Update 05-API-Reference.mdx * Update 01-command-line.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * Update 05-API-Reference.mdx * More links * Update 01-custom-job.mdx * PR suggestions * PR suggestions * PR suggestions * PR suggestions * customStepFiles rather than customPostStep in getting started examples * cleanup * cleanup * Update 04-api-reference.mdx * Update 04-api-reference.mdx * fix * cleanup * fixes * Update 01-github-checks.mdx --- .../02-getting-started.mdx | 3 + .../01-command-line.mdx | 6 +- .../02-github-examples}/02-aws.mdx | 35 +---- .../02-github-examples/03-kubernetes.mdx | 51 +++++++ .../02-github-examples}/_category_.yaml | 2 +- .../03-examples/_category_.yaml | 5 + .../03-getting-started/03-kubernetes.mdx | 76 ---------- .../04-api-reference.mdx | 51 +++---- .../01-custom-job.mdx | 0 .../03-command-hooks.mdx} | 2 +- .../04-container-hooks.mdx} | 2 +- .../05-premade-container-jobs.mdx} | 2 +- .../04-custom-hooks/_category_.yaml | 5 + .../09-gitlab/01-introduction-gitlab.mdx | 2 +- .../09-gitlab/_category_.yaml | 5 + .../10-github/01-github-checks.mdx | 7 + .../10-github/01-release-branches.mdx | 17 --- .../10-github/09-nested-github-runners.mdx | 140 ------------------ .../10-github/_category_.yaml | 5 + 19 files changed, 117 insertions(+), 299 deletions(-) create mode 100644 docs/03-github-cloud-runner/02-getting-started.mdx rename docs/03-github-cloud-runner/{03-getting-started => 03-examples}/01-command-line.mdx (85%) rename docs/03-github-cloud-runner/{03-getting-started => 03-examples/02-github-examples}/02-aws.mdx (61%) create mode 100644 docs/03-github-cloud-runner/03-examples/02-github-examples/03-kubernetes.mdx rename docs/03-github-cloud-runner/{03-getting-started => 03-examples/02-github-examples}/_category_.yaml (69%) create mode 100644 docs/03-github-cloud-runner/03-examples/_category_.yaml delete mode 100644 docs/03-github-cloud-runner/03-getting-started/03-kubernetes.mdx rename docs/03-github-cloud-runner/06-advanced-topics/{04-custom-jobs => 04-custom-hooks}/01-custom-job.mdx (100%) rename docs/03-github-cloud-runner/06-advanced-topics/{04-custom-jobs/03-custom-hooks.mdx => 04-custom-hooks/03-command-hooks.mdx} (92%) rename docs/03-github-cloud-runner/06-advanced-topics/{04-custom-jobs/04-custom-steps.mdx => 04-custom-hooks/04-container-hooks.mdx} (94%) rename docs/03-github-cloud-runner/06-advanced-topics/{04-custom-jobs/05-premade-steps.mdx => 04-custom-hooks/05-premade-container-jobs.mdx} (96%) create mode 100644 docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/_category_.yaml create mode 100644 docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/_category_.yaml create mode 100644 docs/03-github-cloud-runner/06-advanced-topics/10-github/01-github-checks.mdx delete mode 100644 docs/03-github-cloud-runner/06-advanced-topics/10-github/01-release-branches.mdx delete mode 100644 docs/03-github-cloud-runner/06-advanced-topics/10-github/09-nested-github-runners.mdx create mode 100644 docs/03-github-cloud-runner/06-advanced-topics/10-github/_category_.yaml diff --git a/docs/03-github-cloud-runner/02-getting-started.mdx b/docs/03-github-cloud-runner/02-getting-started.mdx new file mode 100644 index 00000000..7e12cfdf --- /dev/null +++ b/docs/03-github-cloud-runner/02-getting-started.mdx @@ -0,0 +1,3 @@ +# Getting Started + +To get quickly started checkout one of our examples: diff --git a/docs/03-github-cloud-runner/03-getting-started/01-command-line.mdx b/docs/03-github-cloud-runner/03-examples/01-command-line.mdx similarity index 85% rename from docs/03-github-cloud-runner/03-getting-started/01-command-line.mdx rename to docs/03-github-cloud-runner/03-examples/01-command-line.mdx index 4dec4bd9..cc1afb5e 100644 --- a/docs/03-github-cloud-runner/03-getting-started/01-command-line.mdx +++ b/docs/03-github-cloud-runner/03-examples/01-command-line.mdx @@ -1,4 +1,6 @@ -# Command Line (Preview) +# Command Line + +_Preview Support Only_ You can install Game CI locally and start cloud runner jobs from the command line or by integrating your own tools. All parameters in [API Reference](../api-reference) can be specified as command line @@ -43,5 +45,5 @@ This enables you to provide a command to pull input, e.g you can pull from a fil manager. ```bash -yarn run cli --populateOverride true --readInputFromOverrideList UNITY_EMAIL,UNITY_SERIAL,UNITY_PASSWORD --readInputOverrideCommand="gcloud secrets versions access 1 --secret=\"{0}\"" +yarn run cli --populateOverride true --pullInputList UNITY_EMAIL,UNITY_SERIAL,UNITY_PASSWORD --inputPullCommand="gcloud secrets versions access 1 --secret=\"{0}\"" ``` diff --git a/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx b/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx similarity index 61% rename from docs/03-github-cloud-runner/03-getting-started/02-aws.mdx rename to docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx index 0ff91648..2317f92f 100644 --- a/docs/03-github-cloud-runner/03-getting-started/02-aws.mdx +++ b/docs/03-github-cloud-runner/03-examples/02-github-examples/02-aws.mdx @@ -1,4 +1,4 @@ -# GitHub Actions - AWS +# AWS ## Requirements @@ -28,7 +28,7 @@ _Note:_ _This enables Cloud Runner access AWS._ ## Configuration For AWS Cloud Runner Jobs -Refer to [Configuration page](../api-reference) or the [example below](#example). +Refer to [Configuration page](../../api-reference) or the [example below](#example). ### Allowed CPU/Memory Combinations @@ -54,37 +54,18 @@ combinations: ```yaml - uses: game-ci/unity-builder@cloud-runner-develop id: aws-fargate-unity-build - timeout-minutes: 25 with: - cloudRunnerCluster: aws + providerStrategy: aws versioning: None - projectPath: ${{ matrix.projectPath }} - unityVersion: ${{ matrix.unityVersion }} + projectPath: `your path here` + unityVersion: `unity version here` targetPlatform: ${{ matrix.targetPlatform }} gitPrivateToken: ${{ secrets.GITHUB_TOKEN }} - # You may want to export your builds somewhere external so you can access them outside of Cloud Runner jobs via the postBuildSteps: - postBuildSteps: | - - name: upload - image: amazon/aws-cli - commands: | - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID --profile default - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY --profile default - aws configure set region $AWS_DEFAULT_REGION --profile default - aws s3 ls - aws s3 ls game-ci-test-storage - ls /data/cache/$CACHE_KEY - ls /data/cache/$CACHE_KEY/build - aws s3 cp /data/cache/$CACHE_KEY/build/build-$BUILD_GUID.zip s3://game-ci-test-storage/$CACHE_KEY/build-$BUILD_GUID.zip - secrets: - - name: awsAccessKeyId - value: ${{ secrets.AWS_ACCESS_KEY_ID }} - - name: awsSecretAccessKey - value: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: awsDefaultRegion - value: eu-west-2 + # You may want to export your builds somewhere external so you can access it: + containerHookFiles: aws-s3-upload-build ``` -_[Custom Steps](../advanced-topics/custom-jobs/custom-steps)_ +_[Custom Steps](../../advanced-topics/custom-hooks/container-hooks)_ A full workflow example can be seen in builder's [Cloud Runner GitHub sourcecode for GitHub Pipeline](https://github.com/game-ci/unity-builder/blob/309d668d637ae3e7ffe90d61612968db92e1e376/.github/workflows/cloud-runner-pipeline.yml#L109). diff --git a/docs/03-github-cloud-runner/03-examples/02-github-examples/03-kubernetes.mdx b/docs/03-github-cloud-runner/03-examples/02-github-examples/03-kubernetes.mdx new file mode 100644 index 00000000..fe1f4a56 --- /dev/null +++ b/docs/03-github-cloud-runner/03-examples/02-github-examples/03-kubernetes.mdx @@ -0,0 +1,51 @@ +# Kubernetes + +## Requirements + +- You must have a Kuberentes cluster setup and ready that supports persistent volumes. +- Create a kubeconfig and encode it as base64. + +## K8s Credentials + +Setup the following as `env` variables for the GitHub build step: + +- `kubeConfig` (should be encoded as base64) + +## Configuration For Kubernetes Cloud Runner Jobs + +Refer to [Configuration page](../../api-reference) or the [example below](#example). + +### Allowed CPU/Memory Combinations + +- `0.25 vCPU` - 0.5 GB, 1 GB, 2 GB +- `0.5 vCPU` - 1 GB, 2 GB, 3 GB, 4 GB +- `1 vCPU` - 2 GB, 3 GB, 4 GB, 5 GB, 6 GB, 7 GB, 8 GB +- `2 vCPU` - Between 4 GB and 16 GB in 1-GB increments +- `4 vCPU` - Between 8 GB and 30 GB in 1-GB increments + +#### Summary Of Format + +- Values are represented as 1024:1 GB or CPU. + +Do not include the vCPU or GB suffix. + +### Example + +```yaml +- uses: game-ci/unity-builder@cloud-runner-develop + id: k8s-unity-build + with: + providerStrategy: k8s + versioning: None + projectPath: `your path here` + unityVersion: `unity version here` + targetPlatform: ${{ matrix.targetPlatform }} + gitPrivateToken: ${{ secrets.GITHUB_TOKEN }} + # You may want to export your builds somewhere external so you can access it: + containerHookFiles: aws-s3-upload-build +``` + +_[Custom Steps](../../advanced-topics/custom-hooks/container-hooks)_ + +A full workflow example can be seen in builder's +[Cloud Runner GitHub sourcecode for AWS Pipeline](https://github.com/game-ci/unity-builder/blob/main/.github/workflows/cloud-runner-k8s-pipeline.yml). diff --git a/docs/03-github-cloud-runner/03-getting-started/_category_.yaml b/docs/03-github-cloud-runner/03-examples/02-github-examples/_category_.yaml similarity index 69% rename from docs/03-github-cloud-runner/03-getting-started/_category_.yaml rename to docs/03-github-cloud-runner/03-examples/02-github-examples/_category_.yaml index fff34d89..b9807118 100644 --- a/docs/03-github-cloud-runner/03-getting-started/_category_.yaml +++ b/docs/03-github-cloud-runner/03-examples/02-github-examples/_category_.yaml @@ -1,5 +1,5 @@ --- position: 2.0 -label: Getting started +label: GitHub collapsible: true collapsed: true diff --git a/docs/03-github-cloud-runner/03-examples/_category_.yaml b/docs/03-github-cloud-runner/03-examples/_category_.yaml new file mode 100644 index 00000000..825e328f --- /dev/null +++ b/docs/03-github-cloud-runner/03-examples/_category_.yaml @@ -0,0 +1,5 @@ +--- +position: 2.0 +label: Examples +collapsible: true +collapsed: true diff --git a/docs/03-github-cloud-runner/03-getting-started/03-kubernetes.mdx b/docs/03-github-cloud-runner/03-getting-started/03-kubernetes.mdx deleted file mode 100644 index e04a5706..00000000 --- a/docs/03-github-cloud-runner/03-getting-started/03-kubernetes.mdx +++ /dev/null @@ -1,76 +0,0 @@ -# GitHub Actions - Kubernetes - -## Requirements - -- You must have a Kuberentes cluster setup and ready that supports persistent volumes. -- Create a kubeconfig and encode it as base64. - -## K8s Credentials - -Setup the following as `env` variables for the GitHub build step: - -- `kubeConfig` (should be encoded as base64) - -## Configuration For Kubernetes Cloud Runner Jobs - -Refer to [Configuration page](../api-reference) or the [example below](#example). - -### Allowed CPU/Memory Combinations - -- `0.25 vCPU` - 0.5 GB, 1 GB, 2 GB -- `0.5 vCPU` - 1 GB, 2 GB, 3 GB, 4 GB -- `1 vCPU` - 2 GB, 3 GB, 4 GB, 5 GB, 6 GB, 7 GB, 8 GB -- `2 vCPU` - Between 4 GB and 16 GB in 1-GB increments -- `4 vCPU` - Between 8 GB and 30 GB in 1-GB increments - -Do not include the vCPU or GB suffix. - -#### Valid CPU and Memory Values - -```yaml -- remoteBuildMemory: 2 -- remoteBuildCpu: 0.5 -``` - -### Example - -```yaml -- uses: game-ci/unity-builder@cloud-runner-develop - id: k8s-unity-build - timeout-minutes: 30 - with: - cloudRunnerCluster: k8s - UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} - targetPlatform: ${{ matrix.targetPlatform }} - kubeConfig: ${{ steps.read-base64.outputs.base64 }} - gitPrivateToken: ${{ secrets.GITHUB_TOKEN }} - projectPath: test-project - unityVersion: ${{ matrix.unityVersion }} - versioning: None - # Currently kuberentes builds do not save their persistent volumes beyond a cloud runner job. - # So, you may want to export the results to cloud storage with a postBuildStep as follows: - postBuildSteps: | - - name: upload - image: amazon/aws-cli - commands: | - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID --profile default - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY --profile default - aws configure set region $AWS_DEFAULT_REGION --profile default - aws s3 ls - aws s3 ls game-ci-test-storage - ls /data/cache/$CACHE_KEY - echo "/data/cache/$CACHE_KEY/build/build-$BUILD_GUID.zip s3://game-ci-test-storage/$CACHE_KEY/$BUILD_FILE" - aws s3 cp /data/cache/$CACHE_KEY/build/build-$BUILD_GUID.zip s3://game-ci-test-storage/$CACHE_KEY/build-$BUILD_GUID.zip - secrets: - - name: awsAccessKeyId - value: ${{ secrets.AWS_ACCESS_KEY_ID }} - - name: awsSecretAccessKey - value: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: awsDefaultRegion - value: eu-west-2 -``` - -_[Custom Steps](../advanced-topics/custom-jobs/custom-steps)_ - -A full workflow example can be seen in builder's -[Cloud Runner GitHub sourcecode for AWS Pipeline](https://github.com/game-ci/unity-builder/blob/main/.github/workflows/cloud-runner-k8s-pipeline.yml). diff --git a/docs/03-github-cloud-runner/04-api-reference.mdx b/docs/03-github-cloud-runner/04-api-reference.mdx index 9ba2b44e..67a9ee91 100644 --- a/docs/03-github-cloud-runner/04-api-reference.mdx +++ b/docs/03-github-cloud-runner/04-api-reference.mdx @@ -86,15 +86,15 @@ attempt to read them from current directory's git repo (e.g branch, commit SHA, ### Cloud Runner parameters ```bash -cloudRunnerCluster +providerStrategy ``` Specifies the Cloud Provider to use for Cloud Runner jobs. Accepted values: `aws`, `k8s`, `local-docker`. ```bash -- cloudRunnerCpu -- cloudRunnerMemory +- containerCpu +- containerMemory ``` Specifies the CPU and Memory resources to be used for cloud containers created by Cloud Runner. @@ -110,13 +110,16 @@ Specifies the release branch of Cloud Runner to use for remote containers. Accep ### Custom commands from files parameters ```bash -- customStepFiles -- customHookFiles +- containerHookFiles +- commandHookFiles +- commandHooks +- postBuildContainerHooks +- preBuildContainerHooks ``` Specifies the name of custom hook or step files to include in workflow. (Accepted Format: see -"advanced topics / [custom steps](advanced-topics/custom-jobs/custom-steps) + -[custom hooks](advanced-topics/custom-jobs/custom-hooks)") +"[container hooks](advanced-topics/custom-hooks/container-hooks) +[command hooks](advanced-topics/custom-hooks/command-hooks)") ### Custom commands from yaml parameters @@ -125,23 +128,12 @@ customJob ``` Specifies a custom job to override default build workflow. (Accepted Format: see -"[advanced topics / custom job](advanced-topics/custom-jobs/custom-job)") - -```bash -- customJobHooks -- postBuildSteps -- preBuildSteps -``` - -Specify yaml based [hooks](advanced-topics/custom-jobs/custom-hooks) or pre/post build -[steps](advanced-topics/custom-jobs/custom-steps). - -(Accepted Format: see `advanced topics / custom steps + hooks`) +"[advanced topics / custom job](advanced-topics/custom-hooks/custom-job)") ### Configuration Override ```bash -readInputOverrideCommand +inputPullCommand ``` Read parameter from command line ouput, such as a secret manager. Must include a `{0}` to inject the @@ -149,16 +141,16 @@ name of the parameter to pull. (See: [Configuration Override](advanced-topics/configuration-override)) ```bash -readInputFromOverrideList +pullInputList ``` -List of parameters to apply with `readInputOverrideCommand`. (See: +List of parameters to apply with `inputPullCommand`. (See: [Configuration Override](advanced-topics/configuration-override)) ### Aws ```bash -awsBaseStackName +awsStackName ``` Name of the persistent shared base stack, used to store artifacts and caching. @@ -184,21 +176,17 @@ Defaults to branch name. Defines the scope for sharing cache entries. ### Utility ```bash -- cloudRunnerTests || cloudRunnerDebug (Debug logging for Cloud Runner) -- cloudRunnerDebugTree (Logs cloud container file tree) -- cloudRunnerDebugEnv (Logs cloud container envrionment details) -- watchToEnd (do not follow build) -- useSharedLargePackages (Any packages in manifest.json containing phrase "LargePackage" will be +- cloudRunnerDebug (Debug logging for Cloud Runner) +- useLargePackages (Any packages in manifest.json containing phrase "LargePackage" will be redirected to a shared folder for all builds sharing a cache key) - useSharedBuilder (Use a shared clone of Game-CI, saves some storage space and can be used if you're using one release branch of Cloud Runner) -- useLz4Compression (Use Lz4 compression for cache and build artifacts. Enabled by default) +- useCompressionStrategy (Use Lz4 compression for cache and build artifacts. Enabled by default) ``` ### Retained Workspace ```bash -- retainWorkspaces - maxRetainedWorkspaces ``` @@ -208,8 +196,7 @@ entire project folder. ### Garbage Collection ```bash -- constantGarbageCollection -- garbageCollectionMaxAge +- garbageMaxAge ``` ## Command Line Only Parameters diff --git a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/01-custom-job.mdx b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/01-custom-job.mdx similarity index 100% rename from docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/01-custom-job.mdx rename to docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/01-custom-job.mdx diff --git a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/03-custom-hooks.mdx b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/03-command-hooks.mdx similarity index 92% rename from docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/03-custom-hooks.mdx rename to docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/03-command-hooks.mdx index a1e224b9..ee1f2378 100644 --- a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/03-custom-hooks.mdx +++ b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/03-command-hooks.mdx @@ -1,4 +1,4 @@ -# Custom Hooks +# Command Hooks Custom commands can be injected into the standard build workflow via yaml or files. diff --git a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/04-custom-steps.mdx b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/04-container-hooks.mdx similarity index 94% rename from docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/04-custom-steps.mdx rename to docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/04-container-hooks.mdx index 179becd8..6e0a9adc 100644 --- a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/04-custom-steps.mdx +++ b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/04-container-hooks.mdx @@ -1,4 +1,4 @@ -# Custom Steps +# Container Hooks Custom docker container steps can be run as part of the standard build workflow. Custom steps can also be run standalone. diff --git a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/05-premade-steps.mdx b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/05-premade-container-jobs.mdx similarity index 96% rename from docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/05-premade-steps.mdx rename to docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/05-premade-container-jobs.mdx index cdcd2cd5..a87c9586 100644 --- a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-jobs/05-premade-steps.mdx +++ b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/05-premade-container-jobs.mdx @@ -1,4 +1,4 @@ -# Premade Steps +# Premade Container Jobs ## Cache syncronization diff --git a/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/_category_.yaml b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/_category_.yaml new file mode 100644 index 00000000..445f7ab4 --- /dev/null +++ b/docs/03-github-cloud-runner/06-advanced-topics/04-custom-hooks/_category_.yaml @@ -0,0 +1,5 @@ +--- +position: 4.0 +label: Custom Hooks +collapsible: true +collapsed: true diff --git a/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/01-introduction-gitlab.mdx b/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/01-introduction-gitlab.mdx index 8e3406ed..86b25959 100644 --- a/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/01-introduction-gitlab.mdx +++ b/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/01-introduction-gitlab.mdx @@ -1,3 +1,3 @@ # GitLab Introduction -Currently only command line mode supported +You can use GitLab with Cloud Runner via the Command Line mode. diff --git a/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/_category_.yaml b/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/_category_.yaml new file mode 100644 index 00000000..0407bcd5 --- /dev/null +++ b/docs/03-github-cloud-runner/06-advanced-topics/09-gitlab/_category_.yaml @@ -0,0 +1,5 @@ +--- +position: 9.0 +label: GitLab Integration +collapsible: true +collapsed: true diff --git a/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-github-checks.mdx b/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-github-checks.mdx new file mode 100644 index 00000000..94fd90d9 --- /dev/null +++ b/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-github-checks.mdx @@ -0,0 +1,7 @@ +# GitHub Checks + +By enabling the `githubCheck` parameter, the cloud runner job will create a GitHub check for each +step. + +The step will show useful details about the job. This is especially useful in combination with async +mode, as you can run very long jobs. diff --git a/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-release-branches.mdx b/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-release-branches.mdx deleted file mode 100644 index 87c6bf63..00000000 --- a/docs/03-github-cloud-runner/06-advanced-topics/10-github/01-release-branches.mdx +++ /dev/null @@ -1,17 +0,0 @@ -# Release Branch Configuration - -_GitHub Action examples to pull from the required release branch_ - -## Examples - -### Develop branch - -```yaml -- uses: game-ci/unity-builder@cloud-runner-develop -``` - -### Stable branch - -```yaml -- uses: game-ci/unity-builder@cloud-runner-stable -``` diff --git a/docs/03-github-cloud-runner/06-advanced-topics/10-github/09-nested-github-runners.mdx b/docs/03-github-cloud-runner/06-advanced-topics/10-github/09-nested-github-runners.mdx deleted file mode 100644 index cf5aab60..00000000 --- a/docs/03-github-cloud-runner/06-advanced-topics/10-github/09-nested-github-runners.mdx +++ /dev/null @@ -1,140 +0,0 @@ -# Nested GitHub Self-Hosted Runners - -**Create a self-hosted cloud runner in an initial job:** - -```yaml -boot-build: - runs-on: ubuntu-latest - outputs: - BUILD_GUID: ${{ steps.start-runner.outputs.BUILD_GUID }} - steps: - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-west-2 - - name: start runner - id: start-runner - uses: game-ci/unity-builder@cloud-runner-develop - with: - cloudRunnerCluster: aws - allowDirtyBuild: true - cloudRunnerMemory: 4096 - cloudRunnerCpu: 2048 - gitPrivateToken: ${{ secrets.PAT_GITHUB }} - targetPlatform: StandaloneWindows64 - GITHUB_SHA: ${{ github.sha }} - branch: ${{ github.ref_name }} - unityVersion: 2021.3.1f1 - githubRepo: ${{ github.repositoryUrl }} - versioning: None - customJob: | - - name: upload - image: ubuntu - commands: | - export DEBIAN_FRONTEND=noninteractive - export RUNNER_ALLOW_RUNASROOT="1" - apt-get -q update - apt-get install -qy tar curl libdigest-sha-perl apt-transport-https libicu-dev jq git git-lfs - p="$BUILD_GUID/actions-runner" - mkdir -p $p && cd $p - curl -o actions-runner-linux-x64-2.289.2.tar.gz -L https://github.com/actions/runner/releases/download/v2.289.2/actions-runner-linux-x64-2.289.2.tar.gz - echo "7ba89bb75397896a76e98197633c087a9499d4c1db7603f21910e135b0d0a238 actions-runner-linux-x64-2.289.2.tar.gz" | shasum -a 256 -c - tar xzf ./actions-runner-linux-x64-2.289.2.tar.gz - repo="frostebite/FPS.GameClient" - KEY=$(curl -X POST -H "Authorization: Bearer $GIT_PRIVATE_TOKEN" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/$repo/actions/runners/registration-token | jq -r .token) - ./config.sh --url https://github.com/$repo --token $KEY --ephemeral --labels $BUILD_GUID - ./run.sh - secrets: [] -``` - -**Run the build in the job:** - -```yaml -run-build: - runs-on: - - self-hosted - - ${{ needs.boot-build.outputs.BUILD_GUID }} - needs: boot-build - steps: - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-west-2 - - name: Unity - Build - id: aws-fargate-unity-build - uses: game-ci/unity-builder@cloud-runner-develop - env: - UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} - UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} - UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} - CUSTOM_JOB: '' - with: - cloudRunnerCluster: aws - allowDirtyBuild: true - cloudRunnerMemory: 8192 - cloudRunnerCpu: 2048 - versioning: None - unityVersion: 2021.3.1f1 - gitPrivateToken: ${{ secrets.PAT_GITHUB }} - targetPlatform: StandaloneWindows64 - customJob: '' - GITHUB_SHA: ${{ github.sha }} - branch: ${{ github.ref_name }} - githubRepo: ${{ github.repositoryUrl }} - postBuildSteps: | - - name: upload - image: amazon/aws-cli - commands: | - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID --profile default - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY --profile default - aws configure set region $AWS_DEFAULT_REGION --profile default - aws s3 cp /data/cache/$CACHE_KEY/build/build-$BUILD_GUID.tar s3://game-ci-test-storage/$CACHE_KEY/build-$BUILD_GUID.tar - secrets: - - name: awsAccessKeyId - value: ${{ secrets.AWS_ACCESS_KEY_ID }} - - name: awsSecretAccessKey - value: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - name: awsDefaultRegion - value: eu-west-2 -``` - -**Download and deploy results:** - -```yaml -post-job-message: - runs-on: ubuntu-latest - needs: [run-build, boot-build] - steps: - - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: eu-west-2 - - run: | - aws s3 cp s3://game-ci-test-storage/${{ needs.run-build.outputs.CACHE_KEY }}/build-${{ needs.run-build.outputs.BUILD_GUID }}.tar build-${{ needs.run-build.outputs.BUILD_GUID }}.tar - mkdir build - tar -xf build-${{ needs.run-build.outputs.BUILD_GUID }}.tar -C build - ls build - - uses: actions/upload-artifact@v2 - with: - name: AWS Build (${{ matrix.targetPlatform }}) - path: build-${{ needs.run-build.outputs.BUILD_GUID }}.tar - retention-days: 14 - - name: Steam - Deploy - uses: game-ci/steam-deploy@main - with: - username: ${{ secrets.STEAM_USERNAME }} - password: ${{ secrets.STEAM_PASSWORD }} - appId: ${{ secrets.STEAM_APPID }} - configVdf: ${{ secrets.STEAM_CONFIG_VDF }} - ssfnFileName: ${{ secrets.STEAM_SSFN_FILE_NAME }} - ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }} - rootPath: build - depot1Path: StandaloneWindows64 - releaseBranch: pre-release -``` diff --git a/docs/03-github-cloud-runner/06-advanced-topics/10-github/_category_.yaml b/docs/03-github-cloud-runner/06-advanced-topics/10-github/_category_.yaml new file mode 100644 index 00000000..ecbee03f --- /dev/null +++ b/docs/03-github-cloud-runner/06-advanced-topics/10-github/_category_.yaml @@ -0,0 +1,5 @@ +--- +position: 10.0 +label: GitHub Integration +collapsible: true +collapsed: true From 3b307f5d892ea22f2e6e0b809a5699a47d2ce345 Mon Sep 17 00:00:00 2001 From: Ayush yadav <83113106+sysoutayush@users.noreply.github.com> Date: Sun, 9 Apr 2023 22:22:40 +0530 Subject: [PATCH 05/15] Document image build process in FAQ closes #387 (#388) --- docs/10-faq/index.mdx | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/10-faq/index.mdx b/docs/10-faq/index.mdx index 796f5005..911e47ea 100644 --- a/docs/10-faq/index.mdx +++ b/docs/10-faq/index.mdx @@ -149,6 +149,44 @@ Most likely yes. We have automated pipelines watching every 15 minutes for new r Jobs are then created on github to build and push the docker images to docker hub. You can find the status of the images on [the supported Unity versions page][unity-docker-versions]. +## How long does it take for a new version of Unity to become available as a Docker image? + +We have automated pipelines that check for new releases of Unity **every 15 minutes**. Once a new +release is detected, a job is created on GitHub to build and publish a new Docker image to Docker +Hub. When the version is available on the Unity's download page, it usually takes a few hours for +the new version to become available on Docker Hub. _However, the exact time it takes for a new +version to become available as a Docker image can vary depending on several factors, such as the +time it takes to build the images, the availability of the new version on the Unity download page._ + +We have a discord channel which you can watch to be notified of new versions detected by our bot +here: [#new-versions](https://discord.com/channels/710946343828455455/731947345478156391). You will +need to join our [discord server](https://game.ci/discord) first. + +## How does the Docker image publication process work? + +The Docker image publication process involves several steps. First, we detect new releases of Unity +based on [Unity's Archive page](https://unity.com/releases/editor/archive) and we trigger a build +job on GitHub. This happens in the +[GameCI Versioning Backend](https://github.com/game-ci/versioning-backend) project. Next, the build +job uses Unity Hub to install Unity and the required packages and builds new Docker images for each +supported target platforms. This happens in the +[Docker images for Unity](https://github.com/game-ci/docker) project. The new images are tagged and +pushed to Docker Hub, where they are publicly available for download. + +## Where is the source of truth for the process of publishing Docker images? + +The source of truth for the process of publishing Docker images is +[Unity's Archive page](https://unity.com/releases/editor/archive). We use automated scripts to +detect new releases on this page and trigger the build process for new Docker images. However, Unity +may occasionally release updates that are not immediately available on their download page, which +can cause a delay in the availability of new Docker images. + +If you are currently using a recent unity version from Unity Hub that is not yet available on the +[Unity's Archive page](https://unity.com/releases/editor/archive), you can usually roll back to +previous version which is most likely already available, or you can wait a few hours until Unity +publishes the new version on its download page and wait for our pipelines to finish building and +publishing the images. + ## How does Unity activation work? ### The `machine-id` From 6f0ab20a05649347ce62140082f49bfadeb05655 Mon Sep 17 00:00:00 2001 From: Daniel <79565087+danielchipman@users.noreply.github.com> Date: Sat, 15 Apr 2023 10:24:01 -0700 Subject: [PATCH 06/15] Update custom parameter example for server builds (#389) --- docs/03-github/04-builder.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/03-github/04-builder.mdx b/docs/03-github/04-builder.mdx index 7a27b39b..7a060503 100644 --- a/docs/03-github/04-builder.mdx +++ b/docs/03-github/04-builder.mdx @@ -229,7 +229,7 @@ There are 2 main use cases: - To pass your own custom parameters to be used with `buildMethod` above - To pass [Unity Build Options](https://docs.unity3d.com/ScriptReference/BuildOptions.html) (for - example, `customParameters: -EnableHeadlessMode` will do server builds) + example, `customParameters: -standaloneBuildSubtarget Server` will do server builds) _**required:** `false`_ _**default:** `""`_ From a37fa18a6e36d18cae1e71734463f6477f3d611c Mon Sep 17 00:00:00 2001 From: David Finol Date: Sun, 16 Apr 2023 03:51:44 -0500 Subject: [PATCH 07/15] Update build script for standaloneBuildSubtarget (#390) --- example/BuildScript.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/example/BuildScript.cs b/example/BuildScript.cs index 5351c23c..873ca863 100644 --- a/example/BuildScript.cs +++ b/example/BuildScript.cs @@ -62,7 +62,7 @@ public static void Build() PlayerSettings.Android.targetSdkVersion = targetSdkVersion; } - + break; } case BuildTarget.StandaloneOSX: @@ -92,6 +92,7 @@ private static Dictionary GetValidatedOptions() if (!Enum.IsDefined(typeof(BuildTarget), buildTarget ?? string.Empty)) { + Console.WriteLine($"{buildTarget} is not a defined {nameof(BuildTarget)}"); EditorApplication.Exit(121); } @@ -151,6 +152,13 @@ private static void ParseCommandLineArguments(out Dictionary pro private static void Build(BuildTarget buildTarget, string filePath) { +#if UNITY_2021_2_OR_NEWER + // Determine subtarget + StandaloneBuildSubtarget buildSubtarget; + if (!options.TryGetValue("standaloneBuildSubtarget", out var subtargetValue) || !Enum.TryParse(subtargetValue, out buildSubtarget)) { + buildSubtarget = default; + } +#endif string[] scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(s => s.path).ToArray(); var buildPlayerOptions = new BuildPlayerOptions { @@ -159,6 +167,9 @@ private static void Build(BuildTarget buildTarget, string filePath) // targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget), locationPathName = filePath, // options = UnityEditor.BuildOptions.Development +#if UNITY_2021_2_OR_NEWER + subtarget = (int) buildSubtarget +#endif }; BuildSummary buildSummary = BuildPipeline.BuildPlayer(buildPlayerOptions).summary; From 4fa358f45411196b2a4e7ec10f47d074b65a273a Mon Sep 17 00:00:00 2001 From: Omid Date: Mon, 17 Apr 2023 18:34:21 +0330 Subject: [PATCH 08/15] Fix github RSA key error (#385) * Fix github RSA key error * Update 04-builder.mdx * npm run lint --------- Co-authored-by: Gabriel Le Breton --- docs/03-github/04-builder.mdx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/03-github/04-builder.mdx b/docs/03-github/04-builder.mdx index 7a060503..c4038062 100644 --- a/docs/03-github/04-builder.mdx +++ b/docs/03-github/04-builder.mdx @@ -487,6 +487,16 @@ keys for your project and then add to the `webfactory/ssh-agent` https://github.com/USER/PROJECT/settings/keys) - Add private_key to Github secrets of the project that you want to build (https://github.com/USER/PROJECT/settings/secrets/actions) (key name should be SSH_PRIVATE_KEY ) +- Add github to ssh known hosts : + +```yaml +name: 'Add GitHub to the SSH known hosts file' +run: | + mkdir -p -m 0700 /home/runner/.ssh + curl --silent https://api.github.com/meta | jq --raw-output '"github.com "+.ssh_keys[]' >> /home/runner/.ssh/known_hosts + chmod 600 /home/runner/.ssh/known_hosts +``` + - Finally, add `webfactory/ssh-agent` to your Github action : ```yaml @@ -494,7 +504,7 @@ name: Accessing private repos runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: webfactory/ssh-agent@v0.5.2 + - uses: webfactory/ssh-agent@v0.8.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - uses: game-ci/unity-builder@v2 From 4dbbaeaad54df096ea523e8bb31f8d15e5393751 Mon Sep 17 00:00:00 2001 From: David Finol Date: Thu, 27 Apr 2023 09:20:53 -0500 Subject: [PATCH 09/15] Update BuildScript.cs (#392) --- example/BuildScript.cs | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/example/BuildScript.cs b/example/BuildScript.cs index 873ca863..3b29167f 100644 --- a/example/BuildScript.cs +++ b/example/BuildScript.cs @@ -70,8 +70,17 @@ public static void Build() break; } + // Determine subtarget + int buildSubtarget = 0; +#if UNITY_2021_2_OR_NEWER + if (!options.TryGetValue("standaloneBuildSubtarget", out var subtargetValue) || !Enum.TryParse(subtargetValue, out StandaloneBuildSubtarget buildSubtargetValue)) { + buildSubtargetValue = default; + } + buildSubtarget = (int) buildSubtargetValue; +#endif + // Custom build - Build(buildTarget, options["customBuildPath"]); + Build(buildTarget, buildSubtarget, options["customBuildPath"]); } private static Dictionary GetValidatedOptions() @@ -150,15 +159,8 @@ private static void ParseCommandLineArguments(out Dictionary pro } } - private static void Build(BuildTarget buildTarget, string filePath) + private static void Build(BuildTarget buildTarget, int buildSubtarget, string filePath) { -#if UNITY_2021_2_OR_NEWER - // Determine subtarget - StandaloneBuildSubtarget buildSubtarget; - if (!options.TryGetValue("standaloneBuildSubtarget", out var subtargetValue) || !Enum.TryParse(subtargetValue, out buildSubtarget)) { - buildSubtarget = default; - } -#endif string[] scenes = EditorBuildSettings.scenes.Where(scene => scene.enabled).Select(s => s.path).ToArray(); var buildPlayerOptions = new BuildPlayerOptions { @@ -168,7 +170,7 @@ private static void Build(BuildTarget buildTarget, string filePath) locationPathName = filePath, // options = UnityEditor.BuildOptions.Development #if UNITY_2021_2_OR_NEWER - subtarget = (int) buildSubtarget + subtarget = buildSubtarget #endif }; From 85abe99ba1d346f03d352dade325953fcf07adc6 Mon Sep 17 00:00:00 2001 From: David Finol Date: Wed, 14 Jun 2023 04:39:42 -0500 Subject: [PATCH 10/15] Update steam.mdx (#395) * Update steam.mdx Update documentation for steam-deploy v3 * Run prettier --- docs/03-github/06-deployment/steam.mdx | 39 ++++++++++---------------- 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/docs/03-github/06-deployment/steam.mdx b/docs/03-github/06-deployment/steam.mdx index c5425268..a60ff6c1 100644 --- a/docs/03-github/06-deployment/steam.mdx +++ b/docs/03-github/06-deployment/steam.mdx @@ -27,11 +27,11 @@ jobs: outputs: buildVersion: ${{ steps.build.outputs.buildVersion }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: fetch-depth: 0 lfs: true - - uses: actions/cache@v2 + - uses: actions/cache@v3 with: path: Library key: @@ -47,7 +47,7 @@ jobs: with: targetPlatform: ${{ matrix.targetPlatform }} versioning: Semantic - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: Build-${{ matrix.targetPlatform }} path: build/${{ matrix.targetPlatform }} @@ -56,26 +56,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Download StandaloneWindows64 Artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: Build-StandaloneWindows64 path: build/StandaloneWindows64 - name: Download StandaloneLinux64 Artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: Build-StandaloneLinux64 path: build/StandaloneLinux64 - - uses: game-ci/steam-deploy@v2 + - uses: game-ci/steam-deploy@v3 with: username: ${{ secrets.STEAM_USERNAME }} - password: ${{ secrets.STEAM_PASSWORD }} configVdf: ${{ secrets.STEAM_CONFIG_VDF}} - ssfnFileName: ${{ secrets.STEAM_SSFN_FILE_NAME }} - ssfnFileContents: ${{ secrets.STEAM_SSFN_FILE_CONTENTS }} appId: ${{ secrets.STEAM_APP_ID }} buildDescription: v${{ needs.buildForWindowsAndLinux.outputs.buildVersion }} rootPath: build @@ -87,9 +84,7 @@ jobs: ### 3. Add GitHub Secrets - **STEAM_USERNAME**: The username of the Steam Build Account that you created in step 1. -- **STEAM_PASSWORD**: The password of the Steam Build Account that you created in step 1. -- **STEAM_CONFIG_VDF**, **STEAM_SSFN_FILE_NAME**, and **STEAM_SSFN_FILE_CONTENTS**: See the step - "Setup Steam Authentication" below. +- **STEAM_CONFIG_VDF**: See the step "Setup Steam Authentication" below. - **STEAM_APP_ID**: The identifier of your app on steam. You can find it on your [dashboard](https://partner.steamgames.com/dashboard). @@ -104,17 +99,14 @@ ssfnFileName, and ssfnFileContents with these steps: local machine. All following steps will also be done on your local machine. 1. Try to login with `steamcmd +login +quit`, which may prompt for the MFA code. If so, type in the MFA code that was emailed to your builder account's email address. -1. Validate that the MFA process is complete by running - `steamcmd +login +quit` again. It should not ask for the MFA code again. +1. Validate that the MFA process is complete by running `steamcmd +login +quit` again. It + should not ask for the MFA code again. 1. The folder from which you run `steamcmd` will now contain an updated `config/config.vdf` file. Use `cat config/config.vdf | base64 > config_base64.txt` to encode the file. Copy the contents of `config_base64.txt` to a GitHub Secret `STEAM_CONFIG_VDF`. -1. That folder will also contain two files whose names look like `ssfn`, **but one of them - is a hidden file**. - [Find the hidden one](https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5), - then copy the name of that file to a GitHub Secret `STEAM_SSFN_FILE_NAME`. -1. Use `cat | base64 > ssfn_base64.txt` to encode the contents of the hidden ssfn - file. Copy the contents of `ssfn_base64.txt` to a GitHub Secret `STEAM_SSFN_FILE_CONTENTS`. +1. `If:` when running the action you recieve another MFA code via email, run + `steamcmd +set_steam_guard_code ` on your local machine and repeat the `config.vdf` + encoding and replace secret `STEAM_CONFIG_VDF` with its contents. If your builder account uses MFA through the Steam Guard App, the `steam-deploy` app can use a TOTP instead of the above configuration. Generating a TOTP is outside the scope of this guide, as it is @@ -126,8 +118,7 @@ You can configure these to better match your use case. #### totp -Deploys to Steam using a TOTP. If this is passed, `configVdf`, `ssfnFileName`, and -`ssfnFileContents` are not required. +Deploys to Steam using a TOTP. If this is passed, `configVdf` is not required. #### buildDescription @@ -147,7 +138,7 @@ The relative path following your root path for the files to be included in this If your appId is 125000 then the depots 125001 ... 125009 will be assumed. -#### firstDepotId +#### firstDepotIdOverride You can use this to override the ID of the first depot in case the IDs do not start as described in depot[X]Path (e.g. for DLCs). From 5db586989432670bd5b75e31c76fd9434b2e43cf Mon Sep 17 00:00:00 2001 From: Gabriel Le Breton Date: Tue, 4 Jul 2023 15:01:20 -0400 Subject: [PATCH 11/15] Update unity-test-runner docs for License Server (#399) I spotted this while reading the docs, this is the only section from unity-test-runner that uses unity-builder. I haven't tested this, but I think it might be a mistake. --- docs/03-github/03-test-runner.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/03-github/03-test-runner.mdx b/docs/03-github/03-test-runner.mdx index 59720ecf..699ddeee 100644 --- a/docs/03-github/03-test-runner.mdx +++ b/docs/03-github/03-test-runner.mdx @@ -66,9 +66,9 @@ floating license will be acquired before the tests run, and returned after. Example of use: ```yaml -- uses: game-ci/unity-builder@v2 +- uses: game-ci/unity-test-runner@v2 with: - targetPlatform: WebGL + projectPath: path/to/your/project unityLicensingServer: [url to your license server] ``` From b6317343dd9fc0b9f861ee7737b028bf2a7046b8 Mon Sep 17 00:00:00 2001 From: Aaron Trudeau <36064197+trudeaua21@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:21:02 -0400 Subject: [PATCH 12/15] Package testing documentation (#398) * add package testing section and example * Update configuration options documentation * Fix links * Add configuration examples * Change wording in full package testing example * Update 03-test-runner.mdx consistency (Unity package vs Unity Package) * Add link to customImage parameter --------- Co-authored-by: Aaron Trudeau <120415438+trudeaua-vividream-software@users.noreply.github.com> Co-authored-by: Gabriel Le Breton --- docs/03-github/03-test-runner.mdx | 155 +++++++++++++++++++++++++++++- 1 file changed, 151 insertions(+), 4 deletions(-) diff --git a/docs/03-github/03-test-runner.mdx b/docs/03-github/03-test-runner.mdx index 699ddeee..2fcb2c8a 100644 --- a/docs/03-github/03-test-runner.mdx +++ b/docs/03-github/03-test-runner.mdx @@ -74,6 +74,81 @@ Example of use: That is all you need to test your project. +## Testing Unity packages + +The test runner offers basic support for testing Unity packages, with [a few caveats](#caveats). + +### Additional setup + +After performing [Basic setup](#basic-setup), three extra steps are required for testing Unity +packages. + +#### Setting packageMode + +To indicate that the test runner is being run for a Unity package rather than a Unity project, set +the [`packageMode`](#packagemode) configuration option to `true`. + +```yaml +- uses: game-ci/unity-test-runner@v2 + with: + packageMode: true +``` + +#### Passing a unityVersion + +Make sure that you explicitly pass the [`unityVersion`](#unityversion) argument, as it's necessary +for the test runner to test Unity packages. + +```yaml +- uses: game-ci/unity-test-runner@v2 + with: + unityVersion: [your desired Unity version] +``` + +See the [GitHub Issue](https://github.com/game-ci/unity-test-runner/issues/227) for more details on +why this is necessary. + +#### Choosing a package directory + +Make sure that the directory of the package being tested is **not** the same as the repository's +root directory. This condition will cause the test runner to hang and fail. + +Currently, the only known workarounds for this failure are these two options: + +1. Restructure your repository to place the package being tested in a subdirectory of the + repository's root directory. +2. Somehow temporarily move the package being tested to a subdirectory of the repository's root + directory within the GitHub Workflow where you're using the test runner. + +Whichever workaround you choose, make sure that the [`projectPath`](#projectpath) corresponds to +wherever the package being tested is located at the time the test runner is called in your GitHub +Workflow. + +See the [GitHub Issue](https://github.com/game-ci/unity-test-runner/issues/223) for more details and +potential workarounds. + +### Caveats + +- As stated above, the action will fail if the directory of the package being tested is the same as + the root directory of the repository (this issue is being tracked + [here](https://github.com/game-ci/unity-test-runner/issues/223)). +- As stated above, excluding `unityVersion` or passing a `unityVersion` configuration of `auto` when + testing a Unity package will cause the test runner to fail. The Unity version must be manually set + in the configuration options (this issue is being tracked + [here](https://github.com/game-ci/unity-test-runner/issues/227)). +- The test runner can only test packages on Linux runners - Windows runners are currently not + supported (this issue is being tracked + [here](https://github.com/game-ci/unity-test-runner/issues/224)) +- Packages with dependencies outside of the Unity Registry have not been tested an may or may not + work with the test runner (this issue is being tracked + [here](https://github.com/game-ci/unity-test-runner/issues/225)). +- There is currently no caching set up for the testing of Unity packages (this issue is being + tracked [here](https://github.com/game-ci/unity-test-runner/issues/226)). +- If using the [`customImage`](#customImage) parameter to use a custom Docker image to test the + package, that image must have [`jq`](https://jqlang.github.io/jq/) installed, or else the test + runner will error. It is used to add the package being tested to a temporary Unity project's + package manifest at runtime. + ## Viewing test results The test results can be viewed from a @@ -170,6 +245,9 @@ To do so, simply add Github Actions' official This simple addition could speed up your test runs by more than 50%. +Note that caching in this manner only applies to testing Unity **Projects**, not Unity **Packages** +(see [Caveats](#caveats)). + ## Configuration options Below options can be specified under `with:` for the `unity-test-runner` action. @@ -177,13 +255,15 @@ Below options can be specified under `with:` for the `unity-test-runner` action. #### unityVersion Version of Unity to use for testing the project. Use "auto" to get from your -ProjectSettings/ProjectVersion.txt +ProjectSettings/ProjectVersion.txt. ⚠️ If testing a Unity Package, this field is required and cannot +be set to "auto". _**required:** `false`_ _**default:** `auto`_ #### customImage -Specific docker image that should be used for testing the project. +Specific docker image that should be used for testing the project. If packageMode is true, this +image must have [`jq`](https://jqlang.github.io/jq/) installed. ```yaml - uses: game-ci/unity-test-runner@v2 @@ -195,8 +275,8 @@ _**required:** `false`_ _**default:** `""`_ #### projectPath -Specify the path to your Unity project to be tested. The path should be relative to the root of your -project. +Specify the path to your Unity project or package to be tested. The path should be relative to the +root of your project. _**required:** `false`_ _**default:** ``_ @@ -255,6 +335,9 @@ definition to manage scripts, see Unity's documentation on [Assembly definitions](https://docs.unity3d.com/2022.2/Documentation/Manual/ScriptCompilationAssemblyDefinitionFiles.html) for how to create and manage assembly definitions. +To get coverage when testing a package, make sure you pass assemblies from the package you want +covered to the `assemblyFilters` option. + _**required:** `false`_ _**default:** `generateAdditionalMetrics;generateHtmlReport;generateBadgeReport`_ @@ -309,6 +392,19 @@ unity versions. _**required:** `false`_ _**default:** `Test Results`_ +#### packageMode + +Whether the tests are being run for a Unity package instead of a Unity project. + +If true, the action can only be run on Linux runners, and any custom docker image passed to this +action must have [`jq`](https://jqlang.github.io/jq/) installed. + +NOTE: may not work properly for packages with dependencies outside of the Unity Registry. + +See [Testing Unity packages](#testing-unity-packages) for more information. + +_**required:** `false`_ _**default:** `false`_ + ## Complete example A complete workflow that tests all modes separately could look like this: @@ -362,3 +458,54 @@ jobs: name: Coverage results for ${{ matrix.testMode }} path: ${{ steps.tests.outputs.coveragePath }} ``` + +## Complete Example (Testing a Package) + +A complete workflow that tests all modes separately (for a package rather than a project) could look +like this: + +```yaml +name: Test package + +on: [push, pull_request] + +jobs: + testAllModes: + name: Test in ${{ matrix.testMode }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + projectPath: + - test-package + unityVersion: '2020.3.0f1' # some version must be included for package testing + testMode: + - playmode + - editmode + steps: + - uses: actions/checkout@v2 + with: + lfs: true + - uses: game-ci/unity-test-runner@v2 + id: tests + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + with: + projectPath: ${{ matrix.projectPath }} + unityVersion: ${{ matrix.unityVersion }} + testMode: ${{ matrix.testMode }} + artifactsPath: ${{ matrix.testMode }}-artifacts + githubToken: ${{ secrets.GITHUB_TOKEN }} + checkName: ${{ matrix.testMode }} Test Results + coverageOptions: 'generateAdditionalMetrics;generateHtmlReport;generateBadgeReport;assemblyFilters:+my.assembly.*' + - uses: actions/upload-artifact@v2 + if: always() + with: + name: Test results for ${{ matrix.testMode }} + path: ${{ steps.tests.outputs.artifactsPath }} + - uses: actions/upload-artifact@v2 + if: always() + with: + name: Coverage results for ${{ matrix.testMode }} + path: ${{ steps.tests.outputs.coveragePath }} +``` From bc874c59f88ef936043ce0ef57d65ed3c4f817f9 Mon Sep 17 00:00:00 2001 From: Max! Date: Tue, 4 Jul 2023 23:47:55 +0200 Subject: [PATCH 13/15] Style changes to Readme.md (#396) * Update README.md * Add files via upload * remove extra line break * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * fix formatting * change link format from html to markdown * missed a link * Run prettier * run prettier with yarn instead of npx? * fix codeblock formatting * run prettier formatting --------- Co-authored-by: David Finol --- README.md | 98 ++++++++++++++++++-------- static/assets/images/logo-cropped.png | Bin 0 -> 107173 bytes 2 files changed, 68 insertions(+), 30 deletions(-) create mode 100644 static/assets/images/logo-cropped.png diff --git a/README.md b/README.md index b904d6bd..29ad0d68 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,88 @@ -# GameCI +

+ +

-Documentation for open source GameCI projects. You can find the `.md` files inside the -[docs](./docs) folder. The live version is available on [game.ci](https://game.ci). This website is -built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator. +

+ + + +
+ + + +

-### Installation +
-```bash -yarn -``` +## Welcome -### Local Development +Welcome to the GameCI documentation repo! Here you will find the documentation assests for GameCI +and it's related open-source projects. The live documentation site availble at +game.ci. -```bash -yarn start -``` +You may also view the markdown files directly at the following links: -This command starts a local development server and opens up a browser window. Most changes are -reflected live without having to restart the server. +- [Getting Started with GameCI](docs/02-getting-started) +- [Github Actions](docs/03-github) +- [Gitlab Pipelines](docs/05-gitlab) +- [CircleCi<](docs/11-circleci) +- [Docker](docs/08-docker) +- [Github Cloud Runner](docs/03-github-cloud-runner) +- [Troubleshooting](docs/09-troubleshooting) +- [FAQ](docs/10-faq) -### Build +## Building the Docs Site -```bash -yarn build -``` +Built with [Docusaurus 2.](https://docusaurus.io/) -This command generates static content into the `build` directory and can be served using any static -contents hosting service. +This project has a hard dependancy on Node16. You will need to make sure that you have the proper +version of node installed to avoid errors. -## Community +- [Install Node16 on Ubuntu](https://joshtronic.com/2021/05/09/how-to-install-nodejs-16-on-ubuntu-2004-lts/) +- [Install Node16 using brew](https://apple.stackexchange.com/a/207883) -Feel free to join us on [![Discord](static/assets/readme/Discord.svg)](https://game.ci/discord) and -engage with the community. +This project relies on yarn for package management. You will need to install yarn in order to build +and test the documentation site. -## Support us +- [Official yarn installation docs.](https://classic.yarnpkg.com/lang/en/docs/install) -GameCI is free for everyone forever. +1. Install project dependancies -You can support us at [OpenCollective](https://opencollective.com/game-ci). + ```bash + yarn install + ``` -## Licence +2. Start a local develpment server + + This command starts a local development server and opens up a browser window. Most changes are + reflected live without having to restart the server. + + ```bash + yarn start + ``` + +3. Create a build This command generates static content into the `build` directory and can be + served using any static contents hosting service. + + ```bash + yarn build + ``` -This repository is [MIT](./LICENSE) licensed. +## Meet the Community + +Join us on [Discord](https://game.ci/discord) and engage with the growing community of engineers, +artists, hobbyists, and professionals using GameCI to build, test, and publish their projects +everyday. + +## Support the Team + +GameCI is free for everyone forever. You can support the peolpe who make GameCI pssible on +[OpenCollective](https://opencollective.com/game-ci) + +## Licence -This includes all contributions from the community. +This repository is [MIT](./LICENSE) licensed. This includes all contributions from the community. ## Sponsors -[![CircleCI](static/assets/readme/CircleCI.svg)](https://circleci.com?utm_source=game-ci) + diff --git a/static/assets/images/logo-cropped.png b/static/assets/images/logo-cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..6f181257347b19ade2104ba70c98e33954a94675 GIT binary patch literal 107173 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%0DiP@7naeM-~4AX1N8T{S~L;LynCCZpY*kg?~G3 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%0A(e&ummmIQD9l%_N@Dh9Dr; zq{w5E4D9RQy2v1$Egy@=#iE0W?lbgDs(nlSs!Z{x5dV0PX0hOhe3ffz4FqXrTa?Xt za*tl(){*r#=6~y4wn$((F5~=X`TF=@P4WpuCKM$6TaWdLsIR*`X=z%1p*b;BK;MUV%q&*qwH&PsdRsuf$7D%Y1!7{fPKY+CP%Vc3hu$ zE<_&VWc^bD{6Y|InJKWED!gMvJ5ugUh^U0=phTfc%Z33of(yXZ=(i;0C+d693NRi6 zz<|LN7YA=Q@M0i=oACLEymt7CTTaD!=xw)~Y2>(^)@x&I2SR5^w`qsm4oIh$CxCR_ih!*&q zbgJ=vf}}e! zy{>H1SWO_Ze7awf9{nw2{7y=>k!H*nO>Jj_r{<2JL5;GCq3x&LJHO;HvCf@Y+V zcw?8WYNm2**v>`=`+F-+oP3|m7u=dUVwkO}jt0HVs@rs=)8&Q(c+*2rLP?6tP3H6 zUFH z+@SuL&Yu7NR`376hiQp*vgWo{pv$g%f1GE`x2lCF3k<_no0iT*sQ))uDhM*=4lEh*E`pqQYLN+~DgtId^GrNkLfIi)HbO{zw zW}(8p?p7qQDpnHUW3LGUD~v^gO%oyzW46`*m&z}QmJtMF1F5lWP>$b2ebnXs9(7LZ9-O>k}o(C%*%Scl&M~sxmqVIiG z-I@}R`1uq(hfBZZ-)h3AHt91ab;W1Akz(C&Vf;9`1VRM=B%9H!^=+rq5%7yBojAyz6_|wHiOylyeob5<^S)3!{XhLw^3m0?vw3g#IrabQe0<6uK6r6o6E0!Wv!HW)o?)js215or4`#fDujlh7IQXjaI@$5`J=e5P^R)jZyN7n(o3c%eiDikvJCF}c> zJC4pCDoTMCo{7jzy;XdcZ9-?HHXDWt0#21wVF2I{Ta2)QdKo_xd+p4id2!`5^`Sm| zq_#09sb#sR(N-lV?W|0xW99uXP(W^J6bp%xdLl36lWy#`CF*gRQ`5<+kCJNTBY*lv7&>eMggkAQTYBlZz zp!p;Q1enai5BGb%+`Nk#$JDF_epb?1=5VA#<)d8RoZ$%%%-ETuIE}mOf5-U)N16z7 z?-U=PHt;@7JQjZ{qumHGnd;YR!HB7BZQ!v4^gD*%F0H*M2=yP+)FVw1eXwjK@(UV) zcDXgx`y`nWQ$`Iiik90mS~Y3tn|j@f=>d^$cHt60Ru+gk^j2^XHAd$7a6ELxwBL!y z@@Tr6ct279Gn*?OH= z7MU*3<}ii#oQcvf)_?uE5N|GZ?7P)~#xJsx_-{Ft$<}O~!j50k18sG7h_=Na`;Q-q zMoGfp$p%?!0s(&dnuZ4)6Yos1UpEjHRo9ZZEM2B27(7BhvlYhgU0*S zaj)Zuw#=C;s$;sziJGy-uZYOzugu^#4)|e;$R+1>VXnr;p%A?{OM3*+*&0C&irtZo z)6~cM@UN<=YGd%pMGi`C-fx#hG}l1RbU>~A>pDu_EYe|fHQ6My^5cKcG6^;zGluR_ z3qkX?Jw`J$U<{sFn4-9SOh*A;1DU%dw5!?hJ>l!#=IM$`jIN@Y#O!)7*!Pg^yjMh)s#2NLhJ_dG=>MjF6 znuAFn4Xt@AO?s22q<^{2hWlMXkvou$if%-Gm!g^2GumD7PN*l7|Emdn-xg3~ndX+` zK^GLPNry$}b=1nq(%q3l(^MlJ@W*?TDm!P_LrEjFA+`P4AXB;{HeTSDv2KK|I2HcV z5uhj#xdQL;PHSGW8!vPHz6%F*qVh76ZV3T?Wm?ca$|j&K`(~y6JrRMK^Lo6wzsKdy zdK!6aW!sHm&Up}&GB}m-i~*_#Sug)Rmp|07waj!7HxOc9SCnM3DkX`Sa*i} z(L$;KZhOR%JOPCORkUbMKdbPokKTXu>MaZxwlsfu7@ZBWdd{Bh@KoBX-4k%iMdS&TU_x|v>rR0YG7}?7lK#(i|GM;8}YI+XFk(&~ziGOghMI%G% zq3bg}W4RjiQ6stSXAdXKVkBD*Jot~j-ZDLL!Tq(+k*~U8ijiQ#`p|%co4Ti8c_=7E z1&87kgXoc}!oA~7tD4vbS0>jCniQM7Z-u{*>IsCI7>lqZ7Lxhd-umFQvh5W0NOW10 ztZ<3GC}jfLf=yWPN1P?8#pFFs$G~`xh$dD?-W(DwyQZ`w)A-?+L)wac@tz9aS6KBn zPE0MzRA0^l_@yiZs$LP-W8^SuDP~xcw*Js5wZ`jNk=YKNW!OpVvR%!U*`WxZjQ>tG zU6OeH%A*7~RDLRMa^<*+HMl~qaypz`+Nl0H_v^P-2odyX3bOh?_=@u8Y?9=hBhxrl zgc?exFCKv{BIA%;z#)?>sytC*mN{vu|~DE zl8N^zStte=1ypMMAS8FDtkm$(Q{F4?x#tkE#>+h=y{q3l58~+O-oH|^b}?34O!lXI zEANc3jX2=>e^w-U9L2KrtdYKvbEP*sMAf6~FEHc#*;2RBmU%UmJUOguvU7-~Jk)>@s5rz?`3j`W zrBu<`{=g5VzI+k<5If9sWd0&ERbV}^FpLsPpu%yy>B6)bzscfr3_m@ogIv6q;eWng z*{HqTwyKJe;Zlw~7ysA?))=e^74{b3# z$1R@!2Sz22U3Rnt#Q!g7dxC?3svAqcQ!^fV*QwOz^31|n@I=y!p3c2EAj5}Z!6oaa z`XEa?NhbB8rhQW^-wyvntlzLDUGd>zvbVNMnRcHWRqmj+SW?4QI$;`@lSIJ5bmge( zmG(|5OT&_Rd@gNNFtA&;eq^p_OZKVVyH@k|dt=R0wbhajaz!C6+ zuj`6ztV3sOS|v1k1eyp4>FUKd8wx7zOw!78Pi8fq<{Q}I0YTt4mx_DJf@K% zzIvE{EXXO8g;Yq<>_>i9bH7K=|6}hj-?HkS_iMM~+E z2I=l@0qKs5?(XjR?hC!|&--;8zdzvj;C{lP9?4Mjrt=LW9yQgM=3D+IZ#zCE{_Bc!BF_9PNg6Z{G%@p;0MB=3OdCzv-65&7J&`J!o%k3B}FV(p* zbOAP{0Z(neSyqp6rT3X2L?2eyxSURA{}h!sHAmG@VG~A*Ez}9?RE;I>7>I-ZOzcL4ybBMKdx@ysT=|@sXRgn%@7adG(A_9k;(Kv5r5M1CW-w<6SrUm zY-Lb{M;ScWXtJOE7%#d*0}L7YlhatMwKj(mu1^o<_i4z!D`N!!&v4rj(L>~uOG@Rh zRriVC7}nDC(AYI+fW$Et;VV+Ho}q~;9NlxDib3waAl5DpoyKD~pk$SyAJ|&Ms#}(Z zaO&G!_B%4sb9IMU167LWHD?)N)fj5*KYcnJ(B^wn%bYFvv&i!5q^LB~U7-|p-Hb0+ z=N)2t3GDkVPk&MZyCdr@xpx(3r@oijDyCiUIfP`!uALjLcBub+25BZYgs$bjgDbUZ zjnHjY%WoaETeFqfPIO~K2@QQN_p4cs$6?0;G2!6Vv+DPz}4XsWO^zI^cQ8{oI z6J96}WyQT50%UQug5yA99Ps_9pU!92%Bj2#Us>B#5ae~JbHAn|aAn0qq2Xp!Y%Vx8*8?M*NLi-z?9Fi{WTJKH2OtO|EH2Xxw3HrzH*4)&rRJ3L&Pl;{S|PjA8QKtkAZ;Xo63P5TiM86Es}X`@DSVRLpA z6qLnrr)k_FSKZC(xZaTs2V4Grk=|ShbxXb&GbQr(Wi8G6x(_-<+GQvBEgmbw2PwT3 zdImW)WIS*||Bx!V(MpT;#0I-8%f-gU5$1I!>qCaQ6dpybIO9k`2WljdXgoe%_iB6% z@{m0m4t*9kWg-@2fLf{{$n8kVR!9^{ZN+^hi()mcpm2JjQe)*-Su&!Nr%ZQlT7j!9 zS+8lCpIayy(>k6&p~WJ^OQDDHh}e~5NWWcLls=jsq!KEnON!nrfG+XIV_l9z3MVg3 zjn>bB%b}vo_#mlFZ)+ z+0KhIR-%79Rp8<0-hpM_MK)u%2cI-sK~)kzS-DRzOyTZSP)S)-8Pvqm3NfYxpIh1HD5)QbCq_%7GA| z?nu0~K9sO6N3Sb~A-wv6UYECVL1M@l>ZbMH%1W#nv zXFhw-Um^*vSD&!(;R=XQHT80US)eM<03bd)7>$PyR9=q=LIZnQzn1QJaw6W|b|5e} z_8TZ5eMSPIDV9x#zxWKnff}(OdQLOYp_yV48S;Y6(N)SNtLt2i@UKth#ez%pNz&*< zf|7+P&NAy7>mM`!$5XVLKq2xt0wS_=joRV8Y6=+{RQVjz1HyVBltm8fqJejIKrQa@ zYf_vErhdZFof?@2cj4-GEaXcq4&q{KLJ{TX-A+*hrK6Sz%oZe zJAQ4A&C(IJ^JLyL#WDw4<*(~VR4`btLn{C6eTV$o96GS4z`4GWLW=g3RG*RRu41EM zYi?6yKw8$d;jSi&6h}25+rA?uivGnD{%0TiX?1nFLX`n-LIOM1pOrxHH9?ZsJ_x>E z=#iN?|H$jlKchq4ayw!W^2F;e{FDeDL8M0rkOOx4oe%ZW4GLDaU-Wv#Q+cegKDj+?j<&iv5`Z-blbEv5jz%esN&Q)|EjFCg+AM{h9S0RK zKbAThqG>1B3-pw1MG4|*dF?|3XZ(l%8tjvmiz6C$c0h?IDiDEE;8dM>2hg1oo|=TM zrC&- zg#E1#7=L&lyoUoZ2I?f&yu!3W51;AGYPmU);J zkwM$yco>j<^iY$DQDpenGi3>;)rH2#1?2$#5O{zVV)xt7NkZA(`ZtA7=ChRP?Vuyf z@+BUPN5)d32l{?K$J0@dg+d-U12M!&R?_q$M#VM$&&K_$2d=13_BFPZ&R4ioE68Ww zxWaVMv`^oaD0KDD68}e?o@9_o3it+~13oL#CQHI;8m8d1AR*z& z-Twc2U-^?gn{=`{mM--t&suq!bz5V1vA-h zHTlUC*!dM(bGPD|P7r`^FXeNP-dy-5N^={U!}V)QH-$)yMFf~hpxXcuf>7@ERGCLX z4@q-`=>9r!-6`?I*TLkMrT^31Knw%IyqPkeNs9C~bdwN|{rq>mx(JY<_9sccEE*M) z3-wX!!v5jou-Dx@&-UCg^YvRu5b#%YK9w*)wXnKWXB~gyte~y(uLFTT!2kqGH4HEW zTrAOIC+@o+2#Ftw7jI7j{6oqtHLAXT%TuHmhyL{cETNWCmlO3+y>~A(E^lgYP<<=cY+|%jRYFQ(|88eF+Au-j z(2JQk^{Ev1p11pdL1z%ertSSg2@%;}&c4GjV`pkS-h8aRojH8m@B5K3P`!tW0@_B5 zw(s7mJd4l!>w$)#--4%(=~rnu;`V6(HY1b2pj@cb8})Z|zzcocAqO2iP;YA1_&QL9 z|M7a_A^EX@Cgsp``z^P#xeQj>|1m#ce?EQn+o!RmCu5vOad{__}EP z5O3+G4d$cSe6@$9mdoxr5BB*$la-LeQo3ngxwP4Nw7hGL{pFtG@8GZ81Pms8rax^N zs0&=j-tMYDVCN}hyvmh>oiH5F^{ZF=mVgMVD-o%e5BlOGp)`9PJ@Q;k%=N&>*phRR zz<6@tPINwaTx?)rCXj1q%D~XbqebnFYotBnd=}B-C4t?J2v2amNS@ndQ53k?;@)Y1 z4P42cs@}x%Ds8TQC%FFNVs^rkjb*{{0a6ZlQXKo&sNKw4PdvSEB&|MIr1~R~?A@?5 zvr!avB)}CB5QT7un0AhQ{LFRrH8^{U$9& z(@3IEKrxO#HG#l1ug?wkF}~hjVZz}~Ht}Y13wwg`_G?OUl-U3AA7+SbIJ|$&#NmHCJwGQ4RI6eXFCf!hjpwiv)j53i8iuMgl#mt z$(kE$U2kl5>ylt6>ruWO+pepwU)id!a9u6589bp%?sSurc3fFnjKveKMYySOuZPx` zT4LSCqRZdMdx&d;ZTDEe5rZiNj-5=&nmL5r&6PrZ@f1~jaHAA{>&MG;v2$mG97tG3 zjMKhEFb9k3SKtKY-{1D>4Me2j5pt^U{kCqFlYKZ5I;2|EhE+r(q)@ z_CAq)cnmHPxSldC>+brr+hjyP>>Bs@um0~N2%q%j&Ksy9`;fvDa8t`?ijKtILE8_( z!k>OmPG~?|!UN6c_HYX+v7otX?O+;L9k1%lb97gRraH8E9++h}-6roH{|ZV)9O9I@ z4#uX`MX_3Re!E)2cOObH8;l*7O1gU3^%&Q+D*GGp8+Pnw5rul#dhJ#lNZqV!UaZK; zz!z?XqnFm0{UbRaQH1-jc?|kqN#ps8_|BfY5c=yZ%q*STwxeOWPu#ABx70;vA6Fyb zfgt-SDERls2U!ySzG!?9Jp8cy4^;BbKVB?6*IUiFvcA{&biQa~6L!II_uOjMeRD(N z=f^drAAq>3l0E#k+4^X5l>S9>Aivp!ASLx?#Eh%Zs-$&HF<=UxETWD~P%NFNjuaSJ z4ZKF6hfY2tB;Uz6aPoUrkH@D^R3;Q%-4uz zReu1i{qvL-n2iv2%RqAAf`JX;KlCGs6hz(7S#_@6u?4}pF^ z^>NuwnRk;|vFPis*;iMSB?ry+vL0t)GwMJ5AfHtO1C+#gyc|V_#yuU^eU1M}+4#L~ zCf5aF-NxVwQUS-?8P&Ob5n!=(2J`h>y|b332tm4kw}V8>Cu5W0>Q++Lby;hB^4<16 z+)J-RItXhb;&c2jL}*$iQ8kWsq2>7s3z7;E{avlCncz`#S-(N%kf&3HI=8iv=Tg`z zwt9X|{dVs*{ig#jdBp}E`SCv$sY?(y0+(66TeC3u<%;k0lL!Q$uMUpMhTLJ<~8- z)JgM!6o15Cs?bV(YN{7p%~EUfr5t$RZ+(7V>Bh!CEegOrQ5bM${xrDsJ!ai(j`Tf{ zBVOeS(igH|7@+BluIUVs$g_oN~fBtghfX0DSG)v zi7L_tiks0l=nAFD)2aLVq42N#hZDUS<2Z3f@juy`so<@Va!E@7gq!a$YhBE#PFR~= zRm1ucEiwr1O#l`dFLoadsBJQw6dy9V*fPthX3#mtu2=P{G$nL{3Yk` zbiwOgAZbGf`9D9FS?ftBxqh&xR{NTeDkw(-6xBWN#sT@T!oN+BG<2Ph<8ci2nmqAfeEkYSD20U9XOwaU(Oi919KY5kEdlxf0VM@c zq8b3%{(QN}$4=EK4En8} zBX4gtw)DiOWM8vb{dzP%sjyGtjBsRDPy?F^3p5`ZJON;Grh`9*sbSOI@G9DRW~NE7 zY2m)U5Ry@3QlnCf?w$4X6b7sk{tR$q3QuIL_kP=?USgAiPQjQa7S$3BV=z=cXrQJ>EN z4Bjm+#b}fEFEfBX`6~@$v)Fqht)-#IjL!D@jg*+9h64R~EC8T9(W#zP%N&#W_i$O1 zu@|=;acP2C$6ETi=JI{2IgqF ze)g2AQQr-dpC?0Pc!C9xzYbq!YPFp0Wop5!-;$AFYi`_*rP_Bfte0~w z2u1UxyxlD)b4)EQ3^#4-;+KpdGY)f6)k?Zf+kMEr$vhJDzTOHH#bxb=fNfnM0BWOT z$tbXXN0n7LlG&R9xq&$i6(ohP5cqa9upLG;5iq6N51vD!?Rd%N*T;$#A|Tu0)KJ3j zClR95EH+qNGS4T+SVBJ2vZpFA#UU@9wu0~U7lPLO{V$eC%!jvXA=96c1))eZE_$W?W56&q9Kq0{|7L?|X}x4M~S06E58QE(qH$q4TtoKF#GRa6tDd@hk&%B%)ov2Kg`DUzyzJLafB zz+3@xRu6ZVi6-$_F*S&9f`Yz6llLYc{R)U9mLZ#U**bDAWuPQ1^84Ib-V`NN_I5c9 z{&vT&z+`*PdxjV^o`;Q;SSM0cVS@`c9w!|J`yD-xx#tVySu71kA_d^Z3l6v!DD+*J0wa&4yO@3aVcM&*lIbkM0${vpJxHC7>PCVRBMH7bla4qZ zF2N15dOM%&&HbEf7!1`nuCD}+=zDg*jcBd?iqu3EJpd6@_VK}Nzd*$WT2$!vRJMV7 zm`d}yF5V)VXI9cApd_#$d3^~+wz2ro+U2+A-bV&y|fsqAT~zs$KvZ!s}9SXDjy$gVVqW5;ZUnF z$#rNT-G!*eHiB_c@-|%%MH0MYlQuDm*@JHVc7{D<@t!^;!&0ZZUI~Gv?|pbI53OOa zWM#cIGmRvBLg9@?ySZb_WZFZNTKPZb7}EZ&o(N`PuQ7fCkP$80~jAx4NS3l0b z)Lf@H>|Xg8iHE8HXE2KpjtgS=2@gH!xOB+xS!XI}_8J_#t7 zG`j|mb|g`{ClQ{8lxf2=TLh|XUu2b?QA|ad*nW~_3?x^9;(FI7)S$^4?zw(! zkGc(hhtv!wOsm@w%G49<*z02C?g=QmXx104I7i5{O%RQr7Vk*vaO(RYkmB4AA&@Mk zdpnUi^7fZGNjGmKm_g(++2cnML=rp)v!>6|Y-Km}t``a?dr(4cs$j)n!e|bnagkD>viaDa)fqC7;);A}QOTU&AP#Vxz+b0G zTjA6+SR#}O)J>2(a{P8b)g|QJH}-NTKWb+s{)YS?WdzRYGIUAN>@!C?5qJoD{ewQ?eT}H`*7WrAt#qM!y?zt2f`?0k?)H&)HcDk%8Q>rAFJ=KT(^wOc8Dzz>h@7)! z83v$P1v$^YG3jMsdNIjTz%v2TyY7mBqP2cLw@4Yry&jl|HR{%LblZ-hLQ_V^RNN|9 zOq0%wHK7C)wvldLmVlI_G*+LHK`bK^z<{6m1aiwCesqc5DF?r z{U97gY~7u)@u1UULA#LPMn$>In-FEGMb*r&gQKy6uKq@9Uu$yEa0nAOke>Q5ZLyjE z*tSw#)AE-Pf!N}QL#cD35{SbR!3Zy-TevrV`SX>L1E!5$igA>3RZzg325H*I_Q(%# z&wU7BNDl#(>ln;3ovvHbkJns7RL=tn@?Q)cdksa?5~7Vi;h5Q^AzH6Rt zM1c&~cy2l}W1ajUAc%}p>e?R%nsFKioVbAMnB~6e6GMW2$+Ii8aswT^d0k$wUq{*! zCk*oR6@;rxGSas|2v<96H^-EoI7*2d1y(5DBvEb5fp{Cl8<$RbN zHHuYIZk*qLDIw1{Dx&}uq~9S9kUb`YK^Q4R=h#{ElU%UTUxf@+gTqj01-32%BO18y zG<^1?O|-`$V@tS{zRmX6%Vdk#^{>|D*noT88?eib*uJn8WHODhb>Yswpfk12F;>a^ z@y!AuwpyF^5^%m6a`X@z>?f7`5t@8itlc7pdk$Ms8TWK|&L#}!@R~bj(ffvn=m; zx!}5AtBcyLEu|R5)c1EDRGcxoYWbV(VeoYZRLK^*^*VKYBHb6ry983nTXlL!VkN~S zmm8XV?&`r=GFsz!vvC566qlL>_3!X6h?RgHyk~IwjRo}NlgTn#MMh~(<&D!q?Jovl zC|?_)N>SIm%uh#8%VhbG6$x3cXvR@9Y)gHdpBR0X&s-N%&W9uHY2BHxN+lP}}ZVOm`OnU(nA2ZdKz`fje7hn^BJ8zd(!vaZY zD^3ru9C;M4STIAKGKLLLN>}*MBhcwy38A_mbc=sZQVur)vE=e7B-x}wRd9U#s_wV& zHrAiEnap(x?&7SJu>f+~c^o+VSD zJR_>1A~S)*?PwdBTCKhX+^RW@{BM^M7B!m2q+%>q~dD7Fwy$#);r8|n6KYK z4Ai6JzmBxwQSCcCB@5oI`cO>Vjw>$~?T@odXe=IX*M0-B+*896&ZDO=bWC8f7dFQv zyB>07HhQ{r!AtDZ;^$oNHS%qRNixT#BcvRN4aH#ye(a}&v4x=yLyPaSl52)EhgKzXm__IWY0*6l-p+XTApoY%b6SWwCLHm2 zaf1h#pmrGBpCF}iXDWhAZlE_k#0t1XZPf(y#O<(z?-q-9f=!Un)axn=sT?!j7T!{# zKVN^|Nu56)k=N?#L$U)&m=JceCI>=P877%crYd3`lk^XQ0LYLqaE)k&RS*@ zcx`06qsakyyYi-$$h<*vQ<4?!#QGcZ4 zGZZ5ie)F0{k>3^U!#m=503>jMqz}lH^xs?;&4F&Y+`54bEhw;guP_w)CgUNu+u zr(Ii9+kYTM3n*^KQLKZiyXExs4K+k<=k(~)4DG(p5b_m?85D8OXI6^+@i?=|*{{3j zBSE@)FW8LIXMSLP?p1CD477S_8Vt-gDCc0Z4S`a;#pG%lGEan`R&mXi&?wm}AWqZE zVW7bRZfPTcPU5~;n-5G5Li*gkGZ7Nghn<=cecje!_LPvxz&Sgo<+ZUnCQZFIe4) zJ@^TEw06sY*;$$Nf`=ZL zWcL5y&iUSV$iNZyarrAE@#y=3?_hJyg6Id+Um}VGkT->T2aq}L$j2l<+E-I*NEA)K zg0l%m>~;vl$!q-$P^NLLhl{uHg;0eF0-0PRSQ#gamMirX_aAL5iFj@L#DWodG`hH6cGFLaW_X9Hi zyv>k<3;A-mRCTJ#Hyj* z<&I(h!4+@tU^}utN`+LE5gME%g=q1>=e3*JHfl0Q&7pMZV_2Vby{_!9nS_$##+h0o z@_mcdUQ~oUBGQce?^+$8^pd!@145H~@RKGDPiG1&spBM=6hv)MZOV~=;Hec4YIPY3 z>^h~pxtPGfd@U#yRIw7JvR@?J9+qG%<6 z;|d;DO?n)Z^`t=ei;t*xX%6eA}tA4&gf_w#kE2qI-}=LJtL?B3k?? z3O`d|Bu8xKiX4s*2D8F)_zM(w%pVoE-ip|==WMb~m2StaCIo?pFyRg;=*9<&B4W#* zNMXE2Gxc(2U!v&PApt$eoqBwLcm62IpCqbSM6&z~h}56itL|>yQ~`{Bed{(`wS6(d z!rq?{S$_t7Dq5TO$=-Ni5r{^g{jx{*A+cQ1sB?aBuxhA)DJI-z-Le;(3KE(WLMxmiRDbkQ9oFz6T1%HqU0*0r}`Sz)LI;c zWi!m^b|GcfXfV%x!Nh{eNiHr~j?W8S48DmGaEiL+4<13DPFjNS`i4ywgQ*th2?ZOz0>Tp5bmNp&h@f>Wp! z^o%7RK<(mya3{?tgy2S{}ztBBNuYGvIcl@B64^)DdbxBhHotoW9v- zA!1vs`zO(FVO&OdHN*XfUrIu&r{czTyu;Z>e2Id>`mO-hP;dNzNZIHkk=`Bwg;@3#kBn_Tg$kapw4Jq^i}fL<6&Mmm#{O zWt6qQy{8!bvz$*%{5MD1i%9xnRRfp=-^b40t@KG_%<$Rwc)TCvmU^K3ep0)^;2eYP zEZ=(3@!=~xS(R?IC+#-N7=2i1GKT#sD~F|O#WoLJbJaa`#?LtFB4Vj@yl(&&Cktcx zDb)#})^XuE?J?(Pq|M%ShYCSHoMCKLEjB#5U9B}R*~G8vO-s^+^n$e}iEH=q3)JQq zkpJR?@&?6p+FC%5M^EgQo(UQu4}W$tJDF~ix6MvP5b$1(+*;qw>?##6r_*8osP=4b z>E^q-7qZ_LfG%q$kVjTR3HFYAcO1d(wlE*422y2iV%x+eREk^Y+?l8w7Nl$vSZoA{an2r45(#s1th&$ep+1&YN}v z>!Ebi78B7@8J<3O-vA@#Bd$2d5A;nYnHo@lWLWg_Og!?YRrYWQdssh&dpI28t;z8< zf?&Rts|I-ysVQ5E@v~T$Oi5rNKwJnye49Z@$P-k6mD`Fx`JmG><9?i701JyX^v1_E z`K^VKPlA{tpdinE988nrGVn8_?hal$=aHI0={@l6(&kw?`YeC<_aMaOLL5;n8?{H{Bhacdz+9oGJ4DF5v#=;XfMVuQjN z(oEN_t!uOBt=P2?PB+nFLBH3`TTTgEScVKpI>Fof0Sp zRgY=QG9o&2m#Q!E6C)8?U+)1WapiTaFK9I**Yk_mG0Y3PdjU1g73t9#5Fe|gQay;fI{^G*#Y2_jIG+IFrmVdV=EzTMdCGrHjrD-wXXDOed7pIT}3a6 z9&I?yP2?U!XO_^R%5vkXvT)6h=6%g9i*hv0?IYjq#(L7@aEM2zKgMD{&SunPnWGt* z7V#-Y2{NvzpWJ%Uh^c^F*~ zZE0sD2HFdNqzK$xA#(3=DAhvRU{>qg3FAeIc2L11@pD&j>3zGp7$N=8Ph5nTC`fEE zj70;b68XJyf-*Qay8_%!d}C>qpBTj+IcmyqzH^cv&2@@B*1cbTm9GaPCU!kV;i4HU z%LFLl!Nw1b_8*4d%=t_!eedn*lh>6{k^Ku?sv!!?+sB)Ym3E5S@98&XovAKD>U62N z^(#gk+Kt;`Ss6wPB}{w=)D~w}9Rh;};4i*chQX`-+hIWxHYl#G7VC!<@P})bl`xGFXc;Zrxy|pB*^M)H_X#x~LfL-n zC(m6dynzw&x|)z)=7%hm#a&WZLLNrLecgT=*_DquE$-lr?;M`*xm^}&ZTElo_C6T& z1uM7U%1)DiFC*Kw_Jk+&frsLv+iObIY1pm~+H79*GBqB1AMwWM>R`$BHY|blGUV9l z$L{{o>xV?fg)5V50@nZ(i}S3I`}JPp=CGEQ>M@TA#E0D>?8~9m1YC>n(+z2NqBA$& zHk;&RzKtbWSXm_?piPS@mn>$y_fUV0_nr(Ho_+_v@s=>>5!?W25Ke(!k>}Y=I-5Jq z48L`w4UB;t+{G~cmny~c4+8bte4ChAc1arYFlzzdANDRE!HuaQyw=}d4%Q29zAvc*}%MekL1GD z#p|NPrr7n>8(^fH&{6qj)0IjFPm6gl_n_EwquIiVR2|;RpnG<_T0k0*RKJ3~UmVsq9%^H=Rx|9Q{Mun$GV}9VafCrr7GeMtpMXKCnNEoIJ>v zqcKDZ`1_5@;t1%FV|I>_4#atV&(t#}5^(0pF+yU3sTQHU$)NB+e0+H1e?-!B%KR=( z!XI^Wd>WTZmHOU`u7K(AC!DglRBLdz(PPcJ+j1hJ#C?sn?FhU8{^-%IndIwWq&xb$YitQ+pPZ`|qs|f`V^4=SEw}QX97h z+{l?UWy$@<&EIJBKHe4G%Ho@_gTGx{!P&YeKg-sTXsh=nO^sfpd_*-lts28hIcjoB za_NaWar?U8@>~#0T7_gmXZ|A609)ASrhFX89qQ+_;`nPuA14q~FIPCUepi}l;a}9R z9L;kK%{Slo=>4R2j&%_7Cy9F#W*SU%;yVScR$Ao z*Kua0VMEe~GPZC1dM7+v^4EpVA6%`8RN0M=d{~L_r>Z^gZ+-AL1kV`q-ux z$K}^6A^N5f!3-#Z+#eu0O97$+WjIerp^>Nvx z7s2LR!WV2&33j@=IOlgkjjwqk(+km<#xU+g-I+={VJFldGfV4hC)b-?apLREc^$ME zL&SfZW-%8^wp9s==w%n0EeqyV+b-Jeu-rxYF6>je|E35qnAPwc;_xS$s@kV(FeBTS z#>TWF_E`hxa>kXD6$+L${nw>Py)l@ebHWr0g!5*h7^M+`f zH64SyY6#Voz^m)4mz34w(=rL=6|Yl?P9kir>i~J-E9SrUnkfSQliD>2{Fm$qnDr*P zhw7E&Smp&oiUYZ7jce5JabYW0S^b=r*GrKG`a&)O+ND*}H3uK_CKjA+xT;BJE6k%$ zaKX_p{Etts+G!Lbc)%I0#c^wHY=xCXvhGG=A(4#deV3;1ng9vokqQ-^i6$gUh7T~RI$ zo*1!tMwKkS50gALTx_?nt=q>y?~oy4ZJ%bgduZ*f%KB^Yxh6&I~N{ z5G=`^-z`8k5OpDvP0qtBB;ttrvox=7AeSHSJkQoHa~y6n*R;Y)jKN)MKV~RMu^q_$ zq68GLu~rTJT1#<}51K_{u#pO>3p{ZL6qREPGZ=Zw>lKjuCKPm3i~FdIDdaGx+2{*O zX;6I2_l%=8yfD+}@U-LUb2;J4Y^F(JJ zm$$`7((6PX`d+y-Hh^6jHPQ;n@RMVy*UHT4kIN0N2gB#z<;iM?)rejz(sd54avMm7 z^o0vhD~7fx=?i?oin?4c!(ez^tK+q70=pJfp@3&{qFgmDSNlS9L}D#Gm_9TeH{J29 z+$!{48a5JVo&Bh6c-PvXbQ`#BxUbdC?}cMMmL~0Jsydd>Qf6P(B?={MNOZ|XBuoxHOwfEaEdWA`Iy2N6CtXkXb-a70uZnaijV9#KY{h{3P$4tcMu;xC-24pn5ejq1Ca4%}o_EYY-6ue63` zG$=iJq^kBJS~yk=Ru-|Ntd6Zh+Ee-%b?_$F*bCibbVF2lR`WpUt8J-ES(4bv#mVbHfsD z=1kvO*{4odd*!HAo&DN60LGO8VDJyKakgV86@ruWiw;@$TEZLDqx7;$00;*#GGeIf zCdVl!&E23Jor?$khU(#Z!;`2G<>xa||dDG#o04p!c)?{_vj={?mm2tl&Q@_|FRdvx5KswgMiE4^CJ4 z*zo^zaJRO?jEYB5W>pvtNMJK*Cmqynrewv?sbu%X9jdEW?M#n$M-)hyO}=D8(&4DA zw7g1CxJ{_89!%ercwf&gu{$$X9a>zhVC0rp)YMQkuBHy2)V8E^h>@_cSU*s3R;6`t zs#~{O0X$ahu12#f(eSIZI_7j!d^G+nx-WH8L)gj5 zMXMDNU#t0A-^3`v!LQ5WQ$fFUL;a)xW06LjgTH}G{KZA_NxcK%^6^YzhTaF4{TYXJ zcMW#^^U{-@*Jgd~{`(5r0L8(4sx)Fff=nek)!o*)de%}lpo^^HNV})F>0)NVW?Fxe z$J?`uQI7k#1O4>U!>ydtL}wwQvZl(ft7kZreEWbpCh~%Q7decF``5;-_KwVKWaeB% zrnnp4gG0&Ve5}0zp$QEVvCFbvK93gz62AFWYrnwru}p@6-epDRXzCn`Wris%{$D2{ zO$?2X?W-v$Epp_%D5>B0Qhk=at~ZjsH2tSsJvWE!_KsYp6)7J{22ulLza8-kV|c!6 zz~^sgj~R%&d@y%yGU_o*4O^bC{xrWZdTq2c*~i|*T`QK}v~W40jOpiCb3Ws^=+&lQ zagv^z$fvU?_~25$ZM5sa?y+$Zy@UQ9CvjkB_nvp4&th8HrQOILXL(=}UWCJ}<#4xY z*Sw&)*}`vrA)EVl&&*YCOG8!`fcgoWN;dmWQqNOIUSHUz;@s}p{b~;>i>)~KIK1CG z%uAD<{ls$+ly~@$?W8k2dmwY^fYP5z1af)wmjv;y{rbEo%Ma1XLZ|8G;dNh}6N*Op z+Vt`ee}jHU#ZcjtLyz76$JBMlQ~CYzZ#T+lC`pl(nUM$)nt#^YKC zY-J7X!%d9qkP&%E3#{#18><~IH(968qN582y2LLQSdkV)Q)jQoUO2w${Y6K?`!s*B zFLuJ%aD2F4Z#`5}-{D7Bu%7K#=hpStPQ6yDy06JU@vTJ_uP?;bOnsM7prH{l3MP(? zkn~*>6zaijyjZQYpoPad;Hmp$-##x`Ha*T|Z@yE)F!hn#7dS!L5q5(=KE}|jnJ4`PQ8kIx>chK z_De%W^W_e%i71q1cOIG!!C%f*S?$UvlfqS5T;795e_RGTP3p+?ux8ozVZ*BZ&Z@14 z65@#On71&colX~(WD;?3E_OSH%9TH{-1m*A^Kyxh$zzX4nk+iAd~3BT7W$xbtlcq07h4e@c-}N^I%lhx@@2{5|&9K$DuYS=kP3hphr%{YqGtVwY=9x zl==(8Y$lVhmV^c{neUfA%nR$7=y1-OMogKy;2jp}R8_BKzGpaAoEuu-8Yz%+iSXS} z9jbq8!(LK7a%dTi~R^?dlR;;x1yRA+$Pdy*$IB)vhs!VTXqk7S|M2pWg zt7GtCyy8k^Le+H10ot`mu3Bit=75_qEO}AUCi=QqSY43cAop;Iev^CE8hzY0@yqs+3S^(KR5fnS z)%tT4R^3{%?)?ks;(`h3l~Ryu>Ms!6U?1; zFd2Q%7R%9Yk;47{aoJfa4;m}OFXax02OAwUTPdQ4yThy4qsI8Ic<^#ZF(?5LLd-5a zUixK}|K*Pmohav6&8pMom#n$<4;Qda@>Q@n!_(}NT4jBzWaB9Xw z#@~LD71Qc^1kK*q&Sa3l#^H)6R)jF7%}j`nqzE2U8OdeZ9SGa0eO)r(whu6D50$x{oK@Gc+3;gnN&g>!U+9i1+y-{`YpqLBH$>ql79PHQ?nm4 zs&{=mD7wQ|X>iDgqxZ5OO2N(Or$`CfW%gnn=26NOM+Uq{zezIlg6}+Yoqf?vBfR!g zhV$h!o6`q8QU<0l!@ajZQch&vWh|RonDT&S2@yx6P46p7((R_2t zuwA#tX$cjoZ>&R|Z#w3;^>sa)!MD7qBm(4wAYpd0h3GjC%{N!oL?%D8Txe+L>3`C_ zy+ZDZH8vcXUWV>NeEP4xf`v2h^8V<>(Zq0*lD1nf5TBF_#|z^pMob| z8_FuBhQp(txDHVUdzuz7AfoQ)ZOri2Sg!bNkSh>Q9wk@=R=NBMwd8KEeiPYWb{^*R z+?|w=8&N>hD_%ivP6Xr(JG6fueMeyLS7QwCw~iBm96H87q-O)5#gp zUw9km8yoyce^E!5V6sWNN+-k_FGDm8ib$3OcNRC$Y3aIy*Y@@3Rh-W4a3 zD(OF2uUrn~osCt(u$8jiAnU4U*H6J-la}sG1W2}jy1T+jv$yfN~?r}y6_++kXQ)H z<{?w@9I1*Hzt-%dJ81k^=Qv(jM>WXD^zc6$z7^qfgsPFC5&pAzNv?&!_aZA&MmBwN z)2G_K4l;WZVDl*=TRvT3$4+#mdIGY*akd++KWr zEgD;M{EMo4xoUe}(TDB!*>N*9zxy%rU-(x?}t z9wAKgqZ%3VTYp0s2IiIhSFfcv$bVD?;-7;3A}7$8{-C$pLW;Ff@U2F~lHb?~aJHL0 z)G;+hc&yqVFXc>=foXbl$2jFZmZXja-Dj$nlXwaCitQcvwm%##(Wd9JLV+x|Chcd; zo%O+|mgGW32FpEXeD96TM34KU?i>zz=injTv`>rv-44Cve8uu$%ahvNE-I?Bq zuT$=2Rl9_nTy{+C*tT!gu0t3hR}Z@;Uf-pkXSeyD`B)`1IhM*B3FP@Z`|8MUJ4B4- zUyVt*`oq<%xv^3@t_*)Y5_XltW!sCJa#z8Q+T);!d8XqyrE`+Bz9wj9xoqSTZKpWQ z80-9%IHzJUTa?`_L8Lc}E$Qbczm6Pjp1kMhEx0rVr8Er;GkmX9iPJ(02kI#CtxP`&Qtx zbe|a~)nTWv2oDp3gU9HnwLY9^z|!Nk@UC*`J9hBT%2M>X2=`B_U)gai<=-xSLCW+_ z(4y|$e#&SK1A{{~>5UsdEE@wK#1eAH*6w6vm$w{M#!l{)bsX-G7?SNHJ<4y%1KhtN zwzqfG+o^liT-vspAdB%XV35YjmNC~TGq>!N@L#@q`8T`$Idhvak%$AywfZY`$Wz3L zrm=@#$=|p-dCa%C=ID}#^7H!Kx)5~D)>@qb?B@sg)E-Vp&+*S^r|4K${!Iu0ka%n1_(6O}-eDeGmVH$U7YbpE zmsp}|aatL?-GUS`I_Xp6{A}$fv6x#k8ONhFh%ZqvR0l$Lw^pos-MsNYmF136gPv)M z`T7u102|JbyeG)iE}Qt8GSjgy#xVZ;99KD;UUv1~f|A{=ut#qbwbS1mhN1@2Irzu^ zQleDY(Be>P6G0Drtez&OaIuu0*=?>>f3H3LX@>~5fE zbElHN=Sf^ta)XxA>4|(9PThN4L{am|-VeoAgAH?gZuxKfoF{!OIdW9tI@*;x!y{`D z0-KdRSQUZP9yWQzz1iP(dyDs>gV(P6NnK&lPEq# zYNqG~vF2?o*?3kM_qOz2xT)$qsYdmiopCiVwiwSNR*j`i4Y}P%#0Oh`Ho{|bFG#ba zg;(P7r9x5tb54Z{01S@^O)d)_CS7bk4DCA9m2!r}@%G_ZEla}i&2Oof1rcZ=bW)wp zxww=QIsJz`LufB_XELwGO7T||VB5;paktao^>fX3BiC48jLKIZoZQ=|pL z5cV)4m>q%nFkFE}6Tb88O*@N-DECy94_%9{8Y2Yj)Yhey+qQ6cb+qZZvpR0wk%Pf> zutL*%!Np-4vmG6zJL4U1oIDa*#FM6P>kCZ`7K{HjXWV7*@Z=op_1g=2i7*?N?m^BA z8gs)pLIp1R-hR9wE)Z151dnrsX(>CpCDBwW2=`L;`gI-7MI}HyAi<+{G1Ilzc-B;8 zEG^^8to6*8{tu2=yx^tt2YEO#-6#5N*WUc7BZg|-~SbipA|lv4iE`3~jZ+XH?YFF(fo$$B*5K3%6G z@(%NM$d_P&=~&Z_&t>exVv@=!@n7O!!0-}CSWNfDFPR#?!Yr`JvcTvdLq|biFOBJe zJE(j#&)-jGriQF9j@8`S1``c_N+^~dGtMOq4cgZH&7DaF!NaD-6{p)$`NSDI6+;lD z8(`)O)J=!iMwD-5yQ*TpSo-7GOyYF3OO|Yuu@tUICHyhQDdP_lh!_-EvjUcXB*WGS zlVV}O`4L)fTC}NQ9Nu&_5!F!p3~{RX>NirsWQoC{rx}dqQAMwZ{2O6_eC|Ma)P(>x zh09a)6-Lb0(cC%#L69sF}xPR6aNU^xV=F8d38|0syGQBLgR>dJM`&(KiwTfp2qFlWw zM=HYPU0O42K07zJnTKAmak>M8U{6ZOu2-pPl=5>8bB;N`!NI~lNmwNaBIXr5ytG+9 zi`N@%f%e+_Yfo9puW2veP+9S2iQ8Re9h0*v5Z#rL%n zjjqyastg~=UpC4&suBU|(>_GD6Rad%?I#nIG8*zB7`^t8>G#4l;#?m`H^^^Xu&H-( zZ0DyD8f#kQtYjPRbB%q2A8!cpt*kc2^>+9`n(ey^8FR`^qP#0$3&Fi%Nvr%cIsPovy&m?((qfBvIoo;PGuXeeaI<^amI+~%@Y45z47zFQ*-V;oIYk)%%_GfX0c_ z!oOL0uY31QTlw7uav&qz#S1Vk*AiDu&)2fZ=xe;s>%5z1+C1-VDk-N#p4A>DAYu7j zyU?4#;K+L8<4bR>UTUtTKhBpXdAnvOlF-o3ppxet{TJFyB+Gt3m2yM8N&Vm+q9~v- zcEilWhp$L|tAl{1Lij=2PwNTmjV{~9AO=kzb!aSFW#rtpUl)TTll*7KJkt4!hXa4b zP$-4r-dOERwHfyi08nvnQK+-(BkxZo?1l6}tvnusqa&sRnT( zX>^&=%}c1M{xD3OB_w$bZF2A7Ofu2#E8^SNJnFX)vKLIPsk&6Dx~~Ifh%<#G*WVyb zxBXEbmM9#>^@R-+W&{zED@7|eDKjQnK&oHq^kU~1XOu0kHQ8UC7Nr%}s%q6HRN1@y zE7H`%><6l3R8-I{4> zf}>UOlN&Dux~NuvCcrs$spE>pQ; zydyZA79yL)bn7#eVg(=^7_7oV$v#qsclWFnw3K~-gk=w#=B{?dh!+@Z7tAnb5BM!} z&>8$j%^<$f=YZ0|=0vkY!5KB?m&YcEu5G*j>H8Hc{S z|8$in4GBGEK{w`)YEkRXcg3h?CozC46QsY#0U1h2>oNb;dS!6_7ja*{`#QnVg6rQ1 zB|mhp$DS$7{|J!`c2;(I))fJcvS#@tbttT)eT2M5x&z=FYEpBpgzzpT1!%@7ZCZ|$ zWG3^4OUs_KK|=;L@iT&!R3^ITsL9kKccti1mjPuT_WhtS?WV8x!h5` z+BSMkZN5|*ERrM*9{$l+oWccN@96Uq{hbFIZ;vQ(dhS`m+nM0(JoMs|JeAQlEz3XX zLJ@u7QpsDol7>%IIey;e8bz{xGaL`Y+tBL3-+F}UQ{Gl{3hWk2)fEk!n>O1zV?Ht>xo0LuSBP++p0rxLIG z4h;3z%>Lwl(I}r)?46yhbXl;dPK^^{8H8#t*j8ij zg{CWQ#pdl6dSe`+X+T^6oDx+oj%LJ)kMw@>4QTpOqvrc3NC3BVf&=Lmp>wyjZ1U*R zwGhD~dp#Nq=G*8fo;V|j)KtLoQlk{*u^uwPkIJ_s0dXw&MwJLFhzQ8PK_@Tn zj~zWE0dE2o&5cT(qa1ab`II;;oa9%Y$Of@m7^y6fxFsN*OKqxkwQa2cxz(u+UAIPF zTcM(C3o`FtzI0hI>+tBO>j{tIykHmXuh=SD-1rG4Yp!y-?6r5ki+XOQjY$4XOeYVEDE5 zzRn!vI}?aAE3$sn%~Kgq^&xgl5FFDm?1xP7f5<1aatYB!LQxGt9DjHXk8^@)@mF)! zHmba1PWYnluueFhIUU?gn)eu*$lxq2dtmUC{Ah&H=Y$lS18SV&3&J-#_#DiXH%Toh zII>guCy!+2?Ug1)5kK zrtOrZZR*%HbCgA+(YIZf3i6x*{&9d}dFADbxng+5f=2Ax?B?Kf>vIAQi4CmSl3F3O zl2UvlA;B`G2}9m%=qtj3`9E)ir;M&ZhBB)4dF%AJxsHzMyI+l7Mk4FqG|rg`v;D?= zAbII*%zWU*1o=ye0Nl*;P513ErTsO6pPxEBG5*pi0L`wdK?|7e6PKhM{!GiqhYZKO zIXokwK{}vSS8W^RHHc9(Yt=QL3NNRWa_m1U+tZweK`s)|$fc$Wg_%j01tZz`qTHj8 zqidWy^b~~i#?H2lC>(;3;KW4YcCx8m#wxc{tj$>qy60YWihx-y7(<>W%>~sB*!Ye+wdy-3xRqFj)(fEG%%_x;oRXPZ50rk#;ULl43mg{4J}u zbpFeq5AD9GrYAs~D@u}9wq)KPrG4JC3V@&$N3Y+AFM=FSGbDE)C(@=_bxuy&78(a)n-OuM z*5LKbM(PCQqlgiK$&rk+<@vZ2A?+FD4^=C&iz-*qk;7yNxd+hPkMjvk6W%iAsocI; zM7qTU%?HtRMYfhq5T7!H)yHn#a@1aRXZ>)7RV{@AdIWqQr$K&ta$+I5CF{4%y{i{_ z9T+#wGWI-Dw9doY6Jp>6#3p{O817%!6h1r2{qmpH&>yur{0Sw*Nd}(K-Z1f-`P4b{ zo_8wJSoyqRKMR<6fj;CJ&`Oboz`1*;-gq(&q(8m6qHoMy%hkK9;kMbeQqBB5w95ZF zDivCEoHlG+qzgncH-H2CQRkKv;KCeUop*E>3PYk$TOnQ|OaO&T&|saA9bp3Df!T-A z&1CFK=(9mJxgJK)7YQC(A~M+?|5Y@&j?bKLb!!6T=J2AV03Ud6wB@G_SfplH;Kl&{ zN-aQefw_UObzsp|j!&*HEH_m-p-oN;UXkZ{A10N1WOhpijQ9=jw>tdLDki&eX^`^a zZ{G$^OyF%(%hA~yJ~u(gTxr=JRJ)Xcs~!(>12rbC8c&fNa6F+`%-OC)zSr39~qcpZ0A^$ItU zeg(Li`r3=l(c-NYYca({dek52!B2IUo+HUN$fz1`C|M$JTBpJ%mf?eVr6_X>`#nRG zx9PM88AAR6G%!Gmf~I{F^86pOtP7*82H zkoJjRhT$t~lQOjJ)(E{D#6Z~Jg@0r886D05K{sv?C7QeGdqpF-&-4}eC<82~u!l&gs|vZ@rC!Y_wS%HDFLK8uJ37~(xp2d*;Z5v{ zXbDxkk=*=NAFMmDN{ffvPJx$mFXkwU$ZEBuKV*ZH3dtAvJFpPUrj;l0c&K;J+=SrWcL|VTo5|?N>Wy>U-V-%At!N6a zJ?6b{_{aYvAi0)W3uX7}AEa}hw|8HJls%l3K-}re+@rK+r`jAP^&u!X^#OKiMDRYa ze`x~=ZZZVF;RJwpZT9B#b-J`v*P8O>_OORvgZzouPAX_16IFNGBTK|&56Y-{5Q&E| z&o61%pTeG5=Kaen_J%u~Y;U<`3RX5P&->ue0=FdIsqP+{%)vsd|LjGjGX6#! zy!aR5JA`BlX4|Rvqz#MPE!b(8V_qr|V=u`5^F+9dT)jfn9J8$gab2_W82lea_!- z0iGP8$#bSBl@A6VhzE<5V|WCe24zl`R9lRHL-bd1KoazCC+#W0{zze)Uj8jJu*rE7O7>nEBR_-$T7Y=@Kcpn9fXso^|6sWeQ&Dm0p5M_xruy6{(PS zG@f&hGG}y8I$841ehv=2&~>a&6&KqwwIa4Q0MODWb5xqc6YJR%SWXarGZUA}oJ6FHAzjXjQ( zGq-7hLyQ85CP>2VpdPtenhA$5eI$R$KsFJ$9Zb@Uaurs38f*9C^88nnXk~_tQ{GPA zWWrIa=m!VekbM!n-f|xjGwxxQPjIk6;u-aR+vhdzLzIg{aZS+5z<2Y^S@TqO9$coy z-8T^ACE8GO+W79jDW6^XRvzYQ9$r0n7P_b^MGLYUs`oydV|KKXG*1e0x_AkLcO4*y zK7!*R{lA5lM%sE7QYdd5(?oL%aJw0ZQQ%A(!4<8zjBj840&&FkDAAVhw@ZLgCuuEy z2hI>ux(SBuu;?7?sP;Jm+{_BJatw~?DQUQMzSX3aQT9WEu2dAO3QA+QubB}RG~!r2vZ+JIHe)T6E> zsXlaSaS`xZPQkWFzTxHsFki69!Lte*L3+>6z;rP;{N-I||myAlg z^(}~10S$V6g!CZa90R)>gCUVKV%`oEJNOG)yah(vW6WSmUk1k#PIieft#YQH-xjGI zqZqqT-*piT=K*kOjgZQ>{GP|M~LEv?n{x^f5IS?jVNcDP?U zH2?$Mc^nV;hRfPjtpu6YAzhJhl_er|19d@6d8Cw?zr#gPu%!!Os#dsa6}M7m z+Ea_6 ziOowaWkxB%O+hqoK;jAn<5bvhIN|1&!JW5eIs%T_qqx{x$0^1q?EL=*AYO1|{F(M> zgo`o#NvPF8M>6^#^HJF|pyRq(+?D_v<1WC=qcYRQxYVp~0x+q$X5IVEN+7y6w$-4S zrKlL(_V2~Z=PoY@%jm;;sDA)CN7wjRT~#Qj&%qJGWPMqXqY8gc2*L{lre3^zAgk~* zMBigKP)tmS-v3INChmt%uxaIz3`N!(QFr{_{mqm3mH0kj;IQ&VC58(mykApik8hRV3p~3?9<{u^Y1> zFjILx(5i7ygO_7tzr)VAzG5b?%7>2=_&`^Q*zZ^bcY#2})-9h~SIJQ6B&YolxxGCO z3NG^(*9dsI>HaxQ1L3vh*$&OtmSs83Ukw97l-P z^lp&nM7glDMf+zFjxdz}SqQD77?Ryt_q?SB5414u_qE^N8$;;_r)1sBf@I22QWB(C ze%kjA4ZuLw;Qvtxz@`E!QwJ4?)LT|6Iyg+{)aDwxN?}y_+~}Kw>_HrUlDd9`j2H8j z#x(HR8vSvCKr4tBsm~c%4K!I!)znaYZh2sWP5+kcF?;vUifC67Rsj180-RH;`N&TB(Sz)#wB!j2S$@6G;P)ZK!-P}`27Y7WGr6b&u~7O zI}&K5qJ9rR06wv6u3TNFc#2Hu6R2Q_NOb&s<$FsATH!S>coY-jyg|{MoSS*wt8^qM zXoG-*{7THOS?HAWwLjqubgLOYQmNux>iDrrX&fHTZGL_A+C8^# zm4ee>R72TLT_+tmpyNz zPEsy^uG+lX{+^0HJotvdX8e0GgtNWsuiL>GL5q&E$!#G6si&)i#DAZ-%7I>{m8 zZf;{7O?covp8T>L#m`NBDyz$C-#6d5zjd)h?w4D2%>|0Xpt#IoSpXA3^ZPQ;EdtnFH=Ep=X(8U0s&>X?D;h@@PZ*X$Gy~qMKTkE{*Dq z)#Tw%gtknvRAtz&`ofMski1Lfi`fCitR|-bo)%b0LIpT8jqRdvA}kr2aqX`LTnbn)GH z9lGdkjwgDK%S=Y>0=c0-evJVM?q)j!=;@um5 zsE1Y$U*Qm=O)v$D=hX&%i=v0k8J?GtwJEg&?z=2j+N^z%^!8M_IAk3=Zx_+#*(%e7 zu^d^~yHP_(0-6P*D)~N3U~p9;0xJz#4Ab(#ZbwaxTLpe4_zp|N@iZZCM~rjxg;uBc z5I!d^UGv10W-yJ~*$JJ(`t=MybH5`59FqT#GnYQ`+Kl9OC{%CHYKYqI=UAe8<}%Y?BbSkrJnonuBp{hkVWM_p^>PCTi+Hf^bHdISY4X=&KgUV!~UAgq&v4 zHTMXA(fWFhlCSLNyw0p!fJRmP4|)26Qx|zV-{d<7e1fNNy2qGvZ`-7Czo~*R)=vg2 zR2z>U?sA(MQ<qFK5^1IIk9)-j4N{%nJ;X*azyhqBc?JcL5G!Er+RTg9{CE$ua#D z=K;o4RP%Dwq5A2lKB(?OpsEn(wim6BFx*Pd@RS2__xe6VPpo7BG#^O-ygHWexNpVX zWPD-TC;EoN3|BCkXI??n8NnVt!2qWfL6Ry|azw3ctkI1g?ZRkc~PT2avCr-zb(dz6C9W z;X7##-#R1BX(eIgis$jZrL@-W&O&c0F3w1esC{sj%C?bN)cL4mp;s?!Xzi>)mPs$p zD|EO-;1^oVSW~k;#53I<+?VwA0r&cksE=VsyTQj>*T174&}x4KcAe-Q#m7SH4SZsp z!Ry738GPEG9pO1EI680T@YVu*tbjdO9${#0PjjqVz=e)Ogx-^PBM$pLL0@Ux9iFrX z`K4k~9>~1H1M#1=Me$70*i@`zEh_{^)hCnF)el2?I^2&&m#b&O)G`z$fD8y=Nk0!9 zNg!#!4TzDF9J>#+UJ$vdO0rc& zaps(X1i1N%zQKB_ansV>r!8&$-1Q#?s)jEMR$cbMEt(tVsaNSV6+yk*_Ig|zRsV(1 zB>+z2;yB*naTn2IsKdVf0ifjcWzAl_@PX?gpP|^I(;gO#>m*$%n;r(Iw;XtMSBQq< zX^vKPxByL=!t1v@h$s?rp&eJ9|$V(OsE?$JVa}GY1 zXSMsu<_CEBR!EO?*MI7qJ*>Pxq6OUhx(ggRR25&*!D*$D%2GzmEl5&s@JKpC2;=vI z!)^3p(Kstgj9H=jspH3VH91i{COH8_+XvU@y8}8$GlBaTXhbk6hni|iU>cIt{90<) zcZb8~DK(zu2q!*=6cB64}r@eCLA;+?)|Bi{oQ1EYUu_>-k!UsLf#^{+`G;Y6b19$1gwS zC*6=QpO^1eM(pUy%Sa)1JQbpaw|rj3zgbqkMcgVgzLi<=#dK4BN>y8h3 z#%F%SmnoX233ANVNTa6}5BEG0wK_5k4-fESU-A>yR1_2nwn--yFDp8j@vvXWnO*~j z@m`h+*+tNawfNRdBn<+`Pwyx|?4tH|6k*P80jc*Zvs0e!f-99|beTH52m7+rMvtpM zW>-0?^Ia`*dYsnNd-vtkZ7MW+@r}t~i0!LK2+6YH`wUhSRE7g$k?f-8^asxuSw4b~ zpj#LD3cI_eU7ITDXk9tyH@_T$<#%IOIZRD<*7J%xPt);%=!T8t$OE(} z8A?hTs?- zU*2=*{9BcyH8}6~xbM^*EX+d4NanlcQw5q>grFuWx(@iJz z$BQi30e%2?(bn$p}!}jpFn00iP=OTi3bzjhC;A@5+Yd+jV zP3^4>`i-Z=g`&rK)@$RJUZzlr2#a9LI+A$xJbk%z{JFJ_(jL>wMi2HC1fNUVus2_c z$?s^{e(!$AanrWtL$u@OOO+a?yzZX*3_G9&-|CNbk#$sJ*sup~j*k}_MkALt4R)i{ zs7i$H9@5mc>Z9c^1rT1*pk3mx&o5modTb(WT3!5D-yy7)7C#wt|K-%uKF#LDAi%`f zr03%2j@hfUZJ@NI6vEYEzvKEHR>v#Kq*j`e=hEH zb=fg;AMG)QhXQf|`Q}iIW z1LZXF9{bsKxy*7oruee(7J9=S39i87Hpo03c6643OTc!!dS|2H{s?c%e@H@H9};c~P?9^K)4TZ8 z8k(fV^SXW@Uk^tv_a~_HVkHLGRUC>5?m}?H#ZE(T~71Mz;5XEtMu!|fh z&l$$<=cSL7O%M6lHH$E{wy{*qdfbi$JpxDq{Gnk%t~w>sm(#EnfyJd}{jFI2{rn7j zR$dic8UZ(oGycJ;flA{HDClLWto{6yc*OO4;bKkfs7_Od3v#xik13c*%46n`f(hJ_ z`UJE*fg<$v$l8St{T;u0dEu=d=9>XJf128Wvt+?E_HHbyD;-yqc4Qz~X56T5O_o`( zYE7-Q8tk;@D1p*gzevByHWmw0v>IQ19F}tI@UvNuC5?20)*l5$2sqNN!a(DYq8fBa zf&im9_I`Rp)M?(G*9~D^!sbwnU-S|UiU!tSH6KA8cKOQ9+xnYCVAT(mXSt3?chAOp z?9I2{e5d#AFNVPJ4p5d+(fbIwp|#;KyBOWo_c*yF~u!De% zWgFG~Lht1fn6MqKeL1%OrZci0PL?OmE`LHElmXeg5;BmMQVg~Kbxr_rL?3s_ELSZP zNuj802-x~W*zyXDZ{}R4&Hd=r(5}vKwSiSplIgk(npTk)$!(saqeF2MWYw^q ztHP6`8!;uEsfMKKf3sd7i2>D*=8_yBVmVkto@xo0?!HpcySKE*S)rVgA8639stfu^ zzbL0)gMp;4!Hqh}r4X1m9UkoUWxk!U!{gEY5$s6CSv9|pxWo)jHicfGu%u%U;sAx@ zftSC930&mRSxu8!u2?pbLbXU5I!#M_1VK4G7{1_7rStFr7F@Muog(jFL+SE&XTamO zA@TC|L4`(bWm<&=p?tTmPykymk*vQs%9PuY+ckZZ6%YB}!^X|`NlI#8FyCM z$w;S_^1ruQV>%H})*H+2BH)<6L*Xsl0uWKKwuX{t_;~jj97J4qHy4?KqV%lAQr*3; zFJ+W+Y~M%QIRw)h>Kgjbg{GhuIQVPbcbhpK|4DP}s#y-=^$<=M&XCPTdMuSm96Qbz zE*^_Yp^$+aGLFAYB{c1pYWs>oH9rf8X1bXB$=a+h+zMvg6twp>QHq>BnB(~xlzYH& zoy05=)Fdg=a;(8D-0$HE%Cm#`$19<(Ibl858%nA3e~su9o;59aplS$?m1!%+eE`jC z_`X%Q$`7LYgO0Jub8qE;>r$}V)GwgRg({B+6sLf$hUgo_C)X2LdgJMs)IRoTcMPq! zN%K16>kx<*65un`f?0eRxvp6i1$Xpoxvop7zf{pGN`gkh-b*?vU{sJ+iD7dH=cwHI zInV3%P}$U${vbbZA6>M6yF%!0sdgsde*n>r-e|&U8i$est34%2s^04kGvN{5_&gA{7_A@C^|4R|;VCgu;yAS+$AGnN(37!{2xQ4z9kpS*1fAPq6BxMdH`10 zh(2^Tkbz~czQ^vW

x_PwA3C?N*Q~0!(^CuyZ<>4nqMI%ZFjk%BIV90o5;oKsiHt z(wa1%W$5irM7SkV@T9#4y$Dwxhk>raEdEU;tblC&wpkAq$)EZH80!q-V+=QeUI7^U zty-MvUePr1Z9;6%Zfc^u!=pTUbJw=Av(?Y#94u6bk>$jtu*&7BUuJh|jF^8ly$m3@ zqB-`K{(_eF*sAxRgR%gtxnMW>P*ETu+&aM)!vu&qD@=yY&&n*QTDys0x57kiZF((K zKrw>jR>(7{=t_B+3+{y|kLSDiBfUQX&b|J zt(=jLRf+OjXO^?w6|^^PdNbtZ06Nk^XKpY`ooZim|L~PNwq0!H9goM0f5n6UhpqU{ z5M~Ez?fb{;ttq2BmoyesEjxcs)4vH8c2?etw-xGx;`1}iA<0tTRjpog6*{`(H@%~- zx+zy*^z0-CIH7N@1k!5a9)?cRnM+B?RZsu%R&|OA#iYp#GaZS@(mw7X9T+@?DAvy(*zmY zzwvGYL0>WFZg>cWgAr~rIn-@hh6?oFh+y9x!!o(;Y+I#{+nu4e{ zOjJ)1|E&mk!I5~<`2G?s5DpbdkV0u2tNHk&pzD0u%e#BN<^V-VvnTIhsYVHAb-{DX zDWMZ*yyJp--XTtwYw%BJUwK>`>5flv4r)J&BY;sZr)@0RDxhk354E=*G5iSK>?R+s zo;!X+As4PHtj+_DOR|N$VRLjV-?Z4FLe{1#(MO1rB$NE#fXcv)4XMA$0%@a1aOIR| z%LtU)&jCcti}kauJeChYcUxg0Je)D9FbUsYI%9t?&t}uez?%;#9r*lh<>7j~Zj|60$Du+J`@YL$%*_aO) zh6TBFZ}6n*d<0Sft$sDlK{T)zgqeP9PrCl;YZlOd@m~Pf)tjJm1CGXb2@{BruNVg( z_=5p`WK}`of6<6FLq$?C_oST@&d@LUkHdhQ9XcEBa)B-Kf@0V zP}4UB!ITurH@v-OJ^woIXZkc1i81zD!RV(0@%lGBm+M&j(pdq`7)@HYWM=cyZa~=@ zL1rMc>ihqrEF38Rye2VjKz?d~SEBsVCoIL?8P2289fXK>#nm3j$<4yg=jM=Fv|2Kf zipMV}qC$=RB?qV=ApF|b^xP149s>1HfJw`^9sOc*5C|@NHAYM_m{qVYcg2FfOzCMb>9*`AHXIIRA>7EXm`4b3s-h;JcEF5yiHVy;U;u&iFDtdUF z4}RaMis?}=$nhc~J+jIv>!|A=9ZgC!SM68yW~o6X&}-oAUGbSl)9Et=z$X2t8}@G? zI$%FB$O_9sFmLRB>Yi1g2_8LuI? zB82Cp!UjYP4uBl}XVw0qmksbk6XI>|=JyOnhxD3D-mVJ=trC+R2hv-X>h!qfoADzv zr(H7Z{}KT*ui%Ub>x1++fIku>nz2336E)eNjxrGTrt;odGoLVb?fXF>vcSbD+uegq zwWv!E0A(^lKEn*{(1o-JFHY92(7p>Nyan5^n-Fa4`8TS*+Df!Hekjz}6tCtOtB0Te z?&<5fG#-m}BDN;kb?We#@jEWJA37f@phk@qeiM99=L2|F0RDXgovu|QCAdCYoUWF9 z6Sj59HbLC|bJ1S`c6vkpOWlLsq!}`Tv&-H4vF>i0r-^A?cPBH#-|3Xk?5e0cW{GT{ zuG#M!u-qFPO7@L)fIDhdg*_qgd?Gl3h35K8D|2^`1rK>7HMg0}xseKN8RVL^{Z_Uv|`s{Zq4kx#Wh{?2o%%xBU@Zu!`L z9?9)IKR_ ziQY<6d8*laiB{18Z2KokIu2@NeUQFrs!jjvV3_Fvx@M?!gabgMbmr*vtX)ba_Lb<9 zt(6W$7L`)g@`nQU$f~I|av#tB1FRT=Nffowym67w?4TrAy1U(?C_ZM75a>ZsPWJ_7 z{b-NL(ee~|2Q-34WWka=P;>(ZtaW+%Nl%&;P@Z|W{%9Kj`8W`a{WqTZC{7(V4nNGb zq^{nGt>3gbR?YwgOWp3G+q+A~-8qk`qqiGrM4f(7jyTU*uGo@PXr%1aY$Ud4CIuf) zt()^6S+9KwWUB*v;Q-{d4!&T;o=h@nLoFr1aNc0DnU{ml{jFweb+68IZEMt zk7JL<(*{Y8=eJjmoz!Nd1Qb$2gG#r)pFO(c+%+6K64mC~vH0_J|CP@f)AeCJX=reW zFU@Wm?3TR{pswHbo}31K<)xa~_D9wrr2P+n!EM#aOG!Hr9!AXGmXEG>Tj5;Z>w4|E zBXt-i5N#W~@?^h6^a!03TkX`sdEr-K&zA&s z<8^fhpyc&v?SfH5^p^20z|T}W^Y@Io7km*Yj>2}$Me_&v&qOwMN;}X;Gyybv)nlJt zdGoEmpPf10rLn16f4!?Fj_)URjS|l#yGLt%st6dvBkScf6?B^src>ARj>*9dAhi77 zLi;B!pzZ$535wLids9EKdUq$ADl`z;i*p?=TPzjHmCMmI2j~(H`^Bu1sQf(YF|xwE zHEGm!-s-GZ6aJfG2AJIU8juE#6}*K~U2eAUhqUWsSam=7iF5WxKLG0r+5I=A=}fuw zNc|tt>)!za_ObO}_o&D$=Pc>+5r?G*v#y?Z4teP*DBd=O38it_eK$UyltwMsoU6D< zx%Gv!axWA6X1*VI9UU2ufNlgw1BH;=>4`|(Y1|i-9Phbf4PwqoJc1KR;CRG%IPuJ=dp72caat5+5 z&())ClY(3qdJGuElxIPM&|W4&W})Xl4alwe|KWf#;UNVf_Vp}(LMx73gRT72*&but zl*Jy5uNbv{zUZGQyXa=qWTQv=piu6T5zq{+F$b}@u~nVLvDfae4~6vbt0 zo5~6ydv`)g8JQUeA$#vlWMyXWo$Z*}K=iKXB_qA_YeB4&Ng1N!V z*MqY1O~%aDM+?gKQL95c#>j4!++YB8`#O2SqNlx{Ci7knp^UxMZ<#Hf>_(EB?c!pj ze?EMO?(cJSE2BRI0788n6>}cJgt;^IO;D}WqS2!yQC6Wc>GN_!zhPRKW&OF!l%jrT zfsKOFT%KwMro=!fxT<(-Z6DEthCR3^gvv?yL^=VU_?^}H2nVOZ85JBfxYs_1cZcxX zxEr413h(;R&a{uKXlR0_CrV-=fCnTZ^l@_X1nL?(ua8{YS9%oJ^H9MV+_AJiTN-6p zmDkWD^JnXKa^Uvz>(Z0Jg-I>r;P4B?3Ny**FGg&wR+0wj(iOQ0IPs{R`uR~kd6tBT zq7RrC``bBWocRFM%lu-DzpyH64a8BQpJ93j2IZ5z?^t*&5zeAn zYuhMcy!|2Cx`%ILzKhUWpB4Dw%X2!fuP4NphnH~qgd6hDF5!~k?6*AwpF|U4o||oB zmE0Yo5+St_JY8!4GYpSjtWaWV!8Y~X6ukz+&4f1REb*>x$L{zD%{zON!1}|6%JOdG zeD+|O_(}MuWc1+VTafmFcS9I!RcRQZN4nDy-OOKN;@tHi!y*6GWEic~TX)*3U|-$< zZ!K^&ZZ?bwmOZWZj8iHN^bNpVrM1*>oai(54$x;5(z*ph&9hzNpC!=OKGn97yEr_1 zbd2(0KyPO!^^8HiX1?A?We_SI?pI>7Ug16@C!P6)MtLc3M9a?F&oXUhpw5qHU2vtF zwaj+kL^{dt7mLQ180ilt{}dkkF8)Yj{imno@7`G&o>6&rrsCfA0LpRe6CwF!;a$~; zLenPIGR~D)%?Ys&TX~c+9}1d3>QQcQa^8Ow$IDzpXoK-deCEL|(fh|n%^?wk6gE)V zC8;M2<0Y{Hj^nPB8MUIZ`%+so{&7^?DR+`AghVxpe+KZX;=Pi2q_^~}Y-ek??A6z% zPCgfvs|oB30?dTe_<2Cx8>JNdc`S&4Bzy`;!6Si)wnY%pBN4%u=4^OJX}azMr2vOy z{aUEc_l;Sf{^=K~gBOZ9Z6Cz}e?@St=H>j++%Et2o*h*OWWGTPmCg;yRCumWDUpyhUkjEMn1Q{LHL_<{1kXN!#yi z7!sd(Y-=CTp1>AA^Y@M*-3pr(xCu9C2(&)JWNvCQW@J^ByBYLIV}5vvBj!b@I{gDV z7}LbLus;u!6XOq_Pkm(QEYD);gVtmrQsqSTjd!EA4pOrZrbf&I;be5K`YFui;*(Ol zs>N@~L&>vm$D7Q)W?TC50(aAvuZYP;^+(N!-sES!@lIkhcf>V{Fmf4hJr9*&`Cn>z z0eoNbgo**Vh2@E;oGU3W(@XYbG`J@7UvX~=iP{y%2B-B;gNsFVeP0nYvb|jSPmsjS zdHkjq{{wq)QYnZLi7Mj>g$bvmizMAMUG4=huZAtvHB3mMfaVY^K~+X0S!R_u-DQgPay9%7^#>%z; z>cSuWGZ>4l4awK_s3kq=^KI(^p^49UPJ;Xop+!ajg4o574+FVbm6>5i)`9}yT59l-cufJk-7?vt?qj7@#w<$3VwAzEaQ+9Q;#| z$fn)Bu4rw=^ZYc;4Q)IuRce~K7bN(w_$++l(YsEtOwYclv?i`bPS{MG7p@0Bg}d3~ zhog60qI`xuBt*Ndd(ND}qQSZ+k4U9oGeV4sQYE;#iYzjN`cQ*HpWkjq)gBJ82Ev_z-&1&$gL?C*L3c4lr-|5 z<-hSGi-{1Y$@IZMe8if&^SnJPfUD`r;~u=pKp>xHTKk;CNUUGUSq#dyn{DN6QK@?H z{O0U9u={F#;aq3Z3?Jzl+=qN+2dMF3KIMi~lM2!@r(F!nsC@W~p?}UbBxtm$FsdoK zi)p5PznhFdf2@y`awLT3chH}yPU*E3c)&rWy+&l|#WycCQbv=$`I$}b*kf`y>m6mdc3j=?TV~Mw zs}HqNwftOlU(!T*dGU6TZhC%ny!?K_U`upV(^)L2lIw8P;fK4dk?C2sm(xJ>xZH_% zZpFB(XPQ*oKW9|B@XeIh*Xil5WDu}ucv+km)l_{w7YvIGf;puv(0!gbIa_TK@DZ%= zn2$CUm!~sqwYkdi4t?5$vr}p*dhi;^O*Vb?)`$aJIj!3;>}5;Jv#YYJ{rj+9`gl*k z&E$r>FP#*VNsXU+(U;=3ZbY6AO<-}24~cc@E6`Zh!0an=LCn}-@%We7o2Bz2ZEEsy zrR+W=mN&VUvpI`mr5)9OAA6t=(I%?~rX6icX<(x^osza6>b$L0%R+`pw@!1zZW+;~ zW>;e=#fpj%Myd+QO)m3J%GC2ettOCduj_WjJjeq*1Q!HAYEl?BZ^7s5_a+pm)pN`n zy5F1B8ty26*bbz_LlOXWe+3)~ry>{hg%CX53+hU)1;>A+19VX?<4W~7a| zS4~&s@nj4inCS`0>7kHa$_ZHk+*9-Q9y}$)ZHH~M4$lklTwV=ecR95Cek2WyihD6e zXWp#u_J!%<7-VNrepYGx3ZXD^i%RwcA0872@Re|%A+q|xy^#6xQ#l>G^uFbjoRx1R z7c^_NXBGNw#pEV0b+sofd?E1QQ34e9-yqU}K-5&yph|1n^O0RJ=)unb7V=V`%GfGo zT0h5r%@?k=&L9i`6Db+~4L^y6d_}o9*4L`tdX92>UWPM9r|Kk568@j<+0jI%x8dB7 z!fF?yb|^|YqE;)hMo;YSGLIHYHd{D+SdEJ>$$?D8mo}Mfq9|(ReBc>3&1RN z2Az!jH-p2OBGbpXs9UZgtWg5Qs--9=gtsYS>;>B&;v*C56Mnvp!tlR1Zgo-0O z`sQ&ueX{Mr_LG((3VxDZ_}6T zr8?#gY<`x+kdLI+Q0`aOY~OSX;Q1Xfo*i%g^HW^OfH-oi@4p~cE^#Kg+cx2C4TcKC z;x|V6q4chIO33~S0I^jG58lekF))K`TUv*8BC+MnYy#*1f(RT)l|Z(;$JeV1^N#Yc zkl+5+Il_k@k!|DJID%>_{hJMq`&n1RLZra0mBs&}<*sJdqqwH{!ee*s5x1nD0i?<@ zZ1Wz@j4{Z$d10tqZ@haw`{~?OZ`=K4dXF#-iC43XGZY+?NPsW`CzpTU4gQb8-4H{_ zI&XyIu;|07#^cm3z3(&6AgrW|xb4E5nlCCB*WmuT|AbHI4?(NY0)oD3Q%TSr0sxBK z=~=o~ZS^t**@bmSm6~PdJl`_HS~;Q3$aV}k!4Ku^;fHru-L8n7LVUz_#cT9ir&`|H z=XDzQiuj@bu7c@H`DdCdno=KlkY;*0uG11n6?4av!0XTSs!}5U0S0I?T%{i?&)Z?G zGwIwODp;`CBHyHc5p~3 z&1P&pc-+D?#Qwc95ggF$KYk2u%h;<#*0=)G?WQWZw!aj7Y)dez&y($?kzTQ#*#?W# zB_37Co&eo%uy{gQ0wvZR1udW>`VA)Mw>@5~xNz5Qaj{w5^m_u8Y&&CryEwYH>R$vC zsRiz)GoiB6{_=3MxUdzCv}6&y-U)V6O52%pfZP9jJx@Z}ZiBFtaIhX2mC)}-X4Eij zEMN)fN+2d){xf3$CPESOvFh#k+kbNzTp7B|cvhBg#=IVtrishZ7V{))HT!u+q-pbA zlyv1gOUcL^FsFzc^^)~|e-Q^8%`o1Qq@)WqX1fen(-a3fuu2V9cs}ImxMt>8_?SK)?d2@ma#xS^q6Q@M~iL2V9R6mc`g& zjm&RzuDrT->&4<-F)!M!Y4<7flmW1MV#{&!OiG$oGPSTk(zS#PJQ^w)VC{CrBm^30txZ*YuE1W z{d-wqeA#ZsiW@%=@Cz`Ygp1KP1>brxY0}=J=Jy5@aLUrR4_+ZF2ExcUlJR%`q8Rj% z#aUZ4>`wiIAx;aFR9{-#zDbkadlt>?-VusX?GnK=Q#4l=fSBNpVAWanJuz50CucmV&ESasP?fOcit+uu%db`7&5ppiM-0N3`kvlRm=l{JnX7T-U52Vs- z8}Z2VuvuU^@F({tyba(rVHRrA`C+y?Jfi1jIO9+t$z6|biuU&maAl0-Zbpc_%9$}b z)B0^ET>;pZJc9TdGs*$n;+SW~ZD4Lkk(;9}gI1w{m{d zpGdGfI`bB_R+ThW%iMjy3SaX5T>Hp03+HRJe>GjxBf4F4b>hwo*_u#6+tn}=;@h0u z{}xQZX`b<#_&|Hjh8dVm&bfFwH=l~GQCCrMrJxhAn_4WBYp?t1iUq;ilQ{lvu6@Z# zEBrNF5zuHR8{sIm&qYLbzIoF<`Y_A#cy-n~QPGNS*YetLl|wc^FUC1q6SDUFo3nrd zi~uqNo3G%}wH75r_-Ip%@}z43FX?&?-ZqD{)@r$zpP*&C!G2r*#nppo%+cY|AK;2- z)Sl5Nv0u9hVFSl*l)Lr2=?S@%;j((Zdc~=PgPXPlsFpB7awq6C(dKBzYqfFhIqGzuih7~e#TA_ zB^mNNVfW#}7NXE9Ig1kUvyx{`zTNEBUt|72GMy0!XsLwmhp*vMFlWK(@6GdqcKrn$ z9G&sk5%cGavlfKin+u9!tH}>};1!b(tyoxFiyLU4{|6h9zW^LrB4DTRYxBx&{d65~ ztC>$WIOu&sO!>tZ?hb#lcO0F{8w^6|yB?kV#0U68K*(%7w<|#Q6=LN&(xzuG+R9Nc z{AttUWV39m_VjP|PNVUhf}a!eG5*6t_8L9`IEjsu4tCW?2C;%Gu;g+2;k=!SK(vW= z`hA&Wdp7wA8^Or{g3(n19d8c=D2FDhF(-UWG+b2;?u#UZyWrXK~}g79_c zQ8@=l(@ZissjNL01sa}^9}N*qn2>8Wa?F|gmqL*gi;Bi>?d0^AfO|#G%b(i>%X9D56) zpO5=K^i%{pF5jA$*fXm>PVuNm;n%NwMc4E)ca#V^u3lCo(UJazPTWu?6cyj349!u- zhw|}`#99bscc0gJ2I>}&mMvK8SNQDm_@lX0RN1`FSyO2Atos`12`Xh4e?7{}IZ1@4 z0T{_&CxWDzyDW?0E;2Ub!*aX}lp5+e(#l3%@(N-2OUp$9-4C>oTbZ%a%di%gfnz^WTtdgPS|CbVmOrkzT_W z05I%Kbn!qk8KdbSO;(^}@5`X<{1pqqq90SJx{A6!McfjbPTM4Q@<^zf@Wc@g*s(SN zsA+QhrIw=y7@=B>~1U+6kpwo@J^BB+WN?-=RdD|Dxgl%3Z1eUn8x%nTEQoB(LC{_A!OtQur^+8oE_mcrH&D#3BECB|6RSVjdE%sI znH~uE{(D2fNoEcRJUEo#)J2A%@@;RvR~-#kG#s@kggJllu51+5hm)DN&e`OCP@1&A zDhwn(q8R&0hF@1O;Zb8MXk&Ja0KF2o8bJ+6S^3=Vn(E5L^fo1>U1{lF31?{ytyt;Z zwIG>rHj~^a>9HKoe*p%_`+l&GU*XO@gtZ^bvu#wm8oowrk_y)qH()3TQJWE{vsqW$ z5B}`wnGS8`urWCF^gdz5Cow8Ilz#x`Eu?_nOXGV$S^8Vd23%&1>b>Oz&bTVyx94Ri zrTrN8+I85Q_~^ZazQ06MXJi1(Y#iro$|~pGzvz_#9O!|O&_!SyA}oH@fBo`=pz3E$ z-e92{%jo#CAQ{1xYoDT|ap=Fb925Bw%6|a;SiY1y=r*DOCx%&TLfW~x?7P^GGaH$a zZy3AvmNMzvQNIA5;4tcYVC#{tu=m8gbYYf^CzKG`N8lX3(#6?WrazDuaS!}h6kxVQ`5PPyg)djry>=^RKIf!(mGLJQ zzeHu|Ic9a3U5Y>xW$`2G8#I=lNTn#7lOhc92Ag4y$l~c&VUX-VdPQIo<+sjnF&CM; zMz0#s6*F%Y{HpFFd#Yi_M)iL)3sZ|1R3T%F&t*I3ALmEgGhc?CW;efwn2~U*byFqJtoivl#K&{GDAE3*vRrt zyHp#-eg4)HRu`fa6ByvajRGL$RFaxVx%Deg-dkt-o64CnW3gpBd#3F%;#H%nR%y$8aN)nyxPO3SgJI4HRt1W5mTA%ltol;U zf6@rp!(p~PyED3EZ&ln;D_>e@6c8j|Ufk6A-=2 z>`I`~8;B=-G4%^arWo#)X`oULnxfSPyk=z{e^H2WQf?zkaUO4#Ch?!JqibE^6pVAv zpI*iIiG#4v$$?Ui4>#@z?7HdGA?k;JAANE3AqD)xz^(9vVGcUFWIT-v58FDac)|mL zfX?LOeR?b)WkX+s3WJFl1uKj&4;Ef?8iK=h5n(`XjvH0Dp4|C~U14DQD*;9-HfKF( zr3A#aNgp``mt1$8ncjLm;R-VXW$p9`*06AMk#p%OSpMsSDPMSsrbsmq;q{kOY&G0KxzIf1X=+8Al zeiev7d`0B3R-qpSj{;KBSg1n;(B2l;%u%Qoh%js*!7Pp?7?CviNrhB`>)~mj_0kQ% z(WQ#IkAXog0|wfLuw=x7V{zdg|9Djn0N>lx>I9UC5wx$Ea+4d}xL%L|$OMZE9iNI7 zz{6ME+q^Bfnt>g@mn|DG7ap#Z?)YH*X+(Rdv&A>;N%YUjf> zfM!aoI5+N0AQ6P9ke-fJt2p}YZ=hEs1jU@FGRT&W>@ED_DH$mP+asAL3`HJo3-iGz z&Dbkvj>cjvL-y7__YKvvigW(P)xVC&QI-<`t59y{*Z~IrfH4}MBz*01AY2nr`WBPk zkyj7V3J&1EhyTw30fOax>=Cr$uOeJ9eq0|m`I*_6?{GvPGuMZMrvIL~9&gxlI z^y@O=ZA`rr{&J^atMi9I1)5b6#K_~0xb>uEWy1BGlWa$>l6b$@nz6GO2|&|6JZ=hs zD1jSNvFCDLGXw~BpietC zFOc8p78U5-AQU0JM|?1U7k@ENUvP2mh^S;=o+^_JvftA|8>rA;KuZ)_uRYwneNQ-rf+~Bu9M&on3vRZsI!eA^C<2;c zkM}>DM=HR$CbgL-a3?*TX1gT&|HI+&OTlq?mEO7&;Sft6Mc(x?n7G z2o!K-19oIw2TnY+LIIYE{0AmR!Aq=qY9d3DG1*49%7^V2v(oW^-$a06;$lk=$pqZJ zaO&i4Gp1aU{L7gOFo_^ms^0aI`D17Mv3mH2y`ikO_t)Hzu!d*BkDlZj*@^@&2b?IM zu>|0#gbBZ<76sR^qOO6ktfywZIfHi5qfJS)z(`RIt?8Q#Lx0FIwFJh#oX znHq7g37}UEJ{Gs}X@Dji`A@`;BR64Uqu_B0CC;aU7~vaZzNfb`iqwxN4%1%+kX3sd zEBX;82vCTtn6&Q=L637viNMNt;6bm%l;_+MC(3Bl!Sy~<5l?uGn-s!#V==vjKY{Qv zf#nUX6(P5C<4TS(<*y3X=wD&|({3KD0mF2y@B+PdwJ7TYE2KCFmpOInl}nESI|FP# zc|2jqWBLODb$|%`p%zCH8{HlcZ#pr8^@7v9$46&?3?(so4NyY(XVe)2(W}7ydIw1- zuG3DeQvx{nqBqmr$VTj6poqi_6(ia)(@cK z%U3H09fc_285q9tNl&oqVsF68Hs?qEpqIXG>(nWoAd>$&3ml+?rJd8l`Aq3r#L(_5 z=k0XCLmK)A!3M;Xzd`P=WAP-4;F3;slaze)72js{Q_bF*=KgO9Lh(<@w8xlizXza< z`>ybi+M(<-1Z{#v-YbV^gi~qd0Ye*u9b#NQ+kM`<$D{o3m9sYKeAeMUf+UeT@F;i) zR8}>cG&^sU3pyrm82mWVDRCdVM@-_+9Rreu_#HDaM_7=jT)KpYNy|3o_jgCuC#ht; zOIMFdGvJZ6Kx_(!s}~%}2!A2!_bI^BB}pn!zaqGlFr;SQXyQ&PAcu9d8T=`CfYy_u z8cvM^>&RDWyif6zTJ{`58%eca)0b8-5pvIRN&>1L`E!13U|-7D8Uzp>!WCWzxz&1H zN%;oMz@UDa%9N5}TXE=lmV;672te6e-*xGaPu6oWp7xXB+;csi2al)_*93O(Nc&B@ z)U7Wh%UIhTI{;-VP7S^OF{S48YkA*e(7gJb@5i_FHx8!JVuwxJ=U+zX;?Rn<6IV4- zcGzH$-!$#!9ok#ZW7R0$@L`mX-T68aO?IU2y@pGJov`u9aSm9hKDPbq)^8!It?ljE)|2!+t_E(SR|1HNBl$ty5|~|7 z?Nteoajn#`qoZs)w9Kw1SS;#|^7#9}BNZEN3~-ghZGdhji-rz$7Hp&vya-V@H;0+5 z0rTcx+X%u7Wm^gKcAO&|o9T!$>hSAXzWQD_(U&27yvKEd-Z<{$7rt z{dj(`^X^w5VP1s7^q4q~e;i5-qU<+3Nsn-eIW830=z(;Q^kkh}oSUnF&Gr z?(tyrI2q@$a3m7BSIshKBysctg_a9^`|UZ@F{|L$Ccss?-LVGuQ(l*b9%}?YuT^3N&!yR;XbCkh*jG<5&Zk2fU1pGN zeAXiTf!n~lDC)(d>}+sOR+!5u*Vgb4VrIdO-32GXx&2-J8UJ7z_lilGnvaxb_4(@7 zj#~YcW8vM#dFp|v!dc2@RA&8@0_YgDGSgyeyb(n5x^>^jm&)0y}-vLnx_M@ylNUkly>{7P_v zj4gk1XqZOmE}sVP^ID&;+S|S~LT6d1*q%>$EIRyZ`Qj4(A!?(5R!ou3ER#u^DQT2J zS>1E2BY;+!&}};=#DXs1xs)nVnrFrDw8Q{$rGE8!kKSk$3MH;&pT96OlbB0?y0B<8 zb>_8c*sZxzcP+d*w>=I#Hrxib}vo3T`&r zoh1fx?&W6wKE+fAg?wk~UTya)cHu*g)<~zG=Cwb9H&g@w^fa9o>I3#ZvN6CdN{C>aov#LIC9$KwP7NX z;kIyVih;rOQx-s>1--jtlD<~_Xr@)8PoDI*oi?CLnzpR0a3`L2&zW9HP4{BTeqZFv zknnb%-?$=okuMu(zO9CTH`y>WX4_RD@yqZ4v2;UT&|xV7c!eM^t*Man=uT#!8Dt5S92JO zJKL_Wl2+q*SAOUS-%I+^x45tE-D0gzZspzfCDH6%<|Bhyl$X%OG?j$dZKbxSnjFO> zy{^?ABSO5sr*S_&;a@C&UnfAgo{Gw-(O|afH(M>4p7ji-Ea?=Yrns~e4Z6244CD=! z&Cgp8sc#MptSg|3S4z3C6n@<*`*OXXgwnl|Mbf4Sb&Z14 zc=}rgN+262&268$mr47RHrJE;ECszJUL~uyjBy(6*KpjWREuBkFWzq_@run|6&NS( zO>w4Fx!w`4XK#lO{8{izEXIUQ%Y=K(Vhe4Kz6`}gIquOZEEJ~v-j%s)i&Sc=T;JPf zL)~gdey`?)J61Y6y-zE58?lN6PwI1jL5)+Bo*r(;Ujq z&)W~Ww5|WJ2wU{i+RdNdmf9M;Wc_vF(}5x&!g(?!}_eoWX40V9qX zlk~cm9QVbx>Caus*0g+TBhzocFrf7DGH2@Jh4<5VQ)>N0RE${Gd<2OJsF6 z5TqXIICN{XUw(or5)V6l;EchZ@m%08+>+Qb`w{z&+0fONN& zN1i17;XIbr0&*OsX~LD4(Pir@EIzb(ja)CQ6G+upf7;(?7`fc>5*U#UnoZSsz)d20>9CZh6TPQcR{zdC=i2vKX41&$RKy?qV>>bd8K?@ z!_F%knH&Anl_hm1##<$aM*)udG1$QAq-i&)0rcACJP5AMaXjb6B&rD0iUJp(JBq`u zgoD|WWtsvD)24exWiRJM?I2YFA%Gob+lXgkGnZn*Z@w*nil`d^3JEvMn_~k}wg}$g zf$Yu522=qT!x&}Ywwm^}H{sb`Z9C^r`ztoib|a<>m1|Mgy81X?C`2It6dH(D2-;qO zWc}S;vzlE6Z4X|cX2_HU9;b()DKx#F zei(~4*6{TP zJYnnuG5_sZHh=TA=g@QRo*31Q5&NOhcY8zpE&!D-m_hq+Yk&j7${FLrqJSTh0`12f z)`6ATZlrdV8oAJOV8tX^7Is=Fr^x#SJ_LBEbuaJj7${KBiB9+PekSREOmKIZ@oUUB z2&}SSWL+o*hX6+e5&7sD?pt=OizDk15gH$~n+F#RKnM>^lU|P7ERdzE@^-AxNFSRw z^y|SRx@d(Cv4cq~=OE-1MU3tZn=Px=si36Z(OI!%&S_DoGMQ?>u&IlJp=AW7k-~8J zHfn!i(OkgV(zpLiaYt~=2?GG@%tPQ5L0DogyAl`g<l%VKk)rJ9!^?M>P5X?kjn_C>At=E2&Y()S_xd};UXhya;SrLdL4&4I5a;V2ShLC8 zD>+Ed^5~(Q8nuaV)jsoP z9ge$ZkP!(o1s+;jS%E&pi676d&Sf?0-eJ>5f5DFtu35r^2CSO*`_|(qKOzb%%&eNs zP)IuILtu~tbdt#1Fd2U0Uno16=cjJa){j?}vlUX=ZAmujLpXr{))rQELZ(i_x+eLY zM$j_b52LV9k!h}7e|PQ?cnvD16*3+Qh@KRQYtsi2((50aG;a8!QB7Y8RdKTNGct62#4=0zM6)wl$in#t2hLIOs+fhPa)vzB z4^Mm0g>d)opgztY83bMrIa9q*)Rn?=p?sK?5OkAf?|f*s+FpOx?jZbemj+)6_+;*m zJVjHYzYKMPt94b_z$?PV)#;k?kBWzl-4LTV6t?aDWz0^2n?G))J{)RN`W^*E4MD=C zMGXj)Fb{j8U46lXqQ2m|c-Z)Z#$8flFuwHnk^FC=N7y&3&z^^RX$u-Z zndCtyjZ|Q|vcf>PQuppbWM&sw`T_knUibLuy@U-~5Amah3>Ww(O)&e9oqL97s^?4l zRL8iaRW7^z)MUK1^xE;I?XSDdXf>sr`HZjlovDC6zJn`6he$NBqrYA3ZiCEAn6%&> zuI1OK2Qz6*k4tq}h;23!lWvw3e7$(d!4GD?z(2nvRjPGRq+}Be*Qu=!{{uL2CZB9> zVpXBIy)f_aEQ{~&yqxu?sCf=AC;aZj^4gKg{mvK26tybhY2AUXid?rNU4JJTEC&^29p zSKBW@YNR(}|5Lz|?`U@p8L{Xng3MF$2}D`&$OM?!#_7a_)1BJs{b3%)LaA-BQnNf8 z<)=0BMhcF7eiPUf4z+u6t{2r+;|k_V$c-m6c-8unuG~T6qZJEy(B%uc53*W}R1OJ) z)O5zaM`_>EER0rZyg}uNK0s(?$$p|~cZYCOCZ?Ngu4v!2=mYZ09C}A(u#x&Y#kp0| zpL@_2p-M5|@lGb15R6n~R1wXsBmM!HSXL^tYRz8c zePWr!!l7RPr>L3cQ*T>_W1xAAj6^iKyKZp~6CF|xVH_ssZEW`fJ@#8g-d-TvsE);b zaqABs!@)Ih{)*MGp1?}5V9>4KJF#l-%Y281h0*fJlLW*GAL7iSgYwH)WyN|&i@z7r zH1&rAB)|lBe{t*+iqvtRJZF3soK9f1P;;mGnI%fW`U1&kF0+N9J2sdDXnB@;21Go& z+URYd_2Wa~9H^H`s(Mm04C`*lc7u`8SynOMsfdv0x|a?&Xn;|HRpOPuRK58@!p{^z zFkqZFAHgKc^9XGV@Zda->gKSTF-qix2GqvE=@Or0v_&OIkPKuG6UzCA^+YXQIAmCc zFgO9dJn3NZaGsk4@NA}(QMLxqi7ACZIBbysdX)M4{J2JJ{6QQ!UW__H(R@Ap$vcp^ zsXJL+)ul~!SyhmxLr;!&!N7B&2(Ri2 z4f-WU{Q&qQ5Fl1qWBq79=82O!@GQ;I8vAm%gLX8U4$#QU!M;JBw;iAHfkYj&(a7=8 z$scgV+Gc9fv2lXhqajFevh!>l&>HQg z$P^N|w)mpHcnv($Q&^8MJanRnpG? z%%c%pbus-ZeW-b`)5_{r#QuVe5JIoW`0e@Num?ZWGRYE-oKaF2pX4_#j`-;zZC1Sm zH|shCrOv8-r3ovo^Zed^ zza8B=SxW;^z3fi;LoG_=hFjoqRPmKwQ~Qz2@Y!7BZdOOz%2L)ftv z(OdRvn`G2kr!6FW{q9}}PX{`39db<;tL)uJiVWlI`Pz$`{V)42M(pR+3+&2nq);no z>)$hn-4c(*SnD=iucxvb{$j1e#PID8LqW0vXoe9O_vOmxf5DI)5xY0AIX=hF{^~=w z3WjK9Txoc;V4t<@+lS&Im{^9y)L>67D;`kj-8oM1qz) zmxwFe z*H{_r^H;vd%LB|&L1_he`c}u$6?mjA%ny&>PGjXEJNlWm!+F?P!NkE4S5F;luM8RG zbU_vZq*b3rrQds>N;ry*<5Mq2fq*ot%87>6uR*HvbyVI$4LfIvk z(B2bon3(^nnan}uj|yybp*=Ck8PpI zaM&c$dT{2R%US2_aK{;RD$=W~_#%+0&V)AA!Mkb|9HJ@R1~)PW(ONP@^gy?WEC2XR zCOz5P1vd(G>1EPRFt_}rw^=5_UI2nXq62%w+b zoql?ta~}YojAUwV&OyM#H;auTss+uMO(1Y%dA0+6(~K*Eyo0)d;6|{?m)^LDV-f@2 zff%8+ofnuU3U7so$f1*h7b@RJqj;?1KtnnRr_T_Jsh_h#|5q%K)7-K~_2;;p%h@-+ zw$+L5LH%5YT8*KXkt>Un1$+z8LFur+B=vjW1Dm|gi*fpRtbPbQzf=16@GgCLfA*;h=olIcp=d>l zj?3kPXP%#nQsd^GcaxWAz~<$+ZEzfAi===BsV|wVyGy3s5XsGi+<>-cMj5P_a+jsc z8X#m3e+A@P#3P1+IVI%PK(AqVJ=NER8+Jw>s7Lx>1D8Y|?$PlKU$c|vFht%jF zM!LbY3#3sqv;{c%ZYzc-OzE%qTp&Ob(PtZ{RFXhcCk{0ir-Q87>6->Ktp}+^tb~{g z?+cRr#zDr=d;1fqcW@z$(v{sbXL<_<2_c@Y14oS-KxhVA)~_t;e<0w2#KTc?ptha6 zceG(37zGigyDiTr%-W>qG+EcsHcK*;*W3|&5&fhvsGart!zGR3k581&G9;C|kvh%2 z|K@V8EH8Pp9(n;&m;`OLUX@8l$LAt-p_HH(xvj@x_J0r*n356PzeX3`o33zUD!hZB z(t?BFO3km9W-Y#RkU^_V0F)|;EE*Ctb)lh4MhK`knbM*5UK=|}pedSsBYk3nCnOyqHXS77q+wkV};M07_mX*FjH9N1Xl?DmRAOLH_|u z$;FNND8n-1s-JjvS>CzO|9!L(v>+{UarMBs!88(sYwJnyKyO$cFg{R9MX0^T#?vb` z_wz>T*hQhqsP|zblXe{Y%6I5pR{7JpuaTj%1XXD8-P;JWpZ4#43@&=T?U(F$LV`>c zl~<8QQdhtet2#Fi>{JXpW{{7ldiywxfa(8aczbBS`CKJu z?_TP63@EV%E{BnPpYey}4;N^Q;!p}!A>)A=iasb}4{K+wdQ-`jvb3{IV-77eQ-}aG ztaiCl8Qyd>eWimq{SK6VfmQqVkj4R|X%VX`r>S;YrkzOzeicTG+SWnm(jfqZ&eoW# z2Aw8SA4nGAP`S-NFa#_6(L zK#wK^qZ?)Ko<$2)Xk`QpTkTaHU9&Og)4tOtti73_ zV}S)<6!oRW9nwz$QPIrh?q@Dc^+AHln=27Yk9l~`x^L_Cy**F%SUF4A@@q*+N=i}^ ze}5XPfa+FcNv73&NN##bYX`CWHY$8OH#b-OtG%%*N54|iK!7;i%MV3kxi7w|7)Vq| znDr})B?iP0C{@H}OWCmWcba@iGSgQ~iCH((C!~|Jxs+2SmcxS0>!!!QZkCV7S|ujq zEJm@6nNpdyH|?k&G5FP6sAfc9HQ05@j*|Y1ls>^#Oh@;cFMg}az0Ub=HM6L;u2BY} zpvu5>p-c39xT>vpXCvqh;3I)ACAP8g>^y$*Z@XP-Z3L^8^5neS-r8OiZ(gy8$d<}i zxL;|x>q>8s%&%IxAG4k2Ts$J+ScqDB>(t4KSx}rU)jLujo@TPvT9i_<*P5$puQu@5 z#b^6rpU~cHE*-1={MUI6n=tA9w@#H09=r6sHHk{;D=kg)v2R}SS;1Lnox6Pf#{4x0 z_mp13W}Iz|>D5JSKdM;6U9J%yyAfL({sBGpZBs6~j#~p?)b)R^aD6Axz)`JS%l@z^ zI9sZ4iITqK#S}M%`M^j^>RauKn71EZw!-PiOG0i+Qp(cpSO6Bq}Ou2Sk^e{`oKt;7fO7qIHjbBpKk$M zrnkcRMaNo9Q4#MnH`&k*&0M{yf}1=1%B4^}RxS&p6e*-%E8Ps@Dl+u?j-qRDP5|*O2hk-;4A(PV0!S~K~qtl$O zcy7(-FM8E!_=7u;IvR!})Hq#cb){%5C$7PEw{qIRi;X-E(%sTOmABWi%Up0Yq! zGF%{PBcZk9p;P}7Ysgh|V~rD8s+aM|52VzdArvLK8M2QsEy=FO4h*t@c zBJm!Uo1y6h>U7yzxhW_{>qcZV!qdwALt2|&#E-7s2-Bi8+I+EHNY824dR@TA@Llb1 z^UT{UQPi>|2%!br#V_Y@c`YW&Vwlg?`)2cD;nxPiDFQDy@l3~O`7&(Um0l%<%$Xl_ zKD5NZ>mIh8pCoZH`5`kD!tjwmq<`cvF=L(^H?IEP_Xw!ad*%6tsNxa45r4zDoICg~ zgw(Px5R0?bf^Ugk@R~Mf+pKSJxQ>HWlHvJ#TED;hdD+@yF8*jZ%LuvQ{MD&bCs0Dk zic-pUUgL_M#%d4*!DBufj1ffv!PvZ>f;T^cPU#8m4O|94EBYw0rn%--?oB)<$9Q$~ z7RtKJdCFTpRx%=Fh0j&yHT>S0*3qV9Kd*4YJ<-DANJeo;{oN!1x5>n&s=T=bTC4-_ z!WX-=bibPSgzShEEJ-BWn7SNYsog=zD99vx9QC6@2oI@EterLDDFW4cf|BLD50eoW zQwvrKLabU2%;@X*N(6CFljMpXO*ajkbK;1NMfbalfn`*9okqY%Fk+>HZKXHTwwc`| zB<}-UKcto(O_M?Lt+ZFr(q07CDV>jox!y?BtiUDTnH!Iv`U0H+-gGAMQ`?6Q9yj9w zV-UT4Y9Im#jSrhv4plk_>@i!umhb&{5D9*I#kbE}nYEq0gAb6k#e^?1#AURcQS;l< z8sx~sBR@fVuCBsq@{Zmx_M{LQf>;&=mFe86o_2(*JF2E$s1Kd#iyj33hEqR-sgr%s zOBw-X69J+wnb;IowI5GMbM0v;uLOazvQ0wK(eYmJgqPLAj_}Q=fHpSgjyHSL+Y2nrhfHX4kw@4V55knX>-s*v&trs{IL@lN(*V_;Q0o&Weyf63y6Z8GPKDhEdN85+y!WGd;h>|{*zbjfO9^sYq|L!@h z0foS(%F3;sHX7YQu%RaDzRddXGERQ92A~O&i=&>%T~iAp=H(DKfc%XP*se0Npzu3F zp8f@l6@aDN%;bE;Tgu;~B;F7^@FJAmDed}K`-NGwfO123%Ve;h7?^r?`wVK=k{`d9 zfcTT_VtloN8FP}krBkS{o5<@yWQ>=|jn5_A2>Ql%GM!LMyeG3(#$ zPx{MClYL(2`woaY;|vckZxP8L*M5o^0a9U3QU@Z5Ijrv;z_@x57MNo!U8Q&}Ko^`1 zxPZfe0xO^=-Hy?T)o-_QA>zDuSX9d?@WjSNjJNz-i_3T|IlSPH>V|$}sC?x#)#9*@n=%LpFoO^*f`}nct5fY4C~tz$sSPu6 z7~_5D+SF{^{SOrNfw!IU#i>ZV(uHGKSOn4$fJq;qq~X*RDuc{X?_S?3oijnV9hpMH z)uh5Sk{@Pr7@kc}{3#Ae&2hQNM+qPdj%Lco!`|M4du9Y+Hw+==*Sv3p%4dg-3qcPe z4}zz-(p2*G_cC10;+nq59hJ^%0DFE1FMP^&?aOn4kM~@XU;fyk#e#JGU3|>Aw;BW9 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 literal 0 HcmV?d00001 From 4607acc42184c6beb1e11283482debd961d28e8e Mon Sep 17 00:00:00 2001 From: Gabriel Le Breton Date: Thu, 6 Jul 2023 10:36:40 -0400 Subject: [PATCH 14/15] Update FAQ with firebelley/godot-export for godot (#400) * Update FAQ with firebelley/godot-export for godot * Update FAQ (small title problem) * yarn lint --- docs/10-faq/index.mdx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/docs/10-faq/index.mdx b/docs/10-faq/index.mdx index 911e47ea..4f0b4e52 100644 --- a/docs/10-faq/index.mdx +++ b/docs/10-faq/index.mdx @@ -33,16 +33,18 @@ interested in automation around game development. ### Recommendations for other game engines -For **[Unreal Engine](https://unrealengine.com/)**, we recommend you have a look at -[unrealcontainers](https://unrealcontainers.com) from our friend [Adam Rehn](https://adamrehn.com/). +For **[Unreal Engine](https://unrealengine.com/)** users, it's worth checking out +[unrealcontainers](https://unrealcontainers.com), a great resource created by our friend +[Adam Rehn](https://adamrehn.com/). -For **[Godot](https://godotengine.org/)**, there are multiple options available. We know about -[abarichello/godot-ci](https://github.com/abarichello/godot-ci) from -[Artur Barichello](https://barichello.me/). +For **[Godot](https://godotengine.org/)** developers, there are several options to consider. We +recommend both [abarichello/godot-ci](https://github.com/abarichello/godot-ci) by +[Artur Barichello](https://barichello.me/) and +[firebelley/godot-export](https://github.com/firebelley/godot-export). -For **[MonoGame](https://www.monogame.net/)**, there is this amazing guide on -[Lean MonoGame - Automate Release](https://learn-monogame.github.io/how-to/automate-release/) from -[Jean-David Moisan (Apostolique)](https://jeandavidmoisan.com/) +**[MonoGame](https://www.monogame.net/)** enthusiasts should look at +[Lean MonoGame - Automate Release](https://learn-monogame.github.io/how-to/automate-release/), an +excellent guide from [Jean-David Moisan (Apostolique)](https://jeandavidmoisan.com/). ## Why use GameCI for Unity? @@ -302,6 +304,8 @@ The core maintainers of GameCI are: [Card Game Simulator](https://www.cardgamesimulator.com/) and Software Engineer at [JPMorgan Chase & Co](https://www.jpmorganchase.com/). +See [About us](https://game.ci/about) for more details. + [unity-docker-versions]: /docs/docker/versions [discord]: https://game.ci/discord [common-issues]: /docs/troubleshooting/common-issues From 7ba05b183f038c31d1048c7f39135c3229e76011 Mon Sep 17 00:00:00 2001 From: Tim Cassell <35501420+timcassell@users.noreply.github.com> Date: Fri, 14 Jul 2023 19:39:15 -0400 Subject: [PATCH 15/15] Add `Standalone` option. (#391) Co-authored-by: David Finol --- docs/03-github/03-test-runner.mdx | 6 +++++- versioned_docs/version-1/04-github/03-test-runner.mdx | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/03-github/03-test-runner.mdx b/docs/03-github/03-test-runner.mdx index 2fcb2c8a..f458b629 100644 --- a/docs/03-github/03-test-runner.mdx +++ b/docs/03-github/03-test-runner.mdx @@ -304,7 +304,10 @@ _**required:** `false`_ _**default:** `""`_ The type of tests to be run by the test runner. -Options are: `All`, `PlayMode`, and `EditMode`. +Options are: `All`, `PlayMode`, `EditMode`, and `Standalone`. + +Note: `All` only runs `PlayMode` and `EditMode`. You must explicitly specify `Standalone` for it to +run. _**required:** `false`_ _**default:** `All`_ @@ -426,6 +429,7 @@ jobs: testMode: - playmode - editmode + - standalone steps: - uses: actions/checkout@v2 with: diff --git a/versioned_docs/version-1/04-github/03-test-runner.mdx b/versioned_docs/version-1/04-github/03-test-runner.mdx index 665e84a1..78e2b2de 100644 --- a/versioned_docs/version-1/04-github/03-test-runner.mdx +++ b/versioned_docs/version-1/04-github/03-test-runner.mdx @@ -134,7 +134,10 @@ _**required:** `false`_ _**default:** `auto`_ The type of tests to be run by the test runner. -Options are: "all", "playmode", "editmode" +Options are: "all", "playmode", "editmode", "standalone" + +Note: "all" only runs "playmode" and "editmode". You must explicitly specify "standalone" for it to +run. _**required:** `false`_ _**default:** `all`_ @@ -212,6 +215,7 @@ jobs: testMode: - playmode - editmode + - standalone steps: - uses: actions/checkout@v2 with: