Linkwardenでバナー画像まで含めてバックアップ・復元

ブックマーク管理やあとで読む系のLinkwardenで、以前にもバックアップ・復元スクリプトを紹介していましたが、それらでは登録したバナー画像は含まれていませんでしたので、バナー画像まで含んだ形でバックアップ・復元出来るようにしました。バナー画像を沢山登録している時には役立つはず。

#!/bin/bash
set -euo pipefail
# =============================================================
#  Linkwarden スクリプト インストーラー
#
#  実行するだけで以下を一括セットアップします:
#    - /opt/lxd-data/script/linkwarden/linkwarden-backup.sh
#    - /opt/lxd-data/script/linkwarden/linkwarden-restore.sh
#    - 実行権限の付与
#    - (任意) cron への自動バックアップ登録
#
#  使い方:
#    sudo bash linkwarden-install.sh
# =============================================================

SCRIPT_DIR="/opt/lxd-data/script/linkwarden"
BACKUP_DIR="/opt/lxd-data/linkwarden"

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

info()    { echo -e "${GREEN}[INFO]${NC}  $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error()   { echo -e "${RED}[ERROR]${NC} $*" >&2; }
section() { echo -e "\n${CYAN}==> $*${NC}"; }

if [ "$(id -u)" -ne 0 ]; then
    error "このスクリプトは root または sudo で実行してください"
    exit 1
fi

echo ""
echo "════════════════════════════════════════════════"
echo "  Linkwarden スクリプト インストーラー"
echo "════════════════════════════════════════════════"
echo ""
echo "  インストール先: ${SCRIPT_DIR}/"
echo "  バックアップ先: ${BACKUP_DIR}/"
echo ""

# ════════════════════════════════════════════════════
#  [Step 1] cron 登録の確認 (スクリプト作成前に確認)
# ════════════════════════════════════════════════════
section "[Step 1] 自動バックアップ (cron) の設定"
echo ""
echo "  バックアップスクリプトを定期実行するよう cron に登録できます。"
echo ""
echo "  スケジュール例:"
echo "    [1] 毎日    深夜 2:00"
echo "    [2] 毎週日曜 深夜 2:00"
echo "    [3] 毎月1日  深夜 2:00"
echo "    [4] cron に登録しない"
echo ""
CRON_CHOICE=""
while true; do
    read -rp "  選択してください [1-4]: " CRON_CHOICE
    case "${CRON_CHOICE}" in
        1|2|3|4) break ;;
        *) warn "1 〜 4 を入力してください" ;;
    esac
done

case "${CRON_CHOICE}" in
    1) CRON_SCHEDULE="0 2 * * *"   ; CRON_LABEL="毎日 深夜 2:00" ;;
    2) CRON_SCHEDULE="0 2 * * 0"   ; CRON_LABEL="毎週日曜 深夜 2:00" ;;
    3) CRON_SCHEDULE="0 2 1 * *"   ; CRON_LABEL="毎月1日 深夜 2:00" ;;
    4) CRON_SCHEDULE=""             ; CRON_LABEL="登録しない" ;;
esac
echo ""
info "cron 設定: ${CRON_LABEL}"

# ════════════════════════════════════════════════════
#  [Step 2] ディレクトリ作成
# ════════════════════════════════════════════════════
section "[Step 2] ディレクトリを作成..."
mkdir -p "${SCRIPT_DIR}"
mkdir -p "${BACKUP_DIR}"
info "作成: ${SCRIPT_DIR}"
info "作成: ${BACKUP_DIR}"

# ════════════════════════════════════════════════════
#  [Step 3] スクリプトを展開
# ════════════════════════════════════════════════════
section "[Step 3] スクリプトを展開..."


