// 
// Decompiled by Procyon v0.6.0
// 

package org.bouncycastle.math.ec.rfc8032;

import org.bouncycastle.math.raw.Nat448;
import org.bouncycastle.math.raw.Nat;

abstract class Scalar448
{
    static final int SIZE = 14;
    private static final int SCALAR_BYTES = 57;
    private static final long M26L = 67108863L;
    private static final long M28L = 268435455L;
    private static final long M32L = 4294967295L;
    private static final int TARGET_LENGTH = 447;
    private static final int[] L;
    private static final int[] LSq;
    private static final int L_0 = 78101261;
    private static final int L_1 = 141809365;
    private static final int L_2 = 175155932;
    private static final int L_3 = 64542499;
    private static final int L_4 = 158326419;
    private static final int L_5 = 191173276;
    private static final int L_6 = 104575268;
    private static final int L_7 = 137584065;
    private static final int L4_0 = 43969588;
    private static final int L4_1 = 30366549;
    private static final int L4_2 = 163752818;
    private static final int L4_3 = 258169998;
    private static final int L4_4 = 96434764;
    private static final int L4_5 = 227822194;
    private static final int L4_6 = 149865618;
    private static final int L4_7 = 550336261;
    
    static boolean checkVar(final byte[] array, final int[] array2) {
        if (array[56] != 0) {
            return false;
        }
        decode(array, array2);
        return !Nat.gte(14, array2, Scalar448.L);
    }
    
    static void decode(final byte[] array, final int[] array2) {
        Codec.decode32(array, 0, array2, 0, 14);
    }
    
    static void getOrderWnafVar(final int n, final byte[] array) {
        Wnaf.getSignedVar(Scalar448.L, n, array);
    }
    
    static void multiply225Var(final int[] array, final int[] array2, final int[] array3) {
        final int[] array4 = new int[22];
        Nat.mul(array2, 0, 8, array, 0, 14, array4, 0);
        if (array2[7] < 0) {
            Nat.addTo(14, Scalar448.L, 0, array4, 8);
            Nat.subFrom(14, array, 0, array4, 8);
        }
        final byte[] array5 = new byte[88];
        Codec.encode32(array4, 0, 22, array5, 0);
        decode(reduce704(array5), array3);
    }
    
