1001110101011100010011001101001011000110110110101111001111100110010001001100011110000111001001101110010101010110101000101110001000001110010111110101100100101111101011001000001101001000011111000101001101110010000000100100110011110101010110111110101000100010000111100101100110011111111100011100111111001011111101111100011101010110011111111110000111110101000001000011000010011101111110010110111111000110 1010010011101001001111010110011101000110011001100100100010001001000111001110111010110111110101001101000011000001111111111001010001001101011100000010001100101100000001100011000011110100100010101010100011100000010100001111011110110001001101110110111100110011010000101000101111011111000011011011011001111001010100111100101111001101011110011111010100100001110100110100111010110001000011111110001100100001 1010101111111011110101110110001110000001000001101010010110011010111100111000000100000001100101111011011100111101000101010110111111101011101110111000100101010000001001100001011100100101111000101110110100000100011110011001111000000110011111101100000001011001110100011000111011001100110001111010100000001000110101111100101000001101001101011011000000000001001101001010010010110000010101001100111100110010 0111001010101010000001100101011011100000111001010000001000111001101111010101111011000000101010101001011001010101100011011011100101010111101110110011100011000101011001010100001100001110010011000101111111001011111110011111101101101100111100010001001100100000101100001011011110000001110111110110000001111110111111001111001110001100110100010011111111000011111010000001011110001000110011000110010001001110 0011011100100010111011100101000100111111011000110101000110001111010101110100111011001110011110001100111111101100011000000001001100001100101100010011101101111100101100011010000001101000100100100101001101010001001001011110111110011100110011000001101001111111110111111110011010100011100011010010001011110011110011100000101111001010010110111011011001100111000010101101110111110101001010010001110111110010 0011000011001101010011110010000001000101001111101001101010010000111110000100011011011001001010110001100111001001011001101010111011110001101100000011010111000110110000011110000010111000111110000010011101010001101110101010001010010001110001010110001100011111100000010010011110010110100011000111000011001101001100101010001111101010010000001111010110100101111101100000111001100110011101011000101011111011 1010110001001001001100101000100101100001011110111000010100100100110101001001100010000101001001100100001001001010111000010100000011010011000001001010010010011010100111001011000101011011001001110110111100001111101000111000111101110100100010100110101011001100111111110011010001001011000101001111100110010001111000011011111100001010011111011110011000010100010111100110110101101001011110010000111100000010 0001000111000001001101101100101000110110101000010100011101100000000111010111010000110101011100000101111111101111011111110010100100101000000100101111100111101000001111001011110010010000100110010110001100110001111101111101000011011110100001111011010101000011110110010011101100011100000111011111011110101011000010101110111101111110100111101101110111100100110011101101011110100100011001010011101110101101 1100010001010110001011100111000001010001011010100001111010010110111101100101010001000100110010011101010111110110111000011011000111011101101010001010001111100011000101111110011000111010001010010001011100000100100110110111000000111100011100010001100101110111110100111110000101001101001010101110111010011001010011110110110100111101101110101101001000110100101000001100101110101100110001110100110110011101 0110000100000011101000101000111101010000001010101011000100100110111110001010010110100011000000111100101010100011011011010001010111000101100101000110000010111101000101010100101001000100001100001011110010110100001111110101100001111010001111010011100110001001100000001110011111001000001110100010110100100110011010000111100110011000001011010010111101001000111010001100000101001010000111001111100010011110 0110100001011101101001101110011110110011110011100101001111100101010010100100101010111101101110011110110100111111000001010100111111010001100101010000110111100110111101000100100110111100011000100101111000110000001110010010100001010100011100001000011000111101000111111100110000110101100000111101000101011000001011110011001100010110110111111001000111010110011011010101000000011001010010111110100010010010 0110010011001111010101010111111100111100011101100001010110111111000000110010111101111000000010100110000011101010111001101101101110111111101010111011010011111000100010101111000110110110010011011001010101000010100111001100110110000100110011011000101110111010111101000101101010010001101101011111111001001111110110110011111000110100111001001000000011011110000001111000010110011111111011111011110001111001 1110000101011000110100011010011011111001111110100011101010011001010000000110101000100001000010111011101100101011011001001100100111100001101111101010010100110110111010010111010100011111100001100000011001001010000000101110101100011001110110101011110011101000110100101011010001000010100111110000111001000101000101101100100011110100000000101011111110000001101000001101110001110011101101000001101110010101 1000010000100100111011100001000011000100111001111100000110011001111111100000110010010010111011100100111010001111011000010101000101111000010101010010000111010010100110000110101111100010101000011010111010010011101111001001101001111001000000010001000101110101000001101001111110011001100010100010100101101000110001110100010101100000101111011111101000000011000101000111000101011000101011001110010111001010 0010111101010110101110111110101011111001011110101010100010001011101000100100010111010111001001011010100001101011001111101110111100110101101110101101001011100100001011111111110010101111001111001010000100110101111110011101011101000001011001000011110111001101111001000110010110101110110010000001111110110000000000100011000010011100011111101001011001011000010000011010000011110000010101100110010100100100 0101101111011111001101101000010000100100011110001010110011011010000110101110111000111000110111101101001001000101111111101010011111111011000100000001110010001101011101101000110011001110111010101001000100101110011110111101001010001000011010111001000011110010100011101010100000010000101010011011101101010010010000011001100001010000100111011100101100010010100110001011100011111000001111111111101001111010 1100100011101100011010100011100000111110100000001011111001000001011001100100011001110001101101001110110110100000111110011100110111110101100100011110111000111100000010110111000100010000011101011000001110001110101001011010010001000001100110101000111011110010000001000101101000001110111111000110011011001110100001111001010001101111011101010001111110000111001001011110110010100110010111001100110110110011 1101110001110011111101110010000000011010101100100001110111000110110100100000110100100000110111011110101110110101011010100001011001101110011110011010110100110101100010100110001110100000100000101111001010100001100001001000101110100101111001111011000010100110101011000011111110110111001011011001110111011101100101100011011111010100101110100101101111101111000011111100000111001011000011011111011010000010 0000111111111010011110010001000100110010011110001010110111110001100110101100000010111100001110011010111110100001000000000010010010011001111010000010001011010101111010010110110011001011001110010010001110100100111000000010100101011000111100101000001111011011001010100101101110101101001011101100010100000111111000100100011000001001011001111011111000100101000001110100101101111110101111101101000111110110 1101100001111011001000000010100010100101100000000111000111010100110001001001110100101100001111011011110001101010111111000111010111011001111000000010101110110000000000100100010110101110001010111100011001000110101000000001100101111101110001111111001100110110100010110101100011010010110101100101101110010011001111110110010011001110000011001000110100110011011011101111100001010001100100000000011111101100 1110111011100111111011101010101100110000100001110011010011000011010100010001010000101000100101011011010110110001110101011011100001111011110111010001110011001101000000010111000000100111100010000100110001001011000011101100000011001000011110010010111110011110010110110000110001011001100010001000111010100100101110111011011100100010010110010111100000000010011110000001001110101011100110110000111100011110 0001111110110000100100111000001010010001010010010000010000100011001001011000001001000001001010111101011110101001011000010001101011101101011110001011100001110101010000000000110111010101110010101110110000101101010111101000000111001010011011100100001110010010011001100000000101001010100101110110001010110100000000100111110001100101111000110001010100101010110110110000001111100001000110010011010100011010 1111101010011011110011101010001011000011100110100010011110010101010001011001001000011010010000111010100010010110000001111111001011010100000011101100100110000011111011110011101010101000100001100010001110101011000110000011101100110011000011010111111000000111100011010001010110010010001010101101000010111010010000000101001010000110100100110100111101000001110101111000011000101111000001001000111011001111 0100010110110010111110001000101001011010100110110111101000010001001101000100001100101010100101010100100101101111100001010000111001101000000000111101011000111011100101111101010110100111011110100111010011001101110100110000010010111011001101000001001010010011000011100111000101000100100000001001001110010011111100000100000000110001100100110010111101100111100010111011001100001000001110000000100011101001 1110000101011100010011010001111101111111000111011001110001010111110001100101011000110101111001001011001010110101011110010001100110101000101001100111110011110100000010000101011100100011110000000010010001001100010110100001000101000111101100110100110010011100100101001100110100101011001011000110111001111100010011111001010000100110010011100000100000100100110010111110001101000110111100001100110101010111 1100000101110100000011001111000010011110111111111110101010111110110110001000011001110001101010100000000111111111000101010001001100101100001001111011111101000010001110000000101001000001000011010010001110011001101100110100011000100100110011100000001110000001010010000100011101110101000010101010111101100101110000100101110101000101010101010101000101101000101011110101011001001000110010011010110010011011 1101101100000000111010001100000010101110000011110101001011100011000001011100010011000111101100010000110110011010111000001111001111101100010001111110110110010011010001110110110111010100110110000110110010100000100100111111001100010011000011111000010011000101000010010110100101101110000100110110111100100100110011011011111101111011111101010111001010111001011011110111010100101011110111001011001100111110 1111010001101111010101101011011100111010001111110011010111000111100101101110101011011101010110011001001001111111101101101011111000101000011011111111011100001000101000110111000111000000100011111001011010011000101011011000000000101111000111001110110001101110010001111100001111100010000011001110001101011000101011111000000001100110000100101010100011110000010100010001100011001101010000000000110101111001 1110100010110001001000100011010110101001101110100011011100010101010110010010001010010001110010110010000111000011010111000000101110011100110000100111110110101111000010011101011000011001001000111011010001110110100001101010000111000011011110100000001111101111000100000000000000110110100000111101011001010000111101101000001111100000110111111011010111111100111100110000110111010010101010100100011110011011 1010110100111001001001100001000101101001000110011010110110011010111001110100111000000010101010011001010111100011000010100111100000101011101101011010000001011110111111110010101111100010010011110001100110110111100101101111101100110101001100001001000010010010010110001010101101011110101000011000010110010110001000110111100011000011000011011000001010110111001001001101100100111101001111100000001011110100 0101011111010110011101101110111111111010010011101101001101010000100001000100111100001001100010110110011100000101010111101011101100000011111110100110000000101011001011001110001110111001110001101001100000011010010010101110010001111000110111100110010011110010100011010111110111111110010010110001100100100101000110110111100100010101101100011110000110010011000111100010000010010001000010001011110000000010 1010101101001111011101010111101110100001010010101011011111001101001110011001101100010100110011000110001000101000110101011000110001001110011011110011010101011110100000000100101100110111101001100100101001000000011011110010000101111011111011101100111110100111110000100010011010000000001110000100000100100110101001000010000111110101000111000110100000100000010110011110010111001110001000011101001110011000 0010111100010100000011101011001100101000101101011101111001101100111011000111111110000111101010001111001101000111010011010000000000101110110110101101011101010101110011001111101000110100111100110011110000110110111111101011101010010011110101111100010001111001110001010011111101001001001011101101101101110011111000011110010010011100001001001011001100100011111110100010001100110010001110110011010011010110 0000100011011001001010011100011110010100011010100000101001100100111100000101111010101001010111110010100110001110110011110001011011111000000000111010011001011011101011010011110010010111110010011111110000110111101111001000110111010110011101100111101010000110101101100011010101001100001100110011000100011101011001101011001111101001110011000101100001001111100110101010100101100010111111100011000010110011 1100001100000111110110000100110101100000001100110101111111010100010100110010000111000110011001101010100010010100111101011111100100101100001101110000011000110011110011101100111000100010001011010101001100111100001100110010001011111010011001001010000000110010010000101010101100010001001110001111011001111001100101101000010000001111110001111000111101100000110110001111001000110101000001010010111111110011 1010100000111000101111100010010101011000011000010110110010111101100011101010111101000101011000010101001001001000011111101010111000100100101011110000001100110011011101010011001101001001111000001000110110111001000001010010100100011110000000111000011100101110101011011100101011101010000110110101111100110110110000010011010111010010000101011100011000110110100001101110001111100111010110011100100101000101 0011001001111111100111001110001001011011110000111001110011100000010101011101111111001000001001001100101111111110000011010010100110101000001101001011100110001010100010101101101111101011101010011100001101101010111110010010011110110111000111000000101000010010010000101111011111001111010101110101010010011001111110001110111111000000101100000001000000110101101010001011100001001101101001111111101111100101 0111101101010100110010001000011111110110001111110010100111100011010000010111101011001110010010100000111111110111110101010101010100001101001000101010101000100101111101001011011000111001101100011011001000011101011111011000010000111001101110010100000100000001101101000110011110000010100101101000111000111001100100111101110100111000110001101011100011111111001000000011000011100101100110101110101010110011 1101101100100101001011000101101001011001100001111011010011101010110011000010011111101001111101111111010100010010111110000101001101111111100111000011001111101111100010011110010101000000110110101111011111110000000001001101011101011110110111101011010000110011010000101011110101101001010001111100101100101100110011011000110010000111100111010100001101011100100110100111000110001100000101001010111111000000 1101000111100110101111101110001100110110001000011000100101001100111101100100010011000111000101100010010101100111100010110100000100100110000010001110101001001111110001111010010010001110100111101110101110010011000100111011010011011110000011001101010001101001110111111101111010000010111010110101011111100011001011110000000011000000110000011001100100010010100101011000001011011011010000111011110001011010 1110101111101001100100101111110010110100011101101100010001100010000000100000111000101000011000010010100111111010010110100111101010010001100011110100101101101111001101111110011000100101110101110011101000111110001100110101010011010001111001001101111011001001001100110111010110011110001011011001001100100000110110001101011011110010111011111111001100100000101000011110001101111001100110010111000110111110 0101111100010101011111000010101001001101001001010010011111111011011000001100011101000010010110011001101110100001001000101010001010010101000101110010111000001000000011011010011001000100100001001010100011000110100111111101001000000001101010011110100101011100000100111000101010110111010101010100110101000010110011100100110011111010001001101000000110100001101001010010101111001100100011111000001010011001 1101111110111000101000111100110101001101110000100010110011110010111110001100110011000101000100101011000010001001011001110001000010100101000010011101101101010001010011101001010110111111110110100011101111000010110101111010010011000111100111111101100000111100110100101000001101110000011010011111001010111011111011111110110001011011101000100100001100001001001011101011000001111111110110110100111001100001 1010000111111110101000011110111000010101101100010111100000111010100010111111100000100000001110000111101100011001011111000101101001101110010101110000001010110000001101000011011000100011011110111011111101011111010110011010010000011001110000000001000111001010101100100001111001100111111111101101110110100100101001100110011101110011011101000100110000001101011010010011101110111101001011111000110011111100 1001110000110111100010101011011100101111010101100010010101010011111111111010000100100100110000010011110110111101000100011010111111110011001111110101101000010111111110100010101010000101011100110001111001011000111011110100110011010010010100110011010000011011001010110100001000101100111110111100000111010100011000110101110101011000111101110111011100010001101101001000000011101101100111101000110001010110 0001010011110101010100111100101110110111110001010011010000101100101010001000111001100100110101001010101011101000110101110010001101110100110110110110010111011001101011111101111101011111011111010010010011100101010011010000000101010001000011010110010001110000110000011110100110001000010100010101100011000011110110000110010011111100100100100110101011111010000001100100010010010011010101111100000010110110 1001011010100111101110000101001010011111110101010001011001010000011111001110011101111100111101011110101010000001010011001111010011000001001100110000001010110011100001111101011111100110110100111110110011101100100110111110110010010010001000000000011001110001111110010101010110101111000000100011110011011011001110101001110101101101001001111011100110110111100011101101100101001100001110101100100101001000 1100000001101100000001010111111011110010010101001000101110111111011010110111001110110111010101101000000111101110100110010101001010101100111010000011001001101011110110111111111101001001011010000100000100101110000011010111011100001010110101100101000111000111111100011011011111001110100011101001000101110000101100010011000100010010101001101000101101001110010110100110111110110111100111101101000110001101 0001011100000110001100100010000010001001111101011100111100110100001101111001110000100010001010110100111010100001000101011101101001001110111010110000001010111111100000111000001010101101000010111010010001100101101001100100111000110001110100111101111001001010110101001001000010110011010100010010111110011011010000110101000001001111101001110011011010000001111000000010110111011101010001110001100100111001 0111100101100011110111110110111100011011010111101001011001011111011010000111111110101011001100000001110010110001010000001010110111001110011001110000001010011011101111010111011100101110000010011001011011101100000011100010010110101010001011011010101111101101010001000110111100011001111001010100001110001001010000101000111110011000111010101110100110011010010110110111000001000010001000111011110001101100 0101111111111101100110011110111111101001011110001101101111011000010010100001001111001011100100011001100000101110111101000011000111111011000001010011110011101010100100101000010111111111011110000110101010001011111010001110101010010111111100100101110100001110011101011000011110001011010010001111100001111010011101000000100101000011000011101101101001101101110100000000110010001011110001001100111110010000 1100001111110001001011011010000111110100100111101010010110101100000100000101111010111111110110111011110101100100110100110101110011001101100001010010011111001000110001000001000011111010010111001001100100110001000010001110010100001000100101011101110111100110101110101100101001100011001110001101010101000101101010100010011111001111110110111101101001000001011100010011100000010111000110111010010010011100 1100110100101001101110111101110100100000010101101011110101110001010010100011000000011010111111010010011010110000010010100010101101000000010001111101010010011110100000010000000111001111001001000010111101000111111100001010001100010101011000000100000001000100110011101111111111111001000101001000001000010111101100010000101111111110101101000000110100011000110101101110100110100000110001010101101111101111 1011010001101100001111011011000101001110110101011110111000110010111100001000000100110000101011001000100110101101010110000000000101100101100101001111110110000111001000001111110000110110110010111010011000001001011010101010011000000011110010111110001010000110101101011100101100100001000011100011011110111100110110000011101110100110000001001001100110001101110000010010100100000111001101000101010100011101 0001100000101100101000010111000101110001011110011010110101101101100010010100100110001111101011101110011010110100111110111011001100011010111000010001100111111001110111110100100110101111011010001000010010110100110110011010010000111001000100100100001001010001100011110001010011110011000111110110110000111011011110010110100010010110011010110110110101000110011000101100100110110111110110001000011110010010 0011101100000100111000010101101100111100010011110000101110111010111001000111011100011110011001011000110100001001001001111110000000011001010100110001100100111010001000000100111010101010100011100101111101110111000101100011110011100111100110011111111101100000011001001101101010100010110100111001000100110010011001011100000010010010110001010110011111001010011001011110101111111100001011010000111011000001 0011101000011000111110001010000101110111000001110010011100101111110101011110010001101100011011011111111010001110111001111111001011010111111011100100011011110110011100110001110111100011100110111111001010101000010110000010010000000111001011101010011001110010101011111110101101011010011001101101001111100001111011010001010100000101111100110000100111010001011000111010011100010001100110011000101101000101 1111110001111000011101011011001100111001001001001001111111010011011110000111000110110101011011101010010110010100111011011000110010000010000000111101001110110001101111011101101000010011110100000000011000011000110011111011111111111010111100110001111010001010111011000011001001011101000000110101011111001101111010010111011111000111110101110110001110110001100101001101110000110010101011000001011000111110 1010011111110010101100111110001000101100010001111100100000100001011101110011001111000011000000101010011101011100001001010111000010101011101111101111011001111101001000011101010101001000001010111000101101000000001110001010001011011000110010011100010000000111000010110111100001101100100010000010011010101001111011110101000000101011101001100011011001011010100100000000010100000001110000011001100011000001 1001000001111010000010011101011010010010110110010000110110110010111110111010111000011100000110110011000010000110001011101111100110111011011011100000001001100110100101001001110001100001100000000011000001111000001000111011000011101100110110101111101000011100101101110011001111111101001000011111010101101010110101101110000101111100001100111000111010110100111101110111110100000010010011001100101010001101 0101011011011011100011110001111010000001000010000011110101100101000110100111100010110000000111110010101110100001010111001100010011110110110101010110101011010111100111010000010111011001100100111111010010000011000001101100011001011101101111100011110111001000011100111001011101100000100000001011111101001100100010101111011100101101101111100011001110010110010110100100111100000011100110101011000110100101 1100000101001111101110000001011010011110000110010100011111101010101011001000010011100101110010011110010010110001000000101110101110101111110010101001000000011001010000110011110001111111101110101101111000011100101010101001000001111001000010010101011011110101100001010000010011111010110100001010000110000101000000000111111000011010011100101100000000011101100110100111001101011001110101000011011001010100 1111110111001111011100111111111100110000110110101011010110000110101010000011101011110111100001101000011110101101000001000011001100010100110101000011110011101100011010110101100111110100010100010001010011001100100010010011000101001101111110001011111000110101111101100100100111110101101111100100010001100111111110001000011111001100011001010010111100010110110010001011111011000101101011110101100101001011 0101001000000001000001101011000001100000011111111000000100010010100000101101100001000001101011111110001101010100001110001101011111101001011001001011001010001010100000100011110100000010111000100000111000110011001011001001110101001000010000001000011000101100110000101100011011001001110101011000011011100101000010100101010100111011011101101101111011111001001010101101111010011000010101111001011111001000 1011101001011011000011011100011110111010001010011011001110111101101110100001100110000100111010001010110001111100001110000111011100011111011010110000001100001011000001001101101110000100110011011010110101111000101000011110011011001001110101010000001100110010011001011011000101011010001111011100101110110100101101011001001100110011001000011101100001000011010000100001100110101111101101010000010010101000 1111001100001111111110100000010111011101000001010100101110000100011000010100101010000111001100101111011010011000011111000111110100111101111001001111100110011001001001111101001110110111100011100111101011110101010010000011100100011001100001000010101110011011100001011110111101111110101110111001011111110000011000000111001000011000000110101111111001110000110011100000001100000001110011110001111001101111 0101111011010100100011101100100011001111110100001111111110111110011100100000001101001000100010011001100101110111010011001010111110010000011110101001000111111101100001110101011010001000110000101001010100010110010001110001101011011000010111100001100001101011001110110111101010111100111110111100111001101100001100010110101001111001110000111101101101111011000011011000000000011101011010001111111011000101 1111010000011101011010110001001110101011111010111001110111101011001110111001101110101011111001110011101011011011111001100111011000110010011000001100101101101110010100111011001001101100000010100011010110111101011101100000110010011101111101001010101010001101001100111001010100010111001000001110111100001101111011011100101101000011111001111001010010111100110001011010000111011101000111100101101010011100 0010100100110111110100011111100000100000011101000111101010110101000111001000100001010100111100100111001001111010101010000010100010000101010000100010110110110110011001011011100111000000110110110101010010011011000011001000010110001011101011000001000110110111111010111011111110000010111000011011100010001101001100111001000111000000111000100110111110000101100100110001011000111110110111000101000010110010 0101011000000101001010000100011101001001011110110010111001111101011011001010001001001011000111101101100011110101000110100100011011111000110000111101011110001100101000111001111110110100010001110010100001101111010000000011000110100100010100100000111110011011100000000000101111101010011110110100110100011000100110001011101010110011011011101100011100011010110001001110001010001101001011110111110001111100 0011011100101111111101100010100001111100111100110100111000000101010101100100101011101111011110100100011100000011101000111011110101101110000001101000011100001000100110111000111010011001010000110111001101001110001001000101001101010001011101000011101000010011111000101101001100011111101010001111101101110111010111010011110010001111101011111110011001010101101111110000110101001101001111000011000010001100 0111100111111001001100000000110000000100100001101001010111011001000111000110010000100101111010000100001100110001111110111111110111011100100011011101011011111011110111001111011010100000011100111110001111100101000100100110010110110011011110101001101110000010000100100111001011011000000111110001010000001111010001110111011100011010100111010000000110001111010010000001011100111111000100101011101010010100 1001110100010001110010010110001111100001111111000010001011001010100101101101111100000100101111100010011111100011101000101001001010011001111110111100111010100011111110111100011101000010000100101000111110000101101010000100001000010000001100101000010101001100000011110010011100001111110111011110110100001010111010111111011001110111111000111100110010000100001001110000110011111101010101000011110110100000 1001110100011010010110101100110101101001011100001111110011011101101001010001100001000111100000010111011100010110010110100110010000111000100110011010010110001101110011110000101110010010111001110101110110101110010000000111000100100000010100010001000001011000010110000110111110011101010001101111010111010110101001100110001111011011010110111100010110110001101001001100101010011110001011110101010001010000 1000111100010110111000111001101100100100101001000101100101000000011111010100101100101001001110100010010000000101000111010110101110111111101111111100100001010111110001000000001011100101100000011110001001001000101110111000111110100110010101010000110100011101101110000010000100010110011001000011100111001000101010100000100010110011010110010010011011000001000010000000011000101010110001101111001100001011 1111011101111101011010110101010011010111110100100111011101000101100010001000001110000101010110010010101100101011001110010100001011000011110011100110000001010111000110011011101110110111010101100010011101001111110111011111010010110000011001101000010101010000111000111100100111100111011011110111110011011110000011010110000000001100001111001000110110001000101100000111000100111011010101010110010001011011 1110000000000101110110011100001000100001111000101111010000110100011000000011000001001000110111111100100001001111000010100001001010010010111110100001110011100101100011111011111000011011101000111111010111101011111000010111000110011111000110110001111101001000000110010010000000010001010001111001010011001011010101011110110110010101100111001011001001110001010101010010100011111011110101001001101101111111 0100011000110111000110011001111111101101100011010001001111010101011011110011101110010001010010011011100010011001111110110000101011000101101100001010101010111110110100101100100000011010011000100110010001010011010111101101001000000100111000010001101100100101101111111111011100011011000110111011001011010101101100101000110000100010110011101011001011101100110010000011100001011011111111101100100100010100 0111100101010001110101111110000101101000001011010100110011100010110101000100111101011111001101010100111111100100100011010110100101010001010111100001100110010101000010001000011010011000101001001010100011110111101001110010010101011100000011011000000100001010011101011000001100000000111001100101111010100010111010000011000010100101011110010011010000000110111101111011100010011111010010001101111011010101 1110000101000101011111111100010110001001011110110000100110000010101001011110111110110111001010000010111111111001011100101101011100111010010010010000000110111101010011100110111010101011001111000111011010011101100101110101001101111101111101101110010110101101001100011001010011100100000110001010010001000000111110111010111001100011001101001000101010000001111001001000010001111100001000110010001000011010 0000010110111100100011111101011100000011100001101101001101010101100001010000000001001000000010001110011110101100110101011101100101011000100110101000110111111101011010110101110110110110010000111001010101101000101010001111010010001111011011011111100110000101110000011001110001101111100101110011010011010110110101111011010011010110110100010010010111011100111101100001001010111010001001100011100101111011 0110111101111010001011101000110010100001010110010000111100100101110100000101110011010001111000001001111110010111011111110011111001101000000001111001110100001010011000110011101100101010111011011100011110100010011101100101101011010001000010010100001010001011000010110011001110100000101001100100101010001101111010100000110101011010010010000111010001100100001000001100110111001101100101010101110011000001 1011011111101110011110100001000011000110010011010001101110110110110010110100100110100100000010011010001010111101010010100010011000001100001011000100101000010001111001101011001000001111000100101000111101111111011000100011001110010110000101000011100001110110000010101101111011010101001111011010110101011001111111101101100100101000010110000100001000111011000111011010000010000010000010000111110011110000 0111100111110110100111010010100010011101001101101111101011111100011111000100011100100010100110100001111001001000111011111000111111010000101000111110010100110011010011010011101101110010111011111100101110011011110011110111111111101000110011111100011010011101101101110111111001110010001101000101111101001100111100000001100010001111011101011001110101101001110000110110000101011110000011010111010000100111 0011011001100000000011001111011111011000000100001111011010000111100101100010010001011011100101001010100001100101011011001110010000110001011011001010010110100010111111110000010011001111111011101100101101011000001000001000111101100111001000110010111100001000000111110101110010000111111001110001101101110100100100011000100110011010011101001101110000100101101010000000010000100110101010001111000001010110 1001101001001101011100101110111001000011101001111100100101010100111010110101101010111100000011111111000000000011111000101011100001000010100011101101010100010001110100111011000110001011111110100100100100101111001001101110011101001101001100101011010111001001010111001001010011110111101110110101001000001011000101011001011001100000011001111100111001011010110110111000001000010110001100010001001010001001 1001110010100000110001100111110111100011001000111100000000001010010011010010110000011111101101100010111010111100001110101010010011001001010010011100101000011011011101000110111101001001010111011001000111010010010001010011110110011100101101011100011011001001001110111111000110111100100100000001111101011010100101111001101100111101001011000111101010100011010100111101011100011010001101010010010011010011 1111010010110110111111111010101001111000111110111101000110101000010110100010011100010110101111000101100011110011100001111100111100101100001100111000100110100010011010001110011111111010010000110000010111000001011100011101000111011001100011101100000100101110000001101010111101010111110111001001101110111000110010101000011100001110111100001111101111111111101000111010000010011011110010111100101010000100 0101000111111101011110001110011110000010000010000111110010111111100100011110100100001001110010110000100111110110010111011100011101100000011000001011111110101100000111101111010001010110001110000011100111111100001001110001100000101001101001011111000010111100001010011111010100111100100001100000010011111001100001001001110011001101010111001110100011011010101001011100101001010110100111110111101011111100 0100010010100000101110011010101100010011110100101101011110111101011001110001000100011111100010111111010011011001010010011001101000010000010101101110100101010000110001010111011010000100111000000111100000011110110001110001001000001000010011011101111101011001000010000101000000010100000001111000111111111101011011000010101010111110101111101011101111001000000111000011011001110111111011101011100011011111 1101001000110101000011000000101110111101010011101010011000101000000110110011110110011101100110010111111001011111001000001111111011000101100000111110101101111011100101000010111010110011110011111010001000101100110101101101000111111101100010100111100100011100000111100100001100110111110101001110111101011110111100011101000111011110111000110000110011110110100001110110001001010100001000001111001110101100 0010110011110111000111011101111100000011011100110001001111110001100101000110011110010001011111011110100101111100011111100100000010010111101010011100000110111011000110111101001100100010001010011110011010110000110010100101010101011100110000011100110100110101110001011111010111010011101010000100000100100111011001000011000010011110001111101110001101010001000100111110101111010000001111100100001110001100 0110011001101001101100010000100111001011001100111110110101011101010001001010110111001001111001101011000101011100001111111011001010011110110100001000110101100000011011101010010111110010101110000010000101101010101110000100111010010110001110110111001100100111100101110111001100100101111111101110010110110010000010111111111111000100011001000110100000010111011001000110000001001000100111111010111100111100 0000001011001100011001010101110011100010100101010000010111101100010010110110001011011010100010101100101111010111000101100101011010101110101110100000100010011011101001010100111001000001001000010110100001110101101010111001011100110101010011111110100011101001110100111010110111001000001110010111100011111011111010101101011010000100010010110001100010001010011010010101100001100101001011100001001011110100 1110100010110000001111100100011011110101000000111000100010011000100100110100000010111100111110000001000111011011101110001110101100011111010100100000010000010111101011101101010101110111110110111011101000101000010100111001100101001001100110110100000001111111011010001101001111010111110111101010001010101011010101100111111101101101010100110001000001000101010010111010100011001101010010110101101110110101 1101001000100011011000010000001100101100100001010100110011001100111101011010111001000110011010101101001001110101011010101111000010000110111101110100010100111011010010111100111011100101010000101000001000110010100010101110101101100110101011000001110011010010111101110100011001111011001110101010011010000000100101110000000111111000101010000000101101101101100011111110000000011010110010101100101010110101 0110001100101010111110111101011110001000111111100000011111010011100110010000100011001011010100101111010110000011010110011011010100110000101100010111011101110100101110000001101001001111001010101001001101111100101001100101001111110100101110000100110100110111001000000101110100101100101010011001010010101101101011011110011000001010011110111010001110110111010110101111010100010000110000010111110101111101 1101011001111010100101011011000010111110101001111010001100001100000110101000010111000000000100011110100110011000110011011001111111000100110111100001100100001100001110010010111011101001010010110001001110011011111011110111110110100110000000111110001110110000010100000101001010110000010110011000101111001100100111011100111111000000100011001100001001100011010010100011000110101010010110001101000000001011 1111110110001110001111000110101011100000100001110000100110010101000101011110100110000000000010100110001011010101000000001110110110110101001111000111111100101111100100011010101100010000110001100010110100010011100001111011001000111010111011010001010110000110100110110110100111011110011000101110001001010100000011010000010111010100111100011011100001100000100110111010001001011111110110000000101110000000 0111001110111110000001110101110011000110001111101101100010010001100011001010001101010100011111110000000111010100010101011111111110001011011011001001011110001011011001000110011111001101111000001110110101101101111100101100101001001111100010111100101000110110101111101101011010101001000111101101100111100001011010100110010001011001011111100101000101001101000001110000101111101011000110100001111101100111
FXプログラミング