base64 -d << 'BASE64_BACKUP_EOF' > "${SCRIPT_DIR}/linkwarden-backup.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIExpbmt3YXJkZW4g44OQ44OD
44Kv44Ki44OD44OX44K544Kv44Oq44OX44OICiMKIyAg5L2/44GE5pa5OgojICAgIHN1ZG8gYmFz
aCBsaW5rd2FyZGVuLWJhY2t1cC5zaCAgICAgICAgICAjIOODkOODg+OCr+OCouODg+ODl+OCkuS9
nOaIkAojICAgIHN1ZG8gYmFzaCBsaW5rd2FyZGVuLWJhY2t1cC5zaCBsaXN0ICAgICAjIOODkOOD
g+OCr+OCouODg+ODl+S4gOimp+OCkuihqOekugojICAgIHN1ZG8gYmFzaCBsaW5rd2FyZGVuLWJh
Y2t1cC5zaCBjbGVhbiAgICAjIOWPpOOBhOODkOODg+OCr+OCouODg+ODl+OCkuWJiumZpAojCiMg
IOODkOODg+OCr+OCouODg+ODl+S/neWtmOWFiDogL29wdC9seGQtZGF0YS9saW5rd2FyZGVuLwoj
ICDjg5Djg4Pjgq/jgqLjg4Pjg5flr77osaE6CiMgICAgLSBQb3N0Z3JlU1FMIERCIOODgOODs+OD
lyAocGdfZHVtcCkKIyAgICAtIERvY2tlciDjg5zjg6rjg6Xjg7zjg6A6IGxpbmt3YXJkZW5fZGF0
YSAo44OQ44OK44O844O744K144Og44ON44Kk44Or44O744Ki44O844Kr44Kk44OW5ZCr44KA5YWo
55S75YOPKQojICAgIC0gZG9ja2VyLWNvbXBvc2UueW1sIC8gLnNlY3JldHMKIyA9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpMSU5L
V0FSREVOX0RJUj0iL29wdC9kb2NrZXIvbGlua3dhcmRlbiIKQkFDS1VQX0RJUj0iL29wdC9seGQt
ZGF0YS9saW5rd2FyZGVuIgpQT1NUR1JFU19DT05UQUlORVI9Imxpbmt3YXJkZW4tcG9zdGdyZXMi
CkxJTktXQVJERU5fQ09OVEFJTkVSPSJsaW5rd2FyZGVuIgpQT1NUR1JFU19VU0VSPSJsaW5rd2Fy
ZGVuIgpQT1NUR1JFU19EQj0ibGlua3dhcmRlbiIKS0VFUF9EQVlTPTcKCkdSRUVOPSdcMDMzWzA7
MzJtJwpSRUQ9J1wwMzNbMDszMW0nCllFTExPVz0nXDAzM1sxOzMzbScKQ1lBTj0nXDAzM1swOzM2
bScKTkM9J1wwMzNbMG0nCgppbmZvKCkgICAgeyBlY2hvIC1lICIke0dSRUVOfVtJTkZPXSR7TkN9
ICAkKiI7IH0Kd2FybigpICAgIHsgZWNobyAtZSAiJHtZRUxMT1d9W1dBUk5dJHtOQ30gICQqIjsg
fQplcnJvcigpICAgeyBlY2hvIC1lICIke1JFRH1bRVJST1JdJHtOQ30gJCoiID4mMjsgfQpzZWN0
aW9uKCkgeyBlY2hvIC1lICJcbiR7Q1lBTn09PT4gJCoke05DfSI7IH0KCnByaW50X2Jhbm5lcigp
IHsKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiAgTGlua3dhcmRlbiDj
g5Djg4Pjgq/jgqLjg4Pjg5fjgrnjgq/jg6rjg5fjg4giCiAgICBlY2hvICLilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAiCiAgICBl
Y2hvICIiCn0KCnVzYWdlKCkgewogICAgcHJpbnRfYmFubmVyCiAgICBlY2hvICLkvb/jgYTmlrk6
IgogICAgZWNobyAiICAkMCAgICAgICAgICAgICAjIOODkOODg+OCr+OCouODg+ODl+OCkuS9nOaI
kCIKICAgIGVjaG8gIiAgJDAgbGlzdCAgICAgICAgIyDjg5Djg4Pjgq/jgqLjg4Pjg5fkuIDopqfj
gpLooajnpLoiCiAgICBlY2hvICIgICQwIGNsZWFuICAgICAgICMg5Y+k44GE44OQ44OD44Kv44Ki
44OD44OX44KS5YmK6ZmkICgke0tFRVBfREFZU33ml6Xku6XkuIrliY0pIgogICAgZWNobyAiIgog
ICAgZWNobyAi5L+d5a2Y5YWIOiAke0JBQ0tVUF9ESVJ9LyIKICAgIGVjaG8gIiIKfQoKY2hlY2tf
cm9vdCgpIHsKICAgIGlmIFsgIiQoaWQgLXUpIiAtbmUgMCBdOyB0aGVuCiAgICAgICAgZXJyb3Ig
IuOBk+OBruOCueOCr+ODquODl+ODiOOBr3Jvb3Tjgb7jgZ/jga9zdWRv44Gn5a6f6KGM44GX44Gm
44GP44Gg44GV44GEIgogICAgICAgIGV4aXQgMQogICAgZmkKfQoKY2hlY2tfbGlua3dhcmRlbl9k
aXIoKSB7CiAgICBpZiBbICEgLWYgIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tlci1jb21wb3NlLnlt
bCIgXTsgdGhlbgogICAgICAgIGVycm9yICJMaW5rd2FyZGVu44OH44Kj44Os44Kv44OI44Oq44GM
6KaL44Gk44GL44KK44G+44Gb44KTOiAke0xJTktXQVJERU5fRElSfSIKICAgICAgICBleGl0IDEK
ICAgIGZpCn0KCmNoZWNrX3Bvc3RncmVzX3J1bm5pbmcoKSB7CiAgICBpZiAhIGRvY2tlciBwcyAt
LWZvcm1hdCAne3suTmFtZXN9fScgfCBncmVwIC1xICJeJHtQT1NUR1JFU19DT05UQUlORVJ9JCI7
IHRoZW4KICAgICAgICBlcnJvciAiUG9zdGdyZVNRTOOCs+ODs+ODhuODiuOBjOi1t+WLleOBl+OB
puOBhOOBvuOBm+OCkzogJHtQT1NUR1JFU19DT05UQUlORVJ9IgogICAgICAgIGV4aXQgMQogICAg
ZmkKfQoKIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIAKIyBMaW5rd2FyZGVu44Kz44Oz44OG44OK44GM44Oe44Km44Oz
44OI44GX44Gm44GE44KL44Oc44Oq44Ol44O844Og5oOF5aCx44KS5YuV55qE5Y+W5b6XCiMg5a++
6LGh44Oc44Oq44Ol44O844Og5ZCN44KS6L+U44GZICjkvos6IGxpbmt3YXJkZW5fZGF0YSkKIyDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIAKZ2V0X2xpbmt3YXJkZW5fdm9sdW1lcygpIHsKICAgIGxvY2FsIENPTlRBSU5F
Uj0iJHsxfSIKICAgICMg44Kz44Oz44OG44OK44GM44Oe44Km44Oz44OI44GX44Gm44GE44KLRG9j
a2Vy44Oc44Oq44Ol44O844Og5LiA6KanICh0eXBl44GMdm9sdW1l44Gu44KC44GuKQogICAgZG9j
a2VyIGluc3BlY3QgIiR7Q09OVEFJTkVSfSIgXAogICAgICAgIC0tZm9ybWF0ICd7e3JhbmdlIC5N
b3VudHN9fXt7aWYgZXEgLlR5cGUgInZvbHVtZSJ9fXt7Lk5hbWV9fTp7ey5EZXN0aW5hdGlvbn19
Cnt7ZW5kfX17e2VuZH19JyAyPi9kZXYvbnVsbCB8fCB0cnVlCn0KCmRvX2JhY2t1cCgpIHsKICAg
IHByaW50X2Jhbm5lcgogICAgY2hlY2tfcm9vdAogICAgY2hlY2tfbGlua3dhcmRlbl9kaXIKICAg
IGNoZWNrX3Bvc3RncmVzX3J1bm5pbmcKCiAgICBsb2NhbCBUSU1FU1RBTVAKICAgIFRJTUVTVEFN
UD0kKGRhdGUgKyIlWSVtJWRfJUglTSVTIikKICAgIGxvY2FsIFdPUktfRElSCiAgICBXT1JLX0RJ
Uj0kKG1rdGVtcCAtZCkKICAgIGxvY2FsIEJBQ0tVUF9GSUxFPSIke0JBQ0tVUF9ESVJ9L2xpbmt3
YXJkZW5fJHtUSU1FU1RBTVB9LnRhci5neiIKCiAgICB0cmFwICJybSAtcmYgJyR7V09SS19ESVJ9
JyIgRVhJVAoKICAgIHNlY3Rpb24gIlsxLzZdIOODkOODg+OCr+OCouODg+ODl+ODh+OCo+ODrOOC
r+ODiOODquOCkua6luWCmS4uLiIKICAgIG1rZGlyIC1wICIke0JBQ0tVUF9ESVJ9IgogICAgaW5m
byAi5L+d5a2Y5YWIOiAke0JBQ0tVUF9ESVJ9IgoKICAgICMg4pSA4pSAIFN0ZXAyOiBMaW5rd2Fy
ZGVu44Kz44Oz44OG44OK44KS5YGc5q2iIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAgc2VjdGlv
biAiWzIvNl0gTGlua3dhcmRlbuOCs+ODs+ODhuODiuOCkuS4gOaZguWBnOatoi4uLiIKICAgIGxv
Y2FsIExJTktXQVJERU5fV0FTX1JVTk5JTkc9ZmFsc2UKICAgIGlmIGRvY2tlciBwcyAtLWZvcm1h
dCAne3suTmFtZXN9fScgfCBncmVwIC1xICJeJHtMSU5LV0FSREVOX0NPTlRBSU5FUn0kIjsgdGhl
bgogICAgICAgICMg44Oc44Oq44Ol44O844Og5oOF5aCx44KS5YGc5q2i5YmN44Gr5Y+W5b6X44GX
44Gm44GK44GPCiAgICAgICAgbG9jYWwgVk9MVU1FX0lORk8KICAgICAgICBWT0xVTUVfSU5GTz0k
KGdldF9saW5rd2FyZGVuX3ZvbHVtZXMgIiR7TElOS1dBUkRFTl9DT05UQUlORVJ9IikKICAgICAg
ICBkb2NrZXIgc3RvcCAiJHtMSU5LV0FSREVOX0NPTlRBSU5FUn0iCiAgICAgICAgaW5mbyAiTGlu
a3dhcmRlbuOCs+ODs+ODhuODiuOCkuWBnOatouOBl+OBvuOBl+OBnyIKICAgICAgICBMSU5LV0FS
REVOX1dBU19SVU5OSU5HPXRydWUKICAgIGVsc2UKICAgICAgICB3YXJuICJMaW5rd2FyZGVu44Kz
44Oz44OG44OK44Gv44GZ44Gn44Gr5YGc5q2i44GX44Gm44GE44G+44GZIgogICAgICAgICMg5YGc
5q2i5Lit44Gn44KCaW5zcGVjdOOBp+ODnOODquODpeODvOODoOaDheWgseOBr+WPluOCjOOCiwog
ICAgICAgIFZPTFVNRV9JTkZPPSQoZ2V0X2xpbmt3YXJkZW5fdm9sdW1lcyAiJHtMSU5LV0FSREVO
X0NPTlRBSU5FUn0iIHx8IHRydWUpCiAgICBmaQoKICAgIGlmIFsgLXogIiR7Vk9MVU1FX0lORk86
LX0iIF07IHRoZW4KICAgICAgICB3YXJuICLjgrPjg7Pjg4bjg4rjga7jg5zjg6rjg6Xjg7zjg6Dm
g4XloLHjgpLlj5blvpfjgafjgY3jgb7jgZvjgpPjgILjg5zjg6rjg6Xjg7zjg6DlkI3jgpLnm7Tm
jqXmpJzntKLjgZfjgb7jgZkiCiAgICAgICAgVk9MVU1FX0lORk89IiIKICAgIGZpCgogICAgIyDi
lIDilIAgU3RlcDM6IFBvc3RncmVTUUwgRELjg4Djg7Pjg5cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSACiAgICBzZWN0aW9uICJbMy82XSBQb3N0Z3JlU1FMIERC44KS44OA44Oz
44OXLi4uIgogICAgZG9ja2VyIGV4ZWMgIiR7UE9TVEdSRVNfQ09OVEFJTkVSfSIgXAogICAgICAg
IHBnX2R1bXAgLVUgIiR7UE9TVEdSRVNfVVNFUn0iIC1kICIke1BPU1RHUkVTX0RCfSIgLUYgYyBc
CiAgICAgICAgPiAiJHtXT1JLX0RJUn0vcG9zdGdyZXMuZHVtcCIKICAgIGluZm8gIkRC44OA44Oz
44OX44K144Kk44K6OiAkKGR1IC1zaCAiJHtXT1JLX0RJUn0vcG9zdGdyZXMuZHVtcCIgfCBjdXQg
LWYxKSIKCiAgICAjIOKUgOKUgCBTdGVwNDogRG9ja2Vy44Oc44Oq44Ol44O844Og44KS44OQ44OD
44Kv44Ki44OD44OXIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgAogICAgc2VjdGlvbiAiWzQvNl0gRG9ja2Vy44Oc44Oq44Ol44O844Og
ICjnlLvlg4/jg7vjgqLjg7zjgqvjgqTjg5blkKvjgoDlhajjg4fjg7zjgr8pIOOCkuODkOODg+OC
r+OCouODg+ODly4uLiIKCiAgICBta2RpciAtcCAiJHtXT1JLX0RJUn0vdm9sdW1lcyIKCiAgICAj
IOOCs+ODs+ODhuODiuOBjOaMgeOBpOWFqOODnOODquODpeODvOODoOOCkuODkOODg+OCr+OCouOD
g+ODlwogICAgIyBWT0xVTUVfSU5GTyDjga8gInZvbHVtZeWQjTrjg57jgqbjg7Pjg4jjg53jgqTj
g7Pjg4hcbi4uLiIg44Gu5b2i5byPCiAgICBsb2NhbCBCQUNLRURfVVBfVk9MVU1FUz0iIgoKICAg
IGlmIFsgLW4gIiR7Vk9MVU1FX0lORk99IiBdOyB0aGVuCiAgICAgICAgd2hpbGUgSUZTPTogcmVh
ZCAtciBWT0xfTkFNRSBWT0xfREVTVDsgZG8KICAgICAgICAgICAgWyAteiAiJHtWT0xfTkFNRX0i
IF0gJiYgY29udGludWUKICAgICAgICAgICAgaW5mbyAi44Oc44Oq44Ol44O844OgICcke1ZPTF9O
QU1FfScgKCR7Vk9MX0RFU1R9KSDjgpLjg5Djg4Pjgq/jgqLjg4Pjg5fkuK0uLi4iCgogICAgICAg
ICAgICBsb2NhbCBTQUZFX05BTUUKICAgICAgICAgICAgU0FGRV9OQU1FPSQoZWNobyAiJHtWT0xf
TkFNRX0iIHwgdHIgJy8nICdfJykKCiAgICAgICAgICAgICMgYWxwaW5lIOOBp+WvvuixoeODnOOD
quODpeODvOODoOOCkuODnuOCpuODs+ODiOOBl+OBpiB0YXIg5Zyn57iuCiAgICAgICAgICAgIGRv
Y2tlciBydW4gLS1ybSBcCiAgICAgICAgICAgICAgICAtdiAiJHtWT0xfTkFNRX06L3NvdXJjZTpy
byIgXAogICAgICAgICAgICAgICAgLXYgIiR7V09SS19ESVJ9L3ZvbHVtZXM6L2JhY2t1cCIgXAog
ICAgICAgICAgICAgICAgYWxwaW5lOmxhdGVzdCBcCiAgICAgICAgICAgICAgICB0YXIgLWN6ZiAi
L2JhY2t1cC8ke1NBRkVfTkFNRX0udGFyLmd6IiAtQyAvc291cmNlIC4gMj4vZGV2L251bGwgfHwg
ewogICAgICAgICAgICAgICAgICAgIHdhcm4gIuODnOODquODpeODvOODoCAnJHtWT0xfTkFNRX0n
IOOBruODkOODg+OCr+OCouODg+ODl+OBq+WkseaVlyAo44K544Kt44OD44OXKSIKICAgICAgICAg
ICAgICAgICAgICB0b3VjaCAiJHtXT1JLX0RJUn0vdm9sdW1lcy8ke1NBRkVfTkFNRX0udGFyLmd6
IgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9jYWwgVk9MX1NJWkUKICAgICAgICAg
ICAgVk9MX1NJWkU9JChkdSAtc2ggIiR7V09SS19ESVJ9L3ZvbHVtZXMvJHtTQUZFX05BTUV9LnRh
ci5neiIgfCBjdXQgLWYxKQogICAgICAgICAgICBpbmZvICIgIOKGkiAke1NBRkVfTkFNRX0udGFy
Lmd6ICgke1ZPTF9TSVpFfSkiCiAgICAgICAgICAgIEJBQ0tFRF9VUF9WT0xVTUVTPSIke0JBQ0tF
RF9VUF9WT0xVTUVTfSR7Vk9MX05BTUV9OiR7Vk9MX0RFU1R9OiR7U0FGRV9OQU1FfS50YXIuZ3pc
biIKICAgICAgICBkb25lIDw8PCAiJHtWT0xVTUVfSU5GT30iCiAgICBlbHNlCiAgICAgICAgIyDj
g5Xjgqnjg7zjg6vjg5Djg4Pjgq86IGxpbmt3YXJkZW5fZGF0YSDjg5zjg6rjg6Xjg7zjg6DjgpLn
m7TmjqXjg5Djg4Pjgq/jgqLjg4Pjg5cKICAgICAgICB3YXJuICLjg5zjg6rjg6Xjg7zjg6Dmg4Xl
oLHjgYzlj5blvpfjgafjgY3jgarjgYvjgaPjgZ/jgZ/jgoHjgIFsaW5rd2FyZGVuX2RhdGEg44KS
55u05o6l44OQ44OD44Kv44Ki44OD44OX44GX44G+44GZIgogICAgICAgIGRvY2tlciBydW4gLS1y
bSBcCiAgICAgICAgICAgIC12ICJsaW5rd2FyZGVuX2RhdGE6L3NvdXJjZTpybyIgXAogICAgICAg
ICAgICAtdiAiJHtXT1JLX0RJUn0vdm9sdW1lczovYmFja3VwIiBcCiAgICAgICAgICAgIGFscGlu
ZTpsYXRlc3QgXAogICAgICAgICAgICB0YXIgLWN6ZiAvYmFja3VwL2xpbmt3YXJkZW5fZGF0YS50
YXIuZ3ogLUMgL3NvdXJjZSAuIDI+L2Rldi9udWxsIHx8IHsKICAgICAgICAgICAgICAgIHdhcm4g
Imxpbmt3YXJkZW5fZGF0YSDjga7jg5Djg4Pjgq/jgqLjg4Pjg5fjgavlpLHmlZciCiAgICAgICAg
ICAgICAgICB0b3VjaCAiJHtXT1JLX0RJUn0vdm9sdW1lcy9saW5rd2FyZGVuX2RhdGEudGFyLmd6
IgogICAgICAgICAgICB9CiAgICAgICAgQkFDS0VEX1VQX1ZPTFVNRVM9Imxpbmt3YXJkZW5fZGF0
YTovZGF0YS9kYXRhOmxpbmt3YXJkZW5fZGF0YS50YXIuZ3pcbiIKICAgICAgICBpbmZvICIgIOKG
kiBsaW5rd2FyZGVuX2RhdGEudGFyLmd6ICgkKGR1IC1zaCAiJHtXT1JLX0RJUn0vdm9sdW1lcy9s
aW5rd2FyZGVuX2RhdGEudGFyLmd6IiB8IGN1dCAtZjEpKSIKICAgIGZpCgogICAgIyDilIDilIAg
U3RlcDU6IOioreWumuODleOCoeOCpOODq+OCkuOCs+ODlOODvCDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIAKICAgIGNwICIke0xJTktXQVJERU5fRElSfS9kb2NrZXItY29tcG9zZS55
bWwiICIke1dPUktfRElSfS9kb2NrZXItY29tcG9zZS55bWwiCiAgICBpZiBbIC1mICIke0xJTktX
QVJERU5fRElSfS8uc2VjcmV0cyIgXTsgdGhlbgogICAgICAgIGNwICIke0xJTktXQVJERU5fRElS
fS8uc2VjcmV0cyIgIiR7V09SS19ESVJ9Ly5zZWNyZXRzIgogICAgICAgIGluZm8gIuioreWumuOD
leOCoeOCpOODqyAoLnNlY3JldHMpIOOCkuOCs+ODlOODvOOBl+OBvuOBl+OBnyIKICAgIGVsc2UK
ICAgICAgICB3YXJuICIuc2VjcmV0c+ODleOCoeOCpOODq+OBjOimi+OBpOOBi+OCiuOBvuOBm+OC
kyIKICAgIGZpCgogICAgIyDjg5Djg4Pjgq/jgqLjg4Pjg5fjg6Hjgr/mg4XloLEKICAgIGNhdCA+
ICIke1dPUktfRElSfS9iYWNrdXBfaW5mby50eHQiIDw8RU9GCmJhY2t1cF9kYXRlPSQoZGF0ZSAn
KyVZLSVtLSVkICVIOiVNOiVTJykKbGlua3dhcmRlbl9kaXI9JHtMSU5LV0FSREVOX0RJUn0KcG9z
dGdyZXNfY29udGFpbmVyPSR7UE9TVEdSRVNfQ09OVEFJTkVSfQpwb3N0Z3Jlc19kYj0ke1BPU1RH
UkVTX0RCfQpwb3N0Z3Jlc191c2VyPSR7UE9TVEdSRVNfVVNFUn0Kdm9sdW1lcz0ke0JBQ0tFRF9V
UF9WT0xVTUVTfQpFT0YKCiAgICAjIOKUgOKUgCBTdGVwNjog44Ki44O844Kr44Kk44OW5L2c5oiQ
IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAogICAg
c2VjdGlvbiAiWzYvNl0g44Ki44O844Kr44Kk44OW44KS5L2c5oiQLi4uIgogICAgdGFyIC1jemYg
IiR7QkFDS1VQX0ZJTEV9IiAtQyAiJHtXT1JLX0RJUn0iIC4KICAgIGxvY2FsIEJBQ0tVUF9TSVpF
CiAgICBCQUNLVVBfU0laRT0kKGR1IC1zaCAiJHtCQUNLVVBfRklMRX0iIHwgY3V0IC1mMSkKICAg
IGluZm8gIuOCouODvOOCq+OCpOODluS9nOaIkOWujOS6hjogJHtCQUNLVVBfRklMRX0gKCR7QkFD
S1VQX1NJWkV9KSIKCiAgICBzaGEyNTZzdW0gIiR7QkFDS1VQX0ZJTEV9IiA+ICIke0JBQ0tVUF9G
SUxFfS5zaGEyNTYiCiAgICBpbmZvICLjg4Hjgqfjg4Pjgq/jgrXjg6DoqJjpjLI6ICR7QkFDS1VQ
X0ZJTEV9LnNoYTI1NiIKCiAgICAjIExpbmt3YXJkZW7jgpLlho3otbfli5UKICAgIGlmIFsgIiR7
TElOS1dBUkRFTl9XQVNfUlVOTklOR30iID0gdHJ1ZSBdOyB0aGVuCiAgICAgICAgY2QgIiR7TElO
S1dBUkRFTl9ESVJ9IgogICAgICAgIGRvY2tlciBjb21wb3NlIHVwIC1kICIke0xJTktXQVJERU5f
Q09OVEFJTkVSfSIKICAgICAgICBpbmZvICJMaW5rd2FyZGVu44Kz44Oz44OG44OK44KS5YaN6LW3
5YuV44GX44G+44GX44GfIgogICAgZmkKCiAgICAjIOWPpOOBhOODkOODg+OCr+OCouODg+ODl+OC
kuiHquWLleWJiumZpAogICAgbG9jYWwgT0xEX0ZJTEVTCiAgICBPTERfRklMRVM9JChmaW5kICIk
e0JBQ0tVUF9ESVJ9IiAtbmFtZSAibGlua3dhcmRlbl8qLnRhci5neiIgXAogICAgICAgIC1tdGlt
ZSAiKyR7S0VFUF9EQVlTfSIgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGlmIFsgLW4gIiR7T0xE
X0ZJTEVTfSIgXTsgdGhlbgogICAgICAgIGxvY2FsIE9MRF9DT1VOVAogICAgICAgIE9MRF9DT1VO
VD0kKGVjaG8gIiR7T0xEX0ZJTEVTfSIgfCB3YyAtbCkKICAgICAgICBlY2hvICIke09MRF9GSUxF
U30iIHwgd2hpbGUgcmVhZCAtciBGOyBkbwogICAgICAgICAgICBybSAtZiAiJHtGfSIgIiR7Rn0u
c2hhMjU2IgogICAgICAgICAgICBpbmZvICLlj6TjgYTjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLliYrp
maQ6ICQoYmFzZW5hbWUgIiR7Rn0iKSIKICAgICAgICBkb25lCiAgICAgICAgaW5mbyAiJHtPTERf
Q09VTlR95Lu244Gu5Y+k44GE44OQ44OD44Kv44Ki44OD44OX44KS5YmK6Zmk44GX44G+44GX44Gf
ICgke0tFRVBfREFZU33ml6Xku6XkuIrliY0pIgogICAgZmkKCiAgICBlY2hvICIiCiAgICBlY2hv
ICLilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi
lZDilZDilZAiCiAgICBlY2hvIC1lICIgICR7R1JFRU594pyFICDjg5Djg4Pjgq/jgqLjg4Pjg5fl
rozkuobvvIEke05DfSIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg
8J+TpiDjg5XjgqHjgqTjg6sgOiAke0JBQ0tVUF9GSUxFfSIKICAgIGVjaG8gIiAg8J+TjyDjgrXj
gqTjgrogICA6ICR7QkFDS1VQX1NJWkV9IgogICAgZWNobyAiICDwn5WQIOWun+ihjOaZgumWkyA6
ICQoZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJykiCiAgICBlY2hvICIiCn0KCmRvX2xpc3QoKSB7
CiAgICBwcmludF9iYW5uZXIKCiAgICBpZiBbICEgLWQgIiR7QkFDS1VQX0RJUn0iIF07IHRoZW4K
ICAgICAgICB3YXJuICLjg5Djg4Pjgq/jgqLjg4Pjg5fjg4fjgqPjg6zjgq/jg4jjg6rjgYzlrZjl
nKjjgZfjgb7jgZvjgpM6ICR7QkFDS1VQX0RJUn0iCiAgICAgICAgZXhpdCAwCiAgICBmaQoKICAg
IGxvY2FsIEZJTEVTCiAgICBGSUxFUz0kKGZpbmQgIiR7QkFDS1VQX0RJUn0iIC1uYW1lICJsaW5r
d2FyZGVuXyoudGFyLmd6IiBcCiAgICAgICAgLXByaW50ZiAnJVRAICVwXG4nIDI+L2Rldi9udWxs
IHwgc29ydCAtcm4gfCBjdXQgLWQnICcgLWYyLSkKCiAgICBpZiBbIC16ICIke0ZJTEVTfSIgXTsg
dGhlbgogICAgICAgIHdhcm4gIuODkOODg+OCr+OCouODg+ODl+ODleOCoeOCpOODq+OBjOimi+OB
pOOBi+OCiuOBvuOBm+OCkyIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgZWNobyAi44OQ44OD
44Kv44Ki44OD44OX5LiA6KanOiAke0JBQ0tVUF9ESVJ9IgogICAgZWNobyAiIgogICAgcHJpbnRm
ICIgICUtNTJzICAlOHMgICVzXG4iICLjg5XjgqHjgqTjg6vlkI0iICLjgrXjgqTjgroiICLkvZzm
iJDml6XmmYIiCiAgICBlY2hvICIgICQocHJpbnRmICfilIAlLjBzJyB7MS4uNzV9KSIKCiAgICB3
aGlsZSBJRlM9IHJlYWQgLXIgRklMRTsgZG8KICAgICAgICBsb2NhbCBCQVNFTkFNRSBTSVpFIE1U
SU1FCiAgICAgICAgQkFTRU5BTUU9JChiYXNlbmFtZSAiJHtGSUxFfSIpCiAgICAgICAgU0laRT0k
KGR1IC1zaCAiJHtGSUxFfSIgfCBjdXQgLWYxKQogICAgICAgIE1USU1FPSQoc3RhdCAtYyAnJXkn
ICIke0ZJTEV9IiB8IGN1dCAtZCcuJyAtZjEpCiAgICAgICAgcHJpbnRmICIgICUtNTJzICAlOHMg
ICVzXG4iICIke0JBU0VOQU1FfSIgIiR7U0laRX0iICIke01USU1FfSIKICAgIGRvbmUgPDw8ICIk
e0ZJTEVTfSIKCiAgICBlY2hvICIiCiAgICBsb2NhbCBUT1RBTF9DT1VOVCBUT1RBTF9TSVpFCiAg
ICBUT1RBTF9DT1VOVD0kKGVjaG8gIiR7RklMRVN9IiB8IHdjIC1sKQogICAgVE9UQUxfU0laRT0k
KGR1IC1zaCAiJHtCQUNLVVBfRElSfSIgfCBjdXQgLWYxKQogICAgZWNobyAiICDlkIjoqIg6ICR7
VE9UQUxfQ09VTlR95Lu2IC8gJHtUT1RBTF9TSVpFfSIKICAgIGVjaG8gIiIKfQoKZG9fY2xlYW4o
KSB7CiAgICBwcmludF9iYW5uZXIKICAgIGNoZWNrX3Jvb3QKCiAgICBsb2NhbCBPTERfRklMRVMK
ICAgIE9MRF9GSUxFUz0kKGZpbmQgIiR7QkFDS1VQX0RJUn0iIC1uYW1lICJsaW5rd2FyZGVuXyou
dGFyLmd6IiBcCiAgICAgICAgLW10aW1lICIrJHtLRUVQX0RBWVN9IiAyPi9kZXYvbnVsbCB8fCB0
cnVlKQoKICAgIGlmIFsgLXogIiR7T0xEX0ZJTEVTfSIgXTsgdGhlbgogICAgICAgIGluZm8gIiR7
S0VFUF9EQVlTfeaXpeS7peS4iuWJjeOBruODkOODg+OCr+OCouODg+ODl+OBr+OBguOCiuOBvuOB
m+OCkyIKICAgICAgICBleGl0IDAKICAgIGZpCgogICAgd2FybiAi5Lul5LiL44Gu44OV44Kh44Kk
44Or44KS5YmK6Zmk44GX44G+44GZICgke0tFRVBfREFZU33ml6Xku6XkuIrliY0pOiIKICAgIGVj
aG8gIiR7T0xEX0ZJTEVTfSIgfCB3aGlsZSByZWFkIC1yIEY7IGRvCiAgICAgICAgZWNobyAiICAt
ICQoYmFzZW5hbWUgIiR7Rn0iKSAoJChkdSAtc2ggIiR7Rn0iIHwgY3V0IC1mMSkpIgogICAgZG9u
ZQogICAgZWNobyAiIgogICAgcmVhZCAtcnAgIiAg5YmK6Zmk44GX44G+44GZ44GL77yfIFt5L05d
OiAiIENPTkZJUk0KICAgIGlmIFtbICEgIiR7Q09ORklSTX0iID1+IF5bWXldJCBdXTsgdGhlbgog
ICAgICAgIHdhcm4gIuOCreODo+ODs+OCu+ODq+OBl+OBvuOBl+OBnyIKICAgICAgICBleGl0IDAK
ICAgIGZpCgogICAgZWNobyAiJHtPTERfRklMRVN9IiB8IHdoaWxlIHJlYWQgLXIgRjsgZG8KICAg
ICAgICBybSAtZiAiJHtGfSIgIiR7Rn0uc2hhMjU2IgogICAgICAgIGluZm8gIuWJiumZpDogJChi
YXNlbmFtZSAiJHtGfSIpIgogICAgZG9uZQoKICAgIGluZm8gIuOCr+ODquODvOODs+OCouODg+OD
l+WujOS6hiIKICAgIGVjaG8gIiIKfQoKQ09NTUFORD0iJHsxOi1iYWNrdXB9IgoKY2FzZSAiJHtD
T01NQU5EfSIgaW4KICAgIGJhY2t1cHwiIikgIGRvX2JhY2t1cCA7OwogICAgbGlzdCkgICAgICAg
ZG9fbGlzdCAgIDs7CiAgICBjbGVhbikgICAgICBkb19jbGVhbiAgOzsKICAgIC1ofC0taGVscHxo
ZWxwKSB1c2FnZSA7OwogICAgKikKICAgICAgICBlcnJvciAi5LiN5piO44Gq44Kz44Oe44Oz44OJ
OiAke0NPTU1BTkR9IgogICAgICAgIHVzYWdlCiAgICAgICAgZXhpdCAxCiAgICAgICAgOzsKZXNh
Ywo=
BASE64_BACKUP_EOF
info "作成: ${SCRIPT_DIR}/linkwarden-backup.sh"

