Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Procedures for drawing on the screen early on in the boot process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Benjamin Herrenschmidt <benh@kernel.crashing.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <linux/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <asm/sections.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <asm/prom.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/btext.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <asm/mmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #include <asm/udbg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) static void scrollscreen(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) #define __force_data __section(".data")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) static int g_loc_X __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) static int g_loc_Y __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) static int g_max_loc_X __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) static int g_max_loc_Y __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) static int dispDeviceRowBytes __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) static int dispDeviceDepth  __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) static int dispDeviceRect[4] __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) static unsigned char *dispDeviceBase __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) static unsigned char *logicalDisplayBase __force_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) unsigned long disp_BAT[2] __initdata = {0, 0};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) #define cmapsz	(16*256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) static unsigned char vga_font[cmapsz];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) int boot_text_mapped __force_data = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) int force_printk_to_btext = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) extern void rmci_on(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) extern void rmci_off(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) static inline void rmci_maybe_on(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	if (!(mfmsr() & MSR_DR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		rmci_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) static inline void rmci_maybe_off(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) #if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	if (!(mfmsr() & MSR_DR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		rmci_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #ifdef CONFIG_PPC32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) /* Calc BAT values for mapping the display and store them
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  * in disp_BAT.  Those values are then used from head.S to map
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * the display during identify_machine() and MMU_Init()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  * The display is mapped to virtual address 0xD0000000, rather
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  * than 1:1, because some some CHRP machines put the frame buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  * in the region starting at 0xC0000000 (PAGE_OFFSET).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  * This mapping is temporary and will disappear as soon as the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * setup done by MMU_Init() is applied.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  * For now, we align the BAT and then map 8Mb on 601 and 16Mb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  * on other PPCs. This may cause trouble if the framebuffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  * is really badly aligned, but I didn't encounter this case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  * yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) void __init btext_prepare_BAT(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	unsigned long vaddr = PAGE_OFFSET + 0x10000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	unsigned long addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	unsigned long lowbits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	addr = (unsigned long)dispDeviceBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	if (!addr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	lowbits = addr & ~0xFF000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	addr &= 0xFF000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 	disp_BAT[0] = vaddr | (BL_16M<<2) | 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	disp_BAT[1] = addr | (_PAGE_NO_CACHE | _PAGE_GUARDED | BPP_RW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	logicalDisplayBase = (void *) (vaddr + lowbits);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) /* This function can be used to enable the early boot text when doing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)  * OF booting or within bootx init. It must be followed by a btext_unmap()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)  * call before the logical address becomes unusable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) void __init btext_setup_display(int width, int height, int depth, int pitch,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 				unsigned long address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	logicalDisplayBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	dispDeviceBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	dispDeviceDepth = depth == 15 ? 16 : depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	dispDeviceRect[0] = dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 	boot_text_mapped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) void __init btext_unmap(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /* Here's a small text engine to use during early boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)  * or for debugging purposes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)  * todo:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)  *  - build some kind of vgacon with it to enable early printk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)  *  - move to a separate file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)  *  - add a few video driver hooks to keep in sync with display
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)  *    changes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) void btext_map(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	unsigned long base, offset, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	unsigned char *vbase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	/* By default, we are no longer mapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	if (!dispDeviceBase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	base = ((unsigned long) dispDeviceBase) & 0xFFFFF000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	offset = ((unsigned long) dispDeviceBase) - base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	size = dispDeviceRowBytes * dispDeviceRect[3] + offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		+ dispDeviceRect[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	vbase = ioremap_wc(base, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	if (!vbase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	logicalDisplayBase = vbase + offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	boot_text_mapped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static int btext_initialize(struct device_node *np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	unsigned int width, height, depth, pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	unsigned long address = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	const u32 *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	prop = of_get_property(np, "linux,bootx-width", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		prop = of_get_property(np, "width", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	width = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	prop = of_get_property(np, "linux,bootx-height", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		prop = of_get_property(np, "height", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	height = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	prop = of_get_property(np, "linux,bootx-depth", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		prop = of_get_property(np, "depth", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	depth = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	pitch = width * ((depth + 7) / 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	prop = of_get_property(np, "linux,bootx-linebytes", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		prop = of_get_property(np, "linebytes", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	if (prop && *prop != 0xffffffffu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		pitch = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	if (pitch == 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 		pitch = 0x1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	prop = of_get_property(np, "linux,bootx-addr", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	if (prop == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		prop = of_get_property(np, "address", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	if (prop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		address = *prop;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	/* FIXME: Add support for PCI reg properties. Right now, only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	 * reliable on macs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	if (address == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	dispDeviceBase = (unsigned char *)address;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	dispDeviceDepth = depth == 15 ? 16 : depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	dispDeviceRect[0] = dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	btext_map();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int __init btext_find_display(int allow_nonstdout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	struct device_node *np = of_stdout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	int rc = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	if (!of_node_is_type(np, "display")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		printk("boot stdout isn't a display !\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		np = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	if (np)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		rc = btext_initialize(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	if (rc == 0 || !allow_nonstdout)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	for_each_node_by_type(np, "display") {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		if (of_get_property(np, "linux,opened", NULL)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 			printk("trying %pOF ...\n", np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 			rc = btext_initialize(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 			printk("result: %d\n", rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		if (rc == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 			of_node_put(np);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) /* Calc the base address of a given point (x,y) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) static unsigned char * calc_base(int x, int y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	unsigned char *base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	base = logicalDisplayBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	if (!base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		base = dispDeviceBase;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	base += (x + dispDeviceRect[0]) * (dispDeviceDepth >> 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	base += (y + dispDeviceRect[1]) * dispDeviceRowBytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	return base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* Adjust the display to a new resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) void btext_update_display(unsigned long phys, int width, int height,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 			  int depth, int pitch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	if (!dispDeviceBase)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	/* check it's the same frame buffer (within 256MB) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	if ((phys ^ (unsigned long)dispDeviceBase) & 0xf0000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	dispDeviceBase = (__u8 *) phys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	dispDeviceRect[0] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	dispDeviceRect[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	dispDeviceRect[2] = width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	dispDeviceRect[3] = height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	dispDeviceDepth = depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	dispDeviceRowBytes = pitch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	if (boot_text_mapped) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 		iounmap(logicalDisplayBase);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		boot_text_mapped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	btext_map();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	g_max_loc_X = width / 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	g_max_loc_Y = height / 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) EXPORT_SYMBOL(btext_update_display);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) void btext_clearscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	unsigned int *base	= (unsigned int *)calc_base(0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 					(dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 	rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 			*(ptr++) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) void btext_flushscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	unsigned int *base	= (unsigned int *)calc_base(0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 					(dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	for (i=0; i < (dispDeviceRect[3] - dispDeviceRect[1]); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 		unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 		for(j = width; j > 0; j -= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 			ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	__asm__ __volatile__ ("sync" ::: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) void btext_flushline(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	unsigned int *base	= (unsigned int *)calc_base(0, g_loc_Y << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	unsigned long width 	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 					(dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	for (i=0; i < 16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 		unsigned int *ptr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 		for(j = width; j > 0; j -= 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 			__asm__ __volatile__ ("dcbst 0,%0" :: "r" (ptr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 			ptr += 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 		base += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	__asm__ __volatile__ ("sync" ::: "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) static void scrollscreen(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	unsigned int *src     	= (unsigned int *)calc_base(0,16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	unsigned int *dst     	= (unsigned int *)calc_base(0,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	unsigned long width    	= ((dispDeviceRect[2] - dispDeviceRect[0]) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 				   (dispDeviceDepth >> 3)) >> 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	int i,j;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 		unsigned int *src_ptr = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 		unsigned int *dst_ptr = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 		for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 			*(dst_ptr++) = *(src_ptr++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 		src += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 		dst += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	for (i=0; i<16; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		unsigned int *dst_ptr = dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		for(j=width; j; --j)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 			*(dst_ptr++) = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		dst += (dispDeviceRowBytes >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #endif /* ndef NO_SCROLL */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) static unsigned int expand_bits_8[16] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	0x000000ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	0x0000ff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	0x0000ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	0x00ff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	0x00ff00ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 	0x00ffff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	0x00ffffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 	0xff000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	0xff0000ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	0xff00ff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	0xff00ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	0xffff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	0xffff00ff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	0xffffff00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	0xffffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) static unsigned int expand_bits_16[4] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 	0x00000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 	0x0000ffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	0xffff0000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	0xffffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	int fg = 0xFFFFFFFFUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 		base[0] = (-(bits >> 7) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 		base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 		base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 		base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 		base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 		base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		base[7] = (-(bits & 1) & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 		base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) static inline void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	int fg = 0xFFFFFFFFUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	unsigned int *eb = (int *)expand_bits_16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 		bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 		base[0] = (eb[bits >> 6] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 		base[3] = (eb[bits & 3] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 		base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) static inline void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	int l, bits;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	int fg = 0x0F0F0F0FUL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	int bg = 0x00000000UL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	unsigned int *eb = (int *)expand_bits_8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	for (l = 0; l < 16; ++l)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 		bits = *font++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 		base[0] = (eb[bits >> 4] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 		base[1] = (eb[bits & 0xf] & fg) ^ bg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 		base = (unsigned int *) ((char *)base + rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) static noinline void draw_byte(unsigned char c, long locX, long locY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	unsigned char *base	= calc_base(locX << 3, locY << 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	unsigned char *font	= &vga_font[((unsigned int)c) * 16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	int rb			= dispDeviceRowBytes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	rmci_maybe_on();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	switch(dispDeviceDepth) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 		draw_byte_32(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 	case 15:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 	case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 		draw_byte_16(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 		draw_byte_8(font, (unsigned int *)base, rb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	rmci_maybe_off();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) void btext_drawchar(char c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	int cline = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) #ifdef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	int x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 	if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 	switch (c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 	case '\b':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 		if (g_loc_X > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 			--g_loc_X;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 	case '\t':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 		g_loc_X = (g_loc_X & -8) + 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	case '\r':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 		g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	case '\n':
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 		g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 		g_loc_Y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 		cline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 		break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 		draw_byte(c, g_loc_X++, g_loc_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	if (g_loc_X >= g_max_loc_X) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 		g_loc_X = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 		g_loc_Y++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 		cline = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #ifndef NO_SCROLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 	while (g_loc_Y >= g_max_loc_Y) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 		scrollscreen();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 		g_loc_Y--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	/* wrap around from bottom to top of screen so we don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 	   waste time scrolling each line.  -- paulus. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	if (g_loc_Y >= g_max_loc_Y)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 		g_loc_Y = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 	if (cline) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 		for (x = 0; x < g_max_loc_X; ++x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 			draw_byte(' ', x, g_loc_Y);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) void btext_drawstring(const char *c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	while (*c)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 		btext_drawchar(*c++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) void btext_drawtext(const char *c, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	while (len--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 		btext_drawchar(*c++);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) void btext_drawhex(unsigned long v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	if (!boot_text_mapped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #ifdef CONFIG_PPC64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	btext_drawchar(hex_asc_hi(v >> 56));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	btext_drawchar(hex_asc_lo(v >> 56));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	btext_drawchar(hex_asc_hi(v >> 48));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	btext_drawchar(hex_asc_lo(v >> 48));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	btext_drawchar(hex_asc_hi(v >> 40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	btext_drawchar(hex_asc_lo(v >> 40));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	btext_drawchar(hex_asc_hi(v >> 32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 	btext_drawchar(hex_asc_lo(v >> 32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	btext_drawchar(hex_asc_hi(v >> 24));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	btext_drawchar(hex_asc_lo(v >> 24));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	btext_drawchar(hex_asc_hi(v >> 16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 	btext_drawchar(hex_asc_lo(v >> 16));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 	btext_drawchar(hex_asc_hi(v >> 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	btext_drawchar(hex_asc_lo(v >> 8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	btext_drawchar(hex_asc_hi(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 	btext_drawchar(hex_asc_lo(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	btext_drawchar(' ');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) void __init udbg_init_btext(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	/* If btext is enabled, we might have a BAT setup for early display,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	 * thus we do enable some very basic udbg output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 	udbg_putc = btext_drawchar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) static unsigned char vga_font[cmapsz] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81, 0x81, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 0x99, 0x81, 0x81, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 0xdb, 0xff, 0xff, 0xc3, 0xe7, 0xff, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 0x00, 0x00, 0x00, 0x00, 0x6c, 0xfe, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 0x7c, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 0x3c, 0x3c, 0xe7, 0xe7, 0xe7, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 0x00, 0x00, 0x00, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x7e, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x99, 0xbd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 0xbd, 0x99, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x1e, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 0x1a, 0x32, 0x78, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 0x00, 0x00, 0x3c, 0x66, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x33, 0x3f, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 0x30, 0x70, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 0x7f, 0x63, 0x63, 0x63, 0x63, 0x67, 0xe7, 0xe6, 0xc0, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 0x00, 0x00, 0x00, 0x18, 0x18, 0xdb, 0x3c, 0xe7, 0x3c, 0xdb, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfe, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 0x1e, 0x3e, 0xfe, 0x3e, 0x1e, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 0x66, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 0x00, 0x7c, 0xc6, 0x60, 0x38, 0x6c, 0xc6, 0xc6, 0x6c, 0x38, 0x0c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 0x7e, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 0x00, 0x00, 0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 0x18, 0x7e, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 0xc0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x38, 0x7c, 0x7c, 0xfe, 0xfe, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 0x38, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x24, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 0x6c, 0xfe, 0x6c, 0x6c, 0x6c, 0xfe, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 0x18, 0x18, 0x7c, 0xc6, 0xc2, 0xc0, 0x7c, 0x06, 0x06, 0x86, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, 0xc6, 0x0c, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 0x30, 0x60, 0xc6, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 0x00, 0x30, 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 0x30, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0x78, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 0x18, 0x18, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 0x00, 0x00, 0x7c, 0xc6, 0x06, 0x06, 0x3c, 0x06, 0x06, 0x06, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x1c, 0x3c, 0x6c, 0xcc, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 0x0c, 0x0c, 0x0c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 0x00, 0x00, 0x38, 0x60, 0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x06, 0x06, 0x0c, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x06, 0x06, 0x0c, 0x78,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 0x18, 0x18, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 0x00, 0x00, 0x00, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 0x30, 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0x0c, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xde, 0xde,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 0xde, 0xdc, 0xc0, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x66, 0x66, 0x66, 0x66, 0xfc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0xc2, 0xc0, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 0xc0, 0xc2, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68, 0x60, 0x62, 0x66, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x66, 0x62, 0x68, 0x78, 0x68,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 0xc2, 0xc0, 0xc0, 0xde, 0xc6, 0xc6, 0x66, 0x3a, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 0x0c, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 0x00, 0x00, 0xe6, 0x66, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0x66, 0xe6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x60, 0x60, 0x60, 0x60, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 0x60, 0x62, 0x66, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xe7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) 0xff, 0xff, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 0x00, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 0x66, 0x66, 0x7c, 0x60, 0x60, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 0x0c, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x7c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 0xc6, 0x60, 0x38, 0x0c, 0x06, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 0x00, 0x00, 0xff, 0xdb, 0x99, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 0x3c, 0x66, 0xc3, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 0x00, 0x00, 0xff, 0xc3, 0x86, 0x0c, 0x18, 0x30, 0x60, 0xc1, 0xc3, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x30, 0x30, 0x30, 0x30, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 0x30, 0x30, 0x30, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0x0e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 0x00, 0x00, 0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 0x60, 0x78, 0x6c, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc0, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x0c, 0x3c, 0x6c, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 0x00, 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xcc, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 0x60, 0x6c, 0x76, 0x66, 0x66, 0x66, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 0x00, 0x00, 0x18, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x0e, 0x06, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 0x06, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0xe0, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) 0x60, 0x66, 0x6c, 0x78, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 0x00, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xff, 0xdb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 0xdb, 0xdb, 0xdb, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 0x00, 0x76, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0x0c, 0x1e, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) 0x00, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x76, 0x66, 0x60, 0x60, 0x60, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 0x38, 0x0c, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 0x30, 0xfc, 0x30, 0x30, 0x30, 0x30, 0x36, 0x1c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 0xc3, 0x66, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 0x00, 0xc3, 0xc3, 0xc3, 0xdb, 0xdb, 0xff, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0xc3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 0x00, 0xfe, 0xcc, 0x18, 0x30, 0x60, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 0x00, 0x00, 0x0e, 0x18, 0x18, 0x18, 0x70, 0x18, 0x18, 0x18, 0x18, 0x0e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) 0x18, 0x18, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x70, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) 0x00, 0x00, 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 0xc6, 0xc6, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 0xc2, 0xc0, 0xc0, 0xc0, 0xc2, 0x66, 0x3c, 0x0c, 0x06, 0x7c, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 0x00, 0x00, 0xcc, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 0x00, 0x00, 0xcc, 0x00, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) 0x00, 0x00, 0x00, 0x00, 0x3c, 0x66, 0x60, 0x60, 0x66, 0x3c, 0x0c, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 0x00, 0x60, 0x30, 0x18, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0xc0, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x38, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3c, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) 0x00, 0x60, 0x30, 0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x10, 0x38, 0x6c, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) 0x18, 0x30, 0x60, 0x00, 0xfe, 0x66, 0x60, 0x7c, 0x60, 0x60, 0x66, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x3b, 0x1b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 0x7e, 0xd8, 0xdc, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 0xcc, 0xcc, 0xfe, 0xcc, 0xcc, 0xcc, 0xcc, 0xce, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 0x00, 0x10, 0x38, 0x6c, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x7c, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 0x00, 0x30, 0x78, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x76,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x30, 0x18, 0x00, 0xcc, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x06, 0x0c, 0x78, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 0x00, 0x00, 0x00, 0x00, 0x00, 0xc6, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 0xc3, 0xc0, 0xc0, 0xc0, 0xc3, 0x7e, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) 0x00, 0x38, 0x6c, 0x64, 0x60, 0xf0, 0x60, 0x60, 0x60, 0x60, 0xe6, 0xfc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x66, 0x3c, 0x18, 0xff, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 0xff, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 0x7c, 0x62, 0x66, 0x6f, 0x66, 0x66, 0x66, 0xf3, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) 0x00, 0x0e, 0x1b, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) 0xd8, 0x70, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0x78, 0x0c, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) 0x00, 0x18, 0x30, 0x60, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x00, 0xcc, 0xcc, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) 0x76, 0xdc, 0x00, 0xc6, 0xe6, 0xf6, 0xfe, 0xde, 0xce, 0xc6, 0xc6, 0xc6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6c, 0x6c, 0x3e, 0x00, 0x7e, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) 0x38, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) 0x00, 0x00, 0x30, 0x30, 0x00, 0x30, 0x30, 0x60, 0xc0, 0xc6, 0xc6, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) 0x00, 0x00, 0xfe, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30, 0x60, 0xce, 0x9b, 0x06,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) 0x0c, 0x1f, 0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc2, 0xc6, 0xcc, 0x18, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) 0x66, 0xce, 0x96, 0x3e, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) 0x00, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x3c, 0x18, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) 0x6c, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x44, 0x11, 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) 0x55, 0xaa, 0x55, 0xaa, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0xdd, 0x77, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x06, 0xf6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) 0x18, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) 0x18, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) 0x00, 0x76, 0xdc, 0xd8, 0xd8, 0xd8, 0xdc, 0x76, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) 0x00, 0x00, 0x78, 0xcc, 0xcc, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xc6, 0xc6, 0xc0, 0xc0, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) 0xc0, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) 0xfe, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) 0x00, 0x00, 0x00, 0xfe, 0xc6, 0x60, 0x30, 0x18, 0x30, 0x60, 0xc6, 0xfe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0xd8, 0xd8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) 0x66, 0x66, 0x66, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xc0, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x18, 0x3c, 0x66, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) 0x66, 0x3c, 0x18, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) 0x00, 0x00, 0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x6c, 0x6c, 0x6c, 0xee,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x18, 0x0c, 0x3e, 0x66,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) 0x66, 0x66, 0x66, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) 0x00, 0x7e, 0xdb, 0xdb, 0xdb, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) 0x00, 0x00, 0x00, 0x03, 0x06, 0x7e, 0xdb, 0xdb, 0xf3, 0x7e, 0x60, 0xc0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x30, 0x60, 0x60, 0x7c, 0x60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) 0x60, 0x60, 0x30, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) 0x18, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) 0x18, 0x0c, 0x06, 0x0c, 0x18, 0x30, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) 0x00, 0x00, 0x00, 0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x7e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x1b, 0x1b, 0x1b, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0xd8, 0x70, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) 0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6c, 0x6c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x6c, 0x3c, 0x1c, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) 0x00, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xd8, 0x30, 0x60, 0xc8, 0xf8, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)