diff --git a/sw/cpp/.clang-format b/sw/cpp/.clang-format deleted file mode 100644 index 4b9f225..0000000 --- a/sw/cpp/.clang-format +++ /dev/null @@ -1,28 +0,0 @@ -BasedOnStyle: LLVM -Language: Cpp - -IndentWidth: 4 -UseTab: Never -#NamespaceIndentation: All - -PointerAlignment: Left -AccessModifierOffset: -4 -AlwaysBreakTemplateDeclarations: true -LambdaBodyIndentation: Signature - -MaxEmptyLinesToKeep: 3 -# ColumnLimit: 128 - -CompactNamespaces: true -FixNamespaceComments: true - -AllowShortFunctionsOnASingleLine: false -AllowShortIfStatementsOnASingleLine: true - -AlignConsecutiveAssignments: true -AlignConsecutiveBitFields: true -AlignConsecutiveDeclarations: true -AlignConsecutiveMacros: true - -#BraceWrapping: -# BeforeElse: true diff --git a/sw/cpp/CMakeLists.txt b/sw/cpp/CMakeLists.txt deleted file mode 100644 index d7d8baa..0000000 --- a/sw/cpp/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -cmake_minimum_required (VERSION 3.0) -project(cpp_decoders) - - -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - message(STATUS "Setting build type to 'Release' as none was specified.") - set(CMAKE_BUILD_TYPE - Release - CACHE STRING "Choose the type of build." FORCE) - set_property( - CACHE CMAKE_BUILD_TYPE - PROPERTY STRINGS - "Debug" - "Release") -endif() - -set(CMAKE_CXX_STANDARD 23) - -find_package(Eigen3 3.3 REQUIRED NO_MODULE) -find_package(pybind11 CONFIG REQUIRED) - -include_directories(${pybind11_INCLUDE_DIRS}) - - -find_package(OpenMP REQUIRED) - -#add_compile_options(-ffast-math) - -pybind11_add_module(cpp_decoders src/python_interface.cpp) -target_link_libraries(cpp_decoders PRIVATE Eigen3::Eigen OpenMP::OpenMP_CXX) - -set(INSTALL_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp_modules) - -install(TARGETS cpp_decoders ARCHIVE DESTINATION ${INSTALL_DIR} - LIBRARY DESTINATION ${INSTALL_DIR} - RUNTIME DESTINATION ${INSTALL_DIR}) - diff --git a/sw/cpp/src/proximal.h b/sw/cpp/src/proximal.h deleted file mode 100644 index 42e47b9..0000000 --- a/sw/cpp/src/proximal.h +++ /dev/null @@ -1,277 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - - -/* - * - * Using declarations - * - */ - - -template -using MatrixiR = Eigen::Matrix; - -template -using MatrixdR = Eigen::Matrix; - -template -using RowVectori = Eigen::RowVector; - -template -using RowVectord = Eigen::RowVector; - - -/* - * - * Proximal decoder implementation - * - */ - - -/** - * @brief Class implementing the Proximal Decoding algorithm. See "Proximal - * Decoding for LDPC Codes" by Tadashi Wadayama, and Satoshi Takabe. - * @tparam t_m Number of rows of the H Matrix - * @tparam t_n Number of columns of the H Matrix - */ -template -class ProximalDecoder { -public: - /** - * @brief Constructor - * @param H Parity-Check Matrix - * @param K Number of iterations to run while decoding - * @param omega Step size - * @param gamma Positive constant. Arises in the approximation of the prior - * PDF - * @param eta Positive constant slightly larger than one. See 3.2, p. 3 - */ - ProximalDecoder(const Eigen::Ref>& H, int K, - double omega, double gamma, double eta) - : mK(K), mOmega(omega), mGamma(gamma), mEta(eta), mH(H), - mH_zero_indices(find_zero(H)) { - - Eigen::setNbThreads(8); - } - - /** - * @brief Decode a received signal. The algorithm is detailed in 3.2, p.3. - * This function assumes a BPSK modulated signal and an AWGN channel. - * @param y Vector of received values. (y = x + w, where 'x' is element of - * [-1, 1]^n and 'w' is noise) - * @return \b std::pair of the form (x_hat, num_iter), x_hat is the most - * probably sent codeword and num_iter is the number of iterations that were - * performed. If the parity check fails and no valid codeword is reached, - * num_iter is -1 - */ - std::pair, int> - decode(const Eigen::Ref>& y) { - if (y.size() != mH.cols()) - throw std::runtime_error("Length of vector must match H matrix"); - - RowVectord s = RowVectord::Zero(t_n); - RowVectori x_hat; - RowVectord r; - - for (std::size_t i = 0; i < mK; ++i) { - r = s - mOmega * L_awgn(s, y); - - s = projection(r - mGamma * grad_H(r)); - - x_hat = s.unaryExpr([](double d) { - uint64_t bits = std::bit_cast(d); - // Return the sign bit: 1 for negative, 0 for positive - return (bits >> 63); - }).template cast(); - - if (check_parity(x_hat)) { - return {x_hat, i + 1}; - } - } - - return {x_hat, -1}; - } - - /** - * @brief Decode a received signal an measure error value (x - sign(x_hat)) - * @param x Transmitted word - * @param y Received signal - * @return \b std::vector of error values. Each element corresponds to one - * iteration of the algorithm - */ - std::vector - get_error_values(const Eigen::Ref>& x, - const Eigen::Ref>& y) { - - if (y.size() != mH.cols()) - throw std::runtime_error("Length of vector must match H matrix"); - - std::vector error_values; - error_values.reserve(mK); - - RowVectord s = RowVectord::Zero(t_n); - RowVectori x_hat; - RowVectord r; - - for (std::size_t i = 0; i < mK; ++i) { - r = s - mOmega * L_awgn(s, y); - - s = projection(r - mGamma * grad_H(r)); - - x_hat = s.unaryExpr([](double d) { - uint64_t bits = std::bit_cast(d); - // Return the sign bit: 1 for negative, 0 for positive - return (bits >> 63); - }).template cast(); - - RowVectord x_hat_bpsk = - -1 * ((2 * x_hat.template cast()).array() - 1).matrix(); - error_values.push_back( - (x.template cast() - x_hat_bpsk).norm()); - - if (check_parity(x_hat)) { - break; - } - } - - return error_values; - } - - /** - * @brief Decode a received signal and measure the norm of the two gradients - * at each iteration - * @param y - * @return \b std::vector of \b std::pair of gradient values. Each element corresponds to - * one iteration. Result is of the form [(grad_H_1, grad_L_1), ...] - */ - std::vector> - get_gradient_values(const Eigen::Ref>& y) { - - if (y.size() != mH.cols()) - throw std::runtime_error("Length of vector must match H matrix"); - - std::vector> gradient_values; - gradient_values.reserve(mK); - - RowVectord s = RowVectord::Zero(t_n); - RowVectori x_hat; - RowVectord r; - - for (std::size_t i = 0; i < mK; ++i) { - RowVectord gradl = L_awgn(s, y); - r = s - mOmega * gradl; - - RowVectord gradh = grad_H(r); - s = projection(r - mGamma * gradh); - - gradient_values.push_back({gradh.norm(), gradl.norm()}); - - x_hat = s.unaryExpr([](double d) { - uint64_t bits = std::bit_cast(d); - // Return the sign bit: 1 for negative, 0 for positive - return (bits >> 63); - }).template cast(); - - if (check_parity(x_hat)) { - break; - } - } - - return gradient_values; - } - - /** - * @brief Get the values of all member variables necessary to recreate an - * exact copy of this class. Used for pickling - * @return \b std::tuple - */ - auto get_decoder_state() const { - return std::tuple(mH, mK, mOmega, mGamma, mEta); - } - -private: - const int mK; - const double mOmega; - const double mGamma; - const double mEta; - - const MatrixiR mH; - const std::vector mH_zero_indices; - - - /** - * Variation of the negative log-likelihood for the special case of AWGN - * noise. See 4.1, p. 4. - */ - static Eigen::RowVectorXd L_awgn(const RowVectord& s, - const RowVectord& y) { - return s.array() - y.array(); - } - - /** - * @brief Find all indices of a matrix, where the corresponding value is - * zero - * @return \b std::vector of indices - */ - static std::vector find_zero(MatrixiR mat) { - std::vector indices; - - for (Eigen::Index i = 0; i < mat.size(); ++i) - if (mat(i) == 0) indices.push_back(i); - - return indices; - } - - /** - * Gradient of the code-constraint polynomial. See 2.3, p. 2. - */ - RowVectord grad_H(const RowVectord& x) { - MatrixdR A_prod_matrix = x.replicate(t_m, 1); - - for (const auto& index : mH_zero_indices) - A_prod_matrix(index) = 1; - RowVectord A_prods = A_prod_matrix.rowwise().prod(); - - RowVectord B_terms = - (A_prods.array().pow(2) - A_prods.array()).matrix().transpose(); - - RowVectord B_sums = B_terms * mH.template cast(); - - RowVectord result = 4 * (x.array().pow(2) - 1) * x.array() + - (2 * x.array().inverse()) * B_sums.array(); - - return result; - } - - /** - * Perform a parity check for a given codeword. - * @param x_hat: codeword to be checked (element of [0, 1]^n) - * @return \b True if the parity check passes, i.e. the codeword is valid. - * False otherwise - */ - bool check_parity(const RowVectori& x_hat) { - RowVectori syndrome = - (mH * x_hat.transpose()).unaryExpr([](int i) { return i % 2; }); - - return !(syndrome.count() > 0); - } - - /** - * Project a vector onto [-eta, eta]^n in order to avoid numerical - * instability. Detailed in 3.2, p. 3 (Equation (15)). - * @param v Vector to project - * @return v clipped to [-eta, eta]^n - */ - RowVectord projection(const RowVectord& v) { - return v.cwiseMin(mEta).cwiseMax(-mEta); - } -}; diff --git a/sw/cpp/src/python_interface.cpp b/sw/cpp/src/python_interface.cpp deleted file mode 100644 index 4970e75..0000000 --- a/sw/cpp/src/python_interface.cpp +++ /dev/null @@ -1,58 +0,0 @@ -#define EIGEN_STACK_ALLOCATION_LIMIT 1048576 - -#include "proximal.h" - -#include - - -namespace py = pybind11; -using namespace pybind11::literals; - - -#define DEF_PROXIMAL_DECODER(name, m, n) \ - py::class_>(proximal, name) \ - .def(py::init, int, double, double, double>(), \ - "H"_a.noconvert(), "K"_a = 100, "omega"_a = 0.0002, \ - "gamma"_a = .05, "eta"_a = 1.5) \ - .def("decode", &ProximalDecoder::decode, "y"_a.noconvert()) \ - .def("get_error_values", &ProximalDecoder::get_error_values, \ - "x"_a.noconvert(), "y"_a.noconvert()) \ - .def("get_gradient_values", \ - &ProximalDecoder::get_gradient_values, "y"_a.noconvert()) \ - .def(py::pickle( \ - [](const ProximalDecoder& a) { \ - auto state = a.get_decoder_state(); \ - \ - MatrixiR H = std::get<0>(state); \ - int K = std::get<1>(state); \ - double omega = std::get<2>(state); \ - double gamma = std::get<3>(state); \ - double eta = std::get<4>(state); \ - \ - return py::make_tuple(H, K, omega, gamma, eta); \ - }, \ - [](py::tuple t) { \ - return ProximalDecoder{ \ - t[0].cast>(), t[1].cast(), \ - t[2].cast(), t[3].cast(), \ - t[4].cast()}; \ - })); - - -PYBIND11_MODULE(cpp_decoders, proximal) { - proximal.doc() = "Proximal decoder"; - - DEF_PROXIMAL_DECODER("ProximalDecoder_7_3", 3, 7) - DEF_PROXIMAL_DECODER("ProximalDecoder_31_20", 20, 31) - DEF_PROXIMAL_DECODER("ProximalDecoder_31_5", 5, 31) - DEF_PROXIMAL_DECODER("ProximalDecoder_96_48", 48, 96) - DEF_PROXIMAL_DECODER("ProximalDecoder_204_102", 102, 204) - DEF_PROXIMAL_DECODER("ProximalDecoder_408_204", 204, 408) - DEF_PROXIMAL_DECODER("ProximalDecoder_Dynamic", Eigen::Dynamic, - Eigen::Dynamic) - - py::register_exception( - proximal, "CppException: std::runtime_error"); - py::register_exception(proximal, - "CppException: std::bad_alloc"); -} \ No newline at end of file diff --git a/sw/python/README.md b/sw/python/README.md deleted file mode 100644 index bd6f18e..0000000 --- a/sw/python/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Bachelorarbeit - -## Software - -Warning: At least a `Python 3.9` or higher is required to properly run the -scripts in this project - -### Create a python virtual environment - -In the root directory of this repository run - -```bash -$ python3 -m venv venv -$ source venv/bin/activate -$ pip3 install -r requirements.txt -``` - -### Run the unit tests - -In the root directory of this repository run - -```bash -$ python -m unittest discover test -``` diff --git a/sw/python/cpp_modules/__init__.py b/sw/python/cpp_modules/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/sw/python/cpp_modules/cpp_decoders.cpython-310-x86_64-linux-gnu.so b/sw/python/cpp_modules/cpp_decoders.cpython-310-x86_64-linux-gnu.so deleted file mode 100755 index a56c94a..0000000 Binary files a/sw/python/cpp_modules/cpp_decoders.cpython-310-x86_64-linux-gnu.so and /dev/null differ diff --git a/sw/python/decoders/__init__.py b/sw/python/decoders/__init__.py deleted file mode 100644 index c051f50..0000000 --- a/sw/python/decoders/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""This package contains a number of different decoder implementations for -LDPC codes.""" diff --git a/sw/python/decoders/maximum_likelihood.py b/sw/python/decoders/maximum_likelihood.py deleted file mode 100644 index ce76ddc..0000000 --- a/sw/python/decoders/maximum_likelihood.py +++ /dev/null @@ -1,52 +0,0 @@ -import numpy as np -import itertools - - -class MLDecoder: - """This class naively implements a soft decision decoder. The decoder - calculates the correlation between the received signal and each codeword - and then chooses the one with the largest correlation. - """ - - def __init__(self, G: np.array, H: np.array): - """Construct a new SoftDecisionDecoder object. - - :param G: Generator matrix - :param H: Parity check matrix - """ - self._G = G - self._H = H - self._datawords, self._codewords = self._gen_codewords() - - # The codewords, but mapped to [-1, 1]^n - self._codewords_bpsk = 1 - 2 * self._codewords - - def _gen_codewords(self) -> np.array: - """Generate a list of all possible codewords. - - :return: Numpy array of the form [[codeword_1], [codeword_2], ...] - (Each generated codeword is an element of [0, 1]^n) - """ - k, n = self._G.shape - - # Generate a list of all possible data words - u_lst = [list(i) for i in itertools.product([0, 1], repeat=k)] - u_lst = np.array(u_lst) - - # Map each data word onto a codeword - c_lst = np.dot(u_lst, self._G) % 2 - - return u_lst, c_lst - - def decode(self, y: np.array) -> np.array: - """Decode a received signal. - - This function assumes a BPSK modulated signal. - - :param y: Vector of received values. (y = x + w, where 'x' is - element of [-1, 1]^n and 'w' is noise) - :return: Most probably sent codeword (element of [0, 1]^k) - """ - correlations = np.dot(self._codewords_bpsk, y) - - return self._codewords[np.argmax(correlations)] diff --git a/sw/python/decoders/proximal.py b/sw/python/decoders/proximal.py deleted file mode 100644 index f0aeb81..0000000 --- a/sw/python/decoders/proximal.py +++ /dev/null @@ -1,97 +0,0 @@ -import numpy as np - - -class ProximalDecoder: - """Class implementing the Proximal Decoding algorithm. See "Proximal - Decoding for LDPC Codes" - by Tadashi Wadayama, and Satoshi Takabe. - """ - - def __init__(self, H: np.array, K: int = 1000, omega: float = 0.0002, - gamma: float = 0.05, eta: float = 1.5): - """Construct a new ProximalDecoder Object. - - :param H: Parity Check Matrix - :param K: Max number of iterations to perform when decoding - :param omega: Step size for the gradient descent process - :param gamma: Positive constant. Arises in the approximation of the - prior PDF - :param eta: Positive constant slightly larger than one. See 3.2, p. 3 - """ - self._H = H - self._K = K - self._step_size = omega - self._gamma = gamma - self._eta = eta - - self._k, self._n = self._H.shape - self._H_ne_0 = H != 0 - - @staticmethod - def _L_awgn(s: np.array, y: np.array) -> np.array: - """Variation of the negative log-likelihood for the special case of - AWGN noise. See 4.1, p. 4. - """ - return s - y - - def _grad_h(self, x: np.array) -> np.array: - """Gradient of the code-constraint polynomial. See 2.3, p. 2.""" - # Pre-computations - - A_prod_matrix = np.tile(x, (self._k, 1)) - A_prods = np.prod(A_prod_matrix, axis=1, where=self._H_ne_0) - - # Calculate gradient - - sums = np.dot(A_prods ** 2 - A_prods, self._H) - - result = 4 * (x ** 2 - 1) * x + (2 / x) * sums - - return result - - def _projection(self, v): - """Project a vector onto [-eta, eta]^n in order to avoid numerical - instability. Detailed in 3.2, p. 3 (Equation (15)). - - :param v: Vector to project - :return: x clipped to [-eta, eta]^n - """ - return np.clip(v, -self._eta, self._eta) - - def _check_parity(self, x_hat: np.array) -> bool: - """Perform a parity check for a given codeword. - - :param x_hat: codeword to be checked (element of [0, 1]^n) - :return: True if the parity check passes, i.e. the codeword is - valid. False otherwise - """ - syndrome = np.dot(self._H, x_hat) % 2 - return not np.any(syndrome) - - def decode(self, y: np.array) -> np.array: - """Decode a received signal. The algorithm is detailed in 3.2, p.3. - - This function assumes a BPSK modulated signal and an AWGN channel. - - :param y: Vector of received values. (y = x + w, where 'x' is - element of [-1, 1]^n and 'w' is noise) - :return: Most probably sent codeword (element of [0, 1]^n). If - decoding fails, the returned value is 'None' - """ - s = np.zeros(self._n) - x_hat = np.zeros(self._n) - for k in range(self._K): - r = s - self._step_size * self._L_awgn(s, y) - - s = r - self._gamma * self._grad_h(r) - s = self._projection(s) # Equation (15) - - x_hat = np.sign(s) - - # Map the codeword from [ -1, 1]^n to [0, 1]^n - x_hat = (x_hat == -1) * 1 - - if self._check_parity(x_hat): - return x_hat - - return None diff --git a/sw/python/requirements.txt b/sw/python/requirements.txt deleted file mode 100644 index 0fe1d13..0000000 --- a/sw/python/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -matplotlib==3.6.2 -pandas==1.5.2 -seaborn==0.12.1 -tqdm==4.64.1 diff --git a/sw/python/res/204.33.484.alist b/sw/python/res/204.33.484.alist deleted file mode 100644 index c3871ba..0000000 --- a/sw/python/res/204.33.484.alist +++ /dev/null @@ -1,310 +0,0 @@ -204 102 -3 6 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -73 84 81 -63 45 26 -17 77 55 -74 47 24 -9 10 52 -62 63 44 -38 39 35 -60 4 100 -82 98 63 -40 80 68 -91 81 18 -86 88 99 -77 71 65 -29 9 33 -15 41 34 -75 11 22 -48 24 95 -22 44 60 -5 19 41 -31 22 43 -21 18 56 -83 51 49 -79 7 88 -36 67 5 -84 75 32 -1 79 38 -43 82 75 -2 1 23 -33 61 83 -69 3 30 -28 5 77 -8 56 4 -53 76 36 -96 28 102 -44 17 48 -92 26 74 -56 69 11 -18 68 50 -72 34 37 -25 37 76 -23 30 21 -7 29 40 -71 78 39 -13 2 96 -55 33 51 -49 64 16 -37 66 54 -50 36 89 -45 15 57 -88 35 15 -57 102 78 -98 27 71 -27 52 94 -68 20 87 -89 38 8 -24 94 53 -11 50 19 -14 83 98 -76 55 2 -41 70 62 -78 86 14 -3 21 59 -64 23 46 -47 43 45 -95 31 1 -85 59 84 -94 54 101 -93 6 31 -59 95 61 -58 73 47 -54 87 7 -52 97 79 -12 90 28 -30 99 97 -42 100 73 -101 62 20 -80 96 85 -100 58 91 -19 16 6 -99 49 72 -70 92 17 -90 93 69 -10 40 25 -39 72 82 -67 74 12 -4 65 27 -20 85 90 -102 13 92 -46 8 9 -35 46 10 -97 53 93 -66 48 42 -87 89 64 -26 25 58 -6 57 67 -65 12 3 -61 91 66 -81 101 29 -51 60 86 -16 14 80 -34 32 70 -32 42 13 -72 17 45 -52 14 22 -49 53 2 -95 76 60 -39 57 26 -32 60 48 -2 78 8 -92 3 54 -71 55 42 -23 5 62 -35 99 50 -37 31 18 -24 84 12 -14 97 56 -94 40 44 -22 74 63 -63 49 28 -42 96 78 -101 27 85 -55 75 99 -40 9 67 -61 28 97 -76 101 16 -88 95 33 -5 33 37 -68 61 27 -65 52 38 -20 42 15 -60 23 84 -67 73 52 -25 66 53 -51 77 21 -81 62 1 -66 21 96 -75 56 83 -8 13 19 -30 19 51 -102 90 58 -97 11 68 -89 15 98 -44 20 35 -74 35 5 -26 72 59 -10 88 94 -46 69 100 -16 54 77 -91 6 74 -13 64 101 -47 32 40 -50 24 90 -38 48 46 -86 85 47 -6 51 34 -7 68 36 -56 7 31 -69 92 61 -48 39 43 -31 71 64 -33 8 93 -79 4 17 -98 37 95 -77 87 25 -19 67 49 -87 2 69 -1 22 10 -64 29 88 -70 91 65 -84 25 102 -99 45 66 -58 18 57 -4 1 70 -12 30 72 -82 89 32 -15 47 55 -18 59 24 -21 81 13 -54 100 29 -57 50 4 -90 94 23 -34 10 79 -93 44 89 -73 102 41 -80 26 82 -11 65 92 -45 41 87 -28 83 71 -85 34 39 -9 82 14 -3 36 20 -83 86 76 -29 70 80 -43 12 9 -78 63 73 -27 46 30 -59 16 86 -62 58 6 -41 98 91 -96 93 11 -53 43 81 -36 79 75 -17 38 3 -100 80 7 -26 167 28 173 65 135 -28 109 44 166 59 105 -62 191 30 110 96 203 -86 173 8 162 32 180 -19 127 31 112 24 144 -95 155 68 149 79 198 -42 156 23 157 71 204 -32 138 89 161 55 109 -5 190 14 123 89 194 -83 146 5 182 90 167 -57 186 16 141 37 200 -73 174 96 194 85 115 -44 150 88 138 102 178 -58 116 100 104 61 190 -15 176 49 142 50 130 -100 148 79 197 46 125 -3 203 35 103 81 162 -38 177 21 172 11 114 -79 165 19 139 57 138 -87 130 54 143 76 191 -21 178 62 136 41 134 -18 118 20 167 16 104 -41 112 63 131 28 181 -56 115 17 152 4 177 -40 133 94 170 83 164 -94 145 36 185 2 107 -53 196 52 121 86 128 -31 188 34 124 73 119 -14 193 42 168 98 179 -74 139 41 174 30 196 -20 160 65 114 68 157 -102 108 101 151 25 175 -29 161 45 127 14 126 -101 182 39 189 15 155 -90 113 50 144 7 143 -24 202 48 191 33 156 -47 114 40 163 39 127 -7 153 55 203 26 129 -84 107 7 159 43 189 -10 123 83 117 42 151 -60 199 15 187 19 184 -75 120 102 130 92 111 -27 194 64 201 20 159 -35 143 18 183 6 117 -49 187 2 171 64 103 -89 147 90 196 63 153 -64 151 4 176 70 154 -17 159 92 153 35 108 -46 105 80 119 22 165 -48 152 57 180 38 113 -99 134 22 155 45 139 -72 104 53 129 5 132 -33 201 91 105 56 133 -71 179 67 148 47 110 -45 122 59 111 3 176 -37 157 32 137 21 116 -51 180 95 107 49 172 -70 172 78 198 94 140 -69 197 66 177 62 145 -8 131 99 108 18 106 -97 124 29 128 69 158 -6 198 76 135 60 112 -2 119 6 195 9 118 -63 168 46 150 93 160 -96 129 86 186 13 169 -92 136 47 133 97 171 -85 132 24 165 95 123 -54 128 38 156 10 141 -30 158 37 147 82 166 -81 169 60 193 101 173 -43 111 13 160 52 188 -39 103 84 145 80 174 -1 184 70 132 75 195 -4 144 85 118 36 149 -16 137 25 122 27 202 -59 125 33 106 40 192 -13 164 3 134 31 148 -61 195 43 109 51 120 -23 162 26 202 72 182 -77 185 10 204 100 193 -98 135 11 178 1 201 -9 175 27 190 84 185 -22 192 58 188 29 137 -25 170 1 115 66 131 -66 189 87 154 77 121 -12 154 61 192 99 197 -93 166 71 164 54 187 -50 126 12 146 23 168 -55 142 93 175 48 183 -82 181 73 140 87 152 -11 149 97 169 78 199 -36 110 81 158 88 186 -68 183 82 200 91 161 -67 117 56 181 53 146 -65 106 69 126 17 163 -34 200 77 120 44 136 -91 141 72 116 74 124 -52 163 9 199 58 142 -80 171 74 113 12 122 -78 204 75 179 8 147 -76 121 98 125 67 150 -88 140 51 184 34 170 diff --git a/sw/python/res/204.33.486.alist b/sw/python/res/204.33.486.alist deleted file mode 100644 index 8d6c749..0000000 --- a/sw/python/res/204.33.486.alist +++ /dev/null @@ -1,310 +0,0 @@ -204 102 -3 6 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -76 98 67 -67 36 11 -17 44 4 -44 66 94 -79 24 34 -95 69 6 -82 87 12 -87 60 41 -3 8 45 -14 2 95 -31 79 96 -99 62 46 -98 6 48 -45 29 30 -84 33 39 -23 35 13 -4 23 84 -92 91 74 -64 77 20 -75 99 60 -57 100 77 -58 59 36 -56 12 40 -51 80 32 -50 54 21 -19 37 56 -54 86 24 -36 48 43 -5 70 47 -93 38 98 -11 78 54 -25 71 102 -16 88 1 -8 61 19 -42 40 14 -94 13 51 -32 49 31 -9 56 59 -74 20 26 -62 43 92 -63 75 66 -38 34 83 -72 65 93 -71 55 23 -18 22 78 -97 96 53 -52 31 29 -2 27 99 -85 42 86 -90 28 79 -59 85 27 -21 15 73 -27 45 5 -91 5 87 -29 53 3 -66 17 81 -101 74 2 -88 46 55 -49 97 42 -15 51 18 -100 63 16 -68 41 10 -47 82 35 -26 68 101 -22 57 9 -13 19 58 -83 89 15 -55 73 61 -35 10 38 -43 39 37 -69 7 89 -61 16 70 -53 64 17 -10 25 82 -89 26 22 -39 101 91 -65 1 75 -30 14 72 -41 92 100 -37 47 7 -70 81 62 -86 76 88 -28 50 63 -20 95 90 -102 72 76 -12 11 25 -80 3 57 -6 67 8 -73 9 44 -96 4 28 -34 21 80 -78 58 97 -60 90 71 -24 18 85 -40 94 33 -46 102 65 -48 93 68 -81 83 50 -7 30 49 -33 52 69 -77 84 52 -1 32 64 -99 95 33 -66 76 62 -41 102 80 -9 99 13 -25 45 35 -2 91 90 -16 89 53 -88 39 6 -42 11 38 -11 49 84 -35 51 39 -102 60 27 -57 14 26 -27 80 42 -101 42 50 -70 34 44 -30 92 5 -39 79 65 -92 29 101 -64 28 82 -53 67 21 -93 8 17 -76 43 23 -40 10 76 -67 84 41 -3 98 7 -36 52 63 -58 18 71 -33 88 11 -55 75 78 -23 56 29 -72 23 92 -4 57 94 -5 2 85 -15 70 49 -28 40 83 -61 71 99 -54 9 91 -63 19 4 -80 35 72 -10 12 48 -50 82 32 -71 83 100 -79 86 47 -26 48 52 -73 3 28 -65 101 97 -29 26 86 -38 66 12 -74 97 56 -75 7 36 -77 27 69 -14 63 74 -95 16 55 -47 4 73 -62 24 19 -86 73 59 -51 61 30 -84 47 88 -90 65 61 -48 72 2 -60 77 31 -87 94 77 -44 59 3 -13 36 1 -78 13 60 -56 54 45 -100 58 89 -17 74 15 -97 81 34 -6 87 64 -96 6 40 -19 17 16 -43 44 18 -89 62 67 -91 93 24 -1 100 68 -85 33 98 -31 37 20 -81 96 43 -94 41 95 -46 15 57 -45 32 14 -8 64 9 -59 21 10 -32 53 79 -49 25 75 -22 1 58 -52 22 25 -18 50 87 -34 68 66 -82 20 93 -12 5 54 -37 78 70 -21 30 37 -68 85 8 -69 31 102 -7 38 81 -24 69 51 -20 46 96 -98 55 22 -83 90 46 -102 179 77 190 33 167 -48 108 10 136 57 163 -9 128 87 148 55 166 -17 135 90 157 3 141 -29 136 54 195 53 119 -88 173 13 174 6 110 -99 200 71 153 80 128 -34 186 9 124 88 198 -38 106 89 140 65 186 -74 143 69 126 62 187 -31 112 86 111 2 131 -86 195 23 143 7 151 -66 167 36 168 16 106 -10 155 78 115 35 185 -60 137 52 184 67 171 -33 109 72 156 61 175 -3 171 56 175 73 124 -45 192 94 130 60 176 -26 175 66 141 34 158 -84 202 39 194 19 181 -52 197 91 187 25 123 -65 190 45 191 75 203 -16 133 17 134 44 125 -94 201 5 158 27 178 -32 107 74 189 86 191 -64 147 75 150 39 115 -53 116 48 154 51 114 -83 138 50 122 90 148 -55 150 14 121 47 133 -78 119 99 197 14 160 -11 181 47 199 37 164 -37 188 102 185 24 144 -100 131 15 180 95 103 -91 193 42 118 5 172 -69 113 16 142 63 107 -28 129 2 167 22 153 -80 196 26 181 70 197 -42 151 30 200 69 111 -76 120 70 110 15 113 -95 126 35 138 23 174 -79 105 62 183 8 127 -35 111 49 117 59 116 -70 176 40 125 28 182 -4 166 3 176 89 118 -14 185 53 107 9 169 -96 184 58 202 12 204 -63 157 80 161 29 146 -97 163 28 147 13 143 -59 189 37 112 99 137 -25 144 83 192 98 117 -24 160 60 113 36 201 -47 191 100 129 101 147 -73 123 55 188 46 109 -27 140 25 169 31 195 -68 132 44 203 58 156 -23 169 38 133 26 152 -21 115 65 135 87 184 -22 130 92 170 66 190 -51 187 22 166 38 159 -93 164 8 114 20 168 -72 139 34 160 68 162 -40 158 12 177 81 104 -41 141 61 155 83 129 -19 122 73 186 102 173 -77 149 43 162 96 120 -56 104 4 151 41 193 -2 127 88 123 1 177 -62 198 64 193 97 179 -71 199 6 201 100 154 -81 118 29 137 72 196 -44 145 32 139 93 130 -43 134 85 163 78 142 -89 148 68 159 52 157 -39 152 57 171 18 155 -20 153 41 132 77 189 -1 125 82 104 85 126 -101 154 19 164 21 165 -92 168 31 196 45 132 -5 146 11 120 50 188 -87 142 24 116 91 105 -98 182 81 172 56 200 -7 194 63 144 74 122 -67 204 98 145 42 138 -15 161 101 127 17 112 -49 180 51 198 94 136 -82 159 27 146 49 150 -8 165 7 173 54 192 -58 110 33 131 82 161 -75 177 67 109 71 170 -50 162 93 204 84 108 -54 178 18 108 76 140 -18 121 79 119 40 134 -30 124 97 178 43 194 -36 183 95 165 4 135 -6 156 84 103 10 183 -90 174 46 182 11 202 -46 172 59 152 92 149 -13 203 1 128 30 180 -12 103 20 106 48 139 -61 170 21 179 79 145 -57 117 76 149 64 121 -85 114 96 105 32 199 diff --git a/sw/python/res/204.55.187.alist b/sw/python/res/204.55.187.alist deleted file mode 100644 index b36a0d0..0000000 --- a/sw/python/res/204.55.187.alist +++ /dev/null @@ -1,310 +0,0 @@ -204 102 -5 10 -5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 -10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 -1 12 41 20 52 -2 41 28 40 34 -3 55 98 89 102 -4 16 64 6 13 -5 93 58 37 25 -6 91 62 67 68 -7 43 30 34 62 -8 87 53 48 50 -9 85 81 43 74 -10 82 26 77 44 -11 42 72 82 33 -12 98 83 54 65 -13 65 48 41 77 -14 10 71 47 92 -15 17 74 2 49 -16 100 63 81 24 -17 6 36 55 5 -18 80 59 98 1 -19 101 11 80 70 -20 47 32 56 90 -21 89 49 60 93 -22 19 27 87 86 -23 7 19 91 10 -24 59 25 70 66 -25 49 96 72 12 -26 64 76 11 48 -27 63 35 1 26 -28 54 75 57 11 -29 31 93 35 91 -30 95 66 32 98 -31 56 3 22 14 -32 88 21 3 23 -33 79 88 13 8 -34 13 46 96 37 -35 36 80 62 40 -36 81 101 83 97 -37 8 55 19 4 -38 37 97 102 60 -39 94 52 88 72 -40 14 90 26 9 -41 9 39 75 101 -42 3 5 24 27 -43 40 42 51 79 -44 22 17 90 63 -45 84 43 52 76 -46 97 47 85 80 -47 33 18 84 95 -48 29 73 36 84 -49 92 50 78 73 -50 27 13 95 20 -51 20 102 49 88 -52 71 65 66 89 -53 99 10 30 85 -54 52 85 50 69 -55 78 60 25 81 -56 96 70 38 43 -57 69 67 65 19 -58 74 68 14 30 -59 60 69 16 41 -60 35 54 53 39 -61 90 87 23 46 -62 48 99 21 18 -63 28 95 45 71 -64 73 86 31 53 -65 76 23 93 78 -66 72 51 46 57 -67 25 79 28 16 -68 51 100 15 96 -69 61 37 29 83 -70 75 15 71 58 -71 68 34 4 17 -72 5 92 101 21 -73 24 8 17 7 -74 32 61 27 99 -75 4 84 44 2 -76 34 33 39 38 -77 46 24 69 31 -78 39 6 58 32 -79 45 29 64 82 -80 2 7 94 56 -81 57 45 33 87 -82 1 94 100 54 -83 86 44 7 47 -84 77 91 74 64 -85 26 4 18 67 -86 102 2 12 35 -87 83 77 5 15 -88 11 9 63 59 -89 50 57 97 22 -90 53 78 68 29 -91 58 56 86 51 -92 38 16 9 42 -93 18 40 10 61 -94 30 31 76 28 -95 44 14 42 100 -96 62 82 59 75 -97 67 12 99 45 -98 21 22 73 94 -99 23 20 79 55 -100 70 89 8 36 -101 15 38 61 3 -102 66 1 92 6 -1 89 69 9 62 -2 95 87 69 99 -3 46 50 93 70 -4 20 38 65 100 -5 94 10 86 74 -6 27 84 82 12 -7 15 33 41 89 -8 44 93 11 52 -9 82 73 61 4 -10 101 54 66 55 -11 62 94 97 15 -12 4 40 70 69 -13 85 42 89 32 -14 86 11 96 29 -15 31 37 42 66 -16 90 58 95 7 -17 99 41 64 93 -18 72 74 71 87 -19 2 85 14 63 -20 78 66 18 43 -21 84 35 38 79 -22 12 100 47 101 -23 18 89 16 39 -24 21 82 50 19 -25 45 30 4 77 -26 47 70 102 61 -27 70 62 88 85 -28 1 19 78 72 -29 19 16 51 94 -30 41 23 72 47 -31 23 25 75 51 -32 64 68 63 57 -33 66 44 74 40 -34 69 64 98 97 -35 57 13 90 10 -36 16 34 53 65 -37 36 78 45 54 -38 30 52 13 67 -39 79 22 5 2 -40 65 39 24 84 -41 68 88 19 81 -42 91 2 76 46 -43 37 24 68 49 -44 13 18 36 24 -45 24 92 26 23 -46 55 45 40 83 -47 48 49 58 35 -48 97 28 52 59 -49 32 77 54 16 -50 59 56 23 68 -51 80 90 84 3 -52 58 21 33 27 -53 33 75 91 26 -54 56 8 99 42 -55 53 97 44 41 -56 40 76 100 5 -57 3 47 29 34 -58 81 26 22 13 -59 38 12 17 95 -60 6 101 30 56 -61 52 95 77 36 -62 74 4 101 50 -63 50 6 15 25 -64 35 14 94 75 -65 10 80 31 6 -66 7 36 21 64 -67 22 71 20 37 -68 11 98 27 38 -69 28 86 92 88 -70 76 57 55 82 -71 102 91 8 9 -72 83 48 6 14 -73 39 63 10 102 -74 29 65 60 22 -75 49 7 85 1 -76 25 3 7 71 -77 73 20 59 33 -78 88 15 56 44 -79 96 9 32 18 -80 34 67 87 78 -81 54 59 34 31 -82 93 102 67 90 -83 92 99 25 91 -84 67 96 81 92 -85 98 51 28 60 -86 63 79 49 80 -87 51 55 35 30 -88 60 31 1 17 -89 77 81 2 11 -90 8 43 12 28 -91 61 5 80 48 -92 17 32 43 53 -93 100 27 48 45 -94 71 61 57 96 -95 5 60 46 8 -96 87 17 39 98 -97 9 72 3 86 -98 26 29 62 20 -99 43 46 73 58 -100 75 83 79 73 -101 14 1 37 76 -102 42 53 83 21 -1 103 82 130 102 203 27 190 18 177 -2 104 80 121 86 144 15 191 75 141 -3 105 42 159 31 178 32 199 101 153 -4 106 75 114 85 164 71 127 37 111 -5 107 72 197 42 193 87 141 17 158 -6 108 17 162 78 165 4 174 102 167 -7 109 23 168 80 177 83 178 73 118 -8 110 37 192 73 156 100 173 33 197 -9 111 41 199 88 181 92 103 40 173 -10 112 14 167 53 107 93 175 23 137 -11 113 88 170 19 116 26 110 28 191 -12 114 1 124 97 161 86 192 25 108 -13 115 34 146 50 137 33 140 4 160 -14 116 40 203 95 166 58 121 31 174 -15 117 101 109 70 180 68 165 87 113 -16 118 4 138 92 131 59 125 67 151 -17 119 15 194 44 198 73 161 71 190 -18 120 93 125 47 146 85 122 62 181 -19 121 22 131 23 130 37 143 57 126 -20 122 51 106 99 179 1 169 50 200 -21 123 98 126 32 154 62 168 72 204 -22 124 44 169 98 141 31 160 89 176 -23 125 99 133 65 132 61 152 32 147 -24 126 73 147 77 145 42 142 16 146 -25 127 67 178 24 133 55 185 5 165 -26 128 85 200 10 160 40 147 27 155 -27 129 50 108 22 195 74 170 42 154 -28 130 63 171 2 150 67 187 94 192 -29 131 48 176 79 200 69 159 90 116 -30 132 94 140 7 127 53 162 58 189 -31 133 29 117 94 190 64 167 77 183 -32 134 74 151 20 194 30 181 78 115 -33 135 47 155 76 109 81 154 11 179 -34 136 76 182 71 138 7 183 2 159 -35 137 60 166 27 123 29 189 86 149 -36 138 35 139 17 168 48 146 100 163 -37 139 38 145 69 117 5 203 34 169 -38 140 92 161 101 106 56 123 76 170 -39 141 78 175 41 142 76 198 60 125 -40 142 43 158 93 114 2 148 35 135 -41 143 2 132 1 119 13 109 59 157 -42 144 11 204 43 115 95 117 92 156 -43 145 7 201 45 192 9 194 56 122 -44 146 95 110 83 135 75 157 10 180 -45 147 79 127 81 148 63 139 97 195 -46 148 77 105 34 201 66 197 61 144 -47 149 20 128 46 159 14 124 83 132 -48 150 62 149 13 174 8 195 26 193 -49 151 25 177 21 149 51 188 15 145 -50 152 89 165 49 105 54 126 8 164 -51 153 68 189 66 187 43 131 91 133 -52 154 54 163 39 140 45 150 1 110 -53 155 90 157 8 204 60 138 64 194 -54 156 28 183 60 112 12 151 82 139 -55 157 3 148 37 189 17 172 99 112 -56 158 31 156 91 152 20 180 80 162 -57 159 81 137 89 172 28 196 66 134 -58 160 91 154 5 118 78 149 70 201 -59 161 24 152 18 183 96 179 88 150 -60 162 59 190 55 197 21 176 38 187 -61 163 69 193 74 196 101 111 93 128 -62 164 96 113 6 129 35 200 7 103 -63 165 27 188 16 175 88 134 44 121 -64 166 26 134 4 136 79 119 84 168 -65 167 13 142 52 176 57 106 12 138 -66 168 102 135 30 122 52 112 24 117 -67 169 97 186 57 182 6 184 85 140 -68 170 71 143 58 134 90 145 6 152 -69 171 57 136 59 103 77 104 54 114 -70 172 100 129 56 128 24 114 19 105 -71 173 52 196 14 169 70 120 63 178 -72 174 66 120 11 199 25 132 39 130 -73 175 64 179 48 111 98 201 49 202 -74 176 58 164 15 120 84 135 9 107 -75 177 70 202 28 155 41 133 96 166 -76 178 65 172 26 158 94 144 45 203 -77 179 84 191 87 151 10 163 13 127 -78 180 55 122 90 139 49 130 65 182 -79 181 33 141 67 188 99 202 43 123 -80 182 18 153 35 167 19 193 46 188 -81 183 36 160 9 191 16 186 55 143 -82 184 10 111 96 126 11 108 79 172 -83 185 87 174 12 202 36 204 69 148 -84 186 45 123 75 108 47 153 48 142 -85 187 9 115 54 121 46 177 53 129 -86 188 83 116 64 171 91 107 22 199 -87 189 8 198 61 104 22 182 81 120 -88 190 32 180 33 143 39 129 51 171 -89 191 21 103 100 125 3 115 52 109 -90 192 61 118 40 153 44 137 20 184 -91 193 6 144 84 173 23 155 29 185 -92 194 49 185 72 147 102 171 14 186 -93 195 5 184 29 110 65 105 21 119 -94 196 39 107 82 113 80 166 98 131 -95 197 30 104 63 163 50 118 47 161 -96 198 56 181 25 186 34 116 68 196 -97 199 46 150 38 157 89 113 36 136 -98 200 12 187 3 170 18 136 30 198 -99 201 53 119 62 185 97 156 74 104 -100 202 16 195 68 124 82 158 95 106 -101 203 19 112 36 162 72 164 41 124 -102 204 86 173 51 184 38 128 3 175 diff --git a/sw/python/res/408.33.844.alist b/sw/python/res/408.33.844.alist deleted file mode 100644 index f70918f..0000000 --- a/sw/python/res/408.33.844.alist +++ /dev/null @@ -1,616 +0,0 @@ -408 204 -3 6 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -27 43 140 -88 42 106 -71 80 202 -158 129 15 -125 149 93 -13 158 180 -166 146 23 -12 65 153 -147 199 17 -4 180 99 -84 113 103 -146 51 150 -75 30 160 -163 49 87 -29 192 2 -159 74 104 -18 95 157 -86 116 132 -102 166 81 -121 60 185 -156 203 56 -63 32 36 -191 106 196 -107 128 21 -177 48 181 -151 71 80 -119 12 69 -134 145 164 -69 54 25 -111 39 33 -114 204 187 -93 38 188 -168 105 8 -122 98 163 -67 36 5 -43 186 18 -202 66 131 -162 107 126 -85 163 137 -72 41 48 -170 27 149 -126 79 179 -99 25 161 -34 122 63 -144 22 146 -157 150 183 -79 175 62 -80 40 192 -90 33 75 -161 46 73 -81 108 34 -62 2 19 -77 144 54 -21 73 53 -197 72 195 -40 156 78 -50 92 138 -36 4 184 -155 23 42 -65 26 177 -47 187 6 -153 3 27 -57 134 127 -28 200 14 -184 137 154 -39 117 128 -94 13 39 -145 21 122 -92 82 57 -59 174 200 -2 11 125 -186 119 109 -58 148 169 -109 55 1 -175 8 145 -44 132 32 -98 191 83 -140 138 156 -46 56 123 -169 87 28 -22 96 203 -37 152 112 -174 37 12 -20 29 197 -32 20 29 -53 19 143 -61 88 90 -8 75 35 -181 198 55 -115 126 10 -10 159 98 -203 115 85 -171 161 191 -135 10 7 -31 103 134 -26 85 141 -173 1 114 -128 197 198 -7 64 118 -103 141 76 -108 86 61 -74 17 116 -101 196 22 -19 91 105 -6 167 45 -190 123 129 -117 31 108 -130 97 155 -14 151 92 -127 50 88 -131 184 170 -106 125 101 -138 136 120 -66 93 144 -82 70 38 -55 157 107 -150 176 82 -204 58 37 -15 133 91 -97 15 44 -83 140 130 -142 135 95 -104 77 52 -194 59 199 -35 104 142 -17 139 11 -110 162 9 -176 142 148 -120 57 47 -60 62 124 -116 188 51 -48 194 162 -11 9 194 -24 118 77 -188 124 110 -198 61 74 -89 47 68 -192 45 113 -5 16 72 -136 5 102 -118 155 71 -56 153 182 -9 181 96 -149 202 84 -199 63 4 -164 114 172 -100 170 117 -137 110 97 -165 24 151 -96 185 26 -112 69 168 -113 6 67 -132 164 13 -189 165 41 -180 147 176 -167 121 60 -179 7 89 -148 177 173 -139 183 186 -183 67 20 -73 172 50 -30 168 193 -87 179 59 -68 131 58 -129 154 64 -160 112 46 -33 18 16 -123 160 121 -172 89 147 -185 44 3 -78 94 43 -154 81 119 -200 127 189 -52 68 66 -51 143 201 -70 99 100 -38 53 94 -152 83 49 -178 111 135 -201 173 24 -64 178 30 -187 182 139 -45 76 159 -41 78 31 -195 189 70 -23 109 79 -133 34 175 -91 100 174 -49 130 111 -42 90 158 -3 190 165 -95 28 86 -1 101 178 -76 102 152 -124 14 204 -25 84 65 -54 169 136 -143 171 190 -16 201 167 -196 52 115 -182 120 133 -105 193 40 -141 195 171 -193 35 166 -84 69 187 -27 150 193 -201 8 124 -71 9 28 -192 181 95 -146 151 62 -20 128 83 -91 20 9 -15 88 185 -18 202 133 -89 142 37 -198 170 189 -77 71 159 -101 156 183 -120 126 34 -130 122 197 -43 144 33 -121 189 45 -62 26 74 -196 168 19 -180 58 117 -173 149 90 -92 89 203 -187 24 127 -75 104 64 -134 4 88 -124 38 3 -169 83 161 -190 93 198 -159 201 195 -151 124 93 -57 43 147 -40 153 170 -6 194 57 -154 65 160 -50 154 23 -79 135 141 -145 91 108 -109 19 130 -85 130 162 -106 90 135 -117 166 144 -66 49 47 -140 191 89 -164 101 110 -150 197 101 -125 87 188 -141 73 65 -11 78 24 -97 164 131 -37 48 94 -32 127 164 -107 64 16 -152 79 2 -58 173 6 -29 3 139 -21 161 70 -165 167 129 -166 136 148 -155 177 7 -22 34 167 -193 118 174 -73 119 17 -51 172 27 -103 11 118 -64 115 140 -72 121 109 -26 47 128 -83 184 55 -131 169 11 -175 45 59 -69 30 132 -13 178 31 -170 75 21 -5 86 20 -94 31 143 -111 56 84 -110 42 168 -135 174 184 -68 41 152 -167 112 40 -33 29 97 -168 175 169 -186 10 155 -46 61 32 -139 55 116 -137 195 172 -203 187 58 -204 17 201 -45 53 69 -149 200 71 -179 114 5 -47 109 102 -8 70 22 -127 145 35 -4 94 173 -184 85 46 -44 186 125 -163 157 200 -93 77 26 -19 12 100 -61 62 181 -52 25 15 -100 105 87 -30 40 61 -42 193 115 -176 46 126 -136 76 73 -142 50 190 -7 183 199 -147 84 98 -1 147 52 -54 33 158 -99 106 165 -3 97 166 -12 159 138 -195 125 25 -144 1 85 -105 32 41 -104 72 157 -200 141 105 -188 103 80 -38 39 77 -56 140 178 -31 165 43 -133 160 48 -98 57 150 -14 110 49 -132 14 119 -25 66 86 -34 132 137 -108 123 14 -86 198 114 -171 44 142 -95 7 120 -35 22 76 -55 133 186 -82 36 8 -76 52 54 -181 28 176 -90 185 67 -119 176 112 -24 82 91 -78 81 50 -174 192 146 -16 188 149 -162 199 30 -88 18 81 -67 107 175 -197 37 4 -191 35 122 -189 203 99 -81 152 180 -178 163 121 -59 63 154 -17 131 78 -113 108 63 -63 137 153 -143 21 38 -65 117 194 -74 67 1 -60 23 111 -153 102 134 -2 74 39 -53 51 103 -9 113 51 -28 92 82 -194 179 182 -158 100 92 -199 13 56 -118 16 79 -156 95 36 -36 2 145 -126 5 202 -128 134 44 -185 138 75 -114 120 177 -183 98 179 -80 15 66 -115 96 12 -102 116 60 -129 182 10 -202 180 171 -48 171 68 -10 162 42 -148 155 53 -161 60 136 -177 204 72 -123 148 13 -172 129 196 -112 68 104 -39 196 123 -157 80 204 -160 158 96 -138 6 191 -41 139 151 -96 111 107 -122 190 106 -23 54 192 -116 143 29 -49 27 18 -182 59 163 -87 99 113 -70 146 156 -193 316 97 322 74 365 -71 368 52 377 15 258 -191 319 62 260 170 231 -10 300 58 230 145 354 -139 279 140 378 35 296 -105 238 152 399 61 259 -99 314 157 339 94 264 -88 298 75 207 33 342 -143 370 133 208 127 212 -91 389 94 288 90 386 -133 253 71 269 126 274 -8 320 27 305 83 384 -6 277 67 374 153 393 -109 332 195 333 64 336 -119 213 120 383 4 307 -199 350 139 375 167 257 -126 360 102 293 9 267 -17 214 167 352 36 405 -104 305 86 243 52 224 -84 211 85 212 160 279 -54 261 68 363 24 278 -81 265 45 340 103 298 -186 403 59 366 7 240 -134 347 149 228 180 253 -196 334 43 307 29 321 -96 272 60 223 150 304 -1 206 41 405 62 268 -64 371 192 344 80 208 -15 260 84 286 85 404 -162 309 13 276 181 351 -95 329 107 280 184 277 -85 256 22 323 76 289 -167 286 49 317 30 221 -44 335 187 265 51 219 -125 340 204 355 88 299 -58 377 35 342 22 376 -82 255 83 354 118 215 -177 327 32 231 115 363 -66 396 30 327 67 368 -56 237 48 309 202 285 -184 400 40 284 154 323 -190 310 2 282 59 389 -36 221 1 236 171 329 -76 302 170 338 120 379 -183 294 138 275 105 222 -79 289 50 311 166 301 -61 297 137 272 129 247 -132 388 25 255 40 330 -189 405 14 247 178 332 -57 240 110 313 161 348 -175 268 12 369 131 370 -174 307 200 343 123 316 -86 369 177 294 54 390 -197 317 29 403 53 343 -116 341 74 290 89 273 -142 328 79 281 21 374 -63 236 129 331 69 238 -73 259 118 225 164 292 -70 359 124 406 163 275 -130 366 20 391 156 385 -87 306 136 289 101 309 -52 223 130 306 47 210 -22 362 145 359 44 361 -181 270 99 257 165 229 -60 364 8 239 196 252 -114 247 37 334 174 383 -35 353 160 365 152 345 -164 284 174 395 137 388 -29 276 151 205 27 294 -176 408 115 298 185 261 -3 208 26 217 141 295 -40 271 55 324 139 392 -161 267 54 252 50 312 -102 365 16 368 136 223 -13 229 88 278 49 380 -194 343 183 312 100 340 -53 217 123 304 134 327 -171 348 184 253 56 360 -47 241 42 258 186 375 -48 383 3 397 26 326 -51 357 172 348 19 352 -115 342 69 347 117 371 -121 273 178 232 77 211 -11 205 196 315 144 281 -39 244 96 301 92 322 -18 337 101 279 192 334 -163 407 80 251 14 308 -2 352 87 213 110 230 -137 215 169 227 157 248 -49 345 190 245 87 226 -188 212 104 242 119 347 -69 227 57 371 109 373 -32 304 114 233 5 235 -67 280 171 300 177 255 -192 339 17 376 122 209 -150 401 81 384 143 398 -120 254 108 319 148 286 -77 331 34 382 91 315 -43 318 176 407 10 356 -147 308 188 373 176 305 -103 218 193 249 112 250 -19 385 194 367 140 297 -100 269 95 326 11 369 -123 324 125 229 16 395 -202 323 33 308 104 325 -112 245 23 318 2 402 -24 257 38 353 116 401 -101 336 51 361 107 242 -74 243 186 297 72 271 -127 282 148 332 135 249 -30 281 179 401 189 366 -151 395 166 285 82 346 -152 361 11 370 138 407 -31 381 146 296 97 337 -90 384 92 270 200 310 -131 404 18 385 102 290 -107 246 66 364 147 225 -141 375 134 266 99 269 -27 346 72 267 172 333 -129 219 201 381 113 339 -20 222 156 271 168 358 -34 402 44 220 68 355 -168 393 106 336 79 396 -195 231 135 235 130 207 -5 251 112 321 71 302 -42 378 90 219 38 311 -110 299 173 256 63 228 -98 379 24 211 66 272 -165 386 4 394 106 262 -108 220 189 244 121 243 -111 274 164 360 37 254 -153 333 76 335 18 276 -187 330 119 341 201 214 -28 230 63 379 95 367 -94 283 122 241 179 245 -140 312 113 263 197 391 -148 291 65 362 39 335 -113 399 78 380 57 320 -159 290 126 400 182 260 -78 248 121 328 1 270 -203 252 100 325 96 241 -122 313 128 215 125 338 -198 363 175 404 86 280 -45 322 53 221 114 246 -68 242 28 299 75 377 -12 210 7 408 45 349 -9 315 155 316 169 236 -158 390 73 393 128 263 -144 295 5 226 41 350 -117 250 46 206 12 331 -26 235 109 210 149 400 -178 258 82 357 194 284 -62 367 142 237 8 362 -172 239 165 240 65 359 -59 264 141 390 108 288 -21 376 56 218 78 408 -46 397 116 303 17 324 -4 373 6 398 190 317 -16 234 91 320 183 217 -166 398 168 330 13 239 -50 391 93 261 43 232 -38 351 127 389 132 244 -14 303 39 358 34 406 -146 249 153 254 28 256 -149 262 154 329 191 318 -7 263 19 246 204 319 -156 285 105 262 199 265 -33 287 162 224 151 282 -80 232 197 274 73 287 -41 278 147 216 111 237 -93 338 198 388 203 387 -169 394 161 268 146 291 -97 226 180 259 158 300 -83 349 70 283 188 266 -75 275 47 287 187 353 -128 311 117 346 155 344 -25 392 158 264 60 381 -179 358 181 277 193 328 -157 296 163 372 42 382 -155 225 10 387 6 357 -89 344 143 209 25 306 -201 406 182 386 142 372 -160 382 159 314 46 218 -65 301 111 273 58 283 -170 380 150 345 20 213 -72 288 36 302 159 341 -182 228 61 292 31 205 -135 326 131 350 32 251 -154 356 185 222 173 216 -106 233 191 402 198 313 -23 355 77 248 93 399 -138 209 15 349 48 403 -204 266 202 310 162 206 -124 372 132 238 133 364 -185 321 203 291 55 234 -200 224 103 396 23 394 -55 354 98 250 84 220 -136 216 89 337 98 233 -145 374 9 351 124 314 -173 325 64 295 70 303 -180 207 199 234 175 293 -37 387 144 214 3 378 -92 292 21 356 81 227 -118 293 31 392 195 397 diff --git a/sw/python/res/816.1A4.845.alist b/sw/python/res/816.1A4.845.alist deleted file mode 100644 index 7206495..0000000 --- a/sw/python/res/816.1A4.845.alist +++ /dev/null @@ -1,1364 +0,0 @@ -816 544 -4 6 -4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -1 273 162 494 -2 274 56 350 -3 275 167 507 -4 276 226 296 -5 277 99 528 -6 278 172 321 -7 279 221 285 -8 280 47 524 -9 281 272 371 -10 282 93 400 -11 283 122 337 -12 284 258 498 -13 285 208 503 -14 286 164 403 -15 287 242 521 -16 288 253 486 -17 289 149 408 -18 290 200 291 -19 291 237 439 -20 292 107 284 -21 293 262 341 -22 294 129 356 -23 295 119 463 -24 296 80 476 -25 297 23 436 -26 298 11 468 -27 299 210 517 -28 300 96 478 -29 301 133 435 -30 302 271 480 -31 303 233 313 -32 304 21 388 -33 305 52 287 -34 306 128 275 -35 307 245 411 -36 308 150 542 -37 309 28 326 -38 310 192 421 -39 311 196 520 -40 312 27 419 -41 313 15 277 -42 314 49 312 -43 315 13 377 -44 316 223 508 -45 317 211 440 -46 318 255 354 -47 319 202 452 -48 320 90 306 -49 321 182 372 -50 322 169 352 -51 323 197 319 -52 324 173 437 -53 325 33 431 -54 326 53 510 -55 327 260 370 -56 328 59 325 -57 329 66 433 -58 330 194 344 -59 331 148 533 -60 332 191 329 -61 333 193 281 -62 334 114 301 -63 335 218 446 -64 336 250 298 -65 337 246 305 -66 338 185 314 -67 339 124 294 -68 340 3 361 -69 341 110 462 -70 342 57 540 -71 343 32 499 -72 344 130 466 -73 345 101 310 -74 346 43 338 -75 347 83 428 -76 348 44 477 -77 349 30 413 -78 350 18 346 -79 351 138 509 -80 352 216 511 -81 353 187 416 -82 354 70 280 -83 355 117 402 -84 356 225 307 -85 357 118 518 -86 358 105 496 -87 359 7 363 -88 360 179 405 -89 361 36 299 -90 362 159 348 -91 363 106 460 -92 364 234 311 -93 365 9 376 -94 366 60 367 -95 367 213 333 -96 368 259 398 -97 369 248 397 -98 370 72 357 -99 371 263 474 -100 372 89 317 -101 373 127 351 -102 374 20 438 -103 375 227 504 -104 376 231 385 -105 377 68 488 -106 378 40 393 -107 379 5 315 -108 380 95 360 -109 381 63 457 -110 382 145 543 -111 383 41 322 -112 384 249 330 -113 385 207 276 -114 386 156 450 -115 387 198 365 -116 388 64 526 -117 389 266 406 -118 390 204 443 -119 391 239 390 -120 392 26 425 -121 393 98 502 -122 394 79 297 -123 395 257 458 -124 396 111 328 -125 397 136 389 -126 398 188 512 -127 399 91 451 -128 400 112 501 -129 401 268 308 -130 402 81 383 -131 403 195 538 -132 404 123 382 -133 405 102 530 -134 406 154 492 -135 407 78 481 -136 408 165 469 -137 409 184 342 -138 410 85 516 -139 411 264 544 -140 412 244 515 -141 413 228 506 -142 414 25 318 -143 415 220 289 -144 416 163 514 -145 417 176 475 -146 418 147 378 -147 419 224 484 -148 420 170 339 -149 421 84 534 -150 422 189 332 -151 423 201 470 -152 424 177 479 -153 425 4 355 -154 426 180 391 -155 427 22 535 -156 428 132 448 -157 429 109 347 -158 430 108 427 -159 431 241 412 -160 432 103 381 -161 433 186 531 -162 434 160 404 -163 435 235 472 -164 436 29 505 -165 437 51 362 -166 438 42 415 -167 439 181 429 -168 440 251 414 -169 441 131 380 -170 442 168 430 -171 443 222 386 -172 444 82 345 -173 445 209 467 -174 446 158 407 -175 447 267 304 -176 448 116 418 -177 449 55 497 -178 450 217 536 -179 451 31 461 -180 452 142 485 -181 453 140 302 -182 454 238 396 -183 455 62 426 -184 456 143 379 -185 457 146 519 -186 458 76 422 -187 459 16 290 -188 460 2 309 -189 461 206 303 -190 462 269 434 -191 463 100 420 -192 464 126 288 -193 465 155 283 -194 466 71 359 -195 467 151 539 -196 468 229 373 -197 469 113 490 -198 470 67 441 -199 471 190 522 -200 472 261 334 -201 473 265 320 -202 474 139 364 -203 475 65 409 -204 476 199 523 -205 477 50 487 -206 478 61 454 -207 479 46 384 -208 480 121 449 -209 481 19 444 -210 482 86 300 -211 483 12 394 -212 484 171 482 -213 485 54 445 -214 486 77 278 -215 487 58 331 -216 488 230 410 -217 489 174 442 -218 490 87 353 -219 491 236 456 -220 492 120 473 -221 493 74 527 -222 494 73 327 -223 495 256 493 -224 496 252 537 -225 497 152 392 -226 498 141 489 -227 499 205 358 -228 500 10 343 -229 501 232 369 -230 502 134 324 -231 503 6 423 -232 504 219 417 -233 505 24 424 -234 506 75 279 -235 507 157 395 -236 508 92 368 -237 509 161 471 -238 510 240 525 -239 511 215 274 -240 512 178 349 -241 513 38 282 -242 514 247 401 -243 515 88 295 -244 516 104 464 -245 517 45 447 -246 518 153 366 -247 519 48 323 -248 520 254 293 -249 521 270 483 -250 522 34 529 -251 523 97 513 -252 524 39 432 -253 525 125 286 -254 526 94 491 -255 527 35 399 -256 528 8 453 -257 529 243 455 -258 530 1 532 -259 531 37 500 -260 532 203 541 -261 533 144 292 -262 534 17 340 -263 535 175 375 -264 536 166 459 -265 537 137 374 -266 538 115 273 -267 539 14 316 -268 540 69 336 -269 541 135 495 -270 542 214 335 -271 543 212 465 -272 544 183 387 -340 118 184 198 -412 455 59 239 -339 135 538 5 -95 270 474 82 -64 254 159 268 -449 87 280 238 -179 12 192 340 -428 496 281 337 -375 542 390 484 -126 392 190 206 -193 524 31 531 -415 271 276 55 -533 49 497 494 -490 74 418 421 -181 203 152 419 -295 540 320 446 -432 76 51 473 -124 494 206 136 -275 221 156 171 -509 174 100 346 -369 85 6 334 -20 66 129 352 -349 210 69 179 -105 217 391 113 -22 50 455 306 -398 153 481 288 -238 475 9 333 -512 22 257 430 -468 187 61 286 -26 35 372 280 -482 181 332 18 -261 306 242 483 -435 486 434 520 -276 317 329 25 -355 27 175 26 -500 201 48 236 -178 398 58 256 -538 39 368 364 -379 152 331 31 -13 397 451 191 -118 430 10 20 -33 132 359 17 -425 126 183 250 -107 479 508 512 -520 208 231 441 -66 327 342 132 -400 473 285 412 -403 283 288 373 -190 278 542 262 -138 155 436 44 -366 447 385 170 -18 362 3 65 -157 223 22 386 -180 110 448 351 -125 25 399 174 -182 269 477 146 -37 265 384 98 -359 505 405 516 -147 294 182 37 -502 442 443 385 -385 535 227 248 -84 461 514 53 -223 199 133 321 -279 477 120 227 -357 234 293 78 -39 227 304 343 -235 129 162 467 -544 81 346 329 -30 264 125 155 -74 285 491 496 -12 471 251 530 -152 145 132 173 -104 405 303 513 -443 52 435 231 -256 82 99 141 -80 63 533 408 -505 375 224 366 -117 10 376 11 -484 343 267 237 -158 103 220 87 -252 165 266 49 -312 248 107 415 -173 456 225 148 -407 377 292 436 -489 354 13 215 -294 485 77 324 -45 99 216 38 -525 67 400 316 -114 439 480 293 -195 382 407 69 -479 511 295 157 -497 428 161 541 -270 307 373 119 -164 168 428 478 -237 368 278 221 -88 529 113 193 -203 383 193 277 -465 498 445 135 -87 68 469 527 -228 102 318 432 -540 236 389 91 -100 541 167 504 -370 250 460 67 -98 93 143 60 -539 46 64 202 -79 329 12 205 -184 158 131 465 -498 417 291 22 -204 336 388 217 -121 489 408 154 -112 519 515 106 -441 495 109 263 -424 189 513 19 -283 427 194 259 -308 328 409 153 -373 534 522 243 -27 366 262 34 -343 415 78 187 -352 56 371 6 -144 267 199 325 -530 261 482 265 -296 20 116 172 -93 159 356 326 -260 15 305 383 -452 188 544 95 -325 520 92 535 -341 2 424 27 -106 24 187 372 -253 467 534 128 -430 72 338 543 -324 127 509 264 -247 164 375 225 -528 70 516 506 -156 365 421 320 -338 255 525 290 -523 117 34 161 -233 154 429 518 -515 401 108 200 -475 528 321 188 -421 481 265 186 -85 342 519 365 -47 504 283 299 -321 431 379 448 -514 527 483 378 -318 388 484 537 -82 219 235 45 -345 517 461 63 -347 226 201 24 -429 97 313 234 -162 37 274 74 -481 478 401 349 -414 350 247 472 -448 58 402 233 -36 105 210 112 -136 364 18 304 -356 245 395 318 -361 79 308 103 -471 370 438 328 -458 273 44 131 -67 1 297 232 -358 435 223 322 -243 386 14 393 -307 167 130 454 -336 502 196 284 -393 218 431 151 -116 403 111 185 -320 78 233 443 -81 351 312 124 -86 268 226 395 -265 59 24 76 -511 304 46 314 -183 69 202 192 -305 18 315 381 -288 196 427 204 -153 53 145 8 -92 410 245 363 -382 402 126 255 -495 30 68 73 -442 98 463 389 -264 493 450 464 -119 73 354 137 -387 29 319 168 -148 311 151 405 -19 136 211 361 -420 137 540 279 -273 147 169 143 -381 358 72 118 -240 205 306 388 -212 507 66 466 -298 100 117 254 -310 211 71 52 -31 407 302 228 -4 464 128 84 -83 353 207 500 -384 361 517 503 -404 148 25 240 -207 232 330 127 -171 432 209 407 -488 492 337 367 -287 476 28 507 -439 488 236 463 -461 259 382 104 -470 5 237 139 -210 512 5 289 -213 436 270 315 -72 57 396 158 -299 374 255 92 -50 301 411 542 -38 95 471 222 -208 453 163 461 -317 260 309 470 -155 160 271 368 -51 487 496 79 -467 19 475 319 -177 277 500 165 -476 84 490 362 -209 170 93 459 -14 104 32 283 -186 276 243 175 -417 131 164 379 -316 183 142 519 -496 452 325 229 -451 522 488 47 -322 109 279 58 -42 286 531 177 -284 339 458 2 -191 240 311 297 -244 483 322 312 -459 239 110 414 -134 192 95 88 -542 425 348 273 -351 191 363 339 -53 424 494 207 -469 426 37 418 -21 157 364 54 -262 330 205 501 -7 490 432 10 -327 525 79 130 -313 96 73 499 -49 33 351 244 -535 437 241 46 -101 335 386 433 -202 190 81 32 -44 384 180 117 -23 355 307 195 -380 440 36 201 -519 450 135 469 -227 515 417 90 -395 532 60 471 -159 185 394 105 -110 94 43 456 -175 163 212 440 -113 108 155 336 -9 65 535 502 -501 253 511 489 -154 359 149 488 -301 399 452 508 -146 465 268 246 -397 314 478 258 -225 107 27 369 -277 124 393 342 -394 215 264 495 -34 287 380 125 -331 4 336 517 -323 115 301 376 -59 409 197 166 -57 325 11 475 -333 43 185 384 -389 387 277 305 -374 408 83 426 -383 88 1 51 -377 298 539 354 -466 229 467 300 -40 262 86 81 -422 146 179 460 -492 32 222 476 -416 175 112 271 -392 55 339 396 -176 6 96 12 -259 162 174 184 -2 244 172 480 -272 113 141 453 -445 310 414 66 -120 334 353 266 -285 179 134 423 -401 544 377 14 -250 177 506 199 -56 21 41 394 -537 468 102 253 -122 463 447 435 -266 130 57 180 -267 47 502 28 -507 149 166 402 -293 385 459 302 -62 51 287 536 -274 247 487 197 -354 281 106 468 -115 379 299 455 -70 295 138 21 -200 123 415 223 -483 275 387 347 -447 356 136 70 -28 406 404 16 -408 462 314 89 -485 75 218 147 -446 539 45 486 -344 503 543 4 -346 235 345 417 -282 54 381 327 -527 501 91 29 -76 357 528 50 -286 300 19 267 -246 48 248 491 -518 138 403 115 -406 89 362 514 -6 230 397 359 -364 141 215 129 -131 243 328 152 -63 249 439 183 -362 42 335 387 -221 182 208 56 -315 347 501 371 -97 114 273 399 -194 305 406 437 -94 209 413 121 -151 171 39 391 -473 516 324 96 -444 441 523 40 -245 521 341 295 -536 274 468 111 -102 7 366 270 -197 252 170 86 -437 62 53 189 -135 412 217 287 -54 180 504 164 -372 142 258 335 -24 413 260 220 -405 139 499 167 -189 346 67 203 -306 451 104 532 -386 86 54 190 -248 194 55 242 -71 224 123 261 -111 151 296 122 -226 303 457 357 -478 297 512 213 -128 344 146 481 -58 394 119 474 -55 491 272 358 -174 16 40 101 -426 434 472 307 -278 121 521 404 -504 371 537 462 -513 531 203 126 -472 389 357 281 -41 3 398 33 -132 150 240 521 -399 363 144 374 -487 445 360 59 -363 125 56 275 -390 61 63 458 -32 448 191 323 -15 337 239 341 -280 143 122 97 -168 321 449 41 -77 484 188 492 -140 258 416 420 -199 202 171 269 -474 60 154 107 -297 34 486 57 -508 112 289 230 -303 169 214 294 -10 220 2 291 -29 309 446 452 -418 288 532 409 -236 459 462 71 -510 543 410 109 -524 40 139 317 -291 326 38 529 -5 497 147 442 -163 71 177 425 -188 233 520 257 -289 45 105 309 -123 421 176 345 -160 216 186 406 -222 429 493 3 -150 420 30 356 -251 320 444 370 -89 279 87 382 -91 333 422 411 -96 416 505 48 -462 316 153 252 -139 251 70 150 -127 225 221 401 -220 419 282 380 -271 536 518 209 -196 172 423 313 -334 122 140 214 -456 204 137 450 -108 222 29 416 -99 161 85 247 -427 289 465 116 -411 332 261 120 -130 338 88 528 -450 523 350 35 -269 17 250 524 -342 280 15 39 -409 518 232 145 -242 77 412 296 -129 538 52 7 -419 466 369 43 -391 140 49 149 -263 231 23 282 -172 509 524 348 -494 530 249 479 -413 381 234 138 -367 396 470 353 -73 414 286 272 -141 178 114 487 -455 116 17 142 -185 213 157 99 -214 11 90 525 -365 395 195 428 -258 418 246 260 -290 241 323 375 -17 293 485 212 -534 404 228 457 -454 349 173 110 -348 372 97 438 -457 26 365 360 -531 533 244 510 -434 480 198 133 -309 292 300 485 -376 318 489 83 -526 290 310 102 -215 266 89 505 -133 340 204 61 -314 499 317 159 -52 238 347 93 -335 380 50 344 -423 482 358 160 -464 166 168 140 -206 500 98 482 -149 176 419 427 -65 120 148 445 -165 470 370 397 -541 537 62 533 -438 506 76 219 -218 345 115 68 -90 156 229 439 -328 64 80 355 -350 8 294 181 -257 186 326 413 -169 446 298 211 -68 400 507 444 -8 352 35 194 -205 200 238 424 -61 299 160 311 -477 195 256 276 -522 9 343 278 -506 315 530 123 -436 193 464 226 -396 469 495 429 -254 36 290 15 -255 444 420 308 -368 246 252 522 -486 308 426 534 -360 257 21 377 -167 198 526 77 -529 508 158 42 -201 91 82 134 -16 133 355 224 -440 111 361 178 -353 38 213 30 -166 313 165 80 -516 263 498 75 -517 514 16 434 -145 312 263 64 -371 214 8 301 -198 367 121 498 -231 422 442 509 -216 296 103 100 -543 369 425 144 -503 41 178 332 -304 207 430 298 -48 272 374 523 -521 411 253 515 -493 376 33 176 -137 474 527 285 -402 23 456 249 -463 373 378 477 -75 302 503 410 -292 197 352 493 -311 331 327 303 -319 324 254 431 -43 101 200 235 -211 526 510 245 -241 44 42 400 -431 348 230 13 -302 173 479 331 -232 14 259 449 -69 438 340 162 -330 319 284 1 -161 128 20 72 -460 454 536 210 -532 31 440 94 -109 378 529 163 -388 449 4 36 -142 323 94 169 -499 13 541 422 -46 256 118 540 -300 228 492 62 -187 291 84 526 -35 90 473 108 -281 282 127 398 -480 458 453 274 -143 341 334 23 -268 106 367 350 -433 322 476 403 -230 284 275 392 -219 134 269 544 -378 119 344 251 -326 513 181 196 -3 390 47 511 -229 443 65 85 -170 360 437 9 -60 423 219 216 -410 457 74 310 -453 391 466 490 -1 144 433 218 -234 80 454 156 -217 433 124 390 -78 83 189 447 -103 242 150 182 -332 510 316 451 -11 472 333 539 -192 237 26 208 -491 212 101 538 -337 393 349 114 -239 92 383 330 -329 206 75 338 -25 28 392 292 -224 460 7 497 -249 184 441 241 -1 258 802 432 543 775 -2 188 553 399 645 498 -3 68 796 628 324 658 -4 153 465 536 780 579 -5 107 652 475 476 275 -6 231 588 551 293 391 -7 87 509 603 815 682 -8 256 728 724 751 447 -9 93 526 732 299 798 -10 228 645 350 313 509 -11 26 808 694 539 350 -12 211 343 279 378 551 -13 43 312 782 357 771 -14 267 490 773 434 558 -15 41 635 396 679 736 -16 187 744 622 749 575 -17 262 698 678 692 314 -18 78 324 445 427 303 -19 209 456 486 584 385 -20 102 294 394 776 313 -21 32 507 560 740 571 -22 155 297 300 325 380 -23 25 517 762 685 789 -24 233 609 400 442 420 -25 142 814 327 468 306 -26 120 302 702 809 307 -27 40 389 307 532 399 -28 37 575 814 472 564 -29 164 646 454 672 582 -30 77 341 450 659 746 -31 179 464 778 283 311 -32 71 634 548 490 515 -33 53 314 512 760 628 -34 250 535 642 408 389 -35 255 786 302 728 677 -36 89 426 736 518 780 -37 259 329 422 506 331 -38 241 481 746 651 359 -39 252 338 310 598 679 -40 106 546 650 622 600 -41 111 628 756 560 637 -42 166 497 592 770 742 -43 74 768 540 523 683 -44 76 516 770 431 322 -45 245 359 655 578 418 -46 207 783 377 443 513 -47 8 414 564 796 495 -48 247 758 585 308 663 -49 42 512 285 684 353 -50 205 480 297 712 583 -51 165 485 567 289 543 -52 33 711 346 682 463 -53 54 505 447 605 334 -54 213 607 581 613 507 -55 177 621 550 614 284 -56 2 560 391 632 593 -57 70 539 478 563 642 -58 215 620 425 309 496 -59 56 538 442 274 631 -60 94 799 641 521 376 -61 206 730 633 301 709 -62 183 567 605 719 784 -63 109 591 348 633 419 -64 116 277 723 377 750 -65 203 717 526 797 324 -66 57 318 294 461 555 -67 198 432 360 611 375 -68 105 727 371 450 721 -69 268 774 444 295 362 -70 82 571 405 665 574 -71 194 615 653 463 648 -72 98 478 402 459 776 -73 222 690 453 511 450 -74 221 342 286 800 422 -75 234 764 577 813 748 -76 186 583 289 720 442 -77 214 638 681 358 741 -78 135 805 439 390 337 -79 122 378 429 510 485 -80 24 348 803 723 747 -81 130 440 340 515 546 -82 172 418 347 743 276 -83 75 466 805 542 706 -84 149 334 488 785 465 -85 138 413 293 673 797 -86 210 441 613 546 604 -87 218 371 278 661 352 -88 243 368 543 676 502 -89 100 661 587 708 576 -90 48 722 786 694 520 -91 127 662 743 582 373 -92 236 448 812 398 479 -93 10 395 376 489 711 -94 254 597 523 781 778 -95 108 276 481 502 397 -96 28 663 511 551 599 -97 251 595 421 701 636 -98 121 376 451 715 329 -99 5 673 359 347 693 -100 191 374 462 292 754 -101 73 514 768 810 622 -102 133 603 372 561 707 -103 160 806 352 754 429 -104 244 345 490 612 474 -105 86 296 426 655 522 -106 91 400 790 569 383 -107 20 316 532 354 641 -108 158 672 525 410 786 -109 157 779 496 384 649 -110 69 523 326 501 700 -111 124 616 745 438 602 -112 128 383 643 549 426 -113 197 525 554 368 296 -114 62 361 595 691 811 -115 266 570 537 721 586 -116 176 438 692 394 674 -117 83 350 408 462 516 -118 85 313 273 783 459 -119 23 453 794 620 365 -120 220 556 717 336 675 -121 208 382 624 752 597 -122 11 562 670 636 616 -123 132 656 572 615 733 -124 67 290 533 804 440 -125 253 327 632 341 535 -126 192 282 315 449 626 -127 101 666 403 787 469 -128 34 619 776 465 401 -129 22 682 339 294 589 -130 72 676 563 435 510 -131 169 590 492 379 431 -132 156 629 314 344 318 -133 29 709 744 335 704 -134 230 502 793 557 743 -135 269 606 275 519 370 -136 125 427 456 574 290 -137 265 761 457 671 453 -138 79 322 586 571 688 -139 202 665 610 650 475 -140 181 639 684 670 714 -141 226 691 589 554 347 -142 180 781 608 493 692 -143 184 789 636 376 458 -144 261 392 802 630 755 -145 110 750 344 447 680 -146 185 530 547 619 328 -147 146 331 458 652 577 -148 59 455 468 717 355 -149 17 716 565 528 684 -150 36 659 629 806 665 -151 195 598 616 455 437 -152 225 344 311 287 590 -153 246 447 298 664 387 -154 134 528 409 641 382 -155 193 484 322 525 341 -156 114 406 722 291 803 -157 235 325 507 693 363 -158 174 352 379 742 478 -159 90 522 395 277 710 -160 162 657 484 730 713 -161 237 776 673 364 408 -162 1 422 552 339 774 -163 144 653 524 482 779 -164 14 366 404 492 607 -165 136 718 353 747 487 -166 264 747 714 565 538 -167 3 741 435 374 610 -168 170 637 366 714 454 -169 50 726 644 458 781 -170 148 798 489 604 323 -171 212 470 598 640 291 -172 6 686 669 553 394 -173 52 355 772 700 344 -174 217 622 292 552 327 -175 263 524 549 307 491 -176 145 551 716 656 760 -177 152 487 559 653 497 -178 240 309 691 756 745 -179 88 279 557 547 295 -180 154 326 607 516 563 -181 167 287 303 795 724 -182 49 328 593 331 806 -183 272 444 493 315 591 -184 137 379 816 273 552 -185 66 693 522 540 438 -186 161 491 725 657 412 -187 81 785 301 400 390 -188 126 654 397 638 411 -189 150 611 385 805 605 -190 199 321 515 282 613 -191 60 499 504 634 312 -192 38 809 502 279 444 -193 61 283 734 369 368 -194 58 596 614 386 728 -195 131 362 731 695 517 -196 39 669 446 436 795 -197 51 604 765 538 568 -198 115 752 741 704 273 -199 204 640 335 392 559 -200 18 572 729 768 410 -201 151 743 308 420 518 -202 47 515 640 444 377 -203 260 369 287 626 611 -204 118 381 671 709 446 -205 227 729 460 508 378 -206 189 715 813 290 282 -207 113 469 757 466 505 -208 13 482 317 593 809 -209 173 489 597 470 668 -210 27 476 295 426 777 -211 45 769 463 456 726 -212 271 461 810 524 698 -213 95 477 693 746 618 -214 270 694 751 644 670 -215 239 708 534 589 357 -216 80 754 657 359 799 -217 178 804 296 606 381 -218 63 721 437 577 802 -219 232 793 418 799 720 -220 143 667 645 352 609 -221 7 593 291 666 367 -222 171 658 672 548 481 -223 44 335 325 433 572 -224 147 815 615 349 744 -225 84 532 666 355 404 -226 4 617 420 441 734 -227 103 520 338 333 336 -228 141 372 784 699 464 -229 196 797 545 722 494 -230 216 792 588 771 643 -231 104 753 685 317 346 -232 229 773 469 680 432 -233 31 409 654 439 425 -234 92 803 337 688 421 -235 163 339 580 418 768 -236 219 648 373 473 308 -237 19 367 809 475 351 -238 182 299 711 729 278 -239 119 812 501 635 274 -240 238 460 499 629 468 -241 159 770 697 513 816 -242 15 681 806 304 614 -243 257 434 590 491 388 -244 140 500 553 703 512 -245 35 601 428 448 769 -246 65 585 738 696 530 -247 242 404 568 424 673 -248 97 614 354 585 333 -249 112 816 591 687 762 -250 64 559 375 678 315 -251 168 660 665 343 794 -252 224 353 604 738 664 -253 16 401 527 759 561 -254 248 736 277 767 462 -255 46 737 407 479 449 -256 223 347 783 731 309 -257 123 725 740 300 654 -258 12 696 639 608 531 -259 96 552 474 773 386 -260 55 396 483 609 696 -261 200 304 393 675 615 -262 21 508 546 389 321 -263 99 685 748 750 384 -264 139 452 341 534 403 -265 201 442 329 412 393 -266 117 563 708 353 556 -267 175 564 392 351 584 -268 129 790 441 530 277 -269 190 678 328 793 640 -270 249 365 276 477 603 -271 30 668 284 484 549 -272 9 554 758 621 690 -1 266 458 431 595 503 -2 239 568 602 422 788 -3 34 291 573 792 632 -4 113 306 491 284 731 -5 41 533 487 541 369 -6 214 624 321 367 732 -7 234 336 661 496 457 -8 82 636 679 278 302 -9 61 787 569 280 627 -10 241 581 787 667 685 -11 193 386 320 414 490 -12 20 498 792 775 436 -13 7 557 342 319 761 -14 253 584 497 690 301 -15 33 472 535 567 606 -16 192 446 647 320 298 -17 143 655 674 643 476 -18 187 697 707 736 407 -19 18 651 785 380 645 -20 261 765 705 356 814 -21 248 566 698 337 361 -22 67 358 331 724 644 -23 243 288 571 363 601 -24 4 394 754 616 681 -25 122 642 618 432 499 -26 64 462 544 726 757 -27 89 479 730 570 414 -28 210 784 584 705 545 -29 62 529 480 537 751 -30 181 772 764 464 566 -31 189 644 617 345 766 -32 175 757 443 338 427 -33 65 445 596 396 541 -34 48 612 304 460 297 -35 84 435 365 517 623 -36 129 387 739 429 737 -37 188 705 646 483 655 -38 73 463 555 707 800 -39 92 766 455 499 730 -40 42 354 750 440 500 -41 31 511 747 421 669 -42 66 710 531 576 443 -43 107 594 733 445 477 -44 267 493 664 807 360 -45 100 483 306 710 650 -46 142 417 706 372 428 -47 51 767 775 454 486 -48 201 439 660 288 406 -49 6 415 637 411 335 -50 111 496 791 500 433 -51 247 537 781 697 634 -52 230 403 767 599 358 -53 56 398 539 494 392 -54 37 795 651 725 395 -55 222 510 318 766 581 -56 124 723 387 590 430 -57 60 813 378 306 340 -58 112 775 508 469 812 -59 215 536 766 311 772 -60 150 807 675 303 756 -61 95 540 662 808 299 -62 200 670 556 789 293 -63 270 712 514 592 608 -64 268 436 381 536 525 -65 11 811 635 471 280 -66 74 407 676 402 813 -67 148 275 498 550 504 -68 262 273 709 774 279 -69 21 399 789 601 635 -70 137 679 413 318 533 -71 228 390 351 732 338 -72 58 579 619 794 712 -73 172 419 721 580 656 -74 78 580 611 340 292 -75 157 420 594 711 573 -76 90 701 771 503 686 -77 240 295 700 811 423 -78 2 724 424 677 790 -79 101 504 440 512 326 -80 50 391 728 765 294 -81 218 746 466 556 689 -82 46 569 357 453 544 -83 153 307 517 744 723 -84 22 428 574 395 659 -85 98 337 583 627 617 -86 227 433 459 713 621 -87 194 330 528 314 588 -88 108 740 798 631 702 -89 68 429 467 745 456 -90 165 592 324 587 488 -91 87 632 630 504 448 -92 202 589 427 507 310 -93 115 695 406 702 413 -94 246 323 389 603 349 -95 94 689 752 790 471 -96 236 738 367 310 484 -97 229 293 755 683 532 -98 55 375 430 718 660 -99 9 751 625 391 594 -100 49 608 701 302 400 -101 196 388 763 365 320 -102 265 542 479 758 630 -103 263 281 349 404 697 -104 93 706 760 350 537 -105 43 544 356 558 740 -106 146 794 779 763 416 -107 184 311 570 415 492 -108 169 518 712 535 667 -109 160 459 688 581 445 -110 132 449 362 474 661 -111 130 543 369 812 396 -112 207 467 516 329 540 -113 104 333 566 323 332 -114 171 613 434 514 325 -115 272 454 541 573 592 -116 32 780 417 381 460 -117 125 541 627 373 451 -118 119 633 796 281 804 -119 154 684 801 296 598 -120 225 550 282 814 792 -121 106 437 811 533 434 -122 211 534 620 522 560 -123 235 521 695 428 441 -124 182 735 689 478 550 -125 97 531 312 588 718 -126 96 298 309 628 787 -127 255 630 529 327 595 -128 10 319 727 360 770 -129 242 558 410 423 666 -130 83 762 449 425 565 -131 14 320 438 586 791 -132 162 468 699 575 624 -133 88 610 345 330 455 -134 117 587 575 596 657 -135 174 356 464 362 470 -136 17 576 542 382 348 -137 203 680 538 387 647 -138 216 800 448 649 764 -139 35 675 759 480 662 -140 159 274 606 681 319 -141 77 688 609 597 725 -142 168 424 690 555 501 -143 166 284 390 572 354 -144 81 549 663 639 672 -145 232 492 380 520 580 -146 176 647 696 286 506 -147 40 683 667 716 287 -148 191 457 659 737 639 -149 38 412 656 406 286 -150 186 547 753 662 782 -151 231 713 799 669 557 -152 233 385 505 399 729 -153 120 315 503 755 653 -154 183 623 506 739 542 -155 158 674 386 446 716 -156 75 280 364 366 695 -157 167 421 658 409 735 -158 170 402 313 757 300 -159 53 771 415 437 767 -160 252 289 470 509 372 -161 57 791 804 802 514 -162 190 704 623 305 749 -163 29 305 433 346 562 -164 25 734 477 322 356 -165 52 605 513 798 596 -166 102 720 774 430 701 -167 19 473 361 591 722 -168 45 745 518 778 524 -169 198 384 600 816 317 -170 217 451 332 753 652 -171 118 346 797 332 439 -172 209 600 737 660 727 -173 213 555 631 370 717 -174 63 578 726 646 288 -175 245 574 323 562 805 -176 156 425 634 326 415 -177 208 278 780 637 773 -178 114 677 519 452 671 -179 127 495 612 312 807 -180 47 397 494 529 646 -181 256 801 482 788 554 -182 206 700 777 803 435 -183 257 692 274 297 570 -184 219 671 355 762 523 -185 109 702 800 617 699 -186 123 431 788 498 633 -187 264 501 648 566 489 -188 91 777 815 375 547 -189 179 474 334 419 482 -190 69 664 576 648 625 -191 23 763 562 451 473 -192 244 714 465 734 452 -193 271 370 530 674 379 -194 72 545 683 801 461 -195 173 486 401 545 339 -196 26 301 561 602 569 -197 136 506 735 371 519 -198 151 475 718 689 483 -199 237 430 343 481 521 -200 163 627 808 623 424 -201 220 599 319 786 289 -202 99 641 761 276 620 -203 145 411 299 486 539 -204 24 488 472 791 548 -205 76 731 336 328 763 -206 28 618 423 531 366 -207 152 363 316 772 687 -208 30 788 704 361 553 -209 135 423 412 298 619 -210 212 303 713 393 715 -211 249 573 500 416 304 -212 147 351 638 417 281 -213 180 577 358 698 705 -214 16 739 305 642 578 -215 205 631 485 568 691 -216 105 471 473 495 528 -217 226 357 382 706 527 -218 197 286 509 488 801 -219 254 810 621 342 585 -220 134 548 471 784 638 -221 223 760 452 658 765 -222 1 687 290 505 285 -223 269 450 384 735 534 -224 86 494 280 485 342 -225 177 364 652 285 815 -226 12 380 370 748 752 -227 71 782 710 610 511 -228 259 308 715 487 466 -229 128 527 582 594 508 -230 121 332 436 564 526 -231 13 756 579 764 467 -232 103 625 414 607 374 -233 164 349 330 663 708 -234 141 733 720 559 405 -235 3 565 461 727 472 -236 44 643 742 316 529 -237 79 292 686 403 753 -238 54 649 807 769 703 -239 80 443 363 527 796 -240 126 300 476 618 316 -241 251 626 795 385 345 -242 144 416 749 334 587 -243 140 410 520 383 759 -244 138 748 599 405 330 -245 27 749 419 467 536 -246 85 586 680 668 409 -247 185 519 383 413 493 -248 39 317 398 654 305 -249 15 759 601 624 629 -250 199 732 495 388 738 -251 204 408 677 600 758 -252 8 650 283 686 678 -253 238 360 510 407 694 -254 116 707 769 741 785 -255 221 582 416 761 371 -256 5 405 411 583 676 -257 250 742 368 779 651 -258 133 393 687 733 343 -259 161 703 626 497 283 -260 258 778 521 647 612 -261 59 285 703 348 719 -262 149 699 388 401 739 -263 155 513 333 526 398 -264 178 602 668 777 567 -265 224 561 719 625 417 -266 131 310 682 275 810 -267 195 377 578 544 808 -268 70 373 288 457 783 -269 260 719 374 782 364 -270 36 503 281 321 480 -271 110 755 649 579 402 -272 139 340 558 397 793 diff --git a/sw/python/res/96.3.965.alist b/sw/python/res/96.3.965.alist deleted file mode 100644 index 9ec6591..0000000 --- a/sw/python/res/96.3.965.alist +++ /dev/null @@ -1,148 +0,0 @@ -96 48 -3 6 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -14 28 39 -2 24 43 -9 23 33 -15 27 36 -12 20 37 -8 18 47 -13 21 40 -3 17 42 -5 30 44 -10 19 48 -7 32 34 -11 29 45 -1 25 38 -6 22 41 -4 26 46 -16 31 35 -1 23 45 -5 24 48 -14 19 34 -7 27 35 -8 22 46 -2 28 40 -10 17 36 -3 32 33 -4 29 44 -11 20 47 -15 30 39 -9 18 41 -13 31 43 -16 25 42 -6 21 37 -12 26 38 -6 32 40 -11 26 37 -14 25 48 -12 31 36 -3 19 43 -15 24 45 -9 30 35 -13 29 39 -1 22 34 -4 20 41 -16 21 47 -10 23 46 -8 17 44 -2 27 38 -7 28 33 -5 18 42 -1 28 46 -14 26 42 -7 23 47 -12 19 44 -3 21 45 -5 29 33 -6 27 39 -10 30 34 -8 24 38 -11 22 48 -13 20 35 -4 32 37 -16 17 40 -2 31 41 -15 18 43 -9 25 36 -8 32 43 -6 20 33 -2 22 42 -13 27 44 -3 25 39 -14 29 37 -9 31 40 -7 30 41 -5 23 38 -16 19 45 -4 21 48 -10 28 47 -15 17 46 -11 18 34 -1 26 36 -12 24 35 -13 32 41 -7 29 36 -14 30 38 -8 23 42 -1 18 33 -11 19 35 -10 26 44 -16 20 43 -5 28 34 -15 25 47 -3 31 37 -2 21 39 -9 24 46 -12 22 45 -4 27 40 -6 17 48 -13 17 41 49 79 85 -2 22 46 62 67 92 -8 24 37 53 69 91 -15 25 42 60 75 95 -9 18 48 54 73 89 -14 31 33 55 66 96 -11 20 47 51 72 82 -6 21 45 57 65 84 -3 28 39 64 71 93 -10 23 44 56 76 87 -12 26 34 58 78 86 -5 32 36 52 80 94 -7 29 40 59 68 81 -1 19 35 50 70 83 -4 27 38 63 77 90 -16 30 43 61 74 88 -8 23 45 61 77 96 -6 28 48 63 78 85 -10 19 37 52 74 86 -5 26 42 59 66 88 -7 31 43 53 75 92 -14 21 41 58 67 94 -3 17 44 51 73 84 -2 18 38 57 80 93 -13 30 35 64 69 90 -15 32 34 50 79 87 -4 20 46 55 68 95 -1 22 47 49 76 89 -12 25 40 54 70 82 -9 27 39 56 72 83 -16 29 36 62 71 91 -11 24 33 60 65 81 -3 24 47 54 66 85 -11 19 41 56 78 89 -16 20 39 59 80 86 -4 23 36 64 79 82 -5 31 34 60 70 91 -13 32 46 57 73 83 -1 27 40 55 69 92 -7 22 33 61 71 95 -14 28 42 62 72 81 -8 30 48 50 67 84 -2 29 37 63 65 88 -9 25 45 52 68 87 -12 17 38 53 74 94 -15 21 44 49 77 93 -6 26 43 51 76 90 -10 18 35 58 75 96 diff --git a/sw/python/res/999.111.3.5543.alist b/sw/python/res/999.111.3.5543.alist deleted file mode 100644 index 6d07c8d..0000000 --- a/sw/python/res/999.111.3.5543.alist +++ /dev/null @@ -1,1114 +0,0 @@ -999 111 -3 27 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 -41 56 110 -29 91 105 -8 94 9 -11 16 4 -81 1 104 -57 90 92 -27 109 106 -69 12 77 -45 100 31 -86 56 95 -103 91 55 -107 32 21 -24 47 101 -56 83 54 -13 50 103 -34 69 45 -11 66 39 -2 97 92 -33 100 19 -66 10 3 -33 41 103 -49 17 78 -11 70 28 -93 53 88 -107 13 65 -26 76 104 -14 6 44 -23 33 3 -47 9 98 -22 111 72 -98 84 96 -8 49 48 -94 82 10 -31 19 28 -1 74 68 -36 109 53 -23 68 9 -50 85 22 -24 78 95 -20 64 102 -24 103 9 -30 51 15 -34 88 79 -40 4 5 -10 73 100 -47 87 55 -63 88 26 -42 75 90 -59 27 42 -29 90 38 -100 18 63 -89 93 66 -57 59 103 -69 21 28 -70 58 39 -85 24 107 -54 25 61 -7 102 28 -5 62 27 -75 7 2 -32 19 106 -42 15 82 -35 60 69 -62 25 105 -2 82 72 -63 61 35 -2 106 71 -12 88 71 -79 65 111 -43 108 81 -95 54 67 -104 23 49 -111 82 26 -103 101 14 -42 6 101 -66 80 12 -43 26 1 -18 8 21 -42 55 93 -32 71 68 -15 77 19 -58 23 93 -67 97 51 -101 76 70 -73 17 25 -50 56 53 -36 10 16 -99 104 96 -63 83 60 -94 76 17 -3 83 35 -84 30 89 -111 86 110 -18 90 27 -99 52 14 -24 42 97 -3 90 19 -82 35 51 -20 90 99 -45 33 22 -27 14 20 -71 75 34 -52 57 46 -97 59 60 -20 96 11 -64 6 55 -73 43 12 -106 111 44 -75 96 86 -35 76 44 -81 20 30 -25 33 43 -59 105 68 -45 25 68 -37 109 93 -79 84 6 -73 95 37 -91 18 108 -6 92 36 -43 111 101 -55 56 81 -38 32 43 -10 24 61 -44 27 15 -97 43 69 -103 44 65 -4 34 47 -29 64 74 -13 87 7 -108 46 69 -51 40 44 -31 85 63 -89 60 80 -41 61 92 -67 52 36 -96 27 51 -98 8 28 -87 10 35 -13 16 68 -71 33 15 -94 91 75 -82 103 40 -95 58 27 -93 107 101 -95 93 106 -60 2 101 -38 56 71 -45 65 98 -36 62 58 -61 68 27 -89 76 46 -18 45 52 -12 19 61 -109 42 74 -57 88 64 -54 31 82 -4 80 102 -91 43 85 -9 69 70 -29 61 42 -82 75 102 -10 60 46 -76 11 41 -2 40 46 -23 106 107 -18 98 80 -57 35 74 -91 20 1 -102 34 96 -87 83 40 -15 37 94 -26 3 31 -29 20 73 -5 61 52 -51 80 7 -36 21 100 -106 110 66 -54 48 27 -82 4 28 -78 16 15 -19 25 101 -91 24 57 -38 8 50 -43 60 78 -48 3 102 -29 21 76 -61 80 91 -37 104 88 -21 99 26 -109 68 100 -98 75 100 -9 6 109 -21 79 52 -37 38 92 -1 71 66 -5 8 74 -22 15 58 -16 91 107 -4 84 2 -7 70 72 -57 3 96 -9 50 110 -21 111 25 -46 13 34 -61 107 64 -32 83 10 -47 30 7 -54 55 38 -62 64 83 -59 1 108 -68 94 4 -28 74 83 -60 47 99 -23 86 14 -37 40 76 -97 31 107 -28 37 3 -107 90 53 -67 99 106 -22 14 65 -90 73 23 -65 25 86 -45 62 48 -88 36 89 -19 26 47 -94 69 104 -92 7 20 -95 109 7 -22 104 63 -60 21 77 -77 7 101 -45 35 56 -43 75 13 -97 86 36 -67 89 38 -71 96 41 -9 39 95 -30 52 58 -27 32 4 -12 107 79 -38 6 18 -108 47 103 -111 19 85 -59 54 90 -43 15 46 -34 17 58 -99 53 110 -28 16 95 -110 44 63 -101 105 9 -10 25 18 -12 85 75 -54 102 1 -72 36 47 -108 79 80 -58 78 106 -31 39 92 -6 52 37 -35 32 8 -70 3 47 -110 70 20 -6 74 106 -95 33 94 -94 78 5 -58 66 13 -11 26 35 -63 51 94 -81 42 2 -77 74 27 -66 42 69 -87 22 59 -72 67 5 -80 65 105 -7 69 4 -75 30 80 -92 23 18 -55 11 86 -46 74 31 -99 107 56 -64 4 13 -40 24 93 -81 34 37 -40 16 86 -12 67 2 -31 8 69 -77 3 44 -104 53 19 -19 39 99 -1 41 94 -26 62 50 -98 63 37 -100 8 2 -67 45 40 -79 61 48 -77 9 104 -90 76 47 -81 89 59 -21 5 92 -106 65 40 -86 84 52 -62 24 16 -63 86 73 -23 29 110 -85 72 102 -89 11 15 -5 71 84 -64 17 45 -42 34 16 -45 6 70 -42 72 63 -23 31 24 -97 61 26 -70 93 35 -67 81 17 -102 41 5 -72 95 61 -5 91 19 -74 7 88 -27 92 69 -92 99 29 -89 70 71 -8 56 85 -80 97 82 -43 39 87 -34 84 111 -40 18 68 -54 69 13 -18 32 105 -22 99 100 -38 30 5 -2 28 34 -104 30 78 -53 41 63 -48 85 103 -70 62 49 -57 109 102 -6 56 88 -30 49 107 -80 73 94 -30 63 93 -109 97 50 -49 6 40 -67 56 93 -97 103 89 -22 23 95 -94 53 105 -13 6 48 -7 55 106 -71 87 94 -9 79 85 -6 93 96 -52 16 2 -47 107 43 -87 54 8 -20 57 25 -29 32 65 -73 76 49 -59 66 38 -11 13 2 -57 13 56 -24 22 77 -28 86 103 -36 1 51 -46 59 62 -84 66 105 -89 87 37 -20 84 50 -46 44 36 -92 94 66 -69 48 41 -69 101 75 -90 41 105 -36 42 83 -58 69 51 -58 57 85 -34 56 104 -97 55 37 -108 110 6 -81 98 105 -95 45 107 -98 39 49 -37 62 96 -38 75 70 -51 25 78 -102 22 8 -32 39 34 -78 21 64 -101 65 26 -48 25 76 -99 103 111 -63 81 75 -88 55 39 -25 12 8 -17 59 52 -20 10 2 -11 12 24 -75 33 55 -90 15 66 -92 9 1 -48 1 14 -21 22 67 -48 86 44 -101 85 110 -14 49 83 -12 50 105 -47 57 12 -62 39 89 -39 68 36 -18 15 110 -21 39 20 -32 110 16 -70 15 65 -42 11 53 -31 5 17 -65 64 54 -105 42 1 -24 70 14 -42 111 94 -83 109 12 -73 16 46 -62 40 32 -51 12 74 -49 106 50 -14 87 12 -2 22 53 -98 83 97 -79 97 4 -25 102 103 -59 74 2 -1 87 106 -85 33 6 -88 107 50 -17 15 96 -7 66 33 -51 72 108 -77 17 40 -97 111 77 -75 24 35 -68 103 46 -6 95 105 -104 57 11 -15 9 35 -100 23 70 -9 26 59 -71 62 72 -52 27 94 -80 15 20 -98 6 12 -30 42 57 -104 14 71 -5 58 44 -39 57 18 -27 16 53 -3 53 95 -72 49 4 -14 85 105 -97 81 5 -19 81 44 -67 74 98 -38 44 60 -38 36 20 -83 8 103 -45 19 23 -71 50 51 -31 109 4 -9 84 83 -62 57 17 -6 75 17 -78 38 99 -16 25 14 -48 29 24 -87 23 48 -41 43 52 -73 98 101 -34 106 57 -62 99 61 -90 1 4 -33 47 20 -28 45 49 -13 106 38 -57 108 100 -103 75 58 -86 79 102 -71 102 11 -45 90 82 -50 35 96 -46 54 78 -92 8 79 -20 52 109 -80 13 83 -100 14 51 -6 29 60 -96 61 101 -61 94 31 -50 70 54 -3 20 68 -86 62 7 -58 96 1 -55 30 14 -91 32 56 -57 44 66 -17 36 91 -98 61 21 -62 34 38 -5 51 76 -43 76 77 -105 10 79 -61 84 59 -85 66 2 -22 74 54 -68 50 92 -60 91 87 -101 66 5 -110 100 105 -95 42 70 -105 19 8 -89 43 61 -33 89 21 -75 29 106 -21 42 102 -90 49 11 -51 48 17 -51 22 73 -35 110 107 -29 34 55 -68 108 11 -14 82 67 -16 83 82 -103 100 74 -88 25 99 -91 86 69 -65 47 88 -109 96 85 -50 63 4 -19 93 14 -67 92 60 -88 40 3 -39 50 60 -77 65 46 -87 62 80 -42 7 54 -91 40 53 -47 89 54 -36 30 43 -23 30 77 -90 77 95 -64 111 31 -50 23 89 -14 4 89 -109 5 88 -104 79 41 -97 47 52 -16 51 87 -46 81 84 -91 109 2 -86 64 67 -32 13 31 -48 39 106 -5 77 57 -53 18 1 -73 105 104 -35 80 49 -47 1 69 -60 81 22 -107 82 96 -3 27 25 -86 53 61 -58 89 100 -86 76 83 -61 109 3 -3 107 60 -32 2 80 -101 29 46 -100 49 56 -71 77 110 -31 70 37 -92 78 14 -5 26 93 -86 108 109 -100 6 69 -73 1 31 -65 28 76 -60 41 64 -98 41 17 -44 37 71 -99 28 51 -111 41 9 -54 60 111 -26 48 10 -100 82 47 -41 108 3 -46 22 91 -44 41 49 -55 53 28 -54 85 18 -49 10 81 -39 103 29 -103 109 16 -22 26 69 -72 76 39 -58 97 20 -74 76 19 -52 49 9 -11 3 63 -48 97 73 -8 1 67 -44 21 88 -8 59 15 -111 53 7 -62 15 29 -13 28 93 -68 83 30 -104 52 82 -80 11 109 -111 1 88 -111 33 83 -43 90 88 -103 72 69 -50 48 75 -14 21 54 -83 78 61 -12 28 36 -48 90 64 -2 24 26 -4 59 44 -48 9 7 -106 80 33 -102 30 50 -55 102 74 -66 4 21 -35 105 89 -23 60 20 -108 8 36 -12 58 84 -22 28 38 -33 109 101 -68 72 60 -26 13 17 -37 57 67 -31 57 71 -29 47 66 -62 23 76 -90 79 96 -59 12 92 -71 99 82 -109 26 94 -12 37 21 -42 79 40 -35 108 12 -108 34 67 -56 4 36 -73 82 8 -12 45 55 -74 71 10 -102 97 78 -108 73 87 -98 13 44 -30 74 79 -39 16 8 -68 33 58 -19 109 62 -76 102 58 -40 41 109 -38 82 64 -10 78 67 -36 105 40 -7 84 93 -104 32 84 -37 42 13 -18 55 9 -42 110 87 -41 24 82 -75 51 21 -96 39 13 -59 45 79 -79 39 67 -72 99 58 -106 43 9 -4 85 88 -81 36 74 -79 68 73 -56 17 69 -93 12 68 -9 64 3 -99 30 48 -103 84 80 -85 35 55 -62 54 108 -46 39 86 -19 35 43 -25 53 67 -25 7 83 -27 87 84 -1 78 33 -88 2 9 -1 38 85 -55 89 79 -81 33 54 -27 98 91 -50 77 28 -29 28 67 -106 104 42 -81 66 48 -51 103 20 -70 80 46 -46 110 37 -24 81 50 -25 107 22 -21 45 38 -68 10 75 -20 61 46 -83 105 93 -99 24 87 -96 29 25 -11 1 97 -78 87 98 -15 95 111 -93 51 39 -98 30 90 -76 71 18 -28 14 32 -70 4 41 -66 99 83 -84 77 49 -102 29 37 -91 23 65 -55 105 27 -45 41 15 -64 109 81 -63 59 5 -12 46 102 -79 94 46 -7 108 40 -35 94 100 -16 30 29 -62 65 92 -64 96 59 -3 32 24 -2 18 19 -56 29 26 -52 56 106 -105 15 69 -82 66 77 -45 63 96 -11 92 45 -101 11 23 -23 99 5 -10 54 76 -37 7 100 -37 75 72 -60 8 7 -81 45 4 -31 49 34 -108 63 111 -30 46 25 -75 56 19 -70 73 92 -65 33 93 -78 91 79 -92 88 110 -58 101 71 -58 107 8 -111 20 104 -22 27 49 -59 102 10 -39 65 3 -107 77 78 -10 93 31 -8 72 10 -93 87 82 -92 86 43 -80 58 48 -74 111 90 -68 95 26 -98 72 110 -28 85 104 -52 7 89 -55 52 44 -1 77 13 -65 24 68 -22 56 31 -59 34 80 -73 19 67 -35 91 66 -91 34 90 -82 33 57 -21 82 59 -81 71 90 -30 87 95 -94 97 18 -38 84 110 -26 40 89 -96 55 60 -18 88 30 -74 105 11 -44 95 89 -62 63 97 -63 67 15 -6 31 72 -50 32 6 -103 49 15 -108 10 84 -5 10 53 -98 56 23 -44 102 84 -15 40 73 -40 71 9 -37 11 50 -101 84 64 -77 41 51 -65 49 108 -4 95 52 -79 27 72 -14 80 37 -13 61 55 -104 64 98 -98 25 32 -10 11 52 -81 106 70 -88 41 20 -19 34 66 -107 70 44 -108 31 66 -41 78 31 -95 35 104 -56 64 2 -78 80 36 -85 100 27 -38 17 111 -65 96 43 -18 111 107 -14 76 63 -13 100 29 -101 56 16 -10 22 86 -53 32 78 -90 24 106 -99 16 81 -40 63 64 -29 49 33 -60 110 94 -74 108 32 -43 98 34 -84 70 18 -74 13 47 -102 16 23 -97 72 23 -68 91 47 -32 69 95 -57 107 26 -64 26 32 -17 3 93 -110 30 17 -48 11 94 -43 24 63 -100 96 76 -6 2 39 -58 77 59 -45 91 44 -92 53 33 -72 18 73 -86 89 18 -108 55 17 -101 38 104 -54 100 28 -101 72 83 -16 17 22 -27 88 17 -24 17 83 -45 16 104 -60 53 52 -73 99 34 -36 85 65 -9 78 27 -65 110 5 -25 4 38 -47 53 21 -36 33 77 -7 3 76 -79 5 47 -33 28 87 -64 110 52 -51 19 86 -53 26 87 -14 73 75 -34 93 72 -54 35 84 -3 85 78 -45 54 53 -75 109 111 -1 70 5 -29 9 93 -33 32 42 -111 8 30 -80 71 25 -13 22 92 -41 81 57 -27 101 40 -10 39 1 -98 4 29 -65 84 69 -42 91 12 -71 55 24 -47 59 39 -50 86 47 -3 104 18 -72 52 100 -28 17 97 -14 29 43 -85 74 37 -97 106 84 -34 77 103 -20 18 16 -61 32 88 -63 56 21 -41 19 89 -25 35 79 -84 94 107 -23 66 63 -101 37 10 -86 59 78 -58 86 4 -85 16 67 -73 2 107 -77 91 81 -34 7 94 -65 109 48 -6 23 51 -30 1 24 -64 70 19 -82 58 49 -20 75 44 -40 110 90 -95 40 31 -47 11 73 -105 96 46 -50 16 58 -10 42 45 -51 37 53 -44 87 100 -13 90 5 -59 98 76 -15 38 39 -45 26 102 -48 110 104 -22 82 9 -93 54 11 -44 97 56 -43 3 99 -7 64 27 -108 53 4 -89 49 69 -102 31 36 -107 33 46 -62 3 14 -102 35 68 -11 75 25 -9 99 57 -74 62 41 -80 111 57 -38 33 76 -99 93 74 -79 7 31 -27 6 8 -109 60 71 -91 95 110 -22 6 78 -51 92 52 -94 43 62 -18 49 61 -66 24 60 -68 8 106 -96 30 72 -20 17 54 -87 103 90 -13 15 101 -35 38 65 -5 89 108 -36 50 76 -60 95 34 -61 85 23 -87 81 21 -36 64 79 -46 55 104 -66 26 103 -83 96 67 -106 63 12 -77 48 68 -70 105 67 -73 69 83 -21 17 80 -32 12 100 -56 105 82 -15 88 14 -88 72 28 -55 2 83 -2 108 98 -19 78 52 -28 92 26 -929 899 891 779 715 696 694 615 606 581 563 560 498 477 430 416 400 399 363 289 253 210 195 168 77 35 5 -997 996 924 857 826 739 695 624 572 555 509 429 425 395 359 352 331 292 284 268 199 164 146 67 65 60 18 -955 949 906 888 879 852 766 738 684 604 591 571 570 566 537 496 454 286 260 217 201 185 172 97 91 28 20 -951 922 900 876 812 752 722 679 651 630 625 549 534 477 465 455 427 280 274 239 211 199 179 157 127 44 4 -978 941 891 880 875 803 747 730 578 559 550 513 505 457 451 414 330 317 315 306 298 272 264 196 174 59 44 -967 964 928 857 800 799 580 492 468 448 440 431 378 351 347 342 337 309 262 258 241 192 119 116 106 75 27 -963 950 926 879 777 751 749 733 692 667 626 609 541 497 434 348 318 274 231 228 227 207 200 175 129 60 58 -972 964 894 769 762 751 659 652 633 608 606 516 488 462 393 385 354 322 292 285 259 196 183 137 78 32 3 -958 946 892 874 807 695 684 678 670 626 603 587 466 444 442 399 350 295 250 237 202 192 159 41 37 29 3 -938 920 899 835 818 803 802 769 768 765 748 710 665 654 596 589 507 395 251 206 162 138 123 87 45 33 20 -957 947 935 854 818 808 795 746 745 715 614 604 526 521 484 441 413 396 359 305 277 266 163 105 23 17 4 -992 987 902 731 683 653 649 647 644 634 622 448 424 422 419 406 405 396 393 284 252 240 153 107 76 68 8 -976 941 896 845 833 815 779 674 669 657 638 611 557 490 480 360 359 347 327 280 265 233 204 139 129 25 15 -994 955 909 885 832 814 721 620 577 549 535 527 499 491 470 456 450 424 417 404 400 220 214 101 95 74 27 -994 976 943 806 801 798 742 728 717 610 608 447 442 433 412 409 398 305 245 197 180 171 140 124 81 62 42 -937 923 913 870 867 846 838 834 735 659 598 553 528 470 453 420 411 352 308 301 283 248 198 180 139 87 4 -991 974 908 869 868 867 863 853 852 829 682 638 584 522 502 468 467 436 433 414 394 314 307 246 90 85 22 -970 913 906 862 861 844 831 794 790 739 720 670 595 560 452 409 328 326 276 251 241 166 152 118 94 78 51 -998 930 916 883 821 783 756 739 690 661 602 535 516 463 458 317 288 287 243 225 181 153 97 81 61 34 19 -974 932 913 820 763 711 704 632 601 496 489 478 461 447 410 395 367 355 261 227 173 168 111 105 101 99 40 -991 982 915 877 787 709 673 647 630 620 607 520 518 503 410 401 387 298 230 203 193 189 186 176 78 54 12 -967 946 896 867 835 781 764 708 635 599 592 564 523 510 425 401 385 361 345 329 271 229 220 197 100 38 30 -981 928 919 847 846 804 747 746 726 642 632 548 545 472 463 443 345 311 303 276 221 214 165 82 72 37 28 -971 929 903 869 855 837 780 738 713 707 672 624 471 438 417 396 361 311 301 281 182 123 96 56 41 39 13 -957 917 895 876 817 755 714 708 692 691 566 530 470 428 393 389 384 355 251 222 203 181 114 112 85 64 57 -999 985 944 884 851 850 792 774 740 646 638 624 599 589 578 444 388 312 290 266 225 189 172 77 73 47 26 -964 950 898 874 868 828 813 764 727 699 693 566 453 446 319 269 239 178 150 143 136 124 101 94 59 49 7 -999 995 908 881 865 776 721 701 700 635 622 611 594 586 582 479 362 331 248 217 212 179 137 58 54 34 23 -909 900 892 840 833 740 735 725 714 701 641 610 597 573 525 519 492 471 356 320 303 186 173 160 128 50 2 -973 929 894 853 794 789 755 735 719 685 658 628 612 545 544 499 449 340 338 332 330 275 238 207 111 92 42 -963 953 934 824 823 799 781 768 753 640 581 576 557 547 494 465 414 311 285 278 257 216 172 156 132 34 9 -992 914 893 851 849 842 836 817 800 738 721 668 572 557 500 421 411 386 356 328 259 239 206 122 80 61 12 -961 954 893 881 878 860 840 786 758 698 694 660 636 627 616 518 478 434 431 397 263 140 112 100 28 21 19 -980 926 912 886 872 843 821 785 782 753 650 525 504 475 386 376 331 325 308 282 246 204 169 127 102 43 16 -977 956 917 887 825 784 734 690 687 649 631 562 524 486 442 438 313 266 259 232 167 138 110 98 91 66 63 -983 979 953 878 873 827 680 666 651 633 622 544 502 461 408 373 368 363 254 234 224 176 149 135 119 87 36 -939 920 910 814 808 750 749 725 706 669 647 639 585 576 382 377 366 291 282 258 217 215 194 188 171 117 115 -977 961 943 876 864 829 791 709 696 664 635 504 480 469 461 460 383 358 330 241 235 208 194 183 147 122 50 -943 904 899 857 766 718 689 676 674 659 600 597 558 538 452 410 408 407 392 386 381 324 288 257 237 55 17 -934 933 898 839 807 806 792 733 666 663 648 542 537 436 421 342 326 299 293 283 281 215 170 164 142 131 44 -959 916 897 824 820 810 728 722 672 663 593 591 587 584 583 551 473 372 370 333 315 289 236 163 134 21 1 -938 902 893 702 671 669 648 541 520 515 449 418 416 413 373 310 308 270 268 160 154 96 79 75 62 49 48 -969 949 909 855 843 830 771 690 678 617 544 517 506 473 353 324 245 233 184 158 125 122 120 112 107 77 70 -948 940 932 859 822 805 796 778 657 625 607 593 585 501 460 458 451 402 368 286 249 131 126 124 110 108 27 -944 938 889 870 859 752 745 744 728 709 675 653 485 479 463 380 309 307 293 232 223 152 148 114 100 16 9 -984 954 936 755 732 731 711 706 705 689 592 573 554 539 487 439 420 368 364 278 245 204 164 162 151 130 103 -935 905 904 880 877 848 845 641 590 563 552 543 532 478 406 353 296 260 254 242 225 213 207 127 46 29 13 -988 945 927 854 772 703 685 626 623 619 605 589 558 522 472 471 402 400 389 370 347 334 294 223 185 178 32 -970 952 931 840 811 801 764 753 724 603 596 593 574 562 521 479 455 423 404 381 357 342 338 335 72 32 22 -979 937 905 808 800 707 700 628 619 548 538 534 511 495 486 464 432 423 405 367 341 290 202 183 86 38 15 -968 939 928 883 810 718 704 673 586 553 523 522 505 491 464 435 422 384 374 363 267 175 136 131 98 83 42 -998 968 907 882 871 818 812 778 777 741 613 603 552 489 473 446 394 352 300 258 238 193 174 152 135 103 95 -951 939 889 884 877 871 860 836 803 691 609 594 567 560 542 454 453 425 413 346 333 287 247 218 86 36 24 -974 947 889 887 865 748 698 688 620 595 588 543 541 510 495 487 415 354 327 253 244 208 178 156 71 57 14 -996 984 903 863 815 793 778 727 697 687 670 653 629 594 525 499 397 392 377 348 277 208 121 106 79 46 11 -993 948 915 834 826 804 781 756 741 740 682 651 574 500 376 360 343 337 322 279 232 147 121 86 14 10 1 -960 958 897 850 786 640 639 559 501 481 475 467 452 449 441 406 375 360 355 336 201 182 167 155 103 53 6 -937 931 922 858 772 762 761 677 662 660 634 601 568 498 482 451 375 374 265 256 246 238 197 149 143 82 55 -942 921 904 858 787 782 765 737 730 675 644 625 608 508 444 429 394 364 358 297 271 244 210 113 104 53 49 -980 971 965 871 841 793 751 637 632 588 583 571 564 538 536 512 492 460 230 213 184 162 146 133 104 89 63 -981 970 914 815 711 621 570 567 517 508 503 494 493 476 316 312 294 205 187 174 160 153 150 134 123 66 57 -969 959 955 797 736 688 661 642 610 540 504 497 476 467 445 421 407 382 364 335 301 290 223 209 149 64 59 -987 919 915 855 839 832 798 797 754 744 730 604 534 391 340 333 310 302 291 267 249 229 132 89 66 51 47 -983 950 930 882 851 839 826 816 809 737 729 684 664 623 583 556 547 415 387 307 280 209 205 155 128 106 40 -977 927 901 875 873 830 811 780 766 758 736 726 582 539 532 415 412 388 356 299 273 222 220 148 126 69 25 -985 971 919 823 821 784 743 723 703 641 630 513 509 501 434 398 369 365 358 270 265 195 177 76 52 20 17 -989 986 923 798 783 701 691 676 665 650 639 606 556 536 527 459 401 343 314 293 284 272 235 219 135 83 71 -988 972 956 848 780 774 710 683 681 660 637 612 526 511 496 439 408 326 211 190 150 139 114 113 80 37 35 -990 952 901 849 742 682 618 599 580 563 531 374 371 370 327 319 285 274 270 226 159 130 125 63 54 16 8 -989 930 891 844 822 819 757 722 705 576 515 495 443 417 412 383 335 321 313 309 261 260 200 159 84 55 23 -965 903 895 807 788 761 720 654 645 640 585 575 484 464 450 445 349 321 306 236 195 147 140 102 80 68 67 -995 973 907 886 866 861 847 813 799 775 769 750 677 637 618 600 455 445 435 316 310 304 272 254 200 65 30 -990 935 924 885 872 861 806 783 757 681 656 652 605 581 561 523 474 420 357 339 302 221 173 117 107 85 45 -962 959 910 845 842 795 773 680 658 654 629 602 529 510 459 429 422 318 278 269 262 212 196 167 154 128 35 -957 932 890 885 756 750 710 673 619 519 482 468 438 397 391 383 371 275 252 233 191 161 141 109 102 60 48 -979 961 942 879 856 832 748 720 662 642 602 600 582 569 506 505 389 357 296 215 186 163 151 110 90 84 26 -988 925 912 878 858 810 779 767 743 724 700 575 559 546 545 539 506 437 436 361 295 286 269 231 230 81 8 -998 967 921 888 874 836 827 824 767 759 716 694 665 655 621 577 487 469 387 384 332 264 256 184 180 39 22 -983 963 917 880 813 759 732 697 681 676 675 658 648 643 551 507 488 483 427 350 294 255 240 193 116 69 43 -991 960 895 827 814 782 772 705 686 627 614 572 562 540 490 447 339 323 275 273 255 187 175 166 157 133 76 -982 925 897 838 819 788 752 729 707 703 698 680 596 564 554 458 457 391 379 314 297 282 268 121 111 70 5 -993 946 931 787 786 770 743 672 664 652 645 613 590 565 528 527 485 323 179 161 156 142 98 73 65 62 33 -996 990 986 869 866 723 712 692 621 616 612 569 528 490 466 462 426 419 404 373 212 209 206 170 91 89 14 -918 911 901 887 844 809 805 802 791 724 693 686 668 667 634 554 508 466 367 365 325 306 300 199 116 92 31 -981 923 910 888 873 828 776 696 687 679 595 533 509 456 431 403 375 350 334 322 304 252 243 158 132 56 38 -922 921 905 883 862 835 771 689 579 569 567 556 531 497 483 402 362 302 300 283 277 234 222 214 109 93 10 -982 975 940 884 881 789 770 716 713 693 671 656 553 540 512 472 430 424 366 354 349 324 271 170 138 129 46 -995 994 914 868 820 794 760 695 679 617 615 607 550 537 532 530 432 392 337 318 224 188 155 68 47 43 24 -978 952 916 862 796 792 777 697 631 568 549 548 543 518 517 407 366 344 321 305 297 235 224 151 133 92 52 -975 941 933 837 788 785 773 719 643 623 617 546 521 485 477 398 372 296 244 221 218 99 97 94 50 48 6 -966 925 902 859 848 785 784 759 726 699 592 555 542 531 512 502 500 317 198 187 182 168 158 141 118 11 2 -999 968 896 860 771 760 757 745 736 644 577 536 511 488 399 369 320 319 298 276 257 227 194 134 119 18 6 -962 947 892 886 852 770 768 758 718 712 683 667 611 578 535 351 343 340 313 281 145 144 115 82 79 52 24 -969 926 918 854 841 790 734 732 646 494 446 418 369 349 346 339 289 267 264 263 226 211 171 141 90 33 3 -980 966 934 849 825 812 796 789 774 717 546 515 454 440 380 345 316 263 248 237 228 145 143 117 71 39 10 -986 973 936 856 830 793 744 737 714 674 643 565 533 498 493 486 433 382 351 236 201 169 136 109 105 88 31 -948 911 908 847 797 790 715 655 605 601 552 457 437 427 426 377 344 341 323 312 234 216 125 104 96 83 18 -997 942 900 843 817 816 804 775 719 716 699 657 584 503 474 459 448 426 381 379 291 191 166 148 137 31 29 -962 958 949 872 838 747 723 713 685 677 645 586 530 476 469 390 329 320 288 279 247 219 213 189 99 95 88 -992 940 907 865 856 833 828 749 734 590 580 574 568 529 514 491 481 443 329 292 191 190 176 51 45 19 9 -976 920 898 866 864 834 809 761 746 636 573 513 493 474 403 388 371 250 231 181 146 144 120 84 75 74 13 -956 953 944 846 805 765 731 725 662 655 629 628 520 484 483 428 385 336 315 304 253 185 169 161 157 58 40 -985 975 912 801 704 686 618 598 597 529 482 462 439 428 390 362 344 334 242 142 126 74 53 41 21 15 11 -984 945 906 870 864 825 816 776 763 702 668 613 561 551 450 441 376 332 295 287 229 226 188 88 72 26 5 -993 989 936 795 742 727 712 666 631 561 516 514 507 456 440 416 405 379 372 365 346 328 273 250 113 64 2 -987 972 911 837 819 741 702 678 627 558 519 480 475 430 423 348 299 262 256 219 177 165 145 108 67 61 7 -954 924 918 850 831 822 767 762 708 571 565 524 432 380 353 338 279 240 218 216 205 198 165 144 56 25 12 -997 978 951 863 842 823 811 802 754 733 688 656 650 649 633 591 579 526 481 435 378 255 242 210 130 118 70 -965 927 890 729 663 661 646 636 614 598 579 570 555 550 533 489 465 419 341 336 228 192 190 154 115 36 7 -966 945 933 882 875 853 841 791 775 760 706 671 575 524 514 411 409 403 378 303 261 249 247 202 177 93 1 -960 894 890 831 829 773 763 754 717 616 615 609 588 587 547 437 418 390 325 243 203 120 108 93 73 69 30 diff --git a/sw/python/res/999.111.3.5565.alist b/sw/python/res/999.111.3.5565.alist deleted file mode 100644 index 7130dd6..0000000 --- a/sw/python/res/999.111.3.5565.alist +++ /dev/null @@ -1,1114 +0,0 @@ -999 111 -3 27 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 -101 65 10 -85 33 107 -70 109 1 -58 36 78 -40 24 21 -86 92 72 -85 59 81 -54 110 24 -39 48 85 -96 28 36 -75 101 9 -82 62 34 -56 97 2 -94 47 44 -106 74 1 -26 8 29 -18 77 7 -96 95 32 -30 10 43 -14 60 16 -61 84 42 -19 66 73 -25 68 110 -63 64 90 -38 47 101 -71 13 24 -52 37 75 -5 74 109 -89 77 104 -4 64 5 -13 97 34 -6 39 16 -9 89 20 -42 53 110 -61 8 62 -18 79 108 -97 71 107 -16 35 101 -77 69 102 -61 75 54 -110 76 92 -7 37 57 -105 61 55 -99 74 94 -108 43 32 -99 73 101 -88 90 70 -85 109 46 -80 27 59 -16 34 15 -54 32 106 -31 39 24 -78 84 69 -9 97 52 -66 75 30 -45 91 80 -106 110 28 -76 51 4 -76 16 88 -18 40 27 -75 105 53 -78 44 12 -74 90 22 -77 103 38 -35 17 58 -29 31 44 -95 27 24 -27 38 55 -90 67 36 -69 66 25 -82 61 83 -8 73 81 -111 89 95 -2 57 94 -111 76 7 -22 6 65 -103 105 64 -59 38 40 -65 79 31 -29 95 68 -33 47 5 -31 18 16 -77 111 41 -6 14 41 -43 79 67 -87 70 9 -83 27 81 -28 90 92 -107 58 37 -106 12 91 -96 92 102 -19 42 92 -69 12 55 -105 51 67 -39 1 13 -83 85 65 -104 86 25 -50 12 107 -7 29 19 -99 40 106 -20 84 85 -12 105 4 -50 91 15 -23 99 82 -7 12 8 -30 92 79 -100 20 64 -102 83 23 -11 46 59 -21 10 95 -6 98 91 -62 43 46 -3 71 22 -76 10 1 -104 5 101 -30 22 87 -29 25 107 -98 21 20 -81 67 92 -75 10 33 -107 42 105 -94 62 53 -43 106 24 -39 73 47 -19 77 16 -59 13 2 -35 34 4 -57 77 93 -57 33 45 -89 18 48 -48 7 110 -86 29 78 -75 17 24 -4 79 11 -25 72 102 -50 14 13 -55 99 56 -2 63 65 -76 31 74 -96 104 108 -52 100 73 -46 61 76 -51 45 56 -37 110 3 -59 61 73 -75 26 35 -54 15 78 -31 43 38 -25 59 71 -25 79 45 -31 63 40 -31 57 102 -24 67 111 -42 17 34 -51 50 85 -60 53 91 -80 18 87 -69 41 5 -40 54 104 -8 44 42 -39 109 51 -70 40 30 -64 54 53 -83 74 7 -30 42 2 -67 48 93 -66 15 70 -54 77 88 -90 5 78 -95 103 94 -41 10 98 -86 36 4 -59 45 106 -20 90 81 -51 111 55 -63 48 26 -74 57 54 -32 10 83 -74 6 49 -33 35 54 -96 88 63 -65 108 92 -21 79 23 -88 23 84 -42 89 37 -81 1 37 -100 90 2 -97 53 76 -33 60 94 -12 47 96 -18 81 94 -97 66 28 -109 3 14 -13 45 53 -6 97 93 -79 83 55 -73 69 72 -101 80 62 -25 87 55 -84 58 71 -17 25 103 -93 38 61 -84 68 33 -15 58 109 -52 94 84 -73 62 51 -57 95 14 -57 96 61 -104 73 14 -71 81 33 -64 13 61 -91 57 88 -30 24 32 -93 9 22 -10 85 28 -93 47 43 -47 105 35 -20 65 111 -3 56 92 -106 69 21 -17 63 7 -3 5 88 -42 102 80 -13 16 10 -62 32 100 -108 41 70 -1 98 95 -76 33 27 -46 53 78 -46 102 73 -26 104 53 -108 30 100 -6 48 36 -111 9 34 -42 93 5 -36 18 93 -19 60 15 -47 41 61 -23 62 66 -106 81 13 -12 23 45 -92 8 51 -27 39 23 -82 10 109 -38 12 70 -4 30 38 -72 79 16 -96 10 79 -100 83 77 -99 52 44 -46 2 68 -23 81 65 -111 19 83 -4 26 85 -23 36 49 -77 51 71 -29 38 23 -10 58 63 -62 21 68 -14 46 7 -99 25 10 -107 86 31 -102 44 32 -95 47 56 -57 52 67 -7 103 31 -60 89 79 -60 46 20 -70 39 89 -84 10 51 -22 110 109 -80 93 52 -82 19 46 -4 49 100 -28 41 88 -87 64 37 -103 12 67 -10 108 37 -79 5 1 -43 25 105 -49 45 84 -62 54 87 -45 68 18 -101 59 77 -96 53 34 -11 89 91 -100 63 6 -98 52 29 -34 56 85 -105 15 95 -91 29 2 -58 80 95 -30 67 21 -17 39 50 -111 101 100 -84 109 35 -99 66 11 -64 65 82 -46 56 32 -68 106 111 -47 65 91 -22 7 72 -27 91 104 -100 38 37 -10 66 91 -58 38 97 -72 61 9 -36 19 65 -31 37 70 -101 61 107 -22 78 61 -64 78 43 -46 111 4 -13 28 12 -84 76 56 -16 73 63 -9 4 21 -3 73 98 -88 55 18 -3 81 64 -20 108 42 -20 35 80 -90 89 31 -48 78 104 -24 1 48 -110 34 11 -16 74 53 -85 73 7 -45 89 63 -94 89 107 -25 15 100 -35 86 41 -91 108 82 -49 41 105 -59 37 74 -54 8 52 -12 36 89 -43 19 75 -10 39 111 -7 45 42 -34 101 2 -66 83 56 -32 50 78 -49 90 34 -24 4 92 -85 94 14 -66 37 39 -2 93 58 -94 98 58 -43 91 103 -48 102 70 -17 15 82 -6 43 52 -103 19 72 -38 54 26 -95 49 101 -7 102 107 -51 22 104 -80 53 6 -70 105 11 -5 45 99 -41 76 43 -32 27 16 -69 2 52 -51 19 101 -83 44 40 -79 90 44 -46 5 71 -86 3 26 -31 69 108 -103 99 32 -47 81 9 -97 55 26 -51 5 49 -39 103 2 -19 47 26 -45 74 41 -40 55 16 -72 85 36 -71 104 17 -29 48 97 -37 72 27 -11 77 96 -88 61 31 -59 99 100 -22 105 23 -67 8 77 -40 65 100 -82 40 84 -71 27 98 -12 51 37 -32 82 77 -74 108 3 -49 22 55 -67 4 75 -11 53 102 -77 17 26 -84 72 2 -83 80 41 -54 39 34 -30 63 74 -39 105 86 -19 14 20 -88 8 34 -12 40 35 -22 16 44 -79 94 64 -56 25 1 -48 105 80 -3 45 38 -20 69 86 -52 63 41 -12 41 34 -24 5 29 -107 21 51 -77 35 65 -69 30 80 -3 7 39 -106 23 26 -11 39 67 -108 90 38 -57 8 53 -6 66 85 -82 28 55 -3 20 16 -105 104 2 -87 52 59 -92 52 26 -41 93 84 -13 87 57 -101 110 13 -40 64 86 -110 35 9 -17 27 13 -13 62 22 -97 54 92 -19 88 1 -111 22 80 -27 22 88 -4 91 63 -92 74 44 -96 87 65 -48 75 84 -103 46 40 -92 105 16 -21 54 100 -40 29 9 -61 70 17 -7 79 27 -72 6 60 -29 60 28 -51 46 74 -104 102 19 -101 29 69 -111 94 48 -54 41 36 -105 79 88 -100 68 86 -57 98 51 -22 67 56 -91 110 17 -72 89 62 -76 104 21 -63 11 111 -49 11 31 -19 57 90 -46 107 100 -57 80 21 -72 38 109 -8 110 32 -66 77 33 -2 40 110 -26 31 67 -21 1 75 -5 65 28 -24 58 73 -44 101 50 -47 48 57 -59 86 98 -96 46 27 -102 75 28 -17 107 87 -71 53 12 -35 62 48 -32 60 38 -87 68 102 -55 11 32 -30 107 27 -82 51 58 -109 9 50 -39 76 60 -104 34 31 -97 77 74 -13 66 76 -76 58 86 -17 62 4 -1 94 59 -85 63 108 -82 3 33 -42 68 85 -96 55 33 -108 88 15 -57 38 50 -91 78 99 -107 5 14 -35 44 70 -20 75 62 -33 86 63 -109 95 45 -84 28 1 -36 99 3 -40 19 98 -19 55 59 -13 3 68 -49 63 102 -86 32 57 -108 21 72 -92 21 58 -108 23 97 -87 104 39 -14 32 2 -82 89 4 -85 18 2 -60 36 27 -30 111 59 -81 44 61 -83 103 11 -18 1 104 -87 32 23 -28 26 68 -60 88 98 -95 48 41 -53 41 15 -93 94 50 -102 99 15 -72 81 17 -97 20 83 -55 48 42 -96 60 24 -14 106 70 -71 93 88 -69 60 17 -63 38 76 -106 78 72 -33 18 6 -38 15 75 -29 56 70 -102 47 108 -100 35 106 -44 66 68 -26 2 74 -107 45 62 -41 56 50 -29 87 75 -20 103 56 -72 34 48 -7 51 59 -30 37 18 -17 59 89 -34 105 60 -84 91 59 -24 45 50 -36 71 101 -48 99 20 -26 81 56 -20 5 43 -99 93 85 -68 90 11 -110 77 47 -108 44 4 -87 73 76 -31 54 14 -80 50 89 -97 68 14 -70 67 47 -12 111 16 -97 43 33 -61 65 106 -82 16 69 -56 73 74 -90 72 58 -52 106 82 -14 92 22 -78 24 56 -57 25 12 -4 58 8 -65 26 34 -29 45 20 -49 40 43 -88 42 78 -44 76 36 -34 3 25 -89 64 93 -68 82 104 -111 69 58 -92 37 69 -108 103 28 -43 86 50 -97 101 98 -78 6 87 -57 18 11 -21 83 3 -16 47 71 -54 28 93 -96 101 56 -58 25 19 -15 80 31 -94 105 28 -110 15 96 -90 30 13 -31 4 41 -101 24 85 -28 99 46 -53 103 89 -8 87 11 -11 12 104 -53 14 27 -6 8 20 -27 105 5 -33 44 21 -74 9 60 -67 42 98 -47 31 32 -111 60 64 -38 8 13 -97 95 85 -5 50 37 -108 110 95 -18 103 13 -66 8 98 -25 37 49 -67 15 73 -88 73 10 -43 9 55 -84 18 66 -68 67 109 -99 2 19 -71 95 63 -20 37 54 -79 29 35 -82 8 74 -107 98 99 -108 75 55 -84 97 21 -97 103 41 -27 86 70 -45 22 69 -37 46 90 -50 35 49 -64 91 85 -40 85 75 -8 101 18 -34 38 7 -58 16 85 -81 42 75 -18 50 111 -8 93 90 -45 17 11 -11 106 5 -68 37 36 -36 109 16 -21 77 49 -38 5 9 -32 71 28 -15 46 8 -52 17 47 -79 39 71 -39 18 35 -42 86 49 -109 96 26 -37 41 102 -23 74 80 -45 97 67 -23 31 52 -60 90 4 -9 94 71 -36 66 82 -78 14 1 -9 66 64 -29 94 4 -79 47 68 -38 98 82 -67 50 33 -96 3 78 -103 27 45 -23 20 93 -55 6 71 -26 83 87 -49 28 14 -76 102 30 -87 110 99 -10 62 71 -71 68 92 -36 26 32 -34 69 95 -22 75 94 -49 7 104 -64 47 28 -35 69 15 -12 9 77 -70 98 103 -6 79 2 -84 54 98 -96 37 73 -94 38 88 -107 92 53 -96 93 103 -105 96 100 -52 91 76 -9 83 92 -23 107 95 -82 26 76 -1 90 47 -93 86 82 -94 83 67 -76 70 25 -100 33 28 -23 111 35 -35 64 59 -66 111 109 -18 5 67 -40 1 53 -14 81 12 -99 58 29 -62 6 9 -65 105 29 -42 90 14 -36 30 73 -10 110 61 -106 15 92 -77 10 23 -28 17 9 -81 96 7 -94 72 39 -107 6 15 -76 78 11 -79 100 97 -100 3 44 -39 81 32 -101 33 30 -49 69 27 -100 50 88 -103 104 47 -96 48 86 -81 95 86 -11 97 65 -106 101 25 -34 24 99 -42 106 4 -17 51 80 -83 22 84 -107 2 75 -86 24 87 -98 56 35 -48 45 14 -81 110 19 -6 58 42 -53 83 70 -28 80 37 -90 61 66 -75 32 74 -81 78 52 -10 5 60 -91 21 16 -80 3 12 -63 13 104 -7 87 44 -21 55 73 -102 59 95 -27 6 50 -88 65 109 -15 51 79 -21 64 52 -107 70 8 -58 1 60 -72 63 3 -68 1 8 -9 1 36 -95 60 26 -65 110 70 -72 23 13 -83 93 49 -56 7 60 -98 45 110 -15 65 33 -36 103 24 -9 76 18 -40 61 69 -46 3 50 -9 44 80 -72 11 71 -80 84 99 -84 65 107 -24 25 64 -89 87 33 -62 65 57 -73 44 111 -26 43 61 -33 13 46 -29 32 80 -41 87 100 -95 62 106 -57 82 92 -12 2 10 -22 34 86 -108 12 93 -1 57 42 -102 22 58 -30 29 3 -93 104 62 -1 30 46 -81 4 98 -43 88 35 -13 80 54 -31 30 6 -48 52 19 -107 67 49 -3 111 105 -14 89 108 -109 60 78 -89 71 69 -42 63 97 -2 67 89 -110 72 74 -43 69 14 -58 53 66 -51 83 18 -5 17 55 -30 91 94 -85 78 21 -106 77 60 -21 7 89 -91 19 22 -13 69 91 -72 24 49 -59 16 90 -43 2 1 -61 20 39 -52 25 53 -64 75 49 -68 88 4 -48 66 106 -77 52 79 -89 83 86 -43 15 63 -44 109 23 -73 68 78 -46 81 10 -83 109 98 -90 33 40 -50 55 70 -49 109 91 -95 54 99 -56 71 31 -17 43 84 -64 102 51 -20 36 34 -23 55 54 -11 35 7 -66 16 24 -53 82 18 -59 5 63 -23 30 25 -54 22 66 -108 109 48 -6 40 17 -109 6 24 -73 1 103 -110 64 27 -105 52 62 -101 55 64 -36 8 56 -44 96 25 -44 56 19 -57 68 75 -25 62 39 -87 93 92 -104 79 50 -100 98 61 -28 56 109 -103 78 62 -102 29 106 -40 11 15 -20 102 94 -14 8 33 -50 74 47 -41 51 26 -42 70 59 -84 11 24 -47 86 21 -35 66 108 -56 14 64 -59 82 39 -105 87 10 -62 85 31 -49 39 12 -61 19 94 -1 63 110 -43 96 66 -36 104 111 -95 79 17 -6 11 28 -77 99 50 -16 2 8 -106 85 17 -35 73 6 -25 61 5 -77 84 4 -29 84 34 -108 45 105 -15 76 71 -55 67 63 -81 22 24 -13 41 60 -4 3 107 -19 12 63 -96 35 71 -30 20 78 -59 18 41 -18 58 106 -70 74 13 -107 1 22 -50 68 54 -74 111 17 -59 15 24 -8 85 55 -51 34 70 -69 23 18 -52 83 34 -90 25 75 -89 51 99 -109 92 12 -23 57 46 -3 95 65 -97 16 75 -104 42 83 -104 16 29 -103 69 57 -75 109 100 -103 21 61 -7 25 36 -37 13 26 -107 26 79 -58 89 49 -55 20 1 -46 80 108 -101 45 72 -32 33 91 -78 33 92 -83 5 76 -95 37 44 -28 30 57 -51 72 53 -105 56 91 -98 43 48 -2 44 88 -88 87 36 -60 101 54 -58 27 87 -5 100 39 -26 103 102 -60 31 99 -23 48 90 -68 20 15 -46 97 86 -32 67 37 -90 41 110 -9 86 65 -73 109 2 -40 3 91 -52 49 33 -9 48 53 -66 88 81 -98 76 106 -81 79 82 -42 22 73 -30 77 62 -45 40 93 -7 43 94 -19 64 32 -100 7 70 -69 68 93 -40 102 67 -96 62 74 -53 38 65 -80 82 71 -50 11 92 -27 4 93 -110 80 38 -27 89 52 -10 14 44 -47 8 97 -38 64 42 -9 98 102 -6 94 101 -14 29 72 -47 10 78 -111 56 54 -28 31 21 -945 922 898 868 837 811 807 778 777 775 722 713 678 528 510 497 474 437 408 325 279 227 186 114 95 15 3 -969 956 904 837 823 804 752 702 637 551 523 521 472 426 398 375 364 348 341 291 251 187 165 138 126 74 13 -970 934 915 818 809 789 776 765 738 684 602 592 514 511 499 425 418 410 393 369 320 318 222 219 193 144 113 -988 915 908 841 812 749 680 675 611 586 570 522 496 440 395 345 317 313 274 254 246 172 134 127 102 58 30 -960 950 907 862 828 763 721 663 659 627 619 566 505 475 414 374 368 361 279 235 222 169 158 115 81 30 28 -995 906 902 867 866 815 770 757 735 725 702 687 618 600 545 450 423 359 353 287 233 195 179 111 84 76 32 -981 979 941 859 832 783 767 733 697 653 557 449 418 357 340 328 302 266 260 221 164 131 105 99 75 42 17 -992 926 904 885 872 777 774 665 657 652 641 630 625 618 615 586 470 422 404 387 336 242 160 105 72 35 16 -994 972 968 790 787 778 732 725 710 700 679 676 663 634 621 490 447 433 372 317 307 234 214 86 54 33 11 -997 991 894 848 804 763 731 729 692 633 339 305 278 270 261 258 248 244 224 215 178 171 120 114 110 19 1 -987 902 889 883 859 791 746 736 659 658 616 615 601 568 527 487 465 464 420 396 383 360 326 297 286 134 109 -932 916 896 806 804 765 723 700 616 585 576 483 413 405 391 337 314 277 245 241 190 105 102 98 93 90 62 -942 921 914 834 814 799 781 766 629 625 610 514 494 435 434 431 430 314 240 224 211 194 136 126 95 31 26 -996 991 892 885 825 819 755 727 723 689 678 617 583 574 572 540 521 505 403 346 260 209 207 193 136 84 20 -964 925 911 883 845 785 772 735 730 699 665 632 609 607 546 535 533 502 352 331 290 237 204 167 147 103 50 -937 935 904 860 836 764 661 654 603 579 576 445 425 406 378 363 327 316 247 224 125 82 59 50 38 32 20 -924 905 901 866 855 828 750 732 666 658 559 542 536 496 482 461 448 434 397 380 352 294 221 201 154 133 65 -928 920 919 861 827 787 721 668 656 652 635 629 601 558 545 528 523 319 283 236 191 157 130 82 60 36 17 -980 916 897 874 833 816 756 637 606 513 512 466 453 437 403 376 365 354 338 308 273 253 237 125 99 92 22 -964 945 918 884 857 838 686 639 618 588 566 564 555 537 507 425 411 403 322 321 268 218 174 118 107 101 33 -999 940 890 832 830 773 768 764 662 644 620 602 518 517 474 468 463 446 415 317 293 259 220 183 118 110 5 -976 922 913 864 833 808 805 751 696 647 583 460 439 438 435 406 394 386 358 311 302 271 214 116 113 76 63 -963 933 928 863 858 846 781 731 718 711 686 674 672 529 519 419 386 257 255 252 243 241 239 184 183 108 104 -925 913 889 867 860 835 794 786 753 748 612 584 562 539 476 414 345 325 213 153 133 123 67 52 26 8 5 -941 930 907 876 873 863 839 794 747 716 631 606 592 585 408 331 280 261 201 199 150 149 135 117 97 70 23 -961 943 942 887 798 779 712 694 688 670 587 565 551 530 473 428 419 397 376 373 369 355 254 231 176 146 16 -990 988 959 869 770 741 685 646 619 617 524 488 480 449 439 434 390 382 363 303 243 228 87 68 67 60 49 -999 952 902 880 759 732 717 698 689 664 613 608 604 597 530 510 481 475 451 424 314 275 215 192 88 57 10 -996 937 909 882 809 800 726 724 680 640 588 554 547 454 451 447 414 381 291 288 257 132 117 99 80 66 16 -977 952 918 863 829 815 811 809 740 728 690 610 558 525 488 417 401 293 246 232 213 165 162 116 106 55 19 -999 962 895 854 815 674 623 611 607 572 492 473 465 384 370 323 309 266 262 152 151 148 139 82 79 66 52 -980 966 948 800 761 739 694 664 623 529 521 516 487 485 470 392 371 363 343 299 263 225 213 178 51 45 18 -971 949 948 885 850 799 795 785 740 717 683 620 577 545 508 501 499 471 228 210 203 189 180 129 120 81 2 -929 927 909 857 805 748 695 653 592 587 560 556 492 413 404 400 344 341 326 289 285 234 154 127 50 31 12 -917 906 891 859 813 754 719 718 699 668 649 640 549 506 484 433 416 405 332 322 296 217 180 146 127 65 38 -957 941 900 872 857 786 778 728 694 677 661 660 591 563 524 511 456 379 337 308 255 236 233 172 69 10 4 -966 951 942 759 704 671 660 648 639 631 627 596 558 391 382 347 335 309 304 278 276 186 185 144 89 42 27 -993 989 985 705 682 663 653 625 546 543 503 485 469 421 410 355 306 304 257 246 245 202 148 78 68 64 25 -960 896 893 876 838 739 734 668 667 520 491 420 418 402 400 375 347 339 294 269 243 161 124 95 52 32 9 -983 978 970 883 866 850 788 722 651 589 512 472 447 444 432 405 389 388 378 366 162 159 151 100 78 60 5 -967 919 914 887 801 671 645 611 553 533 532 456 429 413 412 399 377 362 334 332 275 238 226 171 158 84 83 -993 976 936 888 822 807 757 749 727 669 655 622 590 538 500 340 321 235 223 185 165 160 154 121 92 34 21 -979 955 899 855 845 837 825 813 798 634 598 589 577 566 362 353 350 338 312 280 216 148 123 112 85 45 19 -991 956 951 874 873 846 797 790 767 738 620 591 570 550 526 506 477 441 406 367 366 263 250 160 66 62 14 -978 947 910 784 755 685 673 658 647 588 562 552 509 410 377 361 340 329 283 281 241 194 173 150 143 129 56 -965 946 933 848 811 799 789 665 648 613 480 467 452 444 368 313 299 273 268 260 251 230 229 142 112 109 48 -997 992 890 886 743 713 698 681 666 623 603 575 569 548 478 376 372 301 264 238 217 216 190 124 81 25 14 -972 963 955 865 842 816 755 744 564 556 538 532 484 478 455 443 409 381 351 325 324 233 176 166 131 130 9 -971 944 896 852 840 835 817 782 741 697 689 669 662 649 631 589 515 465 394 374 356 344 334 281 274 255 179 -987 923 903 886 878 851 789 770 742 683 656 649 627 598 573 562 553 534 503 490 477 343 294 155 136 103 98 -953 931 927 887 856 827 772 750 557 489 459 452 415 391 374 365 358 270 256 242 206 175 161 155 143 94 58 -990 971 929 870 843 839 816 773 762 709 674 666 582 428 427 412 364 353 336 288 272 265 250 205 141 54 27 -985 972 953 861 839 826 758 722 706 617 614 533 483 422 396 359 327 285 231 229 194 188 163 156 122 61 34 -998 958 923 864 858 853 814 703 639 604 572 456 446 436 400 355 336 282 180 177 168 163 159 147 51 40 8 -945 926 912 871 858 851 828 768 687 643 634 538 513 501 487 424 394 378 373 319 199 196 175 137 93 68 43 -998 954 892 880 874 872 854 783 754 605 584 580 565 555 553 547 460 408 342 315 299 289 264 219 143 137 13 -952 938 933 875 807 803 796 601 585 516 503 478 468 466 459 430 422 265 212 208 207 177 152 129 128 74 42 -959 944 920 826 808 775 757 724 654 606 595 586 581 518 495 489 476 349 348 306 292 258 204 200 89 65 4 -925 919 893 888 862 836 769 719 561 559 557 525 513 497 479 427 385 335 284 173 149 145 126 109 78 49 7 -962 958 914 831 820 783 779 775 763 675 624 621 560 542 539 531 524 491 485 451 450 268 267 237 189 156 20 -940 907 897 879 838 798 788 760 729 578 526 448 384 311 310 307 238 211 208 202 145 142 71 43 40 35 21 -984 977 895 881 876 870 810 802 796 725 692 552 507 496 484 462 435 282 259 239 225 206 198 122 112 35 12 -916 912 898 862 845 822 776 766 638 543 515 508 498 464 440 412 401 329 316 287 258 221 181 176 151 138 24 -993 980 892 871 869 856 840 794 773 719 698 679 650 624 593 432 407 320 312 298 276 211 163 107 77 30 24 -985 968 934 796 793 785 780 771 746 726 587 578 475 442 416 388 308 301 298 252 218 182 138 96 79 76 1 -973 899 891 864 860 842 826 760 720 679 677 635 630 550 494 471 423 347 342 305 297 239 192 167 70 55 22 -983 966 912 823 817 721 715 683 673 636 632 622 575 473 460 420 395 387 293 277 265 166 153 119 94 85 69 -982 964 923 875 847 841 777 693 681 660 636 594 574 568 550 530 514 500 486 458 300 283 259 251 203 80 23 -982 938 928 834 825 821 788 741 699 695 647 596 595 579 542 454 417 411 370 364 220 197 158 93 70 53 39 -981 927 921 888 851 780 774 758 716 701 646 575 547 540 506 448 360 351 309 269 245 226 167 162 86 47 3 -986 917 911 854 821 791 693 692 687 676 667 664 638 603 563 541 483 390 380 368 256 210 200 149 113 37 26 -996 953 947 835 824 791 781 776 734 581 556 544 536 517 469 462 450 398 382 379 354 307 302 247 197 135 6 -976 969 906 868 847 797 768 728 704 633 632 580 571 476 328 318 316 230 209 206 197 145 141 124 72 46 22 -984 924 921 886 824 761 672 641 621 580 551 493 452 441 401 393 377 335 327 179 177 164 139 63 44 28 15 -939 935 930 875 840 761 752 696 655 651 643 554 546 507 481 474 443 395 338 146 133 120 61 55 40 27 11 -974 950 911 787 736 716 712 709 690 591 571 543 495 494 491 463 362 315 228 188 142 139 114 75 59 58 41 -977 908 903 843 831 731 700 662 569 493 471 416 397 392 387 383 284 256 249 168 128 125 83 64 39 29 17 -997 949 918 881 847 830 820 762 736 684 678 600 590 584 544 504 343 324 312 311 229 169 147 132 62 53 4 -975 943 901 878 843 772 737 702 681 667 640 457 449 407 367 279 267 248 247 196 183 150 134 106 85 79 36 -989 986 946 814 800 792 790 765 759 750 672 607 573 468 438 417 409 399 359 322 292 272 223 198 157 56 49 -975 973 913 848 812 762 756 745 739 733 723 655 565 536 526 372 320 252 240 210 191 186 174 119 87 72 7 -986 975 893 861 803 714 712 682 677 641 594 582 579 522 499 489 424 392 389 352 333 298 273 244 104 71 12 -950 936 929 849 844 827 782 758 751 715 710 688 602 537 527 399 366 342 253 249 196 178 164 108 96 87 71 -909 908 889 855 793 792 751 703 644 635 561 510 443 429 398 389 315 296 281 270 205 203 200 184 101 53 21 -926 905 895 830 654 651 650 626 612 567 523 500 498 423 379 346 328 289 254 215 155 101 96 48 9 7 2 -968 965 890 844 805 753 745 744 714 669 646 598 516 508 495 479 458 432 411 402 369 332 262 172 132 97 6 -959 957 894 877 801 795 767 753 691 688 615 600 571 554 529 520 486 482 442 430 427 282 276 199 157 116 86 -973 957 956 841 813 771 742 705 633 590 541 531 502 457 439 437 404 384 319 275 222 212 184 181 168 59 47 -990 944 931 844 832 823 821 819 795 614 593 573 559 522 462 337 330 329 323 286 269 267 185 130 73 33 29 -967 963 930 850 836 760 727 713 675 657 648 610 581 568 466 421 367 344 323 187 174 169 88 69 63 47 24 -970 954 948 852 834 833 829 764 709 650 561 504 461 440 350 333 305 303 301 291 286 212 156 111 103 90 56 -987 949 932 877 803 730 710 706 693 596 583 518 445 441 436 428 345 242 219 182 119 106 92 91 88 41 6 -988 982 978 877 810 806 782 714 707 686 657 604 593 567 541 534 429 348 272 236 235 216 214 202 195 166 128 -995 979 897 884 829 734 715 705 696 680 676 608 534 497 455 407 349 346 330 205 191 189 170 122 74 44 14 -951 934 901 853 802 779 769 745 711 695 638 628 626 532 509 356 292 290 264 227 207 170 110 80 73 67 18 -984 917 899 873 744 733 708 707 704 684 670 609 605 539 501 480 442 383 285 248 208 190 181 140 91 18 10 -992 965 935 822 746 737 673 645 644 626 599 577 574 537 519 493 436 381 373 306 195 192 188 54 37 31 13 -994 974 955 879 849 812 784 754 703 701 682 642 630 622 599 531 512 479 459 390 349 318 288 227 171 118 111 -962 931 903 853 792 748 724 691 642 637 613 567 564 535 511 504 385 371 361 297 261 250 137 104 100 46 44 -981 960 939 879 801 742 738 737 717 708 549 467 458 446 388 385 331 304 295 287 274 249 232 225 187 141 107 -995 958 947 871 747 740 652 612 605 599 563 477 454 431 365 356 341 310 295 284 198 115 46 38 25 11 1 -994 983 961 884 882 856 808 769 690 671 548 535 515 486 481 453 396 357 351 263 230 223 152 135 108 91 39 -961 940 938 881 868 786 743 707 701 685 645 629 614 597 555 527 444 375 371 354 350 277 266 201 170 77 64 -937 936 900 878 810 766 743 697 616 594 528 520 492 463 453 426 380 358 324 303 231 209 159 140 115 97 29 -954 910 894 870 818 726 708 619 608 560 457 445 426 409 402 386 360 334 290 280 217 121 102 94 77 61 43 -974 920 905 882 842 831 802 749 747 730 659 582 578 549 544 540 419 300 240 220 173 123 100 90 57 51 15 -943 922 915 817 793 774 752 735 711 706 642 552 505 488 482 467 415 357 330 310 262 121 117 98 89 37 2 -946 910 891 865 819 806 643 628 597 570 548 519 517 502 498 421 393 370 333 321 278 232 226 182 140 45 36 -969 939 932 880 867 865 852 849 846 820 771 720 670 661 636 509 490 469 296 271 244 204 193 161 48 28 3 -989 967 898 869 824 784 780 756 729 691 628 609 569 472 470 461 433 431 326 271 144 131 57 41 34 23 8 -998 924 900 818 797 720 718 656 624 595 576 525 464 455 438 339 313 300 295 253 234 218 175 153 83 75 73 diff --git a/sw/python/res/BCH_31_11.alist b/sw/python/res/BCH_31_11.alist deleted file mode 100644 index 206145c..0000000 --- a/sw/python/res/BCH_31_11.alist +++ /dev/null @@ -1,55 +0,0 @@ -31 20 -6 6 -1 1 2 3 4 4 4 4 4 5 5 6 6 6 6 6 6 6 6 6 5 5 4 3 2 2 2 2 2 1 1 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 -1 0 0 0 0 0 -2 0 0 0 0 0 -1 3 0 0 0 0 -1 2 4 0 0 0 -1 2 3 5 0 0 -2 3 4 6 0 0 -3 4 5 7 0 0 -4 5 6 8 0 0 -5 6 7 9 0 0 -1 6 7 8 10 0 -2 7 8 9 11 0 -1 3 8 9 10 12 -2 4 9 10 11 13 -3 5 10 11 12 14 -4 6 11 12 13 15 -5 7 12 13 14 16 -6 8 13 14 15 17 -7 9 14 15 16 18 -8 10 15 16 17 19 -9 11 16 17 18 20 -10 12 17 18 19 0 -11 13 18 19 20 0 -12 14 19 20 0 0 -13 15 20 0 0 0 -14 16 0 0 0 0 -15 17 0 0 0 0 -16 18 0 0 0 0 -17 19 0 0 0 0 -18 20 0 0 0 0 -19 0 0 0 0 0 -20 0 0 0 0 0 -1 3 4 5 10 12 -2 4 5 6 11 13 -3 5 6 7 12 14 -4 6 7 8 13 15 -5 7 8 9 14 16 -6 8 9 10 15 17 -7 9 10 11 16 18 -8 10 11 12 17 19 -9 11 12 13 18 20 -10 12 13 14 19 21 -11 13 14 15 20 22 -12 14 15 16 21 23 -13 15 16 17 22 24 -14 16 17 18 23 25 -15 17 18 19 24 26 -16 18 19 20 25 27 -17 19 20 21 26 28 -18 20 21 22 27 29 -19 21 22 23 28 30 -20 22 23 24 29 31 diff --git a/sw/python/res/BCH_31_26.alist b/sw/python/res/BCH_31_26.alist deleted file mode 100644 index 7a22846..0000000 --- a/sw/python/res/BCH_31_26.alist +++ /dev/null @@ -1,40 +0,0 @@ -31 5 -5 16 -1 1 1 2 2 2 3 3 2 3 3 3 4 5 4 3 2 2 2 2 3 4 4 3 4 3 3 2 2 1 1 -16 16 16 16 16 -1 0 0 0 0 -2 0 0 0 0 -3 0 0 0 0 -1 4 0 0 0 -2 5 0 0 0 -1 3 0 0 0 -1 2 4 0 0 -2 3 5 0 0 -3 4 0 0 0 -1 4 5 0 0 -1 2 5 0 0 -1 2 3 0 0 -1 2 3 4 0 -1 2 3 4 5 -2 3 4 5 0 -3 4 5 0 0 -4 5 0 0 0 -1 5 0 0 0 -1 2 0 0 0 -2 3 0 0 0 -1 3 4 0 0 -1 2 4 5 0 -1 2 3 5 0 -2 3 4 0 0 -1 3 4 5 0 -2 4 5 0 0 -1 3 5 0 0 -2 4 0 0 0 -3 5 0 0 0 -4 0 0 0 0 -5 0 0 0 0 -1 4 6 7 10 11 12 13 14 18 19 21 22 23 25 27 -2 5 7 8 11 12 13 14 15 19 20 22 23 24 26 28 -3 6 8 9 12 13 14 15 16 20 21 23 24 25 27 29 -4 7 9 10 13 14 15 16 17 21 22 24 25 26 28 30 -5 8 10 11 14 15 16 17 18 22 23 25 26 27 29 31 diff --git a/sw/python/res/BCH_7_4.alist b/sw/python/res/BCH_7_4.alist deleted file mode 100644 index 3ec087e..0000000 --- a/sw/python/res/BCH_7_4.alist +++ /dev/null @@ -1,14 +0,0 @@ -7 3 -3 4 -1 1 2 2 3 2 1 -4 4 4 -1 0 0 -2 0 0 -1 3 0 -1 2 0 -1 2 3 -2 3 0 -3 0 0 -1 3 4 5 -2 4 5 6 -3 5 6 7 diff --git a/sw/python/res/PEGReg252x504.alist b/sw/python/res/PEGReg252x504.alist deleted file mode 100644 index e65e3dd..0000000 --- a/sw/python/res/PEGReg252x504.alist +++ /dev/null @@ -1,760 +0,0 @@ -504 252 -3 7 -3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 -6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 6 6 6 5 6 6 6 6 6 6 6 6 6 6 7 6 6 6 6 6 6 -1 70 198 -2 11 210 -3 86 197 -4 145 173 -5 180 196 -6 89 223 -7 144 247 -8 99 119 -9 111 184 -10 20 183 -12 206 218 -13 51 229 -14 16 234 -15 160 190 -17 150 182 -18 71 143 -19 188 238 -21 55 203 -22 25 103 -23 54 202 -24 49 60 -26 57 74 -27 107 115 -28 101 251 -29 94 104 -30 158 225 -31 129 217 -32 40 211 -33 37 154 -34 148 162 -35 232 246 -36 65 92 -38 39 42 -41 113 237 -43 168 200 -44 125 133 -45 215 248 -46 98 136 -47 63 169 -48 80 226 -50 97 166 -52 67 114 -53 58 176 -56 134 147 -59 138 163 -61 130 201 -62 66 87 -64 171 186 -68 161 170 -69 109 174 -72 93 243 -73 126 191 -75 112 227 -76 157 221 -77 187 205 -78 90 233 -79 131 153 -81 117 135 -82 121 172 -83 156 204 -84 175 192 -85 95 132 -88 128 242 -91 189 214 -96 159 167 -100 219 235 -102 199 245 -105 152 241 -106 123 236 -108 140 239 -110 146 178 -116 127 250 -118 185 249 -120 155 209 -122 208 240 -124 212 244 -137 139 228 -141 164 195 -142 179 220 -149 151 194 -165 216 230 -177 193 207 -181 224 252 -213 222 231 -1 169 240 -2 112 185 -3 168 183 -4 11 132 -5 6 232 -7 124 189 -8 64 239 -9 51 198 -10 15 163 -12 52 195 -13 50 58 -14 44 207 -16 49 148 -17 18 60 -19 79 135 -20 41 89 -21 125 139 -22 70 170 -23 53 66 -24 120 201 -25 92 250 -26 218 230 -27 103 145 -28 128 197 -29 173 224 -30 212 251 -31 39 75 -32 127 225 -33 200 204 -34 74 194 -35 143 233 -36 178 188 -37 109 231 -38 72 219 -40 134 186 -42 175 179 -43 77 106 -45 94 126 -46 172 206 -47 105 157 -48 159 211 -54 102 121 -55 220 222 -56 93 149 -57 76 123 -59 62 215 -61 81 87 -63 192 247 -65 90 174 -67 85 99 -68 193 237 -69 98 249 -71 91 191 -73 171 203 -78 235 242 -80 180 199 -82 144 153 -83 129 166 -84 96 190 -86 95 155 -88 216 228 -97 110 140 -100 184 234 -101 176 182 -104 122 187 -107 202 243 -108 223 241 -111 164 167 -113 136 147 -114 156 177 -115 160 165 -116 227 236 -117 137 196 -118 130 244 -119 131 205 -133 146 210 -138 162 213 -141 150 238 -142 181 229 -151 208 246 -152 154 158 -161 209 245 -214 217 226 -207 221 248 -20 238 252 -1 228 249 -2 143 163 -3 55 82 -4 48 176 -5 38 52 -6 7 103 -8 115 148 -9 33 191 -10 219 225 -11 26 175 -12 104 201 -13 56 120 -14 98 226 -15 157 245 -16 19 227 -17 63 156 -18 123 140 -21 62 250 -22 28 57 -23 37 122 -24 139 152 -25 164 166 -27 136 158 -29 78 83 -30 146 205 -31 86 208 -32 68 246 -34 53 89 -35 119 142 -36 91 93 -39 45 182 -40 54 185 -41 85 126 -42 43 186 -44 181 202 -46 84 97 -47 134 135 -49 90 168 -50 73 216 -51 75 206 -58 76 153 -59 151 204 -60 128 190 -61 159 231 -64 70 214 -65 171 221 -66 192 233 -67 69 101 -71 117 193 -72 81 108 -74 118 154 -77 88 102 -79 209 215 -80 107 110 -87 165 189 -92 95 160 -94 127 197 -96 131 223 -99 124 242 -100 132 222 -105 224 230 -106 213 237 -109 199 247 -111 173 212 -112 113 235 -114 178 229 -116 130 180 -121 138 150 -125 170 200 -129 220 244 -133 167 236 -137 211 252 -141 155 239 -144 198 243 -145 174 194 -147 195 248 -149 172 210 -161 218 234 -162 196 251 -110 169 183 -3 177 241 -113 179 240 -47 184 232 -98 187 203 -188 216 246 -192 217 225 -1 89 127 -2 94 229 -4 88 108 -5 44 128 -6 203 211 -7 49 122 -8 61 172 -9 40 160 -10 22 201 -11 191 238 -12 19 107 -13 109 170 -14 163 247 -15 188 220 -16 166 182 -17 23 136 -18 100 130 -20 56 167 -21 111 140 -24 217 237 -25 102 193 -26 41 187 -27 43 209 -28 144 147 -29 96 121 -30 85 221 -31 114 131 -32 153 239 -33 119 207 -34 39 125 -35 116 176 -36 162 224 -37 38 165 -42 91 156 -45 70 233 -46 186 196 -48 200 230 -50 74 243 -51 77 244 -52 66 123 -53 117 242 -54 57 99 -55 120 204 -58 175 212 -59 65 118 -60 62 178 -63 95 227 -64 190 252 -67 135 210 -68 87 173 -69 181 208 -71 101 152 -72 98 213 -73 236 245 -75 103 231 -76 142 228 -78 80 149 -79 139 197 -81 168 185 -82 145 214 -83 184 205 -84 93 141 -86 189 234 -90 164 179 -92 240 241 -97 151 157 -104 134 177 -105 106 174 -112 161 194 -115 129 143 -124 150 250 -126 159 202 -132 148 198 -133 155 235 -137 195 222 -138 158 232 -146 218 249 -154 195 226 -169 206 215 -171 173 219 -11 180 248 -161 183 251 -91 199 223 -1 106 166 -2 25 153 -3 18 34 -4 52 183 -5 51 90 -6 95 172 -7 133 186 -8 113 178 -9 116 136 -10 83 202 -12 32 242 -13 207 211 -14 89 244 -15 75 108 -16 55 158 -17 79 174 -19 57 240 -20 87 152 -21 246 247 -22 73 114 -23 149 228 -24 35 171 -26 44 81 -27 58 100 -28 42 159 -29 101 239 -30 134 181 -31 54 105 -33 84 135 -36 37 209 -38 157 250 -39 120 249 -40 110 213 -41 47 82 -43 99 163 -45 93 184 -46 94 165 -48 122 138 -49 67 127 -50 223 233 -53 160 248 -56 103 230 -59 214 235 -60 199 212 -61 182 245 -62 104 132 -48 63 220 -64 193 227 -65 88 234 -66 112 205 -68 84 148 -69 115 167 -70 210 220 -71 151 231 -72 129 252 -74 134 150 -76 148 156 -19 77 219 -78 188 207 -80 92 237 -85 218 226 -86 123 180 -96 117 118 -97 177 179 -102 125 147 -107 130 221 -109 217 238 -111 201 215 -119 145 196 -121 142 200 -124 204 225 -126 168 175 -128 169 191 -131 222 251 -137 189 192 -139 187 243 -140 154 208 -141 143 144 -146 162 197 -155 213 216 -164 172 225 -170 232 241 -176 206 224 -91 185 236 -190 194 203 -198 230 250 -55 192 229 -1 33 173 -2 36 74 -3 9 62 -4 113 249 -5 100 239 -6 76 77 -7 45 112 -8 23 50 -10 13 117 -11 158 193 -12 168 223 -14 58 105 -15 139 191 -16 40 125 -17 218 233 -18 78 186 -20 54 65 -21 142 183 -22 46 244 -24 97 202 -25 98 242 -26 140 149 -27 35 63 -28 184 206 -29 160 247 -30 79 108 -31 171 215 -32 37 181 -34 164 199 -38 57 229 -39 83 135 -41 150 209 -42 169 246 -43 167 221 -44 92 129 -47 94 211 -49 216 241 -51 152 185 -52 153 227 -53 151 201 -56 86 178 -59 115 175 -60 163 243 -61 93 217 -64 109 123 -66 155 200 -67 82 106 -68 180 182 -69 88 166 -70 110 120 -71 205 240 -72 130 161 -73 75 196 -80 99 133 -35 81 104 -85 224 246 -87 179 190 -89 174 189 -90 131 147 -95 212 214 -96 127 144 -101 165 187 -102 210 252 -103 177 208 -107 114 122 -111 118 197 -116 159 170 -119 136 238 -121 143 234 -124 203 237 -126 204 232 -128 222 245 -132 154 228 -137 146 219 -138 145 248 -105 141 156 -157 226 251 -162 195 236 -176 188 198 -1 85 170 256 339 426 0 -2 86 171 257 340 427 0 -3 87 172 250 341 428 0 -4 88 173 258 342 429 0 -5 89 174 259 343 430 0 -6 89 175 260 344 431 0 -7 90 175 261 345 432 0 -8 91 176 262 346 433 0 -9 92 177 263 347 428 0 -10 93 178 264 348 434 0 -2 88 179 265 336 435 0 -11 94 180 266 349 436 0 -12 95 181 267 350 434 0 -13 96 182 268 351 437 0 -14 93 183 269 352 438 0 -13 97 184 270 353 439 0 -15 98 185 271 354 440 0 -16 98 186 272 341 441 0 -17 99 184 266 355 396 0 -10 100 169 273 356 442 0 -18 101 187 274 357 443 0 -19 102 188 264 358 444 0 -20 103 189 271 359 433 0 -21 104 190 275 360 445 0 -19 105 191 276 340 446 0 -22 106 179 277 361 447 0 -23 107 192 278 362 448 0 -24 108 188 279 363 449 0 -25 109 193 280 364 450 0 -26 110 194 281 365 451 0 -27 111 195 282 366 452 0 -28 112 196 283 349 453 0 -29 113 177 284 367 426 0 -30 114 197 285 341 454 0 -31 115 198 286 360 448 480 -32 116 199 287 368 427 0 -29 117 189 288 368 453 0 -33 118 174 288 369 455 0 -33 111 200 285 370 456 0 -28 119 201 263 371 439 0 -34 100 202 277 372 457 0 -33 120 203 289 363 458 0 -35 121 203 278 373 459 0 -36 96 204 259 361 460 0 -37 122 200 290 374 432 0 -38 123 205 291 375 444 0 -39 124 206 252 372 461 0 -40 125 173 292 376 385 0 -21 97 207 261 377 462 0 -41 95 208 293 378 433 0 -12 92 209 294 343 463 0 -42 94 174 295 342 464 0 -43 103 197 296 379 465 0 -20 126 201 297 366 442 0 -18 127 172 298 353 425 0 -44 128 181 273 380 466 0 -22 129 188 297 355 455 0 -43 95 210 299 362 437 0 -45 130 211 300 381 467 0 -21 98 212 301 382 468 0 -46 131 213 262 383 469 0 -47 130 187 301 384 428 0 -39 132 185 302 385 448 0 -48 91 214 303 386 470 0 -32 133 215 300 387 442 0 -47 103 216 295 388 471 0 -42 134 217 304 377 472 0 -49 135 196 305 389 473 0 -50 136 217 306 390 474 0 -1 102 214 290 391 475 0 -16 137 218 307 392 476 0 -51 118 219 308 393 477 0 -52 138 208 309 358 478 0 -22 114 220 293 394 427 0 -53 111 209 310 352 478 0 -54 129 210 311 395 431 0 -55 121 221 294 396 431 0 -56 139 193 312 397 441 0 -57 99 222 313 354 451 0 -40 140 223 312 398 479 0 -58 131 219 314 361 480 0 -59 141 172 315 372 472 0 -60 142 193 316 348 456 0 -61 143 205 317 367 389 0 -62 134 202 281 399 481 0 -3 144 195 318 400 466 0 -47 131 224 305 356 482 0 -63 145 221 258 387 474 0 -6 100 197 256 351 483 0 -56 133 207 319 343 484 0 -64 137 199 289 338 422 0 -32 105 225 320 398 460 0 -51 128 199 317 374 469 0 -25 122 226 257 375 461 0 -62 144 225 302 344 485 0 -65 143 227 280 401 486 0 -41 146 205 321 402 445 0 -38 136 182 253 308 446 0 -8 134 228 297 373 479 0 -66 147 229 272 362 430 0 -24 148 217 307 364 487 0 -67 126 221 276 403 488 0 -19 107 175 310 380 489 0 -25 149 180 322 384 480 0 -68 124 230 323 366 437 501 -69 121 231 323 339 472 0 -23 150 223 266 404 490 0 -70 151 219 258 352 451 0 -50 117 232 267 405 470 0 -71 146 223 249 371 475 0 -9 152 233 274 406 491 0 -53 86 234 324 388 432 0 -34 153 234 251 346 429 0 -42 154 235 282 358 490 0 -23 155 176 325 390 467 0 -72 156 236 286 347 492 0 -58 157 218 296 401 434 0 -73 158 220 300 401 491 0 -8 159 198 284 407 493 0 -74 104 181 298 370 475 0 -59 126 237 280 408 494 0 -75 149 189 261 376 490 0 -69 129 186 295 400 470 0 -76 90 228 326 409 495 0 -36 101 238 285 403 439 0 -52 122 202 327 410 496 0 -72 112 226 256 377 486 0 -63 108 212 259 411 497 0 -27 142 239 325 393 460 0 -46 158 236 272 404 477 0 -57 159 227 282 412 484 0 -62 88 229 328 384 498 0 -36 160 240 329 345 479 0 -44 119 206 322 365 394 0 -58 99 206 304 367 456 0 -38 153 192 271 347 493 0 -77 157 241 330 413 499 0 -45 161 237 331 376 500 0 -77 101 190 313 414 438 0 -70 146 186 274 415 447 0 -78 162 242 317 416 501 0 -79 163 198 311 408 443 0 -16 115 171 325 416 494 0 -7 141 243 279 416 486 0 -4 107 244 315 407 500 0 -71 160 194 332 417 499 0 -44 153 245 279 403 484 0 -30 97 176 328 389 395 0 -80 128 246 312 359 447 0 -15 162 237 326 394 457 0 -80 164 211 321 392 465 0 -68 165 190 307 356 463 0 -57 141 210 283 340 464 0 -29 165 220 333 415 498 0 -74 144 242 329 418 471 0 -60 154 185 289 395 501 0 -54 124 183 321 369 502 0 -26 165 192 331 353 435 0 -65 125 213 327 363 492 0 -14 155 225 263 379 450 0 -49 166 247 324 337 477 0 -30 161 248 287 417 503 0 -45 93 171 268 373 468 0 -78 152 191 319 419 454 0 -81 155 224 288 375 487 0 -41 142 191 270 339 474 0 -65 152 240 273 390 459 0 -35 87 207 314 410 436 0 -39 85 249 334 411 458 0 -49 102 238 267 420 492 0 -48 138 215 335 360 452 0 -59 123 246 262 344 419 0 -4 109 233 305 335 426 0 -50 133 244 323 354 483 0 -61 120 179 299 410 467 0 -43 148 173 286 421 504 0 -82 154 250 322 402 489 0 -71 116 235 301 346 466 0 -79 120 251 319 402 482 0 -5 140 236 336 400 473 0 -83 163 204 306 365 453 0 -15 148 200 270 383 473 0 -10 87 249 337 342 443 0 -9 147 252 316 374 449 0 -73 86 201 314 422 463 0 -48 119 203 291 345 441 0 -55 149 253 277 414 487 0 -17 116 254 269 397 504 0 -64 90 224 318 413 483 0 -14 143 212 303 423 482 0 -52 137 177 265 411 438 0 -61 132 216 255 413 425 0 -82 135 218 276 386 435 0 -80 114 244 324 423 0 0 -78 94 245 330 333 503 0 -5 157 248 291 407 478 0 -3 108 226 313 417 491 0 -1 92 243 328 424 504 0 -67 140 232 338 382 454 0 -35 113 238 292 408 471 0 -46 104 180 264 406 465 0 -20 150 204 327 348 445 0 -18 138 253 260 423 495 0 -60 113 211 298 409 496 0 -55 159 194 316 388 476 0 -11 123 209 334 421 449 0 -82 96 168 284 350 397 0 -75 164 195 306 415 489 0 -74 166 222 278 368 457 0 -2 160 246 304 391 488 0 -28 125 241 260 350 461 0 -76 110 233 299 382 485 0 -84 161 231 308 371 418 0 -64 167 214 315 381 485 0 -37 130 222 334 406 452 0 -81 145 208 254 418 462 0 -27 167 255 275 405 469 0 -11 106 247 332 399 440 0 -66 118 178 335 396 499 0 -79 127 239 269 385 391 0 -54 168 215 281 404 459 0 -84 127 229 330 412 497 0 -6 151 227 338 378 436 0 -83 109 230 287 421 481 0 -26 112 178 255 409 419 0 -40 167 182 333 399 502 0 -53 156 184 302 386 464 0 -77 145 170 311 359 498 0 -12 163 235 257 425 455 0 -81 106 230 292 380 424 0 -84 117 213 310 392 0 0 -31 89 252 331 420 496 0 -56 115 216 290 378 440 0 -13 147 247 318 387 494 0 -66 139 234 329 381 0 0 -69 156 240 309 422 503 0 -34 135 231 275 398 495 0 -17 162 169 265 405 493 0 -70 91 242 283 364 430 0 -75 85 251 320 355 476 0 -68 151 250 320 420 462 0 -63 139 228 296 349 446 0 -51 150 243 293 414 468 0 -76 158 239 294 351 444 0 -67 166 183 309 383 497 0 -31 164 196 254 357 458 481 -7 132 232 268 357 450 0 -37 168 245 336 379 500 0 -73 136 170 332 370 429 0 -72 105 187 326 369 424 0 -24 110 248 337 412 502 0 -83 169 241 303 393 488 0 diff --git a/sw/python/scripts/proximal/simulate_2d_BER.py b/sw/python/scripts/proximal/simulate_2d_BER.py deleted file mode 100644 index e3cfb37..0000000 --- a/sw/python/scripts/proximal/simulate_2d_BER.py +++ /dev/null @@ -1,154 +0,0 @@ -import sys, os -import sys, os -sys.path.append(os.path.abspath('../..')) -print(sys.path) - - -import numpy as np -import seaborn as sns -import matplotlib.pyplot as plt -import signal -from timeit import default_timer -from functools import partial - -from utility import codes, noise, misc -from utility.simulation.simulators import GenericMultithreadedSimulator -from utility.simulation import SimulationManager - -from cpp_modules.cpp_decoders import ProximalDecoder_204_102 as ProximalDecoder - - -def task_func(params): - """Function called by the GenericMultithreadedSimulator instance. - - Calculate the BER, FER, and DFR for a given SNR and gamma. - """ - signal.signal(signal.SIGINT, signal.SIG_IGN) - - decoder = params["decoder"] - max_iterations = params["max_iterations"] - SNR = params["SNR"] - n = params["n"] - k = params["k"] - - c = np.zeros(n) - x_bpsk = c + 1 - - total_bit_errors = 0 - total_frame_errors = 0 - dec_fails = 0 - - num_iterations = 0 - - for i in range(max_iterations): - x = noise.add_awgn(x_bpsk, SNR, n, k) - x_hat, k_max = decoder.decode(x) - - bit_errors = misc.count_bit_errors(x_hat, c) - if bit_errors > 0: - total_bit_errors += bit_errors - total_frame_errors += 1 - - num_iterations += 1 - - if k_max == -1: - dec_fails += 1 - - if total_frame_errors > 100: - break - - BER = total_bit_errors / (num_iterations * n) - FER = total_frame_errors / num_iterations - DFR = dec_fails / (num_iterations + dec_fails) - - return {"BER": BER, "FER": FER, "DFR": DFR, - "num_iterations": num_iterations} - - -def get_params(code_name: str): - """In this function all parameters for the simulation are defined.""" - # Define global simulation parameters - - H_file = f"../../res/{code_name}.alist" - - H = codes.read_alist_file(H_file) - n_min_k, n = H.shape - k = n - n_min_k - - omega = 0.05 - K = 100 - gammas = np.arange(0.0, 0.17, 0.01) - - SNRs = np.arange(1, 6, 0.5) - max_iterations = 20000 - - # Define parameters different for each task - - task_params = [] - for i, SNR in enumerate(SNRs): - for j, gamma in enumerate(gammas): - decoder = ProximalDecoder(H=H.astype('int32'), K=K, omega=omega, - gamma=gamma) - - task_params.append( - {"decoder": decoder, "max_iterations": max_iterations, - "SNR": SNR, "gamma": gamma, "n": n, "k": k}) - - return omega, K, task_params - - -def configure_new_simulation(sim_mgr: SimulationManager, code_name: str, - sim_name: str) -> None: - sim = GenericMultithreadedSimulator() - - omega, K, task_params = get_params(code_name) - - sim.task_params = task_params - sim.task_func = task_func - sim.format_func = partial(misc.pgf_reformat_data_3d, x_param_name="SNR", - y_param_name="gamma", - z_param_names=["BER", "FER", "DFR", - "num_iterations"]) - - sim_mgr.configure_simulation(simulator=sim, name=sim_name, - additional_metadata={"omega": omega, "K": K}) - - -def main(): - # code_name = "BCH_7_4" - # code_name = "BCH_31_11" - # code_name = "BCH_31_26" - # code_name = "96.3.965" - # code_name = "204.33.486" - code_name = "204.33.484" - # code_name = "204.55.187" - # code_name = "408.33.844" - - sim_name = f"2d_BER_FER_DFR_{misc.slugify(code_name)}" - - # Run simulation - - sim_mgr = SimulationManager(saves_dir="sim_saves", - results_dir="sim_results") - - unfinished_sims = sim_mgr.get_unfinished() - if len(unfinished_sims) > 0: - sim_mgr.load_unfinished(unfinished_sims[0]) - else: - configure_new_simulation(sim_mgr=sim_mgr, code_name=code_name, - sim_name=sim_name) - - sim_mgr.simulate() - - # Plot results - - sns.set_theme() - ax = sns.lineplot(data=sim_mgr.get_current_results(), x="SNR", y="BER", - hue="gamma") - ax.set_yscale('log') - ax.set_ylim((5e-5, 2e-0)) - plt.show() - - -if __name__ == "__main__": - main() diff --git a/sw/python/scripts/proximal/simulate_2d_avg_error.py b/sw/python/scripts/proximal/simulate_2d_avg_error.py deleted file mode 100644 index 975baa4..0000000 --- a/sw/python/scripts/proximal/simulate_2d_avg_error.py +++ /dev/null @@ -1,147 +0,0 @@ -import sys, os -sys.path.append(os.path.abspath('../..')) - -import numpy as np -import seaborn as sns -import matplotlib.pyplot as plt -import signal -from timeit import default_timer -from functools import partial -import pandas as pd - -from utility import codes, noise, misc -from utility.simulation.simulators import GenericMultithreadedSimulator -from utility.simulation import SimulationManager - -from cpp_modules.cpp_decoders import ProximalDecoder_204_102 as ProximalDecoder - - -def task_func(params): - """Function called by the GenericMultithreadedSimulator instance. - - Calculate the average error over a number of iterations. - """ - signal.signal(signal.SIGINT, signal.SIG_IGN) - - decoder = params["decoder"] - num_iterations = params["num_iterations"] - x_bpsk = params["x_bpsk"] - SNR = params["SNR"] - n = params["n"] - k = params["k"] - K = params["K"] - - avg_error_values = np.zeros(K) - - for i in range(num_iterations): - x = noise.add_awgn(x_bpsk, SNR, n, k) - - error_values = decoder.get_error_values(x_bpsk.astype('int32'), x) - - for j, val in enumerate(error_values): - avg_error_values[j] += val - - avg_error_values = avg_error_values / num_iterations - - return {"err": avg_error_values} - - -def get_params(code_name: str): - """In this function all parameters for the simulation are defined.""" - # Define global simulation parameters - - H_file = f"../../res/{code_name}.alist" - H = codes.read_alist_file(H_file) - n_min_k, n = H.shape - k = n - n_min_k - - SNR = 8 - omegas = np.logspace(-0, -10, 40) - K = 200 - - num_iterations = 1000 - x_bpsk = np.zeros(n) + 1 - - # Define parameters different for each task - - task_params = [] - for i, omega in enumerate(omegas): - decoder = ProximalDecoder(H=H.astype('int32'), K=K, - omega=omega) - task_params.append( - {"decoder": decoder, "num_iterations": num_iterations, - "x_bpsk": x_bpsk, "SNR": SNR, "n": n, "k": k, "K": K, - "omega": omega}) - - return SNR, K, task_params - - -def reformat_data(results): - """Reformat the data obtained from the GenericMultithreadedSimulator to - be usable by pgfplots. - """ - K = 200 - num_points = len(results) * K - - x = np.zeros(num_points) - y = np.zeros(num_points) - z = np.zeros(num_points) - - for i, (params, result) in enumerate(results.items()): - np.put(x, np.arange(i * K, (i + 1) * K), np.arange(1, K+1)) - np.put(y, np.arange(i * K, (i + 1) * K), params["omega"]) - np.put(z, np.arange(i * K, (i + 1) * K), result["err"]) - - x = x[::4] - y = y[::4] - z = z[::4] - - df = pd.DataFrame({"k": x, "omega": y, "err": z}).sort_values( - by=['k', 'omega'], ascending=[True, False]) - - return df - - -def configure_new_simulation(sim_mgr: SimulationManager, code_name: str, - sim_name: str) -> None: - sim = GenericMultithreadedSimulator() - - SNR, K, task_params = get_params(code_name) - - sim.task_params = task_params - sim.task_func = task_func - sim.format_func = reformat_data - - sim_mgr.configure_simulation(simulator=sim, name=sim_name, - additional_metadata={"SNR": SNR, "K": K}) - - -def main(): - # code_name = "BCH_7_4" - # code_name = "BCH_31_11" - # code_name = "BCH_31_26" - # code_name = "96.3.965" - # code_name = "204.33.486" - code_name = "204.33.484" - # code_name = "204.55.187" - # code_name = "408.33.844" - - sim_name = f"2d_avg_error_{misc.slugify(code_name)}" - - # Run simulation - - sim_mgr = SimulationManager(saves_dir="sim_saves", - results_dir="sim_results") - - unfinished_sims = sim_mgr.get_unfinished() - if len(unfinished_sims) > 0: - sim_mgr.load_unfinished(unfinished_sims[0]) - else: - configure_new_simulation(sim_mgr=sim_mgr, code_name=code_name, - sim_name=sim_name) - - sim_mgr.simulate() - - -if __name__ == "__main__": - main() diff --git a/sw/python/scripts/proximal/simulate_gradient.py b/sw/python/scripts/proximal/simulate_gradient.py deleted file mode 100644 index 7b1966e..0000000 --- a/sw/python/scripts/proximal/simulate_gradient.py +++ /dev/null @@ -1,88 +0,0 @@ -import sys, os -sys.path.append(os.path.abspath('../..')) - -import numpy as np -import pandas as pd -import seaborn as sns -import matplotlib.pyplot as plt -import signal -from timeit import default_timer -from tqdm import tqdm - -from utility import codes, noise, misc -from utility.simulation.simulators import GenericMultithreadedSimulator - -# from cpp_modules.cpp_decoders import ProximalDecoder -from cpp_modules.cpp_decoders import ProximalDecoder_204_102 as ProximalDecoder - - -def simulate(H_file, SNR, omega, K, gamma): - H = codes.read_alist_file(f"../../res/{H_file}") - n_min_k, n = H.shape - k = n - n_min_k - - decoder = ProximalDecoder(H.astype('int32'), K=K, omega=omega, gamma=gamma) - - c = np.zeros(n) - x_bpsk = (c + 1) - - avg_grad_values = np.zeros(shape=(K, 2)) - - for i in range(1000): - x = noise.add_awgn(x_bpsk, SNR, n, k) - grad_values = decoder.get_gradient_values(x) - - for j, (val_h, val_l) in enumerate(grad_values): - avg_grad_values[j, 0] += val_h - avg_grad_values[j, 1] += val_l - - avg_grad_values = avg_grad_values / 1000 - - return avg_grad_values - - -def reformat_data(results): - return pd.DataFrame({"k": np.arange(0, results.size // 2, 1), "grad_h": results[:, 0], "grad_l": results[:, 1]}) - - -def main(): - # Set up simulation params - - sim_name = "avg_grad_1dB" - - # H_file = "96.3.965.alist" - H_file = "204.33.486.alist" - # H_file = "204.33.484.alist" - # H_file = "204.55.187.alist" - # H_file = "408.33.844.alist" - # H_file = "BCH_7_4.alist" - # H_file = "BCH_31_11.alist" - # H_file = "BCH_31_26.alist" - - SNR = 1 - omega = 0.05 - K = 100 - gamma = 0.05 - - # Run simulation - - start_time = default_timer() - results = simulate(H_file, SNR, omega, K, gamma) - end_time = default_timer() - - print(f"duration: {end_time - start_time}") - - df = reformat_data(results) - - df.to_csv( - f"sim_results/{sim_name}_{misc.slugify(H_file)}.csv", index=False) - - sns.set_theme() - sns.lineplot(data=df, x="k", y="grad_h") - sns.lineplot(data=df, x="k", y="grad_l") - - plt.show() - - -if __name__ == "__main__": - main() diff --git a/sw/python/utility/__init__.py b/sw/python/utility/__init__.py deleted file mode 100644 index 104b7ec..0000000 --- a/sw/python/utility/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""This package contains various utilities that can be used in combination -with the decoders.""" diff --git a/sw/python/utility/codes.py b/sw/python/utility/codes.py deleted file mode 100644 index 31d2409..0000000 --- a/sw/python/utility/codes.py +++ /dev/null @@ -1,249 +0,0 @@ -"""This file Helper functions for generating an H matrix from alist data. -Code from https://github.com/gnuradio/gnuradio/blob/master/gr-fec/python/fec -/LDPC/Generate_LDPC_matrix_functions.py -""" - -import numpy as np - - -# -# Related to alist files -# - - -def _parse_alist_header(header): - size = header.split() - return int(size[0]), int(size[1]) - - -def read_alist_file(filename): - """ - This function reads in an alist file and creates the - corresponding parity check matrix H. The format of alist - files is described at: - http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html - """ - - with open(filename, 'r') as myfile: - data = myfile.readlines() - numCols, numRows = _parse_alist_header(data[0]) - - H = np.zeros((numRows, numCols)) - - # The locations of 1s starts in the 5th line of the file - for lineNumber in np.arange(4, 4 + numCols): - indices = data[lineNumber].split() - for index in indices: - H[int(index) - 1, lineNumber - 4] = 1 - - return H - - -# -# G matrices of specific codes -# - - -# @formatter:off - -Gs = {'Hamming_7_4': np.array([[1, 0, 0, 0, 0, 1, 1], - [0, 1, 0, 0, 1, 0, 1], - [0, 0, 1, 0, 1, 1, 0], - [0, 0, 0, 1, 1, 1, 1]]), - - 'Golay_24_12': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]]), - - 'BCH_15_7': np.array([[1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0], - [0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1]]), - - 'BCH_31_6': np.array([[1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1], - [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0], - [0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1], - [0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1], - [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1]]), - - 'BCH_31_11': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1]]), - - 'BCH_31_16': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1]]), - - 'BCH_31_21': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1]]), - - 'BCH_63_16': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1]]), - - 'BCH_63_30': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1]]), - - # TODO: Fix this. This code should be systematic - 'BCH_63_45': np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1], - [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0], - [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0], - [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1], - [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1], - [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1]]) - } - -# @formatter:on - - -# -# Utilities for systematic codes -# - - -def get_systematic_H(G: np.array) -> np.array: - """Compute the H matrix for a systematic code. - - :param G: Generator matrix of the systematic code - :return: Parity check matrix H - """ - k, n = G.shape - - I = G[:, :k] - assert np.array_equal(I, np.identity(k)) - - P = G[:, k:] - - H = np.zeros(shape=(n - k, n)) - H[:, :k] = P.T - H[:, k:] = np.identity(n - k) - - return H diff --git a/sw/python/utility/misc.py b/sw/python/utility/misc.py deleted file mode 100644 index 6619015..0000000 --- a/sw/python/utility/misc.py +++ /dev/null @@ -1,72 +0,0 @@ -import unicodedata -import re -import typing -import pandas as pd -import numpy as np - - -def slugify(value, allow_unicode=False): - """ - Taken from https://github.com/django/django/blob/master/django/utils - /text.py - Convert to ASCII if 'allow_unicode' is False. Convert spaces or repeated - dashes to single dashes. Remove characters that aren't alphanumerics, - underscores, or hyphens. Convert to lowercase. Also strip leading and - trailing whitespace, dashes, and underscores. - """ - value = str(value) - if allow_unicode: - value = unicodedata.normalize('NFKC', value) - else: - value = unicodedata.normalize('NFKD', value).encode('ascii', - 'ignore').decode( - 'ascii') - value = re.sub(r'[^\w\s-]', '', value.lower()) - return re.sub(r'[-\s]+', '-', value).strip('-_') - - -def pgf_reformat_data_3d(results: typing.Sequence, x_param_name: str, - y_param_name: str, - z_param_names: typing.Sequence[str]): - """Reformat the results obtained from the GenericMultithreadedSimulator - into a form usable by pgfplots. - - :param results: Results from GenericMultiThreadedSimulator - (dict of the form {params1: results1, params2: results2, ...}), - where resultsN and paramsN are themselves dicts: - paramsN = {param_name_1: val, param_name_2: val, ...} - resultsN = {result_name_1: val, result_name_2: val, ...} - :param x_param_name: - :param y_param_name: - :param z_param_names: - :return: pandas DataFrame of the following form: - {x_param_name: [x1, x1, x1, ..., x2, x2, x2, ...], - y_param_name: [y1, y2, y3, ..., y1, y2, y3, ...], - z_param_name: [z11, z21, z31, ..., z12, z22, z32, ...]} - """ - # Create result variables - x = np.zeros(len(results)) - y = np.zeros(len(results)) - zs = {name: np.zeros(len(results)) for name in z_param_names} - - # Populate result variables - for i, (params, result) in enumerate(results.items()): - x_val = params[x_param_name] - y_val = params[y_param_name] - for z_param_name in z_param_names: - zs[z_param_name][i] = result[z_param_name] - - x[i] = x_val - y[i] = y_val - - # Create and return pandas DataFrame - df = pd.DataFrame({x_param_name: x, y_param_name: y}) - for z_param_name in z_param_names: - df[z_param_name] = zs[z_param_name] - - return df.sort_values(by=[x_param_name, y_param_name]) - - -def count_bit_errors(x: np.array, x_hat: np.array) -> int: - """Count the number of different bits between two words.""" - return np.sum(x != x_hat) diff --git a/sw/python/utility/noise.py b/sw/python/utility/noise.py deleted file mode 100644 index 33ba026..0000000 --- a/sw/python/utility/noise.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Utility functions relating to noise and SNR calculations.""" - -import numpy as np - - -def get_noise_variance_from_SNR(SNR: float, n: int, k: int) -> float: - """Calculate the variance of the noise from an SNR and the signal - amplitude. - - :param SNR: Signal-to-Noise-Ratio in dB (E_b/N_0) - :param n: Length of a codeword of the used code - :param k: Length of a dataword of the used code - :return: Variance of the noise - """ - SNR_linear = 10 ** (SNR / 10) - variance = 1 / (2 * (k / n) * SNR_linear) - - return variance - - -def add_awgn(c: np.array, SNR: float, n: int, k: int) -> np.array: - """Add Additive White Gaussian Noise to a data vector. As this function - adds random noise to the input, the output changes, even if it is called - multiple times with the same input. - - :param c: Binary vector representing the data to be transmitted - :param SNR: Signal-to-Noise-Ratio in dB - :param n: Length of a codeword of the used code - :param k: Length of a dataword of the used code - :return: Data vector with added noise - """ - noise_var = get_noise_variance_from_SNR(SNR, n, k) - y = c + np.sqrt(noise_var) * np.random.normal(size=c.size) - return y diff --git a/sw/python/utility/simulation/__init__.py b/sw/python/utility/simulation/__init__.py deleted file mode 100644 index 27197a0..0000000 --- a/sw/python/utility/simulation/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -"""Simulation package. - -This package provides a way to easily define simulations in such a way that -they can be paused and resumed. - -General Structure -================= -The package consists of 3 main components: - - The 'SimulationDeSerializer': Responsible for file IO - - The 'Simulator': Responsible for the actual simulating - - The 'SimulationManager': Delegates work to the DeSerializer and the - Simulator - -The Simulator Class -=================== -For each new simulating task, a new 'Simulator' must be defined. The -requirements for this class are the following: - - Must define the 'start_or_continue()', 'stop()' and - 'get_current_results()' functions - - Must be picklable in order to store the simulation state - -An example simulator could look as follows: ----------------------------------------------------------------- -class SomeSimulator: - def __init__(self, num_iterations): - self._num_iterations = num_iterations - self._current_iter = 0 - - self._simulation_running = False - - self._results = pd.DataFrame() - - def _perform_iteration(self): - # Perform iteration and append results - ... - - def start_or_continue(self) -> None: - self._simulation_running = True - - while self._simulation_running and ( - self._current_iter < self._num_iterations): - self._perform_iteration() - - def stop(self) -> None: - self._simulation_running = False - - def get_current_results(self) -> pd.DataFrame: - return self._results ----------------------------------------------------------------- - -Usage -===== -To start a new simulation: ----------------------------------------------------------------- -sim_mgr = SimulationManager(results_dir="results", saves_dir="saves") - -sim = SomeSimulator(num_iterations=100) -sim_mgr.configure_simulation(simulator=sim, name='Some Simulation', \ - column_labels=['label1', 'label2']) -sim_mgr.start() ----------------------------------------------------------------- - -To check for a previously interrupted simulation and continue: ----------------------------------------------------------------- -sim_mgr = SimulationManager(results_dir="results", saves_dir="saves") - -unfinished_sims = sim_mgr.get_unfinished() - -if len(unfinished_sims) > 0: - sim_mgr.load_unfinished(unfinished_sims[0]) - sim_mgr.simulate() ----------------------------------------------------------------- -""" - - -from utility.simulation.management import SimulationManager, \ - SimulationDeSerializer diff --git a/sw/python/utility/simulation/management.py b/sw/python/utility/simulation/management.py deleted file mode 100644 index f325929..0000000 --- a/sw/python/utility/simulation/management.py +++ /dev/null @@ -1,239 +0,0 @@ -import json -import pandas as pd -import typing -import signal -import pickle -import os -from pathlib import Path -import platform -from datetime import datetime -import timeit -import collections.abc - -from utility import misc - - -class SimulationDeSerializer: - """Class responsible for file management, de- and serialization of - Simulator objects.""" - - def __init__(self, save_dir: str, results_dir: str): - self._saves_dir = save_dir - self._results_dir = results_dir - - Path(self._saves_dir).mkdir(parents=True, exist_ok=True) - Path(self._results_dir).mkdir(parents=True, exist_ok=True) - - def _get_savefile_path(self, sim_name): - return f"{self._saves_dir}/{misc.slugify(sim_name)}_state.pickle" - - def _get_metadata_path(self, sim_name): - return f"{self._results_dir}/{misc.slugify(sim_name)}_metadata.json" - - def _get_results_path(self, sim_name): - return f"{self._results_dir}/{misc.slugify(sim_name)}.csv" - - def _read_metadata(self, sim_name) -> typing.Dict: - with open(self._get_metadata_path(sim_name), 'r', - encoding='utf-8') as f: - return json.load(f) - - def _save_metadata(self, sim_name, metadata) -> None: - with open(self._get_metadata_path(sim_name), 'w+', - encoding='utf-8') as f: - json.dump(metadata, f, ensure_ascii=False, indent=4) - - def unfinished_sim_present(self, sim_name: str): - """Check if the savefile of a previously paused simulation is - present. - - :param sim_name: Name - :return: True if a paused simulation with the given name is found - """ - return os.path.isfile( - self._get_savefile_path(sim_name)) and os.path.isfile( - self._get_metadata_path(sim_name)) - - # TODO: Make the directories configurable in the init function - def get_unfinished_sims(self) -> typing.List[str]: - """Get a list unfinished simulations.""" - save_files = [f for f in os.listdir(self._saves_dir) if - os.path.isfile(os.path.join(self._saves_dir, f))] - - state_files = [f for f in save_files if f.endswith("_state.pickle")] - sim_slugs = [f.removesuffix("_state.pickle") for f in state_files] - - sim_names = [self._read_metadata(slug)["name"] for slug in sim_slugs] - - return sim_names - - def remove_unfinished_sim(self, sim_name: str): - """Remove the savefile of a previously paused simulation. - - :param sim_name: Name of the simulation - """ - os.remove(self._get_savefile_path(sim_name)) - # os.remove(self._get_metadata_path(sim_name)) - - def save_state(self, simulator: typing.Any, sim_name: str, - metadata: typing.Dict) -> None: - """Save the state of a currently running simulation. - - :param simulator: Simulator object - :param sim_name: Name of the simulation - :param metadata: Metadata to be saved besides the actual state - """ - # Save metadata - self._save_metadata(sim_name, metadata) - - # Save simulation state - with open(self._get_savefile_path(sim_name), "wb") as file: - pickle.dump(simulator, file) - - def read_state(self, sim_name: str) -> typing.Tuple[ - typing.Any, typing.Dict]: - """Read the saved state of a paused simulation. - - :param sim_name: Name of the simulation - :return: Tuple of the form (simulator, metadata) - """ - # Read metadata - metadata = self._read_metadata(sim_name) - - # Read simulation state - simulator = None - with open(self._get_savefile_path(sim_name), "rb") as file: - simulator = pickle.load(file) - - return simulator, metadata - - # TODO: Is the simulator object actually necessary here? - def save_results(self, simulator: typing.Any, sim_name: str, - metadata: typing.Dict) -> None: - """Save simulation results to file. - - :param simulator: Simulator object. Used to obtain the data - :param sim_name: Name of the simulation. Determines the filename - :param metadata: Metadata to be saved besides the actual simulation - results - """ - # Save metadata - self._save_metadata(sim_name, metadata) - - # Save current results - simulator.current_results.to_csv(self._get_results_path(sim_name), - index=False) - - def read_results(self, sim_name: str) -> typing.Tuple[ - pd.DataFrame, typing.Dict]: - """Read simulation results from file. - - :param sim_name: Name of the simulation. - :return: Tuple of the form (data, metadata), where data is a pandas - dataframe and metadata is a dict - """ - # Read metadata - metadata = self._read_metadata(sim_name) - - # Read results - results = pd.read_csv(self._get_results_path(sim_name)) - - return results, metadata - - -# TODO: Autosave simulation every so often -# TODO: Comment explaining what a Simulator class is -class SimulationManager: - """This class only contains functions relating to stopping and - restarting of simulations (and storing of the simulation state in a - file, to be resumed at a later date). - - All actual work is outsourced to a provided simulator class. - """ - - def __init__(self, saves_dir: str, results_dir: str): - """Construct a SimulationManager object. - - :param saves_dir: Directory in which the simulation state of a paused - simulation should be stored - :param results_dir: Directory in which the results of the simulation - should be stored - """ - self._de_serializer = SimulationDeSerializer(saves_dir, results_dir) - - self._simulator = None - self._sim_name = None - self._metadata = {"duration": 0} - self._sim_start_time = None - - def _sim_configured(self) -> bool: - """Check whether 'configure_simulation()' has been called.""" - return (self._simulator is not None) and ( - self._sim_name is not None) and ( - self._metadata is not None) - - def configure_simulation(self, simulator: typing.Any, name: str, - additional_metadata: dict = {}) -> None: - """Configure a new simulation.""" - self._simulator = simulator - self._sim_name = name - self._metadata["name"] = name - self._metadata["platform"] = platform.platform() - self._metadata.update(additional_metadata) - - def get_unfinished(self) -> typing.List[str]: - """Get a list of names of all present unfinished simulations.""" - return self._de_serializer.get_unfinished_sims() - - def load_unfinished(self, sim_name: str) -> None: - """Load the state of an unfinished simulation form its savefile. - - Warning: This function deletes the savefile after loading. - """ - assert self._de_serializer.unfinished_sim_present(sim_name) - - self._sim_name = sim_name - self._simulator, self._metadata = self._de_serializer.read_state( - sim_name) - - self._de_serializer.remove_unfinished_sim(sim_name) - - # TODO: Metadata is being written twice here. Should save_results() also - # save the metadata? - def _exit_gracefully(self, *args) -> None: - """Handler called when the program is interrupted. Pauses and saves - the currently running simulation.""" - if self._sim_configured(): - self._simulator.stop() - - self._metadata["end_time"] = f"{datetime.now(tz=None)}" - self._metadata["duration"] \ - += timeit.default_timer() - self._sim_start_time - - self._de_serializer.save_state(self._simulator, self._sim_name, - self._metadata) - self._de_serializer.save_results(self._simulator, self._sim_name, - self._metadata) - - exit() - - def simulate(self) -> None: - """Start the simulation. This is a blocking call.""" - assert self._sim_configured() - - try: - self._sim_start_time = timeit.default_timer() - - self._simulator.start_or_continue() - - self._metadata["end_time"] = f"{datetime.now(tz=None)}" - self._metadata["duration"] \ - += timeit.default_timer() - self._sim_start_time - - self._de_serializer.save_results(self._simulator, self._sim_name, - self._metadata) - except KeyboardInterrupt: - self._exit_gracefully() - - def get_current_results(self) -> pd.DataFrame: - return self._simulator.current_results diff --git a/sw/python/utility/simulation/simulators.py b/sw/python/utility/simulation/simulators.py deleted file mode 100644 index 6f82984..0000000 --- a/sw/python/utility/simulation/simulators.py +++ /dev/null @@ -1,121 +0,0 @@ -import pandas as pd -import numpy as np -import typing -from tqdm import tqdm -from concurrent.futures import ProcessPoolExecutor, process, wait -from functools import partial -from multiprocessing import Lock - -from utility import noise - - -# TODO: Fix ProximalDecoder_Dynamic -# from cpp_modules.cpp_decoders import ProximalDecoder_Dynamic as -# ProximalDecoder - - -def count_bit_errors(d: np.array, d_hat: np.array) -> int: - """Count the number of wrong bits in a decoded codeword. - - :param d: Originally sent data - :param d_hat: Received data - :return: Number of bit errors - """ - return np.sum(d != d_hat) - - -class HashableDict: - """Class behaving like an immutable dict. More importantly it is - hashable and thus usable as a key type for another dict.""" - - def __init__(self, data_dict): - assert (isinstance(data_dict, dict)) - for key, val in data_dict.items(): - self.__dict__[key] = val - - def __getitem__(self, item): - return self.__dict__[item] - - def __str__(self): - return str(self.__dict__) - - -class GenericMultithreadedSimulator: - def __init__(self, max_workers=8): - self._format_func = None - self._task_func = None - self._task_params = None - self._max_workers = max_workers - - self._results = {} - self._executor = None - - @property - def task_params(self): - return self._task_params - - @task_params.setter - def task_params(self, sim_params): - self._task_params = {HashableDict(iteration_params): iteration_params - for iteration_params in sim_params} - - @property - def task_func(self): - return self._task_func - - @task_func.setter - def task_func(self, func): - self._task_func = func - - @property - def format_func(self): - return self._format_func - - @format_func.setter - def format_func(self, func): - self._format_func = func - - def start_or_continue(self): - assert self._task_func is not None - assert self._task_params is not None - assert self._format_func is not None - - self._executor = ProcessPoolExecutor(max_workers=self._max_workers) - - with tqdm(total=(len(self._task_params)), leave=False) as pbar: - def done_callback(key, f): - try: - pbar.update(1) - self._results[key] = f.result() - del self._task_params[key] - except process.BrokenProcessPool: - # This exception is thrown when the program is - # prematurely stopped with a KeyboardInterrupt - pass - - futures = [] - - for key, params in list(self._task_params.items()): - future = self._executor.submit(self._task_func, params) - future.add_done_callback(partial(done_callback, key)) - futures.append(future) - - self._executor.shutdown(wait=True, cancel_futures=False) - - def stop(self): - assert self._executor is not None, "The simulation has to be started" \ - " before it can be stopped" - self._executor.shutdown(wait=True, cancel_futures=True) - - @property - def current_results(self): - return self._format_func(self._results) - - def __getstate__(self): - state = self.__dict__.copy() - state["_executor"] = None - return state - - def __setstate__(self, state): - self.__dict__.update(state) - self._executor = ProcessPoolExecutor() diff --git a/sw/python/utility/test/__init__.py b/sw/python/utility/test/__init__.py deleted file mode 100644 index 2f312a6..0000000 --- a/sw/python/utility/test/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""This package contains unit tests.""" diff --git a/sw/python/utility/test/test_proximal.py b/sw/python/utility/test/test_proximal.py deleted file mode 100644 index 650b0e6..0000000 --- a/sw/python/utility/test/test_proximal.py +++ /dev/null @@ -1,72 +0,0 @@ -import unittest -import numpy as np -from decoders import proximal - - -class CheckParityTestCase(unittest.TestCase): - """Test case for the check_parity function.""" - - def test_check_parity(self): - # Hamming(7,4) code - G = np.array([[1, 1, 1, 0, 0, 0, 0], - [1, 0, 0, 1, 1, 0, 0], - [0, 1, 0, 1, 0, 1, 0], - [1, 1, 0, 1, 0, 0, 1]]) - H = np.array([[1, 0, 1, 0, 1, 0, 1], - [0, 1, 1, 0, 0, 1, 1], - [0, 0, 0, 1, 1, 1, 1]]) - R = np.array([[0, 0, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 1]]) - - decoder = proximal.ProximalDecoder(H) - - d1 = np.array([0, 1, 0, 1]) - c1 = np.dot(np.transpose(G), d1) % 2 - - d2 = np.array([0, 0, 0, 0]) - c2 = np.dot(np.transpose(G), d2) % 2 - - d3 = np.array([1, 1, 1, 1]) - c3 = np.dot(np.transpose(G), d3) % 2 - - invalid_codeword = np.array([0, 1, 1, 0, 1, 1, 1]) - - self.assertEqual(decoder._check_parity(c1), True) - self.assertEqual(decoder._check_parity(c2), True) - self.assertEqual(decoder._check_parity(c3), True) - self.assertEqual(decoder._check_parity(invalid_codeword), False) - - -class GradientTestCase(unittest.TestCase): - """Test case for the calculation of the gradient of the - code-constraint-polynomial.""" - - def test_grad_h(self): - """Test the gradient of the code-constraint polynomial.""" - # Hamming(7,4) code - G = np.array([[1, 1, 1, 0, 0, 0, 0], - [1, 0, 0, 1, 1, 0, 0], - [0, 1, 0, 1, 0, 1, 0], - [1, 1, 0, 1, 0, 0, 1]]) - H = np.array([[1, 0, 1, 0, 1, 0, 1], - [0, 1, 1, 0, 0, 1, 1], - [0, 0, 0, 1, 1, 1, 1]]) - R = np.array([[0, 0, 1, 0, 0, 0, 0], - [0, 0, 0, 0, 1, 0, 0], - [0, 0, 0, 0, 0, 1, 0], - [0, 0, 0, 0, 0, 0, 1]]) - - x = np.array([1, 2, -1, -2, 2, 1, -1]) # Some randomly chosen vector - expected_grad_h = np.array( - [4, 26, -8, -36, 38, 28, -32]) # Manually calculated result - - decoder = proximal.ProximalDecoder(H) - grad_h = decoder._grad_h(x) - - self.assertEqual(np.array_equal(grad_h, expected_grad_h), True) - - -if __name__ == "__main__": - unittest.main() diff --git a/sw/python/utility/test/test_soft_decision.py b/sw/python/utility/test/test_soft_decision.py deleted file mode 100644 index d0c93d6..0000000 --- a/sw/python/utility/test/test_soft_decision.py +++ /dev/null @@ -1,55 +0,0 @@ -import unittest -import numpy as np -from decoders import maximum_likelihood - - -class CodewordGenerationTestCase(unittest.TestCase): - def test_codeword_generation(self): - """Test case for data word and code word generation.""" - # Hamming(7,4) code - G = np.array([[1, 1, 1, 0, 0, 0, 0], - [1, 0, 0, 1, 1, 0, 0], - [0, 1, 0, 1, 0, 1, 0], - [1, 1, 0, 1, 0, 0, 1]]) - H = np.array([[1, 0, 1, 0, 1, 0, 1], - [0, 1, 1, 0, 0, 1, 1], - [0, 0, 0, 1, 1, 1, 1]]) - - decoder = maximum_likelihood.MLDecoder(G, H) - - expected_datawords = np.array([[0, 0, 0, 0], - [0, 0, 0, 1], - [0, 0, 1, 0], - [0, 0, 1, 1], - [0, 1, 0, 0], - [0, 1, 0, 1], - [0, 1, 1, 0], - [0, 1, 1, 1], - [1, 0, 0, 0], - [1, 0, 0, 1], - [1, 0, 1, 0], - [1, 0, 1, 1], - [1, 1, 0, 0], - [1, 1, 0, 1], - [1, 1, 1, 0], - [1, 1, 1, 1]]) - - expected_codewords = np.array([[0, 0, 0, 0, 0, 0, 0], - [1, 1, 0, 1, 0, 0, 1], - [0, 1, 0, 1, 0, 1, 0], - [1, 0, 0, 0, 0, 1, 1], - [1, 0, 0, 1, 1, 0, 0], - [0, 1, 0, 0, 1, 0, 1], - [1, 1, 0, 0, 1, 1, 0], - [0, 0, 0, 1, 1, 1, 1], - [1, 1, 1, 0, 0, 0, 0], - [0, 0, 1, 1, 0, 0, 1], - [1, 0, 1, 1, 0, 1, 0], - [0, 1, 1, 0, 0, 1, 1], - [0, 1, 1, 1, 1, 0, 0], - [1, 0, 1, 0, 1, 0, 1], - [0, 0, 1, 0, 1, 1, 0], - [1, 1, 1, 1, 1, 1, 1]]) - - self.assertEqual(np.array_equal(decoder._datawords, expected_datawords), True) - self.assertEqual(np.array_equal(decoder._codewords, expected_codewords), True) diff --git a/sw/python/utility/test/test_utility.py b/sw/python/utility/test/test_utility.py deleted file mode 100644 index 2a589ed..0000000 --- a/sw/python/utility/test/test_utility.py +++ /dev/null @@ -1,48 +0,0 @@ -import unittest -import numpy as np - -from utility import noise, codes - - -# TODO: Rewrite tests for new SNR calculation -class NoiseAmpFromSNRTestCase(unittest.TestCase): - """Test case for noise amplitude calculation.""" - - def test_get_noise_amp_from_SNR(self): - SNR1 = 0 - SNR2 = 3 - SNR3 = 20 - SNR4 = -20 - - var1 = noise.get_noise_variance_from_SNR(SNR1, n=8, k=8) - var2 = noise.get_noise_variance_from_SNR(SNR2, n=8, k=8) - var3 = noise.get_noise_variance_from_SNR(SNR3, n=8, k=8) - var4 = noise.get_noise_variance_from_SNR(SNR4, n=8, k=8) - - self.assertEqual(var1, 1 * 0.5) - self.assertAlmostEqual(var2, 0.5 * 0.5, places=2) - self.assertEqual(var3, 0.01 * 0.5) - self.assertEqual(var4, 100 * 0.5) - - -class CodesTestCase(unittest.TestCase): - """Tests relating to the 'codes' utilities.""" - - def test_get_systematic_H(self): - # Hamming(7,4) code - G = np.array([[1, 0, 0, 0, 0, 1, 1], - [0, 1, 0, 0, 1, 0, 1], - [0, 0, 1, 0, 1, 1, 0], - [0, 0, 0, 1, 1, 1, 1]]) - - expected_H = np.array([[0, 1, 1, 1, 1, 0, 0], - [1, 0, 1, 1, 0, 1, 0], - [1, 1, 0, 1, 0, 0, 1]]) - - H = codes.get_systematic_H(G) - - self.assertEqual(np.array_equal(expected_H, H), True) - - -if __name__ == '__main__': - unittest.main() diff --git a/sw/python/utility/test/test_visualization.py b/sw/python/utility/test/test_visualization.py deleted file mode 100644 index a668b77..0000000 --- a/sw/python/utility/test/test_visualization.py +++ /dev/null @@ -1,24 +0,0 @@ -import unittest -from utility import visualization - - -class NumRowsTestCase(unittest.TestCase): - def test_get_num_rows(self): - """Test case for number of row calculation.""" - - num_rows1 = visualization._get_num_rows(num_graphs=4, num_cols=3) - expected_rows1 = 2 - - num_rows2 = visualization._get_num_rows(num_graphs=5, num_cols=2) - expected_rows2 = 3 - - num_rows3 = visualization._get_num_rows(num_graphs=4, num_cols=4) - expected_rows3 = 1 - - num_rows4 = visualization._get_num_rows(num_graphs=4, num_cols=5) - expected_rows4 = 1 - - self.assertEqual(num_rows1, expected_rows1) - self.assertEqual(num_rows2, expected_rows2) - self.assertEqual(num_rows3, expected_rows3) - self.assertEqual(num_rows4, expected_rows4) diff --git a/sw/python/utility/visualization.py b/sw/python/utility/visualization.py deleted file mode 100644 index 46ab790..0000000 --- a/sw/python/utility/visualization.py +++ /dev/null @@ -1,75 +0,0 @@ -import seaborn as sns -import matplotlib.pyplot as plt -import pandas as pd -import typing -from itertools import chain -import math - - -def _get_num_rows(num_graphs: int, num_cols: int) -> int: - """Get the minimum number of rows needed to show a certain number of - graphs, given a certain number of columns. - - :param num_graphs: Number of graphs - :param num_cols: Number of columns - :return: Number of rows - """ - return math.ceil(num_graphs / num_cols) - - -# TODO: Handle number of graphs not nicely fitting into rows and columns -def plot_BERs(title: str, - data: typing.Sequence[ - typing.Tuple[str, pd.DataFrame, typing.Sequence[str]]], - num_cols: int = 3) -> plt.figure: - """This function creates a matplotlib figure containing a number of plots. - - The plots created are logarithmic and the scaling is adjusted to be - sensible for BER plots. - - :param title: Title of the figure - :param data: Sequence of tuples. Each tuple corresponds to a new plot and - is of the following form: [graph_title, pd.Dataframe, [line_label_1, - line_label2, ...]]. Each dataframe is assumed to have an "SNR" column - that is used as the x axis. - :param num_cols: Number of columns in which the graphs should be - arranged in the resulting figure - :return: Matplotlib figure - """ - # Determine layout and create figure - - num_graphs = len(data) - num_rows = _get_num_rows(num_graphs, num_cols) - - fig, axes = plt.subplots(num_rows, num_cols, - figsize=(num_cols * 4, num_rows * 4), - squeeze=False) - fig.suptitle(title) - - fig.subplots_adjust(left=0.1, - bottom=0.1, - right=0.9, - top=0.9, - wspace=0.3, - hspace=0.4) - - axes = list(chain.from_iterable(axes))[ - :num_graphs] # Flatten the 2d axes array - - # Populate axes - - for axis, (graph_title, df, labels) in zip(axes, data): - column_names = [column for column in df.columns.values.tolist() if - not column == "SNR"] - - for column, label in zip(column_names, labels): - sns.lineplot(ax=axis, data=df, x="SNR", y=column, label=label) - - axis.set_title(graph_title) - axis.set(yscale="log") - axis.set_xlabel("SNR") - axis.set_ylabel("BER") - axis.set_yticks([10e-5, 10e-4, 10e-3, 10e-2, 10e-1, 10e0]) - axis.legend() - - return fig