base64 -d << 'BASE64_RESTORE_EOF' > "${SCRIPT_DIR}/linkwarden-restore.sh"
IyEvYmluL2Jhc2gKc2V0IC1ldW8gcGlwZWZhaWwKIyA9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIExpbmt3YXJkZW4g5b6p5YWD
44K544Kv44Oq44OX44OICiMKIyAg5L2/44GE5pa5OgojICAgIHN1ZG8gYmFzaCBsaW5rd2FyZGVu
LXJlc3RvcmUuc2gKIwojICDjg5Djg4Pjgq/jgqLjg4Pjg5fkv53lrZjlhYg6IC9vcHQvbHhkLWRh
dGEvbGlua3dhcmRlbi8KIyAg5b6p5YWD5YaF5a65OgojICAgIC0gUG9zdGdyZVNRTCBEQiAocGdf
cmVzdG9yZSkKIyAgICAtIERvY2tlciDjg5zjg6rjg6Xjg7zjg6AgKOODkOODiuODvOODu+OCteOD
oOODjeOCpOODq+ODu+OCouODvOOCq+OCpOODluWQq+OCgOWFqOeUu+WDjykKIyAgICAtIGRvY2tl
ci1jb21wb3NlLnltbCAvIC5zZWNyZXRzICjku7vmhI8pCiMgPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQkFDS1VQX0RJUj0iL29w
dC9seGQtZGF0YS9saW5rd2FyZGVuIgoKR1JFRU49J1wwMzNbMDszMm0nClJFRD0nXDAzM1swOzMx
bScKWUVMTE9XPSdcMDMzWzE7MzNtJwpDWUFOPSdcMDMzWzA7MzZtJwpOQz0nXDAzM1swbScKCmlu
Zm8oKSAgICB7IGVjaG8gLWUgIiR7R1JFRU59W0lORk9dJHtOQ30gICQqIjsgfQp3YXJuKCkgICAg
eyBlY2hvIC1lICIke1lFTExPV31bV0FSTl0ke05DfSAgJCoiOyB9CmVycm9yKCkgICB7IGVjaG8g
LWUgIiR7UkVEfVtFUlJPUl0ke05DfSAkKiIgPiYyOyB9CnNlY3Rpb24oKSB7IGVjaG8gLWUgIlxu
JHtDWUFOfT09PiAkKiR7TkN9IjsgfQoKcHJpbnRfYmFubmVyKCkgewogICAgZWNobyAiIgogICAg
ZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAiICBMaW5rd2FyZGVuIOW+qeWFg+OCueOCr+ODquODl+OD
iCIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gIiIKfQoKY2hlY2tfcm9vdCgpIHsKICAgIGlm
IFsgIiQoaWQgLXUpIiAtbmUgMCBdOyB0aGVuCiAgICAgICAgZXJyb3IgIuOBk+OBruOCueOCr+OD
quODl+ODiOOBr3Jvb3Tjgb7jgZ/jga9zdWRv44Gn5a6f6KGM44GX44Gm44GP44Gg44GV44GEIgog
ICAgICAgIGV4aXQgMQogICAgZmkKfQoKIyDilIDilIAg44OQ44OD44Kv44Ki44OD44OX44OV44Kh
44Kk44Or6YG45oqeIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gApzZWxlY3RfYmFja3VwX2ZpbGUoKSB7CiAgICBzZWN0aW9uICLlvqnlhYPjgZnjgovjg5Djg4Pj
gq/jgqLjg4Pjg5fjgpLpgbjmip4uLi4iCgogICAgaWYgWyAhIC1kICIke0JBQ0tVUF9ESVJ9IiBd
OyB0aGVuCiAgICAgICAgZXJyb3IgIuODkOODg+OCr+OCouODg+ODl+ODh+OCo+ODrOOCr+ODiOOD
quOBjOWtmOWcqOOBl+OBvuOBm+OCkzogJHtCQUNLVVBfRElSfSIKICAgICAgICBleGl0IDEKICAg
IGZpCgogICAgbG9jYWwgRklMRVM9KCkKICAgIHdoaWxlIElGUz0gcmVhZCAtciBsaW5lOyBkbwog
ICAgICAgIFsgLW4gIiR7bGluZX0iIF0gJiYgRklMRVMrPSgiJHtsaW5lfSIpCiAgICBkb25lIDwg
PChmaW5kICIke0JBQ0tVUF9ESVJ9IiAtbmFtZSAibGlua3dhcmRlbl8qLnRhci5neiIgXAogICAg
ICAgIC1wcmludGYgJyVUQCAlcFxuJyAyPi9kZXYvbnVsbCB8IHNvcnQgLXJuIHwgY3V0IC1kJyAn
IC1mMi0pCgogICAgaWYgWyAkeyNGSUxFU1tAXX0gLWVxIDAgXTsgdGhlbgogICAgICAgIGVycm9y
ICLjg5Djg4Pjgq/jgqLjg4Pjg5fjg5XjgqHjgqTjg6vjgYzopovjgaTjgYvjgorjgb7jgZvjgpM6
ICR7QkFDS1VQX0RJUn0iCiAgICAgICAgZXhpdCAxCiAgICBmaQoKICAgIGVjaG8gIiIKICAgIHBy
aW50ZiAiICAlLTRzICAlLTQ0cyAgJThzICAlc1xuIiAiTm8uIiAi44OV44Kh44Kk44Or5ZCNIiAi
44K144Kk44K6IiAi5L2c5oiQ5pel5pmCIgogICAgZWNobyAiICAkKHByaW50ZiAn4pSAJS4wcycg
ezEuLjc4fSkiCgogICAgbG9jYWwgaT0xCiAgICBmb3IgRklMRSBpbiAiJHtGSUxFU1tAXX0iOyBk
bwogICAgICAgIGxvY2FsIEJBU0VOQU1FIFNJWkUgTVRJTUUKICAgICAgICBCQVNFTkFNRT0kKGJh
c2VuYW1lICIke0ZJTEV9IikKICAgICAgICBTSVpFPSQoZHUgLXNoICIke0ZJTEV9IiB8IGN1dCAt
ZjEpCiAgICAgICAgTVRJTUU9JChzdGF0IC1jICcleScgIiR7RklMRX0iIHwgY3V0IC1kJy4nIC1m
MSkKICAgICAgICBpZiBbICIke2l9IiAtZXEgMSBdOyB0aGVuCiAgICAgICAgICAgIHByaW50ZiAi
ICAke0dSRUVOfVslZF0ke05DfSAgJS00NHMgICU4cyAgJXMgICR7R1JFRU594oaQIOacgOaWsCR7
TkN9XG4iIFwKICAgICAgICAgICAgICAgICIke2l9IiAiJHtCQVNFTkFNRX0iICIke1NJWkV9IiAi
JHtNVElNRX0iCiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYgIiAgWyVkXSAgJS00NHMg
ICU4cyAgJXNcbiIgXAogICAgICAgICAgICAgICAgIiR7aX0iICIke0JBU0VOQU1FfSIgIiR7U0la
RX0iICIke01USU1FfSIKICAgICAgICBmaQogICAgICAgIGk9JCgoIGkgKyAxICkpCiAgICBkb25l
CgogICAgZWNobyAiIgogICAgbG9jYWwgQ0hPSUNFCiAgICB3aGlsZSB0cnVlOyBkbwogICAgICAg
IHJlYWQgLXJwICIgIOW+qeWFg+OBmeOCi+ODkOODg+OCr+OCouODg+ODl+OBrueVquWPt+OCkumB
uOaKnuOBl+OBpuOBj+OBoOOBleOBhCBbMS0kKChpLTEpKV06ICIgQ0hPSUNFCiAgICAgICAgaWYg
W1sgIiR7Q0hPSUNFfSIgPX4gXlswLTldKyQgXV0gXAogICAgICAgICAgICAmJiBbICIke0NIT0lD
RX0iIC1nZSAxIF0gXAogICAgICAgICAgICAmJiBbICIke0NIT0lDRX0iIC1sZSAkKChpLTEpKSBd
OyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICB3YXJuICIxIOOAnCAk
KChpLTEpKSDjga7nlarlj7fjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYQiCiAgICBkb25lCgog
ICAgU0VMRUNURURfQkFDS1VQPSIke0ZJTEVTWyQoKENIT0lDRS0xKSldfSIKICAgIGluZm8gIumB
uOaKnuOBleOCjOOBn+ODkOODg+OCr+OCouODg+ODlzogJChiYXNlbmFtZSAiJHtTRUxFQ1RFRF9C
QUNLVVB9IikiCn0KCiMg4pSA4pSAIOOCs+ODs+ODhuODiumBuOaKniDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi
lIDilIDilIAKc2VsZWN0X3Jlc3RvcmVfY29udGFpbmVyKCkgewogICAgc2VjdGlvbiAi5b6p5YWD
5YWI44Kz44Oz44OG44OK44KS6YG45oqeIChMaW5ua3dhcmRlbuOCouODl+ODquOCs+ODs+ODhuOD
iklE44KS6YG444KT44Gn44GP44Gg44GV44GEKS4uLiIKCiAgICBsb2NhbCBBTExfQ09OVEFJTkVS
Uz0oKQogICAgd2hpbGUgSUZTPSByZWFkIC1yIGxpbmU7IGRvCiAgICAgICAgWyAtbiAiJHtsaW5l
fSIgXSAmJiBBTExfQ09OVEFJTkVSUys9KCIke2xpbmV9IikKICAgIGRvbmUgPCA8KGRvY2tlciBw
cyAtYSAtLWZvcm1hdCAne3suTmFtZXN9fScgMj4vZGV2L251bGwgfHwgdHJ1ZSkKCiAgICBpZiBb
ICR7I0FMTF9DT05UQUlORVJTW0BdfSAtZXEgMCBdOyB0aGVuCiAgICAgICAgZXJyb3IgIkRvY2tl
cuOCs+ODs+ODhuODiuOBjDHjgaTjgoLopovjgaTjgYvjgorjgb7jgZvjgpMiCiAgICAgICAgZXhp
dCAxCiAgICBmaQoKICAgIGVjaG8gIiIKICAgIGVjaG8gIiAg5Yip55So5Y+v6IO944Gq44Kz44Oz
44OG44OK5LiA6KanOiIKICAgIGVjaG8gIiIKCiAgICBsb2NhbCBpPTEKICAgIGZvciBDTkFNRSBp
biAiJHtBTExfQ09OVEFJTkVSU1tAXX0iOyBkbwogICAgICAgIGxvY2FsIFNUQVRVUyBTVEFUVVNf
Q09MT1IKICAgICAgICBTVEFUVVM9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAne3suU3RhdGUu
U3RhdHVzfX0nICIke0NOQU1FfSIgMj4vZGV2L251bGwgfHwgZWNobyAidW5rbm93biIpCiAgICAg
ICAgY2FzZSAiJHtTVEFUVVN9IiBpbgogICAgICAgICAgICBydW5uaW5nKSBTVEFUVVNfQ09MT1I9
IiR7R1JFRU59IiA7OwogICAgICAgICAgICBleGl0ZWQpICBTVEFUVVNfQ09MT1I9IiR7UkVEfSIg
ICA7OwogICAgICAgICAgICAqKSAgICAgICBTVEFUVVNfQ09MT1I9IiR7WUVMTE9XfSI7OwogICAg
ICAgIGVzYWMKICAgICAgICBwcmludGYgIiAgICBbJWRdICUtMzVzICViKCVzKSViXG4iIFwKICAg
ICAgICAgICAgIiR7aX0iICIke0NOQU1FfSIgIiR7U1RBVFVTX0NPTE9SfSIgIiR7U1RBVFVTfSIg
IiR7TkN9IgogICAgICAgIGk9JCgoIGkgKyAxICkpCiAgICBkb25lCgogICAgZWNobyAiIgogICAg
bG9jYWwgQ0hPSUNFCiAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgIHJlYWQgLXJwICIgIOeVquWP
t+OCkumBuOaKnuOBl+OBpuOBj+OBoOOBleOBhCBbMS0kKChpLTEpKV06ICIgQ0hPSUNFCiAgICAg
ICAgaWYgW1sgIiR7Q0hPSUNFfSIgPX4gXlswLTldKyQgXV0gXAogICAgICAgICAgICAmJiBbICIk
e0NIT0lDRX0iIC1nZSAxIF0gXAogICAgICAgICAgICAmJiBbICIke0NIT0lDRX0iIC1sZSAkKChp
LTEpKSBdOyB0aGVuCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZmkKICAgICAgICB3YXJuICIx
IOOAnCAkKChpLTEpKSDjga7nlarlj7fjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYQiCiAgICBk
b25lCgogICAgU0VMRUNURURfQ09OVEFJTkVSPSIke0FMTF9DT05UQUlORVJTWyQoKENIT0lDRS0x
KSldfSIKICAgIGluZm8gIumBuOaKnuOBleOCjOOBn+OCs+ODs+ODhuODijogJHtTRUxFQ1RFRF9D
T05UQUlORVJ9Igp9CgojIOKUgOKUgCBMaW5rd2FyZGVu44Kz44Oz44OG44OK5qSc6Ki8IOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU
gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAp2ZXJpZnlfbGlu
a3dhcmRlbl9jb250YWluZXIoKSB7CiAgICBsb2NhbCBDTkFNRT0iJHsxfSIKCiAgICBzZWN0aW9u
ICLjgrPjg7Pjg4bjg4rjga4gTGlua3dhcmRlbiDmpJzoqLwuLi4iCgogICAgbG9jYWwgUEFTU0VE
PTAKICAgIGxvY2FsIEZBSUxFRD0wCgogICAgbG9jYWwgSU1BR0UKICAgIElNQUdFPSQoZG9ja2Vy
IGluc3BlY3QgLS1mb3JtYXQgJ3t7LkNvbmZpZy5JbWFnZX19JyAiJHtDTkFNRX0iIDI+L2Rldi9u
dWxsIHx8IGVjaG8gIiIpCiAgICBpZiBlY2hvICIke0lNQUdFfSIgfCBncmVwIC1xaUUgJ2xpbmt3
YXJkZW4nOyB0aGVuCiAgICAgICAgaW5mbyAiW+Kck10g44Kk44Oh44O844K45ZCN44GrIGxpbmt3
YXJkZW4g44KS56K66KqNOiAke0lNQUdFfSIKICAgICAgICBQQVNTRUQ9JCgoIFBBU1NFRCArIDEg
KSkKICAgIGVsc2UKICAgICAgICB3YXJuICJb4pyXXSDjgqTjg6Hjg7zjgrjlkI3jgasgbGlua3dh
cmRlbiDjgYzlkKvjgb7jgozjgb7jgZvjgpM6ICR7SU1BR0V9IgogICAgICAgIEZBSUxFRD0kKCgg
RkFJTEVEICsgMSApKQogICAgZmkKCiAgICBsb2NhbCBFTlZfVkFSUwogICAgRU5WX1ZBUlM9JChk
b2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAne3tyYW5nZSAuQ29uZmlnLkVudn19e3twcmludGxuIC59
fXt7ZW5kfX0nICIke0NOQU1FfSIgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIGlmIGVjaG8g
IiR7RU5WX1ZBUlN9IiB8IGdyZXAgLXFpRSAnTkVYVEFVVEhfU0VDUkVUfE5FWFRBVVRIX1VSTHxE
QVRBQkFTRV9VUkwnOyB0aGVuCiAgICAgICAgaW5mbyAiW+Kck10gTGlua3dhcmRlbiDlm7rmnInj
ga7nkrDlooPlpInmlbDjgpLnorroqo0iCiAgICAgICAgUEFTU0VEPSQoKCBQQVNTRUQgKyAxICkp
CiAgICBlbHNlCiAgICAgICAgd2FybiAiW+Kcl10gTGlua3dhcmRlbiDlm7rmnInjga7nkrDlooPl
pInmlbDjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCiAgICAgICAgRkFJTEVEPSQoKCBGQUlMRUQg
KyAxICkpCiAgICBmaQoKICAgIGxvY2FsIE1PVU5UUwogICAgTU9VTlRTPSQoZG9ja2VyIGluc3Bl
Y3QgLS1mb3JtYXQgJ3t7cmFuZ2UgLk1vdW50c319e3suU291cmNlfX06e3suRGVzdGluYXRpb259
fSB7e2VuZH19JyAiJHtDTkFNRX0iIDI+L2Rldi9udWxsIHx8IGVjaG8gIiIpCiAgICBpZiBlY2hv
ICIke01PVU5UU30iIHwgZ3JlcCAtcWlFICdsaW5rd2FyZGVufDovZGF0YSc7IHRoZW4KICAgICAg
ICBpbmZvICJb4pyTXSBMaW5rd2FyZGVuIOOCieOBl+OBjeODnuOCpuODs+ODiOODneOCpOODs+OD
iOOCkueiuuiqjTogJHtNT1VOVFN9IgogICAgICAgIFBBU1NFRD0kKCggUEFTU0VEICsgMSApKQog
ICAgZWxzZQogICAgICAgIHdhcm4gIlvinJddIExpbmt3YXJkZW4g44KJ44GX44GN44Oe44Km44Oz
44OI44Od44Kk44Oz44OI44GM6KaL44Gk44GL44KK44G+44Gb44KTOiAke01PVU5UUzot44Gq44GX
fSIKICAgICAgICBGQUlMRUQ9JCgoIEZBSUxFRCArIDEgKSkKICAgIGZpCgogICAgZWNobyAiIgog
ICAgZWNobyAiICDmpJzoqLzntZDmnpw6ICR7UEFTU0VEfSDpoIXnm67lkIjmoLwgLyAke0ZBSUxF
RH0g6aCF55uu5LiN5ZCI5qC8ICjlhag06aCF55uuKSIKICAgIGVjaG8gIiIKCiAgICBpZiBbICIk
e1BBU1NFRH0iIC1lcSAwIF07IHRoZW4KICAgICAgICBlcnJvciAi44GT44Gu44Kz44Oz44OG44OK
44GvIExpbmt3YXJkZW4g44Gn44Gv44Gq44GE5Y+v6IO95oCn44GM6auY44GE44Gn44GZIgogICAg
ICAgIHJlYWQgLXJwICIgIOOBneOCjOOBp+OCgue2muihjOOBl+OBvuOBmeOBi++8nyBbeS9OXTog
IiBGT1JDRQogICAgICAgIGlmIFtbICEgIiR7Rk9SQ0V9IiA9fiBeW1l5XSQgXV07IHRoZW4KICAg
ICAgICAgICAgd2FybiAi5b6p5YWD44KS44Kt44Oj44Oz44K744Or44GX44G+44GX44GfIgogICAg
ICAgICAgICBleGl0IDAKICAgICAgICBmaQogICAgZWxpZiBbICIke0ZBSUxFRH0iIC1ndCAwIF07
IHRoZW4KICAgICAgICB3YXJuICLkuIDpg6jjga7mpJzoqLzpoIXnm67jgYzkuI3lkIjmoLzjgafj
gZnjgILjgZPjga7jgrPjg7Pjg4bjg4rjgafmnKzlvZPjgavlvqnlhYPjgZfjgabjgYTjgYTjgYvn
orroqo3jgZfjgabjgY/jgaDjgZXjgYQiCiAgICAgICAgcmVhZCAtcnAgIiAg57aa6KGM44GX44G+
44GZ44GL77yfIFt5L05dOiAiIENPTlQKICAgICAgICBpZiBbWyAhICIke0NPTlR9IiA9fiBeW1l5
XSQgXV07IHRoZW4KICAgICAgICAgICAgd2FybiAi5b6p5YWD44KS44Kt44Oj44Oz44K744Or44GX
44G+44GX44GfIgogICAgICAgICAgICBleGl0IDAKICAgICAgICBmaQogICAgZWxzZQogICAgICAg
IGluZm8gIuOBmeOBueOBpuOBruaknOiovOmgheebruOBjOWQiOagvOOBl+OBvuOBl+OBnyIKICAg
IGZpCn0KCiMg4pSA4pSAIFBvc3RncmVTUUzjgrPjg7Pjg4bjg4rjgpLmpJzntKIg4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSACmZpbmRfcG9zdGdyZXNfY29udGFp
bmVyKCkgewogICAgbG9jYWwgTElOS1dBUkRFTl9DTkFNRT0iJHsxfSIKCiAgICBsb2NhbCBQUk9K
RUNUCiAgICBQUk9KRUNUPSQoZG9ja2VyIGluc3BlY3QgXAogICAgICAgIC0tZm9ybWF0ICd7e2lu
ZGV4IC5Db25maWcuTGFiZWxzICJjb20uZG9ja2VyLmNvbXBvc2UucHJvamVjdCJ9fScgXAogICAg
ICAgICIke0xJTktXQVJERU5fQ05BTUV9IiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQoKICAgIGxv
Y2FsIFBHX0NPTlRBSU5FUj0iIgoKICAgIGlmIFsgLW4gIiR7UFJPSkVDVH0iIF07IHRoZW4KICAg
ICAgICB3aGlsZSBJRlM9IHJlYWQgLXIgQ05BTUU7IGRvCiAgICAgICAgICAgIGxvY2FsIElNRwog
ICAgICAgICAgICBJTUc9JChkb2NrZXIgaW5zcGVjdCAtLWZvcm1hdCAne3suQ29uZmlnLkltYWdl
fX0nICIke0NOQU1FfSIgMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgICAgICAgICAgaWYgZWNo
byAiJHtJTUd9IiB8IGdyZXAgLXFpRSAncG9zdGdyZXMnOyB0aGVuCiAgICAgICAgICAgICAgICBQ
R19DT05UQUlORVI9IiR7Q05BTUV9IgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAg
ZmkKICAgICAgICBkb25lIDwgPChkb2NrZXIgcHMgLWEgLS1maWx0ZXIgImxhYmVsPWNvbS5kb2Nr
ZXIuY29tcG9zZS5wcm9qZWN0PSR7UFJPSkVDVH0iIFwKICAgICAgICAgICAgLS1mb3JtYXQgJ3t7
Lk5hbWVzfX0nIDI+L2Rldi9udWxsIHx8IHRydWUpCiAgICBmaQoKICAgIGlmIFsgLXogIiR7UEdf
Q09OVEFJTkVSfSIgXTsgdGhlbgogICAgICAgIHdoaWxlIElGUz0gcmVhZCAtciBDTkFNRTsgZG8K
ICAgICAgICAgICAgbG9jYWwgSU1HCiAgICAgICAgICAgIElNRz0kKGRvY2tlciBpbnNwZWN0IC0t
Zm9ybWF0ICd7ey5Db25maWcuSW1hZ2V9fScgIiR7Q05BTUV9IiAyPi9kZXYvbnVsbCB8fCBlY2hv
ICIiKQogICAgICAgICAgICBpZiBlY2hvICIke0lNR30iIHwgZ3JlcCAtcWlFICdwb3N0Z3Jlcyc7
IHRoZW4KICAgICAgICAgICAgICAgIFBHX0NPTlRBSU5FUj0iJHtDTkFNRX0iCiAgICAgICAgICAg
ICAgICBicmVhawogICAgICAgICAgICBmaQogICAgICAgIGRvbmUgPCA8KGRvY2tlciBwcyAtYSAt
LWZvcm1hdCAne3suTmFtZXN9fScgMj4vZGV2L251bGwgfHwgdHJ1ZSkKICAgIGZpCgogICAgZWNo
byAiJHtQR19DT05UQUlORVJ9Igp9CgojIOKUgOKUgCDlvqnlhYPjg6HjgqTjg7Mg4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA
4pSA4pSA4pSA4pSA4pSA4pSA4pSACmRvX3Jlc3RvcmUoKSB7CiAgICBwcmludF9iYW5uZXIKICAg
IGNoZWNrX3Jvb3QKCiAgICAjIOKRoOODkOODg+OCr+OCouODg+ODl+ODleOCoeOCpOODq+mBuOaK
ngogICAgbG9jYWwgU0VMRUNURURfQkFDS1VQPSIiCiAgICBzZWxlY3RfYmFja3VwX2ZpbGUKCiAg
ICAjIOKRoeODgeOCp+ODg+OCr+OCteODoOaknOiovAogICAgbG9jYWwgU0hBMjU2X0ZJTEU9IiR7
U0VMRUNURURfQkFDS1VQfS5zaGEyNTYiCiAgICBpZiBbIC1mICIke1NIQTI1Nl9GSUxFfSIgXTsg
dGhlbgogICAgICAgIHNlY3Rpb24gIuODgeOCp+ODg+OCr+OCteODoOOCkuaknOiovC4uLiIKICAg
ICAgICBpZiBzaGEyNTZzdW0gLWMgIiR7U0hBMjU2X0ZJTEV9IiAtLXF1aWV0IDI+L2Rldi9udWxs
OyB0aGVuCiAgICAgICAgICAgIGluZm8gIuODgeOCp+ODg+OCr+OCteODoCBPSyIKICAgICAgICBl
bHNlCiAgICAgICAgICAgIGVycm9yICLjg4Hjgqfjg4Pjgq/jgrXjg6DmpJzoqLzjgavlpLHmlZfj
gZfjgb7jgZfjgZ/vvIHjg5XjgqHjgqTjg6vjgYznoLTmkI3jgZfjgabjgYTjgovlj6/og73mgKfj
gYzjgYLjgorjgb7jgZkiCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICBlbHNlCiAg
ICAgICAgd2FybiAi44OB44Kn44OD44Kv44K144Og44OV44Kh44Kk44Or44GM6KaL44Gk44GL44KK
44G+44Gb44KT44CC44K544Kt44OD44OX44GX44G+44GZIgogICAgZmkKCiAgICAjIOKRouODkOOD
g+OCr+OCouODg+ODl+OCkuWxlemWi+OBl+OBpuWGheWuueeiuuiqjQogICAgbG9jYWwgV09SS19E
SVIKICAgIFdPUktfRElSPSQobWt0ZW1wIC1kKQogICAgdHJhcCAicm0gLXJmICcke1dPUktfRElS
fSciIEVYSVQKCiAgICBzZWN0aW9uICLjg5Djg4Pjgq/jgqLjg4Pjg5fjgpLlsZXplovjgZfjgabl
hoXlrrnjgpLnorroqo0uLi4iCiAgICB0YXIgLXh6ZiAiJHtTRUxFQ1RFRF9CQUNLVVB9IiAtQyAi
JHtXT1JLX0RJUn0iCgogICAgaWYgWyAtZiAiJHtXT1JLX0RJUn0vYmFja3VwX2luZm8udHh0IiBd
OyB0aGVuCiAgICAgICAgZWNobyAiIgogICAgICAgIGVjaG8gIiAg44OQ44OD44Kv44Ki44OD44OX
5oOF5aCxOiIKICAgICAgICBzZWQgJ3MvXi8gICAgLycgIiR7V09SS19ESVJ9L2JhY2t1cF9pbmZv
LnR4dCIKICAgIGZpCiAgICBlY2hvICIiCgogICAgIyDjg5Djg4Pjgq/jgqLjg4Pjg5flhoXjga7j
g5zjg6rjg6Xjg7zjg6Dmg4XloLHjgpLoqq3jgb/lj5bjgosKICAgIGxvY2FsIFZPTFVNRVNfSU5G
Tz0iIgogICAgaWYgWyAtZiAiJHtXT1JLX0RJUn0vYmFja3VwX2luZm8udHh0IiBdOyB0aGVuCiAg
ICAgICAgVk9MVU1FU19JTkZPPSQoZ3JlcCAnXnZvbHVtZXM9JyAiJHtXT1JLX0RJUn0vYmFja3Vw
X2luZm8udHh0IiAyPi9kZXYvbnVsbCBcCiAgICAgICAgICAgIHwgY3V0IC1kPSAtZjItIHx8IHRy
dWUpCiAgICBmaQoKICAgICMg4pGj44Kz44Oz44OG44OK6YG45oqeICYgTGlua3dhcmRlbuaknOio
vAogICAgbG9jYWwgU0VMRUNURURfQ09OVEFJTkVSPSIiCiAgICBzZWxlY3RfcmVzdG9yZV9jb250
YWluZXIKICAgIHZlcmlmeV9saW5rd2FyZGVuX2NvbnRhaW5lciAiJHtTRUxFQ1RFRF9DT05UQUlO
RVJ9IgoKICAgICMg4pGkY29tcG9zZSDjg4fjgqPjg6zjgq/jg4jjg6rnibnlrpoKICAgIGxvY2Fs
IExJTktXQVJERU5fRElSCiAgICBMSU5LV0FSREVOX0RJUj0kKGRvY2tlciBpbnNwZWN0IFwKICAg
ICAgICAtLWZvcm1hdCAne3tpbmRleCAuQ29uZmlnLkxhYmVscyAiY29tLmRvY2tlci5jb21wb3Nl
LnByb2plY3Qud29ya2luZ19kaXIifX0nIFwKICAgICAgICAiJHtTRUxFQ1RFRF9DT05UQUlORVJ9
IiAyPi9kZXYvbnVsbCB8fCBlY2hvICIiKQogICAgaWYgWyAteiAiJHtMSU5LV0FSREVOX0RJUn0i
IF07IHRoZW4KICAgICAgICBMSU5LV0FSREVOX0RJUj0iL29wdC9kb2NrZXIvbGlua3dhcmRlbiIK
ICAgICAgICB3YXJuICJjb21wb3Nl44OH44Kj44Os44Kv44OI44Oq44KS6Ieq5YuV5qSc5Ye644Gn
44GN44Gq44GL44Gj44Gf44Gf44KB44CB44OH44OV44Kp44Or44OI44KS5L2/55SoOiAke0xJTktX
QVJERU5fRElSfSIKICAgIGVsc2UKICAgICAgICBpbmZvICJjb21wb3Nl44OH44Kj44Os44Kv44OI
44OqOiAke0xJTktXQVJERU5fRElSfSIKICAgIGZpCgogICAgIyDikaVQb3N0Z3JlU1FM44Kz44Oz
44OG44OK44KS54m55a6aCiAgICBsb2NhbCBQT1NUR1JFU19DT05UQUlORVIKICAgIFBPU1RHUkVT
X0NPTlRBSU5FUj0kKGZpbmRfcG9zdGdyZXNfY29udGFpbmVyICIke1NFTEVDVEVEX0NPTlRBSU5F
Un0iKQogICAgaWYgWyAteiAiJHtQT1NUR1JFU19DT05UQUlORVJ9IiBdOyB0aGVuCiAgICAgICAg
ZXJyb3IgIlBvc3RncmVTUUzjgrPjg7Pjg4bjg4rjgYzopovjgaTjgYvjgorjgb7jgZvjgpMiCiAg
ICAgICAgZXJyb3IgIkxpbmt3YXJkZW7jgajlkIzjgZggY29tcG9zZeODl+ODreOCuOOCp+OCr+OD
iOOBqyBwb3N0Z3JlcyDjgrPjg7Pjg4bjg4rjgYzlv4XopoHjgafjgZkiCiAgICAgICAgZXhpdCAx
CiAgICBmaQogICAgaW5mbyAiUG9zdGdyZVNRTOOCs+ODs+ODhuODijogJHtQT1NUR1JFU19DT05U
QUlORVJ9IgoKICAgICMgYmFja3VwX2luZm/jgYvjgolEQuWQjS/jg6bjg7zjgrbjg7zjgpLoqq3j
gb/lj5bjgosKICAgIGxvY2FsIFBPU1RHUkVTX1VTRVIgUE9TVEdSRVNfREIKICAgIFBPU1RHUkVT
X1VTRVI9JChncmVwICdecG9zdGdyZXNfdXNlcj0nICIke1dPUktfRElSfS9iYWNrdXBfaW5mby50
eHQiIDI+L2Rldi9udWxsIFwKICAgICAgICB8IGN1dCAtZD0gLWYyIHx8IGVjaG8gImxpbmt3YXJk
ZW4iKQogICAgUE9TVEdSRVNfREI9JChncmVwICdecG9zdGdyZXNfZGI9JyAiJHtXT1JLX0RJUn0v
YmFja3VwX2luZm8udHh0IiAyPi9kZXYvbnVsbCBcCiAgICAgICAgfCBjdXQgLWQ9IC1mMiB8fCBl
Y2hvICJsaW5rd2FyZGVuIikKICAgIGluZm8gIkRCOiAke1BPU1RHUkVTX0RCfSAvIOODpuODvOOC
tuODvDogJHtQT1NUR1JFU19VU0VSfSIKCiAgICAjIOKRpuioreWumuODleOCoeOCpOODq+OBruW+
qeWFg+eiuuiqjQogICAgbG9jYWwgUkVTVE9SRV9TRUNSRVRTPWZhbHNlCiAgICBsb2NhbCBSRVNU
T1JFX0NPTVBPU0U9ZmFsc2UKCiAgICBpZiBbIC1mICIke1dPUktfRElSfS8uc2VjcmV0cyIgXTsg
dGhlbgogICAgICAgIGVjaG8gIiIKICAgICAgICB3YXJuICIuc2VjcmV0cyDjg5XjgqHjgqTjg6vj
gYzjg5Djg4Pjgq/jgqLjg4Pjg5fjgavlkKvjgb7jgozjgabjgYTjgb7jgZkiCiAgICAgICAgd2Fy
biAi54++5Zyo44GuIC5zZWNyZXRzIOOBqOW3ruOBl+abv+OBiOOCi+OBqOiqjeiovOaDheWgseOB
jOWkieOCj+OCiuOBvuOBmSIKICAgICAgICByZWFkIC1ycCAiICAuc2VjcmV0cyDjgpLlvqnlhYPj
gZfjgb7jgZnjgYvvvJ8gW3kvTl06ICIgQU5TX1NFQ1JFVFMKICAgICAgICBbWyAiJHtBTlNfU0VD
UkVUU30iID1+IF5bWXldJCBdXSAmJiBSRVNUT1JFX1NFQ1JFVFM9dHJ1ZQogICAgZmkKCiAgICBp
ZiBbIC1mICIke1dPUktfRElSfS9kb2NrZXItY29tcG9zZS55bWwiIF07IHRoZW4KICAgICAgICBl
Y2hvICIiCiAgICAgICAgd2FybiAiZG9ja2VyLWNvbXBvc2UueW1sIOOBjOODkOODg+OCr+OCouOD
g+ODl+OBq+WQq+OBvuOCjOOBpuOBhOOBvuOBmSIKICAgICAgICByZWFkIC1ycCAiICBkb2NrZXIt
Y29tcG9zZS55bWwg44KS5b6p5YWD44GX44G+44GZ44GL77yfIFt5L05dOiAiIEFOU19DT01QT1NF
CiAgICAgICAgW1sgIiR7QU5TX0NPTVBPU0V9IiA9fiBeW1l5XSQgXV0gJiYgUkVTVE9SRV9DT01Q
T1NFPXRydWUKICAgIGZpCgogICAgIyDikafmnIDntYLnorroqo0KICAgIGxvY2FsIEJBQ0tVUF9T
SVpFCiAgICBCQUNLVVBfU0laRT0kKGR1IC1zaCAiJHtTRUxFQ1RFRF9CQUNLVVB9IiB8IGN1dCAt
ZjEpCiAgICBlY2hvICIiCiAgICB3YXJuICLku6XkuIvjga7lhoXlrrnjgaflvqnlhYPjgZfjgb7j
gZk6IgogICAgZWNobyAiICDjg5Djg4Pjgq/jgqLjg4Pjg5fjg5XjgqHjgqTjg6sgICA6ICQoYmFz
ZW5hbWUgIiR7U0VMRUNURURfQkFDS1VQfSIpICgke0JBQ0tVUF9TSVpFfSkiCiAgICBlY2hvICIg
IOW+qeWFg+WFiOOCs+ODs+ODhuODiiAgICAgICAgIDogJHtTRUxFQ1RFRF9DT05UQUlORVJ9Igog
ICAgZWNobyAiICBQb3N0Z3JlU1FMIOOCs+ODs+ODhuODiiAgICA6ICR7UE9TVEdSRVNfQ09OVEFJ
TkVSfSIKICAgIGVjaG8gIiAgY29tcG9zZSDjg4fjgqPjg6zjgq/jg4jjg6ogICA6ICR7TElOS1dB
UkRFTl9ESVJ9IgogICAgZWNobyAiICAuc2VjcmV0cyDjga7lvqnlhYMgICAgICAgIDogJChbICIk
e1JFU1RPUkVfU0VDUkVUU30iID0gdHJ1ZSBdICYmIGVjaG8gIuOBmeOCiyIgfHwgZWNobyAi44GX
44Gq44GEIikiCiAgICBlY2hvICIgIGRvY2tlci1jb21wb3NlLnltbOW+qeWFgyA6ICQoWyAiJHtS
RVNUT1JFX0NPTVBPU0V9IiA9IHRydWUgXSAmJiBlY2hvICLjgZnjgosiIHx8IGVjaG8gIuOBl+OB
quOBhCIpIgogICAgZWNobyAiIgogICAgcmVhZCAtcnAgIiAg54++5Zyo44Gu44OH44O844K/44KS
5LiK5pu444GN44GX44G+44GZ44CC57aa6KGM44GX44G+44GZ44GL77yfIFt5L05dOiAiIENPTkZJ
Uk0KICAgIGlmIFtbICEgIiR7Q09ORklSTX0iID1+IF5bWXldJCBdXTsgdGhlbgogICAgICAgIHdh
cm4gIuW+qeWFg+OCkuOCreODo+ODs+OCu+ODq+OBl+OBvuOBl+OBnyIKICAgICAgICBleGl0IDAK
ICAgIGZpCgogICAgbG9jYWwgRVNDQVBFX1RJTUVTVEFNUAogICAgRVNDQVBFX1RJTUVTVEFNUD0k
KGRhdGUgKyIlWSVtJWRfJUglTSVTIikKCiAgICAjIOKRp+WFqOOCs+ODs+ODhuODiuWBnOatogog
ICAgc2VjdGlvbiAiWzEvNV0g44Kz44Oz44OG44OK44KS5YGc5q2iLi4uIgogICAgY2QgIiR7TElO
S1dBUkRFTl9ESVJ9IgogICAgZG9ja2VyIGNvbXBvc2UgZG93bgogICAgaW5mbyAi5YWo44Kz44Oz
44OG44OK44KS5YGc5q2i44GX44G+44GX44GfIgoKICAgICMg4pGo6Kit5a6a44OV44Kh44Kk44Or
5b6p5YWDCiAgICBzZWN0aW9uICJbMi81XSDoqK3lrprjg5XjgqHjgqTjg6vjgpLlvqnlhYMuLi4i
CgogICAgaWYgWyAiJHtSRVNUT1JFX0NPTVBPU0V9IiA9IHRydWUgXTsgdGhlbgogICAgICAgIFsg
LWYgIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tlci1jb21wb3NlLnltbCIgXSAmJiBcCiAgICAgICAg
ICAgIGNwICIke0xJTktXQVJERU5fRElSfS9kb2NrZXItY29tcG9zZS55bWwiIFwKICAgICAgICAg
ICAgICAgIiR7TElOS1dBUkRFTl9ESVJ9L2RvY2tlci1jb21wb3NlLnltbC5iYWtfJHtFU0NBUEVf
VElNRVNUQU1QfSIKICAgICAgICBjcCAiJHtXT1JLX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1sIiAi
JHtMSU5LV0FSREVOX0RJUn0vZG9ja2VyLWNvbXBvc2UueW1sIgogICAgICAgIGluZm8gImRvY2tl
ci1jb21wb3NlLnltbCDjgpLlvqnlhYPjgZfjgb7jgZfjgZ8iCiAgICBlbHNlCiAgICAgICAgaW5m
byAiZG9ja2VyLWNvbXBvc2UueW1sIOOBr+OCueOCreODg+ODl+OBl+OBvuOBl+OBnyAo54++5Zyo
44Gu44KC44Gu44KS5L2/55SoKSIKICAgIGZpCgogICAgaWYgWyAiJHtSRVNUT1JFX1NFQ1JFVFN9
IiA9IHRydWUgXTsgdGhlbgogICAgICAgIFsgLWYgIiR7TElOS1dBUkRFTl9ESVJ9Ly5zZWNyZXRz
IiBdICYmIFwKICAgICAgICAgICAgY3AgIiR7TElOS1dBUkRFTl9ESVJ9Ly5zZWNyZXRzIiBcCiAg
ICAgICAgICAgICAgICIke0xJTktXQVJERU5fRElSfS8uc2VjcmV0cy5iYWtfJHtFU0NBUEVfVElN
RVNUQU1QfSIKICAgICAgICBjcCAiJHtXT1JLX0RJUn0vLnNlY3JldHMiICIke0xJTktXQVJERU5f
RElSfS8uc2VjcmV0cyIKICAgICAgICBjaG1vZCA2MDAgIiR7TElOS1dBUkRFTl9ESVJ9Ly5zZWNy
ZXRzIgogICAgICAgIGluZm8gIi5zZWNyZXRzIOOCkuW+qeWFg+OBl+OBvuOBl+OBnyIKICAgIGVs
c2UKICAgICAgICBpbmZvICIuc2VjcmV0cyDjga/jgrnjgq3jg4Pjg5fjgZfjgb7jgZfjgZ8gKOeP
vuWcqOOBruOCguOBruOCkuS9v+eUqCkiCiAgICBmaQoKICAgICMg4pGpUG9zdGdyZVNRTOOCkui1
t+WLleOBl+OBpkRC5b6p5YWDCiAgICBzZWN0aW9uICJbMy81XSBQb3N0Z3JlU1FM44KS6LW35YuV
44GX44GmRELjgpLlvqnlhYMuLi4iCiAgICBkb2NrZXIgY29tcG9zZSB1cCAtZCBwb3N0Z3Jlcwog
ICAgaW5mbyAiUG9zdGdyZVNRTCDotbfli5XjgpLlvoXmqZ/kuK0uLi4iCgogICAgbG9jYWwgaQog
ICAgZm9yIGkgaW4gJChzZXEgMSAyNCk7IGRvCiAgICAgICAgbG9jYWwgU1RBVFVTCiAgICAgICAg
U1RBVFVTPSQoZG9ja2VyIGluc3BlY3QgIiR7UE9TVEdSRVNfQ09OVEFJTkVSfSIgXAogICAgICAg
ICAgICAtLWZvcm1hdD0ne3suU3RhdGUuSGVhbHRoLlN0YXR1c319JyAyPi9kZXYvbnVsbCB8fCBl
Y2hvICJub3RfZm91bmQiKQogICAgICAgIGlmIFsgIiR7U1RBVFVTfSIgPSAiaGVhbHRoeSIgXTsg
dGhlbgogICAgICAgICAgICBpbmZvICJQb3N0Z3JlU1FMIOi1t+WLleWujOS6hiIKICAgICAgICAg
ICAgYnJlYWsKICAgICAgICBmaQogICAgICAgIGlmIFsgIiR7aX0iIC1lcSAyNCBdOyB0aGVuCiAg
ICAgICAgICAgIGVycm9yICJQb3N0Z3JlU1FMIOOBjOOCv+OCpOODoOOCouOCpuODiOOBl+OBvuOB
l+OBnyAoMTIw56eSKSIKICAgICAgICAgICAgZG9ja2VyIGxvZ3MgIiR7UE9TVEdSRVNfQ09OVEFJ
TkVSfSIgLS10YWlsPTIwCiAgICAgICAgICAgIGV4aXQgMQogICAgICAgIGZpCiAgICAgICAgc2xl
ZXAgNQogICAgICAgIGVjaG8gLW4gIi4iCiAgICBkb25lCiAgICBlY2hvICIiCgogICAgIyBEQuWJ
iumZpOKGkuWGjeS9nOaIkOKGkuW+qeWFgwogICAgZG9ja2VyIGV4ZWMgIiR7UE9TVEdSRVNfQ09O
VEFJTkVSfSIgXAogICAgICAgIHBzcWwgLVUgIiR7UE9TVEdSRVNfVVNFUn0iIC1kIHBvc3RncmVz
IFwKICAgICAgICAtYyAiRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtQT1NUR1JFU19EQn07Igog
ICAgZG9ja2VyIGV4ZWMgIiR7UE9TVEdSRVNfQ09OVEFJTkVSfSIgXAogICAgICAgIHBzcWwgLVUg
IiR7UE9TVEdSRVNfVVNFUn0iIC1kIHBvc3RncmVzIFwKICAgICAgICAtYyAiQ1JFQVRFIERBVEFC
QVNFICR7UE9TVEdSRVNfREJ9OyIKICAgIGRvY2tlciBleGVjIC1pICIke1BPU1RHUkVTX0NPTlRB
SU5FUn0iIFwKICAgICAgICBwZ19yZXN0b3JlIC1VICIke1BPU1RHUkVTX1VTRVJ9IiAtZCAiJHtQ
T1NUR1JFU19EQn0iIFwKICAgICAgICAtLW5vLW93bmVyIC0tcm9sZT0iJHtQT1NUR1JFU19VU0VS
fSIgXAogICAgICAgIDwgIiR7V09SS19ESVJ9L3Bvc3RncmVzLmR1bXAiCiAgICBpbmZvICJEQiDj
ga7lvqnlhYPlrozkuoYiCgogICAgIyDikapEb2NrZXLjg5zjg6rjg6Xjg7zjg6DjgpLlvqnlhYMg
KOODkOODiuODvOODu+OCteODoOODjeOCpOODq+ODu+OCouODvOOCq+OCpOODluWQq+OCgOWFqOeU
u+WDjykKICAgIHNlY3Rpb24gIls0LzVdIERvY2tlcuODnOODquODpeODvOODoCAo55S75YOP44O7
44Ki44O844Kr44Kk44OW5ZCr44KA5YWo44OH44O844K/KSDjgpLlvqnlhYMuLi4iCgogICAgaWYg
WyAtZCAiJHtXT1JLX0RJUn0vdm9sdW1lcyIgXSAmJiBbIC1uICIkKGxzIC1BICIke1dPUktfRElS
fS92b2x1bWVzIiAyPi9kZXYvbnVsbCkiIF07IHRoZW4KICAgICAgICAjIOaWsOW9ouW8jzogdm9s
dW1lcy/jg4fjgqPjg6zjgq/jg4jjg6rjgavjg5zjg6rjg6Xjg7zjg6DliKV0YXLjgYzjgYLjgosK
ICAgICAgICBmb3IgVk9MX1RBUiBpbiAiJHtXT1JLX0RJUn0vdm9sdW1lcy8iKi50YXIuZ3o7IGRv
CiAgICAgICAgICAgIFsgLWYgIiR7Vk9MX1RBUn0iIF0gfHwgY29udGludWUKICAgICAgICAgICAg
bG9jYWwgVEFSX0JBU0VOQU1FCiAgICAgICAgICAgIFRBUl9CQVNFTkFNRT0kKGJhc2VuYW1lICIk
e1ZPTF9UQVJ9IiAudGFyLmd6KQoKICAgICAgICAgICAgIyBiYWNrdXBfaW5mb+OBi+OCieODnOOD
quODpeODvOODoOWQjeOCkumAhuW8leOBjQogICAgICAgICAgICBsb2NhbCBWT0xfTkFNRT0iJHtU
QVJfQkFTRU5BTUV9IiAgIyDjg5Xjgqnjg7zjg6vjg5Djg4Pjgq8KICAgICAgICAgICAgaWYgWyAt
biAiJHtWT0xVTUVTX0lORk99IiBdOyB0aGVuCiAgICAgICAgICAgICAgICAjICJ2b2xfbmFtZTpk
ZXN0OnNhZmVfbmFtZS50YXIuZ3pcbi4uLiIg44GL44KJ5qSc57SiCiAgICAgICAgICAgICAgICB3
aGlsZSBJRlM9OiByZWFkIC1yIFZOIFZEIFNOOyBkbwogICAgICAgICAgICAgICAgICAgIGlmIFsg
IiR7U04lLnRhci5nen0iID0gIiR7VEFSX0JBU0VOQU1FfSIgXTsgdGhlbgogICAgICAgICAgICAg
ICAgICAgICAgICBWT0xfTkFNRT0iJHtWTn0iCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr
CiAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgIGRvbmUgPDw8ICIkKGVjaG8g
LWUgIiR7Vk9MVU1FU19JTkZPfSIpIgogICAgICAgICAgICBmaQoKICAgICAgICAgICAgaW5mbyAi
44Oc44Oq44Ol44O844OgICcke1ZPTF9OQU1FfScg44KS5b6p5YWD5LitLi4uIgoKICAgICAgICAg
ICAgIyDjg5zjg6rjg6Xjg7zjg6DjgYzlrZjlnKjjgZfjgarjgYTloLTlkIjjga/kvZzmiJAKICAg
ICAgICAgICAgZG9ja2VyIHZvbHVtZSBpbnNwZWN0ICIke1ZPTF9OQU1FfSIgPiAvZGV2L251bGwg
Mj4mMSB8fCBcCiAgICAgICAgICAgICAgICBkb2NrZXIgdm9sdW1lIGNyZWF0ZSAiJHtWT0xfTkFN
RX0iCgogICAgICAgICAgICAjIOODnOODquODpeODvOODoOWGheOCkuOCr+ODquOCouOBl+OBpuW+
qeWFgwogICAgICAgICAgICBkb2NrZXIgcnVuIC0tcm0gXAogICAgICAgICAgICAgICAgLXYgIiR7
Vk9MX05BTUV9Oi9kZXN0IiBcCiAgICAgICAgICAgICAgICAtdiAiJHtXT1JLX0RJUn0vdm9sdW1l
czovYmFja3VwOnJvIiBcCiAgICAgICAgICAgICAgICBhbHBpbmU6bGF0ZXN0IFwKICAgICAgICAg
ICAgICAgIHNoIC1jICJybSAtcmYgL2Rlc3QvKiAvZGVzdC8uLj8qIC9kZXN0Ly5bIS5dKiAyPi9k
ZXYvbnVsbDsgXAogICAgICAgICAgICAgICAgICAgICAgIHRhciAteHpmIC9iYWNrdXAvJHtUQVJf
QkFTRU5BTUV9LnRhci5neiAtQyAvZGVzdCIKICAgICAgICAgICAgaW5mbyAiICDihpIgJyR7Vk9M
X05BTUV9JyDjga7lvqnlhYPlrozkuoYiCiAgICAgICAgZG9uZQogICAgZWxpZiBbIC1mICIke1dP
UktfRElSfS9saW5rd2FyZGVuX2RhdGEudGFyLmd6IiBdOyB0aGVuCiAgICAgICAgIyDml6flvaLl
vI/kupLmj5s6IOODq+ODvOODiOebtOS4i+OBq2xpbmt3YXJkZW5fZGF0YS50YXIuZ3oKICAgICAg
ICB3YXJuICLml6flvaLlvI/jg5Djg4Pjgq/jgqLjg4Pjg5fjgpLmpJzlh7rjgIJsaW5rd2FyZGVu
X2RhdGEg44Oc44Oq44Ol44O844Og44Gr5b6p5YWD44GX44G+44GZIgogICAgICAgIGRvY2tlciB2
b2x1bWUgaW5zcGVjdCAibGlua3dhcmRlbl9kYXRhIiA+IC9kZXYvbnVsbCAyPiYxIHx8IFwKICAg
ICAgICAgICAgZG9ja2VyIHZvbHVtZSBjcmVhdGUgImxpbmt3YXJkZW5fZGF0YSIKICAgICAgICBk
b2NrZXIgcnVuIC0tcm0gXAogICAgICAgICAgICAtdiAibGlua3dhcmRlbl9kYXRhOi9kZXN0IiBc
CiAgICAgICAgICAgIC12ICIke1dPUktfRElSfTovYmFja3VwOnJvIiBcCiAgICAgICAgICAgIGFs
cGluZTpsYXRlc3QgXAogICAgICAgICAgICBzaCAtYyAicm0gLXJmIC9kZXN0LyogL2Rlc3QvLi4/
KiAvZGVzdC8uWyEuXSogMj4vZGV2L251bGw7IFwKICAgICAgICAgICAgICAgICAgIHRhciAteHpm
IC9iYWNrdXAvbGlua3dhcmRlbl9kYXRhLnRhci5neiAtQyAvZGVzdCIKICAgICAgICBpbmZvICJs
aW5rd2FyZGVuX2RhdGEg44Oc44Oq44Ol44O844Og44Gu5b6p5YWD5a6M5LqGIgogICAgZWxzZQog
ICAgICAgIHdhcm4gIuODnOODquODpeODvOODoOOBruODkOODg+OCr+OCouODg+ODl+ODleOCoeOC
pOODq+OBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyAo44K544Kt44OD44OXKSIKICAgIGZpCgogICAg
IyDikavlhajjgrPjg7Pjg4bjg4rotbfli5UKICAgIHNlY3Rpb24gIls1LzVdIOWFqOOCs+ODs+OD
huODiuOCkui1t+WLlS4uLiIKICAgIGRvY2tlciBjb21wb3NlIHVwIC1kCiAgICBpbmZvICLlhajj
grPjg7Pjg4bjg4rjgpLotbfli5XjgZfjgb7jgZfjgZ8iCgogICAgIyDlrozkuobjgrXjg57jg6rj
g7wKICAgIGVjaG8gIiIKICAgIGVjaG8gIuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV
kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCIKICAgIGVjaG8gLWUgIiAgJHtHUkVFTn3i
nIUgIOW+qeWFg+WujOS6hu+8gSR7TkN9IgogICAgZWNobyAi4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ
4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIgogICAgZWNobyAiIgog
ICAgZWNobyAiICDwn5OmIOW+qeWFg+ODleOCoeOCpOODqyAgICAgICAgICAgICAgOiAkKGJhc2Vu
YW1lICIke1NFTEVDVEVEX0JBQ0tVUH0iKSIKICAgIGVjaG8gIiAg8J+WpSAg5b6p5YWD5YWI44Kz
44Oz44OG44OKICAgICAgICAgICA6ICR7U0VMRUNURURfQ09OVEFJTkVSfSIKICAgIGVjaG8gIiAg
8J+XhO+4jyAgIFBvc3RncmVTUUwg44Kz44Oz44OG44OKICAgIDogJHtQT1NUR1JFU19DT05UQUlO
RVJ9IgogICAgZWNobyAiICDwn5WQIOWun+ihjOaZgumWkyAgICAgICAgICAgICAgICAgIDogJChk
YXRlICcrJVktJW0tJWQgJUg6JU06JVMnKSIKICAgIGVjaG8gIiIKCiAgICAjIOODkOODg+OCr+OC
ouODg+ODl+ODleOCoeOCpOODq+OBjOaui+OBo+OBpuOBhOOCjOOBsOWJiumZpOahiOWGhQogICAg
bG9jYWwgQkFLX0ZJTEVTPSgpCiAgICBbIC1mICIke0xJTktXQVJERU5fRElSfS9kb2NrZXItY29t
cG9zZS55bWwuYmFrXyR7RVNDQVBFX1RJTUVTVEFNUH0iIF0gJiYgXAogICAgICAgIEJBS19GSUxF
Uys9KCIke0xJTktXQVJERU5fRElSfS9kb2NrZXItY29tcG9zZS55bWwuYmFrXyR7RVNDQVBFX1RJ
TUVTVEFNUH0iKQogICAgWyAtZiAiJHtMSU5LV0FSREVOX0RJUn0vLnNlY3JldHMuYmFrXyR7RVND
QVBFX1RJTUVTVEFNUH0iIF0gJiYgXAogICAgICAgIEJBS19GSUxFUys9KCIke0xJTktXQVJERU5f
RElSfS8uc2VjcmV0cy5iYWtfJHtFU0NBUEVfVElNRVNUQU1QfSIpCgogICAgaWYgWyAkeyNCQUtf
RklMRVNbQF19IC1ndCAwIF07IHRoZW4KICAgICAgICB3YXJuICLlvqnlhYPliY3jga7jg5XjgqHj
gqTjg6vjgpLku6XkuIvjgavkv53lrZjjgZfjgb7jgZfjgZ/jgILkuI3opoHjgarjgonliYrpmaTj
gZfjgabjgY/jgaDjgZXjgYQ6IgogICAgICAgIGZvciBGIGluICIke0JBS19GSUxFU1tAXX0iOyBk
bwogICAgICAgICAgICBlY2hvICIgICAgcm0gLWYgJHtGfSIKICAgICAgICBkb25lCiAgICAgICAg
ZWNobyAiIgogICAgZmkKfQoKZG9fcmVzdG9yZQo=
BASE64_RESTORE_EOF
info "作成: ${SCRIPT_DIR}/linkwarden-restore.sh"

