From d6d57955a4ea72beeb6183733526bf23ebcecfde Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Fri, 21 Nov 2025 09:43:19 +0100 Subject: [PATCH 01/23] [SRC] WIP: Add multi-tile support in xbar. --- Makefile | 3 + config/config.mk | 2 + hardware/src/cachepool_cluster.sv | 24 ++--- hardware/src/cachepool_pkg.sv | 24 ++++- hardware/src/cachepool_tile.sv | 20 ++-- hardware/src/tcdm_cache_interco.sv | 158 ++++++++++++++++++----------- 6 files changed, 145 insertions(+), 86 deletions(-) diff --git a/Makefile b/Makefile index 90a3a1c..11525b2 100644 --- a/Makefile +++ b/Makefile @@ -180,8 +180,11 @@ VLOG_FLAGS += -64 VLOG_DEFS = -DCACHEPOOL + + # Cluster configuration VLOG_DEFS += -DNUM_TILES=$(num_tiles) +VLOG_DEFS += -DNumRemotePortTile=$(num_remote_ports_per_tile) VLOG_DEFS += -DNUM_CORES=$(num_cores) VLOG_DEFS += -DDATA_WIDTH=$(data_width) VLOG_DEFS += -DADDR_WIDTH=$(addr_width) diff --git a/config/config.mk b/config/config.mk index 2364118..2f1cc16 100644 --- a/config/config.mk +++ b/config/config.mk @@ -29,6 +29,8 @@ include $(CACHEPOOL_DIR)/config/$(config).mk # Number of tiles num_tiles ?= 1 +num_remote_ports_per_tile ?= 0 + # Number of cores num_cores ?= 4 diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index ba722c6..8f8e7be 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -218,12 +218,12 @@ module cachepool_cluster // Wire Definitions // ---------------- // 1. AXI - axi_mst_cache_req_t [NumTiles*NumTileWideAxi -1 :0] axi_tile_req; - axi_mst_cache_resp_t [NumTiles*NumTileWideAxi -1 :0] axi_tile_rsp; - axi_slv_cache_req_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_req; - axi_slv_cache_resp_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_rsp; - axi_narrow_req_t [NumTiles-1 :0] axi_out_req; - axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; + axi_mst_cache_req_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_req; + axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; + axi_slv_cache_req_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_req; + axi_slv_cache_resp_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_rsp; + axi_narrow_req_t [NumTiles-1 :0] axi_out_req; + axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; // 2. BootROM reg_cache_req_t bootrom_reg_req; @@ -409,8 +409,8 @@ module cachepool_cluster // Cache Refill Ports .cache_refill_req_o ( cache_refill_req[t*NumL1CacheCtrl+:NumL1CacheCtrl]), .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CacheCtrl+:NumL1CacheCtrl]), - .axi_wide_req_o ( axi_tile_req [t*NumTileWideAxi+:NumTileWideAxi] ), - .axi_wide_rsp_i ( axi_tile_rsp [t*NumTileWideAxi+:NumTileWideAxi] ) + .axi_wide_req_o ( axi_tile_req [t] ), + .axi_wide_rsp_i ( axi_tile_rsp [t] ) ); axi_to_reqrsp #( @@ -427,8 +427,8 @@ module cachepool_cluster .clk_i (clk_i ), .rst_ni (rst_ni ), .busy_o ( ), - .axi_req_i (axi_tile_req [t*NumTileWideAxi+TileMem]), - .axi_rsp_o (axi_tile_rsp [t*NumTileWideAxi+TileMem]), + .axi_req_i (axi_tile_req [t][TileMem]), + .axi_rsp_o (axi_tile_rsp [t][TileMem]), .reqrsp_req_o (cache_core_req[t] ), .reqrsp_rsp_i (cache_core_rsp[t] ) ); @@ -641,8 +641,8 @@ module cachepool_cluster .clk_i (clk_i ), .rst_ni (rst_ni ), .testmode_i (1'b0 ), - .axi_req_i (axi_tile_req[TileBootROM]), - .axi_rsp_o (axi_tile_rsp[TileBootROM]), + .axi_req_i (axi_tile_req[0][TileBootROM]), + .axi_rsp_o (axi_tile_rsp[0][TileBootROM]), .reg_req_o (bootrom_reg_req ), .reg_rsp_i (bootrom_reg_rsp ) ); diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 29790c5..7caff28 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -15,8 +15,9 @@ package cachepool_pkg; `include "axi/typedef.svh" `include "reqrsp_interface/assign.svh" `include "reqrsp_interface/typedef.svh" + `include "tcdm_interface/assign.svh" + `include "tcdm_interface/typedef.svh" - localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; /////////// // AXI // @@ -66,7 +67,9 @@ package cachepool_pkg; //////////////////// localparam int unsigned NumCores = `ifdef NUM_CORES `NUM_CORES `else 0 `endif; - // TODO: read from CFG + localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; + localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + localparam int unsigned NumBank = `ifdef L1D_NUM_BANKS `L1D_NUM_BANKS `else 0 `endif; localparam int unsigned TCDMDepth = 256; localparam int unsigned L1Depth = `ifdef L1D_DEPTH `L1D_DEPTH `else 0 `endif; @@ -84,6 +87,9 @@ package cachepool_pkg; localparam int unsigned TCDMStartAddr = 32'hBFFF_F800; localparam int unsigned TCDMSize = 32'h800; + // The short address for SPM + localparam int unsigned SPMAddrWidth = $clog2(TCDMSize); + localparam int unsigned PeriStartAddr = 32'hC000_0000; localparam int unsigned BootAddr = 32'h1000; @@ -189,12 +195,18 @@ package cachepool_pkg; typedef logic [$clog2(NumSpatzOutstandingLoads[0])-1:0] reqid_t; - typedef logic [$clog2(L1CacheWayEntry)-1:0] cache_ways_entry_ptr_t; - typedef logic [$clog2(L1AssoPerCtrl)-1:0] way_ptr_t; + typedef logic [$clog2(L1CacheWayEntry)-1:0] cache_ways_entry_ptr_t; + typedef logic [$clog2(L1AssoPerCtrl)-1:0] way_ptr_t; typedef logic [RefillDataWidth-1:0] refill_data_t; typedef logic [RefillStrbWidth-1:0] refill_strb_t; typedef logic [$clog2(L1LineWidth/RefillDataWidth)-1:0] burst_len_t; + // Narrow TCDM channel (32b) for inter-Tile and intra-Tile connection + typedef logic [31:0] narrow_data_t; + typedef logic [3 :0] narrow_strb_t; + typedef logic [L1AddrWidth-1:0] narrow_addr_t; + typedef logic [SPMAddrWidth-1:0] spm_addr_t; + typedef struct packed { logic is_burst; @@ -257,6 +269,10 @@ package cachepool_pkg; `REQRSP_TYPEDEF_ALL (cache_trans, axi_addr_t, axi_data_t, axi_strb_t, refill_user_t) + // TCDM req/rsp bus => core to L1 + `TCDM_TYPEDEF_ALL(tcdm, narrow_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) + `TCDM_TYPEDEF_ALL(spm, spm_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) + // L2 Memory localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; localparam int unsigned L2BankWidth = `ifdef L2_BANK_WIDTH `L2_BANK_WIDTH `else 0 `endif; diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 40e9ff3..69458bd 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -168,8 +168,7 @@ module cachepool_tile /// Minimum width to hold the core number. // localparam int unsigned CoreIDWidth = cf_math_pkg::idx_width(NrCores); localparam int unsigned TCDMMemAddrWidth = $clog2(TCDMDepth); - // The short address for SPM - localparam int unsigned SPMAddrWidth = $clog2(TCDMSize); + // Enlarge the address width for Spatz due to cache localparam int unsigned TCDMAddrWidth = 32; localparam int unsigned BanksPerSuperBank = AxiDataWidth / DataWidth; @@ -263,7 +262,6 @@ module cachepool_tile typedef logic [TCDMMemAddrWidth-1:0] tcdm_mem_addr_t; typedef logic [TCDMAddrWidth-1:0] tcdm_addr_t; - typedef logic [SPMAddrWidth-1:0] spm_addr_t; typedef logic [$clog2(L1NumSet)-1:0] tcdm_bank_addr_t; @@ -285,10 +283,6 @@ module cachepool_tile `MEM_TYPEDEF_ALL(mem, tcdm_mem_addr_t, data_t, strb_t, tcdm_user_t) `MEM_TYPEDEF_ALL(mem_dma, tcdm_mem_addr_t, data_dma_t, strb_dma_t, logic) - `TCDM_TYPEDEF_ALL(tcdm, tcdm_addr_t, data_t, strb_t, tcdm_user_t) - `TCDM_TYPEDEF_ALL(tcdm_dma, tcdm_addr_t, data_dma_t, strb_dma_t, logic) - `TCDM_TYPEDEF_ALL(spm, spm_addr_t, data_t, strb_t, tcdm_user_t) - `REG_BUS_TYPEDEF_ALL(reg, addr_t, data_t, strb_t) `REG_BUS_TYPEDEF_ALL(reg_dma, addr_t, data_dma_t, strb_dma_t) @@ -594,6 +588,13 @@ module cachepool_tile end end + // Connecting the remote ports + // if (NumRemotePort > 0) begin + // for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin + + // end + // end + // Used to determine the mapping policy between different cache banks. // Set through CSR logic [$clog2(TCDMAddrWidth)-1:0] dynamic_offset; @@ -601,8 +602,10 @@ module cachepool_tile /// Wire requests after strb handling to the cache controller for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin : gen_cache_xbar tcdm_cache_interco #( - .NumCore (NrCores ), + .NumTiles (NumTiles ), + .NumCores (NrCores ), .NumCache (NumL1CacheCtrl ), + .NumRemotePort (NumRemotePortTile ), .AddrWidth (TCDMAddrWidth ), .tcdm_req_t (tcdm_req_t ), .tcdm_rsp_t (tcdm_rsp_t ), @@ -611,6 +614,7 @@ module cachepool_tile ) i_cache_xbar ( .clk_i (clk_i ), .rst_ni (rst_ni ), + .tile_id_i (1'b0 ), .dynamic_offset_i (dynamic_offset ), .core_req_i (cache_req [j] ), .core_rsp_ready_i (cache_pready [j] ), diff --git a/hardware/src/tcdm_cache_interco.sv b/hardware/src/tcdm_cache_interco.sv index fb6e12b..f5b5e94 100644 --- a/hardware/src/tcdm_cache_interco.sv +++ b/hardware/src/tcdm_cache_interco.sv @@ -7,12 +7,18 @@ // The cache xbar used to select the cache banks module tcdm_cache_interco #( - /// Number of inputs into the interconnect (`> 0`). - parameter int unsigned NumCore = 32'd0, - /// Number of outputs from the interconnect (`> 0`). + /// Number of Tiles ('>=0') + parameter int unsigned NumTiles = 32'd1, + /// Number of inputs into the interconnect (Cores per Tile) (`> 0`). + parameter int unsigned NumCores = 32'd0, + /// Number of remote ports added to xbar ('>= 0'). + parameter int unsigned NumRemotePort = 32'd0, + /// Number of outputs from the interconnect (Cache per Tile) (`> 0`). parameter int unsigned NumCache = 32'd0, /// Offset bits based on cacheline: 512b => 6 bits parameter int unsigned AddrWidth = 32'd32, + /// Tile ID Width, used for checking tile id ('> 0') + parameter int unsigned TileIDWidth = 32'd1, /// Port type of the data request ports. parameter type tcdm_req_t = logic, @@ -23,88 +29,103 @@ module tcdm_cache_interco #( /// Payload type of the data response ports. parameter type tcdm_rsp_chan_t = logic, - parameter snitch_pkg::topo_e Topology = snitch_pkg::LogarithmicInterconnect + parameter snitch_pkg::topo_e Topology = snitch_pkg::LogarithmicInterconnect, + /// Dependency parameter, do not change + parameter type tile_id_t = logic [TileIDWidth-1:0] + ) ( /// Clock, positive edge triggered. - input logic clk_i, + input logic clk_i, /// Reset, active low. - input logic rst_ni, + input logic rst_ni, + /// Tile ID + input tile_id_t tile_id_i, /// Dynamic address offset for cache bank selection - input logic [$clog2(AddrWidth)-1:0] dynamic_offset_i, + input logic [$clog2(AddrWidth)-1:0] dynamic_offset_i, /// Request port. - input tcdm_req_t [NumCore-1:0] core_req_i, + input tcdm_req_t [NumCores+NumRemotePort-1:0] core_req_i, /// Response ready in - input logic [NumCore-1:0] core_rsp_ready_i, + input logic [NumCores+NumRemotePort-1:0] core_rsp_ready_i, /// Resposne port. - output tcdm_rsp_t [NumCore-1:0] core_rsp_o, + output tcdm_rsp_t [NumCores+NumRemotePort-1:0] core_rsp_o, /// Memory Side /// Request. - output tcdm_req_t [NumCache-1:0] mem_req_o, + output tcdm_req_t [NumCache+NumRemotePort-1:0] mem_req_o, /// Response ready out - output logic [NumCache-1:0] mem_rsp_ready_o, + output logic [NumCache+NumRemotePort-1:0] mem_rsp_ready_o, /// Response. - input tcdm_rsp_t [NumCache-1:0] mem_rsp_i + input tcdm_rsp_t [NumCache+NumRemotePort-1:0] mem_rsp_i ); // -------- // Parameters and Signals // -------- + // One bit more for remote access // Selection signal width and types - localparam int unsigned NumMemSelBits = $clog2(NumCache); - localparam int unsigned NumCoreSelBits = $clog2(NumCore); + localparam int unsigned NumOutSelBits = $clog2(NumCache + NumRemotePort); + // The bits used to select the local Cache bank + localparam int unsigned NumCacheSelBits = $clog2(NumCache); + // localparam int unsigned NumInpSelBits = $clog2(NumCores); + localparam int unsigned NumInpSelBits = $clog2(NumCores + NumRemotePort); + + localparam int unsigned RemotePortSel = (NumRemotePort > 0) ? NumRemotePort : 1; - typedef logic [NumCoreSelBits-1:0] mem_sel_t; - typedef logic [NumMemSelBits-1 :0] core_sel_t; + typedef logic [NumInpSelBits-1:0] mem_sel_t; + typedef logic [NumOutSelBits -1:0] core_sel_t; // core select which cache bank to go - core_sel_t [NumCore-1 :0] core_req_sel; - mem_sel_t [NumCache-1:0] mem_rsp_sel; + core_sel_t [NumCores+NumRemotePort-1 :0] core_req_sel; + mem_sel_t [NumCache+NumRemotePort-1 :0] mem_rsp_sel; + // tile id bits (is the destination outside of current tile?) + tile_id_t [NumCores+NumRemotePort-1 :0] bank_sel; + // Select if local or remote + logic [NumCores+NumRemotePort-1 :0] local_sel; // Number of bits used to identify the cache bank - localparam int unsigned CacheBankBits = $clog2(NumCore); + localparam int unsigned CacheBankBits = $clog2(NumCache); - tcdm_req_chan_t [NumCore-1:0] core_req; - logic [NumCore-1:0] core_req_valid, core_req_ready; + tcdm_req_chan_t [NumCores+NumRemotePort-1:0] core_req; + logic [NumCores+NumRemotePort-1:0] core_req_valid, core_req_ready; - tcdm_req_chan_t [NumCache-1:0] mem_req; - logic [NumCache-1:0] mem_req_valid, mem_req_ready; + tcdm_req_chan_t [NumCache+NumRemotePort-1:0] mem_req; + logic [NumCache+NumRemotePort-1:0] mem_req_valid, mem_req_ready; - tcdm_rsp_chan_t [NumCore-1:0] core_rsp; - logic [NumCore-1:0] core_rsp_valid, core_rsp_ready; + tcdm_rsp_chan_t [NumCores+NumRemotePort-1:0] core_rsp; + logic [NumCores+NumRemotePort-1:0] core_rsp_valid, core_rsp_ready; - tcdm_rsp_chan_t [NumCache-1:0] mem_rsp; - logic [NumCache-1:0] mem_rsp_valid, mem_rsp_ready; + tcdm_rsp_chan_t [NumCache+NumRemotePort-1:0] mem_rsp; + logic [NumCache+NumRemotePort-1:0] mem_rsp_valid, mem_rsp_ready; reqrsp_xbar #( - .NumInp (NumCore ), - .NumOut (NumCache ), - .PipeReg (1'b0 ), - .ExtReqPrio (1'b0 ), - .ExtRspPrio (1'b0 ), - .tcdm_req_chan_t (tcdm_req_chan_t ), - .tcdm_rsp_chan_t (tcdm_rsp_chan_t ) + .NumInp (NumCores + NumRemotePort ), + .NumOut (NumCache + NumRemotePort ), + .PipeReg (1'b0 ), + .ExtReqPrio (1'b0 ), + .ExtRspPrio (1'b0 ), + .tcdm_req_chan_t (tcdm_req_chan_t ), + .tcdm_rsp_chan_t (tcdm_rsp_chan_t ) ) i_cache_xbar ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .slv_req_i (core_req ), - .slv_rr_i ('0 ), - .slv_req_valid_i (core_req_valid ), - .slv_req_ready_o (core_req_ready ), - .slv_rsp_o (core_rsp ), - .slv_rsp_valid_o (core_rsp_valid ), - .slv_rsp_ready_i (core_rsp_ready ), - .slv_sel_i (core_req_sel ), - .slv_selected_o ( /* unused */ ), - .mst_req_o (mem_req ), - .mst_rr_i ('0 ), - .mst_req_valid_o (mem_req_valid ), - .mst_req_ready_i (mem_req_ready ), - .mst_rsp_i (mem_rsp ), - .mst_rsp_valid_i (mem_rsp_valid ), - .mst_rsp_ready_o (mem_rsp_ready ), - .mst_sel_i (mem_rsp_sel ) + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .slv_req_i (core_req ), + .slv_rr_i ('0 ), + .slv_req_valid_i (core_req_valid ), + .slv_req_ready_o (core_req_ready ), + .slv_rsp_o (core_rsp ), + .slv_rsp_valid_o (core_rsp_valid ), + .slv_rsp_ready_i (core_rsp_ready ), + .slv_sel_i (core_req_sel ), + .slv_selected_o ( /* unused */ ), + .mst_req_o (mem_req ), + .mst_rr_i ('0 ), + .mst_req_valid_o (mem_req_valid ), + .mst_req_ready_i (mem_req_ready ), + .mst_rsp_i (mem_rsp ), + .mst_rsp_valid_i (mem_rsp_valid ), + .mst_rsp_ready_o (mem_rsp_ready ), + .mst_sel_i (mem_rsp_sel ) ); // -------- @@ -117,12 +138,22 @@ module tcdm_cache_interco #( // => 2^11/4 = 2^9 sets per cache bank => 2^9/4 = 2^7 sets per way per cache bank // => 7 bits index; 2 bits cache bank bits; // addr: Tag: [31:14]; Index: [13:7]; Cache Bank: [7:6]; Offset: [5:0] - for (genvar port = 0; port < NumCore; port++) begin : gen_req_sel - assign core_req_sel[port] = core_req[port].addr[dynamic_offset_i+:CacheBankBits]; + for (genvar port = 0; port < NumCores+NumRemotePort; port++) begin : gen_req_sel + always_comb begin + core_req_sel[port] = '0; + // Determine if we are targetting to a remote tile + local_sel[port] = (NumTiles == 1) ? + 1'b1 : (core_req[port].addr[(dynamic_offset_i+CacheBankBits)+:TileIDWidth] == tile_id_i); + + // Determine which bank is targeting at + core_req_sel[port] = local_sel[port] ? + core_req[port].addr[dynamic_offset_i+:CacheBankBits] : (1'b1 << NumOutSelBits); + end end // forward response to the sender core - for (genvar port = 0; port < NumCache; port++) begin : gen_rsp_sel + // TODO: Add remote identifier bits here + for (genvar port = 0; port < NumCache+NumRemotePort; port++) begin : gen_rsp_sel assign mem_rsp_sel[port] = mem_rsp[port].user.core_id; end @@ -131,7 +162,7 @@ module tcdm_cache_interco #( // Registers // -------- - for (genvar port = 0; port < NumCore; port++) begin : gen_cache_interco_reg + for (genvar port = 0; port < NumCores+NumRemotePort; port++) begin : gen_cache_interco_reg spill_register #( .T (tcdm_req_chan_t ) ) i_tcdm_req_reg ( @@ -166,13 +197,16 @@ module tcdm_cache_interco #( // IO Assignment // -------- + // TODO: Correctly handle the multi-tile case + // Plan: We should only do the scrambling at the destination + // We will also take away the offset bits we used from the full address for scrambling logic [AddrWidth-1:0] bitmask_up, bitmask_lo; // These are the address we will keep from original assign bitmask_lo = (1 << dynamic_offset_i) - 1; - // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and remove the NumMemSelBits bits - assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - NumMemSelBits)) - 1) << dynamic_offset_i; + // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and remove the NumOutSelBits bits + assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - NumOutSelBits)) - 1) << dynamic_offset_i; for (genvar port = 0; port < NumCache; port++) begin : gen_cache_io @@ -183,9 +217,9 @@ module tcdm_cache_interco #( default: '0 }; - // remove the middle two bits + // remove the middle bits mem_req_o[port].q.addr = (mem_req[port].addr & bitmask_lo) | - ((mem_req[port].addr >> NumMemSelBits) & bitmask_up); + ((mem_req[port].addr >> NumOutSelBits) & bitmask_up); end From 3f2ef2acce1e02eacc6c9c742aa8f1793fc85a2e Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Wed, 26 Nov 2025 11:38:10 +0100 Subject: [PATCH 02/23] [SRC] WIP: Update pkg for multi-tile configuration. --- config/cachepool_512.mk | 2 +- config/cachepool_fpu_128.mk | 2 +- config/config.mk | 2 +- hardware/src/cachepool_cluster.sv | 16 ++-- hardware/src/cachepool_pkg.sv | 138 ++++++++++++++++++------------ hardware/src/cachepool_tile.sv | 104 +++++++++++----------- 6 files changed, 145 insertions(+), 119 deletions(-) diff --git a/config/cachepool_512.mk b/config/cachepool_512.mk index 878c169..8970304 100644 --- a/config/cachepool_512.mk +++ b/config/cachepool_512.mk @@ -48,7 +48,7 @@ l1d_coal_window ?= 2 # L1 data cache number of ways per l1d_num_way ?= 4 -# L1 data cache size per tile (KiB) +# L1 data cache size **per tile** (KiB) l1d_tile_size ?= 256 # L1 data cache tag width (TODO: should be calcualted) diff --git a/config/cachepool_fpu_128.mk b/config/cachepool_fpu_128.mk index 37d4196..082520c 100644 --- a/config/cachepool_fpu_128.mk +++ b/config/cachepool_fpu_128.mk @@ -43,7 +43,7 @@ l1d_size ?= 256 l1d_bank_factor ?= 1 # L1 coalecsing window -l1d_coal_window ?= 2 +l1d_coal_window ?= 1 # L1 data cache number of ways per l1d_num_way ?= 4 diff --git a/config/config.mk b/config/config.mk index 2f1cc16..e1ddbea 100644 --- a/config/config.mk +++ b/config/config.mk @@ -113,7 +113,7 @@ endif ifeq ($(l1d_cacheline_width),512) axi_user_width := 17 else ifeq ($(l1d_cacheline_width),256) - axi_user_width := 19 + axi_user_width := 18 else ifeq ($(l1d_cacheline_width),128) axi_user_width := 21 endif diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index 8f8e7be..a3f8f4a 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -145,9 +145,9 @@ module cachepool_cluster /// AXI Narrow out-port (UART) output axi_narrow_req_t axi_narrow_req_o, input axi_narrow_resp_t axi_narrow_resp_i, - /// AXI Core cluster out-port to core. - output axi_out_req_t [NumClusterSlv-1:0] axi_out_req_o, - input axi_out_resp_t [NumClusterSlv-1:0] axi_out_resp_i, + /// AXI Core cluster out-port to main memory. + output axi_out_req_t [NumClusterSlv-1:0] axi_out_req_o, + input axi_out_resp_t [NumClusterSlv-1:0] axi_out_resp_i, /// SRAM Configuration: L1D Data + L1D Tag + L1D FIFO + L1I Data + L1I Tag input impl_in_t [NrSramCfg-1:0] impl_i, /// Indicate the program execution is error @@ -237,8 +237,8 @@ module cachepool_cluster assign error_o = |error; assign eoc_o = |eoc; - cache_trans_req_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_req; - cache_trans_rsp_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_rsp; + cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req; + cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp; cache_trans_req_t [NumTiles-1 :0] cache_core_req; cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; @@ -407,8 +407,8 @@ module cachepool_cluster .axi_out_req_o ( axi_out_req[t] ), .axi_out_resp_i ( axi_out_resp[t] ), // Cache Refill Ports - .cache_refill_req_o ( cache_refill_req[t*NumL1CacheCtrl+:NumL1CacheCtrl]), - .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CacheCtrl+:NumL1CacheCtrl]), + .cache_refill_req_o ( cache_refill_req[t*NumL1CtrlTile+:NumL1CtrlTile]), + .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CtrlTile+:NumL1CtrlTile]), .axi_wide_req_o ( axi_tile_req [t] ), .axi_wide_rsp_i ( axi_tile_rsp [t] ) ); @@ -448,7 +448,7 @@ module cachepool_cluster tile_rsp_ready[t*NumTiles] = cache_core_req[t].p_ready; // Normal Cache requests - for (int p = 0; p < NumL1CacheCtrl; p++) begin + for (int p = 0; p < NumL1CtrlTile; p++) begin tile_req_chan [t*NumTiles+p+1] = cache_refill_req[t*NumTiles+p].q; // Scramble address tile_req_chan [t*NumTiles+p+1].addr = scrambleAddr(cache_refill_req[t*NumTiles+p].q.addr); diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 7caff28..d6fbd18 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -8,7 +8,7 @@ package cachepool_pkg; import fpnew_pkg::*; /********************* - * TILE PARAMETERS * + * COMMON INCLUDES * *********************/ `include "axi/assign.svh" @@ -33,7 +33,7 @@ package cachepool_pkg; localparam int unsigned SpatzAxiIdInWidth = 6; localparam int unsigned SpatzAxiIdOutWidth = 7; - // FIXED AxiIdOutWidth + // Fixed AXI ID width for IWC // Add 3 because of cache controller (second-level xbar, 4 cache, 1 old port) localparam int unsigned IwcAxiIdOutWidth = 3 + $clog2(4) + 3; @@ -62,15 +62,14 @@ package cachepool_pkg; `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_data_t, axi_strb_t, axi_user_t) - //////////////////// - // Spatz Cluster // - //////////////////// + + ////////////////// + // CLUSTER HW // + ////////////////// localparam int unsigned NumCores = `ifdef NUM_CORES `NUM_CORES `else 0 `endif; - localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; - localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; - localparam int unsigned NumBank = `ifdef L1D_NUM_BANKS `L1D_NUM_BANKS `else 0 `endif; localparam int unsigned TCDMDepth = 256; localparam int unsigned L1Depth = `ifdef L1D_DEPTH `L1D_DEPTH `else 0 `endif; @@ -82,13 +81,13 @@ package cachepool_pkg; localparam int unsigned ICacheLineCount = 128; localparam int unsigned ICacheSets = 4; - // Be careful on unsigned long int passed in from configuration - // Currently use fixed values + // Be careful on unsigned long int passed in from configuration. + // Currently use fixed values. localparam int unsigned TCDMStartAddr = 32'hBFFF_F800; localparam int unsigned TCDMSize = 32'h800; // The short address for SPM - localparam int unsigned SPMAddrWidth = $clog2(TCDMSize); + localparam int unsigned SPMAddrWidth = $clog2(TCDMSize); localparam int unsigned PeriStartAddr = 32'hC000_0000; @@ -97,6 +96,7 @@ package cachepool_pkg; // UART Configuration localparam int unsigned UartAddr = 32'hC001_0000; + // PMA configuration (cached regions) function automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] get_cached_regions(); automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] cached_regions; cached_regions = '{default: '0}; @@ -106,16 +106,29 @@ package cachepool_pkg; localparam snitch_pma_pkg::snitch_pma_t SnitchPMACfg = '{ NrCachedRegionRules: 1, - CachedRegion: get_cached_regions(), - default: 0 + CachedRegion: get_cached_regions(), + default: 0 }; + + /********************* + * TILE SETTINGS * + *********************/ + + // How many remote ports for each tile? Currently needs to be 0 or 1. + localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + + // How many cores within a tile? This is used to select the ports within a tile. + localparam int unsigned NumCoresTile = `ifdef NUM_CORES_PER_TILE `NUM_CORES_PER_TILE `else 0 `endif; + localparam int unsigned LogNumCoresTile = $clog2(NumCoresTile); + + ///////////////// - // Spatz Core // + // SPATZ CORE // ///////////////// - localparam int unsigned NFpu = `ifdef SPATZ_NUM_FPU `SPATZ_NUM_FPU `else 0 `endif; - localparam int unsigned NIpu = `ifdef SPATZ_NUM_IPU `SPATZ_NUM_IPU `else 1 `endif; + localparam int unsigned NFpu = `ifdef SPATZ_NUM_FPU `SPATZ_NUM_FPU `else 0 `endif; + localparam int unsigned NIpu = `ifdef SPATZ_NUM_IPU `SPATZ_NUM_IPU `else 1 `endif; localparam int unsigned NumIntOutstandingLoads [NumCores] = '{default: `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif}; localparam int unsigned NumIntOutstandingMem [NumCores] = '{default: `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif}; @@ -145,48 +158,52 @@ package cachepool_pkg; localparam fpu_implementation_t FPUImplementation [NumCores] = '{default: FPUImplementation_Core}; + //////////////////// - // CachePool L1 // + // CACHEPOOL L1 // //////////////////// // Stack: 128*32/8 = 512 Byte per core localparam int unsigned SpmStackDepth = `ifdef STACK_HW_DEPTH `STACK_HW_DEPTH `else 0 `endif; localparam int unsigned SpmStackSize = `ifdef STACK_HW_SIZE `STACK_HW_SIZE `else 0 `endif; - // Total Stack Size in Byte (Shared in main memory + SpmStack) + // Total Stack Size in Byte (shared in main memory + SpmStack) localparam int unsigned TotStackDepth = `ifdef STACK_TOT_DEPTH `STACK_TOT_DEPTH `else 0 `endif; localparam int unsigned TotStackSize = `ifdef STACK_TOT_SIZE `STACK_TOT_SIZE `else 0 `endif; // Address width of cache localparam int unsigned L1AddrWidth = `ifdef ADDR_WIDTH `ADDR_WIDTH `else 0 `endif; - // Cache lane width + // Cache line width localparam int unsigned L1LineWidth = `ifdef L1D_CACHELINE_WIDTH `L1D_CACHELINE_WIDTH `else 0 `endif; - // Coalecser window + // Coalescer window localparam int unsigned L1CoalFactor = `ifdef L1D_COAL_WINDOW `L1D_COAL_WINDOW `else 0 `endif; - // Number of cache controller (now is fixde to NrCores (if we change it, we need to change the controller axi output id width too) - localparam int unsigned NumL1CacheCtrl = `ifdef NUM_CORES_PER_TILE `NUM_CORES_PER_TILE `else 0 `endif; + // Number of cache controllers (now is fixed to NrCores; if we change it, we need to change the controller AXI output ID width too) + localparam int unsigned NumL1CacheCtrl = NumCores; + // Number of cache controllers per Tile + localparam int unsigned NumL1CtrlTile = NumL1CacheCtrl / NumTiles; // Number of ways per cache controller localparam int unsigned L1AssoPerCtrl = `ifdef L1D_NUM_WAY `L1D_NUM_WAY `else 0 `endif; - // Pesudo dual bank + // Pseudo dual bank localparam int unsigned L1BankFactor = 2; - // DataWidth of Tag bank + // Data width of tag bank localparam int unsigned L1TagDataWidth = `ifdef L1D_TAG_DATA_WIDTH `L1D_TAG_DATA_WIDTH `else 0 `endif; - + // Number of L1 Banks per Tile + localparam int unsigned NumBank = `ifdef L1D_NUM_BANKS `L1D_NUM_BANKS `else 0 `endif; // Number of data banks assigned to each cache controller localparam int unsigned NumDataBankPerCtrl = (L1LineWidth / SpatzDataWidth) * L1AssoPerCtrl * L1BankFactor; // Number of tag banks assigned to each cache controller localparam int unsigned NumTagBankPerCtrl = L1AssoPerCtrl * L1BankFactor; - // Number of entrys of L1 Cache (total number across multiple cache controllers) + // Number of entries of L1 Cache (total number across multiple cache controllers) localparam int unsigned L1NumEntry = NumBank * L1Depth * SpatzDataWidth / L1LineWidth; // Number of cache entries each cache way has - localparam int unsigned L1CacheWayEntry = L1NumEntry / L1AssoPerCtrl / NumL1CacheCtrl; + localparam int unsigned L1CacheWayEntry = L1NumEntry / L1AssoPerCtrl / NumL1CtrlTile; // Number of entries per cache controller - localparam int unsigned L1NumEntryPerCtrl = L1NumEntry / NumL1CacheCtrl; + localparam int unsigned L1NumEntryPerCtrl = L1NumEntry / NumL1CtrlTile; // Number of cache sets each cache way has localparam int unsigned L1NumSet = L1CacheWayEntry / L1BankFactor; localparam int unsigned CoreIDWidth = cf_math_pkg::idx_width(NumCores); - localparam int unsigned BankIDWidth = cf_math_pkg::idx_width(NumL1CacheCtrl); + localparam int unsigned BankIDWidth = cf_math_pkg::idx_width(NumL1CtrlTile); localparam int unsigned RefillDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; localparam int unsigned RefillStrbWidth = RefillDataWidth / 8; @@ -201,22 +218,21 @@ package cachepool_pkg; typedef logic [RefillDataWidth-1:0] refill_data_t; typedef logic [RefillStrbWidth-1:0] refill_strb_t; typedef logic [$clog2(L1LineWidth/RefillDataWidth)-1:0] burst_len_t; - // Narrow TCDM channel (32b) for inter-Tile and intra-Tile connection + // Narrow TCDM channel (32b) for inter-tile and intra-tile connection typedef logic [31:0] narrow_data_t; typedef logic [3 :0] narrow_strb_t; typedef logic [L1AddrWidth-1:0] narrow_addr_t; typedef logic [SPMAddrWidth-1:0] spm_addr_t; - typedef struct packed { logic is_burst; burst_len_t burst_len; } burst_req_t; typedef struct packed { - logic for_write_pend; - cache_ways_entry_ptr_t depth; - way_ptr_t way; + logic for_write_pend; + cache_ways_entry_ptr_t depth; + way_ptr_t way; } cache_info_t; typedef struct packed { @@ -232,23 +248,28 @@ package cachepool_pkg; burst_req_t burst; } refill_user_t; + + ////////////////////////////// + // TILE / CLUSTER TOPOLOGY // + ////////////////////////////// + // Do we need to keep DMA here? - localparam int unsigned NumTileWideAxi = 2; + localparam int unsigned NumTileWideAxi = 2; typedef enum integer { - TileBootROM = 0, - TileMem = 1 + TileBootROM = 0, + TileMem = 1 } tile_wide_e; - localparam int unsigned NumTileNarrowAxi = 1; + localparam int unsigned NumTileNarrowAxi = 1; typedef enum integer { - TilePeriph = 0 + TilePeriph = 0 } tile_narrow_e; typedef enum integer { - L2Channel0 = 0, - L2Channel1 = 1, - L2Channel2 = 2, - L2Channel3 = 3 + L2Channel0 = 0, + L2Channel1 = 1, + L2Channel2 = 2, + L2Channel3 = 3 } cluster_slv_e; // Cache refill bus @@ -273,25 +294,30 @@ package cachepool_pkg; `TCDM_TYPEDEF_ALL(tcdm, narrow_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) `TCDM_TYPEDEF_ALL(spm, spm_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) + + ////////////////// + // L2 / DRAM // + ////////////////// + // L2 Memory - localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; - localparam int unsigned L2BankWidth = `ifdef L2_BANK_WIDTH `L2_BANK_WIDTH `else 0 `endif; - localparam int unsigned L2BankBeWidth = L2BankWidth / 8; - parameter DramType = "DDR4"; // "DDR4", "DDR3", "HBM2", "LPDDR4" - parameter int unsigned DramBase = 32'h8000_0000; + localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; + localparam int unsigned L2BankWidth = `ifdef L2_BANK_WIDTH `L2_BANK_WIDTH `else 0 `endif; + localparam int unsigned L2BankBeWidth = L2BankWidth / 8; + parameter DramType = "DDR4"; // "DDR4", "DDR3", "HBM2", "LPDDR4" + parameter int unsigned DramBase = 32'h8000_0000; // TODO: multi-tile support // One more from the Snitch core - localparam int unsigned NumClusterMst = 1 + NumL1CacheCtrl; + localparam int unsigned NumClusterMst = 1 + NumL1CtrlTile; // One more for UART? - localparam int unsigned NumClusterSlv = NumL2Channel; + localparam int unsigned NumClusterSlv = NumL2Channel; - `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_data_t, axi_strb_t, refill_user_t) + `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_data_t, axi_strb_t, refill_user_t) // DRAM Configuration - localparam int unsigned DramAddr = 32'h8000_0000; - localparam int unsigned DramSize = 32'h4000_0000; // 1GB - localparam int unsigned DramPerChSize = DramSize / NumL2Channel; + localparam int unsigned DramAddr = 32'h8000_0000; + localparam int unsigned DramSize = 32'h4000_0000; // 1GB + localparam int unsigned DramPerChSize = DramSize / NumL2Channel; // DRAM Interleaving Functions typedef struct packed { @@ -319,7 +345,7 @@ package cachepool_pkg; // IMPORTANT: This function will not work if size is smaller than `L2BankBeWidth * Interleave` automatic axi_addr_t res; if ((L2BankBeWidth * Interleave) < DramPerChSize) begin - // input address needs to move the dram_id bits to correct location for interleaving + // Input address needs to move the dram_id bits to correct location for interleaving // [Reminder][InterChange][Scramble][Constant] => [Reminder][Scramble][InterChange][Constant] // log2(32'h0100_0000) = 24 // 32'h0100_0000 has 24b trailing zeros => in total 24b offset @@ -349,7 +375,7 @@ package cachepool_pkg; // Revert the scrambled address back automatic axi_addr_t res; if ((L2BankBeWidth * Interleave) < DramPerChSize) begin - // input address needs to move the dram_id bits to correct location for interleaving + // Input address needs to move the dram_id bits to correct location for interleaving // [Reminder][Scramble][InterChange][Constant] => [Reminder][InterChange][Scramble][Constant] // log2(32'h0100_0000) = 24 localparam int unsigned SizeOffsetBits = $clog2(DramPerChSize); diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 69458bd..3c082d8 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -146,8 +146,8 @@ module cachepool_tile output axi_narrow_req_t axi_out_req_o, input axi_narrow_resp_t axi_out_resp_i, /// AXI Cache Refill ports - output cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req_o, - input cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp_i, + output cache_trans_req_t [NumL1CtrlTile-1:0] cache_refill_req_o, + input cache_trans_rsp_t [NumL1CtrlTile-1:0] cache_refill_rsp_i, /// Wide AXI ports to cluster level output axi_out_req_t [NumTileWideAxi-1:0] axi_wide_req_o, input axi_out_resp_t [NumTileWideAxi-1:0] axi_wide_rsp_i, @@ -256,7 +256,7 @@ module cachepool_tile typedef logic [NarrowIdWidthOut-1:0] id_slv_t; typedef logic [WideIdWidthIn-1:0] id_dma_mst_t; typedef logic [WideIdWidthOut-1:0] id_dma_slv_t; - typedef logic [WideIdWidthIn-$clog2(NumL1CacheCtrl)-1:0] id_dcache_mst_t; + typedef logic [WideIdWidthIn-$clog2(NumL1CtrlTile)-1:0] id_dcache_mst_t; typedef logic [NarrowUserWidth-1:0] user_t; typedef logic [AxiUserWidth-1:0] user_dma_t; @@ -424,46 +424,46 @@ module cachepool_tile tcdm_req_t [NrTCDMPortsCores-1:0] unmerge_req; tcdm_rsp_t [NrTCDMPortsCores-1:0] unmerge_rsp; - tcdm_req_t [NrTCDMPortsPerCore-1:0][NumL1CacheCtrl-1:0] cache_req, cache_xbar_req; - tcdm_rsp_t [NrTCDMPortsPerCore-1:0][NumL1CacheCtrl-1:0] cache_rsp, cache_xbar_rsp; - - tcdm_req_t [NumL1CacheCtrl-1:0] cache_amo_req; - tcdm_rsp_t [NumL1CacheCtrl-1:0] cache_amo_rsp; - - - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_valid; - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_ready; - tcdm_addr_t [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_addr; - tcdm_user_t [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_meta; - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_write; - data_t [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_req_data; - - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_valid; - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_ready; - logic [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_write; - data_t [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_data; - tcdm_user_t [NumL1CacheCtrl-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_meta; - - logic [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_req; - logic [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_we; - tcdm_bank_addr_t [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_addr; - tag_data_t [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_wdata; - logic [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_be; - tag_data_t [NumL1CacheCtrl-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_rdata; - - logic [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_req; - logic [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_we; - tcdm_bank_addr_t [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_addr; - data_t [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_wdata; - logic [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_be; - data_t [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_rdata; - logic [NumL1CacheCtrl-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_gnt; + tcdm_req_t [NrTCDMPortsPerCore-1:0][NumL1CtrlTile-1:0] cache_req, cache_xbar_req; + tcdm_rsp_t [NrTCDMPortsPerCore-1:0][NumL1CtrlTile-1:0] cache_rsp, cache_xbar_rsp; + + tcdm_req_t [NumL1CtrlTile-1:0] cache_amo_req; + tcdm_rsp_t [NumL1CtrlTile-1:0] cache_amo_rsp; + + + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_valid; + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_ready; + tcdm_addr_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_addr; + tcdm_user_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_meta; + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_write; + data_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_data; + + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_valid; + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_ready; + logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_write; + data_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_data; + tcdm_user_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_meta; + + logic [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_req; + logic [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_we; + tcdm_bank_addr_t [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_addr; + tag_data_t [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_wdata; + logic [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_be; + tag_data_t [NumL1CtrlTile-1:0][NumTagBankPerCtrl-1:0] l1_tag_bank_rdata; + + logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_req; + logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_we; + tcdm_bank_addr_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_addr; + data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_wdata; + logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_be; + data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_rdata; + logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_gnt; logic l1d_insn_valid; - logic [NumL1CacheCtrl-1:0] l1d_insn_ready; + logic [NumL1CtrlTile-1:0] l1d_insn_ready; logic [1:0] l1d_insn; tcdm_bank_addr_t cfg_spm_size; - logic [NumL1CacheCtrl-1:0] l1d_busy; + logic [NumL1CtrlTile-1:0] l1d_busy; // High if a port access an illegal SPM region (mapped to cache) // logic [NrTCDMPortsCores-1:0] spm_error; @@ -557,8 +557,8 @@ module cachepool_tile logic [NrTCDMPortsCores-1:0] unmerge_pready; - logic [NrTCDMPortsPerCore-1:0][NumL1CacheCtrl-1:0] cache_pready, cache_xbar_pready; - logic [NumL1CacheCtrl-1:0] cache_amo_pready; + logic [NrTCDMPortsPerCore-1:0][NumL1CtrlTile-1:0] cache_pready, cache_xbar_pready; + logic [NumL1CtrlTile-1:0] cache_amo_pready; // TODO: remove this module // where to deal with cache flushing protection? @@ -581,7 +581,7 @@ module cachepool_tile end for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin - for (genvar cb = 0; cb < NumL1CacheCtrl; cb++) begin + for (genvar cb = 0; cb < NumL1CtrlTile; cb++) begin assign cache_req [j][cb] = unmerge_req [cb*NrTCDMPortsPerCore+j]; assign cache_pready[j][cb] = unmerge_pready[cb*NrTCDMPortsPerCore+j]; assign unmerge_rsp [cb*NrTCDMPortsPerCore+j] = cache_rsp [j][cb]; @@ -604,7 +604,7 @@ module cachepool_tile tcdm_cache_interco #( .NumTiles (NumTiles ), .NumCores (NrCores ), - .NumCache (NumL1CacheCtrl ), + .NumCache (NumL1CtrlTile ), .NumRemotePort (NumRemotePortTile ), .AddrWidth (TCDMAddrWidth ), .tcdm_req_t (tcdm_req_t ), @@ -625,7 +625,7 @@ module cachepool_tile ); end - for (genvar cb = 0; cb < NumL1CacheCtrl; cb++) begin : gen_cache_connect + for (genvar cb = 0; cb < NumL1CtrlTile; cb++) begin : gen_cache_connect // Only Snitch will send out amo requests // Ports from Spatz can bypass this module @@ -715,20 +715,20 @@ module cachepool_tile end // For address scrambling - localparam NumSelBits = $clog2(NumL1CacheCtrl); + localparam NumSelBits = $clog2(NumL1CtrlTile); localparam NumWordPerLine = L1LineWidth / DataWidth; logic [SpatzAxiAddrWidth-1:0] bitmask_up, bitmask_lo; assign bitmask_lo = (1 << dynamic_offset) - 1; // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and add back the NumSelBits bits assign bitmask_up = ((1 << (SpatzAxiAddrWidth - dynamic_offset - NumSelBits)) - 1) << (dynamic_offset); - cache_refill_req_chan_t [NumL1CacheCtrl-1 : 0] cache_refill_req; - burst_req_t [NumL1CacheCtrl-1 : 0] cache_refill_burst; - logic [NumL1CacheCtrl-1 : 0] cache_refill_req_valid, cache_refill_req_ready; - cache_refill_rsp_chan_t [NumL1CacheCtrl-1 : 0] cache_refill_rsp; - logic [NumL1CacheCtrl-1 : 0] cache_refill_rsp_valid, cache_refill_rsp_ready; + cache_refill_req_chan_t [NumL1CtrlTile-1 : 0] cache_refill_req; + burst_req_t [NumL1CtrlTile-1 : 0] cache_refill_burst; + logic [NumL1CtrlTile-1 : 0] cache_refill_req_valid, cache_refill_req_ready; + cache_refill_rsp_chan_t [NumL1CtrlTile-1 : 0] cache_refill_rsp; + logic [NumL1CtrlTile-1 : 0] cache_refill_rsp_valid, cache_refill_rsp_ready; - for (genvar cb = 0; cb < NumL1CacheCtrl; cb++) begin: gen_l1_cache_ctrl + for (genvar cb = 0; cb < NumL1CtrlTile; cb++) begin: gen_l1_cache_ctrl cachepool_cache_ctrl #( // Core .NumPorts (NrTCDMPortsPerCore ), @@ -1219,7 +1219,7 @@ module cachepool_tile spatz_cluster_peripheral #( .AddrWidth (AxiAddrWidth ), .SPMWidth ($clog2(L1NumSet)), - .NumCacheCtrl (NumL1CacheCtrl ), + .NumCacheCtrl (NumL1CtrlTile ), .reg_req_t (reg_req_t ), .reg_rsp_t (reg_rsp_t ), .tcdm_events_t (tcdm_events_t ), From 3e0a31e57415981ca8830f34cb5c72a42609d8ca Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Wed, 26 Nov 2025 12:02:48 +0100 Subject: [PATCH 03/23] [SRC] WIP: Add group-level. --- Bender.yml | 2 + hardware/src/cachepool_group.sv | 371 ++++++++++++++++++++++++++++++++ util/auto-benchmark/configs.sh | 3 +- 3 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 hardware/src/cachepool_group.sv diff --git a/Bender.yml b/Bender.yml index 7afcdf8..3962ee9 100644 --- a/Bender.yml +++ b/Bender.yml @@ -35,6 +35,8 @@ sources: # Level 2 - hardware/src/cachepool_tile.sv # Level 3 + - hardware/src/cachepool_group.sv + - hardware/src/cachepool_cluster.sv # Level 4 - hardware/tb/cachepool_cluster_wrapper.sv diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv new file mode 100644 index 0000000..15f6a5e --- /dev/null +++ b/hardware/src/cachepool_group.sv @@ -0,0 +1,371 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Diyou Shen + +`include "axi/assign.svh" +`include "axi/typedef.svh" +`include "common_cells/assertions.svh" +`include "common_cells/registers.svh" +`include "mem_interface/assign.svh" +`include "mem_interface/typedef.svh" +`include "register_interface//assign.svh" +`include "register_interface/typedef.svh" +`include "reqrsp_interface/assign.svh" +`include "reqrsp_interface/typedef.svh" +`include "snitch_vm/typedef.svh" +`include "tcdm_interface/assign.svh" +`include "tcdm_interface/typedef.svh" + +/// Group implementation for CachePool +module cachepool_group + import cachepool_pkg::*; + import spatz_pkg::*; + import fpnew_pkg::fpu_implementation_t; + #( + /// Width of physical address. + parameter int unsigned AxiAddrWidth = 48, + /// Width of AXI port. + parameter int unsigned AxiDataWidth = 512, + /// AXI: id width in. + parameter int unsigned AxiIdWidthIn = 2, + /// AXI: id width out. + parameter int unsigned AxiIdWidthOut = 2, + /// AXI: user width. + parameter int unsigned AxiUserWidth = 1, + /// Address from which to fetch the first instructions. + parameter logic [31:0] BootAddr = 32'h0, + /// Address to indicate start of UART + parameter logic [31:0] UartAddr = 32'h0, + /// The total amount of cores. + parameter int unsigned NrCores = 8, + /// Data/TCDM memory depth per cut (in words). + parameter int unsigned TCDMDepth = 1024, + /// Cluster peripheral address region size (in kB). + parameter int unsigned ClusterPeriphSize = 64, + /// Number of TCDM Banks. + parameter int unsigned NrBanks = 2 * NrCores, + /// Size of DMA AXI buffer. + parameter int unsigned DMAAxiReqFifoDepth = 3, + /// Size of DMA request fifo. + parameter int unsigned DMAReqFifoDepth = 3, + /// Width of a single icache line. + parameter unsigned ICacheLineWidth = 0, + /// Number of icache lines per set. + parameter int unsigned ICacheLineCount = 0, + /// Number of icache sets. + parameter int unsigned ICacheSets = 0, + /// # Core-global parameters + /// FPU configuration. + parameter fpu_implementation_t FPUImplementation = fpu_implementation_t'(0), + /// Spatz FPU/IPU Configuration + parameter int unsigned NumSpatzFPUs = 4, + parameter int unsigned NumSpatzIPUs = 1, + /// Per-core enabling of the custom `Xdma` ISA extensions. + parameter bit [NrCores-1:0] Xdma = '{default: '0}, + /// # Per-core parameters + /// Per-core integer outstanding loads + parameter int unsigned NumIntOutstandingLoads = 0, + /// Per-core integer outstanding memory operations (load and stores) + parameter int unsigned NumIntOutstandingMem = 0, + /// Per-core Spatz outstanding loads + parameter int unsigned NumSpatzOutstandingLoads = 0, + /// ## Timing Tuning Parameters + /// Insert Pipeline registers into off-loading path (response) + parameter bit RegisterOffloadRsp = 1'b0, + /// Insert Pipeline registers into data memory path (request) + parameter bit RegisterCoreReq = 1'b0, + /// Insert Pipeline registers into data memory path (response) + parameter bit RegisterCoreRsp = 1'b0, + /// Insert Pipeline registers after each memory cut + parameter bit RegisterTCDMCuts = 1'b0, + /// Decouple external AXI plug + parameter bit RegisterExt = 1'b0, + parameter axi_pkg::xbar_latency_e XbarLatency = axi_pkg::CUT_ALL_PORTS, + /// Outstanding transactions on the AXI network + parameter int unsigned MaxMstTrans = 4, + parameter int unsigned MaxSlvTrans = 4, + /// # Interface + /// AXI Ports + parameter type axi_in_req_t = logic, + parameter type axi_in_resp_t = logic, + parameter type axi_narrow_req_t = logic, + parameter type axi_narrow_resp_t = logic, + parameter type axi_out_req_t = logic, + parameter type axi_out_resp_t = logic, + /// SRAM configuration + parameter type impl_in_t = logic, + // Memory latency parameter. Most of the memories have a read latency of 1. In + // case you have memory macros which are pipelined you want to adjust this + // value here. This only applies to the TCDM. The instruction cache macros will break! + // In case you are using the `RegisterTCDMCuts` feature this adds an + // additional cycle latency, which is taken into account here. + parameter int unsigned MemoryMacroLatency = 1 + RegisterTCDMCuts, + /// # SRAM Configuration rules needed: L1D Tag + L1D Data + L1D FIFO + L1I Tag + L1I Data + /*** ATTENTION: `NrSramCfg` should be changed if `L1NumDataBank` and `L1NumTagBank` is changed ***/ + parameter int unsigned NrSramCfg = 1 + ) ( + /// System clock. + input logic clk_i, + /// Asynchronous active high reset. This signal is assumed to be _async_. + input logic rst_ni, + /// Per-core debug request signal. Asserting this signals puts the + /// corresponding core into debug mode. This signal is assumed to be _async_. + input logic [NrCores-1:0] debug_req_i, + /// End of Computing indicator to notify the host/tb + output logic eoc_o, + /// Machine external interrupt pending. Usually those interrupts come from a + /// platform-level interrupt controller. This signal is assumed to be _async_. + input logic [NrCores-1:0] meip_i, + /// Machine timer interrupt pending. Usually those interrupts come from a + /// core-local interrupt controller such as a timer/RTC. This signal is + /// assumed to be _async_. + input logic [NrCores-1:0] mtip_i, + /// Core software interrupt pending. Usually those interrupts come from + /// another core to facilitate inter-processor-interrupts. This signal is + /// assumed to be _async_. + input logic [NrCores-1:0] msip_i, + /// First hartid of the cluster. Cores of a cluster are monotonically + /// increasing without a gap, i.e., a cluster with 8 cores and a + /// `hart_base_id_i` of 5 get the hartids 5 - 12. + input logic [9:0] hart_base_id_i, + /// Base address of cluster. TCDM and cluster peripheral location are derived from + /// it. This signal is pseudo-static. + input logic [AxiAddrWidth-1:0] cluster_base_addr_i, + /// Per-cluster probe on the cluster status. Can be written by the cores to indicate + /// to the overall system that the cluster is executing something. + output logic [NumTiles-1:0] cluster_probe_o, + /// AXI Core cluster in-port. + input axi_in_req_t [NumTiles-1:0] axi_in_req_i, + output axi_in_resp_t [NumTiles-1:0] axi_in_rsp_o, + /// AXI Narrow out-port (UART) + output axi_narrow_req_t [NumTiles-1:0] axi_narrow_req_o, + input axi_narrow_resp_t [NumTiles-1:0] axi_narrow_rsp_i, + /// Wide AXI ports to cluster level + output axi_out_req_t [NumTiles*NumTileWideAxi-1:0] axi_wide_req_o, + input axi_out_resp_t [NumTiles*NumTileWideAxi-1:0] axi_wide_rsp_i, + + /// Cache refill ports + output cache_trans_req_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_req_o, + input cache_trans_rsp_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_rsp_i, + + /// SRAM Configuration: L1D Data + L1D Tag + L1D FIFO + L1I Data + L1I Tag + input impl_in_t [NrSramCfg-1:0] impl_i, + /// Indicate the program execution is error + output logic error_o + ); + + + // --------- + // Imports + // --------- + import snitch_pkg::*; + + // --------- + // Constants + // --------- + /// Minimum width to hold the core number. + localparam int unsigned CoreIDWidth = cf_math_pkg::idx_width(NrCores); + localparam int unsigned TileIDWidth = cf_math_pkg::idx_width(NumTiles); + + // Enlarge the address width for Spatz due to cache + localparam int unsigned TCDMAddrWidth = L1AddrWidth; + + // Core Request, SoC Request + localparam int unsigned NrNarrowMasters = 2; + + localparam int unsigned WideIdWidthOut = AxiIdWidthOut; + localparam int unsigned WideIdWidthIn = WideIdWidthOut - $clog2(NumClusterMst); + + + // -------- + // Typedefs + // -------- + typedef logic [AxiAddrWidth-1:0] addr_t; + typedef logic [AxiDataWidth-1:0] data_cache_t; + typedef logic [AxiDataWidth/8-1:0] strb_cache_t; + typedef logic [WideIdWidthIn-1:0] id_cache_mst_t; + typedef logic [WideIdWidthOut-1:0] id_cache_slv_t; + typedef logic [AxiUserWidth-1:0] user_cache_t; + + `AXI_TYPEDEF_ALL(axi_mst_cache, addr_t, id_cache_mst_t, data_cache_t, strb_cache_t, user_cache_t) + `AXI_TYPEDEF_ALL(axi_slv_cache, addr_t, id_cache_slv_t, data_cache_t, strb_cache_t, user_cache_t) + + `REG_BUS_TYPEDEF_ALL(reg_cache, addr_t, data_cache_t, strb_cache_t) + + typedef struct packed { + int unsigned idx; + addr_t start_addr; + addr_t end_addr; + } xbar_rule_t; + + `SNITCH_VM_TYPEDEF(AxiAddrWidth) + + // ---------------- + // Wire Definitions + // ---------------- + // 1. AXI + axi_mst_cache_req_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_req; + axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; + axi_slv_cache_req_t [NumTiles*NumTileWideAxi-1:0] wide_axi_slv_req; + axi_slv_cache_resp_t [NumTiles*NumTileWideAxi-1:0] wide_axi_slv_rsp; + axi_narrow_req_t [NumTiles-1 :0] axi_out_req; + axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; + + // 2. BootROM + reg_cache_req_t bootrom_reg_req; + reg_cache_rsp_t bootrom_reg_rsp; + + // --------------- + // CachePool Tile + // --------------- + + logic [NumTiles-1:0] error, eoc; + assign error_o = |error; + assign eoc_o = |eoc; + + cache_trans_req_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_req; + cache_trans_rsp_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_rsp; + + cache_trans_req_t [NumTiles-1 :0] cache_core_req; + cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; + + cache_trans_req_chan_t [NumTiles*NumClusterMst-1 :0] tile_req_chan; + cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; + logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; + + + + + // Tile remote access signals + // In/Out relative to the tile (out--leave a tile; in--enter a tile) + tcdm_req_t [NumTiles-1:0] tile_remote_out_req; + tcdm_rsp_t [NumTiles-1:0] tile_remote_out_rsp; + tcdm_req_chan_t [NumTiles-1:0] tile_remote_out_req_chan; + logic [NumTiles-1:0] tile_remote_out_req_valid, tile_remote_out_req_ready; + tcdm_rsp_chan_t [NumTiles-1:0] tile_remote_out_rsp_chan; + logic [NumTiles-1:0] tile_remote_out_rsp_valid, tile_remote_out_rsp_ready; + + tcdm_req_t [NumTiles-1:0] tile_remote_in_req; + tcdm_rsp_t [NumTiles-1:0] tile_remote_in_rsp; + tcdm_req_chan_t [NumTiles-1:0] tile_remote_in_req_chan; + logic [NumTiles-1:0] tile_remote_in_req_valid, tile_remote_in_req_ready; + tcdm_rsp_chan_t [NumTiles-1:0] tile_remote_in_rsp_chan; + logic [NumTiles-1:0] tile_remote_in_rsp_valid, tile_remote_in_rsp_ready; + + // Symmetric xbar, in/out select types are the same + typedef logic [$clog2(NumTiles)-1 :0] remote_tile_sel_t; + remote_tile_sel_t [NumTiles-1:0] remote_out_sel, remote_in_sel; + + for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles + cachepool_tile #( + .AxiAddrWidth ( AxiAddrWidth ), + .AxiDataWidth ( AxiDataWidth ), + .AxiIdWidthIn ( AxiIdWidthIn ), + .AxiIdWidthOut ( WideIdWidthIn ), + .AxiUserWidth ( AxiUserWidth ), + .BootAddr ( BootAddr ), + .UartAddr ( UartAddr ), + .ClusterPeriphSize ( ClusterPeriphSize ), + .NrCores ( NumCoresTIle ), + .TCDMDepth ( TCDMDepth ), + .NrBanks ( NrBanks ), + .ICacheLineWidth ( ICacheLineWidth ), + .ICacheLineCount ( ICacheLineCount ), + .ICacheSets ( ICacheSets ), + .FPUImplementation ( FPUImplementation ), + .NumSpatzFPUs ( NumSpatzFPUs ), + .NumSpatzIPUs ( NumSpatzIPUs ), + .SnitchPMACfg ( SnitchPMACfg ), + .NumIntOutstandingLoads ( NumIntOutstandingLoads ), + .NumIntOutstandingMem ( NumIntOutstandingMem ), + .NumSpatzOutstandingLoads ( NumSpatzOutstandingLoads ), + .axi_in_req_t ( axi_in_req_t ), + .axi_in_resp_t ( axi_in_resp_t ), + .axi_narrow_req_t ( axi_narrow_req_t ), + .axi_narrow_resp_t ( axi_narrow_resp_t ), + .axi_out_req_t ( axi_mst_cache_req_t ), + .axi_out_resp_t ( axi_mst_cache_resp_t ), + .Xdma ( Xdma ), + .DMAAxiReqFifoDepth ( DMAAxiReqFifoDepth ), + .DMAReqFifoDepth ( DMAReqFifoDepth ), + .RegisterOffloadRsp ( RegisterOffloadRsp ), + .RegisterCoreReq ( RegisterCoreReq ), + .RegisterCoreRsp ( RegisterCoreRsp ), + .RegisterTCDMCuts ( RegisterTCDMCuts ), + .RegisterExt ( RegisterExt ), + .XbarLatency ( XbarLatency ), + .MaxMstTrans ( MaxMstTrans ), + .MaxSlvTrans ( MaxSlvTrans ) + ) i_tile ( + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .eoc_o ( eoc[t] ), + .impl_i ( impl_i ), + .error_o ( error[t] ), + .debug_req_i ( debug_req_i ), + .meip_i ( meip_i ), + .mtip_i ( mtip_i ), + .msip_i ( msip_i ), + .hart_base_id_i ( hart_base_id_i ), + .cluster_base_addr_i ( cluster_base_addr_i ), + .tile_probe_o ( cluster_probe_o[t] ), + // SoC in for control + .axi_in_req_i ( axi_in_req_i [t] ), + .axi_in_resp_o ( axi_in_rsp_o[t] ), + // AXI out for UART + .axi_out_req_o ( axi_narrow_req_o[t] ), + .axi_out_resp_i ( axi_narrow_rsp_i[t] ), + // Remote Access Ports + .remote_req_o ( tile_remote_out_req[t] ), + .remote_req_dst_o ( remote_out_sel[t] ), + .remote_rsp_i ( tile_remote_out_rsp[t] ), + .remote_req_i ( tile_remote_in_req [t] ), + .remote_rsp_o ( tile_remote_in_rsp [t] ), + // Cache Refill Ports + .cache_refill_req_o ( cache_refill_req_o[t*NumL1CacheCtrl+:NumL1CacheCtrl]), + .cache_refill_rsp_i ( cache_refill_rsp_i[t*NumL1CacheCtrl+:NumL1CacheCtrl]), + // BootROM / Core-side Cache Bypass + .axi_wide_req_o ( axi_wide_req_o [t*NumTileWideAxi+:NumTileWideAxi]), + .axi_wide_rsp_i ( axi_wide_rsp_i [t*NumTileWideAxi+:NumTileWideAxi]) + ); + end + + // ------------ + // Remote XBar + // ------------ + + // Decide which tile to go + reqrsp_xbar #( + .NumInp (NumTiles ), + .NumOut (NumTiles ), + .PipeReg (1'b1 ), + .ExtReqPrio (1'b0 ), + .ExtRspPrio (1'b0 ), + .tcdm_req_chan_t (tcdm_req_chan_t ), + .tcdm_rsp_chan_t (tcdm_rsp_chan_t ) + ) i_tile_remote_xbar ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .slv_req_i (tile_remote_out_req_chan ), + .slv_req_valid_i (tile_remote_out_req_valid ), + .slv_req_ready_o (tile_remote_out_req_ready ), + .slv_rsp_o (tile_remote_out_rsp_chan ), + .slv_rsp_valid_o (tile_remote_out_rsp_valid ), + .slv_rsp_ready_i (tile_remote_out_rsp_ready ), + .slv_sel_i (remote_out_sel ), + .slv_rr_i ('0 ), + .slv_selected_o (/*selection info in cid*/ ), + .mst_req_o (tile_remote_in_req_chan ), + .mst_req_valid_o (tile_remote_in_req_valid ), + .mst_req_ready_i (tile_remote_in_req_ready ), + .mst_rsp_i (tile_remote_in_rsp_chan ), + .mst_rsp_valid_i (tile_remote_in_rsp_valid ), + .mst_rsp_ready_o (tile_remote_in_rsp_ready ), + .mst_rr_i ('0 ), + .mst_sel_i (remote_in_sel ) + ); + + +endmodule diff --git a/util/auto-benchmark/configs.sh b/util/auto-benchmark/configs.sh index 6766dce..f3013c6 100755 --- a/util/auto-benchmark/configs.sh +++ b/util/auto-benchmark/configs.sh @@ -2,6 +2,7 @@ # CONFIGS="cachepool_fpu_512" # KERNELS="spin-lock fdotp-32b_M32768" CONFIGS="cachepool_fpu_128 cachepool_fpu_256 cachepool_fpu_512" -KERNELS="spin-lock fdotp-32b_M32768 gemv-col_M256_N128_K32 fmatmul-32b_M32_N32_K32 fmatmul-32b_M64_N64_K64" +KERNELS="spin-lock fdotp-32b_M8192 fmatmul-32b_M32_N32_K32" +# KERNELS="spin-lock fdotp-32b_M32768 gemv-col_M256_N128_K32 fmatmul-32b_M32_N32_K32 fmatmul-32b_M64_N64_K64" PREFIX="test-cachepool-" # common prefix for all kernels ROOT_PATH=../.. # adjust if needed (path to repo root) From 10c6195a140da381cc5938e58b4457f593686c90 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Wed, 26 Nov 2025 12:26:06 +0100 Subject: [PATCH 04/23] [SRC] WIP: add group-level. --- config/cachepool.hjson | 4 +- hardware/src/cachepool_cluster.sv | 237 +++++++++++++++++++++++++----- hardware/src/cachepool_pkg.sv | 4 +- 3 files changed, 209 insertions(+), 36 deletions(-) diff --git a/config/cachepool.hjson b/config/cachepool.hjson index f74c9e9..9a31358 100644 --- a/config/cachepool.hjson +++ b/config/cachepool.hjson @@ -29,9 +29,9 @@ // Spatz parameters vlen: 512, - n_fpu: 0, + n_fpu: 4, n_ipu: 4, - spatz_fpu: false, + spatz_fpu: true, norvd: true, // Timing parameters (fixed defaults; tweak in template if needed) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index a3f8f4a..aa86aa8 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -237,8 +237,8 @@ module cachepool_cluster assign error_o = |error; assign eoc_o = |eoc; - cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req; - cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp; + cache_trans_req_t [NumL1CacheCtrl-1 :0] cache_refill_req; + cache_trans_rsp_t [NumL1CacheCtrl-1 :0] cache_refill_rsp; cache_trans_req_t [NumTiles-1 :0] cache_core_req; cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; @@ -247,34 +247,34 @@ module cachepool_cluster cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; - l2_req_t [NumClusterSlv-1 :0] l2_req; - l2_rsp_t [NumClusterSlv-1 :0] l2_rsp; + l2_req_t [NumClusterSlv-1 :0] l2_req; + l2_rsp_t [NumClusterSlv-1 :0] l2_rsp; - cache_trans_req_chan_t [NumClusterSlv-1 :0] l2_req_chan; - cache_trans_rsp_chan_t [NumClusterSlv-1 :0] l2_rsp_chan; - logic [NumClusterSlv-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready ; + cache_trans_req_chan_t [NumClusterSlv-1 :0] l2_req_chan; + cache_trans_rsp_chan_t [NumClusterSlv-1 :0] l2_rsp_chan; + logic [NumClusterSlv-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready; - typedef logic [$clog2(NumClusterMst*NumTiles)-1:0] l2_sel_t; + typedef logic [$clog2(NumClusterMst*NumTiles)-1:0] l2_sel_t; // one more bit for out-of-range alert - typedef logic [$clog2(NumClusterSlv) :0] tile_sel_err_t; - typedef logic [$clog2(NumClusterSlv)-1 :0] tile_sel_t; + typedef logic [$clog2(NumClusterSlv) :0] tile_sel_err_t; + typedef logic [$clog2(NumClusterSlv)-1 :0] tile_sel_t; // Which l2 we want to select for each req - tile_sel_err_t [NumTiles*NumClusterMst-1 :0] tile_sel_err; - tile_sel_t [NumTiles*NumClusterMst-1 :0] tile_sel; + tile_sel_err_t [NumTiles*NumClusterMst-1 :0] tile_sel_err; + tile_sel_t [NumTiles*NumClusterMst-1 :0] tile_sel; // Which tile we selected for each req - l2_sel_t [NumClusterSlv-1:0] tile_selected; + l2_sel_t [NumClusterSlv-1 :0] tile_selected; // which tile we want to select for each rsp - l2_sel_t [NumClusterSlv-1:0] l2_sel; + l2_sel_t [NumClusterSlv-1 :0] l2_sel; // What is the priority for response wiring? // Here we want to make sure the responses from one burst // continues until done // If the rsp is a burst with blen != 0, then we will keep // the rr same, until got a burst rsp with blen == 0 - tile_sel_t [NumTiles*NumClusterMst-1 :0] l2_rsp_rr; + tile_sel_t [NumTiles*NumClusterMst-1 :0] l2_rsp_rr; - logic [NumTiles*NumClusterMst-1:0] rr_lock_d, rr_lock_q; - tile_sel_t [NumTiles*NumClusterMst-1:0] l2_prio_d, l2_prio_q; + logic [NumTiles*NumClusterMst-1 :0] rr_lock_d, rr_lock_q; + tile_sel_t [NumTiles*NumClusterMst-1 :0] l2_prio_d, l2_prio_q; if (Burst_Enable) begin `FF(rr_lock_q, rr_lock_d, 1'b0) @@ -348,8 +348,93 @@ module cachepool_cluster assign l2_rsp_rr = '0; end + if (NumTiles > 1) begin : gen_group + cachepool_group #( + .AxiAddrWidth ( AxiAddrWidth ), + .AxiDataWidth ( AxiDataWidth ), + .AxiIdWidthIn ( AxiIdWidthIn ), + .AxiIdWidthOut ( WideIdWidthIn ), + .AxiUserWidth ( AxiUserWidth ), + .BootAddr ( BootAddr ), + .UartAddr ( UartAddr ), + .ClusterPeriphSize ( ClusterPeriphSize ), + .NrCores ( NrCores ), + .TCDMDepth ( TCDMDepth ), + .NrBanks ( NrBanks ), + .ICacheLineWidth ( ICacheLineWidth ), + .ICacheLineCount ( ICacheLineCount ), + .ICacheSets ( ICacheSets ), + .FPUImplementation ( FPUImplementation ), + .NumSpatzFPUs ( NumSpatzFPUs ), + .NumSpatzIPUs ( NumSpatzIPUs ), + .SnitchPMACfg ( SnitchPMACfg ), + .NumIntOutstandingLoads ( NumIntOutstandingLoads ), + .NumIntOutstandingMem ( NumIntOutstandingMem ), + .NumSpatzOutstandingLoads ( NumSpatzOutstandingLoads ), + .axi_in_req_t ( axi_in_req_t ), + .axi_in_resp_t ( axi_in_resp_t ), + .axi_narrow_req_t ( axi_narrow_req_t ), + .axi_narrow_resp_t ( axi_narrow_resp_t ), + .axi_out_req_t ( axi_mst_cache_req_t ), + .axi_out_resp_t ( axi_mst_cache_resp_t ), + .Xdma ( Xdma ), + .DMAAxiReqFifoDepth ( DMAAxiReqFifoDepth ), + .DMAReqFifoDepth ( DMAReqFifoDepth ), + .RegisterOffloadRsp ( RegisterOffloadRsp ), + .RegisterCoreReq ( RegisterCoreReq ), + .RegisterCoreRsp ( RegisterCoreRsp ), + .RegisterTCDMCuts ( RegisterTCDMCuts ), + .RegisterExt ( RegisterExt ), + .XbarLatency ( XbarLatency ), + .MaxMstTrans ( MaxMstTrans ), + .MaxSlvTrans ( MaxSlvTrans ) + ) i_group ( + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .eoc_o ( eoc ), + .impl_i ( impl_i ), + .error_o ( error ), + .debug_req_i ( debug_req_i ), + .meip_i ( meip_i ), + .mtip_i ( mtip_i ), + .msip_i ( msip_i ), + .hart_base_id_i ( hart_base_id_i ), + .cluster_base_addr_i ( cluster_base_addr_i ), + .tile_probe_o ( cluster_probe_o ), + .axi_in_req_i ( axi_in_req_i ), + .axi_in_resp_o ( axi_in_resp_o ), + .axi_narrow_req_o ( axi_out_req ), + .axi_narrow_rsp_i ( axi_out_resp ), + // Cache Refill Ports + .cache_refill_req_o ( cache_refill_req ), + .cache_refill_rsp_i ( cache_refill_rsp ), + .axi_wide_req_o ( axi_tile_req ), + .axi_wide_rsp_i ( axi_tile_rsp ) + ); + + for (genvar t = 0; t < NumTiles; t ++) begin : gen_axi_converter + axi_to_reqrsp #( + .axi_req_t (axi_mst_cache_req_t ), + .axi_rsp_t (axi_mst_cache_resp_t ), + .AddrWidth (AxiAddrWidth ), + .DataWidth (AxiDataWidth ), + .UserWidth ($bits(refill_user_t) ), + .IdWidth (AxiIdWidthIn ), + .BufDepth (NumSpatzOutstandingLoads[0]), + .reqrsp_req_t (cache_trans_req_t ), + .reqrsp_rsp_t (cache_trans_rsp_t ) + ) i_axi2reqrsp ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .busy_o ( ), + .axi_req_i (axi_tile_req [t][TileMem]), + .axi_rsp_o (axi_tile_rsp [t][TileMem]), + .reqrsp_req_o (cache_core_req[t] ), + .reqrsp_rsp_i (cache_core_rsp[t] ) + ); + end - for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles + end else begin : gen_tile cachepool_tile #( .AxiAddrWidth ( AxiAddrWidth ), .AxiDataWidth ( AxiDataWidth ), @@ -392,25 +477,25 @@ module cachepool_cluster ) i_tile ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .eoc_o ( eoc[t] ), + .eoc_o ( eoc ), .impl_i ( impl_i ), - .error_o ( error[t] ), + .error_o ( error ), .debug_req_i ( debug_req_i ), .meip_i ( meip_i ), .mtip_i ( mtip_i ), .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( cluster_probe_o[t] ), - .axi_in_req_i ( axi_in_req_i [t] ), - .axi_in_resp_o ( axi_in_resp_o[t] ), - .axi_out_req_o ( axi_out_req[t] ), - .axi_out_resp_i ( axi_out_resp[t] ), + .tile_probe_o ( cluster_probe_o ), + .axi_in_req_i ( axi_in_req_i [0] ), + .axi_in_resp_o ( axi_in_resp_o[0] ), + .axi_out_req_o ( axi_out_req [0] ), + .axi_out_resp_i ( axi_out_resp [0] ), // Cache Refill Ports - .cache_refill_req_o ( cache_refill_req[t*NumL1CtrlTile+:NumL1CtrlTile]), - .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CtrlTile+:NumL1CtrlTile]), - .axi_wide_req_o ( axi_tile_req [t] ), - .axi_wide_rsp_i ( axi_tile_rsp [t] ) + .cache_refill_req_o ( cache_refill_req ), + .cache_refill_rsp_i ( cache_refill_rsp ), + .axi_wide_req_o ( axi_tile_req[0] ), + .axi_wide_rsp_i ( axi_tile_rsp[0] ) ); axi_to_reqrsp #( @@ -427,13 +512,99 @@ module cachepool_cluster .clk_i (clk_i ), .rst_ni (rst_ni ), .busy_o ( ), - .axi_req_i (axi_tile_req [t][TileMem]), - .axi_rsp_o (axi_tile_rsp [t][TileMem]), - .reqrsp_req_o (cache_core_req[t] ), - .reqrsp_rsp_i (cache_core_rsp[t] ) + .axi_req_i (axi_tile_req [0][TileMem]), + .axi_rsp_o (axi_tile_rsp [0][TileMem]), + .reqrsp_req_o (cache_core_req[0] ), + .reqrsp_rsp_i (cache_core_rsp[0] ) ); end + + // for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles + // cachepool_tile #( + // .AxiAddrWidth ( AxiAddrWidth ), + // .AxiDataWidth ( AxiDataWidth ), + // .AxiIdWidthIn ( AxiIdWidthIn ), + // .AxiIdWidthOut ( WideIdWidthIn ), + // .AxiUserWidth ( AxiUserWidth ), + // .BootAddr ( BootAddr ), + // .UartAddr ( UartAddr ), + // .ClusterPeriphSize ( ClusterPeriphSize ), + // .NrCores ( NrCores ), + // .TCDMDepth ( TCDMDepth ), + // .NrBanks ( NrBanks ), + // .ICacheLineWidth ( ICacheLineWidth ), + // .ICacheLineCount ( ICacheLineCount ), + // .ICacheSets ( ICacheSets ), + // .FPUImplementation ( FPUImplementation ), + // .NumSpatzFPUs ( NumSpatzFPUs ), + // .NumSpatzIPUs ( NumSpatzIPUs ), + // .SnitchPMACfg ( SnitchPMACfg ), + // .NumIntOutstandingLoads ( NumIntOutstandingLoads ), + // .NumIntOutstandingMem ( NumIntOutstandingMem ), + // .NumSpatzOutstandingLoads ( NumSpatzOutstandingLoads ), + // .axi_in_req_t ( axi_in_req_t ), + // .axi_in_resp_t ( axi_in_resp_t ), + // .axi_narrow_req_t ( axi_narrow_req_t ), + // .axi_narrow_resp_t ( axi_narrow_resp_t ), + // .axi_out_req_t ( axi_mst_cache_req_t ), + // .axi_out_resp_t ( axi_mst_cache_resp_t ), + // .Xdma ( Xdma ), + // .DMAAxiReqFifoDepth ( DMAAxiReqFifoDepth ), + // .DMAReqFifoDepth ( DMAReqFifoDepth ), + // .RegisterOffloadRsp ( RegisterOffloadRsp ), + // .RegisterCoreReq ( RegisterCoreReq ), + // .RegisterCoreRsp ( RegisterCoreRsp ), + // .RegisterTCDMCuts ( RegisterTCDMCuts ), + // .RegisterExt ( RegisterExt ), + // .XbarLatency ( XbarLatency ), + // .MaxMstTrans ( MaxMstTrans ), + // .MaxSlvTrans ( MaxSlvTrans ) + // ) i_tile ( + // .clk_i ( clk_i ), + // .rst_ni ( rst_ni ), + // .eoc_o ( eoc[t] ), + // .impl_i ( impl_i ), + // .error_o ( error[t] ), + // .debug_req_i ( debug_req_i ), + // .meip_i ( meip_i ), + // .mtip_i ( mtip_i ), + // .msip_i ( msip_i ), + // .hart_base_id_i ( hart_base_id_i ), + // .cluster_base_addr_i ( cluster_base_addr_i ), + // .tile_probe_o ( cluster_probe_o[t] ), + // .axi_in_req_i ( axi_in_req_i [t] ), + // .axi_in_resp_o ( axi_in_resp_o[t] ), + // .axi_out_req_o ( axi_out_req[t] ), + // .axi_out_resp_i ( axi_out_resp[t] ), + // // Cache Refill Ports + // .cache_refill_req_o ( cache_refill_req[t*NumL1CtrlTile+:NumL1CtrlTile]), + // .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CtrlTile+:NumL1CtrlTile]), + // .axi_wide_req_o ( axi_tile_req [t] ), + // .axi_wide_rsp_i ( axi_tile_rsp [t] ) + // ); + + // axi_to_reqrsp #( + // .axi_req_t (axi_mst_cache_req_t ), + // .axi_rsp_t (axi_mst_cache_resp_t ), + // .AddrWidth (AxiAddrWidth ), + // .DataWidth (AxiDataWidth ), + // .UserWidth ($bits(refill_user_t) ), + // .IdWidth (AxiIdWidthIn ), + // .BufDepth (NumSpatzOutstandingLoads[0]), + // .reqrsp_req_t (cache_trans_req_t ), + // .reqrsp_rsp_t (cache_trans_rsp_t ) + // ) i_axi2reqrsp ( + // .clk_i (clk_i ), + // .rst_ni (rst_ni ), + // .busy_o ( ), + // .axi_req_i (axi_tile_req [t][TileMem]), + // .axi_rsp_o (axi_tile_rsp [t][TileMem]), + // .reqrsp_req_o (cache_core_req[t] ), + // .reqrsp_rsp_i (cache_core_rsp[t] ) + // ); + // end + for (genvar t = 0; t < NumTiles; t++) begin // Cache Bypass requests always_comb begin diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index d6fbd18..2776c5b 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -115,6 +115,9 @@ package cachepool_pkg; * TILE SETTINGS * *********************/ + // How many cores for each tile? + localparam int unsigned NumCoresTIle = NumCores / NumTiles; + // How many remote ports for each tile? Currently needs to be 0 or 1. localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; @@ -158,7 +161,6 @@ package cachepool_pkg; localparam fpu_implementation_t FPUImplementation [NumCores] = '{default: FPUImplementation_Core}; - //////////////////// // CACHEPOOL L1 // //////////////////// From b8959381b5a0ce802cdd75920f10e0cfefa42c3d Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Thu, 11 Dec 2025 09:38:10 +0100 Subject: [PATCH 05/23] WIP: [SRC] multi-tile support. --- config/cachepool_fpu_512.mk | 2 + config/config.mk | 2 +- hardware/src/cachepool_cluster.sv | 199 +++++---------- hardware/src/cachepool_group.sv | 165 ++++++------ hardware/src/cachepool_pkg.sv | 78 ++++-- hardware/src/cachepool_tile.sv | 155 ++++++------ hardware/src/tcdm_cache_interco.sv | 6 +- hardware/tb/cachepool_cluster_wrapper.sv | 18 +- sim/scripts/vsim_core.tcl | 308 ++++++++++++----------- sim/scripts/vsim_tile.tcl | 34 +-- sim/scripts/vsim_wave.tcl | 34 ++- sim/scripts/vsim_wave_single_tile.tcl | 34 +++ 12 files changed, 537 insertions(+), 498 deletions(-) create mode 100644 sim/scripts/vsim_wave_single_tile.tcl diff --git a/config/cachepool_fpu_512.mk b/config/cachepool_fpu_512.mk index e0274ca..c922ef3 100644 --- a/config/cachepool_fpu_512.mk +++ b/config/cachepool_fpu_512.mk @@ -20,6 +20,8 @@ data_width ?= 32 # Core addrwidth addr_width ?= 32 +num_remote_ports_per_tile ?= 1 + ###################### ## CachePool Tile ## diff --git a/config/config.mk b/config/config.mk index e1ddbea..b5429aa 100644 --- a/config/config.mk +++ b/config/config.mk @@ -29,7 +29,7 @@ include $(CACHEPOOL_DIR)/config/$(config).mk # Number of tiles num_tiles ?= 1 -num_remote_ports_per_tile ?= 0 +num_remote_ports_per_tile ?= 1 # Number of cores num_cores ?= 4 diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index aa86aa8..aa6bd74 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -61,7 +61,7 @@ module cachepool_cluster parameter snitch_pma_t SnitchPMACfg = '{default: 0}, /// # Core-global parameters /// FPU configuration. - parameter fpu_implementation_t FPUImplementation [NrCores] = '{default: fpu_implementation_t'(0)}, + parameter fpu_implementation_t FPUImplementation = '0, /// Spatz FPU/IPU Configuration parameter int unsigned NumSpatzFPUs = 4, parameter int unsigned NumSpatzIPUs = 1, @@ -69,11 +69,11 @@ module cachepool_cluster parameter bit [NrCores-1:0] Xdma = '{default: '0}, /// # Per-core parameters /// Per-core integer outstanding loads - parameter int unsigned NumIntOutstandingLoads [NrCores] = '{default: '0}, + parameter int unsigned NumIntOutstandingLoads = 0, /// Per-core integer outstanding memory operations (load and stores) - parameter int unsigned NumIntOutstandingMem [NrCores] = '{default: '0}, + parameter int unsigned NumIntOutstandingMem = 0, /// Per-core Spatz outstanding loads - parameter int unsigned NumSpatzOutstandingLoads [NrCores] = '{default: '0}, + parameter int unsigned NumSpatzOutstandingLoads = 0, /// ## Timing Tuning Parameters /// Insert Pipeline registers into off-loading path (response) parameter bit RegisterOffloadRsp = 1'b0, @@ -138,10 +138,10 @@ module cachepool_cluster input logic [AxiAddrWidth-1:0] cluster_base_addr_i, /// Per-cluster probe on the cluster status. Can be written by the cores to indicate /// to the overall system that the cluster is executing something. - output logic [NumTiles-1:0] cluster_probe_o, + output logic cluster_probe_o, /// AXI Core cluster in-port. - input axi_in_req_t [NumTiles-1:0] axi_in_req_i, - output axi_in_resp_t [NumTiles-1:0] axi_in_resp_o, + input axi_in_req_t axi_in_req_i, + output axi_in_resp_t axi_in_resp_o, /// AXI Narrow out-port (UART) output axi_narrow_req_t axi_narrow_req_o, input axi_narrow_resp_t axi_narrow_resp_i, @@ -220,8 +220,8 @@ module cachepool_cluster // 1. AXI axi_mst_cache_req_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_req; axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; - axi_slv_cache_req_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_req; - axi_slv_cache_resp_t [NumTiles*NumClusterSlv-1 :0] wide_axi_slv_rsp; + axi_slv_cache_req_t [NumClusterSlv-1 :0] wide_axi_slv_req; + axi_slv_cache_resp_t [NumClusterSlv-1 :0] wide_axi_slv_rsp; axi_narrow_req_t [NumTiles-1 :0] axi_out_req; axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; @@ -233,10 +233,6 @@ module cachepool_cluster // CachePool Tile // --------------- - logic [NumTiles-1:0] error, eoc; - assign error_o = |error; - assign eoc_o = |eoc; - cache_trans_req_t [NumL1CacheCtrl-1 :0] cache_refill_req; cache_trans_rsp_t [NumL1CacheCtrl-1 :0] cache_refill_rsp; @@ -348,6 +344,9 @@ module cachepool_cluster assign l2_rsp_rr = '0; end + logic [NumTiles-1: 0] group_probe; + assign cluster_probe_o = |group_probe; + if (NumTiles > 1) begin : gen_group cachepool_group #( .AxiAddrWidth ( AxiAddrWidth ), @@ -391,18 +390,18 @@ module cachepool_cluster ) i_group ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .eoc_o ( eoc ), + .eoc_o ( eoc_o ), .impl_i ( impl_i ), - .error_o ( error ), + .error_o ( error_o ), .debug_req_i ( debug_req_i ), .meip_i ( meip_i ), .mtip_i ( mtip_i ), .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( cluster_probe_o ), + .group_probe_o ( group_probe ), .axi_in_req_i ( axi_in_req_i ), - .axi_in_resp_o ( axi_in_resp_o ), + .axi_in_rsp_o ( axi_in_resp_o ), .axi_narrow_req_o ( axi_out_req ), .axi_narrow_rsp_i ( axi_out_resp ), // Cache Refill Ports @@ -420,7 +419,7 @@ module cachepool_cluster .DataWidth (AxiDataWidth ), .UserWidth ($bits(refill_user_t) ), .IdWidth (AxiIdWidthIn ), - .BufDepth (NumSpatzOutstandingLoads[0]), + .BufDepth (NumSpatzOutstandingLoads ), .reqrsp_req_t (cache_trans_req_t ), .reqrsp_rsp_t (cache_trans_rsp_t ) ) i_axi2reqrsp ( @@ -477,20 +476,26 @@ module cachepool_cluster ) i_tile ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .eoc_o ( eoc ), + .eoc_o ( eoc_o ), .impl_i ( impl_i ), - .error_o ( error ), + .error_o ( error_o ), .debug_req_i ( debug_req_i ), .meip_i ( meip_i ), .mtip_i ( mtip_i ), .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( cluster_probe_o ), - .axi_in_req_i ( axi_in_req_i [0] ), - .axi_in_resp_o ( axi_in_resp_o[0] ), + .tile_probe_o ( group_probe ), + .axi_in_req_i ( axi_in_req_i ), + .axi_in_resp_o ( axi_in_resp_o ), .axi_out_req_o ( axi_out_req [0] ), .axi_out_resp_i ( axi_out_resp [0] ), + // Remote Ports (not used) + .remote_req_o ( ), + .remote_req_dst_o ( ), + .remote_rsp_i ( '0 ), + .remote_req_i ( '0 ), + .remote_rsp_o ( ), // Cache Refill Ports .cache_refill_req_o ( cache_refill_req ), .cache_refill_rsp_i ( cache_refill_rsp ), @@ -505,7 +510,7 @@ module cachepool_cluster .DataWidth (AxiDataWidth ), .UserWidth ($bits(refill_user_t) ), .IdWidth (AxiIdWidthIn ), - .BufDepth (NumSpatzOutstandingLoads[0]), + .BufDepth (NumSpatzOutstandingLoads ), .reqrsp_req_t (cache_trans_req_t ), .reqrsp_rsp_t (cache_trans_rsp_t ) ) i_axi2reqrsp ( @@ -520,118 +525,35 @@ module cachepool_cluster end - // for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles - // cachepool_tile #( - // .AxiAddrWidth ( AxiAddrWidth ), - // .AxiDataWidth ( AxiDataWidth ), - // .AxiIdWidthIn ( AxiIdWidthIn ), - // .AxiIdWidthOut ( WideIdWidthIn ), - // .AxiUserWidth ( AxiUserWidth ), - // .BootAddr ( BootAddr ), - // .UartAddr ( UartAddr ), - // .ClusterPeriphSize ( ClusterPeriphSize ), - // .NrCores ( NrCores ), - // .TCDMDepth ( TCDMDepth ), - // .NrBanks ( NrBanks ), - // .ICacheLineWidth ( ICacheLineWidth ), - // .ICacheLineCount ( ICacheLineCount ), - // .ICacheSets ( ICacheSets ), - // .FPUImplementation ( FPUImplementation ), - // .NumSpatzFPUs ( NumSpatzFPUs ), - // .NumSpatzIPUs ( NumSpatzIPUs ), - // .SnitchPMACfg ( SnitchPMACfg ), - // .NumIntOutstandingLoads ( NumIntOutstandingLoads ), - // .NumIntOutstandingMem ( NumIntOutstandingMem ), - // .NumSpatzOutstandingLoads ( NumSpatzOutstandingLoads ), - // .axi_in_req_t ( axi_in_req_t ), - // .axi_in_resp_t ( axi_in_resp_t ), - // .axi_narrow_req_t ( axi_narrow_req_t ), - // .axi_narrow_resp_t ( axi_narrow_resp_t ), - // .axi_out_req_t ( axi_mst_cache_req_t ), - // .axi_out_resp_t ( axi_mst_cache_resp_t ), - // .Xdma ( Xdma ), - // .DMAAxiReqFifoDepth ( DMAAxiReqFifoDepth ), - // .DMAReqFifoDepth ( DMAReqFifoDepth ), - // .RegisterOffloadRsp ( RegisterOffloadRsp ), - // .RegisterCoreReq ( RegisterCoreReq ), - // .RegisterCoreRsp ( RegisterCoreRsp ), - // .RegisterTCDMCuts ( RegisterTCDMCuts ), - // .RegisterExt ( RegisterExt ), - // .XbarLatency ( XbarLatency ), - // .MaxMstTrans ( MaxMstTrans ), - // .MaxSlvTrans ( MaxSlvTrans ) - // ) i_tile ( - // .clk_i ( clk_i ), - // .rst_ni ( rst_ni ), - // .eoc_o ( eoc[t] ), - // .impl_i ( impl_i ), - // .error_o ( error[t] ), - // .debug_req_i ( debug_req_i ), - // .meip_i ( meip_i ), - // .mtip_i ( mtip_i ), - // .msip_i ( msip_i ), - // .hart_base_id_i ( hart_base_id_i ), - // .cluster_base_addr_i ( cluster_base_addr_i ), - // .tile_probe_o ( cluster_probe_o[t] ), - // .axi_in_req_i ( axi_in_req_i [t] ), - // .axi_in_resp_o ( axi_in_resp_o[t] ), - // .axi_out_req_o ( axi_out_req[t] ), - // .axi_out_resp_i ( axi_out_resp[t] ), - // // Cache Refill Ports - // .cache_refill_req_o ( cache_refill_req[t*NumL1CtrlTile+:NumL1CtrlTile]), - // .cache_refill_rsp_i ( cache_refill_rsp[t*NumL1CtrlTile+:NumL1CtrlTile]), - // .axi_wide_req_o ( axi_tile_req [t] ), - // .axi_wide_rsp_i ( axi_tile_rsp [t] ) - // ); - - // axi_to_reqrsp #( - // .axi_req_t (axi_mst_cache_req_t ), - // .axi_rsp_t (axi_mst_cache_resp_t ), - // .AddrWidth (AxiAddrWidth ), - // .DataWidth (AxiDataWidth ), - // .UserWidth ($bits(refill_user_t) ), - // .IdWidth (AxiIdWidthIn ), - // .BufDepth (NumSpatzOutstandingLoads[0]), - // .reqrsp_req_t (cache_trans_req_t ), - // .reqrsp_rsp_t (cache_trans_rsp_t ) - // ) i_axi2reqrsp ( - // .clk_i (clk_i ), - // .rst_ni (rst_ni ), - // .busy_o ( ), - // .axi_req_i (axi_tile_req [t][TileMem]), - // .axi_rsp_o (axi_tile_rsp [t][TileMem]), - // .reqrsp_req_o (cache_core_req[t] ), - // .reqrsp_rsp_i (cache_core_rsp[t] ) - // ); - // end - - for (genvar t = 0; t < NumTiles; t++) begin - // Cache Bypass requests - always_comb begin - tile_req_chan [t*NumTiles] = cache_core_req[t].q; + // for (genvar t = 0; t < NumTiles; t++) begin + // Cache Bypass requests + always_comb begin + for (int t = 0; t < NumTiles; t++) begin + tile_req_chan[t] = cache_core_req[t].q; // Scrmable address - tile_req_chan [t*NumTiles].addr = scrambleAddr(cache_core_req[t].q.addr); - tile_req_valid[t*NumTiles] = cache_core_req[t].q_valid; - cache_core_rsp[t].q_ready = tile_req_ready[t*NumTiles]; - - cache_core_rsp[t].p = tile_rsp_chan [t*NumTiles]; - cache_core_rsp[t].p_valid = tile_rsp_valid[t*NumTiles]; - tile_rsp_ready[t*NumTiles] = cache_core_req[t].p_ready; - - // Normal Cache requests - for (int p = 0; p < NumL1CtrlTile; p++) begin - tile_req_chan [t*NumTiles+p+1] = cache_refill_req[t*NumTiles+p].q; - // Scramble address - tile_req_chan [t*NumTiles+p+1].addr = scrambleAddr(cache_refill_req[t*NumTiles+p].q.addr); - tile_req_valid[t*NumTiles+p+1] = cache_refill_req[t*NumTiles+p].q_valid; - cache_refill_rsp[t*NumTiles+p].q_ready = tile_req_ready[t*NumTiles+p+1]; - - cache_refill_rsp[t*NumTiles+p].p = tile_rsp_chan [t*NumTiles+p+1]; - cache_refill_rsp[t*NumTiles+p].p_valid = tile_rsp_valid[t*NumTiles+p+1]; - tile_rsp_ready[t*NumTiles+p+1] = cache_refill_req[t*NumTiles+p].p_ready; - end + tile_req_chan[t].addr = scrambleAddr(cache_core_req[t].q.addr); + tile_req_valid[t] = cache_core_req[t].q_valid; + cache_core_rsp[t].q_ready = tile_req_ready[t]; + + cache_core_rsp[t].p = tile_rsp_chan ; + cache_core_rsp[t].p_valid = tile_rsp_valid; + tile_rsp_ready[t] = cache_core_req[t].p_ready; + end + + // Normal Cache requests + for (int p = 0; p < NumL1CtrlTile*NumTiles; p++) begin + tile_req_chan [p+NumTiles] = cache_refill_req[p].q; + // Scramble address + tile_req_chan [p+NumTiles].addr = scrambleAddr(cache_refill_req[p].q.addr); + tile_req_valid[p+NumTiles] = cache_refill_req[p].q_valid; + cache_refill_rsp[p].q_ready = tile_req_ready[p+NumTiles]; + + cache_refill_rsp[p].p = tile_rsp_chan [p+NumTiles]; + cache_refill_rsp[p].p_valid = tile_rsp_valid[p+NumTiles]; + tile_rsp_ready[p+NumTiles] = cache_refill_req[p].p_ready; end end + // end typedef struct packed { int unsigned idx; @@ -740,7 +662,7 @@ module cachepool_cluster for (genvar ch = 0; ch < NumClusterSlv; ch ++) begin : gen_output_axi reqrsp_to_axi #( - .MaxTrans (NumSpatzOutstandingLoads[0]), + .MaxTrans (NumSpatzOutstandingLoads ), .ID ('0 ), .EnBurst (1 ), .ShuffleId (1 ), @@ -796,6 +718,15 @@ module cachepool_cluster // TODO: Add MUX for multi-Tile // BootROM + // axi_mux #( + + // ) i_axi_bootrom_mux ( + + // ) + + if (NumTiles > 1) + assign axi_tile_rsp[1][TileBootROM] = '0; + axi_to_reg #( .ADDR_WIDTH (AxiAddrWidth ), .DATA_WIDTH (AxiDataWidth ), diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 15f6a5e..41d56ee 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -23,6 +23,7 @@ module cachepool_group import cachepool_pkg::*; import spatz_pkg::*; import fpnew_pkg::fpu_implementation_t; + import snitch_pma_pkg::snitch_pma_t; #( /// Width of physical address. parameter int unsigned AxiAddrWidth = 48, @@ -56,6 +57,7 @@ module cachepool_group parameter int unsigned ICacheLineCount = 0, /// Number of icache sets. parameter int unsigned ICacheSets = 0, + parameter snitch_pma_t SnitchPMACfg = '{default: 0}, /// # Core-global parameters /// FPU configuration. parameter fpu_implementation_t FPUImplementation = fpu_implementation_t'(0), @@ -135,10 +137,10 @@ module cachepool_group input logic [AxiAddrWidth-1:0] cluster_base_addr_i, /// Per-cluster probe on the cluster status. Can be written by the cores to indicate /// to the overall system that the cluster is executing something. - output logic [NumTiles-1:0] cluster_probe_o, + output logic [NumTiles-1:0] group_probe_o, /// AXI Core cluster in-port. - input axi_in_req_t [NumTiles-1:0] axi_in_req_i, - output axi_in_resp_t [NumTiles-1:0] axi_in_rsp_o, + input axi_in_req_t axi_in_req_i, + output axi_in_resp_t axi_in_rsp_o, /// AXI Narrow out-port (UART) output axi_narrow_req_t [NumTiles-1:0] axi_narrow_req_o, input axi_narrow_resp_t [NumTiles-1:0] axi_narrow_rsp_i, @@ -147,8 +149,8 @@ module cachepool_group input axi_out_resp_t [NumTiles*NumTileWideAxi-1:0] axi_wide_rsp_i, /// Cache refill ports - output cache_trans_req_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_req_o, - input cache_trans_rsp_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_rsp_i, + output cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req_o, + input cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp_i, /// SRAM Configuration: L1D Data + L1D Tag + L1D FIFO + L1I Data + L1I Tag input impl_in_t [NrSramCfg-1:0] impl_i, @@ -176,7 +178,7 @@ module cachepool_group localparam int unsigned NrNarrowMasters = 2; localparam int unsigned WideIdWidthOut = AxiIdWidthOut; - localparam int unsigned WideIdWidthIn = WideIdWidthOut - $clog2(NumClusterMst); + localparam int unsigned WideIdWidthIn = AxiIdWidthOut; // -------- @@ -202,20 +204,14 @@ module cachepool_group `SNITCH_VM_TYPEDEF(AxiAddrWidth) - // ---------------- - // Wire Definitions - // ---------------- - // 1. AXI - axi_mst_cache_req_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_req; - axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; - axi_slv_cache_req_t [NumTiles*NumTileWideAxi-1:0] wide_axi_slv_req; - axi_slv_cache_resp_t [NumTiles*NumTileWideAxi-1:0] wide_axi_slv_rsp; - axi_narrow_req_t [NumTiles-1 :0] axi_out_req; - axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; - - // 2. BootROM - reg_cache_req_t bootrom_reg_req; - reg_cache_rsp_t bootrom_reg_rsp; + axi_in_req_t [NumTiles-1:0] axi_in_req; + axi_in_resp_t [NumTiles-1:0] axi_in_rsp; + + // TODO: How to wire control signal here? Broadcast? + assign axi_in_rsp_o = axi_in_rsp[0]; + assign axi_in_req[0] = axi_in_req_i; + + // --------------- // CachePool Tile @@ -225,8 +221,8 @@ module cachepool_group assign error_o = |error; assign eoc_o = |eoc; - cache_trans_req_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_req; - cache_trans_rsp_t [NumTiles*NumL1CacheCtrl-1:0] cache_refill_rsp; + cache_trans_req_t [NumTiles-1:0][NumL1CtrlTile-1:0] cache_refill_req; + cache_trans_rsp_t [NumTiles-1:0][NumL1CtrlTile-1:0] cache_refill_rsp; cache_trans_req_t [NumTiles-1 :0] cache_core_req; cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; @@ -236,27 +232,32 @@ module cachepool_group logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; + assign cache_refill_req_o = cache_refill_req[0]; + assign cache_refill_rsp = {'0, cache_refill_rsp_i}; + // Tile remote access signals // In/Out relative to the tile (out--leave a tile; in--enter a tile) - tcdm_req_t [NumTiles-1:0] tile_remote_out_req; - tcdm_rsp_t [NumTiles-1:0] tile_remote_out_rsp; - tcdm_req_chan_t [NumTiles-1:0] tile_remote_out_req_chan; - logic [NumTiles-1:0] tile_remote_out_req_valid, tile_remote_out_req_ready; - tcdm_rsp_chan_t [NumTiles-1:0] tile_remote_out_rsp_chan; - logic [NumTiles-1:0] tile_remote_out_rsp_valid, tile_remote_out_rsp_ready; - - tcdm_req_t [NumTiles-1:0] tile_remote_in_req; - tcdm_rsp_t [NumTiles-1:0] tile_remote_in_rsp; - tcdm_req_chan_t [NumTiles-1:0] tile_remote_in_req_chan; - logic [NumTiles-1:0] tile_remote_in_req_valid, tile_remote_in_req_ready; - tcdm_rsp_chan_t [NumTiles-1:0] tile_remote_in_rsp_chan; - logic [NumTiles-1:0] tile_remote_in_rsp_valid, tile_remote_in_rsp_ready; + tcdm_req_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_out_req; + tcdm_rsp_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_out_rsp; + tcdm_req_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_req_chan; + logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_req_valid, tile_remote_out_req_ready; + tcdm_rsp_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_rsp_chan; + logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_rsp_valid, tile_remote_out_rsp_ready; + + tcdm_req_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_in_req; + tcdm_rsp_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_in_rsp; + tcdm_req_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_req_chan; + logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_req_valid, tile_remote_in_req_ready; + tcdm_rsp_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_chan; + logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_valid, tile_remote_in_rsp_ready; // Symmetric xbar, in/out select types are the same - typedef logic [$clog2(NumTiles)-1 :0] remote_tile_sel_t; - remote_tile_sel_t [NumTiles-1:0] remote_out_sel, remote_in_sel; + remote_tile_sel_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] remote_out_sel_tile, remote_in_sel_tile; + remote_tile_sel_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] remote_out_sel_xbar, remote_in_sel_xbar; + + for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles cachepool_tile #( @@ -268,7 +269,7 @@ module cachepool_group .BootAddr ( BootAddr ), .UartAddr ( UartAddr ), .ClusterPeriphSize ( ClusterPeriphSize ), - .NrCores ( NumCoresTIle ), + .NrCores ( NumCoresTile ), .TCDMDepth ( TCDMDepth ), .NrBanks ( NrBanks ), .ICacheLineWidth ( ICacheLineWidth ), @@ -304,68 +305,76 @@ module cachepool_group .eoc_o ( eoc[t] ), .impl_i ( impl_i ), .error_o ( error[t] ), - .debug_req_i ( debug_req_i ), - .meip_i ( meip_i ), - .mtip_i ( mtip_i ), - .msip_i ( msip_i ), + // TODO: remove hardcode + .debug_req_i ( debug_req_i[t+:4] ), + .meip_i ( meip_i[t+:4] ), + .mtip_i ( mtip_i[t+:4] ), + .msip_i ( msip_i[t+:4] ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( cluster_probe_o[t] ), + .tile_probe_o ( group_probe_o[t] ), // SoC in for control - .axi_in_req_i ( axi_in_req_i [t] ), - .axi_in_resp_o ( axi_in_rsp_o[t] ), + .axi_in_req_i ( axi_in_req[t] ), + .axi_in_resp_o ( axi_in_rsp[t] ), // AXI out for UART .axi_out_req_o ( axi_narrow_req_o[t] ), .axi_out_resp_i ( axi_narrow_rsp_i[t] ), // Remote Access Ports .remote_req_o ( tile_remote_out_req[t] ), - .remote_req_dst_o ( remote_out_sel[t] ), + .remote_req_dst_o ( remote_out_sel_tile[t] ), .remote_rsp_i ( tile_remote_out_rsp[t] ), .remote_req_i ( tile_remote_in_req [t] ), .remote_rsp_o ( tile_remote_in_rsp [t] ), // Cache Refill Ports - .cache_refill_req_o ( cache_refill_req_o[t*NumL1CacheCtrl+:NumL1CacheCtrl]), - .cache_refill_rsp_i ( cache_refill_rsp_i[t*NumL1CacheCtrl+:NumL1CacheCtrl]), + .cache_refill_req_o ( cache_refill_req[t]), + .cache_refill_rsp_i ( cache_refill_rsp[t]), // BootROM / Core-side Cache Bypass .axi_wide_req_o ( axi_wide_req_o [t*NumTileWideAxi+:NumTileWideAxi]), .axi_wide_rsp_i ( axi_wide_rsp_i [t*NumTileWideAxi+:NumTileWideAxi]) ); end + assign tile_remote_in_req = '0; + assign tile_remote_out_rsp = '0; + // ------------ // Remote XBar // ------------ - // Decide which tile to go - reqrsp_xbar #( - .NumInp (NumTiles ), - .NumOut (NumTiles ), - .PipeReg (1'b1 ), - .ExtReqPrio (1'b0 ), - .ExtRspPrio (1'b0 ), - .tcdm_req_chan_t (tcdm_req_chan_t ), - .tcdm_rsp_chan_t (tcdm_rsp_chan_t ) - ) i_tile_remote_xbar ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .slv_req_i (tile_remote_out_req_chan ), - .slv_req_valid_i (tile_remote_out_req_valid ), - .slv_req_ready_o (tile_remote_out_req_ready ), - .slv_rsp_o (tile_remote_out_rsp_chan ), - .slv_rsp_valid_o (tile_remote_out_rsp_valid ), - .slv_rsp_ready_i (tile_remote_out_rsp_ready ), - .slv_sel_i (remote_out_sel ), - .slv_rr_i ('0 ), - .slv_selected_o (/*selection info in cid*/ ), - .mst_req_o (tile_remote_in_req_chan ), - .mst_req_valid_o (tile_remote_in_req_valid ), - .mst_req_ready_i (tile_remote_in_req_ready ), - .mst_rsp_i (tile_remote_in_rsp_chan ), - .mst_rsp_valid_i (tile_remote_in_rsp_valid ), - .mst_rsp_ready_o (tile_remote_in_rsp_ready ), - .mst_rr_i ('0 ), - .mst_sel_i (remote_in_sel ) - ); + for (genvar p = 0; p < NrTCDMPortsPerCore; p++) begin : gen_remote_tile_xbar + + // Decide which tile to go + reqrsp_xbar #( + .NumInp (NumTiles ), + .NumOut (NumTiles ), + .PipeReg (1'b1 ), + .ExtReqPrio (1'b0 ), + .ExtRspPrio (1'b0 ), + .tcdm_req_chan_t (tcdm_req_chan_t ), + .tcdm_rsp_chan_t (tcdm_rsp_chan_t ) + ) i_tile_remote_xbar ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .slv_req_i (tile_remote_out_req_chan [p] ), + .slv_req_valid_i (tile_remote_out_req_valid[p] ), + .slv_req_ready_o (tile_remote_out_req_ready[p] ), + .slv_rsp_o (tile_remote_out_rsp_chan [p] ), + .slv_rsp_valid_o (tile_remote_out_rsp_valid[p] ), + .slv_rsp_ready_i (tile_remote_out_rsp_ready[p] ), + .slv_sel_i (remote_out_sel_xbar [p] ), + .slv_rr_i ('0 ), + .slv_selected_o (/*selection info in cid*/ ), + .mst_req_o (tile_remote_in_req_chan [p] ), + .mst_req_valid_o (tile_remote_in_req_valid [p] ), + .mst_req_ready_i (tile_remote_in_req_ready [p] ), + .mst_rsp_i (tile_remote_in_rsp_chan [p] ), + .mst_rsp_valid_i (tile_remote_in_rsp_valid [p] ), + .mst_rsp_ready_o (tile_remote_in_rsp_ready [p] ), + .mst_rr_i ('0 ), + .mst_sel_i (remote_in_sel_xbar [p] ) + ); + + end endmodule diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 2776c5b..bc87512 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -23,6 +23,15 @@ package cachepool_pkg; // AXI // /////////// + // At tile level, we only has three sources: SoCIn, Cores (muxed to one), ICache + // Therefore, in theory only two bits are required for each Tile + + localparam int unsigned TileAxiIdWidth = 3; + // For better out-of-order behavior, each tile needs a distinguished ID => Additional log2(NumTiles) bits + localparam int unsigned GroupAxiIdWidth = $clog2(NumTiles); + + localparam int unsigned ClusterAxiIdWidth = TileAxiIdWidth + GroupAxiIdWidth + 3; + // AXI Data Width localparam int unsigned SpatzAxiDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; localparam int unsigned SpatzAxiStrbWidth = SpatzAxiDataWidth / 8; @@ -30,37 +39,63 @@ package cachepool_pkg; // AXI Address Width localparam int unsigned SpatzAxiAddrWidth = `ifdef ADDR_WIDTH `ADDR_WIDTH `else 0 `endif; // AXI ID Width - localparam int unsigned SpatzAxiIdInWidth = 6; - localparam int unsigned SpatzAxiIdOutWidth = 7; + // localparam int unsigned SpatzAxiIdInWidth = 6; + // localparam int unsigned SpatzAxiIdOutWidth = 7; + + // legacy naming + localparam int unsigned SpatzAxiIdInWidth = ClusterAxiIdWidth; + localparam int unsigned SpatzAxiIdOutWidth = ClusterAxiIdWidth + 1; // Fixed AXI ID width for IWC // Add 3 because of cache controller (second-level xbar, 4 cache, 1 old port) - localparam int unsigned IwcAxiIdOutWidth = 3 + $clog2(4) + 3; + // localparam int unsigned IwcAxiIdOutWidth = 3 + $clog2(4) + 3; + localparam int unsigned IwcAxiIdOutWidth = SpatzAxiIdOutWidth + 1; // AXI User Width localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; - typedef logic [SpatzAxiDataWidth-1:0] axi_data_t; - typedef logic [SpatzAxiStrbWidth-1:0] axi_strb_t; - typedef logic [SpatzAxiAddrWidth-1:0] axi_addr_t; + typedef logic [SpatzAxiDataWidth-1:0] axi_wide_data_t; + typedef logic [SpatzAxiStrbWidth-1:0] axi_wide_strb_t; + typedef logic [SpatzAxiNarrowDataWidth-1:0] axi_narrow_data_t; + typedef logic [SpatzAxiNarrowDataWidth/8-1:0] axi_narrow_strb_t; + typedef logic [SpatzAxiAddrWidth-1:0] axi_addr_t; typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; typedef logic [SpatzAxiUserWidth-1:0] axi_user_t; + // typedef logic [ClusterAxiIdWidth-1:0] axi_id_in_t; + // typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; + + // typedef logic [L1TagDataWidth-1:0] tag_data_t; + // typedef logic [AxiDataWidth-1:0] data_dma_t; + // typedef logic [AxiDataWidth/8-1:0] strb_dma_t; + // typedef logic [NarrowIdWidthIn-1:0] id_mst_t; + // typedef logic [NarrowIdWidthOut-1:0] id_slv_t; + // typedef logic [WideIdWidthIn-1:0] id_dma_mst_t; + // typedef logic [WideIdWidthOut-1:0] id_dma_slv_t; + // typedef logic [WideIdWidthIn-$clog2(NumL1CtrlTile)-1:0] id_dcache_mst_t; + + + // `AXI_TYPEDEF_ALL(axi_mst, axi_addr_t, id_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + // `AXI_TYPEDEF_ALL(axi_slv, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + // `AXI_TYPEDEF_ALL(axi_mst_tile_wide, axi_addr_t, id_dma_mst_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + // `AXI_TYPEDEF_ALL(axi_slv_tile_wide, axi_addr_t, id_dma_slv_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + // -------- // Typedefs // -------- typedef logic [6:0] id_slv_t; + // typedef logic [ClusterAxiIdWidth-1:0] id_slv_t; // Regbus peripherals. - `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, id_slv_t, logic [SpatzAxiNarrowDataWidth-1:0], logic [(SpatzAxiNarrowDataWidth/8)-1:0], axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, logic [SpatzAxiNarrowDataWidth-1:0], logic [(SpatzAxiNarrowDataWidth/8)-1:0], axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_data_t, axi_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) typedef logic [IwcAxiIdOutWidth-1:0] axi_id_out_iwc_t; - `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_data_t, axi_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) ////////////////// @@ -116,16 +151,20 @@ package cachepool_pkg; *********************/ // How many cores for each tile? - localparam int unsigned NumCoresTIle = NumCores / NumTiles; + localparam int unsigned NumCoresTile = NumCores / NumTiles; // How many remote ports for each tile? Currently needs to be 0 or 1. - localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + // localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + localparam int unsigned NumRemotePortTile = 1; + typedef logic [$clog2(NumTiles)-1 :0] remote_tile_sel_t; // How many cores within a tile? This is used to select the ports within a tile. - localparam int unsigned NumCoresTile = `ifdef NUM_CORES_PER_TILE `NUM_CORES_PER_TILE `else 0 `endif; localparam int unsigned LogNumCoresTile = $clog2(NumCoresTile); + localparam int unsigned NrTCDMPortsPerCore = 5; + + ///////////////// // SPATZ CORE // ///////////////// @@ -133,9 +172,9 @@ package cachepool_pkg; localparam int unsigned NFpu = `ifdef SPATZ_NUM_FPU `SPATZ_NUM_FPU `else 0 `endif; localparam int unsigned NIpu = `ifdef SPATZ_NUM_IPU `SPATZ_NUM_IPU `else 1 `endif; - localparam int unsigned NumIntOutstandingLoads [NumCores] = '{default: `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif}; - localparam int unsigned NumIntOutstandingMem [NumCores] = '{default: `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif}; - localparam int unsigned NumSpatzOutstandingLoads [NumCores] = '{default: `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif}; + localparam int unsigned NumIntOutstandingLoads = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; + localparam int unsigned NumIntOutstandingMem = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; + localparam int unsigned NumSpatzOutstandingLoads = `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif; localparam int unsigned NumAxiMaxTrans = 32; @@ -159,7 +198,6 @@ package cachepool_pkg; PipeConfig: BEFORE }; - localparam fpu_implementation_t FPUImplementation [NumCores] = '{default: FPUImplementation_Core}; //////////////////// // CACHEPOOL L1 // @@ -212,7 +250,7 @@ package cachepool_pkg; localparam int unsigned Burst_Enable = (L1LineWidth > RefillDataWidth); - typedef logic [$clog2(NumSpatzOutstandingLoads[0])-1:0] reqid_t; + typedef logic [$clog2(NumSpatzOutstandingLoads)-1:0] reqid_t; typedef logic [$clog2(L1CacheWayEntry)-1:0] cache_ways_entry_ptr_t; typedef logic [$clog2(L1AssoPerCtrl)-1:0] way_ptr_t; @@ -290,7 +328,7 @@ package cachepool_pkg; cache_info_t info; } cache_refill_rsp_chan_t; - `REQRSP_TYPEDEF_ALL (cache_trans, axi_addr_t, axi_data_t, axi_strb_t, refill_user_t) + `REQRSP_TYPEDEF_ALL (cache_trans, axi_addr_t, axi_wide_data_t, axi_wide_strb_t, refill_user_t) // TCDM req/rsp bus => core to L1 `TCDM_TYPEDEF_ALL(tcdm, narrow_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) @@ -314,7 +352,7 @@ package cachepool_pkg; // One more for UART? localparam int unsigned NumClusterSlv = NumL2Channel; - `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_data_t, axi_strb_t, refill_user_t) + `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_wide_data_t, axi_wide_strb_t, refill_user_t) // DRAM Configuration localparam int unsigned DramAddr = 32'h8000_0000; diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 3c082d8..3019d6c 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -61,7 +61,7 @@ module cachepool_tile parameter snitch_pma_t SnitchPMACfg = '{default: 0}, /// # Core-global parameters /// FPU configuration. - parameter fpu_implementation_t FPUImplementation [NrCores] = '{default: fpu_implementation_t'(0)}, + parameter fpu_implementation_t FPUImplementation = '0, /// Spatz FPU/IPU Configuration parameter int unsigned NumSpatzFPUs = 4, parameter int unsigned NumSpatzIPUs = 1, @@ -69,11 +69,11 @@ module cachepool_tile parameter bit [NrCores-1:0] Xdma = '{default: '0}, /// # Per-core parameters /// Per-core integer outstanding loads - parameter int unsigned NumIntOutstandingLoads [NrCores] = '{default: '0}, + parameter int unsigned NumIntOutstandingLoads = '0, /// Per-core integer outstanding memory operations (load and stores) - parameter int unsigned NumIntOutstandingMem [NrCores] = '{default: '0}, + parameter int unsigned NumIntOutstandingMem = '0, /// Per-core Spatz outstanding loads - parameter int unsigned NumSpatzOutstandingLoads [NrCores] = '{default: '0}, + parameter int unsigned NumSpatzOutstandingLoads = '0, /// ## Timing Tuning Parameters /// Insert Pipeline registers into off-loading path (response) parameter bit RegisterOffloadRsp = 1'b0, @@ -145,12 +145,19 @@ module cachepool_tile /// AXI Narrow out-port (UART) output axi_narrow_req_t axi_out_req_o, input axi_narrow_resp_t axi_out_resp_i, - /// AXI Cache Refill ports - output cache_trans_req_t [NumL1CtrlTile-1:0] cache_refill_req_o, - input cache_trans_rsp_t [NumL1CtrlTile-1:0] cache_refill_rsp_i, + /// Cache Refill ports + output cache_trans_req_t [NumL1CtrlTile-1:0] cache_refill_req_o, + input cache_trans_rsp_t [NumL1CtrlTile-1:0] cache_refill_rsp_i, /// Wide AXI ports to cluster level output axi_out_req_t [NumTileWideAxi-1:0] axi_wide_req_o, input axi_out_resp_t [NumTileWideAxi-1:0] axi_wide_rsp_i, + /// Remote Tile access ports (to remote tiles) + output tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_o, + output remote_tile_sel_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_dst_o, + input tcdm_rsp_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_i, + /// Remote Tile access ports (from remote tiles) + input tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_i, + output tcdm_rsp_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_o, /// SRAM Configuration Ports, usually not used. input impl_in_t [NrSramCfg-1:0] impl_i, /// Indicate the program execution is error @@ -184,7 +191,6 @@ module cachepool_tile return n; endfunction - localparam int unsigned NrTCDMPortsPerCore = get_tcdm_ports(0); localparam int unsigned NrTCDMPortsCores = get_tcdm_port_offs(NrCores); localparam int unsigned NumTCDMIn = NrTCDMPortsCores + 1; localparam logic [AxiAddrWidth-1:0] TCDMMask = ~(TCDMSize-1); @@ -250,15 +256,14 @@ module cachepool_tile typedef logic [NarrowDataWidth-1:0] data_t; typedef logic [NarrowDataWidth/8-1:0] strb_t; typedef logic [L1TagDataWidth-1:0] tag_data_t; - typedef logic [AxiDataWidth-1:0] data_dma_t; - typedef logic [AxiDataWidth/8-1:0] strb_dma_t; + typedef logic [AxiDataWidth-1:0] data_wide_t; + typedef logic [AxiDataWidth/8-1:0] strb_wide_t; typedef logic [NarrowIdWidthIn-1:0] id_mst_t; typedef logic [NarrowIdWidthOut-1:0] id_slv_t; - typedef logic [WideIdWidthIn-1:0] id_dma_mst_t; - typedef logic [WideIdWidthOut-1:0] id_dma_slv_t; - typedef logic [WideIdWidthIn-$clog2(NumL1CtrlTile)-1:0] id_dcache_mst_t; + typedef logic [WideIdWidthIn-1:0] id_wide_mst_t; + typedef logic [WideIdWidthOut-1:0] id_wide_slv_t; typedef logic [NarrowUserWidth-1:0] user_t; - typedef logic [AxiUserWidth-1:0] user_dma_t; + typedef logic [AxiUserWidth-1:0] user_wide_t; typedef logic [TCDMMemAddrWidth-1:0] tcdm_mem_addr_t; typedef logic [TCDMAddrWidth-1:0] tcdm_addr_t; @@ -274,17 +279,14 @@ module cachepool_tile // Regbus peripherals. `AXI_TYPEDEF_ALL(axi_mst, addr_t, id_mst_t, data_t, strb_t, user_t) `AXI_TYPEDEF_ALL(axi_slv, addr_t, id_slv_t, data_t, strb_t, user_t) - `AXI_TYPEDEF_ALL(axi_mst_dma, addr_t, id_dma_mst_t, data_dma_t, strb_dma_t, user_dma_t) - `AXI_TYPEDEF_ALL(axi_slv_dma, addr_t, id_dma_slv_t, data_dma_t, strb_dma_t, user_dma_t) - `AXI_TYPEDEF_ALL(axi_dcache, addr_t, id_dcache_mst_t, data_dma_t, strb_dma_t, user_dma_t) + `AXI_TYPEDEF_ALL(axi_mst_tile_wide, addr_t, id_wide_mst_t, data_wide_t, strb_wide_t, user_wide_t) + `AXI_TYPEDEF_ALL(axi_slv_tile_wide, addr_t, id_wide_slv_t, data_wide_t, strb_wide_t, user_wide_t) `REQRSP_TYPEDEF_ALL(reqrsp, addr_t, data_t, strb_t, tcdm_user_t) `MEM_TYPEDEF_ALL(mem, tcdm_mem_addr_t, data_t, strb_t, tcdm_user_t) - `MEM_TYPEDEF_ALL(mem_dma, tcdm_mem_addr_t, data_dma_t, strb_dma_t, logic) `REG_BUS_TYPEDEF_ALL(reg, addr_t, data_t, strb_t) - `REG_BUS_TYPEDEF_ALL(reg_dma, addr_t, data_dma_t, strb_dma_t) // Event counter increments for the TCDM. typedef struct packed { @@ -394,10 +396,10 @@ module cachepool_tile axi_mst_resp_t [NrNarrowMasters-1:0] narrow_axi_mst_rsp; // DMA AXI buses - axi_mst_dma_req_t [NrWideMasters-1:0] wide_axi_mst_req; - axi_mst_dma_resp_t [NrWideMasters-1:0] wide_axi_mst_rsp; - axi_slv_dma_req_t [NrWideSlaves-1 :0] wide_axi_slv_req; - axi_slv_dma_resp_t [NrWideSlaves-1 :0] wide_axi_slv_rsp; + axi_mst_tile_wide_req_t [NrWideMasters-1:0] wide_axi_mst_req; + axi_mst_tile_wide_resp_t [NrWideMasters-1:0] wide_axi_mst_rsp; + axi_slv_tile_wide_req_t [NrWideSlaves-1 :0] wide_axi_slv_req; + axi_slv_tile_wide_resp_t [NrWideSlaves-1 :0] wide_axi_slv_rsp; // 3. Memory Subsystem (Interconnect) tcdm_req_t [NrTCDMPortsCores-1:0] tcdm_req; @@ -528,19 +530,19 @@ module cachepool_tile axi_xbar #( .Cfg (DmaXbarCfg ), .ATOPs (0 ), - .slv_aw_chan_t (axi_mst_dma_aw_chan_t), - .mst_aw_chan_t (axi_slv_dma_aw_chan_t), - .w_chan_t (axi_mst_dma_w_chan_t ), - .slv_b_chan_t (axi_mst_dma_b_chan_t ), - .mst_b_chan_t (axi_slv_dma_b_chan_t ), - .slv_ar_chan_t (axi_mst_dma_ar_chan_t), - .mst_ar_chan_t (axi_slv_dma_ar_chan_t), - .slv_r_chan_t (axi_mst_dma_r_chan_t ), - .mst_r_chan_t (axi_slv_dma_r_chan_t ), - .slv_req_t (axi_mst_dma_req_t ), - .slv_resp_t (axi_mst_dma_resp_t ), - .mst_req_t (axi_slv_dma_req_t ), - .mst_resp_t (axi_slv_dma_resp_t ), + .slv_aw_chan_t (axi_mst_tile_wide_aw_chan_t), + .mst_aw_chan_t (axi_slv_tile_wide_aw_chan_t), + .w_chan_t (axi_mst_tile_wide_w_chan_t ), + .slv_b_chan_t (axi_mst_tile_wide_b_chan_t ), + .mst_b_chan_t (axi_slv_tile_wide_b_chan_t ), + .slv_ar_chan_t (axi_mst_tile_wide_ar_chan_t), + .mst_ar_chan_t (axi_slv_tile_wide_ar_chan_t), + .slv_r_chan_t (axi_mst_tile_wide_r_chan_t ), + .mst_r_chan_t (axi_slv_tile_wide_r_chan_t ), + .slv_req_t (axi_mst_tile_wide_req_t ), + .slv_resp_t (axi_mst_tile_wide_resp_t ), + .mst_req_t (axi_slv_tile_wide_req_t ), + .mst_resp_t (axi_slv_tile_wide_resp_t ), .rule_t (xbar_rule_t ) ) i_axi_wide_xbar ( .clk_i (clk_i ), @@ -586,6 +588,11 @@ module cachepool_tile assign cache_pready[j][cb] = unmerge_pready[cb*NrTCDMPortsPerCore+j]; assign unmerge_rsp [cb*NrTCDMPortsPerCore+j] = cache_rsp [j][cb]; end + + // for (genvar rt = 0; rt < NumRemotePortTile; rt++) begin + // assign cache_req[j][rt+NumL1CtrlTile] = remote_req_i[j*NrTCDMPortsPerCore+rt]; + // assign remote_rsp_o[j*NrTCDMPortsPerCore+rt] = cache_rsp [j][rt+NumL1CtrlTile]; + // end end // Connecting the remote ports @@ -599,6 +606,8 @@ module cachepool_tile // Set through CSR logic [$clog2(TCDMAddrWidth)-1:0] dynamic_offset; + logic [NrTCDMPortsPerCore-1:0] remote_pready; + /// Wire requests after strb handling to the cache controller for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin : gen_cache_xbar tcdm_cache_interco #( @@ -616,12 +625,12 @@ module cachepool_tile .rst_ni (rst_ni ), .tile_id_i (1'b0 ), .dynamic_offset_i (dynamic_offset ), - .core_req_i (cache_req [j] ), - .core_rsp_ready_i (cache_pready [j] ), - .core_rsp_o (cache_rsp [j] ), - .mem_req_o (cache_xbar_req [j] ), - .mem_rsp_ready_o (cache_xbar_pready[j] ), - .mem_rsp_i (cache_xbar_rsp [j] ) + .core_req_i ({remote_req_i[j], cache_req [j]}), + .core_rsp_ready_i ({1'b1, cache_pready [j]}), + .core_rsp_o ({remote_rsp_o[j], cache_rsp [j]}), + .mem_req_o ({remote_req_o[j], cache_xbar_req [j]}), + .mem_rsp_ready_o ({remote_pready[j],cache_xbar_pready[j]}), + .mem_rsp_i ({remote_rsp_i[j], cache_xbar_rsp [j]}) ); end @@ -657,11 +666,11 @@ module cachepool_tile .T ( tcdm_req_chan_t ), .Bypass ( 1'b0 ) ) i_spill_reg_cache_req ( - .clk_i , - .rst_ni ( rst_ni ), - .valid_i ( cache_amo_req[cb].q_valid ), - .ready_o ( cache_amo_rsp[cb].q_ready ), - .data_i ( cache_amo_req[cb].q ), + .clk_i , + .rst_ni ( rst_ni ), + .valid_i ( cache_amo_req[cb].q_valid ), + .ready_o ( cache_amo_rsp[cb].q_ready ), + .data_i ( cache_amo_req[cb].q ), .valid_o ( cache_req_reg.q_valid ), .ready_i ( cache_rsp_reg.q_ready ), .data_o ( cache_req_reg.q ) @@ -966,10 +975,10 @@ module cachepool_tile .tcdm_req_chan_t (tcdm_req_chan_t ), .tcdm_rsp_t (tcdm_rsp_t ), .tcdm_rsp_chan_t (tcdm_rsp_chan_t ), - .axi_req_t (axi_mst_dma_req_t ), - .axi_ar_chan_t (axi_mst_dma_ar_chan_t ), - .axi_aw_chan_t (axi_mst_dma_aw_chan_t ), - .axi_rsp_t (axi_mst_dma_resp_t ), + .axi_req_t (axi_mst_tile_wide_req_t ), + .axi_ar_chan_t (axi_mst_tile_wide_ar_chan_t ), + .axi_aw_chan_t (axi_mst_tile_wide_aw_chan_t ), + .axi_rsp_t (axi_mst_tile_wide_resp_t ), .hive_req_t (hive_req_t ), .hive_rsp_t (hive_rsp_t ), .acc_issue_req_t (acc_issue_req_t ), @@ -983,10 +992,10 @@ module cachepool_tile .XF8 (1'b1 ), .XF8ALT (1'b0 ), .IsoCrossing (1'b0 ), - .NumIntOutstandingLoads (NumIntOutstandingLoads [i]), - .NumIntOutstandingMem (NumIntOutstandingMem [i]), - .NumSpatzOutstandingLoads(NumSpatzOutstandingLoads[i]), - .FPUImplementation (FPUImplementation [i]), + .NumIntOutstandingLoads (NumIntOutstandingLoads ), + .NumIntOutstandingMem (NumIntOutstandingMem ), + .NumSpatzOutstandingLoads(NumSpatzOutstandingLoads ), + .FPUImplementation (FPUImplementation ), .SpmStackDepth (SpmStackDepth ), .RegisterOffloadRsp (RegisterOffloadRsp ), .RegisterCoreReq (RegisterCoreReq ), @@ -1058,8 +1067,8 @@ module cachepool_tile .EARLY_LATCH ( 0 ), .L0_EARLY_TAG_WIDTH ( snitch_pkg::PAGE_SHIFT - $clog2(ICacheLineWidth/8) ), .ISO_CROSSING ( 1'b0 ), - .axi_req_t ( axi_mst_dma_req_t ), - .axi_rsp_t ( axi_mst_dma_resp_t ), + .axi_req_t ( axi_mst_tile_wide_req_t ), + .axi_rsp_t ( axi_mst_tile_wide_resp_t ), .sram_cfg_data_t ( impl_in_t ), .sram_cfg_tag_t ( impl_in_t ) ) i_snitch_icache ( @@ -1260,9 +1269,9 @@ module cachepool_tile assign narrow_axi_slv_rsp[UART] = axi_out_resp_i; // Upsize the narrow SoC connection - `AXI_TYPEDEF_ALL(axi_mst_dma_narrow, addr_t, id_dma_mst_t, data_t, strb_t, user_t) - axi_mst_dma_narrow_req_t narrow_axi_slv_req_soc; - axi_mst_dma_narrow_resp_t narrow_axi_slv_resp_soc; + `AXI_TYPEDEF_ALL(axi_mst_core_narrow, addr_t, id_wide_mst_t, data_t, strb_t, user_t) + axi_mst_core_narrow_req_t narrow_axi_slv_req_soc; + axi_mst_core_narrow_resp_t narrow_axi_slv_resp_soc; axi_iw_converter #( .AxiAddrWidth (AxiAddrWidth ), @@ -1277,8 +1286,8 @@ module cachepool_tile .AxiMstPortMaxTxnsPerId(1 ), .slv_req_t (axi_slv_req_t ), .slv_resp_t (axi_slv_resp_t ), - .mst_req_t (axi_mst_dma_narrow_req_t ), - .mst_resp_t (axi_mst_dma_narrow_resp_t) + .mst_req_t (axi_mst_core_narrow_req_t ), + .mst_resp_t (axi_mst_core_narrow_resp_t) ) i_soc_port_iw_convert ( .clk_i (clk_i ), .rst_ni (rst_ni ), @@ -1296,17 +1305,17 @@ module cachepool_tile .AxiMaxReads (2 ), .AxiSlvPortDataWidth(NarrowDataWidth ), .AxiMstPortDataWidth(AxiDataWidth ), - .ar_chan_t (axi_mst_dma_ar_chan_t ), - .aw_chan_t (axi_mst_dma_aw_chan_t ), - .b_chan_t (axi_mst_dma_b_chan_t ), - .slv_r_chan_t (axi_mst_dma_narrow_r_chan_t), - .slv_w_chan_t (axi_mst_dma_narrow_b_chan_t), - .axi_slv_req_t (axi_mst_dma_narrow_req_t ), - .axi_slv_resp_t (axi_mst_dma_narrow_resp_t ), - .mst_r_chan_t (axi_mst_dma_r_chan_t ), - .mst_w_chan_t (axi_mst_dma_w_chan_t ), - .axi_mst_req_t (axi_mst_dma_req_t ), - .axi_mst_resp_t (axi_mst_dma_resp_t ) + .ar_chan_t (axi_mst_tile_wide_ar_chan_t), + .aw_chan_t (axi_mst_tile_wide_aw_chan_t), + .b_chan_t (axi_mst_tile_wide_b_chan_t ), + .slv_r_chan_t (axi_mst_core_narrow_r_chan_t), + .slv_w_chan_t (axi_mst_core_narrow_b_chan_t), + .axi_slv_req_t (axi_mst_core_narrow_req_t ), + .axi_slv_resp_t (axi_mst_core_narrow_resp_t ), + .mst_r_chan_t (axi_mst_tile_wide_r_chan_t ), + .mst_w_chan_t (axi_mst_tile_wide_w_chan_t ), + .axi_mst_req_t (axi_mst_tile_wide_req_t ), + .axi_mst_resp_t (axi_mst_tile_wide_resp_t ) ) i_soc_port_dw_upsize ( .clk_i (clk_i ), .rst_ni (rst_ni ), diff --git a/hardware/src/tcdm_cache_interco.sv b/hardware/src/tcdm_cache_interco.sv index f5b5e94..6b3629b 100644 --- a/hardware/src/tcdm_cache_interco.sv +++ b/hardware/src/tcdm_cache_interco.sv @@ -206,10 +206,10 @@ module tcdm_cache_interco #( // These are the address we will keep from original assign bitmask_lo = (1 << dynamic_offset_i) - 1; // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and remove the NumOutSelBits bits - assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - NumOutSelBits)) - 1) << dynamic_offset_i; + assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - $clog2(NumCache))) - 1) << dynamic_offset_i; - for (genvar port = 0; port < NumCache; port++) begin : gen_cache_io + for (genvar port = 0; port < NumCache + NumRemotePort; port++) begin : gen_cache_io always_comb begin mem_req_o[port] = '{ q: mem_req[port], @@ -219,7 +219,7 @@ module tcdm_cache_interco #( // remove the middle bits mem_req_o[port].q.addr = (mem_req[port].addr & bitmask_lo) | - ((mem_req[port].addr >> NumOutSelBits) & bitmask_up); + ((mem_req[port].addr >> $clog2(NumCache)) & bitmask_up); end diff --git a/hardware/tb/cachepool_cluster_wrapper.sv b/hardware/tb/cachepool_cluster_wrapper.sv index 1e8579a..07f1da3 100644 --- a/hardware/tb/cachepool_cluster_wrapper.sv +++ b/hardware/tb/cachepool_cluster_wrapper.sv @@ -19,14 +19,14 @@ module cachepool_cluster_wrapper parameter int unsigned AxiInIdWidth = SpatzAxiIdInWidth, parameter int unsigned AxiOutIdWidth = SpatzAxiIdOutWidth, - parameter type axi_in_resp_t = spatz_axi_in_resp_t, - parameter type axi_in_req_t = spatz_axi_in_req_t, + parameter type axi_in_resp_t = spatz_axi_in_resp_t, + parameter type axi_in_req_t = spatz_axi_in_req_t, - parameter type axi_out_resp_t = spatz_axi_out_resp_t, - parameter type axi_out_req_t = spatz_axi_out_req_t, + parameter type axi_out_resp_t = spatz_axi_out_resp_t, + parameter type axi_out_req_t = spatz_axi_out_req_t, - parameter type axi_narrow_req_t = spatz_axi_narrow_req_t, - parameter type axi_narrow_resp_t = spatz_axi_narrow_resp_t + parameter type axi_narrow_req_t = spatz_axi_narrow_req_t, + parameter type axi_narrow_resp_t = spatz_axi_narrow_resp_t )( input logic clk_i, input logic rst_ni, @@ -66,7 +66,7 @@ module cachepool_cluster_wrapper .ICacheLineWidth (ICacheLineWidth ), .ICacheLineCount (ICacheLineCount ), .ICacheSets (ICacheSets ), - .FPUImplementation (FPUImplementation ), + .FPUImplementation (FPUImplementation_Core ), .NumSpatzFPUs (NFpu ), .NumSpatzIPUs (NIpu ), .SnitchPMACfg (SnitchPMACfg ), @@ -77,8 +77,8 @@ module cachepool_cluster_wrapper .axi_in_resp_t (axi_in_resp_t ), .axi_narrow_req_t (axi_narrow_req_t ), .axi_narrow_resp_t (axi_narrow_resp_t ), - .axi_out_req_t (axi_out_req_t ), - .axi_out_resp_t (axi_out_resp_t ), + .axi_out_req_t (axi_out_req_t ), + .axi_out_resp_t (axi_out_resp_t ), .Xdma (4'h0 ), .DMAAxiReqFifoDepth (3 ), .DMAReqFifoDepth (3 ), diff --git a/sim/scripts/vsim_core.tcl b/sim/scripts/vsim_core.tcl index 2e3af20..9510e33 100644 --- a/sim/scripts/vsim_core.tcl +++ b/sim/scripts/vsim_core.tcl @@ -5,176 +5,178 @@ # Create group for core $1 onerror {resume} -add wave -noupdate -group tile[$1]_core[$2] -group scalar_xbar /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_scalar_xbar/* +set core_path ${3} -add wave -noupdate -group tile[$1]_core[$2] -group Params /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/BootAddr -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/clk_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rst_i -add wave -noupdate -group tile[$1]_core[$2] -radix unsigned /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/hart_id_i +add wave -noupdate -group tile[$1]_core[$2] -group scalar_xbar ${core_path}/i_cachepool_cc/i_scalar_xbar/* + +add wave -noupdate -group tile[$1]_core[$2] -group Params ${core_path}/i_cachepool_cc/BootAddr +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/clk_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/rst_i +add wave -noupdate -group tile[$1]_core[$2] -radix unsigned ${core_path}/i_cachepool_cc/i_snitch/hart_id_i add wave -noupdate -group tile[$1]_core[$2] -divider Instructions -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/inst_addr_o -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/inst_data_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/inst_valid_o -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/inst_ready_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/inst_addr_o +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/inst_data_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/inst_valid_o +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/inst_ready_i add wave -noupdate -group tile[$1]_core[$2] -divider Load/Store -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/data_req_o -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/data_rsp_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/data_req_o +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/data_rsp_i add wave -noupdate -group tile[$1]_core[$2] -divider Accelerator -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_qreq_o -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_qrsp_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_qvalid_o -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_qready_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_prsp_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_pvalid_i -add wave -noupdate -group tile[$1]_core[$2] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_pready_o - -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/illegal_inst -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/stall -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_stall -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_stall -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/zero_lsb -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/pc_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/pc_q -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/wfi_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/wfi_q -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/fcsr_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/fcsr_q +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_qreq_o +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_qrsp_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_qvalid_o +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_qready_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_prsp_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_pvalid_i +add wave -noupdate -group tile[$1]_core[$2] ${core_path}/i_cachepool_cc/i_snitch/acc_pready_o + +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/illegal_inst +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/stall +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_stall +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_stall +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/zero_lsb +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/pc_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/pc_q +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/wfi_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/wfi_q +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/fcsr_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/fcsr_q add wave -noupdate -group tile[$1]_core[$2] -group Snitch -divider LSU -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/ls_size -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/ls_amo -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/ld_result -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_qready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_qvalid -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_pvalid -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_pready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/lsu_rd -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/retire_load -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/retire_i -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/retire_acc +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/ls_size +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/ls_amo +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/ld_result +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_qready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_qvalid +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_pvalid +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_pready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/lsu_rd +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/retire_load +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/retire_i +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/retire_acc add wave -noupdate -group tile[$1]_core[$2] -group Snitch -divider ALU -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opa -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opb -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/iimm -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/uimm -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/jimm -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/bimm -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/simm -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/adder_result -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/alu_result -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rd -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rs1 -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rs2 -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/gpr_raddr -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/gpr_rdata -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/gpr_waddr -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/gpr_wdata -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/gpr_we -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/consec_pc -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/sb_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/sb_q -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/is_load -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/is_store -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/is_signed -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/ls_misaligned -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/ld_addr_misaligned -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/st_addr_misaligned -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/valid_instr -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/exception -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/alu_op -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opa_select -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opb_select -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/write_rd -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/uses_rd -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/next_pc -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rd_select -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/rd_bypass -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/is_branch -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/csr_rvalue -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/csr_en -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_register_rd -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/operands_ready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/dst_ready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opa_ready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/opb_ready -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_opa -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_opa_reversed -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_right_result -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_left_result -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_opa_ext -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_right_result_ext -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_left -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/shift_arithmetic -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/alu_opa -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/alu_opb -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/alu_writeback -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_mem_cnt_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_mem_cnt_q -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_mem_str_cnt_d -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/acc_mem_str_cnt_q -add wave -noupdate -group tile[$1]_core[$2] -group Snitch /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/core_events_o - -add wave -noupdate -group tile[$1]_core[$2] -group Snitch -group Internal -group RF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/i_snitch_regfile/* -add wave -noupdate -group tile[$1]_core[$2] -group Snitch -group Internal /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_snitch/* - -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/issue_valid_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/issue_ready_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/issue_req_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/issue_rsp_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/rsp_valid_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/rsp_ready_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/rsp_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/spatz_mem_req_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/spatz_mem_req_valid_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/spatz_mem_req_ready_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/spatz_mem_rsp_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/spatz_mem_rsp_valid_i - -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" -group FPR /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/i_fpr/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" -group LSU /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/i_fp_lsu/* - -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group Controller /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_controller/* +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opa +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opb +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/iimm +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/uimm +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/jimm +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/bimm +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/simm +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/adder_result +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/alu_result +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/rd +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/rs1 +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/rs2 +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/gpr_raddr +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/gpr_rdata +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/gpr_waddr +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/gpr_wdata +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/gpr_we +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/consec_pc +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/sb_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/sb_q +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/is_load +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/is_store +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/is_signed +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/ls_misaligned +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/ld_addr_misaligned +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/st_addr_misaligned +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/valid_instr +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/exception +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/alu_op +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opa_select +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opb_select +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/write_rd +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/uses_rd +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/next_pc +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/rd_select +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/rd_bypass +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/is_branch +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/csr_rvalue +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/csr_en +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_register_rd +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/operands_ready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/dst_ready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opa_ready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/opb_ready +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_opa +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_opa_reversed +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_right_result +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_left_result +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_opa_ext +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_right_result_ext +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_left +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/shift_arithmetic +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/alu_opa +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/alu_opb +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/alu_writeback +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_mem_cnt_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_mem_cnt_q +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_mem_str_cnt_d +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/acc_mem_str_cnt_q +add wave -noupdate -group tile[$1]_core[$2] -group Snitch ${core_path}/i_cachepool_cc/i_snitch/core_events_o + +add wave -noupdate -group tile[$1]_core[$2] -group Snitch -group Internal -group RF ${core_path}/i_cachepool_cc/i_snitch/i_snitch_regfile/* +add wave -noupdate -group tile[$1]_core[$2] -group Snitch -group Internal ${core_path}/i_cachepool_cc/i_snitch/* + +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/issue_valid_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/issue_ready_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/issue_req_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/issue_rsp_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/rsp_valid_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/rsp_ready_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/rsp_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/spatz_mem_req_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/spatz_mem_req_valid_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/spatz_mem_req_ready_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/spatz_mem_rsp_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz ${core_path}/i_cachepool_cc/i_spatz/spatz_mem_rsp_valid_i + +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" ${core_path}/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" -group FPR ${core_path}/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/i_fpr/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group "FPU Sequencer" -group LSU ${core_path}/i_cachepool_cc/i_spatz/gen_fpu_sequencer/i_fpu_sequencer/i_fp_lsu/* + +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group Controller ${core_path}/i_cachepool_cc/i_spatz/i_controller/* add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF -divider RegisterWrite -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/waddr_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/wdata_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/we_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/wbe_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/wvalid_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/waddr_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/wdata_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/we_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/wbe_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/wvalid_o add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF -divider RegisterRead -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/raddr_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/rdata_o -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/re_i -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/rvalid_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/raddr_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/rdata_o +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/re_i +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/rvalid_o add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF -divider Internal -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/waddr -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/wdata -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/we -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/wbe -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/raddr -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vrf/rdata +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/waddr +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/wdata +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/we +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/wbe +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/raddr +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VRF ${core_path}/i_cachepool_cc/i_spatz/i_vrf/rdata -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vlsu/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU ${core_path}/i_cachepool_cc/i_spatz/i_vlsu/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VSLDU /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vsldu/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VSLDU ${core_path}/i_cachepool_cc/i_spatz/i_vsldu/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VFU /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vfu/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VFU ${core_path}/i_cachepool_cc/i_spatz/i_vfu/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group FPU /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vfu/gen_fpu/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group FPU ${core_path}/i_cachepool_cc/i_spatz/i_vfu/gen_fpu/* -add wave -noupdate -group tile[$1]_core[$2] -group Internal /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/* +add wave -noupdate -group tile[$1]_core[$2] -group Internal ${core_path}/i_cachepool_cc/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU -group ROB0 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vlsu/gen_rob[0]/i_reorder_buffer/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU -group ROB1 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/i_spatz/i_vlsu/gen_rob[1]/i_reorder_buffer/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU -group ROB0 ${core_path}/i_cachepool_cc/i_spatz/i_vlsu/gen_rob[0]/i_reorder_buffer/* +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group VLSU -group ROB1 ${core_path}/i_cachepool_cc/i_spatz/i_vlsu/gen_rob[1]/i_reorder_buffer/* -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_fifo -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp_valid -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp_ready -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp_empty -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp_pop -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_rsp_push -add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_core[$2]/i_cachepool_cc/spatz_mem_fifo_bypass +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_fifo +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp_valid +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp_ready +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp_empty +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp_pop +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_rsp_push +add wave -noupdate -group tile[$1]_core[$2] -group Spatz -group RSP_FIFO ${core_path}/i_cachepool_cc/spatz_mem_fifo_bypass diff --git a/sim/scripts/vsim_tile.tcl b/sim/scripts/vsim_tile.tcl index b090b55..2c12f19 100644 --- a/sim/scripts/vsim_tile.tcl +++ b/sim/scripts/vsim_tile.tcl @@ -5,32 +5,36 @@ # Create group for Tile $1 onerror {resume} +set tile_path $2 + # Add waves for tcdm_mapper and csrs -add wave -noupdate -group tile[$1] -group CSR /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/i_snitch_cluster_peripheral/* -add wave -noupdate -group tile[$1] -group axi2reqrsp /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[0]/i_axi2reqrsp/* +add wave -noupdate -group tile[$1] -group CSR ${tile_path}/i_tile/i_snitch_cluster_peripheral/* +# add wave -noupdate -group tile[$1] -group axi2reqrsp ${tile_path}/i_axi2reqrsp/* # Add waves for xbars -add wave -noupdate -group tile[$1] -group narrow_xbar /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/i_axi_narrow_xbar/* -add wave -noupdate -group tile[$1] -group wide_xbar /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/i_axi_wide_xbar/* +add wave -noupdate -group tile[$1] -group narrow_xbar ${tile_path}/i_tile/i_axi_narrow_xbar/* +add wave -noupdate -group tile[$1] -group wide_xbar ${tile_path}/i_tile/i_axi_wide_xbar/* -# Add waces for cache controller +# Add waves for cache controller for {set c 0} {$c < 4} {incr c} { onerror {resume} - add wave -noupdate -group tile[$1] -group cache[$c] -group amo /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_cache_connect[$c]/gen_cache_amo_connect[4]/gen_amo/i_cache_amo/* + set cache_path ${tile_path}/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller + + add wave -noupdate -group tile[$1] -group cache[$c] -group amo ${tile_path}/i_tile/gen_cache_connect[$c]/gen_cache_amo_connect[4]/gen_amo/i_cache_amo/* - add wave -noupdate -group tile[$1] -group cache[$c] -group coalescer /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_par_coalescer_for_spatz/gen_extend_window/i_par_coalescer_extend_window/i_par_coalescer/* - add wave -noupdate -group tile[$1] -group cache[$c] -group core /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_insitu_cache_tcdm_wrapper/i_insitu_cache_core/* - add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl0 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_insitu_cache_tcdm_wrapper/gen_cache_banks[0]/i_access_ctrl_for_meta/* - add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl1 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_insitu_cache_tcdm_wrapper/gen_cache_banks[1]/i_access_ctrl_for_meta/* - add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl2 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_insitu_cache_tcdm_wrapper/gen_cache_banks[2]/i_access_ctrl_for_meta/* - add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl3 /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/i_insitu_cache_tcdm_wrapper/gen_cache_banks[3]/i_access_ctrl_for_meta/* + add wave -noupdate -group tile[$1] -group cache[$c] -group coalescer ${cache_path}/i_par_coalescer_for_spatz/gen_extend_window/i_par_coalescer_extend_window/i_par_coalescer/* + add wave -noupdate -group tile[$1] -group cache[$c] -group core ${cache_path}/i_insitu_cache_tcdm_wrapper/i_insitu_cache_core/* + add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl0 ${cache_path}/i_insitu_cache_tcdm_wrapper/gen_cache_banks[0]/i_access_ctrl_for_meta/* + add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl1 ${cache_path}/i_insitu_cache_tcdm_wrapper/gen_cache_banks[1]/i_access_ctrl_for_meta/* + add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl2 ${cache_path}/i_insitu_cache_tcdm_wrapper/gen_cache_banks[2]/i_access_ctrl_for_meta/* + add wave -noupdate -group tile[$1] -group cache[$c] -group meta_ctrl3 ${cache_path}/i_insitu_cache_tcdm_wrapper/gen_cache_banks[3]/i_access_ctrl_for_meta/* - add wave -noupdate -group tile[$1] -group cache[$c] -group Internal /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_l1_cache_ctrl[$c]/i_l1_controller/* + add wave -noupdate -group tile[$1] -group cache[$c] -group Internal ${cache_path}/* } for {set c 0} {$c < 5} {incr c} { - add wave -noupdate -group tile[$1] -group cache_xbar -group xbar[$c] /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/gen_cache_xbar[$c]/i_cache_xbar/* + add wave -noupdate -group tile[$1] -group cache_xbar -group xbar[$c] ${tile_path}/i_tile/gen_cache_xbar[$c]/i_cache_xbar/* } # Add waves for remaining signals -add wave -noupdate -group tile[$1] -group Internal /tb_cachepool/i_cluster_wrapper/i_cluster/gen_tiles[$1]/i_tile/* +add wave -noupdate -group tile[$1] -group Internal ${tile_path}/i_tile/* diff --git a/sim/scripts/vsim_wave.tcl b/sim/scripts/vsim_wave.tcl index fbf6c2d..6444bf6 100644 --- a/sim/scripts/vsim_wave.tcl +++ b/sim/scripts/vsim_wave.tcl @@ -5,24 +5,34 @@ onerror {resume} quietly WaveActivateNextPane {} 0 +set cluster_path /tb_cachepool/i_cluster_wrapper/i_cluster +set group_path ${cluster_path}/gen_group/i_group + + # Add the cluster probe add wave /tb_cachepool/cluster_probe -add wave -noupdate -group Cluster -group xbar -group req_xbar /tb_cachepool/i_cluster_wrapper/i_cluster/i_cluster_xbar/i_req_xbar/* -add wave -noupdate -group Cluster -group xbar -group rsp_xbar /tb_cachepool/i_cluster_wrapper/i_cluster/i_cluster_xbar/i_rsp_xbar/* -add wave -noupdate -group Cluster -group xbar /tb_cachepool/i_cluster_wrapper/i_cluster/i_cluster_xbar/* +add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_cluster_xbar/i_req_xbar/* +add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* +add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* -add wave -noupdate -group Cluster -group Internal /tb_cachepool/i_cluster_wrapper/i_cluster/* +add wave -noupdate -group Cluster -group Internal ${cluster_path}/* -do sim/scripts/vsim_tile.tcl 0 +add wave -noupdate -group Group ${group_path}/* -# Add all cores in Tile 0 -for {set core 0} {$core < 4} {incr core} { - do sim/scripts/vsim_core.tcl 0 $core -} +for {set tile 0} {$tile < 2} {incr tile} { + set tile_path ${group_path}/gen_tiles[$tile] + + do sim/scripts/vsim_tile.tcl $tile ${tile_path} + # Add all cores in Tile 0 + for {set core 0} {$core < 4} {incr core} { + set core_path ${tile_path}/i_tile/gen_core[$core] + do sim/scripts/vsim_core.tcl $tile $core ${core_path} + } -for {set ch 0} {$ch < 4} {incr ch} { - add wave -noupdate -group DramSys$ch -group upsizer tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/i_axi_dw_converter/* - add wave -noupdate -group DramSys$ch /tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/* + for {set ch 0} {$ch < 4} {incr ch} { + # add wave -noupdate -group DramSys$ch -group upsizer tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/i_axi_dw_converter/* + add wave -noupdate -group DramSys$ch /tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/* + } } diff --git a/sim/scripts/vsim_wave_single_tile.tcl b/sim/scripts/vsim_wave_single_tile.tcl new file mode 100644 index 0000000..4c04754 --- /dev/null +++ b/sim/scripts/vsim_wave_single_tile.tcl @@ -0,0 +1,34 @@ +# Copyright 2021 ETH Zurich and University of Bologna. +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +onerror {resume} +quietly WaveActivateNextPane {} 0 + +set cluster_path /tb_cachepool/i_cluster_wrapper/i_cluster +set group_path ${cluster_path} + + +# Add the cluster probe +add wave /tb_cachepool/cluster_probe + +add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_cluster_xbar/i_req_xbar/* +add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* +add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* + +add wave -noupdate -group Cluster -group Internal ${cluster_path}/* + +set tile_path ${group_path}/gen_tile + +do sim/scripts/vsim_tile.tcl 0 ${tile_path} +# Add all cores in Tile 0 +for {set core 0} {$core < 4} {incr core} { + set core_path ${tile_path}/i_tile/gen_core[$core] + do sim/scripts/vsim_core.tcl 0 $core ${core_path} +} + +for {set ch 0} {$ch < 4} {incr ch} { + # add wave -noupdate -group DramSys$ch -group upsizer tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/i_axi_dw_converter/* + add wave -noupdate -group DramSys$ch /tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/* +} + From ddb62215c7a955955a9c1713ce0c84019a3b5b12 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Mon, 5 Jan 2026 14:26:41 +0100 Subject: [PATCH 06/23] [SRC] WIP: Move prepheral to the cluster level. --- hardware/src/cachepool_cc.sv | 4 +- hardware/src/cachepool_cluster.sv | 172 +++++++++++++++++-- hardware/src/cachepool_pkg.sv | 85 +++++++-- hardware/src/cachepool_tile.sv | 237 ++++++++++---------------- sim/scripts/vsim_tile.tcl | 2 +- sim/scripts/vsim_wave.tcl | 2 + sim/scripts/vsim_wave_single_tile.tcl | 2 + 7 files changed, 323 insertions(+), 181 deletions(-) diff --git a/hardware/src/cachepool_cc.sv b/hardware/src/cachepool_cc.sv index 8b6bfc9..86c8d7e 100644 --- a/hardware/src/cachepool_cc.sv +++ b/hardware/src/cachepool_cc.sv @@ -55,8 +55,8 @@ module cachepool_cc parameter type acc_issue_req_t = logic, parameter type acc_issue_rsp_t = logic, parameter type acc_rsp_t = logic, - parameter type dma_events_t = logic, - parameter type dma_perf_t = logic, + // parameter type dma_events_t = logic, + // parameter type dma_perf_t = logic, /// FPU configuration. parameter fpu_implementation_t FPUImplementation = fpu_implementation_t'(0), /// Boot address of core. diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index aa6bd74..3964910 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -222,8 +222,8 @@ module cachepool_cluster axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; axi_slv_cache_req_t [NumClusterSlv-1 :0] wide_axi_slv_req; axi_slv_cache_resp_t [NumClusterSlv-1 :0] wide_axi_slv_rsp; - axi_narrow_req_t [NumTiles-1 :0] axi_out_req; - axi_narrow_resp_t [NumTiles-1 :0] axi_out_resp; + axi_narrow_req_t [NumTiles-1:0][1:0] axi_out_req; + axi_narrow_resp_t [NumTiles-1:0][1:0] axi_out_resp; // 2. BootROM reg_cache_req_t bootrom_reg_req; @@ -344,8 +344,18 @@ module cachepool_cluster assign l2_rsp_rr = '0; end - logic [NumTiles-1: 0] group_probe; - assign cluster_probe_o = |group_probe; + // logic [NumTiles-1: 0] group_probe; + // assign cluster_probe_o = |group_probe; + + + icache_events_t [NrCores-1:0] icache_events; + logic icache_prefetch_enable; + logic [NrCores-1:0] cl_interrupt; + logic [$clog2(L1AddrWidth)-1:0] dynamic_offset; + logic [1:0] l1d_insn; + logic l1d_insn_valid; + logic [NumL1CacheCtrl-1:0] l1d_insn_ready; + logic [NumL1CacheCtrl-1:0] l1d_busy; if (NumTiles > 1) begin : gen_group cachepool_group #( @@ -390,7 +400,7 @@ module cachepool_cluster ) i_group ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .eoc_o ( eoc_o ), + // .eoc_o ( eoc_o ), .impl_i ( impl_i ), .error_o ( error_o ), .debug_req_i ( debug_req_i ), @@ -476,7 +486,7 @@ module cachepool_cluster ) i_tile ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - .eoc_o ( eoc_o ), + // .eoc_o ( eoc_o ), .impl_i ( impl_i ), .error_o ( error_o ), .debug_req_i ( debug_req_i ), @@ -485,9 +495,9 @@ module cachepool_cluster .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( group_probe ), - .axi_in_req_i ( axi_in_req_i ), - .axi_in_resp_o ( axi_in_resp_o ), + // .tile_probe_o ( group_probe ), + // .axi_in_req_i ( axi_in_req_i ), + // .axi_in_resp_o ( axi_in_resp_o ), .axi_out_req_o ( axi_out_req [0] ), .axi_out_resp_i ( axi_out_resp [0] ), // Remote Ports (not used) @@ -500,7 +510,16 @@ module cachepool_cluster .cache_refill_req_o ( cache_refill_req ), .cache_refill_rsp_i ( cache_refill_rsp ), .axi_wide_req_o ( axi_tile_req[0] ), - .axi_wide_rsp_i ( axi_tile_rsp[0] ) + .axi_wide_rsp_i ( axi_tile_rsp[0] ), + // Peripherals + .icache_events_o (icache_events ), + .icache_prefetch_enable_i (icache_prefetch_enable ), + .cl_interrupt_i (cl_interrupt ), + .dynamic_offset_i (dynamic_offset ), + .l1d_insn_i (l1d_insn ), + .l1d_insn_valid_i (l1d_insn_valid ), + .l1d_insn_ready_o (l1d_insn_ready ), + .l1d_busy_i (l1d_busy ) ); axi_to_reqrsp #( @@ -685,8 +704,8 @@ module cachepool_cluster ); end - assign axi_narrow_req_o = axi_out_req[0]; - assign axi_out_resp[0] = axi_narrow_resp_i; + assign axi_narrow_req_o = axi_out_req[0][0]; + assign axi_out_resp[0][0] = axi_narrow_resp_i; // ------------- // DMA Subsystem @@ -760,4 +779,133 @@ module cachepool_cluster assign bootrom_reg_rsp.error = 1'b0; + + // CSR/Peripherals + + `REG_BUS_TYPEDEF_ALL(reg, narrow_addr_t, narrow_data_t, narrow_strb_t) + + reg_req_t reg_req; + reg_rsp_t reg_rsp; + + axi_csr_slv_req_t axi_csr_req; + axi_csr_slv_resp_t axi_csr_rsp; + + axi_mux #( + .SlvAxiIDWidth ( ClusterAxiIdWidth ), + .slv_aw_chan_t ( axi_csr_mst_aw_chan_t ), // AW Channel Type, slave ports + .mst_aw_chan_t ( axi_csr_slv_aw_chan_t ), // AW Channel Type, master port + .w_chan_t ( axi_csr_slv_w_chan_t ), // W Channel Type, all ports + .slv_b_chan_t ( axi_csr_mst_b_chan_t ), // B Channel Type, slave ports + .mst_b_chan_t ( axi_csr_slv_b_chan_t ), // B Channel Type, master port + .slv_ar_chan_t ( axi_csr_mst_ar_chan_t ), // AR Channel Type, slave ports + .mst_ar_chan_t ( axi_csr_slv_ar_chan_t ), // AR Channel Type, master port + .slv_r_chan_t ( axi_csr_mst_r_chan_t ), // R Channel Type, slave ports + .mst_r_chan_t ( axi_csr_slv_r_chan_t ), // R Channel Type, master port + .slv_req_t ( axi_csr_mst_req_t ), + .slv_resp_t ( axi_csr_mst_resp_t ), + .mst_req_t ( axi_csr_slv_req_t ), + .mst_resp_t ( axi_csr_slv_resp_t ), + .NoSlvPorts ( NumTiles + 1 ), // Number of Masters for the module + .FallThrough ( 0 ), + .SpillAw ( XbarLatency[4] ), + .SpillW ( XbarLatency[3] ), + .SpillB ( XbarLatency[2] ), + .SpillAr ( XbarLatency[1] ), + .SpillR ( XbarLatency[0] ), + .MaxWTrans ( 2 ) + ) i_axi_csr_mux ( + .clk_i ( clk_i ), // Clock + .rst_ni ( rst_ni ), // Asynchronous reset active low + .test_i ('0), // Test Mode enable + .slv_reqs_i ( {axi_in_req_i, axi_out_req [0][1]} ), + .slv_resps_o ( {axi_in_resp_o, axi_out_resp[0][1]} ), + .mst_req_o ( axi_csr_req ), + .mst_resp_i ( axi_csr_rsp ) + ); + + axi_to_reg #( + .ADDR_WIDTH (AxiAddrWidth ), + .DATA_WIDTH (SpatzAxiNarrowDataWidth ), + .AXI_MAX_WRITE_TXNS (1 ), + .AXI_MAX_READ_TXNS (1 ), + .DECOUPLE_W (0 ), + .ID_WIDTH (CsrAxiSlvIdWidth ), + .USER_WIDTH (SpatzAxiUserWidth ), + .axi_req_t (axi_csr_slv_req_t ), + .axi_rsp_t (axi_csr_slv_resp_t ), + .reg_req_t (reg_req_t ), + .reg_rsp_t (reg_rsp_t ) + ) i_csr_axi_to_reg ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .testmode_i (1'b0 ), + .axi_req_i (axi_csr_req ), + .axi_rsp_o (axi_csr_rsp ), + .reg_req_o (reg_req ), + .reg_rsp_i (reg_rsp ) + ); + + + // Event counter increments for the TCDM. + typedef struct packed { + /// Number requests going in + logic [$clog2(5):0] inc_accessed; + /// Number of requests stalled due to congestion + logic [$clog2(5):0] inc_congested; + } tcdm_events_t; + + // Event counter increments for DMA. + typedef struct packed { + logic aw_stall, ar_stall, r_stall, w_stall, + buf_w_stall, buf_r_stall; + logic aw_valid, aw_ready, aw_done, aw_bw; + logic ar_valid, ar_ready, ar_done, ar_bw; + logic r_valid, r_ready, r_done, r_bw; + logic w_valid, w_ready, w_done, w_bw; + logic b_valid, b_ready, b_done; + logic dma_busy; + axi_pkg::len_t aw_len, ar_len; + axi_pkg::size_t aw_size, ar_size; + logic [$clog2(SpatzAxiNarrowDataWidth/8):0] num_bytes_written; + } dma_events_t; + + localparam logic [AxiAddrWidth-1:0] TCDMMask = ~(TCDMSize-1); + narrow_addr_t tcdm_start_address, tcdm_end_address; + assign tcdm_start_address = (cluster_base_addr_i & TCDMMask); + assign tcdm_end_address = (tcdm_start_address + TCDMSize) & TCDMMask; + + spatz_cluster_peripheral #( + .AddrWidth (AxiAddrWidth ), + .SPMWidth ($clog2(L1NumSet)), + .NumCacheCtrl (NumL1CtrlTile ), + .reg_req_t (reg_req_t ), + .reg_rsp_t (reg_rsp_t ), + .tcdm_events_t (tcdm_events_t ), + .dma_events_t (dma_events_t ), + .NrCores (NrCores ) + ) i_cachepool_cluster_peripheral ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .eoc_o (eoc_o ), + .reg_req_i (reg_req ), + .reg_rsp_o (reg_rsp ), + /// The TCDM always starts at the cluster base. + .tcdm_start_address_i (tcdm_start_address ), + .tcdm_end_address_i (tcdm_end_address ), + .icache_prefetch_enable_o (icache_prefetch_enable), + .cl_clint_o (cl_interrupt ), + .cluster_hart_base_id_i (hart_base_id_i ), + .core_events_i ('0 ), + .tcdm_events_i ('0 ), + .dma_events_i ('0 ), + .icache_events_i (icache_events ), + .cluster_probe_o (cluster_probe_o ), + .dynamic_offset_o (dynamic_offset ), + .l1d_spm_size_o ( ), + .l1d_insn_o (l1d_insn ), + .l1d_insn_valid_o (l1d_insn_valid ), + .l1d_insn_ready_i (l1d_insn_ready ), + .l1d_busy_o (l1d_busy ) + ); + endmodule diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index bc87512..8ba74df 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -23,21 +23,31 @@ package cachepool_pkg; // AXI // /////////// - // At tile level, we only has three sources: SoCIn, Cores (muxed to one), ICache - // Therefore, in theory only two bits are required for each Tile - - localparam int unsigned TileAxiIdWidth = 3; - // For better out-of-order behavior, each tile needs a distinguished ID => Additional log2(NumTiles) bits - localparam int unsigned GroupAxiIdWidth = $clog2(NumTiles); - - localparam int unsigned ClusterAxiIdWidth = TileAxiIdWidth + GroupAxiIdWidth + 3; + // AXI requires different types after xbar/mux + // We try to put all AXI related parameters and types at interface in this place for easier management + /***** Basic Types and Width *****/ // AXI Data Width localparam int unsigned SpatzAxiDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; localparam int unsigned SpatzAxiStrbWidth = SpatzAxiDataWidth / 8; localparam int unsigned SpatzAxiNarrowDataWidth = `ifdef DATA_WIDTH `DATA_WIDTH `else 0 `endif; + localparam int unsigned SpatzAxiNarrowStrbWidth = SpatzAxiNarrowDataWidth / 8; // AXI Address Width localparam int unsigned SpatzAxiAddrWidth = `ifdef ADDR_WIDTH `ADDR_WIDTH `else 0 `endif; + // AXI User Width + localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; + + + // localparam int unsigned TileAxiIdWidth = 3; + // // For better out-of-order behavior, each tile needs a distinguished ID => Additional log2(NumTiles) bits + + localparam int unsigned TileAxiIdWidth = 3; + localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); + + // localparam int unsigned GroupAxiIdWidth = $clog2(NumTiles); + + localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + 3; + // AXI ID Width // localparam int unsigned SpatzAxiIdInWidth = 6; // localparam int unsigned SpatzAxiIdOutWidth = 7; @@ -51,17 +61,62 @@ package cachepool_pkg; // localparam int unsigned IwcAxiIdOutWidth = 3 + $clog2(4) + 3; localparam int unsigned IwcAxiIdOutWidth = SpatzAxiIdOutWidth + 1; - // AXI User Width - localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; + localparam int unsigned CsrAxiMstIdWidth = ClusterAxiIdWidth; + localparam int unsigned CsrAxiSlvIdWidth = ClusterAxiIdWidth + 1; + + typedef logic [SpatzAxiDataWidth-1:0] axi_wide_data_t; typedef logic [SpatzAxiStrbWidth-1:0] axi_wide_strb_t; typedef logic [SpatzAxiNarrowDataWidth-1:0] axi_narrow_data_t; - typedef logic [SpatzAxiNarrowDataWidth/8-1:0] axi_narrow_strb_t; + typedef logic [SpatzAxiNarrowStrbWidth-1:0] axi_narrow_strb_t; typedef logic [SpatzAxiAddrWidth-1:0] axi_addr_t; - typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; - typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; - typedef logic [SpatzAxiUserWidth-1:0] axi_user_t; + typedef logic [SpatzAxiUserWidth-1:0] axi_user_t; + + typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; + typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; + + typedef logic [CsrAxiMstIdWidth-1:0] axi_id_csr_mst_t; + typedef logic [CsrAxiSlvIdWidth-1:0] axi_id_csr_slv_t; + + + /***** Tile *****/ + // We have three sets of axi ports for each tile + // 1. Wide output bus for BootRom & L2 (from ICache) + // 2. Narrow output bus for UART + // 3. Narrow input bus for SoC control + + // localparam int unsigned TileAxiIdWidth = 3; + // localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); + + ///// Path 1: Wide bus + + + + + /***** Group *****/ + + + + + /***** Cluster *****/ + + `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + + + + + /***** TB *****/ + + + // At tile level, we only has three sources: SoCIn, Cores (muxed to one), ICache + // Therefore, in theory only two bits are required for each Tile + + + + + // typedef logic [ClusterAxiIdWidth-1:0] axi_id_in_t; // typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; @@ -85,7 +140,7 @@ package cachepool_pkg; // Typedefs // -------- - typedef logic [6:0] id_slv_t; + typedef logic [5:0] id_slv_t; // typedef logic [ClusterAxiIdWidth-1:0] id_slv_t; // Regbus peripherals. diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 3019d6c..d62f8eb 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -24,6 +24,7 @@ module cachepool_tile import spatz_pkg::*; import fpnew_pkg::fpu_implementation_t; import snitch_pma_pkg::snitch_pma_t; + import snitch_icache_pkg::icache_events_t; #( /// Width of physical address. parameter int unsigned AxiAddrWidth = 48, @@ -117,7 +118,7 @@ module cachepool_tile /// corresponding core into debug mode. This signal is assumed to be _async_. input logic [NrCores-1:0] debug_req_i, /// End of Computing indicator to notify the host/tb - output logic eoc_o, + // output logic eoc_o, /// Machine external interrupt pending. Usually those interrupts come from a /// platform-level interrupt controller. This signal is assumed to be _async_. input logic [NrCores-1:0] meip_i, @@ -138,13 +139,13 @@ module cachepool_tile input logic [AxiAddrWidth-1:0] cluster_base_addr_i, /// Per-cluster probe on the cluster status. Can be written by the cores to indicate /// to the overall system that the cluster is executing something. - output logic tile_probe_o, + // output logic tile_probe_o, /// AXI Core cluster in-port. - input axi_in_req_t axi_in_req_i, - output axi_in_resp_t axi_in_resp_o, - /// AXI Narrow out-port (UART) - output axi_narrow_req_t axi_out_req_o, - input axi_narrow_resp_t axi_out_resp_i, + // input axi_in_req_t axi_in_req_i, + // output axi_in_resp_t axi_in_resp_o, + /// AXI Narrow out-port (UART/Peripheral) + output axi_narrow_req_t [1:0] axi_out_req_o, + input axi_narrow_resp_t [1:0] axi_out_resp_i, /// Cache Refill ports output cache_trans_req_t [NumL1CtrlTile-1:0] cache_refill_req_o, input cache_trans_rsp_t [NumL1CtrlTile-1:0] cache_refill_rsp_i, @@ -158,6 +159,18 @@ module cachepool_tile /// Remote Tile access ports (from remote tiles) input tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_i, output tcdm_rsp_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_o, + /// Peripheral signals + output icache_events_t [NrCores-1:0] icache_events_o, + input logic icache_prefetch_enable_i, + input logic [NrCores-1:0] cl_interrupt_i, + input logic [$clog2(AxiAddrWidth)-1:0] dynamic_offset_i, + input logic [1:0] l1d_insn_i, + input logic l1d_insn_valid_i, + output logic [NumL1CtrlTile-1:0] l1d_insn_ready_o, + input logic [NumL1CtrlTile-1:0] l1d_busy_i, + + + /// SRAM Configuration Ports, usually not used. input impl_in_t [NrSramCfg-1:0] impl_i, /// Indicate the program execution is error @@ -167,7 +180,6 @@ module cachepool_tile // Imports // --------- import snitch_pkg::*; - import snitch_icache_pkg::icache_events_t; // --------- // Constants @@ -196,7 +208,7 @@ module cachepool_tile localparam logic [AxiAddrWidth-1:0] TCDMMask = ~(TCDMSize-1); // Core Request, SoC Request - localparam int unsigned NrNarrowMasters = 2; + localparam int unsigned NrNarrowMasters = 1; // Narrow AXI network parameters localparam int unsigned NarrowIdWidthIn = AxiIdWidthIn; @@ -233,7 +245,7 @@ module cachepool_tile }; // DMA configuration struct - localparam axi_pkg::xbar_cfg_t DmaXbarCfg = '{ + localparam axi_pkg::xbar_cfg_t WideXbarCfg = '{ NoSlvPorts : NrWideMasters, NoMstPorts : NrWideSlaves, MaxMstTrans : MaxMstTrans, @@ -288,28 +300,6 @@ module cachepool_tile `REG_BUS_TYPEDEF_ALL(reg, addr_t, data_t, strb_t) - // Event counter increments for the TCDM. - typedef struct packed { - /// Number requests going in - logic [$clog2(NrTCDMPortsCores):0] inc_accessed; - /// Number of requests stalled due to congestion - logic [$clog2(NrTCDMPortsCores):0] inc_congested; - } tcdm_events_t; - - // Event counter increments for DMA. - typedef struct packed { - logic aw_stall, ar_stall, r_stall, w_stall, - buf_w_stall, buf_r_stall; - logic aw_valid, aw_ready, aw_done, aw_bw; - logic ar_valid, ar_ready, ar_done, ar_bw; - logic r_valid, r_ready, r_done, r_bw; - logic w_valid, w_ready, w_done, w_bw; - logic b_valid, b_ready, b_done; - logic dma_busy; - axi_pkg::len_t aw_len, ar_len; - axi_pkg::size_t aw_size, ar_size; - logic [$clog2(AxiDataWidth/8):0] num_bytes_written; - } dma_events_t; typedef struct packed { int unsigned idx; @@ -406,8 +396,7 @@ module cachepool_tile tcdm_rsp_t [NrTCDMPortsCores-1:0] tcdm_rsp; core_events_t [NrCores-1:0] core_events; - tcdm_events_t tcdm_events; - dma_events_t dma_events; + snitch_icache_pkg::icache_events_t [NrCores-1:0] icache_events; // 4. Memory Subsystem (Core side). @@ -461,11 +450,11 @@ module cachepool_tile data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_rdata; logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_gnt; - logic l1d_insn_valid; - logic [NumL1CtrlTile-1:0] l1d_insn_ready; - logic [1:0] l1d_insn; + // logic l1d_insn_valid; + // logic [NumL1CtrlTile-1:0] l1d_insn_ready; + // logic [1:0] l1d_insn; tcdm_bank_addr_t cfg_spm_size; - logic [NumL1CtrlTile-1:0] l1d_busy; + // logic [NumL1CtrlTile-1:0] l1d_busy; // High if a port access an illegal SPM region (mapped to cache) // logic [NrTCDMPortsCores-1:0] spm_error; @@ -494,26 +483,26 @@ module cachepool_tile assign wide_axi_slv_rsp[SoCDMAOut] = axi_wide_rsp_i[TileMem]; - axi_cut #( - .Bypass (!RegisterExt ), - .aw_chan_t (axi_mst_aw_chan_t), - .w_chan_t (axi_mst_w_chan_t ), - .b_chan_t (axi_mst_b_chan_t ), - .ar_chan_t (axi_mst_ar_chan_t), - .r_chan_t (axi_mst_r_chan_t ), - .axi_req_t (axi_mst_req_t ), - .axi_resp_t (axi_mst_resp_t ) - ) i_cut_ext_narrow_in ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .slv_req_i (axi_in_req_i ), - .slv_resp_o (axi_in_resp_o ), - .mst_req_o (narrow_axi_mst_req[SoCDMAIn]), - .mst_resp_i (narrow_axi_mst_rsp[SoCDMAIn]) - ); - - logic [DmaXbarCfg.NoSlvPorts-1:0][$clog2(DmaXbarCfg.NoMstPorts)-1:0] dma_xbar_default_port; - xbar_rule_t [DmaXbarCfg.NoAddrRules-1:0] dma_xbar_rule; + // axi_cut #( + // .Bypass (!RegisterExt ), + // .aw_chan_t (axi_mst_aw_chan_t), + // .w_chan_t (axi_mst_w_chan_t ), + // .b_chan_t (axi_mst_b_chan_t ), + // .ar_chan_t (axi_mst_ar_chan_t), + // .r_chan_t (axi_mst_r_chan_t ), + // .axi_req_t (axi_mst_req_t ), + // .axi_resp_t (axi_mst_resp_t ) + // ) i_cut_ext_narrow_in ( + // .clk_i (clk_i ), + // .rst_ni (rst_ni ), + // .slv_req_i (axi_in_req_i ), + // .slv_resp_o (axi_in_resp_o ), + // .mst_req_o (narrow_axi_mst_req[SoCDMAIn]), + // .mst_resp_i (narrow_axi_mst_rsp[SoCDMAIn]) + // ); + + logic [WideXbarCfg.NoSlvPorts-1:0][$clog2(WideXbarCfg.NoMstPorts)-1:0] dma_xbar_default_port; + xbar_rule_t [WideXbarCfg.NoAddrRules-1:0] dma_xbar_rule; // Diyou: DMA Xbar move to cluster level @@ -526,9 +515,9 @@ module cachepool_tile } }; - localparam bit [DmaXbarCfg.NoSlvPorts-1:0] DMAEnableDefaultMstPort = '1; + localparam bit [WideXbarCfg.NoSlvPorts-1:0] DMAEnableDefaultMstPort = '1; axi_xbar #( - .Cfg (DmaXbarCfg ), + .Cfg (WideXbarCfg ), .ATOPs (0 ), .slv_aw_chan_t (axi_mst_tile_wide_aw_chan_t), .mst_aw_chan_t (axi_slv_tile_wide_aw_chan_t), @@ -571,13 +560,13 @@ module cachepool_tile // Wire to Cache outputs unmerge_req[j].q = tcdm_req[j].q; // invalidate the request when cache is busy - unmerge_req[j].q_valid = tcdm_req[j].q_valid && !(|l1d_busy); + unmerge_req[j].q_valid = tcdm_req[j].q_valid && !(|l1d_busy_i); unmerge_pready[j] = 1'b1; /***** RSP *****/ tcdm_rsp[j].p = unmerge_rsp[j].p; tcdm_rsp[j].p_valid = unmerge_rsp[j].p_valid; - tcdm_rsp[j].q_ready = unmerge_rsp[j].q_ready && !(|l1d_busy); + tcdm_rsp[j].q_ready = unmerge_rsp[j].q_ready && !(|l1d_busy_i); end end @@ -605,6 +594,7 @@ module cachepool_tile // Used to determine the mapping policy between different cache banks. // Set through CSR logic [$clog2(TCDMAddrWidth)-1:0] dynamic_offset; + assign dynamic_offset = dynamic_offset_i; logic [NrTCDMPortsPerCore-1:0] remote_pready; @@ -762,9 +752,9 @@ module cachepool_tile .rst_ni (rst_ni ), .impl_i ('0 ), // Sync Control - .cache_sync_valid_i (l1d_insn_valid ), - .cache_sync_ready_o (l1d_insn_ready[cb] ), - .cache_sync_insn_i (l1d_insn ), + .cache_sync_valid_i (l1d_insn_valid_i ), + .cache_sync_ready_o (l1d_insn_ready_o[cb] ), + .cache_sync_insn_i (l1d_insn_i ), // SPM Size // The calculation of spm region in cache is different // than other modules (needs to times 2) @@ -943,7 +933,7 @@ module cachepool_tile i_sync_mtip (.clk_i, .rst_ni, .serial_i (mtip_i[i]), .serial_o (irq.mtip)); sync #(.STAGES (2)) i_sync_msip (.clk_i, .rst_ni, .serial_i (msip_i[i]), .serial_o (irq.msip)); - assign irq.mcip = cl_interrupt[i]; + assign irq.mcip = cl_interrupt_i[i]; tcdm_req_t [TcdmPorts-1:0] tcdm_req_wo_user; @@ -984,8 +974,8 @@ module cachepool_tile .acc_issue_req_t (acc_issue_req_t ), .acc_issue_rsp_t (acc_issue_rsp_t ), .acc_rsp_t (acc_rsp_t ), - .dma_events_t (dma_events_t ), - .dma_perf_t (axi_dma_pkg::dma_perf_t ), + // .dma_events_t (dma_events_t ), + // .dma_perf_t (axi_dma_pkg::dma_perf_t ), .XDivSqrt (1'b0 ), .XF16 (1'b1 ), .XF16ALT (1'b0 ), @@ -1075,8 +1065,8 @@ module cachepool_tile .clk_i ( clk_i ), .clk_d2_i ( clk_i ), .rst_ni ( rst_ni ), - .enable_prefetching_i ( icache_prefetch_enable ), - .icache_events_o ( icache_events ), + .enable_prefetching_i ( icache_prefetch_enable_i ), + .icache_events_o ( icache_events_o ), .flush_valid_i ( flush_valid ), .flush_ready_o ( flush_ready ), .inst_addr_i ( inst_addr ), @@ -1138,6 +1128,8 @@ module cachepool_tile .DataWidth (NarrowDataWidth ), .AxiUserWidth (NarrowUserWidth ), .UserWidth ($bits(tcdm_user_t) ), + .ID ( 1 ), + // .WriteRspEn ( 1'b0 ), .reqrsp_req_t (reqrsp_req_t ), .reqrsp_rsp_t (reqrsp_rsp_t ), .axi_req_t (axi_mst_req_t ), @@ -1199,74 +1191,17 @@ module cachepool_tile .default_mst_port_i (ClusterXbarDefaultPort ) ); - // 2. Peripherals - // Diyou: should we move it to cluster level? - axi_to_reg #( - .ADDR_WIDTH (AxiAddrWidth ), - .DATA_WIDTH (NarrowDataWidth ), - .AXI_MAX_WRITE_TXNS (1 ), - .AXI_MAX_READ_TXNS (1 ), - .DECOUPLE_W (0 ), - .ID_WIDTH (NarrowIdWidthOut ), - .USER_WIDTH (NarrowUserWidth ), - .axi_req_t (axi_slv_req_t ), - .axi_rsp_t (axi_slv_resp_t ), - .reg_req_t (reg_req_t ), - .reg_rsp_t (reg_rsp_t ) - ) i_axi_to_reg ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .testmode_i (1'b0 ), - .axi_req_i (narrow_axi_slv_req[ClusterPeripherals]), - .axi_rsp_o (narrow_axi_slv_rsp[ClusterPeripherals]), - .reg_req_o (reg_req ), - .reg_rsp_i (reg_rsp ) - ); - - assign dma_events = '0; - - spatz_cluster_peripheral #( - .AddrWidth (AxiAddrWidth ), - .SPMWidth ($clog2(L1NumSet)), - .NumCacheCtrl (NumL1CtrlTile ), - .reg_req_t (reg_req_t ), - .reg_rsp_t (reg_rsp_t ), - .tcdm_events_t (tcdm_events_t ), - .dma_events_t (dma_events_t ), - .NrCores (NrCores ) - ) i_snitch_cluster_peripheral ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .eoc_o (eoc_o ), - .reg_req_i (reg_req ), - .reg_rsp_o (reg_rsp ), - /// The TCDM always starts at the cluster base. - .tcdm_start_address_i (tcdm_start_address ), - .tcdm_end_address_i (tcdm_end_address ), - .icache_prefetch_enable_o (icache_prefetch_enable), - .cl_clint_o (cl_interrupt ), - .cluster_hart_base_id_i (hart_base_id_i ), - .core_events_i (core_events ), - .tcdm_events_i (tcdm_events ), - .dma_events_i (dma_events ), - .icache_events_i (icache_events ), - .cluster_probe_o (tile_probe_o ), - .dynamic_offset_o (dynamic_offset ), - .l1d_spm_size_o (cfg_spm_size ), - .l1d_insn_o (l1d_insn ), - .l1d_insn_valid_o (l1d_insn_valid ), - // TODO: Here we only check controller 0 - .l1d_insn_ready_i (l1d_insn_ready ), - .l1d_busy_o (l1d_busy ) - ); - // 3. BootROM assign axi_wide_req_o[TileBootROM] = wide_axi_slv_req[BootROM]; assign wide_axi_slv_rsp[BootROM] = axi_wide_rsp_i[TileBootROM]; // 4. UART - assign axi_out_req_o = narrow_axi_slv_req[UART]; - assign narrow_axi_slv_rsp[UART] = axi_out_resp_i; + assign axi_out_req_o[0] = narrow_axi_slv_req[UART]; + assign narrow_axi_slv_rsp[UART] = axi_out_resp_i[0]; + + assign axi_out_req_o[1] = narrow_axi_slv_req[ClusterPeripherals]; + assign narrow_axi_slv_rsp[ClusterPeripherals] = axi_out_resp_i[1]; + // Upsize the narrow SoC connection `AXI_TYPEDEF_ALL(axi_mst_core_narrow, addr_t, id_wide_mst_t, data_t, strb_t, user_t) @@ -1328,25 +1263,25 @@ module cachepool_tile // -------------------- // TCDM event counters // -------------------- - logic [NrTCDMPortsCores-1:0] flat_acc, flat_con; - for (genvar i = 0; i < NrTCDMPortsCores; i++) begin : gen_event_counter - `FFARN(flat_acc[i], tcdm_req[i].q_valid, '0, clk_i, rst_ni) - `FFARN(flat_con[i], tcdm_req[i].q_valid & ~tcdm_rsp[i].q_ready, '0, clk_i, rst_ni) - end - - popcount #( - .INPUT_WIDTH ( NrTCDMPortsCores ) - ) i_popcount_req ( - .data_i ( flat_acc ), - .popcount_o ( tcdm_events.inc_accessed ) - ); + // logic [NrTCDMPortsCores-1:0] flat_acc, flat_con; + // for (genvar i = 0; i < NrTCDMPortsCores; i++) begin : gen_event_counter + // `FFARN(flat_acc[i], tcdm_req[i].q_valid, '0, clk_i, rst_ni) + // `FFARN(flat_con[i], tcdm_req[i].q_valid & ~tcdm_rsp[i].q_ready, '0, clk_i, rst_ni) + // end - popcount #( - .INPUT_WIDTH ( NrTCDMPortsCores ) - ) i_popcount_con ( - .data_i ( flat_con ), - .popcount_o ( tcdm_events.inc_congested ) - ); + // popcount #( + // .INPUT_WIDTH ( NrTCDMPortsCores ) + // ) i_popcount_req ( + // .data_i ( flat_acc ), + // .popcount_o ( tcdm_events.inc_accessed ) + // ); + + // popcount #( + // .INPUT_WIDTH ( NrTCDMPortsCores ) + // ) i_popcount_con ( + // .data_i ( flat_con ), + // .popcount_o ( tcdm_events.inc_congested ) + // ); // ------------- // Sanity Checks diff --git a/sim/scripts/vsim_tile.tcl b/sim/scripts/vsim_tile.tcl index 2c12f19..99fe8f1 100644 --- a/sim/scripts/vsim_tile.tcl +++ b/sim/scripts/vsim_tile.tcl @@ -8,7 +8,7 @@ onerror {resume} set tile_path $2 # Add waves for tcdm_mapper and csrs -add wave -noupdate -group tile[$1] -group CSR ${tile_path}/i_tile/i_snitch_cluster_peripheral/* +add wave -noupdate -group tile[$1] -group Barrier ${tile_path}/i_tile/i_snitch_barrier/* # add wave -noupdate -group tile[$1] -group axi2reqrsp ${tile_path}/i_axi2reqrsp/* # Add waves for xbars add wave -noupdate -group tile[$1] -group narrow_xbar ${tile_path}/i_tile/i_axi_narrow_xbar/* diff --git a/sim/scripts/vsim_wave.tcl b/sim/scripts/vsim_wave.tcl index 6444bf6..a2d8fa3 100644 --- a/sim/scripts/vsim_wave.tcl +++ b/sim/scripts/vsim_wave.tcl @@ -16,6 +16,8 @@ add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_ add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* +add wave -noupdate -group Cluster -group CSR ${cluster_path}/i_cachepool_cluster_peripheral/* + add wave -noupdate -group Cluster -group Internal ${cluster_path}/* add wave -noupdate -group Group ${group_path}/* diff --git a/sim/scripts/vsim_wave_single_tile.tcl b/sim/scripts/vsim_wave_single_tile.tcl index 4c04754..369ddb0 100644 --- a/sim/scripts/vsim_wave_single_tile.tcl +++ b/sim/scripts/vsim_wave_single_tile.tcl @@ -16,6 +16,8 @@ add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_ add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* +add wave -noupdate -group Cluster -group CSR ${cluster_path}/i_cachepool_cluster_peripheral/* + add wave -noupdate -group Cluster -group Internal ${cluster_path}/* set tile_path ${group_path}/gen_tile From c15fb5432dd63caf38fee30b10fc05bf5292ab33 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Mon, 5 Jan 2026 14:27:18 +0100 Subject: [PATCH 07/23] [TB] Fix a bug in testbench of incorrectly using negedge instead of posedge. --- hardware/tb/tb_cachepool.sv | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/hardware/tb/tb_cachepool.sv b/hardware/tb/tb_cachepool.sv index 284e85e..355e63e 100644 --- a/hardware/tb/tb_cachepool.sv +++ b/hardware/tb/tb_cachepool.sv @@ -12,7 +12,7 @@ import "DPI-C" function int get_entry_point(); `define wait_for(signal) \ do \ - @(negedge clk); \ + @(posedge clk); \ while (!signal); `include "axi/assign.svh" @@ -158,6 +158,8 @@ module tb_cachepool; .reqrsp_rsp_o(to_cluster_rsp ) ); + + logic [31:0] entry_point; // Simulation Sequence @@ -170,7 +172,7 @@ module tb_cachepool; // Wait for a while repeat (10) - @(negedge clk); + @(posedge clk); // Load the entry point entry_point = get_entry_point(); @@ -178,7 +180,7 @@ module tb_cachepool; // Wait for a while repeat (1000) - @(negedge clk); + @(posedge clk); // Store the entry point in the Spatz cluster to_cluster_req = '{ @@ -204,13 +206,14 @@ module tb_cachepool; }, default: '0 }; - @(negedge clk); + + @(posedge clk); to_cluster_req = '0; // Wake up cores debug_req = '1; - @(negedge clk); + @(posedge clk); debug_req = '0; // Wait for end of computing signal From ea793a6a72f1321853a7aa1483ec1e050143edb3 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Tue, 6 Jan 2026 14:39:04 +0100 Subject: [PATCH 08/23] [SRC] WIP: Adapt package for readability, keep working on multi-tile configuration. --- Makefile | 1 + hardware/src/cachepool_cluster.sv | 316 +++++++++--------- hardware/src/cachepool_group.sv | 102 +++--- hardware/src/cachepool_pkg.sv | 529 +++++++++++++++--------------- hardware/src/cachepool_tile.sv | 8 +- 5 files changed, 489 insertions(+), 467 deletions(-) diff --git a/Makefile b/Makefile index 11525b2..be9d43f 100644 --- a/Makefile +++ b/Makefile @@ -277,6 +277,7 @@ vsim: dpi ${SIMBIN_DIR}/cachepool_cluster.vsim .PHONY: clean clean: clean.sw clean.vsim + rm -rf $(HJSON_OUT) ######## # Lint # diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index 3964910..6c8eb48 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -146,8 +146,8 @@ module cachepool_cluster output axi_narrow_req_t axi_narrow_req_o, input axi_narrow_resp_t axi_narrow_resp_i, /// AXI Core cluster out-port to main memory. - output axi_out_req_t [NumClusterSlv-1:0] axi_out_req_o, - input axi_out_resp_t [NumClusterSlv-1:0] axi_out_resp_i, + output axi_out_req_t [ClusterWideOutAxiPorts-1:0] axi_out_req_o, + input axi_out_resp_t [ClusterWideOutAxiPorts-1:0] axi_out_resp_i, /// SRAM Configuration: L1D Data + L1D Tag + L1D FIFO + L1I Data + L1I Tag input impl_in_t [NrSramCfg-1:0] impl_i, /// Indicate the program execution is error @@ -177,7 +177,7 @@ module cachepool_cluster // Cache XBar configuration struct localparam axi_pkg::xbar_cfg_t CacheXbarCfg = '{ NoSlvPorts : NumClusterMst*NumTiles, - NoMstPorts : NumClusterSlv, + NoMstPorts : ClusterWideOutAxiPorts, MaxMstTrans : MaxMstTrans, MaxSlvTrans : MaxSlvTrans, FallThrough : 1'b0, @@ -187,7 +187,7 @@ module cachepool_cluster UniqueIds : 1'b0, AxiAddrWidth : AxiAddrWidth, AxiDataWidth : AxiDataWidth, - NoAddrRules : NumClusterSlv - 1, + NoAddrRules : ClusterWideOutAxiPorts - 1, default : '0 }; @@ -218,16 +218,16 @@ module cachepool_cluster // Wire Definitions // ---------------- // 1. AXI - axi_mst_cache_req_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_req; - axi_mst_cache_resp_t [NumTiles-1:0][NumTileWideAxi-1:0] axi_tile_rsp; - axi_slv_cache_req_t [NumClusterSlv-1 :0] wide_axi_slv_req; - axi_slv_cache_resp_t [NumClusterSlv-1 :0] wide_axi_slv_rsp; + axi_mst_cache_req_t [NumTiles-1:0][TileNarrowAxiPorts-1:0] axi_tile_req; + axi_mst_cache_resp_t [NumTiles-1:0][TileNarrowAxiPorts-1:0] axi_tile_rsp; + axi_slv_cache_req_t [ClusterWideOutAxiPorts-1 :0] wide_axi_slv_req; + axi_slv_cache_resp_t [ClusterWideOutAxiPorts-1 :0] wide_axi_slv_rsp; axi_narrow_req_t [NumTiles-1:0][1:0] axi_out_req; axi_narrow_resp_t [NumTiles-1:0][1:0] axi_out_resp; // 2. BootROM - reg_cache_req_t bootrom_reg_req; - reg_cache_rsp_t bootrom_reg_rsp; + reg_cache_req_t [NumTiles-1:0] bootrom_reg_req; + reg_cache_rsp_t [NumTiles-1:0] bootrom_reg_rsp; // --------------- // CachePool Tile @@ -243,25 +243,25 @@ module cachepool_cluster cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; - l2_req_t [NumClusterSlv-1 :0] l2_req; - l2_rsp_t [NumClusterSlv-1 :0] l2_rsp; + l2_req_t [ClusterWideOutAxiPorts-1 :0] l2_req; + l2_rsp_t [ClusterWideOutAxiPorts-1 :0] l2_rsp; - cache_trans_req_chan_t [NumClusterSlv-1 :0] l2_req_chan; - cache_trans_rsp_chan_t [NumClusterSlv-1 :0] l2_rsp_chan; - logic [NumClusterSlv-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready; + cache_trans_req_chan_t [ClusterWideOutAxiPorts-1 :0] l2_req_chan; + cache_trans_rsp_chan_t [ClusterWideOutAxiPorts-1 :0] l2_rsp_chan; + logic [ClusterWideOutAxiPorts-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready; typedef logic [$clog2(NumClusterMst*NumTiles)-1:0] l2_sel_t; // one more bit for out-of-range alert - typedef logic [$clog2(NumClusterSlv) :0] tile_sel_err_t; - typedef logic [$clog2(NumClusterSlv)-1 :0] tile_sel_t; + typedef logic [$clog2(ClusterWideOutAxiPorts) :0] tile_sel_err_t; + typedef logic [$clog2(ClusterWideOutAxiPorts)-1 :0] tile_sel_t; // Which l2 we want to select for each req tile_sel_err_t [NumTiles*NumClusterMst-1 :0] tile_sel_err; tile_sel_t [NumTiles*NumClusterMst-1 :0] tile_sel; // Which tile we selected for each req - l2_sel_t [NumClusterSlv-1 :0] tile_selected; + l2_sel_t [ClusterWideOutAxiPorts-1 :0] tile_selected; // which tile we want to select for each rsp - l2_sel_t [NumClusterSlv-1 :0] l2_sel; + l2_sel_t [ClusterWideOutAxiPorts-1 :0] l2_sel; // What is the priority for response wiring? // Here we want to make sure the responses from one burst // continues until done @@ -278,8 +278,8 @@ module cachepool_cluster for (genvar port = 0; port < NumTiles*NumClusterMst; port ++) begin : gen_rsp_rr tile_sel_t l2_rr; - logic [NumClusterSlv-1:0] arb_valid; - for (genvar i = 0; i < NumClusterSlv; i ++) begin + logic [ClusterWideOutAxiPorts-1:0] arb_valid; + for (genvar i = 0; i < ClusterWideOutAxiPorts; i ++) begin // Used to check the round-robin selection assign arb_valid[i] = (l2_rsp_chan[i].user.bank_id == port) & l2_rsp_valid[i]; end @@ -317,7 +317,7 @@ module cachepool_cluster // We use the rr_arb_tree to get the round-robin selection // No data is needed here, only need the handshaking rr_arb_tree #( - .NumIn ( NumClusterSlv ), + .NumIn ( ClusterWideOutAxiPorts ), .DataType ( logic ), .ExtPrio ( 1'b0 ), .AxiVldRdy ( 1'b1 ), @@ -400,7 +400,6 @@ module cachepool_cluster ) i_group ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - // .eoc_o ( eoc_o ), .impl_i ( impl_i ), .error_o ( error_o ), .debug_req_i ( debug_req_i ), @@ -409,37 +408,45 @@ module cachepool_cluster .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - .group_probe_o ( group_probe ), - .axi_in_req_i ( axi_in_req_i ), - .axi_in_rsp_o ( axi_in_resp_o ), + // .axi_in_req_i ( axi_in_req_i ), + // .axi_in_rsp_o ( axi_in_resp_o ), .axi_narrow_req_o ( axi_out_req ), .axi_narrow_rsp_i ( axi_out_resp ), + .axi_wide_req_o ( axi_tile_req ), + .axi_wide_rsp_i ( axi_tile_rsp ), // Cache Refill Ports .cache_refill_req_o ( cache_refill_req ), .cache_refill_rsp_i ( cache_refill_rsp ), - .axi_wide_req_o ( axi_tile_req ), - .axi_wide_rsp_i ( axi_tile_rsp ) + // Peripherals + .icache_events_o ( icache_events ), + .icache_prefetch_enable_i ( icache_prefetch_enable ), + .cl_interrupt_i ( cl_interrupt ), + .dynamic_offset_i ( dynamic_offset ), + .l1d_insn_i ( l1d_insn ), + .l1d_insn_valid_i ( l1d_insn_valid ), + .l1d_insn_ready_o ( l1d_insn_ready ), + .l1d_busy_i ( l1d_busy ) ); for (genvar t = 0; t < NumTiles; t ++) begin : gen_axi_converter axi_to_reqrsp #( - .axi_req_t (axi_mst_cache_req_t ), - .axi_rsp_t (axi_mst_cache_resp_t ), - .AddrWidth (AxiAddrWidth ), - .DataWidth (AxiDataWidth ), - .UserWidth ($bits(refill_user_t) ), - .IdWidth (AxiIdWidthIn ), - .BufDepth (NumSpatzOutstandingLoads ), - .reqrsp_req_t (cache_trans_req_t ), - .reqrsp_rsp_t (cache_trans_rsp_t ) + .axi_req_t ( axi_mst_cache_req_t ), + .axi_rsp_t ( axi_mst_cache_resp_t ), + .AddrWidth ( AxiAddrWidth ), + .DataWidth ( AxiDataWidth ), + .UserWidth ( $bits(refill_user_t) ), + .IdWidth ( AxiIdWidthIn ), + .BufDepth ( NumSpatzOutstandingLoads ), + .reqrsp_req_t ( cache_trans_req_t ), + .reqrsp_rsp_t ( cache_trans_rsp_t ) ) i_axi2reqrsp ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .busy_o ( ), - .axi_req_i (axi_tile_req [t][TileMem]), - .axi_rsp_o (axi_tile_rsp [t][TileMem]), - .reqrsp_req_o (cache_core_req[t] ), - .reqrsp_rsp_i (cache_core_rsp[t] ) + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .busy_o ( ), + .axi_req_i ( axi_tile_req [t][TileMem] ), + .axi_rsp_o ( axi_tile_rsp [t][TileMem] ), + .reqrsp_req_o ( cache_core_req[t] ), + .reqrsp_rsp_i ( cache_core_rsp[t] ) ); end @@ -512,34 +519,34 @@ module cachepool_cluster .axi_wide_req_o ( axi_tile_req[0] ), .axi_wide_rsp_i ( axi_tile_rsp[0] ), // Peripherals - .icache_events_o (icache_events ), - .icache_prefetch_enable_i (icache_prefetch_enable ), - .cl_interrupt_i (cl_interrupt ), - .dynamic_offset_i (dynamic_offset ), - .l1d_insn_i (l1d_insn ), - .l1d_insn_valid_i (l1d_insn_valid ), - .l1d_insn_ready_o (l1d_insn_ready ), - .l1d_busy_i (l1d_busy ) + .icache_events_o ( icache_events ), + .icache_prefetch_enable_i ( icache_prefetch_enable ), + .cl_interrupt_i ( cl_interrupt ), + .dynamic_offset_i ( dynamic_offset ), + .l1d_insn_i ( l1d_insn ), + .l1d_insn_valid_i ( l1d_insn_valid ), + .l1d_insn_ready_o ( l1d_insn_ready ), + .l1d_busy_i ( l1d_busy ) ); axi_to_reqrsp #( - .axi_req_t (axi_mst_cache_req_t ), - .axi_rsp_t (axi_mst_cache_resp_t ), - .AddrWidth (AxiAddrWidth ), - .DataWidth (AxiDataWidth ), - .UserWidth ($bits(refill_user_t) ), - .IdWidth (AxiIdWidthIn ), - .BufDepth (NumSpatzOutstandingLoads ), - .reqrsp_req_t (cache_trans_req_t ), - .reqrsp_rsp_t (cache_trans_rsp_t ) + .axi_req_t ( axi_mst_cache_req_t ), + .axi_rsp_t ( axi_mst_cache_resp_t ), + .AddrWidth ( AxiAddrWidth ), + .DataWidth ( AxiDataWidth ), + .UserWidth ( $bits(refill_user_t) ), + .IdWidth ( AxiIdWidthIn ), + .BufDepth ( NumSpatzOutstandingLoads ), + .reqrsp_req_t ( cache_trans_req_t ), + .reqrsp_rsp_t ( cache_trans_rsp_t ) ) i_axi2reqrsp ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .busy_o ( ), - .axi_req_i (axi_tile_req [0][TileMem]), - .axi_rsp_o (axi_tile_rsp [0][TileMem]), - .reqrsp_req_o (cache_core_req[0] ), - .reqrsp_rsp_i (cache_core_rsp[0] ) + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .busy_o ( ), + .axi_req_i ( axi_tile_req [0][TileMem] ), + .axi_rsp_o ( axi_tile_rsp [0][TileMem] ), + .reqrsp_req_o ( cache_core_req[0] ), + .reqrsp_rsp_i ( cache_core_rsp[0] ) ); end @@ -580,9 +587,9 @@ module cachepool_cluster logic [AxiAddrWidth-1:0] mask; } reqrsp_rule_t; - reqrsp_rule_t [NumClusterSlv-1:0] xbar_rule; + reqrsp_rule_t [ClusterWideOutAxiPorts-1:0] xbar_rule; - for (genvar i = 0; i < NumClusterSlv; i ++) begin + for (genvar i = 0; i < ClusterWideOutAxiPorts; i ++) begin assign xbar_rule[i] = '{ idx : i, base : DramAddr + DramPerChSize * i, @@ -590,13 +597,13 @@ module cachepool_cluster }; end - logic [$clog2(NumClusterSlv):0] default_idx; - assign default_idx = NumClusterSlv; + logic [$clog2(ClusterWideOutAxiPorts):0] default_idx; + assign default_idx = ClusterWideOutAxiPorts; for (genvar inp = 0; inp < NumClusterMst*NumTiles; inp ++) begin : gen_xbar_sel addr_decode_napot #( - .NoIndices (NumClusterSlv+1 ), - .NoRules (NumClusterSlv ), + .NoIndices (ClusterWideOutAxiPorts+1 ), + .NoRules (ClusterWideOutAxiPorts ), .addr_t (axi_addr_t ), .rule_t (reqrsp_rule_t ) ) i_snitch_decode_napot ( @@ -609,12 +616,12 @@ module cachepool_cluster .default_idx_i (default_idx ) ); - assign tile_sel[inp] = tile_sel_err[inp][$clog2(NumClusterSlv)-1:0]; + assign tile_sel[inp] = tile_sel_err[inp][$clog2(ClusterWideOutAxiPorts)-1:0]; `ifndef TARGET_SYNTHESIS // Alert the system that we have illegal memory access IllegalMemAccess : assert property( - @(posedge clk_i) disable iff (!rst_ni) (tile_req_valid[inp] |-> !tile_sel_err[inp][$clog2(NumClusterSlv)])) + @(posedge clk_i) disable iff (!rst_ni) (tile_req_valid[inp] |-> !tile_sel_err[inp][$clog2(ClusterWideOutAxiPorts)])) else $error("Visited illegal address: time=%0t, port=%0d, addr=0x%08h", $time, inp, tile_req_chan[inp].addr); // else $fatal (1, "Visited address is not mapped"); `endif @@ -622,7 +629,7 @@ module cachepool_cluster reqrsp_xbar #( .NumInp (NumClusterMst*NumTiles ), - .NumOut (NumClusterSlv ), + .NumOut (ClusterWideOutAxiPorts ), .PipeReg (1'b1 ), .ExtReqPrio (1'b0 ), .ExtRspPrio (Burst_Enable ), @@ -650,7 +657,7 @@ module cachepool_cluster .mst_sel_i (l2_sel ) ); - for (genvar ch = 0; ch < NumClusterSlv; ch++) begin + for (genvar ch = 0; ch < ClusterWideOutAxiPorts; ch++) begin // To L2 Channels always_comb begin l2_req[ch].q = '{ @@ -679,7 +686,7 @@ module cachepool_cluster end end - for (genvar ch = 0; ch < NumClusterSlv; ch ++) begin : gen_output_axi + for (genvar ch = 0; ch < ClusterWideOutAxiPorts; ch ++) begin : gen_output_axi reqrsp_to_axi #( .MaxTrans (NumSpatzOutstandingLoads ), .ID ('0 ), @@ -704,14 +711,12 @@ module cachepool_cluster ); end - assign axi_narrow_req_o = axi_out_req[0][0]; - assign axi_out_resp[0][0] = axi_narrow_resp_i; // ------------- - // DMA Subsystem + // To Main Memory // ------------- // Optionally decouple the external wide AXI master port. - for (genvar port = 0; port < NumClusterSlv; port ++) begin : gen_axi_out_cut + for (genvar port = 0; port < ClusterWideOutAxiPorts; port ++) begin : gen_axi_out_cut axi_cut #( .Bypass (0 ), .aw_chan_t (axi_slv_cache_aw_chan_t ), @@ -735,52 +740,49 @@ module cachepool_cluster // Slaves // --------- - // TODO: Add MUX for multi-Tile - // BootROM - // axi_mux #( - - // ) i_axi_bootrom_mux ( - - // ) - - if (NumTiles > 1) - assign axi_tile_rsp[1][TileBootROM] = '0; - - axi_to_reg #( - .ADDR_WIDTH (AxiAddrWidth ), - .DATA_WIDTH (AxiDataWidth ), - .AXI_MAX_WRITE_TXNS (1 ), - .AXI_MAX_READ_TXNS (1 ), - .DECOUPLE_W (0 ), - .ID_WIDTH (WideIdWidthIn ), - .USER_WIDTH (AxiUserWidth ), - .axi_req_t (axi_mst_cache_req_t ), - .axi_rsp_t (axi_mst_cache_resp_t), - .reg_req_t (reg_cache_req_t ), - .reg_rsp_t (reg_cache_rsp_t ) - ) i_axi_to_reg_bootrom ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .testmode_i (1'b0 ), - .axi_req_i (axi_tile_req[0][TileBootROM]), - .axi_rsp_o (axi_tile_rsp[0][TileBootROM]), - .reg_req_o (bootrom_reg_req ), - .reg_rsp_i (bootrom_reg_rsp ) - ); + /***** UART ****/ + // TODO: Mux for uart + assign axi_narrow_req_o = axi_out_req[0][ClusterUart]; + assign axi_out_resp[0][ClusterUart] = axi_narrow_resp_i; + + /***** BootROM ****/ + for (genvar t = 0; t < NumTiles; t++) begin : gen_bootrom + axi_to_reg #( + .ADDR_WIDTH (AxiAddrWidth ), + .DATA_WIDTH (AxiDataWidth ), + .AXI_MAX_WRITE_TXNS (1 ), + .AXI_MAX_READ_TXNS (1 ), + .DECOUPLE_W (0 ), + .ID_WIDTH (WideIdWidthIn ), + .USER_WIDTH (AxiUserWidth ), + .axi_req_t (axi_mst_cache_req_t ), + .axi_rsp_t (axi_mst_cache_resp_t), + .reg_req_t (reg_cache_req_t ), + .reg_rsp_t (reg_cache_rsp_t ) + ) i_axi_to_reg_bootrom ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .testmode_i (1'b0 ), + .axi_req_i (axi_tile_req[t][TileBootROM] ), + .axi_rsp_o (axi_tile_rsp[t][TileBootROM] ), + .reg_req_o (bootrom_reg_req[t] ), + .reg_rsp_i (bootrom_reg_rsp[t] ) + ); - bootrom i_bootrom ( - .clk_i (clk_i ), - .req_i (bootrom_reg_req.valid ), - .addr_i (addr_t'(bootrom_reg_req.addr)), - .rdata_o(bootrom_reg_rsp.rdata ) - ); + bootrom i_bootrom ( + .clk_i (clk_i ), + .req_i (bootrom_reg_req[t].valid ), + .addr_i (addr_t'(bootrom_reg_req[t].addr) ), + .rdata_o(bootrom_reg_rsp[t].rdata ) + ); - `FF(bootrom_reg_rsp.ready, bootrom_reg_req.valid, 1'b0) + `FF(bootrom_reg_rsp[t].ready, bootrom_reg_req[t].valid, 1'b0) - assign bootrom_reg_rsp.error = 1'b0; + assign bootrom_reg_rsp[t].error = 1'b0; + end - // CSR/Peripherals + /***** CSR/Peripherals *****/ `REG_BUS_TYPEDEF_ALL(reg, narrow_addr_t, narrow_data_t, narrow_strb_t) @@ -790,35 +792,45 @@ module cachepool_cluster axi_csr_slv_req_t axi_csr_req; axi_csr_slv_resp_t axi_csr_rsp; + axi_narrow_req_t [NumTiles-1:0] axi_core_csr_req; + axi_narrow_resp_t [NumTiles-1:0] axi_core_csr_rsp; + + + for (genvar t = 0; t < NumTiles; t++) begin + assign axi_core_csr_req[t] = axi_out_req [t][ClusterPeriph]; + assign axi_out_resp [t][ClusterPeriph] = axi_core_csr_rsp[t]; + end + + axi_mux #( - .SlvAxiIDWidth ( ClusterAxiIdWidth ), - .slv_aw_chan_t ( axi_csr_mst_aw_chan_t ), // AW Channel Type, slave ports - .mst_aw_chan_t ( axi_csr_slv_aw_chan_t ), // AW Channel Type, master port - .w_chan_t ( axi_csr_slv_w_chan_t ), // W Channel Type, all ports - .slv_b_chan_t ( axi_csr_mst_b_chan_t ), // B Channel Type, slave ports - .mst_b_chan_t ( axi_csr_slv_b_chan_t ), // B Channel Type, master port - .slv_ar_chan_t ( axi_csr_mst_ar_chan_t ), // AR Channel Type, slave ports - .mst_ar_chan_t ( axi_csr_slv_ar_chan_t ), // AR Channel Type, master port - .slv_r_chan_t ( axi_csr_mst_r_chan_t ), // R Channel Type, slave ports - .mst_r_chan_t ( axi_csr_slv_r_chan_t ), // R Channel Type, master port - .slv_req_t ( axi_csr_mst_req_t ), - .slv_resp_t ( axi_csr_mst_resp_t ), - .mst_req_t ( axi_csr_slv_req_t ), - .mst_resp_t ( axi_csr_slv_resp_t ), - .NoSlvPorts ( NumTiles + 1 ), // Number of Masters for the module - .FallThrough ( 0 ), - .SpillAw ( XbarLatency[4] ), - .SpillW ( XbarLatency[3] ), - .SpillB ( XbarLatency[2] ), - .SpillAr ( XbarLatency[1] ), - .SpillR ( XbarLatency[0] ), - .MaxWTrans ( 2 ) + .SlvAxiIDWidth ( ClusterAxiIdWidth ), + .slv_aw_chan_t ( axi_csr_mst_aw_chan_t ), // AW Channel Type, slave ports + .mst_aw_chan_t ( axi_csr_slv_aw_chan_t ), // AW Channel Type, master port + .w_chan_t ( axi_csr_slv_w_chan_t ), // W Channel Type, all ports + .slv_b_chan_t ( axi_csr_mst_b_chan_t ), // B Channel Type, slave ports + .mst_b_chan_t ( axi_csr_slv_b_chan_t ), // B Channel Type, master port + .slv_ar_chan_t ( axi_csr_mst_ar_chan_t ), // AR Channel Type, slave ports + .mst_ar_chan_t ( axi_csr_slv_ar_chan_t ), // AR Channel Type, master port + .slv_r_chan_t ( axi_csr_mst_r_chan_t ), // R Channel Type, slave ports + .mst_r_chan_t ( axi_csr_slv_r_chan_t ), // R Channel Type, master port + .slv_req_t ( axi_csr_mst_req_t ), + .slv_resp_t ( axi_csr_mst_resp_t ), + .mst_req_t ( axi_csr_slv_req_t ), + .mst_resp_t ( axi_csr_slv_resp_t ), + .NoSlvPorts ( NumTiles + 1 ), // Number of Masters for the module + .FallThrough ( 0 ), + .SpillAw ( XbarLatency[4] ), + .SpillW ( XbarLatency[3] ), + .SpillB ( XbarLatency[2] ), + .SpillAr ( XbarLatency[1] ), + .SpillR ( XbarLatency[0] ), + .MaxWTrans ( 2 ) ) i_axi_csr_mux ( - .clk_i ( clk_i ), // Clock - .rst_ni ( rst_ni ), // Asynchronous reset active low - .test_i ('0), // Test Mode enable - .slv_reqs_i ( {axi_in_req_i, axi_out_req [0][1]} ), - .slv_resps_o ( {axi_in_resp_o, axi_out_resp[0][1]} ), + .clk_i ( clk_i ), // Clock + .rst_ni ( rst_ni ), // Asynchronous reset active low + .test_i ('0 ), // Test Mode enable + .slv_reqs_i ( {axi_in_req_i, axi_core_csr_req} ), + .slv_resps_o ( {axi_in_resp_o, axi_core_csr_rsp} ), .mst_req_o ( axi_csr_req ), .mst_resp_i ( axi_csr_rsp ) ); @@ -877,7 +889,7 @@ module cachepool_cluster spatz_cluster_peripheral #( .AddrWidth (AxiAddrWidth ), .SPMWidth ($clog2(L1NumSet)), - .NumCacheCtrl (NumL1CtrlTile ), + .NumCacheCtrl (NumL1CacheCtrl ), .reg_req_t (reg_req_t ), .reg_rsp_t (reg_rsp_t ), .tcdm_events_t (tcdm_events_t ), diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 41d56ee..69ba21e 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -24,6 +24,7 @@ module cachepool_group import spatz_pkg::*; import fpnew_pkg::fpu_implementation_t; import snitch_pma_pkg::snitch_pma_t; + import snitch_icache_pkg::icache_events_t; #( /// Width of physical address. parameter int unsigned AxiAddrWidth = 48, @@ -116,7 +117,7 @@ module cachepool_group /// corresponding core into debug mode. This signal is assumed to be _async_. input logic [NrCores-1:0] debug_req_i, /// End of Computing indicator to notify the host/tb - output logic eoc_o, + // output logic eoc_o, /// Machine external interrupt pending. Usually those interrupts come from a /// platform-level interrupt controller. This signal is assumed to be _async_. input logic [NrCores-1:0] meip_i, @@ -137,22 +138,32 @@ module cachepool_group input logic [AxiAddrWidth-1:0] cluster_base_addr_i, /// Per-cluster probe on the cluster status. Can be written by the cores to indicate /// to the overall system that the cluster is executing something. - output logic [NumTiles-1:0] group_probe_o, - /// AXI Core cluster in-port. - input axi_in_req_t axi_in_req_i, - output axi_in_resp_t axi_in_rsp_o, - /// AXI Narrow out-port (UART) - output axi_narrow_req_t [NumTiles-1:0] axi_narrow_req_o, - input axi_narrow_resp_t [NumTiles-1:0] axi_narrow_rsp_i, + // output logic [NumTiles-1:0] group_probe_o, + // /// AXI Core cluster in-port. + // input axi_in_req_t axi_in_req_i, + // output axi_in_resp_t axi_in_rsp_o, + /// AXI Narrow out-port (UART/Peripheral) + output axi_narrow_req_t [GroupNarrowAxiPorts-1:0] axi_narrow_req_o, + input axi_narrow_resp_t [GroupNarrowAxiPorts-1:0] axi_narrow_rsp_i, /// Wide AXI ports to cluster level - output axi_out_req_t [NumTiles*NumTileWideAxi-1:0] axi_wide_req_o, - input axi_out_resp_t [NumTiles*NumTileWideAxi-1:0] axi_wide_rsp_i, + output axi_out_req_t [GroupWideAxiPorts-1:0] axi_wide_req_o, + input axi_out_resp_t [GroupWideAxiPorts-1:0] axi_wide_rsp_i, /// Cache refill ports - output cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req_o, - input cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp_i, - - /// SRAM Configuration: L1D Data + L1D Tag + L1D FIFO + L1I Data + L1I Tag + output cache_trans_req_t [NumL1CacheCtrl-1:0] cache_refill_req_o, + input cache_trans_rsp_t [NumL1CacheCtrl-1:0] cache_refill_rsp_i, + + /// Peripheral signals + output icache_events_t [NrCores-1:0] icache_events_o, + input logic icache_prefetch_enable_i, + input logic [NrCores-1:0] cl_interrupt_i, + input logic [$clog2(AxiAddrWidth)-1:0] dynamic_offset_i, + input logic [1:0] l1d_insn_i, + input logic l1d_insn_valid_i, + output logic [NumL1CacheCtrl-1:0] l1d_insn_ready_o, + input logic [NumL1CacheCtrl-1:0] l1d_busy_i, + + /// SRAM Configuration input impl_in_t [NrSramCfg-1:0] impl_i, /// Indicate the program execution is error output logic error_o @@ -208,8 +219,9 @@ module cachepool_group axi_in_resp_t [NumTiles-1:0] axi_in_rsp; // TODO: How to wire control signal here? Broadcast? - assign axi_in_rsp_o = axi_in_rsp[0]; - assign axi_in_req[0] = axi_in_req_i; + // In theory, the SoC control is only used to access peripherals + // assign axi_in_rsp_o = axi_in_rsp[0]; + // assign axi_in_req[0] = axi_in_req_i; @@ -300,37 +312,41 @@ module cachepool_group .MaxMstTrans ( MaxMstTrans ), .MaxSlvTrans ( MaxSlvTrans ) ) i_tile ( - .clk_i ( clk_i ), - .rst_ni ( rst_ni ), - .eoc_o ( eoc[t] ), - .impl_i ( impl_i ), - .error_o ( error[t] ), + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .impl_i ( impl_i ), + .error_o ( error[t] ), // TODO: remove hardcode - .debug_req_i ( debug_req_i[t+:4] ), - .meip_i ( meip_i[t+:4] ), - .mtip_i ( mtip_i[t+:4] ), - .msip_i ( msip_i[t+:4] ), - .hart_base_id_i ( hart_base_id_i ), - .cluster_base_addr_i ( cluster_base_addr_i ), - .tile_probe_o ( group_probe_o[t] ), - // SoC in for control - .axi_in_req_i ( axi_in_req[t] ), - .axi_in_resp_o ( axi_in_rsp[t] ), + .debug_req_i ( debug_req_i [t*NumCoresTile+:NumCoresTile] ), + .meip_i ( meip_i [t*NumCoresTile+:NumCoresTile] ), + .mtip_i ( mtip_i [t*NumCoresTile+:NumCoresTile] ), + .msip_i ( msip_i [t*NumCoresTile+:NumCoresTile] ), + .hart_base_id_i ( hart_base_id_i ), + .cluster_base_addr_i ( cluster_base_addr_i ), // AXI out for UART - .axi_out_req_o ( axi_narrow_req_o[t] ), - .axi_out_resp_i ( axi_narrow_rsp_i[t] ), + .axi_out_req_o ( axi_narrow_req_o [t*TileNarrowAxiPorts+:TileNarrowAxiPorts]), + .axi_out_resp_i ( axi_narrow_rsp_i [t*TileNarrowAxiPorts+:TileNarrowAxiPorts]), // Remote Access Ports - .remote_req_o ( tile_remote_out_req[t] ), - .remote_req_dst_o ( remote_out_sel_tile[t] ), - .remote_rsp_i ( tile_remote_out_rsp[t] ), - .remote_req_i ( tile_remote_in_req [t] ), - .remote_rsp_o ( tile_remote_in_rsp [t] ), + .remote_req_o ( tile_remote_out_req[t] ), + .remote_req_dst_o ( remote_out_sel_tile[t] ), + .remote_rsp_i ( tile_remote_out_rsp[t] ), + .remote_req_i ( tile_remote_in_req [t] ), + .remote_rsp_o ( tile_remote_in_rsp [t] ), // Cache Refill Ports - .cache_refill_req_o ( cache_refill_req[t]), - .cache_refill_rsp_i ( cache_refill_rsp[t]), + .cache_refill_req_o ( cache_refill_req [t] ), + .cache_refill_rsp_i ( cache_refill_rsp [t] ), // BootROM / Core-side Cache Bypass - .axi_wide_req_o ( axi_wide_req_o [t*NumTileWideAxi+:NumTileWideAxi]), - .axi_wide_rsp_i ( axi_wide_rsp_i [t*NumTileWideAxi+:NumTileWideAxi]) + .axi_wide_req_o ( axi_wide_req_o [t*TileWideAxiPorts+:TileWideAxiPorts]), + .axi_wide_rsp_i ( axi_wide_rsp_i [t*TileWideAxiPorts+:TileWideAxiPorts]), + // Peripherals + .icache_events_o ( /* unused */ ), + .icache_prefetch_enable_i ( icache_prefetch_enable_i ), + .cl_interrupt_i ( cl_interrupt_i [t*NumCoresTile+:NumCoresTile] ), + .dynamic_offset_i ( dynamic_offset_i ), + .l1d_insn_i ( l1d_insn_i ), + .l1d_insn_valid_i ( l1d_insn_valid_i ), + .l1d_insn_ready_o ( l1d_insn_ready_o [t*NumL1CtrlTile+:NumL1CtrlTile] ), + .l1d_busy_i ( l1d_busy_i [t*NumL1CtrlTile+:NumL1CtrlTile] ) ); end @@ -355,7 +371,7 @@ module cachepool_group ) i_tile_remote_xbar ( .clk_i (clk_i ), .rst_ni (rst_ni ), - .slv_req_i (tile_remote_out_req_chan [p] ), + .slv_req_i (tile_remote_out_req_chan [p] ), .slv_req_valid_i (tile_remote_out_req_valid[p] ), .slv_req_ready_o (tile_remote_out_req_ready[p] ), .slv_rsp_o (tile_remote_out_rsp_chan [p] ), diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 8ba74df..aa65d29 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -1,7 +1,7 @@ // Copyright 2025 ETH Zurich and University of Bologna. // Solderpad Hardware License, Version 0.51, see LICENSE for details. // SPDX-License-Identifier: SHL-0.51 - +// // Author: Diyou Shen package cachepool_pkg; @@ -10,7 +10,6 @@ package cachepool_pkg; /********************* * COMMON INCLUDES * *********************/ - `include "axi/assign.svh" `include "axi/typedef.svh" `include "reqrsp_interface/assign.svh" @@ -18,155 +17,57 @@ package cachepool_pkg; `include "tcdm_interface/assign.svh" `include "tcdm_interface/typedef.svh" + /************************************************************** + * PARAMETERS + * Order: Core -> Tile -> Group -> Cluster -> TB/L2 + **************************************************************/ - /////////// - // AXI // - /////////// - - // AXI requires different types after xbar/mux - // We try to put all AXI related parameters and types at interface in this place for easier management - - /***** Basic Types and Width *****/ - // AXI Data Width - localparam int unsigned SpatzAxiDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; - localparam int unsigned SpatzAxiStrbWidth = SpatzAxiDataWidth / 8; - localparam int unsigned SpatzAxiNarrowDataWidth = `ifdef DATA_WIDTH `DATA_WIDTH `else 0 `endif; - localparam int unsigned SpatzAxiNarrowStrbWidth = SpatzAxiNarrowDataWidth / 8; - // AXI Address Width - localparam int unsigned SpatzAxiAddrWidth = `ifdef ADDR_WIDTH `ADDR_WIDTH `else 0 `endif; - // AXI User Width - localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; - - - // localparam int unsigned TileAxiIdWidth = 3; - // // For better out-of-order behavior, each tile needs a distinguished ID => Additional log2(NumTiles) bits - - localparam int unsigned TileAxiIdWidth = 3; - localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); - - // localparam int unsigned GroupAxiIdWidth = $clog2(NumTiles); - - localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + 3; - - // AXI ID Width - // localparam int unsigned SpatzAxiIdInWidth = 6; - // localparam int unsigned SpatzAxiIdOutWidth = 7; - - // legacy naming - localparam int unsigned SpatzAxiIdInWidth = ClusterAxiIdWidth; - localparam int unsigned SpatzAxiIdOutWidth = ClusterAxiIdWidth + 1; - - // Fixed AXI ID width for IWC - // Add 3 because of cache controller (second-level xbar, 4 cache, 1 old port) - // localparam int unsigned IwcAxiIdOutWidth = 3 + $clog2(4) + 3; - localparam int unsigned IwcAxiIdOutWidth = SpatzAxiIdOutWidth + 1; - - localparam int unsigned CsrAxiMstIdWidth = ClusterAxiIdWidth; - localparam int unsigned CsrAxiSlvIdWidth = ClusterAxiIdWidth + 1; - - - - typedef logic [SpatzAxiDataWidth-1:0] axi_wide_data_t; - typedef logic [SpatzAxiStrbWidth-1:0] axi_wide_strb_t; - typedef logic [SpatzAxiNarrowDataWidth-1:0] axi_narrow_data_t; - typedef logic [SpatzAxiNarrowStrbWidth-1:0] axi_narrow_strb_t; - typedef logic [SpatzAxiAddrWidth-1:0] axi_addr_t; - typedef logic [SpatzAxiUserWidth-1:0] axi_user_t; - - typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; - typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; - - typedef logic [CsrAxiMstIdWidth-1:0] axi_id_csr_mst_t; - typedef logic [CsrAxiSlvIdWidth-1:0] axi_id_csr_slv_t; - - - /***** Tile *****/ - // We have three sets of axi ports for each tile - // 1. Wide output bus for BootRom & L2 (from ICache) - // 2. Narrow output bus for UART - // 3. Narrow input bus for SoC control - - // localparam int unsigned TileAxiIdWidth = 3; - // localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); - - ///// Path 1: Wide bus - - - - - /***** Group *****/ - - - - - /***** Cluster *****/ - - `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - - - - - /***** TB *****/ - - - // At tile level, we only has three sources: SoCIn, Cores (muxed to one), ICache - // Therefore, in theory only two bits are required for each Tile - - - - - - - // typedef logic [ClusterAxiIdWidth-1:0] axi_id_in_t; - // typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; - - // typedef logic [L1TagDataWidth-1:0] tag_data_t; - // typedef logic [AxiDataWidth-1:0] data_dma_t; - // typedef logic [AxiDataWidth/8-1:0] strb_dma_t; - // typedef logic [NarrowIdWidthIn-1:0] id_mst_t; - // typedef logic [NarrowIdWidthOut-1:0] id_slv_t; - // typedef logic [WideIdWidthIn-1:0] id_dma_mst_t; - // typedef logic [WideIdWidthOut-1:0] id_dma_slv_t; - // typedef logic [WideIdWidthIn-$clog2(NumL1CtrlTile)-1:0] id_dcache_mst_t; - - - // `AXI_TYPEDEF_ALL(axi_mst, axi_addr_t, id_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - // `AXI_TYPEDEF_ALL(axi_slv, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - // `AXI_TYPEDEF_ALL(axi_mst_tile_wide, axi_addr_t, id_dma_mst_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) - // `AXI_TYPEDEF_ALL(axi_slv_tile_wide, axi_addr_t, id_dma_slv_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + ////////////////// + // GLOBAL HW // + ////////////////// + localparam int unsigned NumCores = `ifdef NUM_CORES `NUM_CORES `else 0 `endif; + localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; + // TODO: not yet passed in through config, hardcode to 1 + localparam int unsigned NumGroups = `ifdef NUM_GROUPS `NUM_GROUPS `else 1 `endif; + localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; - // -------- - // Typedefs - // -------- + /////////////////// + // CORE CONFIG // + /////////////////// + localparam int unsigned SpatzDataWidth = `ifdef DATA_WIDTH `DATA_WIDTH `else 0 `endif; + localparam int unsigned BeWidth = SpatzDataWidth / 8; + localparam int unsigned ByteOffset = $clog2(BeWidth); - typedef logic [5:0] id_slv_t; - // typedef logic [ClusterAxiIdWidth-1:0] id_slv_t; + localparam int unsigned NFpu = `ifdef SPATZ_NUM_FPU `SPATZ_NUM_FPU `else 0 `endif; + localparam int unsigned NIpu = `ifdef SPATZ_NUM_IPU `SPATZ_NUM_IPU `else 1 `endif; - // Regbus peripherals. - `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + localparam int unsigned NumIntOutstandingLoads = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; + localparam int unsigned NumIntOutstandingMem = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; + localparam int unsigned NumSpatzOutstandingLoads = `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif; - typedef logic [IwcAxiIdOutWidth-1:0] axi_id_out_iwc_t; + localparam int unsigned NumAxiMaxTrans = 32; - `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + /////////////////// + // TILE CONFIG // + /////////////////// + // How many cores for each tile? + localparam int unsigned NumCoresTile = NumCores / NumTiles; + // How many remote ports for each tile? Currently needs to be 0 or 1. + // localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; + localparam int unsigned NumRemotePortTile = 1; - ////////////////// - // CLUSTER HW // - ////////////////// + // How many cores within a tile? This is used to select the ports within a tile. + localparam int unsigned LogNumCoresTile = $clog2(NumCoresTile); - localparam int unsigned NumCores = `ifdef NUM_CORES `NUM_CORES `else 0 `endif; - localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; + localparam int unsigned NrTCDMPortsPerCore = 5; + //////////////////// + // CLUSTER HW // + //////////////////// localparam int unsigned TCDMDepth = 256; localparam int unsigned L1Depth = `ifdef L1D_DEPTH `L1D_DEPTH `else 0 `endif; - localparam int unsigned SpatzDataWidth = `ifdef DATA_WIDTH `DATA_WIDTH `else 0 `endif; - localparam int unsigned BeWidth = SpatzDataWidth / 8; - localparam int unsigned ByteOffset = $clog2(BeWidth); - localparam int unsigned ICacheLineWidth = 128; localparam int unsigned ICacheLineCount = 128; localparam int unsigned ICacheSets = 4; @@ -180,83 +81,14 @@ package cachepool_pkg; localparam int unsigned SPMAddrWidth = $clog2(TCDMSize); localparam int unsigned PeriStartAddr = 32'hC000_0000; - localparam int unsigned BootAddr = 32'h1000; // UART Configuration localparam int unsigned UartAddr = 32'hC001_0000; - // PMA configuration (cached regions) - function automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] get_cached_regions(); - automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] cached_regions; - cached_regions = '{default: '0}; - cached_regions[0] = '{base: 32'h80000000, mask: 32'hfc000000}; - return cached_regions; - endfunction - - localparam snitch_pma_pkg::snitch_pma_t SnitchPMACfg = '{ - NrCachedRegionRules: 1, - CachedRegion: get_cached_regions(), - default: 0 - }; - - - /********************* - * TILE SETTINGS * - *********************/ - - // How many cores for each tile? - localparam int unsigned NumCoresTile = NumCores / NumTiles; - - // How many remote ports for each tile? Currently needs to be 0 or 1. - // localparam int unsigned NumRemotePortTile = `ifdef NumRemotePortTile `NumRemotePortTile `else 0 `endif; - localparam int unsigned NumRemotePortTile = 1; - typedef logic [$clog2(NumTiles)-1 :0] remote_tile_sel_t; - - // How many cores within a tile? This is used to select the ports within a tile. - localparam int unsigned LogNumCoresTile = $clog2(NumCoresTile); - - - localparam int unsigned NrTCDMPortsPerCore = 5; - - - ///////////////// - // SPATZ CORE // - ///////////////// - - localparam int unsigned NFpu = `ifdef SPATZ_NUM_FPU `SPATZ_NUM_FPU `else 0 `endif; - localparam int unsigned NIpu = `ifdef SPATZ_NUM_IPU `SPATZ_NUM_IPU `else 1 `endif; - - localparam int unsigned NumIntOutstandingLoads = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; - localparam int unsigned NumIntOutstandingMem = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; - localparam int unsigned NumSpatzOutstandingLoads = `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif; - - localparam int unsigned NumAxiMaxTrans = 32; - - localparam fpu_implementation_t FPUImplementation_Core = '{ - // FMA Block - PipeRegs: '{ - // FP32 FP64 FP16 FP8 FP16A FP8A - '{ 1, 2, 1, 0, 1, 0}, // ADDMUL - '{ 1, 1, 1, 1, 1, 1}, // DIVSQRT - '{ 1, 1, 1, 1, 1, 1}, // NONCOMP - '{ 2, 2, 2, 2, 2, 2}, // CONV - '{ 4, 4, 4, 4, 4, 4} // DOTP - }, - UnitTypes: '{ - '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED }, // FMA - '{ DISABLED, DISABLED, DISABLED, DISABLED, DISABLED, DISABLED }, // DIVSQRT - '{ PARALLEL, PARALLEL, PARALLEL, PARALLEL, PARALLEL, PARALLEL }, // NONCOMP - '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED }, // CONV - '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED } // DOTP - }, - PipeConfig: BEFORE - }; - - - //////////////////// - // CACHEPOOL L1 // - //////////////////// + /////////////////////// + // CACHEPOOL L1 CFG // + /////////////////////// // Stack: 128*32/8 = 512 Byte per core localparam int unsigned SpmStackDepth = `ifdef STACK_HW_DEPTH `STACK_HW_DEPTH `else 0 `endif; @@ -272,10 +104,6 @@ package cachepool_pkg; localparam int unsigned L1LineWidth = `ifdef L1D_CACHELINE_WIDTH `L1D_CACHELINE_WIDTH `else 0 `endif; // Coalescer window localparam int unsigned L1CoalFactor = `ifdef L1D_COAL_WINDOW `L1D_COAL_WINDOW `else 0 `endif; - // Number of cache controllers (now is fixed to NrCores; if we change it, we need to change the controller AXI output ID width too) - localparam int unsigned NumL1CacheCtrl = NumCores; - // Number of cache controllers per Tile - localparam int unsigned NumL1CtrlTile = NumL1CacheCtrl / NumTiles; // Number of ways per cache controller localparam int unsigned L1AssoPerCtrl = `ifdef L1D_NUM_WAY `L1D_NUM_WAY `else 0 `endif; // Pseudo dual bank @@ -284,6 +112,11 @@ package cachepool_pkg; localparam int unsigned L1TagDataWidth = `ifdef L1D_TAG_DATA_WIDTH `L1D_TAG_DATA_WIDTH `else 0 `endif; // Number of L1 Banks per Tile localparam int unsigned NumBank = `ifdef L1D_NUM_BANKS `L1D_NUM_BANKS `else 0 `endif; + + // NOTE: these are used by AXI/L2 as well, keep here but ordered as "cluster-level cache topology" + localparam int unsigned NumL1CacheCtrl = NumCores; + localparam int unsigned NumL1CtrlTile = NumL1CacheCtrl / NumTiles; + // Number of data banks assigned to each cache controller localparam int unsigned NumDataBankPerCtrl = (L1LineWidth / SpatzDataWidth) * L1AssoPerCtrl * L1BankFactor; // Number of tag banks assigned to each cache controller @@ -305,14 +138,148 @@ package cachepool_pkg; localparam int unsigned Burst_Enable = (L1LineWidth > RefillDataWidth); + ////////////////// + // AXI CONFIG // + ////////////////// + // AXI requires different types after xbar/mux. + // Keep all AXI related parameters and types together for easier management. + + /***** Basic Types and Width *****/ + // AXI Data Width + localparam int unsigned SpatzAxiDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; + localparam int unsigned SpatzAxiStrbWidth = SpatzAxiDataWidth / 8; + localparam int unsigned SpatzAxiNarrowDataWidth = `ifdef DATA_WIDTH `DATA_WIDTH `else 0 `endif; + localparam int unsigned SpatzAxiNarrowStrbWidth = SpatzAxiNarrowDataWidth / 8; + // AXI Address Width + localparam int unsigned SpatzAxiAddrWidth = `ifdef ADDR_WIDTH `ADDR_WIDTH `else 0 `endif; + // AXI User Width + localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; + + /***** ID Width Topology (Tile -> Group -> Cluster) *****/ + localparam int unsigned TileAxiIdWidth = 3; + localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); + localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + 3; + + // legacy naming + localparam int unsigned SpatzAxiIdInWidth = ClusterAxiIdWidth; + localparam int unsigned SpatzAxiIdOutWidth = ClusterAxiIdWidth + 1; + + // Fixed AXI ID width for IWC + localparam int unsigned IwcAxiIdOutWidth = SpatzAxiIdOutWidth + 1; + + localparam int unsigned CsrAxiMstIdWidth = ClusterAxiIdWidth; + localparam int unsigned CsrAxiSlvIdWidth = ClusterAxiIdWidth + $clog2(NumTiles+1); + + /***** Tile Ports *****/ + // We have three sets of AXI ports for each tile: + // 1) Wide output bus for BootRom & L2 (from ICache) + // 2) Narrow output bus for UART/Periph + // 3) Narrow input bus for SoC control + + // Narrow AXI Ports: 1 UART + 1 Periph + localparam int unsigned TileNarrowAxiPorts = 2; + + // Wide AXI Ports: 1 BootROM + 1 Data (I$) + localparam int unsigned TileWideAxiPorts = 2; + + // Wide Data Ports: 1 for each controller + localparam int unsigned TileWideDataPorts = NumL1CtrlTile; + + /***** Group Ports *****/ + // Narrow AXI ports + localparam int unsigned GroupNarrowAxiPorts = TileNarrowAxiPorts * NumTiles; + // Wide AXI ports + localparam int unsigned GroupWideAxiPorts = TileWideAxiPorts * NumTiles; + // Wide Data ports + localparam int unsigned GroupWideDataPorts = NumL1CtrlTile; + + /***** Cluster Ports *****/ + // Narrow AXI ports: 1 In from SoC, 1 Out to UART + localparam int unsigned ClusterNarrowInAxiPorts = 1; + localparam int unsigned ClusterNarrowOutAxiPorts = 1; + // Wide AXI ports: X to DRAM (X=4 for now) + localparam int unsigned ClusterWideOutAxiPorts = NumL2Channel; + + // TODO: multi-tile support + // One more from the Snitch core + localparam int unsigned NumClusterMst = 1 + NumL1CtrlTile; + + ////////////////// + // L2 / DRAM // + ////////////////// + // L2 Memory + localparam int unsigned L2BankWidth = `ifdef L2_BANK_WIDTH `L2_BANK_WIDTH `else 0 `endif; + localparam int unsigned L2BankBeWidth = L2BankWidth / 8; + + parameter DramType = "DDR4"; // "DDR4", "DDR3", "HBM2", "LPDDR4" + parameter int unsigned DramBase = 32'h8000_0000; + + // One more for UART? + localparam int unsigned NumClusterSlv = NumL2Channel; + + // DRAM Configuration + localparam int unsigned DramAddr = 32'h8000_0000; + localparam int unsigned DramSize = 32'h4000_0000; // 1GB + localparam int unsigned DramPerChSize = DramSize / NumL2Channel; + + // Currently set to 16 for now + parameter int unsigned Interleave = `ifdef L2_INTERLEAVE `L2_INTERLEAVE `else 0 `endif; + + /************************************************************** + * TYPES + * Order: Core -> Tile -> Group -> Cluster -> TB/L2 + **************************************************************/ + + ////////////////// + // CORE TYPES // + ////////////////// typedef logic [$clog2(NumSpatzOutstandingLoads)-1:0] reqid_t; + ////////////////// + // AXI TYPES // + ////////////////// + typedef logic [SpatzAxiDataWidth-1:0] axi_wide_data_t; + typedef logic [SpatzAxiStrbWidth-1:0] axi_wide_strb_t; + typedef logic [SpatzAxiNarrowDataWidth-1:0] axi_narrow_data_t; + typedef logic [SpatzAxiNarrowStrbWidth-1:0] axi_narrow_strb_t; + typedef logic [SpatzAxiAddrWidth-1:0] axi_addr_t; + typedef logic [SpatzAxiUserWidth-1:0] axi_user_t; + + typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; + typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; + + typedef logic [CsrAxiMstIdWidth-1:0] axi_id_csr_mst_t; + typedef logic [CsrAxiSlvIdWidth-1:0] axi_id_csr_slv_t; + + typedef logic [IwcAxiIdOutWidth-1:0] axi_id_out_iwc_t; + + ////////////////// + // TILE TYPES // + ////////////////// + typedef logic [$clog2(NumTiles)-1:0] remote_tile_sel_t; + + // Naming the port for easier connection + typedef enum integer { + TilePeriph = 0, + TileUart = 1 + } tile_narrow_e; + + // Naming the port for easier connection + typedef enum integer { + TileBootROM = 0, + TileMem = 1 + } tile_wide_e; + + ////////////////////// + // CACHE/L1 TYPES // + ////////////////////// typedef logic [$clog2(L1CacheWayEntry)-1:0] cache_ways_entry_ptr_t; typedef logic [$clog2(L1AssoPerCtrl)-1:0] way_ptr_t; typedef logic [RefillDataWidth-1:0] refill_data_t; typedef logic [RefillStrbWidth-1:0] refill_strb_t; typedef logic [$clog2(L1LineWidth/RefillDataWidth)-1:0] burst_len_t; + // Narrow TCDM channel (32b) for inter-tile and intra-tile connection typedef logic [31:0] narrow_data_t; typedef logic [3 :0] narrow_strb_t; @@ -343,22 +310,13 @@ package cachepool_pkg; burst_req_t burst; } refill_user_t; - - ////////////////////////////// - // TILE / CLUSTER TOPOLOGY // - ////////////////////////////// - - // Do we need to keep DMA here? - localparam int unsigned NumTileWideAxi = 2; + ///////////////////// + // CLUSTER TYPES // + ///////////////////// typedef enum integer { - TileBootROM = 0, - TileMem = 1 - } tile_wide_e; - - localparam int unsigned NumTileNarrowAxi = 1; - typedef enum integer { - TilePeriph = 0 - } tile_narrow_e; + ClusterUart = 0, + ClusterPeriph = 1 + } cluster_narrow_e; typedef enum integer { L2Channel0 = 0, @@ -367,8 +325,7 @@ package cachepool_pkg; L2Channel3 = 3 } cluster_slv_e; - // Cache refill bus - // This bus is at the interface of each cache controller + // Cache refill bus (at the interface of each cache controller) typedef struct packed { axi_addr_t addr; cache_info_t info; @@ -383,46 +340,93 @@ package cachepool_pkg; cache_info_t info; } cache_refill_rsp_chan_t; + ////////////////// + // L2 / DRAM // + ////////////////// + typedef struct packed { + int dram_ctrl_id; + logic [SpatzAxiAddrWidth-1:0] dram_ctrl_addr; + } dram_ctrl_interleave_t; + + /************************************************************** + * MACROS (TYPEDEFS) + * Keep after base types are defined. + **************************************************************/ + + // REQRSP: L2 (wide AXI + refill_user) + `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_wide_data_t, axi_wide_strb_t, refill_user_t) + + // REQRSP: cache transaction (same payload type as L2 in current code) `REQRSP_TYPEDEF_ALL (cache_trans, axi_addr_t, axi_wide_data_t, axi_wide_strb_t, refill_user_t) // TCDM req/rsp bus => core to L1 `TCDM_TYPEDEF_ALL(tcdm, narrow_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) `TCDM_TYPEDEF_ALL(spm, spm_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) + // AXI typedef bundles + // NOTE: keep legacy id_slv_t placement compatible with existing code + typedef logic [5:0] id_slv_t; - ////////////////// - // L2 / DRAM // - ////////////////// + // Regbus peripherals. + `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) - // L2 Memory - localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; - localparam int unsigned L2BankWidth = `ifdef L2_BANK_WIDTH `L2_BANK_WIDTH `else 0 `endif; - localparam int unsigned L2BankBeWidth = L2BankWidth / 8; - parameter DramType = "DDR4"; // "DDR4", "DDR3", "HBM2", "LPDDR4" - parameter int unsigned DramBase = 32'h8000_0000; + `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - // TODO: multi-tile support - // One more from the Snitch core - localparam int unsigned NumClusterMst = 1 + NumL1CtrlTile; - // One more for UART? - localparam int unsigned NumClusterSlv = NumL2Channel; + /************************************************************** + * FUNCTIONS + * Order: Core -> Tile -> Group -> Cluster -> TB/L2 + **************************************************************/ - `REQRSP_TYPEDEF_ALL (l2, axi_addr_t, axi_wide_data_t, axi_wide_strb_t, refill_user_t) + /////////////////// + // CORE FUNCS // + /////////////////// + localparam fpu_implementation_t FPUImplementation_Core = '{ + // FMA Block + PipeRegs: '{ + // FP32 FP64 FP16 FP8 FP16A FP8A + '{ 1, 2, 1, 0, 1, 0}, // ADDMUL + '{ 1, 1, 1, 1, 1, 1}, // DIVSQRT + '{ 1, 1, 1, 1, 1, 1}, // NONCOMP + '{ 2, 2, 2, 2, 2, 2}, // CONV + '{ 4, 4, 4, 4, 4, 4} // DOTP + }, + UnitTypes: '{ + '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED }, // FMA + '{ DISABLED, DISABLED, DISABLED, DISABLED, DISABLED, DISABLED }, // DIVSQRT + '{ PARALLEL, PARALLEL, PARALLEL, PARALLEL, PARALLEL, PARALLEL }, // NONCOMP + '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED }, // CONV + '{ MERGED, MERGED, MERGED, MERGED, MERGED, MERGED } // DOTP + }, + PipeConfig: BEFORE + }; - // DRAM Configuration - localparam int unsigned DramAddr = 32'h8000_0000; - localparam int unsigned DramSize = 32'h4000_0000; // 1GB - localparam int unsigned DramPerChSize = DramSize / NumL2Channel; + ////////////////////// + // CLUSTER FUNCS // + ////////////////////// - // DRAM Interleaving Functions - typedef struct packed { - int dram_ctrl_id; - logic [SpatzAxiAddrWidth-1:0] dram_ctrl_addr; - } dram_ctrl_interleave_t; + // PMA configuration (cached regions) + function automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] get_cached_regions(); + automatic snitch_pma_pkg::rule_t [snitch_pma_pkg::NrMaxRules-1:0] cached_regions; + cached_regions = '{default: '0}; + cached_regions[0] = '{base: 32'h80000000, mask: 32'hfc000000}; + return cached_regions; + endfunction - // Currently set to 16 for now - parameter int unsigned Interleave = `ifdef L2_INTERLEAVE `L2_INTERLEAVE `else 0 `endif; + localparam snitch_pma_pkg::snitch_pma_t SnitchPMACfg = '{ + NrCachedRegionRules: 1, + CachedRegion: get_cached_regions(), + default: 0 + }; + + ////////////////// + // L2 / DRAM // + ////////////////// + /************* System Functions ************/ function automatic dram_ctrl_interleave_t getDramCTRLInfo(axi_addr_t addr); automatic dram_ctrl_interleave_t res; localparam int unsigned ConstantBits = $clog2(L2BankBeWidth * Interleave); @@ -442,16 +446,10 @@ package cachepool_pkg; if ((L2BankBeWidth * Interleave) < DramPerChSize) begin // Input address needs to move the dram_id bits to correct location for interleaving // [Reminder][InterChange][Scramble][Constant] => [Reminder][Scramble][InterChange][Constant] - // log2(32'h0100_0000) = 24 - // 32'h0100_0000 has 24b trailing zeros => in total 24b offset localparam int unsigned SizeOffsetBits = $clog2(DramPerChSize); - // log2(512/8*8) = 9, can be modified to find best pattern localparam int unsigned ConstantBits = $clog2(L2BankBeWidth * Interleave); - // log2(32'h0100_0000) - 9 = 24 - 9 = 15 localparam int unsigned InterChangeBits = SizeOffsetBits - ConstantBits; - // log2(4) = 2 localparam int unsigned ScrambleBits = $clog2(NumL2Channel); - // 32 - 24 - 2 = 6 localparam int unsigned ReminderBits = SpatzAxiAddrWidth - ScrambleBits - SizeOffsetBits; res = {addr[SpatzAxiAddrWidth - 1 : SpatzAxiAddrWidth - ReminderBits], @@ -472,15 +470,10 @@ package cachepool_pkg; if ((L2BankBeWidth * Interleave) < DramPerChSize) begin // Input address needs to move the dram_id bits to correct location for interleaving // [Reminder][Scramble][InterChange][Constant] => [Reminder][InterChange][Scramble][Constant] - // log2(32'h0100_0000) = 24 localparam int unsigned SizeOffsetBits = $clog2(DramPerChSize); - // log2(512/8*8) = 9 localparam int unsigned ConstantBits = $clog2(L2BankBeWidth * Interleave); - // log2(32'h0100_0000) - 9 = 24 - 9 = 15 localparam int unsigned InterChangeBits = SizeOffsetBits - ConstantBits; - // log2(4) = 2 localparam int unsigned ScrambleBits = $clog2(NumL2Channel); - // 32 - 24 - 2 = 6 localparam int unsigned ReminderBits = SpatzAxiAddrWidth - ScrambleBits - SizeOffsetBits; res = {addr[SpatzAxiAddrWidth - 1 : SpatzAxiAddrWidth - ReminderBits], diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index d62f8eb..eab25c7 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -144,14 +144,14 @@ module cachepool_tile // input axi_in_req_t axi_in_req_i, // output axi_in_resp_t axi_in_resp_o, /// AXI Narrow out-port (UART/Peripheral) - output axi_narrow_req_t [1:0] axi_out_req_o, - input axi_narrow_resp_t [1:0] axi_out_resp_i, + output axi_narrow_req_t [1:0] axi_out_req_o, + input axi_narrow_resp_t [1:0] axi_out_resp_i, /// Cache Refill ports output cache_trans_req_t [NumL1CtrlTile-1:0] cache_refill_req_o, input cache_trans_rsp_t [NumL1CtrlTile-1:0] cache_refill_rsp_i, /// Wide AXI ports to cluster level - output axi_out_req_t [NumTileWideAxi-1:0] axi_wide_req_o, - input axi_out_resp_t [NumTileWideAxi-1:0] axi_wide_rsp_i, + output axi_out_req_t [TileNarrowAxiPorts-1:0] axi_wide_req_o, + input axi_out_resp_t [TileNarrowAxiPorts-1:0] axi_wide_rsp_i, /// Remote Tile access ports (to remote tiles) output tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_o, output remote_tile_sel_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_dst_o, From dd4ee8a0ac55667a517c9c96ff43065c2b0df8b1 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Wed, 7 Jan 2026 09:25:43 +0100 Subject: [PATCH 09/23] [SRC] WIP: Adapt package for readability --- hardware/src/cachepool_cluster.sv | 27 ++++----- hardware/src/cachepool_pkg.sv | 73 +++++++++++++++++++----- hardware/src/cachepool_tile.sv | 10 +--- hardware/tb/cachepool_cluster_wrapper.sv | 22 +++---- 4 files changed, 83 insertions(+), 49 deletions(-) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index 6c8eb48..dec2f0e 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -408,8 +408,6 @@ module cachepool_cluster .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - // .axi_in_req_i ( axi_in_req_i ), - // .axi_in_rsp_o ( axi_in_resp_o ), .axi_narrow_req_o ( axi_out_req ), .axi_narrow_rsp_i ( axi_out_resp ), .axi_wide_req_o ( axi_tile_req ), @@ -502,9 +500,6 @@ module cachepool_cluster .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), - // .tile_probe_o ( group_probe ), - // .axi_in_req_i ( axi_in_req_i ), - // .axi_in_resp_o ( axi_in_resp_o ), .axi_out_req_o ( axi_out_req [0] ), .axi_out_resp_i ( axi_out_resp [0] ), // Remote Ports (not used) @@ -803,7 +798,7 @@ module cachepool_cluster axi_mux #( - .SlvAxiIDWidth ( ClusterAxiIdWidth ), + .SlvAxiIDWidth ( CsrAxiMstIdWidth ), .slv_aw_chan_t ( axi_csr_mst_aw_chan_t ), // AW Channel Type, slave ports .mst_aw_chan_t ( axi_csr_slv_aw_chan_t ), // AW Channel Type, master port .w_chan_t ( axi_csr_slv_w_chan_t ), // W Channel Type, all ports @@ -836,17 +831,17 @@ module cachepool_cluster ); axi_to_reg #( - .ADDR_WIDTH (AxiAddrWidth ), + .ADDR_WIDTH (AxiAddrWidth ), .DATA_WIDTH (SpatzAxiNarrowDataWidth ), - .AXI_MAX_WRITE_TXNS (1 ), - .AXI_MAX_READ_TXNS (1 ), - .DECOUPLE_W (0 ), - .ID_WIDTH (CsrAxiSlvIdWidth ), - .USER_WIDTH (SpatzAxiUserWidth ), - .axi_req_t (axi_csr_slv_req_t ), - .axi_rsp_t (axi_csr_slv_resp_t ), - .reg_req_t (reg_req_t ), - .reg_rsp_t (reg_rsp_t ) + .AXI_MAX_WRITE_TXNS (1 ), + .AXI_MAX_READ_TXNS (1 ), + .DECOUPLE_W (0 ), + .ID_WIDTH (CsrAxiSlvIdWidth ), + .USER_WIDTH (SpatzAxiUserWidth ), + .axi_req_t (axi_csr_slv_req_t ), + .axi_rsp_t (axi_csr_slv_resp_t ), + .reg_req_t (reg_req_t ), + .reg_rsp_t (reg_rsp_t ) ) i_csr_axi_to_reg ( .clk_i (clk_i ), .rst_ni (rst_ni ), diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index aa65d29..940303f 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -29,7 +29,7 @@ package cachepool_pkg; localparam int unsigned NumTiles = `ifdef NUM_TILES `NUM_TILES `else 0 `endif; // TODO: not yet passed in through config, hardcode to 1 localparam int unsigned NumGroups = `ifdef NUM_GROUPS `NUM_GROUPS `else 1 `endif; - localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; + localparam int unsigned NumL2Channel = `ifdef L2_CHANNEL `L2_CHANNEL `else 0 `endif; /////////////////// // CORE CONFIG // @@ -43,7 +43,7 @@ package cachepool_pkg; localparam int unsigned NumIntOutstandingLoads = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; localparam int unsigned NumIntOutstandingMem = `ifdef SNITCH_MAX_TRANS `SNITCH_MAX_TRANS `else 0 `endif; - localparam int unsigned NumSpatzOutstandingLoads = `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif; + localparam int unsigned NumSpatzOutstandingLoads = `ifdef SPATZ_MAX_TRANS `SPATZ_MAX_TRANS `else 0 `endif; localparam int unsigned NumAxiMaxTrans = 32; @@ -155,13 +155,25 @@ package cachepool_pkg; // AXI User Width localparam int unsigned SpatzAxiUserWidth = `ifdef AXI_USER_WIDTH `AXI_USER_WIDTH `else 0 `endif; + // ----------------------- + // AXI ID field structure + // ----------------------- + // ClusterAxiIdWidth is composed of: + // [cluster_route_bits][tile_index_bits][tile_local_bits] + localparam int unsigned NumClusterMst = 1 + NumL1CtrlTile; + + localparam int unsigned ClusterRouteIdWidth = $clog2(NumClusterMst); + /***** ID Width Topology (Tile -> Group -> Cluster) *****/ localparam int unsigned TileAxiIdWidth = 3; localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); - localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + 3; + localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + ClusterRouteIdWidth; + + // legacy naming localparam int unsigned SpatzAxiIdInWidth = ClusterAxiIdWidth; + // localparam int unsigned SpatzAxiIdInWidth = TileAxiIdWidth; localparam int unsigned SpatzAxiIdOutWidth = ClusterAxiIdWidth + 1; // Fixed AXI ID width for IWC @@ -170,6 +182,8 @@ package cachepool_pkg; localparam int unsigned CsrAxiMstIdWidth = ClusterAxiIdWidth; localparam int unsigned CsrAxiSlvIdWidth = ClusterAxiIdWidth + $clog2(NumTiles+1); + localparam int unsigned SpatzAxiNarrowIdWidth = 6 + $clog2(NumTiles); + /***** Tile Ports *****/ // We have three sets of AXI ports for each tile: // 1) Wide output bus for BootRom & L2 (from ICache) @@ -177,10 +191,13 @@ package cachepool_pkg; // 3) Narrow input bus for SoC control // Narrow AXI Ports: 1 UART + 1 Periph - localparam int unsigned TileNarrowAxiPorts = 2; + localparam int unsigned TileNarrowAxiPorts = 2; // Wide AXI Ports: 1 BootROM + 1 Data (I$) - localparam int unsigned TileWideAxiPorts = 2; + localparam int unsigned TileWideAxiPorts = 2; + localparam int unsigned TileWideXbarInputs = 2; // iCache + narrow2wide + localparam int unsigned TileWideXbarIdExtraBits = $clog2(TileWideXbarInputs); // = 1 + // Wide Data Ports: 1 for each controller localparam int unsigned TileWideDataPorts = NumL1CtrlTile; @@ -202,7 +219,6 @@ package cachepool_pkg; // TODO: multi-tile support // One more from the Snitch core - localparam int unsigned NumClusterMst = 1 + NumL1CtrlTile; ////////////////// // L2 / DRAM // @@ -248,6 +264,10 @@ package cachepool_pkg; typedef logic [SpatzAxiIdInWidth-1:0] axi_id_in_t; typedef logic [SpatzAxiIdOutWidth-1:0] axi_id_out_t; + typedef logic [SpatzAxiNarrowIdWidth-1:0] axi_narrow_id_t; + // legacy name; TODO: remove + typedef logic [SpatzAxiNarrowIdWidth-1:0] id_slv_t; + typedef logic [CsrAxiMstIdWidth-1:0] axi_id_csr_mst_t; typedef logic [CsrAxiSlvIdWidth-1:0] axi_id_csr_slv_t; @@ -364,14 +384,10 @@ package cachepool_pkg; `TCDM_TYPEDEF_ALL(spm, spm_addr_t, narrow_data_t, narrow_strb_t, tcdm_user_t) // AXI typedef bundles - // NOTE: keep legacy id_slv_t placement compatible with existing code - typedef logic [5:0] id_slv_t; - - // Regbus peripherals. - `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, id_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_narrow, axi_addr_t, axi_narrow_id_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_in, axi_addr_t, axi_id_in_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) @@ -381,6 +397,35 @@ package cachepool_pkg; * Order: Core -> Tile -> Group -> Cluster -> TB/L2 **************************************************************/ + ////////////////// + // AXI FUNCS // + ////////////////// + // function automatic axi_id_in_t make_cluster_id( + // input remote_tile_sel_t tile_idx, + // input logic [TileLocalIdWidth-1:0] tile_local, + // input logic [ClusterRouteIdWidth-1:0] route + // ); + // axi_id_in_t id; + // id = '0; + // id[TileLocalIdWidth-1:0] = tile_local; + // id[TileLocalIdWidth + TileIndexIdWidth - 1 : TileLocalIdWidth] = tile_idx; + // id[ClusterAxiIdWidth-1 : GroupAxiIdWidth] = route; + // return id; + // endfunction + + // function automatic remote_tile_sel_t get_tile_idx_from_cluster_id(input axi_id_in_t id); + // return id[TileLocalIdWidth + TileIndexIdWidth - 1 : TileLocalIdWidth]; + // endfunction + + // function automatic logic [TileLocalIdWidth-1:0] get_tile_local_from_cluster_id(input axi_id_in_t id); + // return id[TileLocalIdWidth-1:0]; + // endfunction + + // function automatic logic [ClusterRouteIdWidth-1:0] get_route_from_cluster_id(input axi_id_in_t id); + // return id[ClusterAxiIdWidth-1 : GroupAxiIdWidth]; + // endfunction + + /////////////////// // CORE FUNCS // /////////////////// diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index eab25c7..0bb73e9 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -137,12 +137,6 @@ module cachepool_tile /// Base address of cluster. TCDM and cluster peripheral location are derived from /// it. This signal is pseudo-static. input logic [AxiAddrWidth-1:0] cluster_base_addr_i, - /// Per-cluster probe on the cluster status. Can be written by the cores to indicate - /// to the overall system that the cluster is executing something. - // output logic tile_probe_o, - /// AXI Core cluster in-port. - // input axi_in_req_t axi_in_req_i, - // output axi_in_resp_t axi_in_resp_o, /// AXI Narrow out-port (UART/Peripheral) output axi_narrow_req_t [1:0] axi_out_req_o, input axi_narrow_resp_t [1:0] axi_out_resp_i, @@ -1057,8 +1051,8 @@ module cachepool_tile .EARLY_LATCH ( 0 ), .L0_EARLY_TAG_WIDTH ( snitch_pkg::PAGE_SHIFT - $clog2(ICacheLineWidth/8) ), .ISO_CROSSING ( 1'b0 ), - .axi_req_t ( axi_mst_tile_wide_req_t ), - .axi_rsp_t ( axi_mst_tile_wide_resp_t ), + .axi_req_t ( axi_mst_tile_wide_req_t ), + .axi_rsp_t ( axi_mst_tile_wide_resp_t ), .sram_cfg_data_t ( impl_in_t ), .sram_cfg_tag_t ( impl_in_t ) ) i_snitch_icache ( diff --git a/hardware/tb/cachepool_cluster_wrapper.sv b/hardware/tb/cachepool_cluster_wrapper.sv index 07f1da3..68c9458 100644 --- a/hardware/tb/cachepool_cluster_wrapper.sv +++ b/hardware/tb/cachepool_cluster_wrapper.sv @@ -94,22 +94,22 @@ module cachepool_cluster_wrapper .clk_i , .rst_ni , .eoc_o (eoc_o ), - .impl_i ( '0 ), - .error_o (), - .debug_req_i ({NumCores{debug_req_i}}), - .meip_i ({NumCores{meip_i}}), - .mtip_i ({NumCores{mtip_i}}), - .msip_i ({NumCores{msip_i}}), - .hart_base_id_i (10'h0), - .cluster_base_addr_i (TCDMStartAddr), - .cluster_probe_o (cluster_probe_o), + .impl_i ('0 ), + .error_o ( ), + .debug_req_i ({NumCores{debug_req_i}} ), + .meip_i ({NumCores{meip_i}} ), + .mtip_i ({NumCores{mtip_i}} ), + .msip_i ({NumCores{msip_i}} ), + .hart_base_id_i (10'h0 ), + .cluster_base_addr_i (TCDMStartAddr ), + .cluster_probe_o (cluster_probe_o ), .axi_in_req_i , .axi_in_resp_o , .axi_narrow_req_o , .axi_narrow_resp_i , // AXI Master Port - .axi_out_req_o ( axi_out_req_o ), - .axi_out_resp_i ( axi_out_resp_i ) + .axi_out_req_o ( axi_out_req_o ), + .axi_out_resp_i ( axi_out_resp_i ) ); // AXI utilization monitor From 126b7052fb0e2c78bef448aec27894719653fc4d Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Wed, 7 Jan 2026 15:54:09 +0100 Subject: [PATCH 10/23] [SRC] WIP: continue work on multi-tile support. --- config/cachepool.hjson | 2 +- config/config.mk | 6 +-- hardware/src/cachepool_cluster.sv | 72 +++++++++++++++++-------------- hardware/src/cachepool_group.sv | 62 +++++++++++++------------- hardware/src/cachepool_pkg.sv | 13 +++--- hardware/src/cachepool_tile.sv | 12 ++---- 6 files changed, 84 insertions(+), 83 deletions(-) diff --git a/config/cachepool.hjson b/config/cachepool.hjson index 9a31358..fdf956e 100644 --- a/config/cachepool.hjson +++ b/config/cachepool.hjson @@ -12,7 +12,7 @@ data_width: 32, id_width_in: 6, // fixed for now id_width_out: 2, // fixed for now - user_width: 17, + user_width: 18, axi_cdc_enable: false, sw_rst_enable: true, axi_isolate_enable: false, diff --git a/config/config.mk b/config/config.mk index b5429aa..700f493 100644 --- a/config/config.mk +++ b/config/config.mk @@ -111,11 +111,11 @@ ifneq ($(filter $(l1d_cacheline_width),128 256 512),$(l1d_cacheline_width)) endif ifeq ($(l1d_cacheline_width),512) - axi_user_width := 17 -else ifeq ($(l1d_cacheline_width),256) axi_user_width := 18 +else ifeq ($(l1d_cacheline_width),256) + axi_user_width := 19 else ifeq ($(l1d_cacheline_width),128) - axi_user_width := 21 + axi_user_width := 22 endif ##################### diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index dec2f0e..cc29372 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -344,10 +344,6 @@ module cachepool_cluster assign l2_rsp_rr = '0; end - // logic [NumTiles-1: 0] group_probe; - // assign cluster_probe_o = |group_probe; - - icache_events_t [NrCores-1:0] icache_events; logic icache_prefetch_enable; logic [NrCores-1:0] cl_interrupt; @@ -425,7 +421,9 @@ module cachepool_cluster .l1d_insn_ready_o ( l1d_insn_ready ), .l1d_busy_i ( l1d_busy ) ); - + // TODO: 2 axi ports converted lost correct assignments + // 1. tile id? + // 2. mux then convert? for (genvar t = 0; t < NumTiles; t ++) begin : gen_axi_converter axi_to_reqrsp #( .axi_req_t ( axi_mst_cache_req_t ), @@ -545,36 +543,44 @@ module cachepool_cluster ); end - - // for (genvar t = 0; t < NumTiles; t++) begin - // Cache Bypass requests + // Additional one port for iCache connection + localparam int unsigned ReqrspPortsTile = NumL1CtrlTile + 1; always_comb begin for (int t = 0; t < NumTiles; t++) begin - tile_req_chan[t] = cache_core_req[t].q; - // Scrmable address - tile_req_chan[t].addr = scrambleAddr(cache_core_req[t].q.addr); - tile_req_valid[t] = cache_core_req[t].q_valid; - cache_core_rsp[t].q_ready = tile_req_ready[t]; - - cache_core_rsp[t].p = tile_rsp_chan ; - cache_core_rsp[t].p_valid = tile_rsp_valid; - tile_rsp_ready[t] = cache_core_req[t].p_ready; - end - - // Normal Cache requests - for (int p = 0; p < NumL1CtrlTile*NumTiles; p++) begin - tile_req_chan [p+NumTiles] = cache_refill_req[p].q; - // Scramble address - tile_req_chan [p+NumTiles].addr = scrambleAddr(cache_refill_req[p].q.addr); - tile_req_valid[p+NumTiles] = cache_refill_req[p].q_valid; - cache_refill_rsp[p].q_ready = tile_req_ready[p+NumTiles]; - - cache_refill_rsp[p].p = tile_rsp_chan [p+NumTiles]; - cache_refill_rsp[p].p_valid = tile_rsp_valid[p+NumTiles]; - tile_rsp_ready[p+NumTiles] = cache_refill_req[p].p_ready; + for (int p = 0; p < ReqrspPortsTile; p++) begin + automatic int unsigned xbar_idx = t*ReqrspPortsTile + p; + automatic int unsigned refill_idx = t*NumL1CtrlTile + p-1; + + if (p == 0) begin + // connect_icache_path + tile_req_chan [xbar_idx] = cache_core_req [t].q; + // Scrmable address + tile_req_chan [xbar_idx].addr = scrambleAddr(cache_core_req[t].q.addr); + tile_req_valid [xbar_idx] = cache_core_req [t].q_valid; + cache_core_rsp [t].q_ready = tile_req_ready [xbar_idx]; + + cache_core_rsp [t].p = tile_rsp_chan [xbar_idx]; + cache_core_rsp [t].p_valid = tile_rsp_valid [xbar_idx]; + tile_rsp_ready [xbar_idx] = cache_core_req [t].p_ready; + // Tile ID assignment + tile_req_chan [xbar_idx].user.tile_id = t; + end else begin + // connect_refill_path + tile_req_chan [xbar_idx] = cache_refill_req[refill_idx].q; + // Scramble address + tile_req_chan [xbar_idx].addr = scrambleAddr(cache_refill_req[refill_idx].q.addr); + tile_req_valid [xbar_idx] = cache_refill_req[refill_idx].q_valid; + cache_refill_rsp[refill_idx].q_ready = tile_req_ready [xbar_idx]; + + cache_refill_rsp[refill_idx].p = tile_rsp_chan [xbar_idx]; + cache_refill_rsp[refill_idx].p_valid = tile_rsp_valid [xbar_idx]; + tile_rsp_ready [xbar_idx] = cache_refill_req[refill_idx].p_ready; + // Tile ID assignment + tile_req_chan [xbar_idx].user.tile_id = t; + end + end end end - // end typedef struct packed { int unsigned idx; @@ -677,7 +683,7 @@ module cachepool_cluster l2_rsp_chan [ch].user = l2_rsp[ch].p.user; l2_rsp_valid[ch] = l2_rsp[ch].p_valid; l2_req[ch].p_ready = l2_rsp_ready[ch]; - l2_sel[ch] = l2_rsp[ch].p.user.bank_id; + l2_sel[ch] = {l2_rsp[ch].p.user.tile_id, l2_rsp[ch].p.user.bank_id}; end end @@ -739,6 +745,8 @@ module cachepool_cluster // TODO: Mux for uart assign axi_narrow_req_o = axi_out_req[0][ClusterUart]; assign axi_out_resp[0][ClusterUart] = axi_narrow_resp_i; + // Tie off tile 1 for now + assign axi_out_resp[1][ClusterUart] = '0; /***** BootROM ****/ for (genvar t = 0; t < NumTiles; t++) begin : gen_bootrom diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 69ba21e..555c633 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -116,8 +116,6 @@ module cachepool_group /// Per-core debug request signal. Asserting this signals puts the /// corresponding core into debug mode. This signal is assumed to be _async_. input logic [NrCores-1:0] debug_req_i, - /// End of Computing indicator to notify the host/tb - // output logic eoc_o, /// Machine external interrupt pending. Usually those interrupts come from a /// platform-level interrupt controller. This signal is assumed to be _async_. input logic [NrCores-1:0] meip_i, @@ -136,12 +134,6 @@ module cachepool_group /// Base address of cluster. TCDM and cluster peripheral location are derived from /// it. This signal is pseudo-static. input logic [AxiAddrWidth-1:0] cluster_base_addr_i, - /// Per-cluster probe on the cluster status. Can be written by the cores to indicate - /// to the overall system that the cluster is executing something. - // output logic [NumTiles-1:0] group_probe_o, - // /// AXI Core cluster in-port. - // input axi_in_req_t axi_in_req_i, - // output axi_in_resp_t axi_in_rsp_o, /// AXI Narrow out-port (UART/Peripheral) output axi_narrow_req_t [GroupNarrowAxiPorts-1:0] axi_narrow_req_o, input axi_narrow_resp_t [GroupNarrowAxiPorts-1:0] axi_narrow_rsp_i, @@ -218,35 +210,20 @@ module cachepool_group axi_in_req_t [NumTiles-1:0] axi_in_req; axi_in_resp_t [NumTiles-1:0] axi_in_rsp; - // TODO: How to wire control signal here? Broadcast? - // In theory, the SoC control is only used to access peripherals - // assign axi_in_rsp_o = axi_in_rsp[0]; - // assign axi_in_req[0] = axi_in_req_i; - - // --------------- // CachePool Tile // --------------- - logic [NumTiles-1:0] error, eoc; + logic [NumTiles-1:0] error; assign error_o = |error; - assign eoc_o = |eoc; - - cache_trans_req_t [NumTiles-1:0][NumL1CtrlTile-1:0] cache_refill_req; - cache_trans_rsp_t [NumTiles-1:0][NumL1CtrlTile-1:0] cache_refill_rsp; cache_trans_req_t [NumTiles-1 :0] cache_core_req; cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; - cache_trans_req_chan_t [NumTiles*NumClusterMst-1 :0] tile_req_chan; - cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; - logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; - - - assign cache_refill_req_o = cache_refill_req[0]; - assign cache_refill_rsp = {'0, cache_refill_rsp_i}; - + // cache_trans_req_chan_t [NumTiles*NumClusterMst-1 :0] tile_req_chan; + // cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; + // logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; // Tile remote access signals @@ -265,6 +242,29 @@ module cachepool_group tcdm_rsp_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_chan; logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_valid, tile_remote_in_rsp_ready; + for (genvar t = 0; t < NumTiles; t++) begin + for (genvar p = 0; p < NrTCDMPortsPerCore; p++) begin + assign tile_remote_out_req_chan [p][t] = tile_remote_out_req[t][p].q; + assign tile_remote_out_req_valid[p][t] = tile_remote_out_req[t][p].q_valid; + // No p ready + assign tile_remote_out_rsp_ready[p][t] = 1'b1; + // assign tile_remote_out_rsp_ready[p][t] = tile_remote_out_req[t][p].p_ready; + + assign tile_remote_out_rsp[t][p].p = tile_remote_out_rsp_chan [p][t]; + assign tile_remote_out_rsp[t][p].p_valid = tile_remote_out_rsp_valid[p][t]; + assign tile_remote_out_rsp[t][p].q_ready = tile_remote_out_req_ready[p][t]; + + + assign tile_remote_in_req[t][p].q = tile_remote_in_req_chan [p][t]; + assign tile_remote_in_req[t][p].q_valid = tile_remote_in_req_valid[p][t]; + // assign tile_remote_in_req[t][p].p_ready = tile_remote_in_rsp_ready[p][t]; + + assign tile_remote_in_rsp_chan [p][t] = tile_remote_in_rsp[t][p].p; + assign tile_remote_in_rsp_valid[p][t] = tile_remote_in_rsp[t][p].p_valid; + assign tile_remote_in_req_ready[p][t] = tile_remote_in_rsp[t][p].q_ready; + end + end + // Symmetric xbar, in/out select types are the same remote_tile_sel_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] remote_out_sel_tile, remote_in_sel_tile; remote_tile_sel_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] remote_out_sel_xbar, remote_in_sel_xbar; @@ -333,8 +333,8 @@ module cachepool_group .remote_req_i ( tile_remote_in_req [t] ), .remote_rsp_o ( tile_remote_in_rsp [t] ), // Cache Refill Ports - .cache_refill_req_o ( cache_refill_req [t] ), - .cache_refill_rsp_i ( cache_refill_rsp [t] ), + .cache_refill_req_o ( cache_refill_req_o[t*NumL1CtrlTile+:NumL1CtrlTile] ), + .cache_refill_rsp_i ( cache_refill_rsp_i[t*NumL1CtrlTile+:NumL1CtrlTile] ), // BootROM / Core-side Cache Bypass .axi_wide_req_o ( axi_wide_req_o [t*TileWideAxiPorts+:TileWideAxiPorts]), .axi_wide_rsp_i ( axi_wide_rsp_i [t*TileWideAxiPorts+:TileWideAxiPorts]), @@ -350,9 +350,6 @@ module cachepool_group ); end - assign tile_remote_in_req = '0; - assign tile_remote_out_rsp = '0; - // ------------ // Remote XBar // ------------ @@ -389,7 +386,6 @@ module cachepool_group .mst_rr_i ('0 ), .mst_sel_i (remote_in_sel_xbar [p] ) ); - end diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 940303f..ff5a985 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -6,6 +6,7 @@ package cachepool_pkg; import fpnew_pkg::*; + import cf_math_pkg::idx_width; /********************* * COMMON INCLUDES * @@ -130,8 +131,11 @@ package cachepool_pkg; // Number of cache sets each cache way has localparam int unsigned L1NumSet = L1CacheWayEntry / L1BankFactor; - localparam int unsigned CoreIDWidth = cf_math_pkg::idx_width(NumCores); - localparam int unsigned BankIDWidth = cf_math_pkg::idx_width(NumL1CtrlTile); + // Core id width within a tile => tile ID will be calculated separatly + localparam int unsigned CoreIDWidth = idx_width(NumCoresTile); + localparam int unsigned TileIDWidth = idx_width(NumTiles); + // Each bank inside a tile needs an unique id, plus one reserved for icache + localparam int unsigned BankIDWidth = idx_width(NumL1CtrlTile + 1); localparam int unsigned RefillDataWidth = `ifdef REFILL_DATA_WIDTH `REFILL_DATA_WIDTH `else 0 `endif; localparam int unsigned RefillStrbWidth = RefillDataWidth / 8; @@ -169,8 +173,6 @@ package cachepool_pkg; localparam int unsigned GroupAxiIdWidth = TileAxiIdWidth + $clog2(NumTiles); localparam int unsigned ClusterAxiIdWidth = GroupAxiIdWidth + ClusterRouteIdWidth; - - // legacy naming localparam int unsigned SpatzAxiIdInWidth = ClusterAxiIdWidth; // localparam int unsigned SpatzAxiIdInWidth = TileAxiIdWidth; @@ -325,7 +327,8 @@ package cachepool_pkg; } tcdm_user_t; typedef struct packed { - logic [BankIDWidth:0] bank_id; + logic [BankIDWidth-1:0] bank_id; + logic [TileIDWidth-1:0] tile_id; cache_info_t info; burst_req_t burst; } refill_user_t; diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 0bb73e9..4729a95 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -216,8 +216,8 @@ module cachepool_tile // Core Request, Instruction cache localparam int unsigned NrWideMasters = 2; - localparam int unsigned WideIdWidthOut = 4; - localparam int unsigned WideIdWidthIn = 3; + localparam int unsigned WideIdWidthOut = AxiIdWidthOut; + localparam int unsigned WideIdWidthIn = AxiIdWidthOut - $clog2(NrWideMasters); // Wide X-BAR configuration: Core Request, ICache localparam int unsigned NrWideSlaves = 2; @@ -397,13 +397,6 @@ module cachepool_tile reqrsp_req_t [NrCores-1:0] core_req, filtered_core_req; reqrsp_rsp_t [NrCores-1:0] core_rsp, filtered_core_rsp; - // 5. Peripheral Subsystem - reg_req_t reg_req; - reg_rsp_t reg_rsp; - - // 7. Misc. Wires. - logic icache_prefetch_enable; - logic [NrCores-1:0] cl_interrupt; // 8. L1 D$ tcdm_req_t [NrTCDMPortsCores-1:0] unmerge_req; @@ -807,6 +800,7 @@ module cachepool_tile // ID 0 reserved for bypass cache cache_refill_req_o[cb].q.user = '{ + // The first bit is reserved for iCache identifier bank_id : cb + 1, info : cache_refill_req[cb].info, burst : cache_refill_burst[cb], From 4c82cb2bbb3bcca765ae73710ae31096663a3979 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Thu, 8 Jan 2026 15:55:06 +0100 Subject: [PATCH 11/23] [SRC] Fix the core_id and tile_id. --- hardware/src/cachepool_cluster.sv | 5 ++++- hardware/src/cachepool_group.sv | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index cc29372..b4ef0b5 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -683,7 +683,10 @@ module cachepool_cluster l2_rsp_chan [ch].user = l2_rsp[ch].p.user; l2_rsp_valid[ch] = l2_rsp[ch].p_valid; l2_req[ch].p_ready = l2_rsp_ready[ch]; - l2_sel[ch] = {l2_rsp[ch].p.user.tile_id, l2_rsp[ch].p.user.bank_id}; + // calculate the port from the tile id and bank id + // bank_id == 0 --- bypass + // bank_id == 1-4 --- cache bank 0-3 + l2_sel[ch] = l2_rsp[ch].p.user.tile_id * NumClusterMst + l2_rsp[ch].p.user.bank_id; end end diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 555c633..9c4b846 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -321,7 +321,7 @@ module cachepool_group .meip_i ( meip_i [t*NumCoresTile+:NumCoresTile] ), .mtip_i ( mtip_i [t*NumCoresTile+:NumCoresTile] ), .msip_i ( msip_i [t*NumCoresTile+:NumCoresTile] ), - .hart_base_id_i ( hart_base_id_i ), + .hart_base_id_i ( hart_base_id_i + t * NumCoresTile ), .cluster_base_addr_i ( cluster_base_addr_i ), // AXI out for UART .axi_out_req_o ( axi_narrow_req_o [t*TileNarrowAxiPorts+:TileNarrowAxiPorts]), From 2e20d2523d129e48938733aab8e8de9756faaa92 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Fri, 9 Jan 2026 12:30:58 +0100 Subject: [PATCH 12/23] [SRC] Change hardware barrier to the new two-level hardware barrier for cachepool. --- Bender.yml | 2 + Makefile | 2 - hardware/src/cachepool_cluster.sv | 61 ++++++--- hardware/src/cachepool_cluster_barrier.sv | 143 ++++++++++++++++++++ hardware/src/cachepool_tile.sv | 91 ++----------- hardware/src/cachepool_tile_barrier.sv | 155 ++++++++++++++++++++++ sim/scripts/vsim_cluster.tcl | 19 +++ sim/scripts/vsim_tile.tcl | 4 +- sim/scripts/vsim_wave.tcl | 13 +- sim/scripts/vsim_wave_single_tile.tcl | 12 +- sim/sim.mk | 9 +- 11 files changed, 390 insertions(+), 121 deletions(-) create mode 100644 hardware/src/cachepool_cluster_barrier.sv create mode 100644 hardware/src/cachepool_tile_barrier.sv create mode 100644 sim/scripts/vsim_cluster.tcl diff --git a/Bender.yml b/Bender.yml index 3962ee9..cbe0c3b 100644 --- a/Bender.yml +++ b/Bender.yml @@ -29,6 +29,8 @@ sources: - hardware/src/tcdm_cache_interco.sv - hardware/src/tcdm_id_remapper.sv - hardware/src/spatz_cache_amo.sv + - hardware/src/cachepool_tile_barrier.sv + - hardware/src/cachepool_cluster_barrier.sv # Level 1 - hardware/src/cachepool_pkg.sv - hardware/src/cachepool_cc.sv diff --git a/Makefile b/Makefile index be9d43f..b9d0471 100644 --- a/Makefile +++ b/Makefile @@ -180,8 +180,6 @@ VLOG_FLAGS += -64 VLOG_DEFS = -DCACHEPOOL - - # Cluster configuration VLOG_DEFS += -DNUM_TILES=$(num_tiles) VLOG_DEFS += -DNumRemotePortTile=$(num_remote_ports_per_tile) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index b4ef0b5..10c06aa 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -243,25 +243,25 @@ module cachepool_cluster cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; logic [NumTiles*NumClusterMst-1 :0] tile_req_valid, tile_req_ready, tile_rsp_valid, tile_rsp_ready; - l2_req_t [ClusterWideOutAxiPorts-1 :0] l2_req; - l2_rsp_t [ClusterWideOutAxiPorts-1 :0] l2_rsp; + l2_req_t [ClusterWideOutAxiPorts-1 :0] l2_req; + l2_rsp_t [ClusterWideOutAxiPorts-1 :0] l2_rsp; - cache_trans_req_chan_t [ClusterWideOutAxiPorts-1 :0] l2_req_chan; - cache_trans_rsp_chan_t [ClusterWideOutAxiPorts-1 :0] l2_rsp_chan; - logic [ClusterWideOutAxiPorts-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready; + cache_trans_req_chan_t [ClusterWideOutAxiPorts-1 :0] l2_req_chan; + cache_trans_rsp_chan_t [ClusterWideOutAxiPorts-1 :0] l2_rsp_chan; + logic [ClusterWideOutAxiPorts-1 :0] l2_req_valid, l2_req_ready , l2_rsp_valid, l2_rsp_ready; typedef logic [$clog2(NumClusterMst*NumTiles)-1:0] l2_sel_t; // one more bit for out-of-range alert - typedef logic [$clog2(ClusterWideOutAxiPorts) :0] tile_sel_err_t; - typedef logic [$clog2(ClusterWideOutAxiPorts)-1 :0] tile_sel_t; + typedef logic [$clog2(ClusterWideOutAxiPorts) :0] tile_sel_err_t; + typedef logic [$clog2(ClusterWideOutAxiPorts)-1:0] tile_sel_t; // Which l2 we want to select for each req tile_sel_err_t [NumTiles*NumClusterMst-1 :0] tile_sel_err; tile_sel_t [NumTiles*NumClusterMst-1 :0] tile_sel; // Which tile we selected for each req - l2_sel_t [ClusterWideOutAxiPorts-1 :0] tile_selected; + l2_sel_t [ClusterWideOutAxiPorts-1 :0] tile_selected; // which tile we want to select for each rsp - l2_sel_t [ClusterWideOutAxiPorts-1 :0] l2_sel; + l2_sel_t [ClusterWideOutAxiPorts-1 :0] l2_sel; // What is the priority for response wiring? // Here we want to make sure the responses from one burst // continues until done @@ -489,7 +489,6 @@ module cachepool_cluster ) i_tile ( .clk_i ( clk_i ), .rst_ni ( rst_ni ), - // .eoc_o ( eoc_o ), .impl_i ( impl_i ), .error_o ( error_o ), .debug_req_i ( debug_req_i ), @@ -798,15 +797,44 @@ module cachepool_cluster axi_csr_slv_req_t axi_csr_req; axi_csr_slv_resp_t axi_csr_rsp; - axi_narrow_req_t [NumTiles-1:0] axi_core_csr_req; - axi_narrow_resp_t [NumTiles-1:0] axi_core_csr_rsp; + axi_narrow_req_t [NumTiles-1:0] axi_core_csr_req, axi_barrier_req; + axi_narrow_resp_t [NumTiles-1:0] axi_core_csr_rsp, axi_barrier_rsp; for (genvar t = 0; t < NumTiles; t++) begin - assign axi_core_csr_req[t] = axi_out_req [t][ClusterPeriph]; - assign axi_out_resp [t][ClusterPeriph] = axi_core_csr_rsp[t]; + assign axi_barrier_req[t] = axi_out_req [t][ClusterPeriph]; + assign axi_out_resp [t][ClusterPeriph] = axi_barrier_rsp[t]; end + // Calculate the peripheral base address + localparam logic [AxiAddrWidth-1:0] TCDMMask = ~(TCDMSize-1); + addr_t tcdm_start_address, tcdm_end_address; + assign tcdm_start_address = (cluster_base_addr_i & TCDMMask); + assign tcdm_end_address = (tcdm_start_address + TCDMSize) & TCDMMask; + + + logic [NumTiles-1:0] use_barrier; + // TODO: Connect to CSR + assign use_barrier = {NumTiles{1'b1}}; + + cachepool_cluster_barrier #( + .AddrWidth (AxiAddrWidth ), + .NrPorts (NumTiles ), + .axi_req_t (axi_narrow_req_t ), + .axi_rsp_t (axi_narrow_resp_t ), + .axi_id_t (axi_id_in_t ), + .axi_user_t (axi_user_t ) + ) i_cachepool_cluster_barrier ( + .clk_i ( clk_i ), + .rst_ni ( rst_ni ), + .axi_slv_req_i ( axi_barrier_req ), + .axi_slv_rsp_o ( axi_barrier_rsp ), + .axi_mst_req_o ( axi_core_csr_req ), + .axi_mst_rsp_i ( axi_core_csr_rsp ), + .barrier_i ( use_barrier ), + .cluster_periph_start_address_i ( tcdm_end_address ) + ); + axi_mux #( .SlvAxiIDWidth ( CsrAxiMstIdWidth ), @@ -887,11 +915,6 @@ module cachepool_cluster logic [$clog2(SpatzAxiNarrowDataWidth/8):0] num_bytes_written; } dma_events_t; - localparam logic [AxiAddrWidth-1:0] TCDMMask = ~(TCDMSize-1); - narrow_addr_t tcdm_start_address, tcdm_end_address; - assign tcdm_start_address = (cluster_base_addr_i & TCDMMask); - assign tcdm_end_address = (tcdm_start_address + TCDMSize) & TCDMMask; - spatz_cluster_peripheral #( .AddrWidth (AxiAddrWidth ), .SPMWidth ($clog2(L1NumSet)), diff --git a/hardware/src/cachepool_cluster_barrier.sv b/hardware/src/cachepool_cluster_barrier.sv new file mode 100644 index 0000000..fe42639 --- /dev/null +++ b/hardware/src/cachepool_cluster_barrier.sv @@ -0,0 +1,143 @@ +// Copyright 2020 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Diyou Shen + +`include "common_cells/registers.svh" + +/// Last level of barrier in CachePool +/// Can perform partial/full barrier based on tile numbers +module cachepool_cluster_barrier + import snitch_pkg::*; + import spatz_cluster_peripheral_reg_pkg::*; +#( + parameter int unsigned AddrWidth = 0, + parameter int NrPorts = 0, + parameter type axi_req_t = logic, + parameter type axi_rsp_t = logic, + // Used to generate response + parameter type axi_id_t = logic, + parameter type axi_user_t = logic, + /// Derived parameter *Do not override* + parameter type addr_t = logic [AddrWidth-1:0] +) ( + input logic clk_i, + input logic rst_ni, + // AXI input + input axi_req_t [NrPorts-1:0] axi_slv_req_i, + output axi_rsp_t [NrPorts-1:0] axi_slv_rsp_o, + // AXI output + output axi_req_t [NrPorts-1:0] axi_mst_req_o, + input axi_rsp_t [NrPorts-1:0] axi_mst_rsp_i, + + input logic [NrPorts-1:0] barrier_i, + input addr_t cluster_periph_start_address_i +); + + typedef enum logic [1:0] { + Idle, + Wait, + Take, + Global + } barrier_state_e; + + // FSM State of the barrier + barrier_state_e [NrPorts-1:0] state_d, state_q; + // the tiles participate in global barrier + logic [NrPorts-1:0] barrier_d, barrier_q; + + // Infomation stored for response generation + typedef struct packed { + axi_id_t id; + axi_user_t user; + } info_t; + + info_t [NrPorts-1:0] info_d, info_q; + + addr_t barrier_addr; + assign barrier_addr = cluster_periph_start_address_i + SPATZ_CLUSTER_PERIPHERAL_HW_BARRIER_OFFSET; + + logic [NrPorts-1:0] is_barrier; + logic take_barrier; + + // xnor between the is_barrier and the barrier needs to be taken + assign take_barrier = ~(|(barrier_q ^ is_barrier)); + + always_comb begin + state_d = state_q; + barrier_d = barrier_q; + info_d = info_q; + is_barrier = '0; + + // Pass through the signals by default + axi_mst_req_o = axi_slv_req_i; + axi_slv_rsp_o = axi_mst_rsp_i; + + // Maximum barrier counter may only be configured in Idle state + barrier_d = (|is_barrier == '0) ? barrier_i : barrier_q; + + for (int i = 0; i < NrPorts; i++) begin + + case (state_q[i]) + Idle: begin + if (axi_slv_req_i[i].ar_valid & axi_slv_req_i[i].ar.addr == barrier_addr) begin + // We have received a barrier request + // Do not forward it further + axi_mst_req_o[i].ar_valid = 0; + // Accept the request + axi_slv_rsp_o[i].ar_ready = 1; + // Record the info need for response + info_d[i] = '{ + id: axi_slv_req_i[i].ar.id, + user: axi_slv_req_i[i].ar.user + }; + // Switch to next state + if (barrier_q[i]) begin + // Wait for global barrier + state_d[i] = Wait; + end else begin + // Local tile barrier, no need to sync + state_d[i] = Take; + end + end + end + + Wait: begin + is_barrier[i] = 1; + + if (take_barrier) begin + // Means all tile participate in the barrier have reach the point + state_d[i] = Take; + end + end + + Take: begin + if (!axi_mst_rsp_i[i].r_valid) begin + // Make sure no r packet is in transition + axi_slv_rsp_o[i].r = '0; + axi_slv_rsp_o[i].r_valid = 1'b1; + axi_slv_rsp_o[i].r.last = 1'b1; + axi_slv_rsp_o[i].r.id = info_q[i].id; + axi_slv_rsp_o[i].r.user = info_q[i].user; + + if (axi_slv_req_i[i].r_ready) begin + // response accepted, switch back state + state_d[i] = Idle; + info_d[i] = '0; + end + end + end + + default: state_d[i] = Idle; + endcase + end + end + + for (genvar i = 0; i < NrPorts; i++) begin : gen_ff + `FFARN(state_q[i], state_d[i], Idle, clk_i, rst_ni) + `FFARN(barrier_q[i], barrier_d[i], '0, clk_i, rst_ni) + `FFARN(info_q[i], info_d[i], '0, clk_i, rst_ni) + end + +endmodule diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 4729a95..4a943a0 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -437,25 +437,7 @@ module cachepool_tile data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_rdata; logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_gnt; - // logic l1d_insn_valid; - // logic [NumL1CtrlTile-1:0] l1d_insn_ready; - // logic [1:0] l1d_insn; tcdm_bank_addr_t cfg_spm_size; - // logic [NumL1CtrlTile-1:0] l1d_busy; - - // High if a port access an illegal SPM region (mapped to cache) - // logic [NrTCDMPortsCores-1:0] spm_error; - - - // 9. SRAM Configuration - // impl_in_t [L1NumWrapper-1:0][L1BankPerWP-1:0] impl_l1d_data; - // impl_in_t [L1NumTagBank-1:0] impl_l1d_tag; - // impl_in_t [1:0] impl_l1d_fifo; - - // impl_in_t [ICacheSets-1:0] impl_l1i_data; - // impl_in_t [ICacheSets-1:0] impl_l1i_tag; - - // assign {impl_l1d_data, impl_l1d_tag, impl_l1d_fifo, impl_l1i_data, impl_l1i_tag} = impl_i; // TODO: Connect to stack overflow error assign error_o = 1'b0; @@ -469,30 +451,9 @@ module cachepool_tile assign axi_wide_req_o[TileMem] = wide_axi_slv_req[SoCDMAOut]; assign wide_axi_slv_rsp[SoCDMAOut] = axi_wide_rsp_i[TileMem]; - - // axi_cut #( - // .Bypass (!RegisterExt ), - // .aw_chan_t (axi_mst_aw_chan_t), - // .w_chan_t (axi_mst_w_chan_t ), - // .b_chan_t (axi_mst_b_chan_t ), - // .ar_chan_t (axi_mst_ar_chan_t), - // .r_chan_t (axi_mst_r_chan_t ), - // .axi_req_t (axi_mst_req_t ), - // .axi_resp_t (axi_mst_resp_t ) - // ) i_cut_ext_narrow_in ( - // .clk_i (clk_i ), - // .rst_ni (rst_ni ), - // .slv_req_i (axi_in_req_i ), - // .slv_resp_o (axi_in_resp_o ), - // .mst_req_o (narrow_axi_mst_req[SoCDMAIn]), - // .mst_resp_i (narrow_axi_mst_rsp[SoCDMAIn]) - // ); - logic [WideXbarCfg.NoSlvPorts-1:0][$clog2(WideXbarCfg.NoMstPorts)-1:0] dma_xbar_default_port; xbar_rule_t [WideXbarCfg.NoAddrRules-1:0] dma_xbar_rule; - // Diyou: DMA Xbar move to cluster level - assign dma_xbar_default_port = '{default: SoCDMAOut}; assign dma_xbar_rule = '{ '{ @@ -504,8 +465,8 @@ module cachepool_tile localparam bit [WideXbarCfg.NoSlvPorts-1:0] DMAEnableDefaultMstPort = '1; axi_xbar #( - .Cfg (WideXbarCfg ), - .ATOPs (0 ), + .Cfg (WideXbarCfg ), + .ATOPs (0 ), .slv_aw_chan_t (axi_mst_tile_wide_aw_chan_t), .mst_aw_chan_t (axi_slv_tile_wide_aw_chan_t), .w_chan_t (axi_mst_tile_wide_w_chan_t ), @@ -538,9 +499,6 @@ module cachepool_tile logic [NrTCDMPortsPerCore-1:0][NumL1CtrlTile-1:0] cache_pready, cache_xbar_pready; logic [NumL1CtrlTile-1:0] cache_amo_pready; - // TODO: remove this module - // where to deal with cache flushing protection? - always_comb begin : cache_flush_protection for (int j = 0; unsigned'(j) < NrTCDMPortsCores; j++) begin /***** REQ *****/ @@ -874,9 +832,6 @@ module cachepool_tile ); assign l1_data_bank_gnt[cb][j+:NumWordPerLine] = {NumWordPerLine{1'b1}}; - // assign l1_data_bank_gnt[cb][j+1] = 1'b1; - // assign l1_data_bank_gnt[cb][j+2] = 1'b1; - // assign l1_data_bank_gnt[cb][j+3] = 1'b1; end // for (genvar j = 0; j < NumDataBankPerCtrl; j++) begin : gen_l1_data_banks @@ -953,17 +908,15 @@ module cachepool_tile .tcdm_req_chan_t (tcdm_req_chan_t ), .tcdm_rsp_t (tcdm_rsp_t ), .tcdm_rsp_chan_t (tcdm_rsp_chan_t ), - .axi_req_t (axi_mst_tile_wide_req_t ), - .axi_ar_chan_t (axi_mst_tile_wide_ar_chan_t ), - .axi_aw_chan_t (axi_mst_tile_wide_aw_chan_t ), - .axi_rsp_t (axi_mst_tile_wide_resp_t ), + .axi_req_t (axi_mst_tile_wide_req_t ), + .axi_ar_chan_t (axi_mst_tile_wide_ar_chan_t), + .axi_aw_chan_t (axi_mst_tile_wide_aw_chan_t), + .axi_rsp_t (axi_mst_tile_wide_resp_t ), .hive_req_t (hive_req_t ), .hive_rsp_t (hive_rsp_t ), .acc_issue_req_t (acc_issue_req_t ), .acc_issue_rsp_t (acc_issue_rsp_t ), .acc_rsp_t (acc_rsp_t ), - // .dma_events_t (dma_events_t ), - // .dma_perf_t (axi_dma_pkg::dma_perf_t ), .XDivSqrt (1'b0 ), .XF16 (1'b1 ), .XF16ALT (1'b0 ), @@ -1072,12 +1025,15 @@ module cachepool_tile // -------- // Cores SoC // -------- - spatz_barrier #( + + // First-level barrier for CachePool system + cachepool_tile_barrier #( .AddrWidth (AxiAddrWidth ), .NrPorts (NrCores ), .dreq_t (reqrsp_req_t ), - .drsp_t (reqrsp_rsp_t ) - ) i_snitch_barrier ( + .drsp_t (reqrsp_rsp_t ), + .user_t (tcdm_user_t ) + ) i_cachepool_tile_barrier ( .clk_i (clk_i ), .rst_ni (rst_ni ), .in_req_i (core_req ), @@ -1248,29 +1204,6 @@ module cachepool_tile .mst_resp_i (wide_axi_mst_rsp[CoreReqWide]) ); - // -------------------- - // TCDM event counters - // -------------------- - // logic [NrTCDMPortsCores-1:0] flat_acc, flat_con; - // for (genvar i = 0; i < NrTCDMPortsCores; i++) begin : gen_event_counter - // `FFARN(flat_acc[i], tcdm_req[i].q_valid, '0, clk_i, rst_ni) - // `FFARN(flat_con[i], tcdm_req[i].q_valid & ~tcdm_rsp[i].q_ready, '0, clk_i, rst_ni) - // end - - // popcount #( - // .INPUT_WIDTH ( NrTCDMPortsCores ) - // ) i_popcount_req ( - // .data_i ( flat_acc ), - // .popcount_o ( tcdm_events.inc_accessed ) - // ); - - // popcount #( - // .INPUT_WIDTH ( NrTCDMPortsCores ) - // ) i_popcount_con ( - // .data_i ( flat_con ), - // .popcount_o ( tcdm_events.inc_congested ) - // ); - // ------------- // Sanity Checks // ------------- diff --git a/hardware/src/cachepool_tile_barrier.sv b/hardware/src/cachepool_tile_barrier.sv new file mode 100644 index 0000000..004f43a --- /dev/null +++ b/hardware/src/cachepool_tile_barrier.sv @@ -0,0 +1,155 @@ +// Copyright 2020 ETH Zurich and University of Bologna. +// Solderpad Hardware License, Version 0.51, see LICENSE for details. +// SPDX-License-Identifier: SHL-0.51 + +// Author: Florian Zaruba +// Author: Fabian Schuiki +// Author: Diyou Shen + +`include "common_cells/registers.svh" + +/// Hardware barrier to synchronize all cores in a cluster. +/// Adapted from Spatz cluster's barrier to fit for a NUMA system +/// The barrier will notify the CSR for global sync + +// This barrier is designed by halting the q_ready signal of barrier request +// IMPORTANT: spill registers on the path to barrier may bring in unwanted behavior +module cachepool_tile_barrier + import snitch_pkg::*; + import spatz_cluster_peripheral_reg_pkg::*; +#( + parameter int unsigned AddrWidth = 0, + parameter int NrPorts = 0, + parameter type dreq_t = logic, + parameter type user_t = logic, + parameter type drsp_t = logic, + /// Derived parameter *Do not override* + parameter type addr_t = logic [AddrWidth-1:0] +) ( + input logic clk_i, + input logic rst_ni, + input dreq_t [NrPorts-1:0] in_req_i, + output drsp_t [NrPorts-1:0] in_rsp_o, + + output dreq_t [NrPorts-1:0] out_req_o, + input drsp_t [NrPorts-1:0] out_rsp_i, + + input addr_t cluster_periph_start_address_i +); + + typedef enum logic [1:0] { + Idle, + Wait, + Global, + Take + } barrier_state_e; + + barrier_state_e [NrPorts-1:0] state_d, state_q; + user_t [NrPorts-1:0] user_d, user_q; + + addr_t barrier_addr; + assign barrier_addr = cluster_periph_start_address_i + SPATZ_CLUSTER_PERIPHERAL_HW_BARRIER_OFFSET; + + logic [NrPorts-1:0] is_barrier, done_barrier; + logic take_barrier; + logic local_barrier; + + assign local_barrier = &is_barrier; + assign take_barrier = &done_barrier; + + always_comb begin + state_d = state_q; + user_d = user_q; + is_barrier = '0; + done_barrier = '0; + out_req_o = in_req_i; + in_rsp_o = out_rsp_i; + + for (int i = 0; i < NrPorts; i++) begin + out_req_o[i].q.user.core_id = i; + case (state_q[i]) + Idle: begin + // If we have a barrier request => start to wait for other cores + if (in_req_i[i].q_valid && (in_req_i[i].q.addr == barrier_addr)) begin + state_d[i] = Wait; + // we do not send the request to CSR + out_req_o[i].q_valid = 0; + in_rsp_o[i].q_ready = 0; + end + end + Wait: begin + is_barrier[i] = 1; + in_rsp_o[i].q_ready = 0; + out_req_o[i].q_valid = 0; + + // Pause the request to CSR until all cores have enter the barrier + if (local_barrier) begin + if (i == 0) begin + // Port 0 will be used to sync with other tiles + // Sned out the barrier request + out_req_o[i].q_valid = 1; + if (out_rsp_i[i].q_ready) begin + // Global barrier accepted, waiting for response + state_d[i] = Global; + // out_req_o[i].q_valid = 0; + end + end else begin + // Other ports can directly enter Global state + state_d[i] = Global; + end + end + end + Global: begin + // The local barrier of the tile has complete + // Waiting for CSR to grant the global one => configurable in CSR for barrier size + // We will now send **ONE** request to CSR for cleaerance + + // Do not release the barrier yet + in_rsp_o[i].q_ready = 0; + out_req_o[i].q_valid = 0; + + if (i == 0) begin + // Waiting for response for global barrier + if (out_rsp_i[i].p_valid) begin + // Mute the response for now + in_rsp_o[i].p_valid = 0; + + done_barrier[i] = 1; + end + end else begin + // Waiting for port 0 finish global barrier + done_barrier[i] = 1; + end + + if (take_barrier) begin + state_d[i] = Take; + // Release the barrier by accepting all requests + in_rsp_o[i].q_ready = 1; + // Record the user for response generating + user_d[i] = out_req_o[i].q.user; + end + end + Take: begin + // Send back the response to finish the barrier sequence + in_rsp_o[i] = '0; + in_rsp_o[i].p_valid = 1; + in_rsp_o[i].p.user = user_q[i]; + + if (in_req_i[i].p_ready) begin + // Response has been taken + state_d[i] = Idle; + user_d[i] = '0; + end + end + + default: state_d[i] = Idle; + endcase + end + end + + for (genvar i = 0; i < NrPorts; i++) begin : gen_ff + `FFARN(state_q[i], state_d[i], Idle, clk_i, rst_ni) + `FFARN(user_q[i], user_d[i], '0, clk_i, rst_ni) + end + +endmodule diff --git a/sim/scripts/vsim_cluster.tcl b/sim/scripts/vsim_cluster.tcl new file mode 100644 index 0000000..c8d66f3 --- /dev/null +++ b/sim/scripts/vsim_cluster.tcl @@ -0,0 +1,19 @@ +# Copyright 2026 ETH Zurich and University of Bologna. +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +# Create group for Cluster +onerror {resume} + +set cluster_path $1 + +add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_cluster_xbar/i_req_xbar/* +add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* +add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* + +add wave -noupdate -group Cluster -group CSR ${cluster_path}/i_cachepool_cluster_peripheral/* + +add wave -noupdate -group Cluster -group Internal ${cluster_path}/* + +add wave -noupdate -group Barrier -group Global ${cluster_path}/i_cachepool_cluster_barrier/* + diff --git a/sim/scripts/vsim_tile.tcl b/sim/scripts/vsim_tile.tcl index 99fe8f1..8763440 100644 --- a/sim/scripts/vsim_tile.tcl +++ b/sim/scripts/vsim_tile.tcl @@ -8,12 +8,14 @@ onerror {resume} set tile_path $2 # Add waves for tcdm_mapper and csrs -add wave -noupdate -group tile[$1] -group Barrier ${tile_path}/i_tile/i_snitch_barrier/* +# add wave -noupdate -group tile[$1] -group Barrier ${tile_path}/i_tile/i_snitch_barrier/* # add wave -noupdate -group tile[$1] -group axi2reqrsp ${tile_path}/i_axi2reqrsp/* # Add waves for xbars add wave -noupdate -group tile[$1] -group narrow_xbar ${tile_path}/i_tile/i_axi_narrow_xbar/* add wave -noupdate -group tile[$1] -group wide_xbar ${tile_path}/i_tile/i_axi_wide_xbar/* +add wave -noupdate -group Barrier -group tile[$1] ${tile_path}/i_tile/i_cachepool_tile_barrier/* + # Add waves for cache controller for {set c 0} {$c < 4} {incr c} { onerror {resume} diff --git a/sim/scripts/vsim_wave.tcl b/sim/scripts/vsim_wave.tcl index a2d8fa3..104144f 100644 --- a/sim/scripts/vsim_wave.tcl +++ b/sim/scripts/vsim_wave.tcl @@ -8,20 +8,16 @@ quietly WaveActivateNextPane {} 0 set cluster_path /tb_cachepool/i_cluster_wrapper/i_cluster set group_path ${cluster_path}/gen_group/i_group - # Add the cluster probe add wave /tb_cachepool/cluster_probe -add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_cluster_xbar/i_req_xbar/* -add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* -add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* - -add wave -noupdate -group Cluster -group CSR ${cluster_path}/i_cachepool_cluster_peripheral/* - -add wave -noupdate -group Cluster -group Internal ${cluster_path}/* +# Cluster +do sim/scripts/vsim_cluster.tcl ${cluster_path} +# Group add wave -noupdate -group Group ${group_path}/* +# Tile and Core for {set tile 0} {$tile < 2} {incr tile} { set tile_path ${group_path}/gen_tiles[$tile] @@ -33,7 +29,6 @@ for {set tile 0} {$tile < 2} {incr tile} { } for {set ch 0} {$ch < 4} {incr ch} { - # add wave -noupdate -group DramSys$ch -group upsizer tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/i_axi_dw_converter/* add wave -noupdate -group DramSys$ch /tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/* } } diff --git a/sim/scripts/vsim_wave_single_tile.tcl b/sim/scripts/vsim_wave_single_tile.tcl index 369ddb0..28e54e5 100644 --- a/sim/scripts/vsim_wave_single_tile.tcl +++ b/sim/scripts/vsim_wave_single_tile.tcl @@ -7,20 +7,13 @@ quietly WaveActivateNextPane {} 0 set cluster_path /tb_cachepool/i_cluster_wrapper/i_cluster set group_path ${cluster_path} +set tile_path ${group_path}/gen_tile # Add the cluster probe add wave /tb_cachepool/cluster_probe -add wave -noupdate -group Cluster -group xbar -group req_xbar ${cluster_path}/i_cluster_xbar/i_req_xbar/* -add wave -noupdate -group Cluster -group xbar -group rsp_xbar ${cluster_path}/i_cluster_xbar/i_rsp_xbar/* -add wave -noupdate -group Cluster -group xbar ${cluster_path}/i_cluster_xbar/* - -add wave -noupdate -group Cluster -group CSR ${cluster_path}/i_cachepool_cluster_peripheral/* - -add wave -noupdate -group Cluster -group Internal ${cluster_path}/* - -set tile_path ${group_path}/gen_tile +do sim/scripts/vsim_cluster.tcl ${cluster_path} do sim/scripts/vsim_tile.tcl 0 ${tile_path} # Add all cores in Tile 0 @@ -30,7 +23,6 @@ for {set core 0} {$core < 4} {incr core} { } for {set ch 0} {$ch < 4} {incr ch} { - # add wave -noupdate -group DramSys$ch -group upsizer tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/i_axi_dw_converter/* add wave -noupdate -group DramSys$ch /tb_cachepool/gen_dram[$ch]/i_axi_dram_sim/* } diff --git a/sim/sim.mk b/sim/sim.mk index b9eceb0..f1b981d 100644 --- a/sim/sim.mk +++ b/sim/sim.mk @@ -44,6 +44,13 @@ ifeq ($(USE_DRAMSYS),1) VSIM_FLAGS += -sv_lib $(DRAMSYS_LIB_PATH)/libDRAMSys_Simulator endif +ifeq ($(num_tiles), 1) + WAVE_FILE := ${SIM_DIR}/scripts/vsim_wave_single_tile.tcl +else + WAVE_FILE := ${SIM_DIR}/scripts/vsim_wave.tcl +endif + + # ---------- # FESVR shim # ---------- @@ -99,7 +106,7 @@ define QUESTASIM @chmod +x $(SIMBIN_DIR)/cachepool_cluster.vsim @echo "#!/bin/bash" > $(SIMBIN_DIR)/cachepool_cluster.vsim.gui @echo 'echo `realpath $$1` > ${SIMBIN_DIR}/logs/.rtlbinary' >> $(SIMBIN_DIR)/cachepool_cluster.vsim.gui - @echo '${VSIM} +permissive ${VSIM_FLAGS} -do "log -r /*; source ${SIM_DIR}/scripts/vsim_wave.tcl; run -a" -work ${WORK_DIR} -ldflags "-Wl,-rpath,${GCC_LIB} -L${FESVR}/lib -lfesvr_vsim -lutil" $1 +permissive-off ++$$1 +PRELOAD=$$1' >> $(SIMBIN_DIR)/cachepool_cluster.vsim.gui + @echo '${VSIM} +permissive ${VSIM_FLAGS} -do "log -r /*; source ${WAVE_FILE}; run -a" -work ${WORK_DIR} -ldflags "-Wl,-rpath,${GCC_LIB} -L${FESVR}/lib -lfesvr_vsim -lutil" $1 +permissive-off ++$$1 +PRELOAD=$$1' >> $(SIMBIN_DIR)/cachepool_cluster.vsim.gui @chmod +x $(SIMBIN_DIR)/cachepool_cluster.vsim.gui endef From 2c3ff6751e9be798bab739fb21ab1411fb1add4c Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Wed, 7 Jan 2026 18:51:14 +0100 Subject: [PATCH 13/23] [SW] Add software for insitu cache byte/half-word/word access test. --- software/tests/CMakeLists.txt | 1 + software/tests/byte-enable/main.c | 222 ++++++++++++++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 software/tests/byte-enable/main.c diff --git a/software/tests/CMakeLists.txt b/software/tests/CMakeLists.txt index 786c4c5..54013c8 100644 --- a/software/tests/CMakeLists.txt +++ b/software/tests/CMakeLists.txt @@ -85,6 +85,7 @@ set(SNITCH_TEST_PREFIX cachepool-) ## RLC add_spatz_test_zeroParam(spin-lock spin-lock/main.c) add_spatz_test_zeroParam(mcs-lock mcs-lock/main.c) +add_spatz_test_zeroParam(byte-enable byte-enable/main.c) # add_snitch_test(multi_producer_single_consumer_double_linked_list multi_producer_single_consumer_double_linked_list/main.c) # add_spatz_test_threeParam(multi_producer_single_consumer_double_linked_list multi_producer_single_consumer_double_linked_list/main.c 1 1350 1000) diff --git a/software/tests/byte-enable/main.c b/software/tests/byte-enable/main.c new file mode 100644 index 0000000..86407e7 --- /dev/null +++ b/software/tests/byte-enable/main.c @@ -0,0 +1,222 @@ +// Copyright 2025 ETH Zurich and University of Bologna. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Author: Zexin Fu + +#include +#include +#include +#include +#include +#include "printf.h" +#ifdef DATAHEADER +#include DATAHEADER +#endif + +#define L1LineWidth (512 / 8) // 512 bits +#define BUF_LINES 2 +#define BUF_BYTES (L1LineWidth * BUF_LINES) + +static uint8_t test_buf[BUF_BYTES] __attribute__((aligned(L1LineWidth))) + __attribute__((section(".data"))); + +static inline void store_b(void *addr, uint8_t value) { + asm volatile("sb %0, 0(%1)" :: "r"(value), "r"(addr) : "memory"); +} + +static inline void store_h(void *addr, uint16_t value) { + asm volatile("sh %0, 0(%1)" :: "r"(value), "r"(addr) : "memory"); +} + +static inline void store_w(void *addr, uint32_t value) { + asm volatile("sw %0, 0(%1)" :: "r"(value), "r"(addr) : "memory"); +} + + +static inline int32_t load_b(const void *addr) { + int32_t out; + asm volatile("lb %0, 0(%1)" : "=r"(out) : "r"(addr) : "memory"); + return out; +} + +static inline int32_t load_h(const void *addr) { + int32_t out; + asm volatile("lh %0, 0(%1)" : "=r"(out) : "r"(addr) : "memory"); + return out; +} + +static inline int32_t load_w(const void *addr) { + int32_t out; + asm volatile("lw %0, 0(%1)" : "=r"(out) : "r"(addr) : "memory"); + return out; +} + +static void init_pattern(uint8_t *buf, size_t bytes) { + size_t words = bytes / 4U; + for (size_t w = 0; w < words; w++) { + size_t base = w * 4U; + uint32_t b0 = (uint8_t)(0xA5U ^ (uint8_t)(base + 0U)); + uint32_t b1 = (uint8_t)(0xA5U ^ (uint8_t)(base + 1U)); + uint32_t b2 = (uint8_t)(0xA5U ^ (uint8_t)(base + 2U)); + uint32_t b3 = (uint8_t)(0xA5U ^ (uint8_t)(base + 3U)); + uint32_t word = (b0) | (b1 << 8U) | (b2 << 16U) | (b3 << 24U); + store_w(buf + base, word); + } + + for (size_t i = words * 4U; i < bytes; i++) { + buf[i] = (uint8_t)(0xA5U ^ (uint8_t)i); + } +} + +static int check_store_and_load(const char *name, uint8_t *base, + uint32_t offset, uint32_t size, + uint32_t value) { + int errors = 0; + + if (((uintptr_t)base & 0x3U) != 0U) { + printf("[FAIL] %s: base misaligned 0x%llx\n", name, + (unsigned long long)(uintptr_t)base); + return 1; + } + + if ((offset + size) > 4U) { + printf("[FAIL] %s: offset+size out of range\n", name); + return 1; + } + + uint32_t orig = (uint32_t)load_w(base); + + switch (size) { + case 1: + store_b(base + offset, (uint8_t)value); + break; + case 2: + store_h(base + offset, (uint16_t)value); + break; + case 4: + store_w(base + offset, (uint32_t)value); + break; + default: + printf("[FAIL] %s: invalid size %u\n", name, size); + return 1; + } + + uint32_t after = (uint32_t)load_w(base); + uint32_t expected = orig; + + uint32_t mask = (size == 1) ? 0xFFU + : (size == 2) ? 0xFFFFU + : 0xFFFFFFFFU; + uint32_t shift = offset * 8U; + expected = (orig & ~(mask << shift)) | ((value & mask) << shift); + + int store_ok = (after == expected); + if (!store_ok) { + printf("[FAIL] %s: store before 0x%08x expected 0x%08x got 0x%08x\n", name, + (unsigned int)orig, (unsigned int)expected, (unsigned int)after); + errors++; + } + + int32_t load_got = 0; + int32_t load_exp = 0; + const char *load_name = "l?"; + int load_ok = 0; + + if (size == 1) { + load_name = "lb"; + load_got = load_b(base + offset); + load_exp = (int8_t)value; + } else if (size == 2) { + load_name = "lh"; + load_got = load_h(base + offset); + load_exp = (int16_t)value; + } else if (size == 4) { + load_name = "lw"; + load_got = load_w(base + offset); + load_exp = (int32_t)value; + } + + load_ok = (load_got == load_exp); + if (!load_ok) { + printf("[FAIL] %s: %s before 0x%08x expected 0x%08x got 0x%08x\n", name, + load_name, (unsigned int)orig, (unsigned int)load_exp, + (unsigned int)load_got); + errors++; + } + + if (store_ok) { + printf("[PASS] %s: store before 0x%08x expected 0x%08x got 0x%08x\n", name, + (unsigned int)orig, (unsigned int)expected, (unsigned int)after); + } + if (load_ok) { + printf("[PASS] %s: %s before 0x%08x expected 0x%08x got 0x%08x\n", name, + load_name, (unsigned int)orig, (unsigned int)load_exp, + (unsigned int)load_got); + } + return errors; +} + +int main(void) { + const unsigned int core_id = snrt_cluster_core_idx(); + + if (core_id == 0) { + l1d_init(0); + uint32_t offset = 31U - __builtin_clz((unsigned int)L1LineWidth); + l1d_xbar_config(offset); + } + + snrt_cluster_hw_barrier(); + + int errors = 0; + + if (core_id == 0) { + init_pattern(test_buf, BUF_BYTES); + printf("original data (line order, high->low addr):\n"); + for (unsigned int line = 0; line < BUF_LINES; line++) { + printf("line %u: ", line); + for (unsigned int byte = 0; byte < L1LineWidth; byte++) { + unsigned int idx = line * L1LineWidth + (L1LineWidth - 1U - byte); + printf("%02x ", (unsigned int)test_buf[idx]); + } + printf("\n"); + } + + errors += check_store_and_load("sb/lb line0+1", test_buf, 1, 1, 0x80U); + + errors += check_store_and_load("sh/lh line0+4+2", test_buf + 4, 2, 2, + 0x8001U); + + errors += check_store_and_load("sw/lw line0+16+0", test_buf + 16, 0, 4, + 0x80000005U); + + errors += check_store_and_load("sb/lb line1+3", test_buf + L1LineWidth, 3, + 1, 0x7FU); + + if (errors == 0) { + printf("Byte-enable test PASSED\n"); + } else { + printf("Byte-enable test FAILED: %d errors\n", errors); + } + } + + snrt_cluster_hw_barrier(); + + if (core_id == 0) { + set_eoc(); + } + + return 0; +} From a895668cda13734536adb12f297e6e69145a6578 Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Thu, 8 Jan 2026 19:29:10 +0100 Subject: [PATCH 14/23] [SW] Add more info output for cache byte access test. --- software/tests/byte-enable/main.c | 42 ++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/software/tests/byte-enable/main.c b/software/tests/byte-enable/main.c index 86407e7..f4701a3 100644 --- a/software/tests/byte-enable/main.c +++ b/software/tests/byte-enable/main.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "printf.h" #ifdef DATAHEADER #include DATAHEADER @@ -81,6 +82,17 @@ static void init_pattern(uint8_t *buf, size_t bytes) { } } +static unsigned long long cycle_to_ns(size_t cycle) { + return (unsigned long long)cycle * 2ULL + 10ULL; +} + +static void trace_inst(const char *name, const char *inst, const void *addr, + size_t cycle) { + unsigned long long ns = cycle_to_ns(cycle); + printf("[TRACE] %s: %s @ 0x%08x cycle %u ns %llu\n", name, inst, + (unsigned int)(uintptr_t)addr, (unsigned int)cycle, ns); +} + static int check_store_and_load(const char *name, uint8_t *base, uint32_t offset, uint32_t size, uint32_t value) { @@ -99,21 +111,33 @@ static int check_store_and_load(const char *name, uint8_t *base, uint32_t orig = (uint32_t)load_w(base); + const uint8_t *addr = base + offset; + const char *store_name = "s?"; + size_t store_cycle = 0; + switch (size) { case 1: - store_b(base + offset, (uint8_t)value); + store_name = "sb"; + store_cycle = benchmark_get_cycle(); + store_b((void *)addr, (uint8_t)value); break; case 2: - store_h(base + offset, (uint16_t)value); + store_name = "sh"; + store_cycle = benchmark_get_cycle(); + store_h((void *)addr, (uint16_t)value); break; case 4: - store_w(base + offset, (uint32_t)value); + store_name = "sw"; + store_cycle = benchmark_get_cycle(); + store_w((void *)addr, (uint32_t)value); break; default: printf("[FAIL] %s: invalid size %u\n", name, size); return 1; } + trace_inst(name, store_name, addr, store_cycle); + uint32_t after = (uint32_t)load_w(base); uint32_t expected = orig; @@ -133,22 +157,28 @@ static int check_store_and_load(const char *name, uint8_t *base, int32_t load_got = 0; int32_t load_exp = 0; const char *load_name = "l?"; + size_t load_cycle = 0; int load_ok = 0; if (size == 1) { load_name = "lb"; - load_got = load_b(base + offset); + load_cycle = benchmark_get_cycle(); + load_got = load_b(addr); load_exp = (int8_t)value; } else if (size == 2) { load_name = "lh"; - load_got = load_h(base + offset); + load_cycle = benchmark_get_cycle(); + load_got = load_h(addr); load_exp = (int16_t)value; } else if (size == 4) { load_name = "lw"; - load_got = load_w(base + offset); + load_cycle = benchmark_get_cycle(); + load_got = load_w(addr); load_exp = (int32_t)value; } + trace_inst(name, load_name, addr, load_cycle); + load_ok = (load_got == load_exp); if (!load_ok) { printf("[FAIL] %s: %s before 0x%08x expected 0x%08x got 0x%08x\n", name, From 245699b47f107e97a95d22b3ad2d7ccdfcbf895f Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Fri, 9 Jan 2026 16:56:40 +0100 Subject: [PATCH 15/23] [RTL] wire byte strobes into L1 data banks - pass core wstrb into cachepool_cache_ctrl and use per-byte bank enables - map wide line SRAMs to byte-wide BE slices in cachepool_tile - bump 512b line tag/meta width to avoid truncation with byte masks - update local build/sim overrides used to run the modified insitu-cache --- config/cachepool_512.mk | 2 +- config/cachepool_fpu_512.mk | 2 +- hardware/src/cachepool_tile.sv | 47 ++++++++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/config/cachepool_512.mk b/config/cachepool_512.mk index 8970304..05992d5 100644 --- a/config/cachepool_512.mk +++ b/config/cachepool_512.mk @@ -52,7 +52,7 @@ l1d_num_way ?= 4 l1d_tile_size ?= 256 # L1 data cache tag width (TODO: should be calcualted) -l1d_tag_data_width ?= 52 +l1d_tag_data_width ?= 92 #################### ## CachePool CC ## diff --git a/config/cachepool_fpu_512.mk b/config/cachepool_fpu_512.mk index c922ef3..c51eccd 100644 --- a/config/cachepool_fpu_512.mk +++ b/config/cachepool_fpu_512.mk @@ -54,7 +54,7 @@ l1d_num_way ?= 4 l1d_tile_size ?= 256 # L1 data cache tag width (TODO: should be calcualted) -l1d_tag_data_width ?= 52 +l1d_tag_data_width ?= 92 #################### ## CachePool CC ## diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 4a943a0..9dcf9d6 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -415,6 +415,7 @@ module cachepool_tile tcdm_user_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_meta; logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_write; data_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_data; + strb_t [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_req_strb; logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_valid; logic [NumL1CtrlTile-1:0][NrTCDMPortsPerCore-1:0] cache_rsp_ready; @@ -433,7 +434,7 @@ module cachepool_tile logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_we; tcdm_bank_addr_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_addr; data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_wdata; - logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_be; + logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0][DataWidth/8-1:0] l1_data_bank_be; data_t [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_rdata; logic [NumL1CtrlTile-1:0][NumDataBankPerCtrl-1:0] l1_data_bank_gnt; @@ -630,6 +631,7 @@ module cachepool_tile assign cache_req_meta [cb][j] = cache_req_reg.q.user; assign cache_req_write[cb][j] = cache_req_reg.q.write; assign cache_req_data [cb][j] = cache_req_reg.q.data; + assign cache_req_strb [cb][j] = cache_req_reg.q.strb; assign cache_rsp_reg.p_valid = cache_rsp_valid[cb][j]; assign cache_rsp_reg.q_ready = cache_req_ready[cb][j]; @@ -646,6 +648,7 @@ module cachepool_tile assign cache_req_meta [cb][j] = cache_xbar_req [j][cb].q.user; assign cache_req_write[cb][j] = cache_xbar_req [j][cb].q.write; assign cache_req_data [cb][j] = cache_xbar_req [j][cb].q.data; + assign cache_req_strb [cb][j] = cache_xbar_req [j][cb].q.strb; assign cache_xbar_rsp[j][cb].p_valid = cache_rsp_valid[cb][j]; assign cache_xbar_rsp[j][cb].q_ready = cache_req_ready[cb][j]; @@ -661,6 +664,21 @@ module cachepool_tile // For address scrambling localparam NumSelBits = $clog2(NumL1CtrlTile); localparam NumWordPerLine = L1LineWidth / DataWidth; + localparam int unsigned WordBytes = DataWidth / 8; + initial begin + $display("Cache Configuration:"); + $display(" NumCtrl : %0d", NumL1CtrlTile); + $display(" LineWidth : %0d", L1LineWidth); + $display(" NumWordPerLine : %0d", NumWordPerLine); + $display(" NumSet : %0d", L1NumSet); + $display(" AssoPerCtrl : %0d", L1AssoPerCtrl); + $display(" BankFactor : %0d", L1BankFactor); + $display(" NumTagBankPerCtrl : %0d", NumTagBankPerCtrl); + $display(" NumDataBankPerCtrl: %0d", NumDataBankPerCtrl); + $display(" CoalFactor : %0d", L1CoalFactor); + $display(" RefillDataWidth: %0d", RefillDataWidth); + $display(" DynamicOffset : %0d", dynamic_offset); + end logic [SpatzAxiAddrWidth-1:0] bitmask_up, bitmask_lo; assign bitmask_lo = (1 << dynamic_offset) - 1; // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and add back the NumSelBits bits @@ -679,6 +697,7 @@ module cachepool_tile .CoalExtFactor (L1CoalFactor ), .AddrWidth (L1AddrWidth ), .WordWidth (DataWidth ), + .ByteWidth (8 ), .TagWidth (L1TagDataWidth ), // Cache .NumCacheEntry (L1NumEntryPerCtrl ), @@ -712,6 +731,7 @@ module cachepool_tile .core_req_meta_i (cache_req_meta [cb] ), .core_req_write_i (cache_req_write[cb] ), .core_req_wdata_i (cache_req_data [cb] ), + .core_req_wstrb_i (cache_req_strb [cb] ), // Response .core_resp_valid_o (cache_rsp_valid[cb] ), .core_resp_ready_i (cache_rsp_ready[cb] ), @@ -810,11 +830,18 @@ module cachepool_tile end // TODO: Should we use a single large bank or multiple narrow ones? - for (genvar j = 0; j < NumDataBankPerCtrl; j = j+NumWordPerLine) begin : gen_l1_data_banks + for (genvar bank = 0; bank < NumDataBankPerCtrl/NumWordPerLine; bank++) begin : gen_l1_data_banks + localparam int unsigned BaseIdx = bank * NumWordPerLine; + logic [NumWordPerLine*WordBytes-1:0] bank_be; + + for (genvar w = 0; w < NumWordPerLine; w++) begin : gen_bank_be + assign bank_be[w*WordBytes +: WordBytes] = l1_data_bank_be[cb][BaseIdx + w]; + end + tc_sram_impl #( .NumWords (L1CacheWayEntry/L1BankFactor), .DataWidth (L1LineWidth), - .ByteWidth (DataWidth ), + .ByteWidth (8 ), .NumPorts (1 ), .Latency (1 ), .SimInit ("zeros" ) @@ -823,15 +850,15 @@ module cachepool_tile .rst_ni (rst_ni ), .impl_i ('0 ), .impl_o (/* unsed */ ), - .req_i ( l1_data_bank_req [cb][j] ), - .we_i ( l1_data_bank_we [cb][j] ), - .addr_i ( l1_data_bank_addr [cb][j] ), - .wdata_i( l1_data_bank_wdata[cb][j+:NumWordPerLine]), - .be_i ( l1_data_bank_be [cb][j+:NumWordPerLine]), - .rdata_o( l1_data_bank_rdata[cb][j+:NumWordPerLine]) + .req_i ( l1_data_bank_req [cb][BaseIdx] ), + .we_i ( l1_data_bank_we [cb][BaseIdx] ), + .addr_i ( l1_data_bank_addr [cb][BaseIdx] ), + .wdata_i( l1_data_bank_wdata[cb][BaseIdx+:NumWordPerLine]), + .be_i ( bank_be ), + .rdata_o( l1_data_bank_rdata[cb][BaseIdx+:NumWordPerLine]) ); - assign l1_data_bank_gnt[cb][j+:NumWordPerLine] = {NumWordPerLine{1'b1}}; + assign l1_data_bank_gnt[cb][BaseIdx+:NumWordPerLine] = {NumWordPerLine{1'b1}}; end // for (genvar j = 0; j < NumDataBankPerCtrl; j++) begin : gen_l1_data_banks From 7ae364cea779813e82c4f71e054affff4add7f09 Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Fri, 9 Jan 2026 22:10:45 +0100 Subject: [PATCH 16/23] Update the insitu-cache dep which supports byte access. --- Bender.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Bender.lock b/Bender.lock index 958e1ed..138e86b 100644 --- a/Bender.lock +++ b/Bender.lock @@ -71,7 +71,7 @@ packages: - common_verification - register_interface insitu-cache: - revision: 04f72a7ac7e9091f1820f0dac59bb778b134d7f7 + revision: 57c0884166dd0f1b7c484633b437fe11d5d62c89 version: null source: Git: https://github.com/pulp-platform/Insitu-Cache.git From b7fd70b8231b04931cd44ac02c0ceb429095ca27 Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Fri, 9 Jan 2026 22:53:47 +0100 Subject: [PATCH 17/23] [SW] Add vector byte/half-word test. --- software/tests/byte-enable/main.c | 213 +++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 5 deletions(-) diff --git a/software/tests/byte-enable/main.c b/software/tests/byte-enable/main.c index f4701a3..e0e37b6 100644 --- a/software/tests/byte-enable/main.c +++ b/software/tests/byte-enable/main.c @@ -31,9 +31,32 @@ #define BUF_LINES 2 #define BUF_BYTES (L1LineWidth * BUF_LINES) +#ifndef ENABLE_SCALAR_TESTS +#define ENABLE_SCALAR_TESTS 1 +#endif + +#ifndef ENABLE_VECTOR_TESTS +#define ENABLE_VECTOR_TESTS 1 +#endif + +#define VEC_E8_LEN 16U +#define VEC_E16_LEN 8U +#define VEC_BUF_BYTES 256U + static uint8_t test_buf[BUF_BYTES] __attribute__((aligned(L1LineWidth))) __attribute__((section(".data"))); +static uint8_t vec_buf[VEC_BUF_BYTES] __attribute__((aligned(64))) + __attribute__((section(".data"))); +static uint8_t vec_data8[VEC_E8_LEN] __attribute__((aligned(4))) + __attribute__((section(".data"))); +static uint16_t vec_data16[VEC_E16_LEN] __attribute__((aligned(4))) + __attribute__((section(".data"))); +static uint8_t vec_idx8[VEC_E8_LEN] __attribute__((aligned(4))) + __attribute__((section(".data"))); +static uint16_t vec_idx16[VEC_E16_LEN] __attribute__((aligned(4))) + __attribute__((section(".data"))); + static inline void store_b(void *addr, uint8_t value) { asm volatile("sb %0, 0(%1)" :: "r"(value), "r"(addr) : "memory"); } @@ -65,20 +88,35 @@ static inline int32_t load_w(const void *addr) { return out; } +static uint8_t pattern_byte(size_t idx) { + return (uint8_t)(0xA5U ^ (uint8_t)idx); +} + static void init_pattern(uint8_t *buf, size_t bytes) { size_t words = bytes / 4U; for (size_t w = 0; w < words; w++) { size_t base = w * 4U; - uint32_t b0 = (uint8_t)(0xA5U ^ (uint8_t)(base + 0U)); - uint32_t b1 = (uint8_t)(0xA5U ^ (uint8_t)(base + 1U)); - uint32_t b2 = (uint8_t)(0xA5U ^ (uint8_t)(base + 2U)); - uint32_t b3 = (uint8_t)(0xA5U ^ (uint8_t)(base + 3U)); + uint32_t b0 = pattern_byte(base + 0U); + uint32_t b1 = pattern_byte(base + 1U); + uint32_t b2 = pattern_byte(base + 2U); + uint32_t b3 = pattern_byte(base + 3U); uint32_t word = (b0) | (b1 << 8U) | (b2 << 16U) | (b3 << 24U); store_w(buf + base, word); } for (size_t i = words * 4U; i < bytes; i++) { - buf[i] = (uint8_t)(0xA5U ^ (uint8_t)i); + buf[i] = pattern_byte(i); + } +} + +static void init_vec_data(void) { + for (unsigned int i = 0; i < VEC_E8_LEN; i++) { + vec_data8[i] = (uint8_t)(0x10U + (i * 3U)); + vec_idx8[i] = (uint8_t)(i * 3U); + } + for (unsigned int i = 0; i < VEC_E16_LEN; i++) { + vec_data16[i] = (uint16_t)(0x2000U + (i * 5U)); + vec_idx16[i] = (uint16_t)(i * 4U); } } @@ -199,6 +237,165 @@ static int check_store_and_load(const char *name, uint8_t *base, return errors; } +static int verify_vec_e8(const char *name, uint8_t *buf, size_t base_index, + const uint8_t *vals, const uint16_t *offsets, + size_t count, size_t region_bytes) { + int errors = 0; + + for (size_t pos = 0; pos < region_bytes; pos++) { + uint8_t exp = pattern_byte(base_index + pos); + for (size_t i = 0; i < count; i++) { + if (offsets[i] == pos) { + exp = vals[i]; + break; + } + } + uint8_t got = buf[base_index + pos]; + if (got != exp) { + printf("[FAIL] %s: byte+%u expected 0x%02x got 0x%02x\n", name, + (unsigned int)pos, (unsigned int)exp, (unsigned int)got); + errors++; + } + } + + if (errors == 0) { + printf("[PASS] %s: vector store verify\n", name); + } + + return errors; +} + +static int verify_vec_e16(const char *name, uint8_t *buf, size_t base_index, + const uint16_t *vals, const uint16_t *offsets, + size_t count, size_t region_bytes) { + int errors = 0; + + for (size_t pos = 0; pos < region_bytes; pos++) { + uint8_t exp = pattern_byte(base_index + pos); + for (size_t i = 0; i < count; i++) { + if (offsets[i] == pos) { + exp = (uint8_t)(vals[i] & 0xFFU); + break; + } else if (offsets[i] + 1U == pos) { + exp = (uint8_t)((vals[i] >> 8U) & 0xFFU); + break; + } + } + uint8_t got = buf[base_index + pos]; + if (got != exp) { + printf("[FAIL] %s: byte+%u expected 0x%02x got 0x%02x\n", name, + (unsigned int)pos, (unsigned int)exp, (unsigned int)got); + errors++; + } + } + + if (errors == 0) { + printf("[PASS] %s: vector store verify\n", name); + } + + return errors; +} + +static int run_vector_tests(void) { + int errors = 0; + uint32_t avl; + uint32_t vlen; + uint16_t offsets16[VEC_E16_LEN]; + uint16_t offsets8[VEC_E8_LEN]; + + init_pattern(vec_buf, VEC_BUF_BYTES); + init_vec_data(); + + const uint32_t stride_b = 2U; + const uint32_t stride_h = 4U; + + const size_t base_e8_unit = 0U; + const size_t base_e8_stride = 64U; + const size_t base_e8_index = 128U; + const size_t base_e16_unit = 160U; + const size_t base_e16_stride = 192U; + const size_t base_e16_index = 224U; + + avl = VEC_E8_LEN; + asm volatile("vsetvli %0, %1, e8, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle8.v v0, (%0)" :: "r"(vec_data8) : "memory"); + size_t cyc = benchmark_get_cycle(); + asm volatile("vse8.v v0, (%0)" :: "r"(vec_buf + base_e8_unit) : "memory"); + trace_inst("vec e8 unit", "vse8.v", vec_buf + base_e8_unit, cyc); + for (unsigned int i = 0; i < VEC_E8_LEN; i++) + offsets8[i] = i; + errors += verify_vec_e8("vec e8 unit", vec_buf, base_e8_unit, vec_data8, + offsets8, VEC_E8_LEN, VEC_E8_LEN); + + avl = VEC_E8_LEN; + asm volatile("vsetvli %0, %1, e8, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle8.v v0, (%0)" :: "r"(vec_data8) : "memory"); + cyc = benchmark_get_cycle(); + asm volatile("vsse8.v v0, (%0), %1" :: "r"(vec_buf + base_e8_stride), + "r"(stride_b) : "memory"); + trace_inst("vec e8 strided", "vsse8.v", vec_buf + base_e8_stride, cyc); + for (unsigned int i = 0; i < VEC_E8_LEN; i++) + offsets8[i] = i * stride_b; + errors += verify_vec_e8("vec e8 strided", vec_buf, base_e8_stride, vec_data8, + offsets8, VEC_E8_LEN, + (VEC_E8_LEN - 1U) * stride_b + 1U); + + avl = VEC_E8_LEN; + asm volatile("vsetvli %0, %1, e8, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle8.v v0, (%0)" :: "r"(vec_data8) : "memory"); + asm volatile("vle8.v v1, (%0)" :: "r"(vec_idx8) : "memory"); + cyc = benchmark_get_cycle(); + asm volatile("vsuxei8.v v0, (%0), v1" :: "r"(vec_buf + base_e8_index) + : "memory"); + trace_inst("vec e8 indexed", "vsuxei8.v", vec_buf + base_e8_index, cyc); + for (unsigned int i = 0; i < VEC_E8_LEN; i++) + offsets8[i] = vec_idx8[i]; + errors += verify_vec_e8("vec e8 indexed", vec_buf, base_e8_index, vec_data8, + offsets8, VEC_E8_LEN, + offsets8[VEC_E8_LEN - 1U] + 1U); + + avl = VEC_E16_LEN; + asm volatile("vsetvli %0, %1, e16, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle16.v v0, (%0)" :: "r"(vec_data16) : "memory"); + cyc = benchmark_get_cycle(); + asm volatile("vse16.v v0, (%0)" :: "r"(vec_buf + base_e16_unit) : "memory"); + trace_inst("vec e16 unit", "vse16.v", vec_buf + base_e16_unit, cyc); + for (unsigned int i = 0; i < VEC_E16_LEN; i++) + offsets16[i] = i * 2U; + errors += verify_vec_e16("vec e16 unit", vec_buf, base_e16_unit, vec_data16, + offsets16, VEC_E16_LEN, VEC_E16_LEN * 2U); + + avl = VEC_E16_LEN; + asm volatile("vsetvli %0, %1, e16, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle16.v v0, (%0)" :: "r"(vec_data16) : "memory"); + cyc = benchmark_get_cycle(); + asm volatile("vsse16.v v0, (%0), %1" :: "r"(vec_buf + base_e16_stride), + "r"(stride_h) : "memory"); + trace_inst("vec e16 strided", "vsse16.v", vec_buf + base_e16_stride, cyc); + for (unsigned int i = 0; i < VEC_E16_LEN; i++) + offsets16[i] = i * stride_h; + errors += verify_vec_e16("vec e16 strided", vec_buf, base_e16_stride, + vec_data16, offsets16, VEC_E16_LEN, + (VEC_E16_LEN - 1U) * stride_h + 2U); + + avl = VEC_E16_LEN; + asm volatile("vsetvli %0, %1, e16, m1, ta, ma" : "=r"(vlen) : "r"(avl)); + asm volatile("vle16.v v0, (%0)" :: "r"(vec_data16) : "memory"); + asm volatile("vle16.v v1, (%0)" :: "r"(vec_idx16) : "memory"); + cyc = benchmark_get_cycle(); + asm volatile("vsuxei16.v v0, (%0), v1" :: "r"(vec_buf + base_e16_index) + : "memory"); + trace_inst("vec e16 indexed", "vsuxei16.v", vec_buf + base_e16_index, cyc); + for (unsigned int i = 0; i < VEC_E16_LEN; i++) + offsets16[i] = vec_idx16[i]; + errors += verify_vec_e16("vec e16 indexed", vec_buf, base_e16_index, + vec_data16, offsets16, VEC_E16_LEN, + offsets16[VEC_E16_LEN - 1U] + 2U); + + (void)vlen; + return errors; +} + int main(void) { const unsigned int core_id = snrt_cluster_core_idx(); @@ -224,6 +421,7 @@ int main(void) { printf("\n"); } +#if ENABLE_SCALAR_TESTS errors += check_store_and_load("sb/lb line0+1", test_buf, 1, 1, 0x80U); errors += check_store_and_load("sh/lh line0+4+2", test_buf + 4, 2, 2, @@ -234,6 +432,11 @@ int main(void) { errors += check_store_and_load("sb/lb line1+3", test_buf + L1LineWidth, 3, 1, 0x7FU); +#endif + +#if ENABLE_VECTOR_TESTS + errors += run_vector_tests(); +#endif if (errors == 0) { printf("Byte-enable test PASSED\n"); From e76ffbd151a23529758cbcff4c240ce5005a510d Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Tue, 13 Jan 2026 11:53:43 +0100 Subject: [PATCH 18/23] [SCRIPT] Update the auto-benchmark scripts: 1.add new benchmarks; 2. Fix the incorrect exit issue. --- util/auto-benchmark/configs.sh | 4 ++-- util/auto-benchmark/run_all.sh | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/util/auto-benchmark/configs.sh b/util/auto-benchmark/configs.sh index f3013c6..284cd26 100755 --- a/util/auto-benchmark/configs.sh +++ b/util/auto-benchmark/configs.sh @@ -2,7 +2,7 @@ # CONFIGS="cachepool_fpu_512" # KERNELS="spin-lock fdotp-32b_M32768" CONFIGS="cachepool_fpu_128 cachepool_fpu_256 cachepool_fpu_512" -KERNELS="spin-lock fdotp-32b_M8192 fmatmul-32b_M32_N32_K32" -# KERNELS="spin-lock fdotp-32b_M32768 gemv-col_M256_N128_K32 fmatmul-32b_M32_N32_K32 fmatmul-32b_M64_N64_K64" +# KERNELS="spin-lock fdotp-32b_M8192 fmatmul-32b_M32_N32_K32" +KERNELS="spin-lock fdotp-32b_M32768 gemv-col_M256_N128_K32 fmatmul-32b_M32_N32_K32 fmatmul-32b_M64_N64_K64 multi_producer_single_consumer_double_linked_list_M1_N1350_K100 byte-enable" PREFIX="test-cachepool-" # common prefix for all kernels ROOT_PATH=../.. # adjust if needed (path to repo root) diff --git a/util/auto-benchmark/run_all.sh b/util/auto-benchmark/run_all.sh index 77827b7..ff6fba6 100755 --- a/util/auto-benchmark/run_all.sh +++ b/util/auto-benchmark/run_all.sh @@ -1,6 +1,18 @@ #!/usr/bin/env bash +# Refuse to be sourced to avoid killing the interactive shell on errors/interrupts. +if [[ "${BASH_SOURCE[0]}" != "$0" ]]; then + echo "Error: do not source this script; run it as ./run_all.sh" >&2 + return 1 +fi + set -e +cleanup() { + echo + echo "[INFO] Interrupted; stopping batch run." +} +trap 'cleanup; exit 130' INT TERM + # Load user configs source ./configs.sh From 1b1e5ea2a59ab2e2bdfc336b07d02ee049d645ad Mon Sep 17 00:00:00 2001 From: Zexin Fu Date: Tue, 13 Jan 2026 12:36:27 +0100 Subject: [PATCH 19/23] [Lint] Fix a line length exceeds max linting issue. --- hardware/src/cachepool_tile.sv | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 9dcf9d6..cbc5141 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -830,7 +830,8 @@ module cachepool_tile end // TODO: Should we use a single large bank or multiple narrow ones? - for (genvar bank = 0; bank < NumDataBankPerCtrl/NumWordPerLine; bank++) begin : gen_l1_data_banks + for (genvar bank = 0; bank < (NumDataBankPerCtrl/NumWordPerLine); + bank++) begin : gen_l1_data_banks localparam int unsigned BaseIdx = bank * NumWordPerLine; logic [NumWordPerLine*WordBytes-1:0] bank_be; From ae1321e5612c4c549bf28e0e02cbe7453bc36706 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Tue, 13 Jan 2026 13:26:45 +0100 Subject: [PATCH 20/23] [SRC] WIP: connect the cross-tile interconnection. --- hardware/src/cachepool_cluster.sv | 15 +++++++++++-- hardware/src/cachepool_group.sv | 29 +++++++++++++------------ hardware/src/cachepool_pkg.sv | 1 + hardware/src/cachepool_tile.sv | 34 ++++++++++++++++++++++-------- hardware/src/tcdm_cache_interco.sv | 33 +++++++++++++++++++---------- sim/scripts/vsim_wave.tcl | 3 ++- 6 files changed, 79 insertions(+), 36 deletions(-) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index 10c06aa..db2155c 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -272,7 +272,15 @@ module cachepool_cluster logic [NumTiles*NumClusterMst-1 :0] rr_lock_d, rr_lock_q; tile_sel_t [NumTiles*NumClusterMst-1 :0] l2_prio_d, l2_prio_q; - if (Burst_Enable) begin + + l2_sel_t [ClusterWideOutAxiPorts-1:0] port_id; + + for (genvar i = 0; i < ClusterWideOutAxiPorts; i ++) begin + assign port_id[i] = l2_rsp[i].p.user.tile_id * NumClusterMst + l2_rsp[i].p.user.bank_id; + end + + + if (Burst_Enable) begin : gen_burst_ext_sel `FF(rr_lock_q, rr_lock_d, 1'b0) `FF(l2_prio_q, l2_prio_d, 1'b0) @@ -281,7 +289,7 @@ module cachepool_cluster logic [ClusterWideOutAxiPorts-1:0] arb_valid; for (genvar i = 0; i < ClusterWideOutAxiPorts; i ++) begin // Used to check the round-robin selection - assign arb_valid[i] = (l2_rsp_chan[i].user.bank_id == port) & l2_rsp_valid[i]; + assign arb_valid[i] = (port_id[i] == port) & l2_rsp_valid[i]; end always_comb begin @@ -302,6 +310,7 @@ module cachepool_cluster l2_rsp_rr[port] = l2_prio_d[port]; // Lock judgement + // Should it work on the l2_rsp instead of tile_rsp? if (tile_rsp_chan[port].user.burst.is_burst & |arb_valid) begin // We got a burst response if (tile_rsp_chan[port].user.burst.burst_len == 0) begin @@ -466,6 +475,7 @@ module cachepool_cluster .NumSpatzFPUs ( NumSpatzFPUs ), .NumSpatzIPUs ( NumSpatzIPUs ), .SnitchPMACfg ( SnitchPMACfg ), + .TileIDWidth ( 1 ), .NumIntOutstandingLoads ( NumIntOutstandingLoads ), .NumIntOutstandingMem ( NumIntOutstandingMem ), .NumSpatzOutstandingLoads ( NumSpatzOutstandingLoads ), @@ -497,6 +507,7 @@ module cachepool_cluster .msip_i ( msip_i ), .hart_base_id_i ( hart_base_id_i ), .cluster_base_addr_i ( cluster_base_addr_i ), + .tile_id_i ( '0 ), .axi_out_req_o ( axi_out_req [0] ), .axi_out_resp_i ( axi_out_resp [0] ), // Remote Ports (not used) diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 9c4b846..74e8bfe 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -207,10 +207,6 @@ module cachepool_group `SNITCH_VM_TYPEDEF(AxiAddrWidth) - axi_in_req_t [NumTiles-1:0] axi_in_req; - axi_in_resp_t [NumTiles-1:0] axi_in_rsp; - - // --------------- // CachePool Tile // --------------- @@ -218,8 +214,8 @@ module cachepool_group logic [NumTiles-1:0] error; assign error_o = |error; - cache_trans_req_t [NumTiles-1 :0] cache_core_req; - cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; + cache_trans_req_t [NumTiles-1 :0] cache_core_req; + cache_trans_rsp_t [NumTiles-1 :0] cache_core_rsp; // cache_trans_req_chan_t [NumTiles*NumClusterMst-1 :0] tile_req_chan; // cache_trans_rsp_chan_t [NumTiles*NumClusterMst-1 :0] tile_rsp_chan; @@ -242,6 +238,10 @@ module cachepool_group tcdm_rsp_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_chan; logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_in_rsp_valid, tile_remote_in_rsp_ready; + // Symmetric xbar, in/out select types are the same + remote_tile_sel_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] remote_out_sel_tile, remote_in_sel_tile; + remote_tile_sel_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] remote_out_sel_xbar, remote_in_sel_xbar; + for (genvar t = 0; t < NumTiles; t++) begin for (genvar p = 0; p < NrTCDMPortsPerCore; p++) begin assign tile_remote_out_req_chan [p][t] = tile_remote_out_req[t][p].q; @@ -262,16 +262,17 @@ module cachepool_group assign tile_remote_in_rsp_chan [p][t] = tile_remote_in_rsp[t][p].p; assign tile_remote_in_rsp_valid[p][t] = tile_remote_in_rsp[t][p].p_valid; assign tile_remote_in_req_ready[p][t] = tile_remote_in_rsp[t][p].q_ready; + + // Selection signals + assign remote_out_sel_xbar[p][t] = remote_out_sel_tile[t][p]; + assign remote_in_sel_xbar [p][t] = tile_remote_in_rsp_chan[p][t].user.tile_id; end end - // Symmetric xbar, in/out select types are the same - remote_tile_sel_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] remote_out_sel_tile, remote_in_sel_tile; - remote_tile_sel_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] remote_out_sel_xbar, remote_in_sel_xbar; - - - for (genvar t = 0; t < NumTiles; t ++) begin : gen_tiles + logic [9:0] hart_base_id; + assign hart_base_id = hart_base_id_i + t * NumCoresTile; + cachepool_tile #( .AxiAddrWidth ( AxiAddrWidth ), .AxiDataWidth ( AxiDataWidth ), @@ -301,6 +302,7 @@ module cachepool_group .axi_out_req_t ( axi_mst_cache_req_t ), .axi_out_resp_t ( axi_mst_cache_resp_t ), .Xdma ( Xdma ), + .TileIDWidth ( TileIDWidth ), .DMAAxiReqFifoDepth ( DMAAxiReqFifoDepth ), .DMAReqFifoDepth ( DMAReqFifoDepth ), .RegisterOffloadRsp ( RegisterOffloadRsp ), @@ -321,8 +323,9 @@ module cachepool_group .meip_i ( meip_i [t*NumCoresTile+:NumCoresTile] ), .mtip_i ( mtip_i [t*NumCoresTile+:NumCoresTile] ), .msip_i ( msip_i [t*NumCoresTile+:NumCoresTile] ), - .hart_base_id_i ( hart_base_id_i + t * NumCoresTile ), + .hart_base_id_i ( hart_base_id ), .cluster_base_addr_i ( cluster_base_addr_i ), + .tile_id_i ( t ), // AXI out for UART .axi_out_req_o ( axi_narrow_req_o [t*TileNarrowAxiPorts+:TileNarrowAxiPorts]), .axi_out_resp_i ( axi_narrow_rsp_i [t*TileNarrowAxiPorts+:TileNarrowAxiPorts]), diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index ff5a985..0474d0b 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -321,6 +321,7 @@ package cachepool_pkg; typedef struct packed { logic [CoreIDWidth-1:0] core_id; + logic [TileIDWidth-1:0] tile_id; logic is_amo; reqid_t req_id; logic is_fpu; diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index cbc5141..e769886 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -68,6 +68,8 @@ module cachepool_tile parameter int unsigned NumSpatzIPUs = 1, /// Per-core enabling of the custom `Xdma` ISA extensions. parameter bit [NrCores-1:0] Xdma = '{default: '0}, + /// Tile ID Width + parameter int unsigned TileIDWidth = 0, /// # Per-core parameters /// Per-core integer outstanding loads parameter int unsigned NumIntOutstandingLoads = '0, @@ -137,6 +139,8 @@ module cachepool_tile /// Base address of cluster. TCDM and cluster peripheral location are derived from /// it. This signal is pseudo-static. input logic [AxiAddrWidth-1:0] cluster_base_addr_i, + /// Tile ID, internal ID, the base is always 0, in theory should not change during use + input logic [TileIDWidth-1:0] tile_id_i, /// AXI Narrow out-port (UART/Peripheral) output axi_narrow_req_t [1:0] axi_out_req_o, input axi_narrow_resp_t [1:0] axi_out_resp_i, @@ -519,9 +523,13 @@ module cachepool_tile for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin for (genvar cb = 0; cb < NumL1CtrlTile; cb++) begin - assign cache_req [j][cb] = unmerge_req [cb*NrTCDMPortsPerCore+j]; - assign cache_pready[j][cb] = unmerge_pready[cb*NrTCDMPortsPerCore+j]; - assign unmerge_rsp [cb*NrTCDMPortsPerCore+j] = cache_rsp [j][cb]; + always_comb begin + cache_req [j][cb] = unmerge_req [cb*NrTCDMPortsPerCore+j]; + cache_req [j][cb].q.user.tile_id = tile_id_i; + cache_pready[j][cb] = unmerge_pready[cb*NrTCDMPortsPerCore+j]; + unmerge_rsp [cb*NrTCDMPortsPerCore+j] = cache_rsp [j][cb]; + end + end // for (genvar rt = 0; rt < NumRemotePortTile; rt++) begin @@ -549,9 +557,11 @@ module cachepool_tile tcdm_cache_interco #( .NumTiles (NumTiles ), .NumCores (NrCores ), - .NumCache (NumL1CtrlTile ), + .NumCache (NumL1CtrlTile ), + .NumTotCache (NumL1CacheCtrl ), .NumRemotePort (NumRemotePortTile ), .AddrWidth (TCDMAddrWidth ), + .TileIDWidth (TileIDWidth ), .tcdm_req_t (tcdm_req_t ), .tcdm_rsp_t (tcdm_rsp_t ), .tcdm_req_chan_t (tcdm_req_chan_t ), @@ -559,11 +569,12 @@ module cachepool_tile ) i_cache_xbar ( .clk_i (clk_i ), .rst_ni (rst_ni ), - .tile_id_i (1'b0 ), + .tile_id_i (tile_id_i ), .dynamic_offset_i (dynamic_offset ), .core_req_i ({remote_req_i[j], cache_req [j]}), .core_rsp_ready_i ({1'b1, cache_pready [j]}), .core_rsp_o ({remote_rsp_o[j], cache_rsp [j]}), + .tile_sel_o (remote_req_dst_o[j] ), .mem_req_o ({remote_req_o[j], cache_xbar_req [j]}), .mem_rsp_ready_o ({remote_pready[j],cache_xbar_pready[j]}), .mem_rsp_i ({remote_rsp_i[j], cache_xbar_rsp [j]}) @@ -662,7 +673,7 @@ module cachepool_tile end // For address scrambling - localparam NumSelBits = $clog2(NumL1CtrlTile); + localparam NumSelBits = $clog2(NumL1CacheCtrl); localparam NumWordPerLine = L1LineWidth / DataWidth; localparam int unsigned WordBytes = DataWidth / 8; initial begin @@ -763,6 +774,8 @@ module cachepool_tile .tcdm_data_bank_gnt_i (l1_data_bank_gnt [cb] ) ); + logic [$clog2(NumL1CacheCtrl)-1:0] tot_bank_id; + always_comb begin : bank_addr_scramble // TODO: use info and cb to calculate ID correctly cache_refill_req_o[cb].q = '{ @@ -802,8 +815,12 @@ module cachepool_tile // Shift the upper part to its location cache_refill_req_o[cb].q.addr |= ((cache_refill_req[cb].addr & bitmask_up) << NumSelBits); // Add back the removed cache bank ID - cache_refill_req_o[cb].q.addr |= (cb << dynamic_offset); - + // tid + cb => recover the full address + tot_bank_id = cb; + if (NumL1CacheCtrl > NumL1CtrlTile) begin + tot_bank_id[$clog2(NumL1CtrlTile)+:TileIDWidth] = tile_id_i; + end + cache_refill_req_o[cb].q.addr |= (tot_bank_id << dynamic_offset); end for (genvar j = 0; j < NumTagBankPerCtrl; j++) begin @@ -1101,7 +1118,6 @@ module cachepool_tile .AxiUserWidth (NarrowUserWidth ), .UserWidth ($bits(tcdm_user_t) ), .ID ( 1 ), - // .WriteRspEn ( 1'b0 ), .reqrsp_req_t (reqrsp_req_t ), .reqrsp_rsp_t (reqrsp_rsp_t ), .axi_req_t (axi_mst_req_t ), diff --git a/hardware/src/tcdm_cache_interco.sv b/hardware/src/tcdm_cache_interco.sv index 6b3629b..04364ed 100644 --- a/hardware/src/tcdm_cache_interco.sv +++ b/hardware/src/tcdm_cache_interco.sv @@ -15,6 +15,8 @@ module tcdm_cache_interco #( parameter int unsigned NumRemotePort = 32'd0, /// Number of outputs from the interconnect (Cache per Tile) (`> 0`). parameter int unsigned NumCache = 32'd0, + /// Number of total cache (used for address scramble). + parameter int unsigned NumTotCache = 32'd0, /// Offset bits based on cacheline: 512b => 6 bits parameter int unsigned AddrWidth = 32'd32, /// Tile ID Width, used for checking tile id ('> 0') @@ -49,6 +51,8 @@ module tcdm_cache_interco #( /// Resposne port. output tcdm_rsp_t [NumCores+NumRemotePort-1:0] core_rsp_o, /// Memory Side + /// Which remote tile visiting? + output tile_id_t [NumRemotePort-1:0] tile_sel_o, /// Request. output tcdm_req_t [NumCache+NumRemotePort-1:0] mem_req_o, /// Response ready out @@ -77,8 +81,6 @@ module tcdm_cache_interco #( // core select which cache bank to go core_sel_t [NumCores+NumRemotePort-1 :0] core_req_sel; mem_sel_t [NumCache+NumRemotePort-1 :0] mem_rsp_sel; - // tile id bits (is the destination outside of current tile?) - tile_id_t [NumCores+NumRemotePort-1 :0] bank_sel; // Select if local or remote logic [NumCores+NumRemotePort-1 :0] local_sel; @@ -147,14 +149,20 @@ module tcdm_cache_interco #( // Determine which bank is targeting at core_req_sel[port] = local_sel[port] ? - core_req[port].addr[dynamic_offset_i+:CacheBankBits] : (1'b1 << NumOutSelBits); + core_req[port].addr[dynamic_offset_i+:CacheBankBits] : NumCache; end end // forward response to the sender core // TODO: Add remote identifier bits here for (genvar port = 0; port < NumCache+NumRemotePort; port++) begin : gen_rsp_sel - assign mem_rsp_sel[port] = mem_rsp[port].user.core_id; + always_comb begin + mem_rsp_sel[port] = mem_rsp[port].user.core_id; + if (mem_rsp[port].user.tile_id != tile_id_i) begin + // go to the remote interco + mem_rsp_sel[port] = NumCores; + end + end end @@ -205,9 +213,8 @@ module tcdm_cache_interco #( logic [AddrWidth-1:0] bitmask_up, bitmask_lo; // These are the address we will keep from original assign bitmask_lo = (1 << dynamic_offset_i) - 1; - // We will keep AddrWidth - Offset - log2(CacheBanks) bits in the upper half, and remove the NumOutSelBits bits - assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - $clog2(NumCache))) - 1) << dynamic_offset_i; - + // We will keep AddrWidth - Offset - log2(TotCacheBanks) bits in the upper half, and remove the NumOutSelBits bits + assign bitmask_up = ((1 << (AddrWidth - dynamic_offset_i - $clog2(NumTotCache))) - 1) << dynamic_offset_i; for (genvar port = 0; port < NumCache + NumRemotePort; port++) begin : gen_cache_io always_comb begin @@ -217,10 +224,14 @@ module tcdm_cache_interco #( default: '0 }; - // remove the middle bits - mem_req_o[port].q.addr = (mem_req[port].addr & bitmask_lo) | - ((mem_req[port].addr >> $clog2(NumCache)) & bitmask_up); - + if (port < NumCache) begin + // Only scramble address for request going to local banks + // remove the middle bits + mem_req_o[port].q.addr = (mem_req[port].addr & bitmask_lo) | + ((mem_req[port].addr >> $clog2(NumTotCache)) & bitmask_up); + end else begin + tile_sel_o[port-NumCache] = mem_req[port].addr[(dynamic_offset_i+CacheBankBits)+:TileIDWidth]; + end end assign mem_rsp[port] = mem_rsp_i[port].p; diff --git a/sim/scripts/vsim_wave.tcl b/sim/scripts/vsim_wave.tcl index 104144f..b469857 100644 --- a/sim/scripts/vsim_wave.tcl +++ b/sim/scripts/vsim_wave.tcl @@ -15,7 +15,8 @@ add wave /tb_cachepool/cluster_probe do sim/scripts/vsim_cluster.tcl ${cluster_path} # Group -add wave -noupdate -group Group ${group_path}/* +# add wave -noupdate -group Group ${group_path}/* +do sim/scripts/vsim_group.tcl ${group_path} 5 # Tile and Core for {set tile 0} {$tile < 2} {incr tile} { From 4df578b479cdc21369aa2ac54c18224e97f5e51e Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Tue, 13 Jan 2026 14:22:08 +0100 Subject: [PATCH 21/23] [SRC] Fix several warnings in simulation. --- hardware/src/cachepool_cluster.sv | 6 ++++-- hardware/src/cachepool_pkg.sv | 2 +- hardware/src/cachepool_tile.sv | 16 +++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index db2155c..5e94c94 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -758,8 +758,10 @@ module cachepool_cluster // TODO: Mux for uart assign axi_narrow_req_o = axi_out_req[0][ClusterUart]; assign axi_out_resp[0][ClusterUart] = axi_narrow_resp_i; - // Tie off tile 1 for now - assign axi_out_resp[1][ClusterUart] = '0; + // Tie off other tiles for now + for (genvar tile = 1; tile < NumTiles; tile++) begin + assign axi_out_resp[tile][ClusterUart] = '0; + end /***** BootROM ****/ for (genvar t = 0; t < NumTiles; t++) begin : gen_bootrom diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 0474d0b..5a1b10e 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -278,7 +278,7 @@ package cachepool_pkg; ////////////////// // TILE TYPES // ////////////////// - typedef logic [$clog2(NumTiles)-1:0] remote_tile_sel_t; + typedef logic [TileIDWidth-1:0] remote_tile_sel_t; // Naming the port for easier connection typedef enum integer { diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index e769886..5551ed4 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -140,7 +140,7 @@ module cachepool_tile /// it. This signal is pseudo-static. input logic [AxiAddrWidth-1:0] cluster_base_addr_i, /// Tile ID, internal ID, the base is always 0, in theory should not change during use - input logic [TileIDWidth-1:0] tile_id_i, + input remote_tile_sel_t tile_id_i, /// AXI Narrow out-port (UART/Peripheral) output axi_narrow_req_t [1:0] axi_out_req_o, input axi_narrow_resp_t [1:0] axi_out_resp_i, @@ -775,6 +775,13 @@ module cachepool_tile ); logic [$clog2(NumL1CacheCtrl)-1:0] tot_bank_id; + // Add back the removed cache bank ID + // tid + cb => recover the full address + assign tot_bank_id[$clog2(NumL1CtrlTile)-1:0] = cb; + if (NumL1CacheCtrl > NumL1CtrlTile) begin + assign tot_bank_id[$clog2(NumL1CtrlTile)+:TileIDWidth] = tile_id_i; + end + always_comb begin : bank_addr_scramble // TODO: use info and cb to calculate ID correctly @@ -814,12 +821,7 @@ module cachepool_tile cache_refill_req_o[cb].q.addr = cache_refill_req[cb].addr & bitmask_lo; // Shift the upper part to its location cache_refill_req_o[cb].q.addr |= ((cache_refill_req[cb].addr & bitmask_up) << NumSelBits); - // Add back the removed cache bank ID - // tid + cb => recover the full address - tot_bank_id = cb; - if (NumL1CacheCtrl > NumL1CtrlTile) begin - tot_bank_id[$clog2(NumL1CtrlTile)+:TileIDWidth] = tile_id_i; - end + cache_refill_req_o[cb].q.addr |= (tot_bank_id << dynamic_offset); end From 534f89a1ede4856bf8241a3a73c09bd2ee823c23 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Thu, 15 Jan 2026 10:29:45 +0100 Subject: [PATCH 22/23] [SRC] Fix a comb loop in multi-tile configuration. --- hardware/src/cachepool_group.sv | 12 ++++-- hardware/src/cachepool_tile.sv | 21 ++++++---- hardware/src/reqrsp_xbar.sv | 45 ++++++++++++++------- software/tests/CMakeLists.txt | 4 +- software/tests/fdotp-32b/data/data_1024.h | 26 ------------ software/tests/fdotp-32b/data/data_32768.h | 3 +- software/tests/fdotp-32b/data/data_65536.h | 3 +- software/tests/fdotp-32b/data/data_8192.h | 3 +- software/tests/fdotp-32b/script/gen_data.py | 3 +- software/tests/idotp-32b/data/data_1024.h | 18 --------- software/tests/idotp-32b/data/data_32768.h | 8 ++-- software/tests/idotp-32b/data/data_8192.h | 18 +++++++++ software/tests/idotp-32b/main.c | 12 +++++- software/tests/idotp-32b/script/gen_data.py | 4 +- software/tests/spin-lock/main.c | 7 +++- 15 files changed, 102 insertions(+), 85 deletions(-) delete mode 100644 software/tests/fdotp-32b/data/data_1024.h delete mode 100644 software/tests/idotp-32b/data/data_1024.h create mode 100644 software/tests/idotp-32b/data/data_8192.h diff --git a/hardware/src/cachepool_group.sv b/hardware/src/cachepool_group.sv index 74e8bfe..3f8974e 100644 --- a/hardware/src/cachepool_group.sv +++ b/hardware/src/cachepool_group.sv @@ -226,6 +226,7 @@ module cachepool_group // In/Out relative to the tile (out--leave a tile; in--enter a tile) tcdm_req_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_out_req; tcdm_rsp_t [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_out_rsp; + logic [NumTiles-1:0][NrTCDMPortsPerCore-1:0] tile_remote_in_ready, tile_remote_out_ready; tcdm_req_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_req_chan; logic [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_req_valid, tile_remote_out_req_ready; tcdm_rsp_chan_t [NrTCDMPortsPerCore-1:0][NumTiles-1:0] tile_remote_out_rsp_chan; @@ -246,9 +247,9 @@ module cachepool_group for (genvar p = 0; p < NrTCDMPortsPerCore; p++) begin assign tile_remote_out_req_chan [p][t] = tile_remote_out_req[t][p].q; assign tile_remote_out_req_valid[p][t] = tile_remote_out_req[t][p].q_valid; - // No p ready - assign tile_remote_out_rsp_ready[p][t] = 1'b1; - // assign tile_remote_out_rsp_ready[p][t] = tile_remote_out_req[t][p].p_ready; + + // assign tile_remote_out_rsp_ready[p][t] = 1'b1; + assign tile_remote_out_rsp_ready[p][t] = tile_remote_in_ready[t][p]; assign tile_remote_out_rsp[t][p].p = tile_remote_out_rsp_chan [p][t]; assign tile_remote_out_rsp[t][p].p_valid = tile_remote_out_rsp_valid[p][t]; @@ -257,7 +258,7 @@ module cachepool_group assign tile_remote_in_req[t][p].q = tile_remote_in_req_chan [p][t]; assign tile_remote_in_req[t][p].q_valid = tile_remote_in_req_valid[p][t]; - // assign tile_remote_in_req[t][p].p_ready = tile_remote_in_rsp_ready[p][t]; + assign tile_remote_out_ready[t][p] = tile_remote_in_rsp_ready[p][t]; assign tile_remote_in_rsp_chan [p][t] = tile_remote_in_rsp[t][p].p; assign tile_remote_in_rsp_valid[p][t] = tile_remote_in_rsp[t][p].p_valid; @@ -333,8 +334,10 @@ module cachepool_group .remote_req_o ( tile_remote_out_req[t] ), .remote_req_dst_o ( remote_out_sel_tile[t] ), .remote_rsp_i ( tile_remote_out_rsp[t] ), + .remote_rsp_ready_i ( tile_remote_out_ready[t] ), .remote_req_i ( tile_remote_in_req [t] ), .remote_rsp_o ( tile_remote_in_rsp [t] ), + .remote_rsp_ready_o ( tile_remote_in_ready[t] ), // Cache Refill Ports .cache_refill_req_o ( cache_refill_req_o[t*NumL1CtrlTile+:NumL1CtrlTile] ), .cache_refill_rsp_i ( cache_refill_rsp_i[t*NumL1CtrlTile+:NumL1CtrlTile] ), @@ -364,6 +367,7 @@ module cachepool_group .NumInp (NumTiles ), .NumOut (NumTiles ), .PipeReg (1'b1 ), + .RspReg (1'b1 ), .ExtReqPrio (1'b0 ), .ExtRspPrio (1'b0 ), .tcdm_req_chan_t (tcdm_req_chan_t ), diff --git a/hardware/src/cachepool_tile.sv b/hardware/src/cachepool_tile.sv index 5551ed4..841b5ff 100644 --- a/hardware/src/cachepool_tile.sv +++ b/hardware/src/cachepool_tile.sv @@ -154,9 +154,11 @@ module cachepool_tile output tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_o, output remote_tile_sel_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_dst_o, input tcdm_rsp_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_i, + input logic [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_ready_i, /// Remote Tile access ports (from remote tiles) input tcdm_req_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_req_i, output tcdm_rsp_t [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_o, + output logic [NrTCDMPortsPerCore*NumRemotePortTile-1:0] remote_rsp_ready_o, /// Peripheral signals output icache_events_t [NrCores-1:0] icache_events_o, input logic icache_prefetch_enable_i, @@ -550,7 +552,10 @@ module cachepool_tile logic [$clog2(TCDMAddrWidth)-1:0] dynamic_offset; assign dynamic_offset = dynamic_offset_i; - logic [NrTCDMPortsPerCore-1:0] remote_pready; + // todo: multiple remote ports + logic [NrTCDMPortsPerCore-1:0] remote_out_pready, remote_in_pready; + assign remote_rsp_ready_o = remote_out_pready; + assign remote_in_pready = remote_rsp_ready_i; /// Wire requests after strb handling to the cache controller for (genvar j = 0; j < NrTCDMPortsPerCore; j++) begin : gen_cache_xbar @@ -571,13 +576,13 @@ module cachepool_tile .rst_ni (rst_ni ), .tile_id_i (tile_id_i ), .dynamic_offset_i (dynamic_offset ), - .core_req_i ({remote_req_i[j], cache_req [j]}), - .core_rsp_ready_i ({1'b1, cache_pready [j]}), - .core_rsp_o ({remote_rsp_o[j], cache_rsp [j]}), - .tile_sel_o (remote_req_dst_o[j] ), - .mem_req_o ({remote_req_o[j], cache_xbar_req [j]}), - .mem_rsp_ready_o ({remote_pready[j],cache_xbar_pready[j]}), - .mem_rsp_i ({remote_rsp_i[j], cache_xbar_rsp [j]}) + .core_req_i ({remote_req_i[j], cache_req [j]}), + .core_rsp_ready_i ({remote_in_pready[j], cache_pready [j]}), + .core_rsp_o ({remote_rsp_o[j], cache_rsp [j]}), + .tile_sel_o (remote_req_dst_o[j] ), + .mem_req_o ({remote_req_o[j], cache_xbar_req [j]}), + .mem_rsp_ready_o ({remote_out_pready[j], cache_xbar_pready[j]}), + .mem_rsp_i ({remote_rsp_i[j], cache_xbar_rsp [j]}) ); end diff --git a/hardware/src/reqrsp_xbar.sv b/hardware/src/reqrsp_xbar.sv index 88cc837..28cb4dc 100644 --- a/hardware/src/reqrsp_xbar.sv +++ b/hardware/src/reqrsp_xbar.sv @@ -13,6 +13,8 @@ module reqrsp_xbar #( parameter int unsigned NumOut = 32'd0, /// Generate Register parameter int unsigned PipeReg = 1'b1, + /// Rsp path Register + parameter int unsigned RspReg = 1'b0, /// Do we need to provide external priority for Xbar? parameter int unsigned ExtReqPrio = 1'b0, parameter int unsigned ExtRspPrio = 1'b0, @@ -174,20 +176,35 @@ module reqrsp_xbar #( assign core_req[port] = postreg_data.payload; assign slv_sel[port] = postreg_data.select; - fall_through_register #( - .T (tcdm_rsp_chan_t ) - ) i_tcdm_rsp_reg ( - .clk_i (clk_i ), - .rst_ni (rst_ni ), - .clr_i (1'b0 ), - .testmode_i(1'b0 ), - .data_i (core_rsp[port] ), - .valid_i (core_rsp_valid[port] ), - .ready_o (core_rsp_ready[port] ), - .data_o (slv_rsp_o[port] ), - .valid_o (slv_rsp_valid_o[port] ), - .ready_i (slv_rsp_ready_i[port] ) - ); + if (RspReg) begin : gen_rsp_reg + spill_register #( + .T (tcdm_rsp_chan_t ) + ) i_tcdm_rsp_reg ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .data_i (core_rsp[port] ), + .valid_i (core_rsp_valid[port] ), + .ready_o (core_rsp_ready[port] ), + .data_o (slv_rsp_o[port] ), + .valid_o (slv_rsp_valid_o[port] ), + .ready_i (slv_rsp_ready_i[port] ) + ); + end else begin : gen_rsp_bypass + fall_through_register #( + .T (tcdm_rsp_chan_t ) + ) i_tcdm_rsp_reg ( + .clk_i (clk_i ), + .rst_ni (rst_ni ), + .clr_i (1'b0 ), + .testmode_i(1'b0 ), + .data_i (core_rsp[port] ), + .valid_i (core_rsp_valid[port] ), + .ready_o (core_rsp_ready[port] ), + .data_o (slv_rsp_o[port] ), + .valid_o (slv_rsp_valid_o[port] ), + .ready_i (slv_rsp_ready_i[port] ) + ); + end end else begin : bypass_reg assign core_req[port] = slv_req_i[port]; assign core_req_valid[port] = slv_req_valid_i[port]; diff --git a/software/tests/CMakeLists.txt b/software/tests/CMakeLists.txt index 54013c8..b83498f 100644 --- a/software/tests/CMakeLists.txt +++ b/software/tests/CMakeLists.txt @@ -96,9 +96,9 @@ add_spatz_test_threeParam(multi_producer_single_consumer_double_linked_list mult ## Vector ### Floating-Point -add_spatz_test_oneParam(fdotp-32b fdotp-32b/main.c 1024) add_spatz_test_oneParam(fdotp-32b fdotp-32b/main.c 8192) add_spatz_test_oneParam(fdotp-32b fdotp-32b/main.c 32768) +add_spatz_test_oneParam(fdotp-32b fdotp-32b/main.c 65536) add_spatz_test_threeParam(gemv-col gemv-col/main.c 128 128 32) add_spatz_test_threeParam(gemv-col gemv-col/main.c 256 128 32) @@ -109,7 +109,7 @@ add_spatz_test_threeParam(fmatmul-32b fmatmul-32b/main.c 64 64 64) add_spatz_test_threeParam(fmatmul-32b fmatmul-32b/main.c 128 128 128) ### Integer-Point -add_spatz_test_oneParam(idotp-32b idotp-32b/main.c 1024) +add_spatz_test_oneParam(idotp-32b idotp-32b/main.c 8192) add_spatz_test_oneParam(idotp-32b idotp-32b/main.c 32768) diff --git a/software/tests/fdotp-32b/data/data_1024.h b/software/tests/fdotp-32b/data/data_1024.h deleted file mode 100644 index 3d8c9a8..0000000 --- a/software/tests/fdotp-32b/data/data_1024.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2023 ETH Zurich and University of Bologna. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 - -// This file was generated automatically. - -#include "layer.h" - -dotp_layer dotp_l __attribute__((section(".pdcp_src"))) = { - .M = 1024, - .dtype = FP32, -}; - - -static float dotp_A_dram [1024] __attribute__((section(".data"))) = {1.9269152879714966, 1.4872840642929077, 0.9007171988487244, -2.1055209636688232, 0.6784184575080872, -1.2345448732376099, -0.04306747764348984, -1.6046669483184814, -0.7521352767944336, 1.6487230062484741, -0.3924786448478699, -1.4036071300506592, -0.7278813123703003, -0.5594301819801331, -0.7688388824462891, 0.7624453902244568, 1.6423169374465942, -0.1595974713563919, -0.4973975419998169, 0.439589262008667, -0.7581311464309692, 1.078317642211914, 0.8008005619049072, 1.680620551109314, 1.27912437915802, 1.2964228391647339, 0.610466480255127, 1.334737777709961, -0.2316243201494217, 0.041759490966796875, -0.2515752911567688, 0.859858512878418, -1.3846737146377563, -0.8712361454963684, -0.223365917801857, 1.7173614501953125, 0.3188803195953369, -0.42451897263526917, 0.3057209253311157, -0.7745925188064575, -1.5575724840164185, 0.9956361055374146, -0.8797858357429504, -0.6011420488357544, -1.2741512060165405, 2.1227850914001465, -1.234653115272522, -0.4879138767719269, -0.9138230085372925, -0.6581372618675232, 0.07802387326955795, 0.5258087515830994, -0.48799172043800354, 1.1913690567016602, -0.8140076398849487, -0.7359927892684937, -1.4032478332519531, 0.03600366786122322, -0.06347727030515671, 0.6756148934364319, -0.0978068932890892, 1.8445940017700195, -1.184537410736084, 1.3835493326187134, 1.4451338052749634, 0.8564125299453735, 2.218075752258301, 0.5231655240058899, 0.34664666652679443, -0.19733144342899323, -1.0545889139175415, 1.2779955863952637, -0.1721901297569275, 0.5237884521484375, 0.056621819734573364, 0.4262961447238922, 0.575005054473877, -0.6417241096496582, -2.2063984870910645, -0.7508030533790588, 0.01086814422160387, -0.33874234557151794, -1.3406795263290405, -0.5853705406188965, 0.5361881256103516, 0.5246226191520691, 1.1412016153335571, 0.05164359509944916, 0.7439519762992859, -0.4815843999385834, -1.0494661331176758, 0.603898823261261, -1.7222950458526611, -0.827768862247467, 1.334702968597412, 0.48353928327560425, -2.5095443725585938, 0.4880010485649109, 0.7845868468284607, 0.02864718623459339, 0.640755295753479, 0.5832474231719971, 1.0669267177581787, -0.4501533806324005, -0.18526747822761536, 0.7527588605880737, 0.4047577977180481, 0.17846599221229553, 0.2649095058441162, 1.2731683254241943, -0.0013108636485412717, -0.30360376834869385, -1.457029104232788, -0.10233523696660995, -0.5991530418395996, 0.4770564138889313, 0.7261772155761719, 0.09115186333656311, -0.3890652060508728, 0.5279164910316467, -0.012685478664934635, 0.24083632230758667, 0.13253536820411682, 0.7642406225204468, 1.095009684562683, 0.3398909568786621, 0.7199674844741821, 0.41140761971473694, 1.931160569190979, 1.0118638277053833, -1.4364064931869507, -1.1298598051071167, -0.1360345333814621, 1.6354095935821533, 0.6547407507896423, 0.5760045647621155, 1.1415079832077026, 0.018564576283097267, -1.8058050870895386, 0.9254348874092102, -0.3753443658351898, 1.0330873727798462, -0.6866509318351746, 0.6368136405944824, -0.9726738929748535, 0.9584577679634094, 1.6192004680633545, 1.450609803199768, 0.2694815397262573, -0.21037597954273224, -0.7328027486801147, 0.10429783165454865, 0.3487516939640045, 0.9675941467285156, -0.46568843722343445, 1.6047972440719604, -2.4801201820373535, -0.4175437390804291, -1.1954537630081177, 0.8123369216918945, -1.9005532264709473, 0.22857652604579926, 0.02485940419137478, -0.34595024585723877, 0.2868328094482422, -0.7308424115180969, 0.17482025921344757, -1.0939292907714844, -1.6021603345870972, 1.3528969287872314, 1.288827657699585, 0.05229547247290611, -1.5468504428863525, 0.7567060589790344, 0.7755194902420044, 2.0265355110168457, 0.03581761196255684, 0.12058872729539871, -0.8056637048721313, -0.20757682621479034, -0.9319478273391724, -1.5909662246704102, -1.13597571849823, -0.52259761095047, -0.5187733173370361, -1.5012763738632202, -1.9266542196273804, 0.1278512328863144, 1.0229133367538452, -0.5557951331138611, 0.7042727470397949, 0.7098760008811951, 1.7743884325027466, -0.921550989151001, 0.9624499082565308, -0.33701515197753906, -1.1753336191177368, 0.35805708169937134, 0.47876790165901184, 1.353700041770935, 0.5260620713233948, 2.1120378971099854, -0.5207571387290955, -0.9320061206817627, 0.18516133725643158, 1.0686918497085571, 1.3065344095230103, 0.4598345160484314, -0.8146268725395203, -1.0212392807006836, -0.49492356181144714, -0.5922516584396362, 0.15431594848632812, 0.4407670795917511, -0.14829230308532715, -2.3184432983398438, -0.39799532294273376, 1.0804862976074219, -1.7808643579483032, 1.5080454349517822, 0.30942854285240173, -0.5003090500831604, 1.0350031852722168, 1.6896470785140991, -0.004505051765590906, 1.666792392730713, 0.15392017364501953, -1.0602530241012573, -0.572657585144043, 0.0835680365562439, 0.39990535378456116, 1.989207148551941, -0.07198750972747803, -0.906094491481781, -2.0487122535705566, -1.0810555219650269, 0.01762307994067669, 0.0782259851694107, 0.19315829873085022, 0.40967342257499695, -0.9291303157806396, 0.2761908769607544, -0.5388752818107605, 0.4625823199748993, -0.8718891143798828, -0.027118360623717308, -0.3532457649707794, 1.4638569355010986, 1.255434274673462, -0.7149558067321777, 0.8539193272590637, 0.512991189956665, 0.5397310256958008, 0.5655050277709961, 0.5057917237281799, 0.22245365381240845, -0.685481607913971, 0.5635589957237244, -1.507175087928772, -1.610666036605835, -1.4790465831756592, 0.4322742819786072, -0.1250254064798355, 0.7821183800697327, -1.598767638206482, -0.10912995040416718, 0.7151994705200195, 0.03913922235369682, 1.305860161781311, 0.24659274518489838, -1.9775909185409546, 0.01789604313671589, -1.3793021440505981, 0.625802755355835, -2.5849502086639404, -0.02399955503642559, -0.1221928745508194, -0.7469954490661621, 1.7093087434768677, 0.05792269483208656, 1.1929805278778076, 1.9372931718826294, 0.7287133932113647, 0.9808937907218933, 0.41459226608276367, 1.15656316280365, 0.2690545618534088, -0.036629438400268555, 0.9732939004898071, -1.0150787830352783, -0.5419175624847412, -0.44102486968040466, -0.3136177957057953, -0.12925422191619873, -0.7149624228477478, -0.047562163323163986, 2.0207436084747314, 0.25391900539398193, 0.9364385008811951, 0.7122363448143005, -0.031765542924404144, 0.10164086520671844, 1.3433040380477905, 0.7132695913314819, 0.4038029611110687, -0.7139783501625061, 0.8337291479110718, -0.9585452079772949, 0.45363426208496094, 1.2460919618606567, -2.3065085411071777, -1.2868918180465698, 0.17988650500774384, -2.126762628555298, -0.13408313691616058, -1.0407685041427612, -0.7647228837013245, -0.05528254434466362, 1.204850673675537, -0.982473611831665, 0.4334380030632019, -0.7171905636787415, 1.055369257926941, -1.4533969163894653, 0.46515071392059326, 0.37139150500297546, -0.004656785633414984, 0.07954943925142288, 0.3781784772872925, 0.7051141262054443, -1.7236974239349365, -0.8434810638427734, 0.4351435601711273, 0.26588720083236694, -0.5870985388755798, 0.0826888456940651, 0.8853808045387268, 0.1824439913034439, 0.7863810062408447, -0.057920295745134354, 0.5666652917861938, -0.7097623348236084, -0.4875054359436035, 0.050095997750759125, 0.6084084510803223, 1.6308681964874268, -0.08472306281328201, 1.0844124555587769, 0.9477656483650208, -0.676629364490509, -0.5730168223381042, -0.3303174376487732, -0.7939430475234985, 0.3752319812774658, 0.08790969103574753, -1.241483449935913, -0.32025346159935, -0.844377875328064, -0.5513465404510498, 1.9889612197875977, 1.900311827659607, 1.6950805187225342, 0.028089528903365135, -0.17536965012550354, -1.7734959125518799, -0.7046414017677307, -0.39465200901031494, 1.8868111371994019, -0.21844321489334106, 0.16629981994628906, 2.1441681385040283, 1.7045671939849854, 0.3459012508392334, 0.6424751281738281, -0.20395424962043762, 0.6853673458099365, -0.13968797028064728, -1.1807502508163452, -1.282929539680481, 0.448485791683197, -0.590737521648407, 0.8540631532669067, -0.4900680184364319, -0.35945725440979004, 0.6663737893104553, -0.07426456362009048, -0.20960482954978943, 0.16632132232189178, 1.4703037738800049, -0.9390866756439209, -0.6013189554214478, -0.09964022785425186, -0.9851518273353577, -2.488459348678589, -0.33131900429725647, 0.8435799479484558, 0.9874473810195923, -0.33197471499443054, -0.8076189756393433, 0.824364185333252, 0.024699924513697624, -1.0641486644744873, -0.7601934671401978, -0.4075061082839966, 0.9623646140098572, -0.14264194667339325, 0.15271379053592682, -0.0388023778796196, 0.9446058869361877, -1.5824053287506104, 0.9871290922164917, 1.1456739902496338, -0.14181147515773773, -0.2763414680957794, -0.19321373105049133, 0.7767809629440308, 0.6838752627372742, -1.3245893716812134, -0.5160817503929138, 0.6001842617988586, -0.4702208340167999, -0.6086435317993164, -0.046192023903131485, -1.6457397937774658, -0.4833274185657501, -0.740294337272644, 0.31428107619285583, 0.1415553092956543, 1.0348176956176758, -0.626437783241272, -0.5150922536849976, 0.6902899742126465, -0.4939993619918823, 1.1366126537322998, -0.46184006333351135, 1.419979453086853, 0.848518967628479, -0.047891248017549515, 0.6685602068901062, 1.0429801940917969, 0.6899017095565796, -1.3129348754882812, 0.03780364990234375, -1.1702114343643188, -0.10318559408187866, 1.1894739866256714, 0.7606944441795349, -0.7463049292564392, -1.3838845491409302, 0.4868715703487396, -1.0020296573638916, 0.0329488180577755, -0.42919591069221497, -0.9817978739738464, -0.6420586109161377, 0.8265887498855591, 1.591395616531372, -0.1208132952451706, -0.48302069306373596, 0.11329790204763412, 0.0771508663892746, -0.9228128790855408, -1.2619991302490234, 1.0860532522201538, 1.096641182899475, -0.6836934685707092, 0.06604336202144623, -0.0007737990817986429, 0.1620604395866394, 1.195958137512207, -1.3061535358428955, -1.4039719104766846, -1.0597201585769653, 0.3057299852371216, 0.4150581359863281, -0.7174144983291626, 2.833967924118042, 1.9534740447998047, 2.0486814975738525, -1.0880382061004639, 1.621694564819336, 0.8512656688690186, -0.40046969056129456, -0.6088271737098694, -0.508095383644104, -0.6184902191162109, -1.647040605545044, -1.0362098217010498, -0.4503057301044464, -0.0729660615324974, -0.5479549169540405, -1.1425532102584839, -0.44875210523605347, -0.03045438416302204, 0.3830311596393585, -0.04476971551775932, 1.179942011833191, -0.33142781257629395, 0.6495042443275452, 0.09495851397514343, -0.7525874376296997, -0.647229790687561, -1.2822614908218384, 1.96529221534729, -0.9638485312461853, -2.5667941570281982, 0.7096128463745117, 0.8198426961898804, 0.6214459538459778, 0.42318588495254517, -0.33889833092689514, 0.5179733633995056, -1.363769769668579, 0.1929578185081482, -0.6103342771530151, 0.16323445737361908, 1.51017165184021, 0.21230429410934448, -0.7252011299133301, -0.9527732729911804, 0.5216943025588989, -0.46386733651161194, 0.18237744271755219, -0.38666075468063354, -1.7906768321990967, 0.09329313784837723, -1.9152568578720093, -0.6421752572059631, 1.3438509702682495, -1.2922308444976807, 0.766244113445282, 0.64540034532547, 0.353316068649292, -2.6474881172180176, -1.4575366973876953, -0.9712379574775696, 0.25403109192848206, -0.1790592074394226, 1.1992844343185425, -0.4292171895503998, 1.010284185409546, 0.6110401153564453, 1.2208385467529297, -0.6076440215110779, -1.7376028299331665, -0.12535162270069122, -1.3658148050308228, 1.111746072769165, -0.6227966547012329, -0.7891808748245239, -0.167823925614357, 1.6433145999908447, 2.0070879459381104, -1.2531019449234009, 1.118869423866272, 1.7732776403427124, -2.071660280227661, -0.4125255346298218, -0.9769555926322937, -0.03363388776779175, 1.8594977855682373, 2.6221468448638916, 0.36905255913734436, 0.3802972435951233, 0.19898031651973724, -0.23609064519405365, 0.30340856313705444, -0.45007675886154175, 0.47390419244766235, 0.6503364443778992, 1.1662380695343018, 0.01693599671125412, 0.5325868129730225, -0.6035352349281311, -0.1742597371339798, 0.6092063784599304, -0.8032152652740479, -1.1209005117416382, 0.1956406533718109, -0.7815181016921997, -1.7898789644241333, -0.26157355308532715, -0.44025033712387085, 2.1848294734954834, -0.48009708523750305, -1.2871733903884888, 0.7388824224472046, 0.03389474004507065, -0.31229403614997864, -0.2541753351688385, -1.205536127090454, -0.9542103409767151, 0.061276569962501526, 0.08526104688644409, 0.7481252551078796, -0.16356196999549866, -0.9085567593574524, 0.3129958212375641, 0.8050477504730225, -1.1133604049682617, 0.4981626570224762, -1.1999552249908447, 0.12711313366889954, 0.4403660297393799, 0.6377718448638916, 0.15978877246379852, 1.7697970867156982, 0.6268176436424255, -1.8736529350280762, 2.3259060382843018, -0.9203909635543823, 0.6661149263381958, -0.44026491045951843, -2.3179564476013184, 1.294582724571228, 0.22267311811447144, -0.8483412265777588, 1.6489421129226685, 1.6005686521530151, -0.07858924567699432, 0.43104586005210876, 0.3683530390262604, 0.7637977004051208, 1.1792222261428833, -0.4137862026691437, 0.5184088349342346, -0.7015367746353149, -0.4323408901691437, 0.1414770483970642, 0.07110362499952316, 0.5633530616760254, -0.5786357522010803, -1.083811640739441, -0.3889259994029999, 0.8126105666160583, 1.4981187582015991, 0.043896086513996124, 1.4443233013153076, 0.23202891647815704, 0.5064983367919922, -1.2786966562271118, -0.03842746838927269, 1.9138009548187256, 0.3378446102142334, 0.12505611777305603, -0.7621514797210693, -1.190559983253479, 0.7756073474884033, 0.455719918012619, 0.2503303289413452, -1.3610970973968506, 1.8018341064453125, -0.07434194535017014, -0.15664155781269073, -0.8708454966545105, -0.6410972476005554, -0.414562851190567, -0.6902380585670471, -0.22995619475841522, -2.172283887863159, 0.08768323808908463, 1.0937845706939697, -0.1177205815911293, -0.29864323139190674, -0.9536206126213074, -0.09247277677059174, -1.01665461063385, -0.007675689645111561, -0.518220841884613, 0.83954256772995, 0.05852266773581505, -1.6682480573654175, 2.129624843597412, -1.5181471109390259, 0.1387282907962799, -1.1797568798065186, -0.5297411680221558, 0.9625157713890076, 0.2794382870197296, -0.5718191266059875, -2.7936289310455322, -0.7111545205116272, 0.5235219597816467, -1.71055006980896, 0.8384853601455688, -0.2698453664779663, 0.12306158244609833, 0.8757511377334595, 0.15132997930049896, 0.739393413066864, 0.27310314774513245, 2.7312309741973877, 0.43200522661209106, -0.30918216705322266, -0.09658124297857285, 1.541925072669983, -0.108744777739048, -0.4189043343067169, 1.4384385347366333, -0.7068426609039307, -1.2519514560699463, 3.0250484943389893, 1.3462589979171753, 0.8556069731712341, 0.3220294117927551, 0.44605663418769836, 1.5229592323303223, 1.2804899215698242, -0.11616043001413345, 1.3705363273620605, -0.4809381365776062, -0.9903622269630432, -1.3641812801361084, 0.008205652236938477, -0.40586018562316895, -0.7110859751701355, -0.3495793640613556, 0.3797488212585449, 0.9993040561676025, 1.2751853466033936, 0.9594927430152893, 0.10350999981164932, 0.8290349841117859, 2.0921294689178467, 0.7953095436096191, 0.2792847752571106, 0.1864478439092636, 0.3547132909297943, 0.09063850343227386, 1.7422553300857544, -1.2660012245178223, 0.38916081190109253, 0.34287506341934204, -1.4590637683868408, -1.4936561584472656, -0.22138521075248718, 0.22523505985736847, -0.07724537700414658, 0.9856945276260376, 1.2783364057540894, 0.28815189003944397, 0.869049608707428, -0.8097057938575745, -1.4298604726791382, 0.45901596546173096, 0.5309328436851501, -1.3614802360534668, 1.9562491178512573, 1.7684898376464844, -0.9857985377311707, -1.2370758056640625, -2.301875114440918, -0.0010087001137435436, -0.8494256734848022, -1.6593921184539795, 0.3062905967235565, 1.182044506072998, 0.32602694630622864, -0.3894469738006592, 2.8543806076049805, 0.8243650794029236, 0.7983470559120178, 1.8890222311019897, 0.5934628248214722, 0.0696544423699379, -1.6034338474273682, -0.42982181906700134, 0.5761587619781494, 0.34436315298080444, -3.1016058921813965, -1.4587225914001465, -1.4318257570266724, -0.6071268916130066, -0.25973787903785706, -0.7190185785293579, -0.38583096861839294, 0.5233525037765503, -0.8211768269538879, -0.47086891531944275, 0.6016423106193542, -0.28251126408576965, 0.7692679762840271, -0.7668924331665039, -0.9494866728782654, 0.01691739819943905, 0.08027740567922592, 0.7448412775993347, 1.345484972000122, 0.12682189047336578, -2.4520716667175293, 0.4159761369228363, 1.9025356769561768, -0.7346699833869934, 0.044657133519649506, -1.5211198329925537, 0.3478375971317291, 0.7401772737503052, 1.4161995649337769, 0.6833979487419128, -0.13825182616710663, 0.9212995171546936, 0.5282443761825562, -0.008228386752307415, -1.4493319988250732, -0.605182409286499, -0.17924511432647705, 0.19955870509147644, -1.2461947202682495, -0.41459938883781433, 1.4558700323104858, 0.3316534161567688, -1.00010085105896, -0.6919524669647217, -0.47199076414108276, -1.2894343137741089, 1.0762810707092285, -1.0667427778244019, -1.9893426895141602, 0.29731303453445435, 0.4344584047794342, 0.0033933203667402267, -1.0240145921707153, 0.22404761612415314, -0.7554785013198853, 1.3675810098648071, -0.3197358250617981, -0.9130924344062805, 1.919209361076355, -1.6514869928359985, 2.1477253437042236, -0.6604134440422058, 0.11352583765983582, -0.22056575119495392, 0.7118127346038818, 0.3415871560573578, 1.5885895490646362, -0.3488781750202179, -0.45791950821876526, -1.2322070598602295, -0.598077118396759, -0.28154700994491577, 0.05281926319003105, 0.42497751116752625, 0.4825834333896637, 0.48813387751579285, 1.0082393884658813, -0.595004141330719, 0.3926331400871277, 0.8229668736457825, -0.886031985282898, 1.4801039695739746, 0.8391514420509338, -0.20004984736442566, 0.9949536919593811, 0.7201864719390869, -0.13413065671920776, -1.4067999124526978, -2.3609628677368164, -0.2904934287071228, -0.13345853984355927, -0.15693345665931702, 1.138344645500183, -0.2505214214324951, 1.6704555749893188, -0.545271098613739, -2.15816330909729, -1.6607975959777832, -0.6637441515922546, 0.3657907545566559, -0.39920157194137573, 0.49674081802368164, -2.369169235229492, -0.5614708065986633, -0.5949130654335022, 1.2687278985977173, 1.2904434204101562, -1.1755682229995728, -0.0783226415514946, -0.9705761075019836, 1.4723693132400513, 1.4108561277389526, -1.3143675327301025, -1.31621515750885, -1.2524477243423462, -1.5844100713729858, -2.5446670055389404, 1.3719074726104736, -0.5379461050033569, 0.7378400564193726, -0.8505349159240723, 0.03610055148601532, 1.3406710624694824, 0.9199973940849304, -0.3787555396556854, -1.5597758293151855, -0.8009540438652039, -0.7111086845397949, -0.3866667151451111, 0.9578314423561096, -0.8225308656692505, -2.3908050060272217, 0.322247713804245, 1.875388741493225, 1.1042989492416382, -0.5223758816719055, -0.7401803731918335, 0.16235657036304474, -0.2369976043701172, 0.5099347233772278, 1.670624852180481, 1.5921050310134888, -0.41619211435317993, 1.861944556236267, -1.077892780303955, 0.8848565220832825, -0.8342104554176331, 1.0300744771957397, -0.8680985569953918, -0.5701602697372437, 0.32332202792167664, 1.1284750699996948, -1.2123126983642578, 2.602391004562378, -0.09572362899780273, -0.08114803582429886, 1.2586976289749146, 0.8691263794898987, -0.9609367251396179, 0.05182264745235443, -0.3284812867641449, -2.247206211090088, -0.4478967487812042, 0.4234687089920044, -0.3874586224555969, -0.22963792085647583, -0.40709349513053894, 0.8702965974807739, -1.0552809238433838, -1.3284013271331787, 0.7060741186141968, 0.35730111598968506, 0.5892837643623352, 0.9187757968902588, 0.6662830114364624, 0.24650610983371735, 0.1328691989183426, 0.12191462516784668, 0.47808775305747986, 0.2761341631412506, -0.5895728468894958, 0.569182813167572, -0.7911050319671631, -0.19896702468395233, -1.3615714311599731, -0.5193602442741394, 0.07648162543773651, 0.34005025029182434, 1.4557304382324219, -0.3461014926433563, -0.2633814215660095, -0.447700172662735, -0.7288169264793396, -0.16066236793994904, -0.32063713669776917, -0.6307737827301025, -0.788766622543335, 1.3061575889587402, -0.9275763630867004, -0.26273947954177856, 0.9314952492713928, -0.4593467116355896, -0.9419456720352173, -0.7089186310768127, 2.1860759258270264, -0.6493158936500549, 0.45214036107063293, 0.8520749807357788, -1.6946725845336914, 1.1805996894836426, -2.8929238319396973, -0.3875778615474701, -0.7124031782150269, -1.6171332597732544, -0.35899198055267334, 0.051366694271564484, 0.6950237154960632, 1.835181474685669, -1.9180361032485962, -1.3923954963684082, 0.540465772151947, 0.4350730776786804, -2.2717032432556152, -0.13386189937591553, -0.058557309210300446, 0.12574470043182373, -0.5525766611099243, 0.07448001205921173, -0.1492866724729538, -0.5522539615631104, -0.09342008084058762, -1.0284309387207031, 0.40444278717041016, 2.1425962448120117, -0.5153723955154419, 1.0827196836471558, 1.2498642206192017, 0.9821351766586304, 0.22690092027187347, 0.4927920699119568, -0.5128253102302551, 0.3006223440170288, 0.07734657824039459, 0.6477669477462769, -0.4324244260787964, 1.1740480661392212, 0.7011352777481079, 0.6674330234527588, -0.8035953640937805, -1.3776048421859741, -0.4410470724105835, 0.1417587399482727, 1.1084681749343872, 0.5544233322143555, 1.5817502737045288}; - - -static float dotp_B_dram [1024] __attribute__((section(".data"))) = {-1.2247875928878784, 0.962885856628418, -1.5785412788391113, 0.6715953946113586, -0.060151856392621994, 0.06978437304496765, -1.6634936332702637, -0.7650561332702637, 1.2306435108184814, 0.4252126216888428, -0.016383398324251175, -0.10749480873346329, -1.3085604906082153, 0.659813642501831, -0.07032525539398193, 0.27448296546936035, -0.3450125455856323, -0.11961783468723297, 1.1861584186553955, -1.2203160524368286, 0.2909986078739166, -0.07964225858449936, 1.3200364112854004, -1.5196866989135742, -0.29335519671440125, 2.106604814529419, -0.10875027626752853, 0.608341634273529, 0.7894347310066223, 0.7824702858924866, -0.06465863436460495, -0.0002302070497535169, 0.6830949187278748, 0.1063748151063919, 0.3503226041793823, 0.12109924107789993, 0.2984321117401123, 1.3447729349136353, 1.4614392518997192, 1.0566132068634033, 0.8155362606048584, -0.8240620493888855, 0.8932762742042542, -0.386881560087204, -0.35717684030532837, -1.1568186283111572, -1.7659958600997925, -2.5379507541656494, 0.09694309532642365, -0.7912065982818604, 0.37119555473327637, 1.5117958784103394, -0.8914596438407898, 0.5247467160224915, 0.3517809212207794, 0.2491273283958435, 1.1900452375411987, 1.410936951637268, 0.7980097532272339, 0.49413225054740906, -0.18495284020900726, -1.0380902290344238, -0.10130416601896286, -0.9271824359893799, 0.23484112322330475, 0.08861476927995682, -0.3476867079734802, 0.8490674495697021, 0.2014705091714859, 0.3839779198169708, 1.2309634685516357, 1.2286686897277832, 0.7042104005813599, -0.05628490820527077, -1.4897207021713257, -1.5194628238677979, 0.32580918073654175, -1.458429217338562, 1.8989076614379883, -0.04056643322110176, -0.2933650016784668, 1.397810459136963, -0.9166569709777832, -0.7793720364570618, -0.41753849387168884, 1.1059718132019043, 0.2528532147407532, -0.10754015296697617, 0.7705280780792236, -1.1304327249526978, 0.996456503868103, -1.1809622049331665, 0.9626035690307617, -1.1049346923828125, -0.7909473180770874, -0.21609316766262054, 0.0019485306693241, -0.20979070663452148, 1.2010222673416138, 0.675596296787262, -1.8900177478790283, 0.19431965053081512, 1.6020095348358154, -1.0371782779693604, -0.7486876249313354, -0.3844030499458313, 0.14350247383117676, -0.0812682956457138, 1.1261653900146484, 0.04061844199895859, -0.06464217603206635, 3.445625066757202, -1.1129159927368164, -0.4341987073421478, -0.015211731195449829, 0.5427215099334717, 0.12508316338062286, -0.8761705756187439, 1.2222594022750854, 0.32681646943092346, -0.10487240552902222, 2.476804733276367, 0.5769069790840149, 0.14730526506900787, -1.3136197328567505, -0.6061143279075623, 0.6449755430221558, -0.24771355092525482, -1.407819390296936, -0.0801108106970787, 0.5194124579429626, 1.170888900756836, 2.1779797077178955, 1.7791979312896729, 0.25832492113113403, -2.4340736865997314, -0.3497500419616699, -1.338055968284607, -0.4389103353023529, -0.5850174427032471, 1.8071491718292236, -0.7326241135597229, 0.4093967378139496, -0.5840954780578613, 0.10613418370485306, -0.3067088723182678, 0.8642276525497437, -1.0658658742904663, -1.0129939317703247, -0.9939178228378296, 2.9082677364349365, 1.4483332633972168, -0.5614521503448486, -0.9464563131332397, -0.7419731020927429, 0.15562251210212708, -0.25843867659568787, -0.7501540780067444, 1.2354754209518433, 1.0141247510910034, 1.01323664188385, 0.6346396803855896, 0.8768793344497681, 0.8142848610877991, 0.19737061858177185, -0.6367602348327637, -0.8768263459205627, -1.5509816408157349, -0.7881835699081421, 0.5684375166893005, 0.7622402906417847, 0.5568539500236511, 1.2983627319335938, 1.7561308145523071, 0.21129246056079865, 1.4860185384750366, 0.5585124492645264, 0.3491472005844116, 0.8483667373657227, 2.0354838371276855, 0.3772087097167969, 0.48434850573539734, -0.030398759990930557, 1.0925219058990479, -0.5064011812210083, -0.8441710472106934, -0.22143854200839996, 2.274590015411377, -0.783242404460907, -0.26778313517570496, 1.5684525966644287, -0.283514142036438, -0.09603477269411087, 1.0644340515136719, 1.4888246059417725, 0.8825610876083374, -0.23840203881263733, 0.5468734502792358, -0.06058019772171974, -0.5304896831512451, -2.0363707542419434, 0.5246880650520325, -0.6970252990722656, -0.08793152123689651, -0.27431318163871765, 1.2922906875610352, -1.4458993673324585, -0.31466683745384216, 0.11260014772415161, -1.4679176807403564, -1.716816782951355, -0.5502451658248901, 0.535078763961792, -1.3392163515090942, 1.2357676029205322, -2.0370566844940186, 1.4171453714370728, 0.1686755269765854, -1.1421011686325073, 0.6069639921188354, -0.8331825137138367, -0.47921040654182434, 0.2998451292514801, 0.721377432346344, -0.6184468865394592, 0.545662522315979, -0.7691330313682556, 0.0793362557888031, -0.7584667801856995, 0.941990315914154, 0.43399056792259216, 1.1234275102615356, 0.5057575702667236, -1.137097716331482, -0.758182168006897, 0.04228341206908226, -0.6900910139083862, -0.5621538162231445, 0.825295627117157, 2.268347978591919, -1.7732727527618408, -0.9907275438308716, 0.634861409664154, 1.0238486528396606, 0.9574744701385498, 0.019129564985632896, -1.0700304508209229, -0.7518913149833679, 2.4400694370269775, -1.912861704826355, 0.31076598167419434, -1.4762635231018066, -0.47829392552375793, -0.11727923899888992, -0.630508303642273, -1.265464186668396, -0.294853538274765, -0.2798626720905304, 1.0837124586105347, 0.17298388481140137, 0.5123522281646729, -0.9818529486656189, 1.1258721351623535, 0.25538599491119385, -0.4588965177536011, -0.9283785820007324, -0.17175325751304626, -0.6866653561592102, -0.1326882690191269, 1.6295740604400635, -1.5456795692443848, -0.16959930956363678, 0.02781728096306324, 0.0910743772983551, 0.6718529462814331, 0.9851812124252319, -0.7609738707542419, -1.2726119756698608, -0.6267421841621399, 1.3712586164474487, 0.23598231375217438, -0.446566104888916, -1.1778020858764648, 1.4125137329101562, -0.02316661737859249, -0.011093219742178917, -0.9952824711799622, -0.29935362935066223, 0.7670295834541321, -0.937210738658905, -2.330476999282837, -0.7808834314346313, 0.8250064849853516, 1.2206652164459229, -0.06297583878040314, 1.1463638544082642, 1.2215378284454346, -0.31372663378715515, -0.7234253287315369, -0.3627345860004425, 0.4424906373023987, 0.19418247044086456, -0.4999869465827942, -0.5500510334968567, 0.023851748555898666, -1.5203826427459717, 0.5293999314308167, -0.39082857966423035, -1.9291036128997803, 0.03497670218348503, -0.4833625555038452, -1.2260730266571045, -0.33963847160339355, 0.007326157763600349, -0.052180398255586624, 1.167490005493164, 1.730208158493042, 2.056168794631958, -0.23472319543361664, -1.345624327659607, -0.5165784358978271, -0.6881742477416992, 0.4755038022994995, -1.4316335916519165, 0.1427735835313797, 0.6328914165496826, -1.048923373222351, -0.5224623084068298, -1.1338030099868774, -0.14128278195858002, -0.6456266641616821, 0.4101375937461853, 0.32671934366226196, -0.8344282507896423, -0.4921732246875763, 0.658042311668396, 0.5361921191215515, 1.2350000143051147, -0.21214154362678528, 1.387345790863037, -0.8248465657234192, 0.3544987440109253, -0.28073710203170776, -0.243259459733963, -0.29366371035575867, -0.6286743879318237, -0.04226749762892723, -0.27004849910736084, 1.4387904405593872, 0.03258634731173515, -0.5479734539985657, -0.49368005990982056, 2.8818862438201904, -1.1672022342681885, 1.9413354396820068, -1.163609266281128, -1.5966553688049316, 0.08320564776659012, -0.9222075343132019, -0.3711417317390442, -0.9714295268058777, 0.15282166004180908, 0.7250988483428955, -1.3895257711410522, 1.1874427795410156, 0.027558235451579094, 2.0010547637939453, -0.12460697442293167, -1.156516194343567, 0.9009959697723389, -0.18842656910419464, -1.2726235389709473, 0.5764585137367249, -0.35594069957733154, -0.5188538432121277, -0.3927396237850189, 1.7511601448059082, 0.19589348137378693, 1.7757917642593384, -0.18522614240646362, 1.0595130920410156, 1.2978315353393555, 0.3285580277442932, 0.14869070053100586, 0.2704370319843292, -1.1818499565124512, -1.0340323448181152, -0.4947497546672821, -0.8951197266578674, 0.5340191125869751, -0.88661128282547, 0.7963698506355286, 0.6588250994682312, -0.2966694235801697, 0.23320063948631287, -1.3473118543624878, -0.8231000304222107, -0.539470374584198, 0.09215065091848373, 0.8539144992828369, -1.0331605672836304, 0.5837976336479187, 1.0166347026824951, -0.794191300868988, 0.36742645502090454, 0.42930465936660767, 2.0288591384887695, -0.7683921456336975, -1.2262547016143799, -0.11334973573684692, 0.30849045515060425, -0.4410642385482788, -0.77969890832901, -0.756567120552063, 1.514818549156189, -1.5796416997909546, 0.6386357545852661, -0.4361383616924286, -1.0022987127304077, 0.3780289888381958, 0.04276036471128464, 0.5858650803565979, -1.3687634468078613, 1.1168509721755981, 0.27692535519599915, 1.0580254793167114, -0.05147926136851311, 0.17128385603427887, -0.21165163815021515, -0.1787608563899994, -0.8498311638832092, 1.166976809501648, -0.34847185015678406, 0.07418181002140045, 1.757521390914917, -0.6254484057426453, 0.20935998857021332, 1.505028486251831, -1.1346086263656616, -0.7111839056015015, 1.3401062488555908, 1.5108956098556519, -1.198473572731018, 0.37665531039237976, -0.251127690076828, -0.527733564376831, -0.47698524594306946, -0.5625298023223877, -1.0562596321105957, 0.24130821228027344, 0.18275369703769684, 0.6246524453163147, -0.7939775586128235, -0.674835205078125, -0.3876877427101135, 0.44965043663978577, 0.3726101517677307, -1.9104946851730347, 0.26085028052330017, 1.4177610874176025, 0.6738032102584839, 1.4665507078170776, -1.1077474355697632, -0.7443782091140747, 1.0188977718353271, -1.8317182064056396, 0.2806217670440674, 0.6909231543540955, 0.7183824777603149, -0.5719326138496399, -0.46663370728492737, 0.1017654687166214, 0.38033702969551086, -1.962886095046997, -0.7805798053741455, -0.1343953162431717, -0.3609391152858734, 0.104627326130867, -0.325872004032135, 0.3189202845096588, -0.10977188497781754, 0.0964970588684082, -1.4932167530059814, 0.5237964987754822, 0.7530690431594849, -0.2219216674566269, 0.5819101333618164, -1.9369032382965088, -1.5334482192993164, -0.17965702712535858, -0.6577823162078857, -1.2317392826080322, -1.2463988065719604, -1.4996418952941895, -0.5403968691825867, 1.2409895658493042, -1.6212294101715088, -0.9035959839820862, 1.3967915773391724, 0.9178156852722168, 0.5120382905006409, -0.8405776023864746, -1.0445209741592407, 0.5547724366188049, -0.9492565989494324, 1.0457415580749512, -1.1297553777694702, -2.800556182861328, 1.2796905040740967, 0.2199985533952713, 0.3249095380306244, 1.319007396697998, -0.8496796488761902, -0.6987038254737854, -0.20516234636306763, -0.7811664342880249, 0.6872723698616028, 0.7835897207260132, -1.1108732223510742, -3.106328010559082, -0.9897713661193848, -0.6022037863731384, -0.7153372168540955, -0.467404842376709, 0.551419734954834, 2.654942035675049, 1.0582451820373535, -0.1468161642551422, -0.8913255929946899, 0.1937909871339798, 1.9681813716888428, -0.7403607368469238, -0.8665743470191956, -0.30639445781707764, -0.5359372496604919, -0.35750812292099, -1.2398927211761475, -1.523536205291748, -0.8158796429634094, 1.1372771263122559, 0.21925963461399078, 0.4133651852607727, 0.0061524491757154465, -0.5672794580459595, -0.17038141191005707, -0.3027929663658142, -1.2868070602416992, -1.3662828207015991, -0.04625223949551582, -0.6149584650993347, 1.2366944551467896, -0.8143561482429504, 1.146209955215454, -1.178733229637146, -0.036672789603471756, 0.6718097925186157, 0.9242297410964966, 0.26971569657325745, 0.628537118434906, -0.7066188454627991, -0.8558416366577148, 0.9040606021881104, -0.5659265518188477, 0.3840969204902649, -0.7815778851509094, -0.15094131231307983, 0.4199317395687103, 1.4059346914291382, -0.8270853161811829, 1.560778021812439, -1.0952261686325073, 1.1855055093765259, 1.1880545616149902, 2.055619716644287, 0.6602651476860046, -1.1078379154205322, -0.2919580638408661, 0.45643651485443115, -0.3147018849849701, -0.41328999400138855, 0.3946205973625183, 1.1304746866226196, 0.8258382678031921, 0.9458276629447937, -0.15447334945201874, -1.6013476848602295, -0.059470854699611664, -0.9928666353225708, 1.1634254455566406, 1.609459400177002, -0.29416555166244507, 1.0819309949874878, 0.8866236805915833, -0.8611426949501038, -0.27264782786369324, 0.9804211258888245, -0.17533333599567413, -0.12276917695999146, 0.7414069175720215, 0.35395190119743347, -0.5345798134803772, 0.645367443561554, -2.9890658855438232, 0.18370741605758667, -0.4726978540420532, -0.958824634552002, -1.5123530626296997, 1.5067633390426636, -0.938051164150238, -0.638506293296814, 0.21946865320205688, -0.439242959022522, -0.1391070932149887, -0.018692156299948692, 1.6560721397399902, 1.0661178827285767, -0.18189188838005066, -1.2379671335220337, 0.514220118522644, -0.15104348957538605, 0.13773603737354279, 1.2250828742980957, -0.7642602920532227, 0.9183834791183472, 0.40576910972595215, 0.25104597210884094, 0.1281542032957077, -0.19802889227867126, -1.478035569190979, -0.5910253524780273, 0.8357481956481934, -0.22924941778182983, -1.2403943538665771, 0.24919238686561584, -1.1415528059005737, 0.7821402549743652, 0.010817415080964565, 0.3816293179988861, -1.652677059173584, -0.38139888644218445, 0.10698884725570679, -0.10149910300970078, 0.08301469683647156, 0.712009072303772, -0.9005926847457886, 0.8906894326210022, 0.47655177116394043, -0.8396266102790833, 0.33320167660713196, -1.2525506019592285, -0.5745509266853333, -1.9059150218963623, -0.9665390253067017, 0.367727130651474, -0.5785751342773438, 1.2373405694961548, 0.8713390231132507, -0.522757887840271, 1.2400078773498535, -0.905766487121582, 0.768028736114502, 1.62221360206604, 0.08158037811517715, 0.20281589031219482, 0.33024173974990845, -0.9533721804618835, 1.5734566450119019, 1.8697383403778076, -1.0638948678970337, -0.2272576242685318, 0.25006136298179626, 1.161847710609436, -0.11422315984964371, -0.05629456788301468, 0.8497498631477356, -0.8599120378494263, -0.6105663776397705, 1.0629346370697021, 1.2221823930740356, 0.771891176700592, -1.2797164916992188, -1.5433486700057983, -0.6020243763923645, 0.3213997781276703, -0.060615699738264084, -1.170371651649475, -2.773613929748535, -0.02982438914477825, -0.91661536693573, 0.4702746272087097, 1.8777929544448853, 0.5223742127418518, 0.051756951957941055, 0.4260155260562897, 0.9475129246711731, 0.4364280700683594, -0.2053070068359375, -1.4739270210266113, 0.5066304802894592, 0.2779245674610138, 1.351500153541565, -0.8949641585350037, -1.596110463142395, 0.673722505569458, -0.9970720410346985, -0.34807199239730835, 0.2176828533411026, 1.1277714967727661, -1.5005147457122803, -0.2404831200838089, -0.4854878783226013, -0.06616523861885071, -0.9029294848442078, 0.6440190076828003, 0.7591805458068848, -2.0202691555023193, -0.6739510893821716, -0.9192121624946594, 1.212047815322876, -1.3463493585586548, -0.4831593930721283, 1.7186238765716553, -0.5684311389923096, -2.9151322841644287, 1.0834310054779053, 0.07731132954359055, 1.2316521406173706, 2.9194436073303223, 1.9377914667129517, -0.5536230206489563, -1.3029974699020386, 1.0696011781692505, -0.4561823606491089, 1.3634916543960571, -2.4219810962677, -0.08308011293411255, 0.1034913882613182, 0.11661393195390701, -0.02522038109600544, 0.3788713812828064, 0.24455690383911133, -0.8915789723396301, 1.4343817234039307, -1.9291707277297974, -0.5713837146759033, -0.6671661734580994, -0.09203547239303589, 0.9548746347427368, 0.18482893705368042, -0.11677189916372299, -0.22911065816879272, -0.3448553681373596, -1.0765177011489868, -0.5477657318115234, -0.3289257884025574, 0.05841278284788132, 2.1100034713745117, 0.7726138234138489, -0.34265488386154175, 1.2370060682296753, -0.2497664988040924, 0.22397132217884064, -0.6875526905059814, -0.489844411611557, 0.399687796831131, 0.6981958150863647, 0.05211031809449196, 0.2882064878940582, 0.05950453504920006, 1.7285562753677368, 0.2920781075954437, -0.6925867199897766, -0.8442767858505249, -0.32920387387275696, -0.1140289157629013, -0.8452204465866089, 0.3004419207572937, 1.6395184993743896, -1.0744175910949707, 0.32121846079826355, 0.2892301678657532, 0.35196706652641296, 2.0987792015075684, -0.5285679697990417, -1.7715193033218384, 0.0968942642211914, 0.36735019087791443, 0.47318676114082336, 0.5876799821853638, 0.183979332447052, -0.8425887823104858, -1.6971954107284546, 1.0871516466140747, 0.6801379919052124, 1.1616994142532349, -0.17657233774662018, 0.5214431285858154, -2.3571479320526123, -0.8351162672042847, -2.262038469314575, -1.2966164350509644, 0.3269132375717163, 0.6064606308937073, -0.46068817377090454, -0.8800807595252991, -1.4766337871551514, 0.982934296131134, 0.034095875918865204, 1.1689343452453613, 0.9025653600692749, -1.7167327404022217, 0.04617787152528763, 0.09389957040548325, -1.35635244846344, -1.0603324174880981, 1.0654057264328003, 0.5447612404823303, 1.522364616394043, 0.02351505309343338, 0.28558799624443054, 0.020343216136097908, 0.9289091229438782, -0.9238923788070679, 1.1473842859268188, -0.7054344415664673, 1.1544770002365112, -1.7462857961654663, 0.7103408575057983, -0.10175959765911102, -0.9663392901420593, -1.4231536388397217, -0.7846477627754211, 0.6107109189033508, 0.2142704576253891, -0.17470814287662506, -1.7561272382736206, 1.4259073734283447, 0.5127183794975281, -0.4026731848716736, 1.9770677089691162, 0.0267170500010252, -0.25020739436149597, -0.09136287868022919, -0.5283262729644775, -0.46433013677597046, -0.15669254958629608, -1.5964131355285645, -1.5322294235229492, 0.8562206029891968, 0.4322175085544586, 0.24113479256629944, -0.05469474941492081, 0.04771281033754349, -0.8637551665306091, -1.141897201538086, -0.8292406797409058, 1.3149042129516602, 1.2470786571502686, -0.25818052887916565, -1.340453863143921, -0.5561836957931519, 1.173104166984558, 0.6859942674636841, 0.8626111745834351, -0.41023650765419006, -0.7588294148445129, 1.6981608867645264, 0.7436892986297607, -0.03276701644062996, 1.0600273609161377, 0.003909424878656864, -0.6951659917831421, -1.8829604387283325, 0.304572194814682, -0.7002271413803101, 1.7811017036437988, -0.2936820983886719, 0.5242968797683716, 1.0186315774917603, -0.15129554271697998, 1.1705763339996338, 1.6411151885986328, 0.428303986787796, -1.0703928470611572, -0.6159464716911316, -1.0194525718688965, 0.3848164975643158, 0.29434895515441895, -1.7715047597885132, 0.4349344074726105, 0.06312361359596252, -0.6894504427909851, -0.2829807698726654, 0.6600029468536377, -0.16193436086177826, 0.886084258556366, 0.5484238862991333, 0.45765289664268494, 0.9676891565322876, -0.6673583388328552, 1.6183183193206787, -0.26440465450286865, 1.354137897491455, -0.07092823088169098, -0.3697128891944885, -0.24597389996051788, 0.3293827772140503, 0.6973733305931091, 0.8342204093933105, -1.098692774772644, 0.5674765110015869, 0.8283826112747192, -3.832531690597534, 0.11584769189357758, 1.9915446043014526, 1.0238094329833984, 2.1327197551727295, 0.23347528278827667, 1.2004878520965576, -1.2668757438659668, -0.9444983005523682, -0.1793764978647232, 0.31204938888549805, 0.717379093170166, -0.2302778661251068, 0.7147674560546875, 1.443666696548462, 0.196146160364151, -0.8332573175430298, -0.952683687210083, -0.36366915702819824, -1.2479252815246582, -0.09261447191238403, 0.6533640027046204, 0.16369947791099548, 1.3456140756607056, -0.369537353515625, -0.47141557931900024, 0.4779217541217804, 0.8509474396705627, 0.36884430050849915, 1.0622302293777466, 1.763922929763794, -0.048379626125097275, 0.9127081632614136, -1.3906173706054688, -0.7096118927001953, 0.9307976365089417, -0.4243218004703522, -0.4821736812591553, 0.4773769974708557, -0.1789979487657547, 0.4937354028224945, 0.5612083077430725, -1.7986558675765991, -0.6078459620475769, -0.5876336097717285, -0.3451770842075348, -0.7287773489952087, -1.4957531690597534, 0.7350953221321106, -0.269319087266922, 0.45085909962654114, 0.04091703146696091, -0.06933283060789108, 0.2585761547088623, 0.4775455594062805, -1.4889180660247803, -1.2930028438568115, 0.8795658946037292, 0.07306429743766785, 0.9967362284660339, 1.0237910747528076, -1.2132517099380493, 0.9744538068771362, 0.45322731137275696, -0.9927570819854736, -0.2557562291622162, -0.9585699439048767, -0.5702749490737915, 0.19281719624996185, 0.3847457766532898, -0.8595814108848572, 1.2814747095108032, 0.1276102066040039, 0.6101059317588806, -1.2942535877227783, 0.6038413643836975, 1.117246150970459, 0.4163925051689148, 0.6747081875801086, 0.2249874323606491, -0.9556332230567932, -0.7779799103736877, 0.6935068964958191, -0.4358613193035126, -0.9824548959732056, -0.9062879085540771, 1.25956130027771, 0.34626761078834534, -2.0042972564697266, 0.005512263625860214, 0.46033239364624023, 1.179113507270813, -1.0105520486831665, -0.620258629322052, -1.4548780918121338, -0.5897568464279175, -0.6960206627845764, 0.5155009627342224, 0.723761260509491, -0.18846826255321503, -0.5821011662483215, -0.4351550042629242, -1.2878144979476929, 1.9290111064910889, -0.17678959667682648, 0.6398148536682129, 0.6912683248519897, 0.5198960900306702, -0.7546091079711914, -0.033411234617233276, -0.8276495337486267, -0.3524166941642761}; - - -static float dotp_result __attribute__((section(".data"))) = {-17.611276626586914}; - - -float result [4] __attribute__((section(".data"))) = {0}; - - diff --git a/software/tests/fdotp-32b/data/data_32768.h b/software/tests/fdotp-32b/data/data_32768.h index f2bdbf6..81e6e46 100644 --- a/software/tests/fdotp-32b/data/data_32768.h +++ b/software/tests/fdotp-32b/data/data_32768.h @@ -21,6 +21,7 @@ static float dotp_B_dram [32768] __attribute__((section(".data"))) = {-0.7837820 static float dotp_result __attribute__((section(".data"))) = {209.38462829589844}; -float result [4] __attribute__((section(".data"))) = {0}; +// Global memory location to hold reduction results for each core +float result [64] __attribute__((section(".data"))) = {0}; diff --git a/software/tests/fdotp-32b/data/data_65536.h b/software/tests/fdotp-32b/data/data_65536.h index 8f9f713..20cf9d0 100644 --- a/software/tests/fdotp-32b/data/data_65536.h +++ b/software/tests/fdotp-32b/data/data_65536.h @@ -21,6 +21,7 @@ static float dotp_B_dram [65536] __attribute__((section(".data"))) = {0.88840794 static float dotp_result __attribute__((section(".data"))) = {-239.60137939453125}; -float result [4] __attribute__((section(".data"))) = {0}; +// Global memory location to hold reduction results for each core +float result [64] __attribute__((section(".data"))) = {0}; diff --git a/software/tests/fdotp-32b/data/data_8192.h b/software/tests/fdotp-32b/data/data_8192.h index c7ef3e2..2dc9140 100644 --- a/software/tests/fdotp-32b/data/data_8192.h +++ b/software/tests/fdotp-32b/data/data_8192.h @@ -21,6 +21,7 @@ static float dotp_B_dram [8192] __attribute__((section(".data"))) = {-0.79778224 static float dotp_result __attribute__((section(".data"))) = {-137.29200744628906}; -float result [4] __attribute__((section(".data"))) = {0}; +// Global memory location to hold reduction results for each core +float result [64] __attribute__((section(".data"))) = {0}; diff --git a/software/tests/fdotp-32b/script/gen_data.py b/software/tests/fdotp-32b/script/gen_data.py index 03d6576..ef506e8 100644 --- a/software/tests/fdotp-32b/script/gen_data.py +++ b/software/tests/fdotp-32b/script/gen_data.py @@ -88,8 +88,9 @@ def emit_dotp_layer(name="dotp", **kwargs): + array_to_cstr(result) + ";\n\n\n" ) + layer_str += '// Global memory location to hold reduction results for each core\n' layer_str += ( - f'{dtype} result [4] __attribute__((section(".data"))) = {{0}}' + f'{dtype} result [64] __attribute__((section(".data"))) = {{0}}' + ";\n\n\n" ) else: diff --git a/software/tests/idotp-32b/data/data_1024.h b/software/tests/idotp-32b/data/data_1024.h deleted file mode 100644 index 429731e..0000000 --- a/software/tests/idotp-32b/data/data_1024.h +++ /dev/null @@ -1,18 +0,0 @@ -// This file was generated automatically. - -#include "layer.h" -#include - -dotp_layer dotp_l __attribute__((section(".pdcp_src"))) = { - .M = 1024, - .dtype = INT32, -}; - -static int32_t dotp_A_dram[1024] __attribute__((section(".data"))) = {2, 79, -8, -86, 6, -29, 88, -80, 2, 21, -26, -13, 16, -1, 3, 51, 30, 49, -48, -99, -13, 57, -63, 29, 91, 87, -80, 60, -43, -79, -12, -52, -42, 69, 87, -86, 89, 89, 74, 89, -50, 7, -46, -37, 30, -50, 34, -80, -28, 66, -83, 31, -12, -41, -87, -92, -11, -48, 29, -17, -9, 10, 87, 98, 71, -93, 74, -66, -20, 63, -51, 3, 31, -99, 33, -47, 5, -97, -47, 90, 45, -57, 61, 89, -87, -6, -53, -86, 99, 89, -61, -19, 10, -48, -77, 53, 87, 23, -60, 56, -86, -56, -36, -12, -30, -92, -13, 28, 35, -38, 38, -20, 35, 62, 62, -68, 22, -96, -60, -73, 34, 100, -29, -89, 61, -68, -53, 50, -39, -64, -2, 71, 3, -66, 92, 0, 74, 30, -100, -96, 41, 2, -74, 36, -86, -11, -59, 23, 78, -38, -5, -49, -5, 31, 50, 42, 70, -72, -65, -88, 59, -30, 86, -15, -73, -35, 69, -56, -39, 84, 33, -73, -73, 7, -57, -17, -71, 89, -26, 27, -9, 89, 28, 20, -74, 89, 20, 15, -98, 2, 97, 99, 54, 36, -39, 64, -50, 71, 51, -42, 17, 59, -5, 79, 12, -39, 85, -49, -89, -62, 29, 30, 12, 0, 12, 83, -20, 86, 12, -99, 29, -47, -14, 28, 46, 25, 29, -48, 71, 59, 97, 59, -33, 82, 83, 22, 44, -63, -77, -32, 15, -3, 97, 38, 43, -4, 100, 23, 86, -31, -8, -98, 47, 86, 63, 46, -11, 94, 46, 47, -5, 98, -49, 60, 67, 27, -62, -19, 3, 28, -90, 84, 77, 50, 58, -59, -2, -94, 43, -11, 11, -41, 12, -99, 28, -53, 39, 96, -64, 59, -92, -2, 46, -53, 30, 47, 51, -47, 19, 60, 51, 15, -26, 12, 99, 63, 65, 3, -17, 11, -2, 52, -8, 45, 27, 9, -19, 93, -47, 62, 88, 68, 60, -33, -68, 41, -80, -53, 47, 27, 35, 34, 94, 44, 27, -68, 75, 86, 14, 18, -79, 57, -63, 8, -50, 81, -93, -74, -74, -80, -71, -4, -73, 10, 91, 96, -40, -53, 46, -97, -66, 91, -52, -84, 71, 57, -55, 16, -95, -2, 23, -64, -77, -8, -55, 80, -6, -2, 87, 15, 90, 59, 60, -34, 27, -83, -76, -47, -43, -34, 3, 73, -77, 13, -69, 74, -15, 50, 93, 26, 54, 29, -84, 3, 60, 36, -58, 75, -62, 69, -75, -2, -51, 52, 51, -88, -41, 34, -44, -65, 72, -81, -36, -93, 43, 41, 14, 42, -9, -3, -35, -69, 90, -15, -50, 52, 85, -38, 89, 24, 49, -43, -43, -15, -52, 79, 69, -31, -86, -47, 87, 0, -93, -48, -41, 7, -96, 2, 95, -95, 8, 15, -7, -54, -2, -46, 67, -49, 43, -88, 13, 23, 5, 57, 46, 44, 19, -38, -82, -9, -43, 82, -11, 16, -39, -78, 26, 36, 39, 28, -43, 21, -100, -67, -5, 25, 17, -53, -12, 16, 28, -85, 88, 91, 90, -32, -79, -8, 94, -25, 53, 43, 78, -15, 84, -72, -32, -54, -7, 89, 96, 43, 75, -16, -62, -1, -68, 0, -78, -91, -32, -1, -67, 79, 37, 46, 85, -5, -100, -32, -97, -85, -77, -21, -99, 27, 59, -17, 51, 39, 77, 62, 23, -68, 60, 88, 78, 70, 0, -89, -34, -36, 60, 67, -27, -58, -57, -72, 40, -89, -6, -55, 29, -66, -20, -11, -93, -8, 53, -11, 61, 14, 4, 34, 95, -43, 13, -26, 56, 19, 63, -80, 63, 37, 0, 100, 51, 91, 76, -2, -65, -5, 51, 50, 89, -64, -89, 12, 82, -88, -78, -2, 4, -71, -84, 12, -39, -17, 11, -15, 40, 86, -82, 76, -1, 39, 88, 46, -25, -92, 98, -73, 27, -49, -18, 10, 43, 16, -32, -2, 39, -76, 79, 22, -48, 50, 43, -44, -62, 8, 80, -59, 85, 66, 41, 21, 32, 62, -26, 45, -25, -92, -27, 85, 44, -94, 73, 40, 67, 69, 36, 77, -74, 21, 93, -96, -72, 64, 65, -18, 35, 8, -36, -15, 44, -30, -56, 31, -65, -31, 58, -82, 88, 7, 81, 66, -10, -11, -82, -62, 25, 94, 72, 40, 25, -43, 47, 99, -40, 26, 4, 66, -100, 30, -9, 89, 90, 12, 52, -45, 60, 65, 16, 33, -43, -57, 72, 59, 72, -40, -54, 48, -21, 17, 63, 46, -81, 84, 45, -54, -52, -87, 42, 58, -100, 16, -47, 17, -98, 43, 84, -89, -27, -85, 99, 1, 51, 55, 16, -93, 21, -9, 63, -11, 35, 85, -41, 77, -73, 0, -60, 91, 54, 90, 44, 100, 60, 56, 40, -55, -66, 33, -19, 14, 96, -54, 52, 93, -91, -45, -71, 8, -96, 18, -68, 17, -36, 45, 76, -90, -16, -75, -38, -15, -42, -74, 76, 60, -3, 4, -2, 28, 48, -46, -95, 96, -6, 32, 1, -98, 80, -78, -48, 64, -18, 44, -16, -23, 100, 9, -100, -50, 72, -97, 89, 92, 12, -69, -67, -9, -6, -29, -62, 53, 61, 81, 17, -98, 22, -51, -89, 92, -47, 32, -44, 44, 11, -54, 50, -16, 41, -35, -26, 78, 2, 65, 91, -63, -51, -3, -19, -71, -22, -10, 78, 90, -49, 65, -22, -71, 5, -50, -20, 32, -72, 31, 37, 83, 44, -27, -84, -17, -32, -67, -95, -48, 93, 25, -58, 14, 10, 50, 82, -21, -6, 17, 43, -93, 31, 3, 31, 83, -76, 94, -5, 94, 54, -8, 59, 77, -40, 21, -50, 46, -80, -96, -9, 69, -40, -79, 48, -31, -100, 32, -89, -11, -55, -67, 76, -23, -56, 54, -28, -75, -54, 20, -45, -7, 6, -38, -53, -40, -20, -75, -65, -100, -93, 12, -2, 79, -54, 26, -45, -87, -73, -23, 29, 8, 53, -87, 86, -45, 14, -94, -98, 10, 50, 6, -83, -63, 14, -86, 91, 18, -73, -62, 84, -84, -15, 25, -57, -76, 44, -88, -76, -33, 37, -34, 8, 45, 10, 10, -67, 10, -93, 67, 12, -18, -59, 68, 0, -95, 79, -75, -37, 86, 83, -42, 8, 97, 20, -68, 80, 49}; - -static int32_t dotp_B_dram[1024] __attribute__((section(".data"))) = {-80, 97, -31, 11, -97, -7, -26, 89, -39, -7, -6, 51, -46, 36, 30, -70, -61, -65, 51, -95, -35, -26, -97, -22, 33, 17, 12, -7, 78, -39, 84, 93, -22, 35, -75, 78, 72, -57, 32, -31, 53, 17, -33, -82, -81, 12, 39, -54, -100, -11, 41, -37, -63, -64, 25, 38, -1, -24, -98, 60, 33, 77, -91, -96, 50, 37, 71, 29, -88, 67, 29, -17, -36, -38, 0, -28, -84, -92, 42, 51, -63, 62, -7, -6, -52, -32, -39, 87, 77, -23, 16, 19, 36, 61, -25, -66, -100, -61, -37, 49, -41, -37, -8, -29, -90, 4, -87, -41, -71, -66, 64, -96, -18, 22, -23, 53, -39, 31, -12, -59, -12, 45, -61, -29, -62, 3, -87, -69, 78, 24, 65, -4, -78, -38, 42, 52, 44, 93, -48, 3, 3, 78, -62, 78, 97, 33, -34, 34, 78, 99, -59, 91, -86, 10, 56, -68, 54, 63, 56, -63, 84, -4, 54, 82, -68, 95, -15, -35, -91, -96, 22, -27, -4, 17, -63, 40, 58, -54, 8, 79, 83, -86, 56, 35, -96, 56, -54, -33, -25, 72, 29, 54, -6, 14, 63, -65, -75, -58, -74, -32, 47, -90, -27, 3, -63, 33, 99, -78, -54, -11, -55, 6, 39, 40, 3, 89, 10, 3, -41, 70, -1, -33, 32, 19, -64, -29, 26, 5, -9, -70, 21, 36, -50, -72, -61, -60, -90, 50, -100, -55, 0, 48, -11, 9, 63, 81, -44, -100, -38, 81, -46, 14, 67, 42, 48, 74, 100, -48, 36, 79, -44, 16, 53, 68, -66, -38, -76, -11, -26, -63, 29, 34, 61, -10, -84, 27, 70, 86, 7, 78, 81, 51, -76, 98, 79, 97, -13, 60, 76, -72, -38, 49, 53, 55, 13, -52, 98, -20, -17, 4, 76, 47, 17, -15, -38, 88, 3, -52, -30, -100, 40, 78, 22, 83, -39, -69, 57, -72, -52, 72, -71, 43, 67, -82, -83, -100, -23, 14, 74, 93, 12, 13, 65, 78, -38, 31, 28, -93, 56, -46, 2, 30, -69, -91, 9, 61, 23, -14, -46, -69, 77, 34, -8, -93, -36, -44, -34, 86, -29, -47, -34, -50, -4, -9, -93, 61, -66, -5, -13, -23, -69, 19, -55, 43, 95, 64, 81, 41, -46, 75, -94, -27, -94, 60, 50, -16, 46, 11, 24, 46, -65, -72, 87, -19, -99, 28, -54, 96, 47, -90, 29, 94, 18, 39, -81, -96, -64, 65, 36, -48, 71, -2, -15, 7, -77, -20, 57, 19, -42, 27, 13, 14, -87, -92, -61, 93, -76, 2, 100, -79, -97, 53, 85, -72, 8, -3, -64, -26, -31, 45, 27, -16, -59, -1, -60, 65, -67, -84, 64, 52, 21, -25, -14, 16, 5, -15, -74, -44, -70, 33, 67, -3, -89, -48, 98, 37, 72, 44, 53, 89, 21, -55, -37, 29, -47, 6, 92, -50, 80, -65, 14, -75, -72, 48, -90, -61, -90, 63, 12, 86, -62, -47, -3, -46, 10, 51, 49, -32, -45, -68, -65, 47, -20, 89, 8, 100, 53, 93, -28, 100, -61, -84, 28, -40, 70, 3, -59, -76, -62, -66, 30, 7, 71, 78, 1, -3, -89, -82, 0, -57, 86, -52, 88, -84, -27, -44, -46, -54, -89, -39, -21, -18, -93, 48, -20, 17, 97, 99, -76, -12, -89, 42, -42, 53, 8, -75, -54, -69, -91, -85, 98, 44, 50, -75, -15, 34, -87, -22, 16, -94, 36, 14, 75, -29, -42, -19, 15, 66, 45, 86, 2, -84, -87, 58, 51, 7, 87, -56, -3, 30, -64, 70, 67, 82, 7, -62, -86, 19, -97, -8, 52, 40, 60, -85, 69, 7, 25, 93, -46, 69, -67, 57, -88, 40, -83, 59, -5, 22, -62, -55, -72, 89, -39, 84, -85, 83, 20, -91, 57, 52, 2, -17, 32, -36, 76, -98, 72, 41, 19, 57, -33, 45, 89, -64, 52, 75, 92, 80, -28, 42, -52, 20, -13, 95, 39, 86, -64, -40, 70, 23, 97, -62, 83, -38, -55, -13, -90, -39, -24, 52, 98, -49, -97, -42, -29, 47, -8, -38, -47, 16, 9, -27, 6, -44, 68, -98, 19, -95, -96, -96, -47, -54, 76, -92, -2, -81, 21, -40, 22, 62, 77, -19, -39, 44, -98, 59, -88, 19, 24, -12, -28, -33, 41, 0, -3, -90, 4, 83, -34, 22, -72, 36, 94, 52, -25, 69, -92, -61, -76, -96, 38, 86, 23, -63, -29, 32, 75, -11, 45, 97, -64, -41, 75, -73, 96, -20, 13, -61, -56, -39, -8, 14, 85, -34, -45, -61, -3, -61, -10, -68, -95, 46, -21, 67, -9, -4, -42, -42, -53, 68, -88, 6, -56, -12, 80, 69, -1, 90, 54, 65, 87, -94, 32, -56, -43, -70, -78, 69, 37, 59, 6, 80, 57, -62, 58, -19, -1, -99, -24, -89, -62, 93, -88, -55, 54, 12, -84, 3, -3, 87, 91, -13, 8, 62, -31, 57, 98, -27, -38, 55, -41, -22, -64, -79, 95, 47, -5, -33, 91, -84, -89, 49, 44, 37, 17, 92, -79, 19, -51, -87, 91, 74, -72, 63, 79, 24, -94, -72, 38, -68, 33, 10, -22, 59, 78, -43, -75, 73, -72, -97, -2, 40, -62, -86, 18, -72, 56, -26, 15, -69, 29, 74, -17, -79, -74, 94, -20, 25, 83, -9, -80, -54, 0, 86, -17, -95, 46, 84, 96, 30, -100, -43, 23, 65, -86, 61, 88, 62, -37, -76, -77, -89, -83, -86, -74, -29, -41, 73, 44, -8, -48, -93, -22, -74, 73, -51, 98, 30, -8, 91, 71, 80, -77, -41, 21, 30, 47, -55, -86, 52, 98, -84, 25, -17, -92, 65, 75, 87, -38, 16, 29, -13, -29, 38, -37, -29, -80, -83, -37, -19, 9, -6, 65, -69, -90, -56, -68, 1, 68, 35, -90, 78, -13, -60, 44, -25, 20, -55, 59, -21, -47, -15, -9, 47, 60, 67, 59, -4, -99, -68, 57, 60, -24, 15, 53, 49, 2, 93, 65, 2, -11, 73, 21, 42, 5, 18, 71, -52, 3, -40, 94, 22, 33, -92, -95, -28, 2, 59, -60, 13, -93, -29, 77, -9, -39, -17, -39, 10, 26, -94, -17, 31, 33, -43}; - -static int32_t dotp_result_golden __attribute__((section(".data"))) = -9488; - -int32_t result[4] __attribute__((section(".data"))) = {0}; - diff --git a/software/tests/idotp-32b/data/data_32768.h b/software/tests/idotp-32b/data/data_32768.h index 8ac0129..cbbd429 100644 --- a/software/tests/idotp-32b/data/data_32768.h +++ b/software/tests/idotp-32b/data/data_32768.h @@ -8,11 +8,11 @@ dotp_layer dotp_l __attribute__((section(".pdcp_src"))) = { .dtype = INT32, }; -static int32_t dotp_A_dram[32768] __attribute__((section(".data"))) = {2, 79, -8, -86, 6, -29, 88, -80, 2, 21, -26, -13, 16, -1, 3, 51, 30, 49, -48, -99, -13, 57, -63, 29, 91, 87, -80, 60, -43, -79, -12, -52, -42, 69, 87, -86, 89, 89, 74, 89, -50, 7, -46, -37, 30, -50, 34, -80, -28, 66, -83, 31, -12, -41, -87, -92, -11, -48, 29, -17, -9, 10, 87, 98, 71, -93, 74, -66, -20, 63, -51, 3, 31, -99, 33, -47, 5, -97, -47, 90, 45, -57, 61, 89, -87, -6, -53, -86, 99, 89, -61, -19, 10, -48, -77, 53, 87, 23, -60, 56, -86, -56, -36, -12, -30, -92, -13, 28, 35, -38, 38, -20, 35, 62, 62, -68, 22, -96, -60, -73, 34, 100, -29, -89, 61, -68, -53, 50, -39, -64, -2, 71, 3, -66, 92, 0, 74, 30, -100, -96, 41, 2, -74, 36, -86, -11, -59, 23, 78, -38, -5, -49, -5, 31, 50, 42, 70, -72, -65, -88, 59, -30, 86, -15, -73, -35, 69, -56, -39, 84, 33, -73, -73, 7, -57, -17, -71, 89, -26, 27, -9, 89, 28, 20, -74, 89, 20, 15, -98, 2, 97, 99, 54, 36, -39, 64, -50, 71, 51, -42, 17, 59, -5, 79, 12, -39, 85, -49, -89, -62, 29, 30, 12, 0, 12, 83, -20, 86, 12, -99, 29, -47, -14, 28, 46, 25, 29, -48, 71, 59, 97, 59, -33, 82, 83, 22, 44, -63, -77, -32, 15, -3, 97, 38, 43, -4, 100, 23, 86, -31, -8, -98, 47, 86, 63, 46, -11, 94, 46, 47, -5, 98, -49, 60, 67, 27, -62, -19, 3, 28, -90, 84, 77, 50, 58, -59, -2, -94, 43, -11, 11, -41, 12, -99, 28, -53, 39, 96, -64, 59, -92, -2, 46, -53, 30, 47, 51, -47, 19, 60, 51, 15, -26, 12, 99, 63, 65, 3, -17, 11, -2, 52, -8, 45, 27, 9, -19, 93, -47, 62, 88, 68, 60, -33, -68, 41, -80, -53, 47, 27, 35, 34, 94, 44, 27, -68, 75, 86, 14, 18, -79, 57, -63, 8, -50, 81, -93, -74, -74, -80, -71, -4, -73, 10, 91, 96, -40, -53, 46, -97, -66, 91, -52, -84, 71, 57, -55, 16, -95, -2, 23, -64, -77, -8, -55, 80, -6, -2, 87, 15, 90, 59, 60, -34, 27, -83, -76, -47, -43, -34, 3, 73, -77, 13, -69, 74, -15, 50, 93, 26, 54, 29, -84, 3, 60, 36, -58, 75, -62, 69, -75, -2, -51, 52, 51, -88, -41, 34, -44, -65, 72, -81, -36, -93, 43, 41, 14, 42, -9, -3, -35, -69, 90, -15, -50, 52, 85, -38, 89, 24, 49, -43, -43, -15, -52, 79, 69, -31, -86, -47, 87, 0, -93, -48, -41, 7, -96, 2, 95, -95, 8, 15, -7, -54, -2, -46, 67, -49, 43, -88, 13, 23, 5, 57, 46, 44, 19, -38, -82, -9, -43, 82, -11, 16, -39, -78, 26, 36, 39, 28, -43, 21, -100, -67, -5, 25, 17, -53, -12, 16, 28, -85, 88, 91, 90, -32, -79, -8, 94, -25, 53, 43, 78, -15, 84, -72, -32, -54, -7, 89, 96, 43, 75, -16, -62, -1, -68, 0, -78, -91, -32, -1, -67, 79, 37, 46, 85, -5, -100, -32, -97, -85, -77, -21, -99, 27, 59, -17, 51, 39, 77, 62, 23, -68, 60, 88, 78, 70, 0, -89, -34, -36, 60, 67, -27, -58, -57, -72, 40, -89, -6, -55, 29, -66, -20, -11, -93, -8, 53, -11, 61, 14, 4, 34, 95, -43, 13, -26, 56, 19, 63, -80, 63, 37, 0, 100, 51, 91, 76, -2, -65, -5, 51, 50, 89, -64, -89, 12, 82, -88, -78, -2, 4, -71, -84, 12, -39, -17, 11, -15, 40, 86, -82, 76, -1, 39, 88, 46, -25, -92, 98, -73, 27, -49, -18, 10, 43, 16, -32, -2, 39, -76, 79, 22, -48, 50, 43, -44, -62, 8, 80, -59, 85, 66, 41, 21, 32, 62, -26, 45, -25, -92, -27, 85, 44, -94, 73, 40, 67, 69, 36, 77, -74, 21, 93, -96, -72, 64, 65, -18, 35, 8, -36, -15, 44, -30, -56, 31, -65, -31, 58, -82, 88, 7, 81, 66, -10, -11, -82, -62, 25, 94, 72, 40, 25, -43, 47, 99, -40, 26, 4, 66, -100, 30, -9, 89, 90, 12, 52, -45, 60, 65, 16, 33, -43, -57, 72, 59, 72, -40, -54, 48, -21, 17, 63, 46, -81, 84, 45, -54, -52, -87, 42, 58, -100, 16, -47, 17, -98, 43, 84, -89, -27, -85, 99, 1, 51, 55, 16, -93, 21, -9, 63, -11, 35, 85, -41, 77, -73, 0, -60, 91, 54, 90, 44, 100, 60, 56, 40, -55, -66, 33, -19, 14, 96, -54, 52, 93, -91, -45, -71, 8, -96, 18, -68, 17, -36, 45, 76, -90, -16, -75, -38, -15, -42, -74, 76, 60, -3, 4, -2, 28, 48, -46, -95, 96, -6, 32, 1, -98, 80, -78, -48, 64, -18, 44, -16, -23, 100, 9, -100, -50, 72, -97, 89, 92, 12, -69, -67, -9, -6, -29, -62, 53, 61, 81, 17, -98, 22, -51, -89, 92, -47, 32, -44, 44, 11, -54, 50, -16, 41, -35, -26, 78, 2, 65, 91, -63, -51, -3, -19, -71, -22, -10, 78, 90, -49, 65, -22, -71, 5, -50, -20, 32, -72, 31, 37, 83, 44, -27, -84, -17, -32, -67, -95, -48, 93, 25, -58, 14, 10, 50, 82, -21, -6, 17, 43, -93, 31, 3, 31, 83, -76, 94, -5, 94, 54, -8, 59, 77, -40, 21, -50, 46, -80, -96, -9, 69, -40, -79, 48, -31, -100, 32, -89, -11, -55, -67, 76, -23, -56, 54, -28, -75, -54, 20, -45, -7, 6, -38, -53, -40, -20, -75, -65, -100, -93, 12, -2, 79, -54, 26, -45, -87, -73, -23, 29, 8, 53, -87, 86, -45, 14, -94, -98, 10, 50, 6, -83, -63, 14, -86, 91, 18, -73, -62, 84, -84, -15, 25, -57, -76, 44, -88, -76, -33, 37, -34, 8, 45, 10, 10, -67, 10, -93, 67, 12, -18, -59, 68, 0, -95, 79, -75, -37, 86, 83, -42, 8, 97, 20, -68, 80, 49, -80, 97, -31, 11, -97, -7, -26, 89, -39, -7, -6, 51, -46, 36, 30, -70, -61, -65, 51, -95, -35, -26, -97, -22, 33, 17, 12, -7, 78, -39, 84, 93, -22, 35, -75, 78, 72, -57, 32, -31, 53, 17, -33, -82, -81, 12, 39, -54, -100, -11, 41, -37, -63, -64, 25, 38, -1, -24, -98, 60, 33, 77, -91, -96, 50, 37, 71, 29, -88, 67, 29, -17, -36, -38, 0, -28, -84, -92, 42, 51, -63, 62, -7, -6, -52, -32, -39, 87, 77, -23, 16, 19, 36, 61, -25, -66, -100, -61, -37, 49, -41, -37, -8, -29, -90, 4, -87, -41, -71, -66, 64, -96, -18, 22, -23, 53, -39, 31, -12, -59, -12, 45, -61, -29, -62, 3, -87, -69, 78, 24, 65, -4, -78, -38, 42, 52, 44, 93, -48, 3, 3, 78, -62, 78, 97, 33, -34, 34, 78, 99, -59, 91, -86, 10, 56, -68, 54, 63, 56, -63, 84, -4, 54, 82, -68, 95, -15, -35, -91, -96, 22, -27, -4, 17, -63, 40, 58, -54, 8, 79, 83, -86, 56, 35, -96, 56, -54, -33, -25, 72, 29, 54, -6, 14, 63, -65, -75, -58, -74, -32, 47, -90, -27, 3, -63, 33, 99, -78, -54, -11, -55, 6, 39, 40, 3, 89, 10, 3, -41, 70, -1, -33, 32, 19, -64, -29, 26, 5, -9, -70, 21, 36, -50, -72, -61, -60, -90, 50, -100, -55, 0, 48, -11, 9, 63, 81, -44, -100, -38, 81, -46, 14, 67, 42, 48, 74, 100, -48, 36, 79, -44, 16, 53, 68, -66, -38, -76, -11, -26, -63, 29, 34, 61, -10, -84, 27, 70, 86, 7, 78, 81, 51, -76, 98, 79, 97, -13, 60, 76, -72, -38, 49, 53, 55, 13, -52, 98, -20, -17, 4, 76, 47, 17, -15, -38, 88, 3, -52, -30, -100, 40, 78, 22, 83, -39, -69, 57, -72, -52, 72, -71, 43, 67, -82, -83, -100, -23, 14, 74, 93, 12, 13, 65, 78, -38, 31, 28, -93, 56, -46, 2, 30, -69, -91, 9, 61, 23, -14, -46, -69, 77, 34, -8, -93, -36, -44, -34, 86, -29, -47, -34, -50, -4, -9, -93, 61, -66, -5, -13, -23, -69, 19, -55, 43, 95, 64, 81, 41, -46, 75, -94, -27, -94, 60, 50, -16, 46, 11, 24, 46, -65, -72, 87, -19, -99, 28, -54, 96, 47, -90, 29, 94, 18, 39, -81, -96, -64, 65, 36, -48, 71, -2, -15, 7, -77, -20, 57, 19, -42, 27, 13, 14, -87, -92, -61, 93, -76, 2, 100, -79, -97, 53, 85, -72, 8, -3, -64, -26, -31, 45, 27, -16, -59, -1, -60, 65, -67, -84, 64, 52, 21, -25, -14, 16, 5, -15, -74, -44, -70, 33, 67, -3, -89, -48, 98, 37, 72, 44, 53, 89, 21, -55, -37, 29, -47, 6, 92, -50, 80, -65, 14, -75, -72, 48, -90, -61, -90, 63, 12, 86, -62, -47, -3, -46, 10, 51, 49, -32, -45, -68, -65, 47, -20, 89, 8, 100, 53, 93, -28, 100, -61, -84, 28, -40, 70, 3, -59, -76, -62, -66, 30, 7, 71, 78, 1, -3, -89, -82, 0, -57, 86, -52, 88, -84, -27, -44, -46, -54, -89, -39, -21, -18, -93, 48, -20, 17, 97, 99, -76, -12, -89, 42, -42, 53, 8, -75, -54, -69, -91, -85, 98, 44, 50, -75, -15, 34, -87, -22, 16, -94, 36, 14, 75, -29, -42, -19, 15, 66, 45, 86, 2, -84, -87, 58, 51, 7, 87, -56, -3, 30, -64, 70, 67, 82, 7, -62, -86, 19, -97, -8, 52, 40, 60, -85, 69, 7, 25, 93, -46, 69, -67, 57, -88, 40, -83, 59, -5, 22, -62, -55, -72, 89, -39, 84, -85, 83, 20, -91, 57, 52, 2, -17, 32, -36, 76, -98, 72, 41, 19, 57, -33, 45, 89, -64, 52, 75, 92, 80, -28, 42, -52, 20, -13, 95, 39, 86, -64, -40, 70, 23, 97, -62, 83, -38, -55, -13, -90, -39, -24, 52, 98, -49, -97, -42, -29, 47, -8, -38, -47, 16, 9, -27, 6, -44, 68, -98, 19, -95, -96, -96, -47, -54, 76, -92, -2, -81, 21, -40, 22, 62, 77, -19, -39, 44, -98, 59, -88, 19, 24, -12, -28, -33, 41, 0, -3, -90, 4, 83, -34, 22, -72, 36, 94, 52, -25, 69, -92, -61, -76, -96, 38, 86, 23, -63, -29, 32, 75, -11, 45, 97, -64, -41, 75, -73, 96, -20, 13, -61, -56, -39, -8, 14, 85, -34, -45, -61, -3, -61, -10, -68, -95, 46, -21, 67, -9, -4, -42, -42, -53, 68, -88, 6, -56, -12, 80, 69, -1, 90, 54, 65, 87, -94, 32, -56, -43, -70, -78, 69, 37, 59, 6, 80, 57, -62, 58, -19, -1, -99, -24, -89, -62, 93, -88, -55, 54, 12, -84, 3, -3, 87, 91, -13, 8, 62, -31, 57, 98, -27, -38, 55, -41, -22, -64, -79, 95, 47, -5, -33, 91, -84, -89, 49, 44, 37, 17, 92, -79, 19, -51, -87, 91, 74, -72, 63, 79, 24, -94, -72, 38, -68, 33, 10, -22, 59, 78, -43, -75, 73, -72, -97, -2, 40, -62, -86, 18, -72, 56, -26, 15, -69, 29, 74, -17, -79, -74, 94, -20, 25, 83, -9, -80, -54, 0, 86, -17, -95, 46, 84, 96, 30, -100, -43, 23, 65, -86, 61, 88, 62, -37, -76, -77, -89, -83, -86, -74, -29, -41, 73, 44, -8, -48, -93, -22, -74, 73, -51, 98, 30, -8, 91, 71, 80, -77, -41, 21, 30, 47, -55, -86, 52, 98, -84, 25, -17, -92, 65, 75, 87, -38, 16, 29, -13, -29, 38, -37, -29, -80, -83, -37, -19, 9, -6, 65, -69, -90, -56, -68, 1, 68, 35, -90, 78, -13, -60, 44, -25, 20, -55, 59, -21, -47, -15, -9, 47, 60, 67, 59, -4, -99, -68, 57, 60, -24, 15, 53, 49, 2, 93, 65, 2, -11, 73, 21, 42, 5, 18, 71, -52, 3, -40, 94, 22, 33, -92, -95, -28, 2, 59, -60, 13, -93, -29, 77, -9, -39, -17, -39, 10, 26, -94, -17, 31, 33, -43, -79, 53, 26, -98, 26, -60, 87, 5, -87, -89, -14, -89, 40, -76, -56, 21, 46, -46, -1, 72, 35, 18, -48, 82, -69, -50, -57, -19, 97, 45, 49, -64, -5, -45, 4, -42, 30, 55, -66, 88, -8, 81, 90, -4, 34, -25, -52, -7, 58, 85, 88, -77, 47, -64, -97, 7, 25, -81, 87, 51, -51, 76, 78, -5, 4, 63, 16, -3, -35, -22, 61, 63, -95, -62, 69, 14, 85, 24, -89, 30, -83, -61, -80, 42, -2, -75, -93, -1, -14, -59, 71, -87, -23, -99, 18, -64, -32, 65, -60, -39, -41, 24, 10, -87, -17, 29, -31, 44, 22, -12, -73, -35, 62, -96, 92, 67, 83, 63, -56, 50, -54, -70, 38, -91, 94, 17, -87, -21, -8, -91, -25, -7, 4, -100, 32, -81, -93, 70, -100, -44, -37, 17, -73, 20, 6, 64, 74, 64, -52, 19, -57, -45, 55, 10, 33, 7, 88, 47, 13, -23, 29, 100, -64, -81, -75, -72, -100, 18, -66, 97, -42, -32, 60, 78, -89, -81, 80, -58, 25, -51, -72, 84, -62, 83, 70, 77, 50, 71, -63, -17, 50, 27, 25, -56, -49, -21, 77, 23, 18, -93, -16, 28, -93, 56, -5, 1, -96, -15, 74, -67, 92, -46, 18, 70, 57, 13, 44, -75, 35, -54, 12, -25, -29, -12, -55, 95, -68, -100, 46, -70, 41, -48, -53, -32, 4, -11, 89, 93, 91, 97, -38, -28, 60, 68, -12, 75, -88, -28, -24, 58, -33, -3, 24, 1, 31, 1, -82, 97, -19, 40, -78, -18, 8, -26, 28, -13, -47, 98, -12, 42, -36, -25, 98, 42, 48, 46, -41, -8, 60, -52, -66, 71, 1, -90, -2, 99, 9, -27, 93, 73, -92, -98, -16, -75, -29, -53, 93, 97, 55, 16, 53, 52, -89, 32, -53, -64, -57, -86, -58, 75, -14, -31, -55, 7, 22, 70, -80, 50, 6, -21, -54, 16, 23, 42, -76, -65, -50, -86, -33, -80, 40, -82, -67, -23, 24, 95, 16, -49, -74, 56, 55, -66, 35, 43, 5, 63, 57, 45, -99, 76, -24, 31, -11, -12, -7, -94, -6, 7, -27, -62, 40, 58, -30, 90, -45, 69, 88, -59, 83, -65, -17, 95, 17, -94, -47, 28, 71, 19, 72, 5, -54, 22, 40, 18, 49, 17, -80, 36, -75, -92, -86, -91, 21, 20, 24, 69, -29, 51, -52, 53, -10, -64, -33, -51, 51, -82, -1, -41, 66, -12, 45, 46, 63, 82, -32, 74, -52, 7, 60, 18, 48, 49, 75, -64, 42, 62, 98, 59, -90, 37, 100, -23, -24, 84, 52, -99, -37, -66, -94, -16, 45, -34, -59, 17, 24, 66, 68, -77, 87, -55, -82, -33, 1, -59, -69, 66, 8, -65, -4, 63, 30, -28, 35, -4, 22, -31, 68, 95, -88, -52, -41, 29, 87, -96, 71, -74, 59, 48, -93, 99, -51, -34, -57, 24, -43, -98, -15, -31, 29, 71, -99, 1, -66, -3, -71, 15, -93, 49, -57, 85, -65, 96, -24, -70, -54, -46, 5, 89, 57, 20, -46, 43, -89, 44, 43, 39, 35, -98, 43, -71, -78, -9, 14, 3, 17, -96, 3, 7, -36, 20, -71, 48, -17, 97, 49, 99, -69, 60, -85, -63, 41, -65, 50, 13, -35, 4, -16, -99, 100, 92, -26, -34, 79, 89, 50, 53, 95, -46, -95, 62, 49, 70, 42, -15, -41, 0, -89, -52, -59, 65, -19, 72, -66, 57, 57, 33, -34, -21, -94, 79, -87, -28, 42, 48, 62, -35, -10, 29, 62, -81, -91, -76, 93, -76, -47, -68, 63, -6, -87, -36, 9, -21, -47, 24, 79, 30, 68, 33, -76, 40, 16, 35, 48, 95, -76, -22, -33, 72, 87, -89, -69, 27, -5, -9, 40, -70, -23, -81, 45, -41, 90, 33, 59, -8, -58, 29, -41, 50, -70, -96, 61, -91, -12, 29, 25, -90, 77, 58, -45, 100, -18, 36, -2, 48, -28, 55, 89, 14, -94, -21, 43, -4, -97, -97, 2, -61, -84, 0, 2, 23, -49, -49, 63, 23, 65, 77, -38, 15, 90, -39, -94, 54, -9, -87, 98, -15, 32, 82, 29, -39, 48, -22, 48, 37, -43, 19, 66, 32, -36, -88, 80, -19, 72, 59, 63, 87, 38, 90, 48, -49, 82, 16, -75, 95, -67, -49, 11, -19, 79, 56, 65, -59, -80, -59, 40, 12, 4, 91, -84, 19, 36, 68, 28, 29, -41, -53, -72, -4, -91, -43, 87, -80, -73, -67, -93, 86, 99, 76, -22, 44, 87, -14, -13, 72, -32, 59, 71, 92, -14, 0, -93, -24, 99, -14, -58, 28, 8, 78, 51, 51, -84, 32, 47, -80, -43, 58, 9, 38, 79, 42, 34, -73, -50, 85, -96, -96, -7, -5, -93, -37, 37, -63, 10, 11, -20, 35, 3, 52, -28, 93, 77, 94, -52, -65, 25, -33, -23, 4, 68, 21, 18, 89, 13, -91, 48, 63, 39, -10, -99, 17, -88, 80, 59, -6, 43, -69, -69, 23, -90, -91, -86, -84, 67, 45, 82, 100, 52, -42, -23, 23, 13, -79, 57, 71, -69, 78, 73, 12, 19, 48, 21, -69, 18, -62, -89, 74, -83, 48, 40, 48, 25, 35, -55, 3, 34, 50, -15, 49, -12, -79, -9, -72, -88, -99, -72, 79, -74, -51, -6, 50, -13, -57, -79, 70, 64, 88, -4, 83, -98, 90, 17, -82, -78, 56, -71, -62, 7, 10, -76, 27, 10, 35, 5, 85, 43, -29, 28, 7, -96, -98, 92, 31, 3, -37, 5, -3, -91, 48, 27, -55, 54, -35, 68, 11, -88, 36, 63, -15, -11, -43, -47, -89, -87, 20, 61, 80, 20, -81, -26, 43, -31, -45, 0, 85, 31, 10, 24, 31, -81, 37, -77, 53, -64, -47, 2, 48, -63, 73, -97, 87, -44, 72, -81, -84, 18, -30, -97, -87, -98, -21, 85, -46, 31, 19, -77, 61, 57, -19, 46, 58, 87, -41, 46, -52, -38, 9, 49, 51, 8, -25, -71, -43, 16, 58, -1, 91, -82, 75, 72, -7, 82, 12, 82, 45, -38, 15, 12, -54, -44, 17, -56, 60, 44, 97, -97, 47, -54, 42, 97, -54, -23, 23, -26, 2, 36, -11, 43, -32, -40, 37, -51, -98, 6, 12, -7, 17, 97, -20, 8, -50, 46, 69, -66, -55, 53, -32, -8, -37, 64, -52, 48, -27, 91, -96, -1, -31, -11, -97, 25, -62, 62, 28, -77, -44, -1, -31, -60, 81, 73, -41, 7, 87, -44, -70, -17, 51, -65, 57, 51, 7, 5, 57, -15, 34, 62, 82, -87, 19, 37, -21, 43, 81, 5, -31, -57, -28, -56, 83, 6, -17, -19, 6, 84, -80, 95, 77, 60, -94, -31, 26, 42, 59, 47, 42, 75, 98, 48, 69, 53, 19, 27, 41, -44, 64, -43, -80, -19, -32, 30, -14, 64, -52, 46, 14, -12, -16, 27, 39, 88, 68, 60, 77, 16, 95, 26, -30, -15, -68, -20, 51, -40, -40, -3, -73, 85, -58, 68, 66, -15, 76, -84, -3, 97, 97, -3, -36, -27, -16, -96, -99, -79, 11, -44, -35, -27, -3, 43, 11, 78, 24, 66, -15, -25, -13, 67, -63, 87, -42, 37, -2, 91, -38, -52, 91, -69, 34, -80, -81, 53, 26, -33, 9, 15, 42, 19, -22, 15, -9, -87, 54, 24, 67, -43, -73, -75, 12, 90, -35, 52, 30, 99, -57, -4, -59, -95, 66, 79, -78, -12, 22, 77, 70, 46, 96, -50, -90, -89, -27, -93, 51, -60, 63, -16, -29, -46, 36, -54, 42, 75, 3, -59, -41, 97, -89, 29, -94, -21, 30, 8, -98, -74, 13, 6, -61, 60, 28, -93, 0, 59, 23, 75, 6, 0, -97, 97, 9, -82, -69, 36, -89, 38, -55, 18, -85, 28, -38, 8, 18, -80, 57, -88, 61, -97, 55, 1, -42, 27, -74, -32, -76, 30, -4, 95, -76, 47, 61, 53, 25, 32, 88, -92, 15, 77, 33, -41, 71, 20, 38, 93, 74, 7, 7, 100, 30, -25, -71, -80, 55, 89, 60, 62, 79, -67, -60, -50, 74, -19, -43, -26, 84, -78, 75, 27, 49, -84, -32, 7, 38, -7, -86, -10, 62, -68, 24, -85, 61, -35, 67, 55, -54, 66, 97, 100, 47, 23, -100, 99, -14, 27, 90, -34, -97, 85, 52, -54, -63, 42, 90, -80, -44, 16, 80, -55, 41, 44, -62, 36, -2, -24, 14, 33, 50, 86, -10, -3, 19, -55, -63, 41, -1, -29, 89, -66, 46, -71, -23, -17, 12, -76, 67, -13, -87, 53, 1, 49, 75, -18, 9, 78, 30, 69, -82, 100, -73, 72, -30, -38, -28, 23, 18, 20, -82, 74, 41, 19, 65, 80, -40, 63, 67, -71, -92, -37, 60, 19, -49, -12, 41, -48, 86, -23, -60, 95, -33, -93, -99, 4, 24, 9, -15, 68, 19, 26, 82, -85, -39, 12, 75, 57, -89, -66, -90, -37, -51, 48, -32, -53, -81, 0, 94, 71, 60, 100, 88, 36, -33, -66, -36, -93, -56, -14, 74, 67, -25, 81, -25, 73, -54, -86, 4, 46, -75, -49, -8, 49, -80, -50, -63, -81, 56, 78, 31, -46, 98, -9, -73, -97, 49, -25, 72, -34, -15, 93, 61, -10, 82, 4, -100, -29, -14, 65, -95, 52, 44, -40, -89, -95, -74, 35, 23, 5, 92, 84, -8, 8, -2, 67, 41, -66, 75, -17, -45, 76, 40, 88, -52, -55, 12, 89, 35, -58, 47, 23, -4, -11, -62, -16, 76, 91, -39, 5, 6, -47, 25, -92, -13, -64, -52, -60, -84, -13, -80, -50, -42, 66, 82, -60, -62, 40, 91, -90, 46, 38, -24, 26, -55, -56, -100, 67, 7, -82, -25, -29, 99, 88, 8, -89, 88, 60, -56, -11, 2, 96, -93, 52, -10, 73, -14, 57, 74, 76, 74, -17, -19, 45, 93, -33, 60, 26, 63, -19, 46, 55, 67, -17, 12, -25, 21, 42, -60, 66, -99, 90, -72, 4, 93, -50, -26, -91, 41, -50, 17, 100, 20, -62, -73, -98, -17, 97, 54, 16, -99, -8, 65, 30, 43, -7, -61, -99, -20, 68, -89, 62, -36, -46, -56, 0, -39, -52, 26, 52, -78, 51, -63, -73, -80, 81, 6, 45, 63, -2, 72, 18, -28, 80, 21, -71, 87, 7, -3, -69, 94, 94, 55, 71, -22, -60, -38, -78, 3, -26, -53, 59, -44, 17, -1, 23, 60, 51, 66, -67, 83, 55, 64, -94, 95, 64, -45, -36, 92, -54, 47, -82, 56, 87, 45, 62, 70, 25, 38, -52, 12, -63, -37, -32, 35, 61, 75, 15, 83, -36, -70, 31, 12, 8, 77, -32, 57, 19, -13, 86, -34, -26, -56, -97, 53, 54, 73, 6, 91, -50, -51, -95, -42, 24, 42, -71, 69, 21, 24, -64, 69, 23, 0, -66, -14, 33, 95, -83, 100, 12, -72, -24, -42, 74, 25, 44, 8, -79, -33, -32, 64, -52, 40, 61, 8, -15, -48, 22, -14, 78, 30, -59, -3, 59, 8, -50, -16, 73, 26, -80, -57, 38, 2, -33, 28, -9, 90, -77, 24, 40, 10, -3, 38, 78, -84, -2, -19, 3, 51, -82, 64, -16, -93, -73, -96, 44, 0, 63, 17, 46, -37, -10, 16, -3, -90, -47, 72, -54, 39, 48, 38, -96, 83, -81, 68, -55, -89, -31, -84, 14, 46, 53, -53, 7, -49, -5, -31, 82, 1, -26, 60, 89, 50, 42, 54, 91, 78, 80, -19, -9, 78, 74, -97, 34, 8, 62, -53, -28, -29, 15, 72, -20, -20, 12, -5, -29, 46, -38, -63, -34, 86, -32, -88, 74, 88, -70, 13, -79, -8, 70, -34, -47, 37, -59, -37, 25, -80, 93, 68, 51, -66, 83, -71, -44, -54, 62, -82, 13, -93, -75, 12, -30, -71, 34, -34, -36, -65, -76, -64, -100, 42, -64, 40, 35, 32, 87, 27, 100, 26, -100, 63, -66, 93, 90, 3, -78, -92, -67, 73, 27, -97, 57, 1, -26, -2, -29, -98, 41, 87, 72, -67, -56, -40, -18, 22, 1, -85, -35, 67, 44, 18, 61, 23, 43, 1, 87, -35, 93, -88, 83, 10, 58, -67, -62, 94, 35, 19, 25, -46, -74, 17, -48, -62, -36, 44, 57, 80, -88, -80, 46, -48, -82, -44, -76, -70, -20, 82, -78, -69, 89, -27, -91, 99, -47, -49, 47, 59, 13, -87, 77, 55, 9, -48, 51, -22, -79, -71, 90, -97, -42, -93, -89, 18, 58, -67, -19, -3, 26, -26, 4, -52, -22, 84, -8, 53, -83, -5, -63, -14, -13, -51, -93, 68, 33, -32, 71, 20, -37, 56, 55, 38, 20, -36, 6, 46, 36, 54, 61, 71, 95, -1, -19, 42, -50, 40, -18, 76, 97, 11, -45, 78, 64, 44, 85, 56, 60, -41, 19, 82, 37, 74, -78, 48, -88, 0, 60, -77, 7, -90, -84, 95, 74, -76, -7, 100, -80, -17, 39, -64, -59, 44, 0, -53, 2, -73, -60, -2, -54, 45, 4, 23, 98, -88, 40, -1, -70, 29, -85, 36, -28, 65, -47, 83, -1, 8, -14, 72, 61, 36, -93, -94, -65, -83, -98, -73, -31, 71, 48, -73, -47, 81, -36, -1, -80, -88, -44, -52, 17, -47, 37, -48, -57, -54, -48, -27, -55, -88, 64, 1, -77, -99, -20, -1, 41, 37, 62, 52, 30, 10, 1, -84, -89, 81, 15, -77, -72, 70, 52, 21, 87, -11, -36, -17, 18, 55, -85, 74, 3, -9, 85, -74, 80, 69, 86, 74, 61, 64, 33, 34, 52, -68, -46, 85, -94, -44, 25, -89, -85, -58, 16, 34, 10, -50, 100, 59, -26, -93, 99, -56, -42, 31, 3, 94, 56, 56, -3, 55, -22, 23, 71, -97, -11, 3, 36, 18, 32, -45, -5, 77, -26, 42, -69, -73, -79, -84, -42, -11, 98, 5, 84, -75, -76, 37, -56, -18, -90, 80, 99, 3, -33, -6, 55, -36, -52, 74, -49, 1, 81, 87, -44, -54, 58, 73, -75, 13, -96, -17, -49, 4, -47, 60, 77, 65, 54, -86, -40, 21, -80, -55, 96, 33, -63, -39, -15, 89, -23, -55, 40, -98, -95, -8, -93, 71, 7, 60, -26, -24, -51, -90, -6, 55, -31, 68, -85, -33, -2, -53, 83, -37, 86, -11, 89, -25, 38, 0, -12, -83, -82, -46, 1, 17, 53, 33, -97, 7, 14, -72, -42, 24, -3, -84, 6, -58, -21, 93, 61, -93, 40, 5, -93, -5, -7, -36, 70, -62, -20, 86, -17, -13, -15, -8, -15, -57, 36, 64, -27, -65, 0, 55, 69, 70, 69, 3, -35, -46, 99, 75, -10, -79, 0, 54, 20, -8, 94, 7, 40, 72, -91, -92, 81, 54, -67, 28, 59, -12, -8, -30, -34, 47, 16, -7, 62, -2, 12, 2, -10, -11, -84, -83, 72, 15, -8, 80, -10, -19, -33, 92, 13, -100, -43, 53, 8, 47, 15, -14, -91, -42, -60, 4, 32, 21, 92, 44, -79, -3, 68, -33, 96, 38, -45, 78, 48, -2, -25, -75, 14, 46, 8, 87, 98, -54, -30, 53, -61, 32, 48, 31, -78, 5, -17, 42, 15, 8, 35, -60, 11, 46, 11, 2, -55, 55, -33, 21, -86, 64, 28, 94, 10, -77, -74, -61, 90, 88, 63, -77, -77, -97, -34, -67, 84, 76, 80, 15, -78, 8, -32, -6, 80, -39, 68, -44, 87, -47, -31, 0, -44, 37, 67, 34, 2, 65, -16, -40, -98, 27, 78, -15, -54, 95, -25, -63, 63, 68, 96, 40, -14, -43, -51, -71, 89, 0, -76, 11, 54, 78, 84, 25, 22, -54, 17, -62, -85, -79, -47, 48, 99, -85, -42, -70, 69, -69, 86, 61, -92, 38, -91, -84, -33, -53, 79, 10, 52, 22, 48, 0, 1, -36, 90, -50, -65, -20, 26, -13, 93, 3, -86, -5, 66, 22, 97, -100, 50, 21, 66, 25, -44, -20, 61, 68, -28, 40, -31, -95, -17, -49, -98, -20, -38, -52, -25, 11, 74, 8, 82, 91, -36, -20, 94, -86, -1, -69, -5, 27, 95, 45, 12, -18, -58, 15, 62, -23, -43, -68, -87, 61, 88, 31, -42, 56, -18, 33, 20, 76, 67, -18, 92, 96, -74, -21, 33, -88, -37, 89, 46, -21, 22, -58, -12, 47, -6, 95, 71, 50, -99, 19, -79, 14, -44, -29, -94, 83, 18, 94, 13, -85, -18, 78, -29, 23, 12, -89, 25, -48, -26, 32, -74, 39, 44, 33, -4, -96, -44, 55, -23, -32, 17, 19, -42, -68, -39, -51, 11, -82, 96, 22, 93, -54, 66, 95, -68, 40, -17, 81, 34, -22, -87, 46, 27, -47, 47, -72, -77, -19, -38, 4, -44, 35, -39, 56, -84, -35, -95, -43, -32, 55, -39, 68, 96, -19, 68, 76, 76, -30, 30, -91, -3, -12, -66, -99, 23, -77, -27, 65, -79, 53, 70, 82, -62, 56, -81, -60, 81, 47, 7, 46, -17, 10, -35, 57, -48, -67, 49, -34, 33, -74, -91, -28, -5, -53, -31, 86, -1, -42, -99, 56, 95, -36, -18, 53, -91, -48, -22, -42, 49, 78, -53, 48, 22, -79, -1, -3, 57, -76, -73, 92, 12, -56, -33, -94, -52, 36, 63, -18, 28, 37, 63, -28, -55, 5, 59, -69, -95, 75, 65, 44, -27, 13, -74, -47, 77, 62, -16, 26, 52, 55, 10, -86, 31, -8, 22, -28, 54, 53, 46, -9, -84, -58, 20, -60, 69, 77, 67, -62, 12, 50, 10, 79, -54, -38, 9, -32, -58, 75, -67, -61, -40, 77, 94, -39, -43, 60, -26, -85, -19, -7, -53, 37, -19, -63, 26, -82, 63, 86, -38, -24, 73, 30, 1, -36, 19, -10, -93, 78, -28, 33, 6, -12, -62, 12, 87, -73, -4, 81, -64, 36, -19, -45, 86, -16, -99, 88, -43, 6, 22, 87, 67, 63, 13, 6, -64, -22, -9, -83, -3, -38, 49, 38, 85, 84, -97, 34, -40, 6, -47, -13, -33, 28, -46, -98, 65, 20, 28, 1, -63, -16, 56, 32, -9, -80, 98, 94, 8, -54, -17, -18, -66, 95, -32, 28, 95, 39, 87, -74, -45, -78, 52, -80, -40, -38, 21, -49, -13, 52, -46, -55, -69, -46, -5, 32, -65, 9, 76, 5, -43, -62, -21, -4, 12, -40, 36, -95, 8, -66, -62, 49, 68, 17, -96, 69, -14, -25, 94, 57, -44, 26, 100, -72, 64, -14, 40, 59, -55, 15, 11, 50, -56, 44, 3, -16, 93, 33, 7, -83, -7, 49, -68, 57, 25, 59, 69, 21, 37, 14, 63, 61, 100, -73, -90, 66, -54, 26, 46, 17, 42, 25, 55, 51, -29, 6, 36, 74, -68, 89, -82, 94, -27, 67, 74, 92, 56, 77, -3, 40, 28, 61, -8, 75, -53, 76, -37, -40, 56, -62, 27, -13, -75, -84, -30, -88, -32, -75, -52, 94, -94, -43, -52, 2, -48, 92, -39, -84, 70, -76, 30, -72, 16, 59, -75, 23, 43, -76, -47, 55, -28, 19, -45, -36, -8, -15, -21, 68, 7, 78, 17, 98, 56, -18, 46, 93, 68, 72, -86, 30, 38, 80, 73, -71, -44, 45, 78, 27, -53, 93, 35, -79, -95, 84, 3, -65, -22, 15, -44, -52, 72, -19, -35, -24, -56, -22, -81, 91, 22, -34, -18, -98, 81, -37, -61, -42, 82, -39, 31, -41, 15, -26, 21, 6, -5, -10, 57, 29, -39, -52, 36, -9, 58, 23, -40, -53, 52, 63, 35, 100, -43, 0, 11, 72, -39, -62, -43, -2, 91, -57, -72, -42, -30, -9, -92, 26, 33, 56, 85, 44, 43, 30, -80, -37, -11, -65, -39, 69, -25, 69, 88, -88, -90, -47, -85, -93, 3, -42, -44, -61, 86, 29, -7, 37, -57, 38, -21, -20, -99, 77, 39, 14, -11, -78, 45, -39, 12, 27, -39, -63, 94, 65, 94, -40, 28, 72, 55, 48, 21, 9, -88, 54, -1, 34, -79, -27, 80, 31, -78, 18, -31, -17, 0, -17, 60, -73, 35, -100, 64, -38, -79, -31, 24, 48, -5, 62, -22, -96, -41, 19, -55, 77, 75, 33, -45, 9, 86, 56, 98, 3, -24, 45, -99, -93, -26, 81, 24, -63, 75, -74, -81, 39, -58, 88, -70, -10, -40, 94, 8, -10, 62, -6, 42, 43, -88, 12, -66, 86, 48, 81, 57, -53, -66, -15, 65, 58, 51, 13, 76, -1, 59, 82, 85, -2, -98, 96, -16, 24, 37, -18, -76, -33, -40, -72, 26, -82, 70, 93, -27, -40, 70, 52, -81, -53, -14, 51, 38, 9, 82, -73, 96, 90, -42, 32, -50, 48, -89, -51, 31, 12, 69, 65, 52, -87, -69, 38, 88, 45, 54, -46, 81, 19, -26, -80, 71, 32, -14, 68, -42, -12, 81, 49, -18, -36, -37, -30, -97, 92, 42, 3, 49, 74, -8, 73, 41, 77, 47, 77, 11, 60, 18, -42, -58, -89, -61, 17, -81, 65, 30, 55, 83, -11, -7, -88, -35, -64, 76, -35, -65, 81, -75, -26, 99, 7, 67, -58, 49, 47, -93, -72, -61, 57, 27, -17, 15, 82, 43, 73, -39, -94, -56, 86, 83, 75, 54, 80, -13, -28, 62, 78, -64, 18, -44, -93, -6, 16, 9, -81, 23, -48, 18, -89, 76, -84, -37, -59, -7, 56, 46, -90, -3, 77, -30, 7, -43, -67, -81, -51, 1, 37, 59, -49, -86, -17, 30, -64, 25, -61, -29, -61, -45, 50, 3, 38, 9, 91, 35, -8, -7, -45, -41, 37, -62, -73, -52, 63, 24, -88, -65, 0, -75, -15, -97, -19, 91, 65, 26, -13, 26, 19, -79, 29, -70, 18, -90, -55, -5, 89, 96, 91, -91, 67, 27, 51, -2, 71, 11, -41, 89, -14, 44, -36, -44, 82, 5, 80, 83, -92, -79, 40, -12, 75, -83, 14, 67, 44, 42, 5, -86, -38, 66, -88, -20, -69, 36, -61, 47, -19, -24, 100, 90, -25, 71, -63, 87, -30, -53, -83, 43, 82, -62, 95, 86, -12, -39, 40, 8, -20, 33, -24, 87, -11, -87, -6, -47, 31, -62, -29, -76, -24, 59, 86, 90, 65, 19, -48, 94, 55, 30, 49, -5, 65, 99, -29, -39, 84, -95, -69, -2, 37, 30, 86, -25, 76, -42, -70, -8, -32, 89, -49, -12, 26, 68, -70, -17, 26, 49, 31, -88, -56, 26, 69, 13, 76, -81, -20, 81, 63, 28, 42, -84, 51, -43, -29, 8, -78, 73, -29, -93, -42, 10, 86, -88, 66, 55, 88, -85, 18, -99, 44, -71, 2, -88, -5, -7, -19, -88, 70, -7, 48, 11, -46, -20, 67, 15, 42, 100, 79, 7, -48, 27, 79, 57, 60, -44, -49, 36, 81, 10, -100, -57, -26, -3, -92, -69, -86, 39, 84, 35, -29, 54, 89, -89, -36, 6, -59, 89, 14, 38, 2, 70, -6, -84, 59, -16, 67, 50, -45, 33, -15, 77, 1, 64, 91, -47, 99, 76, 14, 38, -13, -52, 48, 14, 93, -38, 3, -18, 2, 55, -84, -95, 46, 83, -73, 93, -63, 18, -64, 14, -33, 76, -58, 63, -43, -88, -49, -43, -69, 4, 87, -18, 85, -2, 3, 83, -73, 28, 69, -53, -61, -4, 90, 99, 13, 31, 65, 54, 36, 10, 43, 83, -25, -70, 18, 41, -76, -67, -34, 51, 17, -28, -75, 47, 91, 3, -91, -34, 51, -96, 94, 85, -74, 12, -86, 62, 4, 80, -57, -75, 74, 61, -6, 77, -17, 39, 31, -14, 75, 82, 11, 28, -12, -35, 57, 30, 21, 48, -17, 76, 15, 89, 15, -63, 42, 9, 79, -55, -76, -80, 20, 21, 32, -31, 12, 6, 11, 7, -54, 95, -10, -83, 48, 3, 50, 91, 94, -61, 37, -12, 79, 99, -40, 91, -96, 21, 80, -46, -64, -45, 86, 1, -8, 96, -28, -42, -99, 92, 3, 87, -50, -71, -90, 7, -25, 66, -11, 22, 99, 90, 91, 88, 24, 81, 21, -7, 100, 2, 85, 83, 61, -70, -49, -12, -25, 28, 82, -79, -61, 0, 10, 28, -36, 90, 81, 69, 48, -22, -79, 65, -2, -93, 89, 74, -84, -84, -11, 40, 44, 65, -20, -23, 72, -95, 62, 9, -87, -29, 88, 42, -47, -74, -88, 58, 62, -41, -95, 96, -43, -52, 50, 61, -75, -54, -96, -81, 33, 97, -42, 91, 45, 31, -84, -87, -88, 34, 27, -57, 18, 42, -82, -38, 62, -20, 62, 46, 47, -1, 62, 59, 21, 75, -57, 3, 51, -40, 24, 44, -30, 6, -51, -36, -2, -69, 63, 40, 97, -43, 27, 41, 64, 11, -33, -61, 86, 43, 89, 31, 72, -11, -73, -5, 93, -70, -98, 35, -77, -86, 70, 58, 100, -56, 93, -93, -30, 7, 14, 2, 24, -44, -71, 45, 13, 96, 16, 66, -41, -3, 70, 25, 72, 50, 96, -7, 33, 83, 21, 7, -97, -8, 50, -95, -69, 5, 45, -86, 67, 21, -5, 100, -95, 11, 19, 22, 90, -34, 5, 38, -58, 44, -5, 31, 90, 95, -20, -60, 32, 59, 97, -66, -79, 92, 49, 11, -90, -98, 36, -41, -25, -14, -87, -83, 12, -28, -78, -18, 24, 74, -32, -54, 15, -71, -76, 55, 11, -76, -27, -43, -7, 18, 26, 68, -76, -23, -2, 15, -53, -91, -2, -90, -16, 48, 72, 34, 91, 25, -37, -99, -25, 20, -59, -47, -26, -85, -83, 86, -11, 43, -95, 84, 7, 74, -53, -59, -25, 87, -24, 31, 29, -42, 54, -74, -22, -29, -94, 90, 10, 18, 73, -38, 23, -89, 40, -58, -84, -38, 19, -65, -93, -32, -11, -65, -73, 17, -8, 74, -25, 0, 57, 50, 43, -87, -30, 79, 23, 24, -64, -72, 94, 42, 74, 73, 79, -82, 5, -80, -37, 64, -74, -46, -72, 47, -76, -31, -38, 63, 29, 49, -85, 45, 96, 81, -1, -71, -56, -82, -67, 40, 70, -39, 17, -1, -79, 79, 79, 10, 63, -28, 46, -63, -31, 15, -22, 84, 47, -92, -69, 31, -51, -19, -96, 47, -14, 25, -26, 64, -79, 85, -33, -57, -67, -24, -59, 36, 5, -6, 34, -33, 46, 58, 27, 62, 84, -16, 88, 58, -18, -6, 80, -69, -35, 86, 15, 37, 29, 93, -41, -84, -5, 43, -85, -55, 66, 58, 6, -13, 28, 38, 18, -16, -97, -30, 53, 10, -51, 39, -6, -9, -36, -54, 80, 5, 98, 29, 5, -77, -97, 7, -82, 53, -61, -51, 70, -26, 94, -89, 94, -74, 12, 81, 93, -52, 43, 29, -41, 81, -71, -17, 65, -73, -76, -5, 24, -91, 87, -59, -61, -24, 4, 17, -59, -54, 64, -79, 84, 6, -74, -60, -21, 61, 59, -12, -35, -89, 67, -28, -25, -11, 100, -91, -5, 75, -81, -62, -41, -35, -36, 78, 23, 63, 51, 54, 29, 58, -44, -23, 93, -72, -86, -89, 0, 55, -17, 24, 2, -77, 48, 37, 9, -23, 0, 45, 41, 61, 27, -43, -25, 49, 97, -65, 72, 63, -79, 26, -21, 88, -1, 83, -5, 60, 72, 63, 47, -83, -63, 94, 50, 8, 22, 43, 86, 96, 95, 48, 3, 97, 39, 43, -20, -14, 41, -40, 98, -55, -69, -86, -57, 44, 68, -47, -57, -3, -96, 8, -74, 15, -14, 3, 22, -22, -58, -4, -70, -2, -84, -18, 9, 81, 89, -69, 67, 40, -66, 32, 100, -72, -31, 52, -6, -79, 93, 72, -32, -12, -29, 28, 71, -14, -5, -26, 66, -47, -13, 56, -47, -85, -2, -81, -55, 94, 92, 26, -43, 80, 10, 28, -20, 93, 56, -17, -31, -93, -72, 11, 78, 60, 30, 87, 62, 96, 7, 8, -81, -28, 66, -97, -82, 1, 72, 70, 40, 40, 87, 84, -15, -49, 10, 80, 8, -15, -58, 99, 99, -59, -11, 14, -75, 50, -58, -24, 55, 36, -81, 83, -62, 78, -89, 82, -90, 53, -59, 54, -90, -63, -3, 70, -82, 91, 33, 73, 15, 12, 69, -36, -2, -29, 86, -49, 17, 74, 19, -94, -90, 2, -40, -33, 52, 39, 53, 1, 9, 39, 70, -50, 16, 64, -55, -48, -13, 20, -88, -12, 24, 17, -47, 84, 15, 17, -97, -26, -52, -94, 9, 21, -90, -9, 81, 72, -78, -73, 10, -44, -75, 52, -47, -72, -4, 63, -87, -23, -66, -71, -9, -84, 94, 57, -8, 72, -22, 9, 78, 1, 5, -54, 80, -37, 65, -37, -14, -94, -79, -20, 68, -27, 37, 84, 34, 24, -51, -49, 60, -100, 80, 87, 61, -97, 44, 31, 70, -97, -100, -30, 77, 100, 88, -66, -93, 51, -65, 77, 22, -58, -74, -69, -23, 20, 45, 55, 56, -85, -2, -54, 86, -70, -97, 64, -84, -62, -53, 73, 75, -62, 31, -71, 57, -79, -35, 7, -89, -65, -83, -11, 80, 98, -100, 26, 85, -11, -14, -11, 33, -31, -57, 99, 51, -15, -82, 0, 45, -6, 0, -71, 69, -68, -89, 17, -7, 54, 66, 36, 48, -25, -72, 60, 89, 16, -86, -99, 79, 16, 71, 81, -83, -98, 34, 70, 65, 64, 85, 60, 7, 86, -6, 21, -90, -33, 22, 95, 12, -3, -8, -79, 93, 71, 26, 33, 69, -76, 84, -16, -46, 43, -6, 41, 66, 55, 78, 18, 76, -92, 85, 72, 49, 59, 96, 96, -59, -48, 86, -27, -62, 21, -86, 98, 56, 22, 10, 30, -18, -91, -9, -72, -66, -95, 39, 10, -63, -24, -8, 46, -34, 35, -93, 21, -17, 74, 31, 78, -16, 94, -56, 35, -14, -85, -24, 94, -92, -41, -23, -24, -30, -86, -30, 1, 68, -79, 51, 12, 71, -100, -91, 9, 99, 83, 12, -51, -89, -12, 87, 53, 11, -23, 68, 63, 20, -78, 70, 33, 96, 70, -76, -83, 89, 40, -58, -23, -73, 45, -42, 87, -38, 84, -9, 78, -45, 54, 59, 10, 36, -33, -55, -34, 53, 35, -95, -77, 75, -7, 72, -88, 96, -76, 47, 17, -19, 10, -19, -35, -56, 13, 74, -38, -25, 13, 10, 82, 46, -66, -48, -75, -87, 17, -56, 71, 92, -50, 70, 18, 50, 83, -82, -19, -25, 82, -9, 87, 86, -68, 46, -73, 22, 79, 25, 76, -64, 53, -2, -3, 26, 67, -21, -63, -24, 25, -14, -47, 49, -85, -73, 62, 87, 72, -55, -29, 82, -16, -75, -16, 52, -36, 33, 50, 14, -37, -14, 70, 6, 50, -5, 57, -24, 45, -14, 48, -44, 2, 50, -10, -56, 71, -13, 14, -54, 67, 78, 69, 34, -51, 75, -17, -10, 33, -10, 36, 8, -44, -70, -80, -11, -61, 11, -56, -24, 76, -14, 47, 0, 16, -9, 44, -73, 68, 93, -76, -43, -60, 33, -26, -63, 33, 72, -26, 41, -35, 67, -98, 16, -2, 51, -82, 45, 91, 15, 24, -13, -66, 89, -100, 52, 72, 76, 25, -12, 43, 46, 50, -76, -85, 81, -28, 28, -59, 46, 61, -21, 3, 82, 45, -67, -12, 24, -56, 33, -80, 21, -31, -5, 4, -53, -62, -70, -91, -71, -83, 87, -13, 24, -28, -86, -97, 90, 67, -92, 8, 36, 53, 31, -85, 42, -2, 20, -49, -32, -96, -81, -22, 45, 10, -99, -8, -88, -97, 69, 8, -27, 88, -6, 4, -93, -34, 90, 9, -92, 16, -90, -2, -59, 40, 63, 19, 40, -89, -64, -27, -28, -49, 98, 29, -45, -41, -78, 2, -61, -37, -16, 50, 56, 78, 96, -12, -70, 77, -81, 82, 29, 52, -88, 21, 2, 5, 18, -31, 94, 85, -2, -19, -26, 17, -17, 91, -32, -42, 87, 25, 10, -39, 43, 27, 4, -33, -86, 82, -66, 82, -87, 76, 1, -1, -94, -71, -52, 43, 10, 78, -29, -21, -18, -59, -84, 90, 72, -94, 54, -91, -67, -65, 52, -95, 51, 45, 33, -72, 25, 52, 82, -20, 73, 51, -26, -75, 26, 14, 25, -73, 30, -26, 65, 88, -23, 78, -11, 75, -80, -47, 83, 2, -42, -29, 78, -81, 11, -42, -30, 36, 8, 28, 56, 90, 99, -45, 95, -66, 22, 30, 3, -94, -74, -100, 98, 71, -14, -60, 22, -26, -59, 16, 60, 77, -38, 64, 86, 26, 75, 32, -53, -98, 15, 74, 89, -2, 15, -87, 90, 11, -40, 58, -6, -84, 23, -77, 15, 50, -19, -51, -22, -22, -31, -74, -86, -51, -65, -93, -22, 30, 89, -54, 4, -3, -5, 88, 59, 15, -88, -100, -67, 89, -22, -23, 20, -8, -3, -19, 98, 58, 91, 52, -63, -87, 35, -10, -47, 29, 0, -12, -45, -7, -8, -17, -16, 88, -79, -66, -85, -51, 21, 27, 12, 70, -84, -21, 85, 29, 31, -16, 66, -7, 33, -20, -32, -32, 47, 91, -85, -50, 4, 64, 100, 96, 69, 84, -35, -92, 6, -1, -15, -37, -79, 61, 82, 56, 65, 9, -4, -83, -30, 92, 26, -4, -100, 31, -97, 24, -19, -74, 70, -42, -69, 60, -73, 5, 4, 82, 87, -31, -39, -67, -14, 13, 5, -45, 12, -88, 83, -83, 81, 12, 70, -62, 88, 69, -22, 45, 50, 81, -71, -3, -43, 95, -34, -30, 45, 5, -94, -61, -31, 92, -33, -52, -49, 13, 6, -72, 48, -23, -92, 74, -25, -59, 78, 83, 78, 97, 27, -81, 54, 65, -29, -36, 81, 12, -77, 27, 74, 98, -18, -38, 84, 82, -41, -2, -39, -71, -79, 25, 56, 68, -59, -3, 92, -70, 57, 11, 45, 21, -84, -63, 41, 9, 83, -79, 94, -45, 18, 46, -44, 71, -66, 13, 24, 28, -49, -16, 97, 64, -36, 78, 28, -80, 80, -85, 22, -40, -47, 67, -75, -21, -36, -1, -27, 91, 70, -84, 20, 86, -78, 34, 71, 80, -30, 7, -22, 61, -55, 95, -23, -85, -30, -5, 46, -99, -91, 77, 24, -20, 39, -31, 49, -69, 4, -17, 28, 81, -43, 97, 45, 33, -56, -4, -78, -78, 53, 34, -22, -57, -74, -75, -4, -65, 8, -46, 91, 84, -32, -40, 29, -46, 21, -4, -21, -14, -63, 18, -23, 56, 53, -66, -22, -34, -14, 56, -67, -4, 68, 68, 50, -30, -98, -43, -69, -70, -19, -58, 34, 4, -100, -40, -87, 79, -95, 2, -91, -30, -11, 57, 48, 25, 87, -4, -27, 14, 90, 69, -50, 91, -45, -60, -69, -86, -39, 54, -73, -37, 86, 85, 29, 26, -65, 13, 98, -88, -86, -12, 87, -79, 90, -27, -76, 0, 75, 70, 16, 65, -60, 72, -13, 67, 9, 19, -4, 44, -44, 29, -5, 20, -39, 36, -33, -20, -84, 16, -51, 11, -7, 67, 85, -16, 48, 45, 82, 56, 51, -27, 8, 44, -83, -59, 0, -56, -19, -84, -28, -87, 76, 56, 31, -19, 47, 19, 19, -54, 6, 7, -92, -22, 54, -86, -82, -11, 79, -75, 53, 53, 73, -9, 76, -19, 80, 30, 93, -59, -82, -84, 60, -25, 76, 83, -38, 30, 6, -52, -46, 53, -2, 99, -49, -1, 16, 17, -94, -55, -55, -1, 43, 51, 88, -47, -39, 28, -52, -76, -91, 17, 43, 85, 99, 56, -9, 33, 43, 47, -21, -30, -23, -58, 53, -11, -23, 98, 60, -75, 20, -56, -38, 94, 79, -33, 53, -99, 41, 7, -71, -52, 39, -57, 60, -88, -23, 25, -3, -75, 48, 55, -53, 67, -35, 100, -14, -22, -78, -20, -53, 23, 29, -17, -81, 86, -55, 30, 82, -89, -61, -35, -1, -23, -85, -18, 61, -57, 33, 91, -1, -79, -83, -89, 79, 22, 16, -50, -30, -53, -82, -95, -17, 54, -48, 6, 0, -53, 34, 86, -32, -90, 42, 91, 30, 21, -32, -78, 80, -64, -92, -86, 30, -8, 97, -84, 53, 48, -29, 48, 20, -90, 65, -29, 5, 24, -66, 18, -87, -87, -91, 39, -63, 7, 18, -67, 68, -91, 21, 44, 44, 94, 89, 14, -100, -89, 2, -97, 69, 40, -3, 5, -16, 20, 31, -19, 96, -82, 29, -89, -20, -27, -3, -95, 35, 24, -50, -90, 90, 84, 26, 39, -28, -99, -93, 38, 23, -48, -91, 11, -93, -65, 5, -87, 81, -15, 48, -51, 66, -81, -14, 34, 36, 28, 53, 65, -63, 88, -57, -15, -57, -27, 18, 89, 21, 33, 44, -50, -63, 51, -50, -91, 19, 99, 48, -31, -16, -44, 25, -62, -68, 86, -83, 83, -44, -5, -53, -59, -74, -27, 9, 79, 69, -69, -75, -76, -26, -78, -44, 79, 25, -14, -70, -37, 98, -68, -99, -83, 74, 60, -17, -66, 78, 13, 45, 9, -13, -29, 24, -71, 71, -48, 37, -14, 79, 76, 38, 93, 85, 63, 60, 74, -88, -61, -12, -33, -59, 46, -7, -82, 85, -78, -47, -36, 39, -77, -67, -48, 35, -83, -44, 11, -96, 53, 57, 81, -88, -18, -72, -98, -11, 3, 22, 85, -25, 29, 7, 55, -19, -24, -99, 26, 34, -75, -13, -85, 50, 67, 87, -28, -69, -86, 40, -96, -27, -49, -24, 68, 80, 9, 77, 42, 5, 26, -94, -61, 55, 59, -2, 42, -16, 97, -36, 31, -90, 7, -75, 88, 64, 50, -16, 67, 50, 22, 43, 88, -33, 3, -21, 58, -48, 5, 52, -57, 39, -11, 0, -4, -92, -89, -32, 81, 81, -73, -45, -2, 96, 9, -24, 2, 5, 8, 11, -43, -23, -26, -59, 65, -33, 80, -68, -30, -45, 4, 99, 0, -50, -27, 70, 20, 42, 65, 42, -96, -18, 81, -50, -91, 39, -97, -6, 45, -21, -65, -76, -3, 63, 0, 94, -92, -40, -48, 45, 70, 62, -38, 20, 4, -97, -8, 68, 72, 77, -73, 69, -21, -25, 15, -32, -3, -100, 66, -5, -84, 11, -10, -13, 62, 73, 69, 66, -11, -52, 89, -63, 50, 49, 31, 76, -42, 100, -33, 98, 29, -52, 25, 58, 10, 67, -53, -50, -58, -3, 82, 76, 23, -21, 84, 10, 42, -74, 95, 91, 57, 63, 94, 12, -15, 13, 23, -52, -25, -46, -45, 95, -6, -57, 58, 85, -14, 80, -17, 50, 55, -85, 64, 48, 44, -64, -24, 46, 57, -56, 45, -39, 63, -1, -49, -82, 8, -57, -94, 71, 16, -33, -67, 93, -32, -46, -91, -59, -60, 96, 21, 37, -91, 1, 87, 27, 78, 48, 35, 92, -9, 12, -23, -16, -71, -52, -92, 44, -32, -43, 84, -39, -49, 88, -61, 65, 70, -38, 46, -51, 60, 40, -23, -4, 89, -58, 76, -65, 21, 7, -91, -6, -95, -44, 28, -30, 85, -80, -9, 26, -21, -45, 15, 47, 81, -76, 55, -96, 19, -80, -83, 74, 97, -44, -8, -82, 27, -4, 92, 30, 69, -80, -61, -34, 52, 26, -46, 79, 71, 8, -3, 83, 82, 11, 97, 14, 16, -14, 100, -20, -35, -82, 34, 17, 90, -59, -59, -42, -81, -28, -84, -74, 74, -99, -38, -39, -1, -82, -84, -32, 66, 16, 98, -20, -62, -65, 67, 72, 31, 52, 96, 57, 95, -72, 100, 95, -50, 51, -87, -32, 45, 69, -44, -89, -84, -71, -13, -2, -78, 28, -22, -69, -92, -86, 55, 51, 87, 62, -74, 8, -25, 47, -36, 76, 8, 28, -91, -54, 22, -42, -5, 89, 2, 23, -15, 45, 11, 73, 59, -74, -83, 66, 76, -19, 71, -29, -47, 61, -30, 63, 45, -63, 86, 36, 100, 99, 78, -66, -19, 32, 41, 57, -97, 66, 91, 52, 55, 93, 49, 58, -78, -53, 47, 24, 65, -46, -33, -13, -100, 34, 84, -6, 39, 5, 32, 7, 77, -59, 1, 23, 39, 2, 45, 93, -27, 7, 21, -84, 95, -30, -39, -60, 18, 61, 97, -56, -43, 78, 25, 61, -57, -86, -23, -31, 77, 0, 59, 94, -98, -15, -27, -50, -34, -25, -8, 75, 44, -94, -88, 19, -35, -97, 37, -13, -84, -49, 33, -32, 36, -80, -77, -97, 51, 86, -98, -33, 0, 67, 75, -47, -66, -45, 7, -61, -33, -55, -23, 40, 54, -95, -84, 63, -2, -20, -99, -24, 79, -35, -49, -9, 70, -79, 10, 6, 82, -34, 87, 85, 39, -32, -17, 2, -62, -88, -60, -44, 80, -89, -88, 19, -4, -44, -61, 17, -21, 27, 72, -66, -98, 19, -96, -90, 25, -30, 16, 83, 37, 5, 15, 61, -34, 99, -70, -26, -30, -35, -31, -60, 90, 59, -81, 84, 77, 52, 39, 98, -62, 44, -56, 38, -31, 24, 50, -10, -31, 65, 29, -17, -12, -22, 12, -8, -29, 64, -52, -49, -68, -79, 13, 32, -83, 65, 17, 16, -64, -37, 37, -22, 69, 22, 75, -57, -19, -14, -85, -47, 1, 62, -3, 55, -99, -7, 40, 68, -42, -32, 18, -9, 80, -56, 47, -77, 88, -10, -7, -43, 54, 53, 27, -94, 69, -54, -48, 86, -63, 96, -48, 42, 53, -53, -6, 46, 36, -37, -8, 81, 24, 78, -62, -97, 25, -98, -37, -72, 15, -90, -4, 1, 85, 54, -80, -62, 1, -55, -35, -10, 63, 10, -19, 22, 92, 90, -2, -66, 58, 55, 2, 28, -76, -58, -17, 94, 90, -50, 29, 25, 91, -32, -92, -99, 61, 87, 88, 58, -91, 13, -25, 63, -16, -52, -31, 76, 30, 32, 88, -11, -75, -29, -96, -86, 22, 43, -100, 43, 64, -98, 79, -54, -6, -88, 19, -46, 48, -35, 81, 54, 65, -11, 85, -39, 1, 73, 38, 99, -93, -4, 16, 98, -37, -80, 99, 14, 90, -16, 91, -81, -93, -43, -55, -70, -8, -92, -86, -7, 53, 37, -72, -21, -65, -17, 8, 17, -64, -15, -30, 50, 68, -8, -21, 1, 55, 75, 65, 58, -87, 16, -28, -10, -11, -72, 78, -52, 70, -29, 32, -59, 34, -59, 63, 4, -74, -43, -55, -35, -76, -28, 16, 54, 28, -14, -27, 69, 79, 52, 81, 24, -34, -95, 24, -43, -31, -48, -35, -43, -19, -14, -99, 49, -64, 47, 2, -77, 11, -36, 92, 28, 16, 15, 4, -98, -55, -46, -26, 91, -56, 53, -24, 92, -77, -66, -77, -73, -85, -42, 81, 43, -86, -90, 92, -22, 14, -33, -58, -32, 40, 37, -26, 2, -60, 77, 98, -42, -62, -98, -94, -52, -75, 60, 0, 75, -22, -99, 26, 98, 59, 31, -81, 16, 63, -69, -73, -24, -100, 87, -45, -66, 11, -71, -47, -65, 82, -21, -43, -18, -36, -32, 27, -50, -79, 6, 8, 15, 0, 80, -1, 63, -33, -65, 79, 80, 77, 68, 45, -79, -35, -80, -1, 27, -57, 2, -54, -62, -72, -47, -11, -16, -84, -21, 87, 58, -28, -52, 0, -99, 75, 41, -42, -4, -2, 85, 2, 85, 78, -99, -60, 22, -19, 43, 31, 39, -72, 34, -87, -89, -2, 32, -20, 5, -69, -27, 70, -20, -32, -56, 5, 36, 76, 60, -1, 45, -92, -39, 84, -72, 24, 13, 52, 42, 33, 19, 69, 56, -22, -8, -97, -19, 84, 76, 71, -26, -87, 30, 13, -39, 5, -37, 1, 72, 5, 85, -81, -43, 11, -44, 95, 18, -4, -9, -49, -64, -93, -57, -3, 32, 17, -32, 58, -56, 36, -69, -68, 25, -34, -71, 13, -72, 30, 84, -71, 36, 53, 29, -39, -98, 73, -33, -76, 78, 40, -57, 62, -46, 36, 29, 88, -60, 71, -37, -70, -54, 29, -5, -24, 9, -32, -43, 5, -57, -27, -45, 70, 26, 61, -71, -30, 97, 17, -46, -34, 40, -98, -75, -44, 25, 51, -48, 97, -58, 87, 85, -52, -59, 93, -90, 2, -3, 45, -16, -1, 3, 79, -55, -57, -79, 80, 86, 13, 24, 23, -71, -93, -3, -44, 10, -28, 14, -81, -76, -82, -96, -26, 27, -29, 54, -61, -75, -74, 89, -18, 27, 77, 69, 56, 66, 87, 68, -68, -4, 10, -85, -78, 34, -75, -5, -89, -29, 32, 5, 16, 96, 76, -75, 32, -79, -88, 55, 60, 6, -78, -4, -83, 16, -71, -75, 43, -62, 60, 53, 75, 92, 65, 29, 12, 33, -55, -51, 65, 5, 45, 54, 68, -29, -27, -84, 89, 56, 85, -31, 49, -95, -75, 66, 39, -2, 41, -79, -50, 50, 75, 98, 3, 77, -12, 40, 37, 82, -92, -22, -49, 29, 52, -88, -50, 85, -67, -66, 30, 19, 86, -31, 75, 91, 46, -34, 2, -28, 15, 32, -34, 38, 20, -7, 95, 96, 28, -10, -9, -38, -72, -89, -24, -60, 29, -64, 72, 75, -77, -2, 49, -1, 38, -43, 73, -72, 62, 42, -41, -6, -59, -58, -27, 76, 91, 59, -37, -99, 51, -35, 65, -70, 14, -75, -72, 94, -23, -76, -53, -36, 80, -34, -11, 45, 36, -63, -14, 48, -36, 48, -74, 5, 22, 97, -57, -1, -73, 72, -84, 26, 22, 67, 30, -25, 93, -55, 57, -32, 36, -16, -90, -32, -2, -10, 93, 58, 60, 66, -7, 73, 64, 14, 87, -70, -90, -14, 20, 29, 4, -74, -99, 2, 0, -80, -43, 32, 79, 72, -16, -8, -81, -40, -63, 47, -76, 29, 20, 59, -75, 97, 68, -34, -100, -50, -96, -88, 46, 39, -53, 52, -44, 14, -66, -25, -7, -96, -79, 2, 84, 74, 81, 30, 23, -48, 58, -32, 3, 60, 99, 77, -85, 15, -25, 8, -62, -12, 73, 11, -54, 71, 36, 27, 77, -24, 87, -86, -65, -38, -32, 68, -27, -77, -52, 45, -94, -97, -11, 96, -41, -46, -85, -72, 50, -87, -22, 76, -68, 52, -80, 44, -78, -44, 85, 41, -8, -81, 57, -82, 80, 2, 83, -24, 50, 89, -68, -83, -28, 60, 59, 88, 81, -84, -82, -31, 19, 0, -67, -17, 52, 95, -27, -13, -16, -90, -10, 43, 88, 26, 12, -21, -94, -85, -85, 67, -89, -66, -80, 77, 70, -84, -69, -60, 33, -74, 47, 52, -35, 36, -9, 80, -40, 65, -98, 97, 2, -46, -100, 0, 97, -56, 74, -75, 20, 41, 81, 98, -55, 21, -70, -42, -72, 5, -84, 41, 63, 85, -77, 8, 90, -10, -76, 86, -69, 15, -19, 9, 45, -64, -75, 36, -37, -29, 47, 81, 5, -15, 57, -48, -9, -2, 90, -90, -70, 76, -1, -14, 46, 39, -86, 58, 70, 0, 64, -72, 13, 6, 53, 7, 29, -17, -86, 31, -51, 65, -78, -42, -11, 14, -26, 55, 93, 22, 35, 56, 38, -83, 82, -51, 41, 17, 36, 38, 90, 7, -34, 80, 66, -23, 83, 55, -26, -62, -76, -80, 37, 70, -86, -53, -15, 48, 87, 15, -51, 50, 40, -32, -97, -23, 99, -92, 20, 14, 62, 0, 48, 85, 45, -4, 99, -20, -58, -6, -95, -34, 39, -1, -89, -35, -99, 42, 50, 56, -20, 34, 55, 41, 71, 57, 59, -31, 14, -13, -95, -74, -19, -13, 19, -77, 1, -67, 67, -54, -77, -36, -83, -57, -25, -44, 6, 55, 23, 98, 50, 61, 38, 62, 15, -8, -59, -73, 22, -77, 35, 5, 17, -48, 99, 31, -1, -96, -52, -3, -71, -29, 2, -38, 74, -75, 84, -64, -94, 26, 67, -9, 66, 89, 2, -48, 31, 7, 11, 52, -94, 55, 96, -34, 7, 10, 47, -18, 23, 38, 3, -34, -94, 50, 88, 98, 9, -67, 5, 46, -43, -92, -53, 14, -60, -53, 72, -76, 15, -23, 7, -76, 46, -62, 18, -22, -21, -74, 3, -27, 90, -33, 46, -73, 22, 60, 37, -18, -71, -79, -98, 0, 4, 75, -99, -47, -95, 6, 67, 22, -99, 100, 10, -99, -8, 82, 99, 0, 87, -4, 10, -95, 26, 3, 46, 54, -100, -68, -61, -69, 96, -84, 25, -93, -44, -59, -3, 36, 19, -14, 62, 98, 80, -47, -17, -76, -34, 89, 82, 73, 51, -55, -79, 38, 75, -93, -62, 62, -52, -55, -63, 35, -47, 64, -9, -61, -67, -5, -22, 26, -84, 60, 74, 9, -49, 17, -92, -68, 87, 12, 48, 85, -16, 96, -91, -95, 14, 20, 40, -36, -81, -44, -55, 35, -91, 100, 12, 94, 38, -89, 37, 52, 76, 76, -90, 89, 17, 63, -62, -48, -45, 3, 28, -45, 17, 31, -71, -89, -66, -24, 79, 58, 1, -14, 95, -49, -21, 34, -79, -26, 83, -43, -8, 91, 2, 39, -94, 27, -46, 5, -39, -11, 100, -3, -24, 82, 18, -65, -12, 51, 71, 44, 29, 40, 58, -8, 13, -73, 87, 54, 42, -68, -81, 69, 39, 0, 100, -78, 99, 11, -87, -10, 52, -24, -16, 8, -70, 21, 6, -47, 32, 40, 55, -58, -12, 14, -2, -54, -30, 65, -34, -39, 8, 66, -64, 18, -15, 25, 35, -49, -10, -68, -20, -59, 11, 25, 54, 35, 50, 5, 24, 12, -37, 22, 13, -81, -85, 44, -82, 19, 35, 65, -63, 80, -8, 4, -1, -11, 58, -57, 87, -25, 44, -22, -28, 66, 69, 75, 39, -5, -12, 2, 45, -95, 21, 70, 15, 62, 81, -39, 96, 43, 35, -12, -5, 25, -11, -15, 58, 37, 83, 20, -25, -9, -31, 47, 32, -78, 36, -43, 86, 81, -55, -79, 91, -93, 22, -81, 78, -23, -62, -64, 77, 61, -26, 17, 3, 60, -70, 22, -47, 71, -67, 98, 21, 12, -39, -78, -55, -45, 34, 17, 88, 30, 65, 61, 12, -57, 27, 7, 57, -84, -42, 37, -2, -17, 45, -56, 7, 86, -39, -42, 76, 90, 59, 37, -90, 1, -31, 22, 89, 74, -67, 0, 44, 3, 81, -61, -82, -34, -19, 80, -37, -18, -54, -95, -85, 99, 45, 79, 75, 70, -62, 76, 12, 39, 37, -30, 9, -46, 28, -52, 63, -80, -64, 15, -77, -46, -76, 34, 26, -8, -7, -30, 98, 21, -77, -90, -28, -89, -66, 90, 95, 84, 40, -78, -18, 66, -13, -21, -4, 39, -67, 98, -26, 58, 27, 89, 40, -70, 29, 2, -86, -44, -26, -67, 2, 95, -26, -72, 93, -85, 66, -24, -64, -20, 48, 71, 23, -82, 98, 1, 35, -24, 93, -60, 97, -40, -75, -30, 2, -31, 6, 56, 6, 2, 93, -82, -33, 85, -31, 12, -44, 64, -40, -9, -71, 98, 100, 52, 26, 92, 14, -95, -83, -91, -9, 38, 92, -24, 0, -17, 92, -49, 94, -70, 44, 82, 9, -8, 63, 53, -48, 44, -15, 52, -99, -15, 32, -97, 63, -95, 48, 17, -12, 53, 82, 66, 60, -87, -45, -20, 48, -55, 43, -85, 19, -17, 56, -93, -13, 30, -82, -4, -35, -22, -15, 23, 49, -55, 12, -10, 40, -68, 32, -24, 54, 20, 27, -23, 51, -34, 14, -38, 12, -7, -53, 90, -89, 55, 71, 70, 44, -61, 76, -16, -44, -14, -17, 91, 84, 20, -27, 6, 23, 97, -1, -58, 18, -78, 54, 85, -64, 33, -36, 33, 77, -79, 4, -13, 52, 24, -22, -11, 99, -50, 75, 1, 97, 5, 92, -41, -55, -65, 85, 65, -90, -89, 69, -62, 98, 38, -65, -49, -70, -68, 40, 45, 68, -43, 83, 51, 100, 27, -70, -46, -91, 87, 29, -86, -98, -58, 58, 97, -34, -45, -38, -86, 8, 15, -9, 37, 65, -54, -44, -51, -30, 42, 45, -19, 15, 4, -13, -99, 3, -17, -58, 53, -30, 65, -7, -59, 32, 38, -36, -67, 19, -100, 29, 47, -40, 48, -13, -33, 26, 39, -79, 47, -19, 28, -71, 25, -4, -77, -87, -65, 96, -77, 87, -6, -46, -77, 51, 81, -75, 93, -21, 65, -36, -26, 78, 62, -58, -72, 64, -20, 85, -47, -62, -59, 55, -72, 70, 30, 37, 86, 41, 74, -59, -7, 59, -69, 69, 59, -75, 14, 28, -45, 21, 5, 29, -20, 57, 19, 98, -49, -10, 36, -79, -67, 9, -52, 28, -28, -17, -48, -1, 23, 67, -56, 95, 36, 4, 49, 45, 5, -58, 66, 100, 33, -53, 25, -94, 96, -85, 28, 14, -64, 64, 24, -20, 91, -39, -29, 88, 24, 60, -35, -71, -81, 87, -19, 6, 51, 31, -64, 31, -24, -12, 45, -13, 93, 75, -68, -43, 100, -73, -66, 24, 37, -36, -59, -16, 36, 87, 10, -86, 84, -32, 4, 49, -37, -60, -30, -45, 50, -76, 4, 33, 18, 61, 90, -92, -41, 24, -52, -50, 87, -31, -64, -70, 68, -39, -8, 85, -87, 63, 63, -22, -93, 53, -65, -53, -16, -73, 95, 89, -50, 3, 69, 0, -72, 26, -19, -91, 5, 66, -100, -62, -80, -36, -86, 31, 87, -40, 47, 37, -14, 4, -67, 23, 9, 75, -68, -3, -40, -91, 81, -17, -36, -24, -100, 32, -21, -86, -73, -78, 8, 6, 44, 12, -3, 40, 41, 38, -73, -59, -2, -40, 22, -37, -70, -20, 100, -91, -93, 48, -42, 77, 96, 97, -71, 44, -81, -53, 100, 29, -64, 28, 31, -1, -47, 21, -76, 30, -92, -67, -58, -27, -7, -79, -31, 29, -7, 93, -69, 5, 43, -100, -29, 75, -51, 40, -86, -48, 71, -93, -27, -55, -32, 13, 46, 65, 22, 38, 16, -58, -81, 47, -80, -19, -44, 77, -27, -3, 53, 57, 100, 9, 14, 58, -59, -33, 88, 88, -31, -23, 95, -11, 10, 11, 2, 44, -82, 78, -31, -38, -26, 57, 52, 3, -26, 27, 98, 53, -45, -79, -12, -82, 58, -75, 69, 68, -78, -54, -88, -35, 93, 43, -28, 55, -24, 62, 68, -70, -16, 59, 81, 99, -42, -60, 11, 93, -5, 81, 67, 21, 55, 64, 4, 92, -27, 82, 31, -2, 25, 37, 74, -26, -87, -63, 39, -56, 44, 62, 93, -26, 68, 94, -72, -83, -81, -87, 61, 76, -47, -70, -43, 3, 69, 85, 27, 57, -76, 90, -82, 99, 35, -98, 94, -15, 44, 41, -92, 89, -7, 48, 64, 38, -81, -66, -48, 74, 9, 79, 35, -97, 54, 71, 67, 1, -54, -7, 71, -53, -10, 79, -17, -33, 38, 24, -28, -97, -25, -28, -24, -53, 53, 1, 5, -24, -62, -43, -82, -13, 12, -24, -24, 85, -73, -35, -91, 25, -43, 100, 41, 24, 11, -17, 42, -5, -68, 44, 51, 57, 89, 40, 89, -54, 11, 43, 93, -58, -93, -98, 24, -89, -17, -85, -23, -42, 76, -38, 89, -52, -50, -68, -71, 86, -25, -86, -19, -9, -78, -7, -56, -39, 98, -86, -55, -37, 73, 83, 71, -26, 56, 89, -49, 81, -13, -44, -18, -35, 49, -81, -68, -29, -76, -55, -28, -3, -44, -14, 32, -46, -40, -12, -93, -85, 75, 15, -40, -86, 92, 49, 30, 1, -47, -87, -65, 4, -19, -34, -91, -52, 10, -36, -44, -74, 12, 32, -30, -18, -44, 19, -8, -86, 10, 0, 18, -25, 57, -81, 64, 30, -28, 21, -60, 66, 53, 29, -78, -78, 43, -92, -88, 55, 54, -50, -37, -49, -63, -1, 92, 45, 90, -50, 36, 40, 67, -46, 8, 70, -57, 9, 95, 60, 51, 63, 27, 4, -91, -1, 47, 8, 7, 39, 89, 45, -7, -38, -17, -76, -89, 48, -76, -90, -37, 100, 25, -51, 89, -12, -2, 15, -5, 76, -87, -100, -76, 86, -29, -32, 32, 4, 46, -78, -92, 17, -7, 77, 43, -68, 29, -87, -100, -11, 85, -12, 43, -11, 74, 71, -87, 51, 10, 82, 42, -18, -29, 61, 29, -74, -27, -2, -29, -78, -33, 41, 90, 16, 5, -8, -36, -33, 27, -38, 12, -11, -20, 2, 91, 59, 15, -88, 93, 23, 46, 51, -13, -90, 86, -86, -91, -60, 54, 87, -28, -49, 27, -73, -36, -84, -6, 71, 37, -38, 74, -63, -31, 3, -48, 71, 18, -27, -47, -81, -22, -70, 34, -43, 4, -91, -91, -62, 55, 57, -64, 18, -34, -58, -49, 0, -45, -25, -33, 36, 5, 24, -9, -78, 90, 8, -40, 67, -57, 51, 78, 85, 60, -85, -79, -44, -39, 6, -30, -11, -29, -31, -71, 2, 50, -69, -15, -44, 8, -92, -70, -30, 36, -88, 85, 30, -66, -80, -37, -6, 79, -67, 20, 62, -86, 19, -5, -95, 8, -4, -69, 79, -18, 55, 17, 91, -22, -23, 46, 6, 25, -86, 33, -28, 0, -3, 65, -75, -9, 24, 78, -28, 22, -48, 83, 86, 97, -23, -9, 85, -13, -88, -58, -25, -50, -82, 48, 21, -77, -75, 72, 55, 19, -19, -1, 56, -84, -33, -57, -40, 22, -8, 95, -27, 52, -34, 10, -99, -12, 76, 97, -75, 99, -2, -74, -12, 45, 81, -100, 88, 2, 30, 95, -60, 64, -50, -86, -93, -63, 13, -18, -45, 74, 2, 37, 1, -23, 76, 68, -18, -71, -96, 18, 98, -70, 79, -78, -53, 8, -61, -95, -63, 68, -1, -74, -32, -44, -84, -30, -54, -22, 9, -88, 38, 23, 8, -11, -15, -9, -77, -28, -97, 12, -55, -83, -58, 60, -8, 2, 23, -91, -28, 86, -70, 55, -41, 30, 17, 82, -87, 85, 42, -99, -77, -37, 98, -1, 13, -77, 54, 64, -10, 66, 90, -75, -36, 19, -97, 56, -100, -51, 9, 38, -27, 86, -39, -20, 63, -45, 10, -80, 40, -92, 38, -31, 28, 17, 97, -45, -70, -64, 74, -10, 13, 27, 74, 21, -32, 85, -65, -69, -37, 98, 69, -53, -20, 57, 48, -41, 40, -100, -36, -68, -63, -76, 53, -42, 60, 0, 26, -60, 57, -44, 76, -53, -29, 76, 74, -45, -36, -89, -32, 33, -12, 92, -76, -100, 59, 30, -52, 46, -41, 56, 77, -99, -28, 83, 44, 87, 9, 63, -40, -84, -52, -25, 87, 47, 77, 30, -58, -44, -51, 95, 77, -64, -55, 69, -86, 60, -21, 38, 47, -77, 24, 91, 17, -21, -7, -36, -13, -13, 100, 44, 25, -12, -40, -86, -7, -50, -74, -27, -40, 85, -70, -89, -55, 58, -69, 59, 80, -40, -55, -16, -21, 34, -97, -49, 58, 11, -65, 81, -47, 18, 26, -84, -26, 57, 4, 49, 16, -58, 11, 14, -74, -64, -55, 12, -66, 31, -21, -21, 53, 20, 46, 21, -20, 72, 53, 49, 18, -43, -38, 55, 92, 71, -1, 70, 64, -35, 44, 67, 65, -16, 88, 36, 88, 43, 22, -99, 5, 7, -29, 70, 25, 69, -44, -20, 94, 57, 40, -82, -94, 36, -47, 3, -15, -19, -40, -14, -99, 77, -70, -68, -21, -90, 60, 27, 34, 27, -70, 75, 25, -54, 80, 6, -82, -20, 22, 33, 6, -52, -28, -51, -20, -6, -89, -78, -47, 17, 96, -42, 63, -98, -43, 82, -44, 44, 66, -11, 95, -46, -56, -100, -80, -80, -49, -19, 70, 79, -34, 12, -57, 59, -91, -37, -32, -33, -73, 80, 15, -50, 80, -97, -22, -84, 7, 94, -27, 74, 83, -78, -83, 28, -66, -37, 85, -42, -100, 30, -34, -64, -72, -12, 60, -1, 88, 21, -11, 31, -87, 60, 49, 75, 30, -16, 50, 95, -80, 70, -75, -60, 21, -63, -13, -90, -72, -41, 94, 92, -40, 46, 73, 76, -79, -23, 12, 84, 22, 41, -57, 43, -4, -24, 39, -46, -50, 1, 66, 60, 60, -72, -32, 97, 58, -21, -70, 11, -55, -4, -49, 37, -27, -60, -24, 30, 86, 13, -49, 61, 76, 55, -14, 8, 40, -32, 19, -34, -40, 87, -30, 51, 90, 88, 50, -71, 87, 45, -5, -45, -48, -94, -4, 96, 12, 24, 99, 79, 31, 61, 96, 60, 20, 96, -63, 21, -75, 28, -97, -62, -47, 60, -68, 99, -81, -85, 48, 72, 26, -14, -19, -39, -70, -59, -89, -36, -28, 30, 14, 36, 5, 78, -85, -23, 24, 30, 51, 100, 40, 29, 98, 11, 26, -80, 46, -12, -54, 49, 60, 59, 91, -16, 66, 27, -29, -59, -92, -76, -99, -82, -81, -31, -84, 23, -12, 95, -7, -17, 30, -14, -50, -19, 53, 83, 91, -93, 64, 20, 54, 72, -97, -15, 27, 9, -2, -64, -30, -68, -70, 82, 24, -89, -90, -13, -29, -69, -44, 65, 87, -15, -82, 15, 83, -87, -68, -91, -21, 91, -37, 89, -33, -9, 24, 70, -21, -42, 79, -4, -82, 48, -79, -92, -92, 100, -74, -84, 71, -56, -93, 45, 24, 22, -68, -100, -95, -60, 82, -96, 86, -21, -83, 76, -19, -36, -18, 81, 88, 35, 30, -76, -32, 82, 67, -19, 77, 16, -6, -68, 10, 45, 24, 84, -85, -21, -63, 68, 34, -23, 80, -38, 11, -12, 59, -63, 49, 43, -49, -72, 43, -25, 44, -37, -10, -12, -88, -29, 83, -96, -89, 68, -98, -68, 20, -51, 83, 36, 77, -72, -62, -10, -1, 72, -84, -45, -55, -34, 96, 41, -34, -78, -7, 88, 50, 54, -47, 37, -24, -85, -60, -3, 82, 27, -40, -15, 17, -1, -52, 100, 79, -99, 19, 77, 22, -15, 70, -24, 35, -42, 92, -89, -97, 16, -6, 24, -60, 22, -94, -32, -32, -20, -71, -28, -95, -12, 46, -35, -91, 43, -64, -24, -24, -69, -54, 9, 99, 70, 19, 63, 53, -91, 58, -4, 56, -96, -24, -100, 30, -34, 98, 62, -86, 94, -8, -71, 2, -19, -26, 70, -41, -61, 92, 56, -27, 20, 46, -98, -65, -58, 42, 68, 14, 8, -11, 63, -17, -24, 60, -96, -23, -10, -14, -87, 3, 95, -18, 74, -47, 31, -6, -92, -48, -24, -41, -55, -47, -27, 11, -6, 64, -78, -74, -31, 93, 8, 88, -24, 78, -51, 23, -82, -100, -61, 59, -79, 11, 93, -61, -63, -53, 82, -26, 82, 78, 6, 87, -93, -15, -33, -26, 99, 36, -11, 29, -21, -6, -31, -11, -42, 46, -73, -29, -87, -77, 11, -57, -45, 19, 78, -69, 77, 68, 93, -76, 15, 88, -35, -59, 92, 63, -25, 36, 63, -63, 60, 69, -40, 73, -12, 88, -83, -31, -19, 15, -21, -86, 75, 99, -88, 18, -58, 87, -44, 98, -84, 77, -69, 49, -46, 84, -88, -54, -14, -39, 81, -72, -79, -36, -72, -53, -96, 62, 0, -30, 73, 62, 72, 40, 37, -35, 97, -29, -76, 71, -41, 74, -61, -94, 73, 50, -55, -15, 40, -80, -100, 22, 46, 24, 87, -68, -97, -98, -10, -49, -73, -31, 97, 82, -44, 7, 43, -77, 96, 68, -24, 74, -25, -32, 0, 58, -9, -9, -71, -83, -57, 54, -2, 53, 20, 14, -41, 45, -45, -70, 0, -42, 23, 29, -4, 66, 88, 6, 90, -83, 44, 66, -30, 5, -47, -7, -25, -66, -90, -40, -57, 20, -33, -76, 75, 59, -17, 13, 31, 65, 90, 74, -100, 30, -15, -39, -37, 44, 25, 4, -39, -66, -88, 62, -58, 29, 83, 10, 27, -50, 81, 43, 45, 34, -56, 63, 68, -59, 34, -86, -41, -61, 64, 93, 11, 82, -24, 4, 6, 21, -21, 24, 83, 71, 84, 33, -69, 7, 13, 45, -33, 26, 100, 34, 13, -93, -37, 34, -60, -61, -98, 44, 93, 9, 13, 11, 79, 49, -97, 33, 65, -75, 38, -84, -9, -70, 62, 43, 6, 45, 10, 0, 11, -39, 11, 54, 62, 15, 72, -66, -73, 2, 24, 1, 36, 42, -80, -49, 62, -4, -50, -18, -46, -24, 26, 71, 92, -8, -13, -21, 52, -9, -54, 83, -63, 38, 94, -86, -100, 34, -100, -52, -5, 100, 56, -75, -14, 72, -8, 1, -30, 39, -6, 59, 17, 47, 18, -50, -20, -65, -34, 28, 13, 54, 10, 67, 41, -1, 96, 8, 19, -22, 33, 60, 82, -82, 26, -72, 88, 97, -77, 50, -91, 81, 4, 68, 76, 44, 83, 72, 57, 71, -46, 46, 56, -99, 63, 46, 34, 53, 10, -63, 30, 1, 93, -6, -9, -30, 70, 89, 98, -77, 66, -33, 27, -8, -57, 32, -46, 57, -72, 53, 53, -64, 14, 80, 57, -98, 21, -58, -94, 24, -52, 20, -28, -60, 5, -24, 81, 26, 96, -10, 54, -93, -69, -37, 37, -88, 90, -8, 62, -40, 81, -93, -72, -6, -60, 57, 48, -90, -99, 77, 68, 93, 30, -21, 78, 95, -14, 52, 57, 5, 38, -84, 53, -78, 83, 79, -53, -81, -99, -13, -70, 54, 29, -23, -97, 40, 62, 27, 99, 93, 33, -70, 37, -80, -78, 30, 59, 47, -72, 4, -49, 14, 73, 61, 0, -17, -40, 24, 99, -30, -31, 38, 7, 90, -80, 30, -19, -13, 10, -91, 54, -89, -94, 44, 92, 91, 13, -75, -86, -68, -39, -54, -6, -66, 92, 99, -25, 22, -18, -76, -44, -69, -38, -89, -38, -24, -9, -100, 78, -31, 35, 95, 32, -15, -62, -78, -33, 79, -97, 25, 74, -80, 83, 4, -35, 86, -94, -52, -85, 44, -17, -14, -3, -26, -67, 60, -75, -35, 24, -38, -14, -60, 85, -3, 23, -22, -91, -86, -59, -8, 84, -84, 87, -92, 13, -65, 100, -65, -53, -50, -4, 18, -6, -31, -27, -21, -33, 49, -24, 15, -95, 53, -26, -13, -98, -49, -27, 24, 87, 90, -36, -49, -25, 41, -12, -29, -33, 55, 98, 37, 14, -44, -35, -11, -51, -87, -85, 81, 70, -59, 9, -79, -33, -82, -35, 66, -28, 46, 43, -47, 52, 11, -83, 50, 16, -16, 38, -62, 4, -33, -76, 90, 57, 72, 22, 20, -40, -1, -50, -3, 36, -99, -96, 89, 96, 79, -15, 32, 86, -33, -92, -8, 49, 54, 37, 24, -40, -50, -91, 33, -39, 12, 32, 21, 97, 90, 22, 83, 86, -38, 10, -12, 86, -50, 77, 31, 3, 22, -53, -69, 19, 78, 79, -2, -27, -67, 63, -31, 70, 9, -85, -42, 80, -82, -6, 12, -60, -20, 74, 2, -47, 82, -6, 46, -39, -2, -8, 86, -36, -33, -73, -83, -75, 3, 46, -46, 18, 23, 84, 33, 28, -93, -50, -16, -76, 74, 82, 91, -18, -8, 16, 37, -45, -89, 60, 19, -30, -84, 88, 21, 23, -91, -70, -41, -31, -84, -51, -64, 89, 17, 99, 56, 59, -21, -90, 33, 22, -66, -68, -83, 64, -88, -11, 9, 91, -100, -38, -67, 2, -91, 27, -94, -45, -21, 64, 56, -89, 44, -53, -75, 11, 21, -89, 48, -59, -40, -43, 81, -67, -94, 8, -66, -86, 92, -76, -42, -22, -15, 33, 79, -13, 48, -30, 20, -8, -5, -69, -48, -42, -32, 89, 31, -15, -83, -20, 13, 83, -77, -35, 40, -39, -47, 42, 96, 30, -64, -64, 30, 90, -66, 79, 23, 55, -83, 21, 63, 60, 91, 53, -53, 67, -84, 67, 34, -44, -93, 27, 16, -45, 25, 58, -42, -43, 39, 75, 58, 7, 90, -27, 66, 47, 0, -53, -30, 15, 81, 21, -23, 98, -72, -8, -28, -1, 75, -27, 83, -6, -84, 36, -4, 61, 72, -92, 34, 43, -82, 33, 13, 38, 24, -40, -59, -88, 39, -16, -81, -51, 63, -9, -13, -32, -64, 39, -2, 24, 67, -47, 29, 77, -60, -56, 2, 5, 36, 89, 27, -15, -54, -96, -100, -57, 49, -63, -82, 58, 14, 94, -14, 69, 22, -19, 53, 40, -43, 45, -34, 21, -14, 30, -46, -12, -43, -38, -10, -49, 25, -77, -29, -92, 9, 64, -7, 16, -18, 80, -21, 51, 48, -1, -61, 2, -39, 97, -32, 41, 8, 69, 77, 88, -97, -29, -84, 13, -16, -44, 6, -53, 71, 72, 16, 60, -70, 11, -54, 33, 7, -29, -30, 61, 7, -48, 41, -85, 70, 15, -28, -27, -20, -89, 27, -31, 46, -60, 80, 56, 97, -42, -12, 91, -77, 43, 79, -21, 33, 64, 31, -9, 65, 68, -9, -20, 41, -30, 78, -36, -49, -71, 84, -2, 57, -3, -59, 38, -74, 51, 66, -29, -83, -24, -56, 14, -14, 39, 76, 58, -9, -79, 71, -9, 91, -24, -76, 7, 78, 34, 8, 33, -77, -82, -18, 14, -92, 11, 63, 1, 67, 51, -53, 90, -32, 80, 81, 69, 18, -56, 24, -87, 56, 33, 34, -64, -48, -83, -63, 86, 28, 95, -57, -54, -66, -41, -11, -49, -93, 6, 68, 30, 96, 41, -5, -75, 10, 97, 22, 85, 67, -50, 22, -96, -24, 59, -100, 81, -90, 80, -93, 52, 67, -69, -73, 30, 27, -39, -74, -56, 4, -9, -76, 88, -57, 73, 41, 35, 75, 41, 92, -21, -19, 34, -13, 76, 26, -46, 40, 100, 83, -45, -86, 84, -43, 62, -13, -4, 43, -93, 72, -61, 81, -87, 86, -48, 26, 54, 74, -21, 14, 33, -46, -57, -83, -85, -89, 47, -56, 91, 86, -8, -79, -4, -54, -72, -56, -24, -92, -77, -86, 63, -88, -10, 71, 0, -30, 99, 21, -25, 63, 15, -40, 67, 25, 54, -100, 61, -33, -13, -80, 60, 34, 92, -98, -50, -22, -6, 81, 22, 86, -95, 56, -84, 16, -41, 49, 51, 24, -20, -16, -50, 77, 38, 83, -30, 69, -62, -32, -53, 24, -44, -80, -19, -2, 47, -86, -32, 78, -25, -39, 18, -64, 33, 98, -75, -93, 100, -97, -80, 58, 48, -76, 42, 62, 76, -58, 68, -64, 84, -59, 74, -9, -40, 41, -33, -48, -17, -67, -25, -4, 51, 47, 96, -71, -13, -94, -65, -63, -49, 42, 73, 50, 39, 71, 42, -8, 6, 25, -52, -80, -86, -87, -59, -86, -38, 95, -74, -8, 4, -48, -49, -38, 100, 80, -44, 19, -49, 6, -58, 34, 16, 69, -97, 96, 32, -21, -60, 31, -99, 94, 48, 97, -58, -19, 7, 96, 36, 55, -75, -19, -18, 30, -28, -1, -52, 44, -38, -46, 50, -67, 4, 4, -32, -86, 74, -98, 55, -98, 1, -97, -13, 58, -56, 86, -56, -26, 64, 92, -92, 44, 17, -36, 30, -75, 80, 58, -75, -78, -71, -91, -29, -37, 49, 42, 22, 4, 83, -27, 47, 4, -54, -14, -48, 80, 28, -99, -43, 46, 89, -29, 39, 53, -74, -72, -86, 73, 28, -41, 6, 84, -98, 14, 45, -49, -41, -67, -5, -12, -41, 53, 99, -82, 10, -79, 60, 65, 27, -66, 6, 27, 94, -18, 37, 42, 38, 10, -11, -77, -24, 0, 31, -88, 100, 84, -3, 19, -64, -53, 98, -100, -41, 39, 48, 38, -57, 14, 85, 7, -57, -23, 61, -76, 31, 91, 15, 18, 43, -91, 8, 93, -66, 33, -82, 86, 80, -93, -91, 94, 65, -72, -86, -14, -78, -55, -73, -75, -91, 74, -97, -46, -35, -34, 34, -46, -70, -27, -82, 55, -20, 55, 46, -14, -81, -88, -24, -58, 38, 75, 42, 44, 81, -51, -73, -97, -79, 18, 0, -62, -67, -4, -57, 69, -61, -4, 39, 29, 55, -27, -15, -11, -34, 98, 99, -25, -9, -91, -15, 1, 84, 7, 64, -10, 91, -22, -15, 6, 67, 0, 7, -41, -53, 16, 5, 46, 99, -68, -57, 64, 11, -12, -65, -20, -13, 48, 29, -70, 7, -71, 71, -89, -50, 20, 76, 51, 51, 87, 38, -88, -10, 99, -27, 99, 91, -81, -29, -28, -30, -23, -73, 29, 20, -58, -93, -88, 10, -66, -78, -55, -86, 29, -40, 14, -37, -49, 63, 94, -32, -34, 74, -18, -99, 71, 91, -23, -73, -47, -34, 63, 1, 19, 90, 52, -53, 66, -54, -80, 57, -9, 58, 20, 15, 53, 49, 48, -100, 64, -24, -16, -55, 36, 44, -54, -42, -47, -15, -89, 91, -95, -48, 43, -11, -96, -28, 73, -87, 71, 90, 5, -49, 15, -75, -48, 8, -72, -82, -54, 35, -78, 16, 5, 62, -48, -5, 85, -96, -85, -84, 59, 1, 79, -81, 11, 19, 93, 10, -100, -43, -8, 71, -95, 7, 2, -51, 17, 9, 99, -13, -81, -87, 32, 68, -61, -67, 23, -56, 98, -21, -30, 54, -23, -23, 71, -68, -68, -57, -81, 10, 63, -94, 59, 94, 66, -77, -31, 11, 3, -47, -63, -27, -21, -69, -56, -40, 97, -48, 27, 78, -25, 83, -74, 65, -39, -83, 26, 8, 2, 91, -24, 16, 3, 57, -52, 68, 15, 40, 61, -1, 24, -76, 93, 27, -1, 45, -96, -82, 69, -83, 20, -69, 48, -91, -64, 76, -15, -88, 82, 44, -92, -13, 71, -55, 35, 18, 64, -82, 90, 73, -7, 98, -75, -55, 17, -55, -87, -16, -38, -29, -98, -73, 24, 56, -14, 45, 62, -24, -25, 74, 13, 32, -26, -42, -42, -54, -6, 40, -23, 12, 8, 5, -12, -68, -4, 89, -22, -85, -57, 85, 19, 33, 7, 42, -97, -45, -37, 95, 61, -6, -45, -69, 15, -92, 90, 4, 99, -23, 60, -14, -80, -46, -25, 84, 29, 40, 25, 31, -17, 77, 14, -53, 22, -23, -71, -72, 35, 39, -60, -75, -51, -99, -46, 3, 83, -87, 33, 27, 3, -6, -20, -40, -89, -88, 46, 71, -12, -6, -42, -64, -76, -85, 65, 70, -14, 41, 33, -78, 25, -41, 39, 40, -1, 2, 33, -38, -63, 27, -51, 79, -61, -93, 88, -93, 3, -67, 87, -44, 73, -79, -14, -61, 72, 82, 78, -15, 32, -6, -88, -73, -17, -39, -8, -14, -77, -3, -94, 65, -64, -33, 69, -15, 32, 91, 77, -14, -86, 22, 100, 6, 80, 52, -12, 24, 12, 36, 65, 49, 6, -14, 76, -33, -86, -36, -47, 57, -8, -81, -68, -1, -24, 34, 35, 55, 72, 6, 100, 19, -27, -90, -70, -89, 23, -23, 78, 71, -5, -51, 16, -84, 62, 28, 56, 78, -37, 31, -14, 55, -85, -38, -25, 80, -16, 8, -84, 67, 40, 79, -43, 64, -22, -40, 12, 20, -67, -31, -84, -81, 100, -42, -32, 60, 1, 19, 44, -44, -18, 28, -88, 54, 97, 86, -95, -4, -7, 9, 50, 37, -50, 46, -50, -14, -33, -17, -59, -44, 95, 65, -39, -94, 11, 98, 77, 79, -75, 53, -82, -92, -40, -81, 5, -51, -20, 49, 40, 39, -91, -36, 57, -93, 48, -79, -83, 93, 75, 71, -92, 94, -47, -75, -7, -1, -75, -67, -93, 37, -53, 82, 6, -47, 67, 18, 42, -20, 45, -5, 1, 50, -39, -55, -14, -2, -62, 42, -48, 91, 90, -21, -85, 3, -31, 93, 40, 7, -54, -92, 90, -67, 56, 64, 70, -15, 14, -37, 51, 98, -67, 75, -89, 50, -4, 20, 40, -14, 1, -5, 72, 13, 92, -54, -43, 32, 20, 17, -96, 87, -5, -80, 51, 27, 23, 45, -80, -47, 37, 51, 3, 10, 15, 87, -44, 27, 50, 49, 95, 61, 19, -31, 55, -6, -2, 66, -59, 50, -31, -99, 51, 44, 8, -36, -31, -32, 20, 8, -41, 77, -8, -89, 2, 74, 94, 11, -36, 54, -53, -13, -39, -57, 46, 86, 35, -46, 7, -54, -99, 12, 66, 72, 59, 92, 65, -90, 37, 11, 86, -11, -46, 47, -84, -33, 32, 87, 50, 73, -49, 37, 73, 55, -4, 70, 53, 82, -53, -72, -74, 45, 3, -41, 5, -32, 13, -80, 51, 1, 30, -6, 89, 4, 24, -99, -35, 12, 69, 61, -59, -81, -4, -33, 72, -26, 24, 69, -54, -96, -52, 23, -64, 61, 100, 97, 45, -82, -61, -84, 87, -2, -8, -59, 22, 6, -29, -36, 8, -48, 34, 32, -77, -73, -39, -84, -81, -98, 64, 42, -50, 75, 35, 40, 75, -98, 92, -28, 58, 4, 17, 53, 83, -67, 36, -39, 19, 14, -88, -32, 68, -24, -100, -12, -54, -97, 90, 79, -91, -73, 20, 25, 33, 54, 39, -39, 79, 75, -34, 73, -27, -6, 42, 98, -65, 41, 11, 30, 12, 9, 13, -34, 25, -15, -82, 81, -32, -91, 60, 40, 27, -2, 78, -69, 11, -77, -66, -18, -31, 67, 81, 8, 71, 89, -2, 95, -68, -45, 63, 81, 46, 70, -89, -90, -31, 39, -60, 52, 5, -98, -98, -17, 55, 50, 75, 94, 69, 6, 67, 33, -81, 38, -5, 23, 54, -80, 13, -88, -15, -66, -54, 55, 48, 45, 58, 87, 24, 9, -64, -80, -87, -10, -41, 23, -78, 10, 23, 56, 74, -71, 14, -11, -63, -18, -74, 3, 15, -86, 86, -98, -91, 19, 44, 27, -90, 75, 32, -32, -37, -87, -51, 53, -29, -32, 34, 26, -85, 82, -23, 0, -45, 4, 31, -53, -84, 10, 63, -31, -21, -8, -63, 0, -39, 20, -53, -91, -65, 56, -97, -57, -45, -59, 13, 40, 73, 60, -80, -22, 84, -32, -31, -34, -53, 60, -65, 60, 58, 48, -74, -29, 0, 89, -5, 27, -75, -35, 39, -79, -84, -94, 6, -33, 27, -64, -63, -5, 38, -100, 52, -59, 79, 51, 80, 83, -38, -20, -93, 86, 72, -74, -49, 45, -10, -15, -85, -35, -96, -19, 30, 17, -20, -31, 14, -94, -51, 41, 65, 10, -54, 11, 60, -58, -10, -72, 27, 84, 32, -5, 87, 16, -31, 29, -31, 9, 70, 31, -45, 86, -12, 36, 30, 75, 70, -1, 28, -44, 80, 43, -50, 11, 3, 26, -46, -100, -11, 55, -48, 85, -28, 87, 86, 7, 49, -93, 76, -59, 54, 66, -76, -63, -16, 51, -77, -41, 77, 10, -35, 41, -48, 59, 5, -5, 75, -62, 67, -59, 10, 3, -24, -93, -75, 39, -58, 78, 9, -1, -38, -52, 14, 54, 36, 66, -36, 98, -30, -94, 99, -21, -34, 37, 98, 80, 0, -6, -14, 84, -10, 2, 25, 54, 81, 12, -97, -13, 50, 75, 69, -98, -10, -98, 55, 90, -20, 58, 37, 76, -7, 25, 12, 48, -1, -48, -14, -12, -47, 84, -81, 12, -52, 34, -72, -53, -88, -98, -99, -85, -7, 1, 33, -56, -30, 32, -45, 98, 26, -69, -52, -88, 57, -76, -41, -42, 55, -43, -81, 61, 32, 87, 70, -44, 84, -47, 11, 72, -15, -64, -17, -53, 17, 81, -53, 11, 9, -95, 61, 90, -23, 75, -78, 25, -17, -88, -54, -57, 4, 59, 53, 80, -87, 79, 20, -65, -93, 67, 49, -85, -10, 19, 87, -41, -91, 52, -70, -80, -20, -68, -70, 48, -65, 92, 31, -33, -11, 31, -92, -71, 14, -56, -97, -32, -78, -85, -79, -29, -53, 89, 87, 6, 32, -94, -50, -36, -92, -19, -56, 21, 74, 94, 51, -91, -28, -53, 62, 81, -14, 10, 98, -85, -48, -61, -1, -81, -32, -56, -95, 96, 76, -62, 1, 29, 6, -62, 17, 48, 67, -19, -47, 9, -89, 64, 9, -63, 42, -94, -23, 77, -36, 1, 94, 0, -57, -70, 70, -24, -53, -19, 26, 88, -17, -91, -72, -53, 89, 15, -88, 71, -54, 2, 91, -10, -48, -9, -24, -57, 55, -99, 0, -44, -44, -67, -43, 79, 56, -66, -26, 75, -68, 14, -26, -28, -23, -92, -53, -34, 63, 98, 18, 71, 87, 90, 32, 18, -15, 5, -25, -61, -82, -54, -36, 94, 45, 77, -71, 25, -35, -96, -8, -4, 69, -7, 5, 32, 77, -16, -43, -22, -93, 58, -89, 48, -7, 89, -10, -68, 53, -1, 67, 92, 86, -86, 13, 28, -90, -46, -99, -36, 71, -85, 49, 5, 45, 74, -71, -91, 85, -39, -16, 33, -34, -60, 70, -83, -43, -41, -13, -74, -33, -79, 51, -61, 8, -27, -35, 67, -95, 11, -83, -20, 1, 9, -71, 21, 48, -39, 37, 19, 6, 40, -25, -92, 95, -62, -77, 24, 17, -67, -40, 68, 32, -22, -51, 31, -50, -49, 21, 66, -93, 12, -56, -13, -73, 18, 6, -74, 92, 61, -20, 0, -39, -39, 65, -75, 20, -77, -62, 23, -80, -7, 74, 14, 75, 20, -88, 30, 59, 62, -82, 41, 75, -20, 22, -33, 72, -82, -37, 0, -35, -35, -26, -56, -14, -34, 96, -98, 65, 69, 67, 77, 62, -77, -13, -84, -61, 93, 71, 50, -95, 93, 48, 18, 19, -66, 12, -72, -94, -48, 64, -78, -4, 35, -25, 75, -91, 16, -77, 74, 80, -62, 94, -35, -95, -80, -28, -27, -65, 30, 69, 72, -57, -10, 60, -41, -8, -18, 97, -18, -24, -75, -80, 19, 29, 74, 7, 57, -74, -30, 47, -51, -6, -78, 40, -20, 31, 41, -81, 23, -88, -98, 74, 30, 28, -11, 51, -66, -87, 94, 40, 74, -51, -23, 53, -98, 78, -61, 95, 63, -50, -100, 3, 60, 34, 16, 15, -49, 19, 38, 54, 41, -15, -55, -25, -91, 51, -40, -83, -15, 36, 44, 27, 3, 85, 40, 77, 0, -95, -16, -50, -65, -30, -1, -76, 38, -57, -87, -72, -27, -51, -96, 99, 9, 96, 21, -13, -44, -75, -95, 43, -41, -1, -89, -26, -98, -38, 91, 89, 33, -82, -83, -21, 70, -28, 30, 25, -29, -63, -33, 71, -21, 90, -59, -37, 81, -23, 26, 4, 98, -25, 64, 31, 29, 21, -57, 94, 95, 1, -39, -100, -84, -85, -92, 80, 100, -42, 18, 36, 39, 18, -60, 42, -35, -26, -90, -93, 82, 33, 80, 47, 66, -2, -29, 12, 6, -67, -44, 16, 19, 46, -30, 58, -61, 41, 2, 23, 22, -1, 64, 71, 36, -43, 47, 8, 20, -9, -51, 47, 4, 63, 16, -74, 99, -69, -100, -84, 36, -17, -56, -35, -69, -56, -92, -71, -17, 65, -41, -100, -96, -38, 63, -36, -23, 100, 51, 31, 13, 95, -76, 34, 40, 95, -58, -44, 63, 41, -29, -74, 27, 5, 64, -30, 52, -34, -11, -97, 5, -22, -5, -8, -27, 25, -85, 46, 56, 15, 78, -83, 85, 71, -85, 92, 29, -45, -22, 2, -73, 92, -96, 5, -79, 16, -1, -88, -36, 43, -15, -37, -69, -21, -50, -22, 85, 73, 79, 5, -38, -25, -41, -36, 16, -20, 4, 27, 82, 84, -30, 100, -15, 53, 39, -30, -55, -54, -22, 65, 48, 41, 29, 99, 26, 8, 18, 97, 0, 60, -95, 25, 2, -64, 41, -64, -93, -24, 40, -61, 6, -9, 85, -83, -44, -18, 65, -69, 93, -76, 85, -68, -13, 93, 57, 3, -67, 1, 26, -32, 75, -61, 78, -21, 40, -70, 15, 66, -38, -53, -14, -53, -40, 39, -23, 83, -83, 54, -73, -21, 79, -85, -24, 85, 36, -75, -73, 4, -24, 63, -92, 74, -50, -25, 21, 84, -69, 94, -44, -47, 15, 43, -39, -17, -45, -78, -84, 65, 99, 57, 85, -23, -79, 7, -84, -86, 13, -53, 59, 12, 67, -4, 84, 85, -10, -85, 55, -3, 10, -100, -60, -53, 58, 63, 7, 60, 60, 2, 27, 50, 87, -71, -56, -21, -62, -56, -23, -20, 39, -8, -69, 83, -77, 15, -88, 47, -22, -45, -48, -33, 81, -67, -73, -51, 29, 10, -7, 53, 78, -54, -75, -17, 5, -9, 19, -26, 21, 88, 50, 64, -60, -49, -19, 76, 54, 33, -27, -35, -77, 65, -73, 55, 16, 13, 93, -40, 73, -32, 13, -26, 70, -42, 29, -86, 4, 64, 98, 47, -3, -66, 61, -70, 26, -82, 95, -77, -17, 66, -9, 81, 66, 44, 46, 17, 75, 62, 59, 74, -54, 91, 73, 2, 20, 62, -7, 44, -59, 10, -72, 97, 23, -84, -87, 51, 84, -51, -44, 88, 3, -62, 82, -5, -65, 13, -64, -87, 54, 22, -18, 58, -28, 1, -20, -18, -57, -33, -53, -44, -26, -79, 31, 99, -55, 86, 61, -90, -70, 38, 19, -45, -63, -80, 9, -7, 37, 53, 35, -93, 87, -29, 18, -67, 43, 4, 40, -14, 49, 54, -37, -99, 8, -75, -18, 6, -32, -4, -71, -93, -63, 88, -20, 7, -36, -34, 73, -11, -6, -29, -58, 86, -55, 99, 24, 62, -62, -50, -97, 20, -21, -24, 78, 32, -46, -81, 51, 63, -67, 21, 8, 25, -47, 61, 44, 32, -12, 45, 82, -48, -51, -29, 72, 40, -85, -88, -81, -35, -54, 46, 72, 64, 21, -47, -95, -87, 31, -15, 82, 61, -74, -94, 30, 74, -99, -21, 52, -41, -77, -86, -6, 41, 81, 33, -20, -83, -81, 14, 89, -61, -62, 79, -69, 23, 7, 100, -74, 9, 79, -4, 90, -27, 90, -84, -52, -20, 15, -78, -3, -29, 40, 50, -44, 89, 81, 47, -15, 79, -78, 4, 62, -34, -67, -68, -55, -20, 72, 46, -14, -86, 22, 20, -23, -35, -62, -83, 97, 86, 59, -80, 67, -74, -99, -4, -62, -45, 6, 26, -88, 25, 83, 93, -45, -73, -37, -30, 91, 83, 68, 18, -1, -60, -97, 84, 57, -13, -17, -55, 83, 58, -13, -94, -24, 81, 35, 82, 96, 71, 40, -8, -81, -23, 59, 87, 77, -74, 19, -76, -49, 95, -80, -83, -62, -86, -48, -63, 75, -49, -29, -73, 43, 17, 43, -66, 44, 100, -2, -49, 39, -18, -53, -79, 22, 26, 76, -49, -22, 28, -35, -37, -93, -76, 93, 100, 100, 97, -7, 78, 80, -86, 77, 98, 21, -26, 3, -63, 67, 93, 14, -62, 7, -84, 34, 17, -62, 95, -66, -50, -54, -65, -37, -6, 4, -88, 45, 48, 11, -36, -93, -53, -16, -58, 80, -16, 54, -82, -78, 14, -51, 78, -58, -2, 3, 15, -50, 5, 11, 96, 68, -29, 38, -21, 79, 50, -52, 65, -54, -29, -94, -35, -24, -39, 56, -63, 24, -17, 60, -72, 13, -22, -78, 5, 30, 0, 72, -93, -15, 16, -72, -99, 12, 77, -36, 7, -81, 79, -64, -29, -74, 74, 22, 33, 87, -56, 71, -18, 45, 19, -36, -76, -74, 34, 71, 5, 56, -57, 6, -65, 46, -95, 52, 58, -92, 64, 54, -88, -60, 27, -35, -16, -77, -57, 5, -3, -41, -92, 29, -45, 57, -79, -20, -1, -88, -30, -85, -56, -36, 38, -31, 47, -2, 90, 0, 4, 39, 89, -7, -59, -18, 96, 85, 32, 4, 54, -73, -75, 15, -52, 48, -100, -9, -43, -22, 82, -20, -75, 52, -24, 60, -29, -32, -95, -78, 57, -47, -14, -90, 58, 33, -90, -24, -89, 93, -48, -2, -65, 44, -73, 49, 1, -94, -86, 38, -77, 94, -71, 97, -35, -40, -23, -60, -19, -50, 71, -6, -88, -11, 39, -19, -92, -53, -52, -48, 83, -61, 6, -77, 99, 7, -68, -78, -24, -47, -48, -52, -23, -21, 76, 1, 21, 87, 2, -11, -11, 92, 59, 20, 48, 45, -41, 21, 40, 51, -71, 29, -18, 10, 7, 10, -76, -51, -87, 33, -25, -17, -14, 57, -71, 65, -43, -7, -60, -7, -44, 63, -37, -3, -85, -13, -23, -11, -29, -87, -70, -35, 11, -33, 92, -46, 22, 67, 52, -76, 30, -32, 1, 17, -75, -61, -63, 65, 95, -94, 57, 19, 46, -66, 60, 60, -23, -63, 37, 84, -73, -1, -63, 43, 23, 48, -9, -4, -95, 68, 26, -86, 7, 30, -58, -54, -2, -87, 93, 56, 31, 53, 14, 39, -99, 44, -66, -91, 11, 70, -80, -86, 62, 11, 25, -16, -16, 87, 71, -96, 100, 16, 45, 48, -29, -27, -50, 68, -77, 51, -63, -57, 84, 86, 61, -26, -6, -78, 23, -15, -58, -61, -54, 68, 74, -81, 8, 92, -33, -77, -65, -56, 29, -73, 53, -78, 63, -10, 33, 62, 2, -63, 62, -7, -48, -63, 86, -58, 2, 13, -97, -96, -33, 22, 72, -21, 52, -90, 56, 61, 41, 19, 51, 86, 66, -75, 70, -65, 66, 88, 43, 21, -42, -5, -95, -3, -45, 35, -7, -74, 98, 54, 19, 73, 68, -76, -15, 45, -89, -14, 78, 8, 66, -12, -91, -27, -24, -47, 56, 1, 68, 36, 90, 64, 41, 0, -28, -29, 66, 67, -47, -98, 82, 10, 60, -5, -30, -82, -67, -51, 74, -55, 83, 84, -18, -50, -47, -11, -20, 17, 55, -82, -74, 75, 46, 78, -94, 56, 70, -32, -7, 12, 6, 19, 85, 35, 69, -59, -88, 53, -83, -59, -50, 12, 43, 0, -98, -22, -3, 72, 49, -78, -42, 89, 12, -33, -47, -44, 50, 10, -41, -28, -46, 16, -38, 83, -46, -76, -75, 76, -38, 72, -28, -22, 66, -36, -32, 83, -92, 97, 55, 72, -75, -73, -61, 42, 33, -74, -63, 95, -16, -37, -71, -2, 30, 89, -89, -10, -71, -63, -16, -41, -63, 3, 42, 45, 79, -72, 11, 87, -80, 44, 45, 84, 18, 64, -41, 65, 39, 12, 100, 28, -43, -98, 90, 48, -78, 36, -18, -46, 9, 15, 46, -39, -14, 66, -1, -74, 73, -67, -68, -9, -5, 77, 47, 67, -6, 85, 58, -63, 72, -60, 36, 36, 90, -22, 27, -79, -85, -69, 93, 41, -63, -3, 35, -80, -45, -55, -58, 19, -55, -53, 97, -17, -70, 60, 71, -30, -93, 100, 29, 44, -49, -56, -64, 69, -57, 16, -63, -2, 23, -95, -33, 78, 0, 62, 85, 84, 100, 33, -88, 86, -71, -1, -99, -43, -65, -29, 72, 36, 25, 92, -24, -51, -69, -3, -58, 24, -6, -23, -47, -54, -87, 75, -46, 56, 74, -38, -82, -10, 36, 0, -64, 6, -9, -49, 84, -73, -65, 15, -37, -83, -12, 62, 95, -23, 66, -11, -93, -86, -94, -84, -15, 17, -37, -89, -45, 73, 74, 0, -85, 96, -99, 27, -9, 4, 81, 54, -70, 68, 63, -54, -58, -36, -51, -100, 99, 84, 43, 21, -73, -15, -19, -79, -60, -25, 46, -12, 77, -42, -32, 61, 66, 22, -27, -94, 0, 10, 79, 87, -49, -77, -75, 24, -11, 21, -91, -84, -99, 11, -74, 100, -30, 75, 17, -92, -15, -78, 98, -28, -74, -8, -20, -17, 98, -58, -94, -9, -18, 90, -17, -57, 66, -61, 34, 97, -76, -42, 40, 2, -15, 11, -15, -3, -39, -93, 12, 72, 45, -41, -41, 5, -99, 93, -10, -87, -53, 2, -45, -89, -46, 55, 9, -97, -65, 77, 30, -100, -84, 98, -39, -53, -39, -32, 46, 2, 9, 61, 76, 74, -10, 13, 77, -12, 53, -45, -23, -87, -76, 31, -69, -19, -23, 92, 5, 88, -81, -27, -91, 22, -67, 88, 54, -61, 92, 26, -68, 95, -30, 36, 43, 32, -3, 23, 50, -58, 13, -12, 84, 78, -88, 27, 51, 38, -49, -84, 64, -88, 89, -17, -4, 5, -5, -93, -45, 3, -18, 97, -57, 87, 2, 11, 68, 48, -59, 56, 92, 44, -71, -75, 80, 24, -82, -48, -16, -84, 73, 3, 80, 4, 3, 91, 72, 76, 46, 23, 98, -20, 92, -64, 20, -31, 53, 29, -42, 17, 32, -64, -70, -2, -7, 75, -95, -86, 42, 88, -85, -81, -24, -57, 69, -55, -6, 61, -37, 56, 30, -92, 52, -59, 73, -28, -17, -42, -80, 49, 56, -38, -28, -40, -37, -32, 67, 28, 5, -36, 21, -39, 81, 2, -41, -55, -96, 12, 49, 80, -31, 59, -90, 37, 66, -3, -70, -89, 7, -21, 65, -34, 93, -49, 32, 38, -76, -66, 62, -79, 64, 82, -5, 16, 99, 91, -81, 5, -97, -83, -50, 95, -81, 21, 36, -21, 53, 1, -76, 95, 68, -42, -56, -60, -63, 16, -82, -87, 26, 48, 42, -98, -64, 16, 73, -85, 41, -92, -94, 41, 33, -86, 79, -29, 61, 3, 28, -5, 21, 14, 96, 47, -21, -94, 34, -51, 29, -54, -87, -70, -51, 88, -60, -87, 32, -96, 91, 56, -96, 12, 17, -5, -65, -22, -82, 91, -79, 61, -45, -84, 83, -84, 45, 72, -23, -45, -21, -51, -43, -83, 34, -25, -91, -32, -16, 30, -18, 8, -57, 97, 41, 31, -83, -8, 79, -63, 47, 71, -50, -82, 19, -33, -35, 40, 89, 88, 57, -3, 57, 78, -13, 75, -68, 4, -27, -19, -82, -30, -44, 46, -22, 68, -59, 79, 15, -97, -97, -96, -60, 7, -14, 3, 16, 0, 88, -26, 82, -26, -88, 41, 87, 99, -76, 14, 71, -19, -91, 98, -51, 71, 41, -86, -85, -99, 57, -71, -19, -70, -24, 47, 76, 13, -66, -78, 5, -4, 14, -1, 88, -46, 94, -93, 67, -42, 27, -69, -8, -94, -99, -16, 33, 5, -65, 59, -56, -59, -48, 9, -92, -14, 13, -26, 76, 29, 94, -90, -51, 62, 21, 42, -26, -70, -9, 89, 55, 52, -9, 52, -26, -9, 28, 86, 96, -59, 9, 61, 93, -83, -24, 32, -81, 93, 26, -26, -39, -69, 85, 77, 65, 82, -73, -27, -20, -79, 70, 63, -5, 21, 22, -49, 63, 55, -23, 85, 63, -31, 36, -80, -37, -25, -40, -6, -61, 83, -97, -70, 54, 85, 52, -32, -31, -96, 14, -10, -93, -92, -86, 4, -94, -29, 14, -86, 64, -18, -62, 33, -44, -9, -20, 46, 26, 90, 58, -26, -22, -91, 6, -14, -34, -39, 30, 45, 52, 6, 47, 85, -8, -15, 77, 20, -22, -91, 48, -72, -5, -91, -88, -54, 50, -51, 31, 15, 12, 94, -16, -48, 29, -33, 92, -22, -44, -4, 97, 34, 46, 71, -38, -36, -62, 8, -75, 71, -89, 49, -24, 41, -15, -71, 71, 65, 86, 69, -49, -38, 88, 19, 4, 61, -62, -60, 20, 7, 64, -36, 17, -22, 59, -93, -4, -83, 72, -5, -68, -96, 26, -27, 25, 63, 50, 67, -96, -67, -77, 44, -6, -30, -9, 24, -79, -86, 0, -86, 52, -48, 48, 1, 93, 12, -69, -80, 95, 71, -18, 93, -87, -86, 47, -67, 63, -18, -92, 98, 57, -24, 90, 62, 40, 73, 83, -92, -65, 16, -98, -82, 55, -78, 3, 34, 4, 41, -55, 42, 94, -86, -50, 9, -93, -32, 89, 78, -38, -33, 43, 51, -95, 18, -44, -70, -95, 56, -34, 30, 55, -27, 13, -4, 75, -21, 22, 37, -68, 94, 96, 39, 84, -57, -88, 51, 71, -44, -5, 43, 8, 19, -1, 48, 10, -50, -80, -41, 78, -80, 6, 25, 33, -28, 92, -25, 85, -23, 33, -36, -15, -67, -45, -26, -98, 69, 89, -95, -95, 90, 47, 48, -99, -11, -45, -5, -91, -14, -31, 50, 12, -71, 27, -23, 64, -46, -52, -67, 4, 71, -79, -70, 34, 4, 48, -85, -81, -58, 71, -54, 13, -82, -53, 96, 38, 56, -56, 95, 63, 75, -14, -86, 9, 71, 94, -5, 67, 1, -15, 41, 90, -20, -50, 11, 85, -86, -36, -13, 82, -25, -91, -59, -6, -90, 17, 43, 24, 100, -23, 46, 58, 100, 80, -11, -93, 51, 35, 10, 75, 57, -43, -15, -46, 100, 21, 89, 7, -53, 31, 64, 35, 28, 97, -54, -96, 77, -77, 74, -83, -17, 55, -96, -71, -100, -15, -19, 73, -32, -70, 97, -10, 83, -8, 26, 55, -85, -47, 80, 39, -81, -19, 61, 80, 91, 50, 8, 54, 12, -84, 75, 48, 77, 67, 25, -98, -84, 88, -51, 21, -11, -14, -95, 55, 99, -46, 85, 72, 99, 46, 1, -72, 50, 10, 59, -91, -10, 76, 92, -72, 86, -56, 94, -50, 0, 27, -90, -19, 27, -95, -34, -39, 32, 36, -73, -63, -58, 16, 48, 89, -55, 97, 65, -52, -62, -30, 26, 57, 48, -100, 59, 35, -32, -71, 14, -93, 12, -82, -42, 82, 57, -22, -65, -46, -57, 54, -24, -23, 0, 81, 75, -71, -62, -88, 21, 43, 71, 98, 11, 54, -56, 18, -66, 55, -94, 89, 9, 13, -50, -55, -81, -5, -63, 88, 3, -69, 53, -43, 66, 47, -19, -51, -49, -15, 14, 49, -48, -35, 16, -58, -19, 50, -37, 36, 12, 34, 68, -47, -36, -99, 31, -23, -69, -1, 29, 3, 91, 41, 47, -12, -52, 35, 90, 73, 48, -14, 59, -93, 0, -85, -61, 5, -74, 3, 4, 45, -66, 12, -49, 42, 90, -48, -10, -20, 3, -35, 12, -70, -40, 91, 0, 4, -3, -67, 82, -42, -98, -84, -23, -55, 65, -66, 28, 11, 56, 31, -40, -4, 44, 55, 77, -11, 35, 61, -42, -83, -6, 86, 54, -85, -91, 3, -25, 49, -85, -89, -26, 78, 28, -74, 94, -89, -71, -92, -48, 88, -47, 64, 92, 69, -52, -97, 91, -22, 78, -10, 99, 87, -22, 58, 2, 10, 99, -43, -19, 31, -79, 30, -22, -2, 74, -63, 60, 75, 92, 16, -75, 35, -51, -63, 37, -59, -64, 53, 39, -52, 41, -55, 62, -72, -89, 15, -19, -57, 93, -99, 86, -84, 37, -83, -79, -18, -43, -48, -100, -40, 58, -70, -35, 46, -48, -6, 49, -78, 42, 53, 30, -14, 47, 24, 8, -61, 20, -62, 19, 99, -83, 68, 97, 54, 42, -64, 85, -96, -28, 34, -60, -91, 89, 53, -33, -77, -23, 68, 92, 44, 8, -77, 54, -94, -28, 6, -2, 21, -89, -16, -98, -22, -16, -91, -68, -55, -42, -49, -95, 29, -72, 18, 67, -4, 88, 95, -33, 56, 89, -41, 23, -17, -60, 12, -36, 91, -22, -38, 75, 47, 17, -64, -37, -15, 32, -67, -62, -34, -39, -13, 51, 30, 8, 98, -12, -34, -22, 77, -72, -27, -69, -14, -62, 36, 0, 41, -33, 91, 47, -73, -87, 71, -24, 15, 66, -73, 91, -12, -69, 36, 55, -6, -84, 16, -24, -46, -91, -21, 33, 75, 15, 94, 68, -22, -41, -59, 15, 8, -30, 55, 1, -88, -86, -65, -86, 16, -26, -45, -6, 31, -49, 37, 72, -17, -72, -48, 56, 50, 84, 77, -80, 11, 70, 37, -25, -71, 24, -50, 60, 45, -23, -79, -37, -80, 28, 6, 15, 23, 42, -65, -54, 81, -69, 85, 73, -47, 60, 66, -78, 70, 82, -99, 93, 65, 56, 9, 23, -34, -30, 63, -72, 18, 64, 12, -56, -85, -70, 61, -51, 92, 21, 89, 70, 83, -86, 75, -52, 71, -91, -81, -31, -93, 72, -67, 78, -97, 7, 66, -77, -46, -75, -76, -65, -30, 85, -89, 28, 15, 77, 52, 32, -18, 95, -95, -75, 12, 2, 19, 82, 66, -92, -56, -87, 11, -46, 36, -86, -64, 77, 26, 16, -17, -29, -5, 10, 48, 84, 4, 46, -43, -6, 17, -95, -97, -58, -8, -59, -98, 28, 82, -86, -54, -16, 73, -43, 98, -62, 30, 57, -66, 84, 56, 77, 89, -49, 17, -87, 62, 55, 85, -71, -11, 34, 66, -6, -32, 62, 26, -49, 41, -38, -65, -10, 51, 67, 56, -48, 8, 49, -29, -86, 12, -32, 15, 91, -97, -26, 45, -59, -71, 42, -31, 82, 80, -85, 10, 3, 100, 6, 22, 61, -74, -88, 54, -28, 96, -15, -70, -98, -71, 48, -2, 33, 59, 69, 89, 59, -2, -15, 66, -37, 17, 57, 90, 13, 58, -14, -61, 60, 90, -76, 63, 51, -6, 85, 66, -55, 37, -69, -4, 63, 55, 43, -85, -83, 35, -26, 97, -100, 89, 24, -63, -56, 85, -20, 28, -69, 35, 17, -61, 83, 90, -27, 10, 2, 2, -27, 63, 13, 22, -44, -27, -18, 72, -22, 29, -8, 95, -51, -72, -20, -91, 54, 16, 42, -41, 58, 48, -41, -43, 68, 73, -56, 23, -75, 1, -50, 63, -49, -50, 30, -87, 76, -100, 84, 44, 77, -87, 86, -20, -98, -3, -61, -12, 24, 93, 61, -6, -92, -7, -17, -80, -76, 1, 21, 71, -76, 36, 2, 89, 53, -44, -64, -85, -64, -25, 51, -75, -81, 36, 2, -72, -70, -82, 47, -74, -7, -16, -57, 62, 12, 98, 49, -27, -14, 42, -7, -3, 40, 31, -45, 50, -4, -3, -67, -1, 44, 55, -87, 61, 11, -26, 84, -4, 20, -46, 93, 16, -8, -64, 95, -75, 88, -34, -17, 79, -83, 80, 90, 80, -74, -70, 5, 28, -95, -90, 61, 90, 80, -83, -80, -82, -97, -24, 15, 56, -76, 83, -24, 90, 54, 87, -52, -36, 65, -18, 79, -100, 67, -20, -80, -15, -86, -51, -53, 59, -52, 95, 7, -56, -69, 31, 92, -4, 98, 100, 92, -21, 45, -47, 26, 74, 33, -35, 36, 95, 8, -78, 6, 70, -50, -29, 2, 52, -21, 62, 44, -83, 54, 42, -20, 6, -32, -21, 42, -59, -67, -53, 35, 37, -96, 15, 75, 16, 53, 7, -78, -39, -88, 36, -81, -9, 7, 84, 51, 7, -68, 47, 87, 75, -37, -71, 7, -28, 8, 44, -1, -87, -82, -30, -42, 94, -4, -57, 59, 10, -90, 5, -99, 24, 95, 44, -7, 67, 73, -8, -97, 65, -38, -72, -82, -10, -72, 62, 15, -31, 22, -78, -55, 71, 75, 79, -93, 82, -35, 67, 58, 75, -1, -40, 11, -49, 65, -65, 11, -14, 82, -16, -88, 64, -54, -11, 98, -79, 66, -43, -71, 45, 5, 45, -27, 66, -7, 53, -30, -94, 96, -36, -55, -83, 40, 52, -93, -27, 59, 44, 1, -22, -22, 20, 75, -38, -61, -17, -86, -2, 33, 20, -38, 35, 27, 11, 10, -69, -56, 21, 79, -19, -88, -77, 67, -87, -31, -39, 19, -12, 88, -100, 93, 25, -69, 40, 60, -69, -45, 51, -10, -97, -78, -72, -3, 48, -71, -11, 47, 43, -34, 76, 0, -43, 71, -76, -78, 86, 28, -4, 42, 27, -20, 79, 85, 68, 71, -97, 95, 34, -55, -92, 60, -68, -17, 31, -36, 5, -67, -16, -13, 91, 52, -46, 36, -84, 48, 87, 40, 30, 95, -97, -94, -75, -77, -91, -88, 24, 71, -62, 46, 78, -82, -25, -49, 74, 19, 57, -55, 48, -26, 23, -53, -39, -43, -83, 7, 86, -53, -38, -89, -67, 88, 1, -14, 80, -76, 89, 31, 40, 69, -52, -23, 83, 74, 35, -46, -83, -66, 59, 51, -94, -88, 25, 11, -32, -1, -11, -59, 8, 58, 9, -75, -25, -69, -10, 24, 25, -49, 47, 2, 4, 67, 86, -87, 71, 3, 16, -53, -8, 70, 43, 9, 62, -48, 61, -98, -33, 32, 37, -49, 56, -5, -70, -35, -10, -32, 64, 54, -14, -68, -33, 86, 91, -13, 71, -6, 7, 76, -48, -27, -52, 12, 13, 93, -6, 90, -76, 31, 78, 38, 44, 7, 93, 97, 100, -32, -17, 56, -16, 100, 18, -29, -81, -74, -93, -16, -40, 55, 97, -98, 96, 100, -94, 87, -97, 32, 38, 24, -86, 91, -88, 17, -94, 3, -95, 83, -37, 77, -71, -79, 52, 55, 17, -17, 66, 94, 32, 92, 42, -11, 94, 67, 20, 5, -32, -6, -24, 70, -100, 49, -39, 53, -83, -53, 36, -100, 36, 50, 6, 72, 29, 41, -63, -61, 90, -19, -85, 26, 16, -8, 33, -98, -87, -35, -6, -15, 94, 13, 58, 60, 28, 71, -86, -64, 54, 75, -74, -89, -34, -71, -5, 93, 34, -67, -69, 16, -62, -5, 70, 70, 30, 73, 59, -58, -20, -98, -27, 16, -38, 10, -61, -83, -34, 2, 89, 37, 79, 100, -55, -46, 73, -26, 87, -4, -75, 54, 65, -79, -75, 96, 62, 93, -28, 14, -50, 12, 45, 70, -89, -98, 19, 34, 33, -19, -56, 26, -15, 14, 66, 78, -92, 50, -89, 15, -13, -39, 3, -28, -24, -61, 81, 34, -84, 18, 25, 77, -77, -99, -9, 60, 48, 16, -48, -55, -56, -92, -95, -50, 18, -66, -19, 80, 46, 96, -76, 38, -84, -65, -5, -80, -83, 87, 45, -100, 41, 35, 93, -50, -22, 87, 61, -65, -39, 28, -16, -59, -100, -47, 74, -1, -62, 57, -94, 49, 20, 77, -56, -27, 19, -29, 37, 41, -55, 22, 17, -26, -95, -80, 89, 46, 2, -13, -2, -39, 6, -18, 80, 51, -45, 89, 61, -79, -33, 84, -91, -35, -93, 22, -63, 22, -39, 55, 37, -56, -36, -34, 36, 32, 5, 37, 39, -19, -43, 48, 48, 92, 30, -32, -12, -37, 76, -29, -84, -28, 59, -31, 12, -80, 34, -94, 10, -74, -93, 100, -73, 93, 98, -54, -15, -91, 13, -68, 34, 30, -87, 71, -55, -40, 63, -88, -85, 32, -63, 77, -63, 2, -45, -38, 19, -53, 4, -42, -24, 71, 26, -46, -46, 28, 35, 26, 31, -16, 14, 80, -43, -64, -52, -34, -82, 28, -72, -14, -68, 18, 79, 68, 50, 32, -30, 84, 33, 76, -79, -24, -97, -29, 91, 64, 58, 64, 27, -56, 35, 67, -8, -96, 55, 3, -20, -14, 36, 29, -38, -50, 15, 12, -70, -94, 57, 85, -98, -50, -45, -28, -91, -40, -51, 21, 74, -100, 84, -63, 89, -22, -12, 97, -19, 92, 89, 83, -34, -84, 26, 11, 35, -41, -61, -12, 89, -60, 39, 14, -1, 16, 81, -12, -8, 38, -41, -33, -23, -55, -63, 88, -84, -35, 99, -65, -27, -94, -85, -87, -21, -76, 4, -97, 56, 26, -45, -95, 28, 66, 28, 14, 90, -44, 94, -36, -36, 2, -80, 57, -68, 75, -79, 81, 9, -97, 82, 71, 39, -27, 18, 79, -8, -36, -36, -91, 45, -54, -35, -52, 99, -79, -15, -75, 36, 48, -6, 90, 6, 33, -87, 60, -30, 51, 100, -26, 19, 11, -50, 29, 42, 62, -65, 17, 66, -97, 91, -95, 84, 57, 9, -2, 21, 16, -5, -34, 19, -86, -84, -83, 14, 46, -25, -13, 96, 51, -10, -53, 57, -86, 74, 22, 26, 71, -3, 54, -17, 91, -60, -5, -33, -96, -48, 21, 35, -79, 5, -94, 49, -55, -71, 25, 0, 43, -22, 32, -34, -78, 88, -27, -96, 50, -19, -76, -93, 48, -99, -79, -29, -14, -29, -33, -37, -7, -82, 27, -14, -19, 80, -14, -4, -49, 74, -19, 81, 71, -4, 34, 14, -9, -100, -38, 66, -82, -70, -24, 20, -77, -32, 92, 60, -42, 13, 60, 59, 86, 0, 68, -89, 100, 18, 38, -4, 46, 81, -44, -59, -3, 98, -70, 79, -99, 65, -69, 37, 4, 35, -26, 4, 47, 47, 26, -92, 99, -86, -4, 4, -38, -80, -96, 24, 62, -16, 95, 12, 75, -21, 89, 15, 62, 97, -4, -80, -21, -62, 61, 20, 23, 42, -95, 93, -45, -52, -9, 28, -36, -73, -1, 47, 75, -29, -36, -50, 70, -52, 52, -27, 68, 98, 91, 88, -89, 3, -20, 96, 26, -87, -67, -53, -40, -66, 18, -36, -42, -65, 46, -59, -32, 46, 6, -62, -32, 79, -89, -18, 74, -65, 25, -38, -25, -19, -50, -58, -67, -4, -52, 45, 24, 88, -44, -8, 8, -96, -77, 91, -42, -63, 60, -91, 64, 25, -90, -77, -13, 98, 13, -80, 47, -91, 74, 74, 42, 71, 89, 33, -35, 21, 31, -78, -88, 58, -85, -60, -100, 10, -89, 18, 83, 77, -81, 93, -65, -22, 65, 49, 7, 88, 77, -5, -42, -81, 63, 25, -4, 42, -39, 30, -8, -10, 32, 22, 83, 58, -15, 62, 17, 98, 97, -75, 17, -100, -94, 63, -25, -14, 52, -7, 86, -40, -72, -6, -83, -60, 46, 31, 92, -60, 22, 42, 81, 91, 99, 42, 77, -79, 45, -21, 29, -65, -81, 43, -34, 19, 57, -46, -35, -75, 84, 96, 29, -45, 89, -67, -45, -46, -81, -51, 52, -17, 52, -48, 41, 87, 10, 70, 89, 11, -32, 90, -99, 81, -85, 82, -7, 70, 88, 65, -56, 25, 78, 69, -77, 14, 57, 64, 22, 80, 90, 38, -23, 50, 16, -21, -51, -16, 82, 82, -97, 81, -40, 10, -23, -18, 32, -1, 45, 71, -70, 18, -7, 48, 74, -71, -46, 4, 95, 96, -60, 72, -27, 57, -24, -16, 72, 3, 72, -22, -17, 72, 82, 86, 32, 23, -69, -95, -7, -75, -64, -88, -8, 96, -76, 40, -81, -29, 87, 100, 48, 14, 26, 88, -75, -47, 69, 38, 64, 24, -90, -74, -7, -18, -67, -63, 88, -14, 80, -36, 30, 94, 55, 41, -49, -71, 85, 81, 96, 12, 42, 65, 41, 84, 86, -93, -29, 46, -69, -6, 56, -60, -26, -56, -88, 54, -82, 53, -48, 78, 64, 36, 79, 81, -98, -5, 96, 35, -87, 19, 30, 51, -88, 70, 56, -29, 78, 69, 58, 90, 53, 45, -19, -44, -94, 11, -53, -21, 18, 19, -41, -68, 14, 27, -98, -97, -1, -97, -59, -92, -50, 44, 44, -4, -81, 41, -79, 79, -74, -58, 30, -7, -93, -15, -12, 37, 12, 56, 67, 92, -80, 51, 100, 87, 53, -92, 47, 83, -65, -65, -28, 49, -100, -32, 100, -64, -29, 6, -5, 40, -17, -58, -64, -76, 48, 68, -28, 69, -59, -99, 95, 35, -5, -40, -87, 12, -24, -80, 51, 77, 72, 91, -37, 53, 59, -44, 18, 80, 60, -49, -6, 45, 62, 39, 78, -12, -91, -49, -67, 14, 94, 66, 35, 24, 56, 49, 97, 88, -58, 76, -72, 5, 19, -20, -70, 80, 61, 27, -63, 84, 0, 31, 29, -89, -66, 97, 9, -29, 48, 9, -40, 62, -53, 42, -30, 42, 33, -33, -79, -69, 22, -79, 54, 9, -86, 23, -57, 14, -92, -67, -28, 42, 89, -56, -29, -43, 14, -82, -85, -26, 5, 35, 60, -27, -83, 62, -58, -51, -98, -42, -73, -55, -37, -31, -54, 41, 34, 58, 5, -20, -50, -72, 12, 42, 27, -11, -76, 88, -60, -32, -97, 4, 84, -70, 30, 16, 94, -11, 77, 44, 87, -35, -13, -77, -2, 59, 4, -82, -35, -41, 14, 93, -86, -16, 62, 96, 54, -13, -94, -95, 24, -68, -43, 76, 44, 9, -59, -7, 99, 67, 73, 98, 97, 95, 28, -22, -6, 10, -4, 79, 62, 18, -32, 32, 44, 80, -49, 41, 21, -72, 35, 3, -100, -72, 63, 78, 64, -32, -48, 23, 79, -13, -18, -89, -49, 28, 34, 44, 26, 70, -30, -84, 86, -98, -72, -79, 65, -47, 6, 77, -32, 57, 50, 19, -54, 48, -81, 50, 95, 48, -80, -100, 42, -84, -50, 90, -87, -42, -18, -51, 23, -67, -95, 8, -52, -95, 16, 17, 96, -94, -4, 78, 17, 28, 40, 70, -74, 98, 15, 30, -43, -12, -4, -84, 72, 0, 85, 83, 81, -72, 1, 22, -47, -74, 1, 16, 3, -56, 13, -14, -70, 63, 88, -64, 94, -65, 18, -96, 73, -49, -52, -95, 22, 37, 17, -78, 44, 9, -57, -60, 42, 71, 85, -51, -49, -31, 95, 90, 85, 50, 71, 8, 17, 8, -6, -57, 79, -34, 55, -34, -83, 54, 78, -41, -27, -52, -86, -28, 95, 42, 78, -53, -29, 12, 28, 34, -48, 58, -83, -89, -53, -71, -4, -94, -9, 12, -98, 6, -38, 33, 1, -86, 98, 70, -10, -20, 45, 49, -40, 19, -40, -48, -75, 14, -61, -13, 15, 35, -80, -58, -80, 30, -70, 54, -74, -28, 84, -4, 60, -11, -57, -58, -70, 16, 92, -25, 44, 42, -67, -21, -97, -29, -3, 9, -73, 100, 29, -84, -43, 26, -92, -70, 93, -13, -39, -82, -20, 6, -46, 55, 11, 22, 77, -36, 23, -98, 79, 37, -80, -64, -86, -14, 19, 36, -57, -62, 32, -76, -45, 20, -11, -37, 99, 79, -12, 11, -25, 36, 37, -91, 100, -39, -11, -41, 46, 6, -63, 33, 42, -54, 72, 32, -23, -48, 93, -39, -78, -57, -49, -55, 46, -17, -54, -10, -49, -77, 44, -12, 73, -37, 18, 55, 77, -37, 55, -15, -45, -42, 32, 81, 71, 69, 99, 24, 84, -54, 20, 52, 1, -57, -86, 4, -50, -48, -67, 23, -24, 35, 22, -31, -80, 7, 7, 34, -11, -22, 83, 76, -59, 50, -49, 1, 4, -22, 11, 80, 3, -85, -5, -64, 45, 47, -55, -99, 18, -14, -7, 90, -98, 73, 10, 76, -100, 4, -79, 41, 72, 33, -36, -80, -97, 30, 12, -71, -70, 61, -81, -47, 25, 52, -86, 65, 50, 79, 93, 84, -44, -22, 79, 62, -87, -10, -87, -2, -68, 79, -100, -67, -82, 51, -97, 63, -24, -43, 59, 36, 2, -34, 15, 47, 19, 89, 85, -79, 11, 94, -26, 75, 35, 100, 42, -69, 80, -34, -97, -71, -88, -80, -60, 20, -82, -53, -15, -38, 47, 91, -64, -70, -27, 45, 6, 2, 9, -81, 38, -15, -57, -19, -37, 21, 61, -14, -36, -46, -27, 16, 28, 65, 36, -6, 98, 44, -2, 11, -49, 45, 90, -68, -97, -14, -26, 79, -92, -37, -71, 35, 32, -25, 90, 28, -86, -12, 65, 69, 27, 73, 80, -75, -40, 22, -34, 81, 49, -75, -18, 7, 10, -41, -62, 22, -65, -80, 68, 17, -53, -75, 90, -65, 51, 27, 48, 45, -86, -22, 33, 70, 58, -73, 35, 56, 48, 19, -13, 85, 87, 77, -70, -54, -67, -99, 5, 94, -7, -29, -49, 34, 46, -11, -9, 42, -23, 75, 24, 41, 30, -51, -8, 23, -47, 33, 76, 50, -23, -23, -81, -10, 87, -2, 72, 88, -45, -99, 4, 72, 67, 11, -77, 56, 94, 8, -33, 13, 93, -17, 81, 80, -52, -69, -40, 69, 28, 90, 1, -66, -50, 98, -56, -24, 12, -36, -87, -8, 30, -77, -36, 75, 37, -88, 100, 41, -1, 37, 67, 50, -2, -46, -38, -30, 69, -2, -35, -22, -28, -54, -20, 25, -49, 45, 45, 51, -78, 39, 50, -80, -37, -29, 61, 29, -32, 58, -33, 97, 46, 27, 6, 8, -29, 2, 40, -36, 33, 98, 11, 54, -22, 79, 25, 20, -14, -53, -13, -33, 71, 0, -84, -63, 37, -47, 33, 33, -49, -86, -33, 84, 11, 83, 3, -94, -50, -43, 91, 8, 10, 53, 85, -70, 93, -9, 5, -88, 45, 18, 40, 14, 51, -44, 25, 56, 83, -47, 32, 62, -82, 82, -24, -32, -57, -63, -39, -79, -28, 67, 53, 24, -96, -47, -15, 76, -98, -63, 41, 74, 41, -28, -63, 91, 71, 24, -31, -36, -76, -85, -86, 30, 94, -64, 82, 24, 12, 65, 90, -100, -30, 2, -82, -49, 17, 57, 6, -46, -87, -88, -17, -11, -74, -12, 36, -60, -53, -89, 37, -95, 61, 79, -60, -95, 29, -86, 44, -85, 55, -16, 99, -91, 37, 37, 100, 55, 51, -82, -33, 83, 94, -59, 39, 45, 50, -17, 33, -48, -3, -59, 93, -71, -92, 69, -67, 67, -13, 44, 56, -51, -25, 76, 100, 88, -55, -55, 25, -84, -35, 3, -96, 22, 81, 24, 11, -85, -20, -10, 34, 35, -29, -5, 10, -19, -63, -47, -25, -86, 77, 83, 15, -92, -93, 9, 46, -50, 99, 84, 95, -70, 1, -98, -2, -18, -58, -72, -91, 39, -55, -71, -7, -69, 100, -54, -13, -38, 53, 30, -78, -27, -51, 63, 23, -88, 25, -72, 65, 20, -11, 32, 47, -23, 8, -87, 35, -53, 40, -77, -22, 92, 61, -50, -98, 27, 18, -43, 24, 99, 12, -46, 18, 19, -21, -59, -80, -91, -44, 52, -45, -63, -15, 12, 88, 11, 74, -47, -55, 95, -97, 93, 70, -39, 23, 27, 11, -16, -97, -36, -39, -11, 19, 29, 36, 84, -56, 45, 11, 75, -59, -60, -12, 85, -59, -66, 65, -34, -60, -2, -51, 3, -15, 99, -22, -56, 98, 46, 5, 44, 92, 21, -24, -45, 11, -8, -60, 69, -95, 96, -3, -28, 67, -60, -92, -93, 71, 85, 3, 94, -88, -82, -3, -5, -52, -1, -19, 57, -35, -10, -42, -48, -49, -20, 58, -86, 20, 47, -96, 34, -83, -45, -26, -5, 13, 0, 72, -73, -51, -99, -33, 27, -24, -77, 11, 75, 72, 18, 85, -65, -99, 26, 4, -83, 76, -93, 85, -86, 44, -78, 93, 97, -8, 54, 64, -52, -37, -67, -83, -37, 5, -27, 1, 71, -84, 86, 40, -49, 87, 69, -37, 93, -67, -6, -14, 98, 1, 91, 60, 39, -25, -82, 36, -27, 44, -51, -62, 68, 37, -89, -22, -86, -73, 31, -65, 18, -36, -3, -54, -20, -62, -63, -57, 78, -4, 23, -75, 63, 96, -4, -100, -48, -95, -64, -99, 22, -32, 68, 78, 74, -88, -32, -35, -42, -33, -42, 16, -91, 40, 29, -86, -55, 84, 37, 49, -12, -24, 35, 48, 49, 9, -4, -56, -10, 67, 13, 49, 57, 89, -28, 72, -66, -59, 32, -74, 97, 89, -69, 35, 2, -16, 45, -23, 42, 53, 80, -57, -69, -73, 66, 59, -24, -83, 2, -31, 18, 38, 59, 47, -4, 67, 35, -66, -32, 25, -2, -23, 48, 10, 51, -84, 45, 39, 43, -97, 61, -9, 73, -26, 58, 52, 2, -77, -36, 16, 52, 55, 63, -19, -95, -35, -34, -29, -6, -53, -31, -23, -34, 75, -36, 71, -38, -55, 46, 91, -28, -30, 9, 77, -38, -60, -94, 36, -97, -12, 76, 33, -19, -80, 42, 27, 94, 93, 83, 4, 3, -33, 59, 93, 9, 56, -35, 61, -74, -41, 17, 66, -57, -65, -82, -10, -56, 48, 50, 54, -3, 99, -82, -60, -75, -73, -37, -33, -21, -50, 1, 75, -91, 100, 66, -1, 21, 46, -37, 23, -82, -25, -39, 40, -76, -12, -9, -59, 16, -62, 57, 32, -20, 45, 6, 10, -80, -51, 20, 33, -51, 93, 14, -100, 84, -71, 85, 6, 79, 64, -53, -14, 28, -82, -55, 94, 29, -45, 44, -9, -19, -22, 49, 4, -74, -46, 59, -41, 8, 55, 55, 19, 52, -16, -15, 16, 53, 7, -26, 18, 98, 44, -94, 83, 91, 47, 65, -26, -43, -85, 78, -74, -50, -26, 43, -14, 87, 22, -25, -61, -34, 29, 1, 75, 79, 51, -8, 9, -19, -23, -99, -36, -81, -67, -60, 68, -78, -63, 71, -34, -39, 39, -71, -14, 92, 68, 47, 17, -95, -26, 31, -8, -91, -50, -8, -63, 28, 35, 1, -20, -18, 90, 60, 42, -70, -80, 30, 25, 93, -66, 68, 86, 43, 83, -56, -42, 77, -89, 39, -68, 76, -80, -41, -49, 81, 66, 76, 22, 5, 91, -1, 53, -30, 34, 99, -39, -13, -77, -61, -25, 74, 35, 81, -92, -98, 81, -80, -6, 75, 74, 95, 90, -85, 6, -8, 32, 38, 56, -22, -31, -53, -86, -67, -41, 89, -99, -21, -82, -52, -23, -73, -53, -5, 64, 76, 8, 75, -28, -1, -72, 87, 56, -43, -53, -78, -74, -94, -52, 81, 8, -33, 69, 86, 71, 53, 50, -28, 0, -93, -48, 41, 98, 34, 36, -98, -23, 44, 71, -15, -55, -11, 85, 55, 41, -92, 14, 53, 29, -26, -20, 27, -67, 46, -62, -88, 32, -51, -78, 21, 19, -13, 56, 11, 10, -29, 53, -44, -100, 55, 12, -39, -54, -23, 5, 86, 58, 97, 25, 76, -96, -70, -64, -22, 42, -49, 96, 38, -58, 97, 50, -61, -38, 29, -14, -28, 74, 3, 57, -85, -42, -54, 15, 57, 8, -92, -36, -42, 1, 91, 35, 22, 79, 45, -10, -5, -43, 76, -69, -53, -56, 81, -1, -1, -55, 58, 64, 43, 73, 25, -55, 20, -13, -40, -55, 78, 89, 62, -20, 69, -56, 17, 95, -54, 57, 51, 93, 70, 61, -78, -40, 64, -88, 98, -94, 69, 65, 79, 71, 91, 40, -73, -5, 6, -3, 11, -100, -58, -59, -6, 77, 87, 28, -50, 43, 66, -86, 24, 60, -14, -48, 44, -12, 5, -95, -70, 96, -61, 57, -32, 34, -88, -97, 77, -98, 39, -36, -74, 6, -51, -84, 99, -69, 78, -84, -67, -66, 51, 81, 45, -51, 73, 75, 2, -68, -12, 54, 28, -16, -42, -91, 52, -44, -35, 18, 11, -86, 55, -88, 13, 17, 41, 13, 93, -67, 0, -76, 11, -47, -89, 25, 36, -70, -23, -48, 11, -58, 65, -59, 23, 99, 75, -34, -35, 43, -18, -7, 4, 43, -70, 17, 85, -73, -97, 37, 78, -83, -54, 59, 57, 63, -92, 63, -72, 43, -9, 48, -37, 10, 93, 23, 86, 9, 17, 55, 82, -1, -70, 60, 87, 68, -20, -55, -52, 92, -59, 50, 11, -74, 59, -13, 20, -98, -41, -22, 44, -69, -94, -30, 27, 96, -43, 67, 11, -53, 78, 84, 10, -30, 64, -26, -27, 20, -46, -60, -4, 47, -68, 67, -67, -39, -82, 70, 96, 90, -91, 19, 22, 3, 40, -96, -43, -42, 27, 86, -15, 3, 42, 28, -63, 6, 8, -48, -49, -100, -90, -43, 27, 67, 87, -57, -95, 55, 58, -93, -96, 5, 81, 11, -84, 65, -92, -23, -87, 53, 12, 89, -10, -76, 63, -3, 60, -98, 38, 11, 85, 91, 45, -54, 71, 86, -51, 96, 56, 23, -11, -34, -99, 52, 46, 67, -99, -36, 89, -10, 81, 72, 15, -52, -32, 65, 31, 44, 25, 80, -48, 11, 58, 49, 38, 61, 12, 42, 13, 37, 80, -53, -70, -64, 7, -73, 58, -31, -87, 21, -85, -76, 66, -35, -63, 68, 2, -3, 14, -61, -37, -12, -1, 43, -19, -24, -42, -10, -3, 38, -100, -88, -71, 96, -83, -23, 40, -69, -30, 99, -51, 98, 15, 12, -21, -70, -50, 54, -41, -68, 80, 26, 99, 60, 25, -60, -82, -60, -16, -12, -59, 19, -78, -68, -81, 52, -11, 3, 79, -89, 59, 60, 95, 42, -50, -95, -10, 96, -32, 62, 22, 61, 90, 95, 45, 14, 53, 10, -40, 6, -23, -6, -27, -53, 99, -5, -70, -67, -14, 34, -18, 34, -54, 35, 28, 24, -24, -98, 80, -9, 65, 78, 42, -1, 26, 94, 91, -33, 32, -11, -12, -91, -93, -89, -37, 17, -42, 94, -51, 50, -61, 21, -4, 26, -14, -24, 20, 45, 48, 10, 28, 65, -60, 69, 36, -78, -23, -90, -30, 58, -75, -71, 61, 73, 1, -32, 32, 88, 65, 55, 53, -40, 5, -78, 73, 12, -71, -34, 60, 30, 96, 20, -18, 69, -39, 85, -44, -100, 1, 100, 87, -32, -42, -55, 5, -67, 0, -4, 52, 69, -72, 52, 81, 22, -28, 94, 42, -97, -63, -81, 12, -78, 64, 89, 10, 35, 64, -56, -4, -68, 34, -79, 32, -86, -80, 25, -12, -84, -45, -51, 34, 17, 21, -51, -41, 24, 15, 34, 67, 72, 86, -13, 4, -46, -37, 92, 81, -5, 67, 80, -57, 90, 29, 48, -51, 10, 79, 36, -2, 47, 45, -17, -71, -36, -77, 74, -11, 5, 71, 56, -24, -33, 8, 44, -4, 32, -9, -13, -51, 2, 11, 67, -55, 78, -90, -89, 40, -37, -93, 92, -92, 29, -23, 40, -99, 95, 75, -27, 30, 95, 33, -14, -96, 30, 37, 70, 46, -87, 48, 23, -58, -73, 48, 63, -77, 81, 65, -84, 49, -18, -56, -27, 88, 38, -40, -63, -35, -68, -58, 58, 11, -66, -64, 74, -1, -78, 63, 67, -12, -86, 64, 31, 49, -79, -23, 44, -29, -3, -11, 8, -7, -21, -7, -21, -63, 51, 33, 95, 33, -75, 0, 68, -26, -63, -18, 70, 80, 42, -45, 4, 83, -70, 84, 78, 51, -43, -28, 31, -91, 90, -28, -86, -3, -38, -82, 12, -38, 15, 83, -80, 61, 44, 45, -20, -35, 78, -36, -58, -44, 37, -64, 75, 19, -32, -45, 18, 63, 58, -46, -63, 100, -86, 43, -24, -48, 83, -94, 84, -46, -49, -97, -58, -61, 20, -71, 37, 2, -94, 63, 62, 66, 63, 8, -81, -52, -5, -42, 76, -11, -75, -65, 70, 25, -58, -2, -68, -1, -4, 72, -56, -13, 42, -6, -84, 39, -79, 50, -11, -23, 39, 13, -33, 9, 78, 24, 40, -44, -46, -19, 6, 55, 1, 71, 46, 73, 10, 6, 1, -98, 47, -76, -26, 83, -40, 22, -46, 62, 86, -62, 84, -18, 94, -67, 12, 68, 49, -74, 48, 68, -70, 54, 64, 93, 81, 36, -18, 69, 63, -91, 86, -61, -47, 66, 34, -97, 42, 75, -95, -28, 62, 99, 98, 95, -43, -24, -82, -39, -30, 37, -76, 71, 26, -43, 52, 19, 10, 67, -25, -31, 37, -35, 19, 52, 98, -14, 38, 21, 63, -52, -53, 14, -14, -94, -24, 78, 44, 59, 53, 20, 23, 49, 40, 24, -89, -30, -100, 60, 18, 41, 10, -37, -58, 85, -60, 95, 14, -62, -100, -60, 72, -13, -3, -13, -22, 40, -30, 36, 90, -2, 50, 81, 74, 66, -14, 53, -100, 41, 11, -27, -36, -32, -34, 76, -51, -43, -48, -10, 14, 17, -44, -15, -83, -85, 29, -88, 72, -21, 99, -58, 99, -47, 58, 36, -28, -53, -83, -90, 89, -17, -82, -1, 15, -11, -27, -77, -88, 24, 15, 73, 80, 56, 63, -30, 25, 44, 75, 51, 81, 18, -10, -16, 7, 26, 20, 28, 94, -95, -23, 82, -63, 60, 15, 1, -93, -23, 11, 47, -46, -53, 83, -13, -91, -49, 77, -67, 63, -40, 43, -22, -83, -30, 74, -15, -69, -58, -18, 67, 92, 62, -32, -51, -89, -16, 22, -43, -18, 90, 100, 76, 11, 27, -65, -47, -54, 14, 59, 23, 80, 59, 89, 64, -5, 6, 19, 0, 2, 65, 57, 85, -69, -35, 78, -90, 86, 47, -64, 100, 1, -52, -82, 82, 67, -94, 32, -59, -13, 75, 34, -90, 100, 76, 57, -60, -98, -61, -50, -69, -53, -30, 98, 47, -12, 8, -66, 7, 51, -61, -49, 11, -62, -33, 88, -25, -36, -39, -99, 33, 21, -26, 70, -61, -12, 66, -73, -21, -38, 91, 39, -60, -72, -78, -21, -50, 11, 4, -56, -11, 49, 37, 34, 100, -12, -86, -24, 5, 73, -11, -14, -40, 7, -40, -50, 65, -89, -24, 11, -35, 81, 66, 66, 14, -71, 4, 75, -70, 52, 95, 78, -88, 90, 27, 69, 81, 0, -34, -21, 83, 2, -82, 73, 42, -69, 76, 48, -36, 97, -74, 50, -54, -89, -16, -35, 32, 36, 47, 9, -19, 24, -38, -29, -3, -28, -30, -71, 24, -85, 32, 56, -54, 0, 6, 25, -79, 84, -18, 62, -41, 97, 87, -43, -98, 61, -56, -51, -99, -86, 64, 42, 87, -5, -16, 91, 10, 79, -78, -2, -64, 6, -60, -44, -4, -76, 9, -64, -61, -16, -55, 87, 1, -3, -82, -10, 36, -32, -96, 53, 46, 57, -53, 11, 43, 98, -83, 83, 48, -70, 28, 30, -76, -93, 92, -39, 34, -94, 35, -82, 44, 38, 10, 76, -90, -60, 89, 13, 79, 93, 95, -9, -26, -34, 67, -96, 15, 49, 17, 64, -90, -57, 80, -24, 17, 15, 88, -34, -88, -9, -90, 38, -16, -16, 34, -84, -53, 41, 90, 91, -4, -26, 92, 61, 36, -24, 27, -64, -71, 68, 72, -54, 34, 41, -53, 33, -67, 0, -55, 86, -31, 35, -77, -34, -97, -100, -67, 8, -92, -38, -91, 37, 77, -57, 17, 75, -95, 20, 51, -6, 10, 85, 4, -37, 83, 39, 62, -30, 3, -12, -95, 92, 9, 87, 11, 95, 56, 65, 49, 26, 35, -38, 40, 54, 45, -83, -24, 89, 41, 38, 2, 16, -84, 78, -87, -44, -8, 33, 13, 84, 31, 38, 8, 18, -9, -90, -2, -93, 13, 86, 48, -36, -8, 51, 57, 3, -2, -17, 84, -28, 44, -42, -70, -37, -53, -78, 97, 57, -46, -94, 11, 5, -3, -89, -41, -49, 54, 39, 40, -29, 89, 24, 56, 62, -41, 56, -70, -24, -25, -40, -99, 60, 99, 89, 20, -42, -61, 76, -69, -63, -9, -13, 40, -16, 81, -25, 27, -88, -62, -78, 9, 6, -9, 41, 44, -77, 85, 90, -67, 78, 11, 37, 17, 99, 48, 64, -94, -11, -88, -21, -71, 58, 32, 59, -85, 100, 49, 91, 71, -61, -64, -23, -85, -58, -38, -86, 71, 36, -36, -57, -81, 18, 97, 11, 22, 60, -21, -1, -95, -18, -70, -35, -83, -73, -33, 92, 13, 72, -43, 74, 93, 79, 63, 28, -62, 5, -100, -26, -13, 41, 98, 50, 70, 49, -41, 54, 83, 29, 66, 78, 9, -82, -39, -30, 94, 90, 10, 32, -29, -23, 88, -1, -30, -94, -51, -55, -29, -25, -27, 41, -28, 1, -7, -32, -36, 92, 84, -39, -81, 53, -57, 94, 97, -39, 6, 24, -56, -90, 99, 61, -13, -55, 11, -20, -69, -3, -96, 90, -72, -53, -85, 52, -29, -72, 79, -55, 52, -78, 61, 94, -7, 13, -67, 59, 16, -72, -92, 93, 84, -62, 34, 9, -32, 35, -5, 18, 17, -83, 1, 9, -19, 76, 4, -85, -80, 37, 5, 31, -57, 22, 35, 10, 16, 25, 82, -82, -37, -61, -50, 36, 57, -45, -20, 71, 86, 42, 95, -31, 27, 25, -40, -21, 20, 0, 50, -24, 74, 44, 84, 25, 81, 79, -79, -18, 66, 40, -23, -6, 8, 93, 9, -49, 2, 0, 41, 100, -38, 98, -73, -55, -73, -99, 26, -84, -42, 79, 31, -24, 30, 14, 64, -4, 4, -77, 99, -66, -99, -68, -25, -15, 37, -20, -39, -58, 96, 20, -42, -92, -24, 87, -38, -49, -78, -71, 70, 95, -80, -58, 100, 34, -85, -78, 85, -14, -70, 20, -32, 33, 14, 92, -42, 55, 45, -24, 37, -94, -64, 72, -15, -85, 15, 17, -87, 38, -14, 61, 87, 3, 40, 66, -57, -73, 67, -85, -51, 14, 55, -33, -9, 20, 87, 39, -85, -48, 81, -52, 63, -39, -17, 53, -45, 19, -11, 49, 19, -28, -32, 76, -3, -99, -48, 18, -94, 47, 57, -26, -6, 94, 86, 93, -98, 83, -22, -84, 11, -49, -94, 11, 32, -47, -40, 8, -85, 94, 86, -54, -53, 20, -37, -51, -60, 99, -79, 14, 81, -96, 44, 0, -23, -60, -9, 62, 67, -79, 75, -48, -8, -91, 45, -52, -30, 57, -82, -46, 87, 99, -80, -75, -73, 66, 60, -61, -72, -81, -81, -27, 39, 19, -4, 19, -76, 52, -97, -97, 36, 42, -75, -22, -11, -30, 59, -25, -2, 79, 26, -69, -92, -23, -88, 83, 23, 71, -5, -18, 57, 43, 39, 93, -83, 40, -8, -77, 1, 39, -41, -41, -1, -100, -58, -46, 67, 91, -67, -67, 75, 60, 95, 57, 9, -17, -11, -22, -30, -30, 13, -72, 50, 61, 42, -4, -48, 44, -37, -40, 84, 7, -64, 34, -93, -23, -33, -80, 88, -7, -26, 56, 52, 85, 41, -23, -35, 81, 94, 57, 45, -47, -1, -80, -48, -18, 43, 55, -97, -46, -86, -37, 92, 11, 43, 17, -81, -37, -68, -20, 96, 25, -32, 85, 66, 63, -7, -33, -14, -80, -38, -16, 33, -77, 10, 80, -6, -18, 1, -23, 77, 23, 39, 83, 19, -86, -18, 67, 68, 96, 96, -95, -34, 60, 70, 21, 48, -17, 92, 10, 44, 35, -37, 25, -73, -3, 40, -88, 65, 52, 89, 50, -15, -80, 81, -38, 57, 95, 10, -25, -28, 59, 51, -94, -29, 28, 30, 3, -73, -58, -4, -55, -100, 65, 1, -66, -47, -77, 55, -79, -85, -88, -1, -1, -39, 70, -14, -23, 59, -34, -10, 84, 92, 96, 76, -68, 14, -82, 63, 97, 23, 42, 19, -4, -77, -74, 76, -26, -78, 60, -60, -45, 56, 58, 92, -3, 45, -95, 79, -61, 92, -59, 95, -69, -91, -32, -92, -32, 88, 38, -2, 95, -27, 2, 22, 1, -93, 76, 51, 60, -82, -99, -46, 38, -84, 69, -40, 30, -15, -66, 2, -35, -100, 34, 47, 70, 18, 33, -46, -1, -80, -50, 73, 62, -1, -93, -33, 6, 43, -34, 98, 91, -99, -100, 85, -100, 1, 14, 34, -13, 96, -9, -83, -13, 59, 72, -68, -28, 76, 60, 98, 95, -73, -14, -48, -57, -21, 82, 37, -87, 2, -65, -67, -13, 45, -85, 64, -60, -76, 25, -93, 11, -7, -17, 45, -33, 75, 97, -34, 45, 10, -83, -45, 50, -66, 33, 17, -75, -40, -13, -86, -10, -69, 39, 32, -37, 98, -15, 54, -56, -66, -75, -78, 40, 30, -72, 93, -37, 55, 63, 12, 33, 38, 65, 17, 61, -34, 7, 73, -15, -72, -41, -47, -8, -32, 16, -92, 25, -24, -91, 1, 95, -43, 12, 79, 61, 5, -66, 2, 2, 60, 99, 59, 82, -4, 35, 73, 41, 35, 5, -30, -24, -47, -80, 10, -26, -87, -99, 88, 7, 44, -23, -53, -10, 35, 83, -84, 96, -89, 65, 45, -75, -64, -31, 68, -22, 69, -11, -60, 74, 41, 28, -84, 82, -48, 17, 8, 58, 89, 35, 57, -24, -21, 93, -56, -83, -2, 72, 46, -33, -18, -51, -76, 65, 20, 63, -33, -45, -62, -38, 27, 34, 21, 85, -42, -53, 32, -65, -13, -76, 72, -82, 34, 85, -35, -21, 66, 24, 45, 2, 28, 90, 30, 26, -80, 25, 23, 57, -90, -79, 10, 24, -44, -12, 30, 57, 27, -56, -65, -14, 17, -29, 91, 81, -33, 77, 2, 58, -72, 86, 63, 4, -28, 18, -16, 94, -12, -12, -25, 38, 15, 38, 53, -48, 41, -37, 37, -70, -65, -91, -75, -81, 24, -57, -39, 100, -22, -92, -30, -11, -77, 39, -41, -17, 19, -23, -85, -72, 59, 18, -66, -58, -5, 18, -48, -81, 14, -93, 21, -59, -24, -31, 10, -85, -32, -48, 72, 78, -95, 22, -68, -86, -87, 66, -38, -96, 20, -11, 6, 79, -85, -2, 65, -48, -24, -8, 80, 73, -3, -3, 42, -42, 77, 36, -75, -98, -1, -54, -96, -39, -17, 32, 37, -21, -38, -76, -57, 52, 57, -87, -15, 70, 55, -82, 1, 69, -81, -22, 38, 81, -3, 20, 51, 97, -84, 55, -51, 82, 100, -91, 48, -43, 61, -6, 6, 70, 38, -68, 85, -55, 88, 89, 28, 48, -39, 91, -14, -28, 83, -100, -80, -79, 81, -97, -36, 78, -38, 42, -65, -72, 79, 73, -32, 56, 10, 74, 52, 43, -1, -60, 92, 96, 47, 96, 63, 85, -53, 29, 56, 43, 62, 10, -39, 6, 5, 31, 12, -33, 78, -12, 60, -23, 51, -26, -76, 55, -94, 12, -65, -91, 12, -65, -83, 33, 34, 1, 39, 68, 90, -76, 80, -68, -14, -28, -95, 89, 93, 36, -34, 43, -8, 7, 82, 67, -75, -63, 62, 95, 86, 41, 74, 2, 98, 99, -59, 78, 46, -35, 74, 92, -59, -63, 40, 5, 71, 51, -5, 57, -31, -63, -4, 7, 18, 50, -27, -44, 9, -22, 50, -65, -44, 28, 99, -98, -87, -67, -31, -32, 78, 3, -72, -53, -7, -22, 16, 43, 84, 37, 46, -34, 63, 31, -26, 60, -73, 20, -92, 33, 22, -52, -10, 24, -25, 49, 3, 75, 48, -68, 83, 56, -48, -61, -83, 74, -88, 54, 89, -27, -5, 4, 72, 30, 49, 54, 82, -34, -68, -99, -26, 73, -27, 60, 85, 34, 42, -75, 38, 27, 65, -74, 34, 28, -80, -22, 57, -7, -93, -18, -98, -46, 42, -65, -95, 20, -59, -51, 11, 45, -51, -71, -62, 15, 39, -42, -25, 71, 31, 63, -53, 41, -20, -52, -34, -24, 36, -80, 4, -29, -85, 43, -73, 78, 83, -21, -44, 9, -49, 73, 65, -17, -53, 26, 68, -3, 17, 86, -8, -34, -27, -17, 93, 54, 59, 83, -91, 67, 44, 85, 17, -4, -95, 66, -83, 100, -29, -12, -59, -97, -81, -73, 67, 92, 3, -57, -78, 84, -54, -88, 43, 82, -6, 92, -85, 18, 64, 79, 16, -91, 21, -63, -57, -6, -27, 81, 12, -50, -49, 97, -9, -42, -88, 68, -89, -51, -44, 77, 18, -44, 81, 93, -93, 5, 90, 36, 87, 19, -38, -29, 30, 100, -88, 36, -49, -39, 18, 8, -93, -6, 24, 72, -48, -38, -6, -20, -44, 81, 46, -34, -55, -7, 37, 12, -8, 45, 39, -52, -78, -39, -90, -28, 17, 83, -13, -12, -46, 52, -92, -89, 38, 12, 65, 55, -93, 74, -65, 24, -51, 6, -92, 87, 99, -34, -48, -19, 9, 44, -48, 55, 13, -38, 42, -82, 23, -15, -31, -54, 98, 7, 75, 100, -81, -64, 29, 91, -65, 32, -37, -94, 97, 19, -79, -55, 67, 88, 9, -55, -73, -14, -66, 28, 56, -92, -92, -79, 90, 93, 85, -31, 82, 40, 46, 60, -36, 87, 39, -58, -84, -33, -72, 82, 34, -57, 32, 87, 33, -94, 73, 84, -47, -55, 37, -97, 94, 52, -10, -40, 65, 59, 50, 10, -64, -98, -88, 61, -13, 92, -25, -93, -18, -92, 55, -23, 23, 45, -59, -60, 97, 60, -12, -24, -47, 63, -4, -3, -45, -1, 44, -91, -57, 29, 41, 68, 29, -82, -21, -12, -100, 29, -74, -99, 78, 37, -82, 40, 75, 13, -45, 99, 83, 77, -6, 72, 86, 66, 48, 82, -44, 1, 68, -31, -19, -52, 71, 62, -10, -96, 98, 78, -44, 85, -9, -65, 37, 77, 64, 11, 47, -88, 21, 8, 46, -9, 1, -45, -56, -41, 95, 84, -47, -64, -64, -87, -6, 71, 1, -59, -100, -78, 91, -73, 31, 68, 87, -83, 90, 88, -52, -54, 14, -62, -95, -48, -76, -2, -36, 32, 92, -93, -62, 10, -58, -19, 22, 100, 32, -97, 7, -8, 28, -7, -45, 72, 92, -98, -79, 99, -45, -83, 52, 75, 15, -17, 58, -71, -21, -35, -91, 98, -42, -50, 22, 36, -47, 89, -20, 36, -92, 0, 51, -62, 35, 52, 9, -35, -91, 16, 51, -18, 86, 58, 38, 33, -31, 59, -62, 75, -88, -42, -34, 83, -60, 83, -66, 65, -20, 94, -67, -25, -31, -90, 11, -74, -53, -77, -83, -74, -47, -46, 19, -80, 86, 14, 61, 19, -43, 75, -47, 45, -98, 51, 28, -95, -82, -15, 14, 70, 22, 35, 96, 79, -28, -54, -16, -73, -55, 31, 19, 35, 15, -40, -84, -67, -81, 61, -58, -91, -7, 57, 14, 52, 26, 84, 9, 90, 6, 4, -30, 74, -17, -98, -55, 63, -75, 37, 61, -93, -46, -10, 37, 84, 13, -22, 0, -15, -56, -51, -37, -6, -99, 72, -6, -39, 41, -27, -1, 10, 3, -86, -87, 58, 56, -74, -16, -92, -81, 85, -22, 76, -44, 43, -1, -26, 35, -34, -82, 4, 94, 63, 87, 63, -90, -50, 25, -21, 82, -47, -84, 89, 69, -77, 44, -53, -17, 97, -94, 41, -90, -89, 9, 32, 32, 27, 47, -47, -46, 85, -22, -11, -4, 26, -71, -77, 100, 30, 21, -1, 75, -30, 49, -87, -53, -72, -51, 37, 98, -74, -22, -5, 55, 36, -30, -21, 53, -20, -14, -93, -99, 84, 79, 85, 22, 20, -5, -8, -98, 35, 86, -99, 89, 14, -52, 0, 47, -72, 44, -27, 4, 49, -95, -39, -70, 89, 18, -89, -89, 90, 43, -76, 49, -10, -13, -25, -83, -56, 10, -21, -33, 39, 76, 60, 90, -83, -47, 11, -4, -74, -23, 52, 61, -13, 87, -47, -14, -96, 22, 63, -47, 63, 96, -62, 97, 8, 31, -27, -36, 67, -64, -34, 10, 58, 24, -14, -54, 54, 78, 47, -88, 90, -57, 51, 24, 18, 30, 25, 37, 92, -52, 23, 85, -23, 29, 93, 2, 4, 19, -70, -33, -64, 100, -77, -57, -18, -60, 78, -59, 7, -61, -53, 12, -17, -97, 7, -41, 13, 66, -96, 5, -95, -87, 97, 25, 39, -39, -74, -47, -11, -89, 35, -27, 43, 79, -75, 35, -56, -17, 46, 44, 2, 23, 92, 22, 15, 56, -87, -84, -88, -8, -38, -68, -72, -64, 2, 73, -77, 41, 32, 24, -48, -13, -3, 13, -6, 57, 87, 19, -28, 55, 5, -75, -83, 63, 35, 45, -43, 59, -8, -52, 75, -30, -36, -68, -51, -97, 18, -17, 16, 63, 1, 55, 30, -95, 72, -78, 34, 19, -40, -1, -36, 33, -77, -64, -56, 78, -1, 1, 72, -38, -72, 0, 8, -5, 52, -91, -66, -46, 52, 72, -5, 22, -89, -97, 5, -11, -34, 44, 100, -36, -19, 4, 80, -17, 84, 4, 14, -73, -85, -80, -24, -59, -47, -69, 13, -63, 97, 13, 65, 81, 87, 9, 2, -24, 74, 39, -48, 60, 55, 20, -98, 53, -47, -61, 93, -33, 13, 74, 29, -59, 61, -7, 48, 0, 71, 23, -99, -10, -42, -3, -85, 47, 53, -85, 97, 7, -78, -59, -64, -29, 33, 64, 15, 49, -95, -69, 44, -63, 44, -64, 50, 76, 88, 76, -40, -24, 59, 26, -15, 90, -94, 49, -16, -95, 88, 41, 43, -98, 36, -54, -16, -7, 69, 69, -78, -98, 28, -34, -30, 30, 76, -34, -46, 31, -70, -35, 0, -37, -70, 16, 90, -35, 58, -54, -79, -7, -18, -55, -12, 85, 18, 88, -55, -100, -5, 52, -40, 4, -20, -87, -56, -24, 66, -35, -69, -5, -43, 3, -45, 33, -34, 77, 17, -63, 30, 11, 32, 51, -47, -67, -62, 11, -13, -53, -52, -67, -1, 34, -83, -31, 13, -67, -50, 4, -8, 95, 41, -32, -12, 2, 35, 42, -18, 86, -90, 47, 82, -65, -19, 41, 85, -63, -12, -100, 3, -36, -100, 24, -41, -76, -10, 37, -51, 39, -9, -69, -68, 99, -75, -59, 77, -40, -60, 84, 29, -2, -3, 97, -70, 50, 81, 14, 55, 46, -53, -99, 38, 71, 0, 86, 27, -42, 19, -63, 52, 6, -80, -59, 63, 36, 39, -91, 86, 32, -68, -32, -21, 90, 0, -72, 45, 33, -48, 59, 23, -59, -54, 58, 89, 83, -90, 53, 54, -18, 84, 8, -74, 86, -39, 47, 30, 43, 2, -57, -8, -71, 67, 18, 92, -72, -71, 3, 9, -69, 37, -50, 35, 78, -65, -46, 62, -65, -45, -65, -12, 88, -39, 8, -14, 52, -37, 87, -44, 12, -31, 79, 83, 90, 95, -81, -47, -100, -11, 37, 50, 78, 12, 51, -88, 56, 85, 9, -10, -6, -58, 37, 58, -27, -87, -2, 8, 61, 44, 48, -5, 94, -43, 35, -5, -63, 53, -37, 57, -92, 20, -69, -90, 61, 4, 45, 46, 81, -19, -64, -19, -89, -97, -58, 54, -50, -96, 33, -14, 5, -45, 9, -33, -5, -57, 42, -11, -59, 38, -28, -90, 93, 54, -43, 99, 27, -80, -80, -29, 28, 1, 85, -88, -28, -95, 11, 85, -84, -28, -89, -15, 79, 21, -31, 7, 100, -49, -64, 16, -98, -93, 37, -54, 68, -37, -59, -58, 24, 36, -87, -10, 31, -99, 14, -100, -26, -36, 73, 86, 24, 34, -35, 42, -29, 15, 20, -54, -11, -61, -59, 78, -66, -60, -16, 23, -44, -63, 99, -5, 35, -38, -14, 31, 75, -49, -63, -14, -96, 19, -31, 12, -77, -15, 44, -75, -98, -99, -9, -99, 49, -30, -97, -63, 2, -31, 100, -49, -70, 53, -65, 53, 55, 32, 14, -27, -83, -86, 84, -4, -96, -64, 3, -15, 49, 79, -86, -84, -50, -56, 90, 21, 55, 86, 48, 69, 96, -19, 44, 95, 34, -12, 0, -61, 67, -58, -28, 78, 100, -78, -6, 59, 58, -84, 11, 2, -43, -15, -66, -71, 91, 80, 78, 3, 64, 21, 33, -67, -45, -76, 14, -88, -38, 1, 93, 21, 19, 32, -90, 8, 3, 10, 71, -32, 1, -99, 67, -64, 17, -52, -26, 63, -26, 100, 97, -67, -43, 10, 64, -5, -41, 39, -69, 31, 5, -68, -58, 11, 6, -92, 78, 13, 24, -81, 66, 50, -60, -57, 24, -66, 50, -43, -53, -43, 0, -44, 66, 55, -37, -39, -18, 12, 11, -39, -7, -16, -75, 78, 20, -51, 14, -65, 53, -68, 22, -1, -33, -28, 35, 93, -78, -31, -46, 70, 9, 48, 49, -92, 61, 86, 53, 28, 7, 32, 68, 90, 49, -33, 75, -35, 43, -48, 27, -36, -37, -33, 90, -39, -20, -30, 13, 72, -49, 15, 24, 26, -36, 29, 76, -79, 56, 62, -25, 51, -7, 57, 69, -30, 5, -51, 1, 98, 87, 12, -71, -89, 76, -19, -55, 70, 29, -4, -21, -47, -66, -49, 60, -17, -29, 78, -75, 89, -40, 53, -64, 57, -6, -90, 80, -60, 32, -35, 40, 90, 52, 71, 41, -32, -42, 83, 79, -35, -33, -89, -33, 70, -28, -95, -86, -59, -70, 80, -95, -68, 56, -80, 23, 81, 83, -7, 48, -1, -46, 85, -37, -15, 73, -79, -41, 3, 38, -54, 58, -24, -83, -79, 83, 44, -63, -76, -69, 42, -88, 85, 77, -90, -88, -4, 77, 0, -63, -100, -62, -74, -65, 59, 68, 42, -70, 26, -95, -12, 79, 49, -70, -1, -28, -55, 94, -4, 70, -100, 71, -44, -92, -96, -22, 13, -92, 72, -77, 69, 49, 2, -41, -15, 64, 15, 66, -17, -11, -12, 80, 19, 55, 42, 87, 87, -95, -49, 39, -82, -26, 29, -46, -86, 91, -1, -32, 42, -58, -84, -3, 15, 51, -27, 15, -71, -34, -50, -41, -98, 3, -96, -73, 7, 38, 99, 0, 99, -25, -86, -18, -53, 26, -55, -73, -94, 98, -7, -19, -13, 33, 85, -33, -46, 94, 76, 17, 78, 86, 33, 7, -50, -63, 38, 79, -8, -81, -91, -75, -53, -10, 13, -87, -1, 86, -89, 15, 22, -78, -16, -29, 66, 21, 36, -6, -76, -84, 69, -72, 87, -34, -16, -44, -29, -87, -62, 43, -83, -26, 1, -81, 16, 73, 16, 72, -97, -17, 47, 38, 13, -36, 45, 66, -57, 17, -1, -83, 74, 58, 27, 66, -63, 74, 97, 35, 3, 92, -88, -46, -13, -16, 8, -58, 31, -30, 87, -89, -42, 81, -57, -85, 33, -87, 14, 11, 22, -43, 58, 68, 19, -66, -91, -20, 57, -57, 82, -30, -83, -18, -22, -15, 66, -59, 81, 23, -71, -81, 25, -5, 24, -59, -12, -14, -96, -51, -60, -7, 66, -44, 84, 64, 34, 32, -50, 5, 35, 83, 100, -90, 49, -3, -2, 38, 87, -5, 5, 42, 65, -100, -55, -13, 70, -79, -98, 41, 29, -40, 59, -63, -55, 69, 33, -60, 52, 38, 9, -60, 98, -44, 73, 22, -15, 75, -38, -62, 37, 97, 92, 86, 63, -74, 100, 82, 97, -20, 80, 6, 87, 88, -65, -16, 54, 68, -73, -85, -66, 63, 83, -2, 46, 84, 21, 60, -78, 18, -38, -31, 49, 94, -21, -42, 52, -84, -62, -24, -9, 66, -77, 65, -13, 84, -57, -65, -2, -31, 21, 23, -21, -56, 53, 38, 79, 52, -70, -16, -56, 14, -34, -25, -61, 73, 81, -60, 19, -20, -63, -1, 63, 71, -44, -35, -71, -91, -40, 90, -65, -47, -4, 92, -97, 82, -47, 10, -10, -12, -37, 18, -9, 49, 52, -20, -42, 84, 81, -57, 79, -25, 43, 0, 24, -85, -46, 88, -6, -22, -24, -61, -80, -35, 35, 98, -91, 84, 31, -58, 4, -38, 70, 94, -19, -50, -45, 70, 51, -67, -42, 29, 29, 37, 50, 42, 17, 27, -84, -19, -87, -20, 22, -85, -69, -78, 1, 61, -3, 43, 61, 3, 25, 98, 60, -33, 70, -37, -30, -83, 95, 12, 24, 26, -40, -26, 6, 47, 38, 73, 91, -20, 5, -73, 75, 62, -93, -10, 49, 20, 51, -35, -6, -37, -36, 24, -87, -76, -1, 4, 30, 32, -36, 81, -82, 5, -47, 37, 43, 3, 73, 56, -86, -53, 38, -67, 63, 57, -2, 100, -82, 95, -31, 14, 60, -5, -26, 49, -65, 50, -38, 53, 87, -8, -96, 81, 65, 89, -76, -3, -89, 49, 36, -17, -72, 71, 8, -74, -46, 32, -49, -88, -59, 42, -22, -83, -51, -99, -14, 6, 40, 95, -54, -12, 77, -89, -88, 36, -42, 72, 97, -58, -27, -78, -22, 72, -78, 0, 61, 43, 90, 8, 78, 10, 59, 65, 83, 96, -84, -15, -62, -60, -53, 55, -24, 77, -100, 16, 77, -82, -42, 95, 6, 94, 68, 37, -73, -67, -62, 25, -18, 5, 83, 79, 9, 20, 6, 30, -78, 44, -30, 53, 6, 45, -55, -31, -70, -8, 36, 17, 62, -20, -41, -25, -38, -1, 79, -53, 88, 51, -27, -43, 91, -71, 56, -91, -62, -46, -73, 45, 68, 17, 13, -26, -36, -20, -1, -1, -55, -41, 36, 72, 87, 55, -4, -98, 78, 35, 13, 97, 86, 15, 88, -43, -31, -8, 39, 36, 4, -52, -18, -84, -47, 11, 71, 59, 62, -52, 81, 43, -16, -89, 25, -3, 35, 48, -53, 35, -73, -21, -91, -49, 42, 31, -11, -39, 6, 31, -60, 100, -2, -46, -73, 0, -54, 36, 29, 94, 16, 7, 75, -32, -73, -22, -87, -55, 40, -85, 67, 99, 57, -20, 92, -43, -53, -52, -12, 29, -87, 2, 20, 44, 22, 58, 37, -31, 2, 1, 64, -37, 57, 61, -83, -38, -52, -45, -10, -43, 54, -46, -16, -82, 50, 2, 11, 7, -54, 6, 93, 78, -17, 55, 27, 84, -43, 42, 43, -4, -54, 90, 39, 2, 70, -17, 56, -52, 30, 11, 96, -41, -35, -14, 25, -75, -30, -27, 96, -54, -25, -5, 69, -70, -79, -84, 47, 35, -3, -52, -14, -63, -48, -73, -24, 56, 99, 38, 74, 72, -83, -51, -12, 76, 49, -56, 88, 26, -8, -80, 98, 88, -25, 63, 51, 59, -10, 86, -5, -5, -26, 9, -19, 27, 2, 32, 43, 38, -66, 11, 69, -14, 18, -3, -20, 37, -19, 35, -75, -98, -42, 15, 30, 65, 29, 44, 100, -65, -15, -3, 23, -28, 9, 21, 29, 61, -74, 64, 98, 49, -33, -87, -3, -78, 71, 92, 14, 11, -5, -23, -40, -16, 82, -30, -16, -51, 39, -86, 44, -67, -66, -62, 82, 86, 32, -71, 31, 42, 2, 62, -27, -46, 93, -41, -77, -79, 71, -69, -6, -18, 78, -98, -31, 59, 29, -13, 8, -42, 100, -24, -87, -50, 38, -23, -21, -91, -21, 23, 85, -67, 20, -21, -48, 55, -83, 53, 1, 34, 72, -3, -56, 98, -66, 79, 13, -80, 55, -5, -57, -21, -45, 37, 50, 75, 79, 42, -46, -58, -51, -95, 60, -39, -46, 66, 39, 15, -70, -27, 80, -67, 68, -91, -49, 84, -23, -98, 84, 60, 34, -97, 66, -53, -27, -22, 43, 65, -97, -97, 19, 18, 54, -84, -5, -31, 81, -4, -93, 13, 80, -96, 96, -54, -61, 21, 34, 39, -7, 52, -73, 70, -24, 74, -52, -15, -47, -83, -74, -29, 33, 21, 4, -32, -30, 49, 86, 74, 16, 95, -69, 8, -4, -100, 81, 73, 68, 7, 13, -60, -93, 59, -71, -55, 4, 79, -5, -40, 40, -12, 67, 25, -40, 19, 71, 89, 20, 71, -53, -42, 84, -90, -76, 88, -55, -47, -67, -17, 34, -39, -44, -8, 15, -25, 32, -25, 62, -64, 87, 92, 43, -71, 100, -59, -40, -53, 89, -17, -8, 91, 84, -33, -55, 12, -73, -24, 20, -98, -64, 75, 46, -9, -18, -84, 20, -14, -61, 77, -28, -72, 78, -59, -72, -35, 23, 44, 19, 8, 58, -9, 11, -49, 66, -41, -7, 78, 43, -3, -87, 69, -50, -77, 6, 70, -28, 46, -17, -40, 5, -7, -38, 53, -6, -66, -34, -45, -61, 56, 33, 79, 28, 79, -77, 1, 61, 14, 34, -26, -90, -65, 47, -38, -21, 90, 96, -13, -71, 57, 2, 11, -17, 49, 4, 88, -80, -64, -74, 1, 62, -63, -41, -31, -69, -21, 54, 30, 76, 1, 1, -71, -79, -82, -70, -81, 46, 29, -61, 66, -10, -29, 8, 81, -74, -22, 39, -23, 98, -84, -17, 37, 46, 57, 57, 52, -13, -27, 26, 93, 1, -5, 62, -50, 0, -30, -30, 54, -91, -4, 70, 82, 98, 33, -95, -24, 75, -24, -99, -50, 88, 46, 20, 27, -99, -50, 53, -31, -81, -78, -47, 42, 33, 62, 35, -44, 77, 76, 14, 48, 22, -65, -30, -32, -43, -38, -85, 33, -23, 21, 79, -99, 13, 13, 23, 45, 62, -15, 66, 28, 64, -80, -100, 31, -43, -100, 40, 73, 74, -94, -50, -98, 77, 53, -70, -1, -39, 53, 94, 7, -46, 55, -57, -20, 65, -71, -35, 35, -87, 0, 5, 2, -39, -26, 90, -22, 93, 6, -5, -61, 40, 6, -84, -86, 60, -85, -88, 50, -65, -58, 77, 13, -27, -20, -7, 40, -71, 84, -71, 98, -91, -2, 93, -7, -62, -64, 30, -12, 61, 65, -87, 91, -62, 81, 29, -58, 80, 30, 68, -93, -5, 90, -36, -22, 31, -33, -9, -91, -26, 77, 50, -40, -54, -98, 2, -84, -79, 15, -10, 43, 3, -98, -49, 10, 60, -59, 29, -62, -55, -53, -74, -86, -94, 8, 84, -59, -92, 4, 33, 84, -25, -71, 82, -17, 25, -17, -47, 9, -74, -17, 86, -94, 67, 3, -29, -99, 41, 37, -51, 45, -83, -85, -49, 96, 79, 58, -17, 50, -5, -59, 89, 12, 77, 23, -86, -11, 71, -59, -56, -7, 6, 62, -79, 27, -63, -4, 97, 91, 0, -94, -57, -25, -94, 93, -41, -100, -39, -14, -12, -83, 7, 34, 14, -47, -34, -8, 37, 88, -42, 86, -32, 90, -3, -93, -46, 33, 28, -45, 3, 13, -13, 37, 7, -78, 43, 0, 43, -45, 7, -6, -95, -71, 90, 28, -50, 5, -12, 26, -55, 20, 48, -2, 65, -32, -38, -51, -89, -32, -28, -57, -49, -92, 92, 17, -91, -55, 2, 85, -64, -49, -2, -20, -88, 33, 85, 0, 27, -53, 59, -90, -20, -96, -95, 16, 48, -59, -20, 54, -98, -41, 93, -8, -52, -67, -64, -59, 92, 87, -100, 86, 31, 2, 41, 9, 45, -67, -100, -48, -79, 88, 49, 77, -85, 55, 18, -15, 97, -59, 93, -30, 16, 62, -81, 7, 29, -94, 76, -92, -74, 29, -16, 95, -41, 11, -15, 76, 29, 44, -18, 3, -13, -81, 25, -3, 59, -50, -13, 69, -38, -12, 88, 89, 30, -12, -9, -25, -75, 75, 7, -93, 32, 38, -59, 18, 68, 7, 46, 75, 80, 82, 19, 88, 59, -55, -9, 63, 45, -27, -5, -83, 39, 14, -29, -55, 82, -63, 29, -92, 7, 32, -3, -82, -30, -62, -59, 44, 90, -11, 73, 6, 47, 97, 35, -5, 46, -69, 25, 46, -77, -77, 83, 19, -83, 39, -60, -14, 75, -19, 91, 43, 50, 66, -68, -77, -40, -46, 88, -17, 67, 85, 18, -29, -27, 28, -16, 52, -5, -48, 88, 73, 9, -41, -50, 20, -28, 75, 67, -94, -26, -82, 42, -31, 88, -45, 37, 73, -21, 8, 84, -66, -29, -9, -98, -35, 80, -49, -8, 80, 81, -54, -98, 92, 42, -17, -67, -51, -68, -28, -98, -99, 31, -85, 81, -68, -92, -44, -61, -49, -85, 35, -14, -41, 63, -98, -86, 1, -78, 30, 57, 72, -84, 13, 85, -43, 9, 84, 34, 66, -23, 85, 83, 42, -57, -89, -93, -21, -60, 61, -55, -72, -85, 32, -96, -71, 16, 77, -96, 40, -52, -12, -51, -87, 7, -55, -19, 25, -17, -67, -30, 74, -41, -27, -20, 38, -3, -10, -6, 77, 31, 68, 86, -41, 12, -20, 89, -17, -76, -68, -82, -44, -86, -60, 96, -41, 8, -5, -79, 70, 59, 40, 65, -75, 32, 24, 76, -4, 32, -30, 75, -83, -6, 33, -35, 26, -59, 16, 79, -90, -75, 48, 93, 67, -45, 17, 78, 47, -44, -96, -87, -77, -33, 79, -53, 74, -41, 100, -98, 18, 36, -1, -18, -77, 31, 36, -100, 15, 62, 39, 45, -91, 45, 51, 28, -22, 99, -2, 43, 42, 89, 32, -56, 17, -49, 98, 11, 34, 54, 11, -88, -84, -57, 40, -28, -96, -68, 31, 53, -33, -85, 49, -65, 1, 85, 82, 62, -76, -29, -20, -40, -83, -43, -25, 20, -44, -4, -38, -89, -90, 40, 62, -74, 3, -34, -12, -56, -20, -34, 49, 1, -10, -59, -81, -53, -83, 27, -24, 97, -95, -62, -90, 11, 52, 7, -7, -46, -17, -43, -64, -85, -31, -8, 100, 64, 80, 43, -83, 46, 71, 29, 85, 37, -55, -82, -63, -64, 11, -56, 16, 61, 29, -57, -4, -18, 23, 23, -74, -53, -7, -94, 54, -16, 98, 11, -12, 27, -83, -68, 60, -5, 21, -76, 41, 65, 65, -97, 7, 89, -19, -91, -66, -2, 3, -78, -36, -19, 52, 80, -84, 84, 47, 27, 52, 69, 72, -70, -36, 79, -21, -9, 48, -71, 22, 30, -31, 70, -72, -98, 85, 60, -26, -56, -32, 59, 10, -17, -49, 91, 15, 2, 67, 40, -21, -72, 90, 53, 1, -42, 76, 80, 58, -89, 85, 63, -91, 33, 34, -70, -10, 99, -98, 3, 74, 25, -100, 72, 81, 77, 34, 90, -86, -12, 94, 57, 21, 15, 95, -65, -34, 32, -76, -90, 99, -35, 55, -41, 37, -51, 66, 64, -38, 88, -9, -63, 19, -68, -26, -56, 71, 28, -48, 74, 60, -34, 42, 4, -87, 50, 23, 81, 19, 35, 81, -65, 27, 79, 33, -4, 55, 77, 65, 57, -20, -28, 81, -30, -55, 55, 44, 75, 71, -41, -41, -96, 96, 97, 34, 80, 44, -42, -92, 49, -56, 100, 86, -21, -88, -18, -89, 63, -91, -85, -9, -82, 3, 33, 31, 57, 2, -6, 73, -74, 72, -64, 36, -40, -66, 5, -54, 48, 44, -46, -13, -6, -95, 20, 62, -51, 64, -88, -76, 22, 28, -52, 21, -66, -18, -48, 79, 81, -25, 3, -54, -58, 47, 60, -8, 43, -23, -94, -31, 48, -65, 3, -47, 46, -76, -34, 8, 80, -53, 69, 74, -10, 69, -99, 33, 26, -55, 93, 5, -61, -43, -23, -68, -39, -89, 25, -52, -13, -23, -96, 78, -32, 10, 59, 76, -41, -55, 95, 68, 94, -88, 7, 11, -1, 45, 12, -4, -50, 17, -65, -20, 2, -67, 39, 32, -53, 3, -10, 23, -61, 40, -75, 41, -5, 38, 65, -21, -44, 49, 10, 43, -25, -72, 29, 81, -99, -98, 83, -29, -90, 59, -97, 36, -13, 12, 83, -85, -15, 98, -91, 63, -77, -37, -45, -12, -79, 79, -51, -54, -78, -18, -82, 79, 61, -72, -40, -16, -66, -96, -25, -94, 68, 29, 37, 1, -57, -31, -10, 62, -39, 100, -81, 62, 64, -29, 19, 81, -6, 26, 12, 6, -21, -73, 97, 59, 38, 69, 50, -71, -92, -42, 55, -22, 2, 13, 60, -54, -3, 49, 56, 61, -59, 79, -54, -27, -50, 72, -7, 19, -26, 61, 48, 22, 40, 81, 52, 21, -80, -100, 85, -32, -15, -30, -88, 79, -78, 48, -95, 47, -25, 67, -92, 77, -73, 38, 15, -5, -26, -13, -45, 4, -66, -76, 12, -2, 46, -70, -20, -51, -14, 90, -54, -100, 24, 85, 37, 35, 5, 24, 53, 61, -82, -29, 28, 75, 52, -77, 74, -17, 19, -32, 94, 59, 44, 88, 5, -32, -90, 65, 95, 46, 2, 44, -88, -100, -99, 8, 93, 95, 43, -97, -44, 100, 12, -78, 23, 16, 29, 94, -14, 53, 24, 10, -94, -57, 60, 12, 91, 63, -97, 17, -78, 52, -11, -9, 54, -50, 14, -20, 2, 96, -21, 50, 2, -92, -68, -66, -51, -77, 51, 46, -62, 88, -76, 52, 54, -69, 38, 96, 7, -68, 46, 6, 10, 20, -85, -90, -3, 15, 96, 82, -76, -8, 10, -5, 61, -89, -80, 26, -72, 78, 20, 23, 50, -68, 35, 69, -24, 96, -60, -27, -38, -87, 89, -26, 73, -34, -8, -48, 79, -7, 12, 34, 81, -90, -76, 86, 93, 54, -18, 85, -8, 38, -46, -82, -9, 66, -11, 97, -90, 41, -41, 63, -60, 29, 84, 6, -41, 47, -79, 27, 25, 2, 31, 83, 9, -43, -36, -43, 57, -25, -82, 27, 89, 3, 6, 17, 95, -22, -17, 71, 17, 88, 48, -91, -71, -77, 75, -46, 3, 26, 79, 24, 65, 94, -8, -93, 56, 37, 96, -26, 95, 76, 85, 62, 77, -61, 39, -16, -85, -23, -53, -10, 28, 92, -79, 42, 94, -87, -28, -82, -61, -3, -97, -68, -58, 64, 93, -74, 72, -20, 12, 77, 16, 23, -6, -38, 33, 23, 15, -6, -34, 94, -4, 15, 86, -88, 48, -37, 64, -16, 75, -45, 71, 40, 31, 100, 11, -68, 64, -48, 0, 51, -12, 78, 68, -72, 86, 67, -50, -51, 10, -65, 8, -41, 45, -81, 32, 45, 23, 67, -100, -82, -14, 53, -72, -42, -38, -3, 89, -53, -39, -83, 93, -74, -95, 97, 86, -95, -70, 4, -7, -45, 81, 68, -83, -14, -78, 63, -76, -94, 47, 32, -83, 5, -68, -22, -66, 9, -36, -38, -29, 98, -60, 77, 27, 7, 3, 57, -63, -66, 93, 73, 35, 1, -33, -64, -16, 40, 100, 72, -72, -60, -45, -85, 39, -35, 89, 46, 57, 43, 40, -32, -78, 89, 58, -48, 19, 44, 27, -52, 76, 94, 53, -88, 7, 65, 49, -16, 56, -56, 73, 66, 96, -19, -33, -4, 66, 47, -24, 95, -66, 35, -49, -61, 20, 12, 10, -65, 33, -31, -28, -85, 73, 86, -63, -83, -89, -47, 74, -100, 42, 10, -80, 28, -8, 94, 39, 23, 55, -62, 64, -41, 58, 85, -4, 3, 38, 9, -72, -12, 18, 40, -50, 7, 81, 46, -43, -65, -73, 95, 30, 0, 6, -12, 68, -66, -8, 4, -25, -17, -25, -51, -1, 57, -29, 14, -24, 20, 97, -47, -30, -16, 1, 6, 78, -73, 91, 7, -80, 54, -74, -24, -51, 56, 66, -44, 18, 64, -37, -53, 49, 57, 55, 50, -97, 30, -40, -5, -97, -36, 39, 40, 61, 23, 86, -8, 100, -70, -30, 40, 81, -99, 60, -51, 34, 45, 78, -93, -46, -58, 86, -71, -42, -92, -33, 66, -20, 38, 22, 29, -78, 90, -79, 88, 53, 39, 59, -92, 96, -11, 98, -68, 51, -12, -6, -32, -63, 38, 59, -37, -29, -81, -67, 10, -59, 35, -35, -80, -22, -31, -96, -34, 70, -85, -2, -28, -66, -18, 70, 9, -62, -91, 47, -100, -95, 80, 73, -35, -63, 60, -34, -1, -24, -66, -56, 49, -33, -84, -96, -44, -6, 67, -71, 69, -94, 23, 98, -10, 46, 68, 61, 49, -49, -95, 8, -6, 52, -35, -91, -75, 32, -33, -3, -30, -51, -84, -90, -48, -51, 35, 23, -39, -25, 22, -11, -72, 1, 0, 9, 71, 8, 72, -72, -42, 42, -31, -5, -57, 63, -17, 20, -44, 16, -37, -2, -63, 44, -74, -84, -38, -90, -37, -62, 29, 14, 93, 81, 56, -56, -13, -21, 58, 76, -92, 54, 83, 4, 24, -23, -56, 70, 7, 49, -2, 60, -74, -61, -75, -18, 72, 72, -75, -31, -34, -95, -73, 94, -88, -38, -88, 28, -61, 64, -70, -84, 36, 8, -37, -44, 40, 64, 41, -76, 21, -23, -44, -30, -13, 12, -1, 69, 69, -54, 15, 71, 68, 30, -11, 10, -11, 28, 38, 34, -89, 65, 81, 94, 5, 21, -48, 59, -1, 72, 78, -64, 18, -42, -47, 45, -100, 48, -73, 11, -85, 75, -73, 49, 11, 28, 15, 69, -3, -31, -9, -98, -20, -57, 54, 78, -77, 47, 59, -2, 40, 11, 70, 47, 22, 11, 29, -33, -10, -41, 31, 23, -5, 44, 28, -68, -71, -96, 17, 39, 59, -63, -84, 85, 8, -61, 51, 39, 10, 27, -6, 46, -72, 79, 44, -28, -80, -41, -3, -26, 18, 47, 12, 80, 13, 2, -21, -38, -44, -72, 28, 23, -42, 91, -15, 99, -30, -12, -3, -57, 75, 15, -26, 42, 62, -78, 80, -56, -9, -88, -67, 65, -31, 7, 95, 32, 25, 67, 97, -80, 55, 30, -78, 99, -82, -51, 85, -81, 15, -9, -8, 99, -18, -48, 22, -16, -19, -92, -97, 68, -76, -67, -28, 36, -19, 40, 36, -97, 61, -94, -86, -63, -10, -49, -20, -1, -94, 6, -56, -42, 21, -80, 55, -98, 41, -99, -72, 45, -64, 72, -56, 51, 19, -55, 39, -48, -56, -69, -83, -88, 31, -78, -39, -47, 82, -32, 67, -87, -3, -73, 99, -6, -30, -34, 56, -1, -40, 2, 95, 36, 18, -84, -52, 90, -23, -55, -8, 20, -88, -56, 80, -84, -54, -39, 77, -58, -33, 23, 8, 99, -73, 72, 68, -7, 17, 63, -10, -17, -68, -76, -82, 74, 5, -68, -34, 41, 60, -59, 92, -6, -54, -66, 16, 59, 82, 81, -25, 78, 86, 99, 41, 45, 27, -46, -3, 83, 7, -52, 87, 12, 80, 98, 33, -31, -15, 35, 42, 53, -62, 30, 84, -91, -98, -55, 49, -34, 92, -4, -82, -39, -3, -44, -6, 6, -13, 40, 43, 43, 14, 18, -49, -60, -53, -10, -62, -88, 31, -5, 8, 3, -3, -58, -13, -8, 73, 25, 8, -54, -9, 80, 52, -60, -98, 20, -24, -6, -88, 4, -83, -64, 70, 61, -46, -49, -65, 81, 86, 13, -49, -82, 39, -9, 38, -53, 0, -2, 43, 98, -54, -34, -70, -25, -93, 88, -57, 77, -66, 88, 82, 93, -87, 9, -97, 44, 11, -32, 51, -52, -46, 98, 50, -20, 39, 38, 14, -26, -3, 26, 10, 0, 13, -72, -39, -48, 16, 75, -10, 5, -15, 27, 93, -1, 75, -7, 86, 98, 84, -25, -98, -20, 4, -69, -93, -14, -71, 42, -27, 82, 22, 20, -63, 42, 57, 73, 91, 53, 14, 8, -23, 94, -65, -11, 58, -61, -27, 100, -55, 6, 69, 45, -1, 63, 77, -40, 67, -98, -19, -94, -70, -36, -6, -37, -24, -98, -8, -66, -86, -80, -39, -18, 55, -97, 40, 78, 75, 66, -34, -7, -43, 29, -76, -90, -100, -53, 12, 75, 37, -20, -71, 62, 13, -82, 9, 80, -67, -69, -25, 25, 33, 40, -15, -26, 91, 34, -56, 72, -36, -7, -82, 18, -54, -55, -72, -1, 88, -36, 50, 27, -50, 90, -79, 9, -30, -68, 26, 8, -1, -57, -94, 27, -10, 29, -84, -36, 85, 9, -71, -9, 53, 62, 90, -26, 98, 55, 52, 88, 4, -70, 81, 94, -4, -50, -43, -67, 86, -80, 83, -64, -37, 46, 23, 0, 18, -16, -23, 80, 98, 90, 3, 89, -29, 2, -24, 9, -82, 29, 33, 56, 68, 78, 32, 68, -39, 57, 2, 89, -1, 54, 77, -49, -52, 89, -1, 87, 25, 17, -47, 18, 32, 36, 61, -3, -65, 47, -20, -16, -18, -38, -34, 57, 96, 97, -98, 76, -59, -77, -57, 28, 14, 81, 79, -65, -63, 71, -19, 74, -72, 78, -60, 91, -13, -53, 13, -79, -2, -84, -15, 32, -40, -12, 33, 80, -20, -6, 44, -42, 66, -47, 25, 75, 64, -53, -33, 6, -23, -24, -74, -13, 54, -29, 90, 79, -54, 2, -80, 14, -44, 4, -6, 69, 9, 75, -74, 27, 99, 60, -25, -66, -3, 43, -65, -35, -45, 44, 47, -7, 5, -17, 35, 45, -83, 45, 24, -99, -25, 99, 78, 37, 41, -75, -54, -71, -45, 18, 69, 31, 38, 51, 94, 64, 29, 39, -80, 96, 98, 91, -33, 25, -58, 81, -1, 22, 89, -8, 100, 39, 28, 99, 60, 91, 15, 14, 95, 41, 18, -8, 41, -92, -28, -75, 76, 5, 44, -33, 87, 9, 30, -76, -80, 39, -47, -100, 27, -100, 72, 73, 75, 34, -91, 42, -61, 38, 83, 73, -56, -14, 40, -74, -51, -40, -88, 39, 56, -16, -17, -81, -70, -93, -77, 66, -68, -59, 42, 95, 92, 59, 38, -7, -64, 46, 78, -67, 98, 87, -48, 39, 89, -5, 93, 4, -53, -61, 51, 77, 95, -13, -58, -84, 1, 82, 61, 10, -31, -41, 78, -24, 100, -66, 61, -85, 45, -63, 70, -69, -94, -55, 88, -83, -30, -61, -13, -23, 77, -96, 81, -15, 85, -79, -27, -11, -22, 65, 18, 76, 28, -23, -65, -6, -73, -3, -66, 87, -39, -14, 73, 7, 24, -22, 24, -40, 92, -75, 62, -44, 90, 31, -59, 72, 66, 92, -79, 38, 64, -11, 78, -43, -94, 35, -50, 50, -11, 7, -92, 73, -63, 10, -88, -94, 38, 77, -34, -60, 56, 64, 83, -85, -57, -51, 98, 33, -83, 46, -50, 93, -98, -12, -47, -52, -73, -63, -73, -69, -60, -65, 2, -65, 6, 25, -14, -35, 37, -31, 99, -22, -8, 90, -9, -79, -81, -68, 42, 34, -11, -51, -91, -22, -64, -42, -13, 3, -38, -80, 3, -22, -64, -56, 41, -58, 15, -16, -17, 60, -98, 3, -14, 71, 10, -14, -10, -66, 52, -5, -15, 35, 15, 89, 45, -9, 55, 39, 91, -99, 86, 64, 23, -97, 68, 72, 8, 10, -67, -14, -88, -94, -69, -78, 76, 99, -54, 64, 75, -72, 64, -78, -63, 26, -57, -96, 79, -61, 38, -23, 5, 29, 62, 72, -52, 22, -66, 5, -29, 59, 95, 8, 24, -30, -62, 75, -10, -64, 87, -20, 31, -78, 41, -96, 93, 9, 51, -83, -74, -77, -72, 38, 45, 22, 27, 11, 16, 31, -68, -59, 59, 78, 24, -97, -81, 94, -33, 89, -43, 74, -21, 86, 33, -6, 67, 50, 79, -97, 64, 69, -57, 24, -59, -72, 46, 59, -57, -46, -21, 32, 12, 73, 72, -80, -23, 49, -71, -78, -96, -38, -42, -19, -49, -36, -62, -98, 69, -30, 54, 55, 81, -86, 80, -29, -31, -97, -7, 44, -67, 23, 33, -65, -2, 66, -21, -35, 35, 42, 90, -10, -21, 92, -42, -91, -94, 11, -25, -89, -22, -55, -69, 59, 14, 13, 25, -11, -40, 96, -40, 1, 13, 73, 95, -9, 82, 28, 6, 94, -52, -76, -85, 40, 79, 7, 63, 99, -57, -18, -54, 23, -21, -25, -81, 45, 81, -89, 11, 52, -41, -26, 9, -67, 40, 65, 39, -65, -73, -62, -24, 70, 3, -10, 14, 58, -99, 16, -19, -11, -59, -70, -40, 1, -45, -18, 27, -87, -87, 56, 77, -51, 90, 0, 100, 92, -33, -30, -90, -87, 5, 3, 30, 27, -93, 70, 36, -82, 39, 54, 11, -43, -76, -56, 1, -53, -51, -20, -57, -42, 60, 2, -23, 55, -83, 82, 60, 15, 5, 42, 88, -90, 63, 42, 80, -39, -53, -7, 42, 90, -14, 70, -51, -41, -42, -86, -72, -61, -70, -28, -90, -20, -39, 35, -50, -44, 31, 63, 46, -77, -60, -52, 73, -65, -91, -23, 34, 39, -15, 75, 64, 63, -41, -5, -93, 34, 6, 70, -43, -20, -15, 73, -67, -17, 16, 99, -79, 48, -86, 32, 1, 44, 99, 46, -96, -78, -18, -87, -91, -70, 40, 26, 49, -64, 66, 37, -70, 70, -2, 63, -66, 10, -33, 82, 16, 95, 25, 74, -95, 18, 55, -71, 54, -32, 7, 66, -66, 2, -57, 42, 59, -72, 90, -95, -74, -73, 32, 68, -45, 11, -47, -21, 4, -83, -58, -12, -27, 56, -91, 33, -12, 31, -67, -18, 60, 31, 71, -3, -70, -21, 93, 85, -41, -99, -65, 97, 24, 87, 50, 2, 74, 15, 0, -55, -21, 6, -57, 46, -52, -13, -43, -10, 34, -7, 68, -23, 21, 42, -25, -48, -78, -24, -28, -13, 2, -7, 92, -41, -91, 1, -43, 74, 42, -92, -88, 50, 60, 36, 30, -28, 15, 52, 24, 10, -30, 63, -12, -81, -20, 81, -11, -82, 87, 64, 11, 30, 6, 20, -9, 46, 80, 73, -21, 83, 97, -70, -48, 12, -67, -70, 87, 38, -95, -74, -94, -52, -5, 99, -41, -68, -54, 71, 18, -74, -79, -54, -8, 75, 57, -99, 42, -54, -74, 98, -74, 40, 82, 44, -26, 86, -91, 20, -68, 64, 25, -93, 60, 34, 61, -30, 34, -60, 17, -46, -94, -17, 45, 70, -23, 67, -48, -87, 48, 12, -44, -10, -55, 53, -10, 51, 32, 69, 1, 5, 70, 27, -69, -95, -27, 94, 34, -72, -67, -94, -20, -24, -43, -16, 58, -28, -56, -54, -24, 99, 100, -28, 67, 15, -71, 89, -30, 44, 2, 32, 3, 21, 28, -70, 62, 8, -29, 57, 26, -16, -86, -45, 87, -74, -99, -27, -37, -96, -10, -33, 40, -20, -16, -78, -4, 77, 23, 100, -64, -71, 50, 61, 91, 82, 98, 16, -92, 31, -35, 19, 23, 60, 59, -57, 8, -64, -34, -41, 86, -65, -52, 78, 6, -93, 77, -60, 0, 12, 8, 65, -15, -23, -46, 9, 95, 45, -36, -37, 39, 17, 68, -59, 16, 87, -51, 63, -53, 98, -28, 35, 52, 34, 5, -93, 9, -70, -89, 26, -44, 93, 39, -74, -55, 34, -40, 85, -43, -88, 80, -1, 92, -52, -66, -7, -6, 44, -29, 94, 22, -91, 61, -97, 24, -72, -55, 73, -24, -42, 88, 95, -35, 61, 6, -15, 32, -92, -81, 48, 26, -84, -89, -19, -34, 32, 87, -48, 79, 75, 46, 44, -47, -33, -66, -13, 68, 40, 60, -86, 90, -86, -70, 6, 55, -91, -44, 98, 60, -94, 32, 24, 18, -21, 23, -44, -29, 67, -73, -65, -45, 74, 98, 15, 67, -42, 70, 22, -35, -92, 33, 18, 21, -36, 30, 64, 26, -14, -68, 36, -48, -9, -50, -30, 53, 43, -61, 78, -62, 82, 63, 20, 92, -16, 72, 36, -64, -14, 28, 93, -38, -58, 55, -1, 58, 4, 96, -93, 61, -52, -5, 85, 22, -54, -76, 30, 72, 13, 79, -2, -5, -67, 96, 8, -9, -93, 54, -38, -19, -76, 85, 75, 28, -93, 23, 48, -3, 0, 10, 56, 57, -98, 34, -1, -90, 59, -42, 39, -22, -63, 21, 51, -36, 45, -55, 24, -45, 90, -94, 4, 93, -61, 81, 58, -4, -49, -70, 61, -94, 43, 49, 80, -10, -84, 24, -97, 88, 21, -2, 79, 62, 71, 42, -40, 71, -80, -24, -54, -26, -52, 80, -74, -70, 71, -69, 57, -83, 24, -38, 27, -85, 62, 89, 36, -39, -62, 78, 14, 37, 79, 39, -29, -39, 30, -18, 22, 38, 35, 8, 21, 50, 18, 37, -83, -25, 66, 53, -90, 37, 30, -39, -30, -40, 31, -40, 35, 1, -88, -89, -66, 81, -50, -58, 10, -35, -86, 76, 61, -62, -75, 11, 96, 75, -50, 10, 31, -3, 54, 18, 69, -45, -32, 45, 88, -97, 28, -51, -17, -31, 47, -81, 73, -74, -75, 59, -91, -19, 4, 39, -13, -77, 16, 78, 65, -55, 35, -46, -23, 58, -13, -85, 47, -63, 10, -86, -23, -25, 61, -29, -82, 96, 19, -38, 4, -69, 9, 64, 93, -94, 75, 38, -14, -70, 71, -56, 99, -45, 59, 48, -70, -100, 38, -8, -33, -65, -22, 86, -34, 83, -50, 56, 29, -95, 58, -47, -13, 67, 44, -96, -99, -43, -89, -96, 5, 87, 68, 47, 99, 28, -45, -31, -45, -47, 38, -98, -6, -73, 10, 6, 19, 32, 23, -11, -85, -70, -73, 34, 36, -62, 70, -74, -25, 16, -12, 6, 21, 25, -3, -68, -10, 83, 19, -99, 41, -88, -77, -32, -67, -14, -82, -71, -52, 70, 43, 79, 13, 15, 76, 38, -23, 74, -66, -30, 56, 7, -47, -78, 51, -91, -40, 35, -53, 11, 25, 56, -14, -75, 64, -49, 65, -95, -93, -84, -25, 89, -67, 46, -31, -19, 17, 64, -63, 42, 1, -61, 36, -48, 97, 17, -35, -21, -49, 28, 57, 23, 11, -100, 66, -85, 44, 11, 11, 1, -19, 49, -2, 58, -61, 54, -65, 24, -97, 17, 96, -76, -6, -23, 57, 74, -89, -74, 72, -38, -46, 57, -19, -87, -45, 46, -15, -75, 98, -9, 65, 96, -65, 45, 84, -23, 11, -78, 18, 15, 41, 96, -79, -73, -58, -25, -83, -1, 23, 8, -65, 24, -94, -78, 61, 16, 13, -5, -80, -31, 74, -48, -17, 5, -60, 59, 27, 41, -13, 2, 6, -84, -76, -37, 100, -15, 18, 75, -66, -64, -46, 44, 55, 28, -48, -28, 82, 12, 88, -88, -54, 91, 59, -73, -48, -70, -93, -29, 23, -3, -14, -27, 0, -76, 14, -68, 95, 34, -4, 93, 11, 73, -5, -96, 20, 9, -84, -25, -49, 39, -39, 62, 89, -80, -16, 93, 80, -80, 42, 50, 27, 58, -47, 82, -75, -48, -35, 66, -94, 66, -69, 53, -14, 56, 52, 83, 58, 93, -99, 74, -26, -72, 26, -52, 100, -69, 57, -86, -39, -23, -84, -79, 57, -20, 43, 79, -93, 91, 66, -70, -89, -68, 85, -89, -76, 65, -53, -18, -46, 30, 24, -32, 62, -50, -74, 64, 43, -76, -68, -39, 44, 70, -71, -60, 16, -97, -35, -41, 36, -70, -12, -1, 18, -32, 51, -77, 72, 64, 85, -78, 62, -38, 17, 13, -95, -95, -71, -100, -38, 35, -73, -12, 60, -48, -63, -49, -23, 38, 29, -48, -7, -7, 95, -94, -34, 36, 15, 90, 38, -64, 41, 46, -93, 34, -42, 22, 90, -94, 19, 82, -98, -34, -83, -56, -4, -9, 63, 43, -22, 56, -42, 45, 76, 73, -18, 56, 97, 8, 77, -46, 54, 34, -10, -18, 25, -20, 68, 38, -96, -35, 10, 83, -89, 69, 5, -26, 37, -73, -94, 41, -24, 96, -40, -50, 69, 35, 77, 28, 96, -90, 6, -53, 37, 42, 2, -54, 52, 11, -95, -90, -84, 42, -85, -45, -35, 63, -18, 65, -26, 26, 30, -83, -12, 81, -7, -84, 13, 6, -2, -88, -38, -87, 86, 63, -83, 32, -87, -76, -57, 20, -62, 39, 3, 88, -39, -48, -48, 55, 62, 17, -36, 30, -58, -51, 98, 36, -65, -78, -27, -51, -46, 24, -89, -18, -69, 51, -15, 94, 54, 88, -82, 100, -50, -37, 29, 63, 27, 38, 95, 95, -37, -100, -12, -75, 38, -14, -99, -8, 67, 18, 31, -21, 10, 64, 25, 88, -96, 42, 94, -75, -95, 22, -57, -43, -20, -55, 1, 69, -53, 13, 54, -81, 97, 14, 62, -25, 75, 94, 95, 20, 79, 8, -33, 31, 66, 48, -35, 43, 34, -18, -92, -84, 12, 39, 84, 72, 19, -90, 40, 58, -75, -38, 58, -79, 33, 47, -91, -18, 62, -75, -30, -64, 35, 32, 71, 25, 14, -9, 94, 99, 16, -52, -65, -75, -56, -40, 71, 31, -25, -43, 4, -75, -6, -22, 27, 56, 36, -23, -65, 31, -42, 64, 23, -13, -20, 40, 47, -84, -50, -46, 60, 48, -20, 49, 52, 94, 9, 39, 42, -15, -99, 31, -56, -88, -46, 59, -79, -12, -46, 44, 97, 78, 35, 88, -4, 37, -82, 27, 41, -34, 82, -40, 83, -38, 4, 3, 38, 74, 33, -67, 92, -2, -37, -14, -20, -35, 58, -18, 89, 81, -9, 35, 69, 68, 86, 67, 49, 51, -63, 29, 24, -60, -82, 4, 29, -9, -5, -39, -85, -7, 49, 41, 15, -45, -36, 72, -47, 93, -15, 73, 60, -51, 4, -79, -61, -62, 4, 68, -33, -94, -16, 98, 31, -25, -10, 86, -17, 53, -70, -2, 100, 96, -49, 11, -29, -80, -85, 78, -85, 45, 74, -45, 55, -19, -23, 83, -64, 43, 92, -41, 88, -90, 25, -35, 25, -69, 46, -45, -96, 30, 55, -11, -7, -29, -1, -72, -42, -76, 49, -4, 0, 16, 98, -78, -31, -22, -22, 67, -3, -87, -72, 43, -14, -91, -54, -97, -89, -59, -97, -17, -9, -9, -95, 41, -66, 74, 85, -36, 46, -44, 92, -88, 35, -83, 62, -14, 13, -75, 65, -35, -75, 25, -44, -76, -71, 34, -74, 38, 0, 35, -90, 25, -71, -7, 15, -86, 83, -66, -62, -77, -93, -58, 69, -17, 68, -54, -75, 79, 49, 32, 42, 63, 0, -38, -8, 76, -46, -29, -41, 84, -72, -82, -28, 37, 0, 37, -44, 81, 83, -33, 96, -14, 2, 82, 96, -29, 28, 17, 39, 62, 15, -19, 60, 8, 52, -85, 35, -66, 73, 38, 88, -57, 38, 38, 49, -16, -19, 89, 75, 1, -38, 78, 72, -68, -41, 22, -99, 40, 93, -44, 70, -56, -70, 37, -78, -72, -70, -83, -90, 2, -54, -98, 29, 81, -29, 58, 35, 70, 75, 29, -79, 23, 32, 34, -81, -24, 29, -69, -11, -98, 68, -59, -24, 72, 0, 98, 44, 27, -54, 96, 51, 98, 22, -67, 77, -59, -68, 22, -74, -42, 46, 14, 30, 98, 27, 19, 52, 12, -86, -18, 87, -18, -78, -90, 86, 15, 61, 2, -94, 5, 71, 91, 13, -78, 1, -43, -81, 54, 16, 87, 35, 0, 94, -99, -79, -31, 2, 3, -65, 7, -77, 39, -79, -18, -28, 23, -20, 50, -27, 90, -71, 46, -75, 27, -90, -81, 17, -45, 72, 95, -54, -12, -43, -91, -79, -30, -77, 93, -5, 88, -94, -29, 26, -63, 48, 35, 20, -12, -73, -9, -47, 58, 15, 15, 19, -60, -64, 24, 65, 78, -25, -64, 0, -70, 89, 45, -11, -95, 36, 38, -6, 18, 9, 19, 29, 22, -72, 9, 20, 78, -32, 50, -94, 27, -45, 26, -24, -39, -27, -86, -48, 70, 19, -66, -87, -8, 96, 21, 76, -83, 78, 28, 24, -74, -37, -41, 68, 48, -87, 15, 47, -9, -16, -14, 38, 19, 93, -17, -77, 18, -12, -64, -15, 26, 51, -86, -89, -6, 91, -70, 80, -7, -17, -29, -57, -71, -66, -80, 10, -38, -9, 44, -89, 45, -9, -41, -34, 14, -86, -85, -79, 17, 12, -6, 90, 58, -100, -26, -95, -14, 36, 79, -39, -43, 7, -82, 8, 40, 22, 59, -1, -92, -52, 64, -70, 58, -42, 82, 46, 90, 29, -56, -5, -58, -3, -100, 88, 30, -10, -57, 34, -68, 36, -71, 45, -45, 4, -70, 99, 90, 77, -12, -100, 9, -19, -82, 14, 25, -37, -48, -95, -84, -55, 99, 17, -28, 0, 82, -10, -95, 97, 8, 95, -61, -10, -35, 36, -90, 47, 15, -58, -43, 53, -63, -7, -65, 82, -95, 30, -36, 23, 91, 85, 16, 85, -83, 50, -5, 56, 50, 27, -65, -31, -6, 33, 61, -57, -57, -74, -1, -49, 69, -76, -27, -62, 66, 39, 38, 12, -98, 14, -79, -97, 35, -87, -87, -85, 59, -37, -85, -49, -82, -32, 39, -8, -96, -59, -84, 10, -29, 3, -7, -91, -85, 43, -59, -98, 50, 20, 55, 72, 95, -77, -82, -26, -61, -55, -61, -39, -83, 39, 41, -19, 88, 7, -89, 3, 54, 33, -13, 14, -68, 17, -21, 77, -89, -6, 84, -48, -88, 21, 99, 1, 30, 91, -43, -97, 72, -35, 14, -65, -78, -82, -61, -29, 43, -43, 6, -83, -65, 51, 28, -100, -37, -39, 9, 63, -26, 45, -85, -84, -77, -3, 95, 29, 100, 37, 80, 78, 96, -87, 11, -35, -19, -8, 80, 91, -29, 0, -52, -11, 89, -64, 76, 95, 60, 49, -31, -68, -73, -13, -97, -35, -24, 9, -52, 27, 38, -66, 66, 37, -27, 99, -32, 50, -67, 23, 10, -69, -85, -33, -47, 23, 55, 11, -41, -23, -25, -41, -16, 11, -21, 17, 71, -99, -78, -55, -28, -47, -30, 24, -20, -92, -31, 71, -17, -27, -28, -89, -69, 61, -18, -68, -37, -53, -85, 77, 13, 50, -75, -47, 71, -64, -92, -88, -41, 5, 25, -21, 27, 29, -41, 84, 14, -58, 46, 23, 38, -54, -38, 34, -7, 22, -70, -46, 52, 99, -71, -65, -51, 41, -72, 54, 16, 77, -65, 61, -80, -63, -26, 77, 25, -64, 19, 46, 17, -100, 67, -46, 53, 70, -42, -50, 6, 42, -93, -7, 41, -4, -94, -83, -89, -99, 77, -8, 48, -94, -89, -17, -44, -23, -27, -78, -71, 10, -43, -6, -49, -45, -91, 46, 46, 7, -14, 86, 71, 86, -17, -97, -4, 11, 92, 40, -34, 39, -8, 82, 88, -6, -60, 63, -99, -79, 49, -60, -6, 15, 19, -87, -8, -66, 77, -92, 17, -5, -42, -45, -91, -76, 72, -90, 0, -92, 34, -30, 61, -18, -81, 13, -12, -96, 11, -46, -12, -86, 75, -97, -23, 19, 12, -80, 36, -35, 6, 62, 11, 16, 78, 27, 1, -23, -64, -95, -19, -15, -19, -50, -35, -5, 44, -36, -92, 40, 0, 85, 57, -70, 50, -38, 55, -42, -91, -12, 23, -1, -11, -75, -24, -84, 67, -33, -78, 62, -92, -56, 64, 96, 46, -26, 100, -74, 40, 84, 87, 39, -92, -9, -24, -17, -24, 54, 90, -72, 49, -28, -13, 5, 46, -63, -6, -62, 42, -47, 59, 9, 11, 73, 88, -49, 61, 100, -66, 97, -64, -23, -40, 10, 13, 76, -92, -82, 20, 4, 55, -21, -75, 65, -61, -76, -2, 17, -32, -30, 50, -12, -36, 49, -37, 95, -43, 55, 11, 22, -4, 95, 5, -97, 28, -75, -68, -74, -59, 96, -30, -37, -76, -29, 4, 31, -89, -43, -6, 38, 0, 7, -42, 16, 63, 8, -79, -36, -51, -97, 99, 79, 1, -58, 4, 73, -97, 40, 65, 72, 52, -34, -46, -5, 66, -36, -26, 29, 96, 19, -15, -39, 73, 11, 58, 62, 25, 72, -24, 81, 98, 96, 21, 56, 99, -93, -47, 34, -18, 2, 50, -1, -69, -39, 72, 95, -71, 5, -62, 32, 94, -79, 55, 49, 27, -72, 70, -59, -41, 18, -24, 98, 95, 86, -5, -15, 11, -17, -95, -28, 55, -24, -70, -62, -51, -23, 25, 64, 8, -13, 99, -86, -50, 97, -78, 52, 73, 50, -91, -28, 12, -24, -69, 12, 78, 68, -36, 92, 0, 67, -83, 63, -70, -47, -38, -100, 79, 84, -92, 19, -9, -11, 15, -45, 74, -98, 29, -47, -64, 83, 58, -4, -89, 85, 94, 11, 53, -23, 39, -11, 43, 80, -29, 76, 76, -9, -94, -86, 4, 63, -29, -27, 42, -39, 45, -55, 4, 8, -40, 20, -58, 71, -2, 93, -46, 66, 32, 84, 11, 42, -10, -85, -44, 1, -76, -79, 58, 22, 61, -14, 43, 97, 86, 42, -19, 1, 40, -77, 40, 92, -65, -52, -19, -53, -4, 1, 70, -95, -33, -87}; +static int32_t dotp_A_dram[32768] __attribute__((section(".data"))) = {1, 42, -36, 21, 10, -30, 32, 36, 24, 24, 37, 49, -27, -48, -29, 2, -49, 37, -21, -13, -49, 13, 9, -30, -18, 25, 7, -29, 38, -2, 40, 8, -9, 41, 9, 29, -36, 11, 11, -4, 11, 0, 4, 13, -48, 50, 0, -44, -30, 22, -12, -33, -47, 38, 9, -37, -42, 39, 2, -49, 33, 41, 9, 20, -7, -43, -4, -16, 27, 30, -15, -1, -47, -49, -45, 3, -47, 3, 42, 12, -33, 39, -7, -17, 23, 11, 49, -37, 44, -3, -36, 21, 27, 36, 11, -11, 34, 29, 31, 2, -27, -25, 38, 9, -10, -22, -36, -6, 14, 38, 20, -42, 37, -50, -43, 37, 12, -40, 30, -43, -16, -16, -18, -46, -10, -23, -44, 22, 21, -39, -17, -18, -3, -28, 11, 37, -14, 48, -7, 35, 40, -16, 14, 48, 50, -4, 27, -48, -50, -46, 39, -37, -24, -42, 28, -36, 39, -9, 26, 0, 12, 45, 1, 45, -47, 43, 50, -28, -36, -8, -22, -15, -38, -19, 20, 8, 35, -23, 15, -9, -6, 11, 6, -45, -23, -23, -7, 33, -21, 11, 24, 41, 38, 11, 46, -50, -24, 11, 26, -48, 19, 21, -24, -42, 11, -14, 46, 0, -7, -27, 28, 8, -19, 45, 37, 1, 11, 7, 1, -39, -12, -49, -48, 50, 5, 30, 8, -49, -49, 41, 3, 36, 50, 45, 46, -50, -32, -49, 2, -7, 39, -19, 19, -19, 17, 4, 24, 5, -34, -13, -27, 18, 47, 19, 35, -40, -35, 46, 22, 8, 19, 29, 42, -48, -31, 8, -15, -32, 39, 16, -32, -31, 45, 20, 1, -18, -11, -12, 31, -50, -40, 41, 6, 38, -1, -28, -20, 43, -9, 48, -44, -35, 39, 9, -49, -50, -3, -39, 18, -14, -19, -42, 48, -32, -3, 29, -48, -31, -27, 3, -18, -27, 24, 21, -15, -13, 33, 48, 38, 48, -26, 42, -33, 31, 15, 3, -16, 29, 10, -10, 49, -18, 17, -18, -37, -30, -3, -31, -43, -44, 16, -34, -18, -3, 25, 8, 35, -29, -21, -13, 0, 3, -43, -24, -24, 47, -30, -21, 46, -23, 13, 46, 18, 10, -3, -32, -47, -16, 13, -2, -34, -7, 41, -21, 42, -5, -45, 48, -14, -27, 42, -5, 2, 44, 48, 9, 46, 12, 34, -19, 36, -18, 16, -33, -26, 44, 3, 7, 16, -5, -27, -19, -4, 35, -28, 15, -24, -49, 39, -34, -18, -42, -8, -3, -12, 42, -9, -25, 48, -1, -26, -27, -38, 9, -44, 6, -15, -6, -31, 14, -43, -35, -37, 25, 36, -36, 41, 47, 15, -19, 36, 12, 35, 0, -26, 7, 12, 11, -29, 7, 7, 35, -2, 1, -9, 19, -36, 3, 9, 50, 46, -43, 2, 9, -46, 17, -45, 45, 43, -4, 48, 4, -11, 1, -35, -38, -21, -32, -34, 12, -32, 41, 7, 4, 39, 50, 39, 11, -28, -42, -39, -50, 7, -50, -17, 45, -3, 38, -50, -35, 10, 13, 12, 18, -29, 42, 16, 25, -25, -35, 0, 50, 35, 6, -22, 27, 41, 18, -4, 43, 11, 18, 25, -35, 39, 39, -3, 34, -12, 49, -18, 43, 50, -28, -41, 18, 49, -17, 1, 44, -41, -32, 7, 45, -50, 18, -47, -35, -27, 29, -49, 41, -19, 40, 33, -27, -39, -1, -16, -18, -18, 10, 0, -8, 50, -39, 16, 14, -18, -11, 23, -8, -7, -22, -38, -39, 44, -5, -49, -16, 36, 30, 39, -43, 42, -25, 23, 39, -17, -44, 17, 7, 24, -22, -15, 38, -30, -15, -41, 50, 22, -27, 13, 48, -2, 48, -15, 31, 45, -27, -28, 11, 45, -14, -39, 4, -38, -28, 38, 48, -21, -34, 11, 33, 38, 35, -38, 8, -32, -2, 49, -39, 10, -32, 25, -42, 20, -23, 27, 44, 1, 32, -35, 18, 48, -39, -26, 1, 34, 49, 2, -28, -35, 6, -12, 2, -9, 7, -12, -37, 44, -46, -16, 36, 42, 24, -33, 25, -42, 23, 7, -34, -44, -5, -38, -11, -9, -42, -1, -24, 15, -46, -22, -14, -13, 32, -43, 14, 35, -34, 20, 38, -6, -47, -15, 19, -20, -32, 10, 3, -12, 40, 23, 39, -32, -12, 16, -6, -38, 41, 7, -31, 41, 21, 10, -12, -50, -48, 26, 41, 11, 12, -26, 5, -18, -13, -45, 7, -7, -6, -19, -6, 10, -4, -30, 29, 34, 24, 50, -15, 48, -32, -31, 6, -33, -4, -2, -37, -36, -20, -50, 3, -48, -35, 36, 6, 24, -39, 23, 45, -35, 21, 25, -27, -23, -43, 41, -15, 39, -43, 7, 9, -1, -23, 41, 50, -10, 49, 13, -24, 12, -34, 22, -18, 33, 26, 41, -22, -38, -5, -16, -45, 31, 18, -4, -26, 15, -41, 5, -21, -46, -18, 14, -33, 45, -2, -40, 34, -25, 12, 38, 35, 8, -24, -2, 26, -18, 47, 48, -50, -30, 4, -45, 41, 30, 18, 44, -46, -48, 2, -28, 50, 2, -14, 23, 23, 32, -34, 34, 27, 22, -50, 0, -6, 26, -47, 11, 14, -19, -17, 41, 44, 21, -12, -25, -17, 3, -48, -1, -39, 14, 3, -46, 43, 43, 6, -34, -4, -28, 28, 50, 34, -37, 15, 24, 0, -13, 13, 47, -13, -1, 47, 31, -21, 28, 40, 0, 12, 47, 1, -13, 46, 37, 28, -21, 0, 30, -46, -22, -47, -41, 5, -34, 23, -34, 33, 37, 18, -17, -45, 2, 15, 26, -8, 24, -28, 4, 29, 44, 24, -35, -43, -47, -47, 5, -26, 16, 45, 16, -24, 42, -19, -1, 10, 0, -32, -30, -46, 31, 41, -9, 10, -29, -30, 19, -50, -46, -39, 39, -5, -17, -2, 27, 39, -6, -24, 22, -25, -4, 35, 5, 43, 12, -3, 10, 30, -25, -15, -50, -43, 48, 1, 28, -4, 5, 35, -37, 39, -23, 36, 27, 37, -49, -25, -37, 8, 5, -44, -48, -28, -33, -13, 48, -36, 13, 38, 50, -23, 23, -12, 6, -34, 35, 39, -7, -26, -34, -38, 33, -26, 17, -41, 16, -33, 49, 35, -17, -43, -11, 32, -9, -10, 50, -45, 1, -25, 13, 47, 8, 5, 8, 19, 50, -18, 2, -29, -30, 19, 19, -47, 43, 24, 11, 11, 43, 44, -27, 4, -42, -48, -20, -11, 50, -15, -27, 44, -45, 15, 33, 41, 24, -47, 28, -45, 43, 0, 11, 6, 15, 28, 24, -43, -25, 0, -6, -7, -46, 19, -25, 17, -32, 33, 46, -31, -39, -4, -50, 39, -37, 13, -13, -14, -40, 49, 26, -48, -18, -45, -1, -41, -46, -28, -41, -7, -49, -38, -11, -49, 33, 14, 12, 50, 22, -34, -42, 24, -36, -27, -13, -16, 43, 44, -2, 18, 11, 9, -1, 27, 24, -42, -17, 25, 48, -16, -50, -11, 13, -29, 9, 13, 42, 21, -40, 50, -37, 9, -21, -16, 34, -14, -46, 32, 27, -25, 11, -47, 38, -9, 38, -33, -11, 21, -12, -37, -19, 0, -13, 46, -28, 12, -36, 46, -26, -34, 46, 15, 27, 2, 0, -12, 0, 19, -45, 16, -44, 0, 21, -9, 13, -36, -22, -18, 43, -24, -15, -22, -13, 6, 46, 50, -24, 4, -18, 17, 35, 15, -41, -46, 23, 46, -13, -38, -20, -4, 49, 37, 1, 5, -36, -22, -43, -46, -22, -4, 17, 25, -6, -49, -24, 44, -15, -15, -25, -8, -24, 18, -31, -40, 23, -13, -45, 21, -28, -4, 39, -5, -39, 39, -38, 11, 31, 38, 46, 9, -8, 25, 49, 17, -46, -14, 21, 41, -20, -42, 0, -22, 27, -11, -10, 35, -40, -28, -50, -5, 50, -30, 39, -15, 3, 36, 6, -50, 12, 3, 4, -11, -36, -30, -4, 22, 2, -42, 23, 1, 6, -25, -10, -16, 12, -26, 39, 24, -13, -49, -44, 31, 40, -17, 40, -34, -8, 8, 0, 3, -27, -26, 20, 1, 19, 37, -18, -2, -22, 12, -29, -25, -23, 34, -2, 20, 30, 33, -2, -31, 35, 41, 12, 10, -2, 20, -50, 45, -38, 43, 36, 0, 5, 32, 11, -19, -21, -22, -2, -6, 42, -21, -35, -11, -32, -33, -50, 27, -4, 15, 41, 43, -13, 0, 12, -47, -50, -43, -22, 4, -48, -19, -41, 23, 32, -17, 46, 36, 4, 41, -19, -1, -44, 42, -43, 14, 6, 16, 37, 36, 8, 21, 3, 50, 16, 0, 46, 41, -43, -17, -16, 45, 37, 27, -19, -5, -35, 17, -14, 3, 34, -37, 44, 4, -3, 31, -44, 23, -44, -18, -28, 34, -32, -32, -15, -22, 9, 31, -49, -50, -4, 18, -31, -40, -49, 16, 36, -39, -31, -46, -14, -13, 43, -42, 47, 2, -7, 48, 35, -27, 30, 23, -21, 8, 36, 45, 30, 30, -37, -42, -11, 15, -26, 22, -29, -47, -25, 7, -22, 47, 36, -14, 24, 19, -33, 34, -9, 49, -10, -13, -17, -34, -14, -26, 25, 36, 35, 34, -24, 6, -20, -45, 40, -11, 47, -39, 2, 20, -41, -6, -34, -25, 34, 41, 11, -5, 13, -49, 3, 14, 0, 2, -15, -25, -22, -30, -40, -11, -40, -15, 8, -12, 48, 3, 47, 4, -27, -29, 18, 5, -18, -15, -31, 32, 48, 30, 11, 47, 22, -25, 15, 22, 22, -11, -34, -50, 38, 10, -8, -9, -26, -12, -16, -48, 50, -7, 0, 43, 47, -39, -32, 50, -7, 8, -2, 10, -34, 23, 6, 4, -4, -39, 11, 29, 37, 32, -43, 44, -30, 30, 36, 50, 29, 19, 21, -26, 31, 38, -39, -36, 8, -25, -25, -4, -19, -41, -35, 20, -34, -28, -25, 34, 35, -44, -37, 28, -44, -42, -3, 21, 8, 36, 42, 31, 44, 43, -12, 48, -33, 8, -34, -37, -20, -27, 48, 9, -6, 47, -48, -14, -8, -11, 39, 4, 36, -12, -36, -47, 42, 35, -26, -38, 31, -18, -35, -9, 15, 4, 48, -9, -17, -21, -38, -38, -33, -19, 45, 48, -12, -5, -22, 11, 42, 11, 6, -35, 5, -41, -21, -26, 33, -46, 14, 43, -2, -48, -6, -37, -21, 17, -33, 11, -14, -26, -3, 14, 2, 28, 22, -36, -2, 37, 17, -39, 8, -14, 10, 50, -8, 19, -12, 5, 12, -5, 37, -40, 11, 26, 47, -26, 20, 1, -47, 8, 21, -31, 42, 12, 3, 23, 47, 6, 39, -10, -48, -45, -46, -46, 3, -4, 36, -2, -42, 48, -31, 10, -16, -1, 31, 11, -34, 37, -48, -19, 48, -38, 38, 22, 17, -37, 50, 47, -40, 5, 16, 41, -22, -42, 16, -26, 47, 25, -9, -42, 28, -11, -26, -46, -40, 8, 47, 37, 28, -13, 21, -46, -3, 39, -33, 19, -14, 9, -3, 26, -23, 18, 26, 30, -11, -6, 45, 11, 42, 7, 16, 5, -11, 47, -11, 40, 26, -18, -45, 37, -32, 29, -11, 41, 46, 8, 8, -3, -10, -38, -6, 38, 2, -9, 49, 12, -24, -13, 9, -44, -46, -6, 7, -20, -28, -9, -41, -19, 2, -21, -12, -20, 31, 49, -49, 27, 26, 42, -39, -12, 15, 45, -38, -5, -24, -34, 44, 47, 9, 13, 37, -16, 19, 32, -21, 20, 23, 45, 47, 12, -23, 9, 28, 43, -14, 42, -29, 17, -31, 45, 49, 17, 40, 13, -34, -39, -29, -34, -41, 14, -29, 39, 31, -1, -37, 13, -4, -22, 25, -15, 48, 1, 25, -44, -22, -40, -18, -45, 28, -19, 0, 24, 7, 36, -25, 47, -5, 47, -22, -47, 30, 48, -38, -12, -36, -22, -22, 24, -19, -49, -4, 27, 33, -29, 24, -24, 16, 30, 5, 41, 42, -30, -4, 29, 50, 8, 33, -45, -32, 6, 18, -48, -50, 7, -13, -36, -17, 10, -16, 13, -26, -27, -39, -33, -36, 29, -24, 21, 9, -5, 38, -34, 42, 2, -43, 28, -24, -5, -1, 20, -48, 42, 13, -7, 2, -27, 9, -48, -31, -5, -36, -26, 43, 27, 20, -34, 33, 49, -42, -13, -3, 9, 12, 35, -49, 37, 21, -40, 13, 26, 30, 21, -30, -33, 43, 13, 31, 44, -13, -19, -40, -6, 38, -18, -10, -43, -40, 35, 0, 37, -10, -34, 25, -5, -19, 28, 29, 3, 35, 41, -31, -18, 23, -11, -19, 46, -49, 46, -18, 26, -21, -18, 26, -25, -29, 15, -13, 39, -5, -36, 47, -7, -2, 24, 10, 16, -45, -42, -45, 22, 44, -19, -10, 25, -43, 21, -1, 41, 11, 33, 11, -44, 24, 33, 29, -47, -45, 7, -29, -25, -48, -10, 9, -37, 24, 31, -39, 36, -39, -38, -26, -6, -32, 4, 49, -6, -43, 42, 2, 4, -19, 0, -7, 31, 19, -33, 32, -29, -14, 45, 5, 8, -48, -23, 23, -16, 10, 42, 3, 12, 28, 46, -44, 25, -2, 43, 34, -20, 7, 10, -27, -31, -14, -47, 41, -31, 9, -27, -1, -2, 0, 45, -15, 47, 49, 15, 28, -17, -15, -45, -12, -9, 7, -39, -48, -33, -11, -30, -36, 46, 48, -25, -43, 49, 43, 36, -9, -7, -37, 27, -49, -14, 18, -13, -10, 11, 9, -37, 38, 33, -49, 19, -34, 38, -23, 15, -16, 50, -46, 14, -11, 25, 5, -15, -6, -28, -4, -20, -40, -41, 16, -37, 29, 23, 42, -41, 25, 43, -50, -46, -31, -43, -8, 25, -50, 6, 13, 33, -23, -14, -4, 50, 25, -14, -2, -7, 5, -23, 28, -45, 10, -31, 27, -49, 22, -14, -31, -25, -22, -50, -16, 19, 50, 8, 18, -18, 0, 27, -39, -31, 2, 37, -8, 47, 38, -1, -22, 6, -12, 44, 5, -8, -1, -28, -7, -13, 33, -28, -6, 1, 29, -1, -43, 34, -50, -43, -22, 45, -46, 35, -4, -17, 14, 4, 39, -8, 23, -21, 31, -34, -25, -43, -4, 25, 40, 21, 38, -5, 17, -18, -50, -32, -20, 29, -37, 2, -3, 18, 39, 11, 41, 15, 13, 19, 12, 22, -18, -10, 38, -3, -38, 22, 26, -20, 24, 17, 47, -47, -32, 19, 47, 31, -38, -28, 32, 24, -50, 37, 3, 20, 38, 34, -36, 14, 25, 20, -36, -30, -32, 9, 42, 38, -18, -2, 45, -16, -7, 39, -40, 48, 21, 27, 23, 15, -5, -42, -48, 34, -25, 21, -3, 15, 19, -23, 42, -25, -26, -39, -46, 47, -3, -14, 28, -7, 49, -36, -8, -3, 36, 19, -5, -8, -30, -28, 29, -4, -36, -26, -15, 24, 0, -36, 17, -30, -38, 35, -32, -17, 27, 17, 1, -24, -22, -23, -16, -43, -35, -15, -21, -33, -49, -2, 26, -47, 39, 38, 43, 24, -44, 44, 23, -12, -38, -20, 20, 12, 5, -9, 10, -9, 5, -15, 33, 17, -44, 3, -50, -7, -6, -4, -38, -29, -30, 35, 41, -42, -25, -42, -36, -41, 37, -9, 21, -27, 29, -2, -25, 40, -14, 17, -1, -27, -32, 49, 9, -12, 23, 38, -33, -32, -15, 23, 46, 4, 18, -4, -2, 48, 47, -18, -30, 30, -29, -3, -14, -36, -16, 41, 20, -19, -40, -41, 22, 27, 26, 6, -26, -49, 13, -16, -44, 34, -33, 16, -9, -12, -10, 24, -27, 9, -5, -32, 17, 39, -9, -19, -12, -15, 50, 46, -15, -48, 22, -43, 46, 19, -10, 17, -38, -2, 9, -49, 9, -46, -7, -24, -19, -30, -43, 21, -1, 16, -7, 7, -48, 35, 19, -49, 36, -7, -49, 30, -16, 47, 36, -21, -43, -29, -7, 7, -15, 18, 26, 42, -20, -4, 4, 29, 11, -21, 4, -35, -39, -34, -35, -39, -43, 33, -48, -35, -21, -28, 41, -46, 33, 14, -21, -30, 33, 19, -29, 31, 21, -19, -18, -35, 25, -13, 47, -37, -15, 46, -28, 15, 34, -49, 40, 22, 14, 24, 16, 1, 11, -28, -25, 17, 31, 4, -45, -16, -29, -8, -36, 35, 9, 50, -39, -2, -9, -13, 31, -6, -16, -21, 37, -21, 27, -45, 16, 29, -44, 1, -37, 22, -36, -30, -16, 15, 40, -49, -16, 31, 27, -31, 31, -41, -26, 15, -26, 3, -18, -15, 44, -37, 14, 29, 3, 1, -48, 48, -10, -45, -26, -38, 47, -43, -30, 47, 17, -26, 28, 17, -6, 9, -39, -19, 45, 41, -38, -20, 27, -31, -33, 42, 9, 12, -45, -19, 42, -8, -49, 9, -28, 32, -20, -46, 32, -17, -41, 38, -49, -40, -1, -20, 5, 28, 22, 36, 32, -42, 48, -30, 22, -23, 11, -44, 29, -35, 46, -47, -47, -11, -34, 50, 1, 42, 1, -15, -13, -1, 12, 50, 12, 11, 48, -44, -24, 41, 35, -37, 20, 50, 35, -46, 4, -49, 11, 40, -30, 28, -30, -41, 36, 7, -12, -46, 14, -38, 34, 39, 34, 2, 31, 50, -6, -19, -15, 30, 48, 9, -40, 12, -30, 1, 4, -25, 17, -17, 1, 31, 48, 42, 1, -22, -13, -9, -30, -9, -38, 13, -34, -42, -10, -50, -49, 9, -3, -22, 46, -41, 7, 9, -30, -23, 24, -17, -43, 8, 35, 21, -2, 28, -34, 9, 36, 37, -6, 32, 18, -19, -7, 14, 36, 50, -43, 26, 21, 36, -8, -50, 0, -27, 48, -27, -34, -46, -31, -30, 7, -20, 49, -40, 1, -36, 32, -44, -23, 0, 7, -46, -46, 43, 45, -43, 13, -41, -13, 45, 41, 30, 44, -43, -26, 22, 15, 28, -1, 16, -2, -15, 17, 27, -10, 38, 11, -41, -30, -15, -39, 40, -49, -38, 2, -19, 44, -35, -19, -19, 47, -40, -41, -36, -34, -11, -33, 4, 22, -26, 8, 27, 38, -29, -21, 33, 34, -7, -19, 0, -5, -30, 48, -19, 43, -12, -39, -4, -33, -30, -38, -30, -43, -5, -44, -28, 45, 24, 35, -29, 38, -29, 41, -22, -38, 31, -49, -22, 34, 28, 1, -24, -1, 44, 28, -28, 37, -7, 26, -29, -8, -14, 10, 46, 5, -48, 12, -32, -28, -22, -21, -12, -26, 50, -43, 7, -35, 21, -50, -46, -48, 14, -47, 48, 45, 13, 47, 38, -41, -30, -5, 40, -24, 15, -10, -38, -42, -15, 35, 39, 7, 3, -39, 30, 27, -37, -17, 2, -31, 24, -35, 44, 19, 5, 32, 50, 7, -47, -47, -31, -41, -27, 48, -25, -14, 34, 3, -30, 23, -13, -5, -47, 9, 6, -6, -31, -34, 20, -47, 42, -37, -48, 37, 50, 29, 7, 4, -47, -27, -17, -21, 31, -32, -20, 9, 9, -32, -2, 12, 32, -29, -27, 25, -21, 7, -20, 49, 13, -32, -3, -6, 49, 43, 4, 4, 46, -33, 12, 41, -4, 24, 6, -6, -18, -34, 19, -47, -31, -4, 40, -36, 19, -4, 27, 24, -42, 39, -35, 18, 10, -41, -1, -48, 26, 43, 19, 30, 0, -32, -9, -16, -5, -25, 18, 42, 13, -14, 33, -2, -30, 23, 13, -46, 49, 19, 39, -47, -12, -16, -50, -27, 6, 49, 19, -10, 3, -5, 9, 9, 6, -20, 33, -27, 38, -15, 34, -21, -27, -21, 35, 41, -44, -16, 4, 41, -37, -41, 29, -35, 3, 44, 38, 26, 19, -7, 22, -6, 49, 5, 33, 31, 6, -30, 17, -1, -18, 40, -44, 19, -36, 31, -19, 24, -31, 37, -36, -3, 20, -30, -9, -25, -37, 6, -14, 7, -30, 31, 18, -48, 36, 39, -14, 37, -2, -32, 38, 34, -39, 10, -10, -18, -1, 17, 20, 35, -18, 30, -27, 10, 10, 47, -23, 7, -8, -10, -12, 35, -2, -34, 47, 19, 19, 47, 14, 23, 34, -46, -49, -29, 6, 15, 23, 47, -35, 0, -12, 35, 25, 37, -11, -13, 9, 8, -41, 48, 13, 12, -2, 13, -19, -44, -30, -31, -25, 17, 35, -36, 34, 28, 35, 41, -37, -24, -11, 7, -23, -25, 12, 15, -26, -48, 21, -7, 46, -9, 48, -45, -12, 1, -28, 38, -1, -8, -32, 18, 0, -40, -39, 23, -43, -27, 41, -10, -15, 50, 34, 21, 4, -42, -4, -36, -3, 31, -9, 9, 33, 19, -39, -49, -44, 29, -48, -48, -24, -11, -18, 41, -50, -43, 50, -19, -3, 50, -47, 43, 19, -32, -19, -42, -39, -40, -5, -35, -50, 12, -30, -21, -38, -17, -47, -23, 44, 8, -24, 18, -26, -48, 46, 17, -26, -31, -17, -25, -46, 48, 10, 41, 42, -42, -1, -45, 32, 9, -7, -40, 15, -4, 22, 34, 37, 47, 35, -48, 25, 41, -21, 39, -30, -23, 39, 11, -18, 34, -16, 1, -17, -10, 0, -4, 31, 7, 24, 6, -28, -3, -29, -34, 18, -40, 43, -36, 40, -16, -18, 33, -35, -17, 15, 48, -11, -23, -4, -12, 19, 22, -31, -50, 21, 36, 12, 16, -47, 7, -26, -4, -13, -36, 12, -30, 48, 6, 2, -5, -37, 49, 25, -34, -12, -42, 48, 26, 28, 31, 46, -45, 40, -28, 8, 40, 47, -5, -13, -37, 49, 21, 11, -16, -32, -21, 27, 33, -26, -11, 37, -37, -25, 36, -29, -3, 32, 0, -48, -9, -32, 22, -23, 33, -6, 20, 27, 12, 22, -32, -4, -37, -13, 2, 10, -15, -11, 30, -21, -42, 13, -18, 1, 38, -37, 24, 2, 48, 8, 27, 43, -10, 17, 17, 41, -43, -49, 35, -10, 4, -35, 42, 11, -3, -21, -39, -16, -40, 13, -1, 34, -30, 18, -3, -31, 50, 16, -7, -18, 22, 10, -42, 17, -16, 30, 47, 37, 45, 14, -43, -6, 36, -4, -11, 25, 3, 25, -5, -4, -36, -32, -25, 1, 42, -29, -30, 0, -13, -31, -22, 0, -47, 4, 20, 41, -23, -47, -29, 25, -6, 16, 35, 15, 37, -17, 40, 4, -50, 21, 36, -13, -45, 35, -26, 31, -34, 10, -39, -45, 39, -24, -43, 32, 14, 6, 42, 48, -11, -37, -16, -3, 33, 5, -2, -38, 10, -2, -5, 11, -43, -8, -31, 46, 39, -12, 34, -2, 13, 11, 3, -42, 37, -14, -2, -10, -34, 37, -30, 0, 8, -12, 4, -10, -12, -38, 13, -40, -32, -40, 26, -5, -6, -50, -11, -32, 25, 21, 21, 10, -39, 10, -18, -6, 39, 41, 18, -43, -26, 40, -5, 36, -21, -4, 36, -2, -4, 33, 31, -33, 15, 17, 43, -18, -15, 31, 50, -32, -23, -11, 33, 46, 25, -36, -10, -12, -49, 12, -22, 23, 15, 0, 24, 26, -41, -37, 31, 0, 22, -12, -23, -48, 33, 19, -24, -49, 42, -13, -48, -35, 43, -11, -49, 30, -10, -39, -16, 14, 4, -6, 28, 39, 50, 34, 11, -2, 44, -26, -28, -27, -13, -23, -30, 3, -33, -15, 48, -6, 22, 2, -21, 9, 47, -19, 16, 16, -23, -7, 28, -10, 12, -28, 24, -3, -19, 6, 49, -18, -27, -12, -17, 5, -23, -14, -44, 17, -14, 5, 14, 14, -4, -31, -32, -22, 23, 9, -33, 41, -16, -8, 44, 40, -40, -2, -13, 13, 18, -43, -17, -3, 5, 25, 14, -20, -47, -1, 18, -21, 37, 8, 16, 24, -6, -47, -25, -24, -5, 13, 40, 0, -1, -45, 8, -36, -21, -9, 50, -14, -9, 50, -16, 36, -45, 17, -33, 22, -22, 26, 8, -4, -34, 45, -29, 17, 18, -14, -2, -38, -17, 35, 2, 36, 0, -48, -9, 47, -19, 0, 34, -5, -30, -7, -40, 17, -50, 41, 12, -27, 48, -38, 47, -40, 49, 0, -34, 48, 31, 35, -27, -32, -14, 34, -43, -23, -46, -34, 50, -15, -32, 13, 40, 47, -40, 3, -6, -4, -39, -30, -40, 41, -46, 30, 5, -31, -10, -5, -39, 19, -34, -32, -25, -3, 1, 45, 19, 4, 49, 24, -18, 11, 37, -28, -36, -24, 24, 13, 30, 0, 2, 27, 40, 31, 41, 0, -4, -47, -44, -16, -3, 22, 21, -6, 30, 30, 46, 45, 21, -32, 12, -13, 16, 8, 18, -38, -4, 10, -20, 29, 45, -29, 42, 35, -8, 16, 3, -41, -9, 13, -30, 29, 25, 15, -10, -27, -16, 5, -21, 6, 43, -4, -16, -32, -43, -25, 20, -21, -44, 16, 14, -15, -26, -14, -50, -36, -14, -38, -43, -46, 9, 22, -50, -15, -16, 15, 12, -28, -42, -17, -5, 27, -47, -21, 44, 24, 48, 21, -48, -37, 9, 26, -6, 45, -17, -6, 10, 32, -35, 15, -11, -34, -17, -35, 9, 15, 15, 39, -38, 5, -20, -17, -12, 16, -43, 36, 27, 4, -24, 42, 2, -12, 14, -34, -21, 2, -38, -30, -32, 2, -32, 6, -26, 35, -20, 30, 4, -28, -19, 11, 23, -41, 49, 21, 3, 1, -31, -19, -37, -1, -23, 2, -27, 28, -29, -21, 12, -47, 26, 8, 36, -43, 31, -39, -20, 27, -17, 31, 47, 24, 25, -2, 28, 6, 44, 42, -25, -33, 45, 35, -13, 30, 36, 37, -1, -43, -10, -45, 18, -7, 13, -22, -23, -40, 14, -32, -42, -24, -17, -7, 17, 49, 31, -36, 0, -38, 32, -2, 19, 5, 25, 0, -14, -34, 7, 36, 39, -22, -18, 9, 40, 38, 4, -41, -4, -28, 34, -30, -38, 50, -18, -27, -40, -34, 17, -4, -26, 43, 22, -30, 33, 32, 32, -39, -14, -9, -34, 50, -3, -23, -10, 48, -4, -33, 27, 48, 20, -38, 31, 50, -38, 49, -20, -49, -35, -42, 22, -13, 24, 3, 5, 35, 46, 49, 36, -6, -17, -42, 37, -43, -44, -15, -33, -48, -23, 19, -7, -30, -23, 3, 3, 14, 49, -30, 48, -38, 6, -2, 3, -41, 2, -7, -4, 2, 23, -5, -38, -14, -27, -49, 35, 30, 49, -37, -41, -16, -26, -48, -34, -39, 3, -27, -22, -8, -26, 49, 9, 39, 14, 33, -23, -35, -4, 30, 41, 7, 25, -24, 2, -9, 8, -4, 43, -17, -14, -45, -44, 45, 45, -26, -18, 4, 7, -44, 6, -39, -35, 29, -8, 49, 26, -44, 49, 0, 22, -19, 24, -43, 46, 36, 38, 21, -6, 35, 8, -47, 16, -22, -22, 47, 47, -23, 26, 28, 36, -7, 39, -47, 39, -42, -46, 5, 45, 33, -1, 24, -36, -19, -23, -29, -34, 8, 39, 20, 6, -25, -26, -41, -6, 32, -40, 26, 2, 21, 17, 44, -23, 24, 14, -2, -4, 1, 37, 3, 9, 6, -4, -20, -5, -25, -46, 33, 1, 24, 3, -18, -1, -13, -24, 47, -36, 45, 10, -30, -5, 18, -45, -13, 11, 35, 11, 31, 27, 23, -5, -38, 44, 43, -48, 43, -45, 42, -43, -7, -18, 30, 24, 26, -1, -40, 44, -23, 19, -10, -35, 17, 48, -3, 5, 13, 8, 39, 11, 25, -40, 50, 38, -33, -32, 36, 4, 31, -25, -45, -47, -22, 8, 47, -34, -8, 29, 15, -17, -43, -38, -43, 43, 45, 49, 43, 14, -8, -12, 30, 8, 33, 37, 35, 42, 35, -7, -42, -14, 23, -15, 50, 41, -23, -9, -8, 34, 37, -9, 15, 4, 21, -3, 40, -29, 50, -24, 42, 16, -38, -6, -41, 49, -42, 3, -24, -17, -50, -19, 38, 42, 20, 16, 33, -31, 43, -16, 48, 40, 39, 27, -34, -33, -6, 42, 33, 2, 40, 31, 17, 14, -50, 7, -25, -31, 36, -41, 8, 24, -10, -46, 14, -34, -29, 47, -10, 42, 17, 18, -40, 5, 0, -30, 48, 25, -25, -32, 9, 20, -4, 20, -25, -11, -46, -30, 27, -47, -28, 33, -36, 42, -43, -10, -32, -5, -23, 40, 17, -36, 48, -14, -50, 16, -27, -24, -11, 12, 10, -15, 47, 42, -27, -27, -47, 16, -17, 6, -2, 36, 2, -28, 18, 44, 2, 11, -10, 6, 9, 3, 19, 50, 6, -41, -11, -44, -13, 34, 10, 33, -48, 0, 35, -4, 17, 41, 25, -13, -15, -10, 18, -38, 36, 7, -1, -21, 11, 50, -26, -24, 0, 27, 6, -4, 49, -12, -35, -29, 34, 3, -30, 21, -35, 8, -20, -9, 23, -19, 8, -17, -42, 30, -40, 45, -41, 35, -34, 17, -3, 1, -26, -30, 50, 14, 12, 38, 0, -15, 30, 37, 15, -36, 45, -12, 19, -50, -28, -12, 6, 30, -17, -10, 42, 22, -38, 19, -45, 33, 1, -48, 30, 12, -2, 25, -4, 4, 13, 14, 30, 16, 39, -36, 49, -19, 45, 17, -33, 32, -8, -16, 27, 7, -18, -37, -17, 10, -47, 37, 8, -22, 32, -45, 46, -2, -11, 32, 14, 18, -24, 29, -45, -38, 13, 11, 48, -32, 25, 29, -8, 23, 38, -31, 44, 17, -7, -28, -49, -29, 6, 50, 21, -44, 27, 5, 16, -35, 32, 0, 31, 29, 21, 46, -39, 2, 24, -46, -24, -39, -34, -45, 46, -46, 6, -23, 27, 18, 8, -18, 11, -1, -32, 35, 18, 15, 43, -4, -12, 17, -18, -38, 33, 3, -44, 28, 36, -37, 36, -32, 3, 42, -31, -22, -27, 31, 12, 23, 6, -43, 39, 11, -22, 23, -34, 15, -45, 7, 18, -23, 11, -10, 18, 31, 39, 33, -10, -2, 40, -2, 25, 20, -48, -41, 47, 38, -16, 29, -49, -27, 23, -13, -29, -25, -8, 4, -12, 40, -22, -31, 40, -10, 3, -31, -32, 33, 48, 15, -21, 2, -17, -29, 16, -45, 28, -24, -41, 22, 46, 45, -3, 19, 8, 49, 8, -49, -22, 17, 14, 32, -25, 38, -41, 2, 28, 8, -29, 0, -3, -30, -29, 49, 47, -21, -26, -23, 14, -6, 17, -44, -2, -42, -15, 32, -50, -41, -15, 22, -5, -19, -19, -45, -3, -13, -34, 23, -24, 3, -1, -16, 34, -26, -23, -36, -47, 42, 22, -24, -25, -32, 41, -34, -8, -10, -9, -1, 33, -11, -12, -28, 45, 1, -4, 12, 46, 18, -8, -3, -17, -11, 24, 10, -1, 16, 11, 7, -18, 24, -35, 31, 43, -3, -41, 31, -13, -32, -15, 8, 12, 26, -5, -48, 23, 14, 40, -43, 0, 30, 22, -45, 38, -12, 9, -23, 46, 3, -14, -42, 31, 5, 8, 34, -49, 10, 7, 9, -11, -15, -14, 28, 41, -33, 47, 12, -29, -40, 7, 6, 26, -47, 35, -44, 10, 3, 37, 17, 41, 28, -50, 4, -48, 27, -13, -50, -13, 34, -22, -46, 23, 41, -30, 20, 16, -4, 33, 32, -16, 17, 18, -50, 17, -39, 9, -24, 5, -28, -26, -30, 10, 12, 1, 37, -26, 4, -5, -19, 4, 45, -46, -15, -2, 7, -12, 29, 46, 34, 10, -42, -45, -16, -12, -29, -10, -46, -9, 36, 30, 25, 36, 29, 16, -21, 6, 35, 22, -22, -14, 36, -38, -19, -5, -28, -6, -34, 34, 15, 50, -45, -33, 43, -29, -18, -21, 30, -19, -9, 27, -41, -15, -17, 22, -23, -40, 27, -12, -4, -32, -36, -23, -27, 21, -42, -4, -18, 11, 46, -32, 16, 23, -11, -4, 14, -22, -1, 47, -38, -50, -17, 42, -3, 26, -3, -2, 13, 10, -22, -12, 37, -25, -34, 20, -38, 18, -25, -2, 16, -44, 7, -2, 2, 14, 11, -34, -8, -26, -48, 28, -22, -19, -25, -35, -26, 3, -23, 22, 5, 14, 42, 35, 29, -10, 0, 20, 27, -22, 32, -32, 15, -10, -6, -36, -48, -40, 2, -5, -21, 6, -33, 0, -3, 15, 45, -43, -29, -45, 25, 6, -15, 28, 41, 6, -2, -6, 31, 15, 26, -6, 28, -31, 13, 42, 42, 16, 32, -48, 3, 27, 13, -11, 8, 4, 11, -47, 9, 24, 44, 45, 40, -21, -49, 11, -2, -42, 41, -20, 47, 10, 28, -3, -26, -15, -43, 22, 7, 50, -6, 11, -12, 45, 7, 30, 48, 50, 32, 13, -7, -22, 8, 20, 41, -42, 41, -45, -22, 7, -34, -35, 36, 44, -48, -30, 13, 39, -15, 50, 35, 11, -9, 25, -9, 10, -38, -40, 3, -35, -43, 8, 6, -11, 8, -49, 43, 43, 25, -41, -7, -40, 28, 29, 30, 39, -49, -1, -39, 39, -28, -33, 11, 45, 11, -13, 16, -13, 16, 43, 10, -50, 43, -6, 45, -23, -30, -38, -24, 49, -44, -29, 23, 2, 28, 28, -47, 45, -28, 19, 37, 33, 50, 33, 25, -18, -23, -43, -50, -14, 12, -29, 19, -30, 45, -16, 28, -46, 9, -5, -1, -3, -45, 38, 5, 8, -22, 20, 26, -33, -49, -43, 24, 46, 3, -13, -3, -24, -31, -39, -8, 10, -20, 40, 45, 10, 23, 16, 40, -16, 44, -36, -35, -38, -16, 24, 8, -30, 3, 24, -21, -3, -16, 35, -13, -20, 27, -27, -2, 45, 49, -19, 4, 28, 7, 48, -48, 29, 18, 34, -41, 32, -26, 17, 10, -22, -32, -8, 15, 23, 10, -8, -26, -31, -3, 32, 36, -27, -40, 47, 4, -23, 18, 12, 8, -46, 0, -30, -39, -1, -47, -9, 33, -13, -26, -37, 24, -19, -40, 10, -33, -24, 4, 3, 31, 36, 24, -30, -7, -46, 36, -10, 8, 38, 3, 23, -29, 32, 14, 13, 20, -47, 14, -36, 25, -29, 35, -4, 30, 42, -5, -37, -1, -31, -1, -18, 8, -8, 28, -39, -11, -31, 43, -13, -48, -23, 5, 39, 43, -38, 26, 15, -14, -2, 15, -15, 3, -25, 24, 21, -11, -8, -29, -31, -43, -22, -11, 39, -21, 30, 33, 4, -35, -5, 11, -44, 29, -6, 8, 5, -3, -24, 2, 36, 37, 22, -16, 0, 33, -14, 30, 44, 6, -43, 28, 44, 43, -31, 2, -39, -2, -34, 13, -9, 43, -22, -32, -40, 47, -1, 20, 7, -17, -31, -1, 37, -41, -19, 1, -36, 50, 33, -48, -14, -11, 21, -11, 5, -28, -40, 13, -43, 42, 43, 5, 9, -41, -12, -23, -2, -15, -38, 45, -15, 50, -25, 35, -47, 44, 31, 13, -13, 37, 36, -29, -49, -20, -40, 41, -5, 45, 11, 18, 13, -41, -11, -27, 48, -7, 9, 11, 36, -34, 14, 44, 44, 6, 4, 2, 5, 47, -42, -29, -38, 38, -3, -33, 25, -11, -34, -36, -36, 28, 12, -12, -38, 30, -19, -42, -11, -31, 39, 40, 34, 31, 26, 29, 22, 12, 25, -7, -13, 32, 9, 20, 48, -3, -33, -35, 4, -12, 17, 8, 38, 45, 11, -38, 30, 50, -45, 32, 26, 9, 39, -37, 44, 3, -47, -12, 21, -26, 26, -19, 8, 12, -13, 41, 2, 43, 16, -23, -48, 47, 29, -29, 45, -13, 21, 21, 11, 6, -45, 27, -19, 48, -41, -48, 8, 25, -2, 8, -20, 42, 18, 11, 1, 38, -10, -20, 34, 33, -29, -47, -38, -6, -9, -2, -31, 26, 30, 3, -15, 46, -50, -36, 26, -34, -27, 7, 21, 40, -28, -5, 21, -43, 8, 39, 8, -38, -12, 50, -23, 38, 10, -35, -49, 31, -34, -21, -38, 45, 42, 43, 31, -38, -8, 34, 43, -30, 4, 30, -11, 32, -36, 22, 1, 23, 44, 2, 36, 1, -21, -18, 6, 1, -42, 3, -50, -7, 48, 24, 47, 29, -42, -19, -36, -39, 46, 27, 6, -43, 21, -24, 11, -39, 14, -9, 11, -40, -8, 44, -34, 46, -19, 42, 34, 34, -11, -28, 5, -45, 35, -1, -14, 13, 3, 21, -2, 48, -40, 37, -2, -30, 15, 12, 32, -23, -34, -45, -32, 5, -23, 15, -13, -14, 17, 35, 39, -2, -8, -15, 7, -38, 1, 7, -19, 30, 49, 9, 32, 7, 48, 5, -23, -50, -9, 31, -3, -11, 46, 12, 25, 21, 37, 29, -47, -13, -24, -42, -35, 5, 25, -20, 37, -37, -26, -17, 16, -27, 22, -25, -31, 13, -41, 32, 16, -27, -46, 16, 7, -24, 29, -36, -16, 25, 2, -7, -25, -4, -17, 36, 44, -1, 33, -39, 36, -47, 36, -3, 4, -50, 38, 15, -21, -48, -30, 38, 33, -2, 35, 34, 11, 46, -13, -36, 1, 28, -5, -26, -30, 37, -46, 19, -4, 36, 17, 40, -33, -30, 41, 48, 35, -28, 13, 16, -11, -41, 38, 1, 21, 24, 10, 13, -46, 2, 4, -14, 5, 8, 42, 18, 22, 8, -49, 14, 9, 0, -21, -40, 41, 25, -12, 39, 26, 21, 12, 13, 10, 3, 41, 43, 22, 44, 7, 34, 5, -17, -20, 1, 38, 25, -50, 4, -29, -11, 50, -50, 14, 12, 3, -9, -30, 28, 30, -29, -13, 48, 29, -43, 11, -4, -34, -34, 39, -38, -34, -13, 30, 27, -6, -45, -16, -37, 21, 10, -36, 3, -24, -38, -20, -16, 9, -45, 18, 35, 7, -2, -28, 38, -17, -25, -4, -46, 39, -31, -45, 19, 8, 13, -33, -47, -34, -37, 27, -38, -44, -7, -36, -32, 12, -16, 30, -16, -32, -31, 49, -16, -19, -3, -7, -27, 10, -34, 20, -1, 14, 48, -19, -15, -38, 19, 7, -37, -14, 28, 17, -11, 8, 29, 41, -35, 11, -47, -6, 39, -23, 45, 15, -20, -48, -43, -27, -36, -8, -20, 22, -6, 15, -43, 20, 6, 29, 48, -21, 23, -33, 18, 42, -12, 9, 47, -8, -6, -28, 18, 43, -45, 5, -47, 42, -28, -45, -19, -33, -36, -11, 45, 22, 50, 23, 33, -45, 12, 16, -40, -8, -34, 45, -47, 12, 17, 30, -10, 32, -46, -19, 35, 19, -16, -29, 14, 33, -29, -40, 26, -48, -42, 9, 25, 36, -37, 46, -33, 22, -28, 23, 32, -4, 18, -4, 36, -21, -26, -23, 47, -26, 23, 27, 7, 43, -10, -26, 27, 48, -3, 47, -41, 48, 24, -40, 34, -30, 35, -6, -44, 30, 13, 13, -49, 25, -9, 31, 3, 24, -35, -33, 48, 8, 39, -35, -45, 6, -4, -3, -9, 25, 9, 26, -47, -49, 39, 8, -24, -24, 28, 21, -44, 12, -5, 12, -39, -38, -8, -34, 12, 30, -15, 34, -43, 18, 39, 29, -15, -23, 42, -4, 25, 50, -21, -28, -35, -37, 23, 20, 1, -14, -22, 16, -36, 49, -4, -5, 1, -32, 26, -30, 13, -14, -24, 4, -22, -31, -26, 19, 12, -15, -49, -29, 45, -35, -33, 18, 3, 49, -21, -6, -32, 36, -17, -38, -8, 11, 42, 49, -29, 1, 1, -15, 22, -32, -13, 19, 28, 6, -31, -42, -19, -47, -1, 31, -46, -31, 36, 24, -14, -29, 7, 17, 42, -7, -17, 26, -9, -42, 44, -44, 17, -32, 43, -20, -16, 6, 34, 10, -20, 32, 44, 2, -19, 15, 8, -41, -49, 15, 9, 37, -34, 45, -35, -35, -5, -12, -20, 37, -50, -40, 34, -47, 20, -25, -1, -39, 44, 30, 46, 24, 41, 45, 14, -4, 41, 2, 20, -49, -27, -47, -32, -25, 24, -11, -1, -8, 24, 16, -39, 16, -24, 3, 15, -2, -35, -49, 9, 3, -21, 33, -13, -23, -26, 45, -41, 9, -9, -11, 46, 26, -9, -4, -14, 29, -29, 6, 33, -24, -10, 29, -17, -19, 39, 38, 15, -39, -11, 22, 25, 39, 22, -41, 45, 47, -3, -31, -12, 9, 15, 14, 0, -15, -27, -24, -49, -20, 6, 27, 15, -22, -36, -39, 50, -23, 33, -27, -30, -41, 27, 50, -33, 37, -37, -17, 7, 25, -29, 19, -15, -6, -15, -29, 27, 29, 10, 49, 5, 38, 45, -18, -6, -15, -31, -33, -13, 16, -28, 45, -35, 8, 18, 17, -30, 27, 44, 27, 19, -39, -35, 30, 36, -37, 10, 20, -5, -19, -36, -7, -34, -10, 3, -7, 47, -46, -24, 36, 27, 28, -8, 46, -20, 48, -34, 41, 32, 3, 11, 36, -19, -11, -38, 33, -16, -46, 22, -22, 19, -26, 44, -29, 15, -6, 18, 40, 38, 21, -50, 33, -7, 36, 45, 24, -12, 3, 37, 24, -22, 3, 39, -35, 48, -31, -5, 16, 14, 7, 2, -50, 30, 15, -22, 33, 19, -43, -22, 0, -18, -48, 9, -16, 18, 40, 25, 33, -31, 22, -12, -47, -32, 40, -6, -8, -38, -38, 9, 6, 35, 41, 1, 2, 35, -8, 32, 21, 21, -9, 39, -25, -28, -8, 26, -23, -42, -31, 5, 32, -12, 0, -39, 28, 44, 4, 27, -40, -25, -9, -24, -40, -13, 47, -8, -32, 13, -45, -5, -9, 41, 14, 48, 21, 8, 1, -4, -44, -40, 10, 17, -26, -39, -25, -39, -8, 0, -14, -5, 2, 37, 29, -38, 38, 3, 6, -47, 24, 45, -2, -44, -40, 41, 3, 36, -6, -28, -23, 6, -25, -26, 3, -22, 32, 46, -15, -37, 27, -16, -21, 41, -34, 16, 29, -21, 42, -6, 28, 38, 0, -4, 2, 13, -13, 13, 36, 38, -44, -29, 30, 31, -10, 23, -41, 6, -44, -1, 40, 1, -18, -50, 2, 9, -17, -47, -34, -47, -8, 39, -47, -50, 20, 43, -1, 22, 10, -16, -43, -27, 32, -15, -1, -8, -24, -19, 27, -33, -23, -22, -35, 48, -4, 8, -20, -47, -14, -34, -12, -3, -5, 39, -3, -12, -47, -21, -21, -29, 24, 15, -39, 43, -15, -33, 39, 2, 20, -50, 7, 39, 36, 39, -45, 19, -7, 21, -27, 35, -32, 50, -33, 44, 50, -21, -9, -18, 23, 50, -39, 43, -24, -12, -42, -30, 25, -22, -18, 11, -36, -49, 1, -7, 3, -33, -48, -44, -8, 31, -13, -14, 7, -18, 8, 44, -40, 17, 31, 17, 47, 42, 37, -29, 15, -7, -45, -9, -26, 6, 34, 4, -35, 44, -37, -12, -23, 45, 41, 0, -2, -42, 7, -6, -29, -19, 18, 36, 18, -9, 2, 45, 8, 23, -12, -36, 20, -22, -48, 32, -41, 41, -22, 28, -16, -45, -39, -13, 26, 42, -32, 16, -43, -43, 33, -4, -47, 0, 34, 16, -6, -43, 36, -35, 26, 16, -42, 9, 27, 26, 20, -36, 20, 47, -10, -29, -27, 50, -7, -50, -41, 29, 21, 5, 38, -1, -39, 38, 30, 9, -25, 27, -10, -15, -28, -8, -45, 18, -8, -26, -33, 11, -38, -8, 27, -23, -33, 8, 9, 12, 6, 41, 0, 5, -24, -19, -42, 45, 33, 41, 46, 17, -5, 47, 16, -25, -43, -45, 29, -27, -3, 43, -6, -38, 18, -26, -31, 31, 31, 15, 23, -6, -4, 12, 25, 26, 4, 24, -32, -16, 2, -25, -37, -6, -7, 37, 14, 0, -8, 35, -28, 5, -32, 31, 25, 4, 41, 41, 9, 8, -18, -32, -23, 1, -2, -14, -25, 48, 47, 48, -11, 29, -13, 26, 36, 3, -29, -35, -23, -16, 9, -6, -5, 21, 4, 35, 34, -25, 34, -26, 14, -45, -28, 13, 36, -8, -28, 45, -21, 26, -33, 36, 28, 46, -30, 6, -28, 40, -6, -7, 31, 37, -4, -11, 0, -9, -44, -1, -3, 33, 40, -45, 40, -42, 6, -20, -30, 39, -11, -6, 26, -2, 36, -31, 50, 41, -34, -23, -10, 15, -26, 7, -10, -45, 24, -13, -45, -6, 24, -37, 15, -11, -48, 48, 46, -27, -32, -33, 13, 37, -16, 11, -50, 49, -26, -6, -2, 47, 38, -35, 47, 42, -32, -28, 32, -26, -35, 3, 22, -50, -9, -32, 46, -17, 29, 4, -33, -17, 38, -6, -45, -30, 19, 45, -3, -12, -20, -41, -21, -33, 9, 37, 22, 44, -36, -47, 12, -11, -42, -42, -25, -47, 30, -35, -36, 48, 1, 18, -46, -31, 28, -33, -49, 42, -38, -47, -9, 23, 10, 44, -43, 16, 12, -42, 43, -40, 48, 50, -9, -38, -15, -38, -39, -14, 23, 22, 1, 20, -49, 5, 9, -28, -11, 13, 34, -28, -22, 27, 39, 0, 18, 44, 38, -20, -1, -31, 4, 30, -49, -26, -38, 41, 19, 16, 7, 48, 31, 24, 33, 13, 18, 32, 35, 8, 9, 32, 11, -35, 37, 17, -36, 38, 4, -16, 4, -37, -2, 32, 49, -44, -21, 32, -2, 38, -35, 0, 21, 31, 41, 29, 32, -9, -34, 12, -6, 26, -44, -24, -41, -17, -15, -26, -45, -27, -33, 36, -45, -22, -26, 4, 30, -5, -27, 24, -25, 47, -23, -48, 24, -13, 10, 27, 0, 39, -3, -30, 3, 5, 43, 8, 21, 0, -31, 45, 35, 8, 20, -42, -50, -22, 12, 21, 5, 17, -16, -48, -44, -24, -50, 40, 29, 20, -7, 36, -10, 24, -9, -18, -1, 12, 49, -14, 8, 30, 48, -3, -46, -3, 45, -48, -4, 11, 48, -37, 12, 10, -20, 44, -34, -27, -28, 31, -1, 27, 28, 28, 19, -24, -36, -1, -15, -43, 28, -48, 11, -4, 26, 47, 37, 45, 10, -19, 43, -38, -50, -17, 11, 28, 27, 42, 47, 31, 20, 42, -20, 13, -26, -13, -37, -43, 40, 3, -49, 30, 50, 27, 38, 5, 43, 42, 33, 34, 10, -29, -16, 50, -35, -1, -8, -34, 29, 7, -49, -47, 34, -12, 47, 43, -45, 30, 38, 18, 18, -31, 13, -35, 0, -14, 22, 18, -9, 6, 15, -42, 49, 35, 13, 35, -29, -17, 4, -22, -13, 46, -33, 20, 14, 46, -50, 37, -47, -47, 31, -24, -8, 8, -19, -18, -23, 4, 49, 9, 19, 11, 29, -17, 36, 37, 5, -38, 5, -33, 3, 26, 50, -8, -12, 10, -9, 30, 28, -33, -28, 3, -21, 47, 7, 17, 16, 20, -33, -44, -11, 19, 35, 14, 17, -2, 1, -22, -30, 39, 27, -42, -4, 25, -9, 0, 5, 0, 19, -31, 37, -24, -13, 21, 14, 3, -27, -4, 20, 32, 35, 12, 6, 4, 9, 48, 11, -21, 42, -29, 24, 33, -22, -10, -9, 47, 14, -20, -21, -33, -34, -13, -37, 36, 38, 28, 5, -29, 16, 5, -32, 6, -7, 47, -16, -50, 1, 34, 42, 19, -14, 14, 0, -50, 40, -30, 2, -35, 10, 3, -11, -25, 29, 41, 14, 49, 23, 13, -8, -34, 8, -28, -44, -7, 2, 20, 28, -17, -5, 17, 27, 27, -35, 20, 45, -32, -49, -41, -1, 30, 50, -39, 19, -29, -19, 33, -50, 3, 7, 19, 32, -33, -45, -6, 46, -28, -28, -25, 26, -44, 28, -7, -24, -25, 46, 28, -15, 4, 13, 40, 6, 18, 10, -49, 4, 46, 29, 36, -13, 29, 27, -22, -25, -16, 28, 16, 36, -22, -17, 46, -10, -10, -28, 20, -48, 7, -19, -20, 31, -8, -44, -50, 10, -37, 1, 45, -45, -41, 20, 39, 47, -21, 49, -30, 9, 30, 46, 23, 12, -9, 0, 13, 25, 5, 29, -10, -19, -36, 11, -24, -23, 30, 13, 8, 7, -49, -15, 20, -38, -36, 38, 36, 9, -29, 12, 39, 46, 24, 23, -26, 50, -3, -8, -13, -10, -6, 37, -11, 46, -34, 37, 50, 6, -49, 45, 11, 37, -42, 17, 30, -34, -1, 43, -11, 7, 24, 34, -30, -33, 4, -22, -27, 23, -34, -33, -9, 33, 50, -6, 31, -34, 22, -37, -2, -22, 44, -47, 31, -31, -4, -42, 26, 28, -24, -36, 41, 50, -32, 39, 1, -25, 38, -25, -25, -5, 41, -2, 31, 45, 2, -48, 15, 46, -9, -32, -34, -18, 25, -2, 5, 12, -48, -2, 4, -25, 48, 21, 1, 49, -44, -5, -5, 49, -35, -27, 10, 3, 11, -50, -2, -26, -41, 29, -35, 7, 21, -22, 41, -45, -35, -31, 29, 20, 27, -8, -25, 39, 27, 20, -18, -25, -6, 33, 12, 16, 1, 17, -25, 24, -49, -37, -21, -2, -39, 39, -7, -18, -38, 27, 37, 47, -25, -30, -23, -3, 49, -11, 15, 22, 36, 28, 26, -28, 30, -3, -49, 33, -31, 8, -5, -48, 4, -39, -11, 15, 49, 27, -35, 32, -17, -7, -45, 26, 13, 49, -29, -33, -39, 1, 43, 0, 20, 45, -3, -32, -45, 33, -24, 2, 50, -3, -44, 8, 18, -40, -36, 13, -48, 18, -28, 2, -14, -42, -36, -48, 42, 19, -34, -25, -30, 21, -30, -40, -13, 21, 37, -16, -37, -37, -41, -39, -13, -17, -10, -41, -34, -34, 16, 11, 44, -50, -39, -47, -9, -38, 47, 34, 35, -47, 31, 18, -32, -49, -39, 30, 23, 47, -45, -43, 0, -40, 12, 6, -39, 22, -49, -43, -40, 2, 49, -41, 34, 33, -43, -15, 42, 25, -37, 3, 34, 35, -30, -1, 43, -12, -31, 37, 36, -44, -42, -50, -25, -13, -13, 10, -7, 35, -7, 23, 11, -45, -34, 0, -13, -27, 0, -41, 21, -30, 19, 34, 6, -12, 37, -18, 8, -33, 5, 41, 6, 45, 25, -3, -9, -24, 23, 1, -9, -19, -25, -26, 24, -28, 47, 6, 1, 36, 42, -20, 13, 20, -18, 34, -49, -33, -4, -18, 50, 47, 33, -16, 0, -33, 37, 21, -21, -7, 2, -41, 36, 1, -2, -40, 15, 7, 39, -15, -18, -4, -38, -11, 38, 17, -9, -32, 31, 50, 43, -32, 7, -28, 3, 29, 14, -39, -27, -17, 2, -43, -33, 6, -46, -25, -21, 3, -38, 32, -22, -48, 39, 7, 25, -49, 24, -23, 31, 26, 50, 35, 25, -49, 50, -44, -25, 39, 37, 25, -35, -28, -11, 9, 22, -19, -36, 50, -38, -46, 24, 23, 1, 26, -10, 2, -1, -36, -44, -11, -23, -19, 48, -36, 49, 34, 19, 14, -47, -40, -25, 10, -14, -28, 42, 34, 40, -11, 26, -28, -35, 43, 10, 17, 29, -20, 2, -26, -7, -39, 39, 50, 46, 41, -42, -39, 18, 3, 3, -23, 5, 48, 18, 47, 47, 26, 7, 27, 24, -9, -13, 17, 2, -18, 20, 5, 21, 50, 0, 23, -8, -36, -13, -36, -46, 42, 32, 3, 0, -41, -39, -47, 44, -33, 29, -15, -26, 36, 25, 47, -15, 50, 16, -42, 10, 2, -33, -8, -16, 12, 47, 27, -47, 42, -10, -6, -1, 28, -23, -9, 29, 25, 18, 47, -50, -12, 45, 39, -34, 40, 37, -16, -5, -9, -12, 39, -2, 11, -13, -28, -29, -47, -2, 8, 22, 17, 20, 36, -49, -2, 37, 44, -20, -11, -3, 0, -8, 47, 4, 37, -2, 39, 29, 6, 26, -36, -24, 17, 29, 13, 43, -21, -15, 16, 35, 35, -2, 25, 4, 34, 5, 17, 44, -7, -20, 7, 36, 2, 33, 28, -28, -23, -35, -14, -30, 28, -34, -14, 26, -32, -21, -6, -33, 27, 11, -15, 49, 33, 1, -32, -7, -44, -7, 17, -17, 15, 18, 4, -41, 45, -9, -10, 26, 18, -41, -41, 40, 9, 0, -30, -43, 14, 41, 27, 34, -21, 34, -2, -42, -34, 18, 7, 6, 11, 44, 1, 10, -11, -13, -8, 12, -32, 49, -1, -18, -38, 27, 46, 11, 42, -8, -2, -15, -41, 44, -45, 6, -50, 20, 7, 40, -30, 41, 29, 5, 36, -31, 3, -26, -23, -46, -30, -33, -4, 19, 6, 42, -32, 46, 14, -48, -9, -30, 48, -11, 16, -26, 4, 33, 1, -7, 47, 34, 5, 4, 36, 19, 26, 36, 22, 30, 15, -32, 32, -44, 12, -9, -9, 8, -31, 22, -34, -24, -4, -49, 12, 11, 49, -32, -34, 18, -12, 31, 20, 30, -12, -15, -11, -6, -47, -26, 18, -21, 25, 17, 37, -22, 22, 17, 0, -27, -37, 18, -33, -9, 6, 32, -39, 31, -34, -21, 37, 24, 48, -28, 30, -50, 28, -19, -42, -36, -23, -27, 9, -16, 35, -24, 32, 25, -31, 14, 34, -2, -50, -41, -4, 8, 45, 11, 35, -33, -5, -19, -24, 41, -33, -12, -2, 42, 31, -7, 21, 3, 44, -17, 20, -15, -33, -13, 8, -42, 22, 21, 0, -16, 31, -46, -37, 41, -21, -47, -12, 33, 13, -26, -23, 25, 15, 27, -29, -20, -28, -3, -31, -13, 4, 17, 28, 37, 38, -50, -44, 6, 44, -39, -46, -1, -9, -39, -33, 15, 23, 28, 43, -34, 17, 20, 11, -10, 44, -17, 19, -6, 7, 0, -17, -7, -36, 27, 19, -1, 50, -19, 16, -48, 35, 35, 23, 0, 16, 25, 42, -3, -34, -44, -38, 15, -47, -41, 37, -34, 1, -45, 32, 18, 45, 23, -42, 40, 26, 32, -30, -27, -47, -27, 8, 48, -48, 17, 50, -11, -3, 3, -16, 44, 5, 38, -11, 26, 17, -5, 27, -38, -24, -45, -34, -15, 48, 30, -49, 26, 1, 15, 1, 41, -8, 39, -29, 4, 16, 48, 9, 7, -39, 37, 18, 33, -12, -38, -10, 6, 2, -39, -38, 23, 46, 6, -11, 29, -6, -16, -48, -46, 39, -40, 20, 5, -41, -17, 16, 21, -20, 24, 20, 15, 19, -10, 12, -19, -31, 6, 47, -1, 29, -26, -39, 20, -12, -34, -6, -40, 19, -28, 40, 19, -13, -49, 35, 33, 38, 28, 42, 21, -14, -2, 1, -18, -29, -46, -33, -13, -14, 43, 44, 13, -41, 28, -9, -3, -7, 31, 36, 46, -35, 3, -16, 47, -23, -49, 43, -38, -10, 29, 8, 18, 41, 2, -6, -31, -27, 10, 40, 43, 7, -24, -25, -44, -9, -4, 2, 8, -13, 18, 36, 41, 47, 2, -36, 45, -25, -3, 44, -32, -42, 13, 42, 3, 0, -12, -47, -48, 13, -22, -40, 46, 7, 24, -24, 46, -30, -12, 44, -5, 15, 40, -15, 24, 31, 14, 12, 48, -16, -20, -23, -50, -26, -8, 33, 16, 12, 0, -49, 31, 13, 23, 18, -42, -49, -17, 9, 10, -20, -41, 25, -15, 34, -2, 19, -2, -48, 23, -46, 39, 10, 34, 39, -25, 21, -46, -36, -35, -50, -35, -14, -48, 1, -4, 44, -38, 29, 4, -30, 15, 3, -24, -13, 39, 7, 11, -5, 38, -40, 21, -43, 46, 20, 13, -30, 21, 12, 34, 13, -31, -43, 7, -5, -20, 42, -42, -36, 43, -25, -41, -22, 29, -15, 33, -14, 35, 20, -28, -10, 42, 29, -23, -3, -13, -20, -37, 46, 22, 40, 37, 26, 39, -22, 0, -2, -8, 41, 41, 21, 36, 42, -46, -9, -44, -9, -15, -24, 7, -5, 15, -26, 22, -24, -50, 36, 23, -9, 1, -26, 3, 16, -45, 7, 19, 2, 15, 7, 31, 36, -49, 25, -29, -14, -31, -27, 33, 14, 14, 30, -50, 43, -48, -5, 4, 24, 37, 35, 13, -6, -25, 26, 14, -27, 23, -16, -27, -23, 49, 29, -35, 8, 30, 3, 28, -35, -36, 47, -40, 14, 28, 39, 17, -8, 18, 48, -38, -41, 24, 31, 47, -10, -1, 36, 20, 8, -12, -48, 25, -44, -2, -25, -18, 50, -3, 28, -49, 20, -19, -47, -31, -15, -19, -23, 26, -50, 9, 5, -16, -21, 3, -15, 4, 38, 29, 7, 32, 14, 18, 0, -29, 37, 50, 2, 49, -15, 17, -15, 1, 2, 31, -1, 29, -10, -33, -29, 15, -30, 49, -7, -4, -12, -22, 3, 39, 34, -34, 29, 9, -20, 22, 44, 27, -2, 50, -49, -3, -37, 8, 46, 48, 7, 7, 0, 33, -49, -10, 32, 50, 31, -35, -47, -39, -22, -44, -37, -39, 48, -46, 30, -19, 23, -8, 30, 18, -6, -42, -2, -18, 49, 49, -33, -42, 11, 6, -22, 27, -26, -36, -45, -9, -22, 28, 42, -47, 31, 6, -2, -7, 29, 24, -37, -48, 11, 13, -6, 31, 7, -31, 7, 38, 6, 26, 17, 27, 46, 41, 1, -14, -43, -7, 47, -46, 18, -20, -6, -42, -19, -18, 16, -21, 25, -22, -48, 39, 6, -21, -42, -25, -49, 11, -48, -5, 17, -26, 0, -38, -7, -16, 4, 36, -42, -49, 10, -10, -7, 13, -20, -4, -49, 45, 31, 26, 18, 7, -7, 23, 5, -8, 38, -17, 50, -21, 20, 19, 4, 16, -38, -48, -25, 6, -27, 2, 19, -8, 9, 7, -2, -9, 25, 49, 15, -40, 47, 39, -33, 34, 49, 1, -5, -7, -29, 2, 8, 43, -21, -43, 47, 6, 22, -31, -26, -32, -46, 24, 28, 21, 32, 36, -24, -11, 45, -25, -24, 11, 32, -1, -9, -22, -12, 9, -10, -18, 32, 50, 32, 46, -35, -28, -44, -25, 45, -39, 21, -46, 41, 18, -2, -25, -46, -29, 28, -38, -23, -18, -28, 46, -33, -21, -25, -35, 26, -12, -18, -25, -3, 14, -13, -49, -45, -5, -1, -13, 37, -33, -24, -10, 21, 41, 23, -34, 11, -22, 7, 19, 27, -29, -45, -25, -12, -39, 48, -37, -29, 0, -28, -3, 20, -1, 38, -38, 34, -41, 4, -42, 28, 1, -49, -26, -38, 47, 0, 7, -17, -16, -48, 8, 19, -3, 13, -32, 16, 31, 22, 25, -46, 16, -40, 43, 17, 18, -50, 40, 41, 12, -22, 31, -39, 26, -10, -49, -14, -6, 29, -3, -27, 48, -29, 49, -40, 7, -5, -22, -16, -36, 9, 44, -9, -8, 29, 23, -2, 13, -19, 13, -49, -27, 36, 15, -13, -20, -25, -22, 16, 27, -26, -3, 14, 2, 16, 39, -33, -42, -13, 36, -30, 14, -30, -24, 19, -7, 49, -23, -6, -34, -11, -48, 25, 25, 15, -5, 35, 36, -21, 18, -42, 34, -40, 18, 48, 40, 15, 37, -20, -18, -12, 43, -5, -14, 41, 9, -20, -40, 36, -49, -24, 48, -49, 50, -30, 7, -46, 1, -6, 34, 42, -31, 10, -13, -31, -26, -49, -19, -25, 19, -10, 16, 46, -50, 0, -46, -38, -32, -39, -3, -26, 6, -16, 25, 43, -46, 47, -29, 26, 6, -4, 3, -48, 2, 33, -20, 18, 37, -18, 21, 37, -1, 33, -35, 25, 26, -12, 38, -5, 45, 37, -4, -7, -42, 36, -1, 26, 9, 45, -36, -15, 12, 18, 35, 29, -10, 23, -27, 31, -2, -33, -44, -47, 39, 18, 9, 4, -35, 48, 39, 31, -22, -28, -37, 28, -2, -18, -26, -30, -34, -28, 6, 30, 7, -37, 42, -31, -21, -32, 2, 5, 26, 31, -28, 11, -18, -33, 22, -18, -19, 10, 3, -34, -32, 40, 19, 48, 50, -17, 33, -26, 17, 23, 23, 37, 34, -40, 40, -35, 39, 10, 43, 29, -44, -35, 48, -35, -11, -39, -16, -30, -1, -8, 49, -34, -19, -10, -45, 37, -24, -31, -26, 15, -42, 41, 2, 10, -13, -48, 33, 19, 46, 4, -50, 50, 19, -6, 47, -4, 28, -25, -37, 3, 20, -5, -20, 37, 8, 44, -22, 45, -34, -37, -15, 7, -27, 12, 40, -26, 8, -19, 31, -33, -14, -25, -42, 48, 13, 21, -31, 3, 35, 32, -21, 2, 41, 48, 12, -40, -20, -2, 49, 43, 36, -32, -39, -36, -20, -8, 50, -14, 28, -22, -25, -49, 33, -36, -47, 35, -1, -13, -28, 8, 39, 24, -23, 15, -43, -22, -40, 50, -33, 4, -1, -37, 23, 48, -42, 48, -40, 12, 25, 16, 2, -12, 27, 5, -23, 24, -12, -26, -30, -41, -8, -36, 32, -3, 35, -30, 9, 45, -1, -28, -38, 18, -47, 41, 27, 21, -42, -16, 50, -30, 7, -33, 46, 21, 30, -8, 44, 47, -45, 35, 27, 16, -39, 49, -39, 15, -49, -36, -28, -22, 30, 45, -44, 43, -23, -37, -7, -21, 30, -19, 19, 37, -45, -24, 31, 37, 50, -27, -17, -11, -4, 28, 24, 35, -27, 14, -33, -7, 25, 6, -23, 20, -28, 34, -17, -40, 35, -16, 42, -9, -23, 31, 27, 31, 41, -27, -43, 2, 21, -47, 40, 49, -46, 46, -2, 47, -21, 21, 12, -4, -25, 6, -14, 47, -44, -11, 41, -12, 11, 41, 27, 2, -47, 31, -26, -44, -23, 18, 16, 44, -31, 32, -40, 16, 36, -44, -28, 10, 20, -17, -32, 7, -42, -3, 31, -10, -3, -6, -26, 27, -26, -32, -12, 28, 29, -24, 23, 12, 17, -32, -23, 34, 27, -18, -41, 32, -21, -29, -48, 50, 31, 24, -3, -49, 25, 3, -45, -11, 42, 43, -49, 22, -49, 42, 46, 23, 47, 4, 21, 50, 9, 46, -45, -32, 45, -24, -50, -18, -11, -19, 18, -34, -43, 6, -9, 47, -42, 36, -16, 20, 28, 2, 3, 33, -26, 16, 11, 4, -5, -27, 47, -5, -29, -40, -3, -43, -12, -16, -2, -5, -13, -43, 3, -14, 40, 41, -11, -17, 45, 28, -34, -18, -4, 1, 29, 42, -42, -18, 9, 42, 26, -30, 7, 34, 18, -41, -45, -38, 14, -31, 6, -5, -43, -41, 22, 16, -40, -39, -41, -26, -2, -2, 38, -40, 11, -15, -12, 2, 39, 27, 5, -50, 5, -47, -21, -39, -16, 26, 1, -20, 36, 17, 1, 29, -44, -29, 42, 24, 5, 46, 7, 42, 13, -39, -44, 4, 11, 39, 22, 47, 26, 4, -15, 38, -27, -7, -34, -49, -38, -20, 42, -23, 9, -24, -36, 44, 28, -18, -31, -9, -39, 50, 22, -28, 21, 45, -37, 40, -26, 26, 34, -20, 50, 3, -46, -38, -23, -8, 38, 48, -4, 20, -13, 45, 16, 11, -12, -14, 35, -43, 30, 1, 40, -18, 30, -9, 25, -24, -43, -28, 13, 42, -31, -35, -34, 29, -32, -43, -13, -13, 2, 42, 49, 39, -20, -7, 9, 25, -34, 28, 22, -12, -9, -3, -39, 45, 38, -33, 28, 45, -45, -8, -16, 47, 3, 11, 18, 31, -35, -43, 38, 45, 39, 35, -20, -41, 5, 25, 41, 19, -31, -46, -28, -42, 7, 8, 42, 29, 3, -5, -29, 13, -43, -31, 0, 27, -12, -14, -1, -17, 24, -18, -20, 3, -7, -17, 20, 11, -28, -5, 5, -44, 38, 10, -48, -13, 33, -17, -7, -21, -34, 8, -41, 48, 33, -33, -6, 40, 8, 11, 8, -2, 49, 12, 36, -19, -41, -40, 19, 11, -4, -17, 49, 50, -34, 3, 25, 34, -11, -32, 16, 31, 2, 13, 32, -4, -45, -35, 21, -33, 1, -3, -8, -12, -2, -39, -41, 20, 4, -50, -2, -15, -30, -14, -27, 4, -26, -44, 30, 42, 43, 20, 46, 20, -27, -40, 22, -39, -16, 12, 17, 49, 41, 6, -38, -28, 32, 50, -12, 37, 29, 46, -39, -17, 20, 24, -20, 42, 11, -38, -20, -49, -36, 6, 24, -17, 17, 24, -22, 15, -35, -12, 26, -14, 30, -30, -7, -32, 20, -43, 26, 50, 15, -10, 24, 37, 19, 10, -25, 20, 32, 19, -22, 15, -32, 17, 7, 19, 6, -14, 10, 41, -21, 20, 22, -26, 46, 14, -45, -33, -41, 41, -40, 46, 14, 26, 50, 33, 14, 1, 16, 31, 27, -20, 40, -34, 4, 42, -15, 50, -25, 2, -34, 35, -26, -49, 35, -46, -47, -15, -45, -30, 26, 50, 38, -25, 4, -12, 33, -18, -37, 5, 49, 30, -30, -5, -35, -35, 33, -22, 41, -43, 37, -48, 38, -32, 46, 15, 28, 35, 23, 31, -29, -5, 40, -38, -18, -46, 39, 26, -24, 27, -27, 16, 12, 43, 48, -3, 12, 27, -39, -23, -7, 42, -8, -34, -11, -2, 34, 6, 36, 33, 13, 24, 6, 47, 23, 23, 19, 49, 37, 25, -8, -28, -24, 7, -14, -45, 14, -45, -1, -29, 37, -26, 28, 39, 21, 0, 37, -3, 19, 48, 14, 9, -5, -15, 7, 25, -13, -40, -39, -9, -12, 20, -40, -15, 1, -20, -18, -38, -33, -10, 7, 5, -27, 22, -20, 4, -41, 9, -49, -36, -48, -8, -20, 19, 16, 5, 12, 24, -36, 41, -41, -13, -4, 6, -1, 20, -36, -33, 31, 37, -49, 33, 47, -8, -25, 20, -13, 43, -9, -46, -40, 14, -17, -50, 32, -49, 34, -31, 10, 36, -30, 37, 17, -39, -29, -31, 31, -50, -21, 46, -27, -37, -15, 18, 24, -27, 9, 44, 4, 26, 29, -27, 26, -27, 3, -25, 15, 29, -13, 14, 24, 0, -16, -8, -22, -14, 30, 7, 3, -12, -9, -23, -22, -8, -48, -41, 8, -37, 25, -4, -9, 43, -19, -19, -9, -19, -25, -50, 5, -49, 30, -21, 20, 1, 40, -42, -29, -17, -2, -50, 22, 33, 2, 32, 49, -11, -6, 17, -42, -29, -33, 25, -8, -12, 22, -45, 32, -3, -44, 29, 18, -35, -50, -14, 32, -14, 30, 13, 39, 35, 11, 21, 10, -18, 15, -21, -31, 9, 31, 23, -27, -47, -14, -47, 26, 38, 26, -33, 37, 15, -3, -18, 7, 32, 22, -23, -16, -41, 14, -9, 34, -42, 9, -36, 48, 6, 18, -29, 13, -10, 36, 20, 5, -28, -26, 40, -45, -17, 12, -42, 9, -2, 46, 0, 9, 19, -14, -20, 47, -10, 11, 42, 7, -37, -15, -15, 28, -43, -25, -15, -3, 34, -23, 17, 11, 29, 35, 25, 29, 0, -9, 50, -22, 31, -41, -12, 31, -50, -12, -30, 14, -36, -47, 9, 10, -31, -41, 36, -17, -3, -18, 47, 10, -41, 3, 33, 14, 26, -50, -46, 29, -36, -23, 44, -28, -34, 47, -38, -37, -40, -23, -9, 45, 48, 10, 13, -20, 30, 22, -41, -43, -30, 26, 8, -1, 18, 19, -21, 44, -34, 24, -31, -3, 22, -49, -14, -50, -47, 49, 3, -26, -48, -42, 35, 36, 25, 23, -17, -8, 23, 43, -29, 19, -49, 43, 15, -19, -35, 25, -50, 21, -3, -1, -38, -36, 2, -7, -43, 23, -5, 18, -32, -13, -40, -8, -31, -31, -30, 31, 6, -1, 23, 47, -25, -21, 22, -20, -9, 17, 10, 10, 19, 27, 17, 39, -34, -32, 0, 19, 12, 42, 24, 29, -21, -26, 24, 20, -25, 5, -29, 38, -32, -20, -25, -9, -10, 49, -28, -4, -38, 38, 15, 15, -35, 22, -23, 26, -16, -10, 26, -20, 34, -19, 3, 47, 21, 8, -10, 15, 45, 3, -11, -23, -14, 14, 23, 4, -47, 48, -41, -4, 24, -37, -13, -39, -6, -34, 29, -16, 15, 24, -10, 16, -22, -33, -31, -37, -17, -2, 3, -20, 7, -9, 7, 31, -21, -26, 12, -32, 21, 41, -43, 44, -48, 16, 35, 30, 49, -34, -37, -42, 11, 43, -30, 25, -14, 45, -40, -31, -16, 2, -4, 24, 1, -43, -47, -24, -7, -11, -4, 43, -7, -3, 40, 34, 1, 33, 17, -40, 26, 22, -47, 25, 22, 26, -3, -25, 26, -12, 41, 7, -32, 37, 32, 26, 26, 7, -23, 15, -41, 35, 26, 7, 22, 46, -37, 33, -36, 45, -18, -34, -27, -21, 11, -38, 11, -4, -35, 15, 30, 45, -8, -43, -48, -39, 33, -35, 27, 29, 8, -2, 12, 11, -2, 0, -18, -21, 8, 25, -36, 31, 41, -28, 27, 43, 46, -6, 11, 28, 20, -36, -5, 13, -5, 5, -7, 24, -22, 44, 11, 38, 1, 3, 37, 6, 32, 15, -29, -31, -18, 21, -26, -5, 22, 47, 6, 36, -46, 4, 10, 38, -43, -35, -3, 10, -36, 14, -29, -48, 3, -37, -15, 31, 31, 16, -41, -2, 14, 40, 6, -24, 24, -46, 20, 32, 6, 42, -36, 48, 50, 25, -21, -31, -14, -48, 22, -10, -12, -25, -49, -28, -28, 34, -35, -42, -38, -23, -24, 0, 13, 1, 30, -13, 49, 14, -33, 12, 0, -42, -38, -11, 4, 28, -8, -7, 17, -18, -27, -15, -41, 49, -31, 24, -39, 11, -33, 43, 50, 12, 33, -26, -39, -30, -26, -40, 13, 22, -1, 11, 38, 48, 45, -2, -37, -50, 30, -26, 8, 21, 18, -46, 48, -32, -28, -42, 43, -1, -35, -18, -49, -37, -50, 39, 7, 38, -35, 28, 39, -4, -7, 29, -37, 42, -27, 4, -36, 32, 21, -17, -49, -24, 23, 48, 36, 21, 41, -28, 17, -37, 12, 42, 14, 17, 12, 45, 46, 39, 30, 36, 13, -19, 28, -38, 15, -32, -27, 37, -40, 8, 35, -36, -41, -10, -24, 9, 22, 1, -23, 14, -34, 44, -7, -41, 12, 50, 42, 31, -4, -13, 19, 25, 2, 27, -7, 23, 3, -31, 28, -20, -44, 7, -41, -41, -12, -23, -21, -14, 16, -8, 28, 34, 1, 50, 5, 25, 17, -42, 41, -28, 12, 10, -11, -7, 35, -27, 0, 7, 39, 43, -18, -35, -29, 6, 11, 31, 20, 39, 21, 19, -21, -28, -19, 35, 6, -42, -20, 20, -42, -38, 7, -48, -16, 46, -30, 13, 44, 1, -17, 45, -16, -36, 45, -45, 34, 46, -19, 1, 32, 46, -23, 44, 34, 47, 13, 28, 27, -32, -36, -45, 22, 50, 33, 47, -13, -25, 31, 41, 0, 22, 45, 2, 5, 8, 19, 27, 41, 7, 37, -38, -8, 25, 0, -32, -30, 40, 32, -27, -25, -6, -23, 31, 49, -22, -34, 17, -7, 10, 42, 17, 23, -26, 44, 16, -49, 38, -2, 19, -25, 21, 48, -24, 38, -33, 3, -50, 10, -48, 17, -10, -14, 0, -36, -43, -13, 32, 5, -4, 39, -41, 27, -2, -10, 32, -21, -46, 44, 20, 32, -20, 1, 37, 47, -28, -3, -11, -45, -13, -10, 49, -24, 24, 18, 6, -34, 20, 40, -4, 28, -38, -40, 39, 35, 41, -27, 42, 22, -47, -5, -33, -8, 29, -18, 42, -41, 22, 8, -20, -23, 9, -48, 4, -37, 7, 38, -36, -49, -27, 27, 13, 20, 49, -27, -24, -14, 43, 40, -12, 12, 28, -25, 14, -47, -22, -50, -1, 35, -40, 23, 8, 11, 30, -15, 5, 39, -30, -38, -42, -40, 24, 19, -50, 19, 26, 35, 5, -20, 35, -14, -4, 40, 27, -4, 18, 7, -15, -19, 47, 13, 20, -9, -3, 23, 30, -21, -30, 9, -38, -50, 14, -18, -13, -26, -25, 26, 8, 41, -18, 50, -10, -21, 6, -2, -3, 21, -2, -4, 5, 14, -39, 18, 37, -45, 38, 14, -26, -50, -19, -48, -2, -32, 9, -22, -1, -49, 22, 5, -34, 9, -15, 10, -34, -2, 25, 9, -31, -1, -48, -8, 6, -1, 17, 30, -1, -14, -5, -9, -36, -18, 29, -40, -31, -27, 13, 29, 43, 47, 14, 37, 37, 22, 35, 25, -34, 38, 41, 10, -36, 43, 0, -24, 35, 23, 10, 7, -20, 40, -39, -5, -20, -19, -19, 48, 2, 10, -5, 34, 23, 29, -44, -47, 40, 1, 38, -20, 24, 33, -15, 3, 3, -34, 24, -21, 48, -29, -8, -24, -14, -5, -16, -47, 29, 29, 34, -25, 49, -32, 30, -6, -25, -29, 7, 12, -23, 14, -7, 49, -8, -14, 15, -34, -11, -13, 34, 10, -42, 26, 24, 10, 29, -35, -49, 21, -8, -9, 26, 6, 30, 37, 16, -21, -38, -32, -44, -42, 32, 3, 35, 31, 10, 36, -49, -1, 24, -20, -18, 27, 29, -40, -18, -44, -20, -3, -4, 27, 41, 2, 29, -32, 30, 39, -45, -2, 22, -1, 30, 44, -39, -28, 3, 18, 49, 8, -15, -48, 7, 37, 4, 6, -34, -12, 39, 17, 4, -6, 25, -50, -30, 32, -30, 1, 31, -8, 1, 16, -7, -19, -41, 13, 28, 18, 17, -23, 2, 0, 2, -47, 28, -34, 16, 23, -4, 5, -28, -33, -50, -16, 13, 7, 44, 8, -50, -48, 16, -14, 32, -22, 38, -18, 49, 10, 42, 39, -47, -37, 40, -18, -29, -3, -48, 36, 34, -28, 17, -30, 50, -8, 44, 34, -25, -10, 48, -13, 37, -40, -22, 9, 16, 14, 10, -32, -5, -2, -29, 27, 6, -37, -7, -35, 46, 26, -39, 4, 0, -12, -18, -18, -22, 18, 19, -20, 29, -20, 38, -5, 46, 26, 1, -41, 37, 23, -10, 44, 26, -48, 8, 1, -17, -2, -23, 32, 36, 45, -38, 46, 47, 46, 18, 16, 10, 9, 20, -27, 12, 35, 10, -28, -21, 9, -33, 45, 5, 2, -44, 46, 18, 41, 21, 28, 1, -47, -17, 18, -18, 18, -13, 47, -25, -50, -47, -12, 3, 39, -18, -18, 21, -31, -35, -30, -6, 39, 36, 31, 11, -20, -9, -39, 14, 22, -48, 39, -42, 0, -35, 37, 27, -48, 47, 46, -27, 22, -38, -49, 20, -30, -32, 38, -4, -29, 24, -18, -19, 13, 34, -12, 33, 21, -9, 50, -42, -26, 38, 46, -49, -32, -31, 42, 19, -34, 38, 17, 43, 33, -48, 36, 0, 31, -25, 5, 49, 13, -43, 30, 44, -14, 46, -24, -6, -47, 35, 39, 45, 37, 48, -14, 45, 20, -18, -20, 4, -39, -40, 37, 21, -19, 6, -13, 9, 35, 47, -32, 33, 5, -37, -18, -41, 29, 13, 13, 11, 17, 40, 41, -8, 29, 8, 1, 46, -32, -30, -29, -42, -42, 22, -24, -34, -7, -6, -43, 29, -33, -18, -50, 25, -45, -10, 4, -46, 8, 29, -33, -2, 31, 14, 32, 3, 10, -43, -48, -26, 18, 4, -11, 32, 31, -1, 44, -18, -33, 6, -35, 29, -13, -10, -44, 27, 2, 12, 38, -19, -13, -29, -35, 1, -22, -35, 25, -34, 50, 13, 40, 38, -38, 21, 5, -46, -39, -10, -48, 48, -18, 35, -1, 5, -42, 31, -1, -22, -12, 40, 49, -6, -34, 5, 47, -5, 16, 18, -37, 16, -28, 43, 10, -28, -24, 3, -41, 38, 26, -35, -10, 47, 4, 50, 10, 35, 30, 36, 49, -2, 22, 1, -49, 45, -1, 35, -8, 26, -43, 8, 14, 30, -39, -47, 26, 44, -10, -44, 36, 37, 18, 18, 30, -21, 22, -45, 38, -32, 29, 34, 15, -41, -35, -14, 28, 26, 26, -19, -4, 21, -8, 31, -15, -25, -41, -20, 46, -22, -46, 26, -50, 36, -48, 16, 20, 49, -16, -36, 16, 42, -21, 31, 24, -8, 9, -11, 14, -22, 23, 41, 44, -32, -48, -15, -8, -36, 46, -10, 39, 29, -15, 46, 33, 26, -18, -46, 50, 27, 40, 36, -37, 17, 32, -4, 3, -47, 43, 32, 44, 44, -42, 2, 26, 27, 9, -5, 3, 23, 44, -14, -28, -24, 19, 39, 15, 10, 26, 0, -1, -32, -50, -11, -19, -29, 42, 15, -11, -13, -3, 4, 24, 30, 4, 0, 9, -43, 35, 17, 24, 21, -42, 39, -49, 29, 44, 19, 34, 39, 8, -32, -23, 21, -37, -27, -7, 50, 5, 39, 44, 0, -19, -1, -10, 15, -26, 10, 15, -9, 14, -15, 25, -42, -15, 41, -13, -18, -9, 10, -5, 35, 38, 10, -33, 19, 31, 29, -36, -3, 21, -38, -8, 9, 6, 20, -34, -1, -19, -29, 4, 6, -38, -4, 36, 11, 3, -22, -29, 14, -22, -3, -46, -16, 23, 32, 50, 20, -5, -16, -6, -38, -41, 15, 19, 21, 49, -26, -7, 9, -4, -11, -44, -5, -28, 32, -5, 35, -38, -30, -50, -32, 9, -18, -47, -48, 40, 1, 48, -23, 19, 19, 4, 6, 36, 46, -35, -27, 18, -10, 26, -4, 25, 18, 50, -20, 41, 41, -21, -33, -7, -24, 48, -25, 9, -33, 46, 38, 5, -20, 50, 8, -49, 46, -12, 10, 12, 45, -33, -34, 47, -12, 20, 3, 48, 43, 25, -16, -40, 10, -7, 17, -26, -3, -19, 33, 44, -47, -13, 12, -4, -50, -48, 50, 35, 11, 13, -34, 27, 11, -16, -38, -16, -8, -49, 5, 26, 0, 3, -35, -33, -44, -6, -15, -10, 43, -9, -44, -36, 9, -11, 32, -14, 15, 4, 26, 44, 29, 5, -7, 6, -45, 41, -19, 23, -33, 17, 22, -44, -43, 13, -44, -10, -11, -48, -34, 15, 28, 42, 1, -29, -47, -45, -13, -25, -40, 39, -34, 37, 41, 48, -20, 26, -16, -35, 28, -33, 50, 11, -24, -16, -6, -16, -23, -42, 25, -36, -30, 1, -16, 46, 0, 32, 4, 36, 26, -7, 14, 42, 37, 29, -26, 36, 41, -4, 29, 5, -13, -40, 16, -36, -50, -44, -50, -2, 45, 22, -22, -25, 36, -6, 42, 46, 20, -39, 44, -19, -31, 0, 30, -15, 16, -50, -24, -11, 46, 33, -37, 49, 18, 36, 28, -45, -18, 4, -32, 26, -22, 10, 19, 28, 29, -27, -28, -41, 3, -10, -2, -34, 5, -6, -21, -7, 23, 4, -32, -22, -49, -15, -32, -44, -25, 28, -13, -48, 29, 15, 44, 41, 20, 43, -8, 11, 20, 49, 42, -27, -12, 17, 42, -7, -46, 4, 42, -21, -22, -25, 32, -25, -14, 40, 43, 2, -21, -48, -8, -44, -2, 22, -10, 26, 28, 3, 18, 42, 48, 40, -24, -43, -19, 33, 13, -41, -38, 12, 42, -16, 10, 3, -43, -22, 44, -10, -21, 35, -30, 25, -40, -49, -1, -10, 15, 47, -48, 29, 0, 17, 36, 33, -26, -21, 31, -40, 42, -34, -25, -28, 5, 1, -3, -31, -49, 37, -20, -24, -49, 27, -47, -38, 49, -16, 21, 15, -45, -20, -41, -30, 23, -28, -48, -19, -31, 23, -22, 1, -5, -17, 50, 33, 10, 21, 20, 19, -40, 31, 42, 38, 12, -30, -48, 31, 37, -41, -24, -39, -44, -34, 14, 13, -25, -36, -18, 11, 50, -4, 44, -16, 14, 21, 25, 32, -26, 6, -19, 12, -39, 12, 26, 41, -50, 0, 19, -43, 17, -46, 38, 35, 41, -12, -28, 17, 1, -47, -4, -30, 50, 5, 15, 8, -44, -2, -35, -34, 33, 36, 47, 24, -17, -18, -25, 15, 12, 36, -10, 35, 7, 47, 28, -41, -36, -9, 42, 6, 36, -34, 9, -42, -15, 22, 29, -15, -3, 0, 46, 44, 19, 23, 29, 17, -29, 26, 29, 42, -45, -25, 24, 37, 42, -48, 1, 23, 9, 12, 14, 1, 39, 25, -37, 38, 21, 17, -23, 20, -41, 6, 49, 15, 39, -1, -37, -35, 3, -8, -9, 30, -29, 17, -32, 15, -12, 22, -32, -35, 3, -26, -33, -28, 34, -40, -12, 17, -26, 12, 45, -21, -6, 39, 10, 49, 0, 47, -42, 25, -49, -46, 11, 18, 1, 35, -46, 8, 17, -42, 42, -29, -24, -41, 29, 10, 0, -41, -45, 11, -46, 19, 12, 5, 8, 12, 38, 8, 0, -1, -47, -3, -19, 0, 1, 48, 23, -17, -15, 19, -8, -35, 8, 2, -32, 47, 38, 44, -10, 30, -4, 43, 3, 4, 44, -32, 11, 48, 42, 8, 14, 17, -23, -33, -25, -32, 4, 6, -45, -50, -43, 46, 0, 34, 37, -26, -4, 4, 13, 32, 42, -41, 5, -39, -18, 20, -34, 10, -41, -20, 9, 19, -34, -1, -14, 31, 11, 39, 29, 21, 37, 26, -22, -19, 37, 29, -40, 45, -45, -16, -18, -33, -14, -38, 23, 50, 39, 30, 13, -50, 12, 38, -17, -41, 33, -44, 5, 29, -14, -22, -39, -34, -3, 33, -25, 32, -39, -30, -9, 10, 7, 3, -17, -44, -16, -36, 14, 39, 48, -26, 8, 28, 35, -45, 1, 28, 37, -30, 20, 42, 45, -19, 2, 8, 18, 11, -47, 35, -33, 48, 30, 5, -27, 15, -38, 11, 3, -36, 18, -48, -14, -14, 50, -48, 12, -16, 1, 36, -23, 43, -33, -15, -18, 13, -25, -3, -11, -34, -11, -44, 6, -43, 5, -20, 8, 7, -39, -3, -20, 32, 12, 23, -12, 25, -31, 50, -3, 20, 3, 27, 24, 20, -22, 23, 42, 22, 49, -3, 23, 32, 5, 44, -34, -42, 46, -17, -6, 37, -42, -44, -35, -32, -45, -40, 25, 10, -9, -38, -39, 34, 23, -31, -1, -15, 41, 37, 18, -14, -39, 48, -11, 3, -49, -1, -10, -6, -42, 11, 35, -4, -46, 25, -50, -7, -29, -13, -32, 29, -20, 16, 36, -9, 31, -25, -38, 7, -33, 16, 36, -48, 4, 38, 40, 7, 12, 40, 1, 38, -27, 21, -42, -14, 43, 32, 2, 29, -27, -30, 49, -11, 11, 19, 18, -37, -9, -1, 10, -47, 21, 37, 24, -34, 34, 6, 39, -3, -7, -6, 40, 29, 39, -18, -20, -4, -45, 21, 20, -17, 2, -37, -35, -8, 22, 23, 30, -39, 19, -32, -10, 2, -22, 19, 8, 38, 13, -27, 38, -35, 1, 29, -45, -14, 34, -47, 47, 41, -13, -10, 41, 30, -37, 20, 35, 0, 14, 42, 1, 44, -21, 6, 28, 31, 48, -21, 47, -9, -40, -24, -27, 48, -12, 21, -33, 26, -6, 37, 36, -39, -2, 43, -20, 41, -29, -7, 41, 13, 26, -26, 0, -44, -45, -27, -32, 32, 49, -42, -15, -11, 42, -27, -3, 12, 18, 2, 3, -9, -6, 39, -37, -22, -45, -44, -14, 2, -33, 36, -13, 8, -50, 17, -7, -4, -16, 36, 40, 9, 39, 1, -43, 29, -10, -48, 45, 18, 33, -37, 45, -25, 19, 7, 49, -11, 0, -46, 26, -19, 29, -50, 26, 3, -40, 2, -43, -26, -11, -19, 37, -23, 27, -48, 49, 40, 33, 28, 11, -24, -6, 41, -26, 10, -7, 46, -5, -37, -43, -3, -37, 14, 29, 31, -44, 28, 37, -2, 4, -38, 22, 5, 5, -36, 6, 7, -16, 37, 46, -35, -43, 42, 36, -6, 44, -11, 3, -37, 8, 43, 2, -24, -4, 29, -45, 4, 46, -7, -33, -35, -39, -31, -6, 13, 8, 42, 43, 39, -29, 46, -4, -22, 35, -6, 26, -42, -27, -36, -15, -38, 40, -7, 50, 20, 21, 50, 27, 25, -15, 10, 30, -11, 42, -24, -50, -17, 17, 37, -30, -18, -44, 14, -48, 0, 28, 44, 3, 29, 23, 42, 8, -45, -22, -34, 9, -29, -27, 30, 34, 0, -1, -40, 5, 20, -9, -12, 18, -3, 6, -30, 31, 48, -31, -36, 18, 26, 0, 25, 11, 34, -14, -45, 20, -25, -43, 22, 40, -47, -30, -20, -30, -26, -36, -16, -2, -8, -10, -14, 6, -9, -4, 41, 10, -37, 17, 2, 33, -17, 25, 46, -27, -31, 18, -21, 37, -44, -15, -13, 29, 1, -36, -5, -28, -39, 42, -7, -36, 42, -2, -30, -36, -37, -9, 29, -36, 12, 17, -24, 36, 42, 2, 1, 12, 22, 2, 6, 1, -8, -44, -9, -47, 18, -46, 24, 41, 29, -10, 43, -47, -49, 16, -30, 19, -8, 31, 18, -42, 33, -23, -25, 31, 32, -48, 22, 49, 44, -2, -34, 12, 4, -28, -17, 18, -36, -4, -48, 32, -23, -48, -47, 37, -20, -6, 8, -6, 24, -14, 14, -42, -34, 14, -48, -25, 2, -20, -25, -28, -21, -41, 21, 38, 13, -29, -36, 5, 23, -31, -4, 36, 2, 2, -50, -49, 7, -32, 11, 27, 21, -39, -25, -24, -22, -36, -5, -50, 9, 41, 6, -48, -33, 1, 9, -17, 45, 42, 38, 9, -25, 21, -32, -29, 42, -18, -13, -16, 16, 32, -41, 40, -36, -40, 39, -27, 26, 45, 50, -47, -38, 22, 6, 47, -14, -3, 20, -50, 9, -39, -30, -40, -7, 7, -7, 27, 47, -17, -26, -47, 13, 39, -35, -41, 15, -16, 32, -45, -32, 8, 2, -43, 27, -41, 16, -13, -22, -36, 36, -28, 31, -5, 32, -23, -25, -41, -4, -47, 4, 15, 16, -44, 4, 29, -20, 23, -32, -23, 30, -23, -32, 50, 36, -31, -38, 26, -8, -40, -3, -36, -34, 3, -1, -23, 32, -47, -29, 35, 50, -12, -17, 46, -7, -9, -11, 46, -39, -49, -23, 23, 35, 30, 39, 16, 20, 21, 33, 25, 48, 30, 41, -41, 35, 6, 46, 35, -14, 26, 40, 13, 28, 35, 43, -11, 50, 47, 9, 47, -3, 48, -32, 21, -18, -7, 41, -14, 38, -15, 30, 37, -30, -49, -20, 46, -21, 25, -7, -39, 0, -2, -27, -27, 9, -40, -38, 40, 21, 23, 21, 13, -31, 21, 22, 20, 27, -23, -49, -8, -43, -38, 34, 41, -16, -28, -5, -36, -49, 10, 25, 13, 1, -15, 16, 18, 16, -4, 32, -49, -7, 50, 13, 30, 27, -23, 40, 3, 23, 16, -15, 12, -26, 35, -3, -12, -4, 43, -30, -21, 41, -20, -25, -29, -30, -50, -14, 26, 34, -5, -42, -34, -4, 34, 44, 8, 3, 35, -39, 13, -45, 2, -35, 39, -46, 22, -5, -37, -7, 12, 43, 1, -25, 2, -22, -32, -4, -43, -28, -16, 44, 2, 48, 45, 7, -46, -35, -34, -19, 45, 1, -31, 15, 33, 31, -50, 7, 42, 42, 32, -7, -45, -1, 21, 37, -31, -37, -46, -10, -11, -17, 29, -6, 20, 29, 20, -24, 27, 27, -7, -18, -18, -7, -31, -15, -44, -19, 16, -12, 42, -27, 35, 19, 37, 36, 3, -13, 23, 29, 24, -19, -6, 10, 19, 37, 46, 2, 0, 25, 5, -24, -13, 11, -33, 13, 26, -21, -2, -10, -38, -17, 49, 43, -26, 15, 49, -33, -46, -32, -9, -33, -19, -30, -41, -14, -2, 35, -38, 4, -34, -42, 37, -7, 27, -5, -43, -14, -32, 12, 41, -5, 43, 20, -25, -5, -5, 24, -37, 34, 12, 21, -48, -23, -22, 36, -33, -16, 26, 25, -4, -46, 24, 8, 24, 8, -4, 44, 44, -38, 27, 38, -18, 46, 11, 28, -35, -7, 7, -45, 38, -36, -47, 5, 13, 17, 43, -17, 40, 44, 5, -19, -42, 12, 21, 27, -18, 36, -30, 4, 25, 6, -49, -38, -47, 33, -1, -3, 27, -21, -22, -43, -39, -10, -25, -1, -49, 4, 5, -37, -45, 44, 30, 38, 10, 45, -39, -38, -32, -7, 38, 44, 8, -14, -26, -35, -13, -8, 36, -37, -45, 38, -28, 9, -39, -38, 49, 47, -45, 12, -13, -1, 1, -11, -43, 10, -43, 46, -17, 28, 49, 9, 6, 48, -5, -29, 36, -11, -6, 4, 0, 35, -46, 44, -38, -23, 33, 46, 29, 11, 42, 36, -27, 47, -44, -13, -14, 17, 47, -9, 35, -46, 13, -1, 36, -36, 44, 22, 2, -26, 38, 34, -42, -13, -29, 36, -2, 17, 42, -36, 14, 3, -21, 42, -31, -18, 49, 35, 26, -44, -43, -23, -6, 22, 38, 29, 23, -40, -20, -39, 44, 27, 0, -7, 45, -1, -34, -16, -50, -22, 0, 13, -47, 36, -23, -35, 12, 25, 2, 34, -34, -11, -38, 1, 7, 45, -14, 28, 25, 10, 28, -17, 19, -34, -31, 22, 8, 18, 36, -18, 27, -34, 6, 32, 46, -50, -38, -24, 19, 8, -45, 46, 43, 48, -28, -41, 0, -32, 0, 41, 36, 17, 33, 32, -9, 40, 6, 47, 17, -13, 11, -44, 20, -1, 1, -25, -25, -32, -42, 10, -31, -1, 29, 30, -29, -38, -39, -41, 14, 45, -21, -43, -30, -29, -33, 15, -3, -7, -42, 16, 3, -25, 34, 43, 41, 49, -25, -17, -43, -41, -3, 4, 3, 27, -11, -36, 30, -33, 45, -28, 11, -5, 36, 48, -12, -36, 2, 37, 13, 12, 41, 29, -35, 19, 15, -38, -4, -42, 12, -17, 30, 40, -22, -14, -8, 35, 13, -27, 20, -17, -3, -39, -28, 28, 46, -38, 36, 45, -6, 48, 14, -4, 7, -46, 26, -46, 9, 45, -30, -27, -33, -30, 3, -41, -27, 34, 38, 9, 6, -28, -29, 17, -17, 19, -23, 44, 48, -12, -9, -28, 19, 29, -49, -27, -34, 14, 19, 18, 9, -1, 42, -39, -4, 16, 14, -24, -3, 37, 11, -7, -32, 8, -43, 4, -4, -49, 43, 43, -12, -6, -19, 14, -13, 26, -40, -41, 8, 39, 4, -31, 30, -34, 17, -46, 9, -28, -5, 1, -41, -5, -23, 46, -8, -25, 4, -3, -22, -24, -33, 9, 23, 18, 23, -30, -27, -48, 44, 11, 50, -49, 15, -9, -17, -9, -31, 46, 17, -6, 24, -9, -4, -46, 38, -2, -14, -17, 22, 19, -33, 27, -32, 27, -11, -34, 9, 48, 42, -9, 30, 21, 14, 2, 49, -44, -46, -27, -23, 11, -34, 50, -31, -48, -14, 39, -36, 0, -3, -43, -38, -3, -48, 14, 22, -20, -25, 30, 5, -17, -42, 11, -38, 18, -10, 26, -50, 38, -4, -47, 49, 12, 1, -41, -23, -45, -24, -39, 11, 1, -3, 16, -5, 46, 23, 44, -36, 20, -15, -37, 27, -48, 16, 35, -32, 48, 25, 3, 18, -41, -18, -38, 48, 0, -19, 24, -27, -16, 32, 19, -11, 3, -7, 11, 48, 17, -18, 26, 5, -15, 3, -32, -8, -39, -40, 19, -39, 40, -10, -26, -48, -48, 33, -23, -28, -3, 16, -9, 37, -11, -45, -31, -40, 45, -24, -30, -38, 35, -16, -4, 35, -23, -30, -33, -20, 9, -14, -30, -37, 38, 40, 9, -28, 44, -22, -4, -21, 39, 33, -13, 32, -24, 38, 36, 42, -36, 8, -48, -41, 28, 29, -34, 32, -40, -3, -46, 18, 13, -37, -1, -25, 21, 18, -44, -35, 4, 27, 50, 5, -47, 49, -3, -34, -15, 19, 29, 42, 49, -13, 50, 11, -3, -41, -15, -22, 27, -47, -7, 5, -9, 49, -38, -5, 31, -18, -30, 29, 28, 6, 18, 19, 16, -3, 25, 49, -18, -15, -18, -20, -30, -24, 40, 21, 50, 11, 45, -25, 15, -39, -29, -34, -44, 17, -14, -13, 45, -40, -50, -26, -9, 1, -27, 2, 5, 12, 30, -43, 8, -6, -24, 1, -33, 40, 35, -35, 15, -46, 31, -48, 40, 30, 29, 19, -44, -1, -37, -13, 28, -4, -18, -8, 40, -22, 6, 50, -46, 42, 45, 9, 19, -49, 19, -8, -47, 5, 42, 8, 38, -42, -48, 39, -3, -8, 40, 49, 45, -50, 6, 2, -35, 0, 24, 39, 4, -50, 39, -23, 2, 7, 22, 9, 8, -29, -43, -2, -9, -24, -12, 32, -26, -13, 34, -27, -27, 9, 32, -1, 15, -37, 2, -19, 45, 41, -3, -12, -11, -9, 26, 25, -43, 28, -25, -39, -8, 0, 40, 31, 49, 12, -2, -24, -42, -12, 14, 20, 39, 20, -44, 21, 29, 16, -41, 20, 34, 2, 50, 44, 36, 6, 40, 35, -24, 3, -47, 37, -28, -3, 32, -9, -48, 40, -48, -23, 12, 30, -20, -41, -2, 35, 43, -30, 49, 2, 36, 25, 38, 3, 6, -31, -2, -44, -22, -3, 42, -38, -48, -49, -35, 43, -45, -6, 20, -46, 5, 20, 47, -19, -2, -38, -21, -26, 34, 9, 8, 34, -23, 7, -31, -17, -46, 31, 9, -8, 6, 6, 24, 3, 30, -6, 35, -14, 33, -3, 3, -3, -45, -17, 12, 27, -3, -28, 33, -38, -4, -7, -19, -25, 2, -37, 1, -15, -43, -11, 35, -29, -35, 40, 9, 9, -41, -26, -20, -30, 40, 30, -18, -20, 39, -30, -15, 14, -47, 17, 39, -47, -42, -21, -6, -47, 18, -28, -35, -29, 50, 21, -3, 11, 46, 9, 29, -46, 29, -44, 0, 14, -42, 31, -6, -4, 16, -27, 41, -41, 22, 26, -3, -16, 3, 36, 30, 20, -35, 2, -11, 49, -31, 37, 18, -6, -45, 41, 18, -2, -12, -49, -12, -30, -11, 50, 31, 3, -39, 30, -14, -13, -36, -44, 27, -1, 14, 16, 50, -7, -20, -8, 26, -3, 31, 30, 30, 10, 24, 33, -41, -22, -3, 47, 30, 11, -38, -7, -4, 13, 40, 2, 39, 41, 26, 25, -7, -23, -49, 50, 6, 6, -17, 36, 7, 1, -22, -16, 24, -3, -18, 24, 22, 27, -42, -3, 16, 42, 32, -15, 45, 20, 41, -7, 31, 9, 12, -46, 36, 35, 39, 25, -11, -32, -4, 14, 16, 40, -33, -1, -21, 15, -46, 42, 46, -9, 33, 43, -46, -1, 34, 7, 28, 33, -43, -20, -39, -30, 43, 11, 40, 39, -18, -25, 39, 49, -11, 14, 8, -36, -50, -40, 4, -49, 14, 44, -7, -35, -29, -33, -4, 30, -21, -41, 48, 7, 11, 34, 29, -45, 16, -10, -8, 34, 26, -33, 7, 9, 37, -24, 17, -29, -27, -11, 23, 15, -11, -45, -33, 30, 36, -21, -30, 11, -41, -38, 25, -42, 17, -12, -27, -17, 10, -10, -46, 28, -1, -47, 0, 1, -12, -43, -6, 37, -23, -24, 14, -17, 30, 50, 11, 11, -13, -25, -27, -12, -30, 43, -4, -3, -38, 50, -48, -19, -16, -32, -37, -3, 35, 30, 17, -6, -32, 13, 50, 15, 28, 15, 24, -6, 36, 23, 16, 18, -48, -13, 26, -9, 32, -11, -1, -16, -27, 37, -34, -11, 23, 15, -7, -28, -45, 15, -30, -16, -22, -44, 42, 2, -14, -28, 46, -43, 25, -3, -41, 28, -27, 39, -4, 2, -12, 16, 15, -45, -30, 22, 23, -15, -48, 37, 35, 27, -9, -6, -7, 40, -18, 9, 35, 42, 32, 32, 19, 32, 26, -25, 35, -30, 49, -49, -4, -21, -24, 20, -31, -1, 44, -28, -38, 30, -47, -37, -31, -38, -48, 39, 39, 31, 45, 27, -4, -48, -50, 39, -27, -16, -37, 16, -38, -4, -1, 27, 34, -25, -48, 0, -11, 17, -15, 0, -50, -18, -44, 1, -40, -24, -37, 35, 29, -5, 25, -41, -27, 10, -33, 35, -42, -34, 7, -38, -1, 50, -45, 34, 0, -15, 20, 49, -26, -40, -7, -37, -22, 23, -1, -46, 21, 18, 37, 6, -25, -45, -35, 9, 49, -39, 24, -48, 12, 13, 11, 50, -45, -32, -33, 29, 36, -8, 50, 22, -48, 21, -13, 17, 25, -7, 44, 38, 29, 12, -9, 13, 3, 27, 26, 20, 25, -14, -47, -49, 48, -7, 16, 17, 25, 32, 23, 11, -50, -34, -35, -42, 2, 22, 8, -42, -39, -10, -36, 15, 24, -40, -43, 4, 45, -45, 2, -31, -12, 48, 21, -17, 6, -32, 20, -20, 31, -11, -37, 49, 30, -14, -7, -42, 7, -31, 41, -1, -31, -15, -24, 21, -19, -50, -34, -42, 33, -6, 45, 15, -19, -6, -42, -21, 33, -13, 9, -50, -46, 12, 48, -15, 14, 27, 22, 43, -27, -47, 27, 38, 17, -26, 23, 48, -44, -38, 17, -8, 6, -15, -37, 31, 21, 45, -24, -14, 36, 20, 25, -26, 16, 39, -47, 49, 28, 45, 42, 23, 34, -35, -32, -22, 0, -33, 7, -7, -35, 14, -49, 5, 28, -23, 14, -46, -29, 49, -38, 14, -35, 35, 13, -19, 29, 0, 28, 7, -5, 1, 12, 25, 9, 14, 30, 4, 6, 41, 20, 22, 35, -25, -39, 20, -5, -4, 28, -13, -30, -37, -49, 21, 19, 50, 50, -18, -45, 39, -14, -37, -14, -43, 26, -38, -11, 41, 7, -33, 6, 32, -13, -19, 35, 15, 26, 36, -26, 41, 7, 24, -18, 37, 15, -21, 30, -17, 35, 18, -3, -11, 0, 29, -38, 39, -20, -12, 12, -3, 36, -3, 10, -39, 27, 5, -33, -24, -23, 31, 29, 1, -35, 26, 7, 42, -42, -25, -23, 26, -15, -42, -4, 27, 0, 25, 6, -19, 16, 6, 3, -35, 11, 33, 45, 5, -28, -34, 29, -13, 21, 32, -21, 7, 47, 27, -29, -34, -36, -3, -19, 26, 34, -11, 46, 6, 7, 40, 48, -35, -23, 47, -50, -10, -3, -20, -15, -18, -18, 31, -28, 9, 36, 28, 39, -21, 38, -6, 29, -12, -6, 27, 30, -39, 42, -19, 5, -27, -38, -31, 28, 5, 2, 17, 3, -17, -23, -1, -49, 43, -25, 0, -4, -25, 33, 41, 33, 24, 23, 10, -28, -14, -10, 1, 32, 31, -2, -24, -45, 23, 15, -27, -13, -23, -23, 15, 10, -5, 18, 24, 23, -8, 8, -49, -36, -14, 20, -31, 47, -16, -17, 35, -20, 36, -32, 17, -27, 33, -12, 41, 3, -12, -34, -32, -3, -16, -19, -4, -4, 13, -5, -16, 43, -34, -9, -22, 19, -34, 30, -37, -27, 6, -1, 6, 50, 10, -12, 4, 45, -15, -14, -37, -24, 32, -20, 22, 30, 32, -7, 17, -3, 6, 24, -29, -47, 30, 21, -5, 8, -17, -40, -20, -40, 5, -13, -30, 43, -41, -25, 40, -43, -43, 9, 21, -17, -35, -38, 36, 25, 40, -29, 45, -24, 13, -49, 46, -25, 41, 32, 18, 46, 33, -21, -43, -13, 10, 30, 14, 16, -5, 39, 44, 21, -8, 8, -5, 21, -16, -12, 41, 0, -47, 29, 26, 33, 0, -46, 4, 50, -31, -27, -15, -17, 3, -17, 32, -34, -46, 38, -33, 4, 2, -1, 21, 40, 28, -6, -38, -35, 35, 33, -38, -31, 15, 48, -4, -32, -6, -14, 3, -45, -37, -47, 35, 4, 49, -17, -24, -44, -48, -4, 46, -49, 29, -26, 9, 28, -27, -36, 44, -37, 3, 27, -45, 27, 30, -33, -31, 11, 30, 29, -11, -12, 1, -19, 22, -24, 1, 46, 12, 23, 12, -34, -2, 49, 30, 31, -28, 47, 21, -38, -28, 6, 11, 3, -31, 35, 1, -28, -16, 16, -17, -18, -5, 30, -6, -32, 43, 36, -36, 27, 15, -12, -33, 19, 8, -19, -30, -11, 41, -24, -49, 46, 29, -12, 35, 5, -38, 5, 15, 27, 5, -23, 13, 20, 31, 13, 5, -10, 49, -10, 49, -47, 6, -21, 37, 33, -5, 5, -20, 37, -44, 39, 26, 3, -43, 4, 18, -7, -38, 42, -31, 27, -19, 9, -1, -24, -26, 1, 17, -30, -33, -12, -36, 2, -13, -3, 1, 37, 21, -23, 34, -35, -35, -16, -34, 22, 48, 1, 42, 31, -39, 32, -3, -29, -2, 1, 28, -50, 15, 13, -43, 35, -26, 15, 22, 22, 26, 19, 43, 28, 0, 2, -36, -1, 20, 24, -13, -11, 15, -12, 23, -34, -44, -12, 17, -16, 0, -4, -15, 13, 44, 38, -38, -33, -30, 14, 49, -43, -3, 34, -8, 2, 34, -24, -32, -28, -1, 0, -8, 48, 0, 18, -10, 21, -40, 29, 37, 34, 1, -28, -2, -13, -4, 21, -44, 15, 43, 26, 11, 36, -22, -13, 50, 33, -18, -22, 28, -28, -48, 50, 42, -6, -43, 35, -22, -49, -1, 14, -31, 1, 34, -14, 21, -24, -4, 48, -45, 9, -6, -7, 32, -33, 14, -26, -24, -44, -7, -22, 44, -7, -15, -32, -45, -26, -20, -42, 33, 23, -14, -24, -38, -10, 15, 34, 46, -27, -7, 47, 9, -42, -49, 5, -21, -29, 24, 30, 49, -38, 20, -35, 46, -6, 14, -40, 19, -31, 48, 12, 50, 39, -39, 11, 43, 41, 40, -9, 32, 18, 7, -46, -24, -23, -25, 40, -2, -30, -50, 41, 7, 28, 4, 30, -25, 33, -26, 26, -18, 38, 21, 18, -45, -28, -21, 27, 3, 36, -40, -20, -45, -40, 26, -39, 15, 2, 48, -15, -34, -23, 41, -29, -44, -36, 45, -40, -27, 16, -21, 19, 15, 10, 27, -10, 31, 0, -7, 44, -38, 39, -39, 31, -42, 34, -3, -2, 2, 5, -11, -27, 47, 21, -18, -28, 26, 3, 2, -2, 27, 27, 29, -2, 9, 39, 39, 14, -19, 28, -30, -33, 43, 9, -38, -27, -21, -49, 32, -26, -1, -37, -45, 25, 33, 36, -21, -21, -13, 7, 43, -10, 43, 6, -15, 13, 47, -35, 37, 27, 39, 21, -37, -20, 15, 17, 14, 4, 33, 27, -11, -26, -26, -48, 18, -25, -11, -13, -13, 17, -44, 43, -21, -32, -16, -18, -18, 27, -13, -41, 6, -23, 27, 49, -13, -35, -30, 41, 46, -45, -10, -36, -48, -8, -4, 48, -37, 15, -22, -47, -25, -39, -49, -34, -16, -41, 35, -8, -30, -36, -16, 34, 34, 34, 9, -7, 45, -46, 22, -33, -30, 21, 47, 23, 0, -10, -27, -27, 45, 46, -13, -7, 6, 8, -17, 24, 44, 31, -28, 35, -8, 31, -11, -4, -10, -4, -31, 26, 14, 17, -27, 49, -15, -6, -49, -23, -25, -28, 28, -15, 40, -45, -16, -13, -16, 49, 23, 43, 2, -13, 42, 8, -8, -47, -46, 17, 49, -6, 29, -26, 27, -40, -22, -17, 35, -37, -27, 8, -12, -25, -8, -15, -12, 10, -35, 8, 45, -45, 47, 5, -43, 43, -24, 20, -24, 38, -5, -10, 28, -26, 35, -33, -39, 36, 0, -12, 38, -41, 43, 23, 47, 26, 3, -22, -10, -42, 12, 26, -14, -37, 50, 22, 21, -12, -11, 3, -48, 4, -18, 45, 20, -32, -17, 27, -1, -4, -5, 5, 6, 32, 0, 3, 39, 30, -23, -32, -24, -3, -32, 46, 0, -44, -22, -8, 18, 43, 7, -43, -9, 25, -9, -38, -25, -33, -9, 0, 33, -35, 50, -48, 40, 28, 47, -6, -29, -28, 8, 11, 17, 3, 6, -28, 9, 22, 37, 34, 4, 29, 12, 5, 4, -26, -25, -2, 12, -6, 22, 28, -12, 46, 14, 18, 5, -42, 19, -23, -6, -25, -23, -11, -36, -45, -24, -13, 17, 24, 34, 13, -21, 31, 48, -48, 11, -39, 40, -21, 34, -13, 34, 9, -13, -36, -33, 1, -22, 9, -30, -34, -33, 6, -14, 9, -13, -39, 24, 33, 22, -50, 7, -48, 12, -30, -28, -42, 32, 4, -32, 11, 36, 40, 40, -12, 49, 25, -24, -5, -17, -18, 41, 44, 45, -1, -31, -11, 48, 44, 7, -20, -13, 35, -6, -10, -42, -42, 12, 28, 26, -29, -35, -19, 15, 39, -37, -13, 47, -43, 49, -30, 5, -5, -8, 41, -5, -3, 19, 33, -20, -18, -7, 20, -43, 22, -49, -34, 1, -6, -14, -9, -7, 30, -13, 48, 43, -45, 17, 0, 50, -16, 7, 6, 22, -45, -38, 8, 35, 41, -21, 49, -49, 7, -15, 21, -6, -42, 14, 26, -1, 28, -19, 47, -8, 44, 27, 3, -4, -37, -3, 4, -22, -4, 12, -32, 40, -42, 50, -14, 41, 1, 6, 37, -23, -15, 13, -33, 38, -16, 17, 27, -12, 39, -43, 37, 29, 33, -36, -44, -34, 35, 35, 13, -39, 31, 5, -5, -4, 28, 50, -35, 18, -49, 41, 3, -24, -20, -10, -15, -4, -8, 14, -1, 42, -50, 21, 6, -35, -23, 35, 31, -29, -10, 25, -32, 38, -1, 8, 18, -17, -12, 23, -44, 50, 1, 9, 1, 28, -27, -25, 39, 39, -41, -34, 27, -49, 26, -24, 22, 20, -3, 23, -42, 35, -28, 20, 22, -24, 37, 42, 30, 33, 20, -8, -44, 41, 32, 12, 33, -7, -12, -11, -44, 19, -26, 8, -38, 35, 30, 35, 47, 11, -43, -6, -33, 37, 9, 9, -49, 15, 40, -37, -3, 5, -39, 45, 41, 4, -23, 38, -47, 39, -15, -1, -48, -50, -34, 20, 11, -3, 11, 18, -32, -17, 48, -2, 29, -4, 40, -1, 38, -25, 5, 27, -37, 27, -26, 49, -47, 28, -19, 31, 27, 14, 10, -31, 23, -41, 37, -17, 10, 41, -24, -11, 14, -18, 17, 20, -42, -35, -46, 47, -28, -8, 38, 6, 0, -38, -27, -40, 1, -34, -14, -38, 11, 40, 33, 46, 45, -43, 5, 42, 32, 19, -7, 9, -10, -30, 35, -9, 23, 23, -22, 29, 14, -34, -21, -25, 2, -32, 2, 34, -34, -5, 34, 2, 13, -6, -2, -32, 20, 30, 14, -14, 19, -25, -49, 8, 45, -46, -14, -20, 25, 48, 43, -3, -45, -36, -36, 10, -35, -31, 26, -7, -9, -5, 44, -17, 13, -22, -48, -42, 24, 24, -26, 35, -9, -5, 22, 33, 8, -30, 23, -29, -22, 12, 22, 10, 13, 18, -11, 24, -50, 14, 11, 3, 9, -5, -46, -29, 39, 2, 19, -19, -40, -41, -12, 47, -20, -39, 29, -13, 16, 15, 1, -46, -40, -26, -16, -16, -29, -14, 35, 4, 24, 45, 48, 44, 21, 13, -31, 47, -47, -33, 0, 17, -31, -42, 29, -25, -26, 17, -10, 8, -6, -10, -13, -32, -37, -30, -36, -48, -14, -5, -35, -37, -42, -44, -37, -45, 34, -36, 1, 21, -17, -50, 45, 18, 43, 35, -31, 29, -44, -44, -1, -49, -4, -37, -20, -1, 10, -10, -37, -46, 24, -46, 13, -22, 24, -46, 45, -15, 28, -32, 13, -29, -17, 5, -34, 25, 38, 5, -34, 23, 41, 31, -33, -6, 45, 27, 5, 29, -1, 7, -33, 29, 30, -44, 25, 47, -41, 18, 34, -48, 32, -7, 48, 19, -37, -47, -33, 42, 48, 1, -13, 29, -31, 37, 48, -7, 0, -32, 17, 46, 15, -38, 11, 10, -21, 47, -21, 0, 37, -3, -18, 23, 31, -32, 20, 6, -32, 37, 28, -10, -9, 36, 1, -47, -47, -46, -10, 36, 50, 10, 24, 4, 24, -38, -37, 9, 21, -26, 31, -7, 31, -41, 20, -1, -7, -37, -36, -35, -49, -21, -21, 31, -20, 26, -31, -2, -16, -28, 46, 48, 49, 10, 33, 4, 16, -43, -11, 8, -19, 42, -44, -49, 34, -45, 41, -15, -19, -6, -9, 2, -42, 24, 36, 24, -2, -49, 16, -40, -1, -16, -36, 24, -20, 41, 11, -23, 45, -26, 33, 41, -26, 24, 32, 41, -50, 8, 18, 23, -9, -17, 49, 15, -33, 26, -46, -31, 15, 24, 11, 43, 45, -19, 7, -1, -13, 4, -23, 23, 35, 30, -29, -8, 32, 30, 37, -15, 45, 1, -15, -23, 27, 7, -15, 19, -42, -30, 13, 25, 10, 43, 44, -11, 5, -47, -20, -24, 7, -26, 18, 19, -46, 40, -43, -42, -36, 49, -44, 45, 21, -36, -14, 32, -12, -45, 32, 6, 41, 30, -32, 12, -20, 24, 28, -41, 36, 16, 11, -48, -33, -26, -31, 7, 42, 35, -1, 28, -41, -30, -22, 45, -41, -38, -4, -28, -1, 36, 44, -47, 16, 34, 2, -49, 17, 14, 28, 6, 46, 19, -44, -32, -7, 12, 14, -12, 32, -25, -7, -39, -29, 26, 41, -37, 35, -21, -7, 33, 40, -13, 8, -9, 1, 12, 10, -17, -12, -10, -14, 14, 28, -19, -43, 46, -33, -6, 42, 45, -18, -46, 31, 23, -15, 46, -28, -11, -46, -17, -27, -34, 44, 20, 30, 41, -29, -36, 50, -36, -26, 2, -30, 15, 40, -19, -30, 17, -7, 32, 15, 39, 47, -37, -36, -31, -17, -15, 32, -42, 20, -21, 26, 40, 12, -16, -38, 28, -5, 5, -42, 36, -15, -48, 47, -32, -23, -28, -44, 25, -37, -5, -36, 16, -36, 0, 37, -43, 18, 11, 0, 12, 17, 27, -35, 33, -27, -45, 6, -20, -45, 48, 28, -22, 16, 24, -48, -23, 23, 46, -3, 29, -41, -18, 49, 16, 18, -39, 6, -7, -38, -27, -7, 6, 45, -35, 45, 50, 49, -30, 25, 0, -30, 9, 0, -30, -45, 22, 14, 25, 7, 27, -45, 14, 35, -17, 5, 24, -48, -9, 11, -45, -45, 12, -31, -30, -49, 39, 44, 39, 5, 45, -41, 36, 19, -28, 41, -21, 27, -14, 4, 45, -2, -17, -7, -29, -20, -44, -30, -35, -31, -8, -7, -4, -32, -3, 45, 28, 18, -40, 28, -22, -6, 17, -15, -3, 36, -36, -7, 16, 45, 23, -11, 35, -37, 12, 30, 34, 0, 28, 7, -36, 14, 37, 4, 25, -41, -9, 44, -40, -35, 22, 27, -32, -20, 22, 49, 2, 39, -43, -27, -43, 32, -3, -21, 7, 35, 4, 22, 11, -3, -47, -14, -43, -50, 41, 19, -4, 49, 24, -46, -1, -27, -4, -33, 33, -23, 26, -46, -21, -50, 35, 31, -5, 18, -20, 19, 40, 5, 38, 42, -23, -35, 3, 2, -39, -31, 31, -17, 2, 13, -28, -24, -34, -3, -30, -1, -11, 44, -48, -34, 10, -1, 39, 36, -45, -23, 21, 4, 7, -6, 21, -32, -22, -28, -19, -41, 40, -2, 14, -22, 8, -6, 16, 0, 50, 44, -40, 35, 31, 48, -45, 16, 11, -46, -42, -23, 32, 41, 40, 26, -13, -8, -30, 40, 11, -5, 19, -13, -2, 24, 30, -12, 20, -21, -30, -50, 38, -19, -43, 18, -21, -43, -32, 8, 4, -21, 28, -15, 4, -7, -24, 26, 27, 50, 3, -3, -21, -12, -38, -35, -7, 20, -24, -6, -16, 28, -23, 48, -44, 11, 0, -5, -31, 45, -13, 10, -19, -25, 7, -12, -31, 31, -1, 28, 1, 35, -29, 2, 34, 15, -8, 31, -28, 26, 13, -42, -44, -10, 3, 14, -49, -47, 27, -19, 49, -49, 13, -37, -31, 38, -2, -43, 41, 12, -5, -30, 36, -19, -43, 44, 50, -35, -11, -24, -33, -16, 1, -36, 12, 2, 40, 30, 15, -20, 10, 13, 50, 47, -17, 4, 8, -48, -34, 27, 27, -5, -13, -16, -50, -22, -47, 10, 46, -34, -23, -1, 39, -43, -17, 8, -33, 44, 8, -24, -35, -41, 25, -29, -35, -39, 24, 33, 0, -50, -24, 16, -39, -21, -42, 2, 10, 3, -14, 14, -9, -2, -47, 13, 28, 0, 40, 21, 9, 36, 28, 40, -20, 21, 43, 7, 31, -47, -29, -48, 28, 48, -4, -13, -18, 27, -3, 14, -25, -43, -1, 29, -13, -41, -9, -14, -25, 41, -39, 33, -2, -37, -5, -16, -22, -39, 31, -7, 15, -49, 8, -34, -41, -33, -29, 32, 7, 2, -50, 37, 10, 49, 38, 49, -20, -20, 15, -32, 2, 25, 23, 44, -29, -28, 36, -36, -25, -48, 36, -31, -11, -12, 21, -33, -10, 19, -24, 49, -36, -14, 7, -46, 22, -44, -10, 33, -41, 11, -25, 17, -27, 27, -10, 14, -34, -27, -24, -44, 22, 48, -39, 34, -48, 28, 34, -41, -18, -5, 8, 1, -45, -49, -22, -11, 46, 10, 17, 17, -22, 50, 11, 9, 33, -10, 36, 31, 38, 14, 13, 28, 12, 47, -3, -31, -14, 13, 40, 35, -46, -17, -12, 16, 30, 11, 37, -27, -48, 20, 38, 16, 28, 42, -1, -22, 23, -19, 36, -12, -42, 50, -37, 17, 13, -31, -23, -37, -7, 47, 26, 44, 46, -12, -23, 13, 38, -19, -42, -23, 44, -34, 36, 26, 4, -41, 29, -45, -3, 24, 16, 41, -10, 28, 9, 26, -9, 30, 20, -23, -38, 30, -36, -15, 41, -36, 24, 5, 44, -47, 48, 47, 1, 40, -41, 43, -6, 33, -22, 2, -22, -28, 6, -1, -30, -8, -41, 25, -21, 0, -18, -33, 27, -29, 13, -30, -50, -36, -15, -4, 3, 35, -19, 7, -5, 3, -18, -12, -28, -8, 4, -49, 15, -13, -22, 16, 20, -15, -22, -14, 49, 36, -6, -35, -20, -17, -1, 14, 31, 11, -8, 5, -36, -3, -2, 30, -7, -41, -31, 19, -43, -6, -17, 45, 0, -47, -12, 33, -27, 37, 4, -25, -26, -15, 20, 23, 7, -39, -50, -1, -26, 29, -46, 32, 17, -45, -25, 4, -12, -42, -6, -37, 4, -42, -36, -14, -1, 33, 21, 45, -30, 6, -32, 42, 7, 44, -45, -47, -8, 42, -9, -48, -50, 4, -36, -4, 34, -5, 7, 44, 20, 30, 32, -12, -48, -21, -16, 6, -22, -1, 11, 1, -37, -16, -23, 7, -21, 39, -44, -12, 44, 18, -16, 1, -37, 12, -15, 40, -27, -11, -22, 2, -29, 21, -36, 18, 13, -47, 24, -33, -9, -21, -36, 19, 4, 2, -35, 22, -17, -24, -38, 49, -24, 22, 18, 35, -20, -48, -21, -30, 48, -45, 41, -19, -9, 50, 11, 38, -19, 48, 35, 37, -12, 13, -21, 12, 45, -20, 36, -11, -18, 12, -26, -15, -27, 44, 7, -12, -5, 26, -41, 36, 31, -19, 46, -15, -23, -35, -35, -33, -43, 29, 24, 19, -50, 11, 25, -13, 41, -6, 7, 30, -50, -19, -43, -11, 5, 12, 37, 23, 23, -15, 38, 6, 23, 32, -6, 28, 29, -49, 42, 17, -1, -22, 44, 30, -41, -24, -36, 9, -20, -30, 9, 7, -10, -5, -6, -25, 0, -15, 1, 30, 0, -48, -37, -2, 26, 40, -50, 6, -34, -1, 47, -37, 8, 30, -48, 47, -11, 38, 15, -17, 39, 44, -42, 43, 33, -30, 42, -26, -7, -26, -42, 11, -25, 6, -14, -35, -14, 25, -27, -25, -31, -42, 36, -22, -20, -32, -31, 36, -24, 43, 34, -7, -16, 20, -29, 23, 36, -36, 43, 47, -38, -47, 31, 5, -28, 46, 47, -17, 49, 48, -34, -23, -37, -17, 24, 6, 26, 46, 4, 15, 47, 42, -14, 17, 25, -25, 10, 41, 16, 33, 23, 1, -33, 2, 12, 2, -24, -20, 40, -50, -45, -40, -17, 33, 12, 2, 34, 34, -33, -30, -32, -47, 26, 31, -22, -26, 5, 26, 12, -24, 9, 32, -2, 14, -13, 32, 1, -50, -11, 30, -30, 35, -36, -1, -3, -19, -2, 17, -6, -19, -47, 14, 46, 20, 22, 14, 29, -33, 3, -4, -45, 15, -42, 17, -28, -8, 0, 21, -26, 29, -16, -34, -33, -24, -36, 30, 18, 29, -36, -9, -17, -3, 32, -43, -41, -46, -3, -25, 35, -28, 11, -38, -42, -31, 41, 6, 50, -27, -18, -31, 9, -3, 13, -21, 22, -34, 49, -37, -32, 20, 8, 16, 46, -7, -19, -40, -49, 39, 17, -34, 30, 41, 43, -11, 36, -5, 37, 42, -47, -13, 12, -22, -32, 40, -22, 49, -16, 19, -28, -5, -7, -3, 1, -43, 4, 15, 26, -11, 34, -20, -3, 49, 10, 1, -13, 40, -15, 36, 4, 34, -38, -14, -4, 39, 20, -29, -12, 36, 7, -21, -33, -33, 23, -12, 43, -25, 20, -44, 18, 14, -5, -33, -38, -26, -43, 23, -19, -34, 28, 28, -3, 12, -11, 33, -36, 48, -45, 43, 12, -43, 44, -19, -6, 1, 28, 31, -38, -27, -11, -37, 41, 24, 19, 11, 38, 10, -50, 38, 15, -19, -38, -18, -19, 5, -27, 40, -47, 37, -28, -22, 47, -30, -21, 39, -31, -35, 16, -2, 50, 7, -7, -26, -28, 8, -50, 46, -36, 30, 47, 30, 1, 7, -10, -7, -47, 26, 17, -44, -5, -42, 36, -18, -18, 33, -47, 14, -17, 40, 34, 37, 28, 48, 13, -26, 4, -42, -34, -30, 9, -38, -48, 17, -47, 41, -44, -25, 24, -27, -41, 50, -38, -7, -12, -32, 0, -32, 25, 1, 35, -4, 50, -21, -5, 25, 42, -30, 24, 50, -3, 11, 7, -33, 8, 40, 50, -3, 12, -39, 36, -17, 10, 36, 2, -26, 11, -47, 43, 43, -38, -9, -2, 27, 5, -4, -43, 4, 37, -33, -16, 38, 30, -19, -27, -44, -38, 40, 18, 49, 39, -9, -20, 23, -25, 35, 25, -19, 40, 46, 1, -31, -11, 8, 26, -37, -7, 35, 31, -3, 42, -8, -35, -16, 2, -17, -48, 17, -46, -41, 1, -22, 45, -20, 15, 25, 40, 18, -14, -24, 36, -18, 17, 8, 13, 34, 37, -7, 44, 37, -2, 2, 23, -2, 15, 44, 12, -26, -47, 0, -40, -34, 15, 19, 22, 18, 33, -22, 34, 22, 41, 21, 44, -31, -24, -43, 34, 10, -23, 36, 19, -48, 18, 22, -44, 9, -47, -46, -40, -36, 13, 47, -38, -44, -45, 5, 13, -1, -21, -29, -26, -23, 33, -12, 16, -46, 14, -36, 39, 16, -11, 47, 18, 44, 26, -8, -50, -29, 11, 28, -25, -33, -3, -42, -50, -42, -28, -6, -49, -37, -13, -11, 12, 31, -35, 42, 24, -45, -48, -37, 15, 45, 44, 24, 35, 16, -20, -18, 37, -50, -7, -36, -14, -24, -3, -24, -39, 16, -21, 45, 36, 15, -44, -17, -19, -12, 45, -8, -8, 27, -48, -5, -19, -8, 49, 30, -48, 23, 12, -11, -33, 16, 11, -41, 1, 22, -5, 4, -5, 24, 9, 46, 49, -25, -24, -13, -29, -25, 35, 18, -16, 15, 48, 22, 0, -33, -8, -39, -48, 31, -44, 46, -45, 31, -6, 35, -12, 0, -42, 48, -28, -39, 37, 11, 22, 26, -11, 3, 30, -44, -34, -1, -27, -49, 48, 41, 32, -18, -30, 23, 2, -5, -6, -42, -45, 0, -16, 31, 2, -32, 18, -26, -40, 23, -34, -15, 39, 44, 45, -30, -33, 9, -33, -50, -37, -43, 15, 0, 28, 9, -17, -15, 11, -50, 34, -9, -50, 45, 33, 3, -4, 49, -12, -21, -44, -29, -1, -6, 23, 21, 40, -41, -37, -5, 24, -45, -30, 11, 46, -32, 37, 31, 48, 11, 50, 32, 2, -27, 5, 11, -17, -29, 17, 6, -41, 15, -43, 46, -13, 11, -23, -41, -6, 14, 47, 16, -42, -46, -41, -39, 31, 7, -30, -30, 14, -48, 18, 38, 13, -2, 21, -34, 22, -19, 19, -30, -44, -44, -24, -43, 22, -23, 28, 15, 20, -4, 31, 35, -41, -18, -44, -48, -37, -7, -5, 10, -15, -38, -35, 29, -46, 38, -13, -1, -13, 5, 12, -3, 39, 8, 26, -7, 39, 4, 4, -50, -43, -47, 34, 35, 2, 7, -14, -2, 16, -32, -50, -22, 36, -18, 1, -10, -28, -46, 20, 6, -45, -2, -29, 26, 25, -47, 21, 13, -14, -20, -14, -6, 39, -43, -11, 46, 42, -46, -23, 30, 36, -42, -49, 12, 45, 0, -20, -44, -21, 7, -48, 0, 5, 22, -41, 10, -1, -4, 39, -50, 43, 6, -13, 11, 28, 38, 19, 31, 14, 11, 5, 16, -34, -43, 9, -11, 30, 38, 11, -10, -39, 42, 38, 49, 3, 38, 42, -40, 9, 17, 27, -5, -13, 10, -34, 15, 21, -15, 23, -44, 49, -35, -37, 29, -26, -47, -22, 5, -45, -50, -12, -50, 12, 6, 16, 14, 14, -30, -21, 45, -18, -3, -29, 43, 3, -47, 36, 4, -7, 38, -39, 30, 28, 23, 48, 1, 42, 25, 14, 14, -41, -33, -4, 15, -2, 21, -29, 35, -25, 39, -42, -30, 44, 12, -45, -37, -18, 20, -27, 22, 24, 36, 0, -49, -36, -16, -15, 41, -12, -47, 13, 23, -45, 6, -21, 48, 23, 45, 16, 39, -36, -34, 40, -33, -32, 25, 37, 18, -27, 40, -3, -21, -36, -4, -7, 47, -24, 33, 13, -10, 45, 17, -46, 2, -43, -29, -44, -29, -5, -21, 50, -35, 28, -46, 16, -28, 10, 23, -46, -28, 28, 31, -26, -43, 44, -30, -49, -29, 21, 36, 45, 21, 17, 13, 43, -32, 36, 31, 2, 42, 36, 46, 1, -4, 31, 3, -7, 46, -44, 41, -50, 12, 47, -12, -32, -20, 26, -27, 18, 36, 32, 14, -18, 8, -18, -19, 8, 41, 50, -10, -39, 22, -40, 46, -32, 3, 6, -9, 47, 20, -20, 1, -49, 32, -13, -19, -41, -43, 39, 43, 24, -31, -31, -42, 21, -36, 47, 37, 46, 12, 40, -30, -46, -16, 34, 17, -3, 29, 44, 39, 11, -16, 19, 46, -30, 29, -12, -17, -36, -45, 15, 37, 5, -2, 41, -50, 14, -23, 49, -31, -3, 21, 14, 39, 0, -8, -2, -26, 23, 25, -10, 20, 13, 10, -39, 30, 18, -37, -17, -3, 10, 30, -16, 14, 8, -15, 28, -32, -9, 18, -32, -12, 18, 1, -39, 32, -4, 25, -15, 12, 25, 31, 0, -8, -17, 46, -2, -33, 10, 6, 42, -46, 38, -27, 42, 13, 8, -13, -18, -41, -14, 46, 36, -40, -27, 37, 20, -30, -31, -41, 38, -4, 49, -4, -36, -7, 11, -45, 50, 15, 25, -47, -28, -38, 30, -20, -35, -10, 39, 41, -50, -39, 50, 5, -1, -31, 15, -15, 28, -13, -29, 10, -1, 45, 8, -31, -15, 46, -36, 11, -48, 42, 40, -46, 5, -20, 35, -16, 20, 19, -25, -50, 32, -44, -15, 25, 33, 36, -26, 43, 8, 10, -22, 44, -33, -10, -32, -47, 14, -10, -36, 3, 13, 21, -36, 28, -1, -29, -33, 29, -49, -15, -31, -35, 16, -21, 4, 15, 48, -25, 6, 18, -49, 5, 33, 11, -17, 47, 5, 4, -31, -1, -26, 33, -26, 2, -37, 9, -8, 11, 25, 18, 12, -49, 3, -35, 4, 43, -8, 10, -13, -6, 0, -9, -27, -21, -14, 2, 12, -40, 27, -28, 29, -1, 34, 4, 4, -47, 46, 3, 10, 27, 32, -46, 49, 44, -33, -7, -20, 43, -30, -4, -21, 4, 17, 18, -10, -6, 23, 40, 29, -21, 26, 49, 34, -6, -6, 28, 33, 33, -6, 4, 8, -46, -19, -45, 43, -25, -14, -38, 42, 18, -26, -38, 37, 44, -31, 21, 9, 22, -30, 10, 33, 28, -25, 3, -9, -40, -14, -40, -24, 43, 32, -17, -13, 10, 36, 2, 14, -48, 16, -23, -37, 1, -21, 7, 3, 18, -36, -13, 27, -37, 6, 8, -43, 21, -32, -19, 44, -22, -10, 24, -6, -38, -24, -32, -25, 2, 0, -14, -42, 41, 45, 1, 3, -48, 45, 18, -43, -37, -48, -27, -38, -8, -22, 21, 0, -9, -20, 12, -25, -33, 31, 6, -44, -3, 29, 9, -18, -48, -47, 49, -47, -9, -42, 0, -34, -34, 46, -31, -37, -29, 1, -24, -8, -48, 37, 43, -43, 35, 38, -41, -22, -11, 14, -30, -27, 22, 9, -25, -42, -31, 5, 48, -15, -15, 22, -29, -50, 18, 22, -14, 32, 21, 45, -38, 33, 49, -8, -14, 43, 23, 44, -26, 42, 37, -30, -10, 22, -9, -9, -49, 17, -43, 45, 10, -37, 26, -30, -27, -1, 31, -6, 13, 13, -25, -19, 6, 2, -18, 1, 44, -33, -16, -39, 0, 38, 44, -41, 1, -17, 16, -12, -43, 45, -22, -29, 33, 19, 10, -8, -2, -22, 30, -20, 2, -17, -13, 6, 50, -47, -49, -39, -16, 19, 21, -30, 10, -16, -3, -36, 20, -36, -45, 30, 17, -29, -19, -29, -24, -36, -7, 35, 41, -42, -17, 49, 22, -36, 11, -6, 33, 21, 7, 41, -32, -35, 24, -43, -18, 23, -33, -16, -8, -1, -48, 40, 8, -23, -5, 13, 19, -4, -37, -44, 23, 28, -20, 42, 30, 0, -22, -36, 39, 25, -26, 10, -10, 18, -47, 6, -20, -48, 16, 39, -1, -34, 9, 23, 15, 37, 24, -27, 48, 36, -19, 36, 47, -32, 15, 9, 15, -36, 34, -16, 18, -24, 37, -44, -45, -18, 7, -2, -34, -9, 43, 21, -11, -5, 20, 19, 17, -50, 28, 44, 38, 46, 1, -16, 18, -46, 49, -34, 2, 1, -37, -22, -43, 47, -50, -22, -15, 0, -14, 42, 18, 2, 45, 1, 37, 32, -39, 1, -50, -44, -34, 47, -8, 20, -34, 8, -48, -22, -29, -13, 3, 42, -1, 18, -21, -28, 34, 39, -4, -30, -31, -28, 17, -30, -30, -50, -36, -34, 0, 12, -37, 8, 32, -1, -17, -45, -2, -45, 18, -44, 46, 26, 0, -50, -38, -8, -24, 20, -48, 7, 38, 46, -34, -6, 27, 50, 7, 5, 3, 36, 37, -22, 3, -24, -6, 36, -20, -15, 30, 10, -14, 16, -15, -46, -5, 28, 1, -2, -45, -41, 45, -28, -34, 33, -7, -10, -36, -7, 7, 35, -1, 1, 19, 17, 12, 7, -28, -7, 32, 44, -7, 1, 16, -23, 16, 27, -33, -24, 0, 9, 23, -2, -36, 32, 22, 17, -36, 0, -3, 21, -50, -44, 2, -20, -33, -39, -3, -21, 46, -44, 41, -48, 12, -45, 44, -36, 20, -8, 43, 40, 30, -33, -29, 10, 10, 2, -25, 40, -11, 37, -43, -30, 42, -8, -30, -48, -20, -24, -24, 22, 6, 46, -18, 39, 41, -7, -8, -20, 14, 33, 25, -34, -36, -17, 29, -47, 21, 47, 38, 28, -23, 22, -49, -34, 7, 23, -42, -20, 15, 37, 11, -32, 30, 23, 4, -23, 41, -1, 14, -48, 28, 1, -41, -30, -14, -36, 36, 27, 28, 23, -42, -7, -12, -46, -26, 5, 39, 13, 21, 35, 1, 38, 25, -42, -41, -41, 22, 11, 39, 48, 40, 9, 44, -32, -13, -45, -36, 42, -4, -6, -46, 27, 2, 15, 11, -28, -7, 1, -5, -32, 37, 33, -4, 40, 1, -27, -34, 38, -5, 13, 44, -23, -1, 13, -23, 35, 5, 8, -46, 3, -7, -9, 21, 41, 6, -4, 25, -26, -7, -36, 0, 2, -17, 26, -43, 26, 49, 19, 45, -30, -44, 39, 28, 5, -2, -9, -28, 1, 28, 2, -35, 45, -14, -33, -31, -5, -49, 36, 43, 12, -48, -5, -2, -50, -29, 42, -37, 41, 34, -6, 45, -45, 14, -30, -47, -48, -21, -20, -17, 32, -31, 36, 3, -26, -36, -13, -28, 1, 15, 6, 6, 28, 1, -16, 23, -37, 40, -37, 48, -18, 1, -50, -17, -32, -27, -47, -15, 26, 7, -19, -42, 29, 16, -31, 23, 11, 7, -29, 16, 24, 38, -3, -43, 22, -36, -19, 2, 16, -47, -21, -38, -30, -10, -32, -3, 35, 12, -31, 13, -14, -20, 23, -33, -31, 31, -40, 35, -7, 31, 13, -17, 36, 14, 4, 23, -50, -13, -42, 44, 20, -34, 48, 50, 1, -33, 12, -18, -47, 36, 24, 1, -42, 13, -21, -43, -46, 25, 12, -50, -36, 38, 31, -13, -9, -5, 2, -25, 10, 16, 3, -29, -25, 32, 9, -12, -15, -30, -10, -3, -25, 12, 26, -15, -27, 39, -30, -33, -36, 28, -45, -8, -20, -23, -43, -22, -30, 30, 37, 7, 9, -1, 49, -20, -4, -17, -49, 16, 43, 21, 1, -44, 25, -32, 39, 41, -36, 27, -3, -37, -48, -1, 42, 3, -45, -2, -28, 41, 27, 27, -31, 26, 40, 9, 48, -6, 10, 5, -49, -6, -11, -27, -22, 16, 17, 15, 33, 3, 2, 28, -2, -19, 10, -9, -50, 12, -16, 0, 20, -6, 26, 14, -37, 42, -48, -27, 14, -3, -41, -38, 49, 22, -37, 49, -41, -11, -28, 48, 4, 12, 20, -9, 48, 15, 28, 22, -4, 30, 1, -33, 28, -33, -27, -28, -39, -28, -30, 13, 39, 21, 43, -17, -49, 18, -20, 46, 17, 19, 36, -32, 21, -38, 14, -45, 20, -24, 28, 1, 47, 36, -3, 37, 28, 48, 17, -7, 50, -34, 44, -13, -41, 3, 40, -45, -45, 1, -36, 17, 6, 5, -44, 0, 7, 13, -25, 7, -20, 15, 41, -38, -33, 43, 24, -38, -27, 6, -22, 5, 3, -46, -16, -32, 4, 26, 18, -7, 27, -13, 11, -29, 22, -11, -25, -46, 42, 3, 35, -2, -48, 41, -13, -37, -4, -37, 24, 22, -13, 13, -7, 19, 14, -26, -35, -36, 47, 30, -48, 16, -14, 30, 4, -13, 12, -50, 20, 39, -32, 1, -21, 4, -37, -38, 33, 39, -24, 38, -42, -10, -3, -39, -41, -45, -17, 1, -10, 32, -45, -49, -36, -34, -35, -23, 34, 21, -41, -41, -41, 22, -23, -27, -32, 46, 17, 5, 16, -9, -39, -33, -28, 33, -45, 2, 47, -9, 15, -21, -42, 40, -9, -17, -11, 37, -34, -22, 49, -1, 25, 44, -2, 22, 10, 32, -5, -5, -34, 15, -46, 3, -35, 30, 40, -44, -43, 21, 36, 45, 31, -13, 3, 25, -36, 41, -1, 5, 44, -42, -43, -32, 0, 21, 47, 6, 17, -20, -48, 48, 32, -8, -22, -41, -39, -5, -21, 43, 31, 37, -19, 22, -4, 37, 12, -25, -48, -28, 24, 23, -1, -15, -38, -22, -13, 26, 39, 33, -46, -31, 27, -37, -43, -3, -38, -27, 28, 14, 35, -17, 0, -48, 39, 27, 7, 21, 4, 29, -9, -30, -41, 6, -26, 5, -13, 35, 10, -4, 3, -5, 17, -47, 43, 15, 42, -8, 11, 49, 34, 34, 34, -47, 14, 11, 39, -49, -42, 6, -6, -33, -3, -9, -10, 24, 38, 39, 7, 49, -9, -16, -13, 16, -10, 48, -1, 35, 21, 28, -6, 20, -32, -34, 14, 42, 26, 5, 42, -10, -9, -45, 18, 47, 24, 22, -11, -10, -42, -43, -7, 7, 16, -38, -32, 47, 45, -2, 29, 49, 31, 27, -21, 15, 26, 40, 8, 2, 1, 30, -20, -36, -31, -46, -44, -33, 5, 24, 45, 40, 39, 50, -6, -23, -1, -49, 33, 17, 26, -27, -3, -6, 42, 7, -15, -49, -33, -2, -43, 7, -36, -34, -28, 15, 19, 42, -24, -14, -2, 13, -17, -33, 13, 23, -7, -34, 8, -38, 1, 9, -9, 40, 13, 15, -17, 44, 36, 20, 13, -18, -39, 25, -32, -42, 23, -34, -1, -12, -10, -41, -39, 28, 44, -36, -23, -47, -15, 14, 47, -4, 30, -12, -13, -7, 0, 46, 34, -25, -15, 18, 46, -50, 2, -45, -14, -49, 18, 39, -10, 0, -4, -38, 25, 18, 15, 8, 17, 8, 40, -41, -38, -49, 39, -36, -5, 6, -41, -29, 38, 28, 26, -43, -30, 34, -29, 46, -6, 40, -11, -29, -21, 11, 22, -6, -16, 31, -9, -46, -24, 19, 11, -19, -43, 34, -33, 27, -36, -25, 2, -7, -19, -23, -12, -19, 26, 28, -33, 19, -40, -19, -31, 46, -11, -43, -16, 18, 48, 27, -30, -27, -34, -33, 47, -39, -35, -47, 38, -17, 41, -5, 24, 26, -20, -26, 23, -27, 14, -26, -23, -15, 31, -45, 15, 16, 21, 44, -3, 32, 19, 27, 16, -3, 14, -7, 43, 12, -5, -32, 13, 32, 22, 20, 50, -1, 12, -10, -44, -42, -47, 38, -2, 25, -45, 31, -30, -36, 16, 15, 5, 17, -19, 15, -22, 15, -17, -24, 9, -12, -7, 31, -15, -32, 40, -6, 33, -30, -28, 43, 38, 44, -24, 47, 21, -32, -10, -25, -23, 13, 17, 44, 29, 0, 23, -3, -41, 22, -12, 49, 49, -32, 13, -32, 25, 11, -38, -26, 49, 38, 41, -9, -12, -21, -46, 30, -33, -30, 35, -1, -45, -1, 29, 15, -50, 6, -21, 7, 1, -14, -3, 36, -50, -32, -5, 16, -49, 5, 50, -34, 41, 31, 46, 28, -29, -24, 4, 50, -19, 9, 32, -23, -23, 23, 33, -26, 34, 27, 35, -25, 24, 20, -34, 31, -44, 5, 13, -31, -13, 24, 7, -35, 0, -24, 0, 24, -35, 36, 9, 25, -11, 16, -49, -3, 1, -27, 42, 47, 33, 31, 27, 31, -49, 14, -31, -17, -10, -10, 24, 40, -28, -13, -7, 16, 11, -39, -21, 44, 36, 14, -10, -31, -45, 24, 48, -47, 42, -41, 0, 42, -13, -50, -43, 30, 32, 12, -18, -36, -20, -30, -48, 15, -16, -10, 8, -35, 5, -6, 8, -1, 34, -39, 41, -39, -18, 33, -2, -30, 9, 1, 3, -12, -2, 13, 49, 35, -25, 20, -44, 21, 11, 39, 37, -27, -11, 25, -4, -43, 3, -42, -48, 3, -30, 44, -3, -4, 37, 17, 33, 12, -35, 23, 39, 42, -46, -40, -22, 28, 19, -3, -36, 33, -17, 9, 11, -49, 29, -32, 47, -2, 27, 37, -23, -3, 45, -14, 23, -2, -3, 22, 37, 49, -22, 9, -22, 7, -3, -28, -24, 44, -44, -2, 3, 17, 27, -9, 23, 8, -7, 47, -25, -28, 22, 50, -43, 2, -37, 20, -44, -42, -48, 27, -34, -7, 35, -5, 39, 7, -23, -37, -42, -25, -49, 24, 30, -17, -32, -12, 31, -38, -46, -1, -28, 37, -22, 21, -25, 28, 6, -50, -23, 11, -4, 27, 47, 8, -20, 19, -2, -46, -20, -14, 28, -36, 1, 18, 41, 46, -40, -8, 19, -28, -11, 12, -49, 28, 36, 35, 22, -4, -21, -35, 8, -4, -21, -42, 14, 8, 13, -43, 1, -33, 40, 31, 45, 7, -2, -19, -3, -6, 3, 49, 49, 34, -5, 45, -20, -14, -35, -5, -5, 27, 37, 38, 10, -5, 0, 11, -16, 30, -9, -6, 17, 24, -4, 28, -21, -27, 15, -8, -17, -28, 10, 44, -14, -38, 46, 20, 45, -44, -9, -13, 1, -7, 13, -38, 37, -23, 45, 31, 47, 47, -50, -8, -9, 44, -1, 9, -50, 0, -35, -12, -36, -18, 36, 2, 47, -34, 38, -45, -20, 18, -11, -21, 18, 25, -44, -38, -47, -1, -48, -39, 14, -24, -1, 26, -34, 21, -19, 33, 0, -34, -17, -16, 48, -27, 3, -33, -1, -5, -3, -18, 36, 38, 50, -24, -50, 34, 8, -41, 44, -26, 33, 6, 15, -36, -23, -38, -37, 15, -17, 48, 50, -26, 3, 28, -39, -42, -20, 27, 42, 2, -8, -13, -9, 21, -3, 16, 15, -35, 32, 43, -35, -20, 7, -23, -47, -41, 0, -33, -4, -19, -21, -15, -42, -15, -22, -35, 41, -30, 13, 15, 8, 48, -23, 4, 49, -20, -18, 36, 9, -10, 30, -5, -2, 14, -9, -28, -24, 38, -19, 32, 37, -48, 9, 25, 48, 28, -34, -19, -44, 32, 20, 18, 7, -11, 34, -3, 0, 6, 20, -14, 36, 24, 23, 34, 4, -10, 46, -31, -18, -11, 48, -17, 11, 49, 40, -32, -8, 18, 12, 42, -41, -38, 42, -46, 7, 8, 25, 8, 26, 35, -36, 26, -50, -13, 2, 1, -50, -40, 7, -11, 35, 48, 9, -7, -45, -23, -20, -43, -46, 3, -34, -13, -42, 23, 33, 27, -37, -25, 42, 11, 40, -26, 29, -15, 47, 29, -18, -48, 36, -40, 7, 13, -33, -4, -7, 42, 8, -1, 18, 37, -22, 42, 39, 16, -49, -26, -32, -11, -49, 32, 14, 11, 40, 3, -6, -2, 48, 18, -13, -47, -34, 2, 34, 2, -20, -29, -40, -17, -36, -41, 45, 2, -3, -20, -14, -23, -20, 19, -37, 36, -35, -26, -12, 15, -13, -10, 47, -11, 13, 38, 49, -35, 31, 26, 8, 50, 40, 47, -40, -50, -38, -21, 18, -33, 27, -38, -19, 20, 21, -1, 20, 29, -20, 0, -24, 9, -18, 2, 42, 21, -18, -10, -32, 34, -10, 34, 38, -9, -28, 24, -18, -31, -26, 39, 1, -39, -19, -18, 23, 17, -36, 0, -45, 40, 18, 18, 31, 41, -16, 35, -17, 12, 17, -33, -25, 35, 46, 10, 27, 44, 23, 37, 34, -3, 21, 45, -20, -17, 36, 38, -44, 32, -44, -4, -43, 27, -50, 26, -48, 2, 41, -13, 0, -36, 49, 16, 13, 17, -46, 39, 38, -41, -43, -39, 13, 8, 16, 40, -1, -28, -11, 46, 27, 36, 44, 26, 25, 48, -33, -30, -50, -13, -10, -9, -42, -28, 27, -40, 20, -20, 37, -25, -21, -17, -5, 18, -46, 10, 32, -13, -23, -25, 10, -28, -5, -21, 16, 41, -18, -48, 18, 32, -9, 11, 7, 6, -50, 22, 9, 18, 8, -5, -17, 50, 46, -26, -9, -22, -26, 3, 22, 16, -36, -47, -13, -31, -28, -14, 11, -43, -14, -6, 46, -18, -44, -29, -46, -36, -30, 38, -34, 5, -1, -44, -1, 9, 32, -44, -11, -6, 8, 37, 24, 4, 13, 14, 3, 45, -11, 2, -7, 12, -49, 28, -30, 37, -1, 30, 1, -42, 48, -31, 32, -33, 33, -21, 14, -27, 37, -4, 32, 43, 39, -7, -22, 26, 17, -34, 46, -46, 41, 37, 30, -1, -11, -5, 0, -40, -39, -38, 13, -43, 14, -42, 41, -49, 27, -38, -49, 17, 25, -3, 23, -48, 17, -45, 36, -46, -48, -41, -8, -32, -37, -30, -8, -23, -30, -15, -27, 3, -13, -34, -29, 32, -6, 23, 10, -40, 10, -13, 15, -18, -8, -20, -16, -14, -4, 49, -28, -15, -11, 39, 38, 30, -36, -14, -47, -29, 30, -29, 30, 27, 27, -34, 21, 47, 39, 43, 35, 29, 43, 29, -13, -27, 49, 48, -45, 17, 31, -45, -25, 50, 40, -10, 24, -13, 29, 32, -8, 2, -36, 39, 5, 5, -20, 32, 6, 0, -27, 7, 22, 36, -47, -41, 12, 22, 32, -36, 47, 12, -32, 12, 5, -30, -17, -34, -33, 30, 15, 0, 14, -8, 6, -41, -14, -3, 18, 5, 25, -15, -20, 4, -13, 22, 39, -36, -35, 26, 38, 43, 2, 5, -44, 6, 4, 1, -47, -8, -11, -21, -41, 43, -44, -15, -16, 37, -12, -15, -31, -2, 45, 8, -2, 39, -25, -15, -8, 48, -8, 48, 25, -18, 49, 27, 46, -6, -6, 37, -36, 44, -34, -39, -29, -28, 39, 27, -39, 17, 0, -38, 6, 4, 31, -23, -7, -32, -5, -48, 32, -31, -26, 24, 5, 30, 10, 4, -16, 27, 8, -12, 6, 32, 16, -17, -10, -29, -24, -30, -10, -20, -24, -14, 15, 3, -42, 32, -9, -15, -41, 8, -11, 3, -12, -44, -47, -36, 25, -3, -45, 22, -16, 21, 20, 17, 7, 26, -32, 11, 20, -41, -26, -7, 48, 7, -26, 42, 25, -11, 25, 19, -41, 15, -26, 20, 36, -40, -15, -2, -3, 36, -44, 40, 26, 0, -34, -19, -25, -29, -38, -39, 20, -50, -18, -37, 13, -8, 7, -10, 30, 17, -12, -50, -10, -6, 37, 47, 47, 37, 28, 30, -38, 20, -42, 12, 48, -28, 3, -4, -12, 36, -25, -50, -37, 45, 23, 14, 18, 16, -2, -1, 7, 2, 40, 6, 35, -33, -35, -49, -38, -6, 29, 21, -8, 21, 3, 23, 46, -20, 25, -42, 50, 22, -3, -33, 43, 45, 36, -40, 11, 33, -32, 49, 39, 23, -27, -38, -5, 2, 47, -22, -15, 20, 43, -34, -3, 26, -27, 3, 44, 40, 34, -50, 28, 16, -45, 27, 4, -13, -18, -43, 39, 28, 27, -31, 4, -3, 32, 5, 46, 49, 37, -41, 1, -1, -17, -15, 10, 49, -35, 28, -33, 20, -4, 35, -19, -8, 32, -11, 14, -16, 18, -1, -39, 25, 34, 7, 32, 12, 22, -2, -15, 3, -4, -19, 48, 44, 2, -19, 11, -14, 45, 50, -13, -21, 7, -19, 15, 0, -40, 8, -31, -14, 22, -2, -32, 4, -11, -44, -46, -9, 37, -3, -44, -40, 22, -2, -21, -10, -48, 35, -11, 0, 33, -19, -3, 20, 20, -31, 38, -16, -27, -11, 26, 1, -12, 17, 10, 25, 30, 14, 11, 30, -49, -45, 24, -8, 31, -11, 38, -12, -23, 29, 12, 13, -39, -10, -22, -28, 34, 29, 0, -6, 39, 50, -29, -41, -44, 22, 38, -36, 26, -5, 39, 34, 36, 10, 41, 10, 0, -13, -39, 37, 26, 15, 3, -12, 25, -12, 27, -21, -3, 32, -20, -26, 17, 0, -38, 49, 12, -9, 3, 50, 16, 29, 39, 5, -32, -5, -36, -19, -2, -30, 14, 19, -24, -28, -4, 44, -39, 34, 15, -46, -42, -31, 31, 12, 35, 21, 47, 22, 20, -21, 31, 40, -35, 34, -46, -22, -4, 50, -29, 27, 6, 32, -16, 37, 9, 19, 9, 7, -48, -17, -6, -1, -49, -36, -14, -36, 9, 45, 34, 13, 30, 47, 45, 1, -28, 48, -14, -10, 50, 6, 46, -26, -14, -11, 34, -5, 9, 47, -32, 40, -42, 18, -46, 38, -25, -32, -21, 49, -3, -35, 20, -33, 5, -30, -20, -50, -48, 44, -26, -43, 14, 11, -44, -44, -43, -32, -34, -40, -2, -40, -10, 11, 1, 15, 17, 41, 46, 24, 16, -11, -46, 34, -29, -14, -40, -7, 35, 2, 26, 10, 16, -38, 41, -40, -40, 34, 34, -44, -34, -3, -37, 12, 13, 46, 24, 26, 14, -17, -42, 26, -14, -21, -10, -6, 50, -4, -44, -37, -3, -45, -17, 29, 50, 49, -5, 8, 19, -43, -27, 16, -47, 45, -50, -17, -42, 12, 25, -41, -41, -1, -7, -3, 36, -45, 37, -27, 34, 44, 7, 13, 43, 5, 47, 31, -39, -16, 20, 38, -45, 14, 29, 9, 17, -22, -13, 41, -29, -43, 12, 45, 46, -38, -24, -33, -33, 26, 35, 11, -37, -40, 35, 49, -34, 0, 45, -37, 6, 42, -45, 6, -47, -40, 23, 41, -40, 48, 28, -43, 33, 8, -30, 14, 42, -27, -21, 48, 46, 33, 6, 29, 22, 44, -34, 8, -20, 13, -3, -28, 19, -21, 4, -44, 24, 47, -39, 9, 1, -24, -39, -38, 21, 29, 11, -22, -16, 9, -22, -20, 26, 25, 10, -49, -18, 21, 11, 8, -11, -2, -19, -13, 41, 28, 36, 37, -38, 34, 3, 25, -38, -12, -28, 41, -37, -34, -27, 7, 12, -17, 0, 35, -41, 21, -30, -14, -44, 39, -38, 29, -21, -20, -46, -19, -35, 22, -29, 13, -7, -11, -14, 27, -35, -8, 33, 12, -36, -7, 39, -42, 14, 48, -7, -31, 19, 23, -18, 29, 49, -45, 32, -20, 15, -33, -23, 17, 14, 29, -6, 7, -4, 15, 1, -15, -50, -12, 36, 39, 24, -50, 24, 37, 23, -37, 27, 20, -28, -8, -29, 9, 49, -24, 5, -49, -12, 0, -32, 11, 20, 25, 16, 12, -46, 21, 27, 10, 49, 20, -44, -1, -5, 45, 21, 25, 23, -37, 22, 43, 18, 14, 14, 6, 11, -31, 24, -25, -7, 16, 19, 11, -6, -40, 21, 42, 23, -17, 37, -5, 30, -19, 24, 47, 37, -46, 12, -22, -3, 47, -35, -26, 50, 21, -22, 1, -5, -26, -28, -17, 16, 43, -17, -19, -22, -42, 15, 6, -12, -44, 18, -43, 45, -33, 31, -2, -35, -30, -41, -47, -7, -43, 4, -32, 13, -11, 0, -42, -21, 5, 30, -7, 8, -36, 17, 19, 10, 29, 39, 50, -28, 26, -4, -34, 6, 3, 40, 1, -29, 50, 32, -12, 48, -38, 27, 44, 15, 1, 50, -37, 22, 23, 12, 20, -23, 38, -5, -23, -49, -34, 8, 1, -47, 26, 31, -48, -14, 46, -27, 21, -16, -49, -18, 25, 35, 26, -41, 30, 11, -8, 18, 8, -42, 26, 9, 12, 1, -28, -21, -8, 17, -30, -8, 22, -44, -35, -28, 7, 36, -20, 18, -45, 14, 8, -23, -33, 37, 26, 46, -41, -44, -14, 45, -6, 35, -35, 37, -37, -40, 32, 36, -17, 9, -38, -12, -7, -23, -11, -35, -1, -23, 17, 41, 9, -39, -35, 2, 3, -2, -15, 11, 33, -25, 5, 39, -29, 22, 18, 30, -2, 47, -49, 2, -44, 49, 26, -31, 43, -21, 24, 44, 16, 8, 15, -48, 5, 28, -34, 1, -44, -46, 47, 46, 3, 10, -35, 50, 16, 8, -4, -3, 13, -1, 34, -10, 21, -29, 3, -46, -34, 50, 27, -10, 41, 44, 30, -16, -11, -29, -3, 2, 42, -41, -33, 48, 29, -2, 20, -21, -32, 4, 9, 36, 21, 30, -30, -25, -23, -12, -18, -11, 32, -22, -31, -31, 23, -39, 46, -26, -26, -47, -47, -42, -36, -25, 28, 39, 41, 20, -19, 25, 48, 1, -19, -42, 27, -38, 5, -7, 46, 45, 32, -21, -35, -39, 23, 15, -33, -38, 42, -27, -39, 9, 9, 42, 35, 49, -50, -8, 4, -11, 13, -17, -17, -3, -18, 17, -21, 33, 39, 28, 20, 20, -22, -28, -17, 33, -36, 46, 2, -34, 13, 33, 10, 6, 26, 37, -14, -44, -43, 36, 27, 17, -30, 10, 23, 35, 43, 43, 29, 24, 35, -22, -26, 7, -37, 27, 15, 3, 26, 16, -21, -33, 3, 49, -30, 2, 32, -35, -23, -47, 4, -36, 13, 14, -35, -31, 13, -18, 30, 18, 18, 7, -12, 26, -15, 43, 17, 36, -30, 12, 34, -45, -27, 2, 44, 32, 25, 27, -1, -39, 5, -36, 32, 41, -11, -10, 18, 18, -45, 36, 16, 50, -18, -8, -30, 33, 14, -34, 42, -43, 13, 39, -23, 47, 39, -38, 50, -38, -13, -26, 11, -28, 35, -30, 3, 12, -21, 24, 17, 46, 25, 22, -19, 24, 50, -27, -44, 21, 46, 38, -50, -48, -23, -8, 46, -5, -50, -13, 40, -16, 23, 25, 23, 3, 47, -27, -23, -29, -35, -38, 49, 49, 11, -8, 36, 27, -19, 16, 40, 32, 35, 6, 14, 18, -2, -18, -32, -15, 19, -36, 49, 46, -27, -24, -2, 24, -28, -18, -10, 5, -22, -20, 14, 47, -33, 31, -45, 1, -11, 14, -9, 43, 17, -19, -41, 18, -42, 18, 10, -40, 48, 40, 17, 23, 46, -43, -2, -27, -18, -32, -49, 4, -40, 48, -34, -9, 10, -48, 35, -16, 34, 38, 15, -50, -44, -31, -8, -45, 4, 49, -30, 0, -5, -16, 49, -43, 17, -35, 16, 20, 13, -49, -50, 7, -50, -44, 37, 18, 34, 41, -33, 37, -19, -6, -18, 23, 22, -2, -18, 46, 20, 17, -23, 36, 2, 45, -7, 29, 4, -41, -37, -15, -17, 37, -33, -35, -14, -10, -26, -43, 37, 33, 43, 33, -33, 17, -3, 49, 19, 16, -33, -33, 5, -28, -16, -45, -25, 34, 10, 37, -36, 40, -19, -39, -46, 13, 20, 35, -24, 28, -6, -16, -25, -28, -38, 39, -48, -22, 15, 13, -23, 36, -15, -45, -40, -13, -17, 30, 16, -5, 47, 35, -22, 9, 3, 42, 18, 23, 23, -42, 34, 26, -41, 24, 17, 7, 44, 1, -17, -16, -18, 21, -19, 4, 46, -43, -5, -37, 47, -43, 20, 26, 3, -30, 45, 24, -37, 24, -49, 47, 10, -34, 27, 38, -3, 40, -43, 5, -34, 18, -39, -13, -33, -25, 44, -14, 19, -10, 28, -9, 39, 25, -10, -4, -37, -50, -34, 46, 4, 42, 2, -20, 11, -43, -21, 26, 29, 15, -6, -33, 48, -6, -32, 26, 17, 32, -1, -26, -13, 44, -15, 17, 5, -12, 12, -44, 7, 29, 8, -3, -46, 36, -15, 45, 37, -26, -6, 41, -32, -44, 7, 30, 15, 29, -12, -33, -50, 12, -48, -30, -21, -40, -29, 6, 38, -48, -21, 37, -6, -15, 36, 21, 13, 3, 17, -1, -20, -22, 8, -15, 26, 22, 34, 16, 38, 38, 25, 42, -40, -40, -25, 2, -37, 13, 29, -41, -20, 44, -15, -41, -25, -31, -7, 11, 22, 28, -42, 20, 39, -27, -39, 9, 33, 27, 35, -35, -22, -19, 32, -16, -8, 45, 2, -31, 33, -43, 48, -9, 26, 19, -35, 18, 2, -6, 0, 47, -45, -18, 28, -36, -37, -12, 12, -46, 39, 30, 1, -35, 48, -13, 2, 36, 26, 46, 42, 2, -5, 47, 47, 40, -36, 8, -1, -42, -25, -48, 49, -4, -46, 11, 33, 33, -46, -41, 29, 12, -26, -7, -26, -21, -37, 35, -8, -23, 43, -32, -9, -31, 48, 35, 28, -40, 3, 47, -27, 19, -34, -23, -1, 44, 49, 4, 22, -41, -30, 7, -17, 44, 42, -8, -40, -18, 7, -5, 10, 11, -50, -30, 11, 13, 36, 22, 5, -50, -30, -29, 3, -47, 14, 0, 23, 12, -36, -15, -22, 1, -5, 18, -22, -4, 40, -26, 29, -35, 49, 38, -10, 14, 18, -31, 18, -15, 42, 47, 7, -3, 31, -49, 29, -22, 46, -35, -16, 11, 30, -47, 17, 0, 38, -18, 27, -27, 24, -26, -23, -44, -15, -41, -15, 44, 32, -33, -45, 41, -44, -39, -10, 12, 47, -26, 30, 2, -18, 36, 22, -45, 11, 15, -42, 16, -35, 38, 37, 42, 4, -11, -25, -13, -16, 36, 17, 8, -37, -4, 20, 21, -9, 0, -32, 15, -4, 14, -9, -13, -38, -7, -27, 45, -21, 19, -13, 46, -28, 23, 6, 28, -28, -15, 6, -50, 21, -48, -37, 30, -17, 19, 18, 0, -22, 48, 31, -3, 43, 28, 28, -35, 6, 46, -41, -32, 50, 16, -15, -47, 24, -18, -23, 45, 29, -42, 24, -45, -2, 40, 25, -29, -3, 50, -30, -18, 30, 5, -22, 2, -11, 23, -33, -4, -38, -24, 11, 23, 45, -6, -48, -29, -24, 4, 16, -18, -49, 24, -5, 23, -18, 7, -44, -36, -25, -40, -13, -24, -44, -50, 23, -30, 28, -21, 43, -43, 37, 32, -48, 4, -36, -15, -45, -9, -1, -33, 32, -1, -21, 26, -12, -39, 47, 8, 25, -7, 37, -47, -15, -3, -37, 30, -2, 16, 36, 26, -42, -30, 21, 30, -35, -35, -23, 0, 5, 29, 6, 1, -5, 27, -13, 33, -3, -10, 47, 8, 42, 16, 23, 33, 15, -24, -19, 5, -41, -11, -34, 7, 46, -45, -12, -33, 22, 21, 38, 44, -9, -47, -31, -23, -11, 14, -7, -28, 6, -4, -38, -35, 39, 4, 44, 14, 30, -35, -14, 1, -41, -13, -7, 44, 23, 3, 47, 0, 1, 19, 41, 41, 8, -38, -10, -39, -1, 6, -1, 6, 3, 15, -43, 12, -42, 9, 12, 21, -48, 22, -38, -42, 44, 38, 1, 11, -43, 44, -6, 2, 12, 44, 30, 6, 3, -32, 16, -5, 43, -41, 42, -33, -39, -2, -28, 11, -40, 22, 5, 37, 38, 4, -26, -42, -39, -40, -13, -23, -43, 23, 38, -4, -15, -1, -42, 9, 21, 16, 2, 31, 48, -34, 49, 2, -23, 12, -36, -32, 35, 19, -4, 20, -3, 22, -31, -14, 24, -49, 13, 35, -15, -46, 13, -44, 19, -29, 23, -5, -11, 10, -5, 33, -23, 36, -16, -50, -22, -42, -42, -29, 12, 15, 29, 7, 19, 4, -38, 46, -32, 28, -18, 23, 14, 9, -39, -8, 42, -34, 17, -22, 4, -44, -7, 26, -46, 9, -45, 47, -44, -5, 6, 3, 41, -5, -41, -47, 16, -26, 36, 40, 27, 10, -13, -19, -28, -14, -48, 48, -38, -17, 37, 14, 25, -43, 32, -42, -23, 27, 40, -33, -9, -10, 19, -18, 50, 38, 26, 3, 36, -15, 46, 34, 47, 5, 49, -34, -41, 36, -7, -49, 48, -37, -10, -49, -32, 29, 38, -50, -49, -24, -49, 43, 0, -41, -32, 29, -38, -3, 5, 21, 5, -1, 44, -6, 38, 8, -12, -30, 4, 6, -10, 42, 19, 31, -2, -7, -16, 40, -46, 20, 23, 23, 0, 6, 7, 41, -15, -41, -1, 48, 48, -14, -31, -38, 24, -32, 41, 5, -6, 9, 17, 6, 3, -14, 32, -14, -37, 44, 41, 49, -7, 32, -9, -50, -28, 13, -23, -47, -10, 9, -33, 12, 10, -2, -4, -12, 38, 31, -45, 32, 2, 25, -26, 48, 14, -46, 14, -43, -12, -8, 31, 22, -46, -47, 42, -50, 43, 5, -6, 14, -48, -29, 21, 5, -33, -26, -3, 33, -20, -21, 29, 15, 30, -41, 20, 8, 0, -42, 3, 11, 30, -42, -42, 50, -27, -12, 24, -43, -26, 15, -41, -27, 29, 32, 8, -20, -40, -45, 19, -19, -12, -3, -38, 8, 16, 5, -10, 5, -16, -13, 30, 16, -17, 25, 37, 19, -40, -24, -3, -27, -33, -24, 3, 4, -30, 8, -17, 46, 7, -3, 3, -33, -48, -27, -50, -45, -32, 35, -8, -43, 18, 1, 22, -4, 34, -23, -5, -47, 37, -43, 10, -34, -17, -31, 29, 23, -17, -8, -41, 43, -21, -26, 6, 12, 20, -4, 33, 30, -48, -5, -15, -25, -41, -17, 27, -43, 4, 40, -41, 6, 28, 50, 35, -6, -1, 13, 44, -49, -6, 44, 11, -37, 23, 43, 49, -36, -37, -20, -22, -24, 34, -42, -31, 48, 7, 28, 37, -2, 6, -35, 49, 24, -43, 16, -32, 16, -15, 38, 9, -15, -40, 0, 29, 4, 3, -34, 11, -9, -27, -34, -3, 33, 35, 19, -44, -37, -40, -39, -46, -46, -31, 3, 4, 7, 28, 39, 46, -21, -27, 36, 22, -48, 49, -3, 20, -29, -37, -3, -22, -1, 29, 47, -41, 20, 38, -24, 28, 45, -23, -42, 20, 29, -25, 48, 30, 36, -43, -49, 44, 6, 1, 7, 45, 42, -48, -43, 8, -49, 44, 11, -2, 50, -31, -22, -34, 23, -29, -45, 11, 47, -20, 11, -39, -39, 12, -35, -26, -29, 40, 37, 25, -33, -6, 29, 17, -39, -2, -18, 35, 12, -33, 3, 46, -24, 32, 27, -26, -17, 37, 9, 3, 36, -46, -15, 3, 37, -15, 18, -12, 19, 49, -47, 23, 14, 34, -11, -14, 16, -20, 40, 30, 36, 26, -4, -24, 0, -31, -38, 12, -7, -27, -48, -41, 14, -2, 7, 26, 27, 46, -49, 15, -20, 17, 47, 32, -14, 22, -27, 26, -7, 43, 32, -10, 23, 0, -9, 27, -11, -3, 33, -47, 9, -12, -46, 45, -45, -37, 19, 27, -39, 11, -24, 3, 39, -39, -43, 23, -35, 1, -25, -43, -6, 42, 33, 30, -32, -34, 14, -22, -37, -34, -38, 42, 47, 40, 12, -18, -22, -14, 32, -5, -27, -37, 50, -46, 2, 37, 47, 44, -21, 9, 22, 40, -23, -25, -33, -15, -43, -33, 33, 7, -19, 42, -2, -3, 31, 20, 14, 41, -18, -1, -47, 33, -15, 44, -23, -48, -45, -6, -28, -44, 10, 49, 14, -45, -27, -14, -6, 0, 49, 37, -6, 12, -22, 50, 45, -26, -41, -16, 4, -26, 40, -6, 45, -39, -47, 39, 16, -34, 22, 42, 14, 31, 2, 33, 6, 47, -23, 48, -35, -30, 26, 48, -9, 3, -19, -13, 19, -13, 3, 9, 26, 26, -4, -39, 2, -18, -23, -48, 31, -25, 3, -11, 15, 17, 41, 41, 38, 39, -4, -49, -9, -17, 43, -30, 50, -7, 36, 46, -49, 40, 8, 35, 47, -35, -31, -25, -35, 19, -28, -9, -14, 21, -45, -14, -29, -45, -19, -34, -13, -34, -14, -28, -2, 10, -2, 10, 26, -19, 35, 12, -44, -29, 34, -45, 10, -37, -35, -48, -42, -4, 34, 43, 43, -9, -9, 45, -28, -48, -50, 16, 50, 20, -48, 49, -2, 16, 4, -47, -20, 15, 27, 50, 13, -20, 12, 15, -20, -4, -29, 23, 43, 46, 32, -5, 38, 7, 10, -5, -50, 45, -26, 10, 30, -37, -6, 26, -12, 15, -19, 45, 7, 5, -45, 38, 16, 31, -1, -13, -48, -46, -27, 3, -17, -12, 37, 49, 41, -3, -2, -17, 29, 49, -44, -33, 19, 41, -17, 0, 42, 17, -37, 18, 38, -43, -36, 32, 8, -40, -31, 4, -15, 31, -37, 7, -13, 38, 29, 31, -50, 14, -50, 34, 9, -26, 40, -41, -1, -39, 41, -19, -18, 21, -25, -9, -1, 10, -10, 6, -49, 48, 47, 19, -20, -28, 25, 3, -23, 28, -32, 25, -3, -49, -40, -7, 50, 8, 8, -13, -26, -30, -9, -15, -42, -39, -41, 8, -46, -18, 18, 29, 12, 50, 50, -22, -33, 42, -45, 2, 31, -19, -9, -4, -20, 11, 5, -40, -25, 41, -24, 32, 6, -24, 8, 11, -31, -48, -35, -7, 42, 28, -21, -11, 14, -22, -21, -19, -41, 40, 0, -43, 0, -15, 4, -16, -15, 5, -15, 38, 33, 10, 11, 30, 36, -26, 13, 9, 6, 44, 19, 48, 1, 5, 12, 17, -31, 3, -50, 39, 47, -41, -28, 0, -27, -38, -22, 7, 40, 44, -8, -41, -20, 23, 37, 46, -37, 48, -17, -34, -30, 45, 16, 7, 28, -43, 45, -13, -25, 13, -21, -42, -19, -40, 35, -17, -33, -32, 3, 31, -14, 31, -39, -47, -8, -24, 0, -46, -45, 26, 36, 5, 38, 17, 45, -7, -36, 39, -9, -40, 22, -40, 15, -24, 7, 39, 21, -30, -30, 21, -50, 7, -38, 22, 41, -45, 36, 49, 7, -34, 22, -39, 35, 1, 25, 19, 22, 1, -14, -48, 47, -43, -41, -4, -10, 13, -9, -8, -42, -37, 50, 40, 45, -47, -49, 46, 34, -50, 24, 14, -5, 8, 24, -44, 15, -36, 21, -4, 39, -11, -9, 0, -16, -10, 34, 6, -13, 21, 45, -43, 23, 12, 36, -47, -3, 1, -13, 43, 36, -46, 34, 19, 30, 38, -27, 35, 26, -34, 27, 47, 39, 32, -25, -48, -49, 41, -49, -29, 20, -47, -13, 33, 19, 22, 1, -20, -25, -15, -25, -23, -46, 23, -33, -36, 6, 46, -46, -14, 35, 35, -29, 1, -36, -34, 0, -6, 12, -23, 8, 35, -30, -9, 30, 18, 31, -34, 17, -44, 38, 50, -11, -11, -8, 22, 32, 0, 22, -28, 44, -19, -20, -34, 7, 35, -16, -21, 13, 2, 0, -14, 39, -45, -17, 5, 45, -26, -38, 12, 15, -46, 24, -40, 37, 27, 43, -7, 48, 34, 18, -49, -11, -14, -2, 47, 24, -15, 24, 22, 19, -17, 7, -14, 45, 9, -39, -19, 30, -47, -18, -8, -42, 47, 0, 43, -31, -12, -28, -10, -7, -16, -28, 7, -3, 36, 7, 50, 6, 36, -12, -23, 13, 11, 32, 11, 43, 34, 37, 34, -25, 0, -1, -15, -25, -18, 49, 17, 22, -43, 15, 42, -28, 19, 4, -8, 49, -30, -29, -42, -17, 8, -25, -50, 49, -46, -10, 12, -29, 17, -3, 15, -35, 29, 2, 35, 14, 28, 13, 37, 17, 12, 11, 31, 30, 20, -6, 1, 23, 14, -49, -2, -29, 45, -22, -16, 30, 25, -27, 43, -21, 33, -9, 20, -1, 20, 9, -21, -39, -2, 44, 31, -5, -8, -49, 46, 24, 47, 29, 3, -16, 1, -18, 34, 33, 21, 0, -25, 46, 11, 10, -25, -14, -21, 44, 46, -40, 2, -10, -46, 15, -38, 12, 31, 39, -26, -7, -37, 18, 8, 5, 1, 15, 17, -39, 24, 17, -8, 22, 23, 40, -45, -36, -9, -20, 35, 2, -45, -18, -22, -30, 3, 5, 43, -30, 49, 4, 7, 13, 35, -5, 33, -29, 9, -40, -4, -20, 26, -33, -29, 5, -34, -13, -26, -19, -36, -38, 7, 39, -1, -40, -38, 46, -1, 50, -13, -50, -12, -24, -15, -19, -10, -36, -20, -45, 38, 1, 31, -29, -20, 49, 22, -5, 16, 46, 40, -8, -50, -7, 6, -42, -46, 28, -42, -6, 41, 26, -27, 23, -9, -29, 9, 35, -14, -12, 33, 23, 23, 39, 38, 2, -23, 26, -36, 9, 9, -45, 1, -39, -32, 45, 24, 46, -49, 4, -36, 13, 49, 18, -36, -8, 23, -34, 47, -27, 23, -21, 16, 0, 9, 50, -48, -46, -23, 27, -40, 21, 50, 21, 25, -36, 32, -3, -5, -23, -44, 20, 43, 31, 37, -45, 7, 17, 4, 16, -2, 0, 8, -45, 39, 0, -13, -40, 1, 42, -31, -41, -25, -3, 40, -37, 49, 8, -39, -28, 34, 21, -12, -42, 37, 44, -26, -34, -9, -22, 9, 16, 34, 6, 21, -37, -12, -35, -33, 44, 24, -31, -5, -6, -47, 33, 44, -31, -40, 14, -33, -12, -7, 46, 49, -33, -4, -20, 48, -12, -13, 28, -4, 19, -43, 35, 14, -38, 4, 37, 34, -8, -47, 20, 9, -39, 8, 26, 3, -7, -35, -45, -37, 7, -20, 49, 50, -10, -16, -41, 30, -21, -7, 4, 20, -33, 32, 28, 35, -12, -9, 3, -21, -31, 45, -9, 38, 36, -46, -1, -10, 43, -12, 6, 40, 6, -14, -44, -46, 28, 0, -43, 5, 22, -40, -29, 47, 48, 26, -40, 9, 45, -36, -13, -50, -5, 37, -8, -29, -48, -37, -49, 10, -19, -13, 46, -5, -9, -45, -10, -26, 47, -40, 50, -10, 20, 6, -5, 35, -3, 12, -12, -41, 34, 19, 14, 47, 8, 27, -15, -24, 22, 4, 19, 44, 30, 2, 9, 10, -15, 34, -24, -10, -23, -35, -16, -15, 5, 48, -32, 6, 34, -18, -28, 12, 19, 45, -29, 16, 48, 29, 8, -26, -34, -12, 26, 41, 24, 23, -12, -27, -13, 37, 46, 30, 6, -7, -15, 48, 19, 29, -6, 41, 45, -25, -40, 1, -26, -20, 34, -6, 16, 25, -11, -5, 3, -10, 38, 30, -13, 49, -15, 32, -7, 6, 15, 30, -21, -41, 48, 10, 12, -15, 3, 46, 14, 31, -47, 4, 3, 40, 38, 13, 41, -29, -26, 30, 8, 6, 3, -7, 1, 25, -35, 50, -35, 30, 4, 10, 44, 28, 26, -11, 40, -30, 15, -43, 20, -41, 6, -47, -8, 49, 48, 12, -8, 16, 31, 0, 5, -8, -27, 45, -17, 8, -49, -49, -41, -28, -36, 25, -34, 31, -37, 30, 28, 25, -35, -19, -28, -17, 47, -35, -17, 20, -18, 17, -8, 13, 20, -33, 17, 10, 24, -31, -40, 28, -5, 13, 30, 47, 25, -23, -3, -16, -43, 40, -29, -27, 15, 44, 35, 13, 14, -37, -26, 49, 49, -48, -46, 14, 3, -32, 46, 3, 43, 25, -41, 47, -35, -5, -22, -36, -3, -40, -17, -15, -21, 48, 22, 31, -32, 17, 19, -18, 45, 29, 24, -29, -15, -28, 12, -25, 9, 44, 42, -46, 3, -13, 11, -26, 47, -39, -29, -42, 33, -22, -7, 42, -24, 4, 30, -46, 1, -38, -9, -36, 28, -33, -1, -49, 36, -38, 17, -4, 38, 24, -1, -39, -38, -42, 8, -6, 19, -8, 23, -28, 28, -6, -28, 50, -17, -35, 12, 0, -19, -13, 5, 18, -34, 35, -12, -10, -3, 31, -23, 26, -1, -50, -1, -32, 47, 8, 17, 16, -10, -41, -23, -17, -12, 32, 5, 1, 49, -48, -28, -34, 20, -25, -33, -5, 19, -20, 42, -42, -16, 30, 9, 25, 12, 49, 1, -3, 10, -27, 23, 7, 13, -21, -22, -41, -12, 4, -23, -33, -10, 30, 24, 14, 30, 49, 49, -5, 9, -42, -6, 9, -23, 46, -48, 0, -43, 19, 8, 10, 7, 19, 42, 50, -39, -42, -2, 32, -34, 3, -7, -19, -16, 27, -2, 3, -35, 34, -39, 37, 47, -43, -30, -3, -43, -23, 29, -41, 1, -36, -47, 39, 28, 49, 45, 11, -47, -10, 22, 48, 4, -23, 50, -4, -42, -49, 16, -3, 18, 23, -23, 28, -37, -5, 36, -38, -35, 43, -11, 21, 30, -21, 30, 48, 14, 7, 37, -3, -2, 38, -49, 38, -37, 46, -34, -20, -41, 19, 38, -14, 13, -21, -17, -33, 37, 12, -2, 5, 40, 7, -24, 4, 34, -32, -28, -4, 28, 15, 48, 0, 33, -23, 6, 7, -36, -35, 46, -4, 12, -39, -8, 33, -22, -2, -48, 18, 9, 15, 36, 39, -25, 20, 23, 18, -4, 25, 45, -9, -20, -29, -34, 33, -31, -43, 47, -2, 36, -13, 2, -23, 26, -22, 21, -40, -4, -6, -33, -1, 38, -2, -29, -6, 10, 48, 42, -30, 20, 10, 25, -15, -27, -19, 40, 45, 8, 45, 45, 39, 24, 31, -46, -35, -40, -16, 24, -9, 36, 47, 30, -41, 31, -43, -25, -48, 8, 37, -48, -13, -49, 48, -34, 22, -15, 35, 44, 47, 37, 22, -49, 34, -17, -24, -14, 20, -29, 17, -37, 47, -28, -7, 38, 14, 28, 45, 27, 10, 34, 4, 20, 49, 34, -1, -39, 28, -36, -34, -17, -16, -12, 27, 4, 8, -46, -21, -47, -36, -16, 23, 4, 15, 9, -27, 41, -29, -7, -19, 44, 32, 0, 34, -48, 19, -19, -49, 37, 8, 40, 22, 26, -37, 0, -40, 27, 29, -41, 33, 29, 7, -17, 29, 27, 2, -23, -33, -25, -44, -6, 47, -6, 20, 46, -16, 1, -30, -23, 45, -7, 29, 5, -41, -28, -3, 1, -36, 4, -8, -1, -45, -18, 11, 4, -12, -39, 49, -20, 23, 2, -17, -10, -41, 1, 24, 6, 27, -48, 6, -18, -44, -47, -12, -3, 23, 28, -35, -13, -47, -47, 49, -24, 35, 35, -34, 47, 45, 19, 3, 46, -43, 2, 49, -46, 18, -4, 23, -11, -44, -39, 43, -26, -23, -8, 26, -4, -2, 35, 3, -33, -24, 21, -45, 24, 42, 18, 20, -29, 8, -4, 17, -19, 32, 46, -50, 3, -5, -10, -10, -43, -19, -21, -5, 41, 1, 45, 38, 47, 10, 46, -38, 38, -11, 10, -7, 11, -7, -3, 23, 8, 6, 44, -40, -26, 10, -5, 3, -17, 33, -44, 46, 11, 6, 48, 42, 25, -46, 25, 42, -16, 33, -14, 9, 14, -35, -21, 22, -9, 10, 23, 26, -3, 11, 33, 42, 13, 6, 17, -5, -23, 50, 26, -48, -14, -3, -32, 41, 32, -34, 31, 31, 36, -11, -1, 22, -22, 0, -9, -22, 15, -34, -20, 41, 1, -12, 9, 43, 48, 0, 33, -35, 47, -37, 39, 33, -9, 0, -27, 31, -8, 22, -32, 33, 10, 43, 12, -25, 44, -16, 16, 5, -11, -22, -45, 1, -50, 1, -27, -17, -44, 24, -40, -15, -31, 12, 29, 12, 18, 37, -21, -21, 50, 46, 33, -29, 10, -30, -14, -24, -16, -13, 9, 19, -19, 29, 41, 29, -24, -48, -2, 34, -21, -29, -32, -20, -31, -32, -49, -11, -12, 40, 21, 3, -24, 28, -39, 27, 20, -34, 39, 50, 33, -41, -32, 31, -21, -21, -26, 37, 23, 15, 45, -16, 0, 50, 20, 20, -24, -41, 46, -8, 4, 20, -45, -45, 26, -3, 26, -49, 32, 0, 10, -32, -49, 0, -25, 19, -31, -28, 3, -36, -45, 41, -16, 24, -43, 6, -1, -2, 37, -30, -15, 20, 18, 7, 12, 42, -35, -45, 27, 1, -49, 38, 44, 26, -33, 30, 41, 25, -16, 35, -12, -50, -14, -30, -50, -47, 45, 7, -50, -38, -5, -4, 30, 25, -44, 0, -48, -1, -25, -20, 49, 11, -25, 16, 4, -23, -7, 30, -13, -21, 15, -43, -37, 50, 48, 11, 24, 12, 28, 15, 50, 45, -11, -38, -34, -36, -18, -35, -38, 35, -28, -15, -8, -1, 23, 30, 43, -38, -21, 6, -21, 20, -41, 48, 15, 43, 32, -12, -14, -48, 38, -17, 35, -13, -37, 13, -12, 3, -49, 45, -8, 2, -48, -10, -43, 39, 45, 24, 12, 14, 28, -47, 17, 41, -41, 24, -1, -28, 10, -4, -48, -34, -29, 40, -35, 29, -48, 1, -18, -9, -49, -12, -5, -3, -24, -36, -44, 6, -9, -42, -45, 6, 25, -21, 4, 33, 33, 3, -24, 33, 8, -44, -11, 43, 21, -49, -37, -41, -1, -33, -33, -35, 1, 18, 1, -20, 50, 33, -28, 45, -9, 30, 11, 26, -1, 26, 30, -36, 39, -7, 41, -9, -6, 43, -16, -29, 23, 24, -13, 46, 19, 13, 50, -44, -7, 25, -44, 15, 9, -50, 11, 36, 38, -33, -44, 3, 16, 42, -41, 10, 8, 8, 18, 12, 47, -43, 27, 4, -45, -50, 5, 46, 24, 37, -41, -28, -35, 50, -35, 5, 44, -45, -21, 12, 50, -50, 0, 38, -5, -30, 48, -13, 18, 12, -1, -39, 18, 22, -7, 1, -42, 48, 14, -41, -5, 49, 7, -14, 1, 48, 30, -38, -45, 7, 50, -3, -19, -40, 30, -46, -45, 23, 46, 43, -30, -9, 30, -24, -48, 9, 42, 15, 42, -2, 49, -17, -14, -9, 14, 9, 39, -50, 8, -47, -37, -33, -17, -50, 2, -29, 29, 10, -29, -1, -35, -23, 41, 35, 19, 38, -9, 15, 20, 30, -16, -31, -49, -44, 45, -2, 32, 25, -42, -24, 27, -49, 34, 17, 9, 34, 35, -2, -49, -34, 32, 37, -31, 25, 38, 36, 47, -19, 0, 37, -9, 12, 38, 10, 11, -48, 38, 41, 25, -25, -3, -43, -46, -40, -9, 48, 40, -10, -32, -3, 2, 4, 10, -19, -5, 41, -15, -33, 23, 45, -33, -39, 21, 46, -5, 4, -13, 27, -49, -42, -46, 47, -32, 20, -12, -9, -34, 12, 39, -5, 40, 41, -31, 19, -43, 45, -32, -19, -32, -27, -27, 5, 30, -33, -39, -10, 36, -3, 31, 13, -35, 29, 49, -28, 35, -12, -18, -27, 10, 4, 10, 33, 46, 44, -11, 7, 21, 23, -50, 34, -26, 45, 2, 10, -5, 23, 9, 0, 22, 33, -3, 33, -11, -44, 24, 34, -32, -36, 19, 10, 5, -41, -5, 29, 24, 6, -16, 21, 41, -48, 15, 2, 27, 1, 42, 2, 3, -4, -48, 14, -36, 33, 35, -17, -1, -18, 22, -48, -49, -47, -35, 3, -18, -42, 6, -11, 1, 31, -35, -43, 36, 9, -15, -48, -36, 46, 31, -28, -48, -21, -6, -34, 7, 7, 45, 6, -44, -12, 27, 7, 5, -36, -7, -39, -43, 29, -10, -17, -5, 37, -22, -35, -46, -46, -21, -1, -46, -38, 48, -2, 38, -1, -37, -5, 39, 31, 33, -17, 20, -4, 9, 23, 28, 30, -40, 47, 40, 34, 44, -1, -47, -10, 8, 9, 30, 11, 33, -26, 36, 28, -18, -32, 6, -36, -10, 18, 29, 9, 45, -29, -8, -19, -38, -13, -25, 30, -46, -2, 46, 40, -46, 50, 20, -3, -33, 44, -45, 15, 26, -9, 1, -40, -25, -30, 15, -11, 5, 0, -31, 30, 29, 6, -46, -37, -27, 17, 1, -3, 37, -4, 9, 22, -48, -42, 31, 49, 32, -27, -47, -42, 46, -50, -16, 23, -39, -33, 27, -41, 23, -33, -27, -50, 43, 28, 21, 48, 31, -35, 34, -36, 11, -46, -6, 1, 20, -44, -24, 38, 35, -38, -34, -7, -38, 39, 22, -46, -18, -47, 41, -25, 17, -35, 50, -29, -15, 7, 4, -16, -26, 21, 30, 10, -33, 7, 25, 6, 46, 36, 12, -39, -40, -38, -16, -24, 38, 16, 38, -6, 23, 30, 16, -29, 27, 40, -9, -31, -3, -33, 26, 19, 23, 50, 42, -45, -12, -40, -26, 43, 4, 33, 7, -14, -35, 44, 42, 19, 42, 45, 22, -14, 2, 36, -35, -33, -32, -7, -49, 7, -41, 25, -5, 31, -32, -13, -14, 40, 27, -6, -17, -49, -7, 46, 32, -24, -3, 43, -44, -24, 34, 20, 38, -33, -18, -18, 45, -26, -37, -13, -13, -47, 11, 31, -41, -16, 48, -28, 38, 14, 31, 28, -26, 45, 2, 33, -34, 6, 24, 26, 38, -31, -26, -9, -6, -20, 14, 1, 29, 41, -30, -21, -48, 47, 19, -8, -22, -48, 7, -18, 24, -6, 18, -19, 31, 33, 1, 13, -11, 41, -38, 39, 29, 38, 23, -22, 12, 33, -25, 45, 8, -2, 2, 37, -20, -39, 7, -15, -41, -45, -44, -20, 40, 21, -48, -4, 34, -50, -6, 3, -1, 28, -44, 12, -36, 38, 16, -21, 27, 17, -15, 16, -46, -26, 44, -40, 21, 39, 15, -23, 9, -41, -1, -12, -14, 12, 10, 34, 41, -13, -18, 24, -6, -7, -50, 2, -4, -18, 16, 39, -36, -37, -28, 3, -43, 3, -15, 33, 1, -45, 46, -23, -1, -13, -21, 30, 22, 41, 3, 20, -5, -23, -34, -3, -7, 9, 9, -46, 18, 27, 19, -44, 2, -34, 8, -42, 44, -29, -6, 22, 8, 29, 49, 47, -38, 32, -39, -15, -41, -35, 41, -32, -45, -47, -21, 44, -5, -24, -6, 34, -14, -42, 10, -16, -4, -30, -34, 4, 37, 44, -45, -16, -1, -14, -38, -26, 45, -50, -2, -16, 32, 2, 1, 3, 25, -4, -8, -31, -18, 42, -35, 27, -44, 19, -30, -15, 35, 3, -32, -26, 16, 49, 2, 47, 24, -3, -9, -4, 40, -9, -49, -45, -5, 15, 30, -11, 7, 27, 23, -18, 11, -39, 45, -2, 37, 27, -46, 0, 18, -19, -2, 46, 9, -5, 17, 43, -10, 30, 16, -38, 49, -33, 36, 48, 46, 0, -15, 30, -17, -39, -46, -3, 40, -11, -38, -25, -37, 45, -40, -13, 29, 6, -29, -35, 26, 25, 31, -22, 31, -49, 3, -49, -48, 42, 5, 21, -40, 25, -19, -47, -42, 37, 5, -35, 30, 35, 20, -41, 42, -15, -27, 13, 5, 27, 27, 38, -29, 1, -1, -4, -28, 45, 39, 40, 25, 32, -32, 1, -17, 45, -22, 10, 34, -16, -46, 25, -44, -10, -49, 38, -41, -7, 19, 40, -16, 11, 23, 22, -31, 50, -16, -14, 21, 3, 44, 29, -23, 19, -19, 41, -40, -9, -28, -21, -42, 41, 37, 8, -23, 37, 28, -18, -4, 47, -29, -22, -17, -9, 1, -4, 23, 0, -6, 43, 24, -17, -30, -38, 3, -26, -30, -50, 7, 18, 35, 20, -38, 1, -28, -30, -45, -31, 25, -11, -42, -1, -23, -40, 45, 24, 37, 5, 28, -16, 30, -26, 48, -32, -20, 30, -1, 36, 12, -4, -50, 7, -41, -43, -25, -17, -32, 27, 21, -50, -3, -26, -27, -4, 33, 43, 18, 16, -19, -34, 10, 18, -40, -13, 17, -32, 36, -34, -38, 40, -50, -49, 31, 49, 46, 49, 15, 17, -35, -47, 6, 22, 34, -28, -49, 16, 36, -25, -44, 49, -7, -18, 13, -15, -47, -28, -26, 39, 41, 41, 34, 23, -24, 0, 28, 30, 48, 18, 29, -28, -42, -18, -16, -1, -27, 37, -27, -32, -12, 10, -26, 44, -26, -24, -19, -40, 18, -18, -32, -35, 48, -40, 24, 23, 47, 18, 36, 4, -26, 42, 26, 45, -17, -39, 37, -30, -22, 0, -28, -18, -43, -9, 26, 18, -10, 23, 12, -37, 37, 11, 24, -5, 16, 42, 2, 1, 43, 50, -44, 30, 33, 3, -40, -26, 8, 37, 15, -24, 32, 7, 42, 50, -40, 4, -32, 41, -12, 34, 39, 35, 19, -40, -37, 9, -15, -10, -49, 6, 9, -31, -29, -47, 5, 42, 7, 37, 14, 37, 7, -21, 25, -32, 50, 11, 17, 28, 33, -7, 33, 10, -30, -41, -21, -27, -3, 4, 1, -13, 16, 42, -43, -22, -41, 18, 24, 17, -2, 7, -16, -1, -11, -39, 34, -35, 27, 34, -3, 40, 49, -50, 14, -29, -36, 33, 16, -37, 22, -32, -11, 47, -47, -18, -8, -14, 15, -24, -6, 30, -1, 44, 12, -45, 44, 16, 16, 46, 8, -38, -30, 13, -14, 29, 34, -3, 5, -7, -38, -47, 44, 22, -18, -14, 2, 50, -27, 38, 0, -10, -22, 8, -11, 0, -1, -15, 28, 9, -33, -31, -46, -33, -11, -50, -32, 36, -25, -22, 8, 12, 47, 32, 11, -3, 11, -33, 15, -24, -45, 19, 8, -45, -20, 43, 5, 3, 34, -10, -33, 36, -28, 41, -15, -26, -44, 31, -31, -46, -33, -18, 28, -16, 14, 12, 34, 21, 20, -10, -1, -21, -13, -16, 15, -5, -43, 17, -14, 34, -38, 22, -6, -22, -10, 5, 37, -35, -39, 15, 11, -32, -21, -35, 37, -38, 18, -28, 11, -20, 2, -34, -2, -2, 16, -25, -38, -13, -29, 34, -22, -6, -5, -12, 18, 27, 31, 17, 46, -12, -31, 26, 49, 17, -16, -43, 1, -11, -15, -45, 35, 19, 49, 22, -35, -5, 8, -13, 46, -33, -39, 3, 40, -4, -50, -36, 40, 29, -30, -50, 42, 16, -39, -23, -12, -14, 44, 9, -20, 7, 46, 46, -40, -22, 38, -38, 0, 3, -32, 7, -15, -23, 17, -48, 50, 38, -10, -16, 42, 42, 25, 48, 33, 30, 25, -1, 49, 23, 31, -21, 21, 26, 44, 19, 3, 20, 34, 0, -23, 13, 34, -30, 37, -24, -24, 26, -1, -22, -12, 6, 41, -14, 42, 13, -3, -29, 49, -21, -23, -28, 46, -47, -48, 10, 45, -47, 14, -39, -38, -17, 8, 42, 22, -20, 20, -38, 3, -49, -18, -1, -44, -33, 0, -43, 4, 25, -8, 8, -21, 8, -42, 41, 17, -12, 30, -40, -49, -28, 12, -29, 10, -25, -39, -19, -42, 18, 39, 20, 42, -18, -27, 38, 44, 42, 18, -13, -40, -19, 13, 21, -31, -17, -9, -43, 15, -30, 28, 19, -46, 16, -8, -35, 48, 22, -16, 32, -8, 47, -12, -41, 23, -31, -50, -45, 2, -5, 15, -13, -18, 16, 49, 26, -16, 28, -6, -29, 17, -34, -46, 34, 6, 37, 44, -11, -21, -9, -44, 20, 40, 37, -32, -10, -17, -29, 1, 40, -45, 23, 44, -26, 15, -41, 23, -25, -46, 35, 17, 47, 20, -1, -34, -40, 2, -1, -43, 41, 46, 11, 38, 34, 25, 39, -22, 48, 50, -7, -6, -22, 37, 8, -36, 19, 45, -7, 47, -15, 33, 6, 13, 25, 48, -13, -34, -24, -34, 12, -40, 13, -12, -49, 15, 3, -22, -6, 37, 37, 29, -20, -2, -42, -24, 5, 27, -6, 38, -8, -29, 48, -18, -24, -11, -25, 32, -6, -6, -25, 19, 16, -45, -23, 16, -38, 12, -38, 26, -50, -11, -14, -20, -34, -42, 13, 6, -38, -14, -37, 24, -26, 44, 27, 6, 20, 37, 49, -9, -9, -4, -7, -10, -48, 39, 39, -50, 28, -40, 50, -44, -39, -13, 3, 16, 2, 39, 43, -19, 49, -6, 0, -14, 8, 3, -33, -50, -30, -23, -35, -3, -23, -29, 32, -50, 44, -9, 47, 19, 41, -48, 44, 29, 30, -7, -24, 0, -27, -31, -19, 48, -38, -8, -31, -49, 17, 40, 9, 38, -47, 45, -34, -50, -18, -21, -46, -39, -19, -13, -34, 7, -11, 45, -27, -39, 44, -32, -22, 34, 39, 1, 41, -34, 22, -30, 9, 47, 24, -31, 2, 29, 12, 6, -22, -50, 31, 8, 13, 35, 21, 20, 38, 43, 47, -7, -3, 24, -36, -16, -28, 2, -6, 34, 41, -38, -17, -13, 19, 17, -46, -11, 19, -30, -23, -48, -28, 21, -32, 24, -1, 23, 7, 41, -31, 41, 42, 21, 32, 2, 34, 31, -42, -47, -10, -26, -17, 22, -42, 31, 24, -38, -42, 29, -47, -17, -44, -36, -13, 24, 45, 40, 43, 1, 30, 49, 32, -44, -6, 8, -30, -23, -48, -37, -49, -22, -33, -14, -6, -6, -27, -5, -39, 2, -6, -19, -33, -38, -47, -28, 11, 3, 23, 4, 18, -11, -37, 47, -23, 21, 29, 44, 20, 16, -22, 49, 10, 17, -42, -34, -2, 12, 33, 27, -5, 42, -38, 49, -6, 2, -34, -4, 11, -1, -8, 17, 33, 24, 35, 21, -23, -6, -10, 43, 46, 46, -15, 40, 33, -18, -26, -32, -4, 34, -18, 16, -37, 28, -18, -9, 35, 14, 44, -4, -16, 33, -19, 4, 3, 25, 0, 29, 8, 21, -37, -33, 4, 43, 46, 47, 5, -2, 47, 9, 2, 20, -45, 19, 35, -43, 50, -36, -25, -12, -48, 6, -41, -48, 43, -5, -29, 16, 14, 46, -32, 49, 11, 47, 6, 44, 37, 25, -38, -35, -35, 1, 33, -10, -3, 40, -12, -38, -47, 45, 47, -8, 30, 37, 42, -5, 41, -4, 35, 41, 2, -26, -10, -48, 26, 44, -38, -33, -14, -8, -17, 30, 4, 1, 34, -15, 3, 8, 1, -32, -39, 41, -40, -3, 50, 41, 48, 28, -35, 20, -4, 16, -20, 25, -43, 38, 10, -7, -1, -16, 25, 10, 34, 39, 4, 15, -37, -47, -34, 18, -27, -2, 4, 20, -28, 30, -39, -40, 24, 47, 50, -22, 11, 2, -3, 49, 40, 35, 15, 49, -3, 43, 8, 20, 6, 25, -48, 30, -19, -43, 36, -21, -36, 23, 4, -13, -36, -21, -5, 13, -25, 27, 16, -15, 39, 27, -20, 27, -11, 23, 22, -5, -9, -33, 49, -15, 25, -1, 10, -11, -48, 31, -44, -20, 14, 44, 13, 26, 42, -48, 42, -16, -36, -30, 11, 32, -23, -47, -38, 28, 0, -3, -12, 45, 16, 43, 7, 33, -49, -26, -40, -50, -3, -3, -41, 30, -21, -16, -32, 2, -17, -19, 25, 30, -45, -38, 35, 24, 13, -44, -6, -6, 34, 14, 43, -32, -4, -5, -22, 48, 33, 49, 10, 14, -28, 44, 0, 12, 48, -29, 20, -18, 49, -7, -44, 40, -49, -34, 14, 7, -21, 35, 41, 46, -25, -16, 12, 24, 20, -23, -26, 10, -20, 3, 16, 46, 0, 7, -17, 8, -30, 5, -14, 13, -32, 50, 34, 27, 23, 2, 20, 42, 12, 11, 21, 26, -32, 24, -49, -45, -22, -10, 0, -46, -10, 11, -21, 11, 49, -24, -1, 31, 1, -2, 11, 49, 9, 29, 3, -46, -42, -17, 47, -15, 44, -31, 30, 33, 41, 34, 32, 12, 16, -21, 18, 19, -48, -2, -9, -27, -7, -50, 3, 1, -15, 28, -13, -7, 31, 36, -4, -22, 0, -10, 35, 13, 37, -3, 26, 46, -29, 48, -34, 35, -46, 10, 38, -45, 2, 30, 44, -34, 8, 46, -12, 3, -3, -14, -3, 17, 27, 26, -24, 37, -24, 21, 12, 1, -4, -30, 6, 24, 44, 40, -9, -3, -24, 21, -18, 25, -16, 47, -35, -15, 15, 25, 40, 5, -34, -31, 34, 43, 33, -43, -33, -33, -33, -49, 25, 45, 21, 0, -41, 24, -37, -25, -4, -21, 5, -9, -47, -40, -27, 35, 16, -14, -49, -39, -30, 18, 20, 13, 17, -8, 3, 49, 11, 35, 42, 22, 39, -39, -50, 21, -18, 13, 17, -37, 42, -37, -42, 22, -25, -2, -34, 17, 9, -48, 42, -26, -30, -39, 3, -50, -50, -6, -5, -3, -44, -41, -36, -11, -40, 5, -5, -6, 36, -38, -24, 30, -1, 10, -38, -39, -22, 34, 33, -31, -20, -43, -27, 24, -12, -18, -9, -36, 17, 14, -19, -40, 43, -14, -32, 0, 49, -17, 20, 9, 33, 2, -39, 11, 45, 15, 35, -3, -11, -27, -1, 44, 17, 37, -8, -34, 32, 4, -17, 46, 19, 9, 0, 49, 26, 22, -16, -17, -35, 31, -33, -13, -8, -19, -44, 36, 36, -5, 10, -33, 20, -11, 37, 27, -1, -46, 3, 35, 7, -29, 23, 39, 28, -13, -2, -50, 27, -15, 44, -23, 47, -16, 9, 11, 36, -5, 32, 31, 28, 10, 14, 38, -25, -16, 6, 28, 12, -47, 28, -9, -6, -12, 14, -29, -40, -14, 39, 0, 40, 7, 26, -44, -43, 0, -28, 39, 40, -42, -5, -13, -38, -44, -40, 23, 46, -1, 16, -10, -22, -14, 5, 29, -35, -7, -1, 20, 28, -45, -33, -32, 0, 15, -48, 38, 49, 3, -2, -23, -13, -23, -19, -10, -15, -15, 36, 15, -41, 19, 21, 28, 42, 12, 41, -29, 47, -31, -18, -36, -44, 37, 39, -1, -41, 28, -14, 8, 37, 24, 12, -30, 28, 28, -14, -6, -37, -8, 34, 33, -18, -48, 36, -7, 36, 40, -16, -26, 45, 35, -43, 11, -33, 41, -23, 24, -39, 13, -49, 8, -14, -47, -10, -6, -17, 36, -38, -44, -19, -28, -2, 21, -4, -14, 47, -3, -22, -14, -28, -13, 42, -7, -46, 1, -11, -40, 27, -49, -16, -6, -2, -16, 41, 21, -19, 17, 20, -12, -3, 40, -14, 9, 30, 23, -47, -28, -37, -46, 15, -27, -33, -24, -27, -22, -40, -33, -47, -18, 27, -9, -19, 0, -47, -31, 34, 16, 38, 17, 11, 7, -4, 24, 29, 8, 49, -45, 44, -11, 26, -28, 1, -47, -14, -9, 50, -7, 46, -9, -22, 50, -32, 33, -19, -7, 4, 29, -46, -5, 25, -6, -30, 27, 50, -29, -21, -28, -46, 12, 42, 8, 43, 31, 1, 14, -12, 30, -48, -9, 20, -24, -23, 3, 44, -36, 2, 21, 19, 41, -47, 43, -34, -17, -45, -15, 48, -12, 29, 15, -43, -36, 12, 40, 29, 14, 8, -41, -44, 23, 25, 30, -39, 28, -5, -19, -19, 39, 27, 39, 10, 18, 10, -5, 17, 41, 4, -50, 26, 16, -2, -26, -35, 34, -38, 1, -15, 21, -7, 32, -4, 29, 25, -31, -33, 3, -39, -26, 9, 24, 35, -17, -38, -13, -39, -15, -23, 40, -12, 26, -8, 40, -20, -49, 31, 39, -9, -20, 10, 5, 35, 49, 32, -37, -37, -22, 30, -1, -1, 12, 50, 22, 14, 17, 20, -40, -37, 32, -48, -43, 42, 50, -8, -42, -32, -39, -24, 50, 7, -26, -6, -3, -1, 30, -7, 8, -18, 27, -23, -33, 4, -18, -36, 10, -40, -15, -36, 2, 11, -3, 43, -36, 12, 36, -8, -1, 9, 8, -36, -22, 24, 31, -11, -20, 22, 35, -40, 30, 46, 11, 24, -43, 0, 6, -47, -15, -32, -27, -10, -2, 31, 46, -5, -15, -41, 27, -44, -39, 35, 40, -3, -14, 24, -15, 9, 26, 45, -43, -44, -8, 7, 30, 35, -5, -17, 33, 21, -29, 40, 47, -30, -36, -46, -34, 21, -32, -46, -28, 32, -37, -41, -20, -38, -29, -14, -12, -41, -20, -8, 48, 26, 43, 47, -15, -16, 17, 4, 17, -4, -45, -23, -21, -24, 18, -12, -16, -7, -36, 32, 43, -19, -22, 12, -45, 39, -24, 48, -23, -46, -10, 5, 3, 29, -33, 26, -8, 38, 23, -22, -41, -45, 29, 38, -47, 50, -17, 32, -18, -47, -7, 47, 25, -20, 29, 15, 7, 9, -49, -15, 19, 9, -28, -4, 50, -5, 29, -7, -32, -2, 37, 7, 40, -44, 43, -10, 27, -36, 25, 2, 42, -28, 26, 22, 37, 43, 14, 9, -41, 7, -4, -36, -42, -38, -28, -18, -42, -48, 43, 22, -26, 37, 45, 20, -15, 38, -31, 30, 3, 49, 39, -32, 9, -14, -48, 41, 35, -32, 2, -5, 29, 5, 19, 50, -20, 2, -17, -20, 9, -40, 49, -45, -24, -44, -2, 45, 21, 9, -18, -4, -7, 28, -24, 43, -29, -4, 42, -3, -21, -49, -36, -4, -24, 20, -24, 34, -38, 4, -34, 24, 8, -41, -18, 27, -14, -43, -18, -44, -17, 20, -44, -10, 49, 4, -44, 33, -33, -8, 27, -11, 2, -37, -30, 6, 40, -5, -25, 40, -27, -46, -9, 41, -8, -19, 37, -45, 23, 16, -44, -22, -17, -44, 30, 26, 7, 34, -20, 22, -6, -4, 26, 30, 21, 22, 22, -11, -21, 11, 20, -34, -46, 30, -50, 29, 30, 43, -20, -16, 21, -21, 34, -36, 47, 5, 9, -24, -49, 23, 13, -46, 40, 17, -38, 30, 34, -28, 46, -1, 28, 27, 22, -14, -21, 42, -28, -17, 13, 4, 20, -42, -47, 15, 40, -18, -19, -7, -14, 40, 41, 16, 9, 8, -15, -2, 0, -43, -1, -10, 50, -13, 35, 27, 28, 4, 17, -33, 14, 13, -39, -10, -9, 9, -1, 30, 32, -15, -3, 20, 22, -43, -26, -44, -43, 37, 30, 25, -20, -39, 6, 15, -39, -24, -5, -44, 10, 7, 7, -38, 2, 49, 14, -2, -16, 43, 44, -34, 21, 16, -41, -17, 35, -47, 45, -22, -5, 24, -5, 26, 8, 10, 17, 15, -17, 35, -46, -42, -31, -30, -34, -39, 41, 31, 16, -46, 9, 2, 1, 27, -3, 39, -32, -34, 3, 17, -16, 37, -10, -38, -18, -36, 12, -36, -20, -23, -41, 6, 20, -18, -44, -46, 39, 29, 6, 21, 35, 47, -11, -23, -15, 5, -4, 20, -11, 8, -8, 41, 15, -42, -45, 14, -48, 23, -14, 36, -18, -42, 2, 26, 41, 0, 20, -25, -35, -11, 39, 0, -12, 4, 45, -15, 14, 34, 26, 39, -6, -42, -14, 36, -50, 15, 12, -8, -23, 49, -20, 18, 50, 38, -43, -17, -2, 45, 7, 24, -4, -26, -48, -6, 1, 45, 48, 45, -17, 50, 18, 41, 41, -43, -24, 29, 12, 31, -26, 7, -3, -50, -43, -30, 47, 37, 50, 39, 27, -22, -21, -48, -44, 49, -40, -19, 8, -39, 28, -13, -27, 14, -33, -5, 5, 12, -44, 15, -11, 3, -20, 46, 1, 43, -20, -17, -44, 38, -35, -29, 49, 2, 40, -34, -47, 10, 48, 35, 1, -16, -7, -36, 10, -7, -30, 26, -4, 24, -2, 2, -24, -20, -7, -19, -21, -33, 12, -35, -16, 11, -42, 11, -12, 0, 50, -41, 1, -39, 21, 11, -48, 32, -40, -43, 39, -28, -41, -33, 25, -12, -25, -40, -41, -48, 11, 20, 10, -47, 10, -43, -38, -39, -16, 3, 0, -8, 49, 15, -36, -2, -17, -12, -25, 18, -3, 38, 0, 47, -47, 47, -24, -9, 5, 42, 18, -33, 10, -47, -50, -1, 33, 19, -31, -31, -5, -24, -25, -19, -41, 31, -39, 23, 37, -27, 0, -13, -5, 38, -43, 4, 27, -20, 37, -35, -31, -13, -36, 27, 25, -17, 21, -32, 18, 40, 12, 26, -19, 44, -14, 15, -44, -3, -40, 24, 36, -20, -7, -6, 21, 5, -19, -30, -20, -50, 26, -40, 42, 17, -15, 28, 8, 16, 5, 0, -22, 34, -49, -45, -20, 3, 37, -11, -34, -46, -49, 7, -39, -46, 9, -10, -31, 21, -50, 5, 19, 5, 3, -40, -48, 44, -23, -46, 39, -35, -20, -23, -44, -42, -12, 48, -8, -24, 25, 38, 42, 44, 47, -18, 40, 5, -49, -37, -38, -27, 18, -17, 36, -32, -21, -2, -8, -35, 1, 47, -2, -40, 27, -4, 28, -16, 20, -22, 3, 35, -28, -27, 48, -41, 10, -43, -3, 25, 42, -22, 36, -25, -14, 45, 1, -13, -45, -43, -34, 25, 11, 35, 27, -17, -32, 19, 31, 49, -14, -13, -36, -11, -42, 2, 19, 15, 29, 1, -50, -21, 46, -50, -12, -35, -34, 31, -29, 35, 48, -20, -11, -24, -15, -47, 18, -26, 44, 27, -21, -4, -39, -24, -6, 37, 12, 4, -21, 31, -37, 5, -32, 35, -25, 20, 41, -13, 18, -15, -33, 6, 27, -28, -37, 45, 18, -29, -23, -8, 25, -33, 49, 44, 26, 33, -15, -44, -28, -17, 45, -30, 19, 29, 48, -4, 2, 33, -10, 24, -19, -37, 37, 44, -34, -26, 13, 22, 35, -3, -16, -14, 4, -34, -23, -50, 2, 22, 4, 10, -38, -4, 13, -19, -23, 2, -20, -43, 21, 47, 36, 23, 50, -26, -18, 17, -44, 46, 15, -5, 45, -46, -34, 25, 1, -39, 11, -16, 11, -30, 34, 15, 2, -30, -36, 24, 23, 31, -28, -20, 3, 4, -25, 2, 15, -12, -44, 37, -12, -19, -25, 36, 27, -22, -26, 5, -20, 15, -49, 36, -4, 24, -22, 48, -2, 22, -19, -21, -36, 11, 27, -34, -29, -21, 30, -35, 1, -43, 13, -12, -20, -39, -18, 7, -39, -26, -13, -3, 31, 32, 4, -48, 48, 18, -16, 0, -24, -14, 34, -35, 41, -26, -18, 11, -34, -8, -21, -10, -47, 15, 9, -42, -20, 38, 50, 49, 18, -27, -27, 42, -6, 44, -14, 7, 32, -28, -16, 12, -45, -45, 50, -21, -50, 12, -43, -23, 38, -18, 2, -13, 1, 27, -40, -49, 2, 43, 43, 17, 26, -44, 16, -42, 27, 12, -40, -14, -37, -32, -43, -44, 8, 12, -44, 4, -48, 16, -33, -6, 46, 50, 41, -15, -35, 28, -22, 8, -33, -2, -5, 32, -22, 19, -1, 4, -24, -44, 40, 32, 30, -10, -40, -46, 15, 5, -39, -9, 24, -41, -23, -44, -37, 26, 18, 10, 0, -9, -43, -1, -50, 18, -40, -3, -41, -36, -4, 42, -26, -45, -40, -34, -36, -35, 5, 15, -15, 32, -13, 34, 24, -48, 47, -33, 28, 38, 3, 28, 43, -34, 31, 44, 31, 48, -38, 12, -37, 8, -15, -33, -46, -37, -26, -7, -12, -39, 10, 11, 2, 2, -23, -16, 14, -48, -8, -1, 20, -42, -15, -28, 37, 23, -1, 4, -39, 32, -19, -27, 35, 16, -24, 10, -32, 22, 0, 13, 26, -49, -15, 42, -40, 47, 17, 17, 13, -50, 38, -25, -40, 36, -49, 32, 42, -11, -47, 29, -14, 10, 40, -46, -36, 36, 16, 31, -25, -45, -7, 7, 30, -5, -9, -3, -24, -31, 19, -16, 25, -3, 16, 17, 1, 17, -47, -12, -30, 15, -35, -44, 32, 46, -42, 50, -34, 40, 46, -39, 6, -6, -40, -38, -20, 26, -25, 12, -20, -29, -45, -31, 34, -41, 32, -16, -25, 20, -14, -43, -46, -7, 49, 41, 16, 21, 28, 40, -2, -15, 29, -25, -6, 10, -7, -47, 25, 30, 7, -25, 44, 28, 47, -22, -42, 27, -15, -47, 8, -14, 37, 30, -38, -31, -34, 0, 40, 4, -18, -30, 30, -29, -26, 16, 40, 40, -39, -36, 33, 35, -49, -47, -6, -38, 4, -19, -29, 38, 40, 4, -34, 19, 0, 29, -43, 10, 46, -41, 47, -32, -37, 16, 4, 10, 5, 12, 36, -40, -4, -45, -17, 14, 48, 38, 13, 42, 36, 31, 27, 30, 15, -20, 32, 45, 11, 3, 41, -43, -9, -10, 8, -11, -29, -27, -13, -49, -10, -32, -49, 41, 45, 11, 32, -35, 43, -29, -37, 5, 14, -6, 3, 15, 35, -5, -18, 28, -1, -29, -11, -12, -10, 24, 17, -44, 34, 20, -47, 25, 40, 8, 30, 33, 44, -25, -20, 48, 22, 18, 1, 21, -30, -35, 0, -35, -33, -4, 5, -23, 31, 27, 5, -14, -35, 34, 14, 9, 10, -40, 24, 15, -19, -32, 5, -46, -48, -23, 39, 36, 43, 21, 49, -22, 26, 8, -26, -29, 46, 50, 20, -28, 19, 28, 28, -11, 47, -37, -22, -35, 42, 36, -41, -4, -47, -39, -9, 47, -47, 33, 41, 41, -45, -37, -16, -4, 7, 14, -32, 6, 14, -38, -43, -33, -16, 36, -25, -13, 33, 15, -25, 6, 49, -26, -21, 31, -44, -24, -40, 50, -43, -40, 37, -21, 43, -36, 5, -16, -12, -27, -43, -8, -9, 33, -10, -4, -25, 1, 37, -29, -46, -36, -15, 50, 12, 42, 28, 40, -2, 4, 21, 9, 6, -22, -32, 44, 22, -41, 50, -41, 46, 38, 6, 3, 5, 17, 18, 36, 4, 18, 21, 30, -50, -39, -16, 27, 31, 23, 28, -18, 32, 47, -26, -35, -43, -16, 34, 32, -5, -40, 10, -7, -40, -40, -29, 34, 40, 31, 11, -3, 43, 12, 0, -6, -18, 34, 9, -49, -38, 15, 6, -8, -6, -20, -41, -28, 35, -22, 46, -20, 27, 23, -33, -40, -4, -48, -49, 3, 21, -20, -43, -8, -3, -49, -29, -46, -44, -31, 41, 26, -49, -19, 39, -48, -10, -9, 26, 34, -6, 50, 36, 20, -34, 41, -4, 43, 18, -27, 20, -17, -1, -9, -18, -24, 27, 8, -32, 25, -48, 20, 48, -26, -36, 32, 9, 32, -28, -40, 8, 34, -17, -44, -7, 40, 13, -28, 7, -31, -24, 9, -43, 50, 16, -49, -29, 19, -15, -27, -39, 30, -29, 32, 22, 25, 45, 44, 30, -28, 23, 12, -21, -32, -25, 39, -40, -31, 5, -6, 17, -4, 25, 38, 7, -41, -29, 20, -27, 15, 45, 34, 10, -44, 21, -13, -30, -43, 38, -23, 41, 3, -20, 49, 38, -10, -14, -13, 0, 25, -14, 50, -20, 11, -33, 39, -45, -42, -40, 44, -49, -22, 0, 18, -28, 49, -44, 5, 26, 11, 23, 49, 29, -36, 2, -8, 32, 34, -16, 28, -37, 42, 18, -2, -33, 0, -50, -24, 13, 9, 40, 38, -10, -30, -37, -31, 41, 34, 36, -40, 15, 33, -27, 38, -14, 35, -27, -36, -39, 44, 13, -20, 2, 43, 33, 21, -7, -21, -16, -30, 12, 41, -34, -39, -33, 41, 9, 16, -36, -35, -29, 44, 12, -20, -50, 24, -45, 36, -42, 1, 29, 11, 7, -32, -38, -19, 49, -42, -2, -14, -20, -20, 8, 4, -32, 12, -49, -6, 45, -8, 47, -50, 34, 10, -48, 40, -7, -44, -18, -42, -21, -33, 5, 39, 33, -20, 21, 12, 36, -1, 38, -50, 31, -32, 13, 2, -45, -34, -5, 21, 22, 50, 4, 40, 49, -45, 19, 17, 35, -11, 40, 50, 15, -42, -40, -31, -8, 7, 27, -25, -13, 43, -15, 48, 4, -45, -48, 14, 13, 7, 7, -33, -28, 45, -22, -28, -15, 19, 30, 31, 44, -45, -17, -7, -7, -24, 49, 1, -9, -26, 23, -12, -12, -39, -40, -48, -29, -47, -43, -37, 33, 37, -37, 41, -35, -19, 13, 25, -35, 1, -32, 18, -39, 42, -46, -9, -34, 21, 43, -41, 33, -35, -35, -9, -48, -28, 35, -23, -6, 49, 17, -27, -32, 24, -11, -5, -11, 11, -33, -39, -37, 31, 10, -39, -24, -45, 37, -18, 29, -1, -39, 44, 6, 50, 2, -38, 21, -48, 13, 33, 7, -47, -6, 15, -15, -28, -32, -11, 21, -35, 7, -33, -15, -27, -50, -50, 13, 11, -15, 24, -33, -35, -34, -27, 47, 17, 48, 28, -49, 44, 22, -41, 2, 38, 0, 18, -37, 15, 31, 42, 2, 33, 13, 21, 50, -2, 39, 11, -14, -2, 17, -18, -29, 19, -18, -23, 37, -47, 15, 26, -2, -40, -16, -12, -41, 23, 21, 18, -28, -17, -19, -35, 17, 3, -23, 9, 27, 25, 9, 34, 29, -7, -49, -28, 42, -5, 22, 3, 20, 42, 30, -42, 19, -7, 33, 23, 22, -39, 46, -19, -17, 32, -18, 13, -3, -35, -1, -28, -25, 3, -7, -14, -42, 43, -38, 9, 29, -49, 44, 9, 6, -8, -32, -40, 27, -4, 38, 12, -44, 28, 43, -20, 37, 4, -26, 21, -21, -15, -1, -37, -22, -24, -1, -15, -17, -30, -13, 24, 46, 28, 25, 37, -1, -14, 24, -32, -50, 30, -11, 4, 29, -25, -8, 8, 0, -36, -43, 43, -37, 46, -44, -33, -39, -49, -1, 42, -30, -44, 40, -39, 33, 6, 27, 23, -28, -21, 7, 44, 1, 5, -41, -32, -32, 36, 8, -7, 8, 45, 33, -47, 46, 14, -38, 16, -39, 42, 4, 10, 44, -10, -15, -49, -29, -29, -10, 44, -37, 42, -16, -1, -42, 45, 8, 5, 40, -41, -26, -6, 46, -40, 50, -42, -44, 20, -17, 32, -31, 38, -46, 42, 4, 40, 38, 50, -36, -3, -47, 27, 30, -30, 29, 39, -42, 15, 28, -16, 37, 0, 27, 50, -14, -45, 31, 35, 31, 0, 15, 45, -34, 14, -42, -38, 49, 50, 7, -21, -20, -28, 12, -23, 8, -41, 38, 49, 39, -25, 26, -34, -11, 17, -28, -16, 24, 25, -42, 28, -6, -14, 18, -32, 24, 22, 48, -24, -38, 6, 9, -39, -42, 41, 26, 33, 26, -24, 39, 12, 42, -22, -29, 22, 37, -32, -13, 44, -12, -36, 3, -19, -5, 10, 42, 1, -17, 22, -16, 19, -14, 27, 10, -2, -42, -32, 36, -23, 29, -25, -13, -11, -26, 48, 18, 20, -28, 38, 14, -29, 13, 17, 7, -23, 27, 46, 17, 24, 45, -47, -50, -25, -18, 30, -24, -9, 18, 20, 13, -26, 21, 47, -47, -39, 7, 44, -40, 50, 8, -15, -29, 14, -1, -47, 49, 21, 38, 41, 1, 49, 49, -8, -5, -47, -38, -13, -6, -26, 16, 4, 45, -12, 14, 24, -49, 18, 35, 11, -5, 26, 36, -20, 48, -16, -6, 26, 3, 20, 18, -22, 21, -43, 3, -44, 32, -28, 49, -19}; -static int32_t dotp_B_dram[32768] __attribute__((section(".data"))) = {-71, 9, -93, 81, -35, 31, -17, 87, 19, -48, -2, -27, 42, -1, 28, 49, -86, -79, 77, -53, 16, -28, 19, 78, -84, 5, -18, 3, -10, 78, 64, -52, -42, 37, -71, -16, -80, -67, -28, -3, 77, -25, 74, -16, -17, 33, 77, 8, -38, -89, 68, 58, -99, 43, 28, 31, -54, 92, -49, -54, -2, -51, -56, -59, 83, -30, -44, -68, 55, 13, -57, 13, -45, -57, -5, -28, -67, -87, 95, 56, 24, -22, 44, -18, 36, -74, 76, 64, 55, -51, -46, 31, -3, 46, -64, 31, -64, 78, 59, 72, 11, -89, 68, -45, -21, -87, -47, 90, -36, 15, -43, -5, -80, -97, -28, 26, -55, -89, 27, -71, -7, -41, -1, -30, -20, 92, 41, 10, -57, 7, 1, 53, -10, 8, -85, 9, -94, 59, -12, -6, -85, 4, 21, -12, -39, -71, 98, 39, -34, -55, -58, 82, -56, 87, 98, -21, -69, -93, 12, -39, -81, 45, 0, -95, -17, 7, 56, -97, -30, 70, -17, 61, -1, -30, -68, 42, 19, 67, -8, 32, 77, -2, -35, -47, 73, -21, 38, 23, 76, 50, -46, -96, 91, -66, -8, 18, 96, -47, -98, -95, -14, 9, -45, -99, -19, -7, 65, 83, -96, 73, 38, 92, 37, -60, 15, -57, -11, -68, -45, 39, -99, -100, 92, 20, 24, -68, 2, -65, 48, -17, 63, -75, 74, 28, 65, 41, -11, -55, -59, 34, -46, -45, 17, -25, -38, 51, -18, 100, -2, 31, -59, -5, 9, -31, -73, 25, -9, -61, 78, 56, -59, 17, 96, -96, 0, 68, -40, 82, 55, -60, 10, -92, 56, 65, -39, -47, 79, 3, 25, -67, 64, 76, -59, -87, -68, 17, -3, -9, -1, -14, 44, 23, -69, 0, 95, -62, -7, -91, 51, -1, -43, 96, 0, -37, -82, 0, 16, 35, -30, -61, -88, 0, 23, 54, -19, -13, 4, 29, -85, -87, 27, 44, -41, 97, -84, -56, -63, 23, 3, -37, 20, -95, 87, 11, 1, -52, -80, -78, -25, 84, -37, 56, -74, 33, 48, -30, 6, 68, 32, 42, 48, -43, 31, 96, 34, -66, 63, 20, 42, 29, 19, 84, -96, -30, -15, -6, 59, 99, -60, 69, -26, 92, 67, -18, -63, -59, 64, -45, -30, -46, 81, -79, -74, 4, 74, -63, 11, -62, 42, 18, 93, 88, -41, 35, -57, -58, 33, 54, 72, -78, 21, 40, 95, -17, 5, -37, 52, 24, -49, -53, -40, -84, -61, -26, -12, -32, -16, -75, 83, -61, -5, 95, 16, 35, -28, -56, -84, 68, -24, 36, 97, -10, 5, 0, 2, -77, -28, 20, 5, 38, -66, 56, 35, -84, 98, 39, -8, 8, -51, 13, -77, -64, -90, -2, 86, -46, -74, -34, 87, -99, -33, 45, 47, -38, -29, 29, -18, -59, 55, 56, 96, 6, -73, 87, 4, 11, 32, -86, 9, -28, 59, 79, -11, -64, 42, 68, -97, 80, -17, 54, 48, -41, -15, 91, -30, 74, 81, -70, -84, 77, -94, 25, -18, -73, -91, -74, 40, 93, 87, 26, -58, -32, -38, -31, -2, 92, 94, 81, 63, -30, -8, 42, 45, 31, -90, 33, 21, 78, 85, 87, -83, -34, 44, -4, -67, 57, 46, 36, 67, -57, -6, 86, -10, 10, 52, -30, -48, 75, -30, -48, 7, 76, 70, -82, -35, 61, 100, 81, -100, 5, -46, -86, 26, -86, 20, 50, -35, 73, 13, 36, 93, 93, 45, 44, -29, -3, 61, 96, 91, -57, 56, 89, -85, -23, -49, -99, -40, 31, 25, -49, -60, 79, -70, 53, 54, 20, -50, -6, 75, -90, 35, -89, -2, -56, -67, -29, 74, -80, -60, -79, -80, 55, 94, -30, -87, -22, -28, -49, 70, 98, -25, -82, -74, 45, -88, 6, 28, -16, 61, 40, 8, 14, -50, -100, 20, 55, 22, -69, 99, 82, 53, 41, -8, -33, -38, -19, 41, 54, -60, -98, -7, -42, 50, -83, 3, -27, 19, -25, 68, -93, 59, -20, 68, 72, 0, -92, -11, -53, 14, 51, -14, -6, 71, 85, 93, 13, -83, -72, -99, -23, -33, -3, 16, 9, 66, 100, -60, 98, 14, -20, 21, -14, -79, -52, 55, -85, -33, 89, 63, -79, 38, -16, 20, -21, 69, -46, 100, -66, 84, -67, -28, -24, 97, 31, 73, 24, -90, -40, 21, -66, -32, -44, 38, -89, 24, -58, 46, -24, -33, -42, -99, 35, 49, -80, 56, 0, -15, 21, -26, -26, -18, 64, -23, 56, 64, -80, 19, -89, 75, -18, 74, 12, -86, 94, 12, 40, 86, 100, 23, 40, 14, 99, 46, 84, -69, -2, -14, 48, 11, 41, -77, -52, -69, -26, 8, -90, 87, -33, 88, -11, 9, 32, 63, 91, -69, -30, -27, 93, 37, -2, -80, -61, -59, -29, -55, -19, -28, 17, -60, -7, 31, -2, 41, 41, -48, 27, -72, -78, -16, 58, -5, -30, 88, 50, -93, -25, -1, -85, 53, 56, -8, -95, -64, 60, -6, 73, -40, 68, -83, 10, -6, -85, 3, 78, 64, -87, 2, -33, -71, -41, -48, 63, 57, -37, -87, -78, 75, 55, 21, -94, 69, -91, 95, 71, 1, -88, 60, 59, 26, -53, -96, -40, 21, -11, 2, -11, -98, -77, 16, -3, 61, -17, 18, -59, 47, -60, -19, 1, 47, -95, 21, 84, 69, -76, -60, 68, -98, 7, 70, 73, -44, -18, -27, 78, 32, -15, 100, -4, -86, -13, -7, 25, -1, -62, 97, -22, 65, -62, -49, 30, 56, 25, 58, -35, -56, 100, -79, -18, 37, 48, -84, -34, -94, 0, -65, -34, -24, 57, -14, 98, 56, -29, 60, -42, -81, 56, 80, 28, 61, 71, 8, -87, 64, 62, 86, -77, 92, 9, 33, 95, -63, 28, -60, -70, -65, 100, 4, 81, 8, -70, 56, 12, 30, 85, -40, -95, -81, 10, -40, 73, 40, -78, -22, -70, -97, 17, -35, 43, 14, -70, 75, 22, -58, -97, 89, -53, 55, 43, -12, 25, -24, 96, 57, -36, -32, -87, -26, 61, 83, -72, -22, 52, -7, -35, 14, -61, 42, -69, -81, -48, 94, -52, 94, -12, -19, -100, 66, -40, 82, 96, 29, -7, -84, 56, 16, 5, 31, 100, 91, -16, -58, -25, 39, -51, 95, -40, 100, 3, -50, -24, -3, -18, -23, -96, 55, 37, -13, 79, -84, -36, 23, -80, 81, 10, 76, 6, -79, -32, 91, -65, 48, 83, -28, -10, 75, 25, 45, -2, -86, -57, 72, -4, -65, 67, 78, -71, -75, -16, 0, 20, -70, 83, 88, -84, -3, 25, -77, 21, 31, 36, 29, 62, 22, -63, 72, 42, 69, 30, 58, 79, 68, -44, -59, -48, 18, 20, -45, -14, -25, 99, 80, -16, -16, 59, -20, 81, 64, -93, -90, 81, 87, 37, 97, 14, -20, -14, -59, -64, -9, 85, -16, -42, 51, 55, -64, -80, 60, 29, -18, 55, 42, -100, 6, -73, -51, -66, 55, 36, 51, 90, 31, 83, -60, -34, -53, -15, -43, -62, -76, -41, 16, -15, 13, 74, 88, -17, 54, 23, 10, -59, -49, -53, -69, 51, 30, 17, 54, 100, 67, -78, 34, 26, -64, -94, -24, -19, -6, -79, -23, -19, 44, -82, -6, -62, 16, -65, -86, 90, 56, -41, 83, 67, 43, 60, -12, -85, 57, -3, 93, 3, -57, 65, -50, 87, -83, -96, 67, -95, -25, 14, -89, -89, -28, 5, 49, -52, 77, -97, 77, -98, 43, -87, -37, 19, 68, -33, -42, 29, 18, -91, -26, -11, 0, 53, 31, -73, 29, -35, 43, 23, -44, 50, 50, -80, 2, 52, -43, -64, 76, 42, 55, 94, 31, -54, 77, 87, 89, 94, 2, -29, 70, -12, -43, 4, 79, -32, -55, 52, -76, 20, -66, 88, -86, 5, 27, -27, -13, 62, -72, -63, 96, -77, -82, 73, -52, -57, 100, 53, 52, -66, 63, 41, -45, 33, -69, -75, 42, 76, -45, -64, 24, -48, 85, 0, -23, -65, 0, -90, -74, -99, -79, -35, 11, -84, 31, -87, -94, -22, 43, 3, 93, 46, -100, -70, 27, 31, -10, -43, -45, 80, -58, -27, -52, 11, 7, -41, -7, 43, -28, -2, 87, 13, 74, -86, -38, -73, 47, 90, 60, -65, 24, 40, -39, 95, 50, 99, -88, -13, -61, 57, 23, -76, 100, 53, -77, -4, -62, 8, -40, 76, 68, 97, -81, 71, -85, 48, -86, 66, -59, 88, -97, 51, 30, 13, 28, 40, -47, -19, -61, 26, 38, -59, -8, -97, -76, -1, 63, 91, 24, 71, -61, -9, 72, 35, -16, -66, 71, 45, -54, 52, 68, -96, 91, 89, 24, 10, -29, -14, -98, 64, -8, -60, 47, 94, -14, 67, -16, 35, 32, -76, -62, 64, 24, 4, -96, 35, -97, 68, -41, -47, 49, -23, -82, -2, -33, -68, 49, 92, 38, -85, 95, 26, -8, -57, -92, 99, -23, -22, 89, -15, -86, -95, -100, -81, 63, 29, -31, -99, 30, -94, -17, 91, 68, -47, -60, 14, 32, 1, -19, -38, -100, -76, 73, 42, 96, 44, 48, 80, -46, 6, 37, 84, -36, -64, 11, -94, -25, -61, 77, -100, 47, 7, 58, -33, -89, 49, 28, 25, -100, 30, 16, 48, -88, 88, 40, 4, 60, 33, -76, 50, -13, 0, -75, 31, 1, 62, -1, -76, 47, -100, -7, -33, -78, 5, 49, -6, -39, 28, 86, -33, 46, -71, 28, -53, -82, 26, 79, 49, -51, 93, 33, 91, 48, 46, 64, -38, 56, 87, 61, 28, -53, -12, 26, 48, 61, 53, -65, 50, -20, -54, 71, 47, -74, 88, 64, -49, -26, -9, -39, -35, 51, -21, 39, 43, 63, 29, 89, -37, -72, -14, -5, -70, -18, 42, 82, -68, 79, -1, 47, -28, 65, 30, 81, 93, -83, 25, -94, 62, 23, 13, -17, -17, -18, 4, 1, -8, -41, 1, -77, 8, 66, 39, -7, 80, -37, -97, -7, 32, -85, -74, 31, -29, -53, 35, -20, 73, -57, 94, -49, -67, 89, -80, -77, -57, 13, 68, 56, 2, 33, -45, -87, 77, 0, 79, -100, -89, 14, 5, 51, -64, 97, -98, 54, -48, -1, -84, 12, 9, 42, 66, -97, 44, 38, -89, -69, 54, 71, -58, 76, 3, -8, 100, -58, 30, 56, -16, -66, 16, 75, 66, 51, -81, 42, -16, 16, 5, 45, 87, 4, -8, -60, -1, -32, 5, 38, 83, 45, 39, 43, -74, -1, 44, -16, 18, -70, 8, 62, -74, -14, 59, -84, -90, 28, -19, -52, -60, -81, -30, -64, 25, 43, -62, 8, 72, -37, 74, -78, -69, 76, 22, -82, 5, -34, 66, -12, -41, -90, -52, 42, 27, -40, 70, 42, 100, -96, -72, 89, 87, -32, 49, -88, 77, 15, 74, 9, 56, -21, -1, -84, 47, 13, -95, -79, 36, 59, -13, -68, -31, -52, 3, 57, 1, 43, 92, 5, -19, -15, -87, 83, 64, -52, -51, 63, 79, -78, -35, 98, 72, 14, -73, -81, 76, 84, 20, -4, 86, 18, 8, -75, 46, 5, 40, -39, 25, 41, 100, 38, -34, -89, -66, 9, 66, 59, -87, 92, 54, 0, -41, -58, 92, -46, 8, -8, 62, -6, 59, 46, -6, 66, 47, -73, -98, 59, -15, 7, 85, 81, 69, 16, 7, -86, -39, -70, 88, -75, 96, 84, 47, -35, 48, 14, -41, -38, 78, 0, 66, -1, 38, 18, -44, 30, -64, 10, 52, 48, 11, 69, -100, -78, 6, 12, 51, 74, -12, 34, -63, -54, 2, 62, -39, -28, -98, 1, 47, 4, -57, 59, -1, -75, -53, -96, -42, -40, -52, 57, 44, -31, 85, 90, 88, 90, -86, -100, 40, 75, 27, 61, 24, 57, -82, 18, -37, -35, -44, -57, -89, 21, 67, -77, 38, 93, -100, 85, -73, -33, 4, -7, 23, 86, 98, 23, -79, 56, -12, 96, -56, 97, 23, 44, -22, -62, 67, -73, 29, 54, 48, -14, 34, 88, -49, 75, 25, 46, -28, 39, -7, 98, -99, -84, 24, 30, -80, -23, -22, -50, 5, 4, -91, 15, -46, -65, -50, -27, -84, -40, -10, 40, 92, -6, -21, 2, -53, -15, -31, -54, -91, 84, -21, -88, 88, -43, -17, -33, -17, -15, 56, 43, -38, 74, -58, 50, 57, 84, -71, -34, 83, -77, 0, 5, 0, -93, 71, -5, 61, -66, -5, -51, 44, -99, 81, -57, 1, 76, 29, -29, 9, 97, 36, 28, 96, 2, 36, 41, -74, 36, 63, -8, -1, 30, 16, 50, 21, 9, -28, -71, -82, 1, -34, -51, -53, -98, -35, 54, 5, 10, -61, 24, -83, 54, 38, 66, -82, -12, 34, -44, 29, -63, 32, -19, -65, 95, -13, 18, -16, 84, 47, 32, -77, -71, -73, 80, 78, 8, 34, 69, -66, 18, -67, 2, 100, 16, -25, -47, -72, 37, -74, -88, -59, 64, 88, -80, 30, 35, -31, 44, -91, 40, 5, -89, 93, 27, 50, 92, 27, 79, -40, -75, -86, -79, -12, -36, 53, -80, 51, -85, 59, -85, -59, 59, 77, -60, 7, 24, 51, -88, -22, 37, -59, 68, 20, 30, 82, -85, -57, 57, 20, 64, 87, -77, -75, -43, -92, 25, 88, -82, -73, 34, -56, 27, -7, 90, 64, -85, -96, 56, -49, 50, -95, 63, 84, 60, -52, 68, -21, 82, -3, 6, 53, -64, 15, -84, -69, 55, -76, 74, -79, -40, 25, -57, 1, -81, 8, 77, -13, 74, -54, 99, -50, 82, -62, -87, 96, 74, -80, 42, -1, -4, -100, 8, -19, 37, 50, -83, -43, 25, -28, 9, -49, -55, 6, -88, -5, -84, -34, -40, -36, 80, 32, 59, -12, 72, -45, -96, 0, -14, 61, -40, 89, -32, -38, -57, -73, 97, -88, 70, -71, 53, -38, -28, -44, -37, 76, -49, -38, 40, -8, 6, 8, -13, -56, 7, -55, -24, 68, -55, 28, 100, 95, -9, -89, -13, -28, 62, 1, -2, 60, -43, 27, 16, -66, 73, -17, -35, 71, -75, -59, -24, -71, 15, 59, -65, -82, -79, -36, -44, -90, -75, 75, -82, -18, 39, -34, -45, -83, 12, -96, 11, 51, 14, 65, -34, -31, -49, 26, 66, 86, 53, -36, -21, 75, 12, 10, -48, 36, 32, 15, -29, 88, -80, 2, 6, -38, 47, 85, 72, 49, -24, -26, 90, 57, -38, 71, -34, 85, 92, -65, 33, -64, -8, -26, 82, 86, 65, 14, 52, -24, 60, -88, -63, 85, 47, -84, 22, 13, 51, -75, 67, -69, 64, -15, -3, -10, 20, 87, -44, 6, 85, 94, -79, 85, 11, -16, -21, -28, -24, -27, 26, 76, 20, -16, 76, 69, 67, 98, 73, 49, -19, -80, 78, 41, -27, -92, 45, -88, -84, 25, -14, 52, 81, -85, -77, -26, 50, 68, 2, -15, 60, 4, -59, 75, -83, 90, -23, -9, -90, 51, 88, 91, 63, 25, -4, -48, -18, -54, -49, -44, -26, 50, -42, -32, 83, -15, 69, 45, -30, -68, -98, -73, -100, 25, 90, 12, -54, -64, -15, -53, 7, -82, 41, 94, -18, -36, -75, 37, -2, -24, -31, -58, -31, 99, -42, -98, 32, -16, -6, -23, 0, -18, 64, -17, 79, 93, 20, 90, 34, -48, 13, -95, 34, 71, -83, -47, 26, 56, -76, -38, 95, 14, 40, 59, 54, -50, 61, -73, -28, -29, -16, 9, -71, -92, 40, -19, -37, -63, 18, -79, 58, -2, 69, 89, 5, -37, -92, 25, -6, 71, 90, 67, -13, 68, 12, -29, -51, 47, -20, 97, 69, -68, -38, 84, 92, 4, 79, -2, -95, 34, -92, 0, -40, 61, 62, -2, 47, -43, -41, 81, -66, -54, -55, -14, -97, -91, 6, -26, -61, 26, 82, 18, -28, -61, -5, -78, 42, 14, 15, 32, 67, 45, -80, -98, -55, -11, -22, 26, -48, 47, 86, -80, -11, 12, -50, 52, -33, 15, 37, 94, -18, -6, 36, -72, 64, 9, -30, -63, 26, -29, -42, 84, 87, -73, 55, -55, -30, 94, 82, -63, 16, 7, 45, -6, -38, 2, -96, 71, 56, 6, 41, -43, 71, 45, -94, -14, -4, 89, -56, -85, -37, -64, 52, -92, 82, 55, 36, 39, 45, -11, 83, -27, 85, 24, -50, -69, -13, 75, 35, 57, -75, 51, 54, 66, -35, 78, -28, -51, -56, -14, -68, -82, 40, 12, -79, 47, -4, -96, 25, -23, 59, -71, -10, 53, -19, -13, 31, 4, -34, 17, 70, -71, 10, 43, 98, -62, -15, -60, -70, 76, 40, 68, 55, 26, -37, 16, -82, 10, 13, 99, -76, 65, 20, -2, -11, -98, 29, -96, 88, -81, -63, 0, 27, 1, -65, 73, -2, 12, -64, -47, 48, 48, -9, -31, -17, 87, 63, -90, -13, -14, -70, 0, 64, -41, -40, -34, 56, 94, -22, -30, -34, 27, 10, -85, -56, -67, -57, 16, 24, 2, 19, 69, -66, 25, -26, -17, 57, -48, -43, 55, 42, 65, -51, 40, 10, 62, 10, 51, 19, -36, 5, -10, 45, 85, -75, 56, -29, -57, -11, 32, 60, 23, -96, 26, 12, 10, 63, -24, -88, 52, -43, 29, -13, -65, -76, -67, 39, -82, 13, 5, -64, 6, 28, -41, -34, 76, -22, 73, 10, -53, 95, 46, -13, -61, 33, -5, 90, 62, 99, -40, -96, -64, 38, 5, -2, 67, 92, -93, -14, -17, -90, -30, 85, -7, 22, 75, 40, 5, 87, -52, 94, -94, 0, 52, 50, -50, 74, -96, -88, -59, 24, 32, 50, -39, 28, -27, 13, -47, 99, 15, 30, -18, 91, 78, 29, -52, -70, -27, 16, -98, 23, 62, -16, 63, -37, 59, -83, -67, -45, -34, 80, 94, -10, 93, 91, -34, 9, 66, 65, -61, 46, 32, 96, 41, -10, -52, -37, 11, -1, 84, 3, 62, -96, 18, -13, 66, 26, -77, 67, 6, -51, -43, -100, 70, 66, 37, -99, -38, -85, -64, -85, -14, -11, -21, -74, 90, 10, -37, -4, 59, 36, -90, -31, 57, 42, 86, -53, -7, -25, -41, -33, -44, -37, 81, -21, -14, 81, 86, 66, 19, 42, -22, 55, -65, -47, 44, -1, -15, -79, -26, -65, -72, 82, 69, 59, 41, -83, -63, 0, -67, 20, 72, -14, 59, 9, -34, 90, 82, -58, 22, -79, -14, 95, -24, 24, -5, 21, 56, -61, 3, 72, 18, 37, 72, 19, -84, 1, 29, 44, 7, -11, 18, 65, 64, -38, -96, -76, -28, 23, -79, -8, 90, -66, -46, 27, -81, -96, 66, -38, -69, 90, -27, 67, 44, 0, -22, 100, 59, -78, 87, -45, 36, 5, -32, 89, 91, -79, -69, 74, -99, 22, -16, 79, -87, -64, -74, 51, -37, -31, 53, 81, -86, -72, -27, -73, -42, -28, 48, -91, 31, -39, 31, 26, -95, -21, -29, -85, -63, 76, 88, -36, 25, -18, 77, -84, 12, 55, 71, 39, -31, -30, 99, 30, -52, -80, 35, -37, 86, 57, -69, -81, -85, 52, -41, 72, 36, 78, 2, -40, 67, 3, -40, 94, -25, -86, 80, 31, 50, 54, 2, 64, 70, 64, 56, 56, 76, -26, 78, 77, -73, -27, 32, 24, -45, -37, 26, 20, -12, -84, -4, -46, 36, 95, 100, 9, -85, 43, -88, -23, -16, -28, 90, 18, 68, 80, -33, -27, -2, 16, 36, 78, 75, 76, 45, 37, 14, -47, -22, -86, 38, 67, 17, 11, 5, 4, -54, 17, 25, 47, -3, 49, -53, -19, -85, 32, 92, -27, -80, -40, 82, -77, -78, -14, 38, 74, -99, 97, -48, 38, -86, 100, 39, 21, 22, 63, -9, -78, 54, -13, 41, 81, -2, -74, -80, -52, 89, 99, -57, -57, 27, 88, 69, -78, 100, 28, 24, -65, -46, 9, -85, -12, -83, -63, 94, -81, -82, -88, -84, -71, -58, -53, -58, -8, 13, -35, 18, -48, -29, -23, 61, -27, -29, 98, -88, 83, -42, -69, -18, 19, -47, -99, 17, -64, -4, 2, 13, 60, -100, 27, 2, 55, 44, -44, -31, 79, -57, 74, 40, -25, 57, -16, -35, -48, -83, -73, 31, -59, 25, 16, 33, 1, 36, 47, -63, 95, -51, -41, 40, 18, -2, -7, 69, -33, 52, 58, 39, -37, -22, 88, -48, -75, 88, 37, 39, 49, 80, -80, 62, -30, -19, 54, -41, -2, -54, 93, 42, -77, -91, 19, 51, -13, 3, 23, 84, -67, -60, 67, -90, -100, 57, 70, -19, -75, -48, 24, 74, -92, -92, 28, 98, 71, -42, 83, 5, 78, 24, -85, -63, 38, 52, -42, -72, 67, -93, -3, 33, 72, 8, 80, 7, 48, -44, -25, 12, -95, 90, 23, 33, -48, 31, -92, -32, -27, 10, 99, -14, -97, 85, -64, -30, -95, -50, -2, 77, -5, 41, -90, -91, 88, -88, 20, 61, -41, 78, -96, 59, -89, 79, 40, -16, 81, 16, 21, 81, -60, -53, -50, 74, 77, 17, -5, -25, -55, -1, -63, -9, 40, 49, 29, -8, -24, -88, -44, 61, 46, 36, 15, -6, 60, 54, 72, 29, -22, -44, -6, -44, 43, 6, -22, 33, -87, -74, -63, 46, 64, 26, -97, -43, 36, 12, 67, 42, -97, -49, 45, 80, 86, -2, 81, 68, 87, -8, 16, -97, -16, 66, -94, 24, 50, -16, -38, 92, 22, 68, -12, -6, 18, -57, 1, -56, 96, 16, -50, -36, -47, 83, -29, 19, 67, 85, 42, -82, -91, -85, 70, 58, 7, -85, -21, -73, 89, 47, 62, 86, -92, 3, 37, -56, 8, 42, -71, -53, 67, -10, -10, -27, -57, 73, 33, 16, -77, 100, -94, -95, 17, 60, -16, 9, 65, 71, 44, -70, 64, 38, 32, -37, -25, 30, -45, -38, 4, -63, -47, 29, -99, 39, -61, -99, 4, 24, -21, 84, -54, 63, 31, 51, -10, 0, 89, 29, -86, -52, 11, -66, 15, -7, 74, -77, -41, -24, -53, 50, 39, -60, 56, 97, 78, 27, 50, -70, 48, -77, 99, -92, 49, 31, -24, 30, 19, 55, -11, 16, 9, 20, -3, -86, 35, 75, -49, -46, -64, 31, -46, -89, 46, 84, -64, -94, -46, -73, -64, 88, -26, 13, 66, 5, 50, 79, 9, -17, -90, -35, -88, 68, 76, -86, -45, 81, 58, 88, 85, 87, -48, -40, 27, -59, -72, 54, -57, 32, 79, 12, 5, 80, 79, -63, 71, 80, 14, 29, 8, 81, -17, 62, -55, 99, -9, 4, 82, -29, 38, -72, 96, 90, -54, 10, -94, 16, -37, -19, -37, -9, -89, -89, -65, -72, 38, 80, 97, -16, -27, -54, 60, -20, 94, 20, -58, 45, -27, -48, -62, 6, 99, 61, -64, 68, -4, -52, 27, -91, -61, 45, 52, 5, -60, 63, -99, 76, 94, -48, 46, -75, -47, -50, 52, 13, -84, 19, 88, -55, -46, -51, -26, -90, 39, 67, -53, 20, -45, -93, -87, 13, 83, -47, -84, 72, 32, 30, -92, 21, 13, -81, -18, -80, -68, 32, 51, 90, -75, 7, -12, -9, -68, -83, -83, 65, -68, -74, -52, 77, 42, 7, 79, -33, -2, -82, -76, 3, -25, -25, 5, 52, -68, 87, -64, -9, 23, -58, 25, -92, -87, 30, -32, 83, -75, 26, -48, -60, -19, 1, -80, 20, -62, 50, 85, -32, -26, 56, -39, 80, -56, -74, 15, 61, 41, -60, 5, -27, -41, -59, 21, 78, -90, 62, 46, 17, -36, 88, -54, -87, -34, 79, 8, 59, -91, 23, -84, 67, 95, 90, 42, -4, 66, -44, 37, -30, -4, -84, -25, -84, 10, 19, 43, 18, -23, -98, 7, -50, 13, -7, 73, 15, 82, 4, -2, 53, -25, 58, -20, -29, 46, 95, 42, 10, -43, -23, 57, -53, -45, -59, -77, 9, -49, 70, -67, 87, -98, -33, 38, 40, -51, -19, -82, -57, 60, 65, -98, 12, -36, 62, 63, 65, -62, 52, -37, 3, -88, -33, -31, -26, -100, 99, 81, -3, 3, 15, 36, 63, 12, 2, -64, 5, 86, 7, -80, 47, 28, 86, -73, 98, 83, 7, -92, 92, 63, 61, -69, -35, -1, 52, 78, 90, 72, 53, -80, -19, 78, -77, 10, -9, -89, 38, 54, -78, 60, -9, 65, 82, 97, 69, 22, 56, -67, 24, -44, -98, -95, -53, 1, 91, 19, -88, -65, -31, -68, 4, -44, -46, 6, 40, -50, -9, -48, -65, 32, 18, -76, -20, -64, -82, -66, 6, 61, -47, 73, -95, 28, 98, -67, -45, -4, -75, 69, -10, -63, 53, -42, 26, -77, 10, -80, -41, -11, 47, -95, 94, -91, 39, -4, 49, 89, 88, -21, -84, 37, 39, -18, -61, 50, 67, -27, -27, -51, -91, 2, -7, 31, 28, -58, -18, 32, 3, -67, 93, -77, 41, -60, 69, -88, 56, 92, 73, 61, 90, 31, -73, -18, 28, 63, 6, -88, 13, 5, -96, -4, -87, -21, 19, 59, 77, 54, -66, -98, -97, 34, 30, -20, 10, -42, -27, 28, 55, -42, 17, 80, 37, 98, 2, 30, 34, -92, -2, 96, 40, 67, 13, -39, -39, -91, -14, -90, -39, -24, 3, -45, 9, -52, -85, -28, 15, -8, 36, -68, -13, 62, -62, 13, -24, -14, 52, 13, -45, 75, 37, -60, 3, -2, -42, 55, 21, 19, -60, -35, 78, -39, 57, -61, -61, 96, 1, 89, -86, 23, 30, -77, 68, 90, -53, 88, -53, -54, 83, 4, 12, -93, -83, 7, -17, 50, 96, -36, 8, -55, -35, -21, 96, 49, 92, 39, 46, 49, 82, 5, 25, 89, 78, 75, 44, -88, -73, 22, -34, -96, -1, 87, 42, -20, -57, 18, -55, 56, -33, 27, -52, 70, 1, 95, -24, -81, 10, 45, 91, 76, 14, 69, -89, -22, 18, -65, -93, -73, 15, -15, 87, -52, 65, -21, 85, -96, -55, -3, 1, -99, -76, -100, 96, 67, -33, -32, 96, -85, 81, 90, -83, 6, -84, 24, -19, -97, 14, -6, -6, 36, -70, 32, -85, -59, 68, -71, -75, 76, -70, -51, 42, -49, 65, -63, 87, -81, -2, -57, 10, -12, -38, 17, 77, 49, -29, -47, 36, 42, -53, 47, 62, 0, 94, -41, -3, 61, -1, -2, -28, 18, 81, 27, 39, -13, 4, -82, -21, -75, 50, 20, -68, 5, 84, -71, 50, 25, -65, 24, 23, 70, 93, 80, 17, 22, 87, -64, -40, -5, 19, 80, -89, 21, -66, -34, -63, -77, -20, 67, 92, 84, -29, -22, 13, -56, 99, 24, -5, -88, 9, -95, -4, -30, -54, -8, 0, -57, -69, -98, 81, -17, 65, -97, 44, 64, -13, 5, 4, -65, -43, 68, -93, 94, 57, -15, 79, -4, 52, 79, -42, -71, 0, -34, 31, -8, 84, -38, -69, -14, -50, -38, -21, -14, 9, 0, 28, -82, 0, 62, 90, -7, -20, 2, 12, 53, -88, 17, -15, -78, 6, 62, -89, 36, -23, -34, 7, -57, 88, 48, -94, 27, -4, -90, 72, 59, 5, -18, -65, 17, 64, -60, -9, -52, 42, 40, -48, 6, -68, 99, 18, -69, 17, 75, 95, 84, -39, -19, 29, -24, -85, 22, -93, 46, 59, -34, 14, 12, -69, 4, -76, -48, -20, -76, -68, -70, -65, -14, 22, 76, -57, -53, 57, -88, 70, 43, -10, 53, 74, 64, 30, 53, 42, -35, -73, 24, 65, 71, 80, -21, 31, -29, -57, 18, -55, -17, -75, -5, -88, 24, -32, 71, 80, -50, -88, 68, 38, 64, -41, -69, 72, -83, -8, 47, -57, 63, 96, -64, 60, 26, -82, 78, -69, 5, -79, 21, 28, -47, 47, -43, 62, -31, 97, 88, -38, 88, 84, -98, -2, -56, 42, -84, 42, -96, 73, -90, 91, -9, 41, -62, 94, 82, -59, -7, -96, -49, 49, -57, 14, 86, 52, 26, 15, 48, 91, -33, -54, 26, -66, -94, 83, 15, -49, 9, -55, 36, 85, -78, 30, 26, 88, -92, -48, 95, 76, 97, -53, 22, -19, 8, -94, -2, -70, 1, -45, -2, 88, -96, -71, -79, 44, 37, 98, 95, 69, -74, 26, 34, -78, -26, 16, 35, -93, 0, -96, 98, -15, 29, 78, 93, -89, -54, 82, -75, 1, 19, 72, 89, -31, -99, -75, -87, -19, 1, 84, -69, -39, 14, -71, 40, 67, -70, -64, 72, 1, 27, -15, -42, -73, 21, -40, 46, 70, 86, -85, -32, -57, 12, 93, 37, 74, -82, -17, -8, 78, 40, 90, 43, 80, 62, -1, 86, -62, -34, -28, 88, -51, -48, -55, -49, 23, 56, -96, 94, -27, -6, -26, 67, 99, 15, 29, -33, 89, -21, 85, 4, -32, 85, 62, 41, 42, 33, -85, -14, 23, 73, 90, 39, -60, 18, -82, -25, 8, 18, 12, -99, -81, 18, -6, 36, -80, -93, 66, 64, -72, -66, -63, -11, 62, -33, 30, 8, 10, -89, -69, 74, -38, 53, -58, 6, 71, -63, -72, -46, -49, 14, -82, -66, -53, 9, 87, -70, -98, 62, -13, -49, -30, -50, -45, -2, -80, 28, 7, -48, -95, -19, 89, -22, -54, -5, 5, 77, -19, -70, 91, 56, 42, -43, -78, 65, -60, -86, -14, -98, -100, -26, 38, 87, 92, -25, -97, -76, 99, 70, -7, 67, -5, 7, -2, -6, -1, -10, -57, 99, 86, 27, -78, 89, -78, 85, -46, 60, -24, -38, 2, -41, 88, -21, 88, -6, -32, 13, 3, 7, -12, -80, 30, 75, -91, -14, 69, 93, -10, 73, 36, 22, 76, -97, 87, -11, -5, -72, -15, -54, -24, -14, 90, -70, -50, 68, -65, 67, -6, 87, -86, -23, 57, 57, 54, -61, -56, 74, -11, -45, -47, -16, -92, 17, -36, 7, 97, 28, 40, -63, 72, 4, -61, 42, 77, 29, 80, 53, 93, -26, -68, -16, -42, -6, -75, 2, -80, 76, -21, -30, 98, -35, -64, -87, 99, 7, 34, 65, 72, 49, 71, -20, -21, 2, -66, 1, 87, 30, 17, 94, 99, -6, -46, -92, -32, -73, 42, 12, -70, -42, -19, -47, 95, 74, -59, -78, 8, -15, -36, -12, -47, 17, 4, -90, -38, -79, 81, 16, 63, -43, -81, 43, 83, -8, -51, -11, 3, 93, 26, 12, -27, -88, -86, -28, -74, 35, 97, 77, -13, 94, 53, -65, 48, -49, 38, -93, -44, 9, 73, 29, -37, 79, 92, -90, 33, -5, -25, -37, 0, -8, 82, -57, 41, -18, 32, -2, -76, 77, 1, -28, 21, -30, 16, -19, 29, 15, -91, 29, -41, -56, 35, 85, 18, -94, -29, -80, -4, -54, -100, 39, 75, 27, -7, 31, -67, -14, -69, -98, -33, -44, 13, 51, -68, 30, 31, -71, -31, -52, -71, 99, -19, 43, 80, 33, -77, 14, -9, 55, -80, -93, -65, 23, -92, -61, 78, 28, 90, 16, -33, 53, 67, -98, 7, 21, -92, 59, 94, -97, -95, -28, -75, 29, 93, 13, -16, -15, 30, -66, 13, -42, -63, -68, 20, 42, -1, 41, 93, -56, -53, 71, 17, 64, -72, -17, 61, 86, 12, 16, -58, 60, -82, -93, 58, -90, -93, 52, 12, 47, -63, 34, 16, 66, -27, -29, 5, 17, -81, -90, 43, -59, -11, -49, 64, -49, 36, 62, 94, -6, 34, -99, -76, -25, -7, -7, -60, 79, -14, -20, 92, 23, -24, -63, 94, -59, 98, 81, 94, -23, -37, 31, 58, 24, 40, -74, -42, -36, 91, -76, -64, 100, 23, -30, 41, -7, 51, -34, 75, 2, -10, 92, 65, -11, -31, -42, -89, 81, -50, 65, 73, -91, -92, -14, -7, -49, 78, -79, -28, -18, -29, 17, -33, -96, -18, 20, 56, -95, -32, -43, -58, 96, -29, -10, -64, -43, 26, -64, 53, 69, -85, 49, 9, 50, 74, 94, 30, -89, -78, 10, 38, -49, 77, 84, 91, 26, 73, -72, 20, 97, 73, 43, 78, 0, -90, 38, 90, 80, -12, -43, -82, 59, -51, 21, -29, -46, 68, -2, -31, 48, 16, -75, 28, 54, 77, 13, 93, -36, -91, -6, 20, 25, -64, -32, -60, 73, -56, 22, 25, -74, 92, -17, 35, 94, -52, -5, 20, 13, -87, -39, -58, 54, -5, -74, -33, 26, -53, -34, -76, 91, 18, 51, -92, 35, -6, -42, -84, 70, -6, 95, 31, 0, 35, -59, -52, -95, -28, 69, 99, -69, 42, -19, -32, 13, -74, -35, 86, 55, 51, -50, 48, 58, -26, -51, -9, 11, 67, -33, 5, 43, -25, -15, 6, 90, -45, -21, -77, -73, 20, -8, -16, 11, 21, -12, -70, 42, 10, -59, 1, -51, 23, 32, 75, -88, -69, 94, -22, -10, 57, -95, -76, 55, 89, 49, -33, 42, -75, 90, -83, -28, 90, -39, -33, -53, 77, -38, 96, 33, 85, -50, -89, 74, 25, -92, -94, 56, 78, 82, 86, 83, 49, 45, -43, -61, -12, -70, 83, 62, -75, 95, 5, -17, 61, -25, 43, 22, -59, 32, -40, -57, -66, 7, -10, 27, -100, -58, -69, 2, 90, -68, -6, 8, -35, -71, -91, -78, -4, -62, 72, 22, 56, 57, 61, 79, 2, -79, -96, 38, 59, 51, 38, 38, 44, 59, -18, 54, -69, -40, -76, -37, 91, 55, 67, -10, 41, -59, -62, -99, -20, -100, 8, 59, 24, -37, 58, 85, -19, -23, 10, 41, 96, -85, 96, -47, 40, 23, -21, -22, 58, 96, 48, 26, 57, -78, -63, 56, -24, -69, 11, 89, 5, -10, -3, -56, -52, 60, -97, 45, 97, -37, 55, 7, 20, 85, -11, -45, -81, -24, 61, -14, 37, 14, -7, 49, 32, 71, 13, -92, -58, -97, 69, -36, -3, 68, 91, -46, 45, 43, -14, 73, 63, -11, 93, -57, -96, -72, 25, -97, -2, -52, 99, -16, 35, 21, 79, 15, 96, 48, 54, 65, 32, -16, -40, 35, -15, -83, 31, -97, 64, 26, 42, 65, 54, -53, -55, -55, -53, 86, 19, 31, -82, 84, -82, -59, -9, -96, -53, 52, 94, -75, -27, 89, 8, 34, 71, -14, 54, 69, -28, -45, 30, 25, 40, 97, -42, -63, -16, -18, 95, -15, 96, -100, 77, 100, 36, 27, -48, -13, 37, -17, -24, -72, -65, -74, 45, -83, 17, 36, -34, 34, -43, -71, -28, 22, 88, -19, -84, 80, 33, -62, 52, 69, 69, -42, 1, -63, 58, 56, 3, -92, -100, 1, -14, 22, 99, -54, -25, -91, 43, 74, -58, 51, 35, -26, 4, -75, -94, -22, -86, 75, 30, 43, -12, -4, 41, -98, -28, 97, -70, 18, -26, -84, 76, -98, 22, -46, 10, 99, -1, -61, 21, 93, -61, -71, -76, -94, -9, 4, 77, 22, -20, -5, -100, -10, 71, 76, -94, 19, 30, -7, 28, 78, -3, 65, -58, 82, 84, -48, 60, 89, 1, 38, 99, 79, -100, -87, 21, -80, -67, 4, -87, 67, 21, 62, 69, -19, 47, -41, 36, 14, -68, -52, 95, -97, 22, 75, -85, 74, -75, -31, -64, 49, -94, 69, -71, -27, 20, -95, -77, 93, 67, 20, 42, 80, -16, 32, -12, -65, 73, 50, -13, -56, -91, -47, -31, -16, -69, -58, 17, 20, -86, -35, 42, 14, -20, -81, 77, -95, -22, 24, 44, 19, -75, -79, 100, -37, -43, -64, -23, 99, 20, -73, -52, 100, -34, 2, 25, -8, 94, 68, 73, -14, -14, -46, 38, 53, 99, -88, 63, 27, -37, -50, -25, -79, -41, 29, -45, 67, 55, -4, -98, 90, 50, -46, 59, -17, -73, 23, -93, -98, -7, -12, 80, 56, -7, -12, -42, 51, 65, -73, -39, -50, -94, -78, -55, -23, 5, -73, -77, -94, 11, -22, 76, -98, -99, -94, 20, -80, 36, 39, -77, -68, -58, -19, 17, -96, 22, -30, -12, 41, 15, 63, -66, 7, 77, -22, -90, 51, -26, -57, 78, 44, 24, 97, -16, -93, -22, 17, 21, -27, -73, 39, 70, 19, 64, 7, 26, -38, 0, -8, -38, -91, -21, -64, -90, 14, -11, -82, -49, 17, -83, -7, -69, 50, 39, -43, -80, 48, -72, -54, 39, -43, 68, -82, 39, -78, 32, 21, 53, 16, -38, -49, -91, -15, 66, 50, -90, -6, -29, 27, -53, -9, -85, 73, 74, -6, -53, 96, 52, -24, -8, 3, -20, -64, 1, 90, -72, -43, -7, 58, -15, 9, 95, -60, 77, -57, 36, 86, -11, 54, 8, -42, 9, 5, 30, -94, -19, -85, -52, 20, -69, -12, 71, -82, -98, 21, -41, 62, -72, -26, -31, -18, 0, 72, 54, 96, -11, 62, 46, -84, -66, 12, 57, 21, -53, 84, -84, 0, -86, 27, 11, -87, 41, 72, -4, 65, 90, 18, -90, -53, 53, -34, -76, 88, -15, 9, 53, 61, -11, -92, -61, -94, 57, 17, 93, 57, 95, -43, -46, -87, 17, -24, 64, 23, 71, 33, -75, 27, 17, 41, 35, -77, 66, 76, -16, -38, -75, -91, 5, 16, -43, -87, -28, 98, -62, 21, 58, 77, 43, -29, 11, -50, 42, -12, -63, 4, -22, -12, -30, -11, -29, 48, -85, 10, -34, -36, -88, 17, 91, -40, -69, 39, -6, -60, 93, 35, 86, -76, 32, -56, 29, 69, 65, -98, 73, 49, 3, -68, -69, 10, -84, 19, -19, 83, -98, -31, 76, 82, 17, -70, 48, -85, -84, -5, 28, 11, 1, -29, 92, -35, 10, -64, 51, -10, -17, 10, -39, -80, 5, -64, -66, 65, 80, 42, 13, 69, -7, -97, 6, 66, -22, -78, 4, -86, 39, 97, 27, -19, 20, 81, -13, 65, 55, -22, -82, -32, 91, 31, -91, 39, 96, 34, -57, 50, -99, -7, 15, 64, -32, 47, 71, 7, -31, -27, 78, -21, -3, 58, -1, 68, -43, 32, 60, 70, 46, -69, 20, -98, 28, 68, -53, 66, 32, -24, -90, -79, 91, -89, -48, -46, -48, -80, -82, 96, -13, -7, 99, -35, -42, 76, -42, 50, -98, 83, 15, -43, -39, 45, 88, 25, -64, 81, 12, -6, -23, 92, 41, 4, -96, -6, 89, 28, -38, 94, -81, -58, -16, -7, -59, 7, -7, 96, -27, 8, 14, 66, 89, 75, 24, -95, 22, -59, -43, 70, -91, -12, -23, 10, -62, 40, 66, -90, 9, -85, -68, 87, -42, -50, -86, -58, -74, -45, 20, 12, -41, 14, 8, 97, 74, 11, -1, -93, 90, 34, -20, 29, 44, 20, -97, -75, -23, -29, 96, 32, 27, -96, -10, -32, -98, 65, -7, -100, 35, -88, 97, 77, 11, -93, 57, 12, 67, -22, 21, -27, 26, 60, 100, 12, -49, 20, -68, -28, -5, -64, 97, -32, 31, -41, -27, -70, -87, -41, -33, 27, -75, 51, 83, 36, -66, 5, -77, 58, -18, 93, 93, 68, -65, 0, -67, 20, -62, -78, -21, 71, -31, 85, -42, 53, -79, 8, 10, -13, -61, -16, -7, -90, 16, -92, -89, 53, -63, 30, 25, 42, 74, 32, -47, -77, 38, 20, 18, 60, -27, 84, 79, 91, 70, 20, 27, -57, -11, 63, -89, 83, -98, -51, 56, 7, -85, 67, -74, 22, -31, -59, 84, 37, 24, 65, 35, 45, 44, -43, 5, -35, 71, -17, -92, 75, 66, 4, -12, -12, -13, -95, 57, 22, -27, 2, 45, 70, -68, 80, 83, 46, -14, -32, 23, -75, 56, 51, -95, 81, -62, -97, 27, -43, -53, -41, -75, -24, 67, -15, 22, -45, -62, -20, 66, 75, -76, 61, 26, 48, -76, -12, -79, -78, 52, 53, -71, 65, 2, 61, -24, -28, 42, -6, 71, -6, 37, 16, -64, -94, 23, -69, -90, 75, 8, -9, 95, -53, -56, -6, -68, 17, 31, -54, 21, -48, 25, 58, 58, -74, -12, 75, -65, 76, 58, 0, 21, 71, 24, -42, -78, -2, -33, -9, 69, 4, -59, 40, 28, -48, 67, -11, 73, 15, -14, 12, 49, 14, 79, 19, -73, -48, 16, 90, 44, -37, -95, 41, 13, 27, -84, -63, 96, -88, 11, 80, 36, 71, 26, 5, 53, -24, -82, 75, 57, 59, -23, 19, -22, -25, 0, -26, 96, 19, 38, -18, 53, -75, 27, 44, -18, -57, -17, 50, -76, -64, 11, 92, -99, -3, -69, -12, 82, 77, 92, 59, -64, 14, 40, 81, -98, 69, -61, -27, -35, -41, -90, 19, 28, 53, -59, 89, 22, 88, -9, -39, -89, 54, 94, -73, 93, 55, 6, 48, 34, -6, -87, 66, 17, 25, 2, -28, -39, -89, -63, 85, 83, -62, -15, -97, -53, 34, -41, 67, -93, 23, 15, -43, 84, -66, -28, 14, -88, -62, -17, -80, -54, -99, -57, -71, 27, -46, -61, -4, -9, -77, 69, -73, 16, 4, -8, -3, 78, 49, -12, -23, -27, 35, -87, -56, -63, 59, -39, -5, -34, -40, -88, 18, -14, -18, -21, -54, 10, 13, -47, -30, 79, -29, -76, -78, 57, -90, 62, -74, 16, -34, -54, 77, -93, 82, -24, 69, -34, 47, 72, -66, -24, 47, -77, 84, -46, 36, -7, 43, 82, 99, -43, -37, -25, 14, -52, -72, 17, -19, -94, -24, 21, -32, -11, -99, 60, 75, -64, -12, 26, 2, -71, -60, -97, -18, 10, 66, -77, -51, -64, 80, -76, -8, 24, -70, -9, -63, 26, -43, 80, 13, -51, 31, -9, 79, 58, -23, 41, 28, -58, 17, -42, -40, -60, -83, 87, 96, -22, 86, 69, 63, 67, -71, 1, -90, 23, 52, 72, 78, 70, -35, -2, 74, -77, -24, 64, 27, 83, -7, -14, 23, -55, 55, -8, 79, -86, 72, -43, 94, 100, -29, -3, -28, -20, 68, -36, 67, -96, -73, -63, -20, -14, 45, -64, 54, -76, 96, -18, -74, -24, 81, 34, -11, -74, 21, -42, -29, 58, -10, -33, 5, -97, 45, -38, -14, 79, 10, 90, 72, 39, 35, -79, -10, 68, 15, -60, -20, 22, -44, 59, 26, -6, -46, -95, 66, -92, -69, 63, 27, -85, 39, -60, 94, 85, 36, 24, -84, 9, 32, -75, 28, -100, -66, -92, -14, -63, -97, -49, 46, -96, 5, -53, -14, 90, -63, -49, -14, -55, -8, 36, -51, -35, -63, 54, 4, 47, 89, -85, -22, -88, 13, 1, 47, 51, 77, 34, -14, -13, -72, 32, 6, 62, -36, -1, 14, 97, -14, -27, 34, 71, 99, -88, -7, -23, 23, 24, -63, -88, -47, 5, -57, 40, 52, -77, 23, -72, 97, 45, -9, -96, 45, 90, 24, 64, -30, 82, 100, -2, -89, -49, 84, -55, 3, -57, 51, -92, 39, -1, 36, 2, 9, 15, -79, 44, 60, 74, -13, 42, -68, -86, -74, 88, 95, 11, -19, -53, -93, 33, 90, 17, -17, -99, 49, 17, -80, 33, 22, -5, 97, -88, -100, 49, 16, 51, -37, 68, 49, -40, 7, -89, -11, 31, -18, 27, 39, -68, 48, 27, -1, 100, 5, -29, -27, -5, -9, -27, -29, 79, 74, -42, 74, -45, -88, 71, -66, 18, 14, 56, -45, 32, 94, -48, 0, 19, -41, 4, 33, 75, 5, -21, 62, 45, -90, -50, 20, -78, -54, -26, 86, 84, -8, 26, -45, 54, -28, 62, 82, 36, -83, -57, 48, -45, 75, -1, -100, 54, -56, -38, -43, 67, -38, -63, -72, -61, 46, -13, -45, -57, 92, -1, 40, 57, -52, 14, -26, 90, 98, 62, 38, -52, 6, 10, 14, 67, -80, -54, -98, 57, 26, -34, -39, 64, 49, -70, -55, -56, -87, 20, 39, 18, 90, -24, -13, 65, 16, 74, 23, -47, 82, -53, 100, 99, 0, -86, 98, 12, -85, 70, 34, -58, -73, -35, -3, -41, 27, 30, 28, 58, -45, -17, 73, -69, -20, -83, 95, -66, 3, -1, -78, 40, 41, 64, -96, 49, -73, 31, -51, 1, -72, -64, 62, 47, 62, 29, 15, -43, 45, 5, -45, 21, 91, 2, 22, 79, -79, -41, 37, -17, 27, -21, 33, -20, -95, -15, -19, 55, -59, -27, -60, -38, -79, -22, 56, -30, 13, -67, -5, 29, 53, 8, -26, -82, 24, -81, 60, 15, -7, -19, -5, 3, -97, 59, 46, 30, -9, -40, -63, 17, 33, -45, 67, 20, -20, 5, 19, -32, -18, -59, -2, 29, -73, 16, 44, -31, 6, 22, -32, -62, 34, 59, -97, 48, 59, -19, -4, 41, -31, -55, 47, 85, -2, -21, -53, -94, -61, -42, -65, 71, 7, -70, 69, -57, 70, -58, 74, 33, -8, 93, -15, -92, -90, -21, 8, 17, -83, 52, -4, 85, -71, 14, -100, 90, -4, 12, -22, -72, -35, 80, 4, -82, -35, 11, 79, 58, -41, 16, -33, -8, 57, 40, 42, 47, 61, 47, -51, -12, 54, 57, 83, 92, -2, 82, 12, 6, -77, -76, 80, -90, -7, -41, 74, 52, -76, 44, 39, 22, 79, -90, -91, -20, 87, -47, 8, -38, -81, -96, -60, 17, -38, 83, -69, -74, -33, 4, 75, -94, 73, 2, 11, 45, 65, 2, 92, -84, -11, 14, -15, 2, -19, 25, -63, -9, -38, 69, 35, -71, -37, -92, -44, 6, 86, -6, 94, -26, -96, -6, -97, -93, 69, 62, 40, 32, -61, -82, -19, 24, -97, 27, 86, 45, 51, 6, -8, -70, -43, -73, 36, 72, -11, -52, 10, -99, -95, -72, 53, 55, -94, -67, 83, 37, 11, -44, 74, -74, -62, 49, 18, 46, -1, -92, 46, -99, -9, 88, -42, 97, -30, -31, 60, 92, -76, -31, 55, 45, -38, -52, 22, 23, 93, -61, -16, -14, 93, -21, -97, -67, -96, 49, 47, 2, 74, -67, 71, -95, 83, -72, -48, -100, -42, 75, -94, 59, -23, 88, 84, -50, 46, -74, -38, 87, -40, -40, 25, -56, 48, 71, 28, -6, -10, -57, -39, -40, -22, -12, 11, 10, -51, -60, -68, -89, -99, 6, 48, 41, -67, -16, 91, 50, -16, -51, 41, 5, -55, 17, -96, -35, 49, -31, 7, -99, -72, -40, -1, 27, 98, 43, 91, -4, -4, -87, -58, 70, -31, -46, -70, -25, 67, 54, -49, 27, -94, 73, -1, 60, 35, 32, -40, 99, 3, 87, 51, -94, 88, -18, -6, 63, -74, 23, 56, -14, 47, -31, 13, -25, 13, -98, 66, -2, 23, -56, 25, -33, -70, 5, -63, 33, -93, -73, -86, -93, -47, 33, -72, 14, -67, -94, -61, -27, 40, -39, -15, 15, -36, -60, 22, 69, 15, -35, 15, 38, 0, -51, -30, 62, -21, -22, -81, 55, 22, -64, -98, -8, 86, 0, 100, 54, -69, -53, -55, 13, -6, -54, -61, 30, 15, 56, -10, -43, 77, -91, -40, 10, 20, -40, 50, -95, -26, 87, 14, 54, 82, -70, 22, 57, -34, -88, -42, -47, 3, -80, -58, -90, 8, -34, 65, -6, 51, 5, -50, 88, -55, -58, -74, -16, 57, -7, 26, 90, -91, 30, -41, -74, 22, 72, -39, 51, -55, 25, 71, -38, -97, -85, 78, -27, 11, 0, 75, 92, 96, -56, 30, -84, 64, -96, 74, -57, 60, -80, 94, -33, -69, -77, 62, 45, -34, 2, -47, 53, 87, 24, 16, -36, 78, 13, 87, 86, -25, -84, 48, 94, 7, -73, -57, 97, 89, 69, -7, -79, -63, -87, 10, 21, 53, 67, -47, 40, 26, -82, -59, -60, -51, 30, 58, -25, 42, 81, 80, 72, 65, -2, -51, 51, 44, 45, -59, 44, -85, -16, -49, -65, 6, 66, -20, 52, 14, -59, 48, -33, 86, 23, -71, 84, -68, 2, -48, 43, 76, 32, 5, -24, -7, -41, 98, 10, -46, -10, 62, 96, -59, -32, -77, 98, 98, 17, 82, 41, -46, -86, -96, 0, 31, -71, -48, -28, -71, 3, 4, 7, -17, -9, 88, -30, -33, -46, -2, -4, -30, -28, 69, -24, 56, 62, 72, 7, -11, -2, 56, 97, -98, 84, 93, 18, 49, 10, 54, -79, 15, 12, 76, -77, -74, -65, 6, 44, -45, -91, -47, -20, 7, 65, -20, 26, -3, 31, 77, -40, 48, -65, 1, -55, -6, -30, -57, -37, 45, -88, -88, -76, -96, 27, -62, 56, 7, 84, 73, 60, 37, 85, -76, -27, -62, -85, 87, 55, 71, 85, -69, -38, -8, -56, -48, 88, -51, 54, -75, 30, -11, -62, 92, 62, -48, 73, 95, -79, 87, 33, -49, 100, -26, -28, -72, 70, 21, 61, 58, -15, -55, -97, -99, 32, -55, -22, 46, 65, -42, -29, -81, 95, -48, 6, -46, 66, 20, 63, 85, -86, -100, -6, 36, 50, 79, 53, 87, -83, 4, 85, -36, -24, 15, -32, 41, 73, 96, -26, 59, -50, 96, -86, 80, 98, -32, -86, -71, -23, 51, -66, -32, 39, -55, 25, 96, 63, -16, -53, -34, 81, -12, 63, -49, -79, 65, -2, 89, 92, 30, -13, 35, 17, -62, -83, 4, 30, 45, -21, 16, -100, 16, 27, -75, 79, -89, -63, -16, 68, -48, -88, 27, -25, -88, 45, 46, 46, 97, -53, 98, -30, 55, -9, 46, -15, -18, -53, -72, 75, -82, -2, -54, -12, -41, 75, 47, 46, -59, -24, -25, 76, 42, 87, -33, -22, 54, -26, 82, -14, -86, 79, 58, -11, -94, -88, 81, -88, 47, -91, 23, 79, 64, 79, 25, -74, 61, -1, 89, -85, -42, -80, -85, -88, -68, 81, -32, 54, -49, -36, -57, 57, 50, -22, -85, 82, -83, -84, -49, 72, -45, -8, 81, -92, 44, -74, -64, -79, -29, 94, 65, -2, -29, 71, 22, -10, -65, -3, 52, -59, 10, -88, 83, -22, 17, 78, 77, -49, 60, -6, 52, 11, -43, 67, -14, 65, -98, 15, -85, 29, -78, -3, 57, -91, -36, -79, -49, 10, 83, 60, -21, 57, 51, 32, -48, 82, -78, 5, -10, 18, 37, 19, 60, -8, -39, -19, 54, -94, -1, 54, -27, 37, -44, -71, -98, 56, -87, -24, -18, 52, 37, -22, 76, -63, 98, 41, 57, -61, 39, 41, 28, -33, -52, -83, 63, -37, -5, -73, 59, 99, -76, 74, 47, 60, -71, 64, 80, 1, 16, 5, -27, -32, -93, 22, -4, 0, -100, -6, -94, -39, 10, -14, 85, -14, 22, 100, -93, -37, 35, 30, 26, 85, 26, 59, 15, 95, -52, 65, 29, 26, 36, -55, -36, 76, 56, -11, -72, -68, -73, -6, -18, 11, 53, 13, -72, 38, 1, 61, 3, -53, 54, 23, 99, 67, 58, 92, 66, 10, -77, 95, -78, 88, 54, -85, 72, -74, 100, 32, 86, 99, -66, 97, 73, -45, 26, 51, 37, -63, 97, 75, -92, 77, -32, 75, 66, -96, -17, 38, -41, 54, 34, 87, 77, -34, -32, 82, -24, 43, 17, -89, -74, 60, -16, 7, -46, -49, -64, 12, 19, -86, -17, -18, -36, 95, -98, 99, 4, 32, 36, 28, -71, -30, 47, -8, -74, -38, -20, -70, 46, 13, 1, -8, 89, 34, 64, -30, -15, 35, 84, -73, -19, -6, -84, 38, 42, 57, -6, 20, -95, -89, -14, 88, 2, 3, 63, -66, -34, 5, -9, -38, -18, 67, -19, -70, -64, 32, 14, 20, 31, 17, 53, 51, 66, 83, 81, -63, 9, 81, 46, -75, 26, -49, 17, -40, 94, 49, 44, 38, 10, 66, 88, -52, 6, -8, 23, -40, 39, 40, -43, -90, 91, 58, 38, 21, 4, 70, -65, 29, -14, -40, 63, -23, -52, 54, 39, 85, -95, -57, 74, -78, 14, -3, 7, -5, -75, 34, 59, -68, -19, 47, -6, 96, 79, 69, 28, 90, -94, 23, -43, -15, 77, -67, -50, 19, 37, 10, 5, -75, -69, 23, 69, 89, -89, 67, -14, -23, -67, -31, 54, -93, 74, -20, -75, -44, 34, -75, 86, 13, 17, 96, 15, -54, 1, 23, 62, 57, 77, -77, -71, -47, -34, -69, -93, 77, 74, -55, -21, -66, 88, -12, -22, 78, 90, 35, -67, -76, 12, 71, -18, -58, 25, 77, -88, 73, 24, -25, -14, 80, 90, 3, 29, -61, -78, 86, -32, -67, 54, -46, 5, -97, 95, 99, -31, 54, -54, 13, 16, 17, 67, 54, -94, 50, 91, 12, -3, -72, 88, 71, 14, 96, 54, 39, 44, -64, -67, 63, 33, -5, 59, -28, 21, 49, -91, -72, 38, -9, 93, -45, -16, -6, -43, -49, -40, -84, -71, -29, -64, 32, 53, 97, -21, 28, 36, -30, 6, 91, 51, 32, 78, 65, 56, 73, 79, 20, 73, -26, -33, 86, 37, -3, 31, -49, -27, -83, -25, 78, 50, 7, 52, -41, -64, 95, -24, 45, 25, -72, 7, -71, 18, 1, -94, 68, -27, -64, -74, -80, -58, -50, -8, -30, -88, 8, 80, 90, 13, 84, 52, 24, 4, 40, -64, 57, 39, 92, -83, 21, -16, 16, 17, -39, -77, -41, 44, 5, -41, -92, 79, 42, -24, 55, -20, 25, 36, -45, -7, 26, -65, 27, 83, 98, -81, -46, -41, 62, 28, -56, 96, 67, 65, -77, -97, -10, 96, 6, -88, 48, 0, 59, 65, -6, 59, -44, 75, 57, -30, 65, 71, 53, -1, 6, -11, 7, 29, -58, -58, -38, -28, 85, 16, -53, -96, -25, -66, -8, 43, -18, 76, -41, 6, 16, -50, 26, -10, -19, -42, -37, 4, 40, 53, -31, 30, -89, -60, 4, -36, -38, 77, 74, -93, 58, -90, -84, 54, 23, -6, 54, 14, 22, -14, -45, 96, -7, -3, 74, -82, -44, 58, -85, -56, 54, 88, 53, 56, 12, 20, 2, 26, -57, 8, 56, 8, 9, 10, 29, 33, -92, -86, -43, -99, 30, 79, -46, -48, -7, -29, -61, -62, 70, 40, 3, 4, 64, -46, 59, 41, -36, 54, -77, 14, 12, -79, -23, -56, 35, 94, -37, -4, 14, 74, -80, 59, 4, -56, -57, -60, -5, 79, 38, 0, 14, -83, 38, -74, 70, 1, 92, 81, -72, 48, -72, 36, 88, 89, 98, 1, -10, -96, -4, -86, 84, -96, 47, 0, -20, 13, -97, 83, -67, -61, 96, 95, 49, 26, 41, 95, 35, 27, -34, 73, 56, 13, 18, -7, -89, -49, 85, -99, -100, -46, 3, -2, 61, 91, -33, -19, 39, -51, -80, -91, -16, 3, -12, 13, 14, 97, -87, 67, 3, -19, -71, 100, -87, 79, 9, 44, -39, 9, 49, -48, 59, -25, -46, -79, 65, 77, 2, 93, -56, 18, -93, -36, 67, -96, -56, -55, 63, 44, 68, 57, 79, -22, 47, 63, -35, 72, -97, 77, -13, -46, -42, 69, -99, -55, -99, 77, 28, -88, -31, -79, -84, 86, -15, -31, 15, -98, 9, 97, -20, 76, 77, 0, -66, 50, 99, 34, -51, -91, 82, -82, -78, -6, -37, 60, 93, -5, -4, -92, 24, 56, -83, -19, 98, -72, 15, -18, -40, 32, 4, 13, -32, 83, 17, 79, -86, -11, -13, -18, -81, 6, -28, -9, -85, -26, -3, 52, 18, -44, 48, 32, 36, -90, 4, -36, 90, -75, -82, -85, -45, 0, 13, -33, -23, -71, -94, 39, 51, 6, -79, 74, -71, 87, 66, 47, 53, -52, -32, -59, -95, 80, -67, 21, 23, 96, -91, -73, -98, -24, 75, 10, 93, 25, -66, 79, 13, -39, -49, 15, -54, 81, 55, 0, -78, 6, -66, 2, 18, -69, -99, 11, 21, -85, 43, 78, 94, -9, -47, 47, -68, 35, 51, -48, -37, -43, 17, -64, -89, -17, 31, -7, 58, -15, -63, 64, -9, -87, -26, 27, -28, 51, -91, -63, 70, 4, 64, 69, -69, -87, 31, 51, -5, -91, 17, 6, -85, 66, -5, -83, 52, -94, 83, 25, 74, 14, 10, -19, 30, 28, -68, 98, -27, 7, -42, -29, 59, -14, 44, -84, -12, 48, -46, -95, -17, 76, -17, 53, 59, -29, 8, 11, 71, 86, -72, -84, -83, 67, -38, -19, -26, 72, -22, -11, 30, 30, 65, -2, 100, 6, -61, -33, 81, -81, -86, -8, 32, -62, -61, 34, 99, -5, -1, -68, 17, -64, -69, -58, 90, -65, -3, -52, -76, 7, -5, -35, -92, 1, 45, -79, -2, -86, -94, 40, 5, 63, -85, 68, -80, -73, -27, -18, -84, -36, 40, -65, -43, -81, 3, 79, -95, -78, 69, 51, -96, 59, -55, -84, -26, -74, 95, -78, -14, 12, 20, 61, 48, 49, -36, 59, 89, -73, -19, -94, 81, 1, 97, -87, 82, -43, -57, 73, -87, -57, 68, -28, -99, -96, -11, -14, 39, -23, 26, -24, -2, -54, -22, 62, 15, 46, -22, 90, 14, -93, -78, -88, -78, -70, 57, 69, 29, 38, 52, 56, -79, 25, 46, 100, 68, 65, 56, -27, -79, -93, -54, 33, -94, 63, 35, -13, -55, -37, 58, -78, -40, -51, -55, -58, 37, -6, 47, 43, -98, -71, -83, 86, 97, -66, 46, -75, -66, -25, -29, -44, 0, -52, -91, 4, 56, 3, -30, -3, -33, -23, -77, -58, -6, 25, 66, -9, 52, -18, 95, -67, 18, -48, 82, -48, 45, 16, 34, 90, -26, -59, 38, 36, -66, 0, -14, -4, 92, -17, -96, 53, -50, -63, -98, 86, -88, 62, -14, -98, 80, -46, 72, -35, 94, -17, 71, -28, 11, 95, -39, -76, -49, -51, 21, 28, -62, -49, -25, -61, -41, 100, 9, -17, 96, -81, -16, -99, 5, -92, 66, 57, 81, -43, 71, -58, 37, 8, -53, 25, 44, 27, 32, 97, 91, 6, 93, -30, 31, 0, -18, -73, 5, -63, -35, 94, 87, -54, 5, 2, -76, -35, -22, -34, 96, -61, -1, 77, 14, 67, 18, 64, 96, 44, -39, 68, -25, 69, -70, -68, -58, -8, 94, -63, -60, 17, 90, 67, 57, 74, -79, -5, 26, 82, 70, -40, -27, -69, 31, -56, -29, -81, 98, -36, 87, -12, 53, 100, -78, -61, 29, 53, -23, 89, -57, 58, 53, 12, -18, 16, -96, 20, -31, -66, -85, 58, -87, -76, -22, 0, 4, 98, 45, 77, -81, -45, 29, 53, -78, -69, 40, -88, 44, 85, -74, 44, 65, -87, 41, 39, -32, -33, -46, 90, -72, -12, -56, 31, 43, -35, -78, -33, 47, 44, 79, -95, -19, 22, 66, 4, -67, -47, -19, -7, -36, -14, -72, -60, 4, -38, 59, -35, 11, -1, 72, 44, 70, -35, -33, -67, -100, 50, 33, -85, -99, 15, -25, -74, -82, -73, -66, 14, -33, -52, -94, -64, 14, 52, 14, -60, -20, -39, 68, 41, 81, -99, -13, -53, 78, -46, -89, 96, -100, 86, 100, 2, -67, 11, -55, 86, 93, 46, 55, -2, 67, -44, -50, -79, -33, 35, -41, -36, -65, 98, -72, 92, -45, -19, 31, 99, 77, 66, 62, 52, -57, 74, 67, -70, 96, -20, -27, 70, 23, 82, -85, -33, 18, -32, -59, 9, -60, -51, -95, -26, 80, -84, 4, 84, -34, 43, 79, -1, -11, 61, -20, 14, -81, -21, -45, 78, -48, -52, -97, -83, -65, 16, -66, -71, 17, -38, -19, 48, 79, -32, 24, 68, -47, -14, 57, -45, -22, 68, 41, 48, 19, -76, 77, 8, -6, -48, -53, -31, 75, 31, 51, 58, -18, 56, 32, -19, 94, 3, -26, 80, -12, -37, -66, -89, 74, -11, -46, 11, -32, -10, -63, -72, -89, 46, 36, -19, 56, -98, -14, 57, 85, -13, -48, 0, -97, -44, 81, -73, -85, -88, 99, 83, -48, -53, -76, -35, 57, 3, -98, 50, 56, 68, -7, -90, -80, 26, -10, 51, -6, -7, 92, 28, 81, 99, 11, -67, -21, 95, -18, -72, 30, -90, 35, -39, 2, -68, 35, 52, -13, 53, 53, -84, -10, 56, -58, -28, -96, 77, -45, 90, -44, 72, 64, -29, -22, -65, 60, 33, 14, -30, 72, -9, 34, 4, -36, -77, -56, 88, 46, 16, 59, -71, -36, 59, 84, 47, -16, -18, 13, -5, 57, -14, 86, 89, -34, -70, -35, -47, -91, 65, -18, 58, -72, 52, -69, -84, 14, -56, -52, -14, 45, -26, 22, 23, -49, 47, 89, 40, -13, 70, -17, 5, -9, -2, -80, -95, 98, -48, -14, 79, 96, -15, 36, -5, 73, 12, -30, 57, -58, 86, 65, -67, -55, -69, 43, 66, -100, 84, -81, 69, -29, 61, 77, -90, 6, -58, -91, -93, 99, -82, 92, -46, 79, -98, -48, -57, -5, -53, -47, 43, 57, -9, 55, 43, -50, 60, 52, -83, 25, 53, -95, 65, 71, 94, 70, 33, -23, 91, -19, -21, -13, -88, -36, 65, -37, -87, 44, 20, -24, -88, -28, 33, -95, 20, -7, 64, -44, -48, -55, -23, 31, -67, 93, 90, 88, -59, -23, -37, 44, 88, 17, -71, 70, -8, -94, 100, 73, -78, -65, 41, 47, 83, 15, -20, 59, -76, 14, -7, -52, 84, -74, 54, 73, -6, 72, 53, -87, 21, -53, 27, -16, -9, -86, -50, -47, 38, 7, -26, -73, 82, 96, 99, 53, 27, -31, 59, 75, -5, 39, 97, 2, 88, 61, -14, 4, 8, -20, -56, 11, -41, 92, -30, -88, -23, 75, 24, 76, -3, -10, 85, -12, -2, -28, -31, 88, 53, -62, 85, -74, -61, 22, -70, 30, -86, 81, -31, -90, -71, -66, 11, -58, 88, 67, -8, 69, 69, 18, -98, -11, -23, -18, -16, 23, 48, 100, -24, 4, -48, -57, -55, -64, -63, 8, 8, -13, 65, -90, -8, 72, -37, 71, 25, 11, 4, -39, -40, -11, -89, 36, 94, -27, 6, 29, 35, 15, -58, 45, 79, -62, -70, 41, -37, 2, -4, -57, 87, -4, -99, 59, -65, -46, 13, -14, 90, -32, 10, -21, -61, -77, 16, 85, 3, 55, -39, 52, -94, -63, 98, 18, -15, -15, -10, 20, -4, 72, 59, 2, 59, -100, -56, -37, 95, 34, 65, -31, 80, -26, -28, 57, 49, 85, -28, -46, -55, -4, 53, 91, 36, -86, 46, 43, -76, -2, 78, -24, 73, -94, -67, -43, -23, -78, 50, 44, 40, 21, -74, -35, 0, 57, 31, -7, -34, 41, -90, -61, 30, -100, -92, 11, -28, 23, -25, 28, 43, -7, -29, -55, 37, 60, 1, -60, 78, -79, 43, -18, 89, 80, -26, -87, 86, 53, 71, 47, 32, 92, -90, -54, -91, -40, 10, -56, -54, 61, 17, 40, -78, -65, 90, -25, 74, 8, 93, -17, -21, -87, 80, -35, 76, -85, 95, -58, 1, 12, 92, -92, 48, -19, 9, -3, -17, -58, -35, 31, 22, 8, 1, 34, -15, -17, 85, -97, 23, -81, -66, -4, 86, 72, -87, 49, -53, 57, -72, -65, -59, -72, 34, 59, 40, 40, 81, 41, 33, 43, -60, 79, 11, -16, 7, 43, -96, 51, 70, 92, -91, 86, -66, -70, 19, -22, 38, -92, 93, -57, 15, 43, 19, 75, -48, -36, 75, -31, -55, 20, 20, -68, 79, -20, -46, 78, -3, 9, 67, 52, 90, 49, 24, -10, -63, 36, -64, -96, -19, 49, 9, 39, -41, 71, 49, -95, -74, -46, 42, -37, -84, -98, -91, 90, -38, -12, 89, -16, 3, 36, 51, -69, -98, 60, 70, 8, 39, -8, 2, -4, 59, 47, 94, -33, 44, 46, 31, -8, -84, 91, -79, 93, 69, 72, -90, 80, 87, -72, -81, -96, 52, -67, 39, -73, -3, -95, -82, -89, -76, -88, -25, -98, -77, -93, 11, 19, 22, -11, -56, 99, -100, -98, -36, -86, -51, 47, 30, 88, 42, 86, 81, 87, 23, -64, 48, 5, 2, 50, 20, -2, 45, -84, 58, 91, -53, -75, -79, 24, 72, 63, -37, 62, -19, 54, -33, 44, 97, 38, -96, 85, 20, -44, -27, -16, 19, -87, -29, 28, 43, -75, -52, 69, 97, 2, -35, -48, -92, -32, -61, 83, 32, -45, 10, 99, -96, -32, -49, -28, -3, 60, 49, -86, -36, -30, 50, 10, -95, 85, 53, 39, -24, 14, 12, -24, 29, 59, 77, -6, -40, 38, 0, 95, -67, -6, 2, -93, 35, -3, 42, -96, 46, 36, 84, 81, 56, 0, 46, -55, 3, -21, 89, 87, 17, -96, 60, -46, -82, 44, -13, 16, 69, 49, -62, 24, -74, -25, 73, 26, 55, 79, 92, 66, 21, 45, -14, 49, -33, -90, -19, -37, 18, 98, -16, -44, 62, -64, 77, 20, -71, 44, 60, 43, 42, 40, -98, -77, 50, -42, -46, -36, 59, -41, 57, -35, 45, -42, -48, -37, 20, 18, -71, -83, -96, -32, 35, 36, 59, 19, 41, 40, -83, -33, 13, -79, -81, 42, -94, -3, 4, -71, -96, 28, 87, 58, -81, -18, -37, 17, 91, -72, 1, 37, 56, -70, -26, -71, 52, -21, -43, -44, -14, 22, 90, -4, 14, -64, -43, -73, 54, 97, -64, -95, -39, -68, -12, -23, -61, 68, 18, -59, 36, -83, -86, 31, -67, -39, -63, -30, -78, 25, -81, 83, -48, 29, -80, -25, -59, -44, 21, 76, -10, 11, -91, -29, -40, -80, 87, 20, -15, 40, -53, 67, 90, -92, 84, 78, 12, 19, -61, -25, 100, -37, -7, -31, -37, -76, 55, 37, 55, -65, 38, -80, 53, 45, -33, -60, -86, -78, 68, 33, 98, 87, 11, -49, 36, 14, 57, -57, 89, 70, 55, -93, -2, -50, -2, 20, -11, -71, 38, 47, -70, 61, 39, 75, 55, -34, 16, 90, 75, 69, 79, -96, -24, -89, -42, -36, -49, -58, -18, -8, -38, 10, -51, 11, -62, 69, -21, -84, -58, -52, -96, 28, -34, 11, -77, -72, 42, 31, -57, -36, 19, 25, -70, 47, -91, -90, -19, 55, 65, -77, -62, 18, 78, -25, -51, -94, -1, -20, -33, 80, -64, -18, -47, -11, 82, -70, 92, -1, -8, -12, 86, 22, 17, -54, 76, 45, -98, -83, -43, -30, -20, 52, 45, -49, -58, -34, -12, 34, 10, 71, 71, 78, -18, -22, -16, -80, 21, 64, -73, -69, 84, 68, -47, 54, 22, -14, -61, 68, -31, -77, 45, -27, 83, 42, -3, -29, 62, -74, -12, 30, -80, 20, -62, -69, 77, -16, -92, -51, -100, -97, -97, -11, 61, 54, -86, 8, -69, 68, 98, 88, -38, 88, 7, 7, -87, -78, 10, -36, 59, -60, -75, -53, 100, 43, 58, 93, -69, 37, 52, -19, 8, 72, 51, -98, -39, -22, 94, 82, -91, 82, 49, 41, 100, 35, 22, 1, 42, 9, 42, 79, -31, -47, -25, 69, 46, -61, 96, -74, -27, -58, 79, -55, 41, -37, 88, -3, 25, -43, 76, -72, 53, -74, 94, -34, 62, 87, 88, 13, 97, -23, -11, 30, 60, -59, -88, -72, -92, -69, 49, -15, -43, -44, 37, -76, 89, 90, -25, 14, 30, -18, 74, 82, 53, -88, 34, 61, -79, -17, 6, -78, 75, -87, -7, -14, 10, -49, -18, 66, -60, 63, -95, 50, 37, -2, -16, -41, -71, -31, -96, -22, 84, -58, 79, -24, -95, -99, -84, -13, -89, 71, 81, -23, -94, 59, 56, 73, -28, -23, 80, -76, -48, 56, -19, -20, 33, -25, 65, -98, -66, 82, -54, 60, -8, 30, 96, -42, -5, -83, 25, -24, -35, 52, -81, 98, 96, 56, -83, -29, 54, 21, 69, -35, -2, -75, 50, -96, -21, 5, -90, 46, 39, 29, 70, 49, 53, -68, -77, 96, 48, -55, -83, 32, -93, -16, 10, -44, -96, -88, -18, 93, 64, -11, 56, -32, -69, 1, 75, 29, -32, 78, 62, 42, -29, 10, -36, 65, -84, -21, 72, 28, -98, 26, 27, -31, -49, 80, 21, -98, -7, -54, -26, -10, -15, -95, 73, -6, -40, -58, -45, 97, 13, 47, -54, 81, 68, 93, -70, 1, -37, -11, -10, 85, 82, -55, 9, -6, -77, -12, -64, 68, 52, -72, 58, 6, 29, 39, 32, 88, -10, -45, -23, -30, 64, -65, -27, -72, -21, 65, 1, 68, -68, -8, 11, 22, 40, 33, 93, -93, 17, 91, -92, 50, 98, -80, 28, -55, -39, -99, 3, -26, 0, 71, -13, 27, -18, -96, -8, -62, 27, -35, -56, -26, 0, 40, -8, 18, -69, 8, -58, 35, -27, 86, 38, 55, -62, -75, -29, 1, -75, -69, -55, 55, 34, -66, 93, -79, 49, 21, -98, -55, 77, -93, -97, -86, -57, 66, 19, -25, 56, 100, 89, 61, 53, 11, -14, -83, 90, -49, -47, -59, -8, 81, 79, 40, -69, -18, -20, -35, -19, 85, 66, 54, -23, -47, 99, -28, 70, 79, -87, 35, -66, 45, 82, -23, -49, -29, 76, 35, 64, -35, -20, -24, 17, 68, -28, -74, 47, -63, 39, 69, -15, 0, 77, 2, -70, 92, 80, -61, -28, 66, 37, 56, 67, 57, 29, -19, 55, 74, -69, -13, 1, -12, -12, -69, 54, -47, -5, 83, 58, 13, -77, 62, -71, -4, -46, -37, -68, -55, -68, 95, 91, -71, -22, 56, 89, -9, -5, -71, 5, 1, 39, -34, 42, -91, -15, -40, -78, -90, -85, -52, 9, -21, 41, 33, 69, 44, 18, -59, -91, 73, -52, -92, 66, -99, -33, -49, 38, -64, 99, -79, 79, -96, 29, 32, -2, 59, 46, 2, 14, -97, -14, -55, -18, 53, -51, -75, -30, -69, 10, 16, -4, 71, -75, 88, -13, -50, 86, -14, 65, -75, 23, 72, -70, 25, 97, -56, -70, 10, -40, 75, -56, -41, 88, -49, -49, -25, -39, 53, -34, -22, -52, -13, 14, -57, -65, 80, 71, -79, 29, -94, -85, -7, -57, 9, -36, -28, -30, 96, 88, 57, 69, -27, -76, -19, -30, -44, 59, -51, -26, 37, 49, -60, -54, 41, 30, -23, -48, -85, 18, 88, -73, 62, 29, -40, 83, -46, -83, 98, -52, 1, -59, -94, 31, 70, -42, -52, -41, -95, 47, -70, 15, 49, -16, 59, -54, 61, 54, -57, 57, 60, 54, -45, 50, -58, -47, -33, -48, -61, 87, -15, 36, -6, 37, -91, 57, 37, 85, -65, 71, 84, -58, 6, 50, 31, 39, 23, -52, 51, 40, 23, -33, 1, 99, -11, 61, -92, -91, 24, 14, -36, 11, -29, -27, -47, 70, 86, -12, -6, 2, 86, 94, -40, 65, 35, 27, -36, -96, 19, 14, 8, -58, 87, -75, -90, 61, 29, -80, 14, 53, 27, -25, -28, -14, 5, 32, -92, 18, -51, -91, 12, 85, -91, -23, -65, -45, 17, 89, -64, 68, -53, 49, -14, -40, -26, 16, 14, -2, -53, 91, -64, 68, -96, -1, 79, -84, -11, 7, 89, 79, -81, 2, -4, 43, -94, -7, -35, -89, 70, -61, -100, -43, 30, -93, -11, -26, 88, -16, -96, -75, -16, -28, 44, 0, -35, 78, 18, -54, 67, -9, -74, -61, -100, 73, 38, 66, -83, -10, -54, -80, 55, 28, -87, -81, 20, 100, 72, 88, 54, 21, 83, -49, -33, -64, -19, 58, -52, 80, -62, 37, 36, -9, 40, -83, 39, -29, -96, -94, 42, 94, 45, -63, -75, 65, -42, -49, 60, 48, 44, 6, -39, -42, -99, 91, -76, 68, -82, 65, -76, 66, -97, -98, 61, 5, 37, 12, -74, 11, -11, 28, -57, -49, 52, -36, -90, -33, 20, -24, -86, -44, -27, -37, -90, 20, 24, 47, -71, -91, -47, 85, 56, 28, -43, 48, 42, 94, 60, 65, 46, 31, -25, -12, -3, -20, 85, -31, -89, 26, -22, 44, 28, -87, 18, -99, -97, -35, -11, 73, 77, -41, 79, -4, 75, 66, 26, 97, -41, 57, 54, -18, -27, -46, 97, -75, 69, 20, -34, 15, -34, 79, -95, 13, -91, -63, 23, -24, 1, -89, -55, -52, -10, 23, -29, 90, 96, 1, -58, -41, 0, 56, -15, 25, -90, -66, -78, 99, 48, 64, -73, 15, -6, -43, -48, -73, -59, -16, 100, -8, 23, 88, 60, 82, 64, -54, 63, 14, 55, -91, -78, -96, -19, 18, -95, 24, 69, -54, -73, -88, -76, -94, 93, -21, 85, -35, -65, -99, 12, -63, -87, 54, 42, -16, 39, 14, 70, -4, 84, -15, 1, 75, 88, -19, -57, 79, 89, 29, -8, 98, 58, 4, 24, -28, -29, 60, 32, -23, -43, 24, -90, 50, 72, -74, -45, 25, -42, 8, -61, 45, 78, -40, 21, 5, -78, -65, -63, -29, -45, 66, -25, 96, 55, 6, 48, -39, -78, 48, 19, 43, 89, -36, 7, -21, 32, 73, -37, -60, -3, 71, -12, 5, 42, 95, 78, -47, 95, -24, -59, 73, -76, -34, 62, 11, -28, 49, 11, 36, 51, -78, 88, 64, 72, -86, 84, 26, -87, -49, -17, -65, 54, 44, 68, -97, 30, -82, 68, 67, -43, 66, -94, -65, -25, 47, 1, -25, 56, -33, -35, -54, 50, 33, -83, 80, -79, -33, 62, -3, -92, 58, 70, -26, -84, -50, 93, -77, 24, -86, 55, 30, 56, -49, -47, -43, -56, 17, -24, -51, -79, -49, 80, -70, -30, 75, -11, -70, 1, 31, 62, -4, -34, 91, 36, 73, -18, 83, -45, -75, -41, 27, 26, -29, -11, 75, -43, -38, 19, 85, 30, 34, 79, 13, 89, -99, 60, 39, -53, -48, 24, 68, 16, -10, -19, 85, -33, 50, 63, -7, 48, -29, 2, 82, 83, -88, 23, 49, -94, -77, 88, 32, -51, 89, 82, -75, 37, -90, -61, 1, -90, 11, -7, -97, -99, 66, 50, -56, -27, 69, 2, -59, -72, 43, 94, -1, 87, 31, -1, -85, 68, -95, -59, 27, 84, 55, -1, 50, -25, -59, -6, -89, 23, -37, 85, 78, -72, -82, -4, -56, -47, 9, -21, 93, 99, -88, 92, 39, 12, -30, -87, -59, -2, -25, 3, 75, 20, 51, -36, 44, -63, -73, -68, 51, 10, 25, 27, -31, -16, 31, 60, 18, -91, -65, -28, 58, 31, 21, 35, -74, 63, 36, 70, 51, 64, -60, 3, -75, 31, 15, 28, 47, 72, -9, 96, -5, -49, -7, -37, -80, 5, -21, 99, -25, -5, -76, 94, -75, -1, -20, -74, 79, -38, -15, 17, 72, 85, -63, 62, -55, 26, -30, 30, 33, -88, 73, -11, 11, -68, -39, -38, -45, -62, -41, 4, 26, -18, 51, 77, 4, 60, -27, 34, 73, 21, -39, -100, -22, 17, -36, 72, 82, -35, -34, -1, -47, 20, -1, 90, 81, 2, 79, 81, 94, 64, 7, -89, 86, 47, -14, -15, -69, -30, -57, -35, -23, -46, -85, -13, -30, -33, 79, 23, 64, 73, 68, 32, 93, -96, 90, 24, 30, 35, 53, -27, 24, -3, 22, -1, -48, -25, 27, 56, -87, -96, 11, -74, 24, 95, -72, -98, 57, 36, -100, -78, -34, 59, -95, -52, 42, 85, 80, -71, -61, 86, -38, -53, 23, -33, 34, 74, -58, 43, -79, -38, 73, 72, -60, 52, -51, -34, 79, -15, 58, -64, 49, -74, 19, 29, -79, 80, -84, 11, 24, -45, 58, -58, 99, 20, 80, 32, 29, 20, 86, 31, 61, 94, 11, 100, 33, 85, 74, -96, -40, -45, 1, 62, 18, -88, -75, -37, 38, -39, 74, 23, -31, -26, 85, -91, 43, -89, 98, -13, -51, 42, -42, 97, -39, -29, 89, -51, -47, -47, 55, 3, -50, -27, 60, 28, -16, -32, 28, 16, -46, -16, -12, 72, -28, -21, 67, 9, -40, 63, 2, 12, 51, -21, 41, 11, -3, -13, -1, 19, 28, -54, 48, 100, -62, -98, 43, -33, 53, 81, -88, 88, -81, -18, -74, 29, -91, 87, -12, -82, 42, 2, -54, 51, -85, -20, 87, 76, 31, 93, 76, 12, 58, -35, -47, -99, -40, -86, -41, 11, -58, -8, 67, -71, -38, -77, 71, -87, -73, 41, 83, 7, -67, -23, -89, 83, -40, 4, 88, -61, 47, 69, -94, -22, 20, -28, -33, -70, -31, -54, 78, -43, 49, -77, -67, -38, 87, 46, -77, -37, 47, 15, -3, -74, 85, -57, -8, -36, 18, 73, -47, 19, 66, -94, -47, -58, -81, -17, 52, -58, 100, 26, 54, 52, -65, -35, 20, -92, -18, -22, 80, -80, 77, -85, 93, -75, 71, -72, -3, 73, -30, 76, 42, -84, 36, -69, -35, -42, 59, 10, 70, -18, 9, -42, -71, -90, 18, 53, -7, -99, 61, 68, -70, -38, 82, 16, 88, 26, -65, -61, -78, 53, -83, -22, -67, 55, 6, -52, 91, 98, 90, -39, -59, -77, 62, 82, 76, -24, -6, 86, -18, -8, -79, 4, -16, -40, 57, -32, 87, -95, -16, 13, 38, -77, -22, 9, 3, -50, -82, 77, 30, 30, 27, -9, -70, 5, 23, 12, 74, 35, -84, -2, -1, 3, -56, -4, -41, 13, -80, 97, 11, 48, 24, 85, 82, -73, -20, -19, -55, -57, -12, 52, 98, 76, 17, 73, 19, -38, -24, -13, 39, -23, 84, 100, -37, 58, -97, 81, -18, 92, -95, 92, -10, -79, 44, 86, -72, 94, 44, -99, -69, 49, 2, 85, 80, 74, 31, 65, 16, 40, -40, -37, -24, -68, -3, 65, 25, 56, -40, -69, 38, -83, -56, -80, -89, 2, -81, -94, -10, 98, 29, -58, -4, -80, -72, -69, 72, -25, 2, 12, 86, 3, 30, -62, -50, 15, -93, 9, -55, 93, -95, 11, -43, 68, 21, 14, -47, -25, 68, -53, -31, 54, -54, 16, -78, 41, -40, 94, 25, -25, 52, -36, -5, 51, 80, 5, 100, 77, 28, -62, -57, 4, -7, 32, 22, 95, 23, 8, -29, -36, -22, -13, 42, 77, -95, -35, -32, 14, 66, 4, -3, -5, 56, -55, 21, -70, 51, 18, 25, 42, 47, 31, 85, 88, 26, 7, 37, -60, -48, -14, 98, 20, -25, -53, 42, 34, -29, 98, 70, -97, 23, 78, -30, 25, -42, 8, -60, 88, -71, 22, 45, -71, 34, -49, 75, -78, 23, 64, -30, 2, -48, 4, 72, 76, -52, 10, 74, 6, 52, -10, 54, 39, 50, -84, -57, -30, 24, 51, 98, -8, -41, -48, -27, 43, 6, -3, -76, -35, -51, -32, -23, 67, 33, -37, -73, -92, -95, 44, 67, -2, 72, -19, 18, 70, 73, 90, 28, 86, -38, 24, -83, -15, 92, -81, 83, 81, -53, -47, 1, -12, 43, 47, -54, 34, 50, 60, 67, 9, -96, 72, 10, -60, 35, -19, 77, -70, -97, 93, -45, -96, -20, -47, 23, -5, -8, -21, -100, -28, -40, 25, -94, 57, 24, -86, 7, -97, -38, -31, -63, 74, 87, -99, 96, -93, -50, 16, 11, -82, -7, -70, -21, 1, -79, -68, 99, 64, 39, 13, 96, -37, 52, 81, -72, -88, -75, -79, -8, -25, 9, -9, -28, 18, -91, -53, 69, -11, 86, 80, 67, 89, -95, 31, -10, -46, 25, 96, 30, -94, -13, -15, 39, -2, 44, 94, -26, 97, 6, 63, 44, -15, -100, 19, -34, -2, -52, -50, -30, 19, 70, 11, -70, -77, -64, 92, -38, -45, -83, 5, 92, 56, -24, -97, 20, 39, 83, -53, 46, -75, 7, -63, -21, 52, 83, -73, -40, -12, -12, 78, 39, -93, 21, 2, 85, -13, -78, -64, -90, -84, 83, 80, 94, 29, -72, -44, 61, -23, 21, 11, -8, -99, 23, -70, 16, 12, -57, 26, -11, 83, 81, 80, 13, -27, -55, -47, 58, 8, -77, 52, 62, -44, -29, -32, -73, -68, -48, 21, -85, 53, 39, -14, 4, -24, -14, -70, -1, 54, -65, -42, 5, -98, 20, 59, -86, -26, 93, 90, -100, 32, -11, -95, 32, 15, -28, 55, -32, -57, 43, 98, 49, 100, 50, 70, -33, 70, 53, -60, -31, -70, -84, 36, -46, -95, 97, 91, 31, 6, 94, -13, 83, -83, 59, -53, -72, 59, 52, -25, -38, -92, 98, -87, -81, -91, 38, 66, 46, 46, 70, 88, -31, -29, -36, 50, 3, -41, 37, -38, 29, -65, 17, -44, 93, -22, -81, -59, -80, 93, 65, -8, -23, 96, -77, -75, 29, 73, 8, -67, 89, 68, -2, 42, -46, -98, -25, 65, 78, 44, -52, 48, -13, 51, -61, 47, 3, 62, 75, 60, 3, 83, -60, 81, -57, -20, 99, -17, 38, 41, 69, -89, -84, -11, -76, -75, 74, 52, -41, -41, -74, 70, -25, -81, 90, 52, 54, 79, -19, -91, 77, -71, -100, -47, -97, 34, -71, -11, -36, 23, -72, 52, -61, -75, -84, 58, 88, -93, -32, -100, -22, -30, -55, 7, -2, 23, 47, 67, -99, 88, -30, 2, -24, -4, -71, -71, 72, -77, 83, -40, 40, 24, -21, 83, -86, -90, 39, -15, -12, -98, -77, -12, -92, -55, -7, -30, 87, 38, -91, -98, -82, 29, 44, 29, 80, 43, 12, 37, 95, -58, -43, 12, 87, 21, 51, -16, 5, 43, -1, -2, -92, -95, 7, 92, 51, 37, -19, 100, -74, 18, -1, -98, -63, 100, -27, -28, -84, 5, -53, 76, 70, -17, -94, 95, 25, 48, 52, -20, 88, 55, -49, -88, -67, 26, 4, 94, 31, -57, 25, 42, -93, 13, -96, 93, -15, -28, -9, 20, -55, 92, 15, 12, -35, 53, -70, -50, -60, -50, 46, -6, -28, 30, -63, 97, 72, 98, -60, 52, 77, 28, -47, -15, -88, -61, -80, 68, 88, 60, 100, -72, 24, 82, -69, -90, 79, -65, -8, 11, 58, 41, 90, 79, 81, 16, -51, 22, 81, -28, -4, -14, -4, 62, 9, 57, 9, -46, -7, 8, 28, -86, 52, -81, 98, 43, -49, -14, -36, 10, -17, 10, -31, 28, -7, 25, -85, 54, -83, -24, -57, -51, -9, -87, -49, -8, 20, -51, 22, -84, 23, 19, 30, 89, -6, 48, -68, -100, 97, 14, 83, -97, 49, 85, 71, -44, 67, -45, -38, 2, 16, 66, -94, 41, 24, -11, 45, -46, 14, 83, 84, 22, 15, 85, 14, 52, 13, -5, 97, -21, -98, 48, 59, 29, 10, -81, 14, 45, 81, -26, -65, 1, -25, -40, -41, 16, -65, 71, -33, 93, -57, -24, -11, -72, 75, 63, 35, 32, -5, 74, 25, 70, 37, -91, 33, -85, 87, -75, -80, -1, 85, 68, 5, -71, 32, 37, -6, 38, 90, 34, 86, 39, -37, 22, 12, -60, 87, 99, -73, 22, -21, 90, -98, 0, -69, -80, 20, -46, -83, -48, 11, 20, 9, -26, -40, 77, -93, -89, 78, 93, -60, 49, 26, 36, -23, 38, 40, 83, 55, -12, -37, -37, -31, -46, -64, 60, -76, 13, -78, 87, 83, 90, 35, -84, -6, -11, 84, -26, -39, -90, 94, 67, 67, 20, -45, -48, -16, -73, -15, 69, 14, -55, -83, -78, 53, -2, -72, -49, 9, 5, -55, -100, 90, 43, -76, -39, -19, -21, 43, 96, -10, 97, 20, 61, -48, 50, 70, -57, -69, -78, 47, -82, 99, -72, 45, -32, 39, -91, 10, -64, -20, -5, -46, 31, 27, -38, -89, 45, -93, -69, -52, 3, 90, 86, -14, 94, -2, 66, -51, 98, 53, 50, -5, -38, 93, 66, -35, 2, -55, 42, -85, 19, -11, -29, -85, -16, -62, 38, -65, -83, 50, -24, -52, 69, 2, -57, 8, 28, -94, -53, 11, 43, -53, 70, -50, 6, -35, -70, -62, -92, -60, -38, -87, -43, -13, -4, -3, 91, 55, 31, 61, 31, -31, 85, -15, -97, -51, -96, -26, -56, 62, 16, -74, 29, 81, 17, 99, 3, 75, -52, 9, -23, -100, 19, 60, -66, 81, -45, 42, 96, -97, 9, -17, 91, -79, -77, 74, -26, 9, 33, 54, 37, 66, 9, -11, -64, -47, -50, -41, -29, 27, -50, -39, -52, 78, -73, 63, 52, 63, -24, 87, -94, -36, 100, 22, -65, -28, -71, -54, -10, -72, -96, -36, 14, 96, -38, -8, 83, -84, 26, -50, 12, -64, -13, 15, 24, 36, -63, -48, 40, -11, -48, 18, 18, -52, 21, -31, 62, -85, -88, 20, 38, -14, 29, -7, -82, 3, -56, 73, -54, 76, -22, -59, 60, 7, 68, 18, 96, -15, 10, -82, -62, 34, -62, -3, -67, 71, 96, -33, 90, 98, -53, -98, 61, 12, 36, -40, 47, 67, 24, -89, 2, -73, 75, -26, 34, -19, -18, 41, 46, -47, 87, -34, 61, -12, 68, 58, 66, -23, 79, 74, -81, -5, 79, -6, -30, 89, 32, 84, 31, 38, -82, 1, -74, -72, -83, 64, 88, 74, -12, -81, -31, -1, 76, 42, -83, -63, 19, -12, -17, 49, 3, 87, 10, 93, -75, -37, -43, 30, -71, -82, -91, -12, 73, 46, 26, 85, 23, 6, -16, -95, -50, 41, -43, 35, -99, -83, 84, -9, 62, 93, -45, -58, -28, -29, 16, -93, -96, -88, -94, -80, -64, 72, 79, 75, -39, 0, 18, 78, 31, 19, -15, 83, -26, -67, -56, 43, 36, -85, -6, 58, 40, 27, -96, 22, 26, 74, 66, -83, 47, 29, -61, 57, -91, -37, -59, 80, -8, 80, -61, 43, 75, 24, -40, 65, 13, -57, 42, -6, -40, -94, 23, -71, 63, 12, -11, 38, 22, 97, 5, 56, -9, -8, 33, 11, -50, -21, 9, -63, 100, -79, -11, 81, 67, 34, 9, 67, 6, 23, -77, -60, -50, 66, 1, 13, 70, -32, 86, 52, -7, 19, -76, 100, 51, 89, 3, -58, -42, -47, -22, 53, -47, 88, -26, -8, 71, 36, -59, 56, -22, -20, -43, -15, 90, 76, 6, 38, 1, -47, -71, 93, -36, -43, 84, -64, 17, 81, -28, -32, 51, -38, -7, 78, -86, 74, 100, 73, -71, 12, -22, 47, -44, 76, -45, -45, 52, -92, -79, -24, 64, 23, -73, 41, 57, 66, 84, 32, -89, 62, 68, -38, 69, 24, 92, 92, 5, 70, 87, 47, -3, 18, 90, 18, 51, 99, 62, -60, 21, -85, 21, -21, 5, -95, -81, 83, 35, -4, -95, -93, 89, -87, 30, 29, -79, -16, 97, 98, 33, 77, -57, -93, -77, -74, 80, -50, 55, 86, -32, 100, -76, -57, 74, 18, 8, 19, -88, 80, -48, -64, 90, 93, 14, -61, -23, 88, -6, 33, -76, 2, -55, 58, 1, 90, -10, -7, -33, -62, -21, 63, 34, -16, -35, -46, -29, -59, 54, 29, -31, 31, -80, -100, 65, -41, -25, -10, 41, -13, -19, -84, -28, 74, -45, 26, -48, 27, 45, 96, -53, 36, -47, 62, 73, -100, -60, -28, 59, -24, -61, 38, 89, 73, -53, -58, 78, 88, -59, 53, 3, -90, -76, -61, -76, -17, 5, 18, 7, -27, 79, 12, 30, -62, -10, 62, 67, -79, 89, -82, -87, 8, 77, 89, -58, -46, 67, -89, 92, 61, 7, -18, -78, 98, 34, 92, 45, 35, -12, -59, -8, -8, -100, -22, 42, 55, 63, 5, -55, -80, 76, 66, -63, -92, -81, -17, -93, -87, -39, 62, -46, -56, 48, -48, 81, -15, 70, -95, 82, -57, -10, 95, -97, 20, -38, -9, 85, 81, -20, -63, 87, -49, 56, 67, 98, -93, 4, 62, 14, 22, -85, -83, 86, -67, 31, 96, 26, 92, -40, -55, 48, -24, 22, 65, -28, -15, -20, 87, 63, 33, 66, 56, 54, -32, 36, 51, 90, 46, -4, 22, 57, 85, 67, 18, 95, -69, 12, -36, 61, -16, 58, -42, -75, 49, 61, 20, -88, -46, 35, 89, 49, -45, -17, 48, -3, 76, -7, 33, -66, 54, 25, 12, 67, -87, -27, -49, 5, -61, -58, 11, 85, -98, 42, 72, -6, 38, 66, -82, 47, 98, -45, -23, 17, 31, -92, 52, 74, -52, 54, -73, 89, -85, -14, 73, 73, 67, -18, -67, 37, -100, -35, 14, 44, -54, -77, 77, 3, -72, -29, -15, 3, 40, 91, 55, 32, -27, 36, 41, 1, 37, 60, -26, -61, 33, -84, 63, -31, -40, 10, 76, 96, -18, 98, -77, -50, 69, 46, -39, -34, -71, 6, 65, 33, 10, 49, 20, -90, -29, -10, -72, 18, 18, -93, -21, 62, -29, 99, 72, -68, -96, 89, 64, 44, -79, -23, 59, -87, 47, 49, -71, 81, 60, -96, -83, -38, 73, 34, 56, -44, 74, -92, 86, 11, 4, 22, -30, 98, 12, 70, -42, -95, 9, 10, -48, -37, -97, -100, -31, -70, -36, 16, 96, -82, 96, 17, -32, 76, -70, 87, 98, -22, -46, 26, -24, -10, 65, 60, -95, 40, -81, -1, 64, -56, 100, -20, -42, -49, 45, -76, 22, 28, -60, 1, -83, 28, 66, 58, 1, -30, 65, -93, 61, -28, -12, -74, 68, -94, -69, -28, -2, 11, 43, 29, 70, -70, -21, 74, -68, 44, -2, -47, -47, 78, 79, 34, 81, 38, 89, -71, -19, -44, 73, -31, -35, 82, 6, 85, -91, 31, -27, -28, -39, 8, 70, -59, -77, -96, -2, 95, -2, 19, -24, 0, -5, 72, 86, 19, -36, 90, 20, -11, 94, 76, 14, -24, -69, 11, 77, 85, -49, -78, -71, -31, -30, 10, 57, -64, -53, 59, -31, -66, -33, 59, -42, 17, 62, 11, 43, 18, 14, 4, 79, -35, -95, -87, 56, 5, 53, -83, -97, -44, 18, -48, 1, -76, 74, 79, 61, 43, -7, 26, 23, -65, 55, 92, -29, -48, 69, -22, -3, 46, -57, -71, -27, 71, 16, 54, -17, -28, -67, 26, -16, 51, -45, -94, 95, -50, 35, 83, -43, -16, -32, -93, 93, 51, 69, -47, 43, 31, -42, -7, -55, -7, -2, -88, -64, 81, 76, -26, -43, -82, 45, 87, 44, 38, 42, 99, 7, 44, -11, 19, -96, 88, 31, -45, 3, -53, -53, 62, 8, 60, -1, -80, 1, -96, 91, 96, 48, -12, -27, 21, 59, 45, -43, -3, -22, 51, -96, 26, 80, -5, 100, 82, 32, 96, 21, 68, -3, 34, -11, 28, -49, -3, -75, 20, 90, -89, -31, -17, -82, 31, -5, -96, 20, 27, -47, 97, 84, 79, -83, -37, 37, -78, 19, 14, -19, 95, 79, -5, 74, 97, -75, 97, -2, 70, 96, 90, -35, 3, 90, 40, 78, -96, 74, 63, 63, 77, 83, -82, -81, 49, -70, 4, 89, -57, 95, 94, 0, -12, -52, -42, 31, 16, 66, 34, 98, 76, -12, -86, -94, 74, 15, 95, -3, 17, 72, 7, 5, 46, -54, -48, 54, 32, -41, -24, -39, -42, 88, -45, -23, -54, 75, 37, 59, 92, -77, -72, 34, -6, 44, -7, -76, -65, 88, -30, 62, 19, -51, 83, 27, 92, -60, -76, 61, 35, -45, -17, 57, -33, -80, -10, -91, -14, -68, 4, -18, -97, -78, 96, -48, 12, 32, -83, -84, 85, 94, 6, 12, 21, 99, 83, 67, -14, -99, 20, 2, 48, 79, 51, -48, 65, 47, -51, 66, -41, 13, 7, -62, -30, 27, -68, 56, -27, -91, 94, 30, 8, 58, -74, 97, -74, 10, -92, -95, 33, -75, -58, -82, -85, 4, -78, 56, 65, -42, -53, 47, -80, 55, 77, -68, 13, -61, 81, -91, 61, -28, -65, -26, 34, 14, -85, 78, 88, 58, 59, -56, -74, -79, 42, -93, 95, 15, 35, -14, 16, -85, 75, 61, 12, -44, 32, -57, -30, -64, 23, -73, -33, 12, 65, -55, 100, -1, -75, -26, 80, 90, 11, -38, 11, 65, 42, -2, -92, -26, -79, 97, 83, -64, -44, 87, 13, 39, 34, 93, 2, -60, 51, 52, 89, 4, 5, -57, 29, 69, 60, 44, 21, 90, 49, -100, -7, 97, 81, -87, -1, 1, -48, -95, -11, -37, -13, -68, -29, -57, 6, -67, 61, 51, -99, 35, 16, 52, 20, -69, -45, -7, -94, 75, -13, 81, 90, 100, 29, -66, -3, -79, 91, -42, 76, -49, 48, 39, -90, 81, 21, 97, -87, -68, 1, -24, -75, 41, 75, -36, -55, 26, 82, -7, -27, 27, -27, 95, 39, 81, 91, 1, -54, 64, 68, -74, 69, -15, -33, 56, 63, 8, -44, 39, 72, 47, -56, -78, 89, -67, -80, 78, 36, 12, -91, -49, -56, 79, -71, 91, 29, 76, -5, 72, -84, -73, 25, -56, -84, 86, 41, 15, 37, -20, -83, -66, 75, -43, 14, -83, 79, 57, -64, -61, -95, -22, 62, 53, 4, -10, 57, -26, 15, 51, 21, -46, -92, 5, -39, 10, 45, -50, 2, -82, -32, 16, -19, 22, -68, 7, 65, -88, 76, -28, -11, 80, 28, -89, 51, 28, -33, 34, 15, -9, 96, -62, -69, 76, 58, 7, -22, -98, 9, 74, 10, -86, -50, 6, -80, -60, 19, -98, 28, 48, -21, -2, 48, 4, -6, 76, -36, -60, -34, 23, -59, -32, 84, 70, 0, 39, -37, 7, -50, -28, -41, 98, -21, 55, 23, 98, -87, 59, -93, -74, -51, 86, -44, -98, 54, -67, -75, 67, 14, -15, 59, 68, 29, 10, 99, 5, 34, -82, -68, -99, 94, -86, -80, -23, -42, 3, -19, 17, 12, -62, -81, -100, -28, -92, -50, 65, -86, -17, -60, 74, 53, -47, 18, 97, 66, -84, 97, 27, -9, -92, -55, 33, 95, -85, 11, -14, 56, 68, 95, -39, 3, 19, 67, 89, 51, 33, -61, 97, -43, 41, -23, 72, 10, -2, -95, -78, -39, -84, -17, 11, 97, 3, 24, -73, 40, 56, 72, -81, 85, 16, -47, 8, -37, -49, -58, -14, -83, -17, -47, -41, 22, -30, 28, 12, -64, -52, -66, 4, 94, -66, -92, 64, -41, -45, 5, 10, -12, -89, -30, -30, 18, 31, 88, 72, -6, 77, -51, 2, 75, -78, -11, -8, -93, -72, 70, -48, 33, -77, 19, 23, 41, -49, -31, -97, 85, 15, -64, -53, 21, -62, -9, -35, -88, 93, -41, 25, 68, -69, 79, 32, 94, -35, -23, 79, 25, 76, -72, 65, -31, 35, 86, -46, 9, -99, 53, -38, -84, -42, -13, -85, -43, 91, -51, 53, -84, 13, -55, 5, 26, 95, -51, 70, 17, 75, -33, 46, 52, 99, 45, -50, 45, 11, 85, -37, 98, 84, 44, -42, 94, 42, -1, -75, 75, -87, 21, -92, -94, 82, 39, 44, 100, 7, 35, -10, 23, 69, 64, 47, -100, -92, 10, -77, 24, 61, -65, -97, 56, -14, 43, -93, -10, -62, -43, 39, 71, -97, -76, 97, -34, 66, 17, -77, -95, -4, -29, 60, 75, 94, 23, -99, -63, -61, -45, 2, 2, -80, 14, -66, -34, 87, 50, 92, 90, 50, 22, -59, 91, 93, -20, -60, 13, -81, -92, -44, 23, 44, -23, -83, -38, 99, -8, 99, -75, 99, -17, 99, -88, 18, 44, 14, -75, 33, -20, 31, -12, -94, -84, -15, 27, 17, -9, -51, 27, -95, 57, -27, -45, -62, 41, -47, -79, 84, -60, -11, -91, -99, 94, -53, -59, 38, 39, 41, -71, -41, 57, -63, -26, -36, 74, -62, 76, -28, -43, 6, -12, -84, 33, 42, 94, -6, 55, 100, 71, 45, 59, 96, 71, -31, -38, -43, 74, 25, 44, 66, 86, 34, -38, 16, 84, 61, -48, 93, -19, 75, 87, -58, 100, -97, -26, -7, 6, -10, -8, 79, 59, 12, -11, -7, 78, 37, 39, 66, 95, 37, -9, 4, -28, -91, 3, 50, 40, -53, 8, -12, -57, -8, -37, -61, 33, 19, -29, -3, 70, -69, 76, -27, 22, 46, -17, -49, 79, -67, 86, -20, 7, 25, -96, 93, -60, -67, 81, -81, 81, -35, -9, 45, -57, 2, -53, -66, 10, -62, -98, -82, 24, 45, -18, -96, -46, -88, 61, -83, -33, -1, 99, 70, 92, 68, -63, 65, 40, 24, -79, -72, 36, 9, 7, -33, 3, 44, 64, 91, 94, 31, -61, 43, 38, -75, -6, -3, 99, 2, 92, 24, -99, -10, -56, 70, -98, 61, -21, 92, -37, 34, -66, -79, 75, 59, -75, 19, -95, 73, 82, 17, 82, -16, 84, 20, -38, 28, 48, -81, 100, -72, -58, 72, -36, 30, -5, -81, -20, -64, -63, -56, 69, -55, -41, -5, -88, -70, 23, -33, 15, -39, 76, 45, -26, 5, -48, 45, -50, 68, 0, 0, 94, 92, -18, 22, 33, 64, -89, -20, -99, -48, 52, 55, 72, -64, 44, -32, -45, 20, -43, -97, 2, 82, -52, -63, -56, 7, 57, -64, 83, 54, -69, 38, -43, -24, 62, -84, 57, 45, -71, -11, 18, -85, -26, 81, -97, 26, 4, 42, 54, -97, 62, -16, -38, -1, -35, -62, 55, 61, 60, 77, 87, -29, -29, -59, -15, -10, -73, 54, 18, 28, -10, -93, 20, -55, -77, 14, 67, 78, 18, -77, -79, -33, 35, -43, -86, -93, 69, 66, -66, 68, -53, -5, -30, -57, -4, -66, -74, 92, -31, -35, -30, 99, 90, -21, -72, -70, 91, 80, -33, -76, 16, 40, -20, 67, 99, -14, 34, 59, -77, -100, 10, -54, 78, -65, 54, 97, -59, -25, -11, -12, -33, -31, 9, 25, 40, 52, -6, -79, -80, 42, 94, 64, -56, 53, 10, 82, 77, 62, 68, -29, 15, -90, -13, 35, -47, 28, -81, -1, -67, -44, 40, 24, 81, -48, -49, 33, -65, 52, -10, 85, 82, -6, -98, -73, 21, 95, 65, -67, -17, 40, 10, -96, 27, 87, -13, 14, 1, -84, 84, -70, -9, 92, 93, 60, 3, -8, 31, -19, -46, 51, 59, -28, -54, 43, 48, -7, -34, -4, 58, 19, 41, 33, 96, 56, 82, -64, 86, 63, 9, 86, -23, 91, 70, 17, -59, -27, 24, -41, 89, -37, -43, -99, -23, -30, 19, -93, 83, 63, 96, -88, -62, 1, -20, -95, -82, 52, 30, 4, -48, -73, 53, -54, 35, -44, -46, -22, -100, 67, -78, 81, -59, 77, -97, -93, 63, -91, 15, 57, -1, -85, 57, -37, 7, 20, 38, 61, -46, -18, -97, 76, -57, 58, -53, -2, -3, -75, 2, 97, -4, -89, -56, 35, -92, -100, 32, -30, -47, 3, 51, 53, -91, 88, -61, -57, 11, -89, -79, 54, 94, -19, 96, 41, 52, -49, 11, 17, -42, -63, -81, -23, -81, 83, 0, 9, -71, 6, -60, -17, -30, -38, 96, -6, -72, -24, 71, -22, -18, -44, 51, 46, -84, 11, 96, 88, 31, 49, -95, 57, -8, -26, 38, -53, -55, 54, 46, -15, -9, -42, 23, 95, 81, -18, 44, -51, 67, -1, -14, 13, 38, 21, -87, -88, -13, -21, 55, 71, -38, 2, 5, 88, -84, -51, 53, 34, 22, -22, -85, -84, -11, 62, -17, -17, 50, 96, -92, -83, -26, 75, -29, -10, -35, -78, 37, -63, 27, -42, -33, -16, 18, 70, -89, 11, 15, 80, 41, -49, -17, 10, 99, -40, 68, -80, 75, -45, -66, -57, -62, 42, 39, 16, -93, 23, 0, -34, -7, -8, 28, -21, -59, -70, 21, -27, 57, -58, -75, -89, 26, 3, 86, -32, -28, -90, -54, -78, -20, 70, -24, 22, 66, -28, -46, -83, -7, 69, 53, -83, 27, -60, 69, -68, -58, -87, 82, -43, 37, -73, -87, 53, -27, 44, 61, -87, 53, 61, -77, 3, -31, -81, 66, 20, 72, -67, 49, -30, -68, -95, -85, 99, 8, -78, 45, -87, -51, -40, -65, -86, -96, -48, -53, -90, -99, -14, -77, -33, -22, -89, 86, -34, 59, -65, 48, 11, 97, 93, 21, 36, -57, -42, 51, 26, -38, -60, -25, 6, 29, -6, -73, 43, -42, 28, -15, -100, -70, -79, 86, 18, -73, 15, -25, -74, -14, 28, 23, 6, 29, -6, -35, 76, -82, 55, 97, 66, -82, 26, 15, -37, -43, -84, 97, -22, -60, -96, -78, 96, 25, -91, -33, 39, 10, 37, -41, 26, -71, 13, 51, -32, -88, -92, 45, 62, 31, 68, -75, 24, -57, 69, -91, 4, 5, 100, -100, 81, 43, -55, 40, -37, -23, -14, 82, -38, 45, -40, -9, 22, -81, 92, -37, -25, 91, 6, 40, 95, 97, -44, -56, 19, -15, -63, 81, 63, -34, 20, 25, -90, -3, 54, -14, 44, 21, -3, -68, 32, 22, -20, -39, -36, 98, 24, 94, -11, -57, 20, 41, -10, -44, -53, 44, -57, 31, -20, -4, -71, 20, -16, 82, 57, 45, -17, -3, -9, -28, 71, 89, -70, 8, -85, -6, -24, 50, 41, -99, 39, 85, 27, -9, 83, -77, -64, -72, -59, -83, 30, -88, 5, 56, 93, -42, -9, 75, -97, -50, 32, 66, -60, -96, 35, 83, 52, -10, 79, -49, 34, 88, -54, 26, -19, -35, 86, 32, 71, 69, -40, 90, -51, 65, 81, 71, 51, 27, -38, 66, 39, 90, 2, -92, -22, -14, 8, -79, -65, -27, 55, -45, -2, 56, -96, -97, 78, -86, 87, -75, -78, 24, 2, -72, -15, -44, -39, 86, -53, 10, -66, -55, -68, -30, -91, 75, -57, 25, 13, 97, 22, -38, -52, 99, -16, -60, -3, -62, 6, 50, -88, 5, 10, 80, -31, -44, -25, 94, 75, -81, -39, 72, -38, 35, 53, -63, -9, -2, 7, 4, 68, 6, 1, 29, -94, 26, 4, 52, -50, -51, -37, 39, 80, -26, -91, 88, 82, -2, -33, 69, -35, 71, -73, 6, 9, 10, -23, 85, -8, 29, 82, -67, 47, -54, 17, 27, -75, -17, -100, 92, -4, -14, -26, 7, -86, 41, -46, 28, -68, -31, -45, -78, -47, -11, 30, -55, 33, 52, -84, 55, 59, -8, -78, 43, -5, 53, 60, 85, 75, -18, -46, 68, -39, 44, 1, -42, 41, 48, 90, 73, -46, -39, 66, 69, -53, 2, -73, -17, 33, -42, -11, -31, 66, 84, 81, -41, 44, 67, -35, 14, 23, 81, -30, -57, -17, 94, -44, -65, -44, 20, 70, -57, -39, 14, -18, -40, -7, -90, -24, 19, 60, 1, 20, 11, -35, 9, 19, -78, 76, 47, -86, 93, -71, -97, -37, -36, -93, -49, 41, -43, -90, -42, -77, -13, 59, -55, -73, -85, -59, 2, -85, -1, 39, 89, -67, -63, 26, 74, -79, -21, -13, -98, -100, -48, 91, 71, -54, 65, 90, 14, -60, 48, 72, 40, 93, -35, -58, 89, -12, 75, 12, -75, -2, -40, 24, 18, -39, -19, 41, 81, 68, 87, 36, -57, -45, -98, -3, -4, -10, -42, -28, 40, 57, -48, 78, -59, 53, 86, -32, 9, -9, -98, -60, 24, -100, 92, 14, -31, 25, -51, -21, -4, -42, -27, -38, -76, 37, -24, 23, 28, -2, -87, 48, 85, -63, -100, -17, 32, -57, 92, -44, 3, -56, -41, -35, -54, 14, -75, 36, -50, -7, 9, 35, -96, -62, -33, -61, -65, 48, -4, -75, 3, 2, -26, -16, 12, -45, -44, 86, 27, 0, 34, 69, 40, -17, 61, -1, 80, -55, 84, -40, -45, -72, 10, -9, 41, 95, 1, -30, -88, 44, 56, -20, -1, -18, 15, 24, 100, -99, -39, -81, 83, -11, 79, 52, -39, -84, -62, -91, 86, 52, 9, -73, -40, -43, -57, -18, 50, 24, 44, -22, -16, -63, -71, 46, -69, -81, 1, -37, -65, 92, 70, -75, -94, -67, 63, 33, 64, -39, -15, -28, 27, -41, -37, 77, -49, 44, -41, -24, 18, 81, 37, 24, 52, -83, -37, -22, -42, 54, -43, -40, 17, -22, -30, 70, -13, -14, 38, -13, 32, 85, -62, 75, -21, -81, -20, -82, 87, 53, 52, 42, 48, 74, 62, 71, 33, 15, 0, 50, -62, 100, 45, 67, -65, 55, 91, -18, -7, 85, 65, 71, -99, -28, -66, 28, 73, 87, -38, -6, -56, 24, 84, -64, -94, 9, 43, 77, 41, 33, 88, 48, 37, -69, 33, -99, -62, -52, -74, -45, -87, 50, 2, 17, 21, 4, 78, -76, -48, -90, 62, 82, 85, 95, -64, -92, -73, -46, 73, 26, -31, -74, -91, 50, 48, 72, 25, -98, 86, -58, -2, -94, 54, 89, -59, -4, -97, 89, 35, -17, 44, -96, 90, 12, 36, 35, -94, -64, -46, -34, 35, -32, -96, -84, 10, -43, 90, 54, 3, 12, -9, -33, -73, -12, 85, 77, 5, -34, 21, 58, 0, -89, 82, 0, -97, 20, -59, 81, -79, -100, -53, -58, 1, 47, -83, 97, 76, -25, 44, 80, 49, -19, -91, -77, 39, -97, 69, 25, 32, 53, 86, 89, -21, -96, 53, -18, -95, 51, 80, -94, -91, 66, -23, 55, -59, -39, 24, 79, -79, -44, -5, 38, 41, -70, -97, 8, 49, 17, -8, -2, 91, -24, -18, 14, -40, -1, 33, -22, 95, -95, -35, 63, 42, -25, -61, 68, -94, -79, -29, 5, 38, 29, -71, -33, 80, -12, 48, 52, -28, -29, 32, -35, -16, -52, -93, 54, -99, -73, 38, -55, 25, -80, 69, -69, 59, 98, 49, -24, -80, 49, -67, 37, -36, -36, -13, -34, -58, 14, 68, 40, 17, -97, -78, -31, 61, -60, 45, 19, -11, 60, 52, -49, 44, -50, 30, -46, 83, 18, 12, -66, -33, 86, -9, -42, -88, -39, -7, 74, -98, -80, 3, -36, 45, -88, 98, -24, 8, -5, -8, -56, -39, -71, -87, 80, -91, 99, 58, -95, 18, -82, -89, 16, 91, 2, 13, -19, 82, 94, -92, 33, 28, 69, -8, 82, 76, -2, -2, -71, -66, -38, 49, 70, -73, 45, -69, -32, 81, 61, 58, 9, -4, 31, 41, -86, 87, -81, -81, 76, -2, -33, -83, 51, 54, -68, 24, -37, 52, -32, 45, -56, 9, -81, -66, 33, -10, -92, 79, 55, -82, 2, -16, -38, -6, 34, -64, -12, -9, -65, -84, -11, -9, 64, 87, -52, -20, 83, -67, 57, 54, 78, 36, -81, 74, 46, -33, -24, 1, 39, 24, -28, -22, 12, 32, 96, -76, 0, -70, 73, -67, 68, -33, 21, 65, -55, -32, -74, 70, 98, -56, -83, -69, -99, 68, -81, 85, -63, -100, 96, 81, 41, 52, 36, 88, 79, 35, -85, 13, -93, -78, -28, -67, -83, 8, -57, 42, -86, -8, 26, 20, -78, 92, -30, 8, -69, 13, 59, -68, 70, -88, 15, 36, 89, 84, 75, 70, -34, -69, -28, 4, 87, 28, 84, 12, 5, -32, -32, 95, -40, -93, -94, 64, 69, 59, 44, 55, -31, 75, -47, 69, -65, -35, 58, 92, -98, -88, 58, -72, -44, 60, 80, -91, -38, -28, 92, 7, 0, -5, -4, -99, 9, 29, 22, 96, 15, -64, 29, -40, -61, 90, -76, 22, 65, -64, -74, -17, 77, 61, -57, -29, 31, 79, -46, -28, -89, 41, 62, -95, -54, 50, 14, -33, 92, -42, 36, 18, 85, -53, 90, -92, 71, -55, 42, 80, 75, -29, 27, 69, 9, 44, -66, 58, 31, -53, 41, 52, -55, -53, 67, 77, -94, -6, -41, -66, 90, 47, 43, 49, 63, -82, 29, -33, -3, -94, -54, 76, -58, -69, 44, 27, 18, -87, -20, 59, 87, 87, -49, 93, -97, 90, -68, 5, 28, -4, -37, 27, -64, 25, -31, 34, 3, 51, 13, 95, -46, 20, 22, -98, -9, 50, 63, 84, 18, 75, 40, -40, 51, 70, 0, 15, -68, -23, -77, 49, -49, 0, 15, 22, -95, 46, -25, -11, 56, 22, -37, 41, -20, 57, -30, 48, -36, 12, 1, -97, 73, 35, 45, -41, -56, -29, -6, -70, 55, 19, -37, 64, -34, 8, -33, -66, -3, -65, 84, 97, 31, -52, 66, -83, -41, -15, 37, 12, -78, -33, -42, -11, -94, -88, 30, 67, -90, -50, 50, -69, 68, -59, 65, 94, 99, 1, 20, -23, -29, 5, 18, 69, 70, -68, -22, 64, -23, 18, -44, 91, 91, 87, -49, -29, -33, -1, -19, 54, -42, -82, -98, 100, -62, -35, -28, 83, 33, -73, 75, -3, -8, 75, 94, 81, 25, -85, -66, -26, 6, -14, 57, 75, -32, 15, -93, 6, 6, 13, 78, -91, -73, 63, -41, -91, 41, 1, -38, 74, 96, -45, 33, 46, 79, 89, 27, 76, -23, 38, -55, -32, -56, -6, 7, -43, 59, 14, -91, 40, 10, -88, -65, -15, 27, 100, 21, 46, 17, 34, -86, -20, -55, -53, -35, -97, -98, -98, -32, -8, -73, -78, -71, -39, -14, -50, -60, -37, -58, -10, -43, -42, 67, 73, -39, 76, 15, 10, -78, 71, 71, -82, 71, -90, -41, 65, -98, 43, -92, -60, -63, -32, 92, -66, 26, 62, -53, 6, -93, -74, -92, 57, -87, 50, -72, -75, 42, 14, -28, -20, 100, -34, 43, 40, -11, -5, 51, 17, -39, 84, -65, 87, 23, 100, -79, 4, 13, 9, -98, 63, -4, -65, -91, -1, -80, 76, 3, 14, 36, 11, 19, -22, 79, -5, 75, 87, 7, 18, 77, 66, 43, -73, -95, -40, -95, 21, 93, 4, 67, 98, -39, -73, -21, 74, -92, 79, -86, 61, -81, -41, 85, -26, -7, -34, -99, 77, 41, 83, 96, -57, 73, 33, 35, -62, -8, -57, -74, -85, -62, 28, 78, 90, -68, -51, 2, 81, -74, 23, -15, 46, -73, 50, -37, 66, -52, 86, 47, 88, 10, 27, -92, -78, 34, 58, -41, -40, -26, 53, -1, -47, -70, 68, -73, -11, -95, -67, -9, 7, -92, -8, -3, -89, -85, -30, 58, 60, 34, -98, 47, -96, 94, -63, -22, -2, 83, 50, -99, -1, 48, 41, 89, 38, 31, -54, 15, -7, -1, -81, 79, -85, 72, 35, 89, 48, -37, 3, 57, 63, 32, -63, -82, -27, 54, 40, 36, -84, -6, 71, -56, -13, -59, -50, 85, 12, 85, 57, 32, -93, -64, -54, -1, -12, 72, 32, 90, -15, 74, -76, 25, 77, 72, 15, 19, -71, -53, 78, -7, -46, 82, -55, -70, 61, -9, -27, 95, 60, -45, 85, 21, -44, -84, 38, 98, -84, 4, 37, 53, 33, -20, -85, 2, -11, -97, -39, 91, -45, 50, -68, -70, 34, 32, 64, -100, 97, -56, -54, 95, -71, -20, 87, -77, -70, -73, 72, 31, 88, -62, -18, 51, -30, 73, 80, 75, -92, -79, 26, -99, -10, -85, -96, 39, 79, 53, -86, -34, -28, 86, -9, 66, -38, -1, -76, -60, -73, 10, -80, -40, 2, 84, 38, 46, -26, -100, 59, 8, -24, 61, -84, 82, 10, -82, -27, 69, -42, 100, 14, -63, -70, 93, 5, 10, 96, -51, 25, 57, 2, 62, -42, 20, 44, -6, 93, 48, -7, -49, 92, 41, -85, -46, 36, 35, 100, 61, 8, 60, -7, -94, 48, 32, 98, 39, 86, -20, 85, -13, 64, 7, -18, -56, -21, -76, -74, -50, 18, 69, 7, 98, 69, -41, -29, 85, -21, -29, -5, 25, 49, -5, 85, 38, 8, -95, -79, 2, -89, -74, 28, 91, -21, 66, -41, 15, -31, 81, 52, 47, -65, 50, 28, 54, -49, 29, 48, 36, 10, -13, -53, 4, 66, -59, 98, -7, -56, 29, 94, 70, 3, 6, 45, -62, 33, 69, 79, -74, 42, -82, 89, -37, -50, 74, -44, -81, -81, -19, 91, 0, -63, -63, -36, -25, 32, 91, 22, 24, -74, 2, -81, -41, 67, -18, -95, 100, 63, 11, 92, 38, 76, 13, -17, 55, -79, -17, -54, 1, -21, 93, -76, -10, -34, 59, 44, -61, -71, -42, -73, -54, 16, 50, -18, -44, 28, -72, 77, -37, -2, -64, 88, 27, 34, -11, -14, -37, -83, -72, 13, -41, -47, -29, 48, 48, -43, 76, -65, 44, -21, 80, -86, -61, -20, -50, 92, 40, 65, -4, 53, 42, 16, 32, -99, 14, -23, -8, 92, -24, -41, -5, -3, -45, 17, 18, -63, 84, 1, -50, 68, 26, 2, 97, 79, 28, -16, 2, -83, -74, -9, -29, -6, -25, 69, -95, -11, -21, -18, -19, 51, -56, -30, -94, 43, 25, -43, -44, 69, 10, 41, -45, -89, -8, -86, -93, 85, -48, 36, 73, -9, -94, -57, -87, -26, 14, -9, 33, 62, 97, 88, 51, -28, 29, 78, -70, 25, 18, -74, 9, 58, 5, 97, 70, 19, -19, -49, -87, 86, -81, 17, -49, 0, -61, -33, -57, 33, -14, 19, -44, 85, -29, 57, -49, -90, 74, -96, 30, 42, 29, -99, 99, 81, 73, -7, 26, 25, -60, 96, -71, -57, -91, -71, -26, -52, 62, 92, 44, 58, -31, 79, -75, -1, 32, 10, -87, -50, -86, 27, 39, -55, 91, -29, 86, -6, 53, -72, 31, 77, -76, 67, -69, -1, -64, 25, 37, 65, 88, -1, -74, 34, 100, -2, 36, 86, -65, 17, 57, -82, 68, -46, -17, -95, 22, 6, -13, 49, 97, 51, -39, 69, 49, 43, 40, 19, -64, 79, 51, 24, -84, -85, 28, -16, 24, -100, -71, -77, -55, -99, 42, -72, -2, -39, -88, -36, -56, -54, -85, 25, 6, -98, 3, 97, -6, 32, 53, -9, -86, 100, 82, 49, -64, 56, 53, -31, 38, -1, 47, -17, -10, 97, -68, 20, -71, 77, -67, 32, 39, -25, -26, -49, -50, 48, 98, -43, -3, 24, 91, -8, 33, 76, 99, -64, 37, 93, -45, -18, -30, -35, -56, -14, -6, 95, 91, 43, -91, 48, 39, -88, -20, 16, 37, 21, 40, 61, -42, 27, -52, -95, -89, -72, -24, 23, -75, -33, -85, -48, 46, 74, 59, -31, 97, 88, -96, 86, 29, 29, -98, 97, -6, -58, 32, 77, -91, 54, -77, -79, -12, -98, 43, 57, 11, 70, -97, 6, -61, -85, 4, -29, -13, -85, 17, -10, 93, 82, -81, 78, -17, -18, 84, 25, -50, -83, -20, 86, -4, 16, 23, -73, 96, 55, -12, 40, -95, 56, 5, 18, 36, -72, 65, -36, -45, -71, 13, -5, 20, 86, -43, 37, 48, 83, -75, -86, 62, -12, -86, -4, -26, -13, -95, 55, -38, -72, -53, 90, 85, 48, -79, -74, -16, -22, 84, 37, -79, 71, -17, -18, 55, -51, 78, 28, 61, 62, -40, -71, -25, 95, 67, 92, -64, 91, 28, 42, -88, 56, 82, -56, -97, 91, -86, 3, 75, 83, -10, 97, 42, -62, 96, -22, -41, -7, 71, -58, 31, -24, 77, -62, -47, 50, 87, 62, -47, 85, -39, 75, 34, 72, -88, 80, 14, -62, -17, 45, 49, 63, 4, 80, 11, -29, -98, 89, 56, -28, -93, -25, 73, -9, 83, 5, -52, -58, 37, 40, 84, -99, -36, -15, -4, 69, 85, -91, -38, 2, 98, -40, -100, 53, -96, -66, 24, 40, -74, 39, -7, -51, 86, 58, -32, 64, -99, 1, 98, 92, -98, 47, 29, -59, -58, -80, -56, -81, 70, 77, -58, -77, -19, -17, -41, -69, 21, -96, 29, 53, -76, 77, -15, 66, -15, -26, -90, 90, -33, -4, 45, 7, 21, 55, -59, -41, 49, 67, -39, 30, -30, 90, 20, -81, 98, -30, 53, 68, 30, 70, 44, -17, -3, 80, 79, 60, -41, -33, 83, 4, 91, 35, 96, 60, 52, 98, 10, 34, -42, -68, -60, 60, -72, 66, 84, 4, 0, -37, -15, -35, 13, 21, -92, -72, -4, -27, 23, 55, 9, -48, 73, 66, -25, -43, 81, 33, -56, 67, 50, 16, 21, 69, 65, 43, -27, 74, 48, -27, 48, -76, 23, -40, -3, -47, -41, 69, 88, -69, -48, 71, 38, 17, -54, -11, -41, -65, 87, 60, -59, -88, 41, 85, 14, 0, 21, 67, -36, 32, 57, 16, 72, 0, 85, -62, 39, 61, 8, -87, 65, 43, 5, 88, 86, -26, -22, 11, -34, 38, -90, -85, 65, 57, 68, -100, 23, -63, 13, -3, -41, -82, 23, 86, -1, -33, 37, -84, -21, -16, -9, 99, -72, 33, 93, 18, 21, 10, 90, 58, 52, -14, 48, -85, 31, 6, 73, -93, 33, 24, 27, -48, 18, 91, -10, 78, -38, 33, 89, 6, 60, -99, 68, -85, 1, 18, -42, -92, 96, 16, -91, -7, -94, -8, 93, 47, 22, -38, -97, -73, -29, 62, 29, 68, 55, -26, -28, 1, 28, 54, -34, 66, 100, 67, -73, -9, 51, -19, -50, -45, -28, -75, -13, -49, 24, -95, 86, 16, -89, -38, -65, -92, -27, -34, -72, -30, -11, -93, -58, -66, 9, -79, -35, 1, 48, -7, 98, -6, 68, -60, 76, -97, -3, 92, -91, -7, -34, 37, -28, 44, 94, -48, 62, -97, -33, 12, -5, 1, 38, -57, 18, 87, 97, 89, 9, 59, -55, -78, 5, 64, 25, -11, -3, -26, 13, 85, 19, -16, -58, -13, 42, 94, 29, 98, 32, 80, 72, 3, -8, -60, 90, 99, -69, 5, -99, -91, 70, 18, 70, 0, 9, -34, -78, -3, -4, 87, -95, -88, -80, -43, 19, 55, 19, 97, 35, -24, -3, -43, 67, -15, -100, -24, 92, -91, 87, -32, 47, -39, -88, 85, 64, -91, -98, 61, -67, 57, 64, 95, -67, 59, -16, -43, 4, 51, -92, -60, 51, -76, -65, -93, 25, 13, 4, -8, -12, 86, 62, -63, -9, 18, 59, 0, 12, 78, -73, 83, -2, 35, -60, 17, -78, 81, -78, -69, 37, -20, 62, -2, -38, 94, -65, -8, 76, -55, -74, 58, 61, -25, 0, 86, 81, 93, 57, 100, 50, -92, 82, 28, -45, 66, -14, -83, -59, 10, -28, -36, 60, 57, 32, 77, 92, -91, -41, 54, -29, 55, 72, -49, 93, -39, 16, 24, -41, -15, 67, 42, -6, -94, -62, 78, -94, 39, -87, -67, 21, 66, -28, -37, -4, -89, 25, -67, -74, 49, -83, 73, 71, 45, -64, 34, -33, -21, -15, -41, -53, 78, -1, -17, -6, -49, -24, 79, -17, -47, 68, 69, 49, -62, -78, -53, 12, 19, 60, 26, -60, 57, -54, 84, -29, -44, -39, -15, -44, 95, -29, 23, 52, 67, -84, -21, 75, -62, 42, -84, -66, -68, 45, 57, 64, 10, 34, -27, 55, -3, -83, 74, -78, 47, -70, -87, -78, -99, 56, 77, -28, -42, -68, 75, 71, 39, -18, 69, -66, -60, 82, 9, 40, -62, 93, 62, 15, -29, 60, -12, 63, 40, -45, 73, 100, -2, -55, -1, 12, 10, 71, 73, -27, -32, -70, 24, -77, -69, 12, 94, -85, 84, 7, -77, -67, 27, -49, -53, -14, 18, 80, 82, -63, 29, -32, -19, 17, -48, -51, 56, -27, 82, 5, 88, -51, -85, -14, -7, -31, 71, -1, 43, -73, 84, 53, -15, 17, -90, 28, -32, 70, 73, 4, -65, -35, 84, 33, 89, 54, 24, 53, 40, -25, 45, -63, -95, 25, -9, -73, -12, -96, 86, 10, 7, 100, -56, 11, 80, -99, 76, 100, -11, 14, -38, -9, -31, 85, -97, 57, -44, -54, 45, 7, -6, -57, 79, 76, 57, 79, -64, -38, -89, -84, -67, 55, 31, -3, -55, -87, -88, 85, -52, 77, -34, -80, -50, -63, 18, -75, -95, -83, 13, 33, 68, -44, 77, -76, -53, -77, 57, -14, -56, -58, -29, 83, 100, -31, -68, -4, -56, -94, 5, 45, -31, -56, -64, 48, 71, 57, 38, -93, 32, -93, -96, -91, -86, -45, 13, -46, 30, -60, 37, 34, 90, 14, -38, -13, 53, -67, 21, 99, 66, 87, 96, -1, 6, 53, -39, 37, -1, -47, 58, -63, 13, -76, -36, -1, 77, 51, 54, 77, 77, 42, -84, -72, -96, -90, 79, 61, -20, -68, -52, 20, 58, -83, 14, -96, 57, -56, 19, 27, -63, 8, -5, -7, -72, 63, 36, -78, 30, -15, 83, 67, 83, -43, 58, -90, -59, 30, 84, -87, -55, 46, 23, -41, 58, -65, 59, 90, -75, -36, 29, -31, 25, 72, 52, -61, 45, 9, -3, -89, -77, 70, -69, 13, -54, 72, -66, 21, 27, 36, -91, -36, 86, -3, 84, -91, 46, 8, 77, -33, 3, -96, 56, 15, -96, -41, -36, 26, -73, -18, 28, -72, 78, 63, 59, -37, 41, -69, -92, 38, 75, 78, 31, -60, -76, 44, 74, -93, -43, 8, 28, -99, -91, -10, 16, 54, 40, -38, -90, 41, -5, 23, -8, 1, -3, -75, 96, -62, -9, 55, 44, 64, 7, 54, -25, -34, 21, 95, 74, 10, 61, -83, -66, -83, 97, 61, 60, 27, 99, 26, -17, -58, -19, -74, -53, -32, 98, 49, 61, 70, 15, 23, -85, 25, -87, -62, 98, 7, -89, -4, -46, 33, -61, -10, -88, -32, 51, 86, 73, -5, 100, 71, -90, 17, -40, -65, 99, 37, 28, -38, 39, -96, -23, -65, 44, 85, 49, 58, 53, -88, 90, 94, -38, -90, -32, 91, 1, 95, -69, -91, 7, -47, 82, -19, 89, 82, -14, -19, -66, -34, -36, -84, -59, 86, 97, 20, 20, 38, -23, -73, -62, 81, -1, -90, 14, 85, 16, 67, 31, -37, 75, 97, -18, 58, -99, -58, -60, -41, 11, 73, -61, -42, -56, -59, 18, 48, 30, 93, 38, -77, -51, -13, -80, 52, 31, 24, -58, 74, -78, 87, -80, 93, 78, 42, -43, -75, -42, -11, -56, 93, 62, -7, 9, -37, -17, -24, -74, -14, 58, -89, 1, -56, 27, -69, -47, 93, 12, 14, -69, 42, 3, -46, -60, 26, -61, -29, 13, 76, -63, -45, -67, 28, -91, 67, -85, 73, 51, -87, -11, 66, -83, -17, 68, -45, 63, 51, -11, -72, -79, -90, -60, 76, 38, -49, -34, -16, -26, 35, 58, 22, -95, -20, 98, -88, -95, 94, 54, 20, -56, 5, -75, -97, -64, -80, -73, -69, 2, 80, 60, -75, 44, 83, 15, -8, -71, 20, -96, 17, -95, 5, 23, 89, 37, -31, 37, 5, -57, -45, 31, -88, 21, -82, 97, -11, 89, -92, -55, -45, -27, -61, -34, 12, -18, -39, 73, 33, -72, -82, 13, 7, 42, -44, -63, -80, -50, 66, -81, -99, -69, 10, -9, 31, -94, -98, -76, 11, -92, -75, -37, -83, -10, -99, -100, -53, 90, 6, 63, 90, -26, -75, -95, -75, -58, 21, 28, -92, -74, -30, 16, 17, -98, 88, 100, 29, 23, -27, -20, 58, -36, 21, 45, 33, 1, -59, 10, 95, 3, -97, -2, 31, -36, -60, 70, 82, 46, 48, 85, 57, 15, 34, 96, -37, -99, 14, 94, 27, -22, 0, 18, -27, -92, -78, -87, -47, 23, -56, -85, 99, 1, -6, 8, 84, 35, -76, 68, -39, -24, 45, -51, 68, -67, -1, 13, -20, -89, -24, -26, 69, -46, -9, 86, 78, -13, 80, -92, -98, 17, 35, 86, -71, -34, -46, 61, 22, -58, 55, 64, 57, -30, -39, 9, -72, 14, -99, -11, 4, -44, 84, -59, -52, 84, 98, -83, 97, -74, 17, -47, 51, 61, 49, -38, 63, -9, -17, -40, -19, -59, -5, 60, -27, 36, 18, -76, 40, -54, 21, 72, 32, -70, 58, -3, 98, 68, 14, 73, -49, 6, -15, 32, -89, -80, -92, -8, -10, 44, 3, 51, 54, 35, 71, -39, -72, -18, -27, 51, -67, -41, 3, 58, 14, 31, 36, -11, -24, 20, 81, -100, 88, -28, 58, -13, -56, -41, -15, 100, 2, -14, 18, -59, 54, 85, 96, -20, 100, 61, -91, 22, 93, 10, -76, -98, 61, -30, -73, 36, -90, -8, 17, 23, 66, -8, 40, -2, -90, -66, -93, -94, -32, -31, 84, 14, 23, 62, -90, 65, -10, -16, -52, -66, 56, -13, 68, 8, 33, -91, -17, -16, 50, 73, 39, -46, 40, -27, 34, 39, -40, 52, 29, -75, 78, -32, -39, 99, 100, 66, 15, 14, 38, 91, 1, -59, -91, 22, -82, -97, -98, 41, -91, -95, -70, -70, 75, -92, 7, 23, 53, 29, -97, -95, -71, 82, 55, -40, -24, 82, 9, -65, 32, 56, -1, 39, 21, 49, -42, 9, 66, 29, -87, 37, 75, -37, 30, -29, 87, 95, -80, -7, 46, -22, -81, -43, -59, -7, 37, 50, -13, 39, -92, -22, 56, -19, 47, 92, -98, 35, -62, -37, -70, 10, 99, 22, 49, -5, -96, -43, 100, 4, -38, -40, -49, 7, 0, -68, -79, -50, -90, 26, 85, -51, 97, -84, 73, -57, 84, 32, -62, 85, 36, -78, 74, 63, -70, -17, -78, 83, 98, 73, -43, 63, 95, -13, 87, 41, -76, 98, 71, -55, 40, -39, -82, 39, 11, -11, -53, 60, 64, 33, 22, 16, -20, 70, -1, 77, 73, -28, -73, 94, -90, 47, -14, 57, 0, -65, -1, 18, -3, 95, -13, -65, -43, -73, -62, -35, 70, -96, 40, -92, 2, -44, -74, 88, 2, 77, -19, 61, -16, -36, 72, -14, -67, -1, 100, 35, -7, -53, 63, -1, -19, 93, 16, -90, -49, 63, -70, -77, 48, -5, 57, 20, -29, -4, 14, -37, 26, 16, -62, 28, -4, 69, -24, -96, 39, 56, -98, -40, 78, 63, 10, -26, 29, -72, -60, -72, -1, -37, -43, 37, -90, 34, -24, 7, 88, 93, -7, -15, 80, -36, -74, 34, -36, -43, -76, -53, -97, 35, 14, 95, 87, -97, 35, -11, -85, 46, 28, 0, 61, 11, -56, -38, -7, 33, -65, 20, 2, -35, 18, -93, 94, -74, -67, -73, 58, 44, 7, 22, 82, -92, -44, -56, 33, 41, 58, 81, -90, -32, -6, 29, 2, -84, 9, -65, 30, 90, -58, -8, -68, 1, -72, 50, 86, -20, 76, 82, -26, 55, 98, 8, 3, -29, -76, 34, 20, 100, -26, 61, 49, -34, 77, 75, 3, 18, 99, -31, -44, 52, -35, 43, -43, 16, 68, -50, -80, -22, -45, -3, -54, 17, 70, -17, 7, -70, -86, 75, -39, -31, 30, 65, -14, -43, 94, -56, 71, -93, 26, -35, -30, 88, -84, -30, -4, -65, -33, 7, -80, -55, 73, -9, 6, 23, -85, 49, 33, 83, -56, 85, 55, 44, 63, -89, -51, -42, 3, -89, 89, -61, -8, 29, -8, 7, 52, -16, -27, 26, -70, 74, 87, 100, 4, -3, 2, -60, 77, 50, -89, -30, -5, -79, -45, -85, 85, 99, 78, 33, -99, -39, 22, -59, 16, 16, -58, -49, 22, 85, 47, -45, -34, -42, -53, -66, 35, -25, -69, -56, -16, 22, 94, 1, -74, 18, -98, -44, 92, 47, 98, 20, 68, -100, -27, 8, 31, -30, -91, 26, 56, -86, -82, 85, 9, 80, -55, -83, 5, -98, -31, -79, -46, 17, 91, -60, 9, 16, 35, -36, 30, 56, -31, -83, 85, 16, -100, -79, -6, 50, 35, 56, 71, 14, -39, -82, -42, 23, -21, 46, -79, -18, -33, -96, -96, 52, -77, 28, 13, -73, -54, -16, 87, -82, -14, 41, -31, 13, -93, -64, -15, -29, 24, -91, -34, 40, -62, -37, -71, 31, -56, 33, -85, -79, -80, 92, 57, -77, -37, 40, -75, -3, -81, -40, 23, 33, 70, 76, -92, 27, 0, 64, -85, -97, -69, -17, -8, 27, -84, -60, -56, -85, -81, -59, -91, -49, 87, 75, 50, -68, 26, 52, -51, 0, -1, -13, 97, -22, 82, -3, -33, -23, 31, -73, -72, -19, 21, 75, 4, -29, 9, 12, 40, -58, -92, -61, -55, -43, 83, 39, 0, -76, -12, 43, 78, 23, -2, 99, 80, 79, 94, 23, -77, 6, -87, -79, 27, -70, -16, -43, -32, 46, 5, 80, -16, -99, 80, 94, -54, 14, -48, 84, -76, -66, 56, -14, 9, 44, -21, 76, 83, 100, 30, -79, 41, 30, -63, -14, -80, 78, -77, -5, -56, 96, 71, -54, 84, 46, 61, 30, -62, -9, -26, 87, 37, 67, -99, -56, 54, -48, 36, 2, 28, 60, -63, -44, 60, 75, -98, -69, 48, -33, 44, 69, -33, -17, -89, -56, 63, -21, 78, 34, 60, -53, 93, -68, -17, 0, 54, -54, -16, 93, -58, -21, 46, 95, 37, -79, 93, 29, 7, -3, -83, 27, -82, 57, 33, -74, -86, 58, 71, 37, 48, 74, 82, 22, -6, 63, 26, -27, -43, 46, 91, 9, 37, -52, 81, -40, 86, 29, -26, -93, 46, 95, 41, -79, -84, 6, -38, 21, -75, 63, 16, -56, -71, 15, 48, 47, 69, -11, 18, 83, 39, -93, -8, 16, 90, -45, 34, -39, 20, -40, 37, -51, 47, -73, 41, -25, -93, 34, -96, -100, 10, -28, 5, -91, 85, -36, 87, 47, -43, 70, 56, -99, 53, -42, 4, -100, -70, -63, -79, 93, 74, -100, -13, 77, 63, 72, 63, 61, -92, 9, -17, 31, -38, 31, 32, 37, 7, 71, -61, -65, -66, -42, 92, 15, -70, 73, -52, 33, 97, 5, -82, -5, 69, -71, -75, 30, 60, -51, 58, 10, 95, -5, -19, 37, -79, 90, -47, 78, -20, 31, -64, 98, -38, -50, 35, -100, -93, -20, 4, 82, 11, 36, 78, 43, 80, -42, -56, 64, -10, -35, 91, -65, -25, -51, -2, -6, 80, 84, 46, 53, 17, -1, -33, 11, 70, 26, -6, 21, 85, 26, 2, -42, -55, 95, -61, 40, 20, 4, -92, -35, -48, -20, -97, 25, 41, 4, 35, -4, 89, 72, -9, 94, 89, -23, -18, -31, -65, -17, 28, 87, 40, 39, -26, -1, 44, 74, -48, -34, -91, -55, -18, 16, -97, -44, -63, 39, -70, 29, 28, -20, -76, -96, -53, 41, -49, -27, 48, 52, -2, -34, 18, 77, 2, -68, 44, 97, -67, 53, 69, 58, 12, -50, -65, -88, -16, -88, -69, 32, -89, 86, 68, -64, -33, 5, 75, 70, -8, -60, -45, -32, -90, 36, 12, -73, -79, -16, -95, -75, 43, -87, -66, -59, -48, -1, 49, 80, 93, -88, -90, 39, -4, -15, -48, -92, -30, -84, 88, -91, 65, 22, -62, 9, -12, -7, 57, 6, -67, -68, 59, -89, -14, -8, 6, 92, -91, 24, -82, -78, 27, -16, 84, 6, -2, -42, 81, -27, -99, -53, -95, -58, 44, 26, -22, 63, 51, 20, 19, 88, -72, -23, -43, 93, 80, -31, -92, 69, -62, 96, 21, 67, -42, -57, -36, -90, -10, -17, -96, 13, 76, 78, 63, 4, -85, -94, -57, -75, -65, 80, -9, 71, -89, -11, -33, 7, 50, 3, -13, -6, 25, -71, -38, -98, 61, 1, -9, 76, 71, 68, -53, 98, -93, 34, -64, 82, -30, 77, -19, 11, 2, -80, -67, 76, -74, -93, 61, -83, 78, 39, -50, 90, 67, 49, 35, 55, 77, -54, -45, 59, 38, 48, 53, 41, -22, -87, -1, -98, 84, 21, -94, -62, 84, 14, 9, -36, -76, -70, -15, 37, -24, 99, 36, 21, -93, -4, -82, -71, -92, -18, -54, 73, -11, -100, 30, 61, 52, 57, -100, 22, 45, 60, 36, 34, -71, -24, -20, -88, -88, -59, 23, 0, -23, 90, 6, 96, -65, -66, 73, 72, -45, -14, -96, 71, 20, 55, -14, 69, -3, 58, 34, -94, -97, 7, 27, -69, -73, 83, -97, 8, -93, 41, -71, 30, 29, -91, -31, 18, -30, 43, -31, -10, 19, 49, -66, 23, 11, 1, 76, 29, 93, 46, 96, 31, -19, 3, -60, -45, -46, 58, 26, 49, -26, 75, -21, 27, 31, 48, 68, -56, -17, -93, 6, 16, -92, 45, -70, -66, 57, -83, 68, -77, -15, -53, 41, 46, -41, -8, -79, -71, 42, -80, 53, -1, -89, 34, 2, -66, -33, 29, -81, -54, -17, -89, -48, -84, -83, 3, 51, -29, 64, 4, 57, -17, -49, 50, -64, 22, -4, 51, -1, 19, -51, 47, -54, -83, 21, -75, 19, -30, -58, -54, -16, -58, 27, 59, -94, -69, -13, -36, -43, 80, -9, -67, -11, 96, 83, -35, 59, -3, -51, -77, 73, 30, 13, -91, 33, -3, -49, -51, 9, -43, 79, -88, 24, -42, 66, -48, 85, -81, 90, -5, -91, 53, 46, -40, -24, 17, 61, -17, 71, -83, 20, 11, -29, 43, 3, -24, -75, 92, 93, 2, 54, -97, -50, 30, -14, -35, 43, -73, -57, 45, -99, 71, 47, -45, 19, 3, 50, 17, -41, 98, 72, -54, -23, 64, 35, 32, -78, 4, -91, 12, -74, -2, -100, -30, 14, 35, 38, 26, 15, 55, -67, 70, 55, 76, 88, 64, 30, -92, -12, 29, -78, 78, 44, 52, 54, -81, -28, 63, 55, -72, 19, 69, -43, 17, -69, 39, 57, -41, 38, 0, 38, 11, 10, -21, -2, 77, -100, -12, 12, -74, 15, -69, -95, -60, 63, 66, -14, 57, -44, 38, -11, 30, -53, 33, -94, -57, -40, 81, 78, -15, -53, -40, -4, 67, 30, 57, 51, 94, -99, -57, 67, -82, 90, 51, -51, -81, -44, 12, -51, -6, 4, 85, 58, 64, 6, -8, -97, 85, 37, -38, 63, 82, -44, 70, 4, -36, 39, -39, 51, 29, 74, 25, 83, 43, 61, 45, -72, 81, -50, -87, -7, -43, 62, 36, 27, -64, 2, -89, -16, 38, -74, -13, 70, 77, -3, -81, 40, -54, -93, 96, -30, -37, -57, -89, 4, -97, -61, 46, 81, -100, 18, 40, -51, 80, 69, 8, 52, -57, 8, -3, 88, -20, 48, 78, -25, -21, -49, -38, -17, 81, 37, -14, 10, -42, -93, -50, 32, -25, 69, -23, 23, -89, -77, -56, -48, 80, 44, 92, 17, 85, -64, -26, 69, 97, -22, 67, -78, 50, -52, 27, 34, -64, 43, -63, -2, 67, -72, 2, 44, 47, 9, 52, -41, 65, -38, -62, 25, 91, -18, -80, -69, -73, 2, -89, 20, 10, -22, -9, 19, -16, -21, 50, -86, 0, -89, 31, -66, -6, 88, -74, 24, 60, -88, 64, 71, -99, 65, -64, 86, 13, 19, -32, -83, -53, -20, -35, 76, 5, -43, 62, -23, 85, -94, 2, 8, -92, -32, 31, 59, 32, -45, -45, -57, -29, 40, 31, 79, -86, 19, 9, -19, -17, -100, 92, 38, 88, -8, -13, -17, 90, 65, 96, -56, -27, 97, -33, -97, 98, -53, -4, 36, -11, 74, -41, -49, 23, -15, 60, 85, -4, -53, 32, -74, 68, -100, -50, 43, -2, -1, 59, 2, -54, 50, -86, 53, -64, 82, 29, -25, 46, -69, 96, -46, -2, -45, -72, 8, -17, 63, 15, -30, -19, -48, -16, -15, 66, -25, -90, -25, -71, -22, 99, 6, 80, -19, 35, -81, -89, -34, 77, 25, 39, -47, -21, 23, 81, -27, 46, 41, 79, 49, 31, 15, -42, 61, -37, 27, -83, -19, -70, -17, -59, 30, -16, 82, -91, -30, -79, 50, -25, -88, 67, 22, 40, -4, -6, -50, 91, -18, -5, -11, 25, -88, 56, 98, 74, 53, 97, 17, 50, -26, 83, -82, -3, 10, 77, 7, -66, 76, 73, -8, 97, -1, 80, 58, -5, -17, 49, -34, 35, -82, -70, -69, -46, 2, 58, 94, -50, 21, -9, 54, 75, 9, -58, 78, 96, -26, -30, -29, 77, 88, 2, -60, 78, -23, -77, -71, -49, 77, -44, 89, -22, 16, 80, 95, 96, -70, -25, -71, 12, 37, 71, 33, 54, -81, -81, -89, -16, -52, 79, -91, -96, -37, 85, 35, 57, -84, -34, -80, -85, -74, 14, -95, -59, 43, 72, -98, -61, -81, -94, -42, 38, -8, -49, 30, -80, 80, 57, -90, 52, -51, -92, -56, -72, -39, -86, -82, 42, 66, -66, 40, 43, -34, -6, -46, 92, -66, -85, 28, 77, -87, -39, 34, 50, -2, 90, -72, 49, -8, -95, 56, -12, -99, 91, -5, -65, -5, 47, 82, -64, 1, 79, -32, -31, 49, 6, -86, -3, -54, 98, 7, 7, -32, -49, 66, -99, -56, 51, 88, 10, -9, 21, -36, 80, 15, 48, 26, -34, -7, 28, -42, 14, 15, -54, 8, -83, 12, -68, 42, -77, -65, -41, 61, -11, -50, 67, 49, 43, 3, 69, -85, 32, 33, 69, -71, 59, 80, 46, -50, 55, 74, -29, 27, 6, 26, 28, 95, 84, 49, -7, -43, -88, 66, -74, 66, 20, 99, 39, 51, -83, 18, -86, 87, 43, -4, -27, -54, 51, 72, -82, -10, 68, -70, -85, 50, -23, -78, -60, 45, 63, -89, -26, 96, 78, -16, 59, -30, 63, 67, 25, -31, 65, 81, -97, 73, -38, -51, -71, 100, -85, 79, -97, -75, 56, 38, -9, 7, 51, -50, -59, 66, 34, -83, -98, 90, -81, -3, -28, -27, 22, -31, 44, -22, 86, 81, 40, -59, -57, -21, -34, 99, -81, -54, -77, 78, 45, -78, 28, 22, 14, -35, 32, -83, 16, -66, 52, 5, 51, 40, 48, -62, 61, 46, 55, -10, 13, 38, 76, -66, -17, -25, -44, -73, -35, -36, 100, 49, -50, -10, 36, 98, 63, 81, 65, -35, 70, 32, -20, 64, 85, -38, -2, -50, -29, -58, -34, 94, -36, -39, 90, 57, -11, 65, 3, -50, 6, -63, -34, -24, -1, 4, -53, 39, -81, 2, -29, 16, 10, 29, 19, 82, 33, -18, 27, 7, 89, 76, -17, 81, 37, 51, 56, 18, -7, 8, 33, 85, -23, 84, 30, -77, 46, -92, 57, -5, -24, -19, 71, 80, -15, 95, -41, 50, -40, 34, 71, 82, -26, -62, 21, 86, 5, -3, 32, 69, -9, -87, 54, -85, 29, 46, 50, 68, -87, 74, -38, -93, -74, 10, -61, 55, -33, 22, -40, 65, 27, 7, 51, 55, 68, 45, -52, 53, -98, -24, 65, 41, 28, -9, 22, 17, -90, 67, -97, 61, 92, 83, -91, -20, -30, 2, 91, 40, -79, -45, 21, 92, -9, -4, 40, -100, -63, 85, 52, -59, -16, 60, 84, -64, 84, -3, -39, 30, -71, 94, 90, -19, -78, 99, 100, -35, 88, -99, 54, 75, -38, -96, 28, 49, -27, 8, -77, -42, 77, -78, 45, -12, -79, -57, -57, -64, -94, -77, 68, -31, -30, 45, -29, -41, 79, 76, 94, -56, 36, 15, 53, 53, -71, -74, 31, 78, -18, -3, -31, -22, 37, 17, 5, -65, -55, 3, 33, 7, 3, -31, -12, -98, 77, -59, 9, 81, 66, 17, -46, 38, 13, -71, 7, -20, 83, 56, -84, -68, 1, -80, 10, -91, 2, -62, -23, 74, -15, -49, -60, 74, 100, -14, 98, -13, 70, -64, 22, 100, -37, 98, 87, 52, 18, 49, 70, 23, 98, 97, -65, -55, -79, -66, 12, 74, -68, 40, -45, -34, -88, -51, 84, -73, 3, -3, -5, -14, -13, 92, 51, 94, 24, -20, -94, -27, -18, -77, 36, 13, -86, 12, 83, 21, -15, 44, -82, -92, -37, 84, -63, 35, 33, 76, 1, 72, 48, -8, -67, 39, -62, -5, -95, -20, -69, 87, 35, 65, 46, 82, -92, 79, 55, -39, 75, 13, 66, 80, 90, -82, -68, -37, -75, 72, -100, 93, 62, -24, 2, -5, 72, -25, -68, -19, -32, -18, 58, 91, 5, 1, 13, 42, -55, 19, -53, -33, -18, -16, 25, 67, 20, 28, -81, 49, 81, -36, 42, -40, -22, -87, -32, 21, -52, 33, 68, 58, 15, -11, 91, -12, 78, 86, 82, 16, 21, 76, 67, -86, 97, 92, -94, 89, -47, 79, 78, -97, -100, 4, -35, 62, -20, 37, 94, -33, 1, 92, -50, -71, -62, 37, 71, 59, 71, -38, -40, -36, 68, -20, -89, 23, -99, -28, -25, 87, -76, 17, 88, 7, -2, -79, -45, 48, -46, -61, 78, 49, 55, 20, -97, -75, 11, 12, 87, -78, 68, -43, -93, 15, -50, 88, -100, 19, -71, -84, 50, 1, 21, 51, -15, -32, -12, 79, -30, -43, 49, -42, 71, -64, 61, -1, 12, 84, 84, 67, -81, -84, 79, -97, 90, -51, -19, -51, -85, -29, -40, -57, 45, -51, -21, -71, -52, -3, 48, 49, 74, -76, -45, 91, 55, 60, 93, -97, -89, 44, -65, -85, 50, 99, 20, 36, -23, -46, -28, -37, 74, -11, 94, 37, -12, -97, -71, 38, -50, 46, 40, 84, 30, 11, -23, 65, -74, -13, 37, 17, 80, 54, -94, 14, -9, -11, -19, -88, -29, -10, 87, 41, 4, -57, 97, -17, -73, -78, -89, 51, -50, 7, 49, -39, -75, -43, 98, 42, -33, -95, 10, 29, 58, -77, -66, -54, -70, -12, 99, -25, 17, 29, 3, -42, -5, -38, 44, -47, 24, 48, -79, 24, -4, 15, 82, -72, 48, -99, -59, -49, -63, 30, 52, -24, 89, 42, 97, 4, -91, 100, 19, 26, 13, -32, 8, -57, 68, -81, 6, 64, 66, 18, 8, 97, -93, -58, 37, -60, 31, 31, -77, -80, 37, -55, 97, 20, -57, -1, -68, -7, -65, 52, -88, 66, 65, 57, -87, -51, -33, -100, 88, -98, 77, 88, 63, 31, 70, -87, -12, 2, 24, -34, -94, -93, -57, 91, 34, -53, -39, -76, 17, 95, 91, 12, 45, 21, -97, 44, -54, 17, -56, -12, 85, -98, 39, 44, 17, -79, -62, -62, 6, -1, -85, 78, 17, -72, -30, 68, 84, 55, -24, 48, 31, 25, -2, 15, -86, 80, -11, 73, 34, 45, -12, 48, 15, 35, 86, -81, -19, 16, -34, 82, -39, -83, -10, 9, -45, -16, 49, -93, 38, 6, -89, 75, 2, -38, -74, -66, 29, 35, -81, -93, 90, -33, 58, 59, 40, -15, -75, -20, 56, 19, -83, -32, 39, 29, 69, 34, -54, 22, -47, -86, 85, 60, 94, 90, 75, -35, -20, 92, -65, -84, -99, -68, -8, 23, 33, 70, -1, -13, -90, -96, -71, 37, -10, -10, 51, 86, 21, 17, 94, -40, 1, -75, 8, 11, -62, -98, -63, -59, -53, -88, -12, -13, -45, 86, -38, -21, -58, -26, -44, 48, 81, 80, 72, 63, -38, 25, 24, -100, -9, 94, 18, 60, -69, 85, 25, -75, -40, 11, 44, 100, -32, -72, -38, 33, 4, 86, 14, -80, 72, 72, -14, -66, -49, -55, 93, -44, -59, 100, -24, -3, -85, 32, -100, 49, -53, 21, -75, -67, 13, -43, 34, -76, 84, 39, 58, -74, -15, 61, 17, -20, -26, -8, -67, 14, 64, 85, 12, 11, -41, -75, 25, 72, -56, -69, 96, -30, -78, 92, 66, 94, 72, 94, -38, -31, -47, -74, -8, -22, -65, 32, 94, 78, -69, 48, -84, 100, 53, -79, -60, -42, -26, 21, -91, -14, -96, -46, -75, -97, 6, -74, 25, 85, -98, -51, 24, -75, 45, 34, 16, -56, 40, -95, 62, -48, 95, 69, -97, -41, 72, -29, -26, -35, -79, 39, -50, 44, 63, -8, -52, -85, -57, 6, 49, -7, -93, 9, -83, -21, 17, -29, -7, -63, 56, -20, 6, 100, 29, 86, -59, 17, -80, 29, -96, -84, -77, 35, 57, 77, 49, -42, 51, -75, -40, 35, -89, -87, -71, 82, -2, 88, -39, -70, -74, -100, -60, 41, -27, 77, -59, 98, -61, -87, -1, -10, 38, 90, 5, -52, 64, 5, 37, 81, -94, -20, 39, 0, -46, 63, -94, 51, -67, 25, 92, -72, -75, -27, 92, -56, -84, 63, 100, -38, 50, -8, -35, -9, 16, -59, -30, -26, -30, -58, -46, -45, -22, 58, -18, 83, 20, 75, 79, -29, -100, 29, -8, -59, -27, -92, 13, -70, -5, -99, -77, 70, 97, 99, -58, -50, 73, -26, -2, -100, 23, 16, -14, 94, 28, 17, -38, -25, 89, 88, 67, -6, 56, -66, -9, -16, 38, 38, 90, 96, -45, -94, -50, -62, -59, -29, -48, -10, 48, -71, 22, 28, -77, 24, 33, -95, 26, 16, 96, 89, -66, 27, -22, -66, -53, 13, 4, -29, -58, -66, 32, -70, 5, 58, 0, -93, -95, -14, 80, -21, -57, 76, 35, -37, 31, -69, -48, 12, 94, -38, 13, 87, -24, 60, -79, 26, -70, -77, -98, -68, 53, -50, -71, 62, -76, -73, -4, -14, -75, 19, 100, 35, 0, -4, -86, -52, 10, -93, 82, -16, 27, 85, 30, 36, -87, -10, 47, -97, 51, -25, -73, -2, 58, -34, 91, 16, -84, 33, 6, 87, -20, -90, 65, 0, 61, 74, 59, 6, 19, 84, 73, 62, 49, 43, 5, 17, -25, -96, -75, -24, 51, -34, -69, 50, 76, 18, 89, 1, 8, -22, -35, 38, -21, 45, -91, -24, -41, -93, 98, -53, -20, -60, 22, -93, -8, 64, -10, 64, -37, 86, 26, -13, -56, 43, -75, 58, 54, 70, -86, -43, 76, -22, -76, -33, -65, 16, -21, 74, -42, 79, -61, 70, 16, 83, -20, 30, -30, 39, 92, 70, 0, -31, 73, 87, 88, 76, -76, -12, 30, 95, -38, -71, -8, 31, -23, -16, -30, 48, -30, 28, 87, -67, -14, 30, -83, -58, -25, -23, -60, 5, 8, -77, -77, -98, 86, 85, -28, -77, 93, 18, -61, -30, 36, 8, 2, 87, 66, -68, 61, -39, -16, -40, -8, -74, 25, 44, -41, 69, -54, 11, -14, 80, 8, 48, 35, -28, 21, -4, 85, -33, -38, 86, -19, -71, -76, 20, -4, -2, 5, -45, 61, 77, 29, -48, 25, -60, -78, 88, -70, 93, -99, 96, -41, -23, -78, 84, -66, -100, 4, 75, -52, 67, -39, -86, 57, -80, 35, 34, 4, -67, 20, 91, 69, 80, -5, 97, -91, -11, -43, 8, -2, 8, 31, -12, 35, -89, 17, -13, -13, 52, 54, 29, -28, 82, 85, 60, -18, 76, -96, -54, -77, 20, -6, 71, 95, 41, 63, -50, 33, 44, -19, -29, -50, -49, -89, -20, -6, 14, 28, -90, -85, 0, 12, -9, -92, 18, 22, -93, -76, 67, 94, 18, 50, 89, -78, -57, -45, 95, 22, -78, -92, -97, 61, 61, 20, -3, 69, 30, -18, -67, 4, 6, -58, 94, 64, -89, -85, -39, -84, -86, -75, -56, 29, 44, -36, -7, -71, -33, 5, -57, -5, -41, -100, -82, -68, 63, -10, -77, -18, 24, 52, 38, -92, -95, -43, -1, 21, 0, 56, 100, -90, 50, 53, -100, -20, 74, 9, 68, 50, -1, 4, 32, -2, 77, -92, 31, 98, 92, -44, 23, 52, 85, -95, 41, -38, 17, -36, -49, -36, 24, -1, 35, -5, -93, -87, -77, 91, -8, -76, 33, 28, -14, -68, 41, 90, -45, 89, -73, -72, -78, 71, -63, 76, -58, -91, -74, 35, 95, -16, 57, -88, -43, -98, -1, 3, -96, -79, 85, -35, -12, -61, -13, 21, -96, 43, 16, -86, -26, -21, -83, 74, 1, 31, -48, -43, 11, -16, -26, -43, 15, -42, 61, -71, 81, -33, -26, -33, 53, 30, -44, 64, 65, -60, -97, 53, -62, 8, 5, 7, 69, -90, -90, -47, 65, -81, 53, 27, -25, 18, -87, 77, 22, -76, 82, 78, 5, 5, 2, -91, -87, 32, 84, -79, -26, -72, 34, 45, 58, 70, -66, -30, -7, -97, -50, -7, -71, -7, 80, 9, -27, 41, 63, -14, 39, -25, 61, -75, 33, 0, 14, 80, 42, 5, 2, 46, 3, 74, -24, -6, 88, 6, 11, -49, -83, 87, 74, -44, -68, 3, 59, 31, 68, -82, -94, -75, -14, -3, 78, 83, 98, 78, 35, 40, -69, -67, 45, -46, -58, 51, 48, 45, 41, 80, -82, -44, 91, -21, -99, 84, 61, -52, -11, 81, -79, 71, -10, 62, -72, -95, 64, 22, -16, 85, 91, 58, 22, 3, 77, 87, -87, -31, 38, 54, 1, -32, -22, -63, -39, 80, -21, 45, 16, 25, 79, -77, -2, 34, -87, 77, -7, -77, -88, 46, -72, -79, -99, 2, -65, -63, -83, -50, 42, 27, 79, -84, 11, -24, -79, 22, 81, 79, 27, -11, 73, 31, -94, 37, -86, 53, -61, 88, 1, 43, -3, 19, -83, -99, 81, 19, 45, -47, 65, -4, -28, 42, 91, -9, -93, 73, -1, -62, 79, 35, 5, 77, -51, -18, 95, -74, -24, -63, -80, -56, 85, 50, 81, -71, -6, 43, -49, 5, -60, 98, -20, -77, 47, 2, 54, -99, -41, -50, 28, -10, 0, 13, -95, 65, -47, 87, -74, -21, 89, -38, -2, -10, -66, -43, 88, -65, 1, -9, -45, -34, -44, 68, -70, 30, 65, 80, -49, 51, 53, 4, 10, -9, 100, -64, 16, 75, -34, 68, -52, -73, -69, -2, 98, -30, -69, 65, 47, 35, -33, 53, -31, -53, -5, 96, 7, -55, 85, 97, -34, -72, -18, 37, -30, 92, -36, 44, -79, -1, -87, -95, 57, -54, 47, 43, 95, -67, -100, 75, -93, -79, -33, -67, 87, 72, -64, 20, -78, -17, 16, -77, 40, -32, -21, -41, -63, 75, 53, -24, -16, 28, -97, 94, 13, -21, 8, 40, 66, -70, 51, 27, -22, -96, 26, 76, -15, -15, 38, -77, -56, 10, -67, 38, 84, 56, 49, 60, 99, 21, 76, 8, -78, 96, -72, -95, -49, -12, -12, 21, 41, -84, -73, -92, 14, 23, 93, -97, 47, 68, -65, 33, -36, 77, 91, -98, -64, 8, -98, 60, 86, 42, -45, -40, -33, -22, -30, 10, 95, 89, 94, -78, -87, 33, -68, -92, 39, 16, -6, 78, -98, 83, -55, -65, 40, -88, 85, -16, 61, -58, 27, 55, 83, -54, 62, -82, -18, -4, 78, -2, 47, -72, 27, -29, -36, -63, 76, 23, -7, 55, -68, -88, 71, 0, 79, 26, -24, 20, 68, -52, 9, 34, -65, -8, 53, 54, -77, 98, -20, 60, -3, 45, 4, -96, 28, -30, 21, -98, -65, 62, 78, 20, 39, -86, 31, 83, -85, 33, -38, -78, -24, 71, -100, 84, -25, -74, -76, -15, -39, 45, -8, -71, 57, -17, 74, 49, 24, 69, -67, 90, -97, -70, -50, -51, -87, -93, 0, -32, 35, 38, -72, 82, 66, 40, -37, -52, -82, 26, 94, -18, -5, 14, 2, 79, 16, -23, -30, -81, -5, 9, 81, -6, -15, 32, -6, -22, 89, 44, 80, -64, -82, 37, -57, 76, -12, -64, -43, 27, 42, 47, 82, 40, 47, -58, 68, -53, -45, 10, 95, 71, 100, 74, 77, -69, -47, 66, 85, -40, 9, 10, -1, 99, 46, -32, 49, 62, 37, 42, -99, 49, 11, -2, 2, -89, 24, 89, -56, 85, 47, 78, -94, 51, -34, -31, -4, -48, 61, 60, -8, 50, -43, 95, -32, 67, -54, -58, 88, 69, -39, 94, -46, 6, -52, 5, 76, -23, 18, 60, -73, -44, 68, 19, 19, -97, -81, 16, -12, 62, -48, -62, -48, 20, -15, -2, 17, -9, 37, 12, -18, -36, -100, 80, 73, 53, 29, -73, -17, 54, -73, 23, -70, 74, 34, -29, -53, -75, 82, -12, 34, 4, -44, 14, 85, 19, -100, -19, 99, -72, 49, 67, 89, -87, 29, 62, -30, 94, 24, -22, 6, -3, 49, -83, -55, -19, 90, 22, -3, 63, -55, 2, -64, -83, 70, 3, 56, 45, 42, 86, 21, -7, -1, -73, 80, -86, 27, -58, -68, 29, 86, -93, 11, -68, 62, 45, -11, 48, 91, 55, 15, 72, -81, 22, 31, -65, -3, -24, 79, 25, -62, -30, 5, 39, -46, 17, -7, 75, -3, -92, 39, -32, -18, 84, -73, -84, -79, 62, 12, 86, 46, 77, 53, 7, -41, -57, 83, -58, 50, 49, 74, -46, -90, -46, 53, 28, 89, 48, -93, 47, 72, -20, -22, -36, -41, 94, -6, -45, 27, 21, -70, -16, -14, 25, -20, -79, 89, -45, -15, 22, 99, 10, -93, -39, -23, 51, -79, -86, 55, 49, -70, 100, 89, -14, -32, 8, 66, -20, -61, -32, 82, -30, -37, -93, -30, -15, -57, -63, 16, 48, -97, 59, -46, -8, 87, -42, -7, -34, -96, -18, -29, 26, -64, -74, -88, 33, -36, 57, 79, -60, -86, 32, -86, -100, -86, 87, -53, 81, 82, -29, 16, -74, 57, -41, -35, 73, -49, -20, -66, 20, -59, 83, -56, -49, 50, 56, -72, -44, -82, -93, 77, 34, 38, 94, -35, -18, 55, 83, -73, -12, -26, -61, 29, -25, 88, -25, 13, 52, -6, -47, 44, 75, 39, 88, -99, -21, -36, -49, -67, -56, 28, -1, -49, -34, -3, -25, -45, 85, 8, -51, 0, 18, 52, 39, 14, -28, 92, -45, -51, 55, -98, 65, -37, -47, -65, 71, -57, 96, 18, -8, 80, 40, 71, 31, -31, 78, 1, 97, -90, 81, 9, 89, 86, -40, 67, 31, 54, -85, -94, -90, 99, -37, 79, 27, -95, 19, -53, -32, 20, -95, 88, 93, 100, -16, 9, 80, -73, 8, 32, -20, 0, -43, -77, 58, 68, -33, 6, 73, -91, 64, 48, -80, 23, 12, -4, 37, -19, -4, -8, -6, -77, 23, 39, 47, 97, 35, -23, 32, -47, -65, 11, 65, 30, 63, -79, -93, 88, 25, -23, -94, -33, -39, 46, 6, 74, -77, 33, 35, 52, -12, 6, -60, 85, 87, 9, 30, -92, 79, 85, 87, -19, 76, -7, 32, 89, 15, 59, -74, 51, 65, 94, 43, 42, -76, 99, -97, -69, 72, 83, -66, 80, -71, 2, 11, -52, -7, -18, 79, 29, 86, 64, -72, 57, 17, -79, 1, -82, -34, -15, -83, 8, 92, 12, 32, 38, -43, -83, -29, -8, 83, 49, -45, 93, -78, -85, -57, -29, 95, -87, 36, -26, 7, 43, 40, -65, -57, -1, -20, -87, -8, -84, 92, -4, 25, -47, 25, 29, 44, -78, 28, -89, 40, -89, -44, -15, -83, 2, -18, -7, 42, 66, -23, -28, 96, 60, 75, 32, -13, -93, 46, 79, -89, -29, 35, -46, 21, -8, 61, -19, 92, -54, 7, -66, 59, 78, 5, 33, 36, -61, 75, 99, -5, 53, -19, -64, 79, 39, 65, 95, -85, 88, -77, 44, 14, -6, -97, -51, 7, 1, 30, -93, -89, 62, -35, 80, -8, 60, 13, -83, 3, 85, -15, -8, -56, 42, 42, -56, 95, -1, 96, 94, -39, -17, 71, -81, 66, -62, 28, 7, -34, -54, 100, 17, -47, 47, 36, -6, -73, -37, -66, -61, 24, 1, -99, 30, -87, -2, -33, -54, -7, 81, 85, 89, -50, -53, 54, -24, 82, 24, 12, 76, 51, -91, 34, 15, -84, -79, -42, -57, -90, -59, -78, 17, 87, -39, 10, -47, -19, 18, 8, 11, -88, -33, 6, -74, 14, 67, -27, -9, -16, 15, -26, -17, -18, 37, -86, -56, 80, -19, -94, 57, -23, -71, 17, 54, -52, 84, 91, 0, 90, 75, 68, -20, -71, -98, -64, -71, -47, 12, -15, -1, -16, 34, -93, -15, -38, 90, 91, 57, -8, 37, 96, -52, 20, -62, -67, 1, -91, -92, 87, -5, 32, 62, 38, -59, -21, -10, 47, 78, -100, -90, -40, -22, 66, 3, -53, -19, -73, -12, -26, -21, -65, -14, -31, 6, 89, 5, -31, -91, -96, -73, -42, 36, 66, -9, -39, -12, 6, -63, 51, 91, 20, 70, 9, 43, -35, -35, 96, -55, 48, -41, 37, 45, -11, 68, 63, 12, -16, -35, -55, 17, 50, 66, -6, -97, 68, -98, 80, 19, -27, 5, -5, -65, 76, -74, -48, -52, 1, -100, 73, -39, -2, -35, 49, 66, -57, -99, -42, 55, 94, -87, -85, -50, -1, -73, -48, -49, 15, 52, 84, -92, -90, 6, -56, -16, -99, 81, 61, 69, -32, 38, -72, 10, -9, -96, -81, 0, -62, 59, 56, 93, 26, -100, 18, 28, -97, 42, 74, 57, 33, 1, 28, 98, -39, 91, 32, -47, -52, -94, -1, -98, -25, 22, 88, -22, 68, 48, -69, -89, 3, 10, -94, 78, 72, -6, -36, 87, -56, -67, 38, 60, -93, -56, 99, 3, -23, 61, -56, 22, 92, 100, 79, 37, -58, -20, 97, -90, 63, 45, 90, -96, -70, -85, 93, -92, -99, -64, -17, 86, -43, -18, 5, 35, -49, -26, -24, 100, -32, 24, 79, -67, 75, -4, 51, -88, -51, -10, 92, 98, -97, -37, -27, 66, 90, 85, -85, -17, 89, 37, 8, -39, 60, 98, 69, -57, 73, -15, -20, 100, 21, 3, 58, 32, 19, 45, 33, 5, 77, 26, -73, 6, -77, 96, -73, 85, 94, 45, -97, 3, 76, 27, 27, 5, 59, -5, 26, -8, -35, -43, -90, 10, 3, -36, 27, -84, 13, -21, -35, 17, 12, 31, 59, -30, 56, -40, 87, 100, -43, -48, -96, 13, -40, -80, 85, -87, -5, -22, 81, -23, -60, -85, -50, -100, -61, -83, -67, 88, -1, 48, 28, 54, 78, 38, 19, 1, 14, -87, -9, 82, 54, 49, -80, 19, 51, -82, -77, -75, 52, -56, 7, 56, 38, -77, -77, -89, 34, 67, -20, -2, -31, -22, -78, 98, 22, -63, 58, -72, 71, 55, -25, -33, -80, -92, -52, -3, -64, -80, 87, -78, 37, -31, 48, 0, -72, -42, 67, -80, -15, -2, -38, -55, 32, -86, 4, 10, -18, -21, 67, 10, 6, -14, -97, 51, -59, 18, -75, 5, 93, 3, -93, -28, 93, -23, 47, -35, -33, -2, 82, -23, -16, -22, -62, -51, -81, -31, 55, 16, 11, 70, 93, -73, 18, -3, -28, 50, 7, 62, -79, -96, -41, 68, 56, 62, 13, -3, 95, -56, 12, 36, 78, -87, -32, 13, -45, 10, -10, -90, 57, 14, 0, 66, -3, 14, 51, -21, -43, -71, 51, -34, -72, -59, 18, -39, 54, -72, 93, 84, 88, -72, 3, -44, 100, -46, 15, 71, 27, 55, 64, 50, -24, -32, -43, 59, -16, -32, 0, -65, 59, 86, 27, 87, -14, -27, -8, 54, -2, -77, -14, -34, 63, 41, -33, 71, 75, 5, 18, -69, 19, 44, 84, 66, 59, 95, 29, -23, 69, -63, -46, 82, -67, -55, 70, 29, 63, -31, -65, 49, -32, 65, 4, -47, 49, 11, 6, 58, -48, 16, 5, -8, -42, -4, -15, 76, -74, -29, 21, 84, 33, 73, -76, -3, 36, -37, 58, 46, 12, -36, -3, 44, -67, 63, 40, -42, -12, -25, 48, 0, 9, 92, -95, 8, -90, -21, 49, 38, 64, -75, 84, 53, 5, 48, 84, 53, -86, 2, 90, 62, 38, 100, 5, -33, -12, 77, -72, -37, 68, -5, 53, -73, -17, 75, 93, -78, -62, -32, -80, 19, -15, 76, -7, -9, 63, -20, -16, 64, 26, -13, -7, 27, -59, 89, -2, 33, 35, -32, -61, 37, -70, -71, 78, -16, 63, -40, -74, -66, -41, -69, -11, 31, -10, -1, -74, -54, 33, -75, -77, 98, 18, -57, 41, 40, 53, -58, -58, -35, 9, 10, 55, -100, 39, 9, 77, 80, -41, 82, 62, 88, -75, 58, -44, 39, 32, 34, 43, -49, -20, 48, -74, 10, 15, -22, -78, 26, 99, -76, 38, -38, 84, -16, 81, 18, -91, 77, 100, 11, 28, -31, 57, -46, -3, -15, 33, 4, -77, -16, 2, 32, 34, 30, 40, 81, 90, -25, 33, -3, -54, -46, -52, 84, -98, -79, -66, -73, 69, 39, 28, -1, 16, -78, 0, -73, 12, 16, 96, 63, 24, -47, 74, -45, -91, 32, 41, 51, 90, -73, -80, -25, -81, 89, 14, -5, -50, 1, -61, -16, -20, 92, 14, 7, 55, 81, -99, -87, -87, -57, -61, -67, -36, -83, 11, -67, -14, 76, -21, 23, 82, -39, 27, -31, 51, -53, -21, -62, 75, -31, -21, -92, -72, 95, 87, 53, 17, 65, -39, 53, 41, 76, -58, -13, -93, 67, -76, 90, 31, -86, -85, -47, 26, -90, -73, -94, 13, 27, -63, 51, -33, -64, 19, -66, 33, 9, 60, 15, 9, 1, -2, 81, 41, 46, 38, -30, 72, 87, -13, 85, -13, -23, 51, -90, 99, 26, 71, -22, 93, 72, -27, 59, -84, 81, 37, -95, 47, -100, -37, -100, 0, 88, -100, 73, 8, -41, -58, 71, -63, 6, -99, -19, 39, 50, 10, -92, 35, 77, -21, -39, -78, -8, -42, -91, 39, 89, 24, 15, 57, -27, 95, 74, -60, 2, -94, -7, 15, 4, -49, -56, -63, 63, -20, -16, -43, -55, 22, 94, 92, 45, 29, 3, 11, 31, -5, -18, 69, -52, 76, 16, 34, -92, 98, -74, 48, -66, -13, 63, -8, -34, -58, -93, 20, -23, -65, 26, -53, 73, 59, 34, -27, 39, -46, -78, 79, -88, 98, -48, -38, -27, 98, -50, 85, 54, -94, 18, -51, 51, -14, 52, -57, -65, 84, -4, 64, 2, 79, 24, 90, -94, -7, 87, 20, 8, -64, -80, -3, -55, -80, -3, -29, -5, -49, -72, -32, 66, -74, 10, 37, -65, -6, -85, 63, -11, 7, -17, 61, 64, 99, -33, -42, 56, -70, -35, -12, -98, 6, -32, -79, -21, 100, -48, 75, 100, -25, 74, -59, -97, 12, -59, 70, -4, 69, 25, -98, 86, -20, 38, -20, 62, 4, 77, 90, 23, 97, -2, -95, -69, -90, -58, -62, 40, -88, -62, 73, 61, 94, 59, -33, 3, -36, 100, 12, -94, -98, -15, 99, 96, -52, -43, -73, 14, 54, -79, -7, 0, -30, 13, -88, 49, -96, -79, 26, -48, -62, -64, -70, -39, 2, -20, 26, -95, 4, -20, 61, -14, -49, 57, -88, 85, -48, 47, 33, -46, 58, -42, 46, 97, -3, 55, 40, 79, -27, -40, 68, -56, 34, -15, -87, -65, -93, -89, 67, 5, 89, 41, 76, -50, 89, -96, 94, -100, 3, 4, 0, 27, -4, -52, 44, 100, -6, -66, 94, -88, 15, 64, -63, -23, 33, -38, 76, -92, 63, -78, -22, 17, 84, 77, -42, 13, 34, -54, -12, -14, -26, 83, 35, -65, 69, -62, -36, -57, -24, -21, 73, 40, -64, -87, 21, 40, 39, -46, 55, -79, -17, 46, 57, 81, -11, -86, -71, -72, 59, 16, 57, 7, 14, -85, 63, -19, 75, -73, -39, 83, -45, -26, -84, 89, -80, 64, 14, 61, -72, -33, 87, -90, -19, 27, 16, -5, 87, -27, 7, 61, 60, 37, -41, -75, 5, -76, -99, -11, -17, -98, -69, -100, -77, -51, 70, -57, -68, -63, 11, -49, -66, -84, -43, -53, -58, -53, -57, -68, -14, -18, 29, 37, -18, 55, 74, 35, 6, 50, 75, 8, -9, -38, -24, -64, -89, -27, 14, -20, 92, -86, -21, -17, 18, -91, -59, 53, -52, 50, 91, -84, 61, 4, -44, -15, 31, 98, -32, -6, -18, 95, -51, 25, -34, 95, -13, 27, 86, 12, 4, 14, -38, 94, -75, 27, -100, -7, 14, 95, 45, -89, 65, -59, 63, -85, 92, -34, 66, -2, -42, -63, 43, 38, -73, -10, 10, -7, -24, -21, 29, 47, -29, -63, 83, 66, -70, -21, 50, 61, -5, -84, 6, -77, 62, 17, 50, 35, 81, -14, 48, -82, 58, -51, -30, 11, -77, -55, 35, -24, -98, 61, -24, 84, 17, -43, 62, -80, -36, -35, 84, -59, -58, -75, 94, 53, 35, 74, 64, 99, -19, 45, 63, 3, 29, -17, 19, -98, 3, 7, -67, 25, 12, 9, 73, 89, -31, 84, 37, -13, -83, 60, 34, -56, 11, 56, -18, 65, -62, 52, 44, -40, -50, -64, -34, -77, 21, -52, 48, 84, 68, 44, 8, 1, 48, -33, 91, -57, 23, -73, -65, 64, 26, -57, -51, 12, 82, -13, 37, -63, -52, -29, -99, -57, -66, 15, 48, -44, -10, -78, -69, -30, 60, -84, 26, 99, 69, -84, -53, 75, -44, 2, 88, -57, 50, 21, -48, -68, -45, -73, 50, -38, -94, 10, 29, 92, 31, -93, 25, -52, -72, -19, -46, 64, -6, -95, 51, 11, 4, -61, -89, -37, -55, -87, 54, 15, -64, 9, -39, -34, -21, -25, -87, -3, 66, 32, -25, -75, -20, 7, -48, -38, -90, -68, -60, -61, 73, -97, -90, 54, -93, 48, 26, 26, -96, 89, -69, -12, -43, -29, 54, -75, 67, -72, 100, -19, -94, 5, -80, 94, -5, -91, -39, 35, 13, -97, 56, 39, -1, 78, -82, 10, -70, 7, -75, 8, 33, -72, -84, 47, 69, 9, 74, -27, 97, -5, -99, -64, -10, 46, -60, 43, 14, 87, 84, -37, -96, 45, -29, 40, 4, -27, -65, 46, 58, -8, 8, -78, 59, 12, -90, 93, 32, -6, -88, -15, 91, -66, -18, -72, 50, -18, -21, -6, 43, 53, -98, 21, 23, -78, 84, 36, 78, -68, -9, -77, 6, -51, -49, 98, -63, -57, -12, 25, -45, 93, -56, 79, 28, -14, 15, -37, 35, 70, 35, -72, -88, 28, -72, 77, -64, -100, 7, -32, 16, 75, 82, 93, 10, -38, -79, -7, -90, -72, 5, -98, 72, -98, -27, 95, -87, -20, -36, 84, 42, 87, 81, 16, 29, -19, 91, -73, -7, -34, -98, 80, 53, -97, 43, -9, -29, 81, 3, -85, -70, -14, 29, -28, -10, 72, -47, 86, 86, 49, 61, -28, 27, 83, 61, -2, 53, 98, 72, -25, 48, 70, -15, -62, 40, 69, -56, -14, 78, 18, -84, -17, 90, 34, 82, 31, -70, -7, -6, 83, 31, -19, -17, -61, 3, 11, -54, -51, 50, -50, -63, 36, 88, 48, -92, 15, -76, 12, -65, 10, 70, -23, -20, -73, 91, -56, 4, 83, -53, 35, 41, -86, 27, 66, 52, -38, -42, 56, -98, -62, -79, 0, 26, 68, -81, 46, 40, -10, -82, -35, 92, 30, 51, -63, 29, 83, -64, 31, -23, 71, -56, -20, -17, 23, 74, -8, 53, 5, 1, -9, 36, -5, -21, -53, -70, 82, -100, 25, 86, 38, 29, -55, -100, -31, 98, -35, -99, -32, -88, 46, -18, -54, 28, 45, 12, -69, -5, 99, -90, 47, -93, 1, 65, -95, -99, -28, 82, -98, -35, 99, 100, -75, 75, -7, 1, 35, 94, -26, -12, 15, 96, -71, 54, -58, 32, -81, -49, -80, 30, -60, 23, 91, 7, 95, 98, 51, -49, -99, -57, -60, -31, -94, -63, 72, -92, -48, -73, 27, -82, 95, 31, -88, -90, -99, 97, 39, 25, 64, -45, -13, -49, 24, 100, 31, 4, 31, 76, -49, -67, -79, 40, -38, -86, 67, -63, 4, -46, 71, 16, 19, -35, -35, 70, -29, 65, 56, -26, 83, 33, -92, 49, 73, -12, -70, -80, -63, -49, 46, 37, 73, -25, -18, 93, -22, -63, -39, -29, 73, 62, 1, 70, 27, 57, -28, -38, 57, 12, -18, 56, 93, 99, -79, 62, 69, 51, -75, 58, -14, 29, 66, -4, 39, -28, 71, -58, 94, -13, -4, 65, 93, -61, 49, 90, 86, -82, -81, 18, -28, 70, 85, -19, 4, -47, -19, -61, -1, -74, 40, -54, 99, 11, 50, 18, -42, -24, 25, -94, -51, 3, -35, 30, 5, 66, -94, 95, 82, -93, -69, -82, 17, 39, -44, 37, -10, -80, 47, 20, 31, 46, -72, -30, -37, 99, 38, -68, -76, 60, -75, -65, -90, -71, -44, -4, 37, -76, -5, 95, -44, 22, -67, -15, -47, -50, -95, 86, -47, -84, 53, -13, 36, -99, -81, -10, -95, 18, -22, -46, -53, -43, 69, 48, -95, -71, 50, -65, 9, 20, -98, -11, 61, -71, 14, 69, 48, 17, -13, -97, 76, 75, -50, -77, -55, 15, -74, -6, 10, 78, -2, 15, -81, -21, -6, 98, 45, 35, 54, -87, 45, -36, 58, -81, -31, -56, -100, 46, -62, 18, 54, -45, 43, -94, -81, 58, -17, -22, 52, 9, -100, 44, -21, -74, 18, 22, -77, 89, -49, -50, 93, -44, -46, -48, -12, -82, 8, 40, -72, 33, 19, 100, 28, 51, -27, -2, -95, 75, 47, -25, -34, 82, -83, -80, 91, 64, -82, -45, 89, -83, 57, 83, 5, 69, -48, -15, -51, 26, -97, -38, 94, 12, -45, 76, 49, 39, 76, -88, 4, -68, 74, -37, -18, 4, 44, -67, -33, -62, 99, 28, 32, -61, -38, 28, 62, 44, -7, -2, -41, 28, 31, 36, -56, 59, -32, -87, 78, 50, 73, 54, -12, -65, 95, -69, -28, 93, 69, -51, -44, 16, 91, 73, 10, -12, 3, -47, -48, 56, 64, -32, -87, 54, -96, 17, 71, 42, -34, -100, 51, 8, -39, -23, -44, -81, 85, -87, 80, -66, 89, 88, 46, -17, -59, 71, -3, -100, -33, 3, -23, 73, -50, -69, -1, 46, -62, 41, 56, -59, -87, 15, 38, -26, -54, 3, -77, 49, 76, 82, -46, -31, -23, -28, 62, -57, 63, -12, -86, -56, 21, -39, -9, 77, -88, 4, 58, -96, -18, 35, 40, 68, -84, -69, -96, 25, 36, 6, 61, -100, 67, 81, 25, -69, 25, -2, 12, 77, 86, 89, -90, -78, 18, -75, -38, 73, -32, -11, 33, -50, -58, 69, 40, -76, 29, -87, 44, 4, 3, 67, -62, 52, -53, 14, -52, 60, -74, -56, -70, -38, 11, 65, 7, 67, 85, -36, -90, 42, -4, 84, 11, 52, 66, -68, -72, 85, 99, -90, 40, -32, -80, -98, 53, 60, -7, -79, -39, -96, 46, -92, -43, -77, 66, -40, 26, -53, 77, -39, 80, 48, -63, 17, -42, -4, 70, -84, -32, 71, 90, -78, 2, 95, 53, -7, 75, 74, -55, -72, -67, -91, -81, -67, 0, 40, -14, 37, -56, 27, -12, -19, 18, -9, 35, -96, -81, 20, 71, -43, 47, 98, -12, -1, 14, -27, 67, -85, -97, -91, 78, -53, -81, -69, 93, -41, -90, -81, -78, 26, -24, -66, 44, -91, -63, -18, -69, -47, -44, 6, -76, 41, -56, 71, 17, -63, 24, -65, -13, 23, 66, 66, -88, 93, 61, 23, -86, -43, 11, -42, 93, -49, -32, 2, -96, -58, -93, -23, -8, -38, 95, 62, 98, -69, -4, 17, -77, -51, 17, 86, 92, 27, 11, -63, 65, 48, 50, 73, 96, 57, 67, -19, -31, -32, 69, 45, 86, -88, 18, 1, -80, 95, -24, -19, -24, 88, -2, 65, 67, 54, 85, 93, -58, 21, 23, -81, 62, -46, -27, -29, 67, -55, -22, 69, 45, -86, -2, -35, 40, 8, -44, 36, 20, -2, -35, 43, 9, 29, 43, -29, -100, 4, 53, 71, 32, -80, -66, 3, -47, 23, 77, 7, -57, -16, -97, 22, -59, 68, 63, -77, 32, 84, -34, -90, 72, -5, -79, 38, 65, 86, -15, 31, 94, 37, -82, -19, 55, -6, -84, -77, 28, -96, 59, -48, -20, 84, 70, -15, 2, 66, 61, -21, -96, -83, 31, 8, -10, -31, 38, 74, -20, -70, -88, -78, -36, 95, -71, 58, -54, 43, 70, 30, -89, 38, -85, 56, 16, 48, 8, -43, 70, -96, 79, 40, -20, 39, -100, -93, 43, 42, -82, 52, -70, 29, 20, -42, -70, 95, 95, 39, 44, -72, 63, 3, -38, -86, -71, 78, -90, 84, -88, -46, -38, 29, 99, 83, -94, 70, 58, 88, 49, 89, -73, -76, 92, 59, 75, -21, -77, -20, 24, 69, -31, -23, -11, 23, -9, 10, 63, 58, 27, 54, 93, 72, -57, -44, -80, -46, 8, 42, 61, 3, 30, 28, -77, 70, -74, 36, -13, 44, -9, -62, -46, 95, 24, -56, 55, 83, 0, 56, -72, -32, -90, 29, 95, 37, 2, 7, 99, 18, 54, -14, 11, 62, 77, -27, -99, -84, -6, -21, -77, -44, -30, -18, 43, -4, -65, -56, -91, -38, -58, -50, 6, -98, 93, 62, -32, -22, -65, -52, -100, 69, 68, -28, 84, 15, 47, -87, 21, -8, 79, -47, -52, -71, 30, -89, 10, 58, 64, 54, 15, 51, 11, 68, 3, 91, -90, -10, -28, -85, -87, 74, 57, 9, 51, 40, 18, 25, -92, 76, 53, -52, -59, 72, 13, -24, 48, 56, -9, 51, 19, 69, -17, 2, -30, 68, -53, -22, -24, -58, -93, -38, 19, -38, -95, -27, -49, -80, 41, 15, -43, 52, -45, -18, -92, 63, 84, 32, -20, -7, 34, 33, -49, 97, 5, -46, -87, 28, 100, 64, -52, 39, 32, -31, 15, 18, 38, 80, 82, -22, -51, 80, 24, -46, -9, -98, 19, 43, 72, -20, 63, -82, 31, -42, -12, 39, -38, 83, -74, 95, 24, 51, 53, -79, -31, -82, 0, 61, 38, 19, -13, 72, -64, 50, 67, 70, -97, -19, -86, 50, 39, -33, -33, 79, 68, 4, -42, -43, 19, 86, 99, 50, 28, -45, -97, -72, -84, 76, -50, 76, -77, -57, 15, 68, -44, 83, -69, 58, 43, 59, 7, -59, 21, -67, 64, 43, -16, 40, 21, 19, -19, 93, 19, 60, 4, -19, -9, 62, 64, -61, 35, -47, -12, 34, -99, -4, -45, 3, 23, 84, 76, 96, 24, -23, -93, -17, 90, -19, 98, -13, 73, -34, 16, 73, -23, -34, -59, -37, 27, -28, 80, 98, -11, -94, -94, 21, 63, 15, -88, 94, -81, 100, -48, -15, 79, -4, -40, 24, 1, 15, -11, -5, -40, -45, -7, -61, -20, -38, 84, 31, 53, -6, -39, 81, 89, 45, -91, -65, 29, -41, 74, -28, 59, 96, 78, -34, -20, -24, 94, -33, -19, -45, -2, -87, 43, -25, -26, -35, -68, -88, -71, -75, 13, -88, -33, 22, -68, 42, 44, -95, -96, 60, -47, 43, 73, 51, 24, -96, 94, 24, -25, -51, 68, 82, -20, 12, -81, 77, 24, -66, 77, 60, -34, 98, 37, -60, 67, 33, 60, -85, -77, -41, 20, -27, 38, 71, -98, 65, 67, 19, -82, -61, -48, 63, -34, -15, -12, 47, 55, 84, 30, -15, 7, 64, 20, 45, -17, -55, -96, 6, 22, -28, -20, -44, 53, -68, -4, -65, -8, -79, -19, -84, -57, 79, -79, 96, 28, -71, 66, 62, -32, 97, -12, -90, -50, -38, -15, 22, -67, 20, 82, -23, 22, 100, -81, 85, -84, -67, -2, 89, 61, 99, 46, 15, 13, -4, 25, 19, -35, -29, -8, 69, -50, 98, 76, 23, 56, -6, -71, -2, 52, 10, 95, 12, 89, -63, -84, -27, 28, -83, 90, 73, 46, 24, -51, 19, -5, -47, -70, -4, 92, -55, -66, -52, -20, 61, -72, 33, -100, 82, -74, 39, -97, -21, 79, 27, -90, -49, -17, 53, 55, -29, 93, 3, -11, 54, -4, 24, 82, -30, -47, -55, 63, 27, 48, 76, -67, 21, -14, 61, 67, 34, -11, -49, -52, 18, -20, -6, -12, -64, 89, 42, -99, 38, -5, -84, 72, 95, 19, 88, 73, -69, -82, 94, -97, -76, 100, -80, -8, -12, 12, -3, 41, 49, -53, -50, -90, 86, -87, -94, 96, 85, -61, -20, 52, 22, 69, -15, -57, -96, 3, -73, 87, 20, 48, -5, -52, 83, -44, -16, 88, 0, -63, 100, 29, 30, 70, -27, -66, 100, 67, 24, -16, -43, -67, -76, 83, -69, 9, 0, 49, 26, -12, 92, 8, -1, -80, -80, 16, 55, 46, -87, -77, -81, 59, 79, -36, -49, 0, 85, 3, -6, -9, -91, -31, -86, 74, -91, 48, -82, -33, -79, -38, -63, -86, -31, 13, -57, 57, 3, -77, -15, -7, 73, 31, -95, -63, -75, 46, -99, -33, -32, -54, -2, 56, -37, -21, 39, -28, 38, -93, -41, 53, 59, 66, 31, -9, 17, 25, 18, 71, -18, 62, 78, 78, 56, -16, 63, 3, 13, 87, -86, -50, -51, 10, -46, -89, 77, 89, 32, 54, -22, -11, -92, 3, 3, 62, 40, -57, 73, -4, -3, 18, -33, -48, 8, -100, -90, 77, 36, -63, 40, 32, -76, 25, -91, 32, -79, -59, 0, 47, -73, -80, 38, -32, -64, 76, 16, 96, -68, -56, 35, 15, 33, 42, 42, 36, -40, -45, 32, 25, 53, 25, 22, 84, -66, -91, -10, -80, 39, -92, 43, 100, 19, 81, 26, -78, -62, 27, -79, -46, 58, -27, -54, -74, 27, -53, 66, 48, -86, -20, 17, -56, -82, 80, -46, -15, 4, 76, -23, 25, 88, -41, -25, -10, 15, -77, 66, 25, 88, 13, -1, 50, -29, 13, -8, 66, -29, -9, -4, -90, -59, 25, 52, 61, -79, 29, 78, 43, 38, -5, -32, -1, -39, -82, 56, 69, 50, -41, 100, 45, -6, 0, -20, 82, -83, 54, -16, 28, 41, -42, 9, 60, 63, 18, 66, 19, -25, 72, 52, 42, -81, -67, -43, -41, 57, 7, 40, -8, -34, -12, 72, -61, 65, -54, -13, 56, 61, 38, -81, 47, 100, -45, 50, -1, 12, -13, 3, -76, -68, 58, 2, -22, 28, 81, -85, -16, -42, 93, 24, 30, 42, -69, 77, 10, -1, 87, 2, 15, 17, 18, 35, -94, 31, -91, -41, -76, -59, -54, -5, 13, -69, -27, 100, 52, -85, 76, 43, -7, 65, -96, -94, -93, -68, -39, 15, 59, 28, -10, 47, -46, 90, -23, -95, -49, -99, -62, 20, -69, 15, 78, 96, -9, -69, -8, 30, -39, -88, -31, -80, 88, -87, -12, -30, 6, 49, 27, -69, 68, -69, 69, 79, -20, 81, 1, 89, -16, -58, 30, 65, 66, 97, -56, -55, 14, 3, -88, -49, -92, 84, -32, -58, -94, -57, 71, 1, -33, 21, -24, -57, -61, 70, -39, 70, 46, -52, 92, -24, 52, -60, -78, 85, -58, 4, 12, 67, 57, 61, 9, 37, 4, -41, 28, 39, 73, -8, -26, 44, -43, -63, -95, 89, 37, -75, -43, -84, -48, -96, -34, 6, 47, 78, 73, -34, 30, 50, 36, 38, 74, 76, 71, 12, 40, 35, 90, -79, -63, -74, -75, -78, 19, 2, -36, -27, -54, -40, 73, 31, 58, -97, -72, -28, -22, -57, -98, 86, -22, 20, 80, 38, 33, -54, -94, 14, 9, -33, -100, 83, -24, -58, 55, 56, -83, -14, -28, 89, 6, -95, 43, 28, -79, -55, 89, 50, 48, -50, 27, -6, -63, 55, -57, -10, 66, 69, -59, -41, 25, -44, -24, -5, -94, -50, 10, -69, -94, -25, 67, 42, -42, 12, -16, 39, -24, 69, -62, -38, 29, -72, -40, -72, -63, -94, -71, 14, 83, 63, 69, -97, -96, -55, -26, 29, 4, -47, 7, -42, -68, -79, -54, 33, -77, 76, 16, 25, -50, 17, -60, -34, -12, -9, 20, -20, 29, -10, -1, -23, -58, 22, -69, 39, -78, 43, 71, -99, -94, -80, 85, -6, 50, 25, 87, 20, -76, -66, 72, 34, 96, -69, -48, -32, -76, -6, -15, 1, -24, 29, -15, -40, 36, -50, -99, 72, -69, 99, -21, -4, -26, 59, -93, -16, 20, -81, 92, 48, -94, 20, 21, 36, -15, 29, 46, -41, 97, 86, -32, -56, -39, 37, 22, 92, -75, 87, -83, -42, 48, -55, -89, 12, 59, 66, 82, -46, -91, -66, -21, -95, 26, -33, 89, -92, 56, -30, 33, -57, -37, -34, -57, 15, 41, 36, 50, -44, -44, 42, 91, -94, 47, 91, -82, 33, 78, -62, 92, -30, -76, 1, 50, 85, -90, 61, -70, 65, 17, 13, 73, 39, -92, 40, 91, -81, -42, -16, 49, -36, -41, 24, -60, -20, 72, -97, -31, 72, 85, -18, -7, 50, 59, -38, -93, 19, -16, -10, 52, 60, 93, 15, 5, 43, 82, 63, -29, -21, -94, -32, -14, -93, 30, 62, 13, -65, -1, -22, -71, -86, 95, -14, -43, 55, 69, -4, 45, 32, 36, 1, 14, 36, -83, 83, 42, -23, -39, 62, -61, 78, 23, -41, -45, -17, -60, 81, -84, 4, -76, 25, -8, 36, 83, 50, 17, -99, -56, 18, 92, 65, 33, 75, 71, -94, -35, 89, 57, -25, -49, -7, -65, -66, -35, 77, 30, 5, -25, -97, -46, 79, 86, 98, -81, -82, 35, 94, -74, 35, -83, -72, -55, 63, 30, 36, 37, -17, 93, -100, 31, 75, 0, -5, -83, -23, -56, 11, -86, 78, 88, -97, 46, -13, -7, -24, 38, -73, 84, -26, -47, -36, -54, 17, -97, -67, -25, 81, -40, 0, -8, 1, 12, -18, 47, 30, -61, 96, 50, -32, -69, -77, 12, 78, 14, 85, 69, -66, -69, 81, -56, 75, 7, -15, 76, -67, 43, -90, 46, -9, 56, -47, 80, 94, -25, 59, -1, 15, 23, -18, -45, -38, 31, 38, 30, 54, 10, 71, 45, 57, -31, 74, -67, 18, -25, -59, -78, -61, -86, 14, -44, 10, 41, 39, 6, 16, -66, 52, -23, -99, -83, -66, -92, 38, -34, -32, 4, -63, -31, -20, 86, -35, -60, -77, 77, -96, -80, -95, 31, -92, -32, -33, 25, 36, 45, -42, 70, -21, 93, -72, 75, -50, 69, -65, -25, 4, -56, 0, 62, 3, -95, 64, -65, 43, 99, -79, -32, -32, -38, -26, 6, -82, 1, 25, 26, 45, 13, -28, 13, 44, -60, 60, 82, -19, 51, -24, 67, -73, 9, 94, 66, -80, 64, 29, -95, -49, -96, 74, -58, -5, 0, 13, -61, 38, 41, -99, 66, 90, -38, 18, 45, -7, -22, 28, 44, -47, 21, 23, 66, 75, -35, 42, -79, -81, -8, 70, 83, 51, -58, -80, -53, -35, 14, -85, 67, -80, 79, 0, -93, 9, 82, -15, -43, -96, 69, 10, 8, -71, -6, -92, -6, -6, -60, -50, 84, 100, -40, -95, 18, -75, -95, -48, -40, 60, 72, -7, -61, -77, -9, -56, -63, 56, 7, 35, -37, -14, 6, 100, -50, -95, 74, 76, -16, 59, 81, -65, -12, -2, 46, -64, -84, -85, 85, 71, 95, -52, -7, -50, -96, -4, 85, 73, 82, -28, 44, 39, 51, -45, 82, 21, 25, -22, -85, 25, -14, -79, 9, 71, -6, -58, -22, -80, 22, -93, -52, 24, 5, 33, -20, 3, 8, 74, 63, 24, -9, 20, 10, -78, 58, 9, -26, -39, -5, -44, 1, -31, -36, -64, -33, -26, -84, 34, -49, 62, 29, 67, -64, -44, 0, -91, -20, 73, -11, 32, 32, 19, 1, -74, -96, -40, 35, 58, -4, 48, -80, -50, -22, -42, -99, 57, -43, -81, 67, 56, 32, -12, 37, 88, 4, 11, 28, 74, -3, 84, -87, 52, -80, -85, 59, 72, -37, -17, -28, -41, -3, 46, -54, 91, 57, -54, -68, -80, -6, -38, -59, 88, 4, 25, 14, -58, -33, -75, 60, 7, -68, -52, -17, -60, 99, -65, 99, -6, 18, 49, 74, -18, -81, -14, 51, 25, 70, -1, -28, -85, -74, -56, 64, -88, 78, -99, -25, 4, -4, -14, -42, -87, 2, 76, -71, 9, -3, -92, -77, 11, -60, 87, -69, 74, -80, 69, -31, 10, -12, -99, 58, -45, 57, 90, -86, -83, -69, -87, 89, -49, -79, -87, -67, -15, -45, 80, 76, -38, 43, -21, -61, -63, 45, -78, 9, -53, -19, 73, 12, -79, 24, -47, -61, -71, 82, 83, -59, 69, 89, 26, 80, -19, -48, 91, -100, 5, 96, -74, -84, -38, 27, 68, 20, 85, 21, 84, 26, 65, 21, -35, 72, -78, 47, -65, 69, 49, 87, -90, -73, -56, 23, 21, 49, -20, 90, 58, -90, -65, -23, -66, 26, 50, -72, 50, 23, -85, 2, -17, 46, -5, 90, -51, 100, -58, -82, 12, 20, -83, 33, -66, -87, -37, 36, 62, -99, -95, -2, 20, 52, -28, 77, 34, -38, 55, -99, -36, 0, 86, 51, 89, 98, -63, -39, 92, 18, 78, -49, 9, -27, -3, -38, 38, -53, 0, 81, 77, -27, -63, 35, -95, -33, 96, 33, 10, -69, -63, 14, 84, 8, -37, -47, 12, -87, -37, 77, 74, -47, -82, 66, 92, 25, -41, 60, -69, -65, 51, 70, 98, 98, -55, 74, 96, -87, 72, 79, 17, -51, -36, -24, -37, -78, 24, -17, 98, -31, 86, -28, -9, -27, 81, 98, 53, -57, -25, 40, 81, 18, -61, -97, 80, 28, -95, -46, -35, 17, 45, -72, -48, 60, 30, 47, 31, -19, 35, 4, -15, -18, 55, 93, -28, -2, -75, -67, -30, -7, 76, -12, 76, 100, -74, 92, -68, -29, -52, -38, 59, -82, 77, -79, -11, -34, 36, 62, -30, -22, 31, -64, -73, 36, -66, 11, 52, -92, 88, -49, 44, -92, -47, 32, 90, 23, 74, 8, 46, -35, -56, -30, 100, 5, -68, 17, -21, 70, -13, 99, -7, 53, -56, -66, -20, 80, 1, -91, -60, 13, 25, -84, 26, -30, 93, -90, -38, 94, 73, -81, 40, -84, 59, -3, -16, -85, -78, 38, 23, 41, 94, -30, 72, -68, -56, 81, -50, 14, 23, -14, 50, -72, -95, 66, 32, -5, 67, -11, -19, -80, -42, 47, -77, 30, -15, -29, 9, -44, 9, -8, -30, -31, -31, -25, 90, -54, -12, -82, 40, -56, 59, 57, -16, 25, 69, 8, 7, -29, 69, 34, 30, -64, -98, 45, 23, 69, 36, 84, 51, -94, -4, 69, -3, 1, 85, 1, -45, 85, 45, 66, -51, 60, -73, 83, -76, 41, 82, -17, 34, 31, 57, -39, 84, 64, 82, -16, -36, -49, -98, -24, 34, -31, -31, 61, -5, -85, 35, 48, 20, -90, -51, -14, -95, 9, 42, 38, 54, 72, 65, -97, 72, 37, 20, 81, 56, 39, 83, 67, -17, 64, 93, -81, -89, -63, 57, -54, -19, -27, 98, -59, -96, 75, 14, 26, -2, 2, 78, 39, 37, -64, 24, -35, -34, -87, -54, 47, 8, 12, 79, -33, 14, -75, -54, -28, -98, 29, 68, -71, 64, -98, -92, -93, -92, 19, 44, 51, 99, 41, 81, -21, -83, 66, 15, 74, -74, -9, -30, -67, 2, 46, 33, 57, -9, 39, 42, 8, 66, 2, -37, -37, -86, 85, -1, -34, -100, -94, 36, -100, -96, -54, -1, -91, -99, -78, 2, 83, 46, 65, -54, -17, 79, -52, 98, 50, -51, -84, -53, 20, -99, 96, 89, -16, -88, -40, -90, -4, -74, -66, -83, -33, 88, -60, -5, 70, 76, 38, -34, 78, -49, 18, -16, 70, 85, -31, 56, 58, -73, 6, 77, -65, -9, 46, 94, -89, -25, -77, -36, -9, -21, 48, -3, -75, 17, 62, -21, -43, 69, 56, 56, 36, -23, 20, -29, -99, -99, 10, 45, -32, 21, 84, 98, 50, -82, -82, 85, 11, 76, 72, -73, -26, -51, 38, -46, 36, 41, 12, 48, -53, -43, 96, 36, 94, -83, -89, 23, -85, 64, 47, -81, 42, -76, 44, -89, 8, 69, -62, 83, 80, -30, 99, -54, -76, 77, 17, -68, -72, -98, -62, -97, 64, -6, 33, 37, -89, 17, -35, 30, 92, -37, -66, 51, 74, 11, -49, -67, -17, -21, 10, 52, 96, 56, -9, 91, 80, 85, -60, -14, -50, 25, 45, -60, -2, 88, 6, -77, -54, -73, -65, -80, 83, -32, 53, 81, -57, 60, 53, 20, 49, 47, -99, -60, -47, 84, 45, 32, -55, -26, 48, 49, -98, -92, -99, -73, -67, 80, -42, -91, -18, -8, -99, -53, 33, -57, 81, 98, -65, 35, -18, -91, 60, 1, -8, -82, -83, 14, 78, -78, 28, -42, 6, 30, -91, 22, 98, -52, -45, -11, 43, -62, 8, -5, -57, -93, 35, -56, 38, -4, 52, -84, -18, 82, -22, -45, -57, -48, 62, -62, 29, -3, -76, 65, 95, -21, -69, -22, -23, 68, -22, -30, -94, 99, -83, -84, 16, 3, -24, -42, -90, 24, -50, -94, 54, 86, -64, -96, -39, 99, -27, -11, -22, -46, 43, -9, -27, -45, 78, 95, 73, -40, 3, 16, -23, -68, -46, -83, 39, -27, -80, -4, 100, 53, 48, 49, 82, -55, -60, -96, -57, 43, 62, -96, -39, -11, -75, -40, 78, -32, 83, -51, 24, -65, 51, -71, -32, 75, -79, -68, -32, -5, -51, -78, 37, 63, 13, -84, 80, -10, 35, 71, 88, 21, 33, -30, -11, 64, -47, -78, 84, -50, -43, 46, 54, -76, 48, 22, -76, 24, 78, -30, -66, -31, 3, 77, 42, 51, -52, -33, -94, -7, 27, -20, 81, -63, -7, -56, 2, 36, -46, -49, 10, -52, 82, -31, 10, 30, -33, 0, -63, 97, -52, -9, -93, 15, -6, 72, -72, -22, 76, -77, 48, 12, -78, -6, 55, 59, 49, 89, -34, 17, -28, -95, -36, -79, 78, 95, 8, 15, 84, 99, -46, 69, 79, 88, -82, 7, 28, 68, 90, -53, 59, 77, 41, -84, -5, -71, 20, 10, 78, -3, 89, 51, 19, 90, 41, -67, 86, 10, 92, -15, 60, 7, 17, 10, -43, -83, 10, 2, 39, 93, 29, 97, -73, 19, 22, -59, -98, 75, -14, 40, -44, 30, 13, 90, -63, -42, -73, -75, -17, -10, -36, -27, -40, 84, -100, 59, -69, 54, 40, -84, 55, -12, -49, 13, 63, -54, 93, 59, -69, 97, -6, 22, 82, 100, 6, 27, -21, -12, -61, -73, -20, -70, 18, -14, -70, 53, -97, 6, 6, 6, 85, 16, -22, -78, 96, 4, 87, 70, 53, 94, 15, 95, -46, 74, 86, 43, -43, 6, -100, 26, 72, -7, 33, -49, -82, 1, 70, -82, -62, 7, 59, -36, -54, 40, -27, 63, 97, 54, -29, 51, 47, -15, -92, 19, 66, 13, -100, -90, 4, -100, -20, 22, 71, -50, -84, 2, 6, 19, 93, 11, -78, 68, 25, -42, 5, -7, -76, 44, 9, -82, -19, -55, -66, -78, 8, -57, -92, 59, -11, -8, 86, -59, 89, 46, -8, 16, 26, -66, 35, 10, -58, -56, 33, -88, -90, 1, 97, 96, 34, -46, 82, -82, 6, -95, -92, 47, -76, -51, -29, 77, 65, -35, -44, -79, -45, -65, 78, -33, -100, -53, 60, 51, 76, 96, -43, -53, 84, 91, -2, 80, 87, 25, 13, -11, 12, 70, 68, 6, 53, 86, 4, 76, 91, 32, 71, -83, 84, 11, -61, 1, 12, 73, -43, -16, 51, 55, -55, 95, -29, 81, -68, -34, 12, -17, 62, -62, 74, -30, -96, 64, -100, 24, 83, 34, 12, 91, -93, 7, 25, 25, 91, 84, -73, 53, -67, -5, -79, 23, 47, 41, 50, -34, 46, -23, -62, 64, -2, 28, -82, -86, -100, -70, 79, 70, 73, -15, -51, -81, 4, 89, -58, -96, -35, 39, 27, 84, 87, 82, -30, -35, 99, -28, 54, 55, 64, -22, -82, 78, -88, -56, -95, 28, 5, 20, -76, 53, 40, -82, 37, 72, -30, -86, 6, 58, 25, 35, -71, -3, -4, -100, -85, 13, -90, 54, -15, 67, 71, -31, 19, 84, 75, 67, -62, 30, 82, -100, -78, 94, 89, 14, 61, 44, -53, -10, -48, -40, 2, 1, 38, 42, -11, 17, 38, 34, -54, 35, -96, -14, 93, -10, -38, -80, 98, 18, 20, 1, -11, 39, 11, 38, 81, 37, 18, -85, 42, 85, 18, -17, 31, -79, 62, 41, -7, -70, -31, -10, 27, -90, -65, -21, -77, 67, 12, -59, -80, -5, -50, -20, -46, 23, 31, -39, -14, 52, 97, 41, -60, 84, 65, 89, -60, -56, 25, -5, 43, -82, -64, -16, 88, -75, -7, 3, 91, 24, 40, -10, -14, 61, 22, -3, -78, 7, 47, -47, 100, 85, -42, 47, -62, -23, -10, 59, 68, -32, -33, -14, -80, 51, 43, -69, 53, -98, -19, 20, 15, 34, -13, 43, -48, -97, 72, -69, -18, 1, -43, -88, 49, -57, 71, -71, 50, -89, -87, -65, -56, 99, -77, 18, 30, -23, 78, 82, -63, -9, -14, -81, -4, -99, 53, -99, 94, -59, -61, 36, 29, 55, -98, -85, 31, -78, 1, -24, 33, -46, 35, -28, -3, -20, 13, 91, -34, -60, -61, 2, 54, -62, -48, -61, -49, -64, -34, 46, 61, -16, -35, 37, -49, 69, 87, -99, 28, 77, 63, -4, -79, 12, -19, 63, 20, -98, 71, 17, 43, 38, -91, 78, 69, -76, 19, -95, 9, 71, -93, 61, -60, 9, -100, 30, -49, 1, -24, 70, -54, 13, -18, -82, -31, -54, 16, -23, -96, -37, 6, 72, 91, 72, -65, 36, 50, 59, 72, 55, 79, -90, 46, -37, -36, -28, -44, -35, 31, 56, -97, 23, 28, -9, -83, 40, -31, 76, 74, 2, -15, -71, 54, 99, 6, 55, 29, -81, -23, 51, -24, -29, 71, 48, 49, -28, 85, 5, 27, 6, -90, -21, 80, -92, 94, -1, -49, 14, 40, 28, 71, -26, 51, 32, 93, 47, 91, 42, -33, -47, -90, 50, 28, 69, -54, 14, 95, -63, 29, -56, 54, -40, -19, -90, 96, 56, -76, -23, 81, 75, 73, -60, -60, 88, 0, 38, 71, -69, -52, -95, -44, -95, -54, -38, 76, 49, -34, 46, 82, 61, -60, 4, -94, -44, -85, -42, 65, 36, -67, -55, 64, -58, -54, 33, 65, 11, 22, -40, 31, 32, -31, -41, -13, -9, -24, 5, 83, -19, 86, -94, 95, -70, -16, -53, -59, -11, -71, 16, 25, -50, 62, 89, -50, 19, 8, 77, 57, 46, -51, 81, -18, -15, 31, -89, 42, 42, 37, 17, -40, 46, 80, 99, -44, -92, -72, -94, 99, 4, 44, -22, 43, 98, 5, -18, 65, -12, -25, 74, -91, 51, -51, 95, 25, -58, 64, 72, -47, -58, 95, -64, 68, 27, 28, -8, -85, -64, 64, 34, -61, 78, -37, 13, -79, -58, -39, 81, 54, -72, -85, 38, -80, 36, -74, 26, -15, 6, 50, -50, -21, 30, 43, 35, -11, 69, 100, 62, 98, 99, -53, -47, 2, -65, -95, 98, -89, 2, 86, -36, 77, 70, 70, 76, -12, 82, -10, -14, 77, -80, -13, -88, 69, 19, 42, 77, 28, -50, 61, -59, -39, -6, 59, -1, -40, -8, 81, 85, 51, 54, -80, -83, -46, -33, -54, -47, -83, 27, 100, 91, -52, -7, 62, 66, 85, -44, -95, -23, -81, -51, -92, 41, 19, 50, -53, -21, -45, 20, -61, -4, 96, 66, -15, -58, 21, 58, -31, -1, 30, 31, 54, -12, -74, 4, -1, 74, -41, -65, 17, 73, -40, 69, -94, 57, -51, 15, 74, 67, 27, -96, -31, 85, 71, 98, -69, -22, 14, -24, -27, 67, -44, -90, 67, 3, 74, 29, 79, 17, 19, 99, -52, 86, -63, -85, 19, -13, 18, -23, -74, -27, 22, 55, 93, -56, 60, 27, -41, 77, 25, 73, -66, -60, 85, 82, 32, -96, 49, -67, 92, 86, 44, -50, 76, 36, 24, 42, 8, 56, 80, 52, -16, -73, 50, 2, -1, -98, -68, 98, -32, -11, -84, -20, 10, -34, -34, -67, -93, -56, -41, 83, -31, 0, 8, 49, 60, 77, 98, 11, 73, -49, 18, -27, -35, 48, 51, 75, 20, -88, -37, -96, 45, 15, -64, -47, -69, -73, -15, -56, -73, -36, -31, -59, 60, -85, 40, 48, -42, -54, 66, 9, 25, -58, 54, 8, 64, 13, -98, -25, -94, 85, -81, -22, -36, 14, 41, -3, -52, -27, -64, 33, -95, -73, 1, 20, 40, -88, 22, -91, -21, 66, -2, 50, -64, 20, -93, 87, -15, -96, 21, -74, 23, 46, 70, -58, -66, -46, -40, -54, 1, -24, -45, -19, 45, 92, -48, -12, -16, 38, 11, 28, -5, -93, 46, 82, -85, -35, -89, -8, -27, 89, -15, -3, 85, -80, -64, -96, 97, 59, -34, -91, 96, -13, -17, -39, -64, 74, -52, -77, -19, 53, 5, -46, -94, 68, 29, 57, 22, -81, -45, -77, 7, 39, -10, -86, -28, 75, -40, 98, -73, 9, -98, -85, 63, 31, -92, 9, -89, -27, -57, 7, 93, 46, -88, 82, -36, -9, 3, 97, 15, 30, 8, 52, 20, 7, 79, -85, -58, -45, 95, 35, 2, 71, 65, 50, -95, -58, -57, 17, -21, -78, 43, -92, 36, 85, 92, -42, 50, -32, 46, -66, -4, 82, 9, -61, 41, -17, 15, -88, -48, -21, -6, -62, -17, 20, -36, 83, -61, 73, 34, -56, -79, 34, 21, -49, -1, -33, 97, -34, -98, -43, 19, 94, -1, 81, -92, 81, 78, -85, -89, 1, 47, 80, -70, -80, 30, -80, -9, -73, 32, -30, 96, -28, 74, 47, 65, 15, 64, -43, 44, -59, -4, 59, -39, -5, 11, 19, -14, 48, 60, 94, 33, 12, -9, -35, -69, -37, 53, 89, -96, 38, 27, -27, 76, -9, 89, -41, -99, -12, 86, 6, 14, -25, 52, 95, 69, -25, 98, 82, 65, 70, 97, 80, 27, -80, 47, -82, 60, -38, 95, 87, -82, 12, 55, -79, -50, -13, 22, -38, -39, 56, -27, -69, 100, 52, 43, -86, 86, -53, -83, -78, -46, -59, 30, 98, 2, -49, -90, -46, -13, 13, -76, -9, -14, -20, 68, 64, 82, -92, -2, -65, -44, -38, -19, -81, -54, -81, -95, -28, 6, -8, -72, -1, 10, 20, -52, 7, 33, -62, -69, 76, -58, 7, -73, -56, -36, -51, -47, -50, -58, -37, -71, 69, 65, -14, -35, -32, -86, 88, 9, 33, -77, 20, -16, 41, 39, 82, -33, 21, -57, -16, 78, 65, -60, 21, -57, -26, -9, -85, 77, 65, -15, 32, 36, -24, -62, -14, 54, 59, -37, 60, 5, -11, 45, -34, -96, -42, -25, -97, -85, -26, -1, 20, 75, -35, 35, 71, -80, -75, 62, 42, 67, -71, -35, -21, -88, -100, 70, 55, 28, 67, 61, 40, -40, 16, -35, 22, -97, 40, -65, -5, 88, 85, -16, 42, -11, -16, -89, -25, -32, 88, -59, 59, 29, -93, -47, 35, -13, 40, -72, -88, -43, -38, -14, 74, -14, -27, -63, -32, -32, 67, 28, 29, 12, -72, 21, -94, 84, -46, 100, 63, -94, -9, -91, -21, -27, 66, -43, -11, -3, -61, 41, 28, 44, -52, -15, 43, 34, 42, 14, -80, -35, 86, 75, -12, 100, 77, 37, -49, 95, 57, -67, -7, -15, -36, -41, 35, -26, 92, -32, 84, -56, -52, -39, 66, 48, 20, -48, 72, -4, 20, 55, -48, -92, -26, 3, -8, 23, 21, 98, -40, 54, 23, 49, -6, -71, -9, -17, -86, 42, -48, -78, -31, 8, 43, -14, 92, 72, -94, 72, -62, 3, -51, 76, -53, -52, 67, 66, 84, -19, -38, 83, 29, 11, 53, -5, 50, 20, -83, -13, -33, -41, 29, -7, -52, 65, 58, 67, -21, 26, -48, -37, -68, -43, -51, -37, 30, 24, -40, 23, 37, -35, 78, -71, -76, 70, 19, -13, 91, 86, 89, -91, 91, -7, 25, 87, -2, -13, -81, 16, 2, 76, -2, 22, -27, 54, -50, 84, -22, 64, -98, 56, 95, 74, -21, -32, -80, -59, 17, -80, 29, 96, 34, -66, -71, 71, 73, -46, -100, 24, 81, 10, 28, -38, 82, -15, -24, 21, 54, -86, 26, 36, -32, -42, 50, 7, 12, 6, 38, -77, -29, 10, 81, 5, 58, 49, -87, -96, 26, -84, -19, -30, -11, 71, -22, -8, 76, -36, 31, -92, -65, 78, 21, 59, -13, 20, 45, 42, -81, -43, -61, -35, -12, 40, -88, -39, 55, -55, 42, -8, 71, -78, 0, -34, 13, -35, -51, 40, -99, -67, -61, -32, 88, 52, -24, 90, -73, 12, -45, 11, 53, 54, -75, -86, -51, 33, -33, 31, 57, -24, -92, 69, -87, -61, 30, 68, -68, -22, -41, -37, -39, -22, 34, -25, -51, -62, 98, 74, 4, -31, -75, -43, -28, 78, -49, 43, -53, -74, 60, 50, 72, -1, -79, -59, 8, -68, 8, 37, -54, -5, 24, -22, -62, 21, -55, -29, -50, -76, -19, 42, -43, 86, -75, -60, -57, -16, -79, 9, -64, 17, 0, 41, -97, -77, 93, 90, -36, -35, -88, -74, 15, -20, 20, 8, 44, -32, -44, -29, 7, -28, -83, -85, 78, -5, -61, -62, -45, 16, -47, 71, -55, 59, 75, 88, 93, 65, -58, -97, -96, 12, -43, -64, 53, -92, -86, -13, -2, 4, 53, 90, 97, 4, -74, 81, -18, 58, -69, 29, -83, -73, -30, 16, -1, -13, -9, 52, -62, 76, 31, -49, 21, -33, -44, -88, 92, -38, -30, 52, -78, -71, 12, 88, 34, -47, 8, 44, -4, -41, -35, 65, 40, -49, 79, -69, -92, -84, 25, -19, -61, 3, 81, 27, 81, 55, 99, 77, -83, 40, 60, 42, 65, -95, -56, 86, -3, 18, -23, -53, 10, 68, -18, 3, -27, -46, -40, -99, 15, -99, -25, -91, -25, 66, -99, 20, -36, 93, -20, 79, -16, -57, -67, -28, 5, 72, 59, -96, 9, 90, -32, -47, -63, 36, -40, -6, -80, -65, -100, 49, 42, -55, -36, -95, 67, 62, -20, 88, 50, 47, -73, 64, 34, -52, -77, -21, -88, -9, 34, -86, -14, 50, 23, -32, -10, -41, -91, -50, -37, 5, 98, -45, 59, 50, 81, 100, -10, -16, 6, 97, 88, -22, 8, 1, 47, 80, 42, -72, -31, -21, -36, 89, 97, -85, -47, -4, -94, -41, -91, -48, -93, 25, -16, -11, -64, 31, -17, 3, -78, 36, 65, -56, 72, 45, -55, -99, 75, -84, 17, -85, 9, 72, -53, 51, -6, 92, -9, 60, 5, 2, 31, -100, -68, 89, 30, 0, -56, -80, 91, -28, -44, 67, -39, 70, 20, 73, 99, -77, 51, 37, -2, -33, -44, 71, 100, -26, 6, -53, -24, 54, -71, -55, 39, 19, -41, 46, 3, -33, 81, 61, 17, 23, 16, -94, -19, 69, 95, -48, 35, 49, -75, 90, 73, 16, -20, 71, 89, 63, -60, 10, -19, 54, -31, -3, 68}; +static int32_t dotp_B_dram[32768] __attribute__((section(".data"))) = {11, -6, 17, -21, -12, -46, 16, -29, -23, -29, 35, 47, -22, -8, -9, 9, 26, 20, 23, 41, 17, 8, 45, 35, 33, 33, -45, 22, -23, 26, -20, -12, -1, 27, 35, -14, 37, 21, -36, 0, 19, -28, -26, 44, -5, 42, -28, -41, 22, 26, -19, 0, -10, 14, 14, 50, -11, -33, -15, -20, 3, 12, -50, 1, 49, 6, -42, 35, 41, 39, 23, 5, -4, -48, -49, 3, -14, 5, -20, 46, 45, -39, 7, 16, -25, 27, -39, 39, -35, 2, 21, -2, -2, 41, -44, -36, -15, 21, 23, -36, 11, -33, -5, 50, 10, -8, -7, 48, 15, 4, 35, 28, 50, -12, 49, -46, 6, -36, 40, -35, 6, 49, 31, 48, -26, -29, -20, 50, -17, 36, -35, 19, 8, -36, 31, -38, -27, -38, 14, -15, -2, 31, -3, 46, -8, -45, 30, 17, -37, -21, 33, -43, 3, 15, 50, -47, 23, 33, 9, 2, 48, 23, 41, -36, 49, -50, -29, 40, 42, -36, 23, 33, -29, -1, -3, 22, 0, 45, -34, 32, 40, 0, -14, 47, -2, 8, -41, -21, 34, -30, -17, 22, 47, -1, 25, -4, 34, 33, -45, -1, 49, 12, -39, -10, -20, -49, -35, -50, -47, -4, 14, 1, -4, 48, 26, -1, -6, -9, 44, 33, 5, 20, 6, -18, -23, -7, 5, -7, 33, 45, 22, -17, -37, 17, -22, 28, -34, 32, -42, -24, -2, 28, -14, -23, -1, 4, -47, 34, 47, -32, -14, -47, -14, 0, -19, -6, -39, -10, 5, 29, -37, 3, 12, 14, 7, 45, -30, -47, 22, -5, 35, -39, -21, 43, 45, 9, 49, 20, 30, 14, -37, -7, -25, 40, -35, -44, -19, 38, 44, -35, 27, 38, 11, -21, 20, -39, 16, 40, -5, 32, -8, 50, 4, -6, 9, 20, 29, -19, -43, 26, 11, 24, -31, -33, 50, -45, 33, 45, -22, -47, 20, -8, 33, -17, 49, 20, -18, -36, 45, 35, -11, 42, 38, -46, 27, -1, 48, 15, 38, 3, 29, -5, 29, -40, -2, 48, -28, 4, -46, 13, -16, 42, 18, 3, -48, -45, 36, 5, -49, 31, 43, -13, 5, -46, -5, -40, 14, -41, -10, -7, 39, -18, 40, 5, -39, -49, -50, 14, -18, 35, 25, -15, -30, 33, -15, -25, -4, 44, -50, -13, -37, 39, -5, -9, -44, 4, 5, 25, 12, -27, 32, 22, 48, -47, -9, 45, 19, -23, 41, -11, 0, -22, -9, 18, -46, 50, -10, 10, 4, -23, -10, -42, -22, 27, -13, 11, 3, 1, -17, -14, -2, -9, -37, 31, -18, 47, 41, 49, 50, 36, -34, 24, -19, 50, 28, 17, -12, 43, -41, 36, -27, 49, 7, 18, 50, 13, -32, 50, -43, 20, -11, -38, 50, -24, 31, 37, -49, -35, -37, -34, 9, 19, 48, -34, -6, -13, 13, -45, 9, -2, -30, 48, -28, 25, 6, 13, -22, -24, -45, -30, 20, -10, 29, -46, -36, -30, 7, -47, 18, -44, -16, -15, -36, 41, -49, 6, -46, 20, 35, 44, -19, 21, -10, -9, 24, 14, -11, 32, -13, -9, -14, 5, 20, 4, 38, 3, -29, -24, -4, -13, -12, -36, 15, 10, 9, -43, -7, -8, -45, 33, -24, -6, -28, 30, -38, 17, 33, 13, -26, 35, 1, -3, 10, -34, -11, 24, 38, 18, 34, -25, 29, 5, -11, 34, 45, 17, -43, 22, -6, -34, -10, 26, -42, 19, 40, 50, -27, 22, -40, -16, -22, -43, -34, 20, -39, 28, 42, -1, -27, -14, 27, -40, 48, 30, 8, 4, -24, 16, 9, -49, 17, -33, -31, 34, 12, 27, 21, -49, 39, 32, -9, -23, -22, 18, -23, 9, 39, -46, -36, 22, -19, 1, 39, -14, -36, -10, -47, 2, 49, 33, -24, -30, 9, 35, 13, 20, -4, 3, -20, -34, -1, -44, 32, -23, -41, -24, -38, 15, 35, 33, 9, -8, 18, 12, 19, 48, 14, 48, 16, 3, -15, 20, 42, -36, 24, -33, -47, 37, -40, -45, 0, 7, 9, -33, 28, 16, -34, 46, -17, -21, -32, -42, -11, -7, 44, 8, 40, -26, 20, 2, -3, 20, 33, 2, -2, -8, 49, -32, 15, -17, 30, 37, 22, 3, -50, 41, 4, -36, 34, -36, -28, 15, -5, 49, -42, 15, 15, -33, -34, 21, 47, -17, 18, 13, -7, -22, 11, 41, -35, 27, 1, -49, 10, -47, 1, -10, 1, -20, -25, -24, 0, 47, 44, -3, -40, -43, -39, 48, -6, -17, 26, 40, 21, -4, -30, -10, 24, -29, -30, -23, 16, 20, -37, 28, 22, 1, -8, 20, 25, -32, -24, -33, -38, -50, 34, -17, -38, 0, 36, -50, 36, -23, -19, 21, 4, -25, -37, 37, 42, 17, 12, 31, -37, -24, -10, -48, 43, 8, 49, -28, -33, 23, 25, -10, -43, -19, 30, -10, -6, 27, 50, -42, 39, -3, -27, 36, 44, -7, 7, 15, -33, 29, -22, 24, -49, 27, 17, 47, -12, 22, -10, 20, 30, 36, 24, -29, 31, -2, -23, -35, 17, 11, -15, -29, -40, 34, 29, -9, 4, 22, -16, 6, -17, 22, 26, 19, -47, -5, 41, -40, 47, 10, -16, 18, 6, -40, -39, -8, -32, 26, 17, 27, 8, -49, -43, -29, 26, -30, 34, 41, 46, -22, 50, 35, 39, 24, 24, 47, 32, -14, 27, -22, 32, -14, -30, 37, 39, -39, -3, 32, -4, 43, -36, 16, -38, 8, 22, -38, 29, 27, 21, -32, 6, -19, 48, 36, -30, 31, -37, 29, -27, -2, -19, 24, -40, 9, 17, 10, 39, -46, -15, 46, 13, 27, -19, 20, 23, 15, -41, 48, -30, -11, -9, 21, -5, 31, 22, -10, 43, -47, 48, -37, -37, 2, 50, 33, -22, -28, 34, -20, 45, 20, 26, 10, -28, -43, 25, 49, -35, -25, -22, 42, -45, -14, -18, 44, -5, 10, -10, -33, 44, -35, 0, -14, -37, 17, -21, 9, 2, 46, -15, -21, 13, -37, -28, -3, -23, -44, -9, -41, 17, -7, -38, 34, -18, 41, 36, -19, -3, -46, 10, 39, 39, -48, -27, 47, -17, 33, 43, -9, -31, -10, 31, -31, -45, 6, -9, -26, -10, -10, -48, -8, -5, 6, 32, 23, 0, -46, 35, 22, 46, -36, 37, 43, 49, -12, 19, 28, -13, -12, 1, 35, -48, -22, 42, -20, 15, 48, -6, 22, -29, 32, 50, -41, -30, -34, 16, -44, 50, -15, 16, 26, -21, 36, 20, 43, -22, 21, 23, -18, 8, -31, 42, -22, 2, 34, -50, -17, -7, 45, -37, -14, -16, 8, -27, 14, -45, 17, -13, -50, -10, -20, -15, 22, 3, 36, -20, -22, 34, -48, 7, 39, 10, -45, -31, 10, -5, -38, -28, 28, -20, -47, 24, 15, -35, -20, -3, -8, -47, 11, -3, -23, -35, 38, 26, 18, -21, 14, 18, -37, 24, -17, 5, -22, 31, 28, -26, 43, 15, -11, 40, -36, -19, -31, 2, 27, 40, 16, -2, 16, 26, 38, 31, -50, -12, 10, 4, 18, -49, 43, -34, -22, -47, 22, 13, 34, -8, 25, -39, -1, 17, 10, 41, 22, 0, 45, 26, 47, 32, 27, -46, 40, -23, 39, -41, 37, 30, 1, 29, -34, 14, -30, 3, -2, -29, 18, 13, -15, -30, 5, 22, 40, -3, 25, -33, 48, -36, -7, 43, -6, 46, -15, -11, 0, -21, -25, 34, 50, -20, 5, 10, -34, 30, 47, -27, 46, -47, -42, -49, -16, -13, -6, -36, -9, -48, -20, 1, -10, 6, -9, 2, 5, 36, 25, 21, 2, 34, 34, -19, 30, 3, -14, 37, -43, 31, -40, 3, 9, -41, 39, 19, 30, 36, -9, -14, 41, 29, 25, 7, 34, 8, -27, -23, -14, -30, -18, -49, 50, 32, -23, -36, -50, -23, -1, -16, 45, -23, -42, -27, 12, -47, 5, -10, 16, -3, 35, 7, -12, -26, 9, 35, -4, 47, 10, 33, 49, 50, -24, 45, -9, 1, 42, -3, -19, -27, -48, -24, 22, -11, -28, -44, 30, -14, -44, 43, 26, 31, 44, -29, 27, 31, 48, -34, -32, 44, -12, -15, -36, 12, -22, 9, 5, -11, -35, -18, 38, -35, -21, 47, 15, -7, -13, 0, 9, -33, -46, -11, -45, 25, -39, -39, 22, -29, -2, -1, 29, -47, -1, -48, -35, -37, 13, -10, 17, 8, -49, -41, 24, 39, 50, -25, -47, 39, -23, -49, 15, -35, 6, -28, -28, 26, -30, -26, 7, -14, -2, 26, -36, -23, 16, 36, -47, -4, -1, 9, 11, 16, 21, -8, 38, 7, 1, 25, 18, 46, -5, -26, -26, -16, 10, -36, 39, 23, 37, -16, -22, -13, 18, -27, -32, -5, -2, -7, 22, -25, -26, -16, -15, -37, 5, -45, -19, -25, -36, -2, 44, 5, -14, 2, 7, 50, 32, 27, -15, 50, -40, -24, -49, -29, 15, 33, -34, -47, -37, -44, 28, 43, -35, 15, -32, -50, -20, -47, 40, 7, 5, 2, 38, 35, -8, 23, 46, -2, 9, 43, 43, -35, 22, 30, 48, 9, -4, -36, 12, -23, -31, 46, 12, -18, -15, -38, 11, 17, -28, 21, -38, 37, -11, -21, 43, -26, 46, 22, -25, -27, 46, -12, 38, 28, 10, -2, -10, 19, -31, -7, -35, -30, -36, -12, -9, 10, -47, -27, -48, -50, 43, -38, 3, 31, -11, -40, -9, 42, -47, -26, 49, -15, 13, -7, -11, 41, -6, -43, 34, -16, -7, -33, -4, -26, -10, -46, 13, 11, 21, 36, -48, -14, 44, 42, -10, -31, 16, 36, -11, 34, 26, -43, -46, -26, -12, -14, -46, -43, -47, -10, 9, 3, -29, 27, -32, 26, 48, 17, -18, -29, 14, -40, -35, 17, 42, -7, 37, -42, 21, 27, 28, 11, 35, 50, -36, -45, -50, -31, -15, -49, 19, -49, -48, -44, 33, 13, -10, 3, -10, -46, 38, 31, 12, -50, -26, 30, -5, -36, 18, -34, -30, 2, 4, 36, -41, 30, 6, 14, -14, -44, 25, -11, -1, -50, -31, -20, 17, 39, -39, -29, -50, -50, -48, 25, -30, -38, 10, -38, 31, -18, -45, -26, -28, 37, 50, -25, -47, -16, 24, 49, -26, -31, -50, 43, 17, -28, 48, -29, 44, 11, -50, 8, 17, -32, -21, -50, -3, -32, 1, 34, -29, -1, 15, -45, 13, -30, 46, -32, 40, -14, 12, -22, 9, 41, -17, -50, -3, 38, -30, -17, -25, -15, 48, -28, 30, -4, 25, -7, -31, -24, 10, -14, 33, 1, 24, 41, 11, 15, -27, 29, -39, -35, -15, -49, 38, 11, 13, -22, 41, 23, 36, 45, -20, 32, -36, 4, -18, 30, 1, 49, -31, 22, -13, -48, 3, 15, -33, 36, 32, -44, -16, 33, 33, 32, 29, 34, 42, 9, -27, 50, 42, 44, -12, -39, 43, 2, 13, -47, 43, -46, -35, -24, -47, 21, -3, -43, 30, -5, -7, 16, 40, 1, -17, 11, -30, -27, -7, -10, -22, -45, 5, -37, -1, 27, 50, 1, 37, 26, -50, -39, -27, -14, 33, 19, 25, 34, -48, -24, 2, 49, -34, -36, -12, -47, -34, -40, -39, -19, -24, -7, -8, 40, -2, 42, 22, -8, -48, -22, 34, -16, -3, 23, 36, -12, 38, -27, -31, -36, 34, 25, -33, 9, 36, 42, -10, 49, 18, 39, 24, -40, 5, -33, -39, -35, -24, 49, -34, 34, 50, -20, -16, -24, 36, -19, -34, -40, -50, 41, 31, -2, -10, -31, 20, -14, -35, -12, -6, 13, -4, -28, -19, -2, 30, -32, 47, 27, 16, -12, 38, 9, -40, -2, -36, 32, 10, -8, -36, 28, 28, 22, -46, 32, 37, -22, 11, 9, 18, -29, -38, -1, -4, -22, 29, 49, -34, -31, 27, -45, -29, -42, -19, 37, -18, 26, 48, 19, -2, -21, -35, 14, 31, 35, 39, -37, 5, -14, -2, 27, 39, -1, -15, 1, -28, 15, 20, -6, 35, -23, -31, -2, 6, 31, 37, 46, 8, -25, -32, -38, 23, 11, -37, 22, -40, 16, -39, -16, -12, -19, -37, 14, -24, 50, 9, -8, 14, 4, 42, 37, 30, -16, 44, -19, -32, 44, -12, -31, -23, -48, -19, 35, 7, 3, -9, -36, 32, 11, -20, 10, -25, 18, 6, -31, 15, -30, 9, 12, 0, 49, 41, 33, 50, -12, 49, -40, 6, -48, -14, 33, 45, -26, -30, 29, -9, -50, -28, -27, -4, 38, -44, -13, -4, -16, 27, 11, 22, -48, -31, 46, -7, -19, 49, -25, -3, -46, 8, 10, -2, -21, -34, 19, 7, 12, 10, 12, -36, -50, -38, -3, -17, -21, -32, 13, 15, 6, -7, -39, -11, -27, -40, 15, -50, 7, -23, 17, 43, 8, 20, -29, 39, -22, 38, 23, 33, 27, 46, 18, -6, 19, 35, -34, 28, -12, -11, -23, -49, 31, -24, -30, 36, -44, 10, 1, -3, -32, 22, -39, 43, 20, -49, -34, 24, 25, -48, -30, 27, 28, 0, -41, 4, -15, 0, 23, -34, 38, 10, 40, 46, 24, -38, 14, 44, 46, 34, 29, 36, 23, -3, 46, 35, 19, -4, 49, -41, 6, 29, -38, 10, 7, 33, 17, 33, 35, -22, -35, 12, -4, -8, -28, -21, 6, -21, 16, 5, -27, 50, 26, 45, 50, 25, -43, 37, -7, 29, 45, -17, -16, 45, -1, -34, -49, 39, 3, -7, 30, -2, -49, 21, 19, -42, -50, 18, -42, -37, -24, -42, -15, 42, 33, 28, 49, -48, -28, 22, -21, -32, 16, -1, -3, -48, 47, 15, -24, 36, 45, 48, -11, -33, -24, -40, -12, -32, 38, -44, 44, 6, -49, -13, -46, 27, 31, -15, 17, 37, 26, 34, 6, 46, -31, -46, -27, 48, -21, -23, 2, 0, -44, -9, -16, 43, -17, 22, 25, 3, -22, -41, -24, 32, -38, -9, -14, 10, 45, 28, -30, -48, -43, 19, 42, 32, -34, -41, 46, -38, 40, -39, 15, 23, 34, -28, 14, 46, 1, 10, -25, -36, -29, 38, 14, -25, -30, -27, -35, -19, -35, 26, -9, -19, -1, -10, -27, -38, 24, 28, -41, -9, -10, -48, 4, -35, -7, 30, 38, -21, 48, -14, 9, 26, -27, -25, 7, -42, 10, -32, -23, -44, -6, 35, 43, 12, -14, -35, 49, -46, -22, 1, -28, -45, -15, 6, -18, -2, -10, 29, 4, 47, -25, -14, 26, -34, 45, -19, -23, 42, -26, -4, -29, 40, 10, -7, -31, -1, 37, -4, -4, 21, 0, 4, 27, -12, -37, 18, -4, -30, -36, 49, 46, 30, 33, -50, 29, 31, -41, -28, -33, 7, 22, 43, 26, 1, 44, -5, -38, 45, -34, 16, 10, 14, 2, -46, -19, 38, -6, 5, -46, 50, 36, 25, -17, 10, 36, 29, 11, 18, 12, -7, -23, 19, -38, -8, -21, -25, 30, 12, 22, 6, 13, 29, -2, 1, 12, 31, -38, 42, 37, -6, -5, 26, 38, -10, -5, -50, 22, 17, 41, -39, 37, 22, -16, 48, -18, 7, -16, -5, 33, 15, -7, -25, -9, 26, -21, -19, -15, -32, -29, 14, 6, -40, -25, -3, -32, 32, -39, 16, 5, -33, -46, -27, 27, -13, 16, 19, 25, 1, 24, -12, 8, -25, 14, 29, -3, 2, -42, -46, 21, 10, -30, 46, 12, -31, 7, -6, -29, 26, 24, 31, 12, -21, 12, 46, -7, 16, 7, 14, -15, -45, -14, 42, 24, 4, 26, 24, 8, -13, -26, 28, 26, -18, -38, -13, 7, 37, -31, -34, -27, -25, -11, -19, 42, 27, -14, 35, 47, 40, 41, 35, 9, 6, 7, 16, -29, 7, 34, 29, 22, 26, 23, -2, 34, -2, -9, -11, 20, -5, -29, 31, -30, 0, -37, 23, 46, -42, -33, -38, -34, 36, -26, 3, -35, -27, 44, 24, -28, -10, 35, -18, -9, -3, -33, 12, 27, 41, -40, -27, 10, 13, -15, 32, 26, 46, 2, 32, -4, 1, 45, 28, 6, 24, -28, 8, 18, 5, 35, -9, -33, 20, -18, -48, -23, -50, 12, -4, -14, 35, -3, -32, -37, 16, 32, 46, 34, 14, -25, -41, 48, 26, 19, -8, 19, 48, 29, 21, 8, -48, -46, 34, 44, 27, 50, 32, -14, 33, 1, 15, 12, -44, 46, 2, -45, -44, -7, -33, 3, -22, 32, -26, 12, 17, -38, -19, -24, 0, -17, -23, 22, 21, 34, -21, 42, -42, -38, 31, 13, -13, -29, -20, 48, -9, 11, 13, 23, -42, 44, -7, 12, -11, 37, -10, 21, -1, -31, 30, 41, 19, -9, -18, 41, 12, 6, 14, 1, 48, 37, -45, -44, -42, 50, 10, 29, -17, -16, 48, -31, 7, 36, 9, 3, -16, -4, -5, 36, -47, -41, 24, -11, 4, 22, -11, 25, 30, 45, -28, -36, 41, -46, -11, -33, -30, 28, -48, -5, 39, 28, 2, -31, 8, -30, 39, 36, 0, -26, 17, -41, 35, 16, 32, 44, -42, -22, -14, 20, -13, 37, 21, 47, 8, 6, 39, 9, -23, -23, -5, 20, 16, 35, 4, -13, -33, 25, 44, 12, -46, -7, -22, 49, -37, 7, -7, -33, -44, 36, 46, 11, -6, -35, 13, -14, -26, -42, 4, -23, -42, -39, -33, 40, 39, 5, 39, 23, 7, 30, 0, -19, 37, -3, -43, -21, -25, -27, -24, 28, 41, 24, -12, 15, 0, 22, -1, -6, 36, -18, -32, -38, 27, 45, -29, -31, 46, -46, 33, 27, 40, 39, -19, -21, 40, -25, 31, 36, 37, -47, 16, -8, -21, -35, 20, -12, 35, -10, -20, -2, -38, -10, 42, -23, 13, -32, 36, 21, -26, -13, 48, 39, -48, -49, -46, 10, -31, 25, -13, 29, 50, -15, -5, 42, 48, -14, 3, -30, -30, 41, 19, 33, 9, -15, 26, -40, 37, 32, 36, -20, 50, -14, 9, 10, 16, 47, -22, 16, 28, 20, 16, -35, -6, -17, 33, -7, 46, 27, -9, -16, 24, 33, -21, 2, 7, -23, -36, -13, -1, -38, -16, -27, 14, 37, 40, -33, 7, -25, -22, 21, -7, 39, -46, -18, -46, -15, 26, 30, -38, -26, 7, -49, 37, -15, -26, -17, -39, -32, 43, -14, -50, 9, 16, -2, 39, 28, -5, -3, 41, 17, -32, 37, -11, -45, 29, 45, 43, 12, -16, 21, 10, -46, -14, 25, 38, 46, 37, -40, 48, -11, 14, -43, 36, 33, 45, -40, 20, 7, 43, -3, -38, 9, -2, 16, -44, 26, 50, -26, -28, 0, -4, 46, -46, 45, 43, 44, -38, -9, -46, -28, 11, -50, 23, 40, 3, 21, -48, 32, 13, 0, -49, -2, -20, 23, 29, 50, 33, -48, -16, 47, 34, -15, 13, -19, -33, -17, 5, 16, 2, 16, 40, 15, 13, 16, 30, -12, -13, -11, -32, 32, -46, 18, -37, 40, -2, 13, 49, 6, -16, 34, -46, 37, -12, -27, -11, -1, 26, 7, -50, -8, -12, -41, -49, 12, -35, -14, -35, 36, 39, 29, -24, 12, 43, 13, 46, -19, -42, -40, 50, 19, -21, -36, 8, -3, 43, 31, 25, 9, 17, 6, 13, 3, 29, 36, 24, 3, 8, 37, 35, -12, -36, 28, 23, -23, -15, 3, -34, 49, 35, 36, 42, -29, 24, -15, -22, 4, -9, -19, -37, -33, -13, 50, -17, -6, 36, -19, 16, 12, 4, -8, -29, 36, 17, 26, 45, -22, -11, -6, -41, 26, -6, -34, -49, -34, 39, -13, -14, 12, -46, -26, 22, 41, -29, 42, 12, -16, 4, -31, -46, -12, 12, -19, 12, 23, -11, -34, 50, 28, 22, -19, -28, 24, 9, 26, 31, 5, -42, 18, 11, 13, -29, -19, -4, -49, 34, 41, 1, 37, 37, -37, -14, -24, -27, 13, 19, -25, 3, -36, -22, 49, 23, -23, 8, 22, -30, -41, -47, 11, -47, -45, 39, 29, 21, 41, -35, -13, -2, 10, 14, 32, -1, -34, -23, -7, -39, 19, 20, 21, -48, -2, -30, -43, 13, 41, 8, -21, -19, 24, -31, -35, -26, 9, -6, -42, 0, 10, -11, 10, 16, 29, 25, -36, 2, -47, -28, -24, -14, 26, -8, -14, 34, -22, -22, -2, 24, 0, -1, -23, 23, -46, 5, 13, 38, 46, -34, 46, 38, 46, 4, -42, 40, 38, 17, 22, 28, -35, -35, -38, 27, 35, 34, 22, 12, -10, 2, 17, 23, 48, -42, 0, -3, 29, -2, -33, -41, 34, 3, 28, -36, -40, -11, -4, 50, -31, 47, -29, -3, 31, -35, -46, 14, 32, 23, -30, 10, 26, 4, -27, -28, 36, -40, -4, -49, 19, 2, -40, -36, 22, -39, -15, 41, -28, -24, 37, -37, 3, 48, -24, -30, -2, 11, 26, 21, -7, -7, 47, 10, -9, -28, 22, -50, -15, 4, -35, 38, -33, 47, -13, 16, -31, -32, -38, -34, 27, -21, 35, -8, -3, -8, 42, 15, 2, 21, 27, -17, 26, 23, 21, 20, -38, 39, 5, 8, -19, 32, 28, 3, -49, -14, 32, 46, -18, -50, -23, -34, 6, 19, 1, -7, 33, -4, -38, 25, -21, 34, 15, 2, -33, -23, -47, -9, -45, -42, -31, 43, 50, -13, 17, -1, 9, -38, 48, 43, -9, 17, -26, -20, -39, 13, 28, 10, 2, -25, 10, -41, -39, -29, 2, -30, -16, 20, 31, -24, 9, 48, -4, 15, 45, -36, -27, 33, -41, 37, -27, 37, 6, -17, -10, -11, -40, 39, -50, -21, -8, 31, -25, 2, -4, -42, -42, -50, 20, -7, 8, 5, 0, -35, -13, -40, -26, 42, 32, 31, 8, -22, 29, -11, -43, 47, -45, -6, 2, 43, 47, -30, 6, 25, -45, 12, -45, 2, -47, -42, 18, 23, 21, 36, -47, 7, -14, 20, -45, 0, 28, 48, -1, 45, -37, 48, -40, -41, 10, 30, -38, -17, 9, 0, -46, 23, -19, -39, 1, -38, 34, 3, 46, 3, -10, -3, 0, -4, -1, 45, 25, -5, 48, 49, -13, 41, -38, 25, -29, -49, 42, 26, 48, -38, 6, -17, -32, -42, 44, -18, -24, -6, -49, 28, 32, 6, 44, 6, -35, 28, -45, -37, -24, -13, -32, -14, -47, 7, 39, -42, -11, -36, 50, -47, 39, 1, -33, 2, 8, 48, 3, -10, 9, 42, 37, -47, 34, -12, -44, -28, 34, 12, 14, -10, 38, 44, -7, -6, 18, 44, 0, 14, 3, 5, 43, 31, 21, 39, -11, 7, -36, -32, -41, 37, -35, -8, -20, -35, 29, -23, 11, -31, -16, 8, -42, -41, -6, 31, -36, -21, -3, 45, -11, 40, 40, 32, 23, -7, -5, -45, -27, 22, 40, -44, -45, -18, 34, -13, -7, -34, -20, -14, -40, 41, -46, 13, 25, -48, 5, 12, -13, 3, -49, 39, -49, -39, -11, -49, 29, 43, 6, -4, -15, -47, 24, -27, 31, 40, 50, 11, -49, -36, 24, 40, -2, 36, -16, 43, -4, -27, 32, 9, 42, 26, -3, -28, -39, -10, -22, 19, 0, -28, -20, -30, -27, 21, -42, -29, -47, 26, 47, -48, 50, -23, 39, 47, -36, -43, -3, 48, 37, 1, 4, -14, -47, 4, -39, -32, 28, 6, 43, -14, 25, 32, 47, -44, 41, 4, -23, 42, -14, 33, 10, 24, -12, -28, 1, 33, 33, -40, 15, -38, 26, -10, -2, -36, 5, 3, -20, 10, 7, 36, 9, 2, 35, 10, 29, -9, -22, 33, 41, -24, -7, 42, -46, 1, 2, 1, -13, -7, 2, -49, 3, 33, 26, 39, -16, -5, 21, 41, 28, 4, 21, -40, -22, 18, 12, -4, -44, 13, 31, 13, 41, -39, -39, -15, -22, -40, 2, 19, 34, 23, 45, -4, -18, 30, 16, -8, -33, 23, 2, -12, 21, -17, -14, -10, 46, -2, -41, -11, -33, -26, -10, -15, -49, 32, 23, -2, 16, 2, -32, -25, 3, 0, -26, -34, 23, 10, -5, 4, -1, 24, -40, -39, -11, -3, 5, -43, 37, -37, 36, 5, 3, 49, -34, -6, -46, -48, -42, 33, -31, 32, -30, 29, -18, -46, -27, 12, 28, -25, 38, 41, -18, -33, -33, -13, -18, -24, -2, -1, -36, 26, 1, 47, 17, 48, -32, 44, -26, 25, 25, -26, -18, 9, -14, 41, -8, -42, -37, -48, 18, 5, -25, 2, -10, 31, -30, -12, 29, -28, 42, 23, 7, 18, 24, -22, 11, 2, -6, -24, -17, -37, -10, 23, 9, -9, 0, 24, -40, -16, -32, 37, 14, 25, 10, -4, -37, 16, 1, -19, 29, -41, -34, -11, 17, 12, -36, 46, -12, 6, -41, 20, 46, -34, 25, -34, -35, 27, -48, 0, 43, -5, 4, 48, -25, 25, -20, 30, 50, 21, -32, 39, 17, -36, 7, 27, -21, -3, 5, -9, -27, 1, -8, -17, 9, 32, -48, 17, -40, -38, -1, 31, -32, -7, -18, -13, -48, 48, 14, -16, -15, -13, -12, -26, 13, -38, 17, 19, 24, -50, 21, 3, 47, -42, -15, -14, 8, -30, -31, -50, 48, 8, -23, 20, 5, -42, 14, -15, 47, -17, 30, -19, 15, 49, -26, 0, 12, 39, -6, -25, -30, 31, 42, 0, -27, 41, -39, -40, -24, -28, -18, 29, 41, 41, -13, 4, 19, -9, -22, -17, 6, -48, -45, -3, 13, -38, -15, 28, 19, -18, 25, 6, 4, -38, 46, 0, 41, 2, -15, -46, -26, 30, -14, -32, -16, -17, 3, -5, -45, 32, -50, 20, -17, 5, 32, 46, -25, -9, 40, -13, -25, 48, 8, 33, -27, -30, 9, 39, -31, -45, 16, -41, -39, 46, -29, 11, 10, 29, -34, -41, -39, 32, -11, -28, -11, 23, 23, -1, -41, 43, -47, -50, -8, 32, -46, 43, 39, -17, 15, -27, -37, -10, -9, -38, -22, 14, -5, -17, 12, -47, -23, 32, -50, -15, -38, -46, 46, -37, 29, -19, -1, -24, -16, -48, -47, -44, 26, -48, 30, 8, 23, -50, -23, 8, 2, -41, 20, -48, -44, -42, 48, 39, 18, -38, 43, -11, 11, 11, -41, 36, -40, 25, 11, 26, 5, -2, -35, 22, 23, 42, -42, -18, 37, -16, 24, -12, 26, 36, -26, 29, 5, -3, 34, -41, -10, 32, 48, 8, -23, -10, 15, 0, 11, -21, -11, -11, 18, 11, -36, 49, -48, -27, -10, 12, -3, 10, -3, -4, 5, 25, -43, 27, -33, 33, -28, 18, 14, -5, 15, 29, 18, -29, 14, -39, -32, -29, 4, 11, 0, -3, -34, -38, -23, 16, -46, 49, 9, -36, 30, -7, -5, -22, 17, 45, -2, -8, 17, 26, -31, -33, 13, -2, -9, 50, -39, 38, 43, 28, -15, -43, -23, 35, 9, -2, -13, 29, 7, -46, -5, 47, 24, -49, 38, -26, -50, 44, 18, -11, 17, 18, 18, -35, 3, 12, -33, -34, 48, 31, -47, 44, 44, -42, -20, -46, 49, -35, -9, -10, 29, 33, -21, -25, -2, -20, -1, -36, 1, -13, -13, 9, -31, 48, 36, -7, 38, 12, -1, -29, 21, 3, -42, -36, -3, -31, -16, 50, 16, 9, 47, -17, 49, 48, 22, 43, 3, 39, -39, 37, -32, 29, -25, -28, -18, 6, -21, -28, 23, -15, 44, 35, -8, 15, 2, 36, 48, 9, -14, 10, 45, 2, -39, -16, 16, 47, -13, -27, 30, -11, 14, 6, 21, 28, -6, 38, 21, 45, -38, 28, -45, 46, 20, 46, -4, 42, 50, -7, -19, -48, 3, 33, 27, 41, -13, -47, 28, -34, -14, 37, -15, 7, -10, -43, 16, -21, 35, 1, 46, -26, 1, 8, -21, 50, 16, -47, 42, 6, 12, -19, 36, 32, 28, 0, 12, 29, 36, 50, -50, -32, 50, -16, 12, 43, 30, -25, -38, 35, -28, 46, 40, -16, -39, -42, 47, 27, 50, 16, -7, 10, -30, -44, 46, 48, -40, -6, -19, 35, 32, -15, -14, 24, -10, 26, 41, -2, -36, -38, 2, -18, 21, -19, 50, -3, 17, 6, 11, 31, 36, 42, -49, 26, -35, -43, -32, -19, 16, -19, 34, -26, 2, 30, -26, -18, -20, -15, 36, 38, -2, -7, -3, -21, -38, -8, 42, -35, 40, -25, 24, -4, -14, -48, -25, 47, 46, -36, 15, -23, 33, -13, -7, 2, 29, -47, 21, -7, -5, 33, -25, 45, -38, 18, -7, 2, 0, -38, -10, -40, -14, 9, -19, -6, -33, 42, 28, -31, -7, -15, 18, -14, -18, 31, -32, 0, -19, -29, -50, 3, 38, -31, 7, -16, 19, 19, 10, 12, 50, 10, 6, -48, 50, 44, 48, -6, -36, -34, -36, -46, 35, -5, -40, 13, 41, -37, -12, 16, 4, -9, 24, 43, -46, 1, -29, 26, -7, 34, 8, 50, -26, -30, 41, 13, 17, 42, -4, -16, 36, -44, 5, 1, -5, -42, 7, -28, -48, 10, -42, 2, 17, -2, 38, 19, -3, 31, -44, 48, -20, 5, 45, 48, 10, 41, -46, -21, -29, -34, -41, 20, 17, -9, -24, -44, -28, 24, -43, -43, 50, -46, 20, 35, 49, -49, 37, 0, 15, -39, -4, 4, -25, -6, 11, 19, 36, -49, -25, -37, 31, 6, -19, 11, 27, -21, -38, -11, -20, -14, -6, 35, 8, -23, 10, -32, -8, 8, -35, 18, -7, 15, -41, -4, -32, 33, 42, 38, 30, 0, -38, 12, -35, 2, -16, 49, 8, -12, 16, 22, 10, -1, 2, -5, 1, -22, -46, 16, 23, 44, 24, 30, -11, 21, -49, 17, 11, 29, 7, 34, 18, 7, -16, -37, -36, -45, -35, 36, 44, -5, 12, -39, -10, -32, 25, 26, -49, -31, 44, -42, -30, -43, -12, -14, -22, 32, -16, -13, 39, 24, 49, -16, 17, -48, -39, -19, -4, 12, -25, -8, 26, -7, -13, -22, 4, 1, -32, -16, -3, 40, 9, -20, -48, -16, 37, 1, 20, 0, 5, 48, -30, -50, 2, -45, 47, 31, 11, 38, 28, -4, 45, -1, 31, -20, 13, -22, -36, 7, -28, -13, -10, 24, -36, 36, -48, 32, -50, 37, 24, 43, -40, 9, 14, 25, -47, -26, 21, 28, -8, 43, -11, 45, 48, 34, 44, 49, 40, -7, 21, 8, -28, 11, -28, 7, 4, -18, 26, 12, 9, 48, 10, 29, 25, 10, 44, 18, 38, -30, -48, -3, -41, 36, 30, -9, 48, 38, 15, 40, -5, -42, -2, -47, 9, 39, 45, -22, 35, -4, 26, 36, 12, -20, 0, -10, -15, -11, 44, 9, -36, 27, 48, 37, -21, -21, -24, -11, 27, -6, 24, -4, 39, 5, 3, 34, -42, 14, 19, -50, 35, -38, -13, -6, -11, 44, -36, -1, -49, 2, 44, -25, 15, 24, -18, 31, 34, 8, 44, -25, 43, -30, -2, 29, 20, 35, 20, 15, -14, -37, 21, 42, -44, -13, -6, -29, -7, 30, 29, 46, -16, 9, 45, -48, 16, 21, 44, 4, -42, 18, -23, -36, 40, -20, 8, 31, 3, 17, 34, -4, -9, -28, 35, 14, 38, 3, 41, 50, -40, 12, -29, 3, 38, 34, -15, 7, -31, -35, 41, 5, 42, -1, 39, 15, 23, -38, -36, 22, -24, -43, 19, 49, -1, 37, 16, -25, -15, -30, 26, 1, -40, -43, 6, -5, 27, 46, -49, 13, 1, 14, -40, -45, 45, 28, 25, 13, 50, 42, 4, -7, 35, -37, 32, -46, 48, -26, -1, 22, 20, 31, -49, -41, -49, 9, -6, -43, 7, -44, 48, 36, 21, -30, 46, -4, -50, -39, 24, -3, 43, -47, -17, 36, -19, -48, 41, 17, 6, 25, -27, -18, -48, -47, -21, 19, -2, -21, 21, 31, -35, 2, -45, -27, 41, 45, 38, -23, -30, -43, -15, -42, -11, 34, 0, -50, 12, 17, 23, -25, -11, -48, -42, -19, 16, -47, -45, 22, -25, -49, 15, 34, 35, -48, -16, 8, -13, -18, -36, 24, 23, 49, -37, 15, -6, -3, -7, -14, -22, 48, 33, 34, -17, 8, -8, -18, -32, -43, -20, -40, -43, -26, -31, -13, -44, 26, -12, 23, 21, -31, 30, -40, -35, 50, -9, 45, 39, 1, -14, 1, -42, -16, 16, 44, -44, -49, -26, 25, 43, 43, 42, -10, 24, 1, 36, 30, 26, 46, 14, 26, -13, 16, 29, -9, 20, 3, 16, 27, 13, 29, -47, -20, -38, -24, 8, 14, 13, -26, -14, 24, 22, 20, -37, 43, -27, 16, -3, 40, 14, -13, 39, 19, 8, -39, 3, 0, -13, -5, 48, -41, -42, 36, 43, 1, 0, -29, 22, 32, 21, 17, -46, 32, 31, -22, 32, -45, 18, 7, -8, 18, 21, 40, -14, 7, -14, 31, -25, -9, -35, -29, -28, -4, 16, -48, -39, -28, -40, 1, -1, 6, 13, -5, -22, 19, -5, -35, 47, 0, 50, -40, -40, 12, 2, 38, 7, -32, -19, -1, 21, 4, 25, -10, 48, 19, -30, -25, -50, 30, 48, -24, -1, 15, 49, 14, -41, 44, -14, 18, -10, -5, 26, -6, 37, -24, 14, 33, -43, 16, -2, 45, 38, 38, -37, 11, -8, -24, 45, -24, 17, 24, -3, 16, -26, 13, -27, -42, -43, 44, 8, -34, -8, 44, 17, -47, 50, -43, -9, -2, -45, 22, -9, 21, -19, -36, 31, 36, 18, -24, 46, 15, 8, -23, -27, 0, -30, -20, 24, -1, 41, -11, 17, -35, 25, 35, 48, 12, 5, 29, -27, 48, -23, 42, 34, 38, -20, -36, -9, 48, -1, 35, -46, -3, -38, -19, 16, 28, 40, 40, -21, -45, -26, -23, 11, -29, 17, -36, -25, 12, -33, 22, 12, 11, 17, -3, -1, 12, 18, -45, 7, 0, -39, 44, -4, -42, -44, -22, 27, 0, 33, 4, 45, 8, 5, -29, 49, -33, 7, -11, 38, -20, 5, -16, -25, 17, 33, -17, 25, -35, -9, -46, 10, -7, -16, 40, -50, 47, -8, -19, 12, -18, 44, 26, 15, -21, -41, -28, 46, -12, -6, -22, -21, -17, 1, 30, -29, -46, -40, 35, -19, -27, -40, -40, -34, -19, 32, -24, -19, 10, -26, 13, 13, -23, -11, 40, -37, -9, -12, -49, 30, -50, -19, 32, 13, 27, -20, 7, 31, 27, -37, 37, 18, -35, 18, 3, -38, 29, 28, -20, 18, -30, -21, -28, -13, -22, 26, -19, 11, 40, 47, -6, -2, -18, -47, -33, 19, 13, -23, 7, 40, 39, 5, -31, 26, 41, -17, 36, -41, 43, -29, -46, -7, -42, -8, -47, -9, 14, 47, -10, 13, 4, 39, -33, -35, 36, -5, -15, 39, 15, -7, -46, -22, -47, 48, 35, -2, 21, 34, -43, 1, 18, -30, -24, -13, -46, 34, 10, -43, 35, -33, -47, -47, -14, -36, -13, -24, 34, -3, -5, -5, -3, 8, -47, 24, -32, 6, -32, 40, -9, 41, -46, -3, -26, 16, -25, 23, 37, 11, 42, -44, -7, 36, -24, -9, 22, 5, -48, -38, 19, 8, -13, 34, 32, 38, 17, 35, 18, -50, -1, 30, 22, -42, 2, 37, -41, 33, 30, 26, -22, -15, 36, -24, -33, -33, -42, 16, -44, 7, 28, -21, 22, 10, 40, 49, 31, 44, -34, 2, -45, -12, -26, -9, -9, 8, -13, -20, -22, -42, -50, 29, 36, 21, -4, 25, -41, -35, -4, -8, -27, -43, 24, -25, -44, 28, -36, -3, -48, -35, 28, 38, 46, -37, 37, 24, -48, 22, 19, -20, 29, 24, -34, -2, -48, 32, 37, 4, 21, 49, -11, 15, 36, -11, -21, -26, -44, 41, -1, 30, 45, -50, 40, -7, 49, -2, -44, -48, 43, -50, 0, 47, -13, -8, 4, 6, 2, 49, -18, 29, 11, -40, 21, 1, -50, -37, 43, 34, -30, -17, 39, -37, -11, -16, -9, 31, -31, 9, -42, -18, -2, 17, -47, -3, -35, -4, -25, 19, -14, -29, -44, -9, -21, 23, 28, -45, -27, 15, -11, -36, 2, 34, 31, -46, 38, -15, 23, -5, -28, 37, -6, -41, 3, 19, 26, 34, -19, -8, -36, 15, -36, 30, -31, -1, -45, 28, -34, -25, -29, 22, 13, 25, 35, 7, 36, -14, 27, 37, 21, 39, 45, -23, 45, 35, -2, 22, 16, 38, 25, 42, 16, -10, -5, 36, 36, 4, 31, -40, 49, -25, 21, 41, 31, -38, -15, 13, 0, 25, -29, 9, -49, 5, -11, -23, 26, 46, -48, 12, 47, -28, 4, -19, 33, -23, -43, -48, 43, 38, 2, 43, -22, 43, 47, 38, 30, 8, -27, -13, -23, 46, 11, 49, 0, -44, -28, -5, 39, 27, -23, -27, -44, 49, 28, -2, -48, -49, -44, 29, -30, -42, -39, 42, -27, -18, 27, -8, 31, -46, 28, 20, 38, -37, -15, -16, -1, 37, 28, -40, -27, 24, -7, 0, -34, 19, 34, -43, 28, 45, 23, -23, 28, -39, -8, 31, -14, 37, 12, 50, 42, 12, -41, 27, 29, -14, -40, 39, -32, 1, -33, 43, -19, -28, -39, 7, 26, -30, -30, 42, 42, 40, -22, 28, -4, -39, 7, -10, -32, -39, -28, -46, -25, 12, 1, -41, 35, -12, -28, -40, 41, 44, 21, -3, 41, -35, -5, -4, 44, -3, 29, 18, 48, -26, 26, 42, 40, 30, -14, 12, -22, 7, 47, 43, -20, 35, 38, 17, 48, -10, -1, -7, -42, 8, 39, 40, -24, 31, 43, 8, 44, -48, 42, -44, 31, -35, -2, -19, 38, -7, 45, -32, -48, 9, -16, -22, 24, 19, 32, 50, -6, -24, 18, 39, -16, -32, -34, -16, 26, 27, -21, -3, 6, -34, 50, -36, 31, -37, -37, -6, 46, -13, 12, 24, -40, -3, -25, 16, -26, 30, 10, 35, 42, -25, -17, 39, -42, -11, 24, -44, -21, 15, -21, 17, 7, 4, -37, 26, 38, 26, 26, -14, -7, -45, -25, -37, -43, -27, 35, -12, -2, 34, 12, -25, -41, 26, 7, -37, 22, 20, -12, -20, -1, -35, 21, 0, -36, 38, -13, 28, 38, 20, 39, 21, 31, -30, -35, 16, 14, -38, 13, 10, -19, -39, 44, -10, 15, -43, 8, -26, -46, -6, -49, -9, -13, -48, -5, -29, -18, -19, -34, 31, 5, -48, 19, -2, 4, 26, -20, 30, -30, -35, -34, 45, -50, 21, 14, 15, -14, -27, 40, 33, 11, -30, -14, -16, -13, 2, -36, -9, 43, -47, -12, 28, -28, -36, 39, -39, 31, 19, 31, 3, 37, -13, -23, 28, -32, 18, 13, -47, 30, -41, -39, 18, -44, -7, -28, -49, 43, -14, 18, -31, 39, -7, 19, 42, 23, 0, 29, 47, -20, 49, -10, 7, -46, -18, -8, -32, -19, 36, -48, -50, 49, -10, 41, -3, -12, -46, 26, -40, -29, 36, 13, -39, 2, 4, 2, -30, -32, 18, 37, 43, 21, 15, 8, -2, 47, 8, -28, -48, 5, 7, 37, 11, -33, 10, -14, 3, 44, 27, 14, -37, -46, 44, 44, 43, 49, 11, -50, 12, 16, -31, -8, 34, 43, -9, 43, 18, 23, 37, -12, 11, -3, -45, 23, -9, 7, -8, -41, 38, 27, -12, -38, 24, -12, -40, -35, -18, 9, 45, 8, 23, 0, -36, 29, -8, -24, 5, 9, 45, 19, -4, 49, -43, 12, 38, -44, 30, 43, -49, -34, -47, -25, 27, 21, 18, -46, -46, 40, 18, -48, -13, 43, -50, -43, -38, 33, 19, -1, -43, -21, -11, 28, 23, -18, 22, 1, -18, 22, 27, 45, -14, 19, 18, -47, 9, 29, 23, -20, 44, -37, 26, 9, 17, -25, -27, 5, -42, -16, 28, -27, -20, 32, 15, 15, -10, -15, 50, -17, -12, 32, -28, 29, -7, 19, 7, 8, -25, -29, 37, -11, 34, 43, -40, -42, -39, -25, -13, -48, 46, -36, -4, -46, 3, -27, -40, -18, 36, 23, 6, 1, 13, -8, 41, 30, -7, 39, 38, -15, -39, 5, -48, -1, -22, 37, 32, 26, -35, -11, -24, 19, -9, 6, -41, -13, -43, -33, 45, -34, 7, 15, -7, 33, 23, -42, -3, -12, 38, 38, 37, -45, -21, 23, 44, -33, -8, -18, 2, 5, -32, 36, 18, -25, -22, -27, -45, 3, -12, -47, 7, -3, 9, -25, 28, 26, -11, 35, 26, 5, -12, 30, 49, -12, -3, -26, -17, -30, -26, 38, -29, -28, -26, 27, 27, -25, -21, 39, -13, 35, -17, 38, 49, 26, 42, 22, -36, 44, -7, 40, 44, -41, -14, -44, -19, -40, -3, 41, 17, -3, -6, 44, 42, -18, -47, -4, 39, 2, -20, -20, -24, 38, -3, -15, -2, -20, 50, -7, 8, -28, 48, 17, 41, -9, -9, -38, -50, 25, 2, -11, 39, -5, 36, -29, 1, -23, 2, 12, -34, 13, -45, -37, -34, -13, 18, -38, 2, -42, -7, -25, 26, -32, -3, 30, 29, -21, -19, 27, 28, 25, 50, 24, 18, -40, 47, 32, -25, -25, -34, 44, 32, -7, 33, -28, -26, 41, -14, 25, 14, -49, 23, 47, -19, 38, 23, 4, -1, 14, -19, -14, 25, 31, 43, -38, 3, -48, 34, -9, 27, -11, 23, 15, 9, 50, -40, -50, -25, -9, 11, 10, 26, 41, 49, 34, 11, 23, -39, -24, 16, -23, 15, -23, 44, -30, -44, 44, -37, -12, 22, 36, 11, -39, 42, -13, 7, 5, -12, 35, -47, -3, -44, 9, -11, -43, 7, 6, -16, 22, -38, -12, 33, -30, -4, 32, -49, -7, -21, 36, 4, -11, 26, 46, 45, 41, -27, -9, -23, 43, 42, 47, 0, -29, 38, 27, 23, 23, -43, -37, -6, -13, -19, 11, 45, 16, 33, 10, -38, 36, 32, 29, 49, 48, -4, 3, 20, 1, 50, 21, -26, -28, 23, -21, 46, -40, -16, -24, 16, -4, -1, -43, 4, 26, -9, 16, -31, -6, -16, 26, -31, -27, 6, 4, -42, 43, 38, -35, 4, 21, 7, 13, 41, 25, 37, -2, -22, 28, 31, -44, 26, 32, 18, 39, -49, -18, -3, -14, 38, 38, -21, -10, -47, 32, 40, -12, -27, -1, -14, 2, -26, 42, -20, 48, 41, -13, 7, 2, -1, -47, 41, 1, -20, 36, 27, 41, -37, -50, -8, 45, 8, 10, -10, -33, 9, 18, 28, 8, -9, 29, 49, -15, -11, -21, 36, -40, -26, -6, 0, -8, 15, 48, -4, -27, 26, -14, 5, 43, 24, 36, -5, -23, 42, 1, -36, -6, 7, 16, 22, 21, 46, 47, 22, 30, -10, 14, -11, -46, 43, 24, -23, -13, 30, 36, -33, -14, -24, -26, 18, 32, -24, 26, 3, -44, 39, 27, -24, 8, 21, -20, 48, 40, 17, -47, -33, 12, 36, 45, 25, 1, 33, 12, -6, -39, -43, -29, 40, -10, -10, 30, 6, -19, 46, 44, 4, -45, -12, -42, -19, -15, -35, -39, -10, 16, 7, 40, 40, -42, -34, -46, -25, 34, -50, -50, -16, -42, 36, -13, -47, 1, -32, 50, -46, 41, -3, 36, 12, -13, 1, 36, -5, 31, 42, 41, -42, -1, 23, 15, 26, -13, -24, -31, 11, 23, -35, 28, -38, -31, -27, -1, -44, 36, 37, -22, -46, -16, 14, 49, 31, 19, 36, 23, -44, -7, 21, -38, 43, 31, 27, 24, -13, -38, 3, -7, 46, -38, -26, -27, -22, 49, 19, -33, 41, -46, -33, 12, -14, 20, 4, 22, 48, -39, 1, 6, -5, -7, -27, -42, -39, 49, 50, -42, -29, -34, -18, -4, 37, -36, 42, 45, -18, 42, -36, -24, 47, 10, 17, 31, 34, -3, -43, -45, 12, 33, -49, -29, -30, -45, 45, 19, -38, -50, -29, -27, 13, -10, 43, -29, 10, -39, 39, -47, 32, 29, -39, -18, -30, 49, 22, 21, 33, 23, 45, 41, 23, 21, 1, -4, 46, 8, -4, 5, -38, -7, -16, -22, 5, -46, 16, 2, 50, 9, -45, -3, 29, -16, -33, -40, 0, -28, -4, 24, 8, 6, 42, 5, -24, 22, -16, 4, -42, -33, -7, -30, 5, -3, 49, -50, -24, -6, 12, 7, -11, 12, -13, -22, -11, -32, 37, 5, -7, 14, 49, 36, -38, -21, -2, 50, 24, 12, 20, -16, -40, -2, -11, -30, -4, -48, -21, 37, 16, 11, -14, 46, -29, -20, -5, 25, -6, -37, -39, 12, 40, 26, 37, -13, -4, 3, 4, -3, 22, 21, 50, -36, 20, 37, -35, 37, -8, -44, -8, -23, 15, 47, 9, -48, -50, -20, 5, 36, 33, 29, -5, -19, 30, -33, 17, -16, 49, -28, 28, -38, 27, -37, -14, -46, -29, -23, -47, -1, -22, -14, -16, -31, -16, 48, 33, -49, 7, -33, 43, 5, 13, 42, 1, -29, 42, 9, -41, 33, 29, -45, 30, -45, 35, 31, 45, -23, -9, 23, -10, 12, -29, 41, 28, -22, 20, -17, 45, -49, -25, 24, 38, -32, -31, -18, 30, 43, 31, 45, -47, -19, -32, -48, 41, 10, -13, -45, 5, -11, 30, 18, 32, -9, 48, 35, 37, 23, -49, -23, 50, -34, 19, 18, -12, -44, -19, -47, -30, -19, 31, 46, -37, 19, 24, -5, -31, 42, 7, 48, 29, -3, -44, -11, 8, -15, -7, -20, -9, -7, -8, -8, -4, -45, 42, 40, 15, 35, -42, -40, 29, 26, -33, -26, 46, 23, 7, -21, -50, 12, 46, 28, -22, 15, 24, 2, 47, -32, 15, 33, 1, -20, 9, 17, 42, -21, -38, -36, -31, -17, 41, -31, -1, 38, -24, -21, 5, 33, 14, 48, 4, -27, -26, 2, 25, -40, 43, 9, 26, -4, -26, -26, -34, -39, 1, -40, -41, 30, 9, 3, 29, 12, -31, -46, -10, 12, 5, -19, -24, 17, -3, -44, -5, 27, 37, -33, -13, 14, -34, 39, 35, 31, -13, 41, 34, 12, 46, 43, -9, -43, -21, 13, -42, 46, 6, 8, 42, 44, 16, 24, -46, 44, 33, -47, -43, -9, -16, -38, -46, -11, -32, 31, 46, -47, 8, -33, -27, 42, -20, 7, -23, -42, -6, 39, -2, -49, -45, -22, -25, -23, -44, -17, 5, -41, 6, -4, 35, -24, -12, -29, -32, 49, -42, -32, -49, 41, 10, 8, 35, 19, 20, 19, -18, 27, 14, -26, 19, -23, -33, 12, 40, -2, 15, -11, 34, 36, 15, 29, -47, -17, -46, 47, -29, -31, -4, 26, -17, -7, -45, 5, -22, 46, 2, -50, 8, -3, -44, 35, -19, 27, 10, 6, 0, 37, -32, -24, 12, 9, 10, 10, 36, -6, -30, -7, 42, -50, 44, 40, -7, 49, 11, 10, 40, 28, 38, 28, 32, -1, 24, -10, -18, 36, -39, -49, -30, -37, -17, 28, 34, 13, -28, 34, -1, -37, 34, 25, -5, -46, 15, -29, 19, -49, -22, 10, 49, 20, -35, 13, 46, 46, -37, -8, 25, -8, 19, 4, 25, -20, 25, 23, -11, -24, 1, -44, -5, 49, -18, 40, -43, -46, 10, 21, 9, 34, -27, -44, 10, 32, 44, -15, -24, -22, 36, -31, 19, 25, 25, -48, -12, 48, 32, -6, 17, -20, -13, 46, -45, -43, -23, -36, 44, -43, 3, -45, -22, -17, -44, -11, 23, -38, 11, 35, 34, 14, -10, -9, 15, 42, -40, 50, -1, 20, -16, 43, 29, 28, -31, -23, -14, -48, 42, 8, 50, 22, -24, -19, -3, -5, 44, -4, 39, -11, -48, 24, -22, 40, 7, -1, -41, 10, 48, 10, -28, -45, 24, 9, -24, 4, -20, -21, 16, -38, 8, 3, -30, -8, -40, 16, -13, 44, -27, 0, 25, 10, -5, -8, -24, 34, 38, -21, 43, 12, -41, -48, 26, 9, -24, 31, -6, 11, -27, -5, 27, -7, 12, -47, -35, 0, 23, 50, 40, -3, 14, 18, 26, -6, -48, -34, 32, -14, -46, -4, -7, 37, -18, -30, 16, 17, -19, -27, -16, -33, 16, 3, -25, 9, 37, 14, 0, 47, 9, 8, 25, -34, 34, -30, 16, -23, 38, -7, 19, 11, -9, 43, 45, -29, -13, -37, 47, -25, -11, 3, -38, 43, -32, -9, -10, -1, -48, -20, 25, -36, 3, 2, -6, -13, 27, 48, 29, -1, -27, -34, -33, -9, -34, -35, 34, 37, 47, 1, -15, 40, -12, 30, -26, -9, -30, 17, 38, 8, -21, 6, -18, 39, 38, 2, -35, -2, 37, -46, 26, 43, 9, 20, 30, 4, 40, -16, 18, -9, 18, -27, 20, 20, 4, -37, 4, -36, -46, 50, -47, -21, 33, 2, 39, 22, -21, 35, 43, 33, 41, 10, 20, 17, 41, 4, 48, 46, 20, 22, 47, -9, 47, 26, -22, -16, -6, 23, 43, 39, 48, 41, -22, 19, -48, 42, 6, 15, -29, -24, -29, 23, -2, 32, -27, -24, -15, -34, 5, -41, 3, 30, 23, 23, -13, 30, 39, 39, 47, -47, -1, 40, 10, -30, -15, -5, 44, 20, -7, 13, 47, -33, 37, -38, -38, -26, -46, -12, -22, 6, -5, -18, 37, -41, 7, -26, 23, -12, -35, 9, -23, 25, -7, 7, -19, 12, 42, -6, 2, 10, -1, -24, -25, -48, 39, -12, 14, -16, 2, 40, -5, 17, 32, -29, 9, -45, 1, 22, 24, 35, 22, -22, -8, 23, -17, -20, 35, -5, -47, -49, -46, -5, 28, -32, -13, 8, 28, 21, -31, 25, 17, 2, 4, -12, -15, 7, -36, -50, 44, -42, -28, 1, -25, 9, -33, 46, 27, 7, 14, 26, 28, 50, 18, -37, 27, -5, 18, 24, -19, 0, 18, 49, -36, 2, 20, 18, 43, -36, -21, 27, -27, 37, -16, 18, -39, 33, -5, 18, -15, 34, -3, 16, 42, 3, 38, 40, -15, 1, -29, -13, 48, 11, 14, -48, 37, -43, -12, -33, -48, -33, 29, 45, -50, -25, 1, -39, -13, 34, -10, 2, -38, 25, -38, -33, -32, -32, 19, -3, 20, 20, -23, 41, -32, 29, 30, 35, 32, -3, -22, -3, -32, 48, -4, 38, 9, -3, -31, 50, -32, -9, 26, 25, -2, -36, 9, 17, 28, 30, -24, 24, 4, 36, -36, 1, -20, 39, -44, -38, 3, -38, -31, 47, -41, 1, -14, 1, -24, -17, 49, 11, -35, 8, -30, -35, 30, 28, -38, -18, 3, 18, -24, 1, 14, -7, -21, -28, 28, 49, 32, 43, -35, 4, -33, 39, -34, 24, 1, -6, 5, 42, 3, -42, -34, -24, -14, -29, 21, 16, -13, 48, 45, 21, -7, 40, 45, -15, 47, -26, 44, -9, -38, 5, 28, 0, -1, 26, 1, -18, 44, -26, 7, -11, 36, -13, -48, -35, -49, -28, 47, -21, -41, 14, -29, 1, 5, -18, 38, 35, 29, -21, 31, -27, -46, 2, 50, 4, -28, 40, 25, -41, 47, -18, 29, 42, 11, 31, -24, -44, 49, -24, 23, -41, 24, 6, -21, -48, -22, -37, 26, 32, -26, -41, 28, 41, -2, -13, 20, -37, -21, -11, -39, 41, -37, -50, 17, -2, -33, -15, 13, 45, -23, 41, -19, 21, -26, -4, -31, -18, -21, -14, 29, 2, 38, 23, 18, -43, 46, 50, -50, 44, -44, 11, 36, 7, 37, 27, 36, 22, -43, 13, -43, -48, 7, -19, 17, -2, -13, -49, -42, -5, 14, -2, 24, -22, 39, 40, -22, -18, -23, 44, 32, -25, -22, -40, 45, 34, -17, 35, -3, -24, 21, -11, -20, 14, -12, 47, -27, 41, 17, 31, 42, -28, 50, 10, -24, -35, -6, -24, 22, -46, 8, 21, 31, -16, 19, 36, -5, 39, 5, -27, -41, 28, -13, 33, 42, 19, -3, -42, -1, 18, -3, -12, 32, -46, 33, -40, 9, -24, 42, -44, 9, -1, 16, 18, 4, 26, -35, -39, -24, -18, 28, 34, 30, 4, 1, -14, -36, 33, 32, 14, 17, -48, 21, -46, -42, -50, -21, 20, 35, -31, 42, -24, 38, 48, 40, 12, 24, 30, -20, 31, -32, 42, 28, 11, -44, 50, -14, 20, 35, 25, -43, 6, 31, -23, 31, 44, -34, 36, -40, -36, -21, 44, -45, -39, 36, 10, -15, -16, 16, 41, 28, 26, 12, 32, -11, 31, -20, -14, 34, -46, 30, 32, -47, -25, -27, -12, 5, 3, -13, 3, -32, 43, -25, 1, 24, 10, 16, -29, -34, -40, -12, 10, 40, -2, 42, 10, -39, -38, 7, -40, 13, -20, -40, -8, -15, -49, 36, 10, -15, 27, 50, -2, -24, -39, 7, 42, -45, -7, -4, -28, 23, 47, 25, 45, -25, -44, -19, -18, 31, 48, -31, 44, 18, 45, 1, -9, 32, -50, 12, -44, 7, 35, -1, -17, 0, -41, -25, -19, -9, 40, 11, -39, -11, 36, 27, -17, 30, 19, -24, -43, 46, 48, -4, 30, -25, 6, -44, 37, 38, 48, -25, 8, 18, -4, -16, -21, -1, 38, -27, -21, 33, 3, 16, -19, -43, -1, -4, 36, -5, 29, -16, 10, 38, 28, 0, 12, -43, -17, -26, -7, 32, -8, -1, -38, -5, 25, 28, 36, 2, 12, -49, -11, -28, 8, 18, -17, 23, -24, 4, -47, 17, 21, 19, 38, -24, -4, -11, 33, -24, -44, -28, 33, 13, 47, -22, 10, -7, 18, -24, -39, -34, -14, -17, 43, -15, -45, 45, -19, 22, -29, -41, -22, -40, 41, 15, 5, 34, 44, 7, 1, 10, -34, 40, -21, 21, -14, -46, -25, 19, 29, -50, -42, 34, 20, 13, 28, -27, -46, 0, -13, -22, -5, 1, -5, 24, 17, 8, -41, 47, -47, 1, 23, 46, -33, 25, 0, -28, -26, 9, -14, 17, 26, -33, -22, -21, 41, -44, 37, -10, 23, -14, -24, -30, 49, -8, 0, 42, 20, -38, 2, 36, 12, 6, -26, -38, -14, -21, 39, -39, 14, -33, 34, 11, -27, 9, -34, 9, -42, 1, 41, -36, 26, -23, 30, -42, 5, 34, 43, 24, 43, -15, 5, 38, 20, -31, 4, 9, -16, 23, 48, -50, 27, -6, 18, -11, -13, 47, -27, -47, 40, 18, -38, -30, 50, -19, -13, 44, -19, 28, 6, -3, -21, 20, -13, 44, -7, -25, 49, 39, -49, -8, -8, 12, 22, 7, -3, -46, 40, 25, -16, 42, -35, 32, -2, 9, 0, 40, 31, 8, 13, -38, 43, -25, 19, -48, 36, -39, -10, 28, 14, 12, -1, -4, -43, -20, -40, -34, -24, 44, -24, 27, 36, 5, 18, 43, 47, -4, -32, 6, -20, -35, -6, -24, 10, -25, -22, -7, -22, 44, -49, -45, -42, -36, 33, 7, -49, -48, 1, 4, 2, 43, 21, -11, 34, -12, -8, -38, -14, 4, -19, -37, 14, -24, -27, -29, 27, -6, -43, 40, 16, 13, 46, -4, -30, -19, -6, -7, -10, 45, 1, 37, -40, 50, 34, -33, -40, -24, -8, 14, 3, -22, -30, -22, -42, 10, 11, 20, 44, 40, 45, -46, 46, -36, 6, -46, -31, 50, 30, -47, 5, 34, -17, -11, 18, 17, -29, -37, 17, -43, 16, -5, -22, 39, 43, -39, 28, 1, 7, -49, -50, 4, 41, 48, -17, 13, 17, 31, -39, -1, -30, -41, 34, 38, 30, 19, -37, 50, -11, 31, -21, 22, -37, 1, -34, 11, 47, -29, 2, -19, 25, 4, 29, -29, -13, -1, 15, -6, -43, 14, -11, -46, -6, -5, -15, -34, -10, -21, 1, 28, -31, -15, 15, -6, -47, -1, 37, 4, 8, -9, -49, -5, -49, -1, -50, -38, 19, -29, -34, 8, 35, 19, -48, 19, 30, 48, -2, -1, 50, -16, -28, 21, -44, -1, -41, 39, 4, 23, -32, -28, 44, 13, -18, 15, 41, 45, 46, -42, -22, 28, -33, 31, 20, 27, -22, 32, 10, -46, 18, 5, 1, -36, 39, 37, 32, -31, 22, 41, -35, 24, 47, -26, 6, -30, -46, 24, -42, -40, 50, 14, 12, -25, 23, -32, -35, 5, 50, 17, 27, -21, -44, -39, -27, -29, -4, -21, 9, -12, -31, -25, -2, 18, -9, -45, 2, -17, 18, -41, -23, -48, 26, -3, 15, -16, 1, 11, 1, -4, 3, -23, 50, -28, 36, -16, -19, -49, -35, -35, 0, 16, 41, 42, 3, -31, 49, -18, 35, -43, -27, 2, 13, 7, -14, 33, -39, 33, 33, -47, 43, -20, 35, 28, -13, -14, 41, 24, -37, 24, 22, -27, -41, -13, -8, -14, -9, -19, 33, -37, -47, -27, 45, -41, -35, -12, 45, -33, -26, -44, 5, -4, 31, 31, -48, -50, -18, 20, 23, 8, 21, -19, 36, -34, 27, -34, 38, -30, 4, -45, 33, -2, 33, -25, -19, 21, -7, 8, -22, -34, -33, -11, 12, 31, 24, -6, 25, 28, 39, -48, -48, -13, 48, 22, -11, 17, 3, -31, -36, 42, -46, -12, -11, -44, 21, 45, 49, -18, -14, -19, -8, 12, -15, 47, -2, -26, 45, 15, -42, 42, -33, -29, 48, -36, -44, -38, -15, -35, -10, -30, -23, 23, 32, -34, 14, -38, -15, 7, -31, 1, -45, -28, -9, -27, -46, -19, -5, -34, 24, -24, 17, -28, 36, -17, -30, -29, 14, -19, 11, -23, 31, -44, 3, 19, -37, 43, 4, 7, -7, -5, -37, -7, -10, 22, 44, -49, 31, -46, 39, 36, -39, 27, 26, 48, -4, 28, -16, -32, 28, 12, -43, -28, -38, -28, -20, -21, -9, -49, -40, -26, -22, -29, -32, 22, -10, -13, -22, 23, -29, 37, -43, -4, -45, -44, 33, 30, -15, -43, 26, 37, -5, 13, -20, -28, 10, 30, -1, -5, 37, -8, -41, 44, -31, -35, 27, -48, -21, -33, 8, 19, 33, -16, -32, -25, -16, 25, 21, 6, 50, -2, -41, 34, -22, 44, 20, 47, 47, 43, 17, 43, 38, 27, -27, -8, 44, -12, 41, -26, 32, 17, -17, 45, 38, 35, 2, 41, 4, 2, -33, -44, 12, 24, -9, -40, -42, -16, 50, 36, 46, 14, 33, -46, 42, -25, 0, -13, -48, 34, 8, -38, 44, 30, -16, 36, -48, 2, 4, -6, 15, 16, 33, -7, 22, 17, 11, -26, 1, -1, -50, -12, 1, 25, -11, 9, 37, 22, 33, 18, -31, 34, -49, 34, 37, -42, -12, -21, 3, 31, 7, -7, -8, -41, -3, 34, 35, -34, -46, 19, 23, 13, 15, 20, -47, 50, 32, -23, 33, 43, -13, 15, 16, 9, -4, -26, 15, 28, 16, 18, -11, 49, -1, -11, -14, 40, 18, -34, 11, -10, 25, -9, -20, -18, -8, 42, 16, -13, -10, 12, -11, -21, -4, -29, 45, 4, -8, 10, 23, -19, -47, 42, -6, 21, -31, 20, 14, 9, 38, -25, 22, -28, -11, -49, -25, 27, 11, -7, -20, -25, 32, -46, 19, -16, -35, -20, 31, -37, -26, 28, 39, 49, 24, 50, 50, 20, -33, -1, -31, 5, -49, -25, -28, -19, -38, -38, -34, 38, 7, 35, -24, -34, 39, -13, -37, -37, -39, 18, 50, 17, 4, 12, -22, 38, -6, -47, -35, 15, -28, 17, -31, -34, 1, -45, 31, 33, -12, -17, 3, 37, 31, 43, 14, 36, -22, -10, 12, -19, 15, 49, -6, -34, -8, 15, 17, -17, -50, -28, -45, -35, -49, 25, -24, -32, -23, -16, 17, -2, -44, -14, -26, -10, 30, 11, -10, -37, 50, 3, -49, 37, 28, -3, 0, 46, 4, -39, 32, 18, -50, 8, 22, -17, 42, -5, 8, 15, -32, -23, 48, -11, 6, 0, -29, 17, -43, 9, 14, -15, 20, 38, -22, 14, 5, 31, -47, 33, 21, 40, -1, -12, -16, -26, 27, -7, -4, -11, -20, 18, 30, 23, -8, 4, -35, 17, 18, -9, -10, -1, 33, -45, 24, 2, -34, 6, 16, -35, 1, 49, 39, 37, -17, 33, 30, -31, 29, 5, 0, 2, -2, -47, -33, -15, -16, -21, 12, 31, -30, 1, 45, 18, -10, 3, 36, -21, 40, 5, 28, -10, -37, -30, 47, 39, -26, -1, 44, 2, -3, 19, -3, -47, -27, -20, 32, 24, -22, -46, 31, 16, 24, 34, 43, 32, 2, 38, 13, -16, -39, -4, 39, 4, 18, 32, 40, -13, -22, -39, -32, -42, 31, -22, -48, 36, -21, 7, 37, 2, 50, 50, -47, 6, 3, -23, -35, -38, 21, 5, 2, -3, -26, 15, -21, -48, -28, -22, -10, 43, -40, -30, 40, -27, 44, 43, 14, -50, 3, 21, -17, 29, 40, 17, 32, -22, -48, -40, -43, 11, -18, -43, -26, 37, -25, -25, -34, 40, -22, -8, 22, 27, -46, -1, 43, 5, 12, 6, 41, -6, -14, 21, 28, 41, -15, -18, -45, 25, 20, -6, 41, -44, 14, -27, -6, 10, -32, -19, -21, 14, -19, 6, -31, 34, 32, 43, 41, 45, -21, 36, 40, 50, 8, 39, 11, 16, -20, 15, 3, -41, -13, 32, -20, -22, -26, -19, -34, -6, -2, 36, -33, 24, 1, -31, 11, -38, 37, -8, 33, 41, 48, -30, -45, 20, 42, 2, 36, 1, 18, 35, -42, 45, 23, -5, 41, 24, 20, -21, -8, 8, -13, -17, -5, 41, -19, -35, -12, -50, 47, 6, 36, -31, 31, 31, -9, 34, 21, -17, -1, -40, -8, -41, -43, 21, -32, 14, 4, 1, -48, 2, -7, 45, -3, 3, -35, -21, 41, -23, -35, 0, -18, -26, -33, -25, -45, -13, -7, 16, -8, -45, 27, 13, 31, 29, 37, -38, 14, -13, 13, -37, -34, 26, -38, 22, -45, -45, 43, -14, 6, 2, -5, 27, -47, -17, 15, 12, 10, 30, -9, 27, 13, -34, 10, -21, -8, 42, -44, 22, -5, -28, -15, -37, -31, 5, 30, -19, -26, 43, -2, 6, -24, -24, -5, 44, -6, -25, -37, -3, 34, 41, -36, 43, 38, 0, 3, -40, 24, -23, 4, 18, 41, 21, -25, 19, -19, -3, 45, -39, 19, 26, 10, -17, 36, 30, -6, 9, 14, 20, -38, 27, 30, 43, -3, -2, 47, 40, 7, 38, 48, 22, 19, 10, -25, -12, 7, -24, -11, -20, -48, 37, -36, 3, 19, -40, -21, -16, -8, 10, -11, 42, 36, -9, -9, -48, 39, 27, 32, 34, -30, 22, 26, 2, -7, -5, -14, -13, 37, -13, -40, 42, -6, 13, -7, 30, 11, 39, 10, 39, -39, 31, -42, 16, 23, -49, -43, -8, -33, 1, -12, -20, -37, 13, 46, 42, -7, 9, 46, 48, -49, 48, -19, -15, 4, 36, 12, 18, 29, -11, -27, 7, -23, 11, -26, -44, -13, 20, 35, 35, 40, 46, -6, -19, -19, -50, 23, -6, 13, 17, 42, -44, -13, 19, 2, 24, 22, -21, -29, 7, 22, 4, -5, 46, -25, 13, 29, -42, 36, -36, -32, -35, -26, 48, 0, 26, -5, -44, -17, 7, 27, -28, -28, -34, -38, -24, 15, 50, -21, -47, 43, 16, -37, -40, -11, 36, 45, -48, -50, -42, 22, 25, -50, -35, 43, 21, -5, -41, -18, -10, 0, -29, -35, 32, 24, 11, 2, 24, -37, 8, -25, -7, -31, 33, -46, 14, -40, -4, -41, 10, 41, -6, -4, -17, -38, 38, -28, -15, 12, 25, -4, 15, 33, 29, -37, 2, 15, -2, -35, 17, -8, 26, 14, -42, -30, 31, 45, 47, 33, -8, 15, -47, -44, 35, 33, 7, 48, -47, -31, -16, 46, 8, 34, -6, -37, 44, -29, -3, -21, -22, -15, -9, -22, -44, -19, -38, -38, 3, -37, -45, -35, -10, 1, 34, -35, -46, -27, -8, 14, -41, 8, -16, -20, 28, -40, -42, 15, -7, 43, -35, -3, 2, 14, -3, 19, -5, 24, -18, 1, 30, 4, 0, 47, -11, -26, 12, -29, 39, 40, -13, -42, -14, -46, 31, -29, -39, 9, -7, -29, -45, 49, -24, 4, -36, 13, -34, -48, -41, 12, 12, 38, 11, 34, -42, -27, -19, -48, -18, -8, -39, 42, 34, 47, 46, -19, -31, 16, 17, -34, 30, -32, -47, 42, -34, 13, -29, 15, -9, 25, -6, -40, 2, 9, -22, -31, -46, -26, -17, -39, -23, 47, -45, -32, -39, -26, -38, 30, 25, -48, -27, -43, 49, 39, -6, 21, 45, 45, -50, -48, 14, -36, -1, -31, -48, 10, -36, 8, 3, 9, -14, -30, -28, 48, -33, -34, -20, 13, -3, -25, -29, -6, -15, 13, -16, 24, 40, 47, 31, -24, 17, -34, 19, -40, -46, 7, 31, 6, 38, 23, 29, 23, 23, 49, 34, -37, 21, -50, -35, -25, -2, -9, 19, 15, 2, -42, 18, -11, 5, -46, 5, 21, -46, 18, 1, 30, 22, 47, -18, -29, 34, -36, 14, 20, -28, -45, 33, 7, -25, -39, 26, 26, -49, -19, -1, 44, 10, -40, 50, 17, -17, 29, 44, 38, -43, -43, 47, -36, -46, -32, 23, -42, 6, 3, -22, 50, -32, 26, -5, 29, 11, 43, 9, -46, -18, 32, 4, -32, -34, 37, 41, -9, 50, -29, -12, 29, 48, -24, 25, -5, -23, 1, 14, -12, -33, 36, -29, 17, -40, 31, 13, 20, 34, 6, -16, -14, -1, -21, -34, -18, -35, -36, -38, -48, -27, -28, 8, 4, 14, -19, 46, 9, -21, 15, -33, 8, 2, 13, -21, -33, -46, 18, -43, -42, -19, -37, -38, -33, 17, -29, -31, -36, -44, 26, 47, -21, -46, -50, 9, -20, -31, 32, 13, 13, -22, -41, -22, -20, 24, 36, -21, -26, 29, 7, 6, 36, 12, 46, -14, 7, -23, -24, 19, -14, -45, 38, 26, 11, 46, -18, 38, 27, -11, -10, -9, -42, -33, -36, -47, -17, 11, -13, 30, 20, 45, -28, -31, 5, 2, -49, -30, 25, -9, 6, -2, 40, -41, 21, 10, -30, 9, 35, -38, -3, -11, 12, 25, 30, -42, 6, 0, -11, 25, 22, 13, 43, 19, 13, -26, -23, -41, -23, 42, -15, -40, -30, -25, -33, 17, -10, -36, -28, -10, -45, 20, 9, 28, 1, -42, -21, -7, 11, -8, -23, 43, -43, 48, 0, 48, 39, -21, 48, -40, -31, -20, -17, -39, -3, -23, 16, 12, -3, -9, 1, -46, 26, -39, 8, 14, 1, -8, 32, 42, 12, -1, -12, -9, 38, 29, -34, 41, -8, -2, -46, -50, 16, -27, -22, -36, -47, -7, 14, 28, 37, -20, -31, -41, -40, 31, 47, -23, -13, 29, -27, -12, 0, 25, -1, -44, 49, 30, 17, 2, -14, 46, 32, 3, 39, 4, 24, -20, 14, 49, 42, 38, 8, -4, -2, -33, -48, -33, 7, 20, 41, 30, -26, -33, 1, -8, 16, 38, -44, 23, -7, -7, 0, 32, 28, 34, -30, -14, -23, -19, 6, -10, 3, -24, 36, 23, -11, -10, 19, -27, -33, 23, 5, -36, 47, 21, -16, -24, 38, -48, -30, -12, -19, -1, 34, -42, -1, -50, -47, -47, 39, -17, -24, -36, -19, -10, 20, 10, 12, 10, -37, -28, 14, -19, -10, -25, -3, 22, -35, -20, 15, -19, -41, -26, 31, 47, 42, -6, -27, -48, 11, 28, 16, 4, 44, -41, 4, -29, -37, 22, 31, -43, -36, -36, 1, 19, 3, 25, -9, -32, -11, 18, -24, 23, -8, 1, -5, -37, 13, 10, 47, 7, -2, 28, -22, -25, -24, 16, 16, -16, 9, 10, 48, 19, 27, 39, -48, -18, -9, -38, -22, -42, -19, -29, 35, 7, 6, 47, -41, -26, 11, 12, 25, -48, 32, 46, -4, 4, -25, -38, -44, -17, -29, 33, -28, -3, -37, 43, 36, 1, 32, -12, -10, -15, -45, -28, -41, 48, 34, 45, 9, -21, 46, 19, -46, 28, 6, -8, 1, 38, 26, -45, 50, -49, -34, 37, -39, -7, 3, 27, -44, 39, -19, -22, -5, 22, 27, 2, 30, -26, 2, 43, -22, 42, 31, 44, 32, 30, -45, 25, -13, -48, -16, 4, -4, -18, 42, -48, 18, 8, 27, 49, 41, 45, -33, 26, 15, -26, -31, 20, 24, 18, -22, -33, 21, -24, -9, 15, 48, -25, -28, -46, 29, -40, -32, 29, 45, -39, -49, -8, -29, -25, -18, -27, 18, -30, -5, -33, -46, -43, 34, 6, -46, -38, 32, 42, 15, -14, 39, -22, 18, -19, -3, -49, 18, 46, 0, -16, 32, -36, 48, 21, 14, -13, 35, -34, 29, -6, -50, -48, 19, 1, 2, -48, 43, -4, 24, 40, 35, -45, -5, 44, 10, -8, 5, 19, -31, -4, 3, -10, 24, 15, -20, 13, 39, 40, 7, 4, -5, 44, -27, 26, 38, -14, -10, -26, -22, -20, -49, -39, -46, 10, 40, 5, 47, 27, 20, -14, -15, 23, -22, 29, -13, 34, -10, -18, 42, 30, -38, -45, 15, -43, 13, 45, 49, -42, -28, 20, 44, -30, -50, -5, 11, -49, 24, 50, 31, -7, 37, 32, -46, 42, -12, 15, 30, -6, 24, 50, -38, 42, -19, -8, -43, 23, 38, 8, -40, -23, 46, -12, -25, 21, -25, -19, -5, -23, -44, -16, 15, -29, -29, -48, -5, -1, -43, -47, -36, -7, -12, 25, -22, 22, 11, 33, -17, -25, 34, 36, -33, 12, 1, 3, 37, -9, 42, 3, 1, -38, -19, 32, 30, 15, 31, 7, -12, -24, 27, 3, 28, 21, 22, 34, -8, 48, 1, -37, 40, -43, -16, -33, 4, 27, 1, 21, -2, -43, -14, 15, 30, 26, 27, -10, 22, -24, -31, -13, -39, -9, 35, 50, -1, -20, 26, 14, 2, -11, 22, -12, -41, -22, -11, -21, -49, 31, -23, -4, -19, 37, 27, 38, 38, -19, -24, 3, 45, 5, -20, -27, -16, -21, 46, 4, 13, -18, -5, 40, 46, -18, 17, 13, -21, 28, -22, 11, 41, 45, 49, -21, -39, 16, -36, -41, 35, 10, -28, -40, -35, -2, 29, -37, -45, -9, -34, 44, -9, -41, -5, 33, -2, -42, 28, -12, -49, 17, 1, 37, 31, -40, -14, 39, 21, -29, 1, -46, -49, -46, 48, -19, -32, -47, 36, -5, 32, -25, -1, -25, 20, -19, 46, -7, -25, 10, 37, 0, 8, 36, -13, -25, -6, -20, 19, -6, -20, 10, -3, -6, 9, 10, 1, 1, 25, 30, 11, -25, 16, 28, -2, 37, 43, -7, -15, 2, -7, 40, -29, -49, -44, -35, 37, 43, -7, 14, 40, 22, 20, 18, 10, -21, -9, 40, 23, -26, 31, 20, 6, 44, -19, -1, 24, -41, -29, 44, -10, -4, -37, -48, 37, 27, 2, -35, 10, -23, -16, -49, 10, 5, 47, 4, -33, 20, -2, -9, -44, -47, -8, 29, 8, -2, 9, -45, -31, -20, 32, -29, 34, 31, -19, -4, -17, -24, -7, -21, -18, -24, 5, -28, -8, 32, 3, 44, 17, 2, 32, -11, 9, 35, -42, 44, -41, -41, -21, -41, 7, -15, 31, -7, 6, -8, 32, -28, -47, -39, -2, -27, -38, 17, 40, 21, 39, -17, -42, -41, 14, 21, 23, 3, -8, 8, 38, 44, 8, 16, 10, -13, 48, -43, 14, -46, 40, 39, -8, 9, -25, -40, -17, -49, -30, -25, 25, 22, 36, -46, -42, -1, -41, 7, -41, 27, -15, 23, 5, 11, -14, -10, -3, -29, 36, 29, 10, 24, 48, -3, 13, 33, -14, -10, -46, 49, 26, 1, -34, 39, 11, 1, -31, 46, 43, -35, -44, 43, 15, -39, -8, -11, -50, 7, -48, -43, 39, 24, 10, 34, -46, -25, 34, 22, -34, 50, 15, 0, -4, -11, 41, -24, -11, -50, -5, -40, -12, -33, 40, -4, 23, 49, -30, -23, -50, -37, -31, 22, -6, 10, -24, 5, 1, 17, -14, 31, -20, -2, 2, -12, -41, -42, 41, 41, -38, -33, -39, 21, 36, -46, -44, -36, 16, -33, -13, -25, -13, 8, 1, -18, -30, -34, 11, 8, -49, 13, -26, -10, -32, -13, -26, -12, -47, -48, -17, -41, -24, 39, 40, -50, -7, 33, 1, -26, 23, 14, 29, -40, 17, 48, 26, 34, -36, 6, 23, 13, -40, 45, 46, -31, 49, -21, -41, 3, 7, 28, -22, -50, 7, -30, -36, 16, -18, -13, -32, -47, 25, 38, 47, 30, 7, 19, -39, 28, -34, -50, -37, -49, -47, 15, 39, -5, -1, 9, 1, 46, -3, -12, 19, 9, -21, 35, -24, 32, 23, 4, 19, -25, -9, 16, 16, 1, -45, -41, -13, 26, -39, -5, -2, 40, 21, 12, 18, 49, -8, 43, 9, 50, -22, 35, 27, 23, -40, -16, -28, 21, -30, -14, -23, 44, 7, 2, -23, -9, 40, 34, 22, 42, 10, 28, -18, 4, -14, -4, -15, -23, -41, -28, 41, 47, -46, 31, -45, -9, -4, 36, -23, -38, -26, -44, 15, 29, 7, 15, -15, -49, -13, 23, -37, -24, -36, 34, -39, -8, 46, 6, 35, -3, 10, 31, -7, 1, 11, -49, 42, 20, -20, 31, 22, 21, -18, -46, 27, 7, 26, -40, 33, -28, -6, -24, 28, 43, 5, 8, 29, -11, -33, 0, 10, -28, -15, -13, 21, 5, -12, 42, 25, 31, 32, 49, 46, 18, -23, 39, -30, 11, -28, -30, 24, -35, 11, 46, 40, 14, 29, -46, -5, 13, 31, -10, 47, -7, 38, 47, -36, 17, 0, 3, 17, 38, 26, -9, -5, -26, 16, -16, 22, 27, -29, -42, -27, -28, 10, -14, -6, -36, 6, 49, -37, 1, 33, -15, -24, -34, 39, -10, -47, -48, -32, -10, -11, 7, -12, -44, -15, 32, 25, -31, 25, -22, 43, 33, 17, 15, -4, 43, -28, -45, -33, 2, -29, 50, 17, 24, -16, 24, 47, -42, -20, 45, -8, 48, 24, -34, 0, 49, 15, -27, -36, -23, -48, -22, 1, 3, 7, -6, 26, -1, -29, 1, 2, -20, 20, -3, 39, -20, -47, -16, 46, 16, 13, 32, -42, -5, 32, 5, 5, 32, -25, 9, 26, 35, 21, 37, 39, -3, 7, 12, 7, -48, -44, 1, 11, -49, -18, -39, -3, 25, 2, 23, -10, 40, 31, 7, 17, -28, 34, -15, 43, 34, 36, -30, 21, 4, 5, -38, -29, -44, -27, 10, -46, -1, 11, 4, -25, -41, -40, -11, -40, 43, -47, -49, 26, -12, 30, -28, -6, 23, 26, -9, -9, -22, -35, 16, 49, 9, -47, 49, -35, -10, -45, -9, 6, -23, 49, -28, 25, -9, 44, -39, 45, 38, 13, 7, 0, -22, -32, 35, 37, 46, 49, -6, 3, 29, 15, 21, -38, 43, 14, -39, 20, -37, -9, 48, 41, 25, -3, -27, 14, -34, -13, -23, -18, -27, 19, 34, -47, -18, -41, -15, 26, 49, 22, -20, -47, 33, -43, -24, -15, -42, -8, -27, -14, -10, 43, -25, -47, -50, -31, 41, -6, 37, 41, 41, 18, 45, 1, 43, 13, -30, 29, 21, 25, 45, -26, 16, -25, 49, 30, -24, 1, 12, 35, -6, 7, -13, -16, -5, 20, -48, -45, -38, -5, 28, 39, -18, 28, 11, 12, 5, -12, 9, 27, 32, 41, -27, -1, -18, 25, 23, -44, -5, 11, -50, 28, 14, -6, 33, 4, 15, 16, 49, 29, 3, 42, 49, 12, 3, 1, 3, 16, -14, -39, 8, -31, 36, 35, -19, 20, 35, -7, 15, 27, 4, -35, 37, 20, 17, 1, -14, -5, -10, -46, 15, -46, 12, -48, -43, -25, 23, 47, 49, 2, 25, 33, -22, -37, -46, -24, 17, -22, -48, 46, -21, 49, -42, -50, -28, 16, -19, 37, -45, 26, -2, -36, 7, 2, -21, 25, -11, 8, 12, -3, 48, 41, 17, -44, -4, -8, -35, -29, 12, -5, -6, -10, -26, -1, 16, 1, 35, -20, -14, -29, -24, -49, -29, 2, -34, 5, 33, 37, -20, -8, 21, 2, -46, -49, 8, -47, 48, -17, 16, 33, 22, -45, 7, -4, -46, 10, 5, -16, 44, -38, -25, 35, 45, 13, 28, -40, 11, 29, -4, 19, 24, 7, -41, -35, -39, 20, 40, 37, -1, -36, 8, 19, 11, 32, 21, 11, 49, -1, 26, 3, 3, 46, 45, -23, 0, 23, -18, -50, 34, 18, -50, 4, 34, 38, 33, -6, 22, 29, 41, -11, 10, -15, -27, 29, -37, 47, 37, 24, 49, -50, -4, 25, -30, 22, -12, -48, -35, 17, -25, 3, -38, 10, -31, 32, -24, -49, -41, 9, 38, -32, -36, -4, -27, -35, 30, 9, 29, 31, -2, -47, 15, -2, -20, 15, 3, -49, 10, -36, 9, -8, 42, 47, -11, 45, 34, -21, 12, -27, -7, -37, -23, -37, 5, -17, 27, 38, -39, 5, 10, 10, -11, -31, -9, -44, 28, 22, 17, -20, 36, 19, 41, 25, -4, 0, 7, -29, -27, -17, 12, 9, -32, -27, 13, -31, 47, -24, 7, -7, 42, 14, -5, 49, 3, -12, -44, 3, -8, -31, 33, -26, -8, 34, 22, -24, 41, -26, -15, 47, 15, -42, 32, 28, 2, -30, -1, -35, 15, -25, -7, -22, 46, 47, -5, 40, 20, -2, -36, -34, -42, 26, -19, 15, 8, -19, 33, -8, 32, 40, 49, 8, -21, -40, 29, -25, 43, -49, -17, -10, 35, -20, 12, 4, 10, 34, -15, -11, -28, -25, -33, 28, -17, 35, -23, -2, 13, 20, 12, 11, -9, -27, -16, 26, 4, -2, 26, 44, 8, 32, 42, -29, 34, 10, 29, -21, 18, 9, -45, 34, -40, -27, 41, 28, 0, -32, -1, 30, -48, -48, 41, -20, -4, -43, -34, 48, 49, 40, -6, 46, 9, 24, -30, 19, -30, 7, 4, -23, 30, 31, 24, -5, -7, 38, 43, -26, 20, -2, 50, -5, 40, 39, 12, 26, 37, -39, 27, 6, 22, 13, -20, -47, 3, 32, 14, 42, -45, 14, 38, 40, -29, -34, 8, -22, 16, -34, -49, -19, -29, 46, 7, 2, 35, -4, -47, -13, -38, 10, 36, 13, 26, 33, -18, 47, -13, -22, 10, -19, -40, -33, -6, -30, -39, -31, -44, 40, 20, -49, -8, 46, -30, -22, -19, -6, 25, 26, 8, -48, -12, 0, -43, -5, 15, -45, 7, -10, 28, 3, 25, -10, -3, 45, 19, -24, -4, 26, -28, 23, -37, 10, 16, 25, -26, 14, 45, -27, 2, 22, -1, -50, -12, 23, -7, 43, -46, 17, 21, 29, 14, 28, 37, -36, -1, -45, 15, 18, -12, 47, 45, -22, 42, 37, -5, -20, -27, -36, 25, -31, -47, 7, 26, 10, -41, -10, 2, 36, 20, 25, -3, -36, -44, 21, 20, -8, -47, 0, 20, 8, -10, 10, -21, -33, -21, -44, 1, -3, -28, -14, 20, 42, 47, 2, -6, -2, -2, 31, -4, -26, 40, -24, -39, -28, -34, -7, 20, -27, 20, 42, 9, 2, 41, 36, 23, -35, 47, -26, 15, -1, 18, 27, 44, -11, -45, 13, -23, -42, -45, -34, -11, 48, 25, -6, 31, -8, 47, -5, 12, -50, 8, 12, 28, -33, 35, 31, 14, -31, 5, 3, -3, 49, 3, 38, -35, -31, -4, 46, -44, -28, 24, -18, -11, -46, -6, -10, -43, 30, 31, -1, 40, -20, -47, 15, 5, -46, 30, 3, 45, 42, 29, -50, 25, 32, 22, 10, -44, -21, -36, -47, 12, 19, -13, -4, 9, 48, -49, 18, -43, 0, 43, -32, 43, -20, 29, -29, -18, 35, 21, -14, -39, 18, 13, -26, 3, -22, -38, -25, -29, 42, 25, 41, 22, -41, -3, -9, 39, 49, 8, 2, -11, 24, 11, -45, -47, 40, 4, 37, 18, -48, -44, 37, 35, -39, 48, -34, 16, 24, 19, -15, -34, 35, -50, 16, 29, 48, 27, -2, 0, 20, 39, -8, -20, -27, 32, -14, 14, 38, 12, 5, 23, -33, 14, -22, 26, -47, -39, 5, -3, -32, -25, -13, 29, -26, 5, 23, 50, -23, 10, 41, 38, 38, 0, -39, -43, 49, 7, 37, -28, -14, -40, -34, 41, 5, 2, 16, -49, -22, 6, -17, 27, 46, 31, 42, -49, 24, -20, 26, -7, 39, 5, 47, 3, 2, 23, 25, 35, -5, 3, -20, 32, -27, -26, -16, 6, 21, 18, 35, -23, 25, -18, 2, -35, -25, -39, 36, 39, 26, 36, -20, 49, -24, -15, 8, 36, -48, 43, -19, -36, 24, 15, 39, 12, 47, -50, 24, -46, 39, -45, 48, -46, 22, -23, 32, 18, 36, -7, -35, 20, 27, -29, 22, -28, -8, 17, -8, -25, -10, 19, -20, -34, -42, 40, 4, -45, 19, 13, -47, 16, 37, 5, -33, -19, 34, -3, -22, -19, -26, 25, 12, -42, 20, -37, -31, 33, -41, -40, -12, -32, -32, -8, 10, 19, 21, 14, -28, 50, 9, -41, 12, -49, -15, 6, 15, 28, -31, -9, -30, 43, 37, 15, -13, 35, 42, 27, 18, -27, -25, -49, -5, -17, 11, 36, -10, 48, -36, 4, -48, 25, -13, 0, -34, 40, 32, -2, -30, 37, -27, 32, 44, -11, -31, 28, -16, -3, 48, -18, 5, -10, 3, -7, 31, 30, 21, 33, -40, 43, 40, -37, -9, 28, -39, 33, -34, 39, 27, -26, -25, -4, -26, 38, 9, 9, -24, -8, 25, -31, 12, 29, -26, -24, 1, 31, -41, -1, -21, -50, 3, -47, 36, -44, -21, 39, 14, -22, -26, -11, -25, -34, -20, 10, -43, 18, -50, 28, 49, 20, -5, 40, 48, 40, -31, 31, -11, -49, 43, 10, 43, 20, 26, 46, -21, -21, 36, -6, -27, 33, 41, 5, 32, 10, -38, 29, 5, -36, -40, -39, 35, 38, -48, -27, 38, -42, 41, -5, 43, 20, 9, -40, -41, -48, -32, -49, -34, 42, -49, 2, -35, -41, 17, -8, 39, 7, 9, -27, 25, 34, -35, 49, 48, -42, -45, 14, 27, -27, -41, 31, 22, -24, 32, 49, -48, -13, 22, 23, 22, -34, -3, -2, -8, 33, -44, 17, 23, -30, 27, -26, 30, 10, -23, 27, 1, -38, -17, 16, -47, -7, -36, 33, -43, -46, 15, 41, 35, 22, 41, -5, 14, 49, 15, -25, -20, 0, -10, 0, -32, 44, 22, -48, -13, 19, -6, 20, -10, -26, 38, -1, -50, 3, 35, 33, -38, -11, -30, 36, -10, 10, -18, 22, -22, 4, -19, -40, 1, -15, 42, -20, -37, 12, 1, 3, -1, 38, 3, 39, 35, 22, 46, 36, 48, 33, 46, -16, -21, 4, 43, 35, -50, -36, -26, -31, 20, -35, 1, 36, 34, 14, 33, 32, 19, 45, -50, 43, -35, -24, -33, 26, -7, -1, 41, 23, -37, 1, 42, 24, -1, 40, -34, -48, 11, 44, -30, -18, -50, 19, 5, -47, -29, 26, 7, -7, 6, 43, -11, 39, 5, 12, -12, -44, -37, 39, -33, 4, 5, 37, 6, 7, -26, 45, 19, 29, -48, -30, -19, -49, -31, 24, -33, 3, 24, 48, -15, 25, 10, 9, 44, -15, 43, -7, 17, 15, -7, 26, 39, -22, -3, -15, 41, -43, -46, 45, 43, 27, -4, -8, -41, -41, -45, -35, 9, -25, -30, 49, 7, -10, -21, -46, -41, 44, -40, 12, -44, 8, -39, 13, -10, 9, 21, -23, 29, 12, -48, 50, -19, -30, 4, -33, 2, 24, 10, -1, -43, -39, 0, 15, -10, -29, -42, 27, 28, -40, -38, 5, -23, 38, 13, 50, 13, 19, 4, -14, -18, -26, -28, 9, 5, 12, -43, -34, 44, 39, 6, 24, 11, 43, -40, 16, -11, -11, 5, 2, 34, 48, -23, 35, -9, -5, -33, -28, -25, 48, -22, 1, 24, -5, -50, 12, -35, -26, 11, 31, 29, 32, -35, 18, 40, 19, -17, 29, 2, -28, -8, -7, -19, -28, -31, -32, 42, 21, -22, -33, 18, -39, -41, -14, 30, 45, 4, -47, 44, 12, 39, -39, -33, -43, -19, 33, -2, 12, 26, 8, 36, 16, 48, -12, -1, 34, 20, -25, -28, 45, 12, 15, -12, 15, -5, -36, -35, 39, 21, -35, 34, -12, -40, 37, -15, -33, -28, 26, -2, -9, -7, -50, -44, -3, 34, -35, -3, 27, -8, 0, 15, -20, -12, -42, -10, 12, -37, 7, 23, 37, 46, 47, 33, 13, -23, -47, -17, -47, 19, 7, 35, -47, -1, -46, 24, -6, -16, 32, 24, 24, -24, -49, 3, 21, 47, 33, 36, 28, -3, 26, 44, -2, 27, -50, 40, -18, -16, 3, 5, -36, 18, 50, -47, 33, 13, -29, -27, -4, 24, -45, -24, -41, -12, 23, 39, -14, 3, 46, 0, 9, 21, 0, 11, -2, 0, -23, -15, -26, -15, 26, 9, -44, 14, 22, 41, -15, 43, 22, -21, 48, -4, 40, -22, -46, 14, 18, 12, 42, 5, -34, 0, -14, 37, 40, -42, -13, 2, -38, 39, 2, 24, 37, 46, -2, 19, -16, -35, -38, -40, 36, -49, 43, -32, -6, -5, -4, -2, 28, -9, -18, -10, 18, 35, 40, 48, -32, -12, -44, -12, 47, -17, 40, -7, 18, 17, 12, 20, -3, -48, 34, -17, -42, 10, -31, -11, -39, -23, -3, 46, 23, 24, -44, 31, 32, -37, 30, 36, -32, 3, 9, 16, -17, 38, -10, -20, -12, 27, 50, 1, -4, -31, 45, 46, 1, 44, 20, 11, -46, 6, -47, -40, -32, 33, -24, -22, -33, -14, 10, -4, 38, -31, 19, 49, -2, -36, -33, -13, 38, 33, -29, 25, 9, 46, 42, 15, -25, 13, 45, 7, -48, -21, -32, -41, 38, -5, -32, 7, 34, -45, 0, -37, 7, -43, -49, -33, 35, 6, 43, 49, 41, -16, 15, 5, 49, 31, -8, 22, 41, 21, -43, -46, -38, -44, -30, 42, -14, -6, 1, -3, 11, 27, 50, 0, -47, 35, 5, 24, -17, -6, -35, -42, 29, -35, 44, -20, -38, -46, -4, -12, -33, -31, -49, -11, -21, -41, 13, -9, 24, 2, 42, 2, -11, -35, -3, 10, 41, 30, -13, -7, -36, 44, 10, -44, -21, -15, 39, -40, 19, -22, 41, 28, 42, -45, 25, 0, 29, -13, 22, -29, 46, 39, 3, -11, -44, 45, -11, -27, -10, 0, -12, 50, 32, -8, 18, 43, 8, -26, 43, -26, 22, 40, -27, 11, -8, 8, 3, 28, -25, 3, 10, 43, 24, 42, 28, -7, -42, -9, -22, 28, 30, 29, 7, 35, 12, -2, -40, 38, 3, -21, 15, 14, 7, 6, -14, 3, 22, 18, -27, 12, 40, 43, 0, -36, -4, 22, -5, 50, -21, 28, -31, 6, -2, 5, 5, -26, -42, -29, 26, -14, -23, -37, -21, -12, 6, -46, -39, -16, -10, 12, -9, 14, 14, -8, 9, -31, 47, 47, 12, -27, 41, 24, 21, -16, -10, -35, 29, -45, -31, 5, 24, -43, 33, 45, 46, -45, 41, -43, 11, -37, -48, -49, -29, 46, 34, 19, 20, -45, -1, -7, -43, -27, -24, 2, 0, -23, 8, 18, 32, 22, -26, -7, -4, -38, 2, 2, -14, 12, 15, -11, 27, 10, 44, -45, -26, -5, -20, 29, 12, 40, 43, 17, -12, 29, -15, -44, 34, 15, 4, 21, -9, -24, -49, 19, -47, -30, -50, -13, 9, 25, 40, -37, 28, 37, 31, -34, 22, -4, 31, 5, 2, -33, 18, -3, -42, 3, -16, -5, -50, -10, 22, -19, 33, 26, -11, -40, 11, -5, -3, -8, 0, 10, -9, -25, -40, -26, -11, -26, 33, 24, 23, 1, -48, -12, 40, -16, -11, 44, 34, -29, 11, -32, -37, 50, -1, 11, 36, 39, -8, 4, -11, -39, 14, -17, 32, -28, 20, -44, 14, -33, -43, 38, -9, 42, 36, 42, -50, 28, -36, -23, -15, 45, -5, 26, -30, -2, -12, -13, -42, -31, 33, -43, -37, 11, 33, -16, 4, -6, -30, 2, 3, 35, -8, -45, 4, -7, 40, 17, -47, 12, 41, 40, 7, 3, 30, -13, 9, 1, -22, -11, 20, -43, 46, 45, -16, 31, -35, -33, 8, 38, -17, -47, 18, 27, 14, 10, 35, -5, -30, 26, 49, 42, -13, 22, 46, 35, 30, 9, 36, -15, -45, -12, -22, -24, 18, -42, -27, 12, -32, 46, -21, 7, -11, 17, -19, 14, -17, 34, -20, 8, 27, -25, -29, -17, 46, -38, 45, 4, -43, 11, -29, 5, 33, -30, 47, -2, 43, -45, -16, -24, 33, -11, -37, 23, 1, 28, -11, -8, 7, -48, -36, -6, 44, -40, -12, -32, 28, -31, 35, 20, 5, 27, -47, -42, -26, -4, 48, 50, -2, -24, -23, 37, 46, 46, 11, -35, 36, -5, 24, -5, -11, 32, -17, 36, -41, 50, -50, 15, 35, -34, -4, -27, -1, 34, -22, 27, 21, 43, 35, 36, -38, 13, -23, 43, -46, 23, -42, -37, -41, -18, 24, -11, -45, -34, -15, 19, 10, 23, -2, 18, 32, 20, -27, 0, -9, -32, 11, 24, 16, -21, -13, -45, 48, -29, -40, 21, 40, -22, -43, 36, 42, 29, -16, 21, 21, -6, -18, -46, 11, -14, -34, -29, 27, -19, -37, -31, -29, -21, 3, -18, -46, -33, 12, -5, -44, -22, 6, -4, -42, 8, 20, 20, -8, 8, -45, 2, 13, 40, -47, -50, 19, -20, 14, 18, -32, 18, 18, -2, -20, 9, 20, 28, 4, 26, 25, 32, 26, 40, -13, -18, -45, -38, 26, 26, -31, 49, -14, -6, 22, 30, 48, 8, 1, -33, -26, 28, 36, -50, -10, -33, -50, -12, 23, -20, 20, -13, -43, -17, 22, 38, -24, -10, -44, -19, 22, 30, 48, -35, -49, -8, -20, 29, -4, -18, 34, -34, 48, 3, 3, 0, 1, -44, 3, 42, -40, 11, -21, 31, 6, -5, 29, 19, 15, 4, 7, -41, -47, 23, 22, 11, -8, -9, -27, -46, 48, 17, 48, 26, 50, 45, -6, 8, 14, 12, 24, 39, 16, -2, 26, -19, -1, 36, 7, 1, -28, -21, 19, 20, -21, -14, -3, -19, 19, -16, 45, 25, 17, -19, 8, -16, -35, 28, 1, 15, -45, -37, -22, -25, -33, -47, 50, 6, 2, -26, -4, 1, 42, -17, -35, 50, 43, 36, -15, -23, 14, 21, 2, -9, 28, 47, -32, -7, -21, 23, -7, -24, 33, 38, 22, -17, 34, -27, 5, -44, 17, 0, -43, 5, 26, 7, 34, 48, 18, -43, 15, -27, -9, 3, -35, -47, 8, 43, -5, 43, 48, -38, -14, 3, -2, 24, 7, -32, -33, 9, -34, -40, -36, 21, 42, -34, 39, -46, 10, -47, 5, 37, 24, 43, -3, -3, -16, -18, 49, -30, -46, 13, 18, -30, 38, 23, 32, -19, -33, 7, 47, 28, -27, -46, 2, 45, 22, 4, -46, 18, -10, 47, -44, 39, -50, 1, 47, -25, 45, 12, -39, 19, 33, -32, 29, -47, 45, 31, -46, 3, 19, 6, 27, 1, -33, 13, -41, -28, 31, 17, 1, 45, -4, 19, -25, 19, 48, -8, 18, 12, 27, 15, 12, -38, 0, -46, -4, -15, -15, -1, 5, -32, -31, -29, -20, 11, -7, 17, 16, 50, 38, -2, 50, 8, -47, -12, -44, 20, -2, 38, -36, -44, -4, 17, 47, -6, -32, -4, 2, -24, -46, 9, 26, 11, 8, 10, 5, 27, 43, -4, -3, -41, -19, 14, -27, -22, -44, 44, -34, 43, -26, 41, -15, 10, 20, -16, 33, 27, -1, 5, 43, 14, -10, -26, -17, -43, 5, 33, -21, 17, -30, 40, -41, 36, -18, 24, 32, 24, -47, -28, 18, 2, -46, -33, -34, 7, 16, 21, 5, -11, 36, 36, -49, -30, 1, -27, 2, -13, -31, -1, -12, 9, 40, -12, 20, -18, -22, 23, -41, 25, 16, -48, 26, -20, -24, 19, -24, 48, -42, -45, -45, -25, -8, -32, -35, -28, 24, 29, -22, -13, 8, -3, -31, -30, -23, -1, -18, -11, 39, 3, -41, -17, 22, -15, 24, 23, -44, -35, 0, 39, 45, 10, -20, -19, -6, 25, -24, -29, -36, -43, 17, -43, 36, -35, -3, -17, 35, 36, 6, -46, 50, -7, 20, -14, 39, -23, 17, 45, -13, -5, 22, 49, -25, 24, 33, 2, 12, 12, -13, -36, 48, -42, 46, 24, -29, 19, 5, -14, 6, 9, 34, -39, -44, 15, -10, -27, 39, -26, 11, 33, -7, -49, -9, 48, -18, -34, 12, -29, -50, 50, 43, 19, 3, -37, 49, 46, 2, -45, 39, 13, 37, -18, 21, -7, -17, -17, -27, -49, -43, -26, 43, -19, 5, 43, -44, -3, 37, 3, 12, 22, 29, -49, -16, 47, -29, 32, 13, 8, -2, 1, -30, -39, -40, 3, 32, 19, -37, -18, 26, -25, -37, 37, -3, 14, -5, 4, 43, 23, 23, 41, 17, 27, -39, 3, 13, -4, -14, 23, -10, -24, -9, 25, 35, 17, -22, -15, 6, 27, -39, -6, -31, -6, -28, 11, 35, -17, -30, 0, -42, 23, -41, 1, -6, 1, -21, 13, 46, -49, -2, 45, -6, -34, -23, -6, -34, 8, -37, -41, 47, 27, 30, 50, 35, -33, -16, -3, 7, -33, 1, -21, -14, -11, -45, 28, -16, -25, 40, -21, 24, -27, 4, 27, 36, -42, 11, -33, 0, -32, 18, 31, -18, -13, -38, -2, 22, 39, 2, -50, -39, -27, -50, 17, -44, 41, 50, 18, -12, -19, -2, -20, 28, -48, -4, -36, 0, 31, 34, 23, -30, 39, -10, -48, -50, -30, 24, 29, 48, -30, 24, 44, -2, 14, -10, 45, 16, 45, -9, 18, 6, -8, 50, -39, 27, 13, 0, 22, 9, 20, 29, -23, 20, -37, -19, -43, -24, -1, 8, 6, -48, -24, 43, -17, -25, 50, -11, 35, -19, -10, -49, 21, -44, -32, -18, -49, 16, 41, 27, -36, -30, 27, 8, 31, -12, -31, -50, 22, -42, 0, -13, 42, -36, 33, -10, 43, -4, -25, 3, 19, -12, -34, 19, 41, -42, 40, 48, -5, -45, 17, -35, 36, 36, -22, -10, 17, 11, -11, 11, -27, -45, -11, 19, 7, -37, 27, -6, 48, -45, -28, 11, 33, -34, 33, 19, -23, -38, -22, -6, -31, 7, 30, 3, 48, 13, 1, 50, -8, 36, -33, 49, 33, 3, 9, 20, 49, -50, -14, -2, -16, 16, -16, 42, -42, -14, 9, 5, 38, -39, 20, 20, -47, 10, -6, 44, -1, -1, 23, -3, -28, 39, 36, 42, -43, 32, -22, -8, 2, -45, 42, -27, 23, -37, 1, 19, -47, 7, 28, -14, -3, -12, 41, 15, -38, 15, 9, -10, -19, 1, -46, 16, 15, 27, 1, -2, -22, -13, 19, 47, -43, 8, 4, -49, -25, 12, -34, 8, 37, 44, -35, 7, 13, -1, 34, -25, -34, -5, 17, -1, -8, -3, 17, -32, -26, 21, -33, 0, -33, 7, 13, 20, 6, -34, 8, 16, 35, -36, 44, 49, -25, -3, -37, 30, -42, -44, 40, 41, 4, -39, -34, 22, -43, 40, -9, 25, -14, -31, -50, -42, -27, -17, -15, -47, -22, 36, 48, -35, -43, 40, -12, 7, -39, -7, -47, -26, 19, 16, -12, -27, 34, -45, 46, 21, -18, -3, 16, -49, -13, -11, 5, 37, -30, 31, -16, 24, 24, 16, 9, -28, 14, 12, -28, 35, -9, 43, 13, 15, 30, -10, -31, -42, 6, 24, -34, 27, 31, -33, 12, 21, 42, 21, -25, 41, 21, 33, 21, 27, -38, -34, -25, -45, 30, -47, 38, -44, -34, 35, 41, -1, -45, -21, 23, 5, -12, -37, 3, -29, 6, -10, 39, -41, -49, 16, -3, -9, -40, 23, -39, -37, -21, 9, 26, -21, -13, 24, 14, 40, -4, -12, -2, 50, 22, 7, 39, 38, -34, -45, -36, 16, 44, -23, 22, -7, -33, -19, 32, 18, -7, 19, 12, 25, 7, -4, -34, -12, 8, -44, 12, 6, 24, -17, 2, 15, 27, 31, -3, 9, -8, 22, -47, 27, 24, 43, 40, 42, 1, -19, 43, 39, 43, 0, -41, -39, 46, 47, 31, -12, 29, 17, -41, 41, 31, 22, 35, -41, -28, 26, 37, -38, -3, 38, -7, 42, 29, 13, -11, -45, 21, 47, 31, -8, -19, -2, 23, 47, 36, -32, 33, 1, 1, -17, 8, 30, -46, 15, -10, -17, 3, -31, 3, 15, 41, -33, -7, -3, -16, 28, -12, -48, -32, 36, 32, -33, 43, 32, -46, 4, -38, -17, 37, -33, 17, 49, 21, -8, 14, -10, -13, 49, -13, -38, -29, -22, -42, 40, 17, -34, -14, 13, 16, -47, -11, -35, -40, 40, -25, 44, 47, 21, 14, -49, 40, -6, -8, -48, -17, 29, 14, 13, -44, -16, -29, -3, -19, -25, -45, -5, 4, 24, 44, 4, 34, 6, 35, 12, -50, -30, -31, 22, 40, -22, -8, 46, -6, 14, -48, 45, -31, 30, -14, -13, 23, -6, 42, -9, -5, 9, 45, -38, -20, 17, 11, -2, -33, 24, 2, -33, 0, -10, 50, 46, 50, 16, 14, 32, -45, 23, -14, -39, 30, 40, -49, 2, -26, -23, -6, -14, 50, -34, 18, 5, 7, 32, -47, 4, -2, -13, -6, -21, 45, -14, 5, -24, -19, -40, 7, 26, -16, -34, -21, -33, 50, -21, 39, -35, 24, 3, -47, -36, 25, -24, -47, -16, 34, 12, 49, 15, -12, -23, -17, -18, -1, 9, 21, 21, -9, 35, 40, -23, 24, -24, -50, 41, 40, -43, -5, -27, -11, 0, 49, -27, -29, 23, 17, -43, 7, -36, -43, 42, -9, -12, -16, -10, -3, 27, 45, 20, -7, 46, -16, -24, 14, 19, 15, 20, 21, 12, 42, 29, -22, -20, 13, 35, 2, 23, 17, -26, -38, 30, -11, 21, 36, -44, -19, -27, -50, -4, 0, -15, -24, 19, -9, 44, 25, 39, 38, 17, 19, -38, -26, 44, -29, 48, -30, -36, 16, -14, -6, -25, 30, 4, -1, -16, -10, 21, -40, 37, -43, 3, 43, -50, 47, -31, 49, -17, 6, 47, -38, 3, 2, 1, -45, -15, -26, 40, 7, 4, 44, -48, -23, 17, 30, -13, -17, 33, -38, -46, 9, 37, -34, 6, -20, 41, 14, 15, -18, 42, -47, 31, 4, -27, -19, 22, -4, -35, -30, 43, 16, 46, -20, -37, -45, 18, -22, 4, -14, 8, -15, 34, 25, 8, 36, 27, 13, -8, -9, 23, 9, 11, 13, 40, 7, -49, 27, 20, 30, 33, -43, 5, 33, -15, 18, -38, -12, 30, -45, -32, -26, -48, 2, -23, -25, -4, -43, 6, 4, 28, -50, -11, -28, 49, 3, -9, 29, -1, -47, -43, -15, -41, -21, 49, -35, -21, 13, 23, -40, -17, 29, 4, 32, -47, -2, -7, -20, -3, 48, 47, -25, 19, 46, 40, -39, -6, -43, -42, -50, -46, 20, 31, 3, -27, -25, -41, 10, -11, -7, -39, -29, -24, 16, 31, 18, -37, -26, 1, 44, 34, 8, -13, -31, 27, -31, 5, 50, -21, -10, 33, 20, 12, 18, 44, -22, 28, 38, 26, -7, 37, 28, 37, 39, 32, 6, -27, -32, -34, 18, 10, -47, -29, 23, 34, 38, -45, -21, 42, 24, -40, -3, -5, -24, -32, 35, 41, 8, 17, 50, 3, 32, -34, -1, -11, 49, 36, 41, -40, -37, -38, 37, 29, -23, 43, -7, 12, 10, 40, -34, -1, -25, -44, 48, 28, -35, 34, -34, 39, -16, 33, 33, -28, 18, -42, 36, -33, 42, 24, -3, 21, 40, 15, -28, 34, -41, -13, 8, 17, 34, 50, -8, -39, 2, -37, 1, 33, 21, 40, 50, 10, -10, -30, -3, 5, -16, -7, -12, -36, -39, 47, -43, 50, 43, 16, 43, 42, -50, 29, -9, -20, 23, -21, -8, -25, -39, 8, 18, 22, -40, -4, -28, 30, -8, 26, 30, 36, -12, 22, 31, 4, -33, 43, -9, -25, -33, 34, -10, -9, -18, -8, -37, 4, 7, -41, -23, -37, 32, -25, 23, -34, -17, -37, -25, -17, 32, -27, 44, 19, -31, -12, -6, -17, -29, 20, -18, -45, -35, 21, -28, -33, -37, -1, 10, -15, -36, -46, 2, -3, 28, -40, -49, 36, -27, 31, 17, 28, -39, 8, 16, -19, -15, -30, 19, 15, -42, 25, -7, 8, -27, 12, 27, -10, 25, 40, 23, -49, 44, -23, -35, 8, -50, 35, -50, -20, -29, 47, 25, 8, 36, -23, 25, -24, 36, -50, -49, 44, 15, -2, 38, -32, -23, 19, -12, -32, 13, 7, -34, 19, 28, 35, -10, 47, -46, -28, 18, -41, 17, -39, -41, 9, -21, -27, 18, -38, 49, -42, -33, -16, 44, 37, -47, -10, -25, -7, -9, -41, 22, -50, 3, -35, -5, -38, 13, 27, 36, 4, 12, -33, 10, 41, -31, 14, 13, 25, 40, 13, -38, 17, 38, 19, 6, -6, 35, -13, 3, -15, 16, 28, -40, 47, -24, 36, -34, 36, 47, 34, -18, -46, 30, 11, 14, 20, 16, 39, 29, 29, -7, -37, 39, 40, 6, -3, -34, -7, -47, 30, 46, -21, 34, 30, 24, 4, -21, -33, 33, 47, 41, 22, -7, 11, -20, -35, 44, 42, 26, -28, -37, -49, -39, 7, 41, 45, 5, -27, -14, -22, -9, -33, -48, 26, -38, -22, 15, 8, 41, -3, -47, 0, -46, -12, -10, -46, -43, 47, 5, -26, 40, 1, 1, -44, 10, 49, 45, 34, -4, 31, 15, 8, -46, -7, -9, 10, 12, -1, -13, 41, 44, 3, -7, -27, 12, 46, -12, -39, 12, -42, 28, 36, -29, -15, 23, -23, 5, 48, -22, -46, -47, 0, -36, 43, 9, -25, -28, -22, 35, 48, 6, 11, 8, -3, 31, -16, -5, -18, 20, 47, -41, 37, 38, -3, -7, 40, 19, 12, -2, 21, 34, -10, 32, 47, -12, -28, -38, 2, 41, 19, 6, 25, 16, -3, -31, 11, -6, 12, -43, -25, -13, 41, 48, -10, -49, -44, -26, 0, -1, 45, 13, -39, 2, 24, -41, 10, 4, 48, 17, -9, 15, -7, -23, 27, 7, 42, -49, 4, -17, 46, -31, -4, 43, -25, 33, -50, 14, 38, 46, 36, 24, -36, -37, 4, -50, -18, 19, 5, -28, 3, 39, -48, -5, -45, -26, -34, -23, -19, 42, -28, -35, 45, -25, -18, 7, -3, 32, 4, -10, 11, -34, 8, -37, 31, -30, 12, -5, 4, 11, -12, -9, -3, -23, 33, -45, 8, 39, 19, -12, 6, 3, 9, 39, -34, -11, 15, 34, 3, 20, -7, 33, 16, 6, -15, 6, -8, -7, 11, 32, 10, 43, -40, 26, -18, 15, -28, -2, -31, 43, -36, 15, -21, 38, -47, 13, 14, -43, 1, -37, 7, -40, 8, -27, 37, -19, 38, -5, -23, -35, -9, -35, 49, -39, 25, 11, -17, -13, 33, -4, 28, -29, 29, 37, -48, -50, 2, 13, -7, -4, -13, 12, 30, -10, -30, -6, -38, 15, 15, -8, 11, 38, 41, -3, -25, 48, 41, 10, 11, 46, 31, -37, 3, -10, 9, -42, -7, 5, 43, -48, 47, 46, 40, 8, 22, -38, -21, 2, 29, 0, -9, -25, 8, 18, 40, 28, 41, -48, -10, -50, 14, 19, 24, -1, 29, 46, 37, 8, 45, 23, 12, -26, -41, 26, -50, 48, -37, -30, 7, -13, -50, 33, -46, -7, 45, 14, 6, -6, 9, 15, 44, -4, -25, -42, 0, 43, -43, -46, -12, 17, -11, -15, -30, 46, -25, 24, 34, 35, 5, 6, 8, 50, -44, -9, -38, 33, 28, -17, 49, 2, -5, 6, 10, 38, 5, -22, 41, -37, 17, 20, -38, -34, -22, 30, 49, 32, 39, 22, -49, 11, -31, 36, 31, 5, 39, 1, -26, 11, -34, -12, -41, 8, -26, -23, 39, 25, 10, 7, -7, 32, -28, 27, -34, 28, 34, -13, -21, -32, -19, 42, 35, -31, 13, -15, 14, 32, -8, -25, -44, -17, -15, -45, -14, 11, 35, 22, 9, 42, 13, -1, 1, -34, 9, 26, 30, 3, -41, -26, -33, 13, 28, 8, -24, 7, 10, 32, 28, 20, -8, 29, 37, 36, -40, 37, -46, 7, -12, -3, 43, 29, -31, 42, 30, -32, 9, -25, 28, -26, -36, 33, 43, -30, -4, -16, -7, -45, 50, 24, -28, -12, 22, -33, 49, -11, -15, -23, 13, 32, 43, 7, -13, 28, -7, 25, -49, 22, -16, -50, -5, 9, 12, 44, 41, -6, 6, -14, -44, -35, -1, -37, 46, -45, 10, -30, -41, -19, -45, -49, -12, -2, -24, 5, -37, -28, 34, 0, 43, -26, 2, 37, -40, -16, 4, 7, 17, -14, 49, 26, -42, -23, 4, -5, 29, 19, -24, -41, -28, -30, 39, -6, -48, 8, -8, 48, -44, -24, 11, -9, 46, -47, 39, 11, -43, 33, -34, -46, 12, -42, -43, -44, -14, 49, 4, 16, -43, 18, -46, -34, 7, 12, -24, 25, 41, 17, -23, 38, 7, -1, 49, 16, -20, 50, -39, 4, 50, 50, -47, 43, -9, 40, 3, -29, -50, -3, -8, -31, -33, 19, -2, 25, -34, 2, -29, 31, -41, -27, 33, -39, -47, -9, -46, -25, 49, 8, 11, 29, -46, -25, 32, -45, -27, 44, 44, 2, -44, -41, -12, 35, 27, -23, -9, 11, 1, -29, 6, 45, -40, -37, -20, -47, -29, 42, 48, 13, 26, 33, 32, 28, 39, 33, 10, 49, -45, 28, 17, -45, 15, -15, -36, 25, -11, -10, -44, -29, 21, -40, -49, -21, 17, 2, 38, -30, -26, 22, 21, -46, 41, 15, 34, -2, -43, 47, 36, 28, -24, -49, -23, -40, -5, -30, -9, -19, -19, 20, -29, 27, 26, -30, -29, -17, -41, 14, 14, 37, 16, 44, -8, -10, -38, -47, -28, 19, -17, -10, -33, 49, 39, 46, -18, -26, 1, -34, 0, -48, 4, 35, 5, -16, 17, 8, 41, 8, -38, 11, 43, -4, 25, -48, -30, 14, -33, -38, 20, 26, 30, 45, 42, -6, 11, -21, 24, -37, 2, -41, 21, -20, -45, 32, -32, -39, 13, 31, 4, 16, -42, -45, -50, -9, 42, 4, -2, 48, 48, -21, -16, 12, -29, -8, -23, -33, -19, 18, 3, -17, -20, 46, -47, -37, -36, 9, -31, -31, -2, 48, 17, -33, -27, -24, -18, 13, -26, 18, -33, -6, -31, -16, -45, 40, 41, 24, -42, 1, -23, -32, 34, 12, 44, -44, -14, 38, 41, -15, -34, 39, 41, -14, 30, 9, -2, 30, 46, 5, -17, 36, -21, -24, 0, -42, -31, 36, -4, -32, 50, 17, 26, -39, 22, 28, 34, 28, -46, 18, -26, 37, 50, -20, -5, -17, -10, 27, 40, 17, 36, -13, -5, 18, -24, -8, 27, 20, -6, -33, -19, -49, -10, -31, 42, 7, 39, -13, -50, 18, 3, -37, -26, -42, 43, 32, 10, 1, -43, -35, -43, -28, 22, 45, 50, -17, -33, -7, -36, -36, 42, -28, 36, 14, 35, 20, -19, 41, -19, -18, -8, -38, 41, -42, 11, 6, -3, -8, 16, 30, 47, -19, 22, 9, -50, 6, 33, 18, 34, 18, 17, 10, -43, 38, -44, -14, -9, -19, -34, -23, 19, -3, 3, -9, -15, 15, -20, 14, -48, -38, -20, -22, 6, -18, 2, -41, 12, 22, 14, 50, 45, 46, -49, -49, 18, 23, -14, -49, 10, -11, 12, -26, -13, -14, 31, -24, 33, -1, -17, -7, 21, -47, 43, 1, 4, 49, 22, -39, -37, -16, -45, -4, -28, 17, 14, 8, -42, 7, -3, 12, -42, -7, -5, -36, 37, 2, -3, 21, 41, -9, -34, -16, -20, -47, -3, -37, -26, -5, -3, -11, -1, -44, 44, 9, -16, 12, -31, -35, -29, -15, -32, -49, 17, 47, -44, -4, -2, 27, -8, -19, -34, 50, -37, 30, -19, 9, 9, 1, 15, -47, 43, 43, 12, -18, -50, 46, 49, 13, 44, -14, 27, 19, -44, -27, 17, 4, 38, -48, 41, -28, -15, 6, -3, -38, 10, 35, 38, -27, -8, 50, -18, 27, -27, -29, 1, 50, 36, -45, -32, 25, 39, -22, 13, -37, 30, -21, 20, -30, 14, -47, -5, -43, -33, 9, -6, 21, 44, -20, -23, 13, -14, 16, 28, 17, -16, 47, -15, 6, 19, -47, -2, 43, -12, -33, 9, 35, -41, 42, -28, 17, 8, 32, 39, -44, -38, -48, -11, -40, 29, 33, 0, 36, -28, -19, -10, -9, -13, 16, 21, 27, 21, 24, -9, -8, -18, 28, -14, 27, 39, 6, 13, 13, 9, 1, 21, 17, 49, 31, -24, 8, -32, -48, 22, -12, 15, 22, 5, -45, -23, -3, 47, 42, -3, 16, 3, -35, -16, 24, 36, -21, -3, 18, -43, 0, -41, -23, -15, 9, -41, -37, 12, 50, -4, 18, 5, -45, 43, -32, 1, 11, -2, 27, -40, -5, 18, -6, 44, 7, -19, 37, -41, -38, -38, -15, 35, 22, -32, -44, -36, 30, -5, 27, -3, 15, 27, -47, -48, -48, 24, 18, 42, -23, -28, -21, 11, 36, 0, -10, 35, 13, -8, 25, 40, 7, 8, -11, -5, 11, -2, 28, -28, -7, -7, -32, -7, -40, 9, -13, -48, -35, 45, -42, -10, -13, 18, 14, -16, -16, 25, 49, 34, -3, -43, -24, -42, 41, -21, -37, -28, -22, -25, 35, -36, 22, 39, 30, 22, 16, -35, -38, 39, 30, 45, -27, 11, 6, -15, 9, 35, 22, -29, 33, -48, -15, 46, 31, -15, -41, 49, -30, 38, -2, -42, 40, 28, 1, 45, -3, 9, -1, -12, -35, -23, -45, 10, -45, 15, -11, 20, 40, 11, -23, 29, -4, -42, 1, -36, -17, -31, 27, 9, 7, 24, 43, 16, -49, -1, -37, 5, 42, 18, -7, -5, -45, -43, -12, 42, -7, -24, -35, 40, -12, -50, 0, 12, -18, -1, 3, -24, 30, 28, 35, -32, -23, -28, 13, 49, -12, -2, 8, -31, 10, -42, -28, -44, -20, 9, 10, 24, 30, 49, -25, 49, 31, 3, -20, 48, -10, -23, 39, -45, -17, 41, -42, 42, 47, -39, -35, 20, -20, -18, -44, -48, -31, -46, 16, -13, 28, 48, 5, -28, 46, -49, 49, -30, 27, -37, 11, -40, -47, -4, 43, 49, -31, 1, -35, 47, -6, -43, 11, 33, -30, 13, -21, -15, -46, 34, -13, 36, -32, 23, -24, 48, -38, -42, -34, 44, -7, -6, 37, -9, 0, 32, 7, 7, -21, -46, -43, -14, -4, 49, 38, -6, -46, 46, 12, 35, -4, -26, -1, 42, -6, -21, -3, 0, 43, 4, 4, -5, -20, -17, 41, 23, 17, -18, 5, 7, 6, -34, -40, 20, 30, 41, -34, -41, -25, -45, 30, -35, 39, -47, 11, 33, 13, 5, 24, -28, -18, -20, -44, 35, -46, -14, -50, 19, -6, -4, 17, 43, -21, 30, 9, -27, -20, -23, -6, -47, 10, -12, 32, -27, 20, -5, 2, -3, -42, -29, -49, 40, -35, -46, -39, 1, -25, -36, 16, 22, 8, 41, -12, 12, 49, -26, -10, -23, -30, 42, 38, 43, 10, 6, -40, -32, 24, 38, -50, -19, 34, 26, -17, -34, 4, -32, 23, -9, 8, 22, 24, -13, -20, 15, 37, 18, -1, -21, -16, 8, -34, 44, 15, 29, -30, 43, 1, 14, -37, -35, 4, -42, -43, 22, -17, -18, 35, 43, -44, 31, -30, -46, 20, -39, 8, 30, 7, 37, -14, 32, -6, 29, -26, -24, 0, -9, 20, -9, 9, 21, 28, 7, 29, 21, 49, 45, 30, 49, -29, 45, 7, -40, -45, -29, 27, 41, -39, -24, -50, 13, 23, 46, 29, -12, 9, 19, 3, -26, -31, -15, -28, 29, -50, 43, -24, 1, -49, -30, -42, 37, -3, -12, -9, 20, 43, -6, -49, 25, 26, 16, -8, -33, -12, -45, -9, 1, -24, 28, -36, -32, 11, 13, 0, -4, 6, -31, -31, 31, 13, 47, 50, 48, -13, -13, 14, 25, -46, 13, -24, -31, 9, -11, 32, 28, -45, 22, -15, 36, 23, 14, -40, -2, 33, -23, -29, 33, -4, 29, 15, -26, 40, 16, 36, -19, -34, -11, 33, -21, 8, -23, -4, -28, 32, 6, 38, 37, -50, 41, -22, -1, 13, 48, 30, 24, -14, 10, -44, 39, 36, 13, -33, -22, 47, 9, 3, 21, -30, -30, 7, -2, -15, -34, 29, 2, -36, 28, -11, 30, 0, 14, -38, -13, 23, 46, -25, 25, 32, -36, -46, -49, 27, 42, 14, 26, 9, 45, 47, 5, 27, -13, 6, 0, -10, 28, 19, 42, 50, 32, 1, -50, 34, -33, -24, 41, 21, 44, 25, -9, -45, 39, 29, 43, 32, 31, -27, -6, 33, 20, -44, -35, 7, 6, -9, -37, 5, -39, 42, -36, -43, 7, 2, -42, -5, 41, 40, -44, -7, -37, 24, 45, 41, -45, -16, 19, 10, -27, 22, -49, 27, 0, -20, 43, -24, 49, -20, 19, -8, 31, 1, -37, 8, -31, 1, 24, 50, -11, 17, -7, -45, 36, 6, 7, 21, -21, 49, 1, -40, -4, -46, -48, -36, -49, -49, 21, 3, -5, 43, -10, 18, -21, -7, -41, 46, 37, 32, -21, 38, 24, -2, -16, 14, -34, -20, 19, 26, 1, -25, 49, -46, -37, 0, -36, -39, -5, 13, 21, 8, 44, -25, -22, -47, -1, 41, -26, -11, -19, 49, 24, -14, -41, -13, 10, 49, -24, 30, -44, 22, 48, -42, 8, -15, -21, 44, -32, -10, 4, 36, 33, -45, 37, -29, 19, -27, 11, -9, -29, 31, -35, 49, -38, -14, 1, -27, 32, 33, 40, -34, -35, -50, 34, 40, -50, -21, 33, -27, -5, -49, -36, -22, 48, 11, -38, 32, 14, -6, -4, -35, -48, 19, 44, -46, -25, 41, -36, 22, 4, -29, -14, 34, -22, -25, 19, -40, 49, -31, 33, 40, 19, -18, -21, -1, -17, -46, 29, -39, 25, 24, 1, 0, -30, 20, 7, 47, 13, 42, -45, 49, 47, -2, 21, -14, -41, 29, 15, 5, 32, 20, 15, -6, 36, 44, 17, 13, -35, -41, -30, 41, -39, -38, 30, 31, -41, 41, -38, -17, 8, -2, -45, -39, -22, 26, -25, 17, 28, -35, 2, -32, -4, 39, -19, 19, 19, 10, -46, 8, -49, -49, 50, -48, 19, 44, -8, -46, -1, -41, -24, -27, -29, 38, -48, -35, -21, -8, -47, -11, -35, 21, 37, -35, 40, 15, 4, -31, 0, 33, 33, 32, 6, 0, -33, 26, 30, 8, 46, -23, 18, -23, 38, 33, 34, -38, -45, -22, -42, -22, -13, 14, 5, -21, 45, 8, 36, 7, -41, -30, 5, -25, -36, 30, -16, 38, -36, 46, 24, 37, -45, -23, 12, -22, -3, 12, 7, -30, 25, -29, -24, 34, 28, 6, 31, -41, -29, -7, 33, 32, -23, 50, -1, 0, -50, -17, -16, 39, 10, -21, 25, 27, 17, 25, 37, -11, 44, 14, -14, 13, -50, -36, -38, -22, 4, -6, -47, 13, -36, -3, 25, 5, 38, 40, 19, 36, -36, -12, 18, 36, 28, 38, 9, 43, -7, -8, -47, 26, -1, -12, 3, -28, 9, 29, -16, 3, 7, 11, 29, -3, -44, -6, -38, 2, 42, -12, 33, 42, -33, -29, -15, 2, 49, 21, -48, 11, -22, 22, -43, 43, 25, -5, 41, 5, -2, -8, -41, -38, 6, -49, 14, 35, 46, 29, -9, 7, 42, -41, 12, 20, 10, -50, -25, -46, -16, -38, -24, -39, 43, -1, 45, 8, -20, 18, -14, -49, 20, 14, -48, -31, -49, -9, -8, -30, -6, 45, -31, -8, -1, 44, -8, 46, -27, 31, 33, 9, -19, -46, -49, -25, -26, -1, 35, -12, 35, 24, -40, 12, 17, 46, -33, 44, -23, -9, 9, -29, -11, 11, -48, 20, 12, -31, 20, 20, 42, -25, -10, -48, -8, -34, 33, 47, 2, 1, -18, 29, 9, 36, 17, 5, 13, 46, -43, 18, -18, -26, 20, -44, 8, -18, -10, -18, -22, -12, 6, 45, 50, 42, 13, 35, 15, -42, -22, 46, 23, -23, 2, -5, -12, 25, 7, 35, 3, -45, -6, -11, -28, 47, -9, -13, -35, 23, -4, -30, 23, 24, -30, -26, 10, 47, 3, 44, 40, 38, 9, -9, 10, -19, 2, -7, -40, -4, 39, 9, -15, 50, 9, -18, 46, -9, 49, -38, -37, 7, 50, -11, 14, -46, -21, 31, -6, 50, 7, -12, -39, -17, -37, -13, -35, 10, 8, 24, 46, 28, 23, 16, -40, -40, -35, -13, -21, -10, -50, -13, 47, 9, -32, 47, 8, 49, 17, -41, -34, 29, 34, 41, 21, -22, -45, 43, 15, 12, -20, -26, 36, -30, -35, -47, -5, -43, -45, 2, 13, 40, 0, 49, 49, 12, 37, -45, 11, -18, -49, -10, -35, 8, -42, 18, -41, 43, -44, 42, 15, -31, 12, -47, -23, 21, -16, -49, -10, -23, 24, 49, 22, -50, -24, 16, -12, 22, -11, -23, 34, 41, -27, 31, 0, 5, 22, -25, 37, 1, -45, 8, -39, 12, -15, -42, 23, 16, -22, 20, 39, -43, -8, 26, -16, 32, -29, 29, 28, 15, -30, 43, 20, 44, -10, -10, -2, 48, -47, 47, 14, -41, 43, 45, 16, -41, 22, -34, 16, 40, 2, -16, -47, 17, 45, -40, -7, 9, 19, 11, 48, -19, -5, -28, -14, 39, 47, 24, 7, 34, -8, 37, -36, 16, -49, 20, -46, 2, -6, 42, -10, 12, 45, 43, 21, -19, -49, -41, -8, -8, 50, 16, -28, 47, 31, 46, 46, 9, 30, -45, -38, -30, 44, 7, 34, 46, -23, 19, -43, 26, 47, 7, -11, 35, -50, 26, 14, -41, 9, 18, -31, 11, -38, 7, -14, -41, -48, -17, -17, -21, -14, 17, -17, -19, 34, 7, -27, -42, -10, -27, -26, -15, -43, 42, 38, 8, -16, -13, 41, 32, -19, 50, 0, -23, 5, 48, -43, -10, -28, 3, -28, -19, -41, 30, -16, 48, 12, 16, -15, 42, -2, -5, -24, -20, -17, 25, 50, 8, 3, 38, 15, -21, 22, -28, -42, 33, 4, -50, 5, -12, 36, -33, -9, 45, 22, 24, 14, 24, -18, -21, -46, -1, 14, -41, 9, 26, -24, 21, -23, -6, 1, 15, 11, 25, 40, 26, 9, 35, -11, -36, 44, -44, -12, 0, 48, -44, -39, -37, -17, -12, 22, 13, 46, -39, -17, -24, -29, -33, -5, -7, -33, -14, -44, 17, 29, 35, 9, -3, 0, 49, 33, 44, 1, 46, 26, 1, 33, 3, -10, -9, -29, -12, -28, -3, -18, -10, -21, 27, -4, 49, 6, 21, 6, 11, 35, 6, 17, 48, 21, 47, 35, -26, 38, -11, -34, 29, -3, -12, -36, -34, -16, -18, -33, -21, 36, -14, -44, 23, 29, -23, 36, 47, -33, -4, -28, -31, -20, -37, -28, -49, -22, -1, 22, 8, -18, -3, -7, -39, 32, -9, 33, 50, 44, -16, -10, 34, 4, -38, -12, 40, 38, 15, -16, 21, -18, 38, 34, -15, -38, 5, -5, 22, 48, -5, 49, -7, -5, 23, 18, -20, -27, -19, 16, -35, 6, 33, -27, -17, 1, -3, 36, 2, 4, -13, -49, 18, 31, 2, -1, -22, 23, 4, 10, -1, -35, 36, 43, 19, -7, 49, 33, -35, -23, 6, -25, 35, -40, -50, 18, -8, -5, -15, 15, 6, -45, 11, -24, -25, 48, -38, 25, -33, -13, -45, 41, -23, 38, -46, 8, 28, 22, -6, 2, -49, -2, 22, 39, 36, 12, 41, 19, 7, -47, -21, 6, -4, -33, 43, 40, 44, -7, 1, -2, -21, 1, -14, 12, -39, -34, -17, -23, -47, 47, -5, -37, -38, 7, -2, -1, 16, -30, 29, 0, -13, -25, -45, -33, -45, -10, 6, -1, -26, -3, -27, -21, 36, -6, -8, 21, 5, 22, 19, -18, 46, -6, -44, -33, 19, -6, -14, -30, 39, 28, -7, -21, -40, -43, -46, -43, -46, -41, -36, 5, 4, -48, -10, -41, -44, 12, 12, 37, -25, -17, 21, -12, 9, 18, 49, -25, 11, -41, 46, 49, 3, -20, -13, -26, 26, 14, 49, 49, -1, -27, -24, 31, -1, -1, -36, -34, -22, -46, -40, 29, 1, -17, 30, -18, -2, -20, -33, 38, -46, -21, -6, 36, -13, 31, 45, 43, -22, -15, -42, -28, -48, 35, 5, -11, 5, 7, -20, 35, -40, -9, -48, 6, -37, -5, -32, 9, -20, -15, -19, 12, -25, 14, -49, 19, -6, 27, 41, 46, -26, -11, -33, 47, -39, 40, -27, 46, 28, -8, -19, 30, 48, -4, -6, -16, 26, -42, -41, 14, 8, 47, 6, 50, 38, 35, -41, 39, -32, -1, 17, -46, -22, -46, 9, 14, -23, 32, 49, -50, -22, 0, -15, -19, 13, -37, -19, -42, 32, -40, -3, 0, -47, -10, -26, -34, -4, -43, 7, -50, -49, -41, 40, -24, -38, 12, -40, -37, 45, 29, 42, 47, -25, 18, 32, -12, 41, -23, -34, -14, 32, -24, 25, 16, 17, -4, 24, -17, -33, -16, -33, 19, -17, -18, 21, 33, 33, -8, 31, -24, -3, 18, 20, -29, -17, -8, 26, 45, 37, -35, -37, -12, 20, -39, 33, 46, 4, -45, -11, 40, -38, 18, -27, 23, 8, -5, 45, 22, 48, -7, 25, -40, 10, -15, 21, -41, 27, 43, -50, 12, -39, -46, 27, -15, -34, 7, -29, -20, -25, -38, 12, 16, 12, -40, 18, 13, 17, -19, 23, -41, 3, 4, 31, 11, 4, 36, 31, -16, 16, 14, -34, -9, 8, 19, -40, 27, -23, -12, 3, 49, -40, 7, -11, -47, 13, -3, 19, 32, -20, -49, -8, 38, -10, 9, 24, -5, -11, 8, -6, -9, -30, -48, 15, -40, -27, -1, 37, -30, -26, -47, -8, -4, -28, 9, 37, -30, 15, 36, 0, -36, 7, -25, 39, 41, 8, 39, -6, 15, -16, 45, 43, 13, 33, 26, -24, 36, 29, -20, -39, 46, -6, -19, 3, 15, 36, -19, -36, 4, -10, -11, 21, -2, 35, -13, 5, -17, -50, -41, -11, -35, 37, -5, -27, -37, 39, -12, -33, 33, -10, 5, -15, -27, 39, -22, -29, -40, -10, -2, -40, 1, 16, 34, 24, -43, -20, 23, -45, 30, 20, 45, -38, -45, 16, -24, -6, -25, -47, -14, -30, -23, 31, -19, 2, -18, -25, -34, 5, 42, 33, -21, -46, -45, 11, -41, 19, -41, 34, -7, 5, -47, -38, 23, 29, -32, 19, 39, 11, -42, -5, 5, 23, -11, 16, 32, 11, 48, -5, -45, -22, -32, -36, 6, -13, -30, 0, -12, 36, -31, -49, -19, 41, -47, -44, -48, -26, -42, 36, 36, -25, 13, -33, 37, 40, -49, -50, -3, 29, 12, 37, -15, 12, 24, -25, -45, -25, 42, -8, -50, -42, -24, 20, -48, 10, 22, -49, 23, 30, -20, 14, -33, -45, -9, 17, -47, 48, -47, 14, -10, -8, 44, 4, -32, -30, 7, -21, -44, 18, 13, -49, 16, 28, 50, 23, -42, -28, -37, 3, -6, 46, -35, 33, 21, 47, 44, 6, -43, -26, -10, 11, 26, -33, -1, -10, -17, 49, 30, -39, 29, 26, 24, 27, -9, 4, 41, 8, 0, 37, 2, 30, -42, 43, 50, -48, -43, 31, 8, -21, 16, 4, -17, -8, -23, -14, 38, -21, 20, 11, -22, -49, 39, 6, 6, -9, -2, 6, 20, -33, 19, -24, 3, -27, 46, 44, -17, -29, 37, 12, -15, 41, 33, 10, 31, -9, 45, -18, 23, -42, -26, -38, -4, -6, -46, -20, -20, 47, 39, 20, -10, -5, 1, 33, 35, -46, -39, -30, -42, 42, 40, -34, -27, -24, -43, -7, 11, -22, 32, 23, -27, -17, 9, -20, -47, 44, -42, 39, 26, 39, 3, -50, 10, 22, -20, 37, -6, 9, 35, 22, 36, 33, -9, 34, -24, 7, 18, 30, 47, 22, -17, -41, 15, -26, -48, -17, 20, -23, -42, -40, 42, 29, -12, 42, -38, 48, -40, -16, -43, -44, 18, 19, 6, -16, 43, -40, -13, 40, 34, 27, -2, -16, -22, 37, 49, -10, 45, -45, -41, 33, 33, 39, 34, -28, -5, -39, 4, -38, 23, -44, 50, -39, 10, -26, -49, -25, 0, 18, 11, 21, 22, -12, 33, -40, 13, 35, 29, -9, -41, 38, -32, -47, 32, -48, 30, -37, -41, -45, -20, -20, -3, -42, 25, -25, -49, -47, 45, 41, -45, -21, 4, -23, 10, 26, 4, -15, 23, 23, -46, -22, 49, -39, -29, 8, -12, -49, -37, -41, -3, 13, -48, 21, 9, 30, 17, -30, 43, -32, 28, -31, 7, -9, 43, -41, -28, 37, -39, -42, 28, -22, 31, -31, 14, -48, -43, -12, 13, -20, 21, 28, -29, 45, -46, 7, 22, 28, 12, 10, 1, 50, -18, -29, 0, -40, 7, -1, 19, -34, -5, -7, 6, -46, -12, 7, -42, 42, -28, -4, -15, -20, 33, -28, 5, 20, -5, 7, -15, 17, 37, 9, -37, -26, 20, 28, -7, -5, -38, 11, -32, -39, 39, -3, -18, 28, -14, -45, 38, 30, -8, 49, -1, -5, 22, -23, 48, 16, -40, -31, 36, -21, 50, -15, 25, 49, 48, 47, 17, 37, -15, 7, -23, -12, 15, -8, -46, 41, -38, 49, -42, 43, 6, -24, 10, 26, -1, 41, 31, -17, 34, 14, -6, 36, -17, 49, 22, -43, 43, -3, -15, 49, 31, 15, -40, 1, -15, 44, -20, -27, -30, 45, -21, 21, 46, 13, -12, -50, 46, -9, 26, 35, -46, -39, -22, -48, 10, 0, -15, 24, 39, -49, -22, -10, -22, 49, 13, 7, 32, -41, -40, -44, 26, 10, 15, 43, 35, 2, 14, -24, -44, 14, 7, -26, -3, -47, 43, -43, 34, 17, 9, -47, -43, 39, 42, -35, -32, -50, 50, -17, 42, 40, -6, 12, 43, -45, -15, 15, 27, -43, 16, 48, -24, -17, -23, -20, -34, 32, 4, 24, -42, 43, 6, -6, -45, -37, -20, 3, -40, 18, 44, -49, -34, -15, -48, 12, -8, 42, -18, 27, -22, -28, 8, 30, -2, 4, 24, -23, 20, 21, 42, -26, -44, 35, 22, 24, -17, 40, -29, 16, -1, -3, 21, 19, 6, -26, 15, -35, 7, -10, 0, -30, 28, 5, 47, -4, -8, 33, -20, -36, -3, 11, 41, 19, -48, -13, 36, 7, 16, -6, -7, -43, 15, 20, 10, -34, 20, 46, -15, 17, 29, -30, 31, -5, -5, 41, -35, -29, -45, 43, 5, -6, 7, -23, -34, -15, -39, -1, 8, -39, 49, 11, -11, 42, -49, 42, 43, 49, -26, 34, 35, 23, -20, -4, 9, 22, 47, -10, -1, -28, -39, 20, 45, 32, -29, 5, -35, 7, 21, 43, 0, -45, -49, 11, 47, 42, -9, -8, 1, 7, -31, 5, 16, 8, -3, -16, -43, 25, -19, 42, -6, 34, 16, -24, -48, 6, 14, -31, 20, -10, -50, 23, 25, -47, 20, -41, 35, 38, -22, -36, -32, 7, 2, -5, -33, -48, 19, -29, 4, 13, -10, 44, 34, -43, 14, -48, -22, 19, 46, -33, 7, -50, -29, 44, -28, -43, -22, -7, 11, -32, 8, 29, -32, 50, -29, 32, 17, -46, -46, -26, -27, -50, -23, -4, 34, 9, -32, 36, -37, 19, 45, 45, -43, -14, 35, 21, -41, 16, -38, -12, 13, -21, -47, -6, -45, -35, -29, 40, -30, 42, 14, -21, -27, 13, -38, 43, -25, 47, -31, 10, -45, -8, -2, -42, 50, -14, -35, -47, -19, 33, 42, 44, -34, -10, 38, -6, -35, -31, -9, -41, 1, 9, -3, -28, -18, 26, -26, -1, 50, 49, 37, 19, 28, 4, 47, 17, 27, -47, -23, -22, 31, 33, -3, 45, 21, -38, -8, -42, -11, -5, 7, 46, 5, -39, 50, -26, 38, -35, 0, 29, 48, 36, 21, 2, 1, 16, -27, 35, -37, -29, 47, 49, -20, 34, 7, 18, -32, 2, 34, -49, 2, 16, -4, 2, 6, 43, 47, -26, -16, -22, 25, 36, 41, -34, 29, -2, 5, 22, -48, -29, 44, -37, -48, -13, 36, -30, 0, -27, 45, -6, 18, 46, -7, -4, 6, -32, -17, -48, -12, 41, 24, 9, -41, -11, -49, -6, -24, 2, -42, -50, -18, -13, 6, -18, -3, -48, -19, 26, -30, 17, -34, -9, 17, 33, -39, 39, -6, -15, 29, 0, -44, -18, -3, 15, -18, 27, 33, 50, -24, -4, 34, 15, -8, 29, -32, 17, -41, -29, 25, 15, -49, 47, -33, 29, -32, 38, -21, -45, -24, -36, -20, -7, 35, 25, -41, -30, -4, 4, 44, -15, 23, 7, -32, 36, 13, -41, -2, 3, 10, 8, 40, -49, 24, -43, -32, 29, 17, -37, -29, -34, 12, -25, 48, -15, -6, -21, -30, -31, -9, 39, 5, -39, -43, 48, 42, 12, 5, -44, 11, 10, -41, -1, -31, -23, -37, 25, -43, -44, -46, -50, 22, 31, -41, 7, 14, 9, -31, 7, -8, -22, -49, -25, 24, 38, 47, 8, -50, -20, -13, -29, 15, -4, -50, 37, -1, -15, -6, -15, -17, -42, 25, 33, -47, 28, 12, -47, -46, -41, -7, -11, -15, -16, 8, 14, 31, -20, -5, -2, -45, 19, -32, 45, -9, -21, -25, -48, -18, -1, -20, 33, 17, 45, 31, -41, -29, 12, 3, 0, 30, -47, -14, 20, 12, 0, -43, -50, -43, 32, 30, 4, -42, 0, -35, 2, 8, -6, -14, 40, 15, 13, -15, 25, -1, 48, 44, 2, 6, -32, -25, 49, 17, -8, 44, 7, 26, 8, -5, 17, -11, -38, -42, 15, 48, 2, 25, 30, -47, -37, 34, -43, 46, 11, -6, 41, 16, 11, 27, 32, 19, -15, 33, -50, 9, 23, -38, -39, 24, 49, -34, -4, 2, 42, 16, 42, -41, -5, 32, -47, 6, -13, -39, -20, -49, -50, 30, -26, -46, -3, -37, 1, 23, -30, -26, 48, 16, 31, -1, 49, -18, -34, 19, -17, -25, -9, -20, 0, 41, -15, -38, 34, 39, 44, 29, 44, -38, 43, -19, -46, -39, 8, -10, -14, 17, -3, -8, 42, -10, 5, 18, -40, 43, -42, -23, -29, 24, 34, -45, -25, -35, -37, -16, -9, 2, 49, -29, 2, 15, -38, -40, -39, 46, 35, 2, -42, 20, -34, 10, -41, -13, -12, 38, 40, 43, -21, -17, -18, -19, -39, 36, 42, 14, 33, -41, -32, -28, 34, 6, 48, 8, 45, 3, 23, -49, 49, -3, -45, -8, -34, 28, -15, -27, 10, -22, 27, 7, 15, 35, 2, 19, -42, 25, -9, -12, 18, -11, 8, -7, 14, 23, -40, 40, 36, 33, -46, 26, 23, -2, 0, -15, -35, -44, 45, 38, -7, -25, -15, 2, 41, -7, -39, 39, 17, -28, 37, 44, -21, 12, -48, 29, -17, 41, -2, -7, -10, -3, 20, -43, -44, -14, 4, 20, -1, 31, -30, -17, -2, -24, -43, -17, -33, 0, -39, 35, 0, 12, -11, -29, -43, -23, -1, -4, 5, -19, -40, -30, -25, -37, 28, -37, 25, 49, -48, 6, -44, -12, 6, 14, -26, -20, 35, -41, 31, 26, 21, -42, 28, -43, 46, 48, -32, -21, -42, 32, -4, -5, 39, -50, -48, -17, -26, -21, -50, -33, -18, -42, -44, -21, 26, 30, -38, -38, -9, 50, 23, 27, 12, 18, -15, -16, -5, -6, 5, 36, -46, -7, -23, 36, -9, 47, -20, -44, -44, -47, -19, -23, 5, -47, -43, -37, -21, -48, -49, -41, 19, 20, -35, 19, 29, 40, 25, 35, 28, -29, -16, 28, 36, -2, -49, 15, -32, 18, -47, 41, 31, -10, 5, 4, -20, -29, 24, -3, 29, -47, -30, -10, -6, 38, 33, -43, -42, -33, -20, -16, -21, -33, 32, -10, -27, 35, -3, -37, -32, 9, 42, -29, -21, -36, -30, -25, 49, -39, -44, 24, 33, -16, 17, -49, -31, -4, 33, -39, 2, -34, -33, -27, 21, -14, -21, 33, 1, -28, -14, 23, 46, -27, 49, 29, -1, 41, 25, -31, -4, -33, 50, -25, 20, -8, -4, 34, -8, -19, -44, 36, 33, 33, -19, 39, 49, 37, 14, 7, 2, 41, 39, -17, 39, 49, 18, 5, 15, -19, 47, -1, 43, -27, 41, -5, -48, -41, -45, 47, 44, 1, -1, 7, 1, -38, 8, -12, 2, 7, -31, 12, 45, -41, -25, -32, 42, 10, 26, -17, 33, -7, -33, 47, 21, -35, 36, 45, 26, -25, 14, 15, 26, -24, -47, 0, 33, -48, 36, 15, -35, 23, -23, -7, -33, -49, 27, -7, -31, 5, -28, 9, 20, -6, -4, 27, -14, -43, -46, -28, -41, -24, 48, -50, 20, -43, -40, 47, -23, -17, -8, 33, -23, -2, 10, -14, -48, -42, 35, 38, -49, -28, 0, -34, -26, 25, -24, -31, 22, 36, -15, -23, -22, -9, 7, -19, -39, -21, 9, -40, 50, 33, -40, 29, 48, -1, -50, 38, -24, -19, -45, -10, -15, -12, 36, 42, -21, 35, 6, -40, 39, 36, -48, -3, -45, -44, -7, 10, 3, 0, 35, -3, 10, 46, -11, -48, -21, -27, 16, -49, -7, -11, -32, 12, -27, -1, -31, 6, -1, 44, 7, -20, -14, 42, -47, 7, -41, 12, -15, 4, 48, 6, 34, -8, 14, -39, 11, -27, -49, -4, 5, 33, -35, -17, 26, -33, -22, 3, 0, -37, 43, 7, -16, -42, -14, -39, 34, 31, -40, -24, 37, -8, -1, 47, -31, -38, -4, -43, 50, 18, 20, 13, -7, -39, -47, -11, -32, 3, -50, -38, -1, 2, -9, -26, -7, 47, 48, 10, 30, 39, -30, 0, 25, 29, 1, 12, 33, 3, -41, 36, 43, 8, -43, 0, -46, 25, -9, 27, -39, -27, -6, 2, 2, -34, 14, 7, -14, 24, -9, 19, 28, -11, -28, -28, -2, 25, -44, -14, -35, -13, 48, -11, -22, -34, 39, -31, -26, 9, -13, 12, -12, 13, 50, 32, -30, -19, -23, -39, 28, 41, 34, 29, -28, 39, -36, 50, -39, -47, -16, 44, 10, -24, 45, -18, -38, -14, -7, -49, -13, -14, 8, 18, -33, -3, 30, 15, -2, 7, -16, 27, 25, 7, 46, -44, -42, 18, -47, -19, -46, 5, 5, -7, 21, -38, -47, 1, 24, -36, 31, 33, -50, 14, -40, 42, 10, 42, 37, 33, 43, 12, -13, 18, -6, 23, 19, 17, -47, 20, -3, 46, -42, 39, -4, 34, 9, 1, 35, -18, 7, 46, -3, -46, 34, -24, -10, -50, 0, -35, 48, 49, -19, 42, -4, -28, -36, -25, -14, 38, 4, -49, 25, -32, -19, 36, 18, 4, 38, 48, 5, -22, 33, -15, 20, 35, 31, 2, 34, 35, -12, 25, -40, 25, 39, -21, 28, 21, 2, 31, 23, -43, 48, -31, -39, 16, 33, -1, -39, 3, 37, 29, 3, 23, -32, -37, 1, 27, -29, -47, 8, -17, 13, -33, 47, 31, -20, 33, 49, -9, 23, -48, 34, 49, 4, -41, 20, -29, -28, 25, -38, -11, -38, 46, 44, 0, 13, 41, 32, 34, 45, 39, -38, -22, 20, -4, -25, 19, 45, 49, -28, 24, 5, 34, -32, 47, -1, -16, -2, 44, -5, 42, 19, 49, 2, -20, 45, 33, -29, 16, -43, -32, -20, -19, 28, 4, -20, 16, 0, 45, 23, 41, -24, -3, -8, 44, 0, 47, 18, 24, 20, 21, 30, -1, 10, -10, 0, 27, -27, -21, 1, -1, 6, 11, 28, 2, 17, 26, 18, -20, 25, -21, -41, 43, 39, -7, -45, -24, -31, 41, -31, -39, 34, 43, -2, 1, -41, -46, 13, 7, 50, -43, -21, -34, 16, -30, -35, 45, -24, -45, -9, -35, -6, -48, -11, -31, -44, 8, -40, 42, 1, -48, -30, 2, 45, -21, -40, 30, -26, -1, 38, -42, -6, -22, 11, -36, -32, -36, -12, -16, -38, -35, 16, 44, 4, 14, -16, -35, -50, -1, -37, 11, -44, -28, 48, 12, -22, -29, 29, 42, -45, 31, -22, 38, -49, 13, 45, -15, 45, -31, 4, -14, 46, 1, 18, 19, -29, 34, 32, -36, 47, -4, 20, 30, 18, 1, -12, -49, 40, -6, -27, 10, 41, 14, 2, -30, 41, 16, 43, -50, 8, -4, -33, -18, -36, -27, -15, 9, -17, 39, 0, -11, -29, -35, -9, -35, -46, -45, -9, 37, -21, 50, -19, 2, -32, 0, -23, -4, 21, -50, 17, 6, -29, 35, 43, 7, 40, 40, -38, -12, -24, -12, 21, -39, -27, -33, -36, 9, -35, 46, 23, -4, -27, -6, -32, 40, -10, -20, 34, -35, -28, 27, -28, -10, -33, -15, -39, 50, 24, 18, 0, 34, -19, 42, 20, -15, -11, 40, 19, -13, 3, -47, -5, 12, 48, 23, -1, -21, 22, -35, 1, -47, -25, -22, 41, -40, 41, 45, -27, 0, -9, -12, -44, -33, -48, 12, -31, 47, 43, 22, 23, 19, -34, 28, 46, 8, 3, -38, -9, -7, 35, 29, 47, 16, 21, -31, -4, -27, 0, -33, -28, -50, 15, -46, -33, 29, 23, 42, -16, -26, -27, -38, -30, -12, -17, -32, -23, 40, 39, -40, -2, -16, 33, 25, 6, -23, 15, 14, 22, -29, 0, 40, -42, 20, -15, 3, -13, 15, -8, -46, 30, -14, 7, 12, 48, 0, 21, -8, 16, 16, 14, 11, 37, 12, -21, 39, -13, 0, -13, 16, 26, 49, -3, -39, -31, 21, -49, 24, 34, 50, 4, -45, 32, 43, 11, -2, 49, 33, 3, -41, -27, 46, -22, 43, 49, -45, 7, 27, 6, -48, -27, -32, 47, -42, -21, 45, 26, 31, -7, 2, 35, 17, 9, -28, 10, -44, -7, 4, 24, -12, 8, 47, -46, -9, 38, 41, -37, -24, -35, 40, -49, -32, -28, -10, -37, -4, 12, 39, -43, -24, -11, -23, 17, 10, -13, 24, -27, -23, -10, -33, -2, 34, -25, -48, 26, -13, 41, -37, -50, 41, 49, -40, -11, -47, -17, 14, 5, -41, 30, 20, 13, -38, -29, 5, 14, 41, 46, -38, -50, -13, 7, -26, -9, 34, -18, 6, -14, 6, 47, 11, -48, -21, 16, 12, 31, -28, 21, 22, 15, 10, -49, -24, -3, 12, 49, -46, -50, -29, 23, -27, 8, 28, 46, -1, -28, 27, -33, 38, -29, -7, -7, -14, -44, 39, -27, 26, -10, 19, 34, 20, -33, 28, 21, 9, 1, 29, -2, 16, -6, -42, -25, -25, -21, -24, 29, -47, 0, 32, 47, 19, 28, -41, -15, -5, -45, 19, 28, 42, 38, 32, 27, -48, -1, -9, 27, 3, -12, 34, 4, -40, 23, 28, -21, 30, 5, -22, -34, -18, -30, 27, -41, 36, -12, 27, -4, 35, 1, -10, 41, -4, 22, 36, 20, 37, -8, -14, 22, 13, 20, 9, 36, -26, -29, -8, 20, 19, -15, -5, -29, -16, -4, -18, 34, 24, -38, 5, 16, -38, -1, 6, 47, -23, 47, 45, 36, 37, 14, -27, 16, 30, -44, 23, 32, -27, -42, -36, 5, 35, -34, -32, -42, 13, 6, -13, 32, -43, -45, -2, -6, -30, 42, -17, -39, -12, 45, -45, 30, -19, 9, -43, -13, 42, 44, -32, 4, -42, 1, -23, 11, -3, -12, 2, 44, 12, -32, -18, 13, -25, -6, -50, 24, 15, -16, 26, 47, 47, 48, 45, -6, 25, -18, 31, 18, 32, -20, 40, 13, -36, -5, -3, 17, 32, 34, -11, -50, -31, -29, 3, 26, 14, -36, 10, 28, -37, 18, -2, -45, -10, -20, 39, 13, 38, 0, 8, 4, -2, -11, -36, 19, 14, -44, 11, 3, 1, 0, -47, -50, 15, 47, -16, 26, 30, -41, 16, 17, 38, 50, 42, 14, 0, -21, -12, -41, 42, -7, -19, -7, 12, 10, 14, -10, 30, -39, -49, 22, 25, 9, -26, 49, 10, 48, -29, 46, 5, -30, 4, -11, 0, -29, -23, -47, -25, 36, 9, -28, -10, 7, -43, 45, 0, 10, -50, -21, 41, -34, -28, -27, 35, 18, 38, 1, 20, 7, -29, 8, -7, -14, -17, 49, 6, 6, -11, -31, 50, -34, 1, -47, 12, -1, 31, 41, -1, -35, 21, 10, -7, -33, -1, 42, 29, -21, -2, 47, 43, -30, -29, -4, -26, 35, 5, 13, -23, -18, 15, -47, 29, -39, -34, -15, -35, -28, 21, -42, 27, 4, 22, 13, -4, 39, 49, 16, -41, 38, -47, -21, -40, 0, -32, -38, 6, 49, -48, 27, 23, -13, -24, 37, 29, -41, 2, -24, -44, 41, 39, 31, -38, 21, 40, 9, -37, -7, 19, 33, -23, -28, -39, -27, 0, -29, 11, -25, 35, 7, 20, -36, 43, 17, -45, -49, -20, -27, -16, -4, -20, 38, 21, 25, -49, 28, 8, 45, 12, 24, -34, 3, -30, -29, 46, 4, -22, 28, -30, -49, -9, 1, -13, -48, -26, 26, 37, 11, 44, -36, 19, -41, 22, 18, -7, -10, 32, -31, 46, -14, 44, -12, 26, 19, -43, -8, -41, -10, -47, 27, -47, -27, -30, -41, -5, 38, 19, 29, -7, 41, 49, -18, 43, -15, -26, -38, -12, 28, -13, -21, -37, -1, 17, -50, 10, -48, -1, 10, -15, -47, -8, -37, 38, 16, -44, -43, -7, 13, -44, -3, 11, -26, 30, 39, 17, 13, -33, -47, -34, -4, 30, -6, 38, 7, -48, -39, 40, -34, -29, -12, -12, 49, -35, 50, 0, -22, 27, 20, -10, 6, -23, 26, 29, -30, -47, 48, -36, 2, 39, -5, -44, -33, 38, 50, -30, -43, 8, -31, 31, 32, 16, 4, 11, -33, 40, 28, 5, 34, -29, -43, -40, -39, -3, 12, -24, -16, -49, 48, 44, -43, -31, -43, 12, 17, -20, -19, -38, 35, -25, 30, -22, 40, 35, -33, 18, -39, -49, -9, -44, -4, 39, 3, -36, 7, -18, 16, 12, -3, 15, 30, 14, -15, -34, -49, -18, 42, -45, -8, 49, 37, -40, -46, -21, -41, 50, 40, 40, -27, 8, 16, 10, -25, -12, 31, -48, -13, -9, -3, 38, -38, 38, 37, 5, 8, 12, 29, -8, 24, 6, -30, 44, 3, 28, 2, -6, -15, 12, -50, 41, 46, 16, 28, -18, -19, 36, 7, -25, 10, -34, 22, 18, -22, 12, -45, 8, 48, -30, -6, -6, 36, -16, 1, -5, 15, 6, -9, 22, 26, 47, -35, -46, -50, -29, -3, -25, -17, 7, 34, -44, -26, 6, -39, -20, -24, 35, -17, 30, 24, 42, -17, -14, 7, 9, -25, -6, -6, -19, 50, 18, 33, 20, -28, 14, -12, 16, -6, 16, 12, 19, 44, 3, -24, 42, 28, -15, -46, 16, 0, 38, -19, -30, -34, 22, -25, -29, -10, 8, 36, 24, -41, 36, -46, 4, -25, -47, -24, 47, 7, -48, -1, 45, -25, -33, -44, -6, -38, -45, -16, 44, 2, 50, 17, -9, -47, 9, -6, 21, 24, 15, 31, 31, -29, -39, 30, 0, -34, -15, 42, -2, -35, 24, -7, -29, 43, -43, -33, 29, 33, 21, 43, -13, -22, 26, 30, 30, 22, -49, 8, -9, 37, -30, -49, -46, -34, -27, -43, -21, -1, -29, 8, -27, -25, 10, -43, -39, -37, -21, 4, 48, 10, 11, -20, 41, -24, 49, -50, -10, -37, 23, -1, -9, 20, -11, -37, 49, 40, -40, 12, -2, -14, -41, 3, -44, 30, -39, 50, 50, 4, -15, -44, -27, -17, 14, -22, -25, 23, 14, -6, -34, -15, 22, 12, -28, 42, 15, 31, 41, -9, 20, 24, 20, -8, 37, 4, 5, 28, -20, 32, 5, 23, -3, 1, 21, -50, -49, 42, -9, 23, -42, -20, 45, -49, -27, 50, -8, 19, 21, 38, -8, 0, 38, -5, 24, 48, -50, 36, 16, -50, 12, 25, 11, 10, -11, 44, -22, -16, 41, 34, -40, 39, -40, 12, 18, 5, -44, 0, 44, -12, -9, 21, 2, 40, -30, -21, 27, -50, -27, -45, -45, 18, 11, -16, 28, -16, -3, 21, -8, -16, -46, -20, -20, 50, -43, -45, 36, 2, 29, -7, -2, -43, 13, -47, -19, 2, 16, 12, 29, 9, 47, 26, -18, -29, -20, -27, -48, -18, 43, -25, 47, 0, 35, -21, -16, -26, -23, 46, 36, -25, 22, -43, 50, 46, -36, -2, -43, 4, 34, 7, -48, -42, -37, 40, -31, -47, -27, 40, 25, -23, 48, 37, -20, 16, 43, 13, 40, -34, -45, 31, 9, 48, 40, 30, -40, -13, 50, -17, -4, -19, 6, -5, -16, 41, -29, -35, 25, -46, 39, -25, 26, -27, 16, -19, -28, -2, 50, 11, 26, 28, 15, -40, 29, -33, 47, -41, 26, 45, 9, -43, 20, -3, 30, -10, 40, -43, 42, -14, 40, -14, 13, 8, 37, -6, -35, -25, -20, -24, 39, -8, -36, 7, -2, 28, 36, -26, 17, -15, 29, -4, 8, 34, 1, -11, -8, 5, 30, -48, 20, -39, 14, -8, 50, 19, -5, 9, 10, -2, 36, -26, 38, -48, 17, 12, -21, 46, 42, -47, 27, 34, 20, -30, 20, -50, 9, -17, 36, -48, -33, -8, 25, 27, -10, 41, -27, -27, -48, 8, 7, 22, -27, 15, -11, 41, 20, -42, 9, -12, -18, -17, 11, 34, 10, 42, -24, -34, 9, -9, -4, 36, 2, -30, -43, 22, 46, 7, 17, 12, 8, 31, 45, -21, -26, 46, 48, 5, -17, -1, -49, 26, 2, -10, -28, 10, 36, -20, 15, -49, 18, 9, 27, -28, 6, -16, -50, -3, -2, -11, 11, -36, -21, -30, -43, -44, -17, 13, -9, 50, 2, 45, 46, 19, -41, 39, 7, 39, 32, 48, -47, 38, -43, -39, 37, 37, 30, -26, 46, -24, -49, 22, 4, 7, -18, 32, -2, -46, -4, 33, -27, 44, -7, 17, 45, 48, -37, -15, 0, -45, -34, 31, 21, 0, 1, -39, 30, 44, -50, -40, -35, 50, 41, -42, -43, -26, 23, -11, 16, -28, 11, -28, -7, 5, 17, -28, -42, -47, -17, 31, -17, 47, -9, -48, 32, -17, 39, 48, 44, -8, 40, 16, -14, -39, 36, 30, -35, 11, -34, -36, -25, -6, -49, -34, 14, 43, 45, -21, 17, -7, 45, 9, 48, -50, -32, -18, 32, -15, 40, 26, 40, 27, -27, 48, 32, -26, -40, -42, -45, 7, 49, 50, -22, 22, 46, 36, 28, -40, -28, -25, -50, 43, 30, -4, -10, -28, 49, -46, 48, -1, -42, -47, 20, 14, 29, 6, -26, 7, -45, -37, 12, 50, 24, 14, 1, 14, 49, -43, 45, 46, -43, -37, -27, 13, 42, -26, -45, -50, 36, -18, -37, 12, 5, 11, -23, -22, -28, -7, -13, -2, -8, -41, -24, -43, 17, 34, 34, -21, -38, 7, -48, 33, 49, -46, -29, 7, 15, 38, -11, 37, -46, -35, -36, 26, 24, 29, -33, 38, -4, -47, 2, 7, 34, 24, 7, 8, -17, -21, 3, 17, 27, 24, 17, -25, -48, 6, -14, -13, -10, -47, -25, -12, -9, -40, -40, 3, -13, -31, -25, 25, 42, -37, -1, -26, 4, 0, 39, -41, -37, -46, 6, -29, 24, -22, -44, -33, -20, -8, 33, -16, 20, 43, -47, 0, 43, -21, 43, 2, 31, 23, -37, -15, 36, -39, 25, -17, -25, -45, 50, 2, -36, -32, -4, 36, 49, 26, 44, 10, 50, 39, 1, -33, 9, -4, 6, -18, -19, -47, -10, -32, -44, 48, -25, 36, 47, 0, 5, 20, 24, 0, -43, -38, -19, -17, -33, 28, 4, -8, -27, -30, -33, -37, 2, -32, 26, 6, 13, 29, -49, 6, -17, -2, 39, 3, -29, 33, 42, 31, 42, -7, 40, -16, -22, -45, -14, 38, 34, 7, 13, -20, -1, 29, 9, -37, 19, -40, -24, 18, 28, -13, 11, 2, 29, -33, 46, 48, 1, -27, 48, -44, -37, -1, 43, -27, 28, -38, -32, -22, -29, -49, 26, -15, -13, -33, 0, -36, 48, 1, -34, 26, -29, 3, 1, 34, 39, -5, -47, -44, -41, -36, -25, 29, -11, 47, 10, 30, -35, 47, 42, -33, 24, 25, 50, -49, 3, -33, 3, -13, 46, 22, -36, 13, 41, -43, -5, 49, -12, 1, -43, -1, -1, 32, 17, -24, 26, -13, -30, 39, -6, 7, -28, 3, -21, 44, 44, -35, 1, -10, 20, 30, -27, -31, -24, -49, 9, 0, -50, 47, 40, 50, -45, -13, 3, 9, -24, 29, 11, 12, 48, 40, -16, 7, 10, -15, 41, 5, 16, 6, -10, -20, -48, -13, 2, 1, -27, -25, 41, 22, -14, 40, -3, 16, -10, -2, -23, -19, 48, 20, 20, 34, -19, -13, -31, -43, 17, -25, 28, 19, -3, 45, 18, -5, 7, 19, 16, -22, 32, -41, 20, 14, 14, -34, -29, 49, -37, -45, -21, -4, 46, -31, -35, 17, -17, -50, 26, -3, -43, -29, 17, -17, 9, -6, -14, -28, 33, -27, 40, -38, 18, 29, 9, -13, -3, 42, -25, 35, 37, 26, 34, -50, -47, 16, 36, 29, -38, -12, -20, -27, 28, -46, -2, 35, 35, -40, -27, -6, 23, -17, -40, 6, -22, -29, -18, 21, -2, 45, -28, 18, 44, -22, -45, 1, 38, 38, 44, -37, -34, 29, -23, -42, 15, -47, -31, -10, -15, 50, -45, 14, -1, 13, -48, -14, -48, -18, 8, -36, 5, 10, 17, 28, 20, 17, 11, 16, -28, -37, -45, -18, -42, -39, 48, 44, 0, -48, 5, -5, -15, -38, -38, 7, 47, 34, -17, -8, -23, 5, -4, -16, 27, 31, -32, 32, 46, 0, 48, -31, -22, 21, 38, 30, 14, -13, -2, 43, -23, -18, -38, 37, -7, 50, 35, 1, 26, 25, -10, -2, -44, -15, 42, 42, -25, -24, -27, 44, 20, 30, -18, 47, -33, -46, -50, 20, 47, -48, -15, -16, 0, -39, -36, -47, 5, 46, -35, 42, -45, 12, 50, -28, 26, -7, -50, 6, 25, -24, -26, 35, 11, 47, -33, 29, 42, -21, -21, 33, -4, -29, -9, -17, 12, -47, -20, 0, -1, -37, -43, 50, 18, -43, -40, -22, 4, 34, -12, -38, 13, -2, -32, 16, 47, 32, 45, 49, 1, 27, 20, -31, 45, 3, 44, 35, -46, 44, 28, 11, -34, 2, -14, -32, -41, -7, 47, -2, 38, -14, 7, 41, -36, -31, 4, -38, -31, -8, 44, 31, -10, -3, 5, 41, 17, 37, -7, 22, -4, -1, -19, 45, 3, -12, 34, 7, 10, 40, 49, 21, 32, 42, -32, 18, -29, -16, -41, -36, -49, -29, 48, 32, -39, 47, 11, -6, 7, -31, 0, -44, -27, 16, 19, 46, 2, -17, -18, 42, -28, 7, 17, 18, 47, 29, -11, -4, -8, 10, -9, 11, 16, 4, -2, -2, 27, -18, -23, 6, -10, 28, -47, -31, 38, -16, 2, -12, 2, 35, 48, 41, -41, 29, 36, 32, 14, -50, 2, -5, -25, 47, -49, -23, 33, -24, -23, -20, -4, -44, 21, 45, 24, -3, -25, 4, 38, -44, 33, 6, 7, 43, -50, 31, 21, -22, -29, 45, -11, 11, -37, -49, -16, 20, 16, 28, 47, -29, -33, -5, 31, 12, 47, -15, -5, -14, -33, -8, -22, 25, -33, 44, -36, 8, 43, 49, -23, 2, -36, -8, -18, -49, 8, -43, -18, -16, -33, 39, -30, 13, -23, 33, -6, -31, -47, -15, 47, 26, 44, 1, -12, 20, 30, -39, 4, 43, -3, 47, 35, 34, -42, -39, 30, 29, 18, 32, 6, -23, -34, -29, -16, 8, 28, -32, -1, -25, 9, -7, 5, 48, -8, -28, 23, -29, -4, 4, -40, 4, -25, -50, 49, 11, -30, -43, -31, -6, 30, 28, 34, 14, 9, 16, 44, 5, -20, 34, 36, 30, -29, 11, 5, 35, 49, 21, -43, 11, 27, -27, -29, -36, 33, 40, -23, -29, -20, 22, 11, 36, 18, -12, 30, -11, 18, 4, 20, 13, -43, 20, 35, -7, -13, -30, -47, -19, 4, 42, 9, 8, 43, 16, -46, 32, 21, -14, 44, -24, -38, -45, 14, -21, 24, 1, -10, 44, 29, -36, -46, -36, -50, -36, 49, 9, -3, 3, 4, 21, 35, -24, 47, -21, 25, 9, 15, -5, 1, 35, 30, -16, -9, 5, -6, 1, -28, -22, -22, 6, -32, 30, -43, -1, -44, -40, 16, 15, 32, -23, 5, -23, 38, 24, -11, -49, 25, 10, 25, -26, 50, 44, 3, -34, -3, -39, 10, 43, -49, 29, 14, 1, -17, -6, -50, 49, 1, 16, 47, 25, 5, 7, 40, -1, 50, -26, -39, 46, 22, 14, 5, -1, 36, -23, -48, -13, 13, 3, -15, -7, -7, 18, 42, 2, -38, -7, -47, 19, 0, 19, -40, 40, 3, 11, 8, 48, 10, -11, -47, -24, -35, 31, -44, -40, 21, 13, 1, -45, -3, 18, -45, 10, 15, 44, 45, 22, 28, 34, 2, -23, 40, -46, 30, 50, 7, -27, -20, 48, -10, 17, 33, 30, -5, -41, -14, -30, -30, 29, 46, -41, 31, 46, 42, 44, -27, -39, -31, 19, -43, 27, -46, 3, -15, -13, -48, -15, -29, -43, 10, 27, -44, 17, 11, -32, -4, -27, 29, -45, -43, -26, 45, 38, 23, -10, 7, 30, 9, -48, -42, 1, 7, 9, 31, -2, 43, -46, 11, -19, -24, 34, -27, -13, 16, -35, -36, -26, 21, -47, -19, -6, 5, -16, 2, -21, -2, 43, 30, 32, 1, 44, 30, -49, 8, -14, -22, -21, -29, 24, 46, -32, 16, 35, -33, 43, 14, 33, -46, 25, -40, 37, 7, -33, 21, 42, 5, -29, 5, 15, -28, -35, -7, 21, 17, -37, -42, 24, -35, -38, -15, -7, 49, 30, -37, 42, -34, 14, 33, 46, 3, -49, -34, -28, 35, -50, -39, -38, 27, 23, -39, 6, 35, -33, 32, 43, -36, -12, 27, 22, 18, -18, -3, -46, 37, -43, -32, 1, -39, 21, -43, 4, 33, 42, -17, 31, 14, 24, -4, -16, -19, 0, 29, -45, -42, -11, 35, -3, 21, 45, -25, 31, -14, 1, -39, -13, 47, 17, -35, 10, -27, 27, -34, 44, -47, -1, 47, -48, -43, -39, -16, 15, 2, 42, 36, -18, -33, 7, 35, 27, 42, -6, -36, -36, -6, 17, 49, 18, 16, 25, 11, 33, -7, -31, -12, -12, -50, 16, -4, 22, 3, -31, -42, 44, -23, 13, -16, -11, -49, -48, -37, 30, 48, 17, -4, 43, 3, 7, 11, 0, 27, -3, -24, 26, 4, 33, -2, -27, -41, -44, -34, -29, 8, -7, -40, -9, -28, 9, 35, 11, 3, 31, 39, 43, -38, 17, -24, -11, 23, 41, 34, 24, 33, 49, 32, -41, -36, -6, 2, 31, -44, -21, 27, 50, -21, -24, -2, 6, 13, 50, 12, -3, -10, 30, -21, 31, -48, 41, -14, -21, 3, 34, 33, 35, 49, 49, 34, 37, 34, -44, -43, 35, 35, 12, 12, 13, -21, 47, 42, -41, 18, -2, -12, -17, -41, -42, 9, 45, -46, -16, -40, -9, 29, 40, -31, 0, -50, 39, -40, 10, 28, -12, -3, 31, 37, -23, 38, 36, 24, 46, 29, -15, 36, 19, 11, 37, 19, -41, 35, 36, -46, -23, 8, -42, -12, 41, 11, 38, -13, 40, -27, 13, -8, -35, 15, 15, 18, -5, -30, 9, -41, -33, 39, 33, -10, -15, 34, 15, -5, 46, -28, -12, 44, -47, -10, -48, 50, 2, 23, 45, -15, -2, -24, 2, -2, 32, -50, 39, -5, 11, 26, 48, 15, -29, -12, 41, -7, -49, 24, 8, 50, 39, -23, 39, 30, 16, -37, -35, 0, 49, -23, 41, 2, 1, -26, 6, -42, -40, 50, -6, 34, -49, 3, -17, -9, 26, 18, -40, -22, 41, 41, -46, -31, 50, -12, 23, -19, -22, 15, -50, 33, -50, -47, -36, -4, -21, -45, -50, 20, 11, 13, -46, 3, -2, -44, 49, -48, 25, 10, 28, 33, -10, -30, -19, -39, 50, -44, 0, -6, 44, 14, 9, 24, -6, -17, 32, -40, 46, -18, -43, -6, 21, 47, 40, 42, 27, -17, -6, 50, 14, 22, 1, -41, 43, -8, 31, 30, 19, -40, 37, -15, 46, 46, -33, 12, -46, -20, -35, 15, -42, -49, -14, 33, 8, 30, 7, 38, 32, -43, 1, 24, 26, 26, 22, 18, 31, 1, 27, -17, 35, -3, 46, -27, 42, -38, -1, 40, 14, 20, -47, 13, 23, 48, -12, 12, 7, -35, 40, 33, 11, -41, 11, -18, 20, -9, -7, -5, 35, 30, 22, 23, 49, 44, -20, -46, -33, -45, -1, -23, -27, 18, -23, 7, 16, -33, -47, -2, -19, 45, 32, 42, 46, 15, 7, -40, 46, 14, -34, 29, 15, -47, -19, 20, -22, 10, 9, 22, 7, 48, 2, -46, 10, -30, 7, 30, -37, 45, 28, 34, 3, 27, -10, -35, 0, -50, -11, -33, -17, 39, 10, 49, -30, -50, -24, 0, -40, -37, 41, 4, -24, -29, -30, -27, -32, -27, -25, -26, -6, -22, 23, -40, -27, -27, -39, -44, -11, 30, 48, 19, 25, 28, 45, -28, 20, -13, -20, -22, -7, -23, 25, 40, 17, -30, -42, -2, 47, -14, -30, 9, -28, 37, -41, 19, -30, 50, -22, 8, -11, -30, 35, 48, 12, -5, -46, -36, 32, 29, -11, 36, -47, 34, -27, -9, -25, 15, -43, 22, 15, 27, -31, 15, 17, 48, 4, 27, 34, 28, -12, -1, -31, 19, -23, -8, 15, -23, 47, 27, 22, -28, -16, -29, -46, 9, -10, -22, -16, 47, 17, -6, -42, 0, -37, 18, 5, 40, -40, -21, 50, -12, 47, -27, 29, 7, -21, -27, 16, -22, -9, 25, 11, -24, -22, 15, 6, 10, -22, 6, 22, 4, -7, -23, -14, -28, 26, 18, 45, 41, 7, 28, 37, -19, 34, 18, 50, -15, 41, -19, 8, 9, 36, 29, 23, 42, -24, 48, -27, 36, 16, -15, -37, 17, -7, -3, -19, 33, -34, 42, 6, -12, -19, 17, 37, -49, 27, -9, -13, 4, 4, -17, -5, -8, -49, -15, 19, -15, -29, 18, -13, 3, -29, 24, -20, 2, 42, 8, 46, 35, -2, -24, 21, 6, -45, -5, -26, 47, -42, 13, 49, -20, -32, 14, 37, 47, -34, -17, 48, -15, -38, 8, 38, 25, -30, 50, 14, -45, -40, 29, -29, -40, -14, -25, 6, -25, -30, 6, -25, -36, 12, -16, -40, 22, 36, 17, 43, 41, 38, 35, 38, 39, -1, -22, 13, -10, 45, -25, -23, 33, -3, 15, -28, -12, 18, -30, 35, -2, 24, 43, 41, -15, 30, 34, -14, 49, 38, 37, 43, -9, 11, 48, 34, -45, 34, -43, 18, -11, -41, -20, -21, 0, 34, -15, 10, -24, -16, 9, -19, 39, -47, 40, 49, 50, -24, -4, -45, 31, -25, -27, 20, -7, -37, -38, -25, -8, -8, 15, 36, -23, -50, 45, -39, -1, 2, 9, 4, -16, 10, -25, -20, 6, -39, 42, -46, 48, -44, -35, 45, 1, 30, -30, -24, 28, -28, 21, -26, -40, 12, 6, 34, 3, -41, -1, 22, -50, 35, 19, -21, 4, 47, 26, 35, -45, -27, 34, 36, -46, -44, -48, -38, 3, 12, 25, -45, 47, 28, -4, 31, 4, -2, 6, -48, -29, -16, -23, -9, -39, -50, 49, 43, -28, 50, -23, 18, -15, 3, -4, 5, -41, -46, -37, -27, 12, -23, -30, 25, -31, 11, 45, 0, -11, 34, 30, 14, -23, 3, -49, 30, -37, -37, -7, 31, -11, -17, 14, -33, -17, 36, -2, 29, 32, 50, 4, 11, 19, -27, 30, -3, 29, -12, -3, 19, 29, -42, -22, 17, 9, -25, -13, 11, -25, -37, 48, -2, -8, 37, -43, -11, -26, 12, -47, -36, -35, 3, -40, -23, -44, -13, -27, 44, 17, -14, -16, -45, -18, 45, 48, 30, 3, 45, -37, -32, 37, -40, 20, -6, 9, 37, 7, 37, 27, -27, -40, 21, -7, 28, 15, 37, -6, 23, -19, -34, 3, -41, 35, -45, 40, -31, -50, 13, 30, -50, 50, 10, 28, -50, 30, -5, 9, -8, -7, -13, -49, 31, -39, 42, -28, -42, -43, -1, 29, 11, -28, 42, 8, -41, -39, 11, 25, -21, 23, 27, 17, -4, 33, -10, -44, 43, 37, 23, 1, -6, -13, -15, 30, 34, 7, -5, 16, 14, -33, -49, -47, 45, 32, 33, -9, -2, -2, -44, -42, 20, -24, -30, -16, 37, 45, 25, 36, -15, 42, 16, -8, -43, 47, 27, -15, -3, -5, -19, -44, 23, -39, 4, -28, 24, 1, -38, 25, 20, 2, 12, 23, 20, 0, 7, -24, -44, -1, -27, 36, -26, -7, -15, 6, 46, -14, 1, 12, -44, 43, 9, 44, -14, -30, 47, -5, -30, 33, 47, 21, 45, 1, 43, -22, 18, 43, 25, -12, -24, 26, -41, -15, 44, -35, -15, 39, 33, -17, -14, 21, 17, 8, -22, -20, 15, 38, -48, 18, -29, 29, 22, 2, -3, 22, 25, -4, -9, -47, 31, 31, -9, -8, 46, -9, -48, 8, 30, 25, -40, 30, -16, -1, 12, 19, 48, -45, -19, -40, -8, -12, -38, -38, -12, -5, -17, 16, -19, 17, 14, 22, -44, 40, -48, 35, 29, 21, 18, -2, 7, 43, -23, -24, -29, 43, 50, 20, 43, -38, -29, 24, -46, -29, 28, 2, -12, -14, -20, 11, 42, 30, -45, 30, -17, 36, 1, -21, -38, 7, 43, 2, -31, -45, 4, -20, 8, -32, 19, 47, -23, -38, 1, 23, 10, -10, -6, -44, 31, 35, -37, -15, -43, -39, -11, 46, 37, 11, -37, -2, 0, 11, -46, 32, 16, -50, 50, 46, -2, -34, 22, 44, -16, 16, -38, -14, -13, 27, -45, 42, 12, -2, -42, -15, -28, 28, 6, -1, 8, -44, -4, 38, 50, 36, 24, 5, -43, -15, -9, -12, 14, -7, 26, 29, -5, -38, -14, -37, -38, -39, 4, -23, -29, 33, -32, 24, -21, 3, 39, -36, -21, -22, -19, -21, -35, -15, 31, -3, -23, 11, 32, 5, 5, 24, -34, 11, -30, -14, -17, 46, -22, 17, 45, 9, -40, 39, 31, 45, 9, 40, 29, 23, -17, -18, -41, 9, -25, -26, -49, 39, 33, -48, -19, -50, -27, -1, -8, -7, -18, -13, 1, -16, -34, 7, -3, -8, -3, -7, -18, 24, 36, 45, 32, 25, 41, -49, -41, 32, -23, -4, -43, -28, -3, 43, 41, 12, 26, -14, -39, 23, 30, 14, 35, -36, 29, 33, -41, -9, -25, -2, -28, 13, -34, -17, 6, 35, -47, 20, 18, 44, 32, 17, -1, 35, 16, 36, 17, 37, 8, 27, 12, 16, 34, -25, -50, 43, 17, 27, -33, -39, -13, -9, -15, -35, 14, 16, -12, 48, 8, 28, -13, -35, 30, 47, 23, -40, -23, 40, 31, 43, 26, 29, -49, -31, 25, 42, 21, -13, 5, 33, 48, -12, -20, 29, -28, -17, 45, -34, -27, -16, -28, -43, 3, 36, -30, -32, -20, -1, 20, -27, -5, -43, 26, -48, -17, 26, 6, 7, 45, -16, -30, 14, 15, 6, -9, -8, -25, 16, 37, -25, -43, -4, -14, 21, 31, -33, 25, -15, -49, 33, -48, -17, -5, 11, 19, 6, -41, 37, -33, -18, -44, -6, -22, 32, -13, -12, -26, -34, 10, 0, -14, 16, -27, 31, -2, 39, -30, 24, 6, -10, -34, -30, 17, 45, 31, 13, -7, -23, -15, -14, -7, -1, 39, 4, 37, -41, -13, -2, 21, -49, -7, -16, -30, 6, 40, -28, -19, 39, 20, -18, -34, 21, -9, -34, -3, -3, 31, 49, 6, 10, -7, -28, 25, 36, 2, -18, 5, -23, -28, 12, -44, -49, 14, -47, -43, -2, -22, 31, 4, -14, 44, -45, -27, 28, -11, -39, 13, -5, -37, -24, -14, 26, 11, 16, 29, 25, -37, 47, 44, -12, -46, 25, -25, 30, 2, 12, -40, -18, -10, -11, -5, -47, 45, 44, -40, 30, -24, -43, -30, 46, -46, 11, -19, 38, 7, 21, -24, -25, -11, -22, 22, 31, -44, -30, 29, 16, 45, -41, 11, 45, -43, 45, -47, -22, -39, 50, 49, 0, -32, 50, -20, -25, -45, -22, -34, -31, -9, -4, 23, 19, 45, -49, 23, -14, 40, -32, -10, -35, 33, 9, 6, 49, 13, -46, -33, 21, -38, 23, -15, -32, -20, 49, 42, -28, -19, -40, 15, 45, -46, 44, -38, 35, 13, -16, 32, -22, -28, 32, 29, 44, -35, -25, -48, -28, 6, -42, 0, 37, -18, 27, 41, -27, -1, 1, 20, -13, -7, 38, 5, 15, -6, 1, -50, 36, 31, 13, -43, 47, -8, -43, -22, -38, -50, -22, -1, -14, -50, 18, -3, 4, 15, 12, -29, 43, -40, -22, -48, -6, 26, -48, 23, 17, -37, 36, 30, 14, 6, -36, 9, 3, -49, 31, 13, 35, -23, 43, 26, 16, -48, 2, -25, -47, -35, 41, 21, 3, -35, -20, 36, -49, 22, 40, -6, 3, 8, 8, -29, -17, 22, 46, 5, -17, 48, -25, 20, -6, 40, 25, 30, -30, -8, 35, 39, -12, -38, -9, -6, 36, 0, 43, -34, 40, 33, 12, -44, 4, -47, -20, 43, 44, 5, -47, 31, 33, -11, -4, -1, -28, 0, -13, -42, 10, 29, -30, -42, -26, -15, -8, 27, 30, -23, 13, -6, 5, -3, -43, -37, -36, -12, -26, 12, 8, 24, -22, -48, -12, -29, 50, -10, -31, -32, -38, 40, -32, 29, 15, 14, -48, -27, -13, -49, 5, 29, 42, -14, -47, 27, 30, -7, -6, 30, 33, -4, 42, -25, 30, 25, 41, -42, 45, 47, 29, -3, -20, 4, 40, 42, -50, 40, 45, 8, -40, 48, -49, -5, -50, 19, 20, 15, -49, 18, -38, -32, 32, -4, -50, 48, -33, -19, 45, 21, -40, -31, -43, 41, 34, -13, -45, -49, 23, 22, 4, -48, 15, 49, 21, 22, -25, 47, -3, 43, -43, 16, 24, 38, 18, 25, -21, -24, -8, -46, -31, 1, -30, -48, -10, 13, 17, 37, 20, -27, 1, 24, -49, -7, -10, 19, -44, -13, 31, -6, -42, 2, -23, -32, 17, -47, -38, 41, -40, -49, 19, -39, -14, 5, 37, 1, 22, 39, -47, -47, -2, 1, -17, -29, -38, 12, -36, -11, -13, 4, -7, 15, 15, -8, 21, -13, 31, -22, 24, 5, -45, -42, -29, -5, 38, -20, -30, -13, 1, -32, -41, -5, 50, 25, 32, 15, 28, -13, 11, 21, -5, -16, -8, -21, 22, 12, -21, 32, -22, 15, 41, 21, 38, 23, -29, -16, -9, -27, -25, -20, 36, -49, -12, 46, 37, -39, 50, 22, -7, -8, 16, 36, 37, 46, 43, -13, 15, -11, -29, 24, 12, 8, 25, -32, -31, 22, -8, 7, 31, 3, 31, -11, 49, -24, -38, -4, 21, -28, 8, 26, -44, -1, 15, -48, -12, 36, -44, 17, 4, -43, -19, -32, -39, 6, -41, 27, 40, -30, -31, -47, -32, -22, 20, 13, 46, 21, -40, -18, -26, -18, 49, -25, -15, -40, -21, 6, 46, -41, 42, -26, 45, 17, 6, -17, 35, 26, 3, 0, 49, -45, 8, 3, -34, -25, 37, -42, -49, -31, 40, -45, 40, 37, 28, 4, -3, 7, 46, -9, 23, -30, -45, -21, -28, -15, -48, 39, -17, -21, 31, 30, -9, -30, 37, -47, -2, -3, 38, 0, -27, -5, -24, 44, 0, 48, -31, 29, 44, 20, -33, -43, -24, -37, -33, 14, -20, -31, 19, -6, -50, -32, -12, -24, 5, -35, 27, 47, -44, -31, -20, 35, 33, 28, -26, -50, -34, 29, 50, 34, -24, 48, -27, 11, 1, 0, 15, 6, 4, 2, 38, -32, -38, -22, 45, -45, 22, -50, -27, 23, 48, -45, -3, -31, 25, 16, 4, -33, -30, 48, 13, -14, -32, 38, 5, 11, -33, -21, 5, -9, 2, 47, 23, 35, -1, -47, 12, 16, 5, -2, 41, -29, -39, -2, -38, -18, -4, 13, 32, -34, -17, 17, -12, 21, 46, -50, -46, 45, -11, 12, -50, -16, 35, 42, -34, 43, 48, 9, -50, -47, -42, -6, -19, 18, -37, 0, 39, -28, -5, 35, -24, 38, -15, 17, -19, 22, 15, -9, -1, 6, 13, -5, 38, 23, 50, 38, 3, 2, -22, -14, 18, -37, 46, -24, -46, -7, -36, 16, -50, -27, 25, 11, 27, 6, -31, 7, -37, 27, 2, -16, 11, 10, -32, 33, -9, -7, 36, 47, -50, 17, 30, 39, 27, -5, 0, -19, 49, 33, 29, -32, -12, 37, -37, -22, -9, -37, -40, 24, -4, -27, -29, -2, 4, 4, 34, 19, 27, 22, -16, -7, -15, 38, -36, -6, 11, 41, -1, 27, -38, -20, -46, 32, -43, -38, -10, -34, -19, -46, -42, -17, -50, -11, 28, 3, -19, 47, 48, -1, 8, 41, 30, 11, -40, -28, -25, 12, -5, 18, 39, -45, 0, -8, 47, -9, -38, -26, -49, -37, -34, -11, -12, -26, 40, -3, 37, -2, -18, -24, -6, -20, 12, -13, 28, -11, 7, 14, -40, -36, 46, 6, 45, -26, -12, -18, -22, 7, 47, 21, -40, -38, 18, 32, -30, -48, -25, -18, 43, -29, 11, -46, -32, -42, 7, -27, -12, 25, 10, -3, 40, -1, 11, 2, -30, -13, 48, 45, 8, 49, 46, -8, -34, 18, -7, 33, 12, -28, 17, -25, 43, -3, -4, -5, -22, -17, -41, -31, 37, -17, 50, -38, 36, -41, 35, -6, 27, 38, 31, 33, 41, -43, -46, 34, -31, -7, 29, 7, -31, 38, 20, 38, 49, 23, -11, -35, -47, -41, 0, -3, 44, 25, -31, -19, 15, 9, -40, -31, -28, 26, -16, -34, -41, -13, 27, 32, -19, 3, 46, 6, 38, -26, -37, -6, -7, -13, -15, 37, -12, -12, -38, 15, -17, -36, 7, 8, 15, 1, 38, 18, 47, -46, -8, -43, 27, 42, 43, 12, 50, 17, -16, 20, 39, -19, 46, -27, -1, 8, 14, 42, -13, -13, -30, -28, -5, 18, -21, -11, 31, 19, 18, -9, -33, 8, -38, 33, -30, 17, 26, 31, 26, 26, 50, 10, 48, -13, -11, -24, 7, 39, 25, 15, -8, -31, -16, 4, 23, 21, -11, -5, 49, 44, 28, -9, -33, -36, 32, 37, 48, 15, -38, 6, -42, 48, 15, -35, 49, -49, -35, 21, -50, 31, -25, -7, -46, -30, -16, 41, 3, 39, 45, -1, -7, 34, -47, -9, -10, -15, -27, 46, -46, 6, 16, -40, -6, 45, -29, -40, -13, 8, 35, -47, 16, -41, 50, -32, 31, -23, 44, -34, -27, -50, -46, -19, 2, 30, 6, 34, -8, 35, -12, -17, 27, 29, -46, -33, -47, 41, 40, 19, -40, -4, 34, 30, -20, 47, -38, -28, 14, 17, -21, -20, -4, -35, -8, -48, -39, 25, -40, -35, -22, -30, 7, -8, -46, 1, -38, 30, -39, 30, -50, -43, -35, -36, -32, -26, -20, -49, 8, 38, -20, 17, 17, -39, -34, 34, -22, 35, -15, 29, 12, -36, -21, 0, -40, 6, -38, 36, 4, 47, 12, 33, -49, 21, 31, 5, -44, -8, -20, 10, -29, 11, -23, -26, 14, -19, 38, -3, 29, 42, -27, 30, -9, 19, 27, 39, 41, -15, -20, -24, 15, 32, 41, -6, -7, 6, -30, 4, -36, -17, -48, -50, -27, -8, -24, -42, 37, -34, 41, -12, 4, 17, 42, -6, -23, 5, 50, -22, -22, 18, -40, -49, 17, -41, 21, 36, -24, 36, 47, -16, 30, -1, 23, -49, -34, 44, 29, -27, 6, 20, 32, -35, 46, -15, -6, -41, 12, -8, 0, 28, -48, 15, -16, 40, 18, 28, -15, -2, 46, -50, 25, -9, -10, 22, 6, -31, 43, -37, 36, 42, 48, 1, 40, 3, -2, 40, -21, -48, -39, -20, -14, -24, -27, -10, 13, -40, 40, 22, -35, -37, -4, -21, -27, -38, 46, -42, -2, -25, -2, -9, -6, 26, -30, -22, 41, -27, 26, -9, 33, 20, -10, -3, 28, 38, 48, 26, -8, -43, 34, 12, 12, -45, 23, 1, -30, -37, 7, 46, -26, 5, 32, -42, 50, 49, -15, 6, 28, -46, 30, 43, -44, -45, 28, 1, 23, 19, 4, 26, -37, -50, 46, 32, 22, -14, -2, -39, -46, 19, -40, 2, 4, 23, 28, -1, 2, 4, 41, -48, -35, -6, 30, -15, -32, -47, 8, 38, 40, -39, 12, 5, -24, 17, -27, 30, -25, 31, -29, 19, -32, 50, -17, -40, 37, -6, -14, -28, -11, -8, -47, 31, 43, -36, 50, -28, -39, 17, 17, 1, -10, 27, 8, 7, 8, 21, -28, -50, 5, 24, 40, -47, -22, -34, -2, 32, 0, -2, -27, -7, -10, 6, 5, -19, -20, -35, -19, -9, -17, 48, -14, -35, 34, -38, 31, 15, -18, 31, 41, 50, -16, -14, 25, -11, -43, 3, 38, -44, -49, 46, 5, 46, 6, -2, 36, 18, 27, -43, 33, 12, 31, 36, 42, 20, 37, -5, 38, 27, 16, -5, 27, 16, -9, 13, 22, 2, 20, 39, -44, -44, -15, -38, 16, -31, 22, 2, 35, 1, 46, 10, 36, 36, 39, 45, 10, 5, 41, 43, -11, 30, 12, 6, 31, 38, -47, -25, 44, 11, 25, 3, 11, -33, -41, -15, -49, 9, 38, -4, 22, -19, 18, 0, 16, 30, 26, 16, 41, 17, 31, 5, 48, -37, -35, 25, 24, 15, -18, -38, -21, -25, 31, -38, 17, -18, -36, -34, -45, -46, -18, 3, -35, -5, -27, -46, 16, 48, 40, 25, -1, -10, 38, 4, 30, -31, 41, -1, -16, -1, 28, -18, 16, 20, -41, 39, -10, -11, -45, -18, -35, -27, 43, 9, 23, -40, -7, 35, -48, -13, -11, 36, -32, -11, 2, 26, -15, 16, 35, 38, -31, -23, 6, -48, 35, -14, -33, 33, -5, -46, 22, 42, 30, 25, 6, -25, -18, 46, -15, 42, -29, 31, -34, -7, 1, 37, -29, 18, -50, 32, -21, -12, 28, -16, 18, 19, 38, -40, 0, 12, 35, -17, 4, 27, 22, -31, 29, 7, 30, -34, -17, 24, 48, 11, -17, 49, 21, -32, 46, 36, 15, 21, 42, -9, 0, 20, -2, -22, 44, -21, 48, -26, 17, 11, -13, -34, 23, -50, -33, 12, -5, -32, -1, 45, 3, -20, 46, 35, 14, -5, -16, -2, 30, -17, -22, -45, -50, 4, -24, -39, -47, 29, 1, -40, 1, 33, -25, -23, 21, 15, 39, -24, 46, 4, 20, 3, -5, -15, -30, -2, -17, 36, -17, -11, -44, 39, 1, -2, 30, 44, 38, -14, 11, -36, -49, -40, 45, 43, -34, 37, -6, 17, 10, -5, -19, -32, 16, -47, -26, 22, -30, 36, 42, 43, 38, 42, 47, -37, -29, -3, 0, 29, -40, 8, -37, -44, 18, 7, -11, 42, 30, 43, -26, 27, -9, 35, -7, -46, -23, 25, 49, 9, 26, -30, 45, -2, 5, 6, 34, 10, 50, -13, 22, 50, -49, -48, -8, 23, -16, 22, -11, 45, 34, 7, -17, -26, 5, -19, 50, -29, 38, 14, 49, -30, 29, 45, -30, -23, -32, -37, 36, -27, -31, -19, 23, 1, 14, 44, 1, 50, 7, 28, 44, 41, -41, 19, -36, -4, 40, -41, -30, -32, 17, -29, 12, -13, -36, 19, 24, -7, -21, -27, 35, 43, -5, -47, -45, -13, -25, -32, -49, 17, 18, -4, 48, -22, 13, 29, -39, 34, 22, -40, -43, 9, -25, -19, -12, -47, 47, 41, 38, -7, 48, 32, -16, 0, 0, -22, 27, 34, -15, 27, 9, -36, 0, -1, 43, 4, -39, -1, 11, -46, -24, 28, 39, -42, -16, -38, -7, -5, 46, 47, 17, 26, 23, 2, -50, -40, -1, -42, -13, 36, -38, -46, -26, -41, -46, -29, -9, 38, 50, -31, -23, -30, -40, 42, 18, -14, -2, 18, -18, -6, 49, -43, -45, -36, -36, -42, 10, 5, -46, -25, 36, 29, 6, -16, -41, 40, 29, -30, -39, -42, -35, 22, 42, 3, -28, -12, 37, -29, 4, -20, 23, -4, -24, 47, -3, -12, 37, -30, -36, 30, -6, -32, 2, 38, 4, 35, -2, 27, 10, 9, 41, 25, 40, -27, 35, -12, 10, 49, -28, 21, 41, 42, 28, -12, 21, 41, 46, -40, -9, 50, -26, -17, -29, -49, 0, -35, -40, 27, 45, 35, 18, 49, 36, 11, -32, -22, -9, -28, 9, 22, -33, 44, 50, 30, 4, -33, -24, 34, -50, 45, -37, 8, 27, -18, -15, -12, 25, -6, -26, -36, -31, -17, 7, 9, 27, -21, -38, 27, 42, 39, 16, 38, 40, -6, -11, 29, -13, 24, 42, -4, 37, -22, -17, -40, -31, -31, 22, 5, -28, 49, 40, 37, -26, 38, -18, -20, 23, 28, -50, 3, -35, 34, 8, 15, -48, -36, -19, -1, 40, 49, 48, 9, 37, -43, -44, -47, 43, -41, 9, -26, -9, -4, 45, 45, -19, 23, 22, -26, 38, -35, -2, -35, 43, -13, -46, -44, 26, -43, -18, 11, 23, 33, -19, 42, -50, 40, -31, 4, 12, 27, 28, -45, 1, -49, 42, -12, -19, 0, 18, 35, 41, -19, 42, -48, 11, 44, -38, 19, -30, 10, -37, 38, 20, -29, -19, -10, -19, -9, 1, 43, 30, 3, 11, 34, 39, -8, -48, -13, 30, -12, 19, 34, -6, -5, -38, 1, -42, 6, 18, -8, -44, -7, -7, 44, 17, 26, -7, 28, -11, 26, -8, 11, -8, 39, -32, -2, 14, 26, -26, 33, -10, -28, 7, 37, -8, -11, -21, -17, -41, 9, -50, -39, -5, 42, 24, -34, 33, 7, -13, -45, 11, 33, 23, -41, 44, -25, 7, -34, 2, 27, -46, 16, -31, 0, -5, 28, 16, -48, -28, -42, -40, -4, -2, -7, -38, -43, 12, -29, -13, -24, -25, -28, 44, 42, 14, 23, -4, 10, -5, -47, -20, -47, -22, 22, 28, -7, -48, 8, 28, 2, -40, -45, -4, -44, 17, 34, -50, 5, 36, 26, -8, -23, -22, -33, 36, 41, 22, 11, -45, -35, 50, -50, -29, -5, 11, -28, -30, 0, 44, -13, -23, -7, 40, -12, -9, -9, 9, 6, 26, 45, -44, 0, 46, 26, -19, -44, 25, -11, -36, 8, 34, -39, 26, -9, -12, 12, -49, -22, 10, -22, 49, -13, -44, -21, 36, 41, 5, 36, -15, -9, 42, -47, 33, -46, -5, 24, -49, 3, 37, 8, -18, -29, -4, -45, -27, 42, -2, 45, 43, 0, -10, 16, 38, 41, 28, 30, -49, 40, 49, 27, -8, -19, -39, -28, -35, -7, -49, -44, -30, 7, 44, -28, 9, -26, -16, 48, -6, -44, 18, -19, 2, 18, -26, 44, 33, 35, 26, -49, 35, 10, -42, 0, -49, -6, -19, 21, 29, 46, 24, -19, -43, 45, 34, 38, -31, 14, -30, -44, 38, -42, 35, -49, -32, 9, 19, 8, 18, -6, 11, -41, 14, -25, 39, 9, -33, 8, -30, -5, -39, 27, -19, -12, 48, 30, 4, 4, -41, -16, 29, -45, 17, 11, -42, -22, 20, 29, -45, -7, 13, 16, -7, 27, -37, -42, 49, -28, 6, 6, -36, 13, -44, -31, 13, -32, -45, 0, -12, 14, 20, 48, -26, -28, 38, 7, -40, -17, -20, -13, -5, -39, -42, -38, 13, -31, 8, 34, -29, 14, 9, -10, 30, -6, -47, 19, -6, 7, 32, 43, -28, -19, 12, 42, -43, 34, 30, 30, 34, 28, 40, -26, -18, 15, -35, 4, -15, 21, 29, -44, 18, 36, -43, -48, -16, -15, 49, 28, -21, -36, 42, 17, 47, 36, 7, 48, -23, 44, -9, 46, -33, -46, -42, 33, -42, -33, 5, -36, 28, 27, 11, -16, -11, 0, 9, 49, 5, 33, 24, -10, 3, -34, -26, 42, 36, -42, 5, 38, -28, -49, -6, 14, -13, -45, -3, -7, 28, -44, 15, 11, -21, 42, 25, 1, 47, 43, -15, -16, 15, -1, -48, 25, -47, 4, 1, 8, 20, -31, -32, -43, 16, -24, 28, -43, -33, -22, -5, -15, -48, -42, -41, 33, 15, -50, 40, -47, -3, 50, 45, -33, 27, -6, -36, 0, 10, -47, -32, 37, 43, 26, -40, -23, 6, 24, 3, 14, -4, -47, -17, 25, 3, 37, 10, 50, 45, 32, 42, 42, 32, -31, -48, -11, 18, -28, 18, 43, -19, -27, 0, 7, -9, -16, -19, 3, -6, -3, 35, 34, 41, -2, -17, -35, -40, 46, -32, 41, -22, 50, 3, 2, 16, 31, 31, 25, 31, -19, 49, 32, 5, 12, -47, -40, -48, -24, 29, -7, -33, -21, 37, 19, -4, -17, 25, -9, -28, 49, -11, -36, 29, 6, -37, 28, -39, -16, -26, 27, -49, -33, -16, -42, -40, 39, 16, 18, 45, 23, -13, 19, 24, 30, 8, 15, -10, -27, -1, -46, -30, -45, -47, -42, 18, 17, -42, -33, 8, -8, 29, 15, -22, -3, 0, -9, -15, 25, -6, 50, 47, -16, -45, -14, -15, 33, -35, 21, -29, 18, 18, 12, 24, -32, 30, 50, -33, 22, -34, -10, -18, 33, 4, 31, -27, 26, -11, -23, 16, 49, 24, -12, -30, -14, -49, -45, 1, -46, -4, -8, 45, 50, -11, -40, 30, -37, -49, -12, 12, 12, -33, 46, 43, 28, 42, 39, -50, -34, 3, -12, -3, 15, -36, -29, -31, 42, 38, -8, 5, -27, 47, -8, -30, -3, 15, -35, -11, -30, 1, 50, -43, 27, 4, 35, 31, 7, -46, -9, -21, 44, -42, 44, 44, -10, 0, 6, 22, 50, 10, -45, -25, 23, -45, 2, 10, -18, -6, 43, -11, -27, 41, -6, -13, -22, 28, -43, 13, 36, 22, 0, 24, -45, -4, -2, 25, 47, 34, -19, 3, -15, 38, 48, 47, -32, -14, -34, 29, -35, 7, -7, 17, -2, 43, 0, 47, -46, 46, 7, -5, 4, 22, -34, -39, -27, 5, 4, 25, 28, -35, 36, 31, -29, -7, 44, -8, 28, -30, -43, -2, 49, -45, 30, -4, -15, 41, -28, -20, 24, 11, 33, 45, 30, 6, 19, 14, -14, 17, 44, 24, -34, -44, 1, -16, -49, -11, -14, 6, 50, -41, 25, 30, -5, 39, -46, -46, -24, -46, 10, -43, -20, 46, -30, 48, -30, 0, 28, 49, 8, -49, -21, 7, 41, 30, -31, -11, -22, -46, 38, -41, 32, 10, -50, -4, 47, 6, -37, -26, 39, -30, -35, 23, -19, -6, 13, 33, 22, 9, 47, 44, -32, -4, 44, 13, -21, -4, 37, -18, 31, -30, 44, 12, -9, 10, -8, 17, -25, -18, -18, -2, 33, -10, 21, -15, 21, 44, -29, -4, 32, -31, 36, -27, -8, 37, 49, 22, -35, -24, -6, -14, -38, 0, -49, 25, 46, 36, 8, -37, -2, -21, 47, -42, 28, -27, -10, 9, 38, 49, -19, -4, -30, -9, 19, 38, -49, -20, 5, -21, 12, -36, -33, -19, -37, 11, 31, 48, 1, -29, -37, 27, -17, 35, 29, 5, 2, -2, 12, -35, 29, -11, -13, -33, -28, -3, 31, -5, -29, 3, -11, -21, 4, 5, -9, -9, 11, 31, 2, 31, 2, 13, -50, 28, 18, -24, -34, 12, -10, 7, 6, 45, -13, 39, 15, 41, -6, -28, -31, -15, -9, -29, 9, -40, -23, -6, -29, 30, 12, -20, -40, -15, 27, -16, -28, -22, -28, 49, -35, 33, 38, -32, 39, 45, 12, -1, 34, 22, -8, -32, 34, -33, -45, -16, -37, 13, -42, -16, -49, -45, 48, -26, 22, -1, 44, -44, 12, -23, -49, 14, 50, 8, -27, 11, 48, 20, -13, 42, 11, 14, 0, 43, 1, 45, 23, 47, 12, -40, -3, 50, 3, 40, -1, 23, -13, 35, 37, -43, -45, 17, 18, -45, -19, -13, 6, 33, 49, 13, 3, -37, 13, -1, -4, 3, -32, 24, -12, 14, 48, 32, 9, -18, -19, -15, -27, -8, 20, 20, -5, -4, 18, -37, -6, 1, 39, -1, 14, 26, 13, -28, 33, 20, 19, 8, 22, 41, 23, 3, 48, 20, 38, 43, -25, -7, 25, -38, 3, -11, -47, 2, -50, -45, 4, 15, 40, -33, -22, 2, -18, -48, -31, -47, 31, -43, 35, 35, 32, -23, 15, 22, 48, 35, -25, -17, 20, 43, -2, 38, -2, 22, -24, 14, -18, 21, -2, 12, -19, -32, 49, -1, -29, 39, 16, -42, -16, 20, 28, -47, -14, -23, -42, -16, -26, -42, 10, 1, 46, -34, 25, -42, 3, -46, 12, -4, 39, -32, 48, 15, -6, 20, 22, 35, -18, 29, -8, 37, 21, 43, -25, -6, -16, 30, 2, -41, -10, -34, 20, 15, -40, 12, 16, -5, -31, -38, 36, -34, 42, -19, 48, 48, 47, 34, -35, -28, -40, -37, 16, 20, -6, 24, -18, 32, -6, 3, 0, 36, -28, -22, -45, -12, -46, 45, -11, 39, 27, 31, -30, 8, 38, -31, -27, -48, 35, 21, 6, 42, 20, 19, 19, 25, 12, 35, -4, 39, 38, -32, 49, 48, -38, 38, -6, -19, -21, 34, -9, 21, -9, -44, -48, -14, -48, -33, -9, -42, 6, -27, -44, 46, 38, -9, 47, 7, 34, 5, 7, -33, -12, -1, -18, -23, 5, -26, -37, 4, 33, 33, -44, -47, 44, -21, 11, 6, -14, 4, 34, 14, 1, -48, 26, -44, 19, 19, -17, 45, -35, -43, -30, -40, -1, 36, -45, -36, -40, -24, 28, -6, -13, -47, 27, -6, -41, 3, -22, -39, 5, -11, 33, -14, 15, -31, -39, -13, -21, -4, 31, 23, 20, -9, -46, -3, 42, 48, 0, -39, -41, -14, 15, 16, -37, -4, -31, 1, 17, -25, -4, 28, 22, -48, -49, -10, -21, -14, 30, -48, -42, -43, -42, -34, -27, 21, -37, 3, 29, -33, 37, -12, -4, -24, 41, 20, 47, 40, -17, -32, -45, -21, 41, -39, -36, -12, 13, 13, -36, 7, 49, 16, -50, -44, -42, -50, -46, -4, 49, -41, -49, -28, 42, 5, -32, -13, -4, 33, 25, 24, 48, 1, -2, 20, -28, -1, -34, -3, -49, 18, 11, 34, -38, 10, -40, 37, 46, -24, -16, -33, 34, 17, 10, -10, 45, -8, -2, -40, 16, 0, 1, 34, -8, 7, 27, 19, -22, -20, -23, -1, -15, 41, -32, 16, -39, 49, 37, 25, -27, 14, 41, 29, -30, 43, 47, -25, -16, 44, 29, 7, -9, -22, -22, -42, 27, 21, -49, 24, -49, -33, 18, 6, 20, -28, -32, -32, 7, 32, -2, -6, -23, 24, -1, -40, 4, -42, -37, 47, 42, -30, -3, 7, 18, 46, -42, 16, 27, -33, -39, 36, 27, -35, -14, -31, -31, -36, -26, -34, -39, -9, -12, 5, 2, 20, 21, 37, -4, -26, 34, -1, -18, 23, 35, 32, -22, -48, -12, -47, -14, 44, -45, 41, -41, -39, 15, -48, 14, 13, -16, -27, -4, 1, -17, 33, 29, 43, -26, 18, -22, 50, 41, 13, 2, 7, -10, 36, 45, 0, -33, -10, 48, 10, -27, -4, -23, -15, -30, 5, 18, -25, 3, 36, -7, -18, -25, -29, -31, -49, -10, 3, 6, -33, -46, 45, -5, 24, -30, -29, -48, -42, -49, -23, -17, 2, 8, -41, 32, 42, -49, -3, -45, -7, 3, 20, -15, -43, 32, -41, -18, 50, 40, 42, -32, -33, 0, -28, -50, 8, -48, -41, 20, -2, 5, 39, -35, -12, 45, 25, -7, -43, -43, -6, -40, 46, -26, -34, 44, 32, 4, 28, 5, -7, 2, -16, -12, -49, 47, -26, -13, 17, 29, -19, 28, 27, -10, 28, 20, -44, 21, 32, -33, -34, 31, 32, 26, 8, -40, 0, -44, -24, 8, -14, -46, 11, 21, 23, 50, 39, 28, 4, -35, 42, 41, 23, 5, 0, 17, -5, 10, 27, -18, 4, -33, -39, 23, -30, 46, 27, 22, -25, 28, -30, -29, 4, -5, -10, -46, -7, -35, -16, -46, 11, 39, -25, 10, 0, 18, 5, -1, -15, -27, 28, -21, 18, -3, -29, -18, 18, 45, -1, -28, -41, -15, -34, 2, 40, -43, -7, 10, -45, 20, 39, 30, -14, 3, -28, 40, 6, 0, 7, -32, -24, 38, -26, -30, -26, 0, 20, -16, 19, -1, -36, -27, -2, 17, -44, 43, 30, 3, -13, 43, -6, -42, 4, 32, 1, 26, -2, 50, 4, 32, 19, 25, 28, -48, 17, 50, -13, 19, -2, 41, -43, 44, 34, -6, -22, 28, -2, -27, -30, -28, 44, 47, -23, -19, -29, 11, 16, 22, -45, 14, -29, 0, 17, 6, 21, 4, 50, -9, 1, 10, -32, -50, -10, 12, 37, -3, 30, -19, -1, -37, -34, 45, 46, -21, 0, 47, 41, 11, -27, 12, -37, -17, 8, 14, 35, -18, 7, -33, -39, 23, 15, -49, 19, 33, -23, -9, -48, -3, 50, 50, 38, 36, -38, 6, 37, -48, 12, -13, 8, -23, -25, 33, 40, 14, 23, 23, 10, 6, -50, -19, -19, -24, -38, -34, -23, 38, 1, -15, -4, 15, -19, -19, 19, 44, 4, 22, 29, 38, -11, -23, 30, -20, 36, -20, -25, -47, 7, 28, 50, -28, 18, 9, -8, 38, 43, -25, 16, 17, 4, -4, 31, 8, 50, 24, 24, 49, -35, 7, 38, -50, 39, -6, 43, -45, 40, 1, -32, -8, -32, -12, -19, 14, 38, -4, -38, 23, 31, -15, 35, 19, -24, 21, -27, -31, 35, -42, -12, 32, -50, -40, 23, -50, 40, 30, -7, 0, -34, 15, -28, -10, 8, 23, 43, 48, -26, -34, -32, 31, 31, -5, -16, 23, -28, 35, -7, -42, -19, 39, 42, 8, -9, 11, -32, 42, -16, 25, -43, 38, 40, -8, -6, -45, -38, -40, 19, 18, -44, 4, 4, -32, -45, 38, -42, -31, -26, -1, 21, -1, 50, -13, 15, 6, -29, 5, -15, 0, 17, -50, -3, -18, -27, -2, 18, 7, -3, 6, 13, 48, 2, 9, 39, -8, -10, -25, 8, -2, 13, -46, -7, -33, 6, 38, -11, -5, 7, 34, -27, -23, -5, 17, 21, 3, -18, 16, 33, -16, -12, -4, 20, 40, -46, -14, -50, 35, 5, -44, 13, -43, 43, 13, 6, -23, -25, -17, 45, -29, -31, -37, -28, 16, -32, 27, -12, -14, 48, -50, -32, -36, 38, -50, -20, 50, 1, -8, -5, 35, -1, -31, 11, -8, -46, 28, 15, -39, 6, 9, 4, 20, 15, 21, 22, -24, -23, -14, 28, -32, 43, 0, -38, -6, -45, 43, -50, -26, 48, -25, -38, -32, -41, -6, 20, -36, 36, 49, -20, -43, -21, 47, 46, -50, -35, -40, -24, 35, -11, 32, -7, 19, 6, -3, -11, -12, 33, -48, 4, -50, -28, 16, 11, -17, -34, -3, 40, 2, 10, 36, -40, -36, 39, -40, -44, -4, -43, -46, 30, 36, 15, 40, 12, -30, 20, 39, 43, -39, -40, 3, 30, -41, -35, -36, 7, 28, 33, -47, 45, -29, -16, -37, 43, -20, 23, 19, 40, -40, -15, 23, 29, -27, 34, -11, 49, -9, 36, -30, 45, 30, 0, 30, 4, 34, -47, 11, 36, -26, 45, 19, -37, -10, 6, -13, 11, -10, -6, 29, 45, -35, -32, -14, 34, 28, 10, -25, 43, 28, 13, -38, 40, 36, -17, 47, -28, -31, 3, 22, 7, 8, -31, -12, 27, 39, 40, 47, 42, -19, -10, 18, 17, 36, -30, 46, -27, -35, -19, 32, -25, -48, 48, 31, -44, 45, 37, -35, 2, 37, -47, -6, -19, 47, 32, 27, 7, -38, -29, 44, -7, -7, -21, -28, -39, -37, -15, -6, 21, -27, -48, 27, 0, 24, 4, -13, 41, 36, 31, -31, 46, -49, 50, -25, -49, 16, 33, 23, -9, 34, -11, -42, -49, -23, -48, -35, -47, -28, 43, 26, -45, 23, 4, 30, -43, 22, 47, 30, 35, 13, 16, -10, -11, 42, -24, -12, 2, -11, 1, -14, 16, -32, -17, 27, 34, 15, -41, 1, -9, 9, 30, -49, 40, -50, -1, -15, 46, -29, 48, 47, 31, -15, -48, -7, -35, -40, -41, 0, -9, 34, -26, 48, -45, -7, -43, -17, -10, -50, -48, 1, 40, 26, -8, -4, 32, -32, 19, -4, 27, -46, 13, -6, 13, -6, -15, -42, -28, -19, 42, -6, -23, 1, -40, -32, 13, 14, 22, 6, 15, -47, -22, -47, -50, 41, -33, -38, 19, -2, -4, 35, -21, -24, 21, -23, -49, -31, 24, 27, -27, 26, 21, -7, -30, -29, 22, 7, -40, 29, 2, -42, 16, 49, 1, -38, -50, -7, 24, -27, -46, 15, 30, 30, -31, 13, -36, 17, 3, -40, -28, -50, -9, -4, 17, -13, -49, -6, -24, 47, 26, 10, 31, -40, 18, -22, -26, 27, 3, -3, -5, -10, -10, 10, 50, -40, -7, -19, -2, -45, 6, -45, -4, 12, -2, -29, 16, -32, 4, -17, -10, -44, 6, -35, 8, -13, -42, 26, -17, -5, -14, -8, -4, -45, -13, 10, -47, -46, 19, 9, 26, 37, 41, 26, 5, 31, 8, -44, 17, -20, 37, 35, 34, -3, -9, 39, -21, 0, -16, 11, 0, 36, -1, -21, -32, 45, -1, 3, 32, 35, -47, -39, -36, -36, -41, 10, -32, 2, 21, 6, 44, -42, -22, -44, 21, -34, 28, -35, 20, 32, -13, 38, 25, 45, -4, -41, -27, -1, 17, -8, -14, -6, 3, -8, 17, 49, -14, 38, -10, 43, -50, 42, -35, -14, -14, -44, -11, 0, 13, 46, -29, -8, 11, 3, -24, -22, -35, 34, -40, -30, -42, -24, 35, 28, -28, 0, 42, 29, -48, -35, -43, 39, -9, 22, -16, 20, 21, 48, -3, 3, -15, -45, 20, -39, 8, 14, -1, -8, -8, -2, 38, 25, 4, 40, 36, 32, 34, -1, -30, 37, -38, -9, 49, -36, -1, -50, 0, -17, -9, 11, 44, -19, 49, 10, 42, 3, 23, 7, 34, 49, -27, -24, -30, -33, 4, 17, -4, 3, -33, 22, 13, -2, 43, -16, 43, -12, 7, 6, -45, 27, 42, 45, 27, -31, -1, -42, 25, -37, -28, -3, 47, 29, 31, 5, -11, 46, 18, -12, 23, 35, -8, 46, -20, 19, 49, -48, -47, -24, 38, 50, -24, 49, -4, 9, -15, -5, 10, -9, -44, -21, -1, -4, 42, -11, -46, 19, 7, -7, 20, -19, 28, 26, 31, 23, -11, 6, -40, -11, -4, -49, 40, 1, 21, -2, 8, -13, -35, 37, 36, 27, -24, 23, -23, 38, 15, -6, -18, 9, -1, -5, -16, -10, 7, 26, 4, -46, -46, -29, -17, 14, 8, -34, 0, -2, -42, 23, -36, -22, 2, -26, 34, 30, 40, -23, -28, 49, -48, -18, 20, 18, 39, -34, 30, 16, 16, -17, -43, -6, 9, 5, 19, 50, -29, -18, -1, 20, 32, -5, 1, 23, 36, 15, -30, -27, -3, -38, 13, -46, -33, 24, -14, 3, -19, -23, 35, -6, -23, 14, 19, 24, -9, -18, -35, -38, -30, 8, -4, -12, 37, -8, -24, -14, -48, 25, -44, 7, -31, 28, 14, 23, -37, 28, 47, -2, 38, 44, 23, -14, -45, -45, -23, 27, -38, -38, -41, 29, -12, 48, 28, -28, -14, -43, 39, 9, 35, -46, 47, -24, -32, -8, -8, -16, 33, 4, 10, -4, 26, 5, 31, -33, 14, 45, 2, 38, 34, 40, -40, -50, 32, 45, -43, -32, 4, -35, 48, 15, -39, 42, 23, 11, 35, 47, 7, -30, -14, -46, 19, -19, 16, -41, 18, 37, 33, 11, -14, 44, -4, 30, -2, -27, 31, -25, 4, -44, 27, -10, -49, -21, 30, -31, 5, 23, -27, -39, 40, -36, 22, 31, -3, 10, 20, -23, 49, -48, -35, -15, -47, 48, -42, -39, 23, -7, 15, -32, -38, 4, 46, 14, 41, 19, -48, -26, 1, -35, -8, 5, 17, -43, 29, -7, -13, -28, -45, -8, -7, 29, 29, -28, -35, 49, 25, 50, -42, 31, -42, 34, 7, 14, 8, -28, 18, -32, -16, 46, 4, 31, -11, -37, 33, -38, 2, 29, 44, -12, 48, 33, 14, 5, -11, -5, 26, -44, -6, -29, -44, 33, 1, 50, 49, 17, 19, 16, -48, 7, 16, 49, 3, -42, 3, 29, 0, -35, -39, -31, 2, -20, 43, -30, -48, -30, 41, -23, -46, 20, 18, 22, -4, 34, -31, -13, -14, 7, -34, -9, 41, 44, 46, -19, 11, 45, 36, -30, 38, -18, 16, -45, 41, 15, -19, 13, -25, 11, -46, -40, 23, 28, 31, -2, 27, 41, 43, 11, 9, 26, 33, -49, 38, 8, 25, -26, 17, -9, 25, 20, 4, -13, 45, -8, 19, 2, 40, 48, -30, -31, -32, -18, 12, 17, 9, -32, -23, -29, 0, 37, 12, 11, 43, -22, 23, -19, 22, -26, -35, -36, 8, -3, -33, -28, 4, -9, -48, 20, 1, -40, 4, 37, 48, -26, 41, 25, 36, 30, -10, -14, 31, 4, -42, 48, -15, 6, 12, 31, -31, 34, -4, -31, -45, 22, 42, -22, 26, 49, 40, -2, -45, -12, -19, -2, -8, -23, -6, 14, -1, 3, 0, -8, 13, 44, -21, 31, 42, -9, -13, 36, 35, 15, 18, -36, 10, 45, -45, 27, -27, 34, -37, -39, 4, 17, -7, 34, 30, 42, 0, 29, 31, -13, -10, -7, 24, 45, 41, -35, 47, -1, 43, -13, 35, -46, -42, 26, -12, 36, -24, -19, 13, 44, -18, 39, -33, 25, 16, -46, 27, 8, 25, -47, -35, 24, 49, -3, 15, 26, -43, -7, -30, -25, -16, -36, -11, -21, 15, 29, -38, -50, -8, -23, -50, -11, -17, -38, 10, 15, -47, 38, 47, -38, -15, 45, 10, 7, 34, 39, -36, 42, 39, 34, -39, 25, 18, 10, -9, 39, -19, -49, -43, 40, 50, 3, -43, 37, -38, -22, -38, 7, 12, 36, -4, 28, 37, 36, 23, -13, 18, 18, 44, -11, -50, -49, -22, -44, 42, 6, 4, 22, -15, -44, 41, -41, 29, 23, -12, 7, 39, 47, 47, -11, -37, 31, -50, -34, -2, 35, 50, -35, -44, -36, -30, 15, 8, -3, 38, 22, 33, -1, -41, 1, 34, 17, -21, -17, 43, 27, 35, 14, 9, -43, 24, 14, 18, 6, -6, -2, 23, 11, -12, 26, -30, 49, 2, -6, 46, -23, 2, -42, 24, 42, 20, 10, -24, -29, 44, -21, 41, 33, -36, -36, 2, 25, 30, -28, 19, -35, 40, 36, 14, -6, -44, -6, -12, -1, -2, -3, -2, -11, -12, 6, 31, 12, 49, 5, 35, -49, -25, 45, -28, -33, 32, 37, 17, 9, -49, 43, -2, -13, -20, -11, 29, 2, 13, -18, 7, -1, 13, -48, 10, 31, -41, 15, 0, 43, -21, -26, -8, 37, 13, 8, 11, 48, -41, 13, 43, 9, 39, 48, 37, -31, -2, 48, 23, -24, 0, 6, 28, 28, -14, 48, -48, -22, 17, -4, 29, 18, -30, -9, -30, -49, 27, 18, -44, 24, -16, -21, -7, -5, 4, -50, 3, 29, -50, 12, 4, 35, 26, -24, -36, 30, -42, 18, 8, -28, -40, -27, 21, 47, 3, -20, -29, -37, -46, -34, 31, 32, 20, 39, 38, 31, -7, 28, 42, -2, 14, -47, -42, -15, 0, -19, 37, 50, -33, -36, -31, 7, -11, 15, 38, -38, 40, -38, 11, -23, -5, -36, 42, 34, -7, 44, -28, 50, 16, 48, 27, 15, -1, -38, -49, 25, 40, -17, -11, 18, 10, -26, 24, 26, 12, -23, 34, 5, -25, -24, -25, -36, -1, -45, 17, -47, -21, 26, -42, -9, -37, 41, -11, -48, -10, 42, -18, 28, 9, 13, 11, 28, -44, 25, -1, -12, 20, -4, 19, -25, 7, 22, 0, 37, 1, 43, -35, -3, -24, -18, -28, -6, 32, 49, 32, -29, -9, -18, -41, -4, 45, 28, -12, -5, 21, 0, -26, 31, -36, 7, 8, -25, -10, -7, 34, -29, 47, -14, 50, -37, -47, -27, 15, 12, 14, 15, -38, -24, 30, -34, 18, 37, 6, 21, 22, -33, -35, 0, 45, -11, -12, 5, 3, -7, -5, -19, -3, 10, 15, -13, -8, -47, -46, 50, 7, -14, -25, -42, -36, 37, 37, 48, 38, -25, 12, 36, 19, -24, 3, 32, -20, -19, -49, -33, -23, 20, 36, 49, 37, 41, -26, -12, -2, -47, 1, 32}; -static int32_t dotp_result_golden __attribute__((section(".data"))) = -228792; +static int32_t dotp_result_golden __attribute__((section(".data"))) = 75169; -int32_t result[4] __attribute__((section(".data"))) = {0}; +int32_t result[64] __attribute__((section(".data"))) = {0}; diff --git a/software/tests/idotp-32b/data/data_8192.h b/software/tests/idotp-32b/data/data_8192.h new file mode 100644 index 0000000..fdffb03 --- /dev/null +++ b/software/tests/idotp-32b/data/data_8192.h @@ -0,0 +1,18 @@ +// This file was generated automatically. + +#include "layer.h" +#include + +dotp_layer dotp_l __attribute__((section(".pdcp_src"))) = { + .M = 8192, + .dtype = INT32, +}; + +static int32_t dotp_A_dram[8192] __attribute__((section(".data"))) = {1, 42, -36, 21, 10, -30, 32, 36, 24, 24, 37, 49, -27, -48, -29, 2, -49, 37, -21, -13, -49, 13, 9, -30, -18, 25, 7, -29, 38, -2, 40, 8, -9, 41, 9, 29, -36, 11, 11, -4, 11, 0, 4, 13, -48, 50, 0, -44, -30, 22, -12, -33, -47, 38, 9, -37, -42, 39, 2, -49, 33, 41, 9, 20, -7, -43, -4, -16, 27, 30, -15, -1, -47, -49, -45, 3, -47, 3, 42, 12, -33, 39, -7, -17, 23, 11, 49, -37, 44, -3, -36, 21, 27, 36, 11, -11, 34, 29, 31, 2, -27, -25, 38, 9, -10, -22, -36, -6, 14, 38, 20, -42, 37, -50, -43, 37, 12, -40, 30, -43, -16, -16, -18, -46, -10, -23, -44, 22, 21, -39, -17, -18, -3, -28, 11, 37, -14, 48, -7, 35, 40, -16, 14, 48, 50, -4, 27, -48, -50, -46, 39, -37, -24, -42, 28, -36, 39, -9, 26, 0, 12, 45, 1, 45, -47, 43, 50, -28, -36, -8, -22, -15, -38, -19, 20, 8, 35, -23, 15, -9, -6, 11, 6, -45, -23, -23, -7, 33, -21, 11, 24, 41, 38, 11, 46, -50, -24, 11, 26, -48, 19, 21, -24, -42, 11, -14, 46, 0, -7, -27, 28, 8, -19, 45, 37, 1, 11, 7, 1, -39, -12, -49, -48, 50, 5, 30, 8, -49, -49, 41, 3, 36, 50, 45, 46, -50, -32, -49, 2, -7, 39, -19, 19, -19, 17, 4, 24, 5, -34, -13, -27, 18, 47, 19, 35, -40, -35, 46, 22, 8, 19, 29, 42, -48, -31, 8, -15, -32, 39, 16, -32, -31, 45, 20, 1, -18, -11, -12, 31, -50, -40, 41, 6, 38, -1, -28, -20, 43, -9, 48, -44, -35, 39, 9, -49, -50, -3, -39, 18, -14, -19, -42, 48, -32, -3, 29, -48, -31, -27, 3, -18, -27, 24, 21, -15, -13, 33, 48, 38, 48, -26, 42, -33, 31, 15, 3, -16, 29, 10, -10, 49, -18, 17, -18, -37, -30, -3, -31, -43, -44, 16, -34, -18, -3, 25, 8, 35, -29, -21, -13, 0, 3, -43, -24, -24, 47, -30, -21, 46, -23, 13, 46, 18, 10, -3, -32, -47, -16, 13, -2, -34, -7, 41, -21, 42, -5, -45, 48, -14, -27, 42, -5, 2, 44, 48, 9, 46, 12, 34, -19, 36, -18, 16, -33, -26, 44, 3, 7, 16, -5, -27, -19, -4, 35, -28, 15, -24, -49, 39, -34, -18, -42, -8, -3, -12, 42, -9, -25, 48, -1, -26, -27, -38, 9, -44, 6, -15, -6, -31, 14, -43, -35, -37, 25, 36, -36, 41, 47, 15, -19, 36, 12, 35, 0, -26, 7, 12, 11, -29, 7, 7, 35, -2, 1, -9, 19, -36, 3, 9, 50, 46, -43, 2, 9, -46, 17, -45, 45, 43, -4, 48, 4, -11, 1, -35, -38, -21, -32, -34, 12, -32, 41, 7, 4, 39, 50, 39, 11, -28, -42, -39, -50, 7, -50, -17, 45, -3, 38, -50, -35, 10, 13, 12, 18, -29, 42, 16, 25, -25, -35, 0, 50, 35, 6, -22, 27, 41, 18, -4, 43, 11, 18, 25, -35, 39, 39, -3, 34, -12, 49, -18, 43, 50, -28, -41, 18, 49, -17, 1, 44, -41, -32, 7, 45, -50, 18, -47, -35, -27, 29, -49, 41, -19, 40, 33, -27, -39, -1, -16, -18, -18, 10, 0, -8, 50, -39, 16, 14, -18, -11, 23, -8, -7, -22, -38, -39, 44, -5, -49, -16, 36, 30, 39, -43, 42, -25, 23, 39, -17, -44, 17, 7, 24, -22, -15, 38, -30, -15, -41, 50, 22, -27, 13, 48, -2, 48, -15, 31, 45, -27, -28, 11, 45, -14, -39, 4, -38, -28, 38, 48, -21, -34, 11, 33, 38, 35, -38, 8, -32, -2, 49, -39, 10, -32, 25, -42, 20, -23, 27, 44, 1, 32, -35, 18, 48, -39, -26, 1, 34, 49, 2, -28, -35, 6, -12, 2, -9, 7, -12, -37, 44, -46, -16, 36, 42, 24, -33, 25, -42, 23, 7, -34, -44, -5, -38, -11, -9, -42, -1, -24, 15, -46, -22, -14, -13, 32, -43, 14, 35, -34, 20, 38, -6, -47, -15, 19, -20, -32, 10, 3, -12, 40, 23, 39, -32, -12, 16, -6, -38, 41, 7, -31, 41, 21, 10, -12, -50, -48, 26, 41, 11, 12, -26, 5, -18, -13, -45, 7, -7, -6, -19, -6, 10, -4, -30, 29, 34, 24, 50, -15, 48, -32, -31, 6, -33, -4, -2, -37, -36, -20, -50, 3, -48, -35, 36, 6, 24, -39, 23, 45, -35, 21, 25, -27, -23, -43, 41, -15, 39, -43, 7, 9, -1, -23, 41, 50, -10, 49, 13, -24, 12, -34, 22, -18, 33, 26, 41, -22, -38, -5, -16, -45, 31, 18, -4, -26, 15, -41, 5, -21, -46, -18, 14, -33, 45, -2, -40, 34, -25, 12, 38, 35, 8, -24, -2, 26, -18, 47, 48, -50, -30, 4, -45, 41, 30, 18, 44, -46, -48, 2, -28, 50, 2, -14, 23, 23, 32, -34, 34, 27, 22, -50, 0, -6, 26, -47, 11, 14, -19, -17, 41, 44, 21, -12, -25, -17, 3, -48, -1, -39, 14, 3, -46, 43, 43, 6, -34, -4, -28, 28, 50, 34, -37, 15, 24, 0, -13, 13, 47, -13, -1, 47, 31, -21, 28, 40, 0, 12, 47, 1, -13, 46, 37, 28, -21, 0, 30, -46, -22, -47, -41, 5, -34, 23, -34, 33, 37, 18, -17, -45, 2, 15, 26, -8, 24, -28, 4, 29, 44, 24, -35, -43, -47, -47, 5, -26, 16, 45, 16, -24, 42, -19, -1, 10, 0, -32, -30, -46, 31, 41, -9, 10, -29, -30, 19, -50, -46, -39, 39, -5, -17, -2, 27, 39, -6, -24, 22, -25, -4, 35, 5, 43, 12, -3, 10, 30, -25, -15, -50, -43, 48, 1, 28, -4, 5, 35, -37, 39, -23, 36, 27, 37, -49, -25, -37, 8, 5, -44, -48, -28, -33, -13, 48, -36, 13, 38, 50, -23, 23, -12, 6, -34, 35, 39, -7, -26, -34, -38, 33, -26, 17, -41, 16, -33, 49, 35, -17, -43, -11, 32, -9, -10, 50, -45, 1, -25, 13, 47, 8, 5, 8, 19, 50, -18, 2, -29, -30, 19, 19, -47, 43, 24, 11, 11, 43, 44, -27, 4, -42, -48, -20, -11, 50, -15, -27, 44, -45, 15, 33, 41, 24, -47, 28, -45, 43, 0, 11, 6, 15, 28, 24, -43, -25, 0, -6, -7, -46, 19, -25, 17, -32, 33, 46, -31, -39, -4, -50, 39, -37, 13, -13, -14, -40, 49, 26, -48, -18, -45, -1, -41, -46, -28, -41, -7, -49, -38, -11, -49, 33, 14, 12, 50, 22, -34, -42, 24, -36, -27, -13, -16, 43, 44, -2, 18, 11, 9, -1, 27, 24, -42, -17, 25, 48, -16, -50, -11, 13, -29, 9, 13, 42, 21, -40, 50, -37, 9, -21, -16, 34, -14, -46, 32, 27, -25, 11, -47, 38, -9, 38, -33, -11, 21, -12, -37, -19, 0, -13, 46, -28, 12, -36, 46, -26, -34, 46, 15, 27, 2, 0, -12, 0, 19, -45, 16, -44, 0, 21, -9, 13, -36, -22, -18, 43, -24, -15, -22, -13, 6, 46, 50, -24, 4, -18, 17, 35, 15, -41, -46, 23, 46, -13, -38, -20, -4, 49, 37, 1, 5, -36, -22, -43, -46, -22, -4, 17, 25, -6, -49, -24, 44, -15, -15, -25, -8, -24, 18, -31, -40, 23, -13, -45, 21, -28, -4, 39, -5, -39, 39, -38, 11, 31, 38, 46, 9, -8, 25, 49, 17, -46, -14, 21, 41, -20, -42, 0, -22, 27, -11, -10, 35, -40, -28, -50, -5, 50, -30, 39, -15, 3, 36, 6, -50, 12, 3, 4, -11, -36, -30, -4, 22, 2, -42, 23, 1, 6, -25, -10, -16, 12, -26, 39, 24, -13, -49, -44, 31, 40, -17, 40, -34, -8, 8, 0, 3, -27, -26, 20, 1, 19, 37, -18, -2, -22, 12, -29, -25, -23, 34, -2, 20, 30, 33, -2, -31, 35, 41, 12, 10, -2, 20, -50, 45, -38, 43, 36, 0, 5, 32, 11, -19, -21, -22, -2, -6, 42, -21, -35, -11, -32, -33, -50, 27, -4, 15, 41, 43, -13, 0, 12, -47, -50, -43, -22, 4, -48, -19, -41, 23, 32, -17, 46, 36, 4, 41, -19, -1, -44, 42, -43, 14, 6, 16, 37, 36, 8, 21, 3, 50, 16, 0, 46, 41, -43, -17, -16, 45, 37, 27, -19, -5, -35, 17, -14, 3, 34, -37, 44, 4, -3, 31, -44, 23, -44, -18, -28, 34, -32, -32, -15, -22, 9, 31, -49, -50, -4, 18, -31, -40, -49, 16, 36, -39, -31, -46, -14, -13, 43, -42, 47, 2, -7, 48, 35, -27, 30, 23, -21, 8, 36, 45, 30, 30, -37, -42, -11, 15, -26, 22, -29, -47, -25, 7, -22, 47, 36, -14, 24, 19, -33, 34, -9, 49, -10, -13, -17, -34, -14, -26, 25, 36, 35, 34, -24, 6, -20, -45, 40, -11, 47, -39, 2, 20, -41, -6, -34, -25, 34, 41, 11, -5, 13, -49, 3, 14, 0, 2, -15, -25, -22, -30, -40, -11, -40, -15, 8, -12, 48, 3, 47, 4, -27, -29, 18, 5, -18, -15, -31, 32, 48, 30, 11, 47, 22, -25, 15, 22, 22, -11, -34, -50, 38, 10, -8, -9, -26, -12, -16, -48, 50, -7, 0, 43, 47, -39, -32, 50, -7, 8, -2, 10, -34, 23, 6, 4, -4, -39, 11, 29, 37, 32, -43, 44, -30, 30, 36, 50, 29, 19, 21, -26, 31, 38, -39, -36, 8, -25, -25, -4, -19, -41, -35, 20, -34, -28, -25, 34, 35, -44, -37, 28, -44, -42, -3, 21, 8, 36, 42, 31, 44, 43, -12, 48, -33, 8, -34, -37, -20, -27, 48, 9, -6, 47, -48, -14, -8, -11, 39, 4, 36, -12, -36, -47, 42, 35, -26, -38, 31, -18, -35, -9, 15, 4, 48, -9, -17, -21, -38, -38, -33, -19, 45, 48, -12, -5, -22, 11, 42, 11, 6, -35, 5, -41, -21, -26, 33, -46, 14, 43, -2, -48, -6, -37, -21, 17, -33, 11, -14, -26, -3, 14, 2, 28, 22, -36, -2, 37, 17, -39, 8, -14, 10, 50, -8, 19, -12, 5, 12, -5, 37, -40, 11, 26, 47, -26, 20, 1, -47, 8, 21, -31, 42, 12, 3, 23, 47, 6, 39, -10, -48, -45, -46, -46, 3, -4, 36, -2, -42, 48, -31, 10, -16, -1, 31, 11, -34, 37, -48, -19, 48, -38, 38, 22, 17, -37, 50, 47, -40, 5, 16, 41, -22, -42, 16, -26, 47, 25, -9, -42, 28, -11, -26, -46, -40, 8, 47, 37, 28, -13, 21, -46, -3, 39, -33, 19, -14, 9, -3, 26, -23, 18, 26, 30, -11, -6, 45, 11, 42, 7, 16, 5, -11, 47, -11, 40, 26, -18, -45, 37, -32, 29, -11, 41, 46, 8, 8, -3, -10, -38, -6, 38, 2, -9, 49, 12, -24, -13, 9, -44, -46, -6, 7, -20, -28, -9, -41, -19, 2, -21, -12, -20, 31, 49, -49, 27, 26, 42, -39, -12, 15, 45, -38, -5, -24, -34, 44, 47, 9, 13, 37, -16, 19, 32, -21, 20, 23, 45, 47, 12, -23, 9, 28, 43, -14, 42, -29, 17, -31, 45, 49, 17, 40, 13, -34, -39, -29, -34, -41, 14, -29, 39, 31, -1, -37, 13, -4, -22, 25, -15, 48, 1, 25, -44, -22, -40, -18, -45, 28, -19, 0, 24, 7, 36, -25, 47, -5, 47, -22, -47, 30, 48, -38, -12, -36, -22, -22, 24, -19, -49, -4, 27, 33, -29, 24, -24, 16, 30, 5, 41, 42, -30, -4, 29, 50, 8, 33, -45, -32, 6, 18, -48, -50, 7, -13, -36, -17, 10, -16, 13, -26, -27, -39, -33, -36, 29, -24, 21, 9, -5, 38, -34, 42, 2, -43, 28, -24, -5, -1, 20, -48, 42, 13, -7, 2, -27, 9, -48, -31, -5, -36, -26, 43, 27, 20, -34, 33, 49, -42, -13, -3, 9, 12, 35, -49, 37, 21, -40, 13, 26, 30, 21, -30, -33, 43, 13, 31, 44, -13, -19, -40, -6, 38, -18, -10, -43, -40, 35, 0, 37, -10, -34, 25, -5, -19, 28, 29, 3, 35, 41, -31, -18, 23, -11, -19, 46, -49, 46, -18, 26, -21, -18, 26, -25, -29, 15, -13, 39, -5, -36, 47, -7, -2, 24, 10, 16, -45, -42, -45, 22, 44, -19, -10, 25, -43, 21, -1, 41, 11, 33, 11, -44, 24, 33, 29, -47, -45, 7, -29, -25, -48, -10, 9, -37, 24, 31, -39, 36, -39, -38, -26, -6, -32, 4, 49, -6, -43, 42, 2, 4, -19, 0, -7, 31, 19, -33, 32, -29, -14, 45, 5, 8, -48, -23, 23, -16, 10, 42, 3, 12, 28, 46, -44, 25, -2, 43, 34, -20, 7, 10, -27, -31, -14, -47, 41, -31, 9, -27, -1, -2, 0, 45, -15, 47, 49, 15, 28, -17, -15, -45, -12, -9, 7, -39, -48, -33, -11, -30, -36, 46, 48, -25, -43, 49, 43, 36, -9, -7, -37, 27, -49, -14, 18, -13, -10, 11, 9, -37, 38, 33, -49, 19, -34, 38, -23, 15, -16, 50, -46, 14, -11, 25, 5, -15, -6, -28, -4, -20, -40, -41, 16, -37, 29, 23, 42, -41, 25, 43, -50, -46, -31, -43, -8, 25, -50, 6, 13, 33, -23, -14, -4, 50, 25, -14, -2, -7, 5, -23, 28, -45, 10, -31, 27, -49, 22, -14, -31, -25, -22, -50, -16, 19, 50, 8, 18, -18, 0, 27, -39, -31, 2, 37, -8, 47, 38, -1, -22, 6, -12, 44, 5, -8, -1, -28, -7, -13, 33, -28, -6, 1, 29, -1, -43, 34, -50, -43, -22, 45, -46, 35, -4, -17, 14, 4, 39, -8, 23, -21, 31, -34, -25, -43, -4, 25, 40, 21, 38, -5, 17, -18, -50, -32, -20, 29, -37, 2, -3, 18, 39, 11, 41, 15, 13, 19, 12, 22, -18, -10, 38, -3, -38, 22, 26, -20, 24, 17, 47, -47, -32, 19, 47, 31, -38, -28, 32, 24, -50, 37, 3, 20, 38, 34, -36, 14, 25, 20, -36, -30, -32, 9, 42, 38, -18, -2, 45, -16, -7, 39, -40, 48, 21, 27, 23, 15, -5, -42, -48, 34, -25, 21, -3, 15, 19, -23, 42, -25, -26, -39, -46, 47, -3, -14, 28, -7, 49, -36, -8, -3, 36, 19, -5, -8, -30, -28, 29, -4, -36, -26, -15, 24, 0, -36, 17, -30, -38, 35, -32, -17, 27, 17, 1, -24, -22, -23, -16, -43, -35, -15, -21, -33, -49, -2, 26, -47, 39, 38, 43, 24, -44, 44, 23, -12, -38, -20, 20, 12, 5, -9, 10, -9, 5, -15, 33, 17, -44, 3, -50, -7, -6, -4, -38, -29, -30, 35, 41, -42, -25, -42, -36, -41, 37, -9, 21, -27, 29, -2, -25, 40, -14, 17, -1, -27, -32, 49, 9, -12, 23, 38, -33, -32, -15, 23, 46, 4, 18, -4, -2, 48, 47, -18, -30, 30, -29, -3, -14, -36, -16, 41, 20, -19, -40, -41, 22, 27, 26, 6, -26, -49, 13, -16, -44, 34, -33, 16, -9, -12, -10, 24, -27, 9, -5, -32, 17, 39, -9, -19, -12, -15, 50, 46, -15, -48, 22, -43, 46, 19, -10, 17, -38, -2, 9, -49, 9, -46, -7, -24, -19, -30, -43, 21, -1, 16, -7, 7, -48, 35, 19, -49, 36, -7, -49, 30, -16, 47, 36, -21, -43, -29, -7, 7, -15, 18, 26, 42, -20, -4, 4, 29, 11, -21, 4, -35, -39, -34, -35, -39, -43, 33, -48, -35, -21, -28, 41, -46, 33, 14, -21, -30, 33, 19, -29, 31, 21, -19, -18, -35, 25, -13, 47, -37, -15, 46, -28, 15, 34, -49, 40, 22, 14, 24, 16, 1, 11, -28, -25, 17, 31, 4, -45, -16, -29, -8, -36, 35, 9, 50, -39, -2, -9, -13, 31, -6, -16, -21, 37, -21, 27, -45, 16, 29, -44, 1, -37, 22, -36, -30, -16, 15, 40, -49, -16, 31, 27, -31, 31, -41, -26, 15, -26, 3, -18, -15, 44, -37, 14, 29, 3, 1, -48, 48, -10, -45, -26, -38, 47, -43, -30, 47, 17, -26, 28, 17, -6, 9, -39, -19, 45, 41, -38, -20, 27, -31, -33, 42, 9, 12, -45, -19, 42, -8, -49, 9, -28, 32, -20, -46, 32, -17, -41, 38, -49, -40, -1, -20, 5, 28, 22, 36, 32, -42, 48, -30, 22, -23, 11, -44, 29, -35, 46, -47, -47, -11, -34, 50, 1, 42, 1, -15, -13, -1, 12, 50, 12, 11, 48, -44, -24, 41, 35, -37, 20, 50, 35, -46, 4, -49, 11, 40, -30, 28, -30, -41, 36, 7, -12, -46, 14, -38, 34, 39, 34, 2, 31, 50, -6, -19, -15, 30, 48, 9, -40, 12, -30, 1, 4, -25, 17, -17, 1, 31, 48, 42, 1, -22, -13, -9, -30, -9, -38, 13, -34, -42, -10, -50, -49, 9, -3, -22, 46, -41, 7, 9, -30, -23, 24, -17, -43, 8, 35, 21, -2, 28, -34, 9, 36, 37, -6, 32, 18, -19, -7, 14, 36, 50, -43, 26, 21, 36, -8, -50, 0, -27, 48, -27, -34, -46, -31, -30, 7, -20, 49, -40, 1, -36, 32, -44, -23, 0, 7, -46, -46, 43, 45, -43, 13, -41, -13, 45, 41, 30, 44, -43, -26, 22, 15, 28, -1, 16, -2, -15, 17, 27, -10, 38, 11, -41, -30, -15, -39, 40, -49, -38, 2, -19, 44, -35, -19, -19, 47, -40, -41, -36, -34, -11, -33, 4, 22, -26, 8, 27, 38, -29, -21, 33, 34, -7, -19, 0, -5, -30, 48, -19, 43, -12, -39, -4, -33, -30, -38, -30, -43, -5, -44, -28, 45, 24, 35, -29, 38, -29, 41, -22, -38, 31, -49, -22, 34, 28, 1, -24, -1, 44, 28, -28, 37, -7, 26, -29, -8, -14, 10, 46, 5, -48, 12, -32, -28, -22, -21, -12, -26, 50, -43, 7, -35, 21, -50, -46, -48, 14, -47, 48, 45, 13, 47, 38, -41, -30, -5, 40, -24, 15, -10, -38, -42, -15, 35, 39, 7, 3, -39, 30, 27, -37, -17, 2, -31, 24, -35, 44, 19, 5, 32, 50, 7, -47, -47, -31, -41, -27, 48, -25, -14, 34, 3, -30, 23, -13, -5, -47, 9, 6, -6, -31, -34, 20, -47, 42, -37, -48, 37, 50, 29, 7, 4, -47, -27, -17, -21, 31, -32, -20, 9, 9, -32, -2, 12, 32, -29, -27, 25, -21, 7, -20, 49, 13, -32, -3, -6, 49, 43, 4, 4, 46, -33, 12, 41, -4, 24, 6, -6, -18, -34, 19, -47, -31, -4, 40, -36, 19, -4, 27, 24, -42, 39, -35, 18, 10, -41, -1, -48, 26, 43, 19, 30, 0, -32, -9, -16, -5, -25, 18, 42, 13, -14, 33, -2, -30, 23, 13, -46, 49, 19, 39, -47, -12, -16, -50, -27, 6, 49, 19, -10, 3, -5, 9, 9, 6, -20, 33, -27, 38, -15, 34, -21, -27, -21, 35, 41, -44, -16, 4, 41, -37, -41, 29, -35, 3, 44, 38, 26, 19, -7, 22, -6, 49, 5, 33, 31, 6, -30, 17, -1, -18, 40, -44, 19, -36, 31, -19, 24, -31, 37, -36, -3, 20, -30, -9, -25, -37, 6, -14, 7, -30, 31, 18, -48, 36, 39, -14, 37, -2, -32, 38, 34, -39, 10, -10, -18, -1, 17, 20, 35, -18, 30, -27, 10, 10, 47, -23, 7, -8, -10, -12, 35, -2, -34, 47, 19, 19, 47, 14, 23, 34, -46, -49, -29, 6, 15, 23, 47, -35, 0, -12, 35, 25, 37, -11, -13, 9, 8, -41, 48, 13, 12, -2, 13, -19, -44, -30, -31, -25, 17, 35, -36, 34, 28, 35, 41, -37, -24, -11, 7, -23, -25, 12, 15, -26, -48, 21, -7, 46, -9, 48, -45, -12, 1, -28, 38, -1, -8, -32, 18, 0, -40, -39, 23, -43, -27, 41, -10, -15, 50, 34, 21, 4, -42, -4, -36, -3, 31, -9, 9, 33, 19, -39, -49, -44, 29, -48, -48, -24, -11, -18, 41, -50, -43, 50, -19, -3, 50, -47, 43, 19, -32, -19, -42, -39, -40, -5, -35, -50, 12, -30, -21, -38, -17, -47, -23, 44, 8, -24, 18, -26, -48, 46, 17, -26, -31, -17, -25, -46, 48, 10, 41, 42, -42, -1, -45, 32, 9, -7, -40, 15, -4, 22, 34, 37, 47, 35, -48, 25, 41, -21, 39, -30, -23, 39, 11, -18, 34, -16, 1, -17, -10, 0, -4, 31, 7, 24, 6, -28, -3, -29, -34, 18, -40, 43, -36, 40, -16, -18, 33, -35, -17, 15, 48, -11, -23, -4, -12, 19, 22, -31, -50, 21, 36, 12, 16, -47, 7, -26, -4, -13, -36, 12, -30, 48, 6, 2, -5, -37, 49, 25, -34, -12, -42, 48, 26, 28, 31, 46, -45, 40, -28, 8, 40, 47, -5, -13, -37, 49, 21, 11, -16, -32, -21, 27, 33, -26, -11, 37, -37, -25, 36, -29, -3, 32, 0, -48, -9, -32, 22, -23, 33, -6, 20, 27, 12, 22, -32, -4, -37, -13, 2, 10, -15, -11, 30, -21, -42, 13, -18, 1, 38, -37, 24, 2, 48, 8, 27, 43, -10, 17, 17, 41, -43, -49, 35, -10, 4, -35, 42, 11, -3, -21, -39, -16, -40, 13, -1, 34, -30, 18, -3, -31, 50, 16, -7, -18, 22, 10, -42, 17, -16, 30, 47, 37, 45, 14, -43, -6, 36, -4, -11, 25, 3, 25, -5, -4, -36, -32, -25, 1, 42, -29, -30, 0, -13, -31, -22, 0, -47, 4, 20, 41, -23, -47, -29, 25, -6, 16, 35, 15, 37, -17, 40, 4, -50, 21, 36, -13, -45, 35, -26, 31, -34, 10, -39, -45, 39, -24, -43, 32, 14, 6, 42, 48, -11, -37, -16, -3, 33, 5, -2, -38, 10, -2, -5, 11, -43, -8, -31, 46, 39, -12, 34, -2, 13, 11, 3, -42, 37, -14, -2, -10, -34, 37, -30, 0, 8, -12, 4, -10, -12, -38, 13, -40, -32, -40, 26, -5, -6, -50, -11, -32, 25, 21, 21, 10, -39, 10, -18, -6, 39, 41, 18, -43, -26, 40, -5, 36, -21, -4, 36, -2, -4, 33, 31, -33, 15, 17, 43, -18, -15, 31, 50, -32, -23, -11, 33, 46, 25, -36, -10, -12, -49, 12, -22, 23, 15, 0, 24, 26, -41, -37, 31, 0, 22, -12, -23, -48, 33, 19, -24, -49, 42, -13, -48, -35, 43, -11, -49, 30, -10, -39, -16, 14, 4, -6, 28, 39, 50, 34, 11, -2, 44, -26, -28, -27, -13, -23, -30, 3, -33, -15, 48, -6, 22, 2, -21, 9, 47, -19, 16, 16, -23, -7, 28, -10, 12, -28, 24, -3, -19, 6, 49, -18, -27, -12, -17, 5, -23, -14, -44, 17, -14, 5, 14, 14, -4, -31, -32, -22, 23, 9, -33, 41, -16, -8, 44, 40, -40, -2, -13, 13, 18, -43, -17, -3, 5, 25, 14, -20, -47, -1, 18, -21, 37, 8, 16, 24, -6, -47, -25, -24, -5, 13, 40, 0, -1, -45, 8, -36, -21, -9, 50, -14, -9, 50, -16, 36, -45, 17, -33, 22, -22, 26, 8, -4, -34, 45, -29, 17, 18, -14, -2, -38, -17, 35, 2, 36, 0, -48, -9, 47, -19, 0, 34, -5, -30, -7, -40, 17, -50, 41, 12, -27, 48, -38, 47, -40, 49, 0, -34, 48, 31, 35, -27, -32, -14, 34, -43, -23, -46, -34, 50, -15, -32, 13, 40, 47, -40, 3, -6, -4, -39, -30, -40, 41, -46, 30, 5, -31, -10, -5, -39, 19, -34, -32, -25, -3, 1, 45, 19, 4, 49, 24, -18, 11, 37, -28, -36, -24, 24, 13, 30, 0, 2, 27, 40, 31, 41, 0, -4, -47, -44, -16, -3, 22, 21, -6, 30, 30, 46, 45, 21, -32, 12, -13, 16, 8, 18, -38, -4, 10, -20, 29, 45, -29, 42, 35, -8, 16, 3, -41, -9, 13, -30, 29, 25, 15, -10, -27, -16, 5, -21, 6, 43, -4, -16, -32, -43, -25, 20, -21, -44, 16, 14, -15, -26, -14, -50, -36, -14, -38, -43, -46, 9, 22, -50, -15, -16, 15, 12, -28, -42, -17, -5, 27, -47, -21, 44, 24, 48, 21, -48, -37, 9, 26, -6, 45, -17, -6, 10, 32, -35, 15, -11, -34, -17, -35, 9, 15, 15, 39, -38, 5, -20, -17, -12, 16, -43, 36, 27, 4, -24, 42, 2, -12, 14, -34, -21, 2, -38, -30, -32, 2, -32, 6, -26, 35, -20, 30, 4, -28, -19, 11, 23, -41, 49, 21, 3, 1, -31, -19, -37, -1, -23, 2, -27, 28, -29, -21, 12, -47, 26, 8, 36, -43, 31, -39, -20, 27, -17, 31, 47, 24, 25, -2, 28, 6, 44, 42, -25, -33, 45, 35, -13, 30, 36, 37, -1, -43, -10, -45, 18, -7, 13, -22, -23, -40, 14, -32, -42, -24, -17, -7, 17, 49, 31, -36, 0, -38, 32, -2, 19, 5, 25, 0, -14, -34, 7, 36, 39, -22, -18, 9, 40, 38, 4, -41, -4, -28, 34, -30, -38, 50, -18, -27, -40, -34, 17, -4, -26, 43, 22, -30, 33, 32, 32, -39, -14, -9, -34, 50, -3, -23, -10, 48, -4, -33, 27, 48, 20, -38, 31, 50, -38, 49, -20, -49, -35, -42, 22, -13, 24, 3, 5, 35, 46, 49, 36, -6, -17, -42, 37, -43, -44, -15, -33, -48, -23, 19, -7, -30, -23, 3, 3, 14, 49, -30, 48, -38, 6, -2, 3, -41, 2, -7, -4, 2, 23, -5, -38, -14, -27, -49, 35, 30, 49, -37, -41, -16, -26, -48, -34, -39, 3, -27, -22, -8, -26, 49, 9, 39, 14, 33, -23, -35, -4, 30, 41, 7, 25, -24, 2, -9, 8, -4, 43, -17, -14, -45, -44, 45, 45, -26, -18, 4, 7, -44, 6, -39, -35, 29, -8, 49, 26, -44, 49, 0, 22, -19, 24, -43, 46, 36, 38, 21, -6, 35, 8, -47, 16, -22, -22, 47, 47, -23, 26, 28, 36, -7, 39, -47, 39, -42, -46, 5, 45, 33, -1, 24, -36, -19, -23, -29, -34, 8, 39, 20, 6, -25, -26, -41, -6, 32, -40, 26, 2, 21, 17, 44, -23, 24, 14, -2, -4, 1, 37, 3, 9, 6, -4, -20, -5, -25, -46, 33, 1, 24, 3, -18, -1, -13, -24, 47, -36, 45, 10, -30, -5, 18, -45, -13, 11, 35, 11, 31, 27, 23, -5, -38, 44, 43, -48, 43, -45, 42, -43, -7, -18, 30, 24, 26, -1, -40, 44, -23, 19, -10, -35, 17, 48, -3, 5, 13, 8, 39, 11, 25, -40, 50, 38, -33, -32, 36, 4, 31, -25, -45, -47, -22, 8, 47, -34, -8, 29, 15, -17, -43, -38, -43, 43, 45, 49, 43, 14, -8, -12, 30, 8, 33, 37, 35, 42, 35, -7, -42, -14, 23, -15, 50, 41, -23, -9, -8, 34, 37, -9, 15, 4, 21, -3, 40, -29, 50, -24, 42, 16, -38, -6, -41, 49, -42, 3, -24, -17, -50, -19, 38, 42, 20, 16, 33, -31, 43, -16, 48, 40, 39, 27, -34, -33, -6, 42, 33, 2, 40, 31, 17, 14, -50, 7, -25, -31, 36, -41, 8, 24, -10, -46, 14, -34, -29, 47, -10, 42, 17, 18, -40, 5, 0, -30, 48, 25, -25, -32, 9, 20, -4, 20, -25, -11, -46, -30, 27, -47, -28, 33, -36, 42, -43, -10, -32, -5, -23, 40, 17, -36, 48, -14, -50, 16, -27, -24, -11, 12, 10, -15, 47, 42, -27, -27, -47, 16, -17, 6, -2, 36, 2, -28, 18, 44, 2, 11, -10, 6, 9, 3, 19, 50, 6, -41, -11, -44, -13, 34, 10, 33, -48, 0, 35, -4, 17, 41, 25, -13, -15, -10, 18, -38, 36, 7, -1, -21, 11, 50, -26, -24, 0, 27, 6, -4, 49, -12, -35, -29, 34, 3, -30, 21, -35, 8, -20, -9, 23, -19, 8, -17, -42, 30, -40, 45, -41, 35, -34, 17, -3, 1, -26, -30, 50, 14, 12, 38, 0, -15, 30, 37, 15, -36, 45, -12, 19, -50, -28, -12, 6, 30, -17, -10, 42, 22, -38, 19, -45, 33, 1, -48, 30, 12, -2, 25, -4, 4, 13, 14, 30, 16, 39, -36, 49, -19, 45, 17, -33, 32, -8, -16, 27, 7, -18, -37, -17, 10, -47, 37, 8, -22, 32, -45, 46, -2, -11, 32, 14, 18, -24, 29, -45, -38, 13, 11, 48, -32, 25, 29, -8, 23, 38, -31, 44, 17, -7, -28, -49, -29, 6, 50, 21, -44, 27, 5, 16, -35, 32, 0, 31, 29, 21, 46, -39, 2, 24, -46, -24, -39, -34, -45, 46, -46, 6, -23, 27, 18, 8, -18, 11, -1, -32, 35, 18, 15, 43, -4, -12, 17, -18, -38, 33, 3, -44, 28, 36, -37, 36, -32, 3, 42, -31, -22, -27, 31, 12, 23, 6, -43, 39, 11, -22, 23, -34, 15, -45, 7, 18, -23, 11, -10, 18, 31, 39, 33, -10, -2, 40, -2, 25, 20, -48, -41, 47, 38, -16, 29, -49, -27, 23, -13, -29, -25, -8, 4, -12, 40, -22, -31, 40, -10, 3, -31, -32, 33, 48, 15, -21, 2, -17, -29, 16, -45, 28, -24, -41, 22, 46, 45, -3, 19, 8, 49, 8, -49, -22, 17, 14, 32, -25, 38, -41, 2, 28, 8, -29, 0, -3, -30, -29, 49, 47, -21, -26, -23, 14, -6, 17, -44, -2, -42, -15, 32, -50, -41, -15, 22, -5, -19, -19, -45, -3, -13, -34, 23, -24, 3, -1, -16, 34, -26, -23, -36, -47, 42, 22, -24, -25, -32, 41, -34, -8, -10, -9, -1, 33, -11, -12, -28, 45, 1, -4, 12, 46, 18, -8, -3, -17, -11, 24, 10, -1, 16, 11, 7, -18, 24, -35, 31, 43, -3, -41, 31, -13, -32, -15, 8, 12, 26, -5, -48, 23, 14, 40, -43, 0, 30, 22, -45, 38, -12, 9, -23, 46, 3, -14, -42, 31, 5, 8, 34, -49, 10, 7, 9, -11, -15, -14, 28, 41, -33, 47, 12, -29, -40, 7, 6, 26, -47, 35, -44, 10, 3, 37, 17, 41, 28, -50, 4, -48, 27, -13, -50, -13, 34, -22, -46, 23, 41, -30, 20, 16, -4, 33, 32, -16, 17, 18, -50, 17, -39, 9, -24, 5, -28, -26, -30, 10, 12, 1, 37, -26, 4, -5, -19, 4, 45, -46, -15, -2, 7, -12, 29, 46, 34, 10, -42, -45, -16, -12, -29, -10, -46, -9, 36, 30, 25, 36, 29, 16, -21, 6, 35, 22, -22, -14, 36, -38, -19, -5, -28, -6, -34, 34, 15, 50, -45, -33, 43, -29, -18, -21, 30, -19, -9, 27, -41, -15, -17, 22, -23, -40, 27, -12, -4, -32, -36, -23, -27, 21, -42, -4, -18, 11, 46, -32, 16, 23, -11, -4, 14, -22, -1, 47, -38, -50, -17, 42, -3, 26, -3, -2, 13, 10, -22, -12, 37, -25, -34, 20, -38, 18, -25, -2, 16, -44, 7, -2, 2, 14, 11, -34, -8, -26, -48, 28, -22, -19, -25, -35, -26, 3, -23, 22, 5, 14, 42, 35, 29, -10, 0, 20, 27, -22, 32, -32, 15, -10, -6, -36, -48, -40, 2, -5, -21, 6, -33, 0, -3, 15, 45, -43, -29, -45, 25, 6, -15, 28, 41, 6, -2, -6, 31, 15, 26, -6, 28, -31, 13, 42, 42, 16, 32, -48, 3, 27, 13, -11, 8, 4, 11, -47, 9, 24, 44, 45, 40, -21, -49, 11, -2, -42, 41, -20, 47, 10, 28, -3, -26, -15, -43, 22, 7, 50, -6, 11, -12, 45, 7, 30, 48, 50, 32, 13, -7, -22, 8, 20, 41, -42, 41, -45, -22, 7, -34, -35, 36, 44, -48, -30, 13, 39, -15, 50, 35, 11, -9, 25, -9, 10, -38, -40, 3, -35, -43, 8, 6, -11, 8, -49, 43, 43, 25, -41, -7, -40, 28, 29, 30, 39, -49, -1, -39, 39, -28, -33, 11, 45, 11, -13, 16, -13, 16, 43, 10, -50, 43, -6, 45, -23, -30, -38, -24, 49, -44, -29, 23, 2, 28, 28, -47, 45, -28, 19, 37, 33, 50, 33, 25, -18, -23, -43, -50, -14, 12, -29, 19, -30, 45, -16, 28, -46, 9, -5, -1, -3, -45, 38, 5, 8, -22, 20, 26, -33, -49, -43, 24, 46, 3, -13, -3, -24, -31, -39, -8, 10, -20, 40, 45, 10, 23, 16, 40, -16, 44, -36, -35, -38, -16, 24, 8, -30, 3, 24, -21, -3, -16, 35, -13, -20, 27, -27, -2, 45, 49, -19, 4, 28, 7, 48, -48, 29, 18, 34, -41, 32, -26, 17, 10, -22, -32, -8, 15, 23, 10, -8, -26, -31, -3, 32, 36, -27, -40, 47, 4, -23, 18, 12, 8, -46, 0, -30, -39, -1, -47, -9, 33, -13, -26, -37, 24, -19, -40, 10, -33, -24, 4, 3, 31, 36, 24, -30, -7, -46, 36, -10, 8, 38, 3, 23, -29, 32, 14, 13, 20, -47, 14, -36, 25, -29, 35, -4, 30, 42, -5, -37, -1, -31, -1, -18, 8, -8, 28, -39, -11, -31, 43, -13, -48, -23, 5, 39, 43, -38, 26, 15, -14, -2, 15, -15, 3, -25, 24, 21, -11, -8, -29, -31, -43, -22, -11, 39, -21, 30, 33, 4, -35, -5, 11, -44, 29, -6, 8, 5, -3, -24, 2, 36, 37, 22, -16, 0, 33, -14, 30, 44, 6, -43, 28, 44, 43, -31, 2, -39, -2, -34, 13, -9, 43, -22, -32, -40, 47, -1, 20, 7, -17, -31, -1, 37, -41, -19, 1, -36, 50, 33, -48, -14, -11, 21, -11, 5, -28, -40, 13, -43, 42, 43, 5, 9, -41, -12, -23, -2, -15, -38, 45, -15, 50, -25, 35, -47, 44, 31, 13, -13, 37, 36, -29, -49, -20, -40, 41, -5, 45, 11, 18, 13, -41, -11, -27, 48, -7, 9, 11, 36, -34, 14, 44, 44, 6, 4, 2, 5, 47, -42, -29, -38, 38, -3, -33, 25, -11, -34, -36, -36, 28, 12, -12, -38, 30, -19, -42, -11, -31, 39, 40, 34, 31, 26, 29, 22, 12, 25, -7, -13, 32, 9, 20, 48, -3, -33, -35, 4, -12, 17, 8, 38, 45, 11, -38, 30, 50, -45, 32, 26, 9, 39, -37, 44, 3, -47, -12, 21, -26, 26, -19, 8, 12, -13, 41, 2, 43, 16, -23, -48, 47, 29, -29, 45, -13, 21, 21, 11, 6, -45, 27, -19, 48, -41, -48, 8, 25, -2, 8, -20, 42, 18, 11, 1, 38, -10, -20, 34, 33, -29, -47, -38, -6, -9, -2, -31, 26, 30, 3, -15, 46, -50, -36, 26, -34, -27, 7, 21, 40, -28, -5, 21, -43, 8, 39, 8, -38, -12, 50, -23, 38, 10, -35, -49, 31, -34, -21, -38, 45, 42, 43, 31, -38, -8, 34, 43, -30, 4, 30, -11, 32, -36, 22, 1, 23, 44, 2, 36, 1, -21, -18, 6, 1, -42, 3, -50, -7, 48, 24, 47, 29, -42, -19, -36, -39, 46, 27, 6, -43, 21, -24, 11, -39, 14, -9, 11, -40, -8, 44, -34, 46, -19, 42, 34, 34, -11, -28, 5, -45, 35, -1, -14, 13, 3, 21, -2, 48, -40, 37, -2, -30, 15, 12, 32, -23, -34, -45, -32, 5, -23, 15, -13, -14, 17, 35, 39, -2, -8, -15, 7, -38, 1, 7, -19, 30, 49, 9, 32, 7, 48, 5, -23, -50, -9, 31, -3, -11, 46, 12, 25, 21, 37, 29, -47, -13, -24, -42, -35, 5, 25, -20, 37, -37, -26, -17, 16, -27, 22, -25, -31, 13, -41, 32, 16, -27, -46, 16, 7, -24, 29, -36, -16, 25, 2, -7, -25, -4, -17, 36, 44, -1, 33, -39, 36, -47, 36, -3, 4, -50, 38, 15, -21, -48, -30, 38, 33, -2, 35, 34, 11, 46, -13, -36, 1, 28, -5, -26, -30, 37, -46, 19, -4, 36, 17, 40, -33, -30, 41, 48, 35, -28, 13, 16, -11, -41, 38, 1, 21, 24, 10, 13, -46, 2, 4, -14, 5, 8, 42, 18, 22, 8, -49, 14, 9, 0, -21, -40, 41, 25, -12, 39, 26, 21, 12, 13, 10, 3, 41, 43, 22, 44, 7, 34, 5, -17, -20, 1, 38, 25, -50, 4, -29, -11, 50, -50, 14, 12, 3, -9, -30, 28, 30, -29, -13, 48, 29, -43, 11, -4, -34, -34, 39, -38, -34, -13, 30, 27, -6, -45, -16, -37, 21, 10, -36, 3, -24, -38, -20, -16, 9, -45, 18, 35, 7, -2, -28, 38, -17, -25, -4, -46, 39, -31, -45, 19, 8, 13, -33, -47, -34, -37, 27, -38, -44, -7, -36, -32, 12, -16, 30, -16, -32, -31, 49, -16, -19, -3, -7, -27, 10, -34, 20, -1, 14, 48, -19, -15, -38, 19, 7, -37, -14, 28, 17, -11, 8, 29, 41, -35, 11, -47, -6, 39, -23, 45, 15, -20, -48, -43, -27, -36, -8, -20, 22, -6, 15, -43, 20, 6, 29, 48, -21, 23, -33, 18, 42, -12, 9, 47, -8, -6, -28, 18, 43, -45, 5, -47, 42, -28, -45, -19, -33, -36, -11, 45, 22, 50, 23, 33, -45, 12, 16, -40, -8, -34, 45, -47, 12, 17, 30, -10, 32, -46, -19, 35, 19, -16, -29, 14, 33, -29, -40, 26, -48, -42, 9, 25, 36, -37, 46, -33, 22, -28, 23, 32, -4, 18, -4, 36, -21, -26, -23, 47, -26, 23, 27, 7, 43, -10, -26, 27, 48, -3, 47, -41, 48, 24, -40, 34, -30, 35, -6, -44, 30, 13, 13, -49, 25, -9, 31, 3, 24, -35, -33, 48, 8, 39, -35, -45, 6, -4, -3, -9, 25, 9, 26, -47, -49, 39, 8, -24, -24, 28, 21, -44, 12, -5, 12, -39, -38, -8, -34, 12, 30, -15, 34, -43, 18, 39, 29, -15, -23, 42, -4, 25, 50, -21, -28, -35, -37, 23, 20, 1, -14, -22, 16, -36, 49, -4, -5, 1, -32, 26, -30, 13, -14, -24, 4, -22, -31, -26, 19, 12, -15, -49, -29, 45, -35, -33, 18, 3, 49, -21, -6, -32, 36, -17, -38, -8, 11, 42, 49, -29, 1, 1, -15, 22, -32, -13, 19, 28, 6, -31, -42, -19, -47, -1, 31, -46, -31, 36, 24, -14, -29, 7, 17, 42, -7, -17, 26, -9, -42, 44, -44, 17, -32, 43, -20, -16, 6, 34, 10, -20, 32, 44, 2, -19, 15, 8, -41, -49, 15, 9, 37, -34, 45, -35, -35, -5, -12, -20, 37, -50, -40, 34, -47, 20, -25, -1, -39, 44, 30, 46, 24, 41, 45, 14, -4, 41, 2, 20, -49, -27, -47, -32, -25, 24, -11, -1, -8, 24, 16, -39, 16, -24, 3, 15, -2, -35, -49, 9, 3, -21, 33, -13, -23, -26, 45, -41, 9, -9, -11, 46, 26, -9, -4, -14, 29, -29, 6, 33, -24, -10, 29, -17, -19, 39, 38, 15, -39, -11, 22, 25, 39, 22, -41, 45, 47, -3, -31, -12, 9, 15, 14, 0, -15, -27, -24, -49, -20, 6, 27, 15, -22, -36, -39, 50, -23, 33, -27, -30, -41, 27, 50, -33, 37, -37, -17, 7, 25, -29, 19, -15, -6, -15, -29, 27, 29, 10, 49, 5, 38, 45, -18, -6, -15, -31, -33, -13, 16, -28, 45, -35, 8, 18, 17, -30, 27, 44, 27, 19, -39, -35, 30, 36, -37, 10, 20, -5, -19, -36, -7, -34, -10, 3, -7, 47, -46, -24, 36, 27, 28, -8, 46, -20, 48, -34, 41, 32, 3, 11, 36, -19, -11, -38, 33, -16, -46, 22, -22, 19, -26, 44, -29, 15, -6, 18, 40, 38, 21, -50, 33, -7, 36, 45, 24, -12, 3, 37, 24, -22, 3, 39, -35, 48, -31, -5, 16, 14, 7, 2, -50, 30, 15, -22, 33, 19, -43, -22, 0, -18, -48, 9, -16, 18, 40, 25, 33, -31, 22, -12, -47, -32, 40, -6, -8, -38, -38, 9, 6, 35, 41, 1, 2, 35, -8, 32, 21, 21, -9, 39, -25, -28, -8, 26, -23, -42, -31, 5, 32, -12, 0, -39, 28, 44, 4, 27, -40, -25, -9, -24, -40, -13, 47, -8, -32, 13, -45, -5, -9, 41, 14, 48, 21, 8, 1, -4, -44, -40, 10, 17, -26, -39, -25, -39, -8, 0, -14, -5, 2, 37, 29, -38, 38, 3, 6, -47, 24, 45, -2, -44, -40, 41, 3, 36, -6, -28, -23, 6, -25, -26, 3, -22, 32, 46, -15, -37, 27, -16, -21, 41, -34, 16, 29, -21, 42, -6, 28, 38, 0, -4, 2, 13, -13, 13, 36, 38, -44, -29, 30, 31, -10, 23, -41, 6, -44, -1, 40, 1, -18, -50, 2, 9, -17, -47, -34, -47, -8, 39, -47, -50, 20, 43, -1, 22, 10, -16, -43, -27, 32, -15, -1, -8, -24, -19, 27, -33, -23, -22, -35, 48, -4, 8, -20, -47, -14, -34, -12, -3, -5, 39, -3, -12, -47, -21, -21, -29, 24, 15, -39, 43, -15, -33, 39, 2, 20, -50, 7, 39, 36, 39, -45, 19, -7, 21, -27, 35, -32, 50, -33, 44, 50, -21, -9, -18, 23, 50, -39, 43, -24, -12, -42, -30, 25, -22, -18, 11, -36, -49, 1, -7, 3, -33, -48, -44, -8, 31, -13, -14, 7, -18, 8, 44, -40, 17, 31, 17, 47, 42, 37, -29, 15, -7, -45, -9, -26, 6, 34, 4, -35, 44, -37, -12, -23, 45, 41, 0, -2, -42, 7, -6, -29, -19, 18, 36, 18, -9, 2, 45, 8, 23, -12, -36, 20, -22, -48, 32, -41, 41, -22, 28, -16, -45, -39, -13, 26, 42, -32, 16, -43, -43, 33, -4, -47, 0, 34, 16, -6, -43, 36, -35, 26, 16, -42, 9, 27, 26, 20, -36, 20, 47, -10, -29, -27, 50, -7, -50, -41, 29, 21, 5, 38, -1, -39, 38, 30, 9, -25, 27, -10, -15, -28, -8, -45, 18, -8, -26, -33, 11, -38, -8, 27, -23, -33, 8, 9, 12, 6, 41, 0, 5, -24, -19, -42, 45, 33, 41, 46, 17, -5, 47, 16, -25, -43, -45, 29, -27, -3, 43, -6, -38, 18, -26, -31, 31, 31, 15, 23, -6, -4, 12, 25, 26, 4, 24, -32, -16, 2, -25, -37, -6, -7, 37, 14, 0, -8, 35, -28, 5, -32, 31, 25, 4, 41, 41, 9, 8, -18, -32, -23, 1, -2, -14, -25, 48, 47, 48, -11, 29, -13, 26, 36, 3, -29, -35, -23, -16, 9, -6, -5, 21, 4, 35, 34, -25, 34, -26, 14, -45, -28, 13, 36, -8, -28, 45, -21, 26, -33, 36, 28, 46, -30, 6, -28, 40, -6, -7, 31, 37, -4, -11, 0, -9, -44, -1, -3, 33, 40, -45, 40, -42, 6, -20, -30, 39, -11, -6, 26, -2, 36, -31, 50, 41, -34, -23, -10, 15, -26, 7, -10, -45, 24, -13, -45, -6, 24, -37, 15, -11, -48, 48, 46, -27, -32, -33, 13, 37, -16, 11, -50, 49, -26, -6, -2, 47, 38, -35, 47, 42, -32, -28, 32, -26, -35, 3, 22, -50, -9, -32, 46, -17, 29, 4, -33, -17, 38, -6, -45, -30, 19, 45, -3, -12, -20, -41, -21, -33, 9, 37, 22, 44, -36, -47, 12, -11, -42, -42, -25, -47, 30, -35, -36, 48, 1, 18, -46, -31, 28, -33, -49, 42, -38, -47, -9, 23, 10, 44, -43, 16, 12, -42, 43, -40, 48, 50, -9, -38, -15, -38, -39, -14, 23, 22, 1, 20, -49, 5, 9, -28, -11, 13, 34, -28, -22, 27, 39, 0, 18, 44, 38, -20, -1, -31, 4, 30, -49, -26, -38, 41, 19, 16, 7, 48, 31, 24, 33, 13, 18, 32, 35, 8, 9, 32, 11, -35, 37, 17, -36, 38, 4, -16, 4, -37, -2, 32, 49, -44, -21, 32, -2, 38, -35, 0, 21, 31, 41, 29, 32, -9, -34, 12, -6, 26, -44, -24, -41, -17, -15, -26, -45, -27, -33, 36, -45, -22, -26, 4, 30, -5, -27, 24, -25, 47, -23, -48, 24, -13, 10, 27, 0, 39, -3, -30, 3, 5, 43, 8, 21, 0, -31, 45, 35, 8, 20, -42, -50, -22, 12, 21, 5, 17, -16, -48, -44, -24, -50, 40, 29, 20, -7, 36, -10, 24, -9, -18, -1, 12, 49, -14, 8, 30, 48, -3, -46, -3, 45, -48, -4, 11, 48, -37, 12, 10, -20, 44, -34, -27, -28, 31, -1, 27, 28, 28, 19, -24, -36, -1, -15, -43, 28, -48, 11, -4, 26, 47, 37, 45, 10, -19, 43, -38, -50, -17, 11, 28, 27, 42, 47, 31, 20, 42, -20, 13, -26, -13, -37, -43, 40, 3, -49, 30, 50, 27, 38, 5, 43, 42, 33, 34, 10, -29, -16, 50, -35, -1, -8, -34, 29, 7, -49, -47, 34, -12, 47, 43, -45, 30, 38, 18, 18, -31, 13, -35, 0, -14, 22, 18, -9, 6, 15, -42, 49, 35, 13, 35, -29, -17, 4, -22, -13, 46, -33, 20, 14, 46, -50, 37, -47, -47, 31, -24, -8, 8, -19, -18, -23, 4, 49, 9, 19, 11, 29, -17, 36, 37, 5, -38, 5, -33, 3, 26, 50, -8, -12, 10, -9, 30, 28, -33, -28, 3, -21, 47, 7, 17, 16, 20, -33, -44, -11, 19, 35, 14, 17, -2, 1, -22, -30, 39, 27, -42, -4, 25, -9, 0, 5, 0, 19, -31, 37, -24, -13, 21, 14, 3, -27, -4, 20, 32, 35, 12, 6, 4, 9, 48, 11, -21, 42, -29, 24, 33, -22, -10, -9, 47, 14, -20, -21, -33, -34, -13, -37, 36, 38, 28, 5, -29, 16, 5, -32, 6, -7, 47, -16, -50, 1, 34, 42, 19, -14, 14, 0, -50, 40, -30, 2, -35, 10, 3, -11, -25, 29, 41, 14, 49, 23, 13, -8, -34, 8, -28, -44, -7, 2, 20, 28, -17, -5, 17, 27, 27, -35, 20, 45, -32, -49, -41, -1, 30, 50, -39, 19, -29, -19, 33, -50, 3, 7, 19, 32, -33, -45, -6, 46, -28, -28, -25, 26, -44, 28, -7, -24, -25, 46, 28, -15, 4, 13, 40, 6, 18, 10, -49, 4, 46, 29, 36, -13, 29, 27, -22, -25, -16, 28, 16, 36, -22, -17, 46, -10, -10, -28, 20, -48, 7, -19, -20, 31, -8, -44, -50, 10, -37, 1, 45, -45, -41, 20, 39, 47, -21, 49, -30, 9, 30, 46, 23, 12, -9, 0, 13, 25, 5, 29, -10, -19, -36, 11, -24, -23, 30, 13, 8, 7, -49, -15, 20, -38, -36, 38, 36, 9, -29, 12, 39, 46, 24, 23, -26, 50, -3, -8, -13, -10, -6, 37, -11, 46, -34, 37, 50, 6, -49, 45, 11, 37, -42, 17, 30, -34, -1, 43, -11, 7, 24, 34, -30, -33, 4, -22, -27, 23, -34, -33, -9, 33, 50, -6, 31, -34, 22, -37, -2, -22, 44, -47, 31, -31, -4, -42, 26, 28, -24, -36, 41, 50, -32, 39, 1, -25, 38, -25, -25, -5, 41, -2, 31, 45, 2, -48, 15, 46, -9, -32, -34, -18, 25, -2, 5, 12, -48, -2, 4, -25, 48, 21, 1, 49, -44, -5, -5, 49, -35, -27, 10, 3, 11, -50, -2, -26, -41, 29, -35, 7, 21, -22, 41, -45, -35, -31, 29, 20, 27, -8, -25, 39, 27, 20, -18, -25, -6, 33, 12, 16, 1, 17, -25, 24, -49, -37, -21, -2, -39, 39, -7, -18, -38, 27, 37, 47, -25, -30, -23, -3, 49, -11, 15, 22, 36, 28, 26, -28, 30, -3, -49, 33, -31, 8, -5, -48, 4, -39, -11, 15, 49, 27, -35, 32, -17, -7, -45, 26, 13, 49, -29, -33, -39, 1, 43, 0, 20, 45, -3, -32, -45, 33, -24, 2, 50, -3, -44, 8, 18, -40, -36, 13, -48, 18, -28, 2, -14, -42, -36, -48, 42, 19, -34, -25, -30, 21, -30, -40, -13, 21, 37, -16, -37, -37, -41, -39, -13, -17, -10, -41, -34, -34, 16, 11, 44, -50, -39, -47, -9, -38, 47, 34, 35, -47, 31, 18, -32, -49, -39, 30, 23, 47, -45, -43, 0, -40, 12, 6, -39, 22, -49, -43, -40, 2, 49, -41, 34, 33, -43, -15, 42, 25, -37, 3, 34, 35, -30, -1, 43, -12, -31, 37, 36, -44, -42, -50, -25, -13, -13, 10, -7, 35, -7, 23, 11, -45, -34, 0, -13, -27, 0, -41, 21, -30, 19, 34, 6, -12, 37, -18, 8, -33, 5, 41, 6, 45, 25, -3, -9, -24, 23, 1, -9, -19, -25, -26, 24, -28, 47, 6, 1, 36, 42, -20, 13, 20, -18, 34, -49, -33, -4, -18, 50, 47, 33, -16, 0, -33, 37, 21, -21, -7, 2, -41, 36, 1, -2, -40, 15, 7, 39, -15, -18, -4, -38, -11, 38, 17, -9, -32, 31, 50, 43, -32, 7, -28, 3, 29, 14, -39, -27, -17, 2, -43, -33, 6, -46, -25, -21, 3, -38, 32, -22, -48, 39, 7, 25, -49, 24, -23, 31, 26, 50, 35, 25, -49, 50, -44, -25, 39, 37, 25, -35, -28, -11, 9, 22, -19, -36, 50, -38, -46, 24, 23, 1, 26, -10, 2, -1, -36, -44, -11, -23, -19, 48, -36, 49, 34, 19, 14, -47, -40, -25, 10, -14, -28, 42, 34, 40, -11, 26, -28, -35, 43, 10, 17, 29, -20, 2, -26, -7, -39, 39, 50}; + +static int32_t dotp_B_dram[8192] __attribute__((section(".data"))) = {46, 41, -42, -39, 18, 3, 3, -23, 5, 48, 18, 47, 47, 26, 7, 27, 24, -9, -13, 17, 2, -18, 20, 5, 21, 50, 0, 23, -8, -36, -13, -36, -46, 42, 32, 3, 0, -41, -39, -47, 44, -33, 29, -15, -26, 36, 25, 47, -15, 50, 16, -42, 10, 2, -33, -8, -16, 12, 47, 27, -47, 42, -10, -6, -1, 28, -23, -9, 29, 25, 18, 47, -50, -12, 45, 39, -34, 40, 37, -16, -5, -9, -12, 39, -2, 11, -13, -28, -29, -47, -2, 8, 22, 17, 20, 36, -49, -2, 37, 44, -20, -11, -3, 0, -8, 47, 4, 37, -2, 39, 29, 6, 26, -36, -24, 17, 29, 13, 43, -21, -15, 16, 35, 35, -2, 25, 4, 34, 5, 17, 44, -7, -20, 7, 36, 2, 33, 28, -28, -23, -35, -14, -30, 28, -34, -14, 26, -32, -21, -6, -33, 27, 11, -15, 49, 33, 1, -32, -7, -44, -7, 17, -17, 15, 18, 4, -41, 45, -9, -10, 26, 18, -41, -41, 40, 9, 0, -30, -43, 14, 41, 27, 34, -21, 34, -2, -42, -34, 18, 7, 6, 11, 44, 1, 10, -11, -13, -8, 12, -32, 49, -1, -18, -38, 27, 46, 11, 42, -8, -2, -15, -41, 44, -45, 6, -50, 20, 7, 40, -30, 41, 29, 5, 36, -31, 3, -26, -23, -46, -30, -33, -4, 19, 6, 42, -32, 46, 14, -48, -9, -30, 48, -11, 16, -26, 4, 33, 1, -7, 47, 34, 5, 4, 36, 19, 26, 36, 22, 30, 15, -32, 32, -44, 12, -9, -9, 8, -31, 22, -34, -24, -4, -49, 12, 11, 49, -32, -34, 18, -12, 31, 20, 30, -12, -15, -11, -6, -47, -26, 18, -21, 25, 17, 37, -22, 22, 17, 0, -27, -37, 18, -33, -9, 6, 32, -39, 31, -34, -21, 37, 24, 48, -28, 30, -50, 28, -19, -42, -36, -23, -27, 9, -16, 35, -24, 32, 25, -31, 14, 34, -2, -50, -41, -4, 8, 45, 11, 35, -33, -5, -19, -24, 41, -33, -12, -2, 42, 31, -7, 21, 3, 44, -17, 20, -15, -33, -13, 8, -42, 22, 21, 0, -16, 31, -46, -37, 41, -21, -47, -12, 33, 13, -26, -23, 25, 15, 27, -29, -20, -28, -3, -31, -13, 4, 17, 28, 37, 38, -50, -44, 6, 44, -39, -46, -1, -9, -39, -33, 15, 23, 28, 43, -34, 17, 20, 11, -10, 44, -17, 19, -6, 7, 0, -17, -7, -36, 27, 19, -1, 50, -19, 16, -48, 35, 35, 23, 0, 16, 25, 42, -3, -34, -44, -38, 15, -47, -41, 37, -34, 1, -45, 32, 18, 45, 23, -42, 40, 26, 32, -30, -27, -47, -27, 8, 48, -48, 17, 50, -11, -3, 3, -16, 44, 5, 38, -11, 26, 17, -5, 27, -38, -24, -45, -34, -15, 48, 30, -49, 26, 1, 15, 1, 41, -8, 39, -29, 4, 16, 48, 9, 7, -39, 37, 18, 33, -12, -38, -10, 6, 2, -39, -38, 23, 46, 6, -11, 29, -6, -16, -48, -46, 39, -40, 20, 5, -41, -17, 16, 21, -20, 24, 20, 15, 19, -10, 12, -19, -31, 6, 47, -1, 29, -26, -39, 20, -12, -34, -6, -40, 19, -28, 40, 19, -13, -49, 35, 33, 38, 28, 42, 21, -14, -2, 1, -18, -29, -46, -33, -13, -14, 43, 44, 13, -41, 28, -9, -3, -7, 31, 36, 46, -35, 3, -16, 47, -23, -49, 43, -38, -10, 29, 8, 18, 41, 2, -6, -31, -27, 10, 40, 43, 7, -24, -25, -44, -9, -4, 2, 8, -13, 18, 36, 41, 47, 2, -36, 45, -25, -3, 44, -32, -42, 13, 42, 3, 0, -12, -47, -48, 13, -22, -40, 46, 7, 24, -24, 46, -30, -12, 44, -5, 15, 40, -15, 24, 31, 14, 12, 48, -16, -20, -23, -50, -26, -8, 33, 16, 12, 0, -49, 31, 13, 23, 18, -42, -49, -17, 9, 10, -20, -41, 25, -15, 34, -2, 19, -2, -48, 23, -46, 39, 10, 34, 39, -25, 21, -46, -36, -35, -50, -35, -14, -48, 1, -4, 44, -38, 29, 4, -30, 15, 3, -24, -13, 39, 7, 11, -5, 38, -40, 21, -43, 46, 20, 13, -30, 21, 12, 34, 13, -31, -43, 7, -5, -20, 42, -42, -36, 43, -25, -41, -22, 29, -15, 33, -14, 35, 20, -28, -10, 42, 29, -23, -3, -13, -20, -37, 46, 22, 40, 37, 26, 39, -22, 0, -2, -8, 41, 41, 21, 36, 42, -46, -9, -44, -9, -15, -24, 7, -5, 15, -26, 22, -24, -50, 36, 23, -9, 1, -26, 3, 16, -45, 7, 19, 2, 15, 7, 31, 36, -49, 25, -29, -14, -31, -27, 33, 14, 14, 30, -50, 43, -48, -5, 4, 24, 37, 35, 13, -6, -25, 26, 14, -27, 23, -16, -27, -23, 49, 29, -35, 8, 30, 3, 28, -35, -36, 47, -40, 14, 28, 39, 17, -8, 18, 48, -38, -41, 24, 31, 47, -10, -1, 36, 20, 8, -12, -48, 25, -44, -2, -25, -18, 50, -3, 28, -49, 20, -19, -47, -31, -15, -19, -23, 26, -50, 9, 5, -16, -21, 3, -15, 4, 38, 29, 7, 32, 14, 18, 0, -29, 37, 50, 2, 49, -15, 17, -15, 1, 2, 31, -1, 29, -10, -33, -29, 15, -30, 49, -7, -4, -12, -22, 3, 39, 34, -34, 29, 9, -20, 22, 44, 27, -2, 50, -49, -3, -37, 8, 46, 48, 7, 7, 0, 33, -49, -10, 32, 50, 31, -35, -47, -39, -22, -44, -37, -39, 48, -46, 30, -19, 23, -8, 30, 18, -6, -42, -2, -18, 49, 49, -33, -42, 11, 6, -22, 27, -26, -36, -45, -9, -22, 28, 42, -47, 31, 6, -2, -7, 29, 24, -37, -48, 11, 13, -6, 31, 7, -31, 7, 38, 6, 26, 17, 27, 46, 41, 1, -14, -43, -7, 47, -46, 18, -20, -6, -42, -19, -18, 16, -21, 25, -22, -48, 39, 6, -21, -42, -25, -49, 11, -48, -5, 17, -26, 0, -38, -7, -16, 4, 36, -42, -49, 10, -10, -7, 13, -20, -4, -49, 45, 31, 26, 18, 7, -7, 23, 5, -8, 38, -17, 50, -21, 20, 19, 4, 16, -38, -48, -25, 6, -27, 2, 19, -8, 9, 7, -2, -9, 25, 49, 15, -40, 47, 39, -33, 34, 49, 1, -5, -7, -29, 2, 8, 43, -21, -43, 47, 6, 22, -31, -26, -32, -46, 24, 28, 21, 32, 36, -24, -11, 45, -25, -24, 11, 32, -1, -9, -22, -12, 9, -10, -18, 32, 50, 32, 46, -35, -28, -44, -25, 45, -39, 21, -46, 41, 18, -2, -25, -46, -29, 28, -38, -23, -18, -28, 46, -33, -21, -25, -35, 26, -12, -18, -25, -3, 14, -13, -49, -45, -5, -1, -13, 37, -33, -24, -10, 21, 41, 23, -34, 11, -22, 7, 19, 27, -29, -45, -25, -12, -39, 48, -37, -29, 0, -28, -3, 20, -1, 38, -38, 34, -41, 4, -42, 28, 1, -49, -26, -38, 47, 0, 7, -17, -16, -48, 8, 19, -3, 13, -32, 16, 31, 22, 25, -46, 16, -40, 43, 17, 18, -50, 40, 41, 12, -22, 31, -39, 26, -10, -49, -14, -6, 29, -3, -27, 48, -29, 49, -40, 7, -5, -22, -16, -36, 9, 44, -9, -8, 29, 23, -2, 13, -19, 13, -49, -27, 36, 15, -13, -20, -25, -22, 16, 27, -26, -3, 14, 2, 16, 39, -33, -42, -13, 36, -30, 14, -30, -24, 19, -7, 49, -23, -6, -34, -11, -48, 25, 25, 15, -5, 35, 36, -21, 18, -42, 34, -40, 18, 48, 40, 15, 37, -20, -18, -12, 43, -5, -14, 41, 9, -20, -40, 36, -49, -24, 48, -49, 50, -30, 7, -46, 1, -6, 34, 42, -31, 10, -13, -31, -26, -49, -19, -25, 19, -10, 16, 46, -50, 0, -46, -38, -32, -39, -3, -26, 6, -16, 25, 43, -46, 47, -29, 26, 6, -4, 3, -48, 2, 33, -20, 18, 37, -18, 21, 37, -1, 33, -35, 25, 26, -12, 38, -5, 45, 37, -4, -7, -42, 36, -1, 26, 9, 45, -36, -15, 12, 18, 35, 29, -10, 23, -27, 31, -2, -33, -44, -47, 39, 18, 9, 4, -35, 48, 39, 31, -22, -28, -37, 28, -2, -18, -26, -30, -34, -28, 6, 30, 7, -37, 42, -31, -21, -32, 2, 5, 26, 31, -28, 11, -18, -33, 22, -18, -19, 10, 3, -34, -32, 40, 19, 48, 50, -17, 33, -26, 17, 23, 23, 37, 34, -40, 40, -35, 39, 10, 43, 29, -44, -35, 48, -35, -11, -39, -16, -30, -1, -8, 49, -34, -19, -10, -45, 37, -24, -31, -26, 15, -42, 41, 2, 10, -13, -48, 33, 19, 46, 4, -50, 50, 19, -6, 47, -4, 28, -25, -37, 3, 20, -5, -20, 37, 8, 44, -22, 45, -34, -37, -15, 7, -27, 12, 40, -26, 8, -19, 31, -33, -14, -25, -42, 48, 13, 21, -31, 3, 35, 32, -21, 2, 41, 48, 12, -40, -20, -2, 49, 43, 36, -32, -39, -36, -20, -8, 50, -14, 28, -22, -25, -49, 33, -36, -47, 35, -1, -13, -28, 8, 39, 24, -23, 15, -43, -22, -40, 50, -33, 4, -1, -37, 23, 48, -42, 48, -40, 12, 25, 16, 2, -12, 27, 5, -23, 24, -12, -26, -30, -41, -8, -36, 32, -3, 35, -30, 9, 45, -1, -28, -38, 18, -47, 41, 27, 21, -42, -16, 50, -30, 7, -33, 46, 21, 30, -8, 44, 47, -45, 35, 27, 16, -39, 49, -39, 15, -49, -36, -28, -22, 30, 45, -44, 43, -23, -37, -7, -21, 30, -19, 19, 37, -45, -24, 31, 37, 50, -27, -17, -11, -4, 28, 24, 35, -27, 14, -33, -7, 25, 6, -23, 20, -28, 34, -17, -40, 35, -16, 42, -9, -23, 31, 27, 31, 41, -27, -43, 2, 21, -47, 40, 49, -46, 46, -2, 47, -21, 21, 12, -4, -25, 6, -14, 47, -44, -11, 41, -12, 11, 41, 27, 2, -47, 31, -26, -44, -23, 18, 16, 44, -31, 32, -40, 16, 36, -44, -28, 10, 20, -17, -32, 7, -42, -3, 31, -10, -3, -6, -26, 27, -26, -32, -12, 28, 29, -24, 23, 12, 17, -32, -23, 34, 27, -18, -41, 32, -21, -29, -48, 50, 31, 24, -3, -49, 25, 3, -45, -11, 42, 43, -49, 22, -49, 42, 46, 23, 47, 4, 21, 50, 9, 46, -45, -32, 45, -24, -50, -18, -11, -19, 18, -34, -43, 6, -9, 47, -42, 36, -16, 20, 28, 2, 3, 33, -26, 16, 11, 4, -5, -27, 47, -5, -29, -40, -3, -43, -12, -16, -2, -5, -13, -43, 3, -14, 40, 41, -11, -17, 45, 28, -34, -18, -4, 1, 29, 42, -42, -18, 9, 42, 26, -30, 7, 34, 18, -41, -45, -38, 14, -31, 6, -5, -43, -41, 22, 16, -40, -39, -41, -26, -2, -2, 38, -40, 11, -15, -12, 2, 39, 27, 5, -50, 5, -47, -21, -39, -16, 26, 1, -20, 36, 17, 1, 29, -44, -29, 42, 24, 5, 46, 7, 42, 13, -39, -44, 4, 11, 39, 22, 47, 26, 4, -15, 38, -27, -7, -34, -49, -38, -20, 42, -23, 9, -24, -36, 44, 28, -18, -31, -9, -39, 50, 22, -28, 21, 45, -37, 40, -26, 26, 34, -20, 50, 3, -46, -38, -23, -8, 38, 48, -4, 20, -13, 45, 16, 11, -12, -14, 35, -43, 30, 1, 40, -18, 30, -9, 25, -24, -43, -28, 13, 42, -31, -35, -34, 29, -32, -43, -13, -13, 2, 42, 49, 39, -20, -7, 9, 25, -34, 28, 22, -12, -9, -3, -39, 45, 38, -33, 28, 45, -45, -8, -16, 47, 3, 11, 18, 31, -35, -43, 38, 45, 39, 35, -20, -41, 5, 25, 41, 19, -31, -46, -28, -42, 7, 8, 42, 29, 3, -5, -29, 13, -43, -31, 0, 27, -12, -14, -1, -17, 24, -18, -20, 3, -7, -17, 20, 11, -28, -5, 5, -44, 38, 10, -48, -13, 33, -17, -7, -21, -34, 8, -41, 48, 33, -33, -6, 40, 8, 11, 8, -2, 49, 12, 36, -19, -41, -40, 19, 11, -4, -17, 49, 50, -34, 3, 25, 34, -11, -32, 16, 31, 2, 13, 32, -4, -45, -35, 21, -33, 1, -3, -8, -12, -2, -39, -41, 20, 4, -50, -2, -15, -30, -14, -27, 4, -26, -44, 30, 42, 43, 20, 46, 20, -27, -40, 22, -39, -16, 12, 17, 49, 41, 6, -38, -28, 32, 50, -12, 37, 29, 46, -39, -17, 20, 24, -20, 42, 11, -38, -20, -49, -36, 6, 24, -17, 17, 24, -22, 15, -35, -12, 26, -14, 30, -30, -7, -32, 20, -43, 26, 50, 15, -10, 24, 37, 19, 10, -25, 20, 32, 19, -22, 15, -32, 17, 7, 19, 6, -14, 10, 41, -21, 20, 22, -26, 46, 14, -45, -33, -41, 41, -40, 46, 14, 26, 50, 33, 14, 1, 16, 31, 27, -20, 40, -34, 4, 42, -15, 50, -25, 2, -34, 35, -26, -49, 35, -46, -47, -15, -45, -30, 26, 50, 38, -25, 4, -12, 33, -18, -37, 5, 49, 30, -30, -5, -35, -35, 33, -22, 41, -43, 37, -48, 38, -32, 46, 15, 28, 35, 23, 31, -29, -5, 40, -38, -18, -46, 39, 26, -24, 27, -27, 16, 12, 43, 48, -3, 12, 27, -39, -23, -7, 42, -8, -34, -11, -2, 34, 6, 36, 33, 13, 24, 6, 47, 23, 23, 19, 49, 37, 25, -8, -28, -24, 7, -14, -45, 14, -45, -1, -29, 37, -26, 28, 39, 21, 0, 37, -3, 19, 48, 14, 9, -5, -15, 7, 25, -13, -40, -39, -9, -12, 20, -40, -15, 1, -20, -18, -38, -33, -10, 7, 5, -27, 22, -20, 4, -41, 9, -49, -36, -48, -8, -20, 19, 16, 5, 12, 24, -36, 41, -41, -13, -4, 6, -1, 20, -36, -33, 31, 37, -49, 33, 47, -8, -25, 20, -13, 43, -9, -46, -40, 14, -17, -50, 32, -49, 34, -31, 10, 36, -30, 37, 17, -39, -29, -31, 31, -50, -21, 46, -27, -37, -15, 18, 24, -27, 9, 44, 4, 26, 29, -27, 26, -27, 3, -25, 15, 29, -13, 14, 24, 0, -16, -8, -22, -14, 30, 7, 3, -12, -9, -23, -22, -8, -48, -41, 8, -37, 25, -4, -9, 43, -19, -19, -9, -19, -25, -50, 5, -49, 30, -21, 20, 1, 40, -42, -29, -17, -2, -50, 22, 33, 2, 32, 49, -11, -6, 17, -42, -29, -33, 25, -8, -12, 22, -45, 32, -3, -44, 29, 18, -35, -50, -14, 32, -14, 30, 13, 39, 35, 11, 21, 10, -18, 15, -21, -31, 9, 31, 23, -27, -47, -14, -47, 26, 38, 26, -33, 37, 15, -3, -18, 7, 32, 22, -23, -16, -41, 14, -9, 34, -42, 9, -36, 48, 6, 18, -29, 13, -10, 36, 20, 5, -28, -26, 40, -45, -17, 12, -42, 9, -2, 46, 0, 9, 19, -14, -20, 47, -10, 11, 42, 7, -37, -15, -15, 28, -43, -25, -15, -3, 34, -23, 17, 11, 29, 35, 25, 29, 0, -9, 50, -22, 31, -41, -12, 31, -50, -12, -30, 14, -36, -47, 9, 10, -31, -41, 36, -17, -3, -18, 47, 10, -41, 3, 33, 14, 26, -50, -46, 29, -36, -23, 44, -28, -34, 47, -38, -37, -40, -23, -9, 45, 48, 10, 13, -20, 30, 22, -41, -43, -30, 26, 8, -1, 18, 19, -21, 44, -34, 24, -31, -3, 22, -49, -14, -50, -47, 49, 3, -26, -48, -42, 35, 36, 25, 23, -17, -8, 23, 43, -29, 19, -49, 43, 15, -19, -35, 25, -50, 21, -3, -1, -38, -36, 2, -7, -43, 23, -5, 18, -32, -13, -40, -8, -31, -31, -30, 31, 6, -1, 23, 47, -25, -21, 22, -20, -9, 17, 10, 10, 19, 27, 17, 39, -34, -32, 0, 19, 12, 42, 24, 29, -21, -26, 24, 20, -25, 5, -29, 38, -32, -20, -25, -9, -10, 49, -28, -4, -38, 38, 15, 15, -35, 22, -23, 26, -16, -10, 26, -20, 34, -19, 3, 47, 21, 8, -10, 15, 45, 3, -11, -23, -14, 14, 23, 4, -47, 48, -41, -4, 24, -37, -13, -39, -6, -34, 29, -16, 15, 24, -10, 16, -22, -33, -31, -37, -17, -2, 3, -20, 7, -9, 7, 31, -21, -26, 12, -32, 21, 41, -43, 44, -48, 16, 35, 30, 49, -34, -37, -42, 11, 43, -30, 25, -14, 45, -40, -31, -16, 2, -4, 24, 1, -43, -47, -24, -7, -11, -4, 43, -7, -3, 40, 34, 1, 33, 17, -40, 26, 22, -47, 25, 22, 26, -3, -25, 26, -12, 41, 7, -32, 37, 32, 26, 26, 7, -23, 15, -41, 35, 26, 7, 22, 46, -37, 33, -36, 45, -18, -34, -27, -21, 11, -38, 11, -4, -35, 15, 30, 45, -8, -43, -48, -39, 33, -35, 27, 29, 8, -2, 12, 11, -2, 0, -18, -21, 8, 25, -36, 31, 41, -28, 27, 43, 46, -6, 11, 28, 20, -36, -5, 13, -5, 5, -7, 24, -22, 44, 11, 38, 1, 3, 37, 6, 32, 15, -29, -31, -18, 21, -26, -5, 22, 47, 6, 36, -46, 4, 10, 38, -43, -35, -3, 10, -36, 14, -29, -48, 3, -37, -15, 31, 31, 16, -41, -2, 14, 40, 6, -24, 24, -46, 20, 32, 6, 42, -36, 48, 50, 25, -21, -31, -14, -48, 22, -10, -12, -25, -49, -28, -28, 34, -35, -42, -38, -23, -24, 0, 13, 1, 30, -13, 49, 14, -33, 12, 0, -42, -38, -11, 4, 28, -8, -7, 17, -18, -27, -15, -41, 49, -31, 24, -39, 11, -33, 43, 50, 12, 33, -26, -39, -30, -26, -40, 13, 22, -1, 11, 38, 48, 45, -2, -37, -50, 30, -26, 8, 21, 18, -46, 48, -32, -28, -42, 43, -1, -35, -18, -49, -37, -50, 39, 7, 38, -35, 28, 39, -4, -7, 29, -37, 42, -27, 4, -36, 32, 21, -17, -49, -24, 23, 48, 36, 21, 41, -28, 17, -37, 12, 42, 14, 17, 12, 45, 46, 39, 30, 36, 13, -19, 28, -38, 15, -32, -27, 37, -40, 8, 35, -36, -41, -10, -24, 9, 22, 1, -23, 14, -34, 44, -7, -41, 12, 50, 42, 31, -4, -13, 19, 25, 2, 27, -7, 23, 3, -31, 28, -20, -44, 7, -41, -41, -12, -23, -21, -14, 16, -8, 28, 34, 1, 50, 5, 25, 17, -42, 41, -28, 12, 10, -11, -7, 35, -27, 0, 7, 39, 43, -18, -35, -29, 6, 11, 31, 20, 39, 21, 19, -21, -28, -19, 35, 6, -42, -20, 20, -42, -38, 7, -48, -16, 46, -30, 13, 44, 1, -17, 45, -16, -36, 45, -45, 34, 46, -19, 1, 32, 46, -23, 44, 34, 47, 13, 28, 27, -32, -36, -45, 22, 50, 33, 47, -13, -25, 31, 41, 0, 22, 45, 2, 5, 8, 19, 27, 41, 7, 37, -38, -8, 25, 0, -32, -30, 40, 32, -27, -25, -6, -23, 31, 49, -22, -34, 17, -7, 10, 42, 17, 23, -26, 44, 16, -49, 38, -2, 19, -25, 21, 48, -24, 38, -33, 3, -50, 10, -48, 17, -10, -14, 0, -36, -43, -13, 32, 5, -4, 39, -41, 27, -2, -10, 32, -21, -46, 44, 20, 32, -20, 1, 37, 47, -28, -3, -11, -45, -13, -10, 49, -24, 24, 18, 6, -34, 20, 40, -4, 28, -38, -40, 39, 35, 41, -27, 42, 22, -47, -5, -33, -8, 29, -18, 42, -41, 22, 8, -20, -23, 9, -48, 4, -37, 7, 38, -36, -49, -27, 27, 13, 20, 49, -27, -24, -14, 43, 40, -12, 12, 28, -25, 14, -47, -22, -50, -1, 35, -40, 23, 8, 11, 30, -15, 5, 39, -30, -38, -42, -40, 24, 19, -50, 19, 26, 35, 5, -20, 35, -14, -4, 40, 27, -4, 18, 7, -15, -19, 47, 13, 20, -9, -3, 23, 30, -21, -30, 9, -38, -50, 14, -18, -13, -26, -25, 26, 8, 41, -18, 50, -10, -21, 6, -2, -3, 21, -2, -4, 5, 14, -39, 18, 37, -45, 38, 14, -26, -50, -19, -48, -2, -32, 9, -22, -1, -49, 22, 5, -34, 9, -15, 10, -34, -2, 25, 9, -31, -1, -48, -8, 6, -1, 17, 30, -1, -14, -5, -9, -36, -18, 29, -40, -31, -27, 13, 29, 43, 47, 14, 37, 37, 22, 35, 25, -34, 38, 41, 10, -36, 43, 0, -24, 35, 23, 10, 7, -20, 40, -39, -5, -20, -19, -19, 48, 2, 10, -5, 34, 23, 29, -44, -47, 40, 1, 38, -20, 24, 33, -15, 3, 3, -34, 24, -21, 48, -29, -8, -24, -14, -5, -16, -47, 29, 29, 34, -25, 49, -32, 30, -6, -25, -29, 7, 12, -23, 14, -7, 49, -8, -14, 15, -34, -11, -13, 34, 10, -42, 26, 24, 10, 29, -35, -49, 21, -8, -9, 26, 6, 30, 37, 16, -21, -38, -32, -44, -42, 32, 3, 35, 31, 10, 36, -49, -1, 24, -20, -18, 27, 29, -40, -18, -44, -20, -3, -4, 27, 41, 2, 29, -32, 30, 39, -45, -2, 22, -1, 30, 44, -39, -28, 3, 18, 49, 8, -15, -48, 7, 37, 4, 6, -34, -12, 39, 17, 4, -6, 25, -50, -30, 32, -30, 1, 31, -8, 1, 16, -7, -19, -41, 13, 28, 18, 17, -23, 2, 0, 2, -47, 28, -34, 16, 23, -4, 5, -28, -33, -50, -16, 13, 7, 44, 8, -50, -48, 16, -14, 32, -22, 38, -18, 49, 10, 42, 39, -47, -37, 40, -18, -29, -3, -48, 36, 34, -28, 17, -30, 50, -8, 44, 34, -25, -10, 48, -13, 37, -40, -22, 9, 16, 14, 10, -32, -5, -2, -29, 27, 6, -37, -7, -35, 46, 26, -39, 4, 0, -12, -18, -18, -22, 18, 19, -20, 29, -20, 38, -5, 46, 26, 1, -41, 37, 23, -10, 44, 26, -48, 8, 1, -17, -2, -23, 32, 36, 45, -38, 46, 47, 46, 18, 16, 10, 9, 20, -27, 12, 35, 10, -28, -21, 9, -33, 45, 5, 2, -44, 46, 18, 41, 21, 28, 1, -47, -17, 18, -18, 18, -13, 47, -25, -50, -47, -12, 3, 39, -18, -18, 21, -31, -35, -30, -6, 39, 36, 31, 11, -20, -9, -39, 14, 22, -48, 39, -42, 0, -35, 37, 27, -48, 47, 46, -27, 22, -38, -49, 20, -30, -32, 38, -4, -29, 24, -18, -19, 13, 34, -12, 33, 21, -9, 50, -42, -26, 38, 46, -49, -32, -31, 42, 19, -34, 38, 17, 43, 33, -48, 36, 0, 31, -25, 5, 49, 13, -43, 30, 44, -14, 46, -24, -6, -47, 35, 39, 45, 37, 48, -14, 45, 20, -18, -20, 4, -39, -40, 37, 21, -19, 6, -13, 9, 35, 47, -32, 33, 5, -37, -18, -41, 29, 13, 13, 11, 17, 40, 41, -8, 29, 8, 1, 46, -32, -30, -29, -42, -42, 22, -24, -34, -7, -6, -43, 29, -33, -18, -50, 25, -45, -10, 4, -46, 8, 29, -33, -2, 31, 14, 32, 3, 10, -43, -48, -26, 18, 4, -11, 32, 31, -1, 44, -18, -33, 6, -35, 29, -13, -10, -44, 27, 2, 12, 38, -19, -13, -29, -35, 1, -22, -35, 25, -34, 50, 13, 40, 38, -38, 21, 5, -46, -39, -10, -48, 48, -18, 35, -1, 5, -42, 31, -1, -22, -12, 40, 49, -6, -34, 5, 47, -5, 16, 18, -37, 16, -28, 43, 10, -28, -24, 3, -41, 38, 26, -35, -10, 47, 4, 50, 10, 35, 30, 36, 49, -2, 22, 1, -49, 45, -1, 35, -8, 26, -43, 8, 14, 30, -39, -47, 26, 44, -10, -44, 36, 37, 18, 18, 30, -21, 22, -45, 38, -32, 29, 34, 15, -41, -35, -14, 28, 26, 26, -19, -4, 21, -8, 31, -15, -25, -41, -20, 46, -22, -46, 26, -50, 36, -48, 16, 20, 49, -16, -36, 16, 42, -21, 31, 24, -8, 9, -11, 14, -22, 23, 41, 44, -32, -48, -15, -8, -36, 46, -10, 39, 29, -15, 46, 33, 26, -18, -46, 50, 27, 40, 36, -37, 17, 32, -4, 3, -47, 43, 32, 44, 44, -42, 2, 26, 27, 9, -5, 3, 23, 44, -14, -28, -24, 19, 39, 15, 10, 26, 0, -1, -32, -50, -11, -19, -29, 42, 15, -11, -13, -3, 4, 24, 30, 4, 0, 9, -43, 35, 17, 24, 21, -42, 39, -49, 29, 44, 19, 34, 39, 8, -32, -23, 21, -37, -27, -7, 50, 5, 39, 44, 0, -19, -1, -10, 15, -26, 10, 15, -9, 14, -15, 25, -42, -15, 41, -13, -18, -9, 10, -5, 35, 38, 10, -33, 19, 31, 29, -36, -3, 21, -38, -8, 9, 6, 20, -34, -1, -19, -29, 4, 6, -38, -4, 36, 11, 3, -22, -29, 14, -22, -3, -46, -16, 23, 32, 50, 20, -5, -16, -6, -38, -41, 15, 19, 21, 49, -26, -7, 9, -4, -11, -44, -5, -28, 32, -5, 35, -38, -30, -50, -32, 9, -18, -47, -48, 40, 1, 48, -23, 19, 19, 4, 6, 36, 46, -35, -27, 18, -10, 26, -4, 25, 18, 50, -20, 41, 41, -21, -33, -7, -24, 48, -25, 9, -33, 46, 38, 5, -20, 50, 8, -49, 46, -12, 10, 12, 45, -33, -34, 47, -12, 20, 3, 48, 43, 25, -16, -40, 10, -7, 17, -26, -3, -19, 33, 44, -47, -13, 12, -4, -50, -48, 50, 35, 11, 13, -34, 27, 11, -16, -38, -16, -8, -49, 5, 26, 0, 3, -35, -33, -44, -6, -15, -10, 43, -9, -44, -36, 9, -11, 32, -14, 15, 4, 26, 44, 29, 5, -7, 6, -45, 41, -19, 23, -33, 17, 22, -44, -43, 13, -44, -10, -11, -48, -34, 15, 28, 42, 1, -29, -47, -45, -13, -25, -40, 39, -34, 37, 41, 48, -20, 26, -16, -35, 28, -33, 50, 11, -24, -16, -6, -16, -23, -42, 25, -36, -30, 1, -16, 46, 0, 32, 4, 36, 26, -7, 14, 42, 37, 29, -26, 36, 41, -4, 29, 5, -13, -40, 16, -36, -50, -44, -50, -2, 45, 22, -22, -25, 36, -6, 42, 46, 20, -39, 44, -19, -31, 0, 30, -15, 16, -50, -24, -11, 46, 33, -37, 49, 18, 36, 28, -45, -18, 4, -32, 26, -22, 10, 19, 28, 29, -27, -28, -41, 3, -10, -2, -34, 5, -6, -21, -7, 23, 4, -32, -22, -49, -15, -32, -44, -25, 28, -13, -48, 29, 15, 44, 41, 20, 43, -8, 11, 20, 49, 42, -27, -12, 17, 42, -7, -46, 4, 42, -21, -22, -25, 32, -25, -14, 40, 43, 2, -21, -48, -8, -44, -2, 22, -10, 26, 28, 3, 18, 42, 48, 40, -24, -43, -19, 33, 13, -41, -38, 12, 42, -16, 10, 3, -43, -22, 44, -10, -21, 35, -30, 25, -40, -49, -1, -10, 15, 47, -48, 29, 0, 17, 36, 33, -26, -21, 31, -40, 42, -34, -25, -28, 5, 1, -3, -31, -49, 37, -20, -24, -49, 27, -47, -38, 49, -16, 21, 15, -45, -20, -41, -30, 23, -28, -48, -19, -31, 23, -22, 1, -5, -17, 50, 33, 10, 21, 20, 19, -40, 31, 42, 38, 12, -30, -48, 31, 37, -41, -24, -39, -44, -34, 14, 13, -25, -36, -18, 11, 50, -4, 44, -16, 14, 21, 25, 32, -26, 6, -19, 12, -39, 12, 26, 41, -50, 0, 19, -43, 17, -46, 38, 35, 41, -12, -28, 17, 1, -47, -4, -30, 50, 5, 15, 8, -44, -2, -35, -34, 33, 36, 47, 24, -17, -18, -25, 15, 12, 36, -10, 35, 7, 47, 28, -41, -36, -9, 42, 6, 36, -34, 9, -42, -15, 22, 29, -15, -3, 0, 46, 44, 19, 23, 29, 17, -29, 26, 29, 42, -45, -25, 24, 37, 42, -48, 1, 23, 9, 12, 14, 1, 39, 25, -37, 38, 21, 17, -23, 20, -41, 6, 49, 15, 39, -1, -37, -35, 3, -8, -9, 30, -29, 17, -32, 15, -12, 22, -32, -35, 3, -26, -33, -28, 34, -40, -12, 17, -26, 12, 45, -21, -6, 39, 10, 49, 0, 47, -42, 25, -49, -46, 11, 18, 1, 35, -46, 8, 17, -42, 42, -29, -24, -41, 29, 10, 0, -41, -45, 11, -46, 19, 12, 5, 8, 12, 38, 8, 0, -1, -47, -3, -19, 0, 1, 48, 23, -17, -15, 19, -8, -35, 8, 2, -32, 47, 38, 44, -10, 30, -4, 43, 3, 4, 44, -32, 11, 48, 42, 8, 14, 17, -23, -33, -25, -32, 4, 6, -45, -50, -43, 46, 0, 34, 37, -26, -4, 4, 13, 32, 42, -41, 5, -39, -18, 20, -34, 10, -41, -20, 9, 19, -34, -1, -14, 31, 11, 39, 29, 21, 37, 26, -22, -19, 37, 29, -40, 45, -45, -16, -18, -33, -14, -38, 23, 50, 39, 30, 13, -50, 12, 38, -17, -41, 33, -44, 5, 29, -14, -22, -39, -34, -3, 33, -25, 32, -39, -30, -9, 10, 7, 3, -17, -44, -16, -36, 14, 39, 48, -26, 8, 28, 35, -45, 1, 28, 37, -30, 20, 42, 45, -19, 2, 8, 18, 11, -47, 35, -33, 48, 30, 5, -27, 15, -38, 11, 3, -36, 18, -48, -14, -14, 50, -48, 12, -16, 1, 36, -23, 43, -33, -15, -18, 13, -25, -3, -11, -34, -11, -44, 6, -43, 5, -20, 8, 7, -39, -3, -20, 32, 12, 23, -12, 25, -31, 50, -3, 20, 3, 27, 24, 20, -22, 23, 42, 22, 49, -3, 23, 32, 5, 44, -34, -42, 46, -17, -6, 37, -42, -44, -35, -32, -45, -40, 25, 10, -9, -38, -39, 34, 23, -31, -1, -15, 41, 37, 18, -14, -39, 48, -11, 3, -49, -1, -10, -6, -42, 11, 35, -4, -46, 25, -50, -7, -29, -13, -32, 29, -20, 16, 36, -9, 31, -25, -38, 7, -33, 16, 36, -48, 4, 38, 40, 7, 12, 40, 1, 38, -27, 21, -42, -14, 43, 32, 2, 29, -27, -30, 49, -11, 11, 19, 18, -37, -9, -1, 10, -47, 21, 37, 24, -34, 34, 6, 39, -3, -7, -6, 40, 29, 39, -18, -20, -4, -45, 21, 20, -17, 2, -37, -35, -8, 22, 23, 30, -39, 19, -32, -10, 2, -22, 19, 8, 38, 13, -27, 38, -35, 1, 29, -45, -14, 34, -47, 47, 41, -13, -10, 41, 30, -37, 20, 35, 0, 14, 42, 1, 44, -21, 6, 28, 31, 48, -21, 47, -9, -40, -24, -27, 48, -12, 21, -33, 26, -6, 37, 36, -39, -2, 43, -20, 41, -29, -7, 41, 13, 26, -26, 0, -44, -45, -27, -32, 32, 49, -42, -15, -11, 42, -27, -3, 12, 18, 2, 3, -9, -6, 39, -37, -22, -45, -44, -14, 2, -33, 36, -13, 8, -50, 17, -7, -4, -16, 36, 40, 9, 39, 1, -43, 29, -10, -48, 45, 18, 33, -37, 45, -25, 19, 7, 49, -11, 0, -46, 26, -19, 29, -50, 26, 3, -40, 2, -43, -26, -11, -19, 37, -23, 27, -48, 49, 40, 33, 28, 11, -24, -6, 41, -26, 10, -7, 46, -5, -37, -43, -3, -37, 14, 29, 31, -44, 28, 37, -2, 4, -38, 22, 5, 5, -36, 6, 7, -16, 37, 46, -35, -43, 42, 36, -6, 44, -11, 3, -37, 8, 43, 2, -24, -4, 29, -45, 4, 46, -7, -33, -35, -39, -31, -6, 13, 8, 42, 43, 39, -29, 46, -4, -22, 35, -6, 26, -42, -27, -36, -15, -38, 40, -7, 50, 20, 21, 50, 27, 25, -15, 10, 30, -11, 42, -24, -50, -17, 17, 37, -30, -18, -44, 14, -48, 0, 28, 44, 3, 29, 23, 42, 8, -45, -22, -34, 9, -29, -27, 30, 34, 0, -1, -40, 5, 20, -9, -12, 18, -3, 6, -30, 31, 48, -31, -36, 18, 26, 0, 25, 11, 34, -14, -45, 20, -25, -43, 22, 40, -47, -30, -20, -30, -26, -36, -16, -2, -8, -10, -14, 6, -9, -4, 41, 10, -37, 17, 2, 33, -17, 25, 46, -27, -31, 18, -21, 37, -44, -15, -13, 29, 1, -36, -5, -28, -39, 42, -7, -36, 42, -2, -30, -36, -37, -9, 29, -36, 12, 17, -24, 36, 42, 2, 1, 12, 22, 2, 6, 1, -8, -44, -9, -47, 18, -46, 24, 41, 29, -10, 43, -47, -49, 16, -30, 19, -8, 31, 18, -42, 33, -23, -25, 31, 32, -48, 22, 49, 44, -2, -34, 12, 4, -28, -17, 18, -36, -4, -48, 32, -23, -48, -47, 37, -20, -6, 8, -6, 24, -14, 14, -42, -34, 14, -48, -25, 2, -20, -25, -28, -21, -41, 21, 38, 13, -29, -36, 5, 23, -31, -4, 36, 2, 2, -50, -49, 7, -32, 11, 27, 21, -39, -25, -24, -22, -36, -5, -50, 9, 41, 6, -48, -33, 1, 9, -17, 45, 42, 38, 9, -25, 21, -32, -29, 42, -18, -13, -16, 16, 32, -41, 40, -36, -40, 39, -27, 26, 45, 50, -47, -38, 22, 6, 47, -14, -3, 20, -50, 9, -39, -30, -40, -7, 7, -7, 27, 47, -17, -26, -47, 13, 39, -35, -41, 15, -16, 32, -45, -32, 8, 2, -43, 27, -41, 16, -13, -22, -36, 36, -28, 31, -5, 32, -23, -25, -41, -4, -47, 4, 15, 16, -44, 4, 29, -20, 23, -32, -23, 30, -23, -32, 50, 36, -31, -38, 26, -8, -40, -3, -36, -34, 3, -1, -23, 32, -47, -29, 35, 50, -12, -17, 46, -7, -9, -11, 46, -39, -49, -23, 23, 35, 30, 39, 16, 20, 21, 33, 25, 48, 30, 41, -41, 35, 6, 46, 35, -14, 26, 40, 13, 28, 35, 43, -11, 50, 47, 9, 47, -3, 48, -32, 21, -18, -7, 41, -14, 38, -15, 30, 37, -30, -49, -20, 46, -21, 25, -7, -39, 0, -2, -27, -27, 9, -40, -38, 40, 21, 23, 21, 13, -31, 21, 22, 20, 27, -23, -49, -8, -43, -38, 34, 41, -16, -28, -5, -36, -49, 10, 25, 13, 1, -15, 16, 18, 16, -4, 32, -49, -7, 50, 13, 30, 27, -23, 40, 3, 23, 16, -15, 12, -26, 35, -3, -12, -4, 43, -30, -21, 41, -20, -25, -29, -30, -50, -14, 26, 34, -5, -42, -34, -4, 34, 44, 8, 3, 35, -39, 13, -45, 2, -35, 39, -46, 22, -5, -37, -7, 12, 43, 1, -25, 2, -22, -32, -4, -43, -28, -16, 44, 2, 48, 45, 7, -46, -35, -34, -19, 45, 1, -31, 15, 33, 31, -50, 7, 42, 42, 32, -7, -45, -1, 21, 37, -31, -37, -46, -10, -11, -17, 29, -6, 20, 29, 20, -24, 27, 27, -7, -18, -18, -7, -31, -15, -44, -19, 16, -12, 42, -27, 35, 19, 37, 36, 3, -13, 23, 29, 24, -19, -6, 10, 19, 37, 46, 2, 0, 25, 5, -24, -13, 11, -33, 13, 26, -21, -2, -10, -38, -17, 49, 43, -26, 15, 49, -33, -46, -32, -9, -33, -19, -30, -41, -14, -2, 35, -38, 4, -34, -42, 37, -7, 27, -5, -43, -14, -32, 12, 41, -5, 43, 20, -25, -5, -5, 24, -37, 34, 12, 21, -48, -23, -22, 36, -33, -16, 26, 25, -4, -46, 24, 8, 24, 8, -4, 44, 44, -38, 27, 38, -18, 46, 11, 28, -35, -7, 7, -45, 38, -36, -47, 5, 13, 17, 43, -17, 40, 44, 5, -19, -42, 12, 21, 27, -18, 36, -30, 4, 25, 6, -49, -38, -47, 33, -1, -3, 27, -21, -22, -43, -39, -10, -25, -1, -49, 4, 5, -37, -45, 44, 30, 38, 10, 45, -39, -38, -32, -7, 38, 44, 8, -14, -26, -35, -13, -8, 36, -37, -45, 38, -28, 9, -39, -38, 49, 47, -45, 12, -13, -1, 1, -11, -43, 10, -43, 46, -17, 28, 49, 9, 6, 48, -5, -29, 36, -11, -6, 4, 0, 35, -46, 44, -38, -23, 33, 46, 29, 11, 42, 36, -27, 47, -44, -13, -14, 17, 47, -9, 35, -46, 13, -1, 36, -36, 44, 22, 2, -26, 38, 34, -42, -13, -29, 36, -2, 17, 42, -36, 14, 3, -21, 42, -31, -18, 49, 35, 26, -44, -43, -23, -6, 22, 38, 29, 23, -40, -20, -39, 44, 27, 0, -7, 45, -1, -34, -16, -50, -22, 0, 13, -47, 36, -23, -35, 12, 25, 2, 34, -34, -11, -38, 1, 7, 45, -14, 28, 25, 10, 28, -17, 19, -34, -31, 22, 8, 18, 36, -18, 27, -34, 6, 32, 46, -50, -38, -24, 19, 8, -45, 46, 43, 48, -28, -41, 0, -32, 0, 41, 36, 17, 33, 32, -9, 40, 6, 47, 17, -13, 11, -44, 20, -1, 1, -25, -25, -32, -42, 10, -31, -1, 29, 30, -29, -38, -39, -41, 14, 45, -21, -43, -30, -29, -33, 15, -3, -7, -42, 16, 3, -25, 34, 43, 41, 49, -25, -17, -43, -41, -3, 4, 3, 27, -11, -36, 30, -33, 45, -28, 11, -5, 36, 48, -12, -36, 2, 37, 13, 12, 41, 29, -35, 19, 15, -38, -4, -42, 12, -17, 30, 40, -22, -14, -8, 35, 13, -27, 20, -17, -3, -39, -28, 28, 46, -38, 36, 45, -6, 48, 14, -4, 7, -46, 26, -46, 9, 45, -30, -27, -33, -30, 3, -41, -27, 34, 38, 9, 6, -28, -29, 17, -17, 19, -23, 44, 48, -12, -9, -28, 19, 29, -49, -27, -34, 14, 19, 18, 9, -1, 42, -39, -4, 16, 14, -24, -3, 37, 11, -7, -32, 8, -43, 4, -4, -49, 43, 43, -12, -6, -19, 14, -13, 26, -40, -41, 8, 39, 4, -31, 30, -34, 17, -46, 9, -28, -5, 1, -41, -5, -23, 46, -8, -25, 4, -3, -22, -24, -33, 9, 23, 18, 23, -30, -27, -48, 44, 11, 50, -49, 15, -9, -17, -9, -31, 46, 17, -6, 24, -9, -4, -46, 38, -2, -14, -17, 22, 19, -33, 27, -32, 27, -11, -34, 9, 48, 42, -9, 30, 21, 14, 2, 49, -44, -46, -27, -23, 11, -34, 50, -31, -48, -14, 39, -36, 0, -3, -43, -38, -3, -48, 14, 22, -20, -25, 30, 5, -17, -42, 11, -38, 18, -10, 26, -50, 38, -4, -47, 49, 12, 1, -41, -23, -45, -24, -39, 11, 1, -3, 16, -5, 46, 23, 44, -36, 20, -15, -37, 27, -48, 16, 35, -32, 48, 25, 3, 18, -41, -18, -38, 48, 0, -19, 24, -27, -16, 32, 19, -11, 3, -7, 11, 48, 17, -18, 26, 5, -15, 3, -32, -8, -39, -40, 19, -39, 40, -10, -26, -48, -48, 33, -23, -28, -3, 16, -9, 37, -11, -45, -31, -40, 45, -24, -30, -38, 35, -16, -4, 35, -23, -30, -33, -20, 9, -14, -30, -37, 38, 40, 9, -28, 44, -22, -4, -21, 39, 33, -13, 32, -24, 38, 36, 42, -36, 8, -48, -41, 28, 29, -34, 32, -40, -3, -46, 18, 13, -37, -1, -25, 21, 18, -44, -35, 4, 27, 50, 5, -47, 49, -3, -34, -15, 19, 29, 42, 49, -13, 50, 11, -3, -41, -15, -22, 27, -47, -7, 5, -9, 49, -38, -5, 31, -18, -30, 29, 28, 6, 18, 19, 16, -3, 25, 49, -18, -15, -18, -20, -30, -24, 40, 21, 50, 11, 45, -25, 15, -39, -29, -34, -44, 17, -14, -13, 45, -40, -50, -26, -9, 1, -27, 2, 5, 12, 30, -43, 8, -6, -24, 1, -33, 40, 35, -35, 15, -46, 31, -48, 40, 30, 29, 19, -44, -1, -37, -13, 28, -4, -18, -8, 40, -22, 6, 50, -46, 42, 45, 9, 19, -49, 19, -8, -47, 5, 42, 8, 38, -42, -48, 39, -3, -8, 40, 49, 45, -50, 6, 2, -35, 0, 24, 39, 4, -50, 39, -23, 2, 7, 22, 9, 8, -29, -43, -2, -9, -24, -12, 32, -26, -13, 34, -27, -27, 9, 32, -1, 15, -37, 2, -19, 45, 41, -3, -12, -11, -9, 26, 25, -43, 28, -25, -39, -8, 0, 40, 31, 49, 12, -2, -24, -42, -12, 14, 20, 39, 20, -44, 21, 29, 16, -41, 20, 34, 2, 50, 44, 36, 6, 40, 35, -24, 3, -47, 37, -28, -3, 32, -9, -48, 40, -48, -23, 12, 30, -20, -41, -2, 35, 43, -30, 49, 2, 36, 25, 38, 3, 6, -31, -2, -44, -22, -3, 42, -38, -48, -49, -35, 43, -45, -6, 20, -46, 5, 20, 47, -19, -2, -38, -21, -26, 34, 9, 8, 34, -23, 7, -31, -17, -46, 31, 9, -8, 6, 6, 24, 3, 30, -6, 35, -14, 33, -3, 3, -3, -45, -17, 12, 27, -3, -28, 33, -38, -4, -7, -19, -25, 2, -37, 1, -15, -43, -11, 35, -29, -35, 40, 9, 9, -41, -26, -20, -30, 40, 30, -18, -20, 39, -30, -15, 14, -47, 17, 39, -47, -42, -21, -6, -47, 18, -28, -35, -29, 50, 21, -3, 11, 46, 9, 29, -46, 29, -44, 0, 14, -42, 31, -6, -4, 16, -27, 41, -41, 22, 26, -3, -16, 3, 36, 30, 20, -35, 2, -11, 49, -31, 37, 18, -6, -45, 41, 18, -2, -12, -49, -12, -30, -11, 50, 31, 3, -39, 30, -14, -13, -36, -44, 27, -1, 14, 16, 50, -7, -20, -8, 26, -3, 31, 30, 30, 10, 24, 33, -41, -22, -3, 47, 30, 11, -38, -7, -4, 13, 40, 2, 39, 41, 26, 25, -7, -23, -49, 50, 6, 6, -17, 36, 7, 1, -22, -16, 24, -3, -18, 24, 22, 27, -42, -3, 16, 42, 32, -15, 45, 20, 41, -7, 31, 9, 12, -46, 36, 35, 39, 25, -11, -32, -4, 14, 16, 40, -33, -1, -21, 15, -46, 42, 46, -9, 33, 43, -46, -1, 34, 7, 28, 33, -43, -20, -39, -30, 43, 11, 40, 39, -18, -25, 39, 49, -11, 14, 8, -36, -50, -40, 4, -49, 14, 44, -7, -35, -29, -33, -4, 30, -21, -41, 48, 7, 11, 34, 29, -45, 16, -10, -8, 34, 26, -33, 7, 9, 37, -24, 17, -29, -27, -11, 23, 15, -11, -45, -33, 30, 36, -21, -30, 11, -41, -38, 25, -42, 17, -12, -27, -17, 10, -10, -46, 28, -1, -47, 0, 1, -12, -43, -6, 37, -23, -24, 14, -17, 30, 50, 11, 11, -13, -25, -27, -12, -30, 43, -4, -3, -38, 50, -48, -19, -16, -32, -37, -3, 35, 30, 17, -6, -32, 13, 50, 15, 28, 15, 24, -6, 36, 23, 16, 18, -48, -13, 26, -9, 32, -11, -1, -16, -27, 37, -34, -11, 23, 15, -7, -28, -45, 15, -30, -16, -22, -44, 42, 2, -14, -28, 46, -43, 25, -3, -41, 28, -27, 39, -4, 2, -12, 16, 15, -45, -30, 22, 23, -15, -48, 37, 35, 27, -9, -6, -7, 40, -18, 9, 35, 42, 32, 32, 19, 32, 26, -25, 35, -30, 49, -49, -4, -21, -24, 20, -31, -1, 44, -28, -38, 30, -47, -37, -31, -38, -48, 39, 39, 31, 45, 27, -4, -48, -50, 39, -27, -16, -37, 16, -38, -4, -1, 27, 34, -25, -48, 0, -11, 17, -15, 0, -50, -18, -44, 1, -40, -24, -37, 35, 29, -5, 25, -41, -27, 10, -33, 35, -42, -34, 7, -38, -1, 50, -45, 34, 0, -15, 20, 49, -26, -40, -7, -37, -22, 23, -1, -46, 21, 18, 37, 6, -25, -45, -35, 9, 49, -39, 24, -48, 12, 13, 11, 50, -45, -32, -33, 29, 36, -8, 50, 22, -48, 21, -13, 17, 25, -7, 44, 38, 29, 12, -9, 13, 3, 27, 26, 20, 25, -14, -47, -49, 48, -7, 16, 17, 25, 32, 23, 11, -50, -34, -35, -42, 2, 22, 8, -42, -39, -10, -36, 15, 24, -40, -43, 4, 45, -45, 2, -31, -12, 48, 21, -17, 6, -32, 20, -20, 31, -11, -37, 49, 30, -14, -7, -42, 7, -31, 41, -1, -31, -15, -24, 21, -19, -50, -34, -42, 33, -6, 45, 15, -19, -6, -42, -21, 33, -13, 9, -50, -46, 12, 48, -15, 14, 27, 22, 43, -27, -47, 27, 38, 17, -26, 23, 48, -44, -38, 17, -8, 6, -15, -37, 31, 21, 45, -24, -14, 36, 20, 25, -26, 16, 39, -47, 49, 28, 45, 42, 23, 34, -35, -32, -22, 0, -33, 7, -7, -35, 14, -49, 5, 28, -23, 14, -46, -29, 49, -38, 14, -35, 35, 13, -19, 29, 0, 28, 7, -5, 1, 12, 25, 9, 14, 30, 4, 6, 41, 20, 22, 35, -25, -39, 20, -5, -4, 28, -13, -30, -37, -49, 21, 19, 50, 50, -18, -45, 39, -14, -37, -14, -43, 26, -38, -11, 41, 7, -33, 6, 32, -13, -19, 35, 15, 26, 36, -26, 41, 7, 24, -18, 37, 15, -21, 30, -17, 35, 18, -3, -11, 0, 29, -38, 39, -20, -12, 12, -3, 36, -3, 10, -39, 27, 5, -33, -24, -23, 31, 29, 1, -35, 26, 7, 42, -42, -25, -23, 26, -15, -42, -4, 27, 0, 25, 6, -19, 16, 6, 3, -35, 11, 33, 45, 5, -28, -34, 29, -13, 21, 32, -21, 7, 47, 27, -29, -34, -36, -3, -19, 26, 34, -11, 46, 6, 7, 40, 48, -35, -23, 47, -50, -10, -3, -20, -15, -18, -18, 31, -28, 9, 36, 28, 39, -21, 38, -6, 29, -12, -6, 27, 30, -39, 42, -19, 5, -27, -38, -31, 28, 5, 2, 17, 3, -17, -23, -1, -49, 43, -25, 0, -4, -25, 33, 41, 33, 24, 23, 10, -28, -14, -10, 1, 32, 31, -2, -24, -45, 23, 15, -27, -13, -23, -23, 15, 10, -5, 18, 24, 23, -8, 8, -49, -36, -14, 20, -31, 47, -16, -17, 35, -20, 36, -32, 17, -27, 33, -12, 41, 3, -12, -34, -32, -3, -16, -19, -4, -4, 13, -5, -16, 43, -34, -9, -22, 19, -34, 30, -37, -27, 6, -1, 6, 50, 10, -12, 4, 45, -15, -14, -37, -24, 32, -20, 22, 30, 32, -7, 17, -3, 6, 24, -29, -47, 30, 21, -5, 8, -17, -40, -20, -40, 5, -13, -30, 43, -41, -25, 40, -43, -43, 9, 21, -17, -35, -38, 36, 25, 40, -29, 45, -24, 13, -49, 46, -25, 41, 32, 18, 46, 33, -21, -43, -13, 10, 30, 14, 16, -5, 39, 44, 21, -8, 8, -5, 21, -16, -12, 41, 0, -47, 29, 26, 33, 0, -46, 4, 50, -31, -27, -15, -17, 3, -17, 32, -34, -46, 38, -33, 4, 2, -1, 21, 40, 28, -6, -38, -35, 35, 33, -38, -31, 15, 48, -4, -32, -6, -14, 3, -45, -37, -47, 35, 4, 49, -17, -24, -44, -48, -4, 46, -49, 29, -26, 9, 28, -27, -36, 44, -37, 3, 27, -45, 27, 30, -33, -31, 11, 30, 29, -11, -12, 1, -19, 22, -24, 1, 46, 12, 23, 12, -34, -2, 49, 30, 31, -28, 47, 21, -38, -28, 6, 11, 3, -31, 35, 1, -28, -16, 16, -17, -18, -5, 30, -6, -32, 43, 36, -36, 27, 15, -12, -33, 19, 8, -19, -30, -11, 41, -24, -49, 46, 29, -12, 35, 5, -38, 5, 15, 27, 5, -23, 13, 20, 31, 13, 5, -10, 49, -10, 49, -47, 6, -21, 37, 33, -5, 5, -20, 37, -44, 39, 26, 3, -43, 4, 18, -7, -38, 42, -31, 27, -19, 9, -1, -24, -26, 1, 17, -30, -33, -12, -36, 2, -13, -3, 1, 37, 21, -23, 34, -35, -35, -16, -34, 22, 48, 1, 42, 31, -39, 32, -3, -29, -2, 1, 28, -50, 15, 13, -43, 35, -26, 15, 22, 22, 26, 19, 43, 28, 0, 2, -36, -1, 20, 24, -13, -11, 15, -12, 23, -34, -44, -12, 17, -16, 0, -4, -15, 13, 44, 38, -38, -33, -30, 14, 49, -43, -3, 34, -8, 2, 34, -24, -32, -28, -1, 0, -8, 48, 0, 18, -10, 21, -40, 29, 37, 34, 1, -28, -2, -13, -4, 21, -44, 15, 43, 26, 11, 36, -22, -13, 50, 33, -18, -22, 28, -28, -48, 50, 42, -6, -43, 35, -22, -49, -1, 14, -31, 1, 34, -14, 21, -24, -4, 48, -45, 9, -6, -7, 32, -33, 14, -26, -24, -44, -7, -22, 44, -7, -15, -32, -45, -26, -20, -42, 33, 23, -14, -24, -38, -10, 15, 34, 46, -27, -7, 47, 9, -42, -49, 5, -21, -29, 24, 30, 49, -38, 20, -35, 46, -6, 14, -40, 19, -31, 48, 12, 50, 39, -39, 11, 43, 41, 40, -9, 32, 18, 7, -46, -24, -23, -25, 40, -2, -30, -50, 41, 7, 28, 4, 30, -25, 33, -26, 26, -18, 38, 21, 18, -45, -28, -21, 27, 3, 36, -40, -20, -45, -40, 26, -39, 15, 2, 48, -15, -34, -23, 41, -29, -44, -36, 45, -40, -27, 16, -21, 19, 15, 10, 27, -10, 31, 0, -7, 44, -38, 39, -39, 31, -42, 34, -3, -2, 2, 5, -11, -27, 47, 21, -18, -28, 26, 3, 2, -2, 27, 27, 29, -2, 9, 39, 39, 14, -19, 28, -30, -33, 43, 9, -38, -27, -21, -49, 32, -26, -1, -37, -45, 25, 33, 36, -21, -21, -13, 7, 43, -10, 43, 6, -15, 13, 47, -35, 37, 27, 39, 21, -37, -20, 15, 17, 14, 4}; + +static int32_t dotp_result_golden __attribute__((section(".data"))) = -86952; + +int32_t result[64] __attribute__((section(".data"))) = {0}; + diff --git a/software/tests/idotp-32b/main.c b/software/tests/idotp-32b/main.c index edeb22e..bbd21ce 100644 --- a/software/tests/idotp-32b/main.c +++ b/software/tests/idotp-32b/main.c @@ -23,11 +23,13 @@ #include DATAHEADER #include "kernel/idotp.c" +// #define DEBUG + int main() { const uint32_t num_cores = snrt_cluster_core_num(); const uint32_t cid = snrt_cluster_core_idx(); - const int measure_iter = 3; + const int measure_iter = 2; // Byte-level interleaving for DRAM // Default setting is 1024b (128 Byte) @@ -111,6 +113,10 @@ int main() { for (uint32_t i = 1; i < num_cores; ++i) acc += result[i]; result[0] = acc; + +#ifdef DEBUG + printf("results:%u\n", result[0]); +#endif } } @@ -139,6 +145,10 @@ int main() { if (result[0] != dotp_result_golden*measure_iter) { printf("Check Failed!\n"); } +#ifdef DEBUG + printf("gold results:%d\n", dotp_result_golden); + printf("calc results:%d\n", result[0]); +#endif } // Wait for core 0 to display the results diff --git a/software/tests/idotp-32b/script/gen_data.py b/software/tests/idotp-32b/script/gen_data.py index 84c1d5e..11262b5 100644 --- a/software/tests/idotp-32b/script/gen_data.py +++ b/software/tests/idotp-32b/script/gen_data.py @@ -48,7 +48,7 @@ def emit_dotp_layer(name="dotp", **kwargs) -> str: f'static {etype} {name}_result_golden __attribute__((section(".data"))) = ' + str(int(result)) + ";\n\n" ) - layer_str += f"{etype} result[4] __attribute__((section(\".data\"))) = {{0}};\n\n" + layer_str += f"{etype} result[64] __attribute__((section(\".data\"))) = {{0}};\n\n" return layer_str def emit_header_file(**kwargs): @@ -84,7 +84,7 @@ def main(): prec = int(param["prec"]) # 8/16/32/64 # Fixed safe range - lo, hi = -100, 100 + lo, hi = -50, 50 A = rand_int_signed((M,), lo, hi) B = rand_int_signed((M,), lo, hi) result = dotp_wrap_same_width(A, B, prec) diff --git a/software/tests/spin-lock/main.c b/software/tests/spin-lock/main.c index f61bf6a..0d52508 100644 --- a/software/tests/spin-lock/main.c +++ b/software/tests/spin-lock/main.c @@ -14,6 +14,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +// This tiny test let each core add its core_id into a same memory location +// Can be used to verify the spin-lock and global shared memory access // Author: Diyou Shen #include @@ -36,7 +38,7 @@ int main() { spin_lock (&lock, 20); // Each core print its core id - printf("Core%d:hello\n", cid); + // printf("Core%d:hello\n", cid); // Add cid to the result result += cid; @@ -48,7 +50,8 @@ int main() { if (cid == 0) { uint32_t res_hex = (uint32_t) result; - printf("result: %x\n", res_hex); + uint32_t res_gold = (0 + num_cores - 1) * num_cores / 2; + printf("result: %u; gold: %u\n", res_hex, res_gold); } // Wait for core 0 to finish displaying results From 1da5efaf93feca4fe6611937759948cda24e0811 Mon Sep 17 00:00:00 2001 From: Diyou Shen Date: Thu, 15 Jan 2026 15:41:33 +0100 Subject: [PATCH 23/23] [SRC] Support two-tile conifguration. --- hardware/src/cachepool_cluster.sv | 56 ++++++++++++++++++++---- hardware/src/cachepool_pkg.sv | 39 ++++------------- hardware/tb/cachepool_cluster_wrapper.sv | 5 ++- hardware/tb/tb_cachepool.sv | 8 ++-- sim/scripts/vsim_group.tcl | 19 ++++++++ 5 files changed, 81 insertions(+), 46 deletions(-) create mode 100644 sim/scripts/vsim_group.tcl diff --git a/hardware/src/cachepool_cluster.sv b/hardware/src/cachepool_cluster.sv index 5e94c94..8a4d2ac 100644 --- a/hardware/src/cachepool_cluster.sv +++ b/hardware/src/cachepool_cluster.sv @@ -143,8 +143,8 @@ module cachepool_cluster input axi_in_req_t axi_in_req_i, output axi_in_resp_t axi_in_resp_o, /// AXI Narrow out-port (UART) - output axi_narrow_req_t axi_narrow_req_o, - input axi_narrow_resp_t axi_narrow_resp_i, + output axi_uart_req_t axi_narrow_req_o, + input axi_uart_resp_t axi_narrow_resp_i, /// AXI Core cluster out-port to main memory. output axi_out_req_t [ClusterWideOutAxiPorts-1:0] axi_out_req_o, input axi_out_resp_t [ClusterWideOutAxiPorts-1:0] axi_out_resp_i, @@ -755,12 +755,50 @@ module cachepool_cluster // --------- /***** UART ****/ - // TODO: Mux for uart - assign axi_narrow_req_o = axi_out_req[0][ClusterUart]; - assign axi_out_resp[0][ClusterUart] = axi_narrow_resp_i; - // Tie off other tiles for now - for (genvar tile = 1; tile < NumTiles; tile++) begin - assign axi_out_resp[tile][ClusterUart] = '0; + axi_narrow_req_t [NumTiles-1:0] axi_uart_mux_req; + axi_narrow_resp_t [NumTiles-1:0] axi_uart_mux_rsp; + + if (NumTiles > 1) begin : gen_uart_mux + for (genvar tile = 0; tile < NumTiles; tile++) begin + assign axi_uart_mux_req[tile] = axi_out_req[tile][ClusterUart]; + assign axi_out_resp[tile][ClusterUart] = axi_uart_mux_rsp[tile]; + end + + axi_mux #( + .SlvAxiIDWidth ( CsrAxiMstIdWidth ), + .slv_aw_chan_t ( axi_csr_mst_aw_chan_t ), // AW Channel Type, slave ports + .mst_aw_chan_t ( axi_uart_aw_chan_t ), // AW Channel Type, master port + .w_chan_t ( axi_uart_w_chan_t ), // W Channel Type, all ports + .slv_b_chan_t ( axi_csr_mst_b_chan_t ), // B Channel Type, slave ports + .mst_b_chan_t ( axi_uart_b_chan_t ), // B Channel Type, master port + .slv_ar_chan_t ( axi_csr_mst_ar_chan_t ), // AR Channel Type, slave ports + .mst_ar_chan_t ( axi_uart_ar_chan_t ), // AR Channel Type, master port + .slv_r_chan_t ( axi_csr_mst_r_chan_t ), // R Channel Type, slave ports + .mst_r_chan_t ( axi_uart_r_chan_t ), // R Channel Type, master port + .slv_req_t ( axi_csr_mst_req_t ), + .slv_resp_t ( axi_csr_mst_resp_t ), + .mst_req_t ( axi_uart_req_t ), + .mst_resp_t ( axi_uart_resp_t ), + .NoSlvPorts ( NumTiles ), // Number of Masters for the module + .FallThrough ( 0 ), + .SpillAw ( XbarLatency[4] ), + .SpillW ( XbarLatency[3] ), + .SpillB ( XbarLatency[2] ), + .SpillAr ( XbarLatency[1] ), + .SpillR ( XbarLatency[0] ), + .MaxWTrans ( 2 ) + ) i_axi_uart_mux ( + .clk_i ( clk_i ), // Clock + .rst_ni ( rst_ni ), // Asynchronous reset active low + .test_i ( '0 ), // Test Mode enable + .slv_reqs_i ( axi_uart_mux_req ), + .slv_resps_o ( axi_uart_mux_rsp ), + .mst_req_o ( axi_narrow_req_o ), + .mst_resp_i ( axi_narrow_resp_i ) + ); + end else begin : gen_uart_connect + assign axi_narrow_req_o = axi_out_req[0][ClusterUart]; + assign axi_out_resp[0][ClusterUart] = axi_narrow_resp_i; end /***** BootROM ****/ @@ -952,7 +990,7 @@ module cachepool_cluster .core_events_i ('0 ), .tcdm_events_i ('0 ), .dma_events_i ('0 ), - .icache_events_i (icache_events ), + .icache_events_i ('0 ), .cluster_probe_o (cluster_probe_o ), .dynamic_offset_o (dynamic_offset ), .l1d_spm_size_o ( ), diff --git a/hardware/src/cachepool_pkg.sv b/hardware/src/cachepool_pkg.sv index 5a1b10e..0364e38 100644 --- a/hardware/src/cachepool_pkg.sv +++ b/hardware/src/cachepool_pkg.sv @@ -184,7 +184,10 @@ package cachepool_pkg; localparam int unsigned CsrAxiMstIdWidth = ClusterAxiIdWidth; localparam int unsigned CsrAxiSlvIdWidth = ClusterAxiIdWidth + $clog2(NumTiles+1); + // Base ID width 6, plus tile mux => adding clog(tile) localparam int unsigned SpatzAxiNarrowIdWidth = 6 + $clog2(NumTiles); + // UART ID width, with an extra xbar + localparam int unsigned SpatzAxiUartIdWidth = SpatzAxiNarrowIdWidth + $clog2(NumTiles); /***** Tile Ports *****/ // We have three sets of AXI ports for each tile: @@ -270,6 +273,8 @@ package cachepool_pkg; // legacy name; TODO: remove typedef logic [SpatzAxiNarrowIdWidth-1:0] id_slv_t; + typedef logic [SpatzAxiUartIdWidth-1:0] axi_uart_id_t; + typedef logic [CsrAxiMstIdWidth-1:0] axi_id_csr_mst_t; typedef logic [CsrAxiSlvIdWidth-1:0] axi_id_csr_slv_t; @@ -393,43 +398,15 @@ package cachepool_pkg; `AXI_TYPEDEF_ALL(spatz_axi_out, axi_addr_t, axi_id_out_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) `AXI_TYPEDEF_ALL(spatz_axi_iwc_out, axi_addr_t, axi_id_out_iwc_t, axi_wide_data_t, axi_wide_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) - `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(axi_uart, axi_addr_t, axi_uart_id_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(axi_csr_mst, axi_addr_t, axi_id_csr_mst_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) + `AXI_TYPEDEF_ALL(axi_csr_slv, axi_addr_t, axi_id_csr_slv_t, axi_narrow_data_t, axi_narrow_strb_t, axi_user_t) /************************************************************** * FUNCTIONS * Order: Core -> Tile -> Group -> Cluster -> TB/L2 **************************************************************/ - ////////////////// - // AXI FUNCS // - ////////////////// - // function automatic axi_id_in_t make_cluster_id( - // input remote_tile_sel_t tile_idx, - // input logic [TileLocalIdWidth-1:0] tile_local, - // input logic [ClusterRouteIdWidth-1:0] route - // ); - // axi_id_in_t id; - // id = '0; - // id[TileLocalIdWidth-1:0] = tile_local; - // id[TileLocalIdWidth + TileIndexIdWidth - 1 : TileLocalIdWidth] = tile_idx; - // id[ClusterAxiIdWidth-1 : GroupAxiIdWidth] = route; - // return id; - // endfunction - - // function automatic remote_tile_sel_t get_tile_idx_from_cluster_id(input axi_id_in_t id); - // return id[TileLocalIdWidth + TileIndexIdWidth - 1 : TileLocalIdWidth]; - // endfunction - - // function automatic logic [TileLocalIdWidth-1:0] get_tile_local_from_cluster_id(input axi_id_in_t id); - // return id[TileLocalIdWidth-1:0]; - // endfunction - - // function automatic logic [ClusterRouteIdWidth-1:0] get_route_from_cluster_id(input axi_id_in_t id); - // return id[ClusterAxiIdWidth-1 : GroupAxiIdWidth]; - // endfunction - - /////////////////// // CORE FUNCS // /////////////////// diff --git a/hardware/tb/cachepool_cluster_wrapper.sv b/hardware/tb/cachepool_cluster_wrapper.sv index 68c9458..2914e42 100644 --- a/hardware/tb/cachepool_cluster_wrapper.sv +++ b/hardware/tb/cachepool_cluster_wrapper.sv @@ -27,6 +27,7 @@ module cachepool_cluster_wrapper parameter type axi_narrow_req_t = spatz_axi_narrow_req_t, parameter type axi_narrow_resp_t = spatz_axi_narrow_resp_t + )( input logic clk_i, input logic rst_ni, @@ -40,8 +41,8 @@ module cachepool_cluster_wrapper input axi_in_req_t axi_in_req_i, output axi_in_resp_t axi_in_resp_o, /// AXI Narrow out-port (UART) - output axi_narrow_req_t axi_narrow_req_o, - input axi_narrow_resp_t axi_narrow_resp_i, + output axi_uart_req_t axi_narrow_req_o, + input axi_uart_resp_t axi_narrow_resp_i, output axi_out_req_t [NumClusterSlv-1:0] axi_out_req_o, input axi_out_resp_t [NumClusterSlv-1:0] axi_out_resp_i ); diff --git a/hardware/tb/tb_cachepool.sv b/hardware/tb/tb_cachepool.sv index 355e63e..75203e2 100644 --- a/hardware/tb/tb_cachepool.sv +++ b/hardware/tb/tb_cachepool.sv @@ -73,8 +73,8 @@ module tb_cachepool; spatz_axi_in_req_t axi_to_cluster_req; spatz_axi_in_resp_t axi_to_cluster_resp; - spatz_axi_narrow_req_t axi_uart_req; - spatz_axi_narrow_resp_t axi_uart_rsp; + axi_uart_req_t axi_uart_req; + axi_uart_resp_t axi_uart_rsp; // DRAM Scrambled request spatz_axi_out_req_t [NumL2Channel-1:0] axi_dram_req; @@ -227,8 +227,8 @@ module tb_cachepool; **********/ axi_uart #( - .axi_req_t (spatz_axi_narrow_req_t ), - .axi_resp_t(spatz_axi_narrow_resp_t) + .axi_req_t (axi_uart_req_t ), + .axi_resp_t(axi_uart_resp_t) ) i_axi_uart ( .clk_i (clk ), .rst_ni (rst_n ), diff --git a/sim/scripts/vsim_group.tcl b/sim/scripts/vsim_group.tcl new file mode 100644 index 0000000..8edb7e5 --- /dev/null +++ b/sim/scripts/vsim_group.tcl @@ -0,0 +1,19 @@ +# Copyright 2026 ETH Zurich and University of Bologna. +# Solderpad Hardware License, Version 0.51, see LICENSE for details. +# SPDX-License-Identifier: SHL-0.51 + +# Create group for Tile $1 +onerror {resume} + +set group_path $1 + +# Add waves for remote xbar +for {set p 0} {$p < $2} {incr p} { + onerror {resume} + + set xbar_path ${group_path}/gen_remote_tile_xbar[$p]/i_tile_remote_xbar + + add wave -noupdate -group Group -group remote_xbar[$p] ${xbar_path}/* +} + +add wave -noupdate -group Group -group Internal ${group_path}/*