【FIX API】cTraderでFIX APIを使ってみる【サンプルコード】

4/16/2021 6/29/2021

5年以上前の記事です。内容が古くなっている可能性があります。

FIX APIってなんぞや

FIXプロトコルとFIX API

FIXはFinancial Information eXchangeの略で、電子的な金融取引に使われるプロトコルです。もとは株式取引に使われていたようですが、いまや為替取引でも事実上標準のプロトコルと言われています。

もともと銀行間など大口取引で使われていたプロトコルなので個人トレーダーにとってはあまりなじみがありませんでしたが、最近では個人でもこのFIXプロトコルで取引ができるFIX APIを提供してる証券会社も出てきているのです。

国内でもOANDA、デューカスコピー、サクソバンクなどの大手証券会社でも提供されており、だんだんと身近に・・・とか書きながら調べてたんですが、以前提供してたはずのYJFXはなくなってますし、サクソバンクは使用のハードルが高そうですし、OANDAも一応あるものの現在はREST API推しみたい・・・身近どころか、前より遠ざかってる気すらしてきました。

・・・ま、まぁとにかくあまりメジャーじゃないにしても、個人でもインターバンクで使われてるのと同じプロトコルで気軽に電子取引できる時代になってきたというのはすごいですよね、うん。(グダグダ)

 