chmod +x "${SCRIPT_DIR}/linkwarden-backup.sh"
chmod +x "${SCRIPT_DIR}/linkwarden-restore.sh"
info "実行権限を付与しました"

# ════════════════════════════════════════════════════
#  [Step 4] cron 登録
# ════════════════════════════════════════════════════
section "[Step 4] cron の設定..."
if [ -n "${CRON_SCHEDULE}" ]; then
    CRON_JOB="${CRON_SCHEDULE} root bash ${SCRIPT_DIR}/linkwarden-backup.sh >> /var/log/linkwarden-backup.log 2>&1"
    CRON_FILE="/etc/cron.d/linkwarden-backup"

    echo "# Linkwarden 自動バックアップ (${CRON_LABEL})" > "${CRON_FILE}"
    echo "${CRON_JOB}" >> "${CRON_FILE}"
    chmod 644 "${CRON_FILE}"

    info "cron 登録完了: ${CRON_FILE}"
    info "スケジュール  : ${CRON_LABEL}"
    info "ログ出力先    : /var/log/linkwarden-backup.log"
else
    info "cron への登録をスキップしました"
    echo "  後から登録する場合:"
    echo "    sudo crontab -e"
    echo "    # 例 (毎日 深夜 2:00):"
    echo "    0 2 * * * bash ${SCRIPT_DIR}/linkwarden-backup.sh >> /var/log/linkwarden-backup.log 2>&1"
fi

# ════════════════════════════════════════════════════
#  完了
# ════════════════════════════════════════════════════
echo ""
echo "════════════════════════════════════════════════"
echo -e "  ${GREEN}✅  インストール完了!${NC}"
echo "════════════════════════════════════════════════"
echo ""
echo "  📂 インストール先: ${SCRIPT_DIR}/"
echo ""
echo "  📋 使い方:"
echo "    # バックアップを今すぐ実行"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-backup.sh"
echo ""
echo "    # バックアップ一覧を表示"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-backup.sh list"
echo ""
echo "    # 復元 (対話形式でファイル・コンテナを選択)"
echo "    sudo bash ${SCRIPT_DIR}/linkwarden-restore.sh"
echo ""
if [ -n "${CRON_SCHEDULE}" ]; then
    echo "  ⏰ 自動バックアップ: ${CRON_LABEL}"
    echo "    ログ: tail -f /var/log/linkwarden-backup.log"
    echo ""
fi
タイトルとURLをコピーしました