Compare commits
17 Commits
a559d710b9
...
updates
Author | SHA1 | Date | |
---|---|---|---|
7e9d9749de | |||
85ba69a109 | |||
dc7eed91d7 | |||
8221c9c000 | |||
002960a834 | |||
ab5cf8a34e | |||
2e5cddd245 | |||
ea66aa9554 | |||
626d2897a4 | |||
8a01a0adc8 | |||
4b9d0a7b27 | |||
2b3e72da4b | |||
b8b966f736 | |||
ca6b3dcc7e | |||
c1d39c566b | |||
64f04cc47e | |||
6c7fdd41f1 |
@ -1,47 +1,47 @@
|
||||
name: Testboot if labeled please-boot
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
types: [ labeled ]
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: CI
|
||||
if: ${{ github.event.label.name == 'please-boot' }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- name: Set up Go 1.x
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
# Run on the latest minor release of Go 1.22:
|
||||
go-version: ~1.22
|
||||
id: go
|
||||
|
||||
- name: Check out code into the Go module directory
|
||||
uses: actions/checkout@v4
|
||||
|
||||
name: "Test boot"
|
||||
description: "Test boot u-boot and kernel changes"
|
||||
inputs:
|
||||
github_repository:
|
||||
required: true
|
||||
gh_user:
|
||||
required: true
|
||||
gh_auth_token:
|
||||
required: true
|
||||
bootery_url:
|
||||
required: true
|
||||
bake_host:
|
||||
required: true
|
||||
gokrazy_bakery_password:
|
||||
required: true
|
||||
gokrazy_bake_password:
|
||||
required: true
|
||||
oauth-client-id:
|
||||
required: true
|
||||
oauth-secret:
|
||||
required: true
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Tailscale
|
||||
uses: tailscale/github-action@v2
|
||||
with:
|
||||
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
||||
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
||||
oauth-client-id: ${{ inputs.oauth-client-id }}
|
||||
oauth-secret: ${{ inputs.oauth-secret }}
|
||||
tags: tag:ci
|
||||
|
||||
- name: Test Boot
|
||||
env:
|
||||
GITHUB_REPOSITORY: ${{ secrets.GITHUB_REPOSITORY }}
|
||||
GH_USER: ${{ secrets.GH_USER }}
|
||||
GH_AUTH_TOKEN: ${{ secrets.GH_AUTH_TOKEN }}
|
||||
GITHUB_REPOSITORY: ${{ inputs.github_repository }}
|
||||
GH_USER: ${{ inputs.gh_user }}
|
||||
GH_AUTH_TOKEN: ${{ inputs.gh_auth_token }}
|
||||
TRAVIS_PULL_REQUEST: ${{ github.event.pull_request.number }}
|
||||
TRAVIS_PULL_REQUEST_BRANCH: ${{ github.event.pull_request.head.ref }}
|
||||
BOOTERY_URL: ${{ secrets.BOOTERY_URL }}
|
||||
BAKE_HOST: ${{ secrets.BAKE_HOST }}
|
||||
GOKRAZY_BAKERY_PASSWORD: ${{ secrets.GOKRAZY_BAKERY_PASSWORD }}
|
||||
GOKRAZY_BAKE_PASSWORD: ${{ secrets.GOKRAZY_BAKE_PASSWORD }}
|
||||
BOOTERY_URL: ${{ inputs.bootery_url }}
|
||||
BAKE_HOST: ${{ inputs.bake_host }}
|
||||
GOKRAZY_BAKERY_PASSWORD: ${{ inputs.gokrazy_bakery_password }}
|
||||
GOKRAZY_BAKE_PASSWORD: ${{ inputs.gokrazy_bake_password }}
|
||||
if: ${{ env.GH_USER != 0 }}
|
||||
shell: bash
|
||||
run: |
|
||||
mkdir -p extrafiles/github.com/gokrazy/breakglass/etc/
|
||||
echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPrXgBg9kOZuG7j8ZkguxXbsJ5/bC1oILizs/BPsrF2c anupc@devbox' > extrafiles/github.com/gokrazy/breakglass/etc/breakglass.authorized_keys
|
||||
@ -60,7 +60,7 @@ jobs:
|
||||
poweroff_url="${BOOTERY_URL%/testboot}/power/off"
|
||||
trap "curl -s --max-time 300 ${poweroff_url}" EXIT
|
||||
echo "Updating u-boot"
|
||||
curl -s --max-time 300 --upload-file u-boot.bin --user gokrazy:${GOKRAZY_BAKE_PASSWORD} http://${BAKE_HOST}/update/device-specific/u-boot.bin
|
||||
curl -s --max-time 300 --upload-file u-boot-rockchip.bin --user gokrazy:${GOKRAZY_BAKE_PASSWORD} http://${BAKE_HOST}/update/device-specific/u-boot-rockchip.bin
|
||||
echo "Test-booting"
|
||||
cd ~/gokrazy/bakery && GOARCH=arm gokr-boot -require_label=please-boot -set_label=please-merge -bootery_url=$BOOTERY_URL
|
||||
cd ~/gokrazy/bakery && gokr-boot -require_label=please-boot -set_label=please-merge -bootery_url=$BOOTERY_URL
|
||||
fi
|
2
.github/workflows/create-bakery.bash
vendored
2
.github/workflows/create-bakery.bash
vendored
@ -10,7 +10,7 @@ cat > ~/gokrazy/bakery/config.json <<EOT
|
||||
"Update": {
|
||||
"HTTPPassword": "${GOKRAZY_BAKERY_PASSWORD}"
|
||||
},
|
||||
"DeviceType": "odroidhc1",
|
||||
"DeviceType": "rock64",
|
||||
"Packages": [
|
||||
"github.com/gokrazy/breakglass",
|
||||
"github.com/gokrazy/bakery/cmd/bake",
|
||||
|
12
.github/workflows/pull.yml
vendored
12
.github/workflows/pull.yml
vendored
@ -38,3 +38,15 @@ jobs:
|
||||
GOPROXY=direct go install github.com/gokrazy/autoupdate/cmd/...@latest
|
||||
GOPROXY=direct go install github.com/gokrazy/tools/cmd/gokr-packer@latest
|
||||
if ! gokr-has-label please-merge && ! gokr-has-label please-boot; then go install ./cmd/gokr-rebuild-kernel ./cmd/gokr-rebuild-uboot && gokr-rebuild-kernel -overwrite_container_executable=docker && gokr-rebuild-uboot -overwrite_container_executable=docker && GOPROXY=direct go install github.com/gokrazy/autoupdate/cmd/gokr-amend@latest && gokr-amend -set_label=please-boot *.dtb vmlinuz u-boot*.bin boot.scr; fi
|
||||
|
||||
- uses: ./.github/actions/testboot
|
||||
with:
|
||||
github_repository: ${{ secrets.GITHUB_REPOSITORY }}
|
||||
gh_user: ${{ secrets.GH_USER }}
|
||||
gh_auth_token: ${{ secrets.GH_AUTH_TOKEN }}
|
||||
bootery_url: ${{ secrets.BOOTERY_URL }}
|
||||
bake_host: ${{ secrets.BAKE_HOST }}
|
||||
gokrazy_bakery_password: ${{ secrets.GOKRAZY_BAKERY_PASSWORD }}
|
||||
gokrazy_bake_password: ${{ secrets.GOKRAZY_BAKE_PASSWORD }}
|
||||
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
|
||||
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
|
||||
|
@ -1,9 +1,9 @@
|
||||
This repo is a fork of https://github.com/gokrazy/kernel.
|
||||
|
||||
# gokrazy Odroid XU4/HC1/HC2 kernel repository
|
||||
# gokrazy Rock64 kernel repository
|
||||
|
||||
This repository holds a pre-built Linux kernel image for Exynos5422-based
|
||||
Odroid boards (Odroid XU4/HC1/HC2), used by the [gokrazy](https://github.com/gokrazy/gokrazy) project.
|
||||
This repository holds a pre-built Linux kernel image for RK3328-based
|
||||
Rock64 from Pine64, used by the [gokrazy](https://github.com/gokrazy/gokrazy) project.
|
||||
|
||||
The files in this repository are picked up automatically by
|
||||
`gokr-packer`, so you don’t need to interact with this repository
|
||||
|
958
_build/0001-gokrazy-logo.patch
Normal file
958
_build/0001-gokrazy-logo.patch
Normal file
@ -0,0 +1,958 @@
|
||||
From a4ee8244175776f1f98b7f00bc9b0f3980a174d2 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Stapelberg <michael@stapelberg.de>
|
||||
Date: Sun, 13 Jun 2021 09:20:06 +0200
|
||||
Subject: [PATCH] gokrazy logo
|
||||
|
||||
---
|
||||
drivers/video/logo/Kconfig | 4 +
|
||||
drivers/video/logo/Makefile | 1 +
|
||||
drivers/video/logo/logo.c | 4 +
|
||||
drivers/video/logo/logo_gokrazy_clut224.ppm | 883 ++++++++++++++++++++
|
||||
include/linux/linux_logo.h | 1 +
|
||||
5 files changed, 893 insertions(+)
|
||||
create mode 100644 drivers/video/logo/logo_gokrazy_clut224.ppm
|
||||
|
||||
diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig
|
||||
index 6d6f8c087..360a970f7 100644
|
||||
--- a/drivers/video/logo/Kconfig
|
||||
+++ b/drivers/video/logo/Kconfig
|
||||
@@ -68,4 +68,8 @@ config LOGO_SUPERH_CLUT224
|
||||
depends on SUPERH
|
||||
default y
|
||||
|
||||
+config LOGO_GOKRAZY_CLUT224
|
||||
+ bool "224-color gokrazy Linux logo"
|
||||
+ default y
|
||||
+
|
||||
endif # LOGO
|
||||
diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile
|
||||
index 895c60b84..7500454e2 100644
|
||||
--- a/drivers/video/logo/Makefile
|
||||
+++ b/drivers/video/logo/Makefile
|
||||
@@ -13,6 +13,7 @@ obj-$(CONFIG_LOGO_SUN_CLUT224) += logo_sun_clut224.o
|
||||
obj-$(CONFIG_LOGO_SUPERH_MONO) += logo_superh_mono.o
|
||||
obj-$(CONFIG_LOGO_SUPERH_VGA16) += logo_superh_vga16.o
|
||||
obj-$(CONFIG_LOGO_SUPERH_CLUT224) += logo_superh_clut224.o
|
||||
+obj-$(CONFIG_LOGO_GOKRAZY_CLUT224) += logo_gokrazy_clut224.o
|
||||
|
||||
obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o
|
||||
|
||||
diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c
|
||||
index 141f15a9a..60a0efba6 100644
|
||||
--- a/drivers/video/logo/logo.c
|
||||
+++ b/drivers/video/logo/logo.c
|
||||
@@ -99,6 +99,10 @@ const struct linux_logo * __ref fb_find_logo(int depth)
|
||||
#ifdef CONFIG_LOGO_SUPERH_CLUT224
|
||||
/* SuperH Linux logo */
|
||||
logo = &logo_superh_clut224;
|
||||
+#endif
|
||||
+#ifdef CONFIG_LOGO_GOKRAZY_CLUT224
|
||||
+ /* gokrazy Linux logo */
|
||||
+ logo = &logo_gokrazy_clut224;
|
||||
#endif
|
||||
}
|
||||
return logo;
|
||||
diff --git a/drivers/video/logo/logo_gokrazy_clut224.ppm b/drivers/video/logo/logo_gokrazy_clut224.ppm
|
||||
new file mode 100644
|
||||
index 000000000..1276e5de0
|
||||
--- /dev/null
|
||||
+++ b/drivers/video/logo/logo_gokrazy_clut224.ppm
|
||||
@@ -0,0 +1,883 @@
|
||||
+P3
|
||||
+80 80
|
||||
+255
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 9 11 13 1 1 1 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 88 116 137 154 204 239 133 177 207 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 1 1 1 11 14 16 29 36 40 33 44 52 33 44 52 28 37 43 19 25 29
|
||||
+3 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 149 198 233 4 5 6 37 49 58 0 0 0 2 3 3 50 66 77
|
||||
+124 164 193 155 206 242 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 146 195 229 101 134 158 24 29 35 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 21 28 33 0 0 0 7 9 11 101 134 158 155 206 242 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 143 191 223 55 74 86 1 1 1 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 1 2 2 79 105 124 155 206 242 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 146 195 229 55 74 86
|
||||
+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 18 24 29 144 191 225 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+140 187 219 22 29 34 0 0 0 0 0 0 0 0 0 0 0 0 7 9 11 37 49 58
|
||||
+19 25 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+18 24 29 155 206 242 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 64 85 99 0 0 0 1 1 1 86 114 134 156 207 243 156 207 243
|
||||
+156 207 243 127 169 198 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 5
|
||||
+134 179 211 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 13 16 19 112 148 174 146 195 229 40 53 62 4 5 6
|
||||
+11 14 16 124 164 193 33 44 52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 4 4 3 25 27 28 19 20 21 51 51 49
|
||||
+28 31 33 52 60 64 134 179 211 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 125 165 194 83 109 127 64 85 99
|
||||
+67 88 102 96 127 150 139 184 216 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 146 195 229 154 205 240 9 11 13 0 0 0 5 6 7
|
||||
+92 123 144 156 207 243 45 60 71 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 25 27 28 75 77 77 203 203 203 255 255 255 255 255 255
|
||||
+255 255 255 158 158 159 31 38 44 155 206 242 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 139 184 216 54 66 76 19 20 21 100 104 104 134 134 134
|
||||
+129 129 129 75 77 77 9 11 13 69 90 105 150 200 234 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 114 152 178 0 0 0 4 5 6 138 183 215
|
||||
+146 195 229 152 201 236 5 6 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 19 18 17 140 140 140 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 52 60 64 113 150 176 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 134 179 211 19 20 21 117 118 118 245 245 245 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 232 232 232 75 77 77 35 45 52 148 196 231 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 142 188 221 5 6 7 35 45 52
|
||||
+108 143 169 10 13 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 1 1 1 16 17 18 40 42 45 247 247 247 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 117 118 118 79 105 124 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 150 199 233 29 33 36 158 158 159 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 255 255 255 253 253 253 99 87 96 57 72 83 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 112 148 174 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 158 158 159 147 147 147 211 211 211 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 134 134 134 74 98 115 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 86 114 134 83 85 87 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 255 255 255 255 255 255 245 245 245 29 30 31 122 163 191 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 10 13 16
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 10 10 8 19 20 21 242 242 242 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 83 85 87 94 124 145 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 33 42 48 203 203 203 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+232 232 232 129 129 129 116 117 118 207 207 207 255 255 255 140 140 140 69 90 105 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 76 102 120
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 5 5 5 7 6 5 158 158 159 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 240 240 240 14 15 15 137 182 213 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+152 201 236 11 14 16 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 240 240 240
|
||||
+29 30 31 0 0 0 2 2 2 16 17 18 207 207 207 203 203 203 40 53 62 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 144 191 225
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 40 42 45 242 242 242 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 117 118 118 54 71 82 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+144 191 225 25 27 28 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 166 171 172
|
||||
+0 0 0 0 0 0 147 147 147 211 211 211 116 117 118 220 220 220 31 38 44 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+5 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 22 21 19 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+176 181 183 16 17 18 138 183 215 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+154 205 240 16 17 18 251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 166 171 172
|
||||
+0 0 0 0 0 0 53 54 55 75 77 77 129 129 129 203 203 203 45 57 65 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+24 29 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 22 21 19 158 158 159 255 255 255 255 255 255 255 255 255 211 211 211 59 61 63
|
||||
+7 9 11 62 82 96 67 88 102 62 82 96 116 154 180 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 52 60 64 193 186 178 255 255 255 255 255 255 255 255 255 255 255 255 247 247 247
|
||||
+53 54 55 0 0 0 0 0 0 29 30 31 232 232 232 129 129 129 81 108 126 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+28 37 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 14 15 15 40 42 45 59 61 63 29 33 36 7 8 8 98 92 84
|
||||
+185 178 162 147 146 137 0 0 0 0 0 0 11 13 13 29 33 36 50 66 77 104 138 162
|
||||
+156 207 243 110 145 170 63 63 70 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+251 251 251 176 181 183 166 171 172 242 242 242 240 240 240 29 30 31 142 188 221 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+31 41 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 55 74 86 142 188 221 128 170 200 118 156 184 66 73 78 222 196 161
|
||||
+222 196 161 222 196 161 185 178 162 147 146 137 193 186 178 222 196 161 185 178 162 59 61 63
|
||||
+51 68 80 154 204 239 57 72 83 116 117 118 255 255 255 255 255 255 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 255 255 255 247 247 247 66 73 78 94 124 145 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+13 18 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 110 145 170 156 207 243 156 207 243 120 159 187 100 104 104 222 196 161
|
||||
+222 196 161 185 178 162 185 178 162 219 196 162 222 196 161 222 196 161 222 196 161 219 196 162
|
||||
+42 42 39 94 124 145 150 199 233 54 66 76 83 85 87 232 232 232 255 255 255 255 255 255
|
||||
+255 255 255 255 255 255 207 207 207 53 54 55 83 109 127 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+2 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 1 1 1 143 191 223 156 207 243 156 207 243 154 204 239 40 53 62 66 73 78
|
||||
+28 31 33 123 135 144 121 126 131 76 84 87 185 178 162 222 196 161 222 196 161 222 196 161
|
||||
+100 104 104 72 95 112 156 207 243 156 207 243 104 138 162 31 38 44 63 63 70 100 104 104
|
||||
+100 104 104 40 46 51 52 60 64 120 159 187 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 140 187 219
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 2 2 2 3 2 2 68 61 51 34 30 25 10 8 7
|
||||
+0 0 0 7 9 11 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 86 114 134
|
||||
+1 2 2 245 245 245 148 159 163 176 181 183 0 0 0 75 77 77 162 154 141 147 146 137
|
||||
+10 10 8 108 143 169 156 207 243 156 207 243 156 207 243 156 207 243 134 179 211 116 154 180
|
||||
+118 156 184 148 196 231 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 84 111 130
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 8 7 6 121 107 87 222 196 161 185 163 134 9 8 6
|
||||
+0 0 0 28 39 45 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 138 183 214
|
||||
+2 3 3 166 171 172 148 159 163 123 135 144 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+28 37 43 154 205 240 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 28 37 43
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 9 7 6 121 107 87 222 196 161 212 188 154 3 3 3
|
||||
+0 0 0 59 78 92 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+54 71 85 3 4 5 21 28 33 33 42 48 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+84 111 130 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 2 3 3
|
||||
+0 0 0 0 0 0 5 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 3 3 3 68 60 49 222 196 161 222 196 161 21 20 18
|
||||
+0 0 0 81 108 126 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 154 204 239
|
||||
+67 88 102 0 0 0 45 49 57 88 71 86 33 42 48 0 0 0 0 0 0 0 0 0
|
||||
+112 148 174 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 127 169 198 0 0 0
|
||||
+7 7 5 27 25 20 83 74 61 18 17 14 6 6 4 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 194 172 141 222 196 161 136 119 98
|
||||
+8 8 6 104 138 162 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 88 116 137
|
||||
+95 74 90 63 63 70 201 82 107 181 84 109 204 82 107 115 90 91 3 4 5 0 0 0
|
||||
+113 150 176 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 69 92 108 0 0 0
|
||||
+1 1 1 194 172 141 222 196 161 205 181 149 27 25 20 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 9 8 7 68 60 49 220 194 160 222 196 161
|
||||
+46 40 33 120 161 189 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 33 42 48
|
||||
+201 82 107 88 71 86 181 84 109 95 74 90 204 82 107 204 82 107 115 90 91 0 0 0
|
||||
+122 163 191 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 28 39 45 6 6 4
|
||||
+68 61 51 222 196 161 222 196 161 222 196 161 106 94 77 9 8 6 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 5 83 74 61 214 189 155
|
||||
+34 30 25 130 172 202 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 22 29 34
|
||||
+201 82 107 139 97 99 181 84 109 20 25 29 139 97 99 204 82 107 139 97 99 19 25 29
|
||||
+152 201 236 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 137 182 213 86 114 134 8 8 6 46 40 33
|
||||
+205 181 149 222 196 161 222 196 161 222 196 161 83 74 61 6 6 4 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 7 6 21 20 18
|
||||
+13 12 10 134 179 211 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 62 82 96
|
||||
+95 74 90 181 84 109 88 71 86 37 49 58 4 5 6 24 29 35 33 42 48 128 170 200
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 79 104 122 14 15 15 68 61 51 145 128 105 220 194 160
|
||||
+222 196 161 222 196 161 222 196 161 194 172 141 7 6 5 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+2 2 2 139 184 216 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 152 201 236
|
||||
+86 114 134 54 71 82 96 127 150 156 207 243 154 204 239 150 199 233 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 45 49 57 196 177 151 222 196 161 222 196 161 222 196 161
|
||||
+222 196 161 222 196 161 194 172 141 27 25 20 9 7 6 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+1 2 2 142 188 221 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 57 72 83 162 154 141 222 196 161 222 196 161 222 196 161
|
||||
+194 172 141 106 94 77 7 6 5 7 7 5 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 140 187 219 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 138 183 214 40 42 45 51 51 49 60 59 51 21 20 18
|
||||
+12 11 8 10 8 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 1 1 139 184 216 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 51 68 80 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 1 1 138 183 214 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 51 68 80 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+1 1 1 134 179 211 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 45 57 65 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+1 2 2 128 170 200 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 40 53 62 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+2 2 3 124 164 193 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 51 68 80 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+2 2 3 118 156 184 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 69 92 108 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+1 1 1 113 150 176 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 92 123 144 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 96 127 150 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 120 161 189 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 69 92 108 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 152 201 236 1 2 2 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 37 49 58 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 18 24 29 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 7 9 11 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 55 74 86 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 1 130 172 202 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 101 134 158 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 69 92 108 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 120 161 189 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 11 14 16 154 205 240 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 116 154 180 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 108 143 169 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 96 127 150 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 21 28 33 155 206 242 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 51 68 80 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 1 79 105 124 76 102 120 79 105 124 134 179 211
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 13 16 19 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 11 9 8 18 17 14 90 80 66 68 61 51 5 7 7
|
||||
+118 156 184 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 125 165 194 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 14 11 10 76 70 63 214 189 155 222 196 161 222 196 161 110 101 88
|
||||
+8 10 11 150 199 233 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 37 49 58 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 34 30 25 220 194 160 222 196 161 222 196 161 222 196 161 217 192 158
|
||||
+11 9 8 88 116 137 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 127 169 198 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 46 40 33 214 189 155 222 196 161 222 196 161 222 196 161 222 196 161
|
||||
+76 70 63 24 29 35 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 154 204 239 13 18 22 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 13 12 10 21 20 18 136 119 98 220 194 160 222 196 161 222 196 161
|
||||
+121 107 87 8 7 6 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 59 78 92 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 14 11 10 106 94 77 222 196 161 222 196 161
|
||||
+145 128 105 2 2 1 142 188 221 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 84 111 130 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 3 185 163 134 222 196 161
|
||||
+121 107 87 7 6 5 1 1 1 45 57 65 128 170 200 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 72 95 112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 5 5 21 20 18 83 74 61
|
||||
+14 11 10 4 4 3 0 0 0 0 0 0 0 0 0 13 18 22 74 98 115 138 183 215
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 142 188 221
|
||||
+28 37 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+10 13 16 54 71 85 113 150 176 149 198 233 156 207 243 156 207 243 156 207 243 156 207 243
|
||||
+156 207 243 156 207 243 156 207 243 156 207 243 156 207 243 142 184 214 76 84 87 8 7 6
|
||||
+4 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 9 11 13 37 49 58 59 78 92 74 98 115
|
||||
+88 116 137 92 123 144 79 104 122 50 66 77 9 11 13 1 1 1 46 40 33 145 128 105
|
||||
+106 94 77 5 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 7 6 5 106 94 77 222 196 161 222 196 161
|
||||
+222 196 161 106 94 77 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 9 8 7 145 128 105 222 196 161 222 196 161
|
||||
+222 196 161 222 196 161 90 80 66 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 6 6 4 106 94 77 222 196 161 222 196 161
|
||||
+222 196 161 222 196 161 212 188 154 8 7 6 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 1 46 40 33 110 101 88
|
||||
+145 128 105 205 181 149 185 163 134 5 5 3 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 11 8
|
||||
+11 9 8 0 0 0 0 0 0 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
+
|
||||
diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h
|
||||
index d4d5b93ef..777fd6686 100644
|
||||
--- a/include/linux/linux_logo.h
|
||||
+++ b/include/linux/linux_logo.h
|
||||
@@ -45,6 +45,7 @@ extern const struct linux_logo logo_superh_mono;
|
||||
extern const struct linux_logo logo_superh_vga16;
|
||||
extern const struct linux_logo logo_superh_clut224;
|
||||
extern const struct linux_logo logo_spe_clut224;
|
||||
+extern const struct linux_logo logo_gokrazy_clut224;
|
||||
|
||||
extern const struct linux_logo *fb_find_logo(int depth);
|
||||
#ifdef CONFIG_FB_LOGO_EXTRA
|
||||
--
|
||||
2.31.1
|
||||
|
527
_build/config.addendum.txt
Normal file
527
_build/config.addendum.txt
Normal file
@ -0,0 +1,527 @@
|
||||
CONFIG_IPV6=y
|
||||
CONFIG_DYNAMIC_DEBUG=y
|
||||
|
||||
# For Squashfs (root file system):
|
||||
CONFIG_SQUASHFS=y
|
||||
CONFIG_SQUASHFS_FILE_CACHE=y
|
||||
CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU=y
|
||||
CONFIG_SQUASHFS_ZLIB=y
|
||||
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
|
||||
|
||||
# For a console on HDMI:
|
||||
# # TODO: the simpledrm driver just does not work for me. the ASRock logo never disappears from HDMI
|
||||
# # [ 0.364059] [drm] Initialized simpledrm 1.0.0 20200625 for simple-framebuffer.0 on minor 0
|
||||
# CONFIG_DRM_SIMPLEDRM=y
|
||||
# CONFIG_X86_SYSFB=y
|
||||
#
|
||||
# Whereas with (working) efifb, I see:
|
||||
# # [ 0.460084] efifb: probing for efifb
|
||||
# # [ 0.460096] efifb: framebuffer at 0xe9000000, using 3072k, total 3072k
|
||||
# # [ 0.460099] efifb: mode is 1024x768x32, linelength=4096, pages=1
|
||||
# # [ 0.460101] efifb: scrolling: redraw
|
||||
# # [ 0.460103] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
|
||||
CONFIG_DRM_SIMPLEDRM=n
|
||||
CONFIG_X86_SYSFB=n
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_EFI=y
|
||||
CONFIG_FB_SIMPLE=y
|
||||
CONFIG_DRM_FBDEV_EMULATION=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
|
||||
# For FUSE (for cpu(1)):
|
||||
CONFIG_FUSE_FS=y
|
||||
|
||||
# For using github.com/vishvananda/netlink
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE=y
|
||||
CONFIG_XFRM_USER=y
|
||||
|
||||
# For nftables:
|
||||
CONFIG_NF_TABLES=y
|
||||
CONFIG_NF_NAT_IPV4=y
|
||||
CONFIG_NF_NAT_MASQUERADE_IPV4=y
|
||||
CONFIG_NFT_PAYLOAD=y
|
||||
CONFIG_NFT_EXTHDR=y
|
||||
CONFIG_NFT_META=y
|
||||
CONFIG_NFT_CT=y
|
||||
CONFIG_NFT_RBTREE=y
|
||||
CONFIG_NFT_HASH=y
|
||||
CONFIG_NFT_COUNTER=y
|
||||
CONFIG_NFT_LOG=y
|
||||
CONFIG_NFT_LIMIT=y
|
||||
CONFIG_NFT_NAT=y
|
||||
CONFIG_NFT_COMPAT=y
|
||||
CONFIG_NFT_MASQ=y
|
||||
CONFIG_NFT_MASQ_IPV4=y
|
||||
CONFIG_NFT_REDIR=y
|
||||
CONFIG_NFT_REJECT=y
|
||||
CONFIG_NF_TABLES_IPV4=y
|
||||
CONFIG_NFT_REJECT_IPV4=y
|
||||
CONFIG_NFT_CHAIN_ROUTE_IPV4=y
|
||||
CONFIG_NFT_CHAIN_NAT_IPV4=y
|
||||
CONFIG_NF_TABLES_IPV6=y
|
||||
CONFIG_NFT_CHAIN_ROUTE_IPV6=y
|
||||
CONFIG_NFT_OBJREF=y
|
||||
CONFIG_NFT_DUP_IPV4=y
|
||||
CONFIG_NFT_FIB_IPV4=y
|
||||
CONFIG_NFT_DUP_IPV6=y
|
||||
CONFIG_NFT_FIB_IPV6=y
|
||||
|
||||
# Explicitly disable nftables helper modules to prevent NAT slipstreaming attacks:
|
||||
# https://samy.pl/slipstream/
|
||||
CONFIG_NF_CONNTRACK_AMANDA=n
|
||||
CONFIG_NF_CONNTRACK_FTP=n
|
||||
CONFIG_NF_CONNTRACK_H323=n
|
||||
CONFIG_NF_CONNTRACK_IRC=n
|
||||
CONFIG_NF_CONNTRACK_NETBIOS_NS=n
|
||||
CONFIG_NF_CONNTRACK_SNMP=n
|
||||
CONFIG_NF_CONNTRACK_PPTP=n
|
||||
CONFIG_NF_CONNTRACK_SANE=n
|
||||
CONFIG_NF_CONNTRACK_SIP=n
|
||||
CONFIG_NF_CONNTRACK_TFTP=n
|
||||
|
||||
# For using USB mass storage
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_XHCI_HCD=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
|
||||
# For NVMe storage
|
||||
CONFIG_NVME_CORE=y
|
||||
CONFIG_BLK_DEV_NVME=y
|
||||
CONFIG_NVME_MULTIPATH=y
|
||||
CONFIG_NVME_HWMON=y
|
||||
CONFIG_NVME_TARGET_PASSTHRU=y
|
||||
|
||||
# For https://www.fs.com/products/75602.html and https://www.fs.com/products/75603.html network cards:
|
||||
CONFIG_I40E=y
|
||||
|
||||
# For Intel E810 series network cards:
|
||||
CONFIG_ICE=y
|
||||
|
||||
# For Broadcom 57414 10/25 Gbit/s network card:
|
||||
CONFIG_BNXT=y
|
||||
|
||||
# For Mellanox ConnectX-4 25 Gbit/s network cards:
|
||||
CONFIG_MLX5_EN=y
|
||||
CONFIG_MLX5_CORE=y
|
||||
CONFIG_MLX5_CORE_EN=y
|
||||
CONFIG_MLX5_INFINIBAND=n
|
||||
|
||||
# For apu2c4 ethernet ports
|
||||
CONFIG_IGB=y
|
||||
|
||||
# For Intel I225 ethernet ports (ASRock B550 Taichi):
|
||||
CONFIG_IGC=y
|
||||
|
||||
# For /proc/config.gz
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
|
||||
# For kexec
|
||||
CONFIG_KEXEC_FILE=y
|
||||
|
||||
# For apu2c4 watchdog
|
||||
CONFIG_SP5100_TCO=y
|
||||
|
||||
# For WireGuard
|
||||
CONFIG_NET_UDP_TUNNEL=y
|
||||
CONFIG_WIREGUARD=y
|
||||
|
||||
# For traffic shaping using tc:
|
||||
CONFIG_NET_SCH_TBF=y
|
||||
|
||||
# For measuring CPU temperature:
|
||||
CONFIG_SENSORS_K10TEMP=y
|
||||
|
||||
# For measuring non-CPU temperature and fan speeds: Crashes on cm3588
|
||||
# CONFIG_SENSORS_NCT6683=y
|
||||
|
||||
# For Corsair Commander Pro fan controller:
|
||||
CONFIG_SENSORS_CORSAIR_CPRO=y
|
||||
|
||||
# For iproute2’s ss(8):
|
||||
CONFIG_INET_DIAG=y
|
||||
|
||||
# For macvlan ethernet devices:
|
||||
CONFIG_MACVLAN=y
|
||||
|
||||
# For virtio drivers (for qemu):
|
||||
CONFIG_VIRTIO_PCI=y
|
||||
CONFIG_VIRTIO_BALLOON=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_VIRTIO_NET=y
|
||||
CONFIG_VIRTIO=y
|
||||
CONFIG_VIRTIO_RING=y
|
||||
# For watchdog within qemu:
|
||||
CONFIG_I6300ESB_WDT=y
|
||||
|
||||
# For running KVM-accelerated qemu VMs:
|
||||
CONFIG_KVM=y
|
||||
CONFIG_KVM_INTEL=y
|
||||
CONFIG_KVM_AMD=y
|
||||
CONFIG_KVM_AMD_SEV=y
|
||||
|
||||
# For bridge ethernet devices:
|
||||
CONFIG_BRIDGE=y
|
||||
|
||||
CONFIG_EFIVAR_FS=y
|
||||
|
||||
# For Ryzen CPUs:
|
||||
CONFIG_X86_AMD_PLATFORM_DEVICE=y
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE=y
|
||||
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
|
||||
CONFIG_X86_POWERNOW_K8=y
|
||||
CONFIG_X86_AMD_FREQ_SENSITIVITY=y
|
||||
|
||||
# Include hardware interrupt CPU usage in /proc/stat CPU time reporting:
|
||||
CONFIG_IRQ_TIME_ACCOUNTING=y
|
||||
|
||||
# For tun devices, see https://www.kernel.org/doc/Documentation/networking/tuntap.txt
|
||||
CONFIG_TUN=y
|
||||
|
||||
# For runc:
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_BPF=y
|
||||
CONFIG_SOCK_CGROUP_DATA=y
|
||||
CONFIG_NET_SOCK_MSG=y
|
||||
# For podman:
|
||||
CONFIG_OVERLAY_FS=y
|
||||
CONFIG_BRIDGE=y
|
||||
CONFIG_VETH=y
|
||||
CONFIG_NETFILTER_ADVANCED=y
|
||||
CONFIG_NETFILTER_XT_MATCH_COMMENT=y
|
||||
CONFIG_IP_NF_NAT=y
|
||||
CONFIG_IP_NF_TARGET_MASQUERADE=y
|
||||
CONFIG_NETFILTER_XT_NAT=y
|
||||
CONFIG_NETFILTER_XT_TARGET_MASQUERADE=y
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y
|
||||
CONFIG_NETFILTER_XT_MARK=y
|
||||
CONFIG_CGROUP_PIDS=y
|
||||
|
||||
# Enable TCP BBR as default congestion control
|
||||
CONFIG_TCP_CONG_BBR=y
|
||||
CONFIG_DEFAULT_BBR=y
|
||||
CONFIG_DEFAULT_TCP_CONG="bbr"
|
||||
|
||||
# Linux 6.1:
|
||||
# In file included from <command-line>:0:0:
|
||||
# drivers/gpu/drm/i915/i915_sw_fence_work.c: In function 'dma_fence_work_init':
|
||||
# drivers/gpu/drm/i915/i915_sw_fence.h:57:20: error: the comparison will always evaluate as 'false' for the address of 'fence_notify' will never be NULL [-Werror=address]
|
||||
# BUILD_BUG_ON((fn) == NULL); \
|
||||
# ^
|
||||
# ././include/linux/compiler_types.h:337:9: note: in definition of macro '__compiletime_assert'
|
||||
# if (!(condition)) \
|
||||
# ^~~~~~~~~
|
||||
# ././include/linux/compiler_types.h:357:2: note: in expansion of macro '_compiletime_assert'
|
||||
# _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
|
||||
# ^~~~~~~~~~~~~~~~~~~
|
||||
# ./include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
|
||||
# #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
|
||||
# ^~~~~~~~~~~~~~~~~~
|
||||
# ./include/linux/build_bug.h:50:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
|
||||
# BUILD_BUG_ON_MSG(condition, "BUILD_BUG_ON failed: " #condition)
|
||||
# ^~~~~~~~~~~~~~~~
|
||||
# drivers/gpu/drm/i915/i915_sw_fence.h:57:2: note: in expansion of macro 'BUILD_BUG_ON'
|
||||
# BUILD_BUG_ON((fn) == NULL); \
|
||||
# ^~~~~~~~~~~~
|
||||
# drivers/gpu/drm/i915/i915_sw_fence_work.c:89:2: note: in expansion of macro 'i915_sw_fence_init'
|
||||
# i915_sw_fence_init(&f->chain, fence_notify);
|
||||
# ^~~~~~~~~~~~~~~~~~
|
||||
# cc1: all warnings being treated as errors
|
||||
# make[5]: *** [drivers/gpu/drm/i915/i915_sw_fence_work.o] Error 1
|
||||
# make[4]: *** [drivers/gpu/drm/i915] Error 2
|
||||
# make[3]: *** [drivers/gpu/drm] Error 2
|
||||
CONFIG_WERROR=n
|
||||
|
||||
# Enable zstd compression to stay below 15 MB, which is the size of Extended Memory.
|
||||
# This is relevant to keep the kernel booting with the minimal MBR loader we use.
|
||||
CONFIG_KERNEL_ZSTD=y
|
||||
|
||||
# For qemu -M microvm quick boots:
|
||||
CONFIG_VIRTIO_MMIO=y
|
||||
|
||||
CONFIG_HW_RANDOM_VIRTIO=y
|
||||
CONFIG_XEN_VIRTIO=y
|
||||
CONFIG_VIRTIO_IOMMU=y
|
||||
|
||||
CONFIG_IPV6_MULTIPLE_TABLES=y
|
||||
CONFIG_NF_SOCKET_IPV6=y
|
||||
CONFIG_NETLINK_DIAG=y
|
||||
CONFIG_INET_DIAG_DESTROY=y
|
||||
|
||||
# More AWS stuff:
|
||||
CONFIG_ENA_ETHERNET=y
|
||||
CONFIG_RANDOM_TRUST_CPU=y
|
||||
CONFIG_RANDOM_TRUST_BOOTLOADER=y
|
||||
|
||||
# For older AWS:
|
||||
CONFIG_XEN=y
|
||||
CONFIG_XEN_DOM0=y
|
||||
CONFIG_XEN_PRIVILEGED_GUEST=y
|
||||
CONFIG_XEN_PVHVM=y
|
||||
|
||||
# for easy sandboxing with go-landlock
|
||||
CONFIG_SECURITY_LANDLOCK=y
|
||||
|
||||
# Speed up boot and processing in general
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
CONFIG_DEBUG_KERNEL=n
|
||||
|
||||
# Enable the RK3588 CPU
|
||||
CONFIG_ARCH_ROCKCHIP=y
|
||||
CONFIG_CPU_RK3588=y
|
||||
|
||||
# Enable all the ROCKCHIP options
|
||||
CONFIG_CRYPTO_DEV_ROCKCHIP2=y
|
||||
CONFIG_CRYPTO_DEV_ROCKCHIP=y
|
||||
CONFIG_HW_RANDOM_ROCKCHIP=y
|
||||
CONFIG_MFD_RK8XX_I2C=y
|
||||
CONFIG_MFD_RK8XX_SPI=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_NVMEM_ROCKCHIP_EFUSE=y
|
||||
CONFIG_NVMEM_ROCKCHIP_OTP=y
|
||||
CONFIG_PCIE_ROCKCHIP_HOST=y
|
||||
CONFIG_PHY_ROCKCHIP_DP=y
|
||||
CONFIG_PHY_ROCKCHIP_DPHY_RX0=y
|
||||
CONFIG_PHY_ROCKCHIP_EMMC=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_HDMI=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
|
||||
CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y
|
||||
CONFIG_PHY_ROCKCHIP_PCIE=y
|
||||
CONFIG_PHY_ROCKCHIP_SAMSUNG_HDPTX=y
|
||||
CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y
|
||||
CONFIG_PHY_ROCKCHIP_TYPEC=y
|
||||
CONFIG_PHY_ROCKCHIP_USB=y
|
||||
CONFIG_PHY_ROCKCHIP_USBDP=y
|
||||
CONFIG_PWM_ROCKCHIP=y
|
||||
CONFIG_ROCKCHIP_IODOMAIN=y
|
||||
CONFIG_ROCKCHIP_IOMMU=y
|
||||
CONFIG_ROCKCHIP_MBOX=y
|
||||
CONFIG_ROCKCHIP_PHY=y
|
||||
CONFIG_ROCKCHIP_PM_DOMAINS=y
|
||||
CONFIG_ROCKCHIP_THERMAL=y
|
||||
CONFIG_SND_SOC_RK3328=y
|
||||
CONFIG_SPI_ROCKCHIP=y
|
||||
CONFIG_SPI_ROCKCHIP_SFC=y
|
||||
CONFIG_VIDEO_ROCKCHIP_VDEC2=y
|
||||
|
||||
# CM3588 RTC driver
|
||||
CONFIG_RTC_DRV_RK808=y
|
||||
|
||||
# Shouldn't this be done elsewhere?
|
||||
CONFIG_CMDLINE="console=ttyAMA0"
|
||||
|
||||
# This is what friendlyelec has
|
||||
CONFIG_HZ_300=y
|
||||
|
||||
# Quad core CPU
|
||||
CONFIG_NR_CPUS=8
|
||||
|
||||
# Power button
|
||||
CONFIG_PINCTRL_RK805=y
|
||||
CONFIG_INPUT_RK805_PWRKEY=y
|
||||
|
||||
# Needed to ensure DWMAC_ROCKCHIP is built, which is needed for Ethernet
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_PLATFORM=y
|
||||
CONFIG_DWMAC_GENERIC=y
|
||||
CONFIG_DWMAC_ROCKCHIP=y
|
||||
|
||||
# Ethernet driver
|
||||
CONFIG_REALTEK_PHY=y
|
||||
CONFIG_R8169=y
|
||||
|
||||
# Try to enable HDMI out
|
||||
CONFIG_DRM_ROCKCHIP=y
|
||||
|
||||
|
||||
CONFIG_CRYPTO_DEV_ROCKCHIP2=y
|
||||
CONFIG_HW_RANDOM_ROCKCHIP=y
|
||||
CONFIG_VIDEO_ROCKCHIP_VDEC2=y
|
||||
|
||||
CONFIG_MKISS=y
|
||||
CONFIG_6PACK=y
|
||||
CONFIG_BPQETHER=y
|
||||
CONFIG_BAYCOM_SER_FDX=y
|
||||
CONFIG_BAYCOM_SER_HDX=y
|
||||
CONFIG_YAM=y
|
||||
CONFIG_USB_RTL8150=y
|
||||
CONFIG_USB_RTL8152=y
|
||||
|
||||
|
||||
CONFIG_AD525X_DPOT=y
|
||||
CONFIG_AD525X_DPOT_I2C=y
|
||||
CONFIG_AD525X_DPOT_SPI=y
|
||||
|
||||
# Try to enable sound
|
||||
CONFIG_SND_SOC_ROCKCHIP=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_DLP_PCM=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_I2S=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_PDM=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SAI=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SPDIF=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_SPDIFRX=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_VAD=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_MAX98090=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_MULTICODECS=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_RT5645=y
|
||||
CONFIG_SND_SOC_ROCKCHIP_HDMI=y
|
||||
|
||||
|
||||
CONFIG_OVERLAY_FS=y
|
||||
CONFIG_OVERLAY_FS_INDEX=y
|
||||
|
||||
|
||||
# # disable other arches
|
||||
CONFIG_ARCH_ACTIONS=n
|
||||
CONFIG_ARCH_AIROHA=n
|
||||
CONFIG_ARCH_ALPINE=n
|
||||
CONFIG_ARCH_APPLE=n
|
||||
CONFIG_ARCH_BCM2835=n
|
||||
CONFIG_ARCH_BCM=n
|
||||
CONFIG_ARCH_BCM_IPROC=n
|
||||
CONFIG_ARCH_BCMBCA=n
|
||||
CONFIG_ARCH_BERLIN=n
|
||||
CONFIG_ARCH_BRCMSTB=n
|
||||
CONFIG_ARCH_EXYNOS=n
|
||||
CONFIG_ARCH_HISI=n
|
||||
CONFIG_ARCH_INTEL_SOCFPGA=n
|
||||
CONFIG_ARCH_K3=n
|
||||
CONFIG_ARCH_KEEMBAY=n
|
||||
CONFIG_ARCH_LAYERSCAPE=n
|
||||
CONFIG_ARCH_LG1K=n
|
||||
CONFIG_ARCH_MA35=n
|
||||
CONFIG_ARCH_MEDIATEK=n
|
||||
CONFIG_ARCH_MESON=n
|
||||
CONFIG_ARCH_MVEBU=n
|
||||
CONFIG_ARCH_MXC=n
|
||||
CONFIG_ARCH_NPCM=n
|
||||
CONFIG_ARCH_NXP=n
|
||||
CONFIG_ARCH_QCOM=n
|
||||
CONFIG_ARCH_R8A774A1=n
|
||||
CONFIG_ARCH_R8A774B1=n
|
||||
CONFIG_ARCH_R8A774C0=n
|
||||
CONFIG_ARCH_R8A774E1=n
|
||||
CONFIG_ARCH_R8A77951=n
|
||||
CONFIG_ARCH_R8A77960=n
|
||||
CONFIG_ARCH_R8A77961=n
|
||||
CONFIG_ARCH_R8A77965=n
|
||||
CONFIG_ARCH_R8A77970=n
|
||||
CONFIG_ARCH_R8A77980=n
|
||||
CONFIG_ARCH_R8A77990=n
|
||||
CONFIG_ARCH_R8A77995=n
|
||||
CONFIG_ARCH_R8A779A0=n
|
||||
CONFIG_ARCH_R8A779F0=n
|
||||
CONFIG_ARCH_R8A779G0=n
|
||||
CONFIG_ARCH_R8A779H0=n
|
||||
CONFIG_ARCH_R9A07G043=n
|
||||
CONFIG_ARCH_R9A07G044=n
|
||||
CONFIG_ARCH_R9A07G054=n
|
||||
CONFIG_ARCH_R9A08G045=n
|
||||
CONFIG_ARCH_R9A09G011=n
|
||||
CONFIG_ARCH_R9A09G057=n
|
||||
CONFIG_ARCH_REALTEK=n
|
||||
CONFIG_ARCH_RENESAS=n
|
||||
CONFIG_ARCH_S32=n
|
||||
CONFIG_ARCH_SEATTLE=n
|
||||
CONFIG_ARCH_SPARX5=n
|
||||
CONFIG_ARCH_SPRD=n
|
||||
CONFIG_ARCH_STM32=n
|
||||
CONFIG_ARCH_SUNXI=n
|
||||
CONFIG_ARCH_SYNQUACER=n
|
||||
CONFIG_ARCH_TEGRA=n
|
||||
CONFIG_ARCH_TEGRA_132_SOC=n
|
||||
CONFIG_ARCH_TEGRA_186_SOC=n
|
||||
CONFIG_ARCH_TEGRA_194_SOC=n
|
||||
CONFIG_ARCH_TEGRA_210_SOC=n
|
||||
CONFIG_ARCH_TEGRA_234_SOC=n
|
||||
CONFIG_ARCH_TESLA_FSD=n
|
||||
CONFIG_ARCH_THUNDER2=n
|
||||
CONFIG_ARCH_THUNDER=n
|
||||
CONFIG_ARCH_UNIPHIER=n
|
||||
CONFIG_ARCH_VEXPRESS=n
|
||||
CONFIG_ARCH_VISCONTI=n
|
||||
CONFIG_ARCH_XGENE=n
|
||||
CONFIG_ARCH_ZYNQMP=n
|
||||
|
||||
CONFIG_GOOGLE_FIRMWARE=n
|
||||
|
||||
CONFIG_ATA=n
|
||||
|
||||
CONFIG_MD=n
|
||||
|
||||
|
||||
CONFIG_NET_VENDOR_3COM=n
|
||||
CONFIG_NET_VENDOR_ADAPTEC=n
|
||||
CONFIG_NET_VENDOR_AGERE=n
|
||||
CONFIG_NET_VENDOR_ALACRITECH=n
|
||||
CONFIG_NET_VENDOR_ALTEON=n
|
||||
CONFIG_NET_VENDOR_AMAZON=n
|
||||
CONFIG_NET_VENDOR_AMD=n
|
||||
CONFIG_NET_VENDOR_AQUANTIA=n
|
||||
CONFIG_NET_VENDOR_ARC=n
|
||||
CONFIG_NET_VENDOR_ASIX=n
|
||||
CONFIG_NET_VENDOR_ATHEROS=n
|
||||
CONFIG_NET_VENDOR_CADENCE=n
|
||||
CONFIG_NET_VENDOR_CAVIUM=n
|
||||
CONFIG_NET_VENDOR_CHELSIO=n
|
||||
CONFIG_NET_VENDOR_CISCO=n
|
||||
CONFIG_NET_VENDOR_CORTINA=n
|
||||
CONFIG_NET_VENDOR_DAVICOM=n
|
||||
CONFIG_NET_VENDOR_DEC=n
|
||||
CONFIG_NET_VENDOR_DLINK=n
|
||||
CONFIG_NET_VENDOR_EMULEX=n
|
||||
CONFIG_NET_VENDOR_ENGLEDER=n
|
||||
CONFIG_NET_VENDOR_EZCHIP=n
|
||||
CONFIG_NET_VENDOR_FUNGIBLE=n
|
||||
CONFIG_NET_VENDOR_GOOGLE=n
|
||||
CONFIG_NET_VENDOR_HISILICON=n
|
||||
CONFIG_NET_VENDOR_HUAWEI=n
|
||||
CONFIG_NET_VENDOR_I825XX=n
|
||||
CONFIG_NET_VENDOR_INTEL=n
|
||||
CONFIG_NET_VENDOR_ADI=n
|
||||
CONFIG_NET_VENDOR_LITEX=n
|
||||
CONFIG_NET_VENDOR_MARVELL=n
|
||||
CONFIG_NET_VENDOR_MELLANOX=n
|
||||
CONFIG_NET_VENDOR_MICREL=n
|
||||
CONFIG_NET_VENDOR_MICROCHIP=n
|
||||
CONFIG_NET_VENDOR_MICROSEMI=n
|
||||
CONFIG_NET_VENDOR_MICROSOFT=n
|
||||
CONFIG_NET_VENDOR_MnRI=n
|
||||
CONFIG_NET_VENDOR_NI=n
|
||||
CONFIG_NET_VENDOR_NATSEMI=n
|
||||
CONFIG_NET_VENDOR_NETERION=n
|
||||
CONFIG_NET_VENDOR_NETRONOME=n
|
||||
CONFIG_NET_VENDOR_8390=n
|
||||
CONFIG_NET_VENDOR_NVIDIA=n
|
||||
CONFIG_NET_VENDOR_OKI=n
|
||||
CONFIG_NET_VENDOR_PACKET_ENGINES=n
|
||||
CONFIG_NET_VENDOR_PENSANDO=n
|
||||
CONFIG_NET_VENDOR_QLOGIC=n
|
||||
CONFIG_NET_VENDOR_BROCADE=n
|
||||
CONFIG_NET_VENDOR_QUALCOMM=n
|
||||
CONFIG_NET_VENDOR_RDC=n
|
||||
CONFIG_NET_VENDOR_BROADCOM=n
|
||||
CONFIG_NET_VENDOR_RENESAS=n
|
||||
CONFIG_NET_VENDOR_ROCKER=n
|
||||
CONFIG_NET_VENDOR_SAMSUNG=n
|
||||
CONFIG_NET_VENDOR_SEEQ=n
|
||||
CONFIG_NET_VENDOR_SILAN=n
|
||||
CONFIG_NET_VENDOR_SIS=n
|
||||
CONFIG_NET_VENDOR_SOLARFLARE=n
|
||||
CONFIG_NET_VENDOR_SMSC=n
|
||||
CONFIG_NET_VENDOR_SOCIONEXT=n
|
||||
CONFIG_NET_VENDOR_STMICRO=n
|
||||
CONFIG_NET_VENDOR_SUN=n
|
||||
CONFIG_NET_VENDOR_SnNOPSnS=n
|
||||
CONFIG_NET_VENDOR_TEHUTI=n
|
||||
CONFIG_NET_VENDOR_TI=n
|
||||
CONFIG_NET_VENDOR_VERTEXCOM=n
|
||||
CONFIG_NET_VENDOR_VIA=n
|
||||
CONFIG_NET_VENDOR_WANGXUN=n
|
||||
CONFIG_NET_VENDOR_WIZNET=n
|
||||
CONFIG_NET_VENDOR_XILINX=n
|
1
_build/series
Normal file
1
_build/series
Normal file
@ -0,0 +1 @@
|
||||
0001-gokrazy-logo.patch
|
1
_build/upstream-url.txt
Normal file
1
_build/upstream-url.txt
Normal file
@ -0,0 +1 @@
|
||||
https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.tar.xz
|
@ -1,178 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
_ "embed"
|
||||
)
|
||||
|
||||
//go:embed config.txt
|
||||
var configContents []byte
|
||||
|
||||
// see https://www.kernel.org/releases.json
|
||||
var latest = "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.9.6.tar.xz"
|
||||
|
||||
func downloadKernel() error {
|
||||
out, err := os.Create(filepath.Base(latest))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
resp, err := http.Get(latest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if got, want := resp.StatusCode, http.StatusOK; got != want {
|
||||
return fmt.Errorf("unexpected HTTP status code for %s: got %d, want %d", latest, got, want)
|
||||
}
|
||||
if _, err := io.Copy(out, resp.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
|
||||
func applyPatches(srcdir string) error {
|
||||
patches, err := filepath.Glob("*.patch")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, patch := range patches {
|
||||
log.Printf("applying patch %q", patch)
|
||||
f, err := os.Open(patch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
cmd := exec.Command("patch", "-p1")
|
||||
cmd.Dir = srcdir
|
||||
cmd.Stdin = f
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
f.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func compile() error {
|
||||
defconfig := exec.Command("make", "ARCH=arm64", "defconfig")
|
||||
defconfig.Stdout = os.Stdout
|
||||
defconfig.Stderr = os.Stderr
|
||||
if err := defconfig.Run(); err != nil {
|
||||
return fmt.Errorf("make defconfig: %v", err)
|
||||
}
|
||||
|
||||
f, err := os.OpenFile(".config", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
if _, err := f.Write(configContents); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := f.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
olddefconfig := exec.Command("make", "ARCH=arm64", "olddefconfig")
|
||||
olddefconfig.Stdout = os.Stdout
|
||||
olddefconfig.Stderr = os.Stderr
|
||||
if err := olddefconfig.Run(); err != nil {
|
||||
return fmt.Errorf("make olddefconfig: %v", err)
|
||||
}
|
||||
|
||||
make := exec.Command("make", "Image", "dtbs", "-j"+strconv.Itoa(runtime.NumCPU()))
|
||||
make.Env = append(os.Environ(),
|
||||
"ARCH=arm64",
|
||||
"CROSS_COMPILE=aarch64-linux-gnu-",
|
||||
"KBUILD_BUILD_USER=gokrazy",
|
||||
"KBUILD_BUILD_HOST=docker",
|
||||
"KBUILD_BUILD_TIMESTAMP=Wed Mar 1 20:57:29 UTC 2017",
|
||||
)
|
||||
make.Stdout = os.Stdout
|
||||
make.Stderr = os.Stderr
|
||||
if err := make.Run(); err != nil {
|
||||
return fmt.Errorf("make: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func copyFile(dest, src string) error {
|
||||
out, err := os.Create(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
in, err := os.Open(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
if _, err := io.Copy(out, in); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
st, err := in.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := out.Chmod(st.Mode()); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
|
||||
func main() {
|
||||
log.Printf("downloading kernel source: %s", latest)
|
||||
if err := downloadKernel(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Printf("unpacking kernel source")
|
||||
untar := exec.Command("tar", "xf", filepath.Base(latest))
|
||||
untar.Stdout = os.Stdout
|
||||
untar.Stderr = os.Stderr
|
||||
if err := untar.Run(); err != nil {
|
||||
log.Fatalf("untar: %v", err)
|
||||
}
|
||||
|
||||
srcdir := strings.TrimSuffix(filepath.Base(latest), ".tar.xz")
|
||||
|
||||
log.Printf("applying patches")
|
||||
if err := applyPatches(srcdir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := os.Chdir(srcdir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Printf("compiling kernel")
|
||||
if err := compile(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := copyFile("/tmp/buildresult/vmlinuz", "arch/arm64/boot/Image"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := copyFile("/tmp/buildresult/rk3328-rock64.dtb", "arch/arm64/boot/dts/rockchip/rk3328-rock64.dtb"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
# Make sure /proc/config.gz is available
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
|
||||
# Can't disable modules because we're relying on generic arm64 defconfig.
|
||||
# Disabling modules will convert all modules to be built in, which is a lot.
|
||||
# CONFIG_MODULES=n
|
||||
|
||||
# Disable wireless-y modules, like WiFi/BT
|
||||
CONFIG_BT=n
|
||||
CONFIG_CFG80211=n
|
||||
CONFIG_NFC=n
|
||||
CONFIG_WIRELESS=n
|
||||
|
||||
# Speed up boot and processing in general
|
||||
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
|
||||
CONFIG_DEBUG_KERNEL=n
|
||||
|
||||
# Required for Tailscale
|
||||
CONFIG_TUN=y
|
||||
|
||||
CONFIG_ARCH_ROCKCHIP=y
|
||||
CONFIG_ROCKCHIP_PHY=y
|
||||
CONFIG_SPI_ROCKCHIP=y
|
||||
CONFIG_SPI_ROCKCHIP_SFC=y
|
||||
CONFIG_ROCKCHIP_THERMAL=y
|
||||
CONFIG_MMC_DW_ROCKCHIP=y
|
||||
CONFIG_ROCKCHIP_MBOX=y
|
||||
CONFIG_ROCKCHIP_IOMMU=y
|
||||
CONFIG_ROCKCHIP_IODOMAIN=y
|
||||
CONFIG_ROCKCHIP_PM_DOMAINS=y
|
||||
CONFIG_PWM_ROCKCHIP=y
|
||||
CONFIG_PHY_ROCKCHIP_DP=y
|
||||
CONFIG_PHY_ROCKCHIP_DPHY_RX0=m
|
||||
CONFIG_PHY_ROCKCHIP_EMMC=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_HDMI=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y
|
||||
CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y
|
||||
CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y
|
||||
CONFIG_PHY_ROCKCHIP_PCIE=y
|
||||
CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y
|
||||
CONFIG_PHY_ROCKCHIP_TYPEC=y
|
||||
CONFIG_PHY_ROCKCHIP_USB=y
|
||||
CONFIG_NVMEM_ROCKCHIP_EFUSE=y
|
||||
CONFIG_NVMEM_ROCKCHIP_OTP=y
|
||||
CONFIG_CRYPTO_DEV_ROCKCHIP=y
|
||||
CONFIG_INPUT_RK805_PWRKEY=y
|
||||
CONFIG_PINCTRL_RK805=y
|
||||
CONFIG_MFD_RK8XX_I2C=y
|
||||
CONFIG_MFD_RK8XX_SPI=y
|
||||
CONFIG_SND_SOC_RK3328=y
|
||||
|
||||
CONFIG_NR_CPUS=8
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_CMDLINE="console=ttyAMA0"
|
||||
|
||||
# Needed to ensure DWMAC_ROCKCHIP is built, which is needed for Ethernet
|
||||
CONFIG_STMMAC_ETH=y
|
||||
CONFIG_STMMAC_PLATFORM=y
|
||||
CONFIG_DWMAC_GENERIC=y
|
||||
CONFIG_DWMAC_ROCKCHIP=y
|
||||
CONFIG_REALTEK_PHY=y
|
||||
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_ROCKCHIP=y
|
@ -11,17 +11,17 @@ import (
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const ubootRev = "fe2ce09a0753634543c32cafe85eb87a625f76ca"
|
||||
const ubootTS = 1718721296
|
||||
const trustedRepoRev = "10eb851f92acc67f7cdb955770e3bdced3026677"
|
||||
const ubootRev = "a3cd0b4c632fff0f39013efebd419356eb6b4064"
|
||||
const ubootTS = 1723759665
|
||||
const trustedRepoRev = "a4e2a9f16d5c4620cd824294ef91a198fd276c80"
|
||||
|
||||
const (
|
||||
uBootRepo = "https://github.com/u-boot/u-boot"
|
||||
trustedFirmwareRepo = "https://github.com/ARM-software/arm-trusted-firmware"
|
||||
)
|
||||
|
||||
func applyPatches(srcdir string) error {
|
||||
patches, err := filepath.Glob("*.patch")
|
||||
func applyPatches(srcdir, t string) error {
|
||||
patches, err := filepath.Glob(t+".patches/*.patch")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -47,7 +47,7 @@ func applyPatches(srcdir string) error {
|
||||
}
|
||||
|
||||
func compile(trustedFirmwareDir string) error {
|
||||
defconfig := exec.Command("make", "ARCH=arm64", "rock64-rk3328_defconfig")
|
||||
defconfig := exec.Command("make", "ARCH=arm64", "cm3588-nas-rk3588_defconfig")
|
||||
defconfig.Stdout = os.Stdout
|
||||
defconfig.Stderr = os.Stderr
|
||||
if err := defconfig.Run(); err != nil {
|
||||
@ -70,7 +70,8 @@ func compile(trustedFirmwareDir string) error {
|
||||
"ARCH=arm64",
|
||||
"CROSS_COMPILE=aarch64-linux-gnu-",
|
||||
"SOURCE_DATE_EPOCH="+strconv.Itoa(ubootTS),
|
||||
fmt.Sprintf("BL31=%s/build/rk3328/release/bl31/bl31.elf", trustedFirmwareDir),
|
||||
fmt.Sprintf("BL31=%s/build/rk3588/release/bl31/bl31.elf", trustedFirmwareDir),
|
||||
fmt.Sprintf("ROCKCHIP_TPL=%s","/usr/src/uboot.patches/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.16.bin"),
|
||||
)
|
||||
make.Stdout = os.Stdout
|
||||
make.Stderr = os.Stderr
|
||||
@ -140,7 +141,23 @@ func main() {
|
||||
{"git", "remote", "add", "origin", trustedFirmwareRepo},
|
||||
{"git", "fetch", "--depth=1", "origin", trustedRepoRev},
|
||||
{"git", "checkout", "FETCH_HEAD"},
|
||||
{"make", "SOURCE_DATE_EPOCH=1600000000", "CROSS_COMPILE=aarch64-linux-gnu-", "PLAT=rk3328"},
|
||||
} {
|
||||
log.Printf("Running %s", cmd)
|
||||
cmdObj := exec.Command(cmd[0], cmd[1:]...)
|
||||
cmdObj.Stdout = os.Stdout
|
||||
cmdObj.Stderr = os.Stderr
|
||||
cmdObj.Dir = trustedFirmwareDir
|
||||
if err := cmdObj.Run(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
log.Printf("applying patches")
|
||||
if err := applyPatches(trustedFirmwareDir, "atf"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, cmd := range [][]string{
|
||||
{"make", "SOURCE_DATE_EPOCH=1600000000", "CROSS_COMPILE=aarch64-linux-gnu-", "PLAT=rk3588"},
|
||||
} {
|
||||
log.Printf("Running %s", cmd)
|
||||
cmdObj := exec.Command(cmd[0], cmd[1:]...)
|
||||
@ -153,7 +170,7 @@ func main() {
|
||||
}
|
||||
|
||||
var bootCmdPath string
|
||||
if p, err := filepath.Abs("boot.cmd"); err != nil {
|
||||
if p, err := filepath.Abs("uboot.patches/boot.cmd"); err != nil {
|
||||
log.Fatal(err)
|
||||
} else {
|
||||
bootCmdPath = p
|
||||
@ -180,7 +197,7 @@ func main() {
|
||||
}
|
||||
|
||||
log.Printf("applying patches")
|
||||
if err := applyPatches(ubootDir); err != nil {
|
||||
if err := applyPatches(ubootDir, "uboot"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
|
249
cmd/gokr-rebuild-kernel/indocker.go
Normal file
249
cmd/gokr-rebuild-kernel/indocker.go
Normal file
@ -0,0 +1,249 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func downloadKernel(latest string) error {
|
||||
out, err := os.Create(filepath.Base(latest))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
if kernel, err := os.Open("/tmp/buildresult/" + filepath.Base(latest)); err == nil {
|
||||
defer kernel.Close()
|
||||
if _, err := io.Copy(out, kernel); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
resp, err := http.Get(latest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if got, want := resp.StatusCode, http.StatusOK; got != want {
|
||||
return fmt.Errorf("unexpected HTTP status code for %s: got %d, want %d", latest, got, want)
|
||||
}
|
||||
if _, err := io.Copy(out, resp.Body); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
|
||||
func applyPatches(srcdir string) error {
|
||||
patches, err := filepath.Glob("*.patch")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, patch := range patches {
|
||||
log.Printf("applying patch %q", patch)
|
||||
f, err := os.Open(patch)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
cmd := exec.Command("patch", "-p1")
|
||||
cmd.Dir = srcdir
|
||||
cmd.Stdin = f
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
f.Close()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func compile(cross, flavor string) error {
|
||||
defconfig := exec.Command("make", "defconfig")
|
||||
if flavor == "raspberrypi" {
|
||||
// TODO(https://github.com/gokrazy/gokrazy/issues/223): is it
|
||||
// necessary/desirable to switch to bcm2712_defconfig?
|
||||
defconfig = exec.Command("make", "ARCH=arm64", "bcm2711_defconfig")
|
||||
}
|
||||
|
||||
defconfig.Stdout = os.Stdout
|
||||
defconfig.Stderr = os.Stderr
|
||||
if err := defconfig.Run(); err != nil {
|
||||
return fmt.Errorf("make defconfig: %v", err)
|
||||
}
|
||||
|
||||
// Change answers from mod to no if possible, i.e. disable all modules so
|
||||
// that we end up with a minimal set of modules (from the config addendum).
|
||||
mod2noconfig := exec.Command("make", "mod2noconfig")
|
||||
mod2noconfig.Stdout = os.Stdout
|
||||
mod2noconfig.Stderr = os.Stderr
|
||||
if err := mod2noconfig.Run(); err != nil {
|
||||
return fmt.Errorf("make mod2noconfig: %v", err)
|
||||
}
|
||||
|
||||
f, err := os.OpenFile(".config", os.O_APPEND|os.O_WRONLY, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
addendum, err := os.ReadFile("/usr/src/config.addendum.txt")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if _, err := f.Write(addendum); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := f.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
olddefconfig := exec.Command("make", "olddefconfig")
|
||||
olddefconfig.Stdout = os.Stdout
|
||||
olddefconfig.Stderr = os.Stderr
|
||||
if err := olddefconfig.Run(); err != nil {
|
||||
return fmt.Errorf("make olddefconfig: %v", err)
|
||||
}
|
||||
|
||||
env := append(os.Environ(),
|
||||
"KBUILD_BUILD_USER=gokrazy",
|
||||
"KBUILD_BUILD_HOST=docker",
|
||||
"KBUILD_BUILD_TIMESTAMP=Wed Mar 1 20:57:29 UTC 2017",
|
||||
)
|
||||
make := exec.Command("make", "bzImage", "modules", "-j"+strconv.Itoa(runtime.NumCPU()))
|
||||
if cross == "arm64" {
|
||||
make = exec.Command("make", "Image.gz", "dtbs", "modules", "-j"+strconv.Itoa(runtime.NumCPU()))
|
||||
}
|
||||
make.Env = env
|
||||
make.Stdout = os.Stdout
|
||||
make.Stderr = os.Stderr
|
||||
if err := make.Run(); err != nil {
|
||||
return fmt.Errorf("make: %v", err)
|
||||
}
|
||||
|
||||
make = exec.Command("make", "INSTALL_MOD_PATH=/tmp/buildresult", "modules_install", "-j"+strconv.Itoa(runtime.NumCPU()))
|
||||
make.Env = env
|
||||
make.Stdout = os.Stdout
|
||||
make.Stderr = os.Stderr
|
||||
if err := make.Run(); err != nil {
|
||||
return fmt.Errorf("make: %v", err)
|
||||
}
|
||||
|
||||
make = exec.Command("make", "INSTALL_DTBS_PATH=/tmp/buildresult/dtbs", "dtbs_install", "-j"+strconv.Itoa(runtime.NumCPU()))
|
||||
make.Env = env
|
||||
make.Stdout = os.Stdout
|
||||
make.Stderr = os.Stderr
|
||||
if err := make.Run(); err != nil {
|
||||
return fmt.Errorf("make: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func indockerMain() {
|
||||
cross := flag.String("cross",
|
||||
"",
|
||||
"if non-empty, cross-compile for the specified arch (one of 'arm64')")
|
||||
|
||||
flavor := flag.String("flavor",
|
||||
"vanilla",
|
||||
"which kernel flavor to build. one of vanilla (kernel.org) or raspberrypi (https://github.com/raspberrypi/linux/tags)")
|
||||
|
||||
flag.Parse()
|
||||
latest := flag.Arg(0)
|
||||
if latest == "" {
|
||||
log.Fatalf("syntax: %s <upstream-URL>", os.Args[0])
|
||||
}
|
||||
log.Printf("downloading kernel source: %s", latest)
|
||||
if err := downloadKernel(latest); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Printf("unpacking kernel source")
|
||||
untar := exec.Command("tar", "xf", filepath.Base(latest))
|
||||
untar.Stdout = os.Stdout
|
||||
untar.Stderr = os.Stderr
|
||||
if err := untar.Run(); err != nil {
|
||||
log.Fatalf("untar: %v", err)
|
||||
}
|
||||
|
||||
srcdir := strings.TrimSuffix(filepath.Base(latest), ".tar.xz")
|
||||
if *flavor == "raspberrypi" {
|
||||
srcdir = strings.TrimSuffix("linux-"+filepath.Base(latest), ".tar.gz")
|
||||
}
|
||||
|
||||
log.Printf("applying patches")
|
||||
if err := applyPatches(srcdir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := os.Chdir(srcdir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if *cross == "arm64" {
|
||||
log.Printf("exporting ARCH=arm64, CROSS_COMPILE=aarch64-linux-gnu-")
|
||||
os.Setenv("ARCH", "arm64")
|
||||
os.Setenv("CROSS_COMPILE", "aarch64-linux-gnu-")
|
||||
}
|
||||
|
||||
log.Printf("compiling kernel")
|
||||
if err := compile(*cross, *flavor); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if *cross == "arm64" {
|
||||
if err := copyFile("/tmp/buildresult/vmlinuz", "arch/arm64/boot/Image"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
switch *flavor {
|
||||
case "vanilla":
|
||||
cp := exec.Command("cp", "-r", filepath.Join("arch/arm64/boot/dts/"), "/tmp/buildresult/dts")
|
||||
cp.Stdout = os.Stdout
|
||||
cp.Stderr = os.Stderr
|
||||
log.Printf("%v", cp.Args)
|
||||
if err := cp.Run(); err != nil {
|
||||
log.Fatalf("%v: %v", cp.Args, err)
|
||||
}
|
||||
|
||||
case "raspberrypi":
|
||||
// copy all dtb and dtbos (+ overlay_map) to buildresult
|
||||
dtbs, err := filepath.Glob("arch/arm64/boot/dts/broadcom/*.dtb")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, fn := range dtbs {
|
||||
if err := copyFile(filepath.Join("/tmp/buildresult/", filepath.Base(fn)), fn); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
dtbos, err := filepath.Glob("arch/arm64/boot/dts/overlays/*.dtbo")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
dtbos = append(dtbos, "arch/arm64/boot/dts/overlays/overlay_map.dtb")
|
||||
if err := os.MkdirAll("/tmp/buildresult/overlays", 0755); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
for _, fn := range dtbos {
|
||||
if err := copyFile(filepath.Join("/tmp/buildresult/overlays/", filepath.Base(fn)), fn); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if err := copyFile("/tmp/buildresult/vmlinuz", "arch/x86/boot/bzImage"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
@ -1,245 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const dockerFileContents = `
|
||||
FROM debian:bullseye
|
||||
|
||||
RUN apt-get update && apt-get install -y crossbuild-essential-arm64 bc libssl-dev bison flex
|
||||
|
||||
COPY gokr-build-kernel /usr/bin/gokr-build-kernel
|
||||
{{- range $idx, $path := .Patches }}
|
||||
COPY {{ $path }} /usr/src/{{ $path }}
|
||||
{{- end }}
|
||||
|
||||
RUN echo 'builduser:x:{{ .Uid }}:{{ .Gid }}:nobody:/:/bin/sh' >> /etc/passwd && \
|
||||
chown -R {{ .Uid }}:{{ .Gid }} /usr/src
|
||||
|
||||
USER builduser
|
||||
WORKDIR /usr/src
|
||||
ENTRYPOINT /usr/bin/gokr-build-kernel
|
||||
`
|
||||
|
||||
var dockerFileTmpl = template.Must(template.New("dockerfile").
|
||||
Funcs(map[string]interface{}{
|
||||
"basename": func(path string) string {
|
||||
return filepath.Base(path)
|
||||
},
|
||||
}).
|
||||
Parse(dockerFileContents))
|
||||
|
||||
var patchFiles = []string{
|
||||
// "0001-ODROID-XU4-regulator-s2mps11-call-shutdown-function-.patch",
|
||||
// "0002-ODROID-XU4-regulator-s2mps11-add-ethernet-power-rese.patch",
|
||||
}
|
||||
|
||||
func copyFile(dest, src string) error {
|
||||
out, err := os.Create(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
in, err := os.Open(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
if _, err := io.Copy(out, in); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
st, err := in.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := out.Chmod(st.Mode()); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
|
||||
var gopath = mustGetGopath()
|
||||
|
||||
func mustGetGopath() string {
|
||||
gopathb, err := exec.Command("go", "env", "GOPATH").Output()
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
return strings.TrimSpace(string(gopathb))
|
||||
}
|
||||
|
||||
func find(filename string) (string, error) {
|
||||
if _, err := os.Stat(filename); err == nil {
|
||||
return filename, nil
|
||||
}
|
||||
|
||||
path := filepath.Join(gopath, "src", "github.com", "anupcshan", "gokrazy-rock64-kernel", filename)
|
||||
if _, err := os.Stat(path); err == nil {
|
||||
return path, nil
|
||||
}
|
||||
|
||||
return "", fmt.Errorf("could not find file %q (looked in . and %s)", filename, path)
|
||||
}
|
||||
|
||||
func getContainerExecutable() (string, error) {
|
||||
// Probe podman first, because the docker binary might actually
|
||||
// be a thin podman wrapper with podman behavior.
|
||||
choices := []string{"podman", "docker"}
|
||||
for _, exe := range choices {
|
||||
p, err := exec.LookPath(exe)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
resolved, err := filepath.EvalSymlinks(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resolved, nil
|
||||
}
|
||||
return "", fmt.Errorf("none of %v found in $PATH", choices)
|
||||
}
|
||||
|
||||
func main() {
|
||||
var overwriteContainerExecutable = flag.String("overwrite_container_executable",
|
||||
"",
|
||||
"E.g. docker or podman to overwrite the automatically detected container executable")
|
||||
flag.Parse()
|
||||
executable, err := getContainerExecutable()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
if *overwriteContainerExecutable != "" {
|
||||
executable = *overwriteContainerExecutable
|
||||
}
|
||||
execName := filepath.Base(executable)
|
||||
// We explicitly use /tmp, because Docker only allows volume mounts under
|
||||
// certain paths on certain platforms, see
|
||||
// e.g. https://docs.docker.com/docker-for-mac/osxfs/#namespaces for macOS.
|
||||
tmp, err := ioutil.TempDir("/tmp", "gokr-rebuild-kernel")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer os.RemoveAll(tmp)
|
||||
|
||||
cmd := exec.Command("go", "install", "github.com/anupcshan/gokrazy-rock64-kernel/cmd/gokr-build-kernel")
|
||||
cmd.Env = append(os.Environ(), "GOOS=linux", "CGO_ENABLED=0", "GOBIN="+tmp)
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatalf("%v: %v", cmd.Args, err)
|
||||
}
|
||||
|
||||
buildPath := filepath.Join(tmp, "gokr-build-kernel")
|
||||
|
||||
var patchPaths []string
|
||||
for _, filename := range patchFiles {
|
||||
path, err := find(filename)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
patchPaths = append(patchPaths, path)
|
||||
}
|
||||
|
||||
kernelPath, err := find("vmlinuz")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
dtbPath, err := find("rk3328-rock64.dtb")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Copy all files into the temporary directory so that docker
|
||||
// includes them in the build context.
|
||||
for _, path := range patchPaths {
|
||||
if err := copyFile(filepath.Join(tmp, filepath.Base(path)), path); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
u, err := user.Current()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
dockerFile, err := os.Create(filepath.Join(tmp, "Dockerfile"))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := dockerFileTmpl.Execute(dockerFile, struct {
|
||||
Uid string
|
||||
Gid string
|
||||
BuildPath string
|
||||
Patches []string
|
||||
}{
|
||||
Uid: u.Uid,
|
||||
Gid: u.Gid,
|
||||
BuildPath: buildPath,
|
||||
Patches: patchFiles,
|
||||
}); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := dockerFile.Close(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
log.Printf("building %s container for kernel compilation", execName)
|
||||
|
||||
dockerBuild := exec.Command(execName,
|
||||
"build",
|
||||
"--rm=true",
|
||||
"--tag=gokr-rebuild-kernel",
|
||||
".")
|
||||
dockerBuild.Dir = tmp
|
||||
dockerBuild.Stdout = os.Stdout
|
||||
dockerBuild.Stderr = os.Stderr
|
||||
if err := dockerBuild.Run(); err != nil {
|
||||
log.Fatalf("%s build: %v (cmd: %v)", execName, err, dockerBuild.Args)
|
||||
}
|
||||
|
||||
log.Printf("compiling kernel")
|
||||
|
||||
var dockerRun *exec.Cmd
|
||||
if execName == "podman" {
|
||||
dockerRun = exec.Command(executable,
|
||||
"run",
|
||||
"--userns=keep-id",
|
||||
"--rm",
|
||||
"--volume", tmp+":/tmp/buildresult:Z",
|
||||
"gokr-rebuild-kernel")
|
||||
} else {
|
||||
dockerRun = exec.Command(executable,
|
||||
"run",
|
||||
"--rm",
|
||||
"--volume", tmp+":/tmp/buildresult:Z",
|
||||
"gokr-rebuild-kernel")
|
||||
}
|
||||
dockerRun.Dir = tmp
|
||||
dockerRun.Stdout = os.Stdout
|
||||
dockerRun.Stderr = os.Stderr
|
||||
if err := dockerRun.Run(); err != nil {
|
||||
log.Fatalf("%s run: %v (cmd: %v)", execName, err, dockerRun.Args)
|
||||
}
|
||||
|
||||
if err := copyFile(kernelPath, filepath.Join(tmp, "vmlinuz")); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
if err := copyFile(dtbPath, filepath.Join(tmp, "rk3328-rock64.dtb")); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
345
cmd/gokr-rebuild-kernel/rebuildkernel.go
Normal file
345
cmd/gokr-rebuild-kernel/rebuildkernel.go
Normal file
@ -0,0 +1,345 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"os/user"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
const dockerFileContents = `
|
||||
FROM debian:bookworm
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
{{ if (eq .Cross "arm64") -}}
|
||||
crossbuild-essential-arm64 \
|
||||
{{ end -}}
|
||||
build-essential bc libssl-dev bison flex libelf-dev ncurses-dev ca-certificates zstd kmod python3
|
||||
|
||||
COPY gokr-rebuild-kernel /usr/bin/gokr-rebuild-kernel
|
||||
COPY config.addendum.txt /usr/src/config.addendum.txt
|
||||
{{- range $idx, $path := .Patches }}
|
||||
COPY {{ $path }} /usr/src/{{ $path }}
|
||||
{{- end }}
|
||||
|
||||
RUN echo 'builduser:x:{{ .Uid }}:{{ .Gid }}:nobody:/:/bin/sh' >> /etc/passwd && \
|
||||
chown -R {{ .Uid }}:{{ .Gid }} /usr/src
|
||||
|
||||
USER builduser
|
||||
WORKDIR /usr/src
|
||||
ENV GOKRAZY_IN_DOCKER=1
|
||||
ENTRYPOINT ["/usr/bin/gokr-rebuild-kernel"]
|
||||
`
|
||||
|
||||
var dockerFileTmpl = template.Must(template.New("dockerfile").
|
||||
Funcs(map[string]interface{}{
|
||||
"basename": func(path string) string {
|
||||
return filepath.Base(path)
|
||||
},
|
||||
}).
|
||||
Parse(dockerFileContents))
|
||||
|
||||
func copyFile(dest, src string) error {
|
||||
log.Printf("copyFile(dest=%s, src=%s)", dest, src)
|
||||
out, err := os.Create(dest)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
in, err := os.Open(src)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
n, err := io.Copy(out, in)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf(" -> %d bytes copied", n)
|
||||
|
||||
st, err := in.Stat()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := out.Chmod(st.Mode()); err != nil {
|
||||
return err
|
||||
}
|
||||
return out.Close()
|
||||
}
|
||||
|
||||
func find(filename string) (string, error) {
|
||||
if _, err := os.Stat(filename); err == nil {
|
||||
return filename, nil
|
||||
}
|
||||
|
||||
return "", fmt.Errorf("could not find file %q", filename)
|
||||
}
|
||||
|
||||
func getContainerExecutable() (string, error) {
|
||||
// Probe podman first, because the docker binary might actually
|
||||
// be a thin podman wrapper with podman behavior.
|
||||
choices := []string{"podman", "docker"}
|
||||
for _, exe := range choices {
|
||||
p, err := exec.LookPath(exe)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
resolved, err := filepath.EvalSymlinks(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return resolved, nil
|
||||
}
|
||||
return "", fmt.Errorf("none of %v found in $PATH", choices)
|
||||
}
|
||||
|
||||
func rebuildKernel() error {
|
||||
overwriteContainerExecutable := flag.String("overwrite_container_executable",
|
||||
"",
|
||||
"E.g. docker or podman to overwrite the automatically detected container executable")
|
||||
|
||||
keepBuildContainer := flag.Bool("keep_build_container",
|
||||
false,
|
||||
"do not delete build container after building the kernel")
|
||||
|
||||
cross := flag.String("cross",
|
||||
"",
|
||||
"if non-empty, cross-compile for the specified arch (one of 'arm64')")
|
||||
|
||||
flavor := flag.String("flavor",
|
||||
"vanilla",
|
||||
"which kernel flavor to build. one of vanilla (kernel.org) or raspberrypi (https://github.com/raspberrypi/linux/tags)")
|
||||
|
||||
dtbs := flag.String("dtbs",
|
||||
"raspberrypi",
|
||||
"which device tree files (.dtb files) to copy. 'raspberrypi' or empty")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
if *cross != "" && *cross != "arm64" {
|
||||
return fmt.Errorf("invalid -cross value %q: expected one of 'arm64'")
|
||||
}
|
||||
|
||||
abs, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !strings.HasSuffix(strings.TrimSuffix(abs, "/"), "/_build") {
|
||||
return fmt.Errorf("gokr-rebuild-kernel is not run from a _build directory")
|
||||
}
|
||||
|
||||
series, err := os.ReadFile("series")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
patches := strings.Split(strings.TrimSpace(string(series)), "\n")
|
||||
|
||||
executable, err := getContainerExecutable()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if *overwriteContainerExecutable != "" {
|
||||
executable = *overwriteContainerExecutable
|
||||
}
|
||||
|
||||
execName := filepath.Base(executable)
|
||||
|
||||
var patchPaths []string
|
||||
for _, filename := range patches {
|
||||
path, err := find(filename)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
patchPaths = append(patchPaths, path)
|
||||
}
|
||||
|
||||
kernelPath, err := find("../vmlinuz")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
libPath, err := find("../lib")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO: just ensure the file exists, i.e. we are in _build
|
||||
if _, err := find("config.addendum.txt"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
u, err := user.Current()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
upstreamURL, err := os.ReadFile("upstream-url.txt")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dockerFile, err := os.Create("Dockerfile")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := dockerFileTmpl.Execute(dockerFile, struct {
|
||||
Uid string
|
||||
Gid string
|
||||
Patches []string
|
||||
Cross string
|
||||
}{
|
||||
Uid: u.Uid,
|
||||
Gid: u.Gid,
|
||||
Patches: patches,
|
||||
Cross: *cross,
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := dockerFile.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("building %s container for kernel compilation", execName)
|
||||
|
||||
dockerBuild := exec.Command(execName,
|
||||
"build",
|
||||
// "--platform=linux/amd64",
|
||||
"--rm=true",
|
||||
"--tag=gokr-rebuild-kernel",
|
||||
".")
|
||||
dockerBuild.Stdout = os.Stdout
|
||||
dockerBuild.Stderr = os.Stderr
|
||||
log.Printf("%v", dockerBuild.Args)
|
||||
if err := dockerBuild.Run(); err != nil {
|
||||
return fmt.Errorf("%s build: %v (cmd: %v)", execName, err, dockerBuild.Args)
|
||||
}
|
||||
|
||||
log.Printf("compiling kernel")
|
||||
|
||||
var dockerRun *exec.Cmd
|
||||
|
||||
dockerArgs := []string{
|
||||
"run",
|
||||
// "--platform=linux/amd64",
|
||||
"--volume", abs + ":/tmp/buildresult:Z",
|
||||
}
|
||||
|
||||
if !*keepBuildContainer {
|
||||
dockerArgs = append(dockerArgs, "--rm")
|
||||
}
|
||||
if execName == "podman" {
|
||||
dockerArgs = append(dockerArgs, "--userns=keep-id")
|
||||
}
|
||||
dockerArgs = append(dockerArgs,
|
||||
"gokr-rebuild-kernel",
|
||||
"-cross="+*cross,
|
||||
"-flavor="+*flavor,
|
||||
strings.TrimSpace(string(upstreamURL)))
|
||||
|
||||
dockerRun = exec.Command(executable, dockerArgs...)
|
||||
|
||||
dockerRun.Stdout = os.Stdout
|
||||
dockerRun.Stderr = os.Stderr
|
||||
log.Printf("%v", dockerRun.Args)
|
||||
if err := dockerRun.Run(); err != nil {
|
||||
return fmt.Errorf("%s run: %v (cmd: %v)", execName, err, dockerRun.Args)
|
||||
}
|
||||
|
||||
if err := copyFile(kernelPath, "vmlinuz"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// remove symlinks that only work when source/build directory are present
|
||||
for _, subdir := range []string{"build", "source"} {
|
||||
matches, err := filepath.Glob(filepath.Join("lib/modules", "*", subdir))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, match := range matches {
|
||||
log.Printf("removing build/source symlink %s", match)
|
||||
if err := os.Remove(match); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// replace kernel modules directory
|
||||
rm := exec.Command("rm", "-rf", filepath.Join(libPath, "modules"))
|
||||
rm.Stdout = os.Stdout
|
||||
rm.Stderr = os.Stderr
|
||||
log.Printf("%v", rm.Args)
|
||||
if err := rm.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", rm.Args, err)
|
||||
}
|
||||
cp := exec.Command("cp", "-r", filepath.Join("lib/modules"), libPath)
|
||||
cp.Stdout = os.Stdout
|
||||
cp.Stderr = os.Stderr
|
||||
log.Printf("%v", cp.Args)
|
||||
if err := cp.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", cp.Args, err)
|
||||
}
|
||||
|
||||
if *cross == "arm64" {
|
||||
if *dtbs != "" {
|
||||
// replace device tree files
|
||||
rm = exec.Command("sh", "-c", "rm ../*.dtb")
|
||||
rm.Stdout = os.Stdout
|
||||
rm.Stderr = os.Stderr
|
||||
log.Printf("%v", rm.Args)
|
||||
if err := rm.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", rm.Args, err)
|
||||
}
|
||||
cp = exec.Command("sh", "-c", "cp *.dtb ..")
|
||||
cp.Stdout = os.Stdout
|
||||
cp.Stderr = os.Stderr
|
||||
log.Printf("%v", cp.Args)
|
||||
if err := cp.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", cp.Args, err)
|
||||
}
|
||||
}
|
||||
|
||||
if *flavor == "raspberrypi" {
|
||||
// replace overlays directory
|
||||
overlaysPath, err := find("../overlays")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
rm = exec.Command("rm", "-rf", overlaysPath)
|
||||
rm.Stdout = os.Stdout
|
||||
rm.Stderr = os.Stderr
|
||||
log.Printf("%v", rm.Args)
|
||||
if err := rm.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", rm.Args, err)
|
||||
}
|
||||
cp = exec.Command("cp", "-r", "overlays", overlaysPath)
|
||||
cp.Stdout = os.Stdout
|
||||
cp.Stderr = os.Stderr
|
||||
log.Printf("%v", cp.Args)
|
||||
if err := cp.Run(); err != nil {
|
||||
return fmt.Errorf("%v: %v", cp.Args, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
if os.Getenv("GOKRAZY_IN_DOCKER") == "1" {
|
||||
indockerMain()
|
||||
} else {
|
||||
if err := rebuildKernel(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
@ -14,11 +14,13 @@ import (
|
||||
)
|
||||
|
||||
const dockerFileContents = `
|
||||
FROM debian:bookworm
|
||||
FROM debian:buster
|
||||
|
||||
RUN apt-get update && apt-get install -y crossbuild-essential-arm64 bc libssl-dev bison flex git python3 python3-setuptools swig python3-dev python3-pyelftools
|
||||
RUN apt-get update && apt-get install -y crossbuild-essential-arm64 bc libssl-dev bison flex git python3 python3-setuptools swig python3-dev python3-pyelftools uuid-dev libgnutls28-dev
|
||||
|
||||
COPY gokr-build-uboot /usr/bin/gokr-build-uboot
|
||||
RUN mkdir -p /usr/src/atf.patches
|
||||
RUN mkdir -p /usr/src/uboot.patches
|
||||
{{- range $idx, $path := .Patches }}
|
||||
COPY {{ $path }} /usr/src/{{ $path }}
|
||||
{{- end }}
|
||||
@ -39,7 +41,15 @@ var dockerFileTmpl = template.Must(template.New("dockerfile").
|
||||
}).
|
||||
Parse(dockerFileContents))
|
||||
|
||||
var patchFiles = []string{"boot.cmd"}
|
||||
var ubootPatchFiles = []string{
|
||||
"uboot.patches/boot.cmd",
|
||||
"uboot.patches/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.16.bin",
|
||||
}
|
||||
var atfPatchFiles = []string{
|
||||
"atf.patches/feat-rk3588-support-rk3588.patch",
|
||||
"atf.patches/rk3588-enable-crypto-function.patch",
|
||||
"atf.patches/feat-rockchip-support-SCMI-for-clock-reset-domain.patch",
|
||||
}
|
||||
|
||||
func copyFile(dest, src string) error {
|
||||
out, err := os.Create(dest)
|
||||
@ -83,7 +93,7 @@ func find(filename string) (string, error) {
|
||||
return filename, nil
|
||||
}
|
||||
|
||||
path := filepath.Join(gopath, "src", "github.com", "anupcshan", "gokrazy-rock64-kernel", filename)
|
||||
path := filepath.Join(gopath, "src", "gitea.narnian.us", "lordwelch", "gokrazy-cm3588-kernel", filename)
|
||||
if _, err := os.Stat(path); err == nil {
|
||||
return path, nil
|
||||
}
|
||||
@ -131,8 +141,8 @@ func main() {
|
||||
}
|
||||
defer os.RemoveAll(tmp)
|
||||
|
||||
cmd := exec.Command("go", "install", "github.com/anupcshan/gokrazy-rock64-kernel/cmd/gokr-build-uboot")
|
||||
cmd.Env = append(os.Environ(), "GOOS=linux", "CGO_ENABLED=0", "GOBIN="+tmp)
|
||||
cmd := exec.Command("go", "build", "-o", tmp, "gitea.narnian.us/lordwelch/gokrazy-cm3588-kernel/cmd/gokr-build-uboot")
|
||||
cmd.Env = append(os.Environ(), "GOOS=linux", "CGO_ENABLED=0")
|
||||
cmd.Stderr = os.Stderr
|
||||
if err := cmd.Run(); err != nil {
|
||||
log.Fatalf("%v: %v", cmd.Args, err)
|
||||
@ -141,7 +151,8 @@ func main() {
|
||||
buildPath := filepath.Join(tmp, "gokr-build-uboot")
|
||||
|
||||
var patchPaths []string
|
||||
for _, filename := range patchFiles {
|
||||
|
||||
for _, filename := range ubootPatchFiles {
|
||||
path, err := find(filename)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@ -149,10 +160,37 @@ func main() {
|
||||
patchPaths = append(patchPaths, path)
|
||||
}
|
||||
|
||||
err = os.MkdirAll(filepath.Join(tmp, "uboot.patches"), 0750)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
// Copy all files into the temporary directory so that docker
|
||||
// includes them in the build context.
|
||||
for _, path := range patchPaths {
|
||||
if err := copyFile(filepath.Join(tmp, filepath.Base(path)), path); err != nil {
|
||||
if err = copyFile(filepath.Join(tmp, "uboot.patches", filepath.Base(path)), path); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
patchPaths = patchPaths[0:0]
|
||||
for _, filename := range atfPatchFiles {
|
||||
path, err := find(filename)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
patchPaths = append(patchPaths, path)
|
||||
}
|
||||
|
||||
|
||||
err = os.MkdirAll(filepath.Join(tmp, "atf.patches"), 0750)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
// Copy all files into the temporary directory so that docker
|
||||
// includes them in the build context.
|
||||
for _, path := range patchPaths {
|
||||
if err := copyFile(filepath.Join(tmp, "atf.patches", filepath.Base(path)), path); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
@ -175,7 +213,7 @@ func main() {
|
||||
Uid: u.Uid,
|
||||
Gid: u.Gid,
|
||||
BuildPath: buildPath,
|
||||
Patches: patchFiles,
|
||||
Patches: append(atfPatchFiles, ubootPatchFiles...),
|
||||
}); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
2
go.mod
2
go.mod
@ -1,3 +1,3 @@
|
||||
module github.com/anupcshan/gokrazy-rock64-kernel
|
||||
module gitea.narnian.us/lordwelch/gokrazy-cm3588-kernel
|
||||
|
||||
go 1.22
|
||||
|
Binary file not shown.
BIN
rk3588-friendlyelec-cm3588-nas.dtb
Normal file
BIN
rk3588-friendlyelec-cm3588-nas.dtb
Normal file
Binary file not shown.
Binary file not shown.
@ -16,7 +16,7 @@ setexpr.s bootargs *${ramdisk_addr_r}
|
||||
echo "Boot args: ${bootargs}"
|
||||
|
||||
# Load dtb
|
||||
setenv fdtfile rk3328-rock64.dtb
|
||||
setenv fdtfile rk3588-friendlyelec-cm3588-nas.dtb
|
||||
load ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} ${fdtfile}
|
||||
# ... and set fdt addr to it.
|
||||
fdt addr ${fdt_addr_r}
|
BIN
uboot.patches/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.16.bin
Normal file
BIN
uboot.patches/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.16.bin
Normal file
Binary file not shown.
Reference in New Issue
Block a user