いろんなFIX API

FIX APIとか呼んでると、「そうか!『FIX API』っての使ってトレードソフトを作ればFIX対応サーバー相手ならどこでも取引できるソフトができるんだな!」と思ってしまうかもしれませんが、少し違います

というのも一口にFIX APIと言っても各社少しずつ仕様が異なるのです。例えばOANDAであればOANDA FIXなんて名前で、OANDAサーバーとやりとりするためのFIX APIになっており、そのための仕様説明書があったりします。(参考:OANDA FIX 仕様書

FIXプロトコルに準拠している以上、大枠の決まりごとは同じなのですが、そこに定められてても、「うちはこれは対応してない」とか「プロトコルにない機能使えるように拡張する」とかなんやかんやあって少しずつ違ってくるわけです。

もちろん大枠は同じなのでうまく作ればいろんなFIX対応サーバーで取引可能なソフトを作ることは可能でしょうが、基本的にはFIX APIでトレードソフトを作るならどこのFIX API基準で作るかは意識したほうがいいと思います。

 

FIX APIのいいところ

FIX 自体は単なるプロトコルなので、プログラム言語の縛りなくトレードソフトの開発が可能です。

たとえばシステムトレードをやりたい場合、メジャーなやり方ですと、MQLでEA作ってMT4/5で動かすか、C#でcBot作ってcTraderで動かすか・・・などと、プラットフォームと言語の縛りはどうしても避けられません。

しかし、FIX APIであればプログラム言語は自由ですし、プラットフォームにも縛られることはありません。自分の得意な言語で好きにチャレンジできるというのはメリットかもしれません。

まぁ、実際はFIX APIのみでシステムトレードというのは現実的ではないですし、FIX APIの使い方学ぶくらいなら MQLかC#を勉強したほうが早いような気はしますけど・・・

しかし世界標準のプロトコルで市場に注文を出せるというところに魅力を感じる方もいるのではないでしょうか。ここではそんな人のために簡単にFIX APIの使い方を説明したいと思います。

 

なお、ajinoriもわかってない部分も多いため、変なとこあったらツッコミお願いいたします。

 

 

FIX APIの基本的な仕組み

決まった形式のメッセージをやり取りする

仕組み自体は特に複雑なものでもなく、こんなメッセージをバイト配列でサーバーとやり取りするだけです。(下記で | で表してる区切り文字は実際にはSOH文字が使われます。)

8=FIX.4.4 | 9=133 | 35=A | 49=fixserver.10101010 | 56=CSERVER | 57=TRADE | 50=TRADE | 34=1 | 52=20210416-02:21:25 | 98=0 | 108=30 | 553=10101010 | 554=password | 10=008 | 

これだけだともはや暗号にしか見えないと思いますが、ちゃんと決められた形式通りに情報が並んでます。ざっくり説明するとこんな感じ。画像が見づらくてゴメンナサイ。

headerにはメッセージの基本情報が入ってます。メッセージの種類(メッセージタイプ)や送り主送り先、時間など。headerの構造はメッセージタイプによらず基本同じです。

bodyには情報本体が入っており、メッセージタイプ(headerの35タグ)によって構造が変わります。Trailerはチェックサムが入るだけ。なんかIPパケットみたいな感じですよね。

それぞれ一つ一つの情報は |タグ番号=内容|という形で表されており、タグ番号を見ればそれが何を表しているかはわかるようになってます。

例としてheader各タグの意味は次の通り。

BeginString 必須 FIXプロトコルのバージョン
9 BodyLength 必須 メッセージの長さ
35 MsgType 必須 メッセージの種類
49 SenderCompID 必須 送り主。ブローカーIDと口座番号を含みます。
56 TargetCompID 必須 送り先。メッセージを受け取るサーバーです。
57 TargetSubID 必須 送り先追加情報
50 SenderSubID   送り主追加情報
34 MsgSeqNum 必須 メッセージの番号
52 SendingTime 必須 送信時間。日時は上記の形式で記載します。

35タグの示すメッセージの種類は以下のようなものがあります。

Heartbeat セッション維持のための信号
A Logon ログオン
5 Logout ログアウト
2 Resend メッセージ再送要求。
V MarketDataRequest 価格など市場情報要求。
W MarketDataSnapshot/FullReflesh Vの返信。全部入り。
X MarketDataIncrementalRefresh Vの返信。差分のみ。
D New Order Single 注文。

ちなみにこれはほんの一部です。メッセージの種類は全部で100種類近く、タグの種類は1000種類近くあります。詳しく知りたい方はこちらの公式ページをご覧ください。

もちろんちょっと使ってみるだけなら全部覚える必要などありませんし、私もさっぱりわかってません。

 

プログラムでメッセージを作ってサーバーに送り付ける

実際の使い方はというと、上記のメッセージをプログラム内で生成したら、普通にSSL通信でも使ってサーバーに送り付けるだけです。

ここでいうFIXプロトコルはアプリケーションレイヤーのプロトコルなので、メッセージさえアプリケーション内で作ってしまえば、あとは既存の通信方法で普通に送ればいいのです。

利用の流れとしては、

1.最初にログオンメッセージを送る→ログオンの返信を受けてセッション確立

2.定期的にHeartbeatメッセージを送ってセッションを維持しながら、価格取得なり注文なりやりたいことする

3.終わったらログアウトメッセージを送って終了

メッセージ作るときの注意点としては、ヘッダーにいれる34番タグのメッセージ番号は必ず連番でふるようにします。

番号飛ばしてメッセージ送るとサーバーからResendメッセージが返ってきて、間の番号のメッセージ送るよう要求されてしまいます。

 

返信のメッセージタイプも決まってる

メッセージを送ると、サーバーからも上記の形のメッセージが返信でやって来ます。送ったメッセージの種類に応じて、どんな返信が来るかも決まっています。

例えばクライアント(こちら側)からサーバーにログオンメッセージ(“35=A”)を送ったら、サーバーからはログオン成功ならログオンメッセージ(“35=A”)が返ってきますし、失敗ならログアウトメッセージ(“35=5”)が返ってくる、といった形です。

受け取った返信内容を読み取って成否判定をしたり、処理をしたりすればいいのです。

 

 

cTraderでFIX API

やっとここまできました。本題です。cTraderでFIX API使ってみようぜ!的な話です。

 

cTrader FIX API

実はcTraderアカウントをお持ちであればだれでもFIX APIを使うことができます。FIX APIを使って、cTrader口座で取引をすることができるのです。

この場合はcTrader 用のFIX APIを使ってcTraderサーバーとやりとりする形になりますので、ブローカーごとに仕様が異なるということはありません。参考までにcTrader FIX APIの仕様書はこちらです。

 

cTrader FIX APIでできること

現在の価格や板情報などの市場情報をとったり、各種注文出したり、ポジション確認したりということができます。逆に言うとそれくらいしかできません

口座情報を取得したり、過去の価格情報を参照したりといったことは一切できません。もともとFIX API自体がそんなに多機能ではないんですよね。

なのでFIX APIを使ってシステムトレードをする場合は別のAPIを組み合わせて使うことが多いようです。cTraderだとOpenAPI2.0というのが用意されてます。

 

 

cTrader FIX APIを使ってみよう

クライアントソフトを用意する

さて、せっかくですからFIX APIで注文でもしてみましょうか。

FIX APIで特定シンボルの価格を取得して、ボタン押したら最低単位で注文するだけのテスト用cBotを用意しました。ソースコード付きです。

ダウンロード後、ダブルクリックでcTraderにインストールしてください。

ちなみにAccessRight.FullAccessが必要なため、起動時に警告が出ます。不安であれば実行は控えてください。興味があればソースコード読んで理解してから実行すればいいと思います。

なお、cTraderの開発元SpotWare社が公開してるFIX-API-Sampleを参考に作りました。こちらはWindows Form のアプリケーションです。ちゃんと学びたいならこちらのソースコードの方が勉強にはなるかもしれません。

 

接続情報を確認する

まずcTraderの場合、設定メニューの一番下にFIX APIという項目があるので、ここを開いてください。

接続のためのパスワードが必要になるため、ChangePasswordを押して適当なパスワードを設定してください。

 

接続情報を設定する

それぞれの項目をcBotの同名パラメータにコピペしてください。PriceConnectionとTradeConnectionはどっちでもいいです。一番下のSenderSubID以外は同じ値だと思います。(違う方いたらコメントください。cBot修正しないと動きません。)

 

起動してみる

正しくパラメータが設定されていればcBotを起動すると、チャート真ん中下部分にBidとAskの価格情報とSellBuyのボタンが現れます。(価格情報がcTraderと微妙に一致しないのが謎なのですが・・・何かプログラム間違ってるのかも。誰か理由わかる方いたら教えてください。)

ボタンを押すと最低発注単位で注文が入ります。本当にポジション持ってしまうのでライブ口座の接続情報を使う場合はご注意ください。cBot動かしてるのがデモ口座だろうが、バックテスト環境だろうが関係ありません。接続情報がライブ口座ならその口座に本当に注文が入ります。

cTraderからポジション情報を見るとチャネルの部分に”FIX”と表示されているのがわかると思います。

また、(価格取得以外の)FIXメッセージを送信受信ともにログに表示させるようにしてあります。トレードウォッチのcBotタブでどんなメッセージが飛んでるか確認してみてください。

 

ソースコードいじって遊んでみる

たぶんここまで読んでくれてる方は少なからずプログラムにかかわっている方だと思います。是非ソースコードいじってみていろいろ試してみてください。コメント多めに入れてあるので見ればなんとなくわかる部分も多いはずです。

今回はUI作るのが面倒だったのでcBotの形にしましたが、cBotである必要はまったくありません。プログラムのFIX通信部分はcBotを起動させたcTraderからは完全に独立してます。

例えばAxioryのcTraderで起動させていても、パラメータさえTradeView口座の情報で設定すればTradeView口座に注文できます。Indicatorに組み込めばIndicatorから発注させるなんてこともできちゃいます。

FIX通信クラスにcAlgoの機能は一切使ってませんので、コード中のFixApiBaseクラスとサブクラス丸ごと自作アプリに移植すれば自作アプリからでも発注が可能です。

あ、一般的な例外処理とかエラー処理とかもろもろ省いちゃってるので、もし実際使えるレベルまで改造してみたいならその辺も追加してくださいね。

 

あくまで勉強用として

いないと思いますが、本格的にFIX APIで開発を始めたいという方はこれをベースにするのはお勧めしません。

FIX APIでトレードソフトを作るのであれば、おそらくQuickFIXなどのライブラリを使って開発をする方が一般的だと思います。

あくまでFIX APIの勉強用プログラムとしてご利用ください。

 

 

疲れた

「ちょっとやってみようかな」のノリで始めたわりには、思った以上に手間をかけてしまいました。

今回はじめてFIX APIを使ったプログラムを作ってみたのですが、作ってみた感想としては・・・あえてこれ使わなくてもcAlgoでいいかなぁ、と。

「いやいや、お前はFIXが全然わかってない!」とか「FIX APIはこんなにすごいんだぞ!」とかありましたらコメントお待ちしています。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori