From 30a0de23a11cebe2235b407903d2a10792e126f2 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sat, 2 Jan 2021 10:04:54 +0800 Subject: [PATCH 01/27] Add env. --- os/Makefile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/os/Makefile b/os/Makefile index 1d13cce..38b3c40 100644 --- a/os/Makefile +++ b/os/Makefile @@ -22,7 +22,13 @@ OBJCOPY := rust-objcopy --binary-architecture=riscv64 # Disassembly DISASM ?= -x -build: $(KERNEL_BIN) +build: env $(KERNEL_BIN) + +env: + rustup component add rust-src + rustup component add llvm-tools-preview + cargo install cargo-binutils + rustup target add riscv64gc-unknown-none-elf $(KERNEL_BIN): kernel @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ @@ -66,4 +72,4 @@ debug: build tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \ tmux -2 attach-session -d -.PHONY: build kernel clean disasm disasm-vim run-inner +.PHONY: build env kernel clean disasm disasm-vim run-inner From 87a3500b34128a538b80706ec88f753d21956cc1 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 3 Jan 2021 17:37:23 +0800 Subject: [PATCH 02/27] Remove meaningless sstatus::set_sie() when initializing. --- os/src/trap/context.rs | 2 -- os/src/trap/mod.rs | 6 ------ 2 files changed, 8 deletions(-) diff --git a/os/src/trap/context.rs b/os/src/trap/context.rs index 665f5fb..8c5175f 100644 --- a/os/src/trap/context.rs +++ b/os/src/trap/context.rs @@ -22,8 +22,6 @@ impl TrapContext { let mut sstatus = sstatus::read(); // set CPU privilege to User after trapping back sstatus.set_spp(SPP::User); - // enable Supervisor mode interrupt after trapping back - sstatus.set_spie(true); let mut cx = Self { x: [0; 32], sstatus, diff --git a/os/src/trap/mod.rs b/os/src/trap/mod.rs index 58881b1..4f5126b 100644 --- a/os/src/trap/mod.rs +++ b/os/src/trap/mod.rs @@ -10,7 +10,6 @@ use riscv::register::{ Interrupt, }, stval, - sstatus, sie, }; use crate::syscall::syscall; @@ -41,11 +40,6 @@ fn set_user_trap_entry() { } } -#[allow(unused)] -pub fn enable_interrupt() { - unsafe { sstatus::set_sie(); } -} - pub fn enable_timer_interrupt() { unsafe { sie::set_stimer(); } } From 5730bac89e45b6370243ae503c81ac83f833f63f Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Mon, 4 Jan 2021 16:18:25 +0800 Subject: [PATCH 03/27] Move some variable name to task_cx to task_cx_ptr2(ch5 ver). --- os/src/task/mod.rs | 4 ++-- os/src/task/processor.rs | 8 ++++---- os/src/task/switch.S | 5 ++++- os/src/task/switch.rs | 5 ++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index 1a74b4f..8c1bcc1 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -29,7 +29,7 @@ pub fn suspend_current_and_run_next() { let task = take_current_task().unwrap(); // ---- temporarily hold current PCB lock - let task_cx_ptr = task.acquire_inner_lock().get_task_cx_ptr2(); + let task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); // ---- release current PCB lock // ++++ temporarily hold current PCB lock @@ -40,7 +40,7 @@ pub fn suspend_current_and_run_next() { // push back to ready queue. add_task(task); // jump to scheduling cycle - schedule(task_cx_ptr); + schedule(task_cx_ptr2); } pub fn exit_current_and_run_next(exit_code: i32) { diff --git a/os/src/task/processor.rs b/os/src/task/processor.rs index 677d879..a08d5d6 100644 --- a/os/src/task/processor.rs +++ b/os/src/task/processor.rs @@ -33,16 +33,16 @@ impl Processor { pub fn run(&self) { loop { if let Some(task) = fetch_task() { - let idle_task_cx_ptr = self.get_idle_task_cx_ptr2(); + let idle_task_cx_ptr2 = self.get_idle_task_cx_ptr2(); // acquire - let next_task_cx_ptr = task.acquire_inner_lock().get_task_cx_ptr2(); + let next_task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); task.acquire_inner_lock().task_status = TaskStatus::Running; // release self.inner.lock().current = Some(task); unsafe { __switch( - idle_task_cx_ptr, - next_task_cx_ptr, + idle_task_cx_ptr2, + next_task_cx_ptr2, ); } } diff --git a/os/src/task/switch.S b/os/src/task/switch.S index df668f3..262511f 100644 --- a/os/src/task/switch.S +++ b/os/src/task/switch.S @@ -8,7 +8,10 @@ .section .text .globl __switch __switch: - # __switch(current_task_cx: &*const TaskContext, next_task_cx: &*const TaskContext) + # __switch( + # current_task_cx_ptr2: &*const TaskContext, + # next_task_cx_ptr2: &*const TaskContext + # ) # push TaskContext to current sp and save its address to where a0 points to addi sp, sp, -13*8 sd sp, 0(a0) diff --git a/os/src/task/switch.rs b/os/src/task/switch.rs index c5fe5f4..867fcb1 100644 --- a/os/src/task/switch.rs +++ b/os/src/task/switch.rs @@ -1,5 +1,8 @@ global_asm!(include_str!("switch.S")); extern "C" { - pub fn __switch(current_task_cx: *const usize, next_task_cx: *const usize); + pub fn __switch( + current_task_cx_ptr2: *const usize, + next_task_cx_ptr2: *const usize + ); } From 45a17c17255ac58aa0fc7c5c912e9fae31cd72b8 Mon Sep 17 00:00:00 2001 From: Yu Chen Date: Sat, 16 Jan 2021 19:26:02 +0800 Subject: [PATCH 04/27] rust-toochain --> nightly --- rust-toolchain | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-toolchain b/rust-toolchain index ae054b9..bf867e0 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2020-11-01 \ No newline at end of file +nightly From fad341d03d2d07775b2647d74ae354173c7335bd Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Thu, 21 Jan 2021 00:21:09 +0800 Subject: [PATCH 05/27] Fix os/Makefile: Support macOS --- os/Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/os/Makefile b/os/Makefile index 38b3c40..1732b23 100644 --- a/os/Makefile +++ b/os/Makefile @@ -25,10 +25,10 @@ DISASM ?= -x build: env $(KERNEL_BIN) env: - rustup component add rust-src - rustup component add llvm-tools-preview - cargo install cargo-binutils - rustup target add riscv64gc-unknown-none-elf + (rustup component list | grep "rust-src") || rustup component add rust-src + (rustup component list | grep "llvm-tools-preview") || rustup component add llvm-tools-preview + (which rust-objdump) || cargo install cargo-binutils + (rustup target list | grep "riscv64gc-unknown-none-elf") || rustup target add riscv64gc-unknown-none-elf $(KERNEL_BIN): kernel @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ @@ -59,11 +59,11 @@ ifeq ($(BOARD),qemu) -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) else @cp $(BOOTLOADER) $(BOOTLOADER).copy - @dd if=$(KERNEL_BIN) of=$(BOOTLOADER).copy bs=128K seek=1 + @dd if=$(KERNEL_BIN) of=$(BOOTLOADER).copy bs=131072 seek=1 @mv $(BOOTLOADER).copy $(KERNEL_BIN) @sudo chmod 777 $(K210-SERIALPORT) python3 $(K210-BURNER) -p $(K210-SERIALPORT) -b 1500000 $(KERNEL_BIN) - miniterm --eol LF --dtr 0 --rts 0 --filter direct $(K210-SERIALPORT) 115200 + python3 -m serial.tools.miniterm --eol LF --dtr 0 --rts 0 --filter direct $(K210-SERIALPORT) 115200 endif debug: build From 77ba429c77ac047652da5ac47e056788b00ff28c Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Tue, 26 Jan 2021 15:34:00 +0800 Subject: [PATCH 06/27] Fix k210 CLOCK_FREQ --- os/src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/src/config.rs b/os/src/config.rs index 06efeb3..8d543ff 100644 --- a/os/src/config.rs +++ b/os/src/config.rs @@ -9,7 +9,7 @@ pub const TRAMPOLINE: usize = usize::MAX - PAGE_SIZE + 1; pub const TRAP_CONTEXT: usize = TRAMPOLINE - PAGE_SIZE; #[cfg(feature = "board_k210")] -pub const CPU_FREQ: usize = 10000000; +pub const CLOCK_FREQ: usize = 403000000 / 62; #[cfg(feature = "board_qemu")] pub const CPU_FREQ: usize = 12500000; \ No newline at end of file From 375b787434a5053d5213e8406d79a3d2c3f99409 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Wed, 27 Jan 2021 07:30:06 +0800 Subject: [PATCH 07/27] Do not clone KERNEL_SPACE in mm::init --- os/src/mm/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/os/src/mm/mod.rs b/os/src/mm/mod.rs index 350b4fa..b156d25 100644 --- a/os/src/mm/mod.rs +++ b/os/src/mm/mod.rs @@ -22,5 +22,5 @@ pub use memory_set::remap_test; pub fn init() { heap_allocator::init_heap(); frame_allocator::init_frame_allocator(); - KERNEL_SPACE.clone().lock().activate(); + KERNEL_SPACE.lock().activate(); } From 588ea619ab82a5fa365895e9fd1a46a4ee582f19 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sat, 30 Jan 2021 14:21:40 +0800 Subject: [PATCH 08/27] Fix CLOCK_FREQ. --- os/src/config.rs | 2 +- os/src/timer.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/os/src/config.rs b/os/src/config.rs index 8d543ff..8350d20 100644 --- a/os/src/config.rs +++ b/os/src/config.rs @@ -12,4 +12,4 @@ pub const TRAP_CONTEXT: usize = TRAMPOLINE - PAGE_SIZE; pub const CLOCK_FREQ: usize = 403000000 / 62; #[cfg(feature = "board_qemu")] -pub const CPU_FREQ: usize = 12500000; \ No newline at end of file +pub const CLOCK_FREQ: usize = 12500000; \ No newline at end of file diff --git a/os/src/timer.rs b/os/src/timer.rs index 612d51a..92d50e3 100644 --- a/os/src/timer.rs +++ b/os/src/timer.rs @@ -1,6 +1,6 @@ use riscv::register::time; use crate::sbi::set_timer; -use crate::config::CPU_FREQ; +use crate::config::CLOCK_FREQ; const TICKS_PER_SEC: usize = 100; const MSEC_PER_SEC: usize = 1000; @@ -10,9 +10,9 @@ pub fn get_time() -> usize { } pub fn get_time_ms() -> usize { - time::read() / (CPU_FREQ / MSEC_PER_SEC) + time::read() / (CLOCK_FREQ / MSEC_PER_SEC) } pub fn set_next_trigger() { - set_timer(get_time() + CPU_FREQ / TICKS_PER_SEC); + set_timer(get_time() + CLOCK_FREQ / TICKS_PER_SEC); } \ No newline at end of file From f4611d16d51b40aed2141f9d10d442bebb8507a6 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Tue, 2 Feb 2021 17:53:56 +0800 Subject: [PATCH 09/27] Update os/Makefile && Update rust to 2021-01-30 --- os/Makefile | 16 ++++++++-------- rust-toolchain | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/os/Makefile b/os/Makefile index 1732b23..b55c71f 100644 --- a/os/Makefile +++ b/os/Makefile @@ -7,13 +7,13 @@ KERNEL_ENTRY_PA := 0x80020000 DISASM_TMP := target/$(TARGET)/$(MODE)/asm # BOARD -BOARD ?= qemu -SBI ?= rustsbi -BOOTLOADER := ../bootloader/$(SBI)-$(BOARD).bin +BOARD ?= qemu +SBI ?= rustsbi +BOOTLOADER := ../bootloader/$(SBI)-$(BOARD).bin # Run K210 K210-SERIALPORT = /dev/ttyUSB0 -K210-BURNER = ../tools/kflash.py +K210-BURNER = ../tools/kflash.py # Binutils OBJDUMP := rust-objdump --arch-name=riscv64 @@ -25,10 +25,10 @@ DISASM ?= -x build: env $(KERNEL_BIN) env: - (rustup component list | grep "rust-src") || rustup component add rust-src - (rustup component list | grep "llvm-tools-preview") || rustup component add llvm-tools-preview - (which rust-objdump) || cargo install cargo-binutils - (rustup target list | grep "riscv64gc-unknown-none-elf") || rustup target add riscv64gc-unknown-none-elf + (rustup target list | grep "riscv64gc-unknown-none-elf (installed)") || rustup target add $(TARGET) + cargo install cargo-binutils + rustup component add rust-src + rustup component add llvm-tools-preview $(KERNEL_BIN): kernel @$(OBJCOPY) $(KERNEL_ELF) --strip-all -O binary $@ diff --git a/rust-toolchain b/rust-toolchain index bf867e0..a08f00d 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly +nightly-2021-01-30 From 58897f477e9dbd4f26a24d0b6d1415a3582b242b Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 7 Feb 2021 02:13:04 +0800 Subject: [PATCH 10/27] Fix exit_code in user --- user/src/syscall.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user/src/syscall.rs b/user/src/syscall.rs index 7668364..16fe455 100644 --- a/user/src/syscall.rs +++ b/user/src/syscall.rs @@ -64,6 +64,6 @@ pub fn sys_exec(path: &str) -> isize { syscall(SYSCALL_EXEC, [path.as_ptr() as usize, 0, 0]) } -pub fn sys_waitpid(pid: isize, xstatus: *mut i32) -> isize { - syscall(SYSCALL_WAITPID, [pid as usize, xstatus as usize, 0]) +pub fn sys_waitpid(pid: isize, exit_code: *mut i32) -> isize { + syscall(SYSCALL_WAITPID, [pid as usize, exit_code as usize, 0]) } \ No newline at end of file From 982b369a516f45300b2d254d231f94cce9fcf2a5 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 7 Feb 2021 18:31:18 +0800 Subject: [PATCH 11/27] Bump rustsbi to 0.1.1 && make config of qemu/k210 different --- bootloader/rustsbi-k210.bin | Bin 73732 -> 75068 bytes bootloader/rustsbi-qemu.bin | Bin 65480 -> 103288 bytes os/Makefile | 14 ++++++-- os/src/config.rs | 6 ++++ os/src/{linker.ld => linker-k210.ld} | 0 os/src/linker-qemu.ld | 50 +++++++++++++++++++++++++++ 6 files changed, 68 insertions(+), 2 deletions(-) rename os/src/{linker.ld => linker-k210.ld} (100%) create mode 100644 os/src/linker-qemu.ld diff --git a/bootloader/rustsbi-k210.bin b/bootloader/rustsbi-k210.bin index 160e243911d5e2a7a073df8c138cee4b333ee9a8..e696137ab183ea5129e14e86ba980af53ae025d2 100755 GIT binary patch literal 75068 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%0AtfKmlezT8wRqM9= z3LT8Jf1}uGf;kC>l><7&z0(0hiFP%5m%Dp25zBwG*rNL8N?QRmE=W;%rYl8d+f^t! zDM@8-SCaCytCBPlcIN3_NgCH(g(RiuujxwBbwf{zWDbqCh%H#o(`j9kanzW26KkGp zD7eO6Ki-B+sjp4S!c;x z4TqTp@-`8?JjbO_2}3#d?FcQC>>Dby z*fcnC_y95t!padSg&Ke|l)Qmb+Ad#)$)J(EQ6Gp%oALOY`ca|~Ht7raz_AB>G=8~q zLa1$z{#CsHy7+l6q8!@-h%Zi6gQcI6!X-Av80SOTnQBmWj1Flt9QAzaQO>avodaTh zTH6ncNrGc_czB5nwH}gU1VJmF-t_*SDg!w4329D-Z3DW$5DyXL<$4gxeq%v+rBqbJ z=-N(^k?0A&!@4pVt+=`M5a2J zAxS@QMP_o(Tul09a`dwFsBE#3cxf`6VWMf{*^ryDZpQF_$H>GYyvdxX?rrKsWui_r z3(uS}ER4>}E(>Z=w-Aefg!M@H7OnUPVN&yJ)-R%I@jTvr0fD(AVW~fCNmnE zL0D>{fv;eR2I_(pDDa6~{w1yoTqz>*x(wjaJIPEeSm}y2ij)#s`4UW&45u&tV{-D0 zD+!^q0|JCl7+ZRg26ZK6yQwQFbEH9zmSLLd-!CPMvQlosQ~HfapwH$hFgZ$-HR3v5^hs%Fp@NyMCg{VMdDRZi`9wgS(HtQhp7ZtUGlxl(qg3<0WZ|U~7 zS2alDQG6}XPA1M=ACTA4O^}IDTfErdU=Z`;q(0ZiPDol&(#*yn#Y}$5INdpiPRWJQSedbeTc*K_Scwx{{E`u|-XQ zM5C%uBP8F{)|wyfO2IXeP+)^)ax@Hp55; zgNkFMBj{P?upsCF{{y=~r%mmA-B!!Su&nTP7bR#M3gZpdF8V~?T@VS=&?cMukGUx_ zTbXDbJNdGUW5&5`72iP8hvd^T5zmP>;Ri-0YyHRJPe0AKxOHPv80)Dr9I+{#J-b}^ zTSH2ei;nCKY+#Z2^TDhMX%yMzVImM8r^dO@b35^`!S7`i;<=-5;wdX1@y=Xy$jLE_ zq%NnEbfy6|R?4-d7QtG!LTt@*Hx#kqfCexnkTnXoViGEA%N#8C!LZ~kCLZa{Iq&m< zlmk0v?~f~)1q)7Cu5iPI-IPM9L5lIXk=T;MlQ8BdNJH`^u?>RvcE*OJ1NFR9dp_YR z{kA(DCAucxMbq(8>+ZH{7$J7ySUC7FOTA?GR78*#!PDA`-r%{≤3yAg3^BUxPfE zJVE>)To1tex{6TjpOWPK#@Almnc~wqA_|JQVaw&D45;qxR=SXtc0ejVq995FY-U_P zvht%l{%9u~LTQk(inJzht-)Kp1W)tQd0eW=s48^aX?MsS4vy?e+ItW(oo@2M+kU+Ye(nh(&Xt(j2Te3e{0Z%F9X+uRKO#gAE zebW-ljl97hz)nqOU1f-6Yv1)2vB9pzqxVVy_D&8>VUhuFif%qv^NmoKPRi+JnK8_wU9cAXiYH`jc{njX-I75pxcLRs#l7wvez?OmlWq5L z&J!WgNZkXP52FP}9V-_m)c7JvL4Epywhl*vRG7-stP6WNivnKKgl$MRaSuq1;il4bt8dv#kHkU zTwF2A=%mEpNCmVfRpK0InQ>ls2DXfAGMLkofjo@il0^;4?3HL))IoGo4GWW9eQHon zTVA90^-S8pS5z7~6Y)qn?*&M+-gC^f-O>~fzkuW&ML#0MEW0{gP`UB19WXxb9<4J6WpeOdbEnnBtH6FBufwi434tP|*pr;)`3 z?nhw~=V7Aatmw)Nk|63%2xaCv+m)Gr99!jp%Lj?c#6iMVflR|K5e0flzla2|We}@t zpCVx+fr2=E!gkFkR&iF#78`RQJ(;(5_gbfEop^DVrY1B^yFYZ7_GqZsmggSdI;kbU zkvVsBV$35Qea0(fJ9H-ux`ra{JO*)v!ZxpVm%av=gjh5o!g>&_7ZEH(hz>~$DG#Lr zRKdv)cn9NT?^KAumIwaJYl8>aXz$&@&44j^gl&VNCvfX)^AaeAjjA`53_tqrdKf?S z`mo{j**q;+n?dEJs)19JLWGC^0Dii-*i2R~ITrClP!5Fb8zX5JA2G{;1vo0U zX+y>ftK+Z0ry^5g=%^xgqtdd;cwq0O0wZaV@m?ZqFl1Nuh#v4WV81!7d7xD43>oGv zK?>+OHM}m9m=W;l>{Em^(RBNiMCS{$>xqIF(DuM7N$M%NyZ9fjNS<}EqQ>&oP*^fyv>+?myNbO1i?=s zY$(C|hdCy8e( zrJCcBRcd$*=YJrifozWhR`2cu4#wY@hZm8Noqdbu}C2UCM)!ys~EU21;*GIVPcO>^-T z)nr)RvV?`Gm>QQwYep|a#%y*7Mn9QD8ubOiC)_sPh`+Ul)6G;(AZvvF$s~j{2909U zcR?D1dT4hJGZwR#OKl|b*vJMcOJh(K+Q1DG&&y2Ny!)zY3|iCw*KhWLBXl+fnVac3 zm_k^$Gv?CsDs#&PM$nbmmASk+z?_mqPj+Kob#3NGNTIBRDFPg;r2xO%Z?v;5q}gF# zKpbd{fI{mX_IZ2AMm=l#b{0A5p2u()goVzi2B9KY+u9%Ng7+sLVLgk5HZ2das}Zs~ znjNEbd(6Ar?S*ymD%BkvyV8q=ExkCp{1=EqAL}pW_793es^(m@F9}w)yubz8Od~@V z9fCWdX6%5MNc0KkBiA#G`qChVe+NRWK}~BDDoH5V>qFyt!&<`f+Y`w7CnjuGl$wX0!N5Q+2=7c*F8i3&3VhU#IXAo3u2ulyoY<8C*E?Nlqu1NiQTmg2UsDFtM% zW1hp7NJciFq(b3|GP1!*%*-elaCG#_EQ{G-(UOm9pkmm$^oyS3P{O=bLaUIbJ%+D!&-+Rh{su16b;OZ0vsiX zg9IXyPvP(ZnNb@N)35&yqF?rGw!^7SX#Pa-kG?kEtqE0VBZtG0*H%q{0JxItMt4fw=h%N6y2OeAsu}Va>k=8J@n(kkjm!lN&(!=i zfGM8>K{X81HJxEPsu*Tbm_E8DfQi5eo%(2os!V05H*!>6Xl7Cn)drc0%p`_sCTC+o z%N3lx6|FOT5+Let06`55Q_g3Y6FJSj7ptO!f*Qfhs`_#E$jnedKUyx(B)sCDH=G$~ z)+Il0-N|hQeO~&C+CR;g^ijtG5Ze*DQlVqcoJ~@N26@0M2~QC(T;$A5+#kU7e+q5k zs+5N_%#nZQ{c~ZR{*wTv@o&&S5SdV-Xc$BNly|zdy(;SE0IKU_Xbd+qTPDMlcu&^1 z={0W!FqJwGl=qK6onfxzG@m-1X{ZQbnm>U4$>h2;rZH62=5(j@Nq-HX%6=fq`^RNu zn5xayH&oxFd{{TOP%=Dw>+stcg{-vpwZ zy`0D}RhzT^OCKI=y%Dy_^x<5i@eETnxuP#K`yLI@birm}W?v^mwZ$-0)#lFsW1V(S z0F^i<$S2Zn@<%aD)#g?lt?I(w3_EyLoV~F(!;G$iuQ^y3N3s%{V9@+x8&FV&EAC$v zKl>=Nj*PG9IYNqS+=Iu?nK?kR+8^2rrk2W2$SLQ<)}au;0wL|oc-NeJobJz9W!6-C_&R0KdaLH(TD( zMY(&I6HXHI$^Ubcx(}Peqhv&Bc2E~$jaITwvOo!qP=0sI(l(MA-0y8!Iw9n{feG4m&r-gZ?OD<-OX#<2?TVU* z{d*R$=%08c2N%Q_uq)~$an|p)!kGS_us~z3WMP|0Sdg3*IqqI+B}u9rNPqJz#z>M} za;AlnbQeT~5;yTznOTJhrLeb~=Bhxc(z+&X(Uy~e?9)}r`LhVQp44nF{Tph|Ye=UI zxf(fR#lInU4QeRuYSe5mij7Wkbmm%ZWCdcCLeNuS%bI#6Wd|7?-M6f}*E4=` zwR$%CHA=p-+g^9~ivBOJR#DkkA3?^M%$JwZl@ zw^%^m6C(ffS`hyU6@q_rXHGX;PqX6=>gHsEdX$C5`6&YPB(^lQoJdMC9o^yn1l+bJ z6>llig}UPF-p2#osWGl!E^*o_6@-6WGb~na?^$k+!MCoC(+mpGu>C-3Bm=>)5CqR4 zt5zO^U7plXn*rW$9TuyFPa$qy9UJaCuZl*n`pN^kw@8j4Sa{3oC>-iZ%{2Gv4mN+M z)@BW2j?p{=L=i*$-(A9`o_@G`joxWKu1bBysWfV2elXImhdZv0MLs+E_gLs(Di%FB zp;R}nOGDgcSCWiSp(8@7hS`dIR|V@0>da9Ep0qA`l4}sj@{zSM%U0^7N}e!6e`3o= zhVCaj$iczjq4@0!^!wD?_Yoa9NXVp`(WO9OJF~}SvNX;A?MpERk;Y1nu zmj*&P`fh%_t8hwAAe4i>QW~gH4zBHS5IP6KxfYY#d;sD(q5+8ID2i=cv|O++mFLsD z#xT+oY7Aqh=B1U$sDi_z`4Qx_8H7eC4Sw+pizi^?suZR|&sRPP28R2fdbVm9zI)Y8 zVYkvSW@4>xRfxv9g2XuWFu3-*cXOZU9}d}Y7%N@}={8Gh5wC6(#fxMBvT}E!m6!WP zwy~Wd`7U`RQ$yj3oaO^7@=m2bGX6~2Ba_Z~Y4^K7sM5TV#J8@ER0LQ@j%2{P4`H1~ z<&yu1P`Ja_?0t#~_O?$Vo4E&J&@vS%c#both-%BP3+8#$sP8$59?55IkayMRG}=$G zlQqxH-UDZ9?VIWl{fwn$03=PGn=NRdY&|J6z(*vSD)Ko@iW~|5C#DVdgbTLB_JZ(^ zbB@Cit|76MHR{7A{Zy%p=B98**hD0FwD;m_Vkj|6VM|Q0rMusWu z<4A$}pn0-4!af_It0WjVyIVByF|&9PAKE+~&wXeLUN?WhsE5hQu25as8Ay)`>L7TQ zrxsqo!VxX&CL2V-_{;hC#XZMh^-t4P8|^~#6g+LgZMQtlAk7dzL++MBl!>s~qXSFe z^>oiPSs2VXL4{eK=QJVny(NS}&Es*)f;*h7vSlah5jZUZg9rRB9fd~tW{hlq>Gk~3 zfI!rtg)irzo1dwJ=BW^u3DgWhj=rEw+9E|Q)`G1u%DLMa>q=nl;vbyL!vl*@mJV-< zhp|X|*Yy))!Dcw(ILJ=yzuSmKS^wLO*g^khCl*({HX_mHVnXpf-ba|OTn^ZNy?Z+G zDKssMOpRPkk1=%er7vp-39jInb1V4_4?Yg1%2nVY zEa<`mm!xWq(KvsJ{dTG_<8tPxsUa6>xom#;(uTymWHbf0-MWZC>)MLDi{OgD5#~W` z*de}CL}wm`y%0hQ`lU`z0jw3!D!nTX=HhR))F zc*GzIZ<@#8%?oHcpe_ zVa?49o_;TbXTS#)MlOT=H9lA~lF1-(c=P>OkkyfN455?)tSkA3)3}B6n1uyDr(vwG z{jKC4&BL@I(nN;PY=%M15fs=?N?>Z3%%Hj{uxFvF;Z<0iOXA7Z7L6|Ed>n#fCwe&4 z0@vI?cDluFscsxepGx70e4JG;MHXPw?j|NsQ!1lalo1q2d8XD>yEbGTWobFX5bDoT zfy_j+{s&con$B`@+o?bls?5P>_Qp>FV}rD>R@xO>9tu~kgw}*=U^J6AI2ZzNB%@Ut zx?0#8D$zwc+rafw5=e)Y{G>7T*$k~AbePdYm=BA17U-*+*JL1&t!F-h!tuEcnOeUA z_kSW&s|eWoL?(XviQf2e_doWVl0YdPowF z!@VdMGo%!OJBBBDwus`oVm}2!e0bYggyU<0^bUm@bMWhhBb>|~j8Z#M_=H>4->BiU zCTGGvG{tklVK2B{rB``)C7t6N)YHr<%t!cI@7c$!)BP@^<2eAQa48iz4Ixz;RvG8y?|*5}(S6reyPWW! zs$DVsuG*>A?@-llg#C@Hs-3FRwydk#QF2i2#@Rj9?vD?u-Il1Tz2a4-uFBVfYL_Ea zwHxW7^DEVEhG>e!&_T7QmoqvUFR5xb>w{{SZ~Wh?-KP0{wVN;gr)qb>DJv4ST*KPC ztKIhZ-&4Em-fn8w1l5j4_Efv=*PzRqYB)II6X~_>$?rw|3P0`)XH||5WY9zyB9%_rLLbYBx^ks&;dI7qut%R6A0F zYM0@zf&>Sd!JAejz#0aQAHXR9xcGp&2j!TmcH944UG1*Vx~QGfkse}nii%aWyN-5I zd+-0u+H%~d|Pomet(M;Uon++TLuI^5InKj zVJ9BHb!6Nv3}OWcgiRD;egV6-zJZl3Q{tr?xZT_wtZ3T=6|(gtbW>C~bvXITuITcSJdYpZTwr{4SX2Olh?t>CzL zWID$O$|`~w%072b6lg1&9}G0!?`t&Rwa*N2q7iWI3tfM!MEonr2+4<4AzzIwBwI3& zx}f8sej2?4hz7%Q5lQsWZ6SIRj;sk!*&?Ai!8IW{%BnU4LBEsSk=9WlkgI1vNGE9D zJdrTWyC#77{Id;buBrxB_h44BsTS*qe@pl0%+qCoAyv8BsC`O{&`p!A0^< zx+xtef+IGCkemY`d}3DJ=mYy`kbK2A!(b)!2$2jq83s8Q1Km23^Z*wy zhFBaK`SyimrNA;qYLe4t;Z1c49lWj0gCTLl+p3I42+nUE-w0=^yO=9%fY6rE5AR5l zLu}i!z-^_s6NP>OOd!E3MJ$RcAxE{qL}X{z8WA7!D?Sa@-Gx`Wz;IuMdxlM zh)AwJB8ck8h_)$&p%-ipKG5l(%8gt3k&TDomS0YL9%Qkgf5{KHCPWs?v%cfl>AEe zwZo-)ZW8EIA2`KusnTIL5RJ3O%jbPF}LiU$yN|{WKrr z{(pMd`7lA(NgE`3CbQjMP!~TGQjrIxbtjKkiPBDb%rmFWKDQ2X?K(+32Nrj}XodX= zqRSk93^b?JZm)}{x2OHGo=+O+d*&5j>ZLsTGF$`+(S?<S7U}H_RvCbqe^u*AjSN=Q2~?e0HqdN8 zt6+Bn1M3KwLtPhCXobQFUkF0w4i#G0%AnRjW0ap%nD7m!+odKthc~>C++V5kfsw3> z5`W&9=!3I(l_Z5qyWI6I_P=1xGVY>YgxTbekSC=;a}A4LBMM^NaHSnBQ(nMXFW#;7 zzluFCni3Uyz?s={T~j`{WmJg|y*O5D`v=y^Q=Rmna9{Yo7MAP+JpfEKsEX_P4hsrb z1Nu8ceI4R2tiKKNEXOv-#sc3CQ-l3<#c1-C;BT0;@t(x!GjK zHTmJherEC+ZqNQzKnCsxwD;bFj)9qNbCe780%6)ZREB?%pUy&$k$Z4ivzoqoh^qr` zqk>PUr^DCAR2^)vIq-YsYbK#3zKhXSnaL>vd|{ayFP)R@=PN=taT0ZZFH%R-<18@h zN!&Oqn_t4S~Z9N3QJGI zO!w;n$#gljX!nV-qP^eq<{#3BL|S9}8Pxl2Ur~j$9M*HkYWy=?#OCn*y3Mf;=3MwR zZwP#vms#d|%UP2^`#K#n)6A$+N0Rwj)oi7$3|91t3UfWJ!YZER^#U+I$z@ZTO`903 z`7dfcv_plZZ)7lMWdLZ#Dp1w`3-0@aYj4egr3bm)kZlh5LFE9) zlQ+fTKMm9K>r`}MW(N%h$bBaG`pN-QuDore>$N2|aPAQHDzN@w*OpNGwZTWW`BE8= zH02~LS6Tu$XyMD1LLnlTS_LoAVpjhEly$#AilCYjdEeBM12>;UHId^^@D7@fIF2V(P0*ST;K!@}r8R$p?|s=ERR_n_=?#lU z8p4mmzLztir1@P7;npeTBExg zWVK{!+ANulpK?@RJm{$I^f{{AH#n->Hb#NhrR!Sxd)7P>BS4n0x3E5%9-lc=91YED zdLNr_%D{*JlAJtyniqB$v8Qr6X+btQ`b8V2T*BH{245#{C(|p9oHvjllEn9so3tzJ zOUPa#NZT1lBQO>TxU|H3u=0_3&MT?xQ*N{aF4GvM*@kz&@}edk&w4di=ue_7-20&f zyz5oh{d5$V|H)!6{%I*KlfMppT52ZhR-S=WFu1yI->y;!I!Yk?+f`a(e39bfwbet@ zT;CJg^a278YlhgG6u6lWT>@p{&#Dvp)BTgz$@1O|Zj8QdA#cX_Ku6zJo8tWuX>g^{ zu811YMW&v$TG8Xw*QUkGQA~caM*L(S2W4T`YXiejG#i|w_6^5XuVp2|7n5M3TB-ZC z6}b1-*A{Ax&G_Ee&05re|MdF3@zR9^=pRV=Xdna#;eGQiY`B=?-M=xA2hnU0?Kamw z*lU>;FI;3G-DSGqryx`V+bnsR77nWa4U<#>1({!A3x3*QI`^5&apvx}c*~EBPW?H$ zvq6#l&$68jiDaZI-ew3H@6nwNT35D#x1&(YdkkvbPj@yb)c*k4*&z3n{Kq>Ru+wrX zKK(^Ts}dY1?D{ZH(?OJtA*0<7CEQ7rq=WBYV8e&PT=4&d*+jUWKBY_Pf55Fq7w5Gt8rU^8OpaMWA(X8NyJ zIV%?RFbCsNfA>~PAxCzd!rR`u14RD*t?LraqYv=F!#18CR;Bcm8a)2(oJ4s<18<2x zHwZMpir2h7dWIsFsm&Z|kk8rTh-_4~(hSD5XnK={tNn9T?G+qWIgJLdO!^}@^qp+2 zF%9RvlO2tWY9ovpw9WYPJ2Ntp)k2$5J#fsJSmB>0DC8|e_~bhUnf_=MSAnx_JmEn# zZJiXvg|K$%yDLbSy*o169~!6Ld2U?Ft%tXb+a!5ipj? z8%Ytu4K;O0TaXKP-F5QO-GR05ZHu=^T=RwWTmWsT`Kempdv|M+%(K}ljoiju4d)SH zrAF<=kNf#2rmlzGk<2LHMREWVoRvNee&KkFmfVVxhRPvRf&b{A)K9sQr5${&KE6Na z|3oG8KmOcEl1C&}$l>%FJYaubul<2WeuN*`KfS;0I^xFjB@u32W;M<4@V|ci;r`K) zTVZy9Q^)WD2oS=C155fFUsGxL_jb3i%HeqXfgJqyhuKHrdwSRRbEL8PkaFNn<+AW%}kh}t06MwmoE_Q)>m4JFTX zpSM+Cpq_y-Hv8HRz(H+#JrWz_O%0r)@f6UBhjDK{aloiTNa6Y%o7jPME_Gmnf={O7u1*O!o#6J!bsv@5Q-5C(lvl^9}oJPT#)1qzVd{IujwlkYA+00wQLOkB4$VOv7o=zH*sVlTda?Sw zZMy^1{40HHGThdc&C7B4$3|^>6VCd0aNoM)zLqQmH&(T=W>`9L;l~+H>vuVgTyae~ zEreYreDp*f&M?C8`Rs2q^l~)w%0Y zh%?uKwl8A;AWp~nXe*!(5TZ0wW;HH`9$nn_K&N|3M*HXP#h%4$N4f8Ss(ZAxaEX_F z%7<*zxWZ~SM%SQ=spqS7&l-g=vz8&R1oG#}-Y%hEQ1hb#}bMI8CHe$QE zXoo!{x7T41%?tMB1e;F1=M(KCqjJ}x+T0(|&70y*?u4|>T60%+Cmuf3X*gVJA?3Ae z_oCGwg`pE0Ug~rUCzAI5Hold#Dh&zf%o=z?q-8OCV^MAW^9b*aN3%DN3VjxxNYb6L z|MEsyh%OXiUE8nrf7I)?kK#%ia6CkSVxjHV6Nf5VD`f2>j(v=1g$A$bj~49%M*?HL zVU=zXUU(#V8tXGFoF>TNYEa@~D!L0SH*DU&X1UL}HP%WGQ;>Op3YkhF8J;s7BKN~B zpA^O(`(l-xbU4DHFM+;*@d!6<9m5YCoRQ%^Sl#%AdzOcpsqr7)_0M;lj-O@Esad+dV(Il3GD+z;^Pzs=N2`|!7ai;s$X zm(+!SpM=)!cn60bTAVEG5v=YhWlw2N>up^{+fj=*9vZJT*W%VsO=-~{XmLhR}Zq1uq^)@WnagoeayTCWLTzy79#i12qg zwIS&rUKYO$$y@VVNN(t5gA+{4-g||{?vP^o3Pn32B>PitjlO^!ypERP2)!aU0`et5 z{*9QSJpyo@QXh`H%`GroSXhB6hF-E4OG00v*8K`vSFlAo=+-_pr|DAc{*QOA&^lJ< zZn_+j7m2nnjtN~8GC8vBsfkCOldFIUuY6*zbcwsxEjP=d#Zk+zX#eW)(C+O|IawYW z^8{)0oolw(LiVh=OqfQVUKJaCh%tQvnDzpu`$H%9DtoHrn{id8)9sh1YqXA?D{#_| z>1dSaEfi50RkVF^*;7gTVLcC1C$sffCXH_0*F3{xTSS&{M+R$aKEbaXNzQt?4pia_ z*M8y2S-W~_7!tzpg|G;?tj)jXE4I&&xhbJ)Z4zQqwk#eHI}6P;`-|KcBI$a*BU}gEi>KIJ*%xc zBI^@>HJQ5ZW6BgDPGbRD8 zihp~@qVq##f(s{n>Q-By2hmaXEq07SZfnjC`$v1V?vwcNKQe_# zt9^SN{`DVannL`?W68ZM_Gqkcuf?IL&xs{F8gb>ZA)%plEdoAztU&w0r+D-iPxbLf z+4~7mck=MdT>I4*65$b_=hm^Jhi$?_(wDLy4h#bZp*Rvy;jl%o)+x-dSt&-5cFBZHf{SW z$OI8rrXDsM>9XAaH+<;p^nPGi*MNV7BmVh&@DK2ef6jHzYmS?iR8=}nY|U>wu~z?^ zW}0^@uwOgxxk>G{Z`PsOeaBGk_nj!ebJJ&btVemC-Hla9Y)XhD^SJP|crsHjo@Q_9 zZ;EHLqD=5rT7reHmQMIuBP~rn`=xpLuTC zR@Dtvqb;lO?0>Cy3L8m2VZ4X6+qMfxhfEGVq22pit*#EOUaLc^?#4e|=wrXL6TNVt z3c07wt}^Yw?s#N>u>zG&^SNP4h>Yp{Nn<~;LK_n|AJs~6n!n1cKZ*x$oPluXg%B0v z#Mu?U*>^xKi?3{)yt-aM7~l6zzGf4C;hVg%!egeB$*0+kV|8v5e1MnG1Wrh(TOs}o zjk(0yQt`C!cve((lkX&JOT}Rv@onO0*HbJFKu%EaZz{D+F6yV#wJq2jbGrv6fX-oV zIToWg_VrE!{jdA@E36$NVB>eg#-FGiXkYl~!1^7UgG3;=uqyteyd#|L;aPPuIrU7d;x^ zlj3RlN{U5@P|Qp2kYgUX(C0nRGtb*U5F%nMamfB;eRv2cAFqu^CuW8HW_NuQOH>MY zVX0y3b#tD4=J^x<5-#3TwNJWq`8jv`wwIsBd(yRI?!_hHNo8{4 zW8pW#%5}ZJ2072&s)c?0IVE$glM>M(0(H)kf~5lWR3o^*WKfCsx_{Ll^Keth`2 zz298~gBh%HqAR@q4m_hl>UT>Q_&>YBXW&B(dj{lp<8ZhuM&#(!wfH zXIIkuylk=0d8;peq3Q2 zzMwli6v-te?Uuxml*pU`-g0&1X1H+)x=ph>A1av*^Fst*DWxRR}r$IG{ zX4fSPY-vzjI8vN<(m3q zM(&U|M(dM;aD?+tW%PD@ZLp4%`9Dbc75?&MPF7v@@F15K#wE9!aap@O+#RbQU}a*V z3qWH?|=9A z;j9b&<0<|3n;H50=^H}P-kLZ~G9K1GVC=@h48$Qw!yh)pvhus**xxJK@Q3q*aK)wQ z%q`zDgh{+&F8qZPvZ!YT@3*m<2`LK~6b2gI!fVdrHM8JvERJg*b#G4yd{}|{!0!Xs z5cb}YOoscGI+iV8R=8k}F`Ux$x3F^dhS0$lJnM(NzHPiXjUv(FXMZqh$DYIoe=ug> zDJ@;LV98=*wrQj(JG}TLBLQbq>CagH&R>CK?ey07G}<>$;_x#W(JH4$e_+*;aLJhm zQ~mr6l1SGeg3q1F=$qZjD#dU#5Lf*1fxhyU#n1kjr~R@OfBxfLQJiDcX;ybSUeGo+ zk-zlggr4Bw(O<$6Q#E&A6niGep>X9WBu_3$&727&MBU=&q5S^<#$c;e+zw(SKB!m9<` z#^454o?&Bu)h4TdD~nk9O#Zi+|GmOn^pDWo=hbO6eTi3ilgsfKXE#nq@^n|0-|n5P z(M+|>KhKyD+ay1a@ppAxZQ}0`H`AY<D?cy8FNMP5N}DO<_4;io`g#A*59Tk_AGURDu_miz+>XC5XuGM0eH@@$@d0r^}n6N zMl35{uy}a3Dc6)kr@JMK?Gj8N<-fA_--W*dBM!V#T_E%a_)B`Eiz1)VYI^llB$z|l z#qN6Kn(0{#nhDj6^S+?f=&nL!+oh`!arP`80_q@k)YH`eYn3cqu=rtV?t=><2zany z;ld^Mg5^t=f{wsQ0J< z2Gg_n2XB&2Gh}$r;vazwwDk%;=b0gQNe&>;Lm3%VJ?WEj;#hgPGoZ+qppXP@JuAH0 zy+Q!L`WoejpnU9A=p2PIGyHb%4)08ZCROao^E<%1ny$|v@3RI?-W5taeGPnK!elb+ zNuQLHAhl=tuTVDd8s#KH;`l+OU4+8yARwTe-=K_4XFVB&@ldO0xdF-X@Vx8vt$uEa86B-TzlAka5J25Zv)4<<>6#eNbY^JxMm*zp^ zm(MbP#jyf0#kodS-o>3?YhL_HV3PEh7kd`-d9i0P_x?SLyUdF{L2O>^S=w!0bfTVM z7g!?kGCj**fO68uJ${~~B>Mdc@pP;J0TvI3Z&G-a(0) zk=mtwy|WTE%}$k>%0&IUloNlP|9#*S#tdSgr3H{0u`gK)85fx5ixw>(v1rL$HR(_l z!?dNUVRk56s`e~@5XuK5)C*+}1+m~~ezbRKl4fR3Vk{$|YD47jBs?HLN{^+!80$Tk zq{&O#!tvr68mi>)k=~R9O;XzOr6Y<9mcw#zF_H934kYs}`FR~WH^Xa5)(msT#WDW9 z7z7#lyGmCzFV!3hAz8H8IANkuT0Ga73GLwcWc5vc_HcQjz4Yfu5BYo0^ZuBu8JXWx zh&MUW3{GTzkNm;691iO$`txWMF||QnV~R%aUEfdBCwXi%kP46qKls8v!IMbR@XA9yZOTP8t@QQ*s$;I6wS<#(bvF0 ZlQ@MLG#IojUAkmx@zMn=3YJR<{XdL~0l5GG diff --git a/bootloader/rustsbi-qemu.bin b/bootloader/rustsbi-qemu.bin index 54329fcb74075cefde4a4d8d134481f59876b7ac..5ccab433b2cac6c11e47ae827904839c4275dfa7 100755 GIT binary patch literal 103288 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 Date: Mon, 8 Feb 2021 11:25:12 +0800 Subject: [PATCH 12/27] Move kflash.py out of proj. --- .gitignore | 1 + os/Makefile | 7 +- tools/kflash.py | 1452 ----------------------------------------------- 3 files changed, 6 insertions(+), 1454 deletions(-) delete mode 100755 tools/kflash.py diff --git a/.gitignore b/.gitignore index 5711843..3327607 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ os/Cargo.lock user/target/* user/.idea/* user/Cargo.lock +tools/ diff --git a/os/Makefile b/os/Makefile index e9292ed..e7aa6b7 100644 --- a/os/Makefile +++ b/os/Makefile @@ -58,7 +58,10 @@ disasm-vim: kernel @vim $(DISASM_TMP) @rm $(DISASM_TMP) -run: run-inner +run: tools run-inner + +tools: + (which $(K210-BURNER)) || (cd .. && git clone https://github.com/sipeed/kflash.py.git && mv kflash.py tools) run-inner: build ifeq ($(BOARD),qemu) @@ -82,4 +85,4 @@ debug: build tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \ tmux -2 attach-session -d -.PHONY: build env kernel clean disasm disasm-vim run-inner +.PHONY: build env kernel clean disasm disasm-vim run-inner tools diff --git a/tools/kflash.py b/tools/kflash.py deleted file mode 100755 index d4cb1da..0000000 --- a/tools/kflash.py +++ /dev/null @@ -1,1452 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from __future__ import (division, print_function) - -import sys -import time -import zlib -import copy -import struct -import binascii -import hashlib -import argparse -import math -import zipfile, tempfile -import json -import re -import os - - -class KFlash: - print_callback = None - - def __init__(self, print_callback = None): - self.killProcess = False - self.loader = None - self.print_callback = print_callback - - @staticmethod - def log(*args, **kwargs): - if KFlash.print_callback: - KFlash.print_callback(*args, **kwargs) - else: - print(*args, **kwargs) - - def process(self, terminal=True, dev="", baudrate=1500000, board=None, sram = False, file="", callback=None, noansi=False, terminal_auto_size=False, terminal_size=(50, 1), slow_mode = False): - self.killProcess = False - BASH_TIPS = dict(NORMAL='\033[0m',BOLD='\033[1m',DIM='\033[2m',UNDERLINE='\033[4m', - DEFAULT='\033[0m', RED='\033[31m', YELLOW='\033[33m', GREEN='\033[32m', - BG_DEFAULT='\033[49m', BG_WHITE='\033[107m') - - ERROR_MSG = BASH_TIPS['RED']+BASH_TIPS['BOLD']+'[ERROR]'+BASH_TIPS['NORMAL'] - WARN_MSG = BASH_TIPS['YELLOW']+BASH_TIPS['BOLD']+'[WARN]'+BASH_TIPS['NORMAL'] - INFO_MSG = BASH_TIPS['GREEN']+BASH_TIPS['BOLD']+'[INFO]'+BASH_TIPS['NORMAL'] - - VID_LIST_FOR_AUTO_LOOKUP = "(1A86)|(0403)|(067B)|(10C4)|(C251)|(0403)" - # WCH FTDI PL CL DAP OPENEC - ISP_RECEIVE_TIMEOUT = 0.5 - - MAX_RETRY_TIMES = 10 - - ISP_FLASH_SECTOR_SIZE = 4096 - ISP_FLASH_DATA_FRAME_SIZE = ISP_FLASH_SECTOR_SIZE * 16 - - def tuple2str(t): - ret = "" - for i in t: - ret += i+" " - return ret - - def raise_exception(exception): - if self.loader: - try: - self.loader._port.close() - except Exception: - pass - raise exception - - try: - from enum import Enum - except ImportError: - err = (ERROR_MSG,'enum34 must be installed, run '+BASH_TIPS['GREEN']+'`' + ('pip', 'pip3')[sys.version_info > (3, 0)] + ' install enum34`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise Exception(err) - try: - import serial - import serial.tools.list_ports - except ImportError: - err = (ERROR_MSG,'PySerial must be installed, run '+BASH_TIPS['GREEN']+'`' + ('pip', 'pip3')[sys.version_info > (3, 0)] + ' install pyserial`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise Exception(err) - - class TimeoutError(Exception): pass - - class ProgramFileFormat(Enum): - FMT_BINARY = 0 - FMT_ELF = 1 - FMT_KFPKG = 2 - - # AES is from: https://github.com/ricmoo/pyaes, Copyright by Richard Moore - class AES: - '''Encapsulates the AES block cipher. - You generally should not need this. Use the AESModeOfOperation classes - below instead.''' - @staticmethod - def _compact_word(word): - return (word[0] << 24) | (word[1] << 16) | (word[2] << 8) | word[3] - - # Number of rounds by keysize - number_of_rounds = {16: 10, 24: 12, 32: 14} - - # Round constant words - rcon = [ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91 ] - - # S-box and Inverse S-box (S is for Substitution) - S = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ] - Si =[ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d ] - - # Transformations for encryption - T1 = [ 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a ] - T2 = [ 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 ] - T3 = [ 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 ] - T4 = [ 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c ] - - # Transformations for decryption - T5 = [ 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742 ] - T6 = [ 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857 ] - T7 = [ 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8 ] - T8 = [ 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0 ] - - # Transformations for decryption key expansion - U1 = [ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3 ] - U2 = [ 0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697 ] - U3 = [ 0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46 ] - U4 = [ 0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d ] - - def __init__(self, key): - - if len(key) not in (16, 24, 32): - raise_exception( ValueError('Invalid key size') ) - - rounds = self.number_of_rounds[len(key)] - - # Encryption round keys - self._Ke = [[0] * 4 for i in range(rounds + 1)] - - # Decryption round keys - self._Kd = [[0] * 4 for i in range(rounds + 1)] - - round_key_count = (rounds + 1) * 4 - KC = len(key) // 4 - - # Convert the key into ints - tk = [ struct.unpack('>i', key[i:i + 4])[0] for i in range(0, len(key), 4) ] - - # Copy values into round key arrays - for i in range(0, KC): - self._Ke[i // 4][i % 4] = tk[i] - self._Kd[rounds - (i // 4)][i % 4] = tk[i] - - # Key expansion (fips-197 section 5.2) - rconpointer = 0 - t = KC - while t < round_key_count: - - tt = tk[KC - 1] - tk[0] ^= ((self.S[(tt >> 16) & 0xFF] << 24) ^ - (self.S[(tt >> 8) & 0xFF] << 16) ^ - (self.S[ tt & 0xFF] << 8) ^ - self.S[(tt >> 24) & 0xFF] ^ - (self.rcon[rconpointer] << 24)) - rconpointer += 1 - - if KC != 8: - for i in range(1, KC): - tk[i] ^= tk[i - 1] - - # Key expansion for 256-bit keys is "slightly different" (fips-197) - else: - for i in range(1, KC // 2): - tk[i] ^= tk[i - 1] - tt = tk[KC // 2 - 1] - - tk[KC // 2] ^= (self.S[ tt & 0xFF] ^ - (self.S[(tt >> 8) & 0xFF] << 8) ^ - (self.S[(tt >> 16) & 0xFF] << 16) ^ - (self.S[(tt >> 24) & 0xFF] << 24)) - - for i in range(KC // 2 + 1, KC): - tk[i] ^= tk[i - 1] - - # Copy values into round key arrays - j = 0 - while j < KC and t < round_key_count: - self._Ke[t // 4][t % 4] = tk[j] - self._Kd[rounds - (t // 4)][t % 4] = tk[j] - j += 1 - t += 1 - - # Inverse-Cipher-ify the decryption round key (fips-197 section 5.3) - for r in range(1, rounds): - for j in range(0, 4): - tt = self._Kd[r][j] - self._Kd[r][j] = (self.U1[(tt >> 24) & 0xFF] ^ - self.U2[(tt >> 16) & 0xFF] ^ - self.U3[(tt >> 8) & 0xFF] ^ - self.U4[ tt & 0xFF]) - - def encrypt(self, plaintext): - 'Encrypt a block of plain text using the AES block cipher.' - - if len(plaintext) != 16: - raise_exception( ValueError('wrong block length') ) - - rounds = len(self._Ke) - 1 - (s1, s2, s3) = [1, 2, 3] - a = [0, 0, 0, 0] - - # Convert plaintext to (ints ^ key) - t = [(AES._compact_word(plaintext[4 * i:4 * i + 4]) ^ self._Ke[0][i]) for i in range(0, 4)] - - # Apply round transforms - for r in range(1, rounds): - for i in range(0, 4): - a[i] = (self.T1[(t[ i ] >> 24) & 0xFF] ^ - self.T2[(t[(i + s1) % 4] >> 16) & 0xFF] ^ - self.T3[(t[(i + s2) % 4] >> 8) & 0xFF] ^ - self.T4[ t[(i + s3) % 4] & 0xFF] ^ - self._Ke[r][i]) - t = copy.copy(a) - - # The last round is special - result = [ ] - for i in range(0, 4): - tt = self._Ke[rounds][i] - result.append((self.S[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) - result.append((self.S[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) - result.append((self.S[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) - result.append((self.S[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) - - return result - - def decrypt(self, ciphertext): - 'Decrypt a block of cipher text using the AES block cipher.' - - if len(ciphertext) != 16: - raise_exception( ValueError('wrong block length') ) - - rounds = len(self._Kd) - 1 - (s1, s2, s3) = [3, 2, 1] - a = [0, 0, 0, 0] - - # Convert ciphertext to (ints ^ key) - t = [(AES._compact_word(ciphertext[4 * i:4 * i + 4]) ^ self._Kd[0][i]) for i in range(0, 4)] - - # Apply round transforms - for r in range(1, rounds): - for i in range(0, 4): - a[i] = (self.T5[(t[ i ] >> 24) & 0xFF] ^ - self.T6[(t[(i + s1) % 4] >> 16) & 0xFF] ^ - self.T7[(t[(i + s2) % 4] >> 8) & 0xFF] ^ - self.T8[ t[(i + s3) % 4] & 0xFF] ^ - self._Kd[r][i]) - t = copy.copy(a) - - # The last round is special - result = [ ] - for i in range(0, 4): - tt = self._Kd[rounds][i] - result.append((self.Si[(t[ i ] >> 24) & 0xFF] ^ (tt >> 24)) & 0xFF) - result.append((self.Si[(t[(i + s1) % 4] >> 16) & 0xFF] ^ (tt >> 16)) & 0xFF) - result.append((self.Si[(t[(i + s2) % 4] >> 8) & 0xFF] ^ (tt >> 8)) & 0xFF) - result.append((self.Si[ t[(i + s3) % 4] & 0xFF] ^ tt ) & 0xFF) - - return result - - class AES_128_CBC: - - def __init__(self, key, iv = None): - self._aes = AES(key) - if iv is None: - self._last_cipherblock = [ 0 ] * 16 - elif len(iv) != 16: - raise_exception( ValueError('initialization vector must be 16 bytes') ) - else: - self._last_cipherblock = iv - - - def encrypt(self, plaintext): - if len(plaintext) != 16: - raise_exception( ValueError('plaintext block must be 16 bytes') ) - - precipherblock = [ (p ^ l) for (p, l) in zip(plaintext, self._last_cipherblock) ] - self._last_cipherblock = self._aes.encrypt(precipherblock) - - return b''.join(map(lambda x: x.to_bytes(1, 'little'), self._last_cipherblock)) - - def decrypt(self, ciphertext): - if len(ciphertext) != 16: - raise_exception( ValueError('ciphertext block must be 16 bytes') ) - - cipherblock = ciphertext - plaintext = [ (p ^ l) for (p, l) in zip(self._aes.decrypt(cipherblock), self._last_cipherblock) ] - self._last_cipherblock = cipherblock - - return b''.join(map(lambda x: x.to_bytes(1, 'little'), plaintext)) - - ISP_PROG = '789cbcbc7d5c1357d6007c6792c924080a0e1890d82201a2acebc38a4aab960d428862eb636b85ea56171d10b5dacafa416dcb4a48263122453a60c0604bb182b25bd71535ada8011569edf787623fb4688080a2420522cac77befcc04d0769f7dff787faffec2ccbdf7dc73cf3df79c73cfb91f33f1e0dd331f5ec300061efdb7695144c4a64541f0a746bfe9161c00363b7bcca6dd2f44e8d4588c2e069bab9b8bc5ea62b1385d1ca6d169b0785d3ca6d569b179ba79d87cdd7c2c4197802dd02dc09ed53d8b3da77b0e5ba85b88fdafee7f8b576d2ac52336794780c500747c077f8b31f884bfc5387cc2df62117cc2df62317cc2df62023ee16fb1043ee16f31099ff0b7580a9ff0b758069ff0b7d8033ee16ff128f884bfc59ef0097f8bbde013fe168f864ff85b3c063ee1cfe283015617532cff9b0c50f85117f537bc6f53a8ba93c2fc40343636ffb5a08db12b7dc635de0b0e9a4eff8ce346bc6d2c5d84e32b7dc6375a7058371bbfbd49a9ee1c2ddafb0e4e4fc4f4477140efc041f6aa89d86b20287013088a40ef58baa4c9a37574fbd88e715de3ef3fd157d658de54d97ab8fd68c789ae93f7cff4cdbd1edf9cd0b6f0f60b9d89ddcb7a57f4dfb8ded27cb3edceed5f3b7bba1ff40ef4ab82306f55888fb76ad2446fd5943f79ab8262c6aa429e1fab9ab472ac6a4afa585590ce571592efab9af4beaf6acabf7d5541b5e35421df8c534dba3e4e35a5731cac1f00eb07c0fa01b07e00ac1f08eb07c2fa81b07e20ac3f01d69f00eb4f80f527c0fa4fc2fa4fc2fa4fc2fa4f6e0a0d9a7e2fd47bba87d117a79710e06ed0918501a57723364edae4ed37bd2c79eeca1b2bf1bf95fd6deea61b9b2429e529f1a92da992ade55be3335a323cd654ae49587b73adc71b956f24bc79f3cdd1eb0faf5fb8e1ce86d17f3ffcf785dbef6c2761df4c413a6f7222e6639aa8f32183b1b1a660dd5852895126a58e2243305f5388ce970cc5fc4ca13a3f320c1b670ad38d235598dca4d2c9c94998bf6992ce9f9c8c059826eb02c8706cbc295c379efc031668fa832e909c82294c53740af28fd804d31f7513c8a9d813a6a9ba27c8ffc19e34fd8fee490ac382d038010047a9d1a3696cebb8f6f11d4f7405df0febab6c3cdc74b4f544fbc98e335d67ef5fe84bb8beb0f985b6c4dbcb3a5774afea5ddd7ff3fa9de65fdb7a6e3fe81ce8be171c01f6f4de0bf69ebea71f2f93947b548e3e3cf6e8b813e34f3e71a6acacbcbcb2f2f0e1a3474f9c3879f2cc99b9fbe32b12feb1f05f2f5425da9655afb0dfd8df5271f31f77fef56b558fed41f5809d97adb99fbb650bc995f24830b02c02c099551a22945f74978bfe8d037ce5977fdbb47b1ab803ff8e9d6e0b06c09a8def409a969d1cbc72eeaa1babf04d659be66ebeb159925a9e1abfba65b524a33c23fef596d73dd656ae4d5877739dc79b956f26bc75f3add11b0e6f58f8ea9d57476f3fbc7d6cd0d1a01726fe3a71ecb4a3d35e88fc35725cc88990c4d09ed071334fcc4c8cea891a3fe9e4a465931f4c1e3febe4ac65b31fcc7e62ca99292bfe38f0c727a2cf44aff8f3c09fdddc8df191346d52a93b192dad7001426351a39e349aee65c4456c028bbcbbed166f94937ca42c19d3c460d95972020314c1b45848d85713d9429b2b805c04b22851ec715a2402b8de0da369b2c027cbd439ccb9b98c595b55d78deb3ee561f547ddb0088fbede749db98b68b100d45ad0030b09b25893ea88f933a1bd5fb812f82b4b66b472584789bbae217a1006049bf661eeb9181fbec5d026be56e8cf0246ae5e0c06db066940df2397624034efa51f27686743547c4fd27eb2c05cfd276b7ef29a5742cff6f7c722d3480c53159d0b34f50c5e3947688bea2b0be909c771f8f6d9e78b75a1812602d05d2740a04902749a4006a6e8669cf523715d7ef1bb53f7740e280f9240f90109304d76164188b4dd831f7d9769171d242591c409c0104a4060d76d3c35af7fc353c3cc13e8f996cf5ff32da4a6483a448df2033906e918775cbc6b314502bc9ab0a9a79a1ea363fd301d8476ea9ea2cf2802e0cccdfcf8a224bf1cc7130dbf4bd9161ba24aa421206507bf4bb5ef5a8c30ce961e57d39baf8040528ab0ef80d8d7b4021efbd43dc5ef6eb0454a61ad7952d49f5292ecb5633ec5da4900ce39f18c46d2ae1477027e541b3b6f40192256f263ce9ab4e74be840d2cd5bdf9863dfbd087f459f7dbf5817865aa6375f86adc23ec5073230f56a3360c7c156df0978f74461fa233de038ca5c028c0471f453fbb6f4b0f6fea44ac3164d7087a44be9db09e44d0050e20f8ef2f29d75a5b969825bd6bf7f46780b6ad069428577f5d57f6b266a2c119c5ea7d5a17ceebd7175be66b2f01eb4ba50f347e13d39b558f327377cca3ecd0c373cad48e6a475b6eb582d27b7fb25aea3eff3124cb88e5de2dfa4aea3823e5595d032c8bd2b9f29cb49dcdd4728e148223c39d859aec3ba783ea7622e166fd670b991aec33c97b37e2adb886fbe9182693490d39385fe645d982fbcd57ca24394f27dff52b19eab3dc75589dadfbf833c7888a7887455fea02db4613ec1ad85da704304f060187e3c817b3cc1e77aad0ea03155822e3037058d2ce643119d40d22ed0d227d2744208c28ccab6a59bb54acf4e604d22b0fdf0c926318075b9c60413cb73255dc11d539ba6352a27bcefc6fe73596af6ea49d2a9c67c8d203f5f107142d9032cd4318a19403de5fb89f9b064563f92350ebbf831eced4a3f37deaccbbc6cbab1667de2964a840348464a6ccd776e3916d2756ed8e5e9658d0bbb5ee8486c5fd6baa2c9d814d69770bfd23c75e73403eb01bca95100b78c82e3999353206b2f4f96a4dcd83c775bd936fc8d1bebe6be52f60aa6590971b0aede31b34d0fd4274df4a6265066b21a4830a124cc4c6fb6024a068da36d14f89659c8044a6420dbc2ca65b88ead3684c454cb9ec6a2f75eef5b6e9b90fec27d6aaf044fec5ad6b1aa955a7613937f0ee5dcf39fff237b257f5d59ebc5c6857d2bda8dede54de186a9e6a3e61339abf6068e0a0cb6eedc39917e4f065a92e3a15720597b63dbdc37cadec0dfbcf1cadcf5982614d1062d8bd52083f62d0a63c5002fd4d27732447a9507b861c936e56a794e8b054e1b00253770dcfe214fe9d709ca8d0970d426b9397e88b58821eda125d1c5d5e662f552db87ffa57e7f9252c26329d46cb0b3e41151f479413f740534924f91d69965d6565b9c40de0380287e4f26b29ef5e0873c3e2df93b21a4832fe854256795958963c28c1719374dea8f8edb20de51d1e7adb0e5e80b1617d227d59b103b7c1369c93747623f91f128f6b0d7ddd8116e96f40e5656f68cd6208c124829872b6deb6ea8c9e85d5fafda6ae986cfba199bf6c557c306aaf79c0097f22c1097fec2ea4db3e50d029d8ab3caf0c431efa31e8f7e943253fa30366d3a8f6dc9abbfc5667c95c7c6e35a3de64f36269e9ff5f65f7d3a3da1234a2605d083ea8a1487629506229e85da2ad32c6c97f4ed47f3f0d30620580909f408bcbbc5487f59e253acbc90e75bf2ff5a4938037c46e28a67034d72902dd7b1fe9f7f6951665500ff676bd36a49badb092047462bbebeb171eee6b2cdf8b61b6b31cd44a4ff490e8b73c037c5468a413e4999e240b985dedb027c5b154d3638bb9c2950fe530cda6c8a56ffa63a3bd2466f2f497b702bb2dfe106c106cc310fc9558d3a9811de52ad0401dc29f59f052f62d68d64de2a553230fe899f182fd3c863112f684c5fef0744f50428237fc8b39a9cbfb27b4851ed3b7e5a7a6dc313706001453afb584b1838692989dd961edc11d69ed02ae95ad874d272d430d5106ece3689ea0ae1583080d0220ba3af3f00ce92e8791cdc203f85fca737bb406ed29252914a0664398483ea768d11f4610f169a9f34bf590f4b58a70a28837a812ee9c3838a18734e6f030f536a13f8fd0f2c34b3f70b1b2afbe2277dfd1238c61a48791da4fc529efe422aa08c0c382b41ef5bc00dc9d5b7f5f597802e0cf54b54df0ce672cf6e60633ebacd32c4b455e4f2bc89aafea480bb6cbd6b907ebb073727edcfea02fc9c31776dd95a644d451a09389437511378450e989c6ab2437d3bafaa9ec43267e8545bba09496654ad4daf2d00a2f906484795538589e67f00e6caaad27a61de31b04a16b9b6176093a1cd12d5b2c55fe19bcb36f2d8e57590b7c48156cd4a5e2a453762b6446e39e4b6f91f30f38571b6220b3f6350affd1eeadb79288362ac8cfc264f14df041298b912f4d605564996bf8d8509a35eb1e5b408f65d0f79130c7ba987bd3fcb3dbbe188208df0d1d20627609230fb0e772bd7561ecfce8af16109b5d847037d457efe6e2d4b668945623fe8efca23398fd1b92d1dcd50480a04d9eae761d577047fe113997b7ebddf99ca4b1be477903b57fd23df73e247615c9f8e9248012531e23a8dbc1b9534cf164a9e146cd16cbe46f315b94b8ae6f75982accfd069dc584b7f853601ea3d6b943c2597406849d859f350a9fa571e834690a9a069f22ed8a6386e062b0eea97f7c2329979bae71aa659b1e8f62f8a45fd3f21dd42165929ce0716d4ea07e474812aafeb763dd49704260220dbbd5f8cb9b5f0334e2311f471324290708fe7a0feee27df07c8be1050efa047c0d1947c1e7a0350c2a03feac94b80a31ff9fdd093f5a4bd9b718a38e225b4d84711355ec35e3bfd90228f7839fc9b0784f20714f1b5579d8dd74e4957a5018bb342cb423b6d82342349ae321980a88e04539b08b1405b6f59ea75489da43dbc696aa390e7ca4e0d4e15f03e44140ad2d983e82a89a1039b81cec9684b6a271e549612a037299a817eb396363981399e7ebb01ce58fd362b0c3a108dd60632c6e1dd3c60d6d6424b5ee3458feb0645b57046f56cb3b192afbdfa931c3e97fa50ce11af54fb33b1e1263afd1cce66b840ade3f47576ab64f0999d27f7783a3c9d31a46343c380cf0dd80fc939f54e095aebd9b3272dab1cfa6736e849da8012fef613f0097ffbc5f0097ffb45f0097ffb71f884bffd187cc2df7e009ff00767f7eeee31ec1e065cca65f71018f717bf94bbd4c6ee5101be0d63b6332becc19eac5af984bce83d8ef473f7f7d996a697b7571aa63265d0533376093235da52cfcd4f47cf3432da334d0affb2d4e876b336faeb53f3c2fb0862eafdf0aeac35f9ce30c13667f93f2b1d8a3263f52af128264777570f3d01d64506153b2942ec21c8b6875e2ec6288b4a443f4702591af40cfcbb00aab12d2353de9ba79cd4e511c64448cbdc734040ff8b3ed70fc5fd5f38c1981734cf4a85f739e51b259bc3989694541491f03af76b25b38316a2c4ce4a13438aa095dc3018c954a833fd90a5086e94405f4ae97f1c2803ea80328200cae9f03789f050ce81cf2002578610f8c4789d06c6ac1e8265ba619173de7a97a28f7f4b73cd6914defae634f16fa641707f4e2ba2154fe1a49e9ba9627b2c7e0045b4be3c55b1cff0d682e914caef0be90e3eed007c9ae870d717d27785f201771f84f1e89f334ff799d022af67fd7c6ce1bc3fa75d9a023dbd90ae1758d2b058f954d70bc86b5646885f10eade95ae21e20f08be71e91de97a59fca76e4ff936a39df349aa4db14ee7d46991b6e81b082c20bdecfec58e6f5b8d7de55d5fb65f6efab17145dfaafbabbbd675bcdafe7eceb49d6866bd545fb2a1ae1e8d9efe690f40b954801e4b7ac3114da0b3487f4ca35b802da0c1a849b2dbcb8c87342b18617d6207ed45841144b5c79698c45df4a6bf60cb76499315eb7d17d15d15617171c74be8af0daa6b4c9851807f47915cc62430e51645a3901346fb13ded53bf7aa090d5dec0150295f521392d9a68ff2c0caad91a3acea2a8345ad7c6a2f38de77a8741806b4f627fde9d21f0fea4fca80fe9819d4cafaaf941be94d56f0a3714eb2e7ebbab0446302936da113a15c435c957bcdbb9054299faa04db7a75da968df19bcb374bb6b5ac8d5f57be4ef2ca8d37e7be55f6169e796343342383f219350a64e9127471d4825135cb6da815d169d44a5c5cb9c921f31a10417e4993d9ad64109d2df1a637ec93c2f7799f5e142ff25c5f2d2ec1bd72ad5e041cd509e0a6a5fa7c8188eeee024468b5f800466590eae5e7ca514ff839f809bfe67f6b914fc26990931423bdeb4ffad88e686017dc1ac49ea3163c1cf47ad6fcec7c9be7fa578de1c2aa4d4d3aa2a22c8dca70d9a83452aaf46f028a76f1d7772cd58663318ac6b8f3374d370df4a67e70d3244d8e365e66a2859a59db5e8a2b4b9bf0de4be7fd934fc211e1b8bd37d26bdf10b7757d9da7c38c6e1a83322b4dcb3b3dd7bbb99f1ccc6bbbcb856835db14ebe9e60a00c7fecdab38bd691fb8690883ad0954feede5b8d9268b5a91fcd27934facf3f1c1ec520c9d26f26db6e9ae87bffc07e3455d737e04fc1b14323576d6cc0714ba5c1115bdad37c5c5f0df95f6d0698a65656586df50804e955f4829f011ae915dc3843c805a53f669e5e65bce6f64a5f7939ee86a1da648a79f9bc22f9066ab91a4591617dc35164c2fd855de13b0fef64c5c40b581cb1a0ff2fe6f660e6b7f1238a1e451f430d396400fd4fd3dfcb8021f907bb3e4986d16f3e047af9648c36656017991798ecbdf3776121709e1f75dd3e21ddd85ed65ade84a2c217eea3987145fbaad6d54dac690b9cb71a71fa0d17ce76918336b49e86bcc32e0bfe6fada216d3fc5e9c58b69e8b13616ce8b873ac2fdc2c8ce44a96dcf8a4a50d5a10f3a7bfd28d1631db301de85428560894cbc16872a105a4b11272901ef73d00af9955f468935891e2bfde774da7b5cc5274c7f756511a95260745ce95a55443018c253a44d867f95abad929651b5280d564123d868d20073335b4ec18f04f49b7464a2c6afa853a8ffe2846253a26c32dcdc87e12b768fc98b77f4a7fbc00f1f30529ebf4058aa62a490180811e501e6db8c93d4f36b4b269e3c0ae3bbb6e96b4045bbc1d6ea9ab79115a67ecd2e96f102dc04ada8803707e5713b413463c0de721654ec93e1803aafdf89c2e989341e6db59897a094b36928ee6962eb62104b39aeac967ecbeebe97912a0585370b7e46615d90426db661a66d82d2d9082d3271ab9e7f1138d0826d8a248639d72a070ee83b83a9e147d6406f48d96715e7a4c1598a852132a261e71a36acf058e23552d124c8eea3f7df9475f9a82bcf66ef76d058eac3b810d103a36927200910de2589526a9da9a068a5b3aad12117acb57355fcb5c38ccdd18f942cbac1dd18c68fa0e8c0e100710a1ecd6192046dafc80ed8902f43e8902e161b5f7067bf3e4887711aeef518e4444a7c0992440a4809a82898ee500f68df383b4732f8834ed55f76be92f9ce1fc8c4b9a503d8a24dfcca27de9fea4c85d7fc1c20a66eda4f7f5f85362315e3664979233fb93c273e831dd41f46606a3adb3275afaa480ddd5be5354e10926bec779a0a5ce9df4b8f57256feac887e871ca7b7c9b0c4022ac51764398576b6eb21b43f4d6f75018ee23fbbdee24b9c993077a34bc1e53ee57a6b4925956801f9f1f4f50b6236310d588d4651a0711c081c370e8c962cdc43119241ef55b47f9d84d05a2f87a9abc635008ef3a8fe9c86b3d276ef56d006eea41fff269e6ebe00ac9213442df4ff90bc5c006c623dc4d822c944397e7c8e0be66c25d3ed1401e54502e5656ddd7d365185598d17c8a536ef75b4a40ef8aeeedceb78a56140faaac6e69be2bdbe736fd58e3d6afa2f4f88786956ac89240b40d99edd7715bc34db9ca7b8a7dd799275fa03cfbb9eb7144ee59171d81fabe8cfa410b2643592ad9216c51a54c7a77a9a21e0748cdcf795fe28c7db2d8d5ea7f355bc6c345f6baeaa345db5136999e4ac82fe8ccc5d85c7f5333de0cc40efe9f1e0da389ef657eaad8740a7a5259ea0565b056d5db495488ddc5901961564fa55657c00223d1ea823dfa804df0e8d6be35f2186806e18bdd38427f4543c07830bb104344a91446a4cb5498b85ef953be1d806bbd653ebc6f3ba7a24ed5fcae90b308771b623534bbf9a2462b4cae9d0f2c1f12e49ebb44642fb4e375b0094b44f9ce221fdf59f70a68acc89f9f83d0e5fb86bb5d9aeb7e500cab07320a688c9a9cd531e7b080ec45799724081b3e09623c3f433cb8cc286e6f8535baaa145c104bb01f9cc69e9c99e0f746790471dbe87f6ade3d6a3f55a0238726d0304d16fabaa3f00f6e54492753082d8a7a5efd4834a13bdb1d9437f81000cc910fbf31a061c379d03d0966edd02cbf22f8e2c617b3240bf8ddd6a1aa48c923ebaa35ea2af2280fe2803f4760213d9194c7f86c04567185c544588f41f31229661c4ca231940f41133a83c9604941fb930e52927a63cd220521eab17293f4ac395a7e422e8718a95a7c8c12db6dd2bdf27df2794a7ea071cb7202d4dce9eec2cfade017195b10ed0db2fe1aca66750a7ed97d36c378c1d224d3d40348f849a5c0fc22d4a4062576d91a66ea08f87796437a45c091a8043de037ba4d336dbe5cd9cff399f8fa4639f13d2f3f8b463c984f4b25663fb54c3a3f3d25126a03d3ea525f9d159275488cbceb1953ba735b9e3c0b254fd4cc320b4b0386bde82b1a3c48354ef8541fa419408cd64d443d9203f9ba589a05f53fa006009683e7b81791c378c4a47c1d9ecd5ea3e3a69ed0cde2a988cdeaf5499fe8015a5d1d21e406d710e46174a5309f3c4dbe9d62a591ba0bd7bc414310aa72f1c12ff68ad32af8de1e5338361db0280f2d86ce8c51a061399e09d6c6f00a86a5b8b29e74c1f14e4f1ee013b7d712d56f45ac92b457715b7ae196694a17d7a66279d2f09d64f170f5619ac6ad14903a0deb83898b0973692fe55322d462b7a3c5812b6f965efb8a23525eb29897990da29c614778b6e516496984ead97b2928df8b726baff02502497b42a524adae1bc2ca21df5e218316b12e3fec9450eff9422a7ff9aa25b55a6140c512e6f00689de1759ef228ac2485c9a96a4bc394c7a66389eef8ade99be38a35251d8af5255d34d902908d86f8441abb62237c1795dc1745c1b13089c5457de9f632e88108a3f4d35a3b7d61ad17ea2b472f23c6509f11fd886e16d1dd58ef41911b713ab31e40fa5a217ded14a2fa354435ac812b9215d715298a66c51a455b514a95716d4c663c9153659a8ed11b2f8faf5a7b0b205aab98148c6d19070a9a8bd26a894486f726049e6f77f7a4b101f1ec6a35e44087fffa22d89b1eae37b01dd14ad41b462ce67ba4873d2ae97bdee68e344bbf7cde46abd7c94ad617ad71f765a80f77eac5bfdb870df5e0b77df8d6fc47fbefb5dff93bed5f1f6effc2751bec45c7e020f458e9f09d0e9c68413014490cf65aaf59e82227d03fcd0cb2bd9f0e5e2cde508568e4686ba99770b46daf17fb27fb5ff74ff16fe668a3eb718a84fe334960be7481c337adc0e9ff4ad1ad32c6cdabe4f5d871ff35fe6dfeebfd6f73749270d44902ff14d1498a458a4edfcd302df2edaeb5559a824d1bec6e5a1bab37d82f9a275455b5b57163e3f6ed3e3c8de2d070c354c6922403ca7f925f4b9a2c47382b5bc8cf07281ffa075f97c4e69f53d49425e32968b717d59a6ad0178662109eb3caa57be8f90478794da5e5e55637148a0632f95502180fdcb6a1d8d3bd8abbb049d2c5ba48ef4ac354c334f309b3f93384cd1c8fc50b12fed6a3b5f57e21185abffcd298602c5b3b776d1883569684f521e2117af8faaff727a138880eec06fd19fd021637658cb08e31afb5df866a096b6063dddc38cacc34721cd94fd6b8391294339223ce338f7204f341168735a5b58435551a76d0c1ad12684d03eae6cc373b7919516322391c5d3929aa65d91e13f8f80edb4362e63b07b42535304e13a3382d73095a2b2fe356cbf37398cfa6acd77dc19271240d2dbb7bed063cab9c231623ee2843c48075d9fa514f14eb61bcc6458a26c0a78bb9b5178a044190cf93e81d4e184bbb71346ee4ca5c7240d42b1629c3c400ad2e2bbe57acc734a707b9151f17299df1933bee3c6033e760da7c87ffa297ce77da1f919932f230e45029c7f3e5233954ffcf473934bc767bbc168dfa48de64dd5d8f4e3df07bb5e3ffc3da11bf2a7c1d51b7cfc1c33c52d2364db31e08efe3b0f9cf950ef7b7d463ce9a707371bde7eb6128fa5f4c80cca5027629cc5def8653cffc3d8e374e471c9ff296ee53774e4d24cc91f0b4d7fc826851fac3b1108b3d981c6e958da322abd1fd56f32d0f0bae0dd398ec89d6471318b4228fd648f5165e3b280b298a61d15a2ad212e87300c42dfa1d893791063de7ac1ff28a34caa26e403fd7083e5a4a2734425fe7d17d83a752321b4487203d7ba244ca5231a07f944817ad41fdcdcf29ae57c44d787bcefae273735e82cf14cfd775f18827fd49fa44a82d13ba41897a8b964e7549a3487510414626b90091f3c7affa3358936bbbfffaee3cab85c4d0daaa7f23920c248394254a44bf44221fd417d5cf77cc6b9db25e591a829dfee6715e0605215e7e6cf37c1d8b6760cb386c39dce818dbdd53a2fef817d832e3044bb57481538cea4fb0b14e092781994bfe64d77fcc608e9db20ed1c704f0ca511e9981cd963d1da3d3fa384a9e7ff9bc6379d05d14f95f342e3472a3ac2d1d5a3bc9b45716cf961d5277daddebd409ad8fcba0ba1e491636fff8b961590cfaf5ff92c5c68f86252cab0941869bff136c8d7d78e46bda1f1df9619b38d520e98231fc0f286e9fef12e42b05f9d3449a218d255dfd910693bab328ace04f5999bed3c4f45fd13e8c403ffdb81ce83443ab49650847b9c531bebbaf8ac852bbf3b34ae1984de8c6872193df1341c8fef82ab259edf8aee701f2ad59a3b1b860151ffbfae55a5aa0d7feaff2ca95368453b78b6df20506a705faf2d097ad2c894d6066431a515af94fd34141bf97129a421b6d249e402719c29ac20d870d9276a17f89fae3d057318a07e597904f5ae7645dcd8391c61ee0bf5af4148131e6742b3de113f1498bb94d64130f16bfbd7bdd494bd1abfe77bc6f5190a6a216ce639ad5d0c4fb8ada3c1841b63b81608f8b77d1ee1dc9c6b660666eca8d64645fe5f70607e1ccb1c8bf059b57785d7f5c3c68b902e177b436e6be7dd8b26b1dbdd34fa6ffc8087d763f4cf9d147a08a6801bb52197361f3498bff3a7a825462b98456349aafd2729b447e195230e3f235eef9cce59f8bee14dd24e6f1d4214f5de17050d2fb14d9f1249de212530d51805f3360b455967ae09dfa4d1e57737acf152b2907568b1cbc4d565a8a68ca480eee86b8a0377037df46ccfbd0eefdaaf75dff9bcb6dd4650bf0d1d22ba19fd3900602499328502217a2e2f03d2c1f1517d549186d60924a1d0999a1485d9e67419cfab7f3db5d7776df2c68f3bd5377fa79a8ebf5b03e8a8a29b48a92560fa80694e3845131855651b81c17ccc98051310ba3620aada2b4d5dda71a54582059cf47c5304af15f9d6e75dc720e78c2a898f71186e6522d9c293e2413dc3345a9549829b468a650253c3a53cc480f6b3ecccde6c16d92dbd30cf4cf30d66a80f35da904208bcddc6549a09e7030423ad31d7d8c2d5bedf85fa2ef57ed3369446a6f9e2cad388fb5c178fa2c825434c248276b72297c172b1a31cdcde48494ca14af95fc6a38d23e4917d23f73ce5483f92b96dc4c2a1a15ed8c56f1b55b9f9036bd0822a02516e6899eb2d47073985bf3ce61b7853933689babd3caed26439bb5dc6e710e422fbce2ad53edc826481ba5edd01a49394f244df1f53b5ae61cf26b866c880cfb14c1210c720e034aa13d5ca57f085668ff0d473f2067ba395ad33392a3e48cdffa6b7c4daede41729abb5e63ebc87aa63ffd7e3d61fca6ba6ba96f3e327e531fad85fe8f262c0da8efce29488e337f41d608d34cd3e37ab4e737bf0d49226c6f991c6280f15df8c4d27c5279981c70dc760e4c6db20471b44d117ccb5eb9065986504638219625ec4d9904b8361eaed14b483bcb52e59707072949cb3a4c63698096a89a5c35f414f61a050b9f294dcbb65cb287bbfd58198fa3d4e1de89acb9278735a15df9ab82ee7c884e63629a6f6c01e9173bbe6c0f371f36cb0f70fbc37d96039c3d7860ec2bbb5fdef56debe5a6a3869982bc80f485c68b0c0fa97928e07dcd7288b3f3a388f9964af8b6b3f221e5e18d8b3e32702b2805c9a213329060b212bd3072954d76c700ac5986d78a1d13e6f7cb0fa1bde3f92a268eaf1fced5f74d163d2543f12e58dc3df36bab490ce6f645df9fd92578462b443365b0e4e9afad4cd7e0b4f6a9ade11d7c0958beeaf5b3197846d9d655abcfa686377eb92391318708f4a75232191e2376bc13f79022762f1678a5a7e43380a582df4b3b6911559100d797688a36e43b645fe85ba0edd6462676e3f4eb97c18179ba5b251b26e41575a2dde006bcd956054b441026708704446ee9c6ab1a60fc230122fa672926fa84009464a3887a7d1ea07dd10efd468220fffdeefe310d03a9f6ff7f5af834aff8ab82f98c36a0b4dad483cf86b81c6f5d1e3830cfec74b732fba56e7cf7fcd910f35963f5ff4bdc9fda96a72f6b15cd96e02f74bc3c57146e84767514286b9ced71533ddbe0548bb417003ac5b6b02bb1ddd8b4a20949d851837e9611f33997395d5f2f06e69cfcfa9279315a3adf29d9369d7e518dcd16c7c594245b4789c1819c03e7f475e741716d02935dcc43ef3bc741bfe714b30410b9f359228b80dea0033e4994476bd404ca0ff4100326e7d0ad44eb81d2895a47bef341e67464f5018ea0fa673b166c1c0c24bb06cb4cf46231d069678b5dea6d3608b9dbd987f02fb1bb5bc99cb5c536fcee58a0fe4dbd743bd7b2711dc678e8eb1e0cdeee2d499ea8c5420ee4d0d94efcf7f75bdc94644e772cc81ae8b44f65e44a6e9fb8b56025a60d8df59b7768dee4855692e867075c63742a7afb779895ecee45a7dae8e4fbb8952c7c403372ace0baff593882e41d9c9188ea7a069f79afd306e11e2238c7aafb0310aeefba1dcd4409d7bfecfbf6fee52ec9ede0b61f3ba0d7689ed6c4ca309cf2f81a673d80a82c8d32c9c1ac267d1d098adbf8b9c5636dcbb6f837cadf90bce9c59de25b84d366e403cf6cc48bb357cf349419db6c7aad4e845f53e298b8d6aaf4ecc4fb93ced47cd99add4e492270374e7466625bb3084252300ec02e6c8390d7718a2cc569aa793465527130709e9b4b198c20fa1afd130910348ae6a834180942e8e86b684d0e5aeb47b072387c9a3d791cfe6a8485250d805e4c82cca49335d1068996d6920051d9cbd1c792a564b811e2f1284b638d723093c3c36859c96e093dea9227ed28f766255904ed75692c7dabdcc3318ab8837a0e7dce0e965884435fbf78a28d1ea5c168b044e41857f72bc28de6cac9a5fc1ba2b713f7b1f12939f8c2ce8d231c9150ed4c836383ebd78dd229eed38cd77fd54eb00d97d3afb8c07069e92fbf6acfd43c63cfaef9a39d95d448745ac7844b5d65ab59d338100de99640ba1dbe755dac298c4b8f03666d28848c90d0e24b6359895ae278f252d3a1f813e7e9174940684fd6c8b4d428c89d12a7549a4cbf44405e7d8d4712a56a25de299ee22f58f423a907210e92f6b8349abe510e39d621a1b16e4fe877900e7977a3bbbfa8978c5606611791347109875c83e597aed5c2f6b0507d3c1c6d827940cdf003b7f77a104b72959eefe301a5bf43cd3e276c5b9a3cdf46206b80ff67cad41f3e7d50aa7697ce7eac34ebdf11fe17872299e413c441423bc51f6207d2e45adbfbda335cbb0ce4286a15b6a8be6ed36bc4509e511a2f5e6620aa15c9e8fd4ceb33ef598d24a0250d8021f5175c83ba1624d71a5bcb6a4672a2fd926d42fa99a639dee83ce1d4ae69f767f69d6c3cdb7aa13dbae95e98ba93f709ea0f6626461ba699fea7c2e989a9c6808e315b1e5e89f573305acecf9fe42ae7bcd8f2867254c6bdff93fc0003b9a5255abaa807102a2eef03e70775b621887f906518e84f24e25f56eb54dd83e8aec509d3bf545d9e3aae85dbae97d5dfdc421ebdf2605d29f72c6f2e45255c9b53c87731d07b8fa74f7b29dc58b67a076d21d07c9ffa9130f6a7510fa0e68cc0dafd5011475b7bc42fabad46d720e7e14fbebc974ef81a70341d70eee59eff228b86e8ac208b3080d680f8f3bf9e7174800d302a8e8a3fb8f6e8b4c76dfd490786fbf52fb20003acf46b82bf61b609d2b2c48ef98435210e571a368580235e1a7eb6562fc1fdb0fc48a210b769c7201f31247249377e4f058ee8f21cb72b06f89527e10cb686ff899e324a85f99dc67ca88cfb634e5af4f524086e9d668051bf30f757a49fb48435e93f22c161c39cbf3ff5c6f4ad53d64f5a13f137497b76d1a456849762e200bfaa854e99859b10afee858223f272745aae7c31ef191d582cac115cc34a79b8c3a6b3460e8e2b0f4d9cb683af615ce43e658f95224f6caab99291172298d414defffab21d7960d35a4f1866093e58cd95b9ab2f0a50042dd46fe07d30990cfa607b910fb58efeef3e58d0f78ffb60b250e88371f56faefaef3e58f285ffe483d59cffcf3e58cde7c33ed8a3e754641c5f679a8e1aa71a2b052f33b5cdbd129a7c87f3d8f8feb6fe06ee861baef1d6301c68791cae79082eb96d043ec76ff0fd3c84af6504beebbfc1f7d310bea611f8aefd06df8f43f8ae8fc0f7b3fe1a01d05a82a49d1d8806b9daa9067af78078570ca10dbcb205047ed70cac57ba81b54183b183dda4f5521dc83553afdfc702c788007bff3e16fdf66cb90dd03b7e11edd3300b69c68ecf345532478d7cabccb560a340d18fc3ad967eaf5b18b8e28c9a968c46a7e4ff8cf6b3de961e2dd21f9702a87ff30e5baa886ea0af2340e0133300415415d66155ad1f01742ada71ae79808abd37486d7912509b28c0fa3d05bcdae8bda371733c3dba01ed7083069c89a7c735006bd10ecc7a6547ccd1c28083d622297c97c65cb2eb26d5d91da6d103270a9547fcb061edb9f0e4d6a6f18d6502e5a99f09dc3a441171c07df21ac6b902b77273bc10aff63811af688c0a841ce239b50550033ca7223739c03ec82d17d69f4368ab9c6900f18a252270c439e853c9cee02cb111276269e2cc237c23be73f30dd40ff32da8168b652fd9d4e6bac7b946412e1cb6d032917866a1fe2902dd31da331354310d20f2f227e81e51561d08344a8043d33230c25e780ff7b7f9bcd0dfbd23fb3badf0397be60c382b2657e0313e320d3a6b37cd20442dbec18c3b52a588ac07d959136b2df57f45762c86ee41f092a6e1b65a64423b12415a0bca929f5f82eaa213974a5bc59aec2cf90c0fb46e15939d155a67b171e729628ba0bdfc771a6f87a32da210d3a05e553f5869c07db3e5d86e2fcdf25d42ccfad0e67a805b4da4b43aa91b8fd28c415c0cb9918c4ef4572575e17353221b2af02a57055ed488694a9a782b8a6c33531be33395a12459121d3a33fd35b7befc625932ead370df8623b4fa127784c668e9db158095878228e84d47172a62b8b5bd5a84357309c4aca5ef56000fc2068161f41e0be7849c80faa25842b3cd5a748e87599ebe4563143413bc05231fb14ee3c1f054942ec0e2e5fb21d744225f4a0abca9a444353b2e0ccabc0a9480bd7bce1496ccd51f24faa82d3d98f5b209637656ef2907552de3b089a4b2f4529f075900665af461649fb5c1823139d5b00397f29441ae3e22cc315ef270a709d346117f5834317ed762769c0a54ee51969e18bd2b9650e5c3fa273c1d7ef503e5c9fced1e8aecc02b4df4ba0ae835778cc95c42afb6e1d97ef20ab452a8f2e8d59d2c2c8ab149fa40ff388471275969d9925774cecd09e8c1e1f49d0ac9f01ad1c2a6171a11a6a986fe247a8d4dcc925924369f7ebb1baf344479fc61112b03a24042c671f75b4b492c1777ec35015a5a88622e52e0988b98ec98f074ff881d996e9d7678f5165f17cda035a77eee84f33de8ad502612b74980673039d3a20c82febbc5044eee91a5c154300994212440f72544da34b59fc346004f4ae22d46bc39bc07ad9a112ac7f8fa01426bb9006556d712cdee69005124f09c69b14982201e6e654d02e6a2b8d972410a58e3eae7294990f8844517af3c02f11f83fe5f582de9d87b6100d5807ebd64a6e5c5585d58f1d9fea8e641260d4a70d6bd0a6d04e299b7986eaec0918f654d5a02c693272d3bc92815f03c096589894763bd240fdda11ce632ac71b302e07e50e23cb7e9a20b3d876491eb3b1924ae323971e4bfc8ebd15a8c495b697907e2dd05c34e0e663a65d18ae845a4c7d3e9923e74b326a163613baa7b6fb23a02f18d2a6800330ba2c820106c898b154d26812e84da23c6b17728bf3028410573b1c9ba30df73149925dd14a58dd894268e70b7cbb7a9551fe5da2ca265f53bd2a636e196b2541bc4175d1057732f431c61463cd871af828cd8b47b7e843228041bbe79339541376fa6c2b1ecd4d2372a46e382049221db74b3a0fe31e693966c531419b748f1975eebd55ccf9fb2b350ea652ef5ec50ca5ae807baadfd36772a14dcb6d60da56680abd64fedee94069cb67e3354b604cd58fd4b864a5351fae192a1f22d28ed7a7ea89cbbb577f7f9a1f24294fea570a8fc004adb0b6d3649dca29f976566580b8fc3feb8b6f7e65dcdfdfcc7ec2c3edf5a5807d01eee6d9b3b7d096ccba8b3bb53cd203de38ba1b26eb032e39ba132028bc9f861a8cc0fc3325287ca42b128b26f3075a874064cdf1f5c3954ae81e98ec19543e54b60ba71f0c050792a4cd70c1e182adf02d35983ef0f9533300d06df1f2a2f44e981d0a1f20328dd173adc2b946e9c68e722fdd60adc3dbe5aaf91e38ba04be211a64c39c28978b5eb0292740ecf63259f5fb8cae12f4978acc6c55e6e5414499ca434d40aa991b28152c3b28152c3b28152c3b281528fc80687f5d9860ff9917f04ebcb8f607df911ac2f3f8215a578895932542ab432542e48d850392f51cff33c4d7c4ca22eb79de6f31f93a8c447242af111894a7c44a2121f91a8c447242af131894a1c92a0a1725e82560e950b123454ce4bd081a1725e42de1f2ae725f4fda1725ec24287ca05091b2a3f8ed2f7270e950b1236c43d5e7f8b4fbbd3bcfe161f8ff161a0378056ed057fe5e3c91a61eff9c96006dd30d069dc770cf6db58b40ae4a890209f27900c1dbcaaa51b9d38da957282a87a15089567e6118e28ed15909937c1519cb3cf397407f71bf79708782942ab378a862f6cee14897d611f7ac7afda902d6fd3d2ce8ab021dbd7ccebc690e55b9c6b46d2d66cfd224ff11dd20a3e779f19c919ebcae86bb60de770fd77fcc0f1a7e485cc0ce8af92ae2791d4f5e67d9157f2ada0157f3d6dae455af28bc6ee4e233985753b602bbface5ebaf386d46f2c620791bc3d5bf166373972089d340896be6724e9b4b5620498a223b07bbf9d1f82b778fc7457640bdf94518e115282fe6119c3f5f9bc195a19228121bfc99c39329bf24d480e38b212d6778edbfd6cf8ded9cd861ec53cedd3e8e604fcdfd2df653677b8f8fc47e6aee48eca7e2511e2a432d101857e342fa6977d9c896ff79e1f9e3a8e5b7b4c32dafaf6738d8bef8dfb6dc7721fff4c896fbe247b6dcf718f6f60b1338ec73168ce8d767329e9284980c948b30a316382a2f5eade6a8893deb57bbb536bf1be2587fee8b2a3e0fb574565ecbf22331473b0c33a53eb31ac95cbe966e479e052f73a6f3c33287244c383fe44768f837252ed35cb543cf19174a7ca3ea7661d0233f38f2fccac226e82113dd1ea15f98b534e8f6e4bef0331fd3f03b4741e72bcd090cff9e7cae9259289c5b2d9dcfed18f23b54b5958c1b06e82b0dc16ef89a4ae411f2f0f17c5ecd4758e8a3fbfa36d857d121133068b3b4d4b65e60fd3e0eb05d5d2242c688035ffc003cb303514d8811ddc76d3c743d38afadf90d34b4dd62a815f3bcb498c6da5081e5e638729cf785b92b03c60b75a4fbab11b74493c598781e98e7c6815a42789ed98185225c8418b361021ff7dfe62c4b7bc51437e7558779ce234b13dcc8f3df1d858dbcf714db476846a6456d324d1d4fe52226877e9b0cc334d71bdc7708158b904f686d9083dc1c4615b9a41b60a11b6c68fc043ffb3eea7dc95f4fe7e4960ee796f6f0b9d6062db83a023aa8db9d4f62bd23f24befb9f3ebc172fb08f85fb9fcc5d68628b00fb63f7b49373e6324be0e77791aa81b89ef8e3bdf02aedb08c1a226ffe86ec504747699900b7e40b97db148ca030eba734b1bf85c4429a342e7059eb7b9cb1a2fa1b253da5e6ee40f2ea0b6748f2142ad723f80a42210ca049c95b892c0250cf842b8e15cd384f27efe2b8a57326deed51d3e0f51d46c73dfa273e791d83776f7ea0e478df6ba3bddc8a73bdde95ff834c48399edeebed7032647f715a6c9af17faf43316cae3be6e776b5ddd1074c363d0353ff0d0a7623fb6fd16daf91874e36537b4dfefe0763d060dbe77434f1e01ed7e3b5435c2727ccbc7fbdab53b62d1a9427714740f460fd9597c597dda8ed86813d1cc59b817ac0d2ad85afe5766ade5045abfed49e1f351047eea5b29c48260a2204cf1b95cc84194d2c254db2f0c1c517d1ac1ad4f0cafbda6e94f5ad0b74a4ab468e4d81e17a0f35b70bee5b4e492589dca5caf585b7c4eba21dbe29eb1f7e5f8681d7b9d038a95fd0dd2d4661bee47255dc284f5d3bfebb4b30ae9c27a10c890203bcb77e595042267cb4f0573d1e972fe54f917420dd48ab2945cc6d7ac7b4358fb583aabb0281653a173253b62b150c8174254df3d287a8a00fab07918db23c19b07309532a81514c1989de3c3872d2f76dad0f762ace21383e88e7fb839b8239011835c2ddd5d815bf6a05348615b2909186329e4d6ddff2eac77e9792b99958b95166a69ff1e1cda646b8f98af61dc424922841a9a3785fdf72cc1d6eec44aa11d2fec11b0c76fa6241b0558e675be4f4ca6701ac08495ce6c9ada08713739bd71b9b0ee1d8ab1d196008d28ce6d25c12fd9a97800b5f4076cf692e378d9ea40dfe9a06ca335a90e50f75d6302f7d4039b6b0cc87cdb62e1eaa74517eba36460b6a44e1d98180f4415f51e986a9b5559eef4e0df978f787f867bd71fa8f7a0327ac6048e8b07ba50b6590394e5362ed7671fd2745d6877319f438ed285f6162b0fda3c3ed7224842fa79bdb28cc48ace45467d0d02e52aa0c953965678c6e429cbe114adba527f45cb7db1464565b85c57ea8b1660aa746bd16757e058a27b8457606cbc5b5454cf9f86e17926a1294996b7c0df549e679a75c26dc0cd58696a287fcecab114f76387642cf4a5e842c54ae5619b94fbda8b9cc0d12a19334fc7ca3f8191b6f4e017f43e3f922d84325e84ce644d5a72b848542505fa49b14037896d9d0494c114c64ab3f0aa1d72d1d922e5479f00e5a92b00d2825799eaf140f17170928994dc07d26f8399694d82fffb2078359c67b95d9be6cf8473690ff81361eef360fbbbccf31cfbfc1e0eb7bde6b947dbf67fbced23b0ed6357008a94c153beb1d6cb3dd8ed01452cf26c3ecd53706b1c313e5e9aa155ec539dc84a04a1b9c2066b14fd6fedd62d799933e6fac5e42fcdddf15591963b990dc7023dafd41768a3c8dec14c79efdb05f5df6bb7e4c1515ac0957c869e2af82c5ab00d8e5211972afa0ccd9cc2aa1fa78dceae9316425be4e0fb77ae869f7fa70ad141d0b3c2de1023fb54b0c209829def1b5e2545a78004ddeea07c6780326871244d4367774f0b36f06e9905ad1509b607a6507d94c39f8f0e6b4a68e4f6fd843b8a208e8554ca6d9c5fd61e6d61e27d1d7caae266b4c59fae34d04f3600f931f4c528c3ade8026972409d40f572658478e84469560f5af54d60ca52f0b5fc0e5370238f47d582a80db62846505b7a54a0cff1287da309815f8e4acb0e3a724629ba9f4f423f3649d1ecffa9e2b6a213dd32cfce52a416bd52d25cd456f48aa773d72dc5ca1d9d0ca9b80eed64aaff5a457ad14d5f67411acd96832267110d6be099f222c70e1aea0bb7aa66acd069679aa01553ef5a45ef3d00b2e52b353ab6ca548147122e889d515d9738d8fa012435c23adc07c335f26fa355e1ebf16895eea4658703adca293f22015a23e46abe57dfa7d37e6147bb8398f67fa29a3d318893db938ceaf644b9fd0f61af1ed92d44238346058dcea6c9eacefe2437ec69873b862ced9a70dd7d8612b864b787ce53f60ab2f2501f9505f0dd8ad44207a355342b9f0ac574716ea82c171a9f30065fcbaf5dfbafed7fd131563508f9d6dc66ef7ff10b9b70e3bdf3d13bf18d5d6e0ca5ed01754377fc9f425f9819e921ea3bf99d0d74aaf45e88ba53a0b373e8ab34adc3d407dd1aa61edc11fcaebb6eeacd7711f5e291a74479ca6ef9afa50b9b00a2f8926da8fe4dcb79384286b89d2529fd8343bdbdb5a177f80cbf7b2736a1b1d280b82bf06be83b0ce09770834fdbd01ab06023d42d8a35b4bc1757a4f4cb154df4bc0ed86b31ec3dfc41b947b4e16bc39811f45d1f3a972e7c4923e8469b5dbe07ed5fac1e8bcee008769712bcf3a04d68b79d97f713fd4ba24d878dff2a6ff0d48571bbd60fbe8f2dbcc168910e2927bb8e71b37c45fd316ecf19bd7f481e45725582665bc0847179071a8e0abbed366e3ffe0806321319cdcbb168b71dedf61e35fd4be51ade6d8f2d74c88f23fcc70f734fd5a5c35c6dce1790fc13edb6676749b574713960780fe1839e7feaa03fd49f74dd8ebe41caef2407376e4223ce9f234ee36765ed3f4a684a3e1dc67c272d3e6968cd19cb2f4b46dfacbb12ab7b074fc1e54bf298d550179f8a5c72092f889d5548c11908638bce61f957623f39c75b3c49136a45188fea11df6578fed1b2c653b26661e4e911503739a8212e9b4afb13673e72a2a1484bcb5bc43fc7069a5c8372d4bf909677d1597edea76a78977b569225433c2d234b3030dc6ef271bfe611edfd7508ee303a41f0a88e6fb1f3b302aa2dc0bf8ba2d9f0f6a9add39a366d1447b8a511ed7b95a5cd4dbbb19a971e63b7b05fde6369e46c7d53e612213a6de367b6a16f453a396b2e47a739554ba3a1cdf5200a68bef7aa8f8a5b2a2d994965c9451c77a16db7f8bf06ff6bfb6dcbd38d4d658dfc79b765ade816fe8aa6558dee7bec35d7c37304dada28dfd9c2dc52915b6629a22d1fa39dfbb61ccb7819da775f4c90458e489319f8d27481c45719a1c28a68e8df8d7709dfff00575971966795b8100fdfa95be0f7ece58230861925b4f33e6b30e08ea29c4108835789f7e27205ec89e7ae344b20c49e336afd688fb092556e3d7db7dcbac26d51de95fbc9d0fee0ab61c2b7b9c03e3ea72ec39dd368e5730ea4bb736af65ae4dc79dbf86fe19c69c2f854457cf45e65c41b98309f66a35e8a669809d43361fee5f2e84d1560878325b3e0acd18dc3a7274b9841e4a887f8b2c244779bee678330df65a159fbe3fa85058ae48f5ed34799093add2596a494273f7ac60e5fbf52b02afaabc2bee15ba8e67197823ec6d5735c6fe841dc3d64ffed093d543b3b0b7d5f047d5b049d9045a730467e5f44d0a8f3686616f0ff0de1a7df21c7b3e343851136155e867a1b6e0ef494436d3061f4584f09cfa3b4c8489309f8d3670cfe34718e4915e4f412cb145608fee797421bdff2d2a8fd13fafa50b0a580f6a6773bf8364daffa3a102739cef223f29d057a1aac2125b7caf42256126b0980ad99cd53e59510a7c7ce549d0a7b8e5ed787b39e50863c8b45722817d4a89c70cb3f00fabee09a2a722708b69659a31bf551a340097dc071b9a03fa9a42678af3eca03b0d0333df51a9ab7e19b67a4ec073cba7861b17ea60c4009bdd70088e778bac8b468383ef9e788e7d0098f75ccef7f8b049df7e05a794d7fda84e9cb7301bde56770b9a0a066be9d6572c15466aadbe7cdd09ff022ca52751729c64b24d8c92d65a9a2e3b984fec42840779503e5917f00b72cad2e5c58c84335a667a7e94fe412bbe939af3a9c3dbf12cf85da84f14a449cc39e43bc3b645b9a7eb1d5d855d651defe65d3b78d897dcbeeafe85ad5b1ba7d5debabee9b7807a800f758932f5e449acbdbe99788fae86246ab8ce805e81b402d29f16bcbd74ad6dd7863ee9b656fe26fdd583f7743d906f455a08b16cb07686c429e43de5aa42904f3a51574e5ce8255a736d1371b8094f6a461cc26ecd037eea6a09e471a76e202bd0b234d2a4c340b7aa6dc98cef7615e89de05c7115f9823df0747d7ebc3236cce3f3eb6c077367743659564afa8ca64045f424a27d617a5c5886716f8a72d2c2872d2be50f2d28a9c682507695d95e9017eb160557124518947172e2b54a496bc56d2a88c988f9524c3be7aa0952fe52c578a978d0ef000eb8cd79857dd5ec2c1ccf12beddc1c316c7d59e883f271a5a6126a44f16702fdcf4417faaf9cb39d21e70c2a56f2967cd8ee96e6b96b69e7a25a85e78475815928c63ab53dff3354b75f8eea9eda5eecd8942c8e403f1ecff274f4bd13f4f5136481f92fa01cced9141e043297b24b35226ae9a780ededdd8e85476e3b04d865dd223a4b86ce356ea7737b71463b5a764d8eee27b0e6801a6c812e2ef4204dc8a4ee9bfaa5d958a895640659d9d7359101bda0ca7c48dd66a74999849543bcb28eed5e0b6ae31c75641fdbb04094f9e29fb258976b7be4e6cd18fbd343d1c7f5146a47ef9410dad1e215f2a5bb5893bc06d3b2e3fe007e78bbcadcabee1ff7b136f2c21b18ddd2201162d0a29d92c37b4ae61eb6649b74f38905a76da815d9827d36af4f86be4bb88da72ad2b70b9d86ac31e76db1c93e67e5e701fd2589be73b2dd4b5b1bb7d6aed312dae7ed282dd3a6dbf8fce76d949f01d0af9bbdfb0374f1d48b045ef59219ef4fd2b16d79ba772233ccf8052612c685c8c7a0df22b1700bcbdc1fa4d32aa0869218cbb40e865b22493226f225131e9961c2ab8ca4889593f85c13ddd7002a2d1409a19d10babb015aaed641985340e085794b7755457580e59003bd7fa697748ca6323603af73322dba7b458b6f7a7a69e9d1373d687f0f406574a1b344a206e023a6e49b017f2fef86bc5f9e096bcbd414d9b8dd2b8bfeab0b98619d07d25c2d2d7920a5090f69e68b2c2c639b5e04994bd038fc49b732f75b39e5db235a9e1b935b5cb3a9d417fc8733d9e37aa1a40480bad389c604c33213c2ec422b37b8cb97d13ac6b9bab038a26c85b1d9c6361900168778996e27e216fa62f15eda4fed1307268af3ed937fbc6d9f31c0977e684f1d60ec8476df2d76eb66106cda7756e8eba89b52d857d14d69b009e914bb15f656431b4e406ec581952ca595032287d05491dd6a686945f4d91e295ac742377fccef55257e00d0a8474ecf024b76b19087b9e7cc3c5ee28118d23be6018e78c8f23cd4231eb27238de57481c416171b0373879876d0a019da7834d310f28d200d6da824d4bbfbd6adff660a2f853fb4ad80baf2c9dd6319abc49b97c41adddab4668037b80c336c807c02f8e967800222ea034346ec3805716c2a7d3ae3d1e1ab7e5c16d1be20be201165f1bb7eff470eac3e3bfafadf7a0b6f6bf48416dfd7716b5ad77bb2ebc6d17bb146aea181927cdf428a4a96f8bafc9afeea264484fb104bf83b5e787eebccee3f581825a5a5500b9c3dd933c7d9eb59c0714a7a331098efadfd7d1f73fe374d4f0fb3a7ad10235541379611b46ed9003baf9928785415a7a60e5b09662504b193bc569e981115ada18fdb8966ef88d96c624ace4b474bea0a56b052d9d3f82873109bf27cdb4d8036c0a1aff1fe439330963d9cb629c5d22c67b776ddb154914e0910623d4d61378155388b350efcb0a0f17d0dd06406871f9c93d992f62bb235d06b0321797875b285f0bd0ed4652b69c3d511093572e8e6c6a029c362e23a56c922f2076405d26efff995ed4e1e1d665f455153aefa604cab7f9a6842efa2fba4c4a055d762c72fd0a35cecc49b0ee8198cef210f3ba4cad5b0664b685c6305e2709d758a4edaeb1508ac7baee63714f733a19bd639ffdb95f278ab7d99fbf76dbbeed575e03bfb1a50e6c784c03390a73380dd4731a58fcff8d067278198efe3ca88145bfaf81088ad3402979835a170e428fff170d14938d54c6784103b936749c069a380d348ed440844fa7fda19ad7409e03d7ab86a5684bf53d15d4b2242a096a999eca706d67258d7f6ecbcbcca72fb400e2eebe5b281a9ad0067363e88b2d38138fa9be1d471111b197f202f605920d3591972a00da55c742cd5f31da4da572b4daa3c53457edb5dadbf097b9a4dbe68e69bdbea07c6144ba7b68d562341ccd58f37b1419113b9b70a9237d3f0054b76b7b7fd2bff599bb5ef08bc91dfa0a419c4e7bd536bca2b398201a11e536320b042edd82f5cbdbf2a08d18a353595fecc6282200500590b35b9ac760bb7dea2842f6d456b14eab2ba5c7ca70a8599f0fad7548ace412411777cf9acd54c0797c624d14a906bd798466a11fba6bb9553c7fd73b2445746ca7b6746fa7e41a51e612a47503be4b7335b9c5e7509ff995117e9d0e41a2f9354b1499d40d65dd3526c0715ddefd9082923221af0ae6c9196e5f21b892db879c4d54a8d13784d197c0310d7feb476411fccaafd01a5b8c8f4e23ac2071abf6ea52619dfdd00e7ace86fc73d916d89f64ceff4ac47cf8b2b4cae05679015a638cab9cb00badd67819ce187c9a86d770327d59f974500e7dab6c4bb3cd5d4f5eeeaeb7f900aa87d636bd0cbab86833bdc780f330aa0f7888900f26ec12cade333cc203d6321d5c84981971b6e5ba6d64ea07fb8474743fe24cd3d42efe8e84e0d7d594d0d3bdc38dbb5e896624edeefbafea513792d17d01c53af42d3bfe3be8c3df459f6628beab0c91004cf3fbf64e5f418c3a6ce6bef1b982148b9e9680ca9d997fd14f3703fd6c19c012cc59ba102be901e8af2c40b166a7384686be07286eededc334dcca5488182cb7b1f27070cdb22b76a13151d8cdae791f0b253c1c546a7fe692eb76cb112efa68e8b55118f69372ba4f88724e7eb0f2a9894ae5f43f29954fad9c78d830cd3c334719a10b5146c42895739e9fa89c9e3e11a627b60cde7c78c75569164ec9c728564633671a798cc967c25bb3dbb26fd33b65405f2123f29d0b19be24e8e294004238fd92d5adaf106ef2370cddce67c41ec20dde537acb635f392dea02a886f095d3835d1ea8defb39c5e74ad6bfef2847bbfa355c9c54e3f5e9ff89b966dd922901c2fbedfea4e876dd41043759cbf65460f4be1689c81282d1f34989086221727c6e3d8e21e8d43086a0b61f8d09c6f2a13305357f096fd7437e89a66321ab52f5d3754ad1d39852ffb42e58340b0bd6cfd24d14cdc626ea67eb824473b0a081b756649ec984dc0fcdce2a197ba633bb37fb129610bd2bbb3dbb156fc4fbb29bf0f60403452ec2f55a31283e475b9dd26a8f901834a37c99a18c988229a7bf8c5db69ce93d9c14e389be4f77f2d23e2d7dd50976fb7034f1d6ea0a4d112f529ed8b81b69d5a6242cba9dc3e678cd1b3cc792be603f8979f42fc73bb0b8430b429fd35f24017f2b8d95941294a414b79a3c06024d2470dc6a89cb96cb4ddcfec0afbd689f33169d1b20c4b9b685c2773582262a52a1243409b2b52fbccf5d92f5a4626d74e38d8cdc73d969c55fa13b2bbaafa814b11a0bc10eeab59d1e6627fab6fe7eb2d3a32cedb81d7d9beeaa4daf1a05268e8aee70349003e8065d74079512077ad1f7e4f11fecc1696569fa04123024fdee455c347514a42b07b0e346e3f4771290b9c2ea351accca896ed2d867bf5d2d6248fd45d760b5d71d60653cfaa79a1c5b4f0f4437f9d974cfd5c1d6c4d203f6b234bc03cfb0eef4e867c8d9a65bf86cd34d80eaccea083479f43b36dd1ea8859006f0b1ad2c4d548f66d02c09edef026569b07e1043426c0893f899a1f21aa11c95c112dc0795634f43fa73407417ea1de2bdd2b37334b680790ed362cfe916e89ea564ba31278df4621b76c7288aeff4b09a2420fa3e76c18aeecadd67b786009473a643577f36c3ac82391971d2335d1fdfcdce38bbb5dad8a0a6977d2dae9d27df01c7492abdbf6fe1e125ca084f6ce1d640c60f5432d4184fccf1d59549cae93f83a37b4ef4565eda17ffc62efaeb729c979993f785f5976301b5af79abc3e23390e4e8211d87ceb2924e0f65c4cf808947b5bfdc1ae3c9484ef41e4e44dfff3b0af1d05f5f780c4bf21184a571228fc598f1fe39df0084c13c84c1fc9f30740896f49f0843cd040987a13c83950029bdbb4132b2b731f3fe9ff6de04ae896bfd1f3e936d121605230404351871a1ad55e3be50628188556aad806b0b0e8b581565116d4bcb164258448c8a8a0b5ab77a7bfdb5a61a2b95c50db555ab15b0b65a34026ad5caad082890f739331308a35deef2fe7f9ff7ffdee1f3e599b36fcf9c6532df73b64e3e1054a0a5df9fdf550c6d45b8ac812bf66bf4dda0b493aff6b12eed0aebd2b2a9d4ecc6a984ca9854c693461535ab868e774830136fd46d1c6fa1d019723d24432ac4f1de71578cb88f46151c6d3950d95bed9543bd63ecf2e42517e158510f1ca77e85c02130d15420723f10a25cfd00e1a7173fb18a115f13ff68c1cfadcace74a97e4297f05be8f0dd70f818b46c1cd61ea23fa33dfa44016ffd45fe785b44f9daa21807790fcc24c4cf8fd23654a5512785509a07eff7d34ae31f3711fda9beb62b4dc9f662a19ada5abf12e27480f0c4dddfe0bf20a582ef668b9694c2bd1cee6d6d519291ff922d8a30ea13d3d1b18a89b6d20f6ccd7ad296009d1d6d8b4aeea68dce46250f32252c4ffd86d78f309beddb28088c7818814f5563ce7d2afb840a66f88d38577a729940a6a3f9f167a9aa1082b9979c65f247bc910bfa9fb2973fd21631e563e605353bf6df3df06076a9464d3937f21e465155e40b621c7cca743de419737ff7649251ffec691bfd0dbbfe99187a15be42dc6023251d44981b40a5dfc34faef0136c17de1fee878aa07eae195f29d4f4461d23d5762f1dd553f8323d82e03d97d8d1e705a30afd1ebe664ee79850a3657d084cd9e4b65547db42a894b64138b7c41bd48667885a678f96666ba6e9a3040e4b17a50c2c7994da7a6129351bef19d92e534e794a97b0a4952ec19a678356682eb3b3a4b2ad535dd9deb49aad9f3c463bc92fd645116cbd8716e036f0ba39248bdd5b7e85eb4d8ddafb47a6e78e3240bca271cd78d6cd84ad3078371764e0af07f6fc7d4ba49bb6cd7c2ec7bb767fa40db4e565cdd1c74cac68ed902caf5cf644af95f8b48b92663657c90732bc322e6b166918579fdf8e27fa276aecbc6e1a32ead180c4b4d3307fc92c244954f2f893bc9fdadb4286e40ec9a26c9a9c9346e39c8ebbebf5803d23e0bd2951f716ce6e60725ab19b3f4e8b087f7fcde58c7b1aff9beceefd71d4a4225ed642c85b86bfe69e65078a85d05a3d4f27e21db4a8ee648fe38975b5f87736fee926742052aa7d623e5acbaf7862a678150e52d11a3ee558e1703c915fb1177d9257d71e992585d6196fe3a5ba368f5afb8b7b420875f23ea2bedbaa68195798d16a1ef5a3f4c9d336a9d041206d7ada3dc58f72de8326e2af32ba6bfc14e8a61d1e8fa86a11f48bc5191b54b47ea206bbdd6aea5a752f29d960374ef3a99f543c54545c7f98271535990bb524ff93ee4dedc515877954e05567c6fca47d954c2af2b0a316ee75de4214934f7c4aee14e7aa09a1faa196f25313d2c49e88a89814559c5b8fe0a929859e0034a8e411336ad425ea2aa4f49371d346144fa8938e126fe09124bad82b7b7631f1c6a669aae2b69092c741873ec93bdcde784848e75f6214da7cd2fd5afb78ad5a659a4bb6d71edb931899057d2cbf58db8a1ec048152aa0b29f617e8960692eb5ee1972cbed0dbdb76bd1d2dc5cff79ae4f347a718a9d545c6ebb483b232350b3a299fdfaa711ebbb97eef847540184869c6f320d59147d4c0af119ec3e25a84dbff0d2fcf1af01888fbf8f5aa1c19a70198767daf38de31f494e09d5e3edf7aa16fd3827e4e816ec4e3f098c7b80e34d6861c8e7b022a948860ed6e2efa0864499161598c34a712aa675bfdcc635a6ac7f80888154d01aa1eae2f1a8f1da02a2d8de48e86d4245c78a866b4b320e1d129269ea26b350845be0ad4352d2c36e532ddd6b100d765272981d8cb67c9c860235a1dd87c67e733c0af7db4b4aa96fa7d26d52974b541c875629805897893cf61d8fc212b71ce5bf8618bf7aabaad0be0fb498c007ef08414c3365dbde4e79c3346b0de4ff51f7de4575b9b9a5383f9a690da590d3e905fcd4a8e29cfb3efc0a19b23fa121352f79d7a4d2330a936375fbadc4f1dabf11e3c9261e2ec7e043c2572a8d78de33eeb1144604dc3fbb562c88da68eaf741bfe898476ffe04b644c433f82f9080bd624d3dfec2325e205f10459c5424d7a39ba51b4f5c2ae58e2cf9dfe09185d1b214359ea5f81dc523c683263c62e0d1415731c94d3ad796dfc08e1bd20f9e752f2fe5613bde4d76867333515f41a6e15e56e1d2605390488fa3ef95dcc77113fd756abd4d3219c4faa567a121fcb1309e25b7f19666d03b60317df116af6c134fb8add8de5345bc71f728d817d1fd6c13debbbdcdc8cdbbae02c7af517f6ac4396e7cc6cdf17563678eefb2393e5bcae48ea44aee77c6b495ae05acbd2917295b3c32213e5d1a183b3e11bf654bf4676a48a76e39c684d7ce2fa753bdf95c3d2db1aaa7242393ea7c633fad46fdd511a1da945eef2c515379f536ad36d2c40ff0d7f8fc4ff2eadba573c723a9aec94cb9d8f2f42b7a22dd39acf398cdff49f71fdaa5ba7ab3b45bb9d3522df146b1fd1015d313e0563fa785f43e80d9f594569b4fa7a6bc24153feaee394d9958c8c7b109bddcd8f8a93c5b5e6a149e8d53bd9ef2a84c924fad58c2bf95b8278298a294b4f8786758be8a967f9c1a85634903ad4ca948c573da1a434821dfb46c498b77f6396d90512a29778a8cd2273e4349ae0c2b5d3af70d786a5a90c9c9b67d472976fff499307b6c35aec74fec1b7ac62007b149632350d8bdd51db7ff9cc7318ff22eaa448a11eec441985351d5072cf3b4d6c3cdec9acd9692093f8c4c3cbd42da9d70de1a285b89e7b99901e593cb47bd9f0365bf84c3db31e1bfdf6709fff8f023363c09e1570e48cc58a1ef06e127ab20dc0a08f7ea4fe574b8c32d072ba9ef8e74ce0f99319d4fb90be34589993d7008d5682f089177432f9a2ea2aa82675be63de09b19a3cca2c4250f587d7f0dcf1bf13eccade84088903cda6259a7a9ecac566acc9ab88d72152ec5b3bd6b21d4693581358fd292bd32a22645a9ec14635adb8f472926b4b65f483c4aaff95eb0e2637e656ca19c848b703c6e92a7662a582e2b9fb2f58d21211712a5223ba210fab2515aea84175f96488fb3a31423602539f43ef2de74aee530c4373c87faa9ba47cca398ea8204fafdf088725231f46b84579b253057a57efab16b7affa07a0b17ace9a11a3b3c27baf45a30e5fb9d33fb3cbcfad74b5ff480ea257c87293dd6f5c04443d45354999732f07c454694946f47e0b8a00620ae3f29ff5d28ff1c291f629a4355db088a6da6ab366bcbdfe83ded407060a28adeaffc6006553157a2f83284285881e73e91038e6e5e67aa82d6c7f155748def36946f268e0fafba15b0ea7e9db84ce7406ac7273a7271a2fea46326d54310c883b5496a08f576353a1eb220eaabeddef72f24e67f631d63cd0d98af4c4fad8479f90c5c62ddd74c4d0bfba8c81c93e2cb44e228b40435ff7c57fdf811f4632ace47f9b8cd5aa7d23a58256e262e6714e68a1035f773fe5258890c0961de0b7c4de0fde70ec2ba046a7a3ea73cd5503f9371ba0fb3a8efed51ca94e2ac792a2a64bab07c1aaca48299b6533bd12b29a8abc0c483197a58f150c7e73b611d38ba19d7536ff5901c6ecca1972817e1247abd9328f031d86c22f22f1ac80062ebb4921c6aa36d0fcac5be073653bf85102559a0e5a7182d5f7ff19fd5f1b27394543881d696b933368d97cc561593efab4ab2a9992da8d05682a879cbf8b8b5e6415d7c48dcf8fd77244c7b9c82e77b148eed8696fade16a5a8e7cc1e2ff1528d873ed0142c373dfffc982e7b9d67daec14ef8f9f0e7919d5473894793a124a55246e1bba75af9fe9aaffc740ff87e4400f533e6e48cedf8f51427b9ba4897ba2162432f5722bf1f97aa1ae3fe85aff5f41fd7be172f0a28ab5f3547c35f4ec57ea117e7f43cdafe1596ae43efb04a9ec0a336408f2f2f375d4b5c72bfb12ea7700b31ec66f234894e29f1aa59a8cfbf5f5dba9c98f04ccb851b2d9f3506a54dbf83699774d7ea92c81de37a4014a39f43384fb53baa43f5bf4b8c4d29f1e00fd976724e6f480fe77f4901cfc5c620d639e4cd3b4e6a7f829679eccd3f78f16e0770625a07343724c95e79bad4becb39fea2bec8573a929851ec61f6b3f2e93903cacd5db82cefafb13fa04e84793853d85fe25958a11dfa2a32d5803aabbead36eca4de8acb7259cb12696db2a8e3cc39af8f5b33fd544f94e68df1e38a4651c28b4796a6677c4dbe6597e20243051f1e55c265792a39b159fbf4454d1fd6cb92df4b35ddb6f6bc45d1cd31642f1f933743aca3f4a9a634be0fdf7b9b930fd587f24a6e6dd36d3dce96daa80ded368edccb0b5f4ee3eb3f9384da687df7bb50452fd0531a91ecc8e36329aeb590d9afb7931527cf912a3b973af77ed6fd6bd72734d8ff27107b3a719997ac3e1bf30a6264e4ac47ba399e6257f5e3e45b60aafbba32fe12704d7fe8544360fe7b3788a1139c87bdd4e3a9ca9b2fa40177d5f6db2137e46096db3ae692ceb6e1f63cca3ffd141aed86709fa2eced3e493bdaa11b7b66a44406967b832c392af2f24a6d4a75642784d17ff99096017837707d8dc7607d664b551bfbad9dac2fc23cc492af9c229e651f7fb78d74929417ca118e331adb150d1b38187dfc07be906b9969c4aabf684e7c5315031342550e1d4c0dbb24a31217fea90f492db5f870dbf3daaa6e4fe1689f77def66bcafa5f765ef9f52cb983d17e4535323fb45be2cb6ec062bcfda9f4e4d1122da86c9f31ac7f2b6996921293cfcae605385f5b942835c99587c26a741bafc1144e0000d7f2c312d6d44ca34c8e99bcc1eb55ee9cc2f32bbfd86dc1f7e67d46dd1632654e864a6071f28dd48ed8c9c1499365adbf756047ec34aca15139afa6c5427f951efd65a7ecf51b1bb44042605615e1b6613d89f913a8d46deeb15634e39f0f791c384fee39deb9072e119bc57e530c5984ab9ce9f925d41697bd4c382562bf6570cc56d2e21bb91eb2a8e1630f1fa4dc831b1bb6004107ef38df39707dfdf9fc5b869c6e15f43e6dcb1fc7afeceed21596c2e26b0f32632ed2b1209df48fb52d7776bcdf3dfc531f108478585c9bea7bfa49f94eceb26796cee2618b0ce142069a52436286d74ba9cd2a889a4b1613d1b8d5b7c7b86b78da60a06f215bbfa138d55fcbd8261e39d5f22d2fe968e96e7110325bfa66ed8e26bda98d89266d4f5356514b4be65c4dff8fe509ab6d77758dac8748706988ba4d4076b5237dc2c1d02ffcf965a4e2a62ce28c2bfee78651d481fcefede55f3393e3fbc9157a87d6c969235dda9c8261e3e4350134004b4cd19fc06251d2bc49c1aeeaf40f4371ca2749b01192fa31996f7e7a3da42f6eb4c3d1b5badf52429e89271023a5780f7ba9be78bbf5d9d75920a2191fb4c6a6a13a2b22208f750fc36dfa546916c84de6795b15f8625c6a2fe26972073127d2a34bdfbb24ee8b718e17d3520ff8cf6cdfd9ddd969956edd77112ddd4ae27d1d1f7f43974fd32ce59be847e805d0a0542f47bf1150da0776466eedfc69a384033299a39af504ffa1112a1a2afb0ddd4bb913e41e32db541d488f8552264c868443a52b1e634c2e7a862bfbb397ec37ec7af620b6610e4aba3fdb13b7d5a07f8e143fd51da3a24f4a3165623cc59d591a6350c07402ff2c35f8608c356f0ab45489f20439bca31534cdf381009d336ddc5cc3fc59a3a745ca61395eb4d7d2a5b5393dfca7b60d48b2208429d563d00b96d2009b760914aef24e251578408734770a8e332e98a81a85cef7a0f9f31a4c87f8226c95a9c557a93338e03a7510b2b653f4440ea69552494c2ad2a03bd95a7d85edfee569001bec16fcf46bafc745a5503518b4cba81f6b3b61e49ab3390c99971f783314143e8481c8f627b75bbc9ada95de12ea419161a420aee2d32da2dbf1ad16e3db0db4da114624ef1c77b17ad92b5381d2e480b56a3c3058afc46549ea67f224326696dfbf3fed6e7617febf3b8fe084715a5cfd4100a370229dc09942f1c214e92f2abc5a8c5b9c54558afd82e6a376d723243fba80dc2069456294406d113bafd0ed3ed877fb155927b79fcab039021310a1d2f905e25095c77fa1092c02d74b4e0788162cd134857b1fd49fbb4d2b4104f02ef77242d90f125bfe8494fd0147e48ad59526fdab2976e61a15fe77986ecef676d92bb7ca7fe845b5023d1f1bbbedff5d2349927d1f9cb3ef52329680b51ac013d83347644b5c992a0c4b530320a09aa57936048ba65af6279b3f0ac9e0c478a1e0224d59c34af72e5870cc6a5829634f5fab4ddfaf768c51a21f22bd593be482fdc45603f64bb69abb1bda154af8d408ab550c34edcf058ab134a7b2fc727c7e093cdbc74072ca71a3e0a78d0c14cf8d52bfdaddaac8ef386927fb373e870fb073f84406921048fcaa9e7e9d437fd95a206c40f1621e12d0707ef0df8cef51e3c15ebabdbfb692ca7a0e1dfbb85be113f26cd6c346afc1d4fb405a7a86ffa29491c92442e0ede05f49325ae43a3d24d1115ade305dff99c35422cdb8dad4b4a57cd9cdfa575885f3bbfa944b53b43f1ee8b4ccde33d843c89fd5a4b6dd4b7e3701e514932e8755cf1593c6397f76bc66737e35d6766dc09bebd5f37249dba24b41b6ff3b9cf0c5d8aefb12954c514bedbec00541e542cfc8ad77bca789dc6674a3ae5efc52f0c1a816e86146b1a79af6c11de518e5c83b6ee4babd611811ad5b8eb396c7e2e941bd32ab05dd8588b5dd1e9b346c65fd2084db6c536f45842a9e5d79c9a33e5234c5336b51706f9a2723a85de01c5822fd100487713cf3a5dfbdb845fe75e359316ed5c8477ab39903e31a0dc68890d1dbf39e2668729f468d288bbc6b410e81fac182eba8b98f546f85a78b4a15f87cd944a1e3df9fbbe345904227ca51264435d2279fd34d63a3740a3b2ec7077ccc4ef6f4eab0e478dd5f83f8e4d7302874a2b0847f83bd1011a21ebd7e7a02958d73ebfb4834973c4a37f837100d4061bd76726fbfe2d69d5bea8b149552a25855d5ad05861fed8fd6c6ab297360d746588262d6420da74fce68a4aba45f9c103d18ec836673d1985a8de55289aeeb9b6de02ddd952dfceee14f0b34a1846e23eaddebcca49e1588930a3d6c20ba65ac62e1ff0787fba8da65fb3a8d5c2b62bdbcaafbe8d0a65ccf909fa0d248f3a2be2291c083ab5843cbdf636a27a548b06d0b9da74a18353f498691d0f7a47288543032a2f9590a66df5ad161fa1eb3bb852956905b791e92ad9e1263f12dd9016d29f084bfc0a4af71805952a1c6fa2ac8c16191ff7eb22c55a189d363f6e77fc45d183403b353696981e461b35eab6201b8da24783e594e14ba78c58db99fd95b0ae8fd279a78b5af7a71fd00dcf3a9ac56ade0d989d4af0778454f55ede8ea81619757ca050afed8fee0a2c6d50d0febcc651efe22f165113f57a4bcf42a1a483e1178ad7de3da9741b87593eee3e944d93400abd135b3799f37ca464329f4aad77a62635f508535369f52e52723a9fcaa8771e4d12c949a3679d11aa15eeb7d12b6a9e6c18e9727b966f5a703ae1418ac87e050aa76ae45e46a9e4fc593e38d7945d134aab4e270668f0a94b2d96dd0fb4eebefc605f62aa8f7e830cedd980fbfae57952d1233135f930d20cfcc2cf0def7afafda91e6921be041ef971bfd29087c782b49070c2f0a41eda93caafef416d9538ccf3e587a41319e49e82b46a12b5e451eb49076aaa9c60734036759e3c92863578538565a7f9d08f85921d518a2d021831a9cb03bbe337de4d6645fe6398c1faa29b02c51a3c529bb63e6e9f76885bdfaa639a808463f8eb2a2aa59e27251d48537efdc3d15ae4836b282c11d7d060a8a1c164cbb1aef566af16c97a93370f8dc65f91914ddd679d81581cb08b2bf8772593c00509c0e5630811e54692c995c6e7fd3a825f4732e090146a70c0067e10f4e9e57836a27010210d597ec8d4d7e6e11e4d67cb8626371ea28224302b10a04bc58afcfe448b61ecf21977f8733c51bfe621e94c7f1b7c7b4ecd709dd4d69f1f08b37db6d60ea7cdec8f9436fb3b4fa63fa4cb9963a9c308aad297df4f3329fed63246f778ef9dd3eec9e0adda194fa8613dede76139dfec127df612f30e2b2225800a28429d36352b35011d7146a7859c15f4d3b4f5c43aa3701e2b64fd44bd55ba7c79bf86010f026b67dc14354eb95bd57aadf9c6e35b781fe9f483ba5159acbfa4dee5173496564e9ebd7f994dfcbdf029d1fba36d16d5bdefffc19e0f441f4e8327a49f25edf789531734fd34e51dfd5f917e6207cbb166adebd982089ac72ee9788632069fefd0aa35aeb51dbdc39a61672de9d624d23b9130ebc7442a7b17ef66a262530bea1851f2761b997885828eb492031a3bc688fd3b8c8a4d1284739565a9b7847e1a3b07766d1ccf9fe981d2667af0a24fa68578f00664b77c931a22954ce1eb6def09145e4f797a328b6fd1e1447356bad4aebc3d650abf329d909cb7735883d87727d4394d267b8fde490b392798a269e969b8f7d46237d724dbd27a4ee3eec08739a14ec8ce553627981b56cc59a7135dd6e2a760e706c2bf4a237660f36ee89883383689a04fe65de874dba639867b7a1823ce75f48e6b9482229f574ab3b4b3c4a6b5f5ed1def7526e41f727798e562caac6f67c2b45db3c4139aabccdee533d648f7e13c3fe3b0e5fd5a06344e6908ae15b5053e987177cecd1badb79aeb1eb36762b1ba219f273c75ae4337ca46df5b36257e7fbccdaa7bd15316ed5f64f35edd07fe1feef970b09576a0d90484e8a769615bcbf3ae25348a1c7caa43cb96edd7594294c5509b248261e73b4eb408e9d484e4604ab7cb1d34c1b5a5f3ac9998bf97327147982cfe7c42e737749c22a3fbb434a1c5e23bf9a52f8c9d1a51f376a746c8dfc6da80b5824a1140dfe98176665399644f5e885e9bc597668356ecbfc72bd1597ab128b3980d5936843f2f0ca91625f532d84de5a785a8209630de717267c18c74aaae1529af68f9937aaad664413d58f4c6c7c7cea1436f06516f17f172908da5662674baf90ca05e2fea96340287efb4ad192b7650acd1219d84350f37398d6f7171d08bc2f847b5297efc2a35e8eda55cd39627ed299e86919f439f3c85cfac9d24a4a22fac7b7a3d6bcf8f34a4c7abda9cab681ddc033a68d18e9aac0e0decc368e0398da5b435098319add2d6dfb3d22a26e70b0da089970e59692853eb9106db5d3ef38f5934d4123bacb06e295c25c8e9d82a2821ae01d51ab64e5f929432ba391b7fa379fd465349b69e74900c79942a7b79799b4c3134057fafe95165bef64c31c2b19f6242be5c3162988762a8cae3d66f75bfdefbe561bd7fcdf0c7254fbd407bc7654f4ad79d1f13a4511717d4a38da77e3ac57cb398fc8562a8442476c811b3a92ec964ef6a5ea5ba099d356af7b25c3595f3d4f9922f9563830ac96766bc5b7d613a8cb0339b905e50c44b1ba892658abd2d2c372f583b31fdd25a939bb0071e45735c32c50aaf0667b67f16806e8989296e05b01a0e81b99733ccbd7e10213c8b6fc9532d52383688937ad949609a8a79d2bbd878093e8432f524edb6c08cc2438cdbb211af43dc9bda7324628b1e0cb09364b2f745284792e9c2a6e9097960ede5e635bd725c2004d39fac4b9b5dee265b0c69d92dfe1f6ab304ddd25842d5bc44c984efe06f3aa89e367836c453881b7ae4aa076451854fd1786d3ac23b2b8dcbc26fd9a53645bc4fd5d4fa96506825fe27e00feff4af9034f490da0d9352b37d08fa974f30278d93daa9a4c2fed46c9b77fa653075e597bac0726ef7ce18e44028e4021476e89af6ad636932425c10448f1f1f53df931fe5b830f5b27b2d5b4a0fc9256a9e70829d6b47591fe647156aebc5508f76782dea7da721513750358d29e3679bbd2facebe520b173b53068cb3e7fd9c5527f45f78e47a5cdde2130b4b5a07fa88bb56da824979af648d051a7f5859b2444e10f1295be40c2a32e930e29ea312ede05788ebc51c2aef292eb4630798cc864b54aec793ec7d29e5acbef6a3fe0338024c53946558e64904b5d2efba4dca242d6d86e91446a8ff953dfd6f10aaba621698188b7459294e65d006b27bc2b6a30bd9f4c4cb1d60833b7c3f4cc0de7a0314fe1d084be2ac5a3966ab48e2c3776ea02712a473244f396511644bff7fc88cd85eb7e9dc58f8fcbfe1c2a4bd283e2091d185f111f5a34a6d357683bb5f6d36e1df12a53d42e124ef9b7d5412f13a036adab6fb773b5d42caa1c2fc8456fd91544d1bf8d664ae7f74626f7d63a7816ecb0668346ba7eb57d79a21b39b0e9abedb8edd8fab8044f029d1b4d1c9b83ef848b0b66d37cebb80268537dcee2543bd748cb9b75640a28ba60e7daf1a6dd4cf916f11c5c0f6ad6f5b2cc0d8af21d24eb7a1decfc4d3066bc200749e7b92353f6a66f2e49a695b2e55f9c637966ce5a4a8ceebb36429ebbd12b18c7866e84d1d453782fc79509e1176dd1413b9b8e3a7a003d5df7b4f91eddd3667b38d2736497866e06cd441535eb739e5d2f31fb6d75d1290863f98eee648eabb8179bf64983e62b150efb55b99e7cf484bad828b2f84b26f6e7f271ec2184230e4db93759bef5aedcd20bf7ea173222331e6a2c6984be9252d4994a72d9b00796d094b8097568c257af1c82323ae69ad264618e98e3d491c713d0d758e272723ce46e2325c37ae0be5e775a2351b80e733c85df6ab834b55796a64c33bd5df4c4aa7c46abf21db62adfe189a56c7ebed54cfdd448ebce86fa73f30db89f645a3a20fcec45dc9be55beaf76a8babd46e7a5b5a484ab7add95ffd0a4fbf25ef5f88d934420f59eecabeec742f3b01b1dae60e54b836d8c0486dfbe05788c32eff576c4bfdd2027da6d815d6ed4c7e3e3339a43febec397d44c3f6ad71b1d69cd0379246e01eca5449b677f6b63e7b2c3aeb37992de3ee94a96dab0ae663566fee28a9bd8f8352bb952808a19f05750eeb3bc26fdc1d654e01c16ada954951d48c22418e649c65b67299f215f2d648b02e2fb0cc745e6774b9c33c697c3acc0bd497ec8acfb6f04c5b3f6bc1ee4c0f1af1da70cb781cd670d0523b353b71d93503db0e75e47f77676feab3a5c3df27963b9f4ff0d3cad6e701763461caf92ad4078c2711470b75123e1e013e110f935a46815bba62ad4e454d7f0a2360b99ba35a9ad36236bddbb4cd494d25d78b6f69a5a21a9e5e98ccc7dff9b4c9f0575fd2c426929a6183bf60e5e32fb684fd5b0e768c4e9b3b7359936fc94ff2a68efc6eeccc65e82eeb5c96f54f5397bb6924f4b787792ded7f37da75b41dbac3d4d56e6f8befe4e2890da6a936ebd22aee9af5da816d985f849fe25bf4773e9aec1d4daf1ca51c2a787cb0a3596675754838107f61647f50d81fe7bcb294aaab053b5c82b10715c9d5c8de5848f6448aa267480f65beacc56525eaa5e474c1d87dd20c19a204d5e8a0f681117f07a721715c49cfce1bdb6469a7a17f4daf43a6f79eb62b9249e8be35e4b0fd8775bd77b6b92a9225885fd162c6bbf62bb5012a53457d3bcc5d363d157b6ea142044821267a288a6cd1655dda5e5b343e3b8ab07f49d15f22ca574bb515449aa74e4425fdd27132badc5531f453d1658de54d70d92ba951f915065d806ae726c5e7a3897e9a349881f14710fdd246a478f0c7121e696353e4fc7184bcfdfd773e28f9a0cf87ed8bdf5952b204e66e8ad4648da7a2ff57227a6fc052cf97a28d785c36499b5299baae459883cadc7b9ac5bd24e16c3fed21153c5eb6330a664ff21497ce1954d1dfa5368494b86b99ab95ad354984f7f09ed74dcb709d5ec67b14f1f4a2ef78f49783dd2bee9becabef5fd66948ba8d325ce92f5f4d4ee47d895aa3a632ef217c2a0675251de67702bcf7383fe2987bd8d8e57662ef1af7081b8da8d532bb2bfb06af1509bfcef7e862360fc959f82dad50786b197e7bc48cf5b51473c7f7f38b863ab8a9725c8c083fc773ab8252cea5a945684b39df4f84f0fe4eccdb5d5770d1715cf0f97513923a77acc2bf55e57e73e443bd6c2c3a5a90498dbd29f41ddfb33fe1267a6cf610d988347e1dfb7a663a9e57f4f7247c4ef52ec23bb0ef60f7040dd5ee6b0d6b20fcacdf7bba846d34e1dd8c1a8dbab35bfcf08e7e1392f0eee21b6fe698989d838c02948cd3d7870827e94f3e361b9e1480fe0ad168d1a38fbdb4d4cfa705caba3d881830ec1cb6495a3d24dde916d3bf91f63914c34f924fc4a1a5a2a2562f2d0eef50e6e05358e5af2acc1850f6c5b69e65469143729b73639e5154f35a655e5b70cada545942defc3c26a7e33438a78ecb4b1af119eeb805bcaf789f2b4f2cd46ae507ef1e7e70b4e178cbe936ef6f9919c6de60afdb5e8f32a9759221192fa38cda51ec6e4445829d51f8c93910ea08b1ed87274f084f9846889fb18467d846728ed9235043263963db8867de1b287d05e648c29348c2c8f6bb9c31ddc1f43fe28c59769249bec172c696d1b53237ad5a4230bc317ca2e4fa6fd28c3a626bbd5e88f0d3984cf765bb159f7f8a145f7f8a5c6bbf502be42da82dc4fbd1fcbf6126aba2a885f73b0caa47039e6350adf3b130a8b6a0df67505dd058f64d285b4cf5601854a9893483ea9185415533d58a4175ff2f32a842e8eff0ef776550759c0c7b9e6550d1f55214e0d5dab186ffe65f6650ddef6050ddff7f9941757f41d40b1854f7ffcf32a876b9fe2bfca95b515df853b368fed4dd17f2a7caae7abd883f8535e66833bbaa0ef857f953d6b1c8fdfe15fe141dc3232606a47a317fcabab42c7f8aeea9eaaf3dc79f0a78317fca3a95a2717fc09fa2e38daa7c8e3f15f062fe54e773e733f239fed4c64efed416f41c7fea32e64f59851f66cd9f5af387fca932c7e7f8533a2bfe94d4f67d532acd9fcaaf7f3fc6a1a8fb7f843fc53cf1595ed739fc29a6d77993cb9f2af0c5bbeef82660fe14732f48b0e64fedb0e64f31e3dfb43fe64f31b1f45f8ef953ccfded6556fca98d7f993ff533c39f829a67faf337f6a7532e983f2561f9532d88bec7aca8f5e42e0b479697f0cf7064db42a8e47f9949b5fdd9009a3fc27ccd1ef0b22bfb962f95e5a68f2f50d37a3a8f6652312d30a98349c5983d6826d575999afe6efa1d2b26151d76e0bbdecd05fef43eacb31926d59eae4c2ae6edce449a4945a78afab34c2a26572f7730a9e4ccd7837f894925e9c2a462fa0d19cba4a2733af02d0e938a7966fb7098544cbf25c5bfedb14caa6e7fc0a422582695c38b98549b7deecda3f23b98543f6ff5609954d7ff4526d50f7f814935ed392655d47f8249157494786397ebf262afec309a471540f3a8e6d33caa369647e5c8e1513df8a7785413383caa299807c5acc476606ddf9fde9547b59ce151e5ec627854a7052fe251316dfcc48a47757d91358f8a717ffca73caaf57f8d4775ac0b8f6af69ff0a8fefe9fe051e5d03caad9ff091ed5b017f2a878899847b5333ce6d1af3f5af3a878899d3c2a5ee23fc7a38a38f86ff3a8e8bea6def98f785469233a795403d83eb948ed956dea26dc526cbfde8778e3ec518b7de827ff511e159d3b6db77f994745872725ff3c8f6a13e651e5d6f794a8a9d52fe251e9d35fc8a3cabbd2ae4fb7e6516df3b1f0a82efeb8e777795438362b1ed5ea0e1e95eb531e05bd109560e1516dcdf1cee8f8b5d0eb775854cb318b6a8f76bef1b60dc3a16aeb69c5a14a7e4c73a8be28bd6db3c32ccc1ef66327836a0d694aff3306153d53c30c2ae684bbed94731706d5643cd35d38cec2a07af53906151d1e33a898f08510fe050caaeecf31a8ac6788c91b29372e832a8661505576615031e3d7df680615ad0bea5ffe8c43d439e393af855907cda0baf72f30a83ae329caa57a320caa42016650ad717e11836a338f195ff70e548c8095e4d0fba864dd9e2e0caa37ab0bfce8df6d3c5fc411b14a2f8372c70caaf2119841758f615031f3911fff7ae97d522957864175ef5f62505de8f81ab02809ca4f33a8eefd1506153de7f19771195456f1ad84f27530a8f4e8771854c7690695a3207001ac4e6ea91906152ff1abedde8f180655678cc971304fc10caa3e0c836ac7d74c4dd7767b9e41d5194abe0cf4e32f30a8b6a01731a8accaf31ed4cf1f31a898f9a0e8390655f98b19549d31a3484a66c5a0ca5a8719545a5f86415560db8392d9f7c066864175ef9f665075a614fa2ed5836150dd9b7b795d71fa4c0b83eaca6354982df84b0c2aabf69803cf771706d5bd99c582cd3e5bb79842d6dc7a017feafbcddf322d76eab7df7d369819fa4c863f859f8de7f95356e59961cd9f3af44ff0a7acf423f0dfe14fb1fd1d531f017f953ff58a357fca8ffe5df7d68bf85338f61236f6a2d7ff127f8a7e2e4f5f7f9e3f65a56faf71f9535bd05fe74f59b5ffb87f8e3f65d5bea35ec89f62ca39c5b31ceb8d4680b5a6aa40f17921c2bca6922efc29abf61bfe97f9533f75f2a7ca7d9fe34f95cde45715b0ebbcb3983bd5992acd9fa235d7f38c853f55883af9539db9f119fc62fed4ad28963f351ff3a7987577f871863fb505fd2e7faa0af3a7acf45d61b2b7f0a72ceb6e1feac5fc29abf6965bf3a72ce1cade4df8fa42229547a677c97f6f980361e6547edb3d5883ddef644ee9059839f5eb7dcc42c2ec11d1e3c0dbf83bf3e1e9aea72604e8ea0b42e9b700b6ee33e79dc45c8f1dd9bb2fba2f3ef40d668ce85b1e77bf904ef346e69222f7c5e2d0de5bdda753018d6867477ed06b63efcef3157ab68d9e77b293c1329a007fbabd08c7a8c9def4cda76a6ad363ab5045e385373b7923ccd95c9dae3ee6804b6d334f19ad992aec6e62831edbec2e65cac2fe1e7946f4d82bfd707a6bdca69b847f9626b5006a41d688144502fcbd87d8bd8c39010ca7e0468a50fe793df9a83bd554cfb89663d6083e2b59c89edb6ed09ce231ac02b666c67aa53b9de78fd298a564b260f9e63067eabd0a815eb40c9f8ddb7a1a594e5780d51f9ffab502e1932f2ce7bee213263acf02c1bf582826609f429ea96f5d2b3ee302eef9109ad7624cf163d24bfea6c5e8bea8f7f2c056cc08c0cc8019cdc18fe73c7ae7fe823b91b717d51cd43db8c81f2f425e5943d253a61001b96f48a652628988ffca4944519fdaf2315f27919c7cf6a260badd62f7d0e2f4425e6e5e610e09fd8b3b3ab7a1f8643a9f7a720515a6cb50717a7f58cf913ed1157b3433346c79bdbc729de8b7f64fe9d64b0ab2309814472448b14b82544569e36c117f6c3652d9ce36da2d8ecc6042d624315ca126238410d32126ec2204df456e2d4e5fa7520cdd45f89e74b397a042810451719f120372c5a18b32aa2c6b1bcd3cdf3d9b95924d3ec5dabd2aac4bde5bf139f2389c264f71a405e9cc3875c2cfc262b8b56ad2fb3bdfe77d70ebbd498b772ee62dc1ac86019833c5e8a5d62b57d560b7d862f67979a411efe7e811a5bf2ae427c9da42cad3a4df8bf886e63b48d9dc489fdcdd98d796dfb696da043651fbd0d87aa19a9249f9ae4594930956d515a837b6d9b61051eecd88ea750a51599588da20a67d2b47d7a0711ad021f583d2b85017f44a11fe428a5a7387875d898bd259cd3c9340dc8e6d857e948b09cd5f2d397d4cdff023d63c7c12af1ced582885bcb5b9d079ab16f1952b5d08e56f90b74419c1e6ad970b6158f809a272c5229c4a4b48ef7d94b38c30dca940a68de2764a2a166177fd111724a9573eac4014ea26a00ac5885a07799d4b121a757e397336725bc8831b1af5f5522ae80e6a0b696b69349a6e45b553eebf21d3d23dad296ad347a75a6b8d20378b5bef1a4d31bf81dd4da3c9966c097a963239c8f8afe558a7fedfcb71efe5c18f236f5b9eabc0d619cdcc737530e770d66f83b16eb4cdd4ff88b5a33cd9d0f40b4a19fc2047fa63233fb7c22b0befc44a096ac5d2906bfcd502bfbce5091adf0b3d85c21f72bad918b2f722622a1170689fa17e17f24aaf3df169d900963b8a4e139e52d2c9ac1795f1f1fb40fc959494fc8eef96351a15934d3e8675be8421e431ba9ea3ece54b347c70cad690fd379f69ec9e8ff2e3105a2814249516a68f6e35f45c8788290da5867a5fe28713fa0201b13fdb7eaa2ac074826c4e0a51a5291fdf8332482b6da004ca15b5a84eabbff6943ff1b89b5084f36e87cff6d057fdc457deae43cb1384ea409950383b475f30010d5f8f771e7e19fdb0fa9df56dce63fd9593e7127ab113a2c2ab1c64a3f03901fe1159a2831bd64d3ab8213523c5979892f28670ea5823bedb9f2d99ea683444ad23765f1c56d68f2d77f261c2530fe59692506efc857f60134f2afa8e5fa81d858a45553e4ad96364a8fa09e1bc180a5ad1f2443f5229dcebb3bb34928d21f42053f625a56eda51adca75f761a67ab75409e9482e4a6174a2024964af5605ec30e2bd5b093fa17a6229be93a87b97daabed4b85ea1d91de32c2afcd9998ac0af0886c0b4972d6579244c3eae3ce2db995b99ab48f5cda720db54282821e294eee8a5edcb378b2fb1a1bb2a0a5d2b448faae0d4f5f45f20ca55308c3c1df90f2fd7ba825cfa051f30b57778735040f1948334f49fecc3364f8f3a5d784bc920da33653094f616d982af32ec0e1c76dc7312ae3ee21431384ce955ec371f279ca2613e24987e80d9a7a88e11e4f69730d6279c2d3570b7947371c2ea01aeb11de3779dc66fc7bb3f406c96bcc533655a25499be52c03b5ad098230d11f0127294b678df650dcfa0a985780a78fa99b6bc7e05473bf75d5e2fad06ffebe9723db98d941ffc8294da7ac230ba9ef0de365e54e613bb59b9229818dfed3bd58c0d06f3bbc830fa2932c47d8494ab4fa0f602e5387fc2d03dcae77281a1db4355aab372d4056418de44786fb8b6c130fa0641f81a56bfe343ad682294dd2eaaa423fa2025791829337ef6512e8576d794f8188c1791a1a40419b44f7c085feaf14524fdd20995ac371cae44a30a0c4baf104ab242a5975541c86ad528527a6524df501f8598fddca7adbd94775828957d89cee751734891b45a8634d952a7c7fc1ff2cee60993f323db9c4f6fa082bfb3933625a291788fe8685744e5dc15d8aba9f4bb02fccdb6b4a90939fa53820a8154ab86f235c1fceda8d673df9ccc01e997b50bb43a7fcab6ba4fae3f655fdd47e36f92553f2540cb7ed81f9c79ddb83f735529251323a9568b7e309a7a8bdb715ef02ed34921336449b2fcc85539a737ec88906a6bcd544035ca4d933a5de1cfcf95868c405b8b756a2aad8597abd667349aa9ac1684f75f4d0a3a9a218d9e8dbcb49b8a4dbdc4ed84dff95293084becebba51e8ffe93de99344d44feb719c2d8dee2e0f4a937c97d74f4b6d90f0a44f9af07ed2c4619ed45861c6bb49f72b70dc076e2e904fa3d6dc66eca735b9434e83d57ca9bf33126669fc0c19953e52d287a42657dbe9858ff86e5ae829ce55c2fc0609366d3354d623a5d315783eabd1b45c7a1ffd5c65c86da44f4c40bb2b744c2e56b7e0dda7335aa0cf9608f4898d78f7e98c6a01e6ae2a0fed455e05de9a91fbdc84642bfe424019b40ba54ca6320f23bd1889c76beff8185c6e23437d33626227d441465caf7a5283ced2f5aa97c188f01389705ab8fea1256c45c7a5d183d1c42ff4b26abe7dcafc5cfbb4147f13121dd727ba22530e5976dea8acd5a2dee56c0ed35be8bdab5bd07af88fcf0df128daada6dbac7234c23111ea14ff5387c1ce45dc7edeb82312a7d3e6dc72d8ba07293f6c7d8aed8c9adffacb51db0cfd651eb12346fa3d8c817df557457ce90f8d7ce98d277c436310323c0946d299957c65dc6fc46aa1b4ef48b45a240daa8219473391d27fb3ae3cf7ec6a7d9f51885adf4c18eaab884d2669601f1813a42a8f08bc8a958a403bdc870ca3dea9e946ad158b95e0c7f557aae789658687b50495d22d5e5f50890e643c5d4d9d2605e5eacafd98553eccf474db810dcad287c4d30dfa82d388aa2617ef88d248a4e006bae2951414e894e49490abafec83f4ed00e746bee1612561785845e8839da02e3c77510e2778741a79dd165bd2786b9f893cd1ae515f905d5fadc71a73a11edaf8119f3a51cf930a90c0758ba1200329ab1e22c3b6d5e8529ec1fb3b88b39a3054d5a1634618f95aa5a05386ea27089e7671058230e2f1e46d1fe53ae8ffe169b7f84ff14f31e2bc607365e9aa8b540fbe58595b4b383e38ada3f2cf84e29aa2b2c905fa822ac82b7581747635260551bdf6a215db0f6c3078ff4c3cd9f074f5699da391d29e11e0ef6edc32f12fa990e393a484cef1595228055d1c2f14aa0c21dd09e5badd48d9f77fd0fc1ce56b358432e636a1bc2a24566c1fb5d130ea67e2f88669a5d4e633884e378d9c87d33dad9b6d1c2f7ee443d7466e90d14d206ec5dfb628af68607e4a899b11c42f1e2f16aa94eb8510632d618999981c6154dec6e66454592aed26859cd59a9509ed68762d2e25e5c017504838834e4d47be4cb7e5970f09832603e90b60c6f93d39bd2df882739bf383d5296a4d80f4c94768f6434a448ec1bf02a6fc8dea7b82470985b3f4d59e7c4d36fef66f2d496d59889475109f48142cdd5085a8d745a85ced7aca80edf4a211b8757744b7b90695c2cc69fd99f614f5d9524a7081f7749b32bd12190e3f2494ddaf809e98f9fa1b7d106e9b7fe8f4c17d61340e30e69f84fe71c31544b94ad03f745f14419fb9ee0a32b949dadb82dbde29d1ad574bfc31239ed29d9c62ef4fa59c9c426d104c913e69677aaa297a4d208c0295d0660756077c9a7f12fab38db711e52641a00781ebd5d33e93a8a975b791c9958951afab3713ea25466a768d0db55e2cc2cf8489242f60cd773219bafdacc23d9af2b59f0943469d8ad5ff094933472627e4acc86afbcc243c7199d1857a11a30b7faebd4b8c269b131718cdbff44f69b2a6b45393977f4339319a4c3ca0d69f1941b7700a3986d1a7589d53316871efbd4899f75095bbda50026d9e51a5c29a1cabf32c35e9ceb4625d4e1948f7d66f3689a438f7be98cf8904bdb72a679991458f95e1820e7d335437d231e25116b7a421a3da27c1684a3dd38c677ff83ba31f72938c6ee950a64efdcdaca7f5b7986cf451ae87f056fa9ba29e566aa5bf62467f0d89b01eda463a2bef804b2d94ab07df8672108ba89ec20152dd6db374ac2b4af123de342c2d8531b8db20a9735fa40f31f3a5054e48bf6205f22e005d3e0ea362f6e3fef82483c7fd34ea943bfa154f90a39f74d4693355b8a7df5becf908585b53023c0c413fc00c4ba51cf52bcc202a7df2f3a41b609c9827a24bab4c3fcc945678c52756176d54c63421cab17b9fcebc6c2da59f1489b87f972765f3429ee3a9ce6784ea21e6c5ea4c3d841734fe3ba25302898073ce6daee5ea61fbe04959cb3c292642f82d76c56e29816dae52ac73f3489887439f2b823e37edac7b5248a00c9f430a73f3f555f0147923989f475412b9a9d4a6bb282837c55f724ae35fe24cf811013b229242da9ca4c1246168fc0a1d776a585d992b4cfbc8b50566aa9e04731640e799e6bc45f8bd86d206f47ef49b043caf3ebd73e8933e6e90226596a5260209a79c58dd2bf884107a3fc6b256c2d34de467c64fc0f03cea5485088ff7f9db943d4f2243f035149463e8730e51bea324c592d7548519ae88d63675b5006bbed33665df934859790329375c00ed008d1b550612e6734157d0b063ca982c64ead5bd39e0d80c4b7a8d6e308f5f05fda4df3365cf2c9412087d669e2ba373ef42afe88f77f180b8c510b733c45d77a123cefc634c7f67d09df5b9b9da942fd97058b3226f7e31d683f3a5f8e96834621b8f63259a7179ab8a356ae87d7e928eca30e339cef0829b067cf28ce4a73623ee5140cf0e61795a77bd34c5ff7c29731fababc5ae01e761ee21417acd6a74e8b0a9b7a4dd6443ded2d70f44230fa5046efa167aba8dd0d3d94a10f443927af330e8ed4c8557da4d1249bbbe3e043dc9101e02bdd8b8f0a75a83492cdc1ff1a569fbc2cfa67dcd9c7fa1dfe0841c23cbd34ead959275e607b036863917da5d77368f507ff52b7e732025e1c979bb9a379a44c9527593f995ed5f9dd20beb0815f4a98705fa2a19b1e35689ec6cde5958d94c92fd90b73c316580dfc091db9505f56876ae63941bfe855c54ed63a8aea6df826f2a1f4fd6f8ccbf24f4f728c26f2554fe71726734bbd4b213c6d8f3f88b16fdcc463e355388705f804fb4a0cfcea05b2df45a7e64a1b68e3f5ebbd7a710d620301f945d41b08e0a4e72965e1111cbf36ed2dfbae2bc6852f5eb1ff31bf37686137ed773f197afb02253a7f89eed480dd7023e03049f0082cf5891217c1e4efdc7d1393807f9dfe447e9b5649977813ec417c5f684beb3c8c394a28ef8c9929be44b6e90dbafd4d4c57a744caddbee463af1f1ba59d9f336c265af28936cbf0bbdb393d9002b4bc2b7d138f8a410d6b4a3f93757e338bd65fac3cee8873c8fa8b5a2d89e49328f88a4e024277d908888ce9b246bcbfd215798dadeb321f754eea6e37145cec8b2d3022e8b47548a3a4976c8f8db00dc923b16e2771d42be34b3d92cad6ae4b7e5ea0b4622652249e8832af9d7735b5c70e90ccd32226580becf4844658b9d977f24edd6cd67dc367cb60cf56385e4d3e3b9f8ac6d9efd85b61069b79a8f09f5fac93a3f7c46329577d82517fae0c32e9beaf48db042f1a3d276a37c92b8884f6f96ecd3a94d054f5aa3ab52d4d26e8f3e5e3f595aa0c56f4990b01b7d9e10ffa1735bf00d67fc5d3236e7a651ce0f514a051ebd08ffa4106942fbc7c3d26638b5e47de43c3ff7ad5c2a47dc33aec805a52653af97d9eac9b256eacdf66ed8b794ff1d9445c93fa1c2bd849bb01ba2ce4709dcc423117e7b21d96e28e84628ab1fd2f3f61ff20c30cf399f4704367c232d90217d4222ccf2379dd7f951b9876d72fd3493a98cc336509e044b791c49cb793744607e51e3ace2cc7d98c12f305c7582391225fa0db9912305ca8db548b9f02aa11c8360862c26fc8c7a59029da2f4ea05580d92c45a21a4aa4e99ac6f4c44a635c2fb2609f950dae482ce1e33d45712443df6fb7763ee455873c8a07dae7af2f17ba6b5627df505fe5ae1f55c8dfae6a66bb2f379b82e615e510ae38e71e23f3cc85ca366f2d81bb5a5d83e65f2f2632647d19d1de4a163267b515d2dcc93741760a652508724e798f61b5c24519b0aebda975cd3df9985661fb29c4783cf114df1871caaf5e2357c7ca2a8573a354788c60b927d18bd46fb5079d24c37a10059de135b87f94e88c350ef08117e27ed952ebadd193274172a278a88a291cb07d48a1e1c48ef77374bd31912095f949a7c074e8d6614333c899e38e57ba153c2f787dbd3e74fbe8c325ad95f7b9eb68550924634dccf2da8d247a8ab5b864f4f24fc6a4bd9b2b129d5bcb05cc99b714ad627615b8779f4c2303e055dc3148ca6bf9f89dd48e1d05e69de99bd7f61ce6685de1a6209b5c7b1402edd1b115b3efd176afc4e9f39a30f875718f72ee58f11e3f987bf52c8272c3960c24ed29b7a46b4d2fe0c7b174fd2dc3476cd2712bc289f65395df3b9254ce1d088b644281ce17fc0bcf29f02143de16e9ac2a911fd344de10cf7cb1532f8bfcafdeed76113ee6e993fa1f6eb08f7075f2f716ffc3ac1bd2d351912418b279acd9f01ae01867b9bcde9806f017b7ccce6fd80d3800f01f75566f32c90aac5d1514b23c2e511b1b131b11e3668aeafdfa420f57cb9dfd2f88858b9ffe2b0b885f26931e11188bd2ceeb40b7618278f5e1a1d2f4f088b8d873b08149bb02cfe85fe16c7c42c43366c3c094b17862d0d5f0c295b05c25a1a131b210f4f58b26c9cdc33cede06bd1e961017211fbad273e8b0518b57be2cf79bfe7a87099c516c44d45ccfa1c3c3e70ff28c1b2c9f68e5f3f75cece92c44fe9ef320cfc8c12fcbffd019c7e03204d1f5cd9593df7ab1bd457e37fd8fdd77bdf6c7ee455718b98f95475859c6caef587995957758f98895a892916256bab052ceca311cb30fc73c9995d359b98c952b5999c9ca35ac3cc23197b1f20c2bef70cc8f38e6668e195575358b396607d6ecc2ca411cf3508e790cc7ecc3314fe698a773ccb338e6508e7921c7bcacaa6b7daee4989339e64c8ed9e17b363e560ee2988772cc6338661f8e7932c73c9d639ec53187b272212b9339e64c56ae61e5e71cf3115696b1f22ac75cc331dfe1981f71cccd1c3362f55ccc4a39c73c88631eca318fe1987d38e6c91cf3748e7916c71cca312f64e532566672cc6b38e68d1c7364fc503996fed3e5f1114b96c5c486c54647c461fb6172c67d382b95ac1cc1ca91ac1cc5cad18c8ceb882f2e6c0574c7d0f145c7418f1c47d726b8b3f18675f80b8b8d4a5812b1343eeed5d888f884d8a5f215618b13222cfec32cfe873fe7dfda6364189bbf30367f616cfec2d8fc8559f2d711cfdb2fce1f1b4f1c1b4f1c1b4f1c1b4f9c259e31ac1ccbca614359398ca98f3196746676d6abfcf5b0c58b23626977365c3c1b2e9e09f77e446c0c76981c161bfe4a62742ce4105ba1d830b91cdbcf60aa282c3c3c36220ef21cb78cb17f3b3e8c7a4fbe2c861efdc01cc5daab17c72c085bdce910cfdacf5c181b11166e653f94b57f5166e10275a0dd411d681937f4d5c86538dd2e95f86a646cd89208ab6ca038365c577f0885b1e9f9272ca5e2a36396feb116807f369eb0e1bf17ae6b005007c6ff08568e64e528568e66cb31fc45f98b43716cf838367c1c1b3e8e0d1f67093f86956359396c282b8731f5c5c613cfc613cfc613cfc6b36f0c3bceb2b29995f2b1ecf3cacac9ac3c3d8e7d7e5973fba83f960ba099dfa3db83a997c8b084c5f1f2c888786aa19579714c58b8b57b5c3c4c9b687334a840142850f4d2b8f8d804baca69fb25d17161ec54af3332b882e5833c17270c86c9d638b9951f9c00d42e15b32202ab7458bcdc73e898c52b87c817472c1d87e7452f638d1e475bbe0cadc0d88587c5878d63e75f717444e33c8785bf1c09b1c5e33bb7b94397b013404e5abf970fba60ff5e465e947a97f43b2b0ffd777ef5dff955d7f9ce7fe7575dcdffb7cfafa09318af1cb6c4cfaa3b7a33215e1e13295f12b124267695bd0dd38dbc3dfbedd75553a732fe954b42acfcc7ad8a7b376225ac89293c1e87cb17ac92d3ab5acfc5e1f2c4e8f885782d8997a15dfaa317a41bb4342e61190ceef1b88f5a158763c3718c93870d9de88957b861c358391c4b0f4e8cffe225628480632db436f078ff66225617f9cf78e6ff659f2b4733edf9841d57a7b3e6dbe3197994959b2730f229eb6f086b064d41048007e0f785fa78ed732404880024400c90006c00b6003bf0630fe806e80e70406bf88e207b407829c89e209d00ce702f03b8f45d835c01bd006e0077406f401f405f801ce001e8075000fa033c0103000301830083015e8097002f035e010c01bc0a180a1806180e50024600460246014603c600c602c601c60326002602bc01af017c20af2ac8e72490af83f405e907d21fcaaa064c060400a600de004c054c0304829f3701d3016f0166403dbc0d7226b805411cc1801030cf02cc06cc01f35cc03cc07cc03b60f72e201410065800a000e18008708f0444011602a2c16e11e03dc062c012c052400c6019b82f07c402e200f160970058014804ac84165e05781ff001e0434012e023874de86340322005900a4803a443180d2003a085f832013a4016201b9003c805ac06e401f05f3e60edd04d480f5807f7eb011b0005808d804d10d7664021600b602b601b603ba008b003b013fc7d02d805d80dd803d80bf6fb009f02f603fe06f80cf077c001c0ff003e077f5f000e020c802f0187c0fe30c0083802f80a7014500cf81a700c500228059401ca01c70127002701a700a70115803380b38073806f00df02ce032e002e02be035c025c067c0fb8d2174f8dd6c0f4620daa065c05fc003574adef26f423dcff04b80eb8016df033c81af07f13700b6002dc06d402ea00f5803b80bb807b805f00f7010f000f01bf021e011a00ff00fc06780c68043c0134019a012d80a780678056401ba01d60ee4b770033d8aee46d46f49fce9a67e27f57e69bcdb7008f00ed00bb77cce65e8041803180c9805980858095804c4011e0734009e05bc035c01dc01380e85db3d9193000300ae00f08064402560032003e8039805840166023600fe04bc071c077801ac043402bc026d46c76018c02a48799cdeb00fe703f00100c88047c04580dd802d80f3802380db8021801fe6f837c0c10c07d4f802f6026a03f201c100f380eb80ab8076805382f8034001300c1808580f701ab01fb016580ab80fb00310579063c0608c2cde63e20c70166002201a9808d80cf0127018f001700556cb8db009f08b33910f00e6001600d600fe021a05b24e40550c2ba79c37d157b8fdd4bc07c1950071812056503b9089001780ab001bb5e518cdf87567162390fecb30047001bc1ee6064a77b1dd88d8a60b08005b643c883d5a37eac54d012af58de4d8c0e87e981f744f948f98001722bab0913e56318dfb05859b600e6161e13e541aa1933df7d7be69bd3df1dfe3bf6c3de1d69190f3dfa052c85057774b87c59586c74fcaa7eacfd8a776171b5e2dd0509911e1303836042c35eafe2d45f9d1e1bb328828235fef0a1c3c6befa5ec4d2f0d855f111ef26c6c4be17b72c8c8ae8b07a252e3e6c6978d8e298a5701bfedeab8ba317bc1a1e1b0d8bb6b857f14f03432836de4130b3f10c1fccbcdca7f345bf09c1cb3b58a825ca3dfafdc7d28f8c8d88888d8f897b3506e6634be36357e14cf883e58c996fbe6d29e70be65d9d59b49a4fad9c1916f7de7f385ff110651c5b33092b67c62c9b1e1b1d831b07d7937c71745cfcd480b767be1bf0f6bb7ed3a6cf9c3d48be6ca56fc4e2b05511e1383353c17d6ec2cae971b101e1f3e583e58351bf95a0ab803eacf45fd5691ec002db6133cf0a4300a11f30580198c722f0fd4e33be9fc7bacfb1c2ba0fb14ec345f0787cb804ec25e45ca23fb9c87ff312ff2f5f2fa740df9fcbc0dbea1ee36172e7bd2fb8cd63dd83412e60ef3f0379f02fc03a5e2e4ea633d23d15fab174c66c01d76f95555c07b2baba796533725176a7dde7d97f9c3637fd399cf47f4a61ec9c53193fad6cfa8b21ed2f01ed0087d4cef4b1bf6556693e62efb1fdf3b37dcbd5fa5a5733dfa7abb9fdb580407ffa2e7a69242d035581b45c1ac6bc271b3a6cb872c4c851a3c78c0d5b408547445a4276daab26bdeeebe7df61cf4a39e71acab9e481618172ecef9580a591f817d35572265c5723026fb4f4f30ca725d48cb9d5dc6c7e64ae31979993cdc88cda512b6a468f500d2ab3ac55201ff2d68b277628524cafdcd87ee1f219c1f53d576dc253bfb97cef1f577a7806dc7e65d48837df3e70e13dcfd71a373ef9febd59c41eedb1b2906bbb53f7ec3c347c58fd15c13f4cc3bf1fbedcfdb2e2c7e10f03d6cc19ebbd53fcf6b3f620c7fca7635ddfa73c5f1f56f6d98425b76efc38ffbb27860f3f2bbafd75f887fedf5d0ff2967bf55f6050576f54bcb6fbeed8dd03ef7dbccfebb5b9b6ff9892b2fb81cb8da8a3ebc6fafdbdcf1717d7bdb6bcd4f0a96ed5c2922153e7de9c76b264ddfabab3af4d9b38f1c3a3a35eb23fded67a212cdd31f1dbbfdd7e2da87cdfae401f69d889ef5f8a70bd354b66bcd4f09a4df527cb2676f9d7fcdaf96fb9d7334edbb357b299b65f11b176ca94e4d79ca69edd5c20cfe2cd083de999307cd18c0b9b875f18346defedf9134fcd1f9fbd6ded9cc5332e4ccf6e1834d13e426697909291b0e2ece469915b9a674dff7ae6bc886f4fe777db73a0c8d5f4897f1f8df15efb46b735c5d7736fb46c7df6cb47fbdf7a7d246f34f1c5a8c5ca98d33fe7dc4d3eab3eaadfa76a9efeccf3bd8ae5ef954ea8dc73d11cd077e5f1ef3b7452fe68eba1652fedfbfba9add15df554507ad66df5088eee22f9d725ae5c3be4b3c5ee393b7446f8bc5d11ef793babeb75564e7ff3ed8059208774719dfefaea2f60ae738c4191d53dc6742bf31eb82f61cd47409e64efbb1d84f9e35f8075bc5cf43fc4c88fc0df975f32660bb87ec758c5e55cdcd56d2d6bbe6c65eff2f51fa7cd4dff28277d6fd66e259bee3bacbc7214fa43482712107bb0337decefaa55fab3d8f4b13dddd87fd29f747a18842fae77b93cd3a1eb25e8b8580b157d112fb818f749f4c57bc1855de57fa44cff87ae5ddf9acd185f03b6b1083fd769c6f7db58f72d56d87301d6638f3afa4ee66516c1bed32298774c5e42f6fda8a0b38fc5575923fb5ef909fb7eb3a9abfbffd72f8295dd94e7ff36a2c792bafb3784c8f67f3547ffbdfe7bfdf7faeff5dfebff4fd71d765cb5c8668e143777952e1c398823c770e4648e9cc5910b397225476672e4468edcc7914738f20c475ee5c83b1cd9cc91e296aed285230771e4188e9ccc91b338722147aee4c84c8edcc891fb38f208479ee1c8ab1c7987239b3952fcb4ab74e1c8411c3986232773e42c8e5cc8912b393293233772e43e8e3cc2916738f22a47dee1c8668e143feb2a5d387210478ee1c8c91c398b231772e44a8ecce4c88d1cb98f238f70e4198ebcca917738b29923c5ad5da50b470ee2c8311c3999236771e4428e5cc991991cb99123f771e4118e3cc3915739f20e473673a4b8adab74e1c8411c3986232773e42c8e5cc8912b393293233772e43e8e3cc2916738f22a47dee1c8668e14b777952e1c398823c770e4648e9cc5910b397225476672e4468edcc7914738f20c475ee5c83b1cd9cc91627357e9c2918338720c474ee6c8591cb9902357726426476ee4c87d1c798423cf70e4558eb45c66f31fbdeffde7afff747cffa9ebf5ffcbddd77ec9b46b4961d7f675f995d5ab078cacf9e93f23cd5d2efc5e43f5f6eb01017f90c33f73672ecb7ba3ce9899f7463ecb6c3aca95fcc05bf6a711fdc5ebff019e470e55' - ISP_PROG = binascii.unhexlify(ISP_PROG) - ISP_PROG = zlib.decompress(ISP_PROG) - - def printProgressBar (iteration, total, prefix = '', suffix = '', filename = '', decimals = 1, length = 100, fill = '='): - """ - Call in a loop to create terminal progress bar - @params: - iteration - Required : current iteration (Int) - total - Required : total iterations (Int) - prefix - Optional : prefix string (Str) - suffix - Optional : suffix string (Str) - decimals - Optional : positive number of decimals in percent complete (Int) - length - Optional : character length of bar (Int) - fill - Optional : bar fill character (Str) - """ - percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total))) - filledLength = int(length * iteration // total) - bar = fill * filledLength + '-' * (length - filledLength) - KFlash.log('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = '\r') - # Print New Line on Complete - if iteration == total: - KFlash.log() - if callback: - fileTypeStr = filename - if prefix == "Downloading ISP:": - fileTypeStr = "ISP" - elif prefix == "Programming BIN:" and fileTypeStr == "": - fileTypeStr = "BIN" - callback(fileTypeStr, iteration, total, suffix) - - def slip_reader(port): - partial_packet = None - in_escape = False - - while True: - waiting = port.inWaiting() - read_bytes = port.read(1 if waiting == 0 else waiting) - if read_bytes == b'': - raise_exception( Exception("Timed out waiting for packet %s" % ("header" if partial_packet is None else "content")) ) - for b in read_bytes: - - if type(b) is int: - b = bytes([b]) # python 2/3 compat - - if partial_packet is None: # waiting for packet header - if b == b'\xc0': - partial_packet = b"" - else: - raise_exception( Exception('Invalid head of packet (%r)' % b) ) - elif in_escape: # part-way through escape sequence - in_escape = False - if b == b'\xdc': - partial_packet += b'\xc0' - elif b == b'\xdd': - partial_packet += b'\xdb' - else: - raise_exception( Exception('Invalid SLIP escape (%r%r)' % (b'\xdb', b)) ) - elif b == b'\xdb': # start of escape sequence - in_escape = True - elif b == b'\xc0': # end of packet - yield partial_packet - partial_packet = None - else: # normal byte in packet - partial_packet += b - - - class ISPResponse: - class ISPOperation(Enum): - ISP_ECHO = 0xC1 - ISP_NOP = 0xC2 - ISP_MEMORY_WRITE = 0xC3 - ISP_MEMORY_READ = 0xC4 - ISP_MEMORY_BOOT = 0xC5 - ISP_DEBUG_INFO = 0xD1 - ISP_CHANGE_BAUDRATE = 0xc6 - - class ErrorCode(Enum): - ISP_RET_DEFAULT = 0 - ISP_RET_OK = 0xE0 - ISP_RET_BAD_DATA_LEN = 0xE1 - ISP_RET_BAD_DATA_CHECKSUM = 0xE2 - ISP_RET_INVALID_COMMAND = 0xE3 - - @staticmethod - def parse(data): - # type: (bytes) -> (int, int, str) - op = 0 - reason = 0 - text = '' - - if (sys.version_info > (3, 0)): - op = int(data[0]) - reason = int(data[1]) - else: - op = ord(data[0]) - reason = ord(data[1]) - - try: - if ISPResponse.ISPOperation(op) == ISPResponse.ISPOperation.ISP_DEBUG_INFO: - text = data[2:].decode() - except ValueError: - KFlash.log('Warning: recv unknown op', op) - - return (op, reason, text) - - - class FlashModeResponse: - class Operation(Enum): - ISP_DEBUG_INFO = 0xD1 - ISP_NOP = 0xD2 - ISP_FLASH_ERASE = 0xD3 - ISP_FLASH_WRITE = 0xD4 - ISP_REBOOT = 0xD5 - ISP_UARTHS_BAUDRATE_SET = 0xD6 - FLASHMODE_FLASH_INIT = 0xD7 - - class ErrorCode(Enum): - ISP_RET_DEFAULT = 0 - ISP_RET_OK = 0xE0 - ISP_RET_BAD_DATA_LEN = 0xE1 - ISP_RET_BAD_DATA_CHECKSUM = 0xE2 - ISP_RET_INVALID_COMMAND = 0xE3 - ISP_RET_BAD_INITIALIZATION = 0xE4 - - @staticmethod - def parse(data): - # type: (bytes) -> (int, int, str) - op = 0 - reason = 0 - text = '' - - if (sys.version_info > (3, 0)): - op = int(data[0]) - reason = int(data[1]) - else: - op = ord(data[0]) - reason = ord(data[1]) - - if FlashModeResponse.Operation(op) == FlashModeResponse.Operation.ISP_DEBUG_INFO: - text = data[2:].decode() - - return (op, reason, text) - - - def chunks(l, n): - """Yield successive n-sized chunks from l.""" - for i in range(0, len(l), n): - yield l[i:i + n] - - class TerminalSize: - @staticmethod - def getTerminalSize(): - import platform - current_os = platform.system() - tuple_xy=None - if current_os == 'Windows': - tuple_xy = TerminalSize._getTerminalSize_windows() - if tuple_xy is None: - tuple_xy = TerminalSize._getTerminalSize_tput() - # needed for window's python in cygwin's xterm! - if current_os == 'Linux' or current_os == 'Darwin' or current_os.startswith('CYGWIN'): - tuple_xy = TerminalSize._getTerminalSize_linux() - if tuple_xy is None: - # Use default value - tuple_xy = (80, 25) # default value - return tuple_xy - - @staticmethod - def _getTerminalSize_windows(): - res=None - try: - from ctypes import windll, create_string_buffer - - # stdin handle is -10 - # stdout handle is -11 - # stderr handle is -12 - - h = windll.kernel32.GetStdHandle(-12) - csbi = create_string_buffer(22) - res = windll.kernel32.GetConsoleScreenBufferInfo(h, csbi) - except: - return None - if res: - import struct - (bufx, bufy, curx, cury, wattr, - left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw) - sizex = right - left + 1 - sizey = bottom - top + 1 - return sizex, sizey - else: - return None - - @staticmethod - def _getTerminalSize_tput(): - # get terminal width - # src: http://stackoverflow.com/questions/263890/how-do-i-find-the-width-height-of-a-terminal-window - try: - import subprocess - proc=subprocess.Popen(["tput", "cols"],stdin=subprocess.PIPE,stdout=subprocess.PIPE) - output=proc.communicate(input=None) - cols=int(output[0]) - proc=subprocess.Popen(["tput", "lines"],stdin=subprocess.PIPE,stdout=subprocess.PIPE) - output=proc.communicate(input=None) - rows=int(output[0]) - return (cols,rows) - except: - return None - - @staticmethod - def _getTerminalSize_linux(): - def ioctl_GWINSZ(fd): - try: - import fcntl, termios, struct, os - cr = struct.unpack('hh', fcntl.ioctl(fd, termios.TIOCGWINSZ,'1234')) - except: - return None - return cr - cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) - if not cr: - try: - fd = os.open(os.ctermid(), os.O_RDONLY) - cr = ioctl_GWINSZ(fd) - os.close(fd) - except: - pass - if not cr: - try: - cr = (os.env['LINES'], os.env['COLUMNS']) - except: - return None - return int(cr[1]), int(cr[0]) - - @staticmethod - def get_terminal_size(fallback=(100, 24), terminal = False): - try: - columns, rows = TerminalSize.getTerminalSize() - if not terminal: - if not terminal_auto_size: - columns, rows = terminal_size - except: - columns, rows = fallback - - return columns, rows - - class MAIXLoader: - def change_baudrate(self, baudrate): - KFlash.log(INFO_MSG,"Selected Baudrate: ", baudrate, BASH_TIPS['DEFAULT']) - out = struct.pack('III', 0, 4, baudrate) - crc32_checksum = struct.pack('I', binascii.crc32(out) & 0xFFFFFFFF) - out = struct.pack('HH', 0xd6, 0x00) + crc32_checksum + out - self.write(out) - time.sleep(0.05) - self._port.baudrate = baudrate - if args.Board == "goE": - if baudrate >= 4500000: - # OPENEC super baudrate - KFlash.log(INFO_MSG, "Enable OPENEC super baudrate!!!", BASH_TIPS['DEFAULT']) - if baudrate == 4500000: - self._port.baudrate = 300 - if baudrate == 6000000: - self._port.baudrate = 250 - if baudrate == 7500000: - self._port.baudrate = 350 - - def change_baudrate_stage0(self, baudrate): - # Dangerous, here are dinosaur infested!!!!! - # Don't touch this code unless you know what you are doing - # Stage0 baudrate is fixed - # Contributor: [@rgwan](https://github.com/rgwan) - # rgwan - baudrate = 1500000 - if args.Board == "goE" or args.Board == "trainer": - KFlash.log(INFO_MSG,"Selected Stage0 Baudrate: ", baudrate, BASH_TIPS['DEFAULT']) - # This is for openec, contained ft2232, goE and trainer - KFlash.log(INFO_MSG,"FT2232 mode", BASH_TIPS['DEFAULT']) - baudrate_stage0 = int(baudrate * 38.6 / 38) - out = struct.pack('III', 0, 4, baudrate_stage0) - crc32_checksum = struct.pack('I', binascii.crc32(out) & 0xFFFFFFFF) - out = struct.pack('HH', 0xc6, 0x00) + crc32_checksum + out - self.write(out) - time.sleep(0.05) - self._port.baudrate = baudrate - - retry_count = 0 - while 1: - self.checkKillExit() - retry_count = retry_count + 1 - if retry_count > 3: - err = (ERROR_MSG,'Fast mode failed, please use slow mode by add parameter ' + BASH_TIPS['GREEN'] + '--Slow', BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - try: - self.greeting() - break - except TimeoutError: - pass - elif args.Board == "dan" or args.Board == "bit" or args.Board == "kd233": - KFlash.log(INFO_MSG,"CH340 mode", BASH_TIPS['DEFAULT']) - # This is for CH340, contained dan, bit and kd233 - baudrate_stage0 = int(baudrate * 38.4 / 38) - # CH340 can not use this method, test failed, take risks at your own risk - else: - # This is for unknown board - KFlash.log(WARN_MSG,"Unknown mode", BASH_TIPS['DEFAULT']) - - def __init__(self, port='/dev/ttyUSB1', baudrate=115200): - # configure the serial connections (the parameters differs on the device you are connecting to) - self._port = serial.Serial( - port=port, - baudrate=baudrate, - parity=serial.PARITY_NONE, - stopbits=serial.STOPBITS_ONE, - bytesize=serial.EIGHTBITS, - timeout=0.1 - ) - KFlash.log(INFO_MSG, "Default baudrate is", baudrate, ", later it may be changed to the value you set.", BASH_TIPS['DEFAULT']) - - self._port.isOpen() - self._slip_reader = slip_reader(self._port) - self._kill_process = False - - """ Read a SLIP packet from the serial port """ - - def read(self): - return next(self._slip_reader) - - """ Write bytes to the serial port while performing SLIP escaping """ - - def write(self, packet): - buf = b'\xc0' \ - + (packet.replace(b'\xdb', b'\xdb\xdd').replace(b'\xc0', b'\xdb\xdc')) \ - + b'\xc0' - #KFlash.log('[WRITE]', binascii.hexlify(buf)) - return self._port.write(buf) - - def read_loop(self): - #out = b'' - # while self._port.inWaiting() > 0: - # out += self._port.read(1) - - # KFlash.log(out) - while 1: - sys.stdout.write('[RECV] raw data: ') - sys.stdout.write(binascii.hexlify(self._port.read(1)).decode()) - sys.stdout.flush() - - def recv_one_return(self): - timeout_init = time.time() - data = b'' - # find start boarder - #sys.stdout.write('[RECV one return] raw data: ') - while 1: - if time.time() - timeout_init > ISP_RECEIVE_TIMEOUT: - raise TimeoutError - c = self._port.read(1) - #sys.stdout.write(binascii.hexlify(c).decode()) - sys.stdout.flush() - if c == b'\xc0': - break - - in_escape = False - while 1: - if time.time() - timeout_init > ISP_RECEIVE_TIMEOUT: - self.raise_exception( TimeoutError ) - c = self._port.read(1) - #sys.stdout.write(binascii.hexlify(c).decode()) - sys.stdout.flush() - if c == b'\xc0': - break - - elif in_escape: # part-way through escape sequence - in_escape = False - if c == b'\xdc': - data += b'\xc0' - elif c == b'\xdd': - data += b'\xdb' - else: - self.raise_exception( Exception('Invalid SLIP escape (%r%r)' % (b'\xdb', c)) ) - elif c == b'\xdb': # start of escape sequence - in_escape = True - - data += c - - #sys.stdout.write('\n') - return data - - # kd233 or open-ec or new cmsis-dap - def reset_to_isp_kd233(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW, IO16 to HIGH --') - # Pull reset down and keep 10ms - self._port.setDTR (True) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- IO16 to LOW, RESET to HIGH --') - # Pull IO16 to low and release reset - self._port.setRTS (True) - self._port.setDTR (False) - time.sleep(0.1) - def reset_to_boot_kd233(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW --') - # Pull reset down and keep 10ms - self._port.setDTR (True) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to HIGH, BOOT --') - # Pull IO16 to low and release reset - self._port.setRTS (False) - self._port.setDTR (False) - time.sleep(0.1) - - #dan dock - def reset_to_isp_dan(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW, IO16 to HIGH --') - # Pull reset down and keep 10ms - self._port.setDTR (False) - self._port.setRTS (True) - time.sleep(0.1) - #KFlash.log('-- IO16 to LOW, RESET to HIGH --') - # Pull IO16 to low and release reset - self._port.setRTS (False) - self._port.setDTR (True) - time.sleep(0.1) - def reset_to_boot_dan(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW --') - # Pull reset down and keep 10ms - self._port.setDTR (False) - self._port.setRTS (True) - time.sleep(0.1) - #KFlash.log('-- RESET to HIGH, BOOT --') - # Pull IO16 to low and release reset - self._port.setRTS (False) - self._port.setDTR (False) - time.sleep(0.1) - - # maix goD for old cmsis-dap firmware - def reset_to_isp_goD(self): - self._port.setDTR (True) ## output 0 - self._port.setRTS (True) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW --') - # Pull reset down and keep 10ms - self._port.setRTS (False) - self._port.setDTR (True) - time.sleep(0.1) - #KFlash.log('-- RESET to HIGH, BOOT --') - # Pull IO16 to low and release reset - self._port.setRTS (False) - self._port.setDTR (True) - time.sleep(0.1) - def reset_to_boot_goD(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW --') - # Pull reset down and keep 10ms - self._port.setRTS (False) - self._port.setDTR (True) - time.sleep(0.1) - #KFlash.log('-- RESET to HIGH, BOOT --') - # Pull IO16 to low and release reset - self._port.setRTS (True) - self._port.setDTR (True) - time.sleep(0.1) - - # maix goE for openec or new cmsis-dap firmware - def reset_to_boot_maixgo(self): - self._port.setDTR (False) - self._port.setRTS (False) - time.sleep(0.1) - #KFlash.log('-- RESET to LOW --') - # Pull reset down and keep 10ms - self._port.setRTS (False) - self._port.setDTR (True) - time.sleep(0.1) - #KFlash.log('-- RESET to HIGH, BOOT --') - # Pull IO16 to low and release reset - self._port.setRTS (False) - self._port.setDTR (False) - time.sleep(0.1) - - def greeting(self): - self._port.write(b'\xc0\xc2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0') - op, reason, text = ISPResponse.parse(self.recv_one_return()) - - #KFlash.log('MAIX return op:', ISPResponse.ISPOperation(op).name, 'reason:', ISPResponse.ErrorCode(reason).name) - - - def flash_greeting(self): - retry_count = 0 - while 1: - self.checkKillExit() - self._port.write(b'\xc0\xd2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0') - retry_count = retry_count + 1 - try: - op, reason, text = FlashModeResponse.parse(self.recv_one_return()) - except IndexError: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to Connect to K210's Stub",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Index Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - except TimeoutError: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to Connect to K210's Stub",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Timeout Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - except: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to Connect to K210's Stub",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Unexcepted Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - # KFlash.log('MAIX return op:', FlashModeResponse.Operation(op).name, 'reason:', - # FlashModeResponse.ErrorCode(reason).name) - if FlashModeResponse.Operation(op) == FlashModeResponse.Operation.ISP_NOP and FlashModeResponse.ErrorCode(reason) == FlashModeResponse.ErrorCode.ISP_RET_OK: - KFlash.log(INFO_MSG,"Boot to Flashmode Successfully",BASH_TIPS['DEFAULT']) - self._port.flushInput() - self._port.flushOutput() - break - else: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to Connect to K210's Stub",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Unexcepted Return recevied, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - - def boot(self, address=0x80000000): - KFlash.log(INFO_MSG,"Booting From " + hex(address),BASH_TIPS['DEFAULT']) - - out = struct.pack('II', address, 0) - - crc32_checksum = struct.pack('I', binascii.crc32(out) & 0xFFFFFFFF) - - out = struct.pack('HH', 0xc5, 0x00) + crc32_checksum + out # op: ISP_MEMORY_WRITE: 0xc3 - self.write(out) - - def recv_debug(self): - op, reason, text = ISPResponse.parse(self.recv_one_return()) - #KFlash.log('[RECV] op:', ISPResponse.ISPOperation(op).name, 'reason:', ISPResponse.ErrorCode(reason).name) - if text: - KFlash.log('-' * 30) - KFlash.log(text) - KFlash.log('-' * 30) - if ISPResponse.ErrorCode(reason) not in (ISPResponse.ErrorCode.ISP_RET_DEFAULT, ISPResponse.ErrorCode.ISP_RET_OK): - KFlash.log('Failed, retry, errcode=', hex(reason)) - return False - return True - - def flash_recv_debug(self): - op, reason, text = FlashModeResponse.parse(self.recv_one_return()) - #KFlash.log('[Flash-RECV] op:', FlashModeResponse.Operation(op).name, 'reason:', - # FlashModeResponse.ErrorCode(reason).name) - if text: - KFlash.log('-' * 30) - KFlash.log(text) - KFlash.log('-' * 30) - - if FlashModeResponse.ErrorCode(reason) not in (FlashModeResponse.ErrorCode.ISP_RET_OK, FlashModeResponse.ErrorCode.ISP_RET_OK): - KFlash.log('Failed, retry') - return False - return True - - def init_flash(self, chip_type): - chip_type = int(chip_type) - KFlash.log(INFO_MSG,"Selected Flash: ",("In-Chip", "On-Board")[chip_type],BASH_TIPS['DEFAULT']) - out = struct.pack('II', chip_type, 0) - crc32_checksum = struct.pack('I', binascii.crc32(out) & 0xFFFFFFFF) - out = struct.pack('HH', 0xd7, 0x00) + crc32_checksum + out - '''Retry when it have error''' - retry_count = 0 - while 1: - self.checkKillExit() - sent = self.write(out) - retry_count = retry_count + 1 - try: - op, reason, text = FlashModeResponse.parse(self.recv_one_return()) - except IndexError: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to initialize flash",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Index Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - except TimeoutError: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to initialize flash",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Timeout Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - except: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to initialize flash",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Unexcepted Error, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - # KFlash.log('MAIX return op:', FlashModeResponse.Operation(op).name, 'reason:', - # FlashModeResponse.ErrorCode(reason).name) - if FlashModeResponse.Operation(op) == FlashModeResponse.Operation.FLASHMODE_FLASH_INIT and FlashModeResponse.ErrorCode(reason) == FlashModeResponse.ErrorCode.ISP_RET_OK: - KFlash.log(INFO_MSG,"Initialization flash Successfully",BASH_TIPS['DEFAULT']) - break - else: - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Failed to initialize flash",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - KFlash.log(WARN_MSG,"Unexcepted Return recevied, retrying...",BASH_TIPS['DEFAULT']) - time.sleep(0.1) - continue - - def flash_dataframe(self, data, address=0x80000000): - DATAFRAME_SIZE = 1024 - data_chunks = chunks(data, DATAFRAME_SIZE) - #KFlash.log('[DEBUG] flash dataframe | data length:', len(data)) - total_chunk = math.ceil(len(data)/DATAFRAME_SIZE) - - time_start = time.time() - for n, chunk in enumerate(data_chunks): - self.checkKillExit() - while 1: - self.checkKillExit() - #KFlash.log('[INFO] sending chunk', i, '@address', hex(address), 'chunklen', len(chunk)) - out = struct.pack('II', address, len(chunk)) - - crc32_checksum = struct.pack('I', binascii.crc32(out + chunk) & 0xFFFFFFFF) - - out = struct.pack('HH', 0xc3, 0x00) + crc32_checksum + out + chunk # op: ISP_MEMORY_WRITE: 0xc3 - sent = self.write(out) - #KFlash.log('[INFO]', 'sent', sent, 'bytes', 'checksum', binascii.hexlify(crc32_checksum).decode()) - - address += len(chunk) - - if self.recv_debug(): - break - - columns, lines = TerminalSize.get_terminal_size((100, 24), terminal) - time_delta = time.time() - time_start - speed = '' - if (time_delta > 1): - speed = str(int((n + 1) * DATAFRAME_SIZE / 1024.0 / time_delta)) + 'kiB/s' - printProgressBar(n+1, total_chunk, prefix = 'Downloading ISP:', suffix = speed, length = columns - 35) - - def dump_to_flash(self, data, address=0): - ''' - typedef struct __attribute__((packed)) { - uint8_t op; - int32_t checksum; /* All the fields below are involved in the calculation of checksum */ - uint32_t address; - uint32_t data_len; - uint8_t data_buf[1024]; - } isp_request_t; - ''' - - DATAFRAME_SIZE = ISP_FLASH_DATA_FRAME_SIZE - data_chunks = chunks(data, DATAFRAME_SIZE) - #KFlash.log('[DEBUG] flash dataframe | data length:', len(data)) - - - - for n, chunk in enumerate(data_chunks): - #KFlash.log('[INFO] sending chunk', i, '@address', hex(address)) - out = struct.pack('II', address, len(chunk)) - - crc32_checksum = struct.pack('I', binascii.crc32(out + chunk) & 0xFFFFFFFF) - - out = struct.pack('HH', 0xd4, 0x00) + crc32_checksum + out + chunk - #KFlash.log("[$$$$]", binascii.hexlify(out[:32]).decode()) - retry_count = 0 - while True: - try: - sent = self.write(out) - #KFlash.log('[INFO]', 'sent', sent, 'bytes', 'checksum', crc32_checksum) - self.flash_recv_debug() - except: - retry_count = retry_count + 1 - if retry_count > MAX_RETRY_TIMES: - err = (ERROR_MSG,"Error Count Exceeded, Stop Trying",BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - continue - break - address += len(chunk) - - - - def flash_erase(self): - #KFlash.log('[DEBUG] erasing spi flash.') - self._port.write(b'\xc0\xd3\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0') - op, reason, text = FlashModeResponse.parse(self.recv_one_return()) - #KFlash.log('MAIX return op:', FlashModeResponse.Operation(op).name, 'reason:', - # FlashModeResponse.ErrorCode(reason).name) - - def install_flash_bootloader(self, data): - # Download flash bootloader - self.flash_dataframe(data, address=0x80000000) - - def load_elf_to_sram(self, f): - try: - from elftools.elf.elffile import ELFFile - from elftools.elf.descriptions import describe_p_type - except ImportError: - err = (ERROR_MSG,'pyelftools must be installed, run '+BASH_TIPS['GREEN']+'`' + ('pip', 'pip3')[sys.version_info > (3, 0)] + ' install pyelftools`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - self.raise_exception( Exception(err) ) - - elffile = ELFFile(f) - if elffile['e_entry'] != 0x80000000: - KFlash.log(WARN_MSG,"ELF entry is 0x%x instead of 0x80000000" % (elffile['e_entry']), BASH_TIPS['DEFAULT']) - - for segment in elffile.iter_segments(): - t = describe_p_type(segment['p_type']) - KFlash.log(INFO_MSG, ("Program Header: Size: %d, Virtual Address: 0x%x, Type: %s" % (segment['p_filesz'], segment['p_vaddr'], t)), BASH_TIPS['DEFAULT']) - if not (segment['p_vaddr'] & 0x80000000): - continue - if segment['p_filesz']==0 or segment['p_vaddr']==0: - KFlash.log("Skipped") - continue - self.flash_dataframe(segment.data(), segment['p_vaddr']) - - def flash_firmware(self, firmware_bin, aes_key = None, address_offset = 0, sha256Prefix = True, filename = ""): - # type: (bytes, bytes, int, bool) -> None - # Don't remove above code! - - #KFlash.log('[DEBUG] flash_firmware DEBUG: aeskey=', aes_key) - - if sha256Prefix == True: - # Add header to the firmware - # Format: SHA256(after)(32bytes) + AES_CIPHER_FLAG (1byte) + firmware_size(4bytes) + firmware_data - aes_cipher_flag = b'\x01' if aes_key else b'\x00' - - # Encryption - if aes_key: - enc = AES_128_CBC(aes_key, iv=b'\x00'*16).encrypt - padded = firmware_bin + b'\x00'*15 # zero pad - firmware_bin = b''.join([enc(padded[i*16:i*16+16]) for i in range(len(padded)//16)]) - - firmware_len = len(firmware_bin) - - data = aes_cipher_flag + struct.pack('I', firmware_len) + firmware_bin - - sha256_hash = hashlib.sha256(data).digest() - - firmware_with_header = data + sha256_hash - - total_chunk = math.ceil(len(firmware_with_header)/ISP_FLASH_DATA_FRAME_SIZE) - # Slice download firmware - data_chunks = chunks(firmware_with_header, ISP_FLASH_DATA_FRAME_SIZE) # 4kiB for a sector, 16kiB for dataframe - else: - total_chunk = math.ceil(len(firmware_bin)/ISP_FLASH_DATA_FRAME_SIZE) - data_chunks = chunks(firmware_bin, ISP_FLASH_DATA_FRAME_SIZE) - - time_start = time.time() - for n, chunk in enumerate(data_chunks): - self.checkKillExit() - chunk = chunk.ljust(ISP_FLASH_DATA_FRAME_SIZE, b'\x00') # align by size of dataframe - - # Download a dataframe - #KFlash.log('[INFO]', 'Write firmware data piece') - self.dump_to_flash(chunk, address= n * ISP_FLASH_DATA_FRAME_SIZE + address_offset) - columns, lines = TerminalSize.get_terminal_size((100, 24), terminal) - time_delta = time.time() - time_start - speed = '' - if (time_delta > 1): - speed = str(int((n + 1) * ISP_FLASH_DATA_FRAME_SIZE / 1024.0 / time_delta)) + 'kiB/s' - printProgressBar(n+1, total_chunk, prefix = 'Programming BIN:', filename=filename, suffix = speed, length = columns - 35) - - def kill(self): - self._kill_process = True - - def checkKillExit(self): - if self._kill_process: - self._port.close() - self._kill_process = False - raise Exception("Cancel") - - def open_terminal(reset): - control_signal = '0' if reset else '1' - control_signal_b = not reset - import serial.tools.miniterm - # For using the terminal with MaixPy the 'filter' option must be set to 'direct' - # because some control characters are emited - sys.argv = [sys.argv[0], _port, '115200', '--dtr='+control_signal, '--rts='+control_signal, '--filter=direct'] - serial.tools.miniterm.main(default_port=_port, default_baudrate=115200, default_dtr=control_signal_b, default_rts=control_signal_b) - sys.exit(0) - - boards_choices = ["kd233", "dan", "bit", "bit_mic", "goE", "goD", "maixduino", "trainer"] - if terminal: - parser = argparse.ArgumentParser() - parser.add_argument("-p", "--port", help="COM Port", default="DEFAULT") - parser.add_argument("-f", "--flash", help="SPI Flash type, 0 for SPI3, 1 for SPI0", default=1) - parser.add_argument("-b", "--baudrate", type=int, help="UART baudrate for uploading firmware", default=115200) - parser.add_argument("-l", "--bootloader", help="Bootloader bin path", required=False, default=None) - parser.add_argument("-k", "--key", help="AES key in hex, if you need encrypt your firmware.", required=False, default=None) - parser.add_argument("-v", "--version", help="Print version.", action='version', version='0.8.3') - parser.add_argument("--verbose", help="Increase output verbosity", default=False, action="store_true") - parser.add_argument("-t", "--terminal", help="Start a terminal after finish (Python miniterm)", default=False, action="store_true") - parser.add_argument("-n", "--noansi", help="Do not use ANSI colors, recommended in Windows CMD", default=False, action="store_true") - parser.add_argument("-s", "--sram", help="Download firmware to SRAM and boot", default=False, action="store_true") - parser.add_argument("-B", "--Board",required=False, type=str, help="Select dev board", choices=boards_choices) - parser.add_argument("-S", "--Slow",required=False, help="Slow download mode", default=False) - parser.add_argument("firmware", help="firmware bin path") - args = parser.parse_args() - else: - args = argparse.Namespace() - setattr(args, "port", "DEFAULT") - setattr(args, "flash", 1) - setattr(args, "baudrate", 115200) - setattr(args, "bootloader", None) - setattr(args, "key", None) - setattr(args, "verbose", False) - setattr(args, "terminal", False) - setattr(args, "noansi", False) - setattr(args, "sram", False) - setattr(args, "Board", None) - setattr(args, "Slow", False) - - # udpate args for none terminal call - if not terminal: - args.port = dev - args.baudrate = baudrate - args.noansi = noansi - args.sram = sram - args.Board = board - args.firmware = file - - if args.Board == "maixduino" or args.Board == "bit_mic": - args.Board = "goE" - - if (args.noansi == True): - BASH_TIPS = dict(NORMAL='',BOLD='',DIM='',UNDERLINE='', - DEFAULT='', RED='', YELLOW='', GREEN='', - BG_DEFAULT='', BG_WHITE='') - ERROR_MSG = BASH_TIPS['RED']+BASH_TIPS['BOLD']+'[ERROR]'+BASH_TIPS['NORMAL'] - WARN_MSG = BASH_TIPS['YELLOW']+BASH_TIPS['BOLD']+'[WARN]'+BASH_TIPS['NORMAL'] - INFO_MSG = BASH_TIPS['GREEN']+BASH_TIPS['BOLD']+'[INFO]'+BASH_TIPS['NORMAL'] - KFlash.log(INFO_MSG,'ANSI colors not used',BASH_TIPS['DEFAULT']) - - manually_set_the_board = False - if args.Board: - manually_set_the_board = True - - if args.port == "DEFAULT": - if args.Board == "goE": - list_port_info = list(serial.tools.list_ports.grep("0403")) #Take the second one - if len(list_port_info) == 0: - err = (ERROR_MSG,"No vaild COM Port found in Auto Detect, Check Your Connection or Specify One by"+BASH_TIPS['GREEN']+'`--port/-p`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - list_port_info.sort() - if len(list_port_info) == 1: - _port = list_port_info[0].device - elif len(list_port_info) > 1: - _port = list_port_info[1].device - KFlash.log(INFO_MSG,"COM Port Auto Detected, Selected ", _port, BASH_TIPS['DEFAULT']) - elif args.Board == "trainer": - list_port_info = list(serial.tools.list_ports.grep("0403")) #Take the first one - if(len(list_port_info)==0): - err = (ERROR_MSG,"No vaild COM Port found in Auto Detect, Check Your Connection or Specify One by"+BASH_TIPS['GREEN']+'`--port/-p`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - list_port_info.sort() - _port = list_port_info[0].device - KFlash.log(INFO_MSG,"COM Port Auto Detected, Selected ", _port, BASH_TIPS['DEFAULT']) - else: - try: - list_port_info = next(serial.tools.list_ports.grep(VID_LIST_FOR_AUTO_LOOKUP)) #Take the first one within the list - _port = list_port_info.device - KFlash.log(INFO_MSG,"COM Port Auto Detected, Selected ", _port, BASH_TIPS['DEFAULT']) - except StopIteration: - err = (ERROR_MSG,"No vaild COM Port found in Auto Detect, Check Your Connection or Specify One by"+BASH_TIPS['GREEN']+'`--port/-p`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - else: - _port = args.port - KFlash.log(INFO_MSG,"COM Port Selected Manually: ", _port, BASH_TIPS['DEFAULT']) - - self.loader = MAIXLoader(port=_port, baudrate=115200) - file_format = ProgramFileFormat.FMT_BINARY - - # 0. Check firmware - try: - firmware_bin = open(args.firmware, 'rb') - except FileNotFoundError: - err = (ERROR_MSG,'Unable to find the firmware at ', args.firmware, BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - - with open(args.firmware, 'rb') as f: - file_header = f.read(4) - #if file_header.startswith(bytes([0x50, 0x4B])): - if file_header.startswith(b'\x50\x4B'): - if ".kfpkg" != os.path.splitext(args.firmware)[1]: - KFlash.log(INFO_MSG, 'Find a zip file, but not with ext .kfpkg:', args.firmware, BASH_TIPS['DEFAULT']) - else: - file_format = ProgramFileFormat.FMT_KFPKG - - #if file_header.startswith(bytes([0x7F, 0x45, 0x4C, 0x46])): - if file_header.startswith(b'\x7f\x45\x4c\x46'): - file_format = ProgramFileFormat.FMT_ELF - if args.sram: - KFlash.log(INFO_MSG, 'Find an ELF file:', args.firmware, BASH_TIPS['DEFAULT']) - else: - err = (ERROR_MSG, 'This is an ELF file and cannot be programmed to flash directly:', args.firmware, BASH_TIPS['DEFAULT'] , '\r\nPlease retry:', args.firmware + '.bin', BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - - # 1. Greeting. - KFlash.log(INFO_MSG,"Trying to Enter the ISP Mode...",BASH_TIPS['DEFAULT']) - - retry_count = 0 - - while 1: - self.checkKillExit() - try: - retry_count = retry_count + 1 - if retry_count > 15: - err = (ERROR_MSG,"No vaild Kendryte K210 found in Auto Detect, Check Your Connection or Specify One by"+BASH_TIPS['GREEN']+'`-p '+('/dev/ttyUSB0', 'COM3')[sys.platform == 'win32']+'`',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - if args.Board == "dan" or args.Board == "bit" or args.Board == "trainer": - try: - KFlash.log('.', end='') - self.loader.reset_to_isp_dan() - self.loader.greeting() - break - except TimeoutError: - pass - elif args.Board == "kd233": - try: - KFlash.log('_', end='') - self.loader.reset_to_isp_kd233() - self.loader.greeting() - break - except TimeoutError: - pass - elif args.Board == "goE": - try: - KFlash.log('*', end='') - self.loader.reset_to_isp_kd233() - self.loader.greeting() - break - except TimeoutError: - pass - elif args.Board == "goD": - try: - KFlash.log('#', end='') - self.loader.reset_to_isp_goD() - self.loader.greeting() - break - except TimeoutError: - pass - else: - try: - KFlash.log('.', end='') - self.loader.reset_to_isp_dan() - self.loader.greeting() - args.Board = "dan" - KFlash.log() - KFlash.log(INFO_MSG,"Automatically detected dan/bit/trainer",BASH_TIPS['DEFAULT']) - break - except TimeoutError: - pass - try: - KFlash.log('_', end='') - self.loader.reset_to_isp_kd233() - self.loader.greeting() - args.Board = "kd233" - KFlash.log() - KFlash.log(INFO_MSG,"Automatically detected goE/kd233",BASH_TIPS['DEFAULT']) - break - except TimeoutError: - pass - try: - KFlash.log('.', end='') - self.loader.reset_to_isp_goD() - self.loader.greeting() - args.Board = "goD" - KFlash.log() - KFlash.log(INFO_MSG,"Automatically detected goD",BASH_TIPS['DEFAULT']) - break - except TimeoutError: - pass - try: - # Magic, just repeat, don't remove, it may unstable, don't know why. - KFlash.log('_', end='') - self.loader.reset_to_isp_kd233() - self.loader.greeting() - args.Board = "kd233" - KFlash.log() - KFlash.log(INFO_MSG,"Automatically detected goE/kd233",BASH_TIPS['DEFAULT']) - break - except TimeoutError: - pass - except Exception as e: - KFlash.log() - raise_exception( Exception("Greeting fail, check serial port ("+str(e)+")" ) ) - - # Don't remove this line - # Dangerous, here are dinosaur infested!!!!! - ISP_RECEIVE_TIMEOUT = 3 - - KFlash.log() - KFlash.log(INFO_MSG,"Greeting Message Detected, Start Downloading ISP",BASH_TIPS['DEFAULT']) - - if manually_set_the_board and (not args.Slow): - if (args.baudrate >= 1500000) or args.sram: - self.loader.change_baudrate_stage0(args.baudrate) - - # 2. download bootloader and firmware - if args.sram: - if file_format == ProgramFileFormat.FMT_KFPKG: - err = (ERROR_MSG, "Unable to load kfpkg to SRAM") - err = tuple2str(err) - raise_exception( Exception(err) ) - elif file_format == ProgramFileFormat.FMT_ELF: - self.loader.load_elf_to_sram(firmware_bin) - else: - self.loader.install_flash_bootloader(firmware_bin.read()) - else: - # install bootloader at 0x80000000 - isp_loader = open(args.bootloader, 'rb').read() if args.bootloader else ISP_PROG - self.loader.install_flash_bootloader(isp_loader) - - # Boot the code from SRAM - self.loader.boot() - - if args.sram: - # Dangerous, here are dinosaur infested!!!!! - # Don't touch this code unless you know what you are doing - self.loader._port.baudrate = args.baudrate - KFlash.log(INFO_MSG,"Boot user code from SRAM", BASH_TIPS['DEFAULT']) - if(args.terminal == True): - open_terminal(False) - msg = "Burn SRAM OK" - raise_exception( Exception(msg) ) - - # Dangerous, here are dinosaur infested!!!!! - # Don't touch this code unless you know what you are doing - self.loader._port.baudrate = 115200 - - KFlash.log(INFO_MSG,"Wait For 0.1 second for ISP to Boot", BASH_TIPS['DEFAULT']) - - time.sleep(0.1) - - self.loader.flash_greeting() - - if args.baudrate != 115200: - self.loader.change_baudrate(args.baudrate) - KFlash.log(INFO_MSG,"Baudrate changed, greeting with ISP again ... ", BASH_TIPS['DEFAULT']) - self.loader.flash_greeting() - - self.loader.init_flash(args.flash) - - if file_format == ProgramFileFormat.FMT_KFPKG: - KFlash.log(INFO_MSG,"Extracting KFPKG ... ", BASH_TIPS['DEFAULT']) - firmware_bin.close() - with tempfile.TemporaryDirectory() as tmpdir: - try: - with zipfile.ZipFile(args.firmware) as zf: - zf.extractall(tmpdir) - except zipfile.BadZipFile: - err = (ERROR_MSG,'Unable to Decompress the kfpkg, your file might be corrupted.',BASH_TIPS['DEFAULT']) - err = tuple2str(err) - raise_exception( Exception(err) ) - - fFlashList = open(os.path.join(tmpdir, 'flash-list.json'), "r") - sFlashList = re.sub(r'"address": (.*),', r'"address": "\1",', fFlashList.read()) #Pack the Hex Number in json into str - fFlashList.close() - jsonFlashList = json.loads(sFlashList) - for lBinFiles in jsonFlashList['files']: - self.checkKillExit() - KFlash.log(INFO_MSG,"Writing",lBinFiles['bin'],"into","0x%08x"%int(lBinFiles['address'], 0),BASH_TIPS['DEFAULT']) - with open(os.path.join(tmpdir, lBinFiles["bin"]), "rb") as firmware_bin: - self.loader.flash_firmware(firmware_bin.read(), None, int(lBinFiles['address'], 0), lBinFiles['sha256Prefix'], filename=lBinFiles['bin']) - else: - if args.key: - aes_key = binascii.a2b_hex(args.key) - if len(aes_key) != 16: - raise_exception( ValueError('AES key must by 16 bytes') ) - - self.loader.flash_firmware(firmware_bin.read(), aes_key=aes_key) - else: - self.loader.flash_firmware(firmware_bin.read()) - - # 3. boot - if args.Board == "dan" or args.Board == "bit" or args.Board == "trainer": - self.loader.reset_to_boot_dan() - elif args.Board == "kd233": - self.loader.reset_to_boot_kd233() - elif args.Board == "goE": - self.loader.reset_to_boot_maixgo() - elif args.Board == "goD": - self.loader.reset_to_boot_goD() - else: - KFlash.log(WARN_MSG,"Board unknown !! please press reset to boot!!") - - KFlash.log(INFO_MSG,"Rebooting...", BASH_TIPS['DEFAULT']) - try: - self.loader._port.close() - except Exception: - pass - - if(args.terminal == True): - open_terminal(True) - - def kill(self): - if self.loader: - self.loader.kill() - self.killProcess = True - - def checkKillExit(self): - if self.killProcess: - if self.loader: - self.loader._port.close() - raise Exception("Cancel") - - -def main(): - kflash = KFlash() - try: - kflash.process() - except Exception as e: - if str(e) == "Burn SRAM OK": - sys.exit(0) - kflash.log(str(e)) - sys.exit(1) - -if __name__ == '__main__': - main() From 5e798029b02eab8eff46117d19601d714c421381 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Mon, 8 Feb 2021 16:45:33 +0800 Subject: [PATCH 13/27] Fix user_shell --- user/src/bin/user_shell.rs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/user/src/bin/user_shell.rs b/user/src/bin/user_shell.rs index 973f890..796bddb 100644 --- a/user/src/bin/user_shell.rs +++ b/user/src/bin/user_shell.rs @@ -12,7 +12,7 @@ const DL: u8 = 0x7fu8; const BS: u8 = 0x08u8; use alloc::string::String; -use user_lib::{fork, exec, waitpid, yield_}; +use user_lib::{fork, exec, waitpid}; use user_lib::console::getchar; #[no_mangle] @@ -36,18 +36,10 @@ pub fn main() -> i32 { } unreachable!(); } else { - let mut xstate: i32 = 0; - let mut exit_pid: isize; - loop { - exit_pid = waitpid(pid as usize, &mut xstate); - if exit_pid == -1 { - yield_(); - } else { - assert_eq!(pid, exit_pid); - println!("Shell: Process {} exited with code {}", pid, xstate); - break; - } - } + let mut exit_code: i32 = 0; + let exit_pid = waitpid(pid as usize, &mut exit_code); + assert_eq!(pid, exit_pid); + println!("Shell: Process {} exited with code {}", pid, exit_code); } line.clear(); } From f1e772a98405ac71c22966f0f9cdb43651d3d3fd Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Mon, 8 Feb 2021 18:08:34 +0800 Subject: [PATCH 14/27] Fix other usertests: xstate -> exit_code --- user/src/bin/forktest2.rs | 8 ++++---- user/src/bin/forktest_simple.rs | 8 ++++---- user/src/bin/matrix.rs | 6 +++--- user/src/bin/sleep.rs | 4 ++-- user/src/bin/usertests.rs | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/user/src/bin/forktest2.rs b/user/src/bin/forktest2.rs index 493fccd..d08a412 100644 --- a/user/src/bin/forktest2.rs +++ b/user/src/bin/forktest2.rs @@ -22,12 +22,12 @@ pub fn main() -> i32 { } } - let mut xstate: i32 = 0; + let mut exit_code: i32 = 0; for _ in 0..NUM { - assert!(wait(&mut xstate) > 0); - assert_eq!(xstate, 0); + assert!(wait(&mut exit_code) > 0); + assert_eq!(exit_code, 0); } - assert!(wait(&mut xstate) < 0); + assert!(wait(&mut exit_code) < 0); println!("forktest2 test passed!"); 0 } \ No newline at end of file diff --git a/user/src/bin/forktest_simple.rs b/user/src/bin/forktest_simple.rs index 1851aea..821fba6 100644 --- a/user/src/bin/forktest_simple.rs +++ b/user/src/bin/forktest_simple.rs @@ -18,11 +18,11 @@ pub fn main() -> i32 { 100 } else { // parent process - let mut xstate: i32 = 0; + let mut exit_code: i32 = 0; println!("ready waiting on parent process!"); - assert_eq!(pid, wait(&mut xstate)); - assert_eq!(xstate, 100); - println!("child process pid = {}, exit code = {}", pid, xstate); + assert_eq!(pid, wait(&mut exit_code)); + assert_eq!(exit_code, 100); + println!("child process pid = {}, exit code = {}", pid, exit_code); 0 } } \ No newline at end of file diff --git a/user/src/bin/matrix.rs b/user/src/bin/matrix.rs index 9590433..8ef2c04 100644 --- a/user/src/bin/matrix.rs +++ b/user/src/bin/matrix.rs @@ -56,13 +56,13 @@ pub fn main() -> i32 { println!("fork ok."); - let mut xstate: i32 = 0; + let mut exit_code: i32 = 0; for _ in 0..NUM { - if wait(&mut xstate) < 0 { + if wait(&mut exit_code) < 0 { panic!("wait failed."); } } - assert!(wait(&mut xstate) < 0); + assert!(wait(&mut exit_code) < 0); println!("matrix passed."); 0 } \ No newline at end of file diff --git a/user/src/bin/sleep.rs b/user/src/bin/sleep.rs index 439e8a6..beba78c 100644 --- a/user/src/bin/sleep.rs +++ b/user/src/bin/sleep.rs @@ -19,11 +19,11 @@ fn sleepy() { pub fn main() -> i32 { let current_time = get_time(); let pid = fork(); - let mut xstate: i32 = 0; + let mut exit_code: i32 = 0; if pid == 0 { sleepy(); } - assert!(waitpid(pid as usize, &mut xstate) == pid && xstate == 0); + assert!(waitpid(pid as usize, &mut exit_code) == pid && exit_code == 0); println!("use {} msecs.", get_time() - current_time); println!("sleep pass."); 0 diff --git a/user/src/bin/usertests.rs b/user/src/bin/usertests.rs index d5d0d7d..7a4a6d7 100644 --- a/user/src/bin/usertests.rs +++ b/user/src/bin/usertests.rs @@ -29,10 +29,10 @@ pub fn main() -> i32 { exec(*test); panic!("unreachable!"); } else { - let mut xstate: i32 = Default::default(); - let wait_pid = waitpid(pid as usize, &mut xstate); + let mut exit_code: i32 = Default::default(); + let wait_pid = waitpid(pid as usize, &mut exit_code); assert_eq!(pid, wait_pid); - println!("\x1b[32mUsertests: Test {} in Process {} exited with code {}\x1b[0m", test, pid, xstate); + println!("\x1b[32mUsertests: Test {} in Process {} exited with code {}\x1b[0m", test, pid, exit_code); } } println!("Usertests passed!"); From fb8a24fbad7df632afb7a23d958b52667896465a Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Thu, 11 Feb 2021 10:26:52 +0800 Subject: [PATCH 15/27] Replace TCB.inner.block with TCB::acquire_inner_lock --- os/src/task/task.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/os/src/task/task.rs b/os/src/task/task.rs index b0fe7a4..e58c8ae 100644 --- a/os/src/task/task.rs +++ b/os/src/task/task.rs @@ -118,7 +118,7 @@ impl TaskControlBlock { .ppn(); // **** hold current PCB lock - let mut inner = self.inner.lock(); + let mut inner = self.acquire_inner_lock(); // substitute memory_set inner.memory_set = memory_set; // update trap_cx ppn @@ -140,7 +140,7 @@ impl TaskControlBlock { } pub fn fork(self: &Arc) -> Arc { // ---- hold parent PCB lock - let mut parent_inner = self.inner.lock(); + let mut parent_inner = self.acquire_inner_lock(); // copy user space(include trap context) let memory_set = MemorySet::from_existed_user( &parent_inner.memory_set From 66d7723c72a809e6d82491f24ec37dcd4eac45dc Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Fri, 12 Feb 2021 13:04:15 +0800 Subject: [PATCH 16/27] Update app loader. --- os/build.rs | 2 +- os/src/loader.rs | 52 ++++++++++++++++++++++++------------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/os/build.rs b/os/build.rs index 2c00687..6038c95 100644 --- a/os/build.rs +++ b/os/build.rs @@ -38,7 +38,7 @@ _num_app: .global _app_names _app_names:"#)?; for app in apps.iter() { - writeln!(f, r#" .string "{}\n""#, app)?; + writeln!(f, r#" .string "{}""#, app)?; } for (idx, app) in apps.iter().enumerate() { diff --git a/os/src/loader.rs b/os/src/loader.rs index d49cf69..6f302ad 100644 --- a/os/src/loader.rs +++ b/os/src/loader.rs @@ -1,4 +1,5 @@ use alloc::vec::Vec; +use lazy_static::*; pub fn get_num_app() -> usize { extern "C" { fn _num_app(); } @@ -21,41 +22,40 @@ pub fn get_app_data(app_id: usize) -> &'static [u8] { } } +lazy_static! { + static ref APP_NAMES: Vec<&'static str> = { + let num_app = get_num_app(); + extern "C" { fn _app_names(); } + let mut start = _app_names as usize as *const u8; + let mut v = Vec::new(); + unsafe { + for _ in 0..num_app { + let mut end = start; + while end.read_volatile() != '\0' as u8 { + end = end.add(1); + } + let slice = core::slice::from_raw_parts(start, end as usize - start as usize); + let str = core::str::from_utf8(slice).unwrap(); + v.push(str); + start = end.add(1); + } + } + v + }; +} + + #[allow(unused)] pub fn get_app_data_by_name(name: &str) -> Option<&'static [u8]> { let num_app = get_num_app(); - let app_names = app_names(); (0..num_app) - .find(|&i| app_names[i] == name) + .find(|&i| APP_NAMES[i] == name) .map(|i| get_app_data(i)) } -#[allow(unused)] -fn app_names() -> Vec<&'static str> { - let num_app = get_num_app(); - extern "C" { fn _app_names(); } - let mut start = _app_names as usize as *const u8; - let mut v = Vec::new(); - unsafe { - for _ in 0..num_app { - let mut end = start; - while end.read_volatile() != '\n' as u8 { - end = end.add(1); - } - let slice = core::slice::from_raw_parts(start, end as usize - start as usize); - let str = core::str::from_utf8(slice).unwrap(); - v.push(str); - // Mention that there is a extra char between names - start = end.add(2); - } - } - v -} - pub fn list_apps() { - let apps = app_names(); println!("/**** APPS ****"); - for app in apps { + for app in APP_NAMES.iter() { println!("{}", app); } println!("**************/") From e7698040903a4117d01e9a591da8e6fd757bce4c Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 14 Feb 2021 00:55:46 +0800 Subject: [PATCH 17/27] Fix alignment in os/build.rs --- os/build.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/os/build.rs b/os/build.rs index 6038c95..e32fa7a 100644 --- a/os/build.rs +++ b/os/build.rs @@ -23,7 +23,7 @@ fn insert_app_data() -> Result<()> { apps.sort(); writeln!(f, r#" - .align 4 + .align 3 .section .data .global _num_app _num_app: @@ -47,7 +47,7 @@ _app_names:"#)?; .section .data .global app_{0}_start .global app_{0}_end - .align 12 + .align 3 app_{0}_start: .incbin "{2}{1}" app_{0}_end:"#, idx, app, TARGET_PATH)?; From a15a76edb97e30f78e58b7a0e9d0ab0feab05729 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Mon, 15 Feb 2021 16:42:51 +0800 Subject: [PATCH 18/27] Mutex -> RefCell in Processor. --- os/src/task/processor.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/os/src/task/processor.rs b/os/src/task/processor.rs index a08d5d6..a1c753f 100644 --- a/os/src/task/processor.rs +++ b/os/src/task/processor.rs @@ -1,13 +1,13 @@ use super::TaskControlBlock; use alloc::sync::Arc; -use spin::Mutex; +use core::cell::RefCell; use lazy_static::*; use super::{fetch_task, TaskStatus}; use super::__switch; use crate::trap::TrapContext; pub struct Processor { - inner: Mutex, + inner: RefCell, } unsafe impl Sync for Processor {} @@ -20,14 +20,14 @@ struct ProcessorInner { impl Processor { pub fn new() -> Self { Self { - inner: Mutex::new(ProcessorInner { + inner: RefCell::new(ProcessorInner { current: None, idle_task_cx_ptr: 0, }), } } fn get_idle_task_cx_ptr2(&self) -> *const usize { - let inner = self.inner.lock(); + let inner = self.inner.borrow(); &inner.idle_task_cx_ptr as *const usize } pub fn run(&self) { @@ -38,7 +38,7 @@ impl Processor { let next_task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); task.acquire_inner_lock().task_status = TaskStatus::Running; // release - self.inner.lock().current = Some(task); + self.inner.borrow_mut().current = Some(task); unsafe { __switch( idle_task_cx_ptr2, @@ -49,10 +49,10 @@ impl Processor { } } pub fn take_current(&self) -> Option> { - self.inner.lock().current.take() + self.inner.borrow_mut().current.take() } pub fn current(&self) -> Option> { - self.inner.lock().current.as_ref().map(|task| task.clone()) + self.inner.borrow().current.as_ref().map(|task| task.clone()) } } From 946b37a237bce7e13ab4661aac4898e063257c5e Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Tue, 16 Feb 2021 20:50:03 +0800 Subject: [PATCH 19/27] Fix lock uses in ch5 --- os/src/task/mod.rs | 14 +++++++------- os/src/task/processor.rs | 8 +++++--- os/src/task/task.rs | 16 ++++------------ 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index 8c1bcc1..7ed542b 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -28,14 +28,13 @@ pub fn suspend_current_and_run_next() { // There must be an application running. let task = take_current_task().unwrap(); - // ---- temporarily hold current PCB lock - let task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); - // ---- release current PCB lock - - // ++++ temporarily hold current PCB lock + // ---- hold current PCB lock + let mut task_inner = task.acquire_inner_lock(); + let task_cx_ptr2 = task_inner.get_task_cx_ptr2(); // Change status to Ready - task.acquire_inner_lock().task_status = TaskStatus::Ready; - // ++++ release current PCB lock + task_inner.task_status = TaskStatus::Ready; + drop(task_inner); + // ---- release current PCB lock // push back to ready queue. add_task(task); @@ -58,6 +57,7 @@ pub fn exit_current_and_run_next(exit_code: i32) { { let mut initproc_inner = INITPROC.acquire_inner_lock(); for child in inner.children.iter() { + child.acquire_inner_lock().parent = Some(Arc::downgrade(&INITPROC)); initproc_inner.children.push(child.clone()); } } diff --git a/os/src/task/processor.rs b/os/src/task/processor.rs index a1c753f..e6895c4 100644 --- a/os/src/task/processor.rs +++ b/os/src/task/processor.rs @@ -35,8 +35,10 @@ impl Processor { if let Some(task) = fetch_task() { let idle_task_cx_ptr2 = self.get_idle_task_cx_ptr2(); // acquire - let next_task_cx_ptr2 = task.acquire_inner_lock().get_task_cx_ptr2(); - task.acquire_inner_lock().task_status = TaskStatus::Running; + let mut task_inner = task.acquire_inner_lock(); + let next_task_cx_ptr2 = task_inner.get_task_cx_ptr2(); + task_inner.task_status = TaskStatus::Running; + drop(task_inner); // release self.inner.borrow_mut().current = Some(task); unsafe { @@ -52,7 +54,7 @@ impl Processor { self.inner.borrow_mut().current.take() } pub fn current(&self) -> Option> { - self.inner.borrow().current.as_ref().map(|task| task.clone()) + self.inner.borrow().current.as_ref().map(|task| Arc::clone(task)) } } diff --git a/os/src/task/task.rs b/os/src/task/task.rs index e58c8ae..1c733da 100644 --- a/os/src/task/task.rs +++ b/os/src/task/task.rs @@ -67,7 +67,6 @@ impl TaskControlBlock { .translate(VirtAddr::from(TRAP_CONTEXT).into()) .unwrap() .ppn(); - let task_status = TaskStatus::Ready; // alloc a pid and a kernel stack in kernel space let pid_handle = pid_alloc(); let kernel_stack = KernelStack::new(&pid_handle); @@ -81,7 +80,7 @@ impl TaskControlBlock { trap_cx_ppn, base_size: user_sp, task_cx_ptr: task_cx_ptr as usize, - task_status, + task_status: TaskStatus::Ready, memory_set, parent: None, children: Vec::new(), @@ -97,9 +96,7 @@ impl TaskControlBlock { }), }; // prepare TrapContext in user space - // ---- acquire child PCB lock let trap_cx = task_control_block.acquire_inner_lock().get_trap_cx(); - // ---- release child PCB lock *trap_cx = TrapContext::app_init_context( entry_point, user_sp, @@ -123,13 +120,8 @@ impl TaskControlBlock { inner.memory_set = memory_set; // update trap_cx ppn inner.trap_cx_ppn = trap_cx_ppn; - drop(inner); - // **** release current PCB lock manually - // initialize trap_cx - // **** acquire current PCB lock - let trap_cx = self.acquire_inner_lock().get_trap_cx(); - // **** release current PCB lock + let trap_cx = inner.get_trap_cx(); *trap_cx = TrapContext::app_init_context( entry_point, user_sp, @@ -137,6 +129,7 @@ impl TaskControlBlock { self.kernel_stack.get_top(), trap_handler as usize, ); + // **** release current PCB lock } pub fn fork(self: &Arc) -> Arc { // ---- hold parent PCB lock @@ -149,7 +142,6 @@ impl TaskControlBlock { .translate(VirtAddr::from(TRAP_CONTEXT).into()) .unwrap() .ppn(); - let task_status = TaskStatus::Ready; // alloc a pid and a kernel stack in kernel space let pid_handle = pid_alloc(); let kernel_stack = KernelStack::new(&pid_handle); @@ -172,7 +164,7 @@ impl TaskControlBlock { trap_cx_ppn, base_size: parent_inner.base_size, task_cx_ptr: task_cx_ptr as usize, - task_status, + task_status: TaskStatus::Ready, memory_set, parent: Some(Arc::downgrade(self)), children: Vec::new(), From d6056ef07c250d8158fe4a88910ac7af9879a53b Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Fri, 19 Feb 2021 00:34:02 +0800 Subject: [PATCH 20/27] Remove Any Trait of File --- os/src/fs/mod.rs | 12 +----------- os/src/fs/pipe.rs | 2 -- os/src/fs/stdio.rs | 3 --- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/os/src/fs/mod.rs b/os/src/fs/mod.rs index 853ef41..60c89bd 100644 --- a/os/src/fs/mod.rs +++ b/os/src/fs/mod.rs @@ -2,19 +2,9 @@ mod pipe; mod stdio; use crate::mm::UserBuffer; -use core::any::Any; - -pub trait File : Any + Send + Sync { +pub trait File : Send + Sync { fn read(&self, buf: UserBuffer) -> usize; fn write(&self, buf: UserBuffer) -> usize; - fn as_any_ref(&self) -> &dyn Any; -} - -impl dyn File { - #[allow(unused)] - pub fn downcast_ref(&self) -> Option<&T> { - self.as_any_ref().downcast_ref::() - } } pub use pipe::{Pipe, make_pipe}; diff --git a/os/src/fs/pipe.rs b/os/src/fs/pipe.rs index ccbc53e..6f5c1f3 100644 --- a/os/src/fs/pipe.rs +++ b/os/src/fs/pipe.rs @@ -5,7 +5,6 @@ use crate::mm::{ UserBuffer, }; use crate::task::suspend_current_and_run_next; -use core::any::Any; pub struct Pipe { readable: bool, @@ -163,5 +162,4 @@ impl File for Pipe { } } } - fn as_any_ref(&self) -> &dyn Any { self } } \ No newline at end of file diff --git a/os/src/fs/stdio.rs b/os/src/fs/stdio.rs index 841849e..b87d185 100644 --- a/os/src/fs/stdio.rs +++ b/os/src/fs/stdio.rs @@ -2,7 +2,6 @@ use super::File; use crate::mm::{UserBuffer}; use crate::sbi::console_getchar; use crate::task::suspend_current_and_run_next; -use core::any::Any; pub struct Stdin; @@ -29,7 +28,6 @@ impl File for Stdin { fn write(&self, _user_buf: UserBuffer) -> usize { panic!("Cannot write to stdin!"); } - fn as_any_ref(&self) -> &dyn Any { self } } impl File for Stdout { @@ -42,5 +40,4 @@ impl File for Stdout { } user_buf.len() } - fn as_any_ref(&self) -> &dyn Any { self } } \ No newline at end of file From 3a81928da6a2f33e93b05f0ba1c78b99336e4f9a Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 21 Feb 2021 09:27:18 +0800 Subject: [PATCH 21/27] Close all pipes in pipetest. --- user/src/bin/pipetest.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/user/src/bin/pipetest.rs b/user/src/bin/pipetest.rs index 5823784..c151fbd 100644 --- a/user/src/bin/pipetest.rs +++ b/user/src/bin/pipetest.rs @@ -23,6 +23,8 @@ pub fn main() -> i32 { close(pipe_fd[1]); let mut buffer = [0u8; 32]; let len_read = read(pipe_fd[0], &mut buffer) as usize; + // close read_end + close(pipe_fd[0]); assert_eq!(core::str::from_utf8(&buffer[..len_read]).unwrap(), STR); println!("Read OK, child process exited!"); 0 From 291d5b210f93a6360d986ae0b47a2fa7e873b5f0 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Wed, 24 Feb 2021 03:50:00 +0800 Subject: [PATCH 22/27] Fix overflow bug when ceiling va --- os/src/mm/address.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/os/src/mm/address.rs b/os/src/mm/address.rs index 5a3d616..c059c3a 100644 --- a/os/src/mm/address.rs +++ b/os/src/mm/address.rs @@ -69,7 +69,7 @@ impl From for usize { impl VirtAddr { pub fn floor(&self) -> VirtPageNum { VirtPageNum(self.0 / PAGE_SIZE) } - pub fn ceil(&self) -> VirtPageNum { VirtPageNum((self.0 + PAGE_SIZE - 1) / PAGE_SIZE) } + pub fn ceil(&self) -> VirtPageNum { VirtPageNum((self.0 - 1 + PAGE_SIZE) / PAGE_SIZE) } pub fn page_offset(&self) -> usize { self.0 & (PAGE_SIZE - 1) } pub fn aligned(&self) -> bool { self.page_offset() == 0 } } @@ -84,7 +84,7 @@ impl From for VirtAddr { } impl PhysAddr { pub fn floor(&self) -> PhysPageNum { PhysPageNum(self.0 / PAGE_SIZE) } - pub fn ceil(&self) -> PhysPageNum { PhysPageNum((self.0 + PAGE_SIZE - 1) / PAGE_SIZE) } + pub fn ceil(&self) -> PhysPageNum { PhysPageNum((self.0 - 1 + PAGE_SIZE) / PAGE_SIZE) } pub fn page_offset(&self) -> usize { self.0 & (PAGE_SIZE - 1) } pub fn aligned(&self) -> bool { self.page_offset() == 0 } } From b11082f9bd7835727b67e80baac044012034ccec Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 28 Feb 2021 06:33:21 +0800 Subject: [PATCH 23/27] Add Ubuntu18.04 docker --- .dockerignore | 1 + Dockerfile | 40 ++++++++++++++++++++++++++++++++++++++++ Makefile | 8 ++++++++ README.md | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Makefile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..df3359d --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +*/* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ac784bc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +FROM ubuntu:18.04 +LABEL maintainer="dinghao188" \ + version="1.1" \ + description="ubuntu 18.04 with tools for tsinghua's rCore-Tutorial-V3" + +#install some deps +RUN set -x \ + && apt-get update \ + && apt-get install -y curl wget autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \ + gawk build-essential bison flex texinfo gperf libtool patchutils bc xz-utils \ + zlib1g-dev libexpat-dev pkg-config libglib2.0-dev libpixman-1-dev git tmux python3 + +#install rust and qemu +RUN set -x; \ + RUSTUP='/root/rustup.sh' \ + && cd $HOME \ + #install rust + && curl https://sh.rustup.rs -sSf > $RUSTUP && chmod +x $RUSTUP \ + && $RUSTUP -y --default-toolchain nightly --profile minimal \ + + #compile qemu + && wget https://ftp.osuosl.org/pub/blfs/conglomeration/qemu/qemu-5.0.0.tar.xz \ + && tar xvJf qemu-5.0.0.tar.xz \ + && cd qemu-5.0.0 \ + && ./configure --target-list=riscv64-softmmu,riscv64-linux-user \ + && make -j$(nproc) install \ + && cd $HOME && rm -rf qemu-5.0.0 qemu-5.0.0.tar.xz + +#for chinese network +RUN set -x; \ + APT_CONF='/etc/apt/sources.list'; \ + CARGO_CONF='/root/.cargo/config'; \ + BASHRC='/root/.bashrc' \ + && echo 'export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static' >> $BASHRC \ + && echo 'export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup' >> $BASHRC \ + && touch $CARGO_CONF \ + && echo '[source.crates-io]' > $CARGO_CONF \ + && echo "replace-with = 'ustc'" >> $CARGO_CONF \ + && echo '[source.ustc]' >> $CARGO_CONF \ + && echo 'registry = "git://mirrors.ustc.edu.cn/crates.io-index"' >> $CARGO_CONF \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2e33976 --- /dev/null +++ b/Makefile @@ -0,0 +1,8 @@ +DOCKER_NAME ?= dinghao188/rcore-tutorial +.PHONY: docker build_docker + +docker: + docker run --rm -it --mount type=bind,source=$(shell pwd),destination=/mnt ${DOCKER_NAME} + +build_docker: + docker build -t ${DOCKER_NAME} . diff --git a/README.md b/README.md index 5083448..dd356b5 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # rCore-Tutorial-v3 -rCore-Tutorial version 3. +rCore-Tutorial version 3. \ No newline at end of file From 0f6d02f18ba681c0d82b3297b85f413aa11e86b2 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sat, 6 Mar 2021 03:27:43 +0800 Subject: [PATCH 24/27] Do not fetch tools when running on qemu. --- os/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/os/Makefile b/os/Makefile index e7aa6b7..9be727a 100644 --- a/os/Makefile +++ b/os/Makefile @@ -58,10 +58,9 @@ disasm-vim: kernel @vim $(DISASM_TMP) @rm $(DISASM_TMP) -run: tools run-inner +run: run-inner -tools: - (which $(K210-BURNER)) || (cd .. && git clone https://github.com/sipeed/kflash.py.git && mv kflash.py tools) + run-inner: build ifeq ($(BOARD),qemu) @@ -71,6 +70,7 @@ ifeq ($(BOARD),qemu) -bios $(BOOTLOADER) \ -device loader,file=$(KERNEL_BIN),addr=$(KERNEL_ENTRY_PA) else + (which $(K210-BURNER)) || (cd .. && git clone https://github.com/sipeed/kflash.py.git && mv kflash.py tools) @cp $(BOOTLOADER) $(BOOTLOADER).copy @dd if=$(KERNEL_BIN) of=$(BOOTLOADER).copy bs=$(K210_BOOTLOADER_SIZE) seek=1 @mv $(BOOTLOADER).copy $(KERNEL_BIN) @@ -85,4 +85,4 @@ debug: build tmux split-window -h "riscv64-unknown-elf-gdb -ex 'file $(KERNEL_ELF)' -ex 'set arch riscv:rv64' -ex 'target remote localhost:1234'" && \ tmux -2 attach-session -d -.PHONY: build env kernel clean disasm disasm-vim run-inner tools +.PHONY: build env kernel clean disasm disasm-vim run-inner From 0b33985d4b41a79fdf78368686081c962b102c3d Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Sun, 7 Mar 2021 19:58:54 +0800 Subject: [PATCH 25/27] Link small sections in linker --- os/src/linker-k210.ld | 3 +++ os/src/linker-qemu.ld | 3 +++ user/src/linker.ld | 3 +++ 3 files changed, 9 insertions(+) diff --git a/os/src/linker-k210.ld b/os/src/linker-k210.ld index 4f9d217..eaa2c9f 100644 --- a/os/src/linker-k210.ld +++ b/os/src/linker-k210.ld @@ -22,6 +22,7 @@ SECTIONS srodata = .; .rodata : { *(.rodata .rodata.*) + *(.srodata .srodata.*) } . = ALIGN(4K); @@ -29,6 +30,7 @@ SECTIONS sdata = .; .data : { *(.data .data.*) + *(.sdata .sdata.*) } . = ALIGN(4K); @@ -38,6 +40,7 @@ SECTIONS *(.bss.stack) sbss = .; *(.bss .bss.*) + *(.sbss .sbss.*) } . = ALIGN(4K); diff --git a/os/src/linker-qemu.ld b/os/src/linker-qemu.ld index 6b06e91..5baafbd 100644 --- a/os/src/linker-qemu.ld +++ b/os/src/linker-qemu.ld @@ -22,6 +22,7 @@ SECTIONS srodata = .; .rodata : { *(.rodata .rodata.*) + *(.srodata .srodata.*) } . = ALIGN(4K); @@ -29,6 +30,7 @@ SECTIONS sdata = .; .data : { *(.data .data.*) + *(.sdata .sdata.*) } . = ALIGN(4K); @@ -38,6 +40,7 @@ SECTIONS *(.bss.stack) sbss = .; *(.bss .bss.*) + *(.sbss .sbss.*) } . = ALIGN(4K); diff --git a/user/src/linker.ld b/user/src/linker.ld index e05a98b..7273618 100644 --- a/user/src/linker.ld +++ b/user/src/linker.ld @@ -14,13 +14,16 @@ SECTIONS . = ALIGN(4K); .rodata : { *(.rodata .rodata.*) + *(.srodata .srodata.*) } . = ALIGN(4K); .data : { *(.data .data.*) + *(.sdata .sdata.*) } .bss : { *(.bss .bss.*) + *(.sbss .sbss.*) } /DISCARD/ : { *(.eh_frame) From 7132f24762f9bbf2cb90106c54e2252a570e46e6 Mon Sep 17 00:00:00 2001 From: Yifan Wu Date: Tue, 9 Mar 2021 16:09:54 +0800 Subject: [PATCH 26/27] Bump rustsbi to 0.2.0-alpha.1[81d53d8] --- bootloader/rustsbi-k210.bin | Bin 75068 -> 78860 bytes bootloader/rustsbi-qemu.bin | Bin 103288 -> 108184 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bootloader/rustsbi-k210.bin b/bootloader/rustsbi-k210.bin index e696137ab183ea5129e14e86ba980af53ae025d2..58d1c1a7aab97a8253864fa22811a0c8334cb60d 100755 GIT binary patch literal 78860 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 literal 75068 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 U=Y=5&Z}P;@0ki5(aM>3A3l{tUGXMYp literal 103288 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 Date: Wed, 22 Sep 2021 23:35:41 +0800 Subject: [PATCH 27/27] pass lab6 tests --- os/Makefile | 2 +- os/src/config.rs | 2 + os/src/mm/mod.rs | 1 + os/src/mm/page_table.rs | 22 +++++++++++ os/src/syscall/fs.rs | 80 ++++++++++++++++++++++++++++++++++++++- os/src/syscall/mod.rs | 4 ++ os/src/task/manager.rs | 11 ++++++ os/src/task/mod.rs | 2 +- os/src/task/task.rs | 11 ++++++ user/src/bin/ch6_mail0.rs | 27 +++++++++++++ user/src/bin/ch6_mail1.rs | 28 ++++++++++++++ user/src/bin/ch6_mail2.rs | 60 +++++++++++++++++++++++++++++ user/src/bin/ch6_mail3.rs | 34 +++++++++++++++++ user/src/lib.rs | 7 ++++ user/src/syscall.rs | 16 ++++++++ 15 files changed, 304 insertions(+), 3 deletions(-) create mode 100644 user/src/bin/ch6_mail0.rs create mode 100644 user/src/bin/ch6_mail1.rs create mode 100644 user/src/bin/ch6_mail2.rs create mode 100644 user/src/bin/ch6_mail3.rs diff --git a/os/Makefile b/os/Makefile index 9be727a..2a4b387 100644 --- a/os/Makefile +++ b/os/Makefile @@ -33,7 +33,7 @@ build: env $(KERNEL_BIN) env: (rustup target list | grep "riscv64gc-unknown-none-elf (installed)") || rustup target add $(TARGET) - cargo install cargo-binutils + cargo install cargo-binutils --vers ~0.2 rustup component add rust-src rustup component add llvm-tools-preview diff --git a/os/src/config.rs b/os/src/config.rs index 15f7b1c..8d7eeea 100644 --- a/os/src/config.rs +++ b/os/src/config.rs @@ -1,6 +1,8 @@ pub const USER_STACK_SIZE: usize = 4096 * 2; pub const KERNEL_STACK_SIZE: usize = 4096 * 2; pub const KERNEL_HEAP_SIZE: usize = 0x20_0000; +pub const MAIL_BOX_SIZE: usize = 16; +pub const MAIL_BOX_MESSAGE_SIZE: usize = 256; #[cfg(feature = "board_k210")] pub const MEMORY_END: usize = 0x80600000; diff --git a/os/src/mm/mod.rs b/os/src/mm/mod.rs index b156d25..1505a6e 100644 --- a/os/src/mm/mod.rs +++ b/os/src/mm/mod.rs @@ -12,6 +12,7 @@ pub use page_table::{ PageTableEntry, translated_byte_buffer, translated_str, + translated_str_safe, translated_refmut, UserBuffer, UserBufferIterator, diff --git a/os/src/mm/page_table.rs b/os/src/mm/page_table.rs index 47f39a7..8c9317f 100644 --- a/os/src/mm/page_table.rs +++ b/os/src/mm/page_table.rs @@ -190,6 +190,28 @@ pub fn translated_str(token: usize, ptr: *const u8) -> String { string } +pub fn translated_str_safe(token: usize, ptr: *const u8, len: usize) -> Option { + let page_table = PageTable::from_token(token); + let mut string = String::new(); + let mut va = ptr as usize; + let mut num = 0; + loop { + let mut ch: u8; + match page_table.translate_va(VirtAddr::from(va)) { + Some(x) => ch = *(x.get_mut()), + None => return None, + } + if num == len { + break; + } else { + string.push(ch as char); + va += 1; + num += 1; + } + } + Some(string) +} + pub fn translated_refmut(token: usize, ptr: *mut T) -> &'static mut T { let page_table = PageTable::from_token(token); let va = ptr as usize; diff --git a/os/src/syscall/fs.rs b/os/src/syscall/fs.rs index e4800fa..45ea346 100644 --- a/os/src/syscall/fs.rs +++ b/os/src/syscall/fs.rs @@ -1,6 +1,11 @@ -use crate::mm::{UserBuffer, translated_byte_buffer, translated_refmut}; +use crate::mm::{UserBuffer, translated_byte_buffer, translated_refmut, translated_str_safe}; use crate::task::{current_user_token, current_task}; use crate::fs::{make_pipe}; +use crate::task::{get_task_by_pid}; +use alloc::sync::{Arc}; +use core::cmp::min; +use alloc::string::String; +use crate::config::{*}; pub fn sys_write(fd: usize, buf: *const u8, len: usize) -> isize { let token = current_user_token(); @@ -65,4 +70,77 @@ pub fn sys_pipe(pipe: *mut usize) -> isize { *translated_refmut(token, pipe) = read_fd; *translated_refmut(token, unsafe { pipe.add(1) }) = write_fd; 0 +} + +pub fn sys_write_mail(pid: usize, buf: *mut u8, len: usize) -> isize { + // pid -> task_control_block + // println!("pid : {}", pid); + let mut ans = get_task_by_pid(pid); + if pid == current_task().unwrap().getpid() { + ans = current_task(); + } + match ans { + Some(task_to) => { + let token = current_user_token(); + let mut inner_to = task_to.acquire_inner_lock(); + + if inner_to.mail_box.len() == MAIL_BOX_SIZE { + return -1; + } + println!("len : {}", len); + if len == 0 { + return 0; + } + + match translated_str_safe(token, buf, len) { + Some(mut message) => { + println!("message : {}", message); + while message.len() > MAIL_BOX_MESSAGE_SIZE { + message.remove(MAIL_BOX_MESSAGE_SIZE); + } + let length = message.len(); + inner_to.mail_box.push_back(message); + return length as isize; + } + None => return -1, + } + } + None => { + println!("find task fail !"); + -1 + } + } +} + +pub fn sys_read_mail(buf: *mut u8, len: usize) -> isize { + let task = current_task().unwrap(); + let token = current_user_token(); + let mut inner = task.acquire_inner_lock(); + if len == 0 { + if inner.mail_box.len() > 0 { + return 0; + }else { + return -1; + } + } + let mut message = inner.mail_box.pop_front(); + match message { + Some(mut message) => { + while message.len() > len { + message.remove(len); + } + + let mut num: isize = 0; + let mut addr_user = buf; + for index in 0..min(len, message.len()) { + *translated_refmut(token, addr_user) = message.as_bytes()[index]; + unsafe { addr_user = addr_user.add(1); } + num += 1; + } + return num; + } + None => { + return -1; + } + } } \ No newline at end of file diff --git a/os/src/syscall/mod.rs b/os/src/syscall/mod.rs index 1699e8c..e00d2e0 100644 --- a/os/src/syscall/mod.rs +++ b/os/src/syscall/mod.rs @@ -9,6 +9,8 @@ const SYSCALL_GETPID: usize = 172; const SYSCALL_FORK: usize = 220; const SYSCALL_EXEC: usize = 221; const SYSCALL_WAITPID: usize = 260; +const SYSCALL_READ_MAIL: usize = 401; +const SYSCALL_WRITE_MAIL: usize = 402; mod fs; mod process; @@ -20,6 +22,8 @@ pub fn syscall(syscall_id: usize, args: [usize; 3]) -> isize { match syscall_id { SYSCALL_CLOSE => sys_close(args[0]), SYSCALL_PIPE => sys_pipe(args[0] as *mut usize), + SYSCALL_READ_MAIL => sys_read_mail(args[0] as *mut u8, args[1]), + SYSCALL_WRITE_MAIL => sys_write_mail(args[0], args[1] as *mut u8, args[2]), SYSCALL_READ => sys_read(args[0], args[1] as *const u8, args[2]), SYSCALL_WRITE => sys_write(args[0], args[1] as *const u8, args[2]), SYSCALL_EXIT => sys_exit(args[0] as i32), diff --git a/os/src/task/manager.rs b/os/src/task/manager.rs index ed22391..6bac647 100644 --- a/os/src/task/manager.rs +++ b/os/src/task/manager.rs @@ -19,6 +19,13 @@ impl TaskManager { pub fn fetch(&mut self) -> Option> { self.ready_queue.pop_front() } + pub fn get_task_by_pid(&mut self, pid: usize) -> Option> { + // println!("length of ready_queue {}", self.ready_queue.len()); + self.ready_queue + .iter() + .find( |p| { pid == p.getpid() } ) + .map(|p| p.clone()) + } } lazy_static! { @@ -31,4 +38,8 @@ pub fn add_task(task: Arc) { pub fn fetch_task() -> Option> { TASK_MANAGER.lock().fetch() +} + +pub fn get_task_by_pid(pid: usize) -> Option> { + TASK_MANAGER.lock().get_task_by_pid(pid) } \ No newline at end of file diff --git a/os/src/task/mod.rs b/os/src/task/mod.rs index 7ed542b..f5dbe78 100644 --- a/os/src/task/mod.rs +++ b/os/src/task/mod.rs @@ -21,7 +21,7 @@ pub use processor::{ take_current_task, schedule, }; -pub use manager::add_task; +pub use manager::{get_task_by_pid, add_task}; pub use pid::{PidHandle, pid_alloc, KernelStack}; pub fn suspend_current_and_run_next() { diff --git a/os/src/task/task.rs b/os/src/task/task.rs index 1c733da..1374949 100644 --- a/os/src/task/task.rs +++ b/os/src/task/task.rs @@ -5,6 +5,8 @@ use super::TaskContext; use super::{PidHandle, pid_alloc, KernelStack}; use alloc::sync::{Weak, Arc}; use alloc::vec; +use alloc::string::String; +use alloc::collections::VecDeque; use alloc::vec::Vec; use spin::{Mutex, MutexGuard}; use crate::fs::{File, Stdin, Stdout}; @@ -27,9 +29,16 @@ pub struct TaskControlBlockInner { pub children: Vec>, pub exit_code: i32, pub fd_table: Vec>>, + pub mail_box: VecDeque, } impl TaskControlBlockInner { + // pub fn get_message_from_mail_box() { + + // } + // pub fn insert_message_to_mail_box() { + + // } pub fn get_task_cx_ptr2(&self) -> *const usize { &self.task_cx_ptr as *const usize } @@ -85,6 +94,7 @@ impl TaskControlBlock { parent: None, children: Vec::new(), exit_code: 0, + mail_box: VecDeque::new(), fd_table: vec![ // 0 -> stdin Some(Arc::new(Stdin)), @@ -170,6 +180,7 @@ impl TaskControlBlock { children: Vec::new(), exit_code: 0, fd_table: new_fd_table, + mail_box: parent_inner.mail_box.clone(), }), }); // add child diff --git a/user/src/bin/ch6_mail0.rs b/user/src/bin/ch6_mail0.rs new file mode 100644 index 0000000..420f285 --- /dev/null +++ b/user/src/bin/ch6_mail0.rs @@ -0,0 +1,27 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +use user_lib::{getpid, mail_read, mail_write}; + +const BUF_LEN: usize = 256; + +/// 测试邮箱基本功能,输出 mail0 test OK! 就算正确。 + +#[no_mangle] +fn main() -> i32 { + let pid = getpid(); + let buffer0 = ['a' as u8; 27]; + assert_eq!(mail_write(pid as usize, &buffer0), 27); + let buffer1 = ['b' as u8; BUF_LEN + 1]; + assert_eq!(mail_write(pid as usize, &buffer1), BUF_LEN as isize); + let mut buf = [0u8; BUF_LEN]; + assert_eq!(mail_read(&mut buf), 27); + assert_eq!(buf[..27], buffer0); + assert_eq!(mail_read(&mut buf[..27]), 27); + assert_eq!(buf[..27], buffer1[..27]); + println!("mail0 test OK!"); + 0 +} diff --git a/user/src/bin/ch6_mail1.rs b/user/src/bin/ch6_mail1.rs new file mode 100644 index 0000000..3e02ba9 --- /dev/null +++ b/user/src/bin/ch6_mail1.rs @@ -0,0 +1,28 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +use user_lib::{getpid, mail_read, mail_write}; + +const BUF_LEN: usize = 256; +const MAIL_MAX: usize = 16; + +/// 测试邮箱容量,输出 mail1 test OK! 就算正确。 + +#[no_mangle] +fn main() -> i32 { + let pid = getpid(); + let buffer0 = ['a' as u8; BUF_LEN]; + for _ in 0..MAIL_MAX { + assert_eq!(mail_write(pid as usize, &buffer0), BUF_LEN as isize); + } + assert_eq!(mail_write(pid as usize, &buffer0), -1); + let mut buf = [0u8; BUF_LEN]; + assert_eq!(mail_read(&mut buf), BUF_LEN as isize); + assert_eq!(mail_write(pid as usize, &buffer0), BUF_LEN as isize); + assert_eq!(mail_write(pid as usize, &buffer0), -1); + println!("mail1 test OK!"); + 0 +} diff --git a/user/src/bin/ch6_mail2.rs b/user/src/bin/ch6_mail2.rs new file mode 100644 index 0000000..4a51193 --- /dev/null +++ b/user/src/bin/ch6_mail2.rs @@ -0,0 +1,60 @@ +#![no_std] +#![no_main] + +#[macro_use] +extern crate user_lib; + +use user_lib::{exit, fork, mail_read, mail_write, sleep, wait}; + +const BUF_LEN: usize = 256; + +// 双进程邮箱测试,最终输出 mail2 test OK! 就算正确。 + +#[no_mangle] +fn main() -> i32 { + let pid = fork(); + if pid == 0 { + println!("I am child"); + let mut buffer = [0u8; BUF_LEN]; + assert_eq!(mail_read(&mut buffer), -1); + println!("child read 1 mail fail"); + println!("child sleep 2s"); + sleep(2000 as usize); + for i in 0..16 { + let mut buffer = [0u8; BUF_LEN]; + assert_eq!(mail_read(&mut buffer), BUF_LEN as isize); + assert_eq!(buffer, [i as u8; BUF_LEN]); + } + println!("child read 16 mails succeed"); + assert_eq!(mail_read(&mut buffer), -1); + println!("child read 1 mail fail"); + println!("child sleep 1s"); + sleep(1000 as usize); + assert_eq!(mail_read(&mut buffer), BUF_LEN as isize); + assert_eq!(buffer, [16 as u8; BUF_LEN]); + println!("child read 1 mail succeed"); + println!("child exit"); + exit(0); + } + println!("I am father"); + println!("father sleep 1s"); + sleep(1000 as usize); + for i in 0..16 { + let buffer = [i as u8; BUF_LEN]; + assert_eq!(mail_write(pid as usize, &buffer), BUF_LEN as isize); + } + println!("father wirte 16 mails succeed"); + let buffer = [16 as u8; BUF_LEN]; + assert_eq!(mail_write(pid as usize, &buffer), -1); + println!("father wirte 1 mail fail"); + println!("father sleep 1.5s"); + sleep(1500 as usize); + assert_eq!(mail_write(pid as usize, &buffer), BUF_LEN as isize); + println!("father wirte 1 mail succeed"); + + let mut xstate: i32 = -100; + assert!(wait(&mut xstate) > 0); + assert_eq!(xstate, 0); + println!("mail2 test OK!"); + 0 +} diff --git a/user/src/bin/ch6_mail3.rs b/user/src/bin/ch6_mail3.rs new file mode 100644 index 0000000..b8a7979 --- /dev/null +++ b/user/src/bin/ch6_mail3.rs @@ -0,0 +1,34 @@ +#![no_std] +#![no_main] + +extern crate core; +#[macro_use] +extern crate user_lib; + +use core::slice; +use user_lib::{getpid, mail_read, mail_write}; + +const BUF_LEN: usize = 256; +const MAIL_MAX: usize = 16; +const BAD_ADDRESS: usize = 0x90000000; + +/// 邮箱错误参数测试,输出 mail3 test OK! 就算正确。 + +#[no_mangle] +fn main() -> i32 { + let pid = getpid(); + let null = unsafe { slice::from_raw_parts(BAD_ADDRESS as *const _, 10) }; + assert_eq!(mail_write(pid as usize, &null), -1); + let mut empty = ['a' as u8; 0]; + assert_eq!(mail_write(pid as usize, &empty), 0); + assert_eq!(mail_read(&mut empty), -1); + let buffer0 = ['a' as u8; BUF_LEN]; + for _ in 0..MAIL_MAX { + assert_eq!(mail_write(pid as usize, &buffer0), BUF_LEN as isize); + } + assert_eq!(mail_write(pid as usize, &empty), -1); + assert_eq!(mail_read(&mut empty), 0); + assert_eq!(mail_write(pid as usize, &empty), -1); + println!("mail3 test OK!"); + 0 +} diff --git a/user/src/lib.rs b/user/src/lib.rs index 3248285..cee2775 100644 --- a/user/src/lib.rs +++ b/user/src/lib.rs @@ -44,6 +44,13 @@ fn main() -> i32 { pub fn close(fd: usize) -> isize { sys_close(fd) } pub fn pipe(pipe_fd: &mut [usize]) -> isize { sys_pipe(pipe_fd) } +pub fn mail_read(buf: &mut [u8]) -> isize { + sys_mail_read(buf) +} + +pub fn mail_write(pid: usize, buf: &[u8]) -> isize { + sys_mail_write(pid, buf) +} pub fn read(fd: usize, buf: &mut [u8]) -> isize { sys_read(fd, buf) } pub fn write(fd: usize, buf: &[u8]) -> isize { sys_write(fd, buf) } pub fn exit(exit_code: i32) -> ! { sys_exit(exit_code); } diff --git a/user/src/syscall.rs b/user/src/syscall.rs index 16fe455..4936bbd 100644 --- a/user/src/syscall.rs +++ b/user/src/syscall.rs @@ -9,6 +9,8 @@ const SYSCALL_GETPID: usize = 172; const SYSCALL_FORK: usize = 220; const SYSCALL_EXEC: usize = 221; const SYSCALL_WAITPID: usize = 260; +const SYSCALL_MAIL_READ: usize = 401; +const SYSCALL_MAIL_WRITE: usize = 402; fn syscall(id: usize, args: [usize; 3]) -> isize { let mut ret: isize; @@ -35,6 +37,20 @@ pub fn sys_read(fd: usize, buffer: &mut [u8]) -> isize { syscall(SYSCALL_READ, [fd, buffer.as_mut_ptr() as usize, buffer.len()]) } +pub fn sys_mail_read(buffer: &mut [u8]) -> isize { + syscall( + SYSCALL_MAIL_READ, + [buffer.as_ptr() as usize, buffer.len(), 0], + ) +} + +pub fn sys_mail_write(pid: usize, buffer: &[u8]) -> isize { + syscall( + SYSCALL_MAIL_WRITE, + [pid, buffer.as_ptr() as usize, buffer.len()], + ) +} + pub fn sys_write(fd: usize, buffer: &[u8]) -> isize { syscall(SYSCALL_WRITE, [fd, buffer.as_ptr() as usize, buffer.len()]) }