    static byte[] reduce704(final byte[] array) {
        final long n = (long)Codec.decode32(array, 0) & 0xFFFFFFFFL;
        final long n2 = (long)(Codec.decode24(array, 4) << 4) & 0xFFFFFFFFL;
        final long n3 = (long)Codec.decode32(array, 7) & 0xFFFFFFFFL;
        final long n4 = (long)(Codec.decode24(array, 11) << 4) & 0xFFFFFFFFL;
        final long n5 = (long)Codec.decode32(array, 14) & 0xFFFFFFFFL;
        final long n6 = (long)(Codec.decode24(array, 18) << 4) & 0xFFFFFFFFL;
        final long n7 = (long)Codec.decode32(array, 21) & 0xFFFFFFFFL;
        final long n8 = (long)(Codec.decode24(array, 25) << 4) & 0xFFFFFFFFL;
        final long n9 = (long)Codec.decode32(array, 28) & 0xFFFFFFFFL;
        final long n10 = (long)(Codec.decode24(array, 32) << 4) & 0xFFFFFFFFL;
        final long n11 = (long)Codec.decode32(array, 35) & 0xFFFFFFFFL;
        final long n12 = (long)(Codec.decode24(array, 39) << 4) & 0xFFFFFFFFL;
        final long n13 = (long)Codec.decode32(array, 42) & 0xFFFFFFFFL;
        final long n14 = (long)(Codec.decode24(array, 46) << 4) & 0xFFFFFFFFL;
        final long n15 = (long)Codec.decode32(array, 49) & 0xFFFFFFFFL;
        final long n16 = (long)(Codec.decode24(array, 53) << 4) & 0xFFFFFFFFL;
        final long n17 = (long)Codec.decode32(array, 56) & 0xFFFFFFFFL;
        final long n18 = (long)(Codec.decode24(array, 60) << 4) & 0xFFFFFFFFL;
        final long n19 = (long)Codec.decode32(array, 63) & 0xFFFFFFFFL;
        final long n20 = (long)(Codec.decode24(array, 67) << 4) & 0xFFFFFFFFL;
        final long n21 = (long)Codec.decode32(array, 70) & 0xFFFFFFFFL;
        final long n22 = (long)(Codec.decode24(array, 74) << 4) & 0xFFFFFFFFL;
        final long n23 = (long)Codec.decode32(array, 77) & 0xFFFFFFFFL;
        final long n24 = (long)(Codec.decode24(array, 81) << 4) & 0xFFFFFFFFL;
        final long n25 = (long)Codec.decode32(array, 84) & 0xFFFFFFFFL;
        final long n26 = 0L + (n25 >>> 28);
        final long n27 = n25 & 0xFFFFFFFL;
        final long n28 = n10 + n26 * 43969588L;
        final long n29 = n11 + n26 * 30366549L;
        final long n30 = n12 + n26 * 163752818L;
        final long n31 = n13 + n26 * 258169998L;
        final long n32 = n14 + n26 * 96434764L;
        final long n33 = n15 + n26 * 227822194L;
        final long n34 = n16 + n26 * 149865618L;
        final long n35 = n17 + n26 * 550336261L;
        final long n36 = n22 + (n21 >>> 28);
        final long n37 = n21 & 0xFFFFFFFL;
        final long n38 = n23 + (n36 >>> 28);
        final long n39 = n36 & 0xFFFFFFFL;
        final long n40 = n24 + (n38 >>> 28);
        final long n41 = n38 & 0xFFFFFFFL;
        final long n42 = n27 + (n40 >>> 28);
        final long n43 = n40 & 0xFFFFFFFL;
        final long n44 = n9 + n42 * 43969588L;
        final long n45 = n28 + n42 * 30366549L;
        final long n46 = n29 + n42 * 163752818L;
        final long n47 = n30 + n42 * 258169998L;
        final long n48 = n31 + n42 * 96434764L;
        final long n49 = n32 + n42 * 227822194L;
        final long n50 = n33 + n42 * 149865618L;
        final long n51 = n34 + n42 * 550336261L;
        final long n52 = n8 + n43 * 43969588L;
        final long n53 = n44 + n43 * 30366549L;
        final long n54 = n45 + n43 * 163752818L;
        final long n55 = n46 + n43 * 258169998L;
        final long n56 = n47 + n43 * 96434764L;
        final long n57 = n48 + n43 * 227822194L;
        final long n58 = n49 + n43 * 149865618L;
        final long n59 = n50 + n43 * 550336261L;
        final long n60 = n7 + n41 * 43969588L;
        final long n61 = n52 + n41 * 30366549L;
        final long n62 = n53 + n41 * 163752818L;
        final long n63 = n54 + n41 * 258169998L;
        final long n64 = n55 + n41 * 96434764L;
        final long n65 = n56 + n41 * 227822194L;
        final long n66 = n57 + n41 * 149865618L;
        final long n67 = n58 + n41 * 550336261L;
        final long n68 = n19 + (n18 >>> 28);
        final long n69 = n18 & 0xFFFFFFFL;
        final long n70 = n20 + (n68 >>> 28);
        final long n71 = n68 & 0xFFFFFFFL;
        final long n72 = n37 + (n70 >>> 28);
        final long n73 = n70 & 0xFFFFFFFL;
        final long n74 = n39 + (n72 >>> 28);
        final long n75 = n72 & 0xFFFFFFFL;
        final long n76 = n6 + n74 * 43969588L;
        final long n77 = n60 + n74 * 30366549L;
        final long n78 = n61 + n74 * 163752818L;
        final long n79 = n62 + n74 * 258169998L;
        final long n80 = n63 + n74 * 96434764L;
        final long n81 = n64 + n74 * 227822194L;
        final long n82 = n65 + n74 * 149865618L;
        final long n83 = n66 + n74 * 550336261L;
        final long n84 = n5 + n75 * 43969588L;
        final long n85 = n76 + n75 * 30366549L;
        final long n86 = n77 + n75 * 163752818L;
        final long n87 = n78 + n75 * 258169998L;
        final long n88 = n79 + n75 * 96434764L;
        final long n89 = n80 + n75 * 227822194L;
        final long n90 = n81 + n75 * 149865618L;
        final long n91 = n82 + n75 * 550336261L;
        final long n92 = n4 + n73 * 43969588L;
        final long n93 = n84 + n73 * 30366549L;
        final long n94 = n85 + n73 * 163752818L;
        final long n95 = n86 + n73 * 258169998L;
        final long n96 = n87 + n73 * 96434764L;
        final long n97 = n88 + n73 * 227822194L;
        final long n98 = n89 + n73 * 149865618L;
        final long n99 = n90 + n73 * 550336261L;
        final long n100 = n51 + (n59 >>> 28);
        final long n101 = n59 & 0xFFFFFFFL;
        final long n102 = n35 + (n100 >>> 28);
        final long n103 = n100 & 0xFFFFFFFL;
        final long n104 = n69 + (n102 >>> 28);
        final long n105 = n102 & 0xFFFFFFFL;
        final long n106 = n71 + (n104 >>> 28);
        final long n107 = n104 & 0xFFFFFFFL;
        final long n108 = n3 + n106 * 43969588L;
        final long n109 = n92 + n106 * 30366549L;
        final long n110 = n93 + n106 * 163752818L;
        final long n111 = n94 + n106 * 258169998L;
        final long n112 = n95 + n106 * 96434764L;
        final long n113 = n96 + n106 * 227822194L;
        final long n114 = n97 + n106 * 149865618L;
        final long n115 = n98 + n106 * 550336261L;
        final long n116 = n2 + n107 * 43969588L;
        final long n117 = n108 + n107 * 30366549L;
        final long n118 = n109 + n107 * 163752818L;
        final long n119 = n110 + n107 * 258169998L;
        final long n120 = n111 + n107 * 96434764L;
        final long n121 = n112 + n107 * 227822194L;
        final long n122 = n113 + n107 * 149865618L;
        final long n123 = n114 + n107 * 550336261L;
        final long n124 = n105 * 4L + (n103 >>> 26);
        final long n125 = n103 & 0x3FFFFFFL;
        final long n126 = n124 + 1L;
        final long n127 = n + n126 * 78101261L;
        final long n128 = n116 + n126 * 141809365L;
        final long n129 = n117 + n126 * 175155932L;
        final long n130 = n118 + n126 * 64542499L;
        final long n131 = n119 + n126 * 158326419L;
        final long n132 = n120 + n126 * 191173276L;
        final long n133 = n121 + n126 * 104575268L;
        final long n134 = n122 + n126 * 137584065L;
        final long n135 = n128 + (n127 >>> 28);
        final long n136 = n127 & 0xFFFFFFFL;
        final long n137 = n129 + (n135 >>> 28);
        final long n138 = n135 & 0xFFFFFFFL;
        final long n139 = n130 + (n137 >>> 28);
        final long n140 = n137 & 0xFFFFFFFL;
        final long n141 = n131 + (n139 >>> 28);
        final long n142 = n139 & 0xFFFFFFFL;
        final long n143 = n132 + (n141 >>> 28);
        final long n144 = n141 & 0xFFFFFFFL;
        final long n145 = n133 + (n143 >>> 28);
        final long n146 = n143 & 0xFFFFFFFL;
        final long n147 = n134 + (n145 >>> 28);
        final long n148 = n145 & 0xFFFFFFFL;
        final long n149 = n123 + (n147 >>> 28);
        final long n150 = n147 & 0xFFFFFFFL;
        final long n151 = n115 + (n149 >>> 28);
        final long n152 = n149 & 0xFFFFFFFL;
        final long n153 = n99 + (n151 >>> 28);
        final long n154 = n151 & 0xFFFFFFFL;
        final long n155 = n91 + (n153 >>> 28);
        final long n156 = n153 & 0xFFFFFFFL;
        final long n157 = n83 + (n155 >>> 28);
        final long n158 = n155 & 0xFFFFFFFL;
        final long n159 = n67 + (n157 >>> 28);
        final long n160 = n157 & 0xFFFFFFFL;
        final long n161 = n101 + (n159 >>> 28);
        final long n162 = n159 & 0xFFFFFFFL;
        final long n163 = n125 + (n161 >>> 28);
        final long n164 = n161 & 0xFFFFFFFL;
        final long n165 = n163 >>> 26;
        final long n166 = n163 & 0x3FFFFFFL;
        final long n167 = n165 - 1L;
        final long n168 = n136 - (n167 & 0x4A7BB0DL);
        final long n169 = n138 - (n167 & 0x873D6D5L);
        final long n170 = n140 - (n167 & 0xA70AADCL);
        final long n171 = n142 - (n167 & 0x3D8D723L);
        final long n172 = n144 - (n167 & 0x96FDE93L);
        final long n173 = n146 - (n167 & 0xB65129CL);
        final long n174 = n148 - (n167 & 0x63BB124L);
        final long n175 = n150 - (n167 & 0x8335DC1L);
        final long n176 = n169 + (n168 >> 28);
        final long n177 = n168 & 0xFFFFFFFL;
        final long n178 = n170 + (n176 >> 28);
        final long n179 = n176 & 0xFFFFFFFL;
        final long n180 = n171 + (n178 >> 28);
        final long n181 = n178 & 0xFFFFFFFL;
        final long n182 = n172 + (n180 >> 28);
        final long n183 = n180 & 0xFFFFFFFL;
        final long n184 = n173 + (n182 >> 28);
        final long n185 = n182 & 0xFFFFFFFL;
        final long n186 = n174 + (n184 >> 28);
        final long n187 = n184 & 0xFFFFFFFL;
        final long n188 = n175 + (n186 >> 28);
        final long n189 = n186 & 0xFFFFFFFL;
        final long n190 = n152 + (n188 >> 28);
        final long n191 = n188 & 0xFFFFFFFL;
        final long n192 = n154 + (n190 >> 28);
        final long n193 = n190 & 0xFFFFFFFL;
        final long n194 = n156 + (n192 >> 28);
        final long n195 = n192 & 0xFFFFFFFL;
        final long n196 = n158 + (n194 >> 28);
        final long n197 = n194 & 0xFFFFFFFL;
        final long n198 = n160 + (n196 >> 28);
        final long n199 = n196 & 0xFFFFFFFL;
        final long n200 = n162 + (n198 >> 28);
        final long n201 = n198 & 0xFFFFFFFL;
        final long n202 = n164 + (n200 >> 28);
        final long n203 = n200 & 0xFFFFFFFL;
        final long n204 = n166 + (n202 >> 28);
        final long n205 = n202 & 0xFFFFFFFL;
        final byte[] array2 = new byte[57];
        Codec.encode56(n177 | n179 << 28, array2, 0);
        Codec.encode56(n181 | n183 << 28, array2, 7);
        Codec.encode56(n185 | n187 << 28, array2, 14);
        Codec.encode56(n189 | n191 << 28, array2, 21);
        Codec.encode56(n193 | n195 << 28, array2, 28);
        Codec.encode56(n197 | n199 << 28, array2, 35);
        Codec.encode56(n201 | n203 << 28, array2, 42);
        Codec.encode56(n205 | n204 << 28, array2, 49);
        return array2;
    }
    
