From 81785648a77b39a20f4f31f05bb482066698918e Mon Sep 17 00:00:00 2001
From: Xinwei Xiong <86140903+cubxxw@users.noreply.github.com>
Date: Fri, 21 Jul 2023 21:20:23 +0800
Subject: [PATCH] fix: delete batch build all file (#561)
* fix: delete batch build all file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add cicd sacript feature
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: docker scripts
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add openim fix scripts
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: fix scripts show
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cicd: add ci workflow
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: about the distribution of the strategy
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: github release fix
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: build bing file:
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add openim server
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add more cicd auto
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test file
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add before module
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add copyright dispose
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add tools user
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: More support
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: signing commit
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add release
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add release
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add cicd actions
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add test login
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add release copyright
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add release copyright
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add release copyright
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: go release quest
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* cide: add ca
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: cicd action about lock issue
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: cicd action about lock issue
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* feat: add comment remark
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: cicd about gosec
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
* fix: cicd about gosec
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
---------
Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com>
---
.env | 4 +-
.github/workflows/auto-release.yml | 26 +
.github/workflows/bot-auto-cherry-pick.yml | 53 ++
.github/workflows/bot-cherry-pick.yml | 19 +
.github/workflows/build-docker-image.yml | 17 +-
.github/workflows/cla.yml | 48 ++
.github/workflows/deploy.yml | 45 +
.github/workflows/depsreview.yaml | 18 +
.github/workflows/e2e-test.yml | 2 +
.github/workflows/golangci-link.yml | 2 +-
.github/workflows/gosec.yml | 57 +-
.github/workflows/image.yml | 14 +
.github/workflows/lock-issue.yml | 51 ++
.github/workflows/opencommit.yml | 2 +-
.github/workflows/openim-ci.yml | 134 ---
.github/workflows/openimci.yml | 168 ++++
.github/workflows/project-progress.yml | 14 +
.github/workflows/release.yml | 33 +-
.github/workflows/scripts-test.yml | 1 -
.gitignore | 4 +-
.goreleaser.yaml | 448 ++++++++++
Makefile | 5 +
README.md | 1 +
assets/logo-gif/openim-logo.gif | Bin 1729731 -> 2682640 bytes
config/config.yaml | 20 +-
golangci.yaml | 933 ---------------------
init_docker.sh | 9 +
install_im_compose.sh | 21 -
install_im_server.sh | 43 -
pkg/common/db/controller/user.go | 4 +-
pkg/common/db/relation/user_model.go | 2 +-
scripts/batch_build_all_service.sh | 80 --
scripts/docker_check_service.sh | 91 +-
scripts/env_check.sh | 14 +-
scripts/init_pwd.sh | 27 +-
scripts/install_im_compose.sh | 122 +++
scripts/install_im_server.sh | 82 ++
scripts/make-rules/golang.mk | 6 +
scripts/make-rules/image.mk | 79 +-
scripts/make-rules/tools.mk | 10 +
scripts/push_start.sh | 2 +
test/common.sh | 14 +
42 files changed, 1405 insertions(+), 1320 deletions(-)
create mode 100644 .github/workflows/auto-release.yml
create mode 100644 .github/workflows/bot-auto-cherry-pick.yml
create mode 100644 .github/workflows/bot-cherry-pick.yml
create mode 100644 .github/workflows/cla.yml
create mode 100644 .github/workflows/deploy.yml
create mode 100644 .github/workflows/depsreview.yaml
create mode 100644 .github/workflows/lock-issue.yml
delete mode 100644 .github/workflows/openim-ci.yml
create mode 100644 .github/workflows/openimci.yml
create mode 100644 .goreleaser.yaml
delete mode 100644 golangci.yaml
delete mode 100755 install_im_compose.sh
delete mode 100755 install_im_server.sh
delete mode 100755 scripts/batch_build_all_service.sh
create mode 100755 scripts/install_im_compose.sh
create mode 100755 scripts/install_im_server.sh
diff --git a/.env b/.env
index 048662d97..e7971a07a 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
USER=root
PASSWORD=openIM123
-MINIO_ENDPOINT=http://127.0.0.1:10005
-API_URL=http://127.0.0.1:10002/object/
+MINIO_ENDPOINT=http://116.30.3.80:10005
+API_URL=http://116.30.3.80:10002/object/
DATA_DIR=./
diff --git a/.github/workflows/auto-release.yml b/.github/workflows/auto-release.yml
new file mode 100644
index 000000000..15a77da9f
--- /dev/null
+++ b/.github/workflows/auto-release.yml
@@ -0,0 +1,26 @@
+name: Automatic Rebase
+on:
+ issue_comment:
+ types: [created]
+jobs:
+ rebase:
+ name: Rebase
+ runs-on: ubuntu-latest
+ if: >-
+ github.event.issue.pull_request != '' &&
+ (
+ contains(github.event.comment.body, '/rebase') ||
+ contains(github.event.comment.body, '/autosquash')
+ )
+ steps:
+ - name: Checkout the latest code
+ uses: actions/checkout@v3
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ fetch-depth: 0 # otherwise, you will fail to push refs to dest repo
+ - name: Automatic Rebase
+ uses: cirrus-actions/rebase@1.8
+ with:
+ autosquash: ${{ contains(github.event.comment.body, '/autosquash') || contains(github.event.comment.body, '/rebase-autosquash') }}
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/bot-auto-cherry-pick.yml b/.github/workflows/bot-auto-cherry-pick.yml
new file mode 100644
index 000000000..4cb2cf0ec
--- /dev/null
+++ b/.github/workflows/bot-auto-cherry-pick.yml
@@ -0,0 +1,53 @@
+name: 'Github Rebot for Cherry Pick when PR is merged'
+on:
+ pull_request_target:
+ types:
+ - closed
+
+jobs:
+ comment:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Comment cherry-pick command
+ uses: actions/github-script@v5
+ with:
+ script: |
+ const pr = context.payload.pull_request;
+ if (!pr.merged) {
+ console.log("PR is not merged. Skipping...");
+ return;
+ }
+ if (!pr.milestone || !pr.milestone.title) {
+ console.log("Milestone is not set. Skipping...");
+ return;
+ }
+ const milestone = pr.milestone.title;
+ const ref = `heads/release-${milestone}`;
+ let branchExists;
+ try {
+ await github.rest.git.getRef({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ ref: ref
+ });
+ branchExists = true;
+ } catch (error) {
+ if (error.status === 404) {
+ console.log(`Branch ${ref} does not exist. Skipping...`);
+ branchExists = false;
+ } else {
+ throw error; // Rethrow if it's another error
+ }
+ }
+ if (!branchExists) {
+ return;
+ }
+ const cherryPickCmd = `/cherry-pick release-${milestone}`;
+ console.log(`Adding comment: ${cherryPickCmd}`);
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: pr.number,
+ body: cherryPickCmd
+ });
+ github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/bot-cherry-pick.yml b/.github/workflows/bot-cherry-pick.yml
new file mode 100644
index 000000000..9b5ff49bb
--- /dev/null
+++ b/.github/workflows/bot-cherry-pick.yml
@@ -0,0 +1,19 @@
+name: Github Rebot for Cherry Pick On Comment
+on:
+ issue_comment:
+ types: [created]
+jobs:
+ cherry-pick:
+ name: Cherry Pick
+ if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/cherry-pick') && github.event.comment.user.login=='kubbot'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout the latest code
+ uses: actions/checkout@v2
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ fetch-depth: 0 # otherwise, you will fail to push refs to dest repo
+ - name: Automatic Cherry Pick
+ uses: vendoo/gha-cherry-pick@v1
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/build-docker-image.yml b/.github/workflows/build-docker-image.yml
index 553ae5d10..31e0a5b65 100644
--- a/.github/workflows/build-docker-image.yml
+++ b/.github/workflows/build-docker-image.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM open source community. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
name: OpenIM Build Docker Images
on:
push:
@@ -9,8 +23,7 @@ jobs:
strategy:
matrix:
bin:
- - ssserver
- - sslocal
+ - openim-server
steps:
- name: Checkout
uses: actions/checkout@v3
diff --git a/.github/workflows/cla.yml b/.github/workflows/cla.yml
new file mode 100644
index 000000000..b8129e76f
--- /dev/null
+++ b/.github/workflows/cla.yml
@@ -0,0 +1,48 @@
+name: "OpenIM CLA Assistant"
+on:
+ issue_comment:
+ types: [created]
+ pull_request_target:
+ types: [opened,closed,synchronize]
+
+# explicitly configure permissions, in case your GITHUB_TOKEN workflow permissions are set to read-only in repository settings
+permissions:
+ actions: write
+ contents: write
+ pull-requests: write
+ statuses: write
+
+env:
+ # Define Open-IM-Server variables here
+ REMOTE_ORGANIZATION: open-im-server
+ REMOTE_REPOSITORY: cla
+
+ OPEN_IM_SERVER_CLA_DOCUMENT: https://github.com/openim-sigs/cla/blob/main/README.md
+ OPEN_IM_SERVER_SIGNATURES_PATH: signatures/openkf/cla.json
+ OPEN_IM_SERVER_ALLOWLIST: kubbot,bot*
+ OPEN_IM_SERVER_REMOTE_ORGANIZATION: openim-sigs
+
+jobs:
+ CLAAssistant:
+ runs-on: ubuntu-latest
+ steps:
+ - name: "CLA Assistant"
+ if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
+ uses: contributor-assistant/github-action@v2.3.0
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ PERSONAL_ACCESS_TOKEN: ${{ secrets.REDBOT_GITHUB_TOKEN }}
+ with:
+ path-to-signatures: ${{ env.OPEN_IM_SERVER_SIGNATURES_PATH }}
+ path-to-document: ${{ env.OPEN_IM_SERVER_CLA_DOCUMENT }}
+ branch: 'main'
+ allowlist: ${{ env.OPEN_IM_SERVER_ALLOWLIST }}
+
+ remote-organization-name: ${{ env.OPEN_IM_SERVER_REMOTE_ORGANIZATION }}
+ remote-repository-name: ${{ env.REMOTE_REPOSITORY }}
+ create-file-commit-message: '📚 Docs: Creating file for storing ${{ env.REMOTE_ORGANIZATION }} CLA Signatures'
+ custom-notsigned-prcomment: '💕 Thank you for your contribution and please kindly read and sign our [🎯https://github.com/openim-sigs/cla/blob/main/README.md](https://github.com/openim-sigs/cla/blob/main/README.md)'
+ custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA'
+ custom-allsigned-prcomment: '🤖 All Contributors have signed the ${{ env.REMOTE_ORGANIZATION }} [CLA](https://github.com/openim-sigs/cla/blob/main/README.md).'
+ # lock-pullrequest-aftermerge: false - if you don't want this bot to automatically lock the pull request after merging (default - true)
+ # use-dco-flag: true - If you are using DCO instead of CLA
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 000000000..3fbad1e5f
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,45 @@
+name: deploy for dev
+
+on:
+ push:
+ branches:
+ - 'devops' # Only for the dev branch
+ paths:
+ - '.github/workflows/*'
+ # - '__test__/**' # dev No immediate testing is required
+ - 'src/**'
+ - 'Dockerfile'
+ - 'docker-compose.yml'
+ - 'bin/*'
+
+jobs:
+ deploy-dev:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - name: set ssh key # Temporarily set up ssh key
+ run: |
+ mkdir -p ~/.ssh/
+ # secrets.WFP_ID_RSA set in GitHub
+ echo "${{secrets.WFP_ID_RSA}}" > ~/.ssh/id_rsa
+ chmod 600 ~/.ssh/id_rsa
+ ssh-keyscan "182.92.xxx.xxx" >> ~/.ssh/known_hosts
+ - name: deploy # Deployment
+ run: |
+ ssh work@182.92.xxx.xxx "
+ # 【Attention】Log in with the 'work' account, manually create /home/work/imooc-lego directory
+ # Then git clone https://username:password@github.com/imooc-lego/biz-editor-server.git -b dev (private repository, use GitHub username and password)
+ # Remember to delete origin to avoid exposing GitHub password
+
+ cd /home/work/imooc-lego/biz-editor-server;
+ git remote add origin https://openimbot:${{secrets.WFP_PASSWORD}}@github.com/OpenIMSDK/open-im-server.git;
+ git checkout dev;
+ git pull origin dev; # Download the latest code again
+ git remote remove origin; # Remove origin to avoid exposing GitHub password
+ # Start docker
+ docker-compose build editor-server; # Same as the service name in docker-compose.yml
+ docker-compose up -d;
+ "
+ - name: delete ssh key # Delete ssh key
+ run: rm -rf ~/.ssh/id_rsa
diff --git a/.github/workflows/depsreview.yaml b/.github/workflows/depsreview.yaml
new file mode 100644
index 000000000..c95afb845
--- /dev/null
+++ b/.github/workflows/depsreview.yaml
@@ -0,0 +1,18 @@
+# Copyright © 2023 KubeCub open source community. All rights reserved.
+# Licensed under the MIT License (the "License");
+# you may not use this file except in compliance with the License.
+
+name: Dependency Review
+on: [pull_request]
+
+permissions:
+ contents: read
+
+jobs:
+ dependency-review:
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Checkout Repository'
+ uses: actions/checkout@v3
+ - name: 'Dependency Review'
+ uses: actions/dependency-review-action@v3
\ No newline at end of file
diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml
index e69de29bb..6b9f79d51 100644
--- a/.github/workflows/e2e-test.yml
+++ b/.github/workflows/e2e-test.yml
@@ -0,0 +1,2 @@
+
+# name: OpenIM e2e Test
\ No newline at end of file
diff --git a/.github/workflows/golangci-link.yml b/.github/workflows/golangci-link.yml
index f3664c1bc..c740afff7 100644
--- a/.github/workflows/golangci-link.yml
+++ b/.github/workflows/golangci-link.yml
@@ -13,7 +13,7 @@
# limitations under the License.
-name: OpenKF golangci-lint
+name: OpenIM golangci-lint
on:
push:
branches: [main]
diff --git a/.github/workflows/gosec.yml b/.github/workflows/gosec.yml
index 60f42ae1e..43fba5c0c 100644
--- a/.github/workflows/gosec.yml
+++ b/.github/workflows/gosec.yml
@@ -1,30 +1,31 @@
-# name: Run gosec
+name: OpenIM Run Gosec
-# # gosec is a source code security audit tool for the Go language. It performs a static
-# # analysis of the Go code, looking for potential security problems. The main functions of gosec are:
-# # 1. Find common security vulnerabilities, such as SQL injection, command injection, and cross-site scripting (XSS).
-# # 2. Audit codes according to common security standards and find non-standard codes.
-# # 3. Assist the Go language engineer to write safe and reliable code.
+# gosec is a source code security audit tool for the Go language. It performs a static
+# analysis of the Go code, looking for potential security problems. The main functions of gosec are:
+# 1. Find common security vulnerabilities, such as SQL injection, command injection, and cross-site scripting (XSS).
+# 2. Audit codes according to common security standards and find non-standard codes.
+# 3. Assist the Go language engineer to write safe and reliable code.
+# https://github.com/securego/gosec/
+on:
+ push:
+ branches: "*"
+ pull_request:
+ branches: "*"
+ paths-ignore:
+ - '*.md'
+ - '*.yml'
+ - '.github'
-# on:
-# push:
-# branches: "*"
-# pull_request:
-# branches: "*"
-# paths-ignore:
-# - '*.md'
-# - '*.yml'
-# - '.github'
-
-# jobs:
-# golang-security-action:
-# runs-on: ubuntu-latest
-# env:
-# GO111MODULE: on
-# steps:
-# - name: Check out code
-# uses: actions/checkout@v3
-# - name: Run Gosec Security Scanner
-# uses: securego/gosec@master
-# with:
-# args: ./...
\ No newline at end of file
+jobs:
+ golang-security-action:
+ runs-on: ubuntu-latest
+ env:
+ GO111MODULE: on
+ steps:
+ - name: Check out code
+ uses: actions/checkout@v3
+ - name: Run Gosec Security Scanner
+ uses: securego/gosec@master
+ with:
+ args: ./...
+ continue-on-error: true
\ No newline at end of file
diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml
index f6d02cf63..2ecfad6ea 100644
--- a/.github/workflows/image.yml
+++ b/.github/workflows/image.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM open source community. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
name: Build Image
on:
diff --git a/.github/workflows/lock-issue.yml b/.github/workflows/lock-issue.yml
new file mode 100644
index 000000000..8cf0433d6
--- /dev/null
+++ b/.github/workflows/lock-issue.yml
@@ -0,0 +1,51 @@
+name: 'Lock Threads'
+
+on:
+ schedule:
+ - cron: '0 * * * *'
+ workflow_dispatch:
+
+permissions:
+ issues: write
+ pull-requests: write
+
+concurrency:
+ group: lock
+
+jobs:
+ action:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v4
+ with:
+ github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ issue-inactive-days: '365'
+ exclude-issue-created-before: ''
+ exclude-issue-created-after: ''
+ exclude-issue-created-between: ''
+ exclude-issue-closed-before: ''
+ exclude-issue-closed-after: ''
+ exclude-issue-closed-between: ''
+ include-any-issue-labels: ''
+ include-all-issue-labels: ''
+ exclude-any-issue-labels: ''
+ add-issue-labels: ''
+ remove-issue-labels: ''
+ issue-comment: ''
+ issue-lock-reason: 'resolved'
+ pr-inactive-days: '365'
+ exclude-pr-created-before: ''
+ exclude-pr-created-after: ''
+ exclude-pr-created-between: ''
+ exclude-pr-closed-before: ''
+ exclude-pr-closed-after: ''
+ exclude-pr-closed-between: ''
+ include-any-pr-labels: ''
+ include-all-pr-labels: ''
+ exclude-any-pr-labels: ''
+ add-pr-labels: ''
+ remove-pr-labels: ''
+ pr-comment: ''
+ pr-lock-reason: 'resolved'
+ process-only: ''
+ log-output: false
\ No newline at end of file
diff --git a/.github/workflows/opencommit.yml b/.github/workflows/opencommit.yml
index 80fc9e302..69f7d7f23 100644
--- a/.github/workflows/opencommit.yml
+++ b/.github/workflows/opencommit.yml
@@ -1,4 +1,4 @@
-name: 'OpenCommit Action'
+name: 'OpenIM Commit Action'
on:
push:
diff --git a/.github/workflows/openim-ci.yml b/.github/workflows/openim-ci.yml
deleted file mode 100644
index 6460a43b1..000000000
--- a/.github/workflows/openim-ci.yml
+++ /dev/null
@@ -1,134 +0,0 @@
-# Copyright © 2023 OpenIM open source community. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-name: OpenIM CI
-
-on:
- push:
- branches:
- - main
- paths-ignore:
- - "docs/**"
- - "README.md"
- - "README_zh-CN.md"
- - "CONTRIBUTING.md"
- pull_request:
- branches:
- - main
- paths-ignore:
- - "README.md"
- - "README_zh-CN.md"
- - "CONTRIBUTING.md"
- - "docs/**"
-
-env:
- GO_VERSION: "1.19"
- GOLANGCI_VERSION: "v1.50.1"
-
-jobs:
- openim:
- name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }}
- runs-on: ${{ matrix.os }}
- environment:
- name: openim
-
- strategy:
- matrix:
- go_version: ["1.18","1.19","1.20"]
- os: [ubuntu-latest]
-
- steps:
- - name: Set up Go ${{ matrix.go_version }}
- uses: actions/setup-go@v2
- with:
- go-version: ${{ matrix.go_version }}
- id: go
-
- - name: Check out code into the Go module directory
- uses: actions/checkout@v2
-
- - name: Run go modules tidy
- run: |
- make tidy
-
- - name: Run go format
- run: |
- make format
- echo "Run go format successfully"
- continue-on-error: true
-
- # - name: Generate all necessary files, such as error code files
- # run: |
- # make generate
-
- # - name: Check syntax and styling of go sources
- # run: |
- # set -e
- # make lint
-
- # - name: Run unit test and get test coverage
- # run: |
- # make cover
-
- - name: Build source code for host platform
- run: |
- make build
- echo "Build source code for host platform successfully"
-
- # - name: Collect Test Coverage File
- # uses: actions/upload-artifact@v1.0.0
- # with:
- # name: main-output
- # path: _output/tmp/coverage.out
-
- # - name: Set up Docker Buildx
- # uses: docker/setup-buildx-action@v1
-
-# lint:
-# runs-on: ubuntu-20.04
-# steps:
-# - name: Checkout
-# uses: actions/checkout@v3
-# with:
-# fetch-depth: 0
-
-# - name: Set up Go
-# uses: actions/setup-go@v3
-# with:
-# go-version: ${{ env.GO_VERSION }}
-
-# - name: golangci-lint
-# uses: golangci/golangci-lint-action@v3
-# with:
-# version: ${{ env.GOLANGCI_VERSION }}
-
-# docker-image-tests:
-# runs-on: ubuntu-20.04
-# steps:
-# - name: Checkout
-# uses: actions/checkout@v3
-# with:
-# fetch-depth: 0
-
-# - name: Set up Go
-# uses: actions/setup-go@v3
-# with:
-# go-version: ${{ env.GO_VERSION }}
-
-# - name: Run tests
-# run: make build
-
-# - name: Test docker image
-# run: |
-# docker build -t openim:ci-build .
diff --git a/.github/workflows/openimci.yml b/.github/workflows/openimci.yml
new file mode 100644
index 000000000..e0546515e
--- /dev/null
+++ b/.github/workflows/openimci.yml
@@ -0,0 +1,168 @@
+# Copyright © 2023 OpenIM open source community. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: OpenIM CI Aotu Build and Install
+
+on:
+ push:
+ branches:
+ - main
+ paths-ignore:
+ - "docs/**"
+ - "README.md"
+ - "README_zh-CN.md"
+ - "CONTRIBUTING.md"
+ pull_request:
+ branches:
+ - main
+ paths-ignore:
+ - "README.md"
+ - "README_zh-CN.md"
+ - "CONTRIBUTING.md"
+ - "docs/**"
+
+env:
+ GO_VERSION: "1.19"
+ GOLANGCI_VERSION: "v1.50.1"
+
+jobs:
+ openim:
+ name: Test with go ${{ matrix.go_version }} on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ permissions:
+ # Give the default GITHUB_TOKEN write permission to commit and push the changed files back to the repository.
+ contents: write
+ environment:
+ name: openim
+
+ strategy:
+ matrix:
+ go_version: ["1.18","1.19","1.20"]
+ os: [ubuntu-latest]
+
+ steps:
+ - name: Set up Go ${{ matrix.go_version }}
+ uses: actions/setup-go@v2
+ with:
+ go-version: ${{ matrix.go_version }}
+ id: go
+
+ - name: Check out code into the Go module directory
+ uses: actions/checkout@v3
+
+ - name: Install Task
+ uses: arduino/setup-task@v1
+ with:
+ version: 2.x
+
+ - name: Run go modules tidy
+ run: |
+ sudo make tidy
+ sudo make tools.verify.go-gitlint
+ echo "Run go modules tidy successfully"
+
+ - name: Run go format
+ run: |
+ sudo make format
+ echo "Run go format successfully"
+ continue-on-error: true
+
+ - name: Generate all necessary files, such as error code files
+ run: |
+ make generate
+ echo "Generate all necessary files successfully"
+ continue-on-error: true
+
+ - name: Run unit test and get test coverage
+ run: |
+ make cover
+ echo "Run unit test and get test coverage successfully"
+ continue-on-error: true
+
+ - name: Build source code for host platform
+ run: |
+ sudo make build
+ echo "Build source code for host platform successfully"
+
+ - name: OpenIM verify copyright
+ run: |
+ sudo make verify-copyright
+ sudo make add-copyright
+ echo "OpenIM verify successfully"
+ continue-on-error: true
+
+ - name: Clean all build
+ run: |
+ sudo make clean
+ echo "Clean all build successfully"
+
+ - name: push OpenIM
+ uses: stefanzweifel/git-auto-commit-action@v4
+ with:
+ commit_message: "cicd: robot automated Change"
+ # commit_options: '--no-verify --signoff'
+ branch: main
+ # create_branch: true
+ # # Optional commit user and author settings
+ # commit_user_name: kubbot # defaults to "github-actions[bot]"
+ # commit_user_email: 3293172751ysy@gmail.com # defaults to "41898282+github-actions[bot]@users.noreply.github.com"
+ # commit_author: Kubbot # defaults to author of the commit that triggered the run
+ continue-on-error: true
+
+ - name: Set Current Directory
+ id: set_directory
+ run: |
+ echo "::set-output name=directory::$(pwd)"
+ continue-on-error: true
+
+ - name: Collect Test Coverage File
+ id: collect_coverage
+ run: |
+ cd ${{ steps.set_directory.outputs.directory }}
+ make cover
+ echo "::set-output name=coverage_file::./_output/tmp/coverage.out"
+ continue-on-error: true
+
+ - name: Display Test Coverage
+ run: |
+ echo "Test Coverage:"
+ cat ${{ steps.collect_coverage.outputs.coverage_file }}
+ continue-on-error: true
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ continue-on-error: true
+
+ openim-start:
+ name: Teat OpenIM make install start on ${{ matrix.os }}
+ runs-on: ${{ matrix.os }}
+ environment:
+ name: openim
+ strategy:
+ matrix:
+ go_version: ["1.20"]
+ os: ["ubuntu-latest"]
+ steps:
+ - name: Set up Go ${{ matrix.go_version }}
+ uses: actions/setup-go@v2
+ with:
+ go-version: ${{ matrix.go_version }}
+ id: go
+
+ - name: Check out code into the Go module directory
+ uses: actions/checkout@v2
+
+ - name: Run OpenIM make install start
+ run: |
+ sudo make install
\ No newline at end of file
diff --git a/.github/workflows/project-progress.yml b/.github/workflows/project-progress.yml
index ad721a361..12e8615f4 100644
--- a/.github/workflows/project-progress.yml
+++ b/.github/workflows/project-progress.yml
@@ -1,3 +1,17 @@
+# Copyright © 2023 OpenIM open source community. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
# GitHub recommends pinning actions to a commit SHA.
# To get a newer version, you will need to update the SHA.
# You can also reference a tag or branch, but the action may change without warning.
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 280804c94..c4f190766 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,4 +1,4 @@
-name: goreleaser
+name: OpenIM Server Release
on:
push:
@@ -8,8 +8,8 @@ on:
permissions:
contents: write
- # packages: write
- # issues: write
+ packages: write
+ issues: write
jobs:
goreleaser:
@@ -35,3 +35,30 @@ jobs:
# Your GoReleaser Pro key, if you are using the 'goreleaser-pro'
# distribution:
# GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
+
+ goreleaser-check-pkgs:
+ runs-on: ubuntu-latest
+ env:
+ DOCKER_CLI_EXPERIMENTAL: "enabled"
+ needs: [ goreleaser ]
+ if: github.ref == 'refs/heads/main'
+ strategy:
+ matrix:
+ format: [ deb, rpm, apk ]
+ steps:
+ - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+ with:
+ fetch-depth: 0
+ - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
+ with:
+ version: 3.x
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2
+ - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
+ with:
+ path: |
+ ./_output/dist/*.deb
+ ./_output/dist/*.rpm
+ ./_output/dist/*.apk
+ key: ${{ github.ref }}
+ - run: task goreleaser:test:${{ matrix.format }}
\ No newline at end of file
diff --git a/.github/workflows/scripts-test.yml b/.github/workflows/scripts-test.yml
index 4b0dc03b4..badb33012 100644
--- a/.github/workflows/scripts-test.yml
+++ b/.github/workflows/scripts-test.yml
@@ -48,7 +48,6 @@ jobs:
sudo ./scripts/build_all_service.sh
sudo cat logs/openIM.log 2>/dev/null
shell: bash
- continue-on-error: true
- name: Start all services
run: |
diff --git a/.gitignore b/.gitignore
index e870d0a42..e6808d57e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,6 +22,7 @@ logs
.devcontainer
components
out-test
+Dockerfile.cross
### Makefile ###
tmp/
@@ -389,4 +390,5 @@ Sessionx.vim
[._]*.un~
# End of https://www.toptal.com/developers/gitignore/api/go,git,vim,tags,test,emacs,backup,jetbrains
-.idea
\ No newline at end of file
+.idea
+dist/
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
new file mode 100644
index 000000000..f9ca78474
--- /dev/null
+++ b/.goreleaser.yaml
@@ -0,0 +1,448 @@
+# This is an example .goreleaser.yml file with some sensible defaults.
+# Make sure to check the documentation at https://goreleaser.com
+
+before:
+ hooks:
+ # You may remove this if you don't use go modules.
+ - make tidy
+ - make copyright.add
+ # you may remove this if you don't need go generate
+ - go generate ./...
+
+snapshot:
+ name_template: "{{ incpatch .Version }}-next"
+
+# gomod:
+# proxy: true
+
+report_sizes: true
+
+# metadata:
+# mod_timestamp: "{{ .CommitTimestamp }}"
+
+builds:
+ - binary: openim-api
+ id: openim-api
+ main: ./cmd/openim-api/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-cmdutils
+ id: openim-cmdutils
+ main: ./cmd/openim-cmdutils/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-crontask
+ id: openim-crontask
+ main: ./cmd/openim-crontask/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-msggateway
+ id: openim-msggateway
+ main: ./cmd/openim-msggateway/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-msgtransfer
+ id: openim-msgtransfer
+ main: ./cmd/openim-msgtransfer/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-push
+ id: openim-push
+ main: ./cmd/openim-push/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-auth
+ id: openim-rpc-auth
+ main: ./cmd/openim-rpc/openim-rpc-auth/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-conversation
+ id: openim-rpc-conversation
+ main: ./cmd/openim-rpc/openim-rpc-conversation/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-friend
+ id: openim-rpc-friend
+ main: ./cmd/openim-rpc/openim-rpc-friend/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-group
+ id: openim-rpc-group
+ main: ./cmd/openim-rpc/openim-rpc-group/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-msg
+ id: openim-rpc-msg
+ main: ./cmd/openim-rpc/openim-rpc-msg/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-third
+ id: openim-rpc-third
+ main: ./cmd/openim-rpc/openim-rpc-third/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+ - binary: openim-rpc-user
+ id: openim-rpc-user
+ main: ./cmd/openim-rpc/openim-rpc-user/main.go
+ goos:
+ - darwin
+ - windows
+ - linux
+ goarch:
+ - s390x
+ - mips64
+ - mips64le
+ - amd64
+ - ppc64le
+ - arm64
+ goarm:
+ - 6
+ - 7
+
+archives:
+ - format: tar.gz
+ # this name template makes the OS and Arch compatible with the results of uname.
+ name_template: >-
+ {{ .ProjectName }}_
+ {{- title .Os }}_
+ {{- if eq .Arch "amd64" }}x86_64
+ {{- else if eq .Arch "386" }}i386
+ {{- else }}{{ .Arch }}{{ end }}
+ {{- if .Arm }}v{{ .Arm }}{{ end }}
+ # use zip for windows archives
+ files:
+ - LICENSE
+ - README.md
+ - CHANGELOG/*
+ - CONTRIBUTING.md
+ - docs/*
+ - src: "*.md"
+ dst: docs
+
+ # Strip parent folders when adding files to the archive.
+ strip_parent: true
+
+ # File info.
+ # Not all fields are supported by all formats available formats.
+ #
+ # Default: copied from the source file
+ info:
+ # Templates: allowed (since v1.14)
+ owner: root
+
+ # Templates: allowed (since v1.14)
+ group: root
+
+ # Must be in time.RFC3339Nano format.
+ #
+ # Templates: allowed (since v1.14)
+ mtime: "{{ .CommitDate }}"
+
+ # File mode.
+ mode: 0644
+
+ format_overrides:
+ - goos: windows
+ format: zip
+
+changelog:
+ sort: asc
+ use: github
+ filters:
+ exclude:
+ - "^test:"
+ - "^chore"
+ - "merge conflict"
+ - Merge pull request
+ - Merge remote-tracking branch
+ - Merge branch
+ - go mod tidy
+ groups:
+ - title: Dependency updates
+ regexp: '^.*?(feat|fix)\(deps\)!?:.+$'
+ order: 300
+ - title: "New Features"
+ regexp: '^.*?feat(\([[:word:]]+\))??!?:.+$'
+ order: 100
+ - title: "Security updates"
+ regexp: '^.*?sec(\([[:word:]]+\))??!?:.+$'
+ order: 150
+ - title: "Bug fixes"
+ regexp: '^.*?fix(\([[:word:]]+\))??!?:.+$'
+ order: 200
+ - title: "Documentation updates"
+ regexp: ^.*?doc(\([[:word:]]+\))??!?:.+$
+ order: 400
+ - title: "Build process updates"
+ regexp: ^.*?build(\([[:word:]]+\))??!?:.+$
+ order: 400
+ - title: Other work
+ order: 9999
+
+
+nfpms:
+ - id: packages
+ builds:
+ - openim-api
+ - openim-cmdutils
+ - openim-crontask
+ - openim-msggateway
+ - openim-msgtransfer
+ - openim-push
+ - openim-rpc-auth
+ - openim-rpc-conversation
+ - openim-rpc-friend
+ - openim-rpc-group
+ - openim-rpc-msg
+ - openim-rpc-third
+ - openim-rpc-user
+ # Your app's vendor.
+ vendor: OpenIMSDK
+ homepage: https://github.com/OpenIMSDK/Open-IM-Server
+ maintainer: kubbot
*ZqX~dhOsIO1%-1Ix6)827^-r^amHSU@SamSa+6Z%{D`j>KsKRX_3SnQJA@+gg@
zxkIBX@SJbarMzi-rz7td&jqwzx;1mx>FD>s^C1(L@|Qn59ba8MPsbQBQ9G&HxFB+r
zg3)bJ#DS{2Wr-Z8Z&a|pka|Kj=t7dC(H)s_s=?8v3yc_}yW4j 8T)2TmO*X}`0sU=tI8P&!h>QP_`EI^G%i?@c!_e&+CxXXUf2{-;izliVdAeDNfo
zi19uJDSo<}Hh5v)YI;g>$_gBxoZ?+=-ti{lOpZ^Q>^$qoUps`ZU->itz3KKx#Be!w
zhd|WSS0I^?pLUST!Z|DJZQGekrfNs)&t;I5aaYusj!rToWlzlGoA;)Kd7hS+BZ6Zr
z5nhJYdpIK0-J;E9&wsS2!qs~U-#1i7kDD9UeA@@*d&>?4yYF$(5O0~
z*?a)h>OP=-?|{zp1G$sif2
z-v$v4Ov~IY{%%nRwtcTkNxaQ`3dGFO+&;m=R|bXw$xt#4URe;zknqBcz5!&0hR9T$
zM*?CEgtj23ub;fF!9mE-aQmijuP;k~q99LU+Q=H*g->YNmLXNih?q8jNw-m^-!-Qr
zx7QWO(rpe~<^;t8iWCs31|JGGK%HNkz8A{gm_QTx{?npfQzG=Q&rm?FDUoWCYP)Nj
zjY$9$$!Tpu3m;F&pN(3>f!4`pZepZ)sUqFz877=8a}NYwkmJU+QW~@&PiBzI;I9jf
zhag#7Y)n)4EAyeQwyfG~`|v>8Ks00zW!8ob%T9tQ4TB5~12YQ_L}38VcqBm`i7d%3
zF5KT<3GeKmNp>%eX0;Q@7=1Ekx4UF7XVYB+l$=3^{v?{f8ZwQA#AQ`*076H-U!QR_
zIx`c4Ps5ZUaRP)QG~iN(RD{r~Z5PS8X*r{iCq9j0n{{s#N#JB{!lyqPg^27NkO-kQ
zpfqvYto3Z17x!LF9VE&`Ae?Q>dZ`)k|3ZU|K=KDW{;?B`Pj(s)5M-gAWJF;Uq|e^u
z%xWmrhH&(e$4o?MEQEm&8g&4?t)xc=oCQ+)P&SH%a>FCwpZPKZ+=ybF*%=xPgMoQR
zeOqKqN%|UU2B<+nBPp3k2%*D=>?u9yg!7gq$W4NDOdGVZj*evG)F8S^RF(;)aC$tQ
zB1oI9bokp&c%VBZL(A)l_CsYh?oefCEG0ww
P}8m9ArSGblM~u#BdoJ_{IC1X*JSi~0n0qs@
zc=pxup|