    static byte[] reduce912(final byte[] array) {
        final long n = (long)Codec.decode32(array, 0) & 0xFFFFFFFFL;
        final long n2 = (long)(Codec.decode24(array, 4) << 4) & 0xFFFFFFFFL;
        final long n3 = (long)Codec.decode32(array, 7) & 0xFFFFFFFFL;
        final long n4 = (long)(Codec.decode24(array, 11) << 4) & 0xFFFFFFFFL;
        final long n5 = (long)Codec.decode32(array, 14) & 0xFFFFFFFFL;
        final long n6 = (long)(Codec.decode24(array, 18) << 4) & 0xFFFFFFFFL;
        final long n7 = (long)Codec.decode32(array, 21) & 0xFFFFFFFFL;
        final long n8 = (long)(Codec.decode24(array, 25) << 4) & 0xFFFFFFFFL;
        final long n9 = (long)Codec.decode32(array, 28) & 0xFFFFFFFFL;
        final long n10 = (long)(Codec.decode24(array, 32) << 4) & 0xFFFFFFFFL;
        final long n11 = (long)Codec.decode32(array, 35) & 0xFFFFFFFFL;
        final long n12 = (long)(Codec.decode24(array, 39) << 4) & 0xFFFFFFFFL;
        final long n13 = (long)Codec.decode32(array, 42) & 0xFFFFFFFFL;
        final long n14 = (long)(Codec.decode24(array, 46) << 4) & 0xFFFFFFFFL;
        final long n15 = (long)Codec.decode32(array, 49) & 0xFFFFFFFFL;
        final long n16 = (long)(Codec.decode24(array, 53) << 4) & 0xFFFFFFFFL;
        final long n17 = (long)Codec.decode32(array, 56) & 0xFFFFFFFFL;
        final long n18 = (long)(Codec.decode24(array, 60) << 4) & 0xFFFFFFFFL;
        final long n19 = (long)Codec.decode32(array, 63) & 0xFFFFFFFFL;
        final long n20 = (long)(Codec.decode24(array, 67) << 4) & 0xFFFFFFFFL;
        final long n21 = (long)Codec.decode32(array, 70) & 0xFFFFFFFFL;
        final long n22 = (long)(Codec.decode24(array, 74) << 4) & 0xFFFFFFFFL;
        final long n23 = (long)Codec.decode32(array, 77) & 0xFFFFFFFFL;
        final long n24 = (long)(Codec.decode24(array, 81) << 4) & 0xFFFFFFFFL;
        final long n25 = (long)Codec.decode32(array, 84) & 0xFFFFFFFFL;
        final long n26 = (long)(Codec.decode24(array, 88) << 4) & 0xFFFFFFFFL;
        final long n27 = (long)Codec.decode32(array, 91) & 0xFFFFFFFFL;
        final long n28 = (long)(Codec.decode24(array, 95) << 4) & 0xFFFFFFFFL;
        final long n29 = (long)Codec.decode32(array, 98) & 0xFFFFFFFFL;
        final long n30 = (long)(Codec.decode24(array, 102) << 4) & 0xFFFFFFFFL;
        final long n31 = (long)Codec.decode32(array, 105) & 0xFFFFFFFFL;
        final long n32 = (long)(Codec.decode24(array, 109) << 4) & 0xFFFFFFFFL;
        final long n33 = (long)Codec.decode16(array, 112) & 0xFFFFFFFFL;
        final long n34 = n17 + n33 * 43969588L;
        final long n35 = n18 + n33 * 30366549L;
        final long n36 = n19 + n33 * 163752818L;
        final long n37 = n20 + n33 * 258169998L;
        final long n38 = n21 + n33 * 96434764L;
        final long n39 = n22 + n33 * 227822194L;
        final long n40 = n23 + n33 * 149865618L;
        final long n41 = n24 + n33 * 550336261L;
        final long n42 = n32 + (n31 >>> 28);
        final long n43 = n31 & 0xFFFFFFFL;
        final long n44 = n16 + n42 * 43969588L;
        final long n45 = n34 + n42 * 30366549L;
        final long n46 = n35 + n42 * 163752818L;
        final long n47 = n36 + n42 * 258169998L;
        final long n48 = n37 + n42 * 96434764L;
        final long n49 = n38 + n42 * 227822194L;
        final long n50 = n39 + n42 * 149865618L;
        final long n51 = n40 + n42 * 550336261L;
        final long n52 = n15 + n43 * 43969588L;
        final long n53 = n44 + n43 * 30366549L;
        final long n54 = n45 + n43 * 163752818L;
        final long n55 = n46 + n43 * 258169998L;
        final long n56 = n47 + n43 * 96434764L;
        final long n57 = n48 + n43 * 227822194L;
        final long n58 = n49 + n43 * 149865618L;
        final long n59 = n50 + n43 * 550336261L;
        final long n60 = n30 + (n29 >>> 28);
        final long n61 = n29 & 0xFFFFFFFL;
        final long n62 = n14 + n60 * 43969588L;
        final long n63 = n52 + n60 * 30366549L;
        final long n64 = n53 + n60 * 163752818L;
        final long n65 = n54 + n60 * 258169998L;
        final long n66 = n55 + n60 * 96434764L;
        final long n67 = n56 + n60 * 227822194L;
        final long n68 = n57 + n60 * 149865618L;
        final long n69 = n58 + n60 * 550336261L;
        final long n70 = n13 + n61 * 43969588L;
        final long n71 = n62 + n61 * 30366549L;
        final long n72 = n63 + n61 * 163752818L;
        final long n73 = n64 + n61 * 258169998L;
        final long n74 = n65 + n61 * 96434764L;
        final long n75 = n66 + n61 * 227822194L;
        final long n76 = n67 + n61 * 149865618L;
        final long n77 = n68 + n61 * 550336261L;
        final long n78 = n28 + (n27 >>> 28);
        final long n79 = n27 & 0xFFFFFFFL;
        final long n80 = n12 + n78 * 43969588L;
        final long n81 = n70 + n78 * 30366549L;
        final long n82 = n71 + n78 * 163752818L;
        final long n83 = n72 + n78 * 258169998L;
        final long n84 = n73 + n78 * 96434764L;
        final long n85 = n74 + n78 * 227822194L;
        final long n86 = n75 + n78 * 149865618L;
        final long n87 = n76 + n78 * 550336261L;
        final long n88 = n11 + n79 * 43969588L;
        final long n89 = n80 + n79 * 30366549L;
        final long n90 = n81 + n79 * 163752818L;
        final long n91 = n82 + n79 * 258169998L;
        final long n92 = n83 + n79 * 96434764L;
        final long n93 = n84 + n79 * 227822194L;
        final long n94 = n85 + n79 * 149865618L;
        final long n95 = n86 + n79 * 550336261L;
        final long n96 = n26 + (n25 >>> 28);
        final long n97 = n25 & 0xFFFFFFFL;
        final long n98 = n10 + n96 * 43969588L;
        final long n99 = n88 + n96 * 30366549L;
        final long n100 = n89 + n96 * 163752818L;
        final long n101 = n90 + n96 * 258169998L;
        final long n102 = n91 + n96 * 96434764L;
        final long n103 = n92 + n96 * 227822194L;
        final long n104 = n93 + n96 * 149865618L;
        final long n105 = n94 + n96 * 550336261L;
        final long n106 = n59 + (n69 >>> 28);
        final long n107 = n69 & 0xFFFFFFFL;
        final long n108 = n51 + (n106 >>> 28);
        final long n109 = n106 & 0xFFFFFFFL;
        final long n110 = n41 + (n108 >>> 28);
        final long n111 = n108 & 0xFFFFFFFL;
        final long n112 = n97 + (n110 >>> 28);
        final long n113 = n110 & 0xFFFFFFFL;
        final long n114 = n9 + n112 * 43969588L;
        final long n115 = n98 + n112 * 30366549L;
        final long n116 = n99 + n112 * 163752818L;
        final long n117 = n100 + n112 * 258169998L;
        final long n118 = n101 + n112 * 96434764L;
        final long n119 = n102 + n112 * 227822194L;
        final long n120 = n103 + n112 * 149865618L;
        final long n121 = n104 + n112 * 550336261L;
        final long n122 = n8 + n113 * 43969588L;
        final long n123 = n114 + n113 * 30366549L;
        final long n124 = n115 + n113 * 163752818L;
        final long n125 = n116 + n113 * 258169998L;
        final long n126 = n117 + n113 * 96434764L;
        final long n127 = n118 + n113 * 227822194L;
        final long n128 = n119 + n113 * 149865618L;
        final long n129 = n120 + n113 * 550336261L;
        final long n130 = n7 + n111 * 43969588L;
        final long n131 = n122 + n111 * 30366549L;
        final long n132 = n123 + n111 * 163752818L;
        final long n133 = n124 + n111 * 258169998L;
        final long n134 = n125 + n111 * 96434764L;
        final long n135 = n126 + n111 * 227822194L;
        final long n136 = n127 + n111 * 149865618L;
        final long n137 = n128 + n111 * 550336261L;
        final long n138 = n87 + (n95 >>> 28);
        final long n139 = n95 & 0xFFFFFFFL;
        final long n140 = n77 + (n138 >>> 28);
        final long n141 = n138 & 0xFFFFFFFL;
        final long n142 = n107 + (n140 >>> 28);
        final long n143 = n140 & 0xFFFFFFFL;
        final long n144 = n109 + (n142 >>> 28);
        final long n145 = n142 & 0xFFFFFFFL;
        final long n146 = n6 + n144 * 43969588L;
        final long n147 = n130 + n144 * 30366549L;
        final long n148 = n131 + n144 * 163752818L;
        final long n149 = n132 + n144 * 258169998L;
        final long n150 = n133 + n144 * 96434764L;
        final long n151 = n134 + n144 * 227822194L;
        final long n152 = n135 + n144 * 149865618L;
        final long n153 = n136 + n144 * 550336261L;
        final long n154 = n5 + n145 * 43969588L;
        final long n155 = n146 + n145 * 30366549L;
        final long n156 = n147 + n145 * 163752818L;
        final long n157 = n148 + n145 * 258169998L;
        final long n158 = n149 + n145 * 96434764L;
        final long n159 = n150 + n145 * 227822194L;
        final long n160 = n151 + n145 * 149865618L;
        final long n161 = n152 + n145 * 550336261L;
        final long n162 = n4 + n143 * 43969588L;
        final long n163 = n154 + n143 * 30366549L;
        final long n164 = n155 + n143 * 163752818L;
        final long n165 = n156 + n143 * 258169998L;
        final long n166 = n157 + n143 * 96434764L;
        final long n167 = n158 + n143 * 227822194L;
        final long n168 = n159 + n143 * 149865618L;
        final long n169 = n160 + n143 * 550336261L;
        final long n170 = n121 + (n129 >>> 28);
        final long n171 = n129 & 0xFFFFFFFL;
        final long n172 = n105 + (n170 >>> 28);
        final long n173 = n170 & 0xFFFFFFFL;
        final long n174 = n139 + (n172 >>> 28);
        final long n175 = n172 & 0xFFFFFFFL;
        final long n176 = n141 + (n174 >>> 28);
        final long n177 = n174 & 0xFFFFFFFL;
        final long n178 = n3 + n176 * 43969588L;
        final long n179 = n162 + n176 * 30366549L;
        final long n180 = n163 + n176 * 163752818L;
        final long n181 = n164 + n176 * 258169998L;
        final long n182 = n165 + n176 * 96434764L;
        final long n183 = n166 + n176 * 227822194L;
        final long n184 = n167 + n176 * 149865618L;
        final long n185 = n168 + n176 * 550336261L;
        final long n186 = n2 + n177 * 43969588L;
        final long n187 = n178 + n177 * 30366549L;
        final long n188 = n179 + n177 * 163752818L;
        final long n189 = n180 + n177 * 258169998L;
        final long n190 = n181 + n177 * 96434764L;
        final long n191 = n182 + n177 * 227822194L;
        final long n192 = n183 + n177 * 149865618L;
        final long n193 = n184 + n177 * 550336261L;
        final long n194 = n175 * 4L + (n173 >>> 26);
        final long n195 = n173 & 0x3FFFFFFL;
        final long n196 = n194 + 1L;
        final long n197 = n + n196 * 78101261L;
        final long n198 = n186 + n196 * 141809365L;
        final long n199 = n187 + n196 * 175155932L;
        final long n200 = n188 + n196 * 64542499L;
        final long n201 = n189 + n196 * 158326419L;
        final long n202 = n190 + n196 * 191173276L;
        final long n203 = n191 + n196 * 104575268L;
        final long n204 = n192 + n196 * 137584065L;
        final long n205 = n198 + (n197 >>> 28);
        final long n206 = n197 & 0xFFFFFFFL;
        final long n207 = n199 + (n205 >>> 28);
        final long n208 = n205 & 0xFFFFFFFL;
        final long n209 = n200 + (n207 >>> 28);
        final long n210 = n207 & 0xFFFFFFFL;
        final long n211 = n201 + (n209 >>> 28);
        final long n212 = n209 & 0xFFFFFFFL;
        final long n213 = n202 + (n211 >>> 28);
        final long n214 = n211 & 0xFFFFFFFL;
        final long n215 = n203 + (n213 >>> 28);
        final long n216 = n213 & 0xFFFFFFFL;
        final long n217 = n204 + (n215 >>> 28);
        final long n218 = n215 & 0xFFFFFFFL;
        final long n219 = n193 + (n217 >>> 28);
        final long n220 = n217 & 0xFFFFFFFL;
        final long n221 = n185 + (n219 >>> 28);
        final long n222 = n219 & 0xFFFFFFFL;
        final long n223 = n169 + (n221 >>> 28);
        final long n224 = n221 & 0xFFFFFFFL;
        final long n225 = n161 + (n223 >>> 28);
        final long n226 = n223 & 0xFFFFFFFL;
        final long n227 = n153 + (n225 >>> 28);
        final long n228 = n225 & 0xFFFFFFFL;
        final long n229 = n137 + (n227 >>> 28);
        final long n230 = n227 & 0xFFFFFFFL;
        final long n231 = n171 + (n229 >>> 28);
        final long n232 = n229 & 0xFFFFFFFL;
        final long n233 = n195 + (n231 >>> 28);
        final long n234 = n231 & 0xFFFFFFFL;
        final long n235 = n233 >>> 26;
        final long n236 = n233 & 0x3FFFFFFL;
        final long n237 = n235 - 1L;
        final long n238 = n206 - (n237 & 0x4A7BB0DL);
        final long n239 = n208 - (n237 & 0x873D6D5L);
        final long n240 = n210 - (n237 & 0xA70AADCL);
        final long n241 = n212 - (n237 & 0x3D8D723L);
        final long n242 = n214 - (n237 & 0x96FDE93L);
        final long n243 = n216 - (n237 & 0xB65129CL);
        final long n244 = n218 - (n237 & 0x63BB124L);
        final long n245 = n220 - (n237 & 0x8335DC1L);
        final long n246 = n239 + (n238 >> 28);
        final long n247 = n238 & 0xFFFFFFFL;
        final long n248 = n240 + (n246 >> 28);
        final long n249 = n246 & 0xFFFFFFFL;
        final long n250 = n241 + (n248 >> 28);
        final long n251 = n248 & 0xFFFFFFFL;
        final long n252 = n242 + (n250 >> 28);
        final long n253 = n250 & 0xFFFFFFFL;
        final long n254 = n243 + (n252 >> 28);
        final long n255 = n252 & 0xFFFFFFFL;
        final long n256 = n244 + (n254 >> 28);
        final long n257 = n254 & 0xFFFFFFFL;
        final long n258 = n245 + (n256 >> 28);
        final long n259 = n256 & 0xFFFFFFFL;
        final long n260 = n222 + (n258 >> 28);
        final long n261 = n258 & 0xFFFFFFFL;
        final long n262 = n224 + (n260 >> 28);
        final long n263 = n260 & 0xFFFFFFFL;
        final long n264 = n226 + (n262 >> 28);
        final long n265 = n262 & 0xFFFFFFFL;
        final long n266 = n228 + (n264 >> 28);
        final long n267 = n264 & 0xFFFFFFFL;
        final long n268 = n230 + (n266 >> 28);
        final long n269 = n266 & 0xFFFFFFFL;
        final long n270 = n232 + (n268 >> 28);
        final long n271 = n268 & 0xFFFFFFFL;
        final long n272 = n234 + (n270 >> 28);
        final long n273 = n270 & 0xFFFFFFFL;
        final long n274 = n236 + (n272 >> 28);
        final long n275 = n272 & 0xFFFFFFFL;
        final byte[] array2 = new byte[57];
        Codec.encode56(n247 | n249 << 28, array2, 0);
        Codec.encode56(n251 | n253 << 28, array2, 7);
        Codec.encode56(n255 | n257 << 28, array2, 14);
        Codec.encode56(n259 | n261 << 28, array2, 21);
        Codec.encode56(n263 | n265 << 28, array2, 28);
        Codec.encode56(n267 | n269 << 28, array2, 35);
        Codec.encode56(n271 | n273 << 28, array2, 42);
        Codec.encode56(n275 | n274 << 28, array2, 49);
        return array2;
    }
    
    static boolean reduceBasisVar(final int[] array, final int[] array2, final int[] array3) {
        int[] array4 = new int[28];
        System.arraycopy(Scalar448.LSq, 0, array4, 0, 28);
        int[] array5 = new int[28];
        Nat448.square(array, array5);
        final int[] array6 = array5;
        final int n = 0;
        ++array6[n];
        final int[] array7 = new int[28];
        Nat448.mul(Scalar448.L, array, array7);
        final int[] array8 = new int[28];
        int[] array9 = new int[8];
        System.arraycopy(Scalar448.L, 0, array9, 0, 8);
        int[] array10 = new int[8];
        int[] array11 = new int[8];
        System.arraycopy(array, 0, array11, 0, 8);
        int[] array12 = new int[8];
        array12[0] = 1;
        int n2 = 1788;
        int n3 = 27;
        int i = ScalarUtil.getBitLengthPositive(n3, array5);
        while (i > 447) {
            if (--n2 < 0) {
                return false;
            }
            final int n4 = ScalarUtil.getBitLength(n3, array7) - i;
            final int n5 = n4 & ~(n4 >> 31);
            if (array7[n3] < 0) {
                ScalarUtil.addShifted_NP(n3, n5, array4, array5, array7, array8);
                ScalarUtil.addShifted_UV(7, n5, array9, array10, array11, array12);
            }
            else {
                ScalarUtil.subShifted_NP(n3, n5, array4, array5, array7, array8);
                ScalarUtil.subShifted_UV(7, n5, array9, array10, array11, array12);
            }
            if (!ScalarUtil.lessThan(n3, array4, array5)) {
                continue;
            }
            final int[] array13 = array9;
            array9 = array11;
            array11 = array13;
            final int[] array14 = array10;
            array10 = array12;
            array12 = array14;
            final int[] array15 = array4;
            array4 = array5;
            array5 = array15;
            n3 = i >>> 5;
            i = ScalarUtil.getBitLengthPositive(n3, array5);
        }
        System.arraycopy(array11, 0, array2, 0, 8);
        System.arraycopy(array12, 0, array3, 0, 8);
        return true;
    }
    
    static void toSignedDigits(final int n, final int[] array, final int[] array2) {
        array2[14] = (1 << n - 448) + Nat.cadd(14, ~array[0] & 0x1, array, Scalar448.L, array2);
        Nat.shiftDownBit(15, array2, 0);
    }
    
    static {
        L = new int[] { -1420278541, 595116690, -1916432555, 560775794, -1361693040, -1001465015, 2093622249, -1, -1, -1, -1, -1, -1, 1073741823 };
        LSq = new int[] { 463601321, -1045562440, 1239460018, -1189350089, -412821483, 1160071467, -1564970643, 1256291574, -1170454588, -240530412, 2118977290, -1845154869, -1618855054, -1019204973, 1437344377, -1849925303, 1189267370, 280387897, -680846520, -500732508, -1100672524, -1, -1, -1, -1, -1, -1, 268435455 };
    }
}
