1000110011100100111000111001100011001000111110100011011110001010011111001010110110000010110110101000110100111000010101010101110100111111011111011001011110011101011110100111010101010101101101000001000000101100111101011010001111101010101011011010110001001110011000011010101011100001111111110010011010100001001000100110010100011101111110110111000100101101100100111010000100101100001011001010001010101101 1100000100011010010110001110001000101010100010001001001010101111001110011001000111100011110111010111000101011011101100110110100111100011100000000100000101101101100101100011110111011010010101001001000100001000011011000011001101101100011101001101110010011011111001010111011101000100010001011011110101100001001101000111001100101111010011001110000000001001100110100100100010101000011111001000010101101001 1011111011000001101100011000110101000100010100110111010000100000001011111101101000001011110001011100111001111000000100101111110101101001001001100100000010010010001011001010110101000001011101100001011110110001000101011101001101111000101111100001000100110011000011000101111100010011011011110010111001110001111100101010001110001101110010001011111000101110110001001011111011000111110110100110010011010100 0011001111111010101001000100000001111001101101011100100001110010001001110011010111000110010010000010101010010001100000000111101111001001101101101011011100010110010110001001011100001011111111011110110010010101110011101111000001110111111111001100001110000111111101111110111010010001110001110001010000000110101001101011010010001000011000001000000110101100000000001111100100001111011010001111101111101011 1010101001111100001110001001100011100101100000010000101011101110001000001101100010010011101010001101101100011011111001011110010110001000111100110111010000001011100110100000100100001101000111111101101000100011110100111111100000101001100011100111000111100111001001000000100111111010100101010000100110111010000111101010111100100111100000001110111011101001100111000111101011101100110101110011010010001010 0111011110000101000111100111000101100111110010101000100000110100110111000010101110010000010111001010110110000010111101111000011010101011111111100110011011000101001100011011101110111110110101000001111101110111011101000110100111001111011001110001010001110010110011111010110101110000111000101001111000000010001010110000011010100010111000001101010011100010010000000010011111000010001101110100101000101001 0111000100001010111010000100110001001010111000110010101011010110000011001011000001011100011101110001101111000110111011010111010010011101010011011100011010101101110110000001011001100111100000010000001111000101000000011000100100101001101011110011011100101111011001100101111011000101000011101001111101100101011110010001110000110011111011000001100101101101010101001011110110011110011101111101111111011001 0100011001111010100010101001001000001011011001001000011000000011100001010100101100001101101001000100000001010110001101101000001100000001010011111000010011000110101110000101110100110011111110111010111111110001000000010111101010001001100010100001101001010111111010110111000001100100111011110000100001010010010000010110010101111010100111110110001110111001110000111001111010111000010100001100001111100000 0100111101111111110100010000001011000010010100111010100110100011001110100011001110100001010001101001110111110110111111000111001010111000001001001110011111000011000100101101101000100101011001011010110011000111100001100011111010000100011000110111000100011001100101110111110111001111010000000101101110010100111110010110101101111111011000010000011001111001010011100001011011100111000110011001000011100010 1110110110010101011011001111100100000100100010011000101101100100001010111100100011000110001101001001010010110101110011001100110010011000011011000101011100110111010100100111111100101110101010000110001110011001000100001101010000110011000011110111111110000011111000100110110100101010110010100100111110101111011000000011000100110001011011110000100000110010001100101100110010010001110110010010001010111000 1000111100101000011100000100011111010100100010010110100000011011010101111001101001001011001111110110001000101000111100001010011000000100001000011000000101110101001110111111001111010010000010000100101111000000010011111011010011100100110100011100010101100100000001100111010001011100101110101110111001000100111101000101100110010100000111001111000100101101001110101011101111100010011111010011001111100111 0010001111011111001001011100111111000010010011110010010101110011111001111000010110101010100111010100100011111110111001011000011000001111110101100111000111000001110011100101110000111100110110011100001110101010010001010101000101111010010100001000011010011110000000010110111101001001100010001111101001010100110001001001101110110011011001101111101011010111000110000010101110101111100000110101011110010110 0011100001110000101000110110011110001000100100000101110011001110001101000001111010101011000010000101110100001011000000010000010111010100000010111110000000111010100001100100100011011001111101001000101010110110111011110000100001100001100111001111000000101000110101001100010010011110100001011111101111011001011010010101111111100101000110101101101011000100101011101010111100001011010110111001001101100010 1010001011111001110011110011101111010101011111011000111001111111010111111011011010000001011010110100000011000111110000011010010000010111000110110000001000011000000011101101101111010011100111010011010100110001100000001001001111111110011000010011100010111110000110110111010001110011010101001101011000111011001110110011001111011111010101101001111111111001101000110100111001110110100111011101010101011011 0001101110001100110011101110111101000011001000111101001110011001110011000100011011110010011110000011111111000101100101100110000111101101100001000010110100111011101111010001011110010000001100100001000001000000100111000111101110101111100001100011001001100101110001011001011110011011110111000101001001100110010011101000000011101011100001111111010111001011101000111111111100000111100000011111101010000011 1101011110011100010100100111111110000000101000011111001101111110001000001001110000000001101011110101110000110010001010001111010000001011111110101001011111111110101111010000000100111011100100111001110111000010100000000111100000010110010110010110101000101011110110011111111011001000011100000110000000001001101000011111110010101010011110000001011111100111010010100000010110101110010001011010111100001100 1000101110001011000001011001000010011101100101100010101110110010001100101011111011000100010010101101111100101000010001000010000110100110110011110110001000000100001011010001101110000010100111001101001001100111010100010000011101101001001011110110111011100111001100111000011100100011000100101001011111011001111110111000100011011101100010111101001100111000011000000010011101111000110100001111010111101010 0001100001010100111110000011001000000111111000111011100010000000101010100111011001111011001101010010010010111001111010111100001100010110001001100000000011000101000000000111101100011100001100100111100010111011000000100111100010100001010011100011100110010000110001000001111100111101110001110010110010110111000110101011110000101111101000010010010011101000010001111011110001000001010101101010001101100010 1100011001001100101111010110101101000100011110010010101100011001000010111011010001011111011000111000000100111101111011110001000001110011101010000100111000100010011100011000001011001000101110010111110110111001000111000100001100010010001001110001111010101001001100010110100000010011111101101101010100001001101011110011111100100001011011001111110101100110011111100010111010001010001110100001111011001011 1010110110101100010001011111010110001110000000101000110001000011110101000010001010101010000011001101000010001100111101000010001100001110010000011011001000101110111000001100110110111101111011110100000101001010100110100100001000101101100111011011010001010010010010111011000111010100001011010110100010111001101110001011001010000100001010111000101111110011110101001011010101000101001000100011000101000101 1101111000011101110010011011110100000000110000110100100011001000100111001100100111011001000100100100110001111111100100010000010001010111011100100110101010110001111000100000101000000010001101101011010100101011001110110111101111100001110000001110000100111110110100001110100000111111011110001100111111111011001000100001011011010000100000010100110111100100110101100000100111000010011011001101011100011100 1100000111011101100001100000000100001110001000101000000110110001111000111100011100111101010101011001111011000011100110100010100001101001011101100100001001001001111001111101001000100010011100001110001001001101001010100111010100011001010011111110011111011011111101011111011100100000100100110111011111000101110011111001001101101000110001001010000001100110001001101100110100001101101010100110010101010010 1001000010101000111111111101111010000110101000101010100011011111110000100010000001001111110000001101101000111110010111010000011101010011011010100110001100100011010111101001100010110110010100111100111010111011100110100011011111000000001110100100100101011010111010100110101110100010011010111001100010101101010011011111111110011011010101110000000111101010111110110011111111000010110111101101010001100101 1100111111010100010011011001110100010101010110010011000001001100001001111011010100010000100111001010001110100110100000111101101101110101000101100110111000001011111011111100011011000011111101000100111010011001100101100101001010100110110110110011100101001111010110100001111100110100101110101000000000111011110110111101101001110100111110010011100110000010000100001011100011010100000110111111101010000101 0101010000101001011101110100111000000111111011000101111100000100110000010011111111010100110110000101000101101010001011011011100001010011010010001001000001110101101000110001111011010010110101111010001001111100000001100101010001000111100011000001001100100101011011100100111000100100010000010101100010000111101011100010011001100000010000010111000101101110011001111111010001111001110000001101000011000100 0010011011101011010111110011000101010111010110001001100100000101011000011100111011101011001101111000101110111011100111000011011100111010111110000001011001101010000111101010010110011100011111010111100000011000001111010010111100010010000100001001011011011101000110111010011010110100110110100110111101110100101011110111111010000011111100001111010011001100000011000100100100110110001000011001010001000000 1110101001010110000011110001101110011111110110010100010111110011011000110010100101111001000110100001001111101101011110110001111001001101101011010100101011010110101111010010101010001000101111101001001111011010001110010000111101010011110101000010001110100000010100101100101101101100001110111000111100010110101011100100110010110001000110000110000001101011100101110001000111001011111000100001011011110110 0001000101010100011010010010010000101011110011001010110000011010010110010010100010111101001101100101000000010001000111111110000011000010000100101100000010011000011101001000010001101001011101000110101101001000011001111000010000001100111111111100101101101100110011100100110011101101010101101001000001110010010110100011010011011111010001110010011100111010010001001110101001001011110110010010100111110101 1000000001110010000000011111101010110011111010100011010011110111000011011000010110101111011111010110111111010110110001111101010110110110011101011001100110001111101010011110001011100010110101010011110000111111100000100110011110010010000011010101111101101010001011110010110011111100010101110101111101100011011100010100110001010101011011010011101111110100000011101111010110010010000110011101001010000111 0001101101011000000101111100001100110100000110111000001001111101100011101110100110011010111111010010001110101010110000100011100010101000111100100100001111001110101010101000100100100110011110101001000111000010110111101100010011010010000011101010111101101011101101001001001110010010111000010110001000001110101000010100111101101110111101111101010110111101010000100100001000010010110101010000001011000110 1010100001100111001100110001000010110011101100000111010110000000111101010000011111110100001101011111011001000101110100001110101001111111110001011100001001110011101011001110110111100011111110101001000001011110111001000011001110111011101110101001011010011110110011100111101110111011001100010011100111101110111111000110010000101101110101101001101110100101001110000101001010110001011111111111110011110000 1000011010001110100000111001101000101101011111101011000010000100110000010011001001010101010100000101111101101100011000011010001010111011000000000001100000011100111100010101111111111011000111000011001010000110011111100001110011100001010101111101011011010011110100000000100100101110001111001011100111101011101101101110001001101110001001001111001011000000011001101111001001110111101101000101000100001110 1000001010111110000110000100100101010100110001001101110100010101100110100111010010110101110001101100111010001001000100011001010011011010110010111011001111110111001101010110001001001100101011111100111111001000000011010101101101000101000000010001111110011000111111111110000110001010000001000000110010100000101111000100100101001111101101101011011101000111001010100100001101101000100111010100110000111111 0101000111011011000000001111100111011001011111010110111011111000110000110001100101100111011001111000101111000101000100110000000111001011111010110001000111111001000011000010011111110101010100000000000001100010110100000001110111001011110110011011001011110001101100100010001001101100110101110011010111111010010011011100010000100001100000011101001010110011101100000100001010110111000010011111100001001110 1011111110110110010110111110101010110101101011011010001010110100111100011100100110011001010110000011000000001001101000111110000001111100110110100011111111111111001110010101001100110101110011010101101101110101110010110110010000110101001111001101100011001100100000000110011111100010010000000000110100000000011011101010111010001110000001111001000001111010110000011101100001111110101110011101000001101011 0100101110111110100100001011111101111000011011110000100011010110111010011010111110001110110001111011011111101000000100101110000100011101100101100000001011000010100110010101111111110101001011101111111000110111000100010111011010110001011001100100100101101000111100011110101101000111111001111000011001000000011111001110100011011111100111101010111011011101000001110000001001101010111011001011010001111010 0010110101000101110001101011011000001011100101000011011111001011000001010101100110110110000100110011011100001000001001011001010010100111101101111100101001111001001010111001011110011100000101100111011010111111100110011011110111000010101110100001110001101001111010011100100010111111001100011001100101000000001101101111101101010000011000001000011100100010110010011001111101110011110111011110000111011011 1011010011000001000111100110010110100011100100111010111100000000100011010010110000101110101101000110101000011110100010000110100110101111000111110101100100011000100000111010101001101010011111000010111100111110000011010100111110101001111010001000000111000111011001100100110011101001100010110111001111001101010010111001011010111100111010111101010100111011100001110111101100011000010110010011011110110010 0010010001000000110100111111101101111001010101100010001110100001100010101110010010111110010011001011111001011111110111000010111101010101100011100000111100010110011000000000010000111111111000001000111101101000111110011001000101111101111010011110001101010110000100110100110101101110010110010111110010011001001100110000100111001011101111010111010101101010011010101101110111011011010110000111000101010000 0101001110101010100110010011000111111100101100100111101101101001000010011010000010110100000000101010101111011110001000110011011011101011000100100101100011001000011110101010101011111101111011101001111110001100010000111000001111010100111111000110001000101000010001000001101100011011100100001111000000111001111101010110011101010000101001010110011011010101101100010000111111001000010101000111111110010010 1110011000110101101100001000111000111100000001100000011101110001010100001101100001011011100011101100010100001000110010001010111110010110001000100011101101001011001011111110010101011101101000101001110111000101000110110000110001000001110110100001100000110000001101010100011001101001100010011010110011110001000011111001111101001110100110000110010100011100101001110000011011010100111111001110010110101100 0010010101000010110011011011110100000001101001011000100111100100101100010111100011001001100101100100000111100010111010110101101010100101001111111110000111100000011011000011001110010100100100100011110011011100110000010011101010001111101001010101001001011100110101111101110111110000110000111010110001101110000010101001010000111011111000111111100011101100110111101111001001111100101011001110010111110110 1111011011111001111011100111111011011011110010010010010110101011101010001000010010000011010110011001000101110011111001100100111011000011110111110001111011110000101010011100111000000001100001100011100011001110100100001100110100111110110010000110100110011011100001111010000010010010111011101000101011011101110011011111000000010001001111100101111010111110111000111011110110100010110100111110011011101110 0100000000011111010010111000000111010011101110010001110110100100010000100001100101110110011110111010010010000011011101111000000000100000011010111111110101001110011101111000101001000100011111101010100010100110010100100101100110100100000000101010001000101100011011101100100110101110010100110100101101110101001001101100010100110110110011010110010101011111110101011110000001100110110111001110001000011111 0110111110110100010110100000100110110101110111010110000001010010001101101100100101001111110010101000110010011101100001101101011110010101000011010110100000011100000111111000011000101011101111000001100010111100001000101011000110000101010111110100101100111101010110100010100100111000110000101101000100001101011001010111010000011100110000010110100010110010111100011010000100001011001111001001011111101101 1100110110100110000100110011001111101110111101101010111010011000000000110000111010111101010011001000101110001011010011111110011001100100001110000110110000001000101110000111010000110001000110111001111010000110110101011010110010000111011100010110100100110011101001111101101110111101010110111110010101000000000100010110101001000101000100001001000011111001010111100010001011000111111101111101110011110000 1111001100101001010010101110110110000110111111110110000010100110001110100110111001100111100010000101010100000100111011100111001100110111011111101001100101101101101111010101011010101010100011011100111011100100110010111001000110010110001011001101011101111001111101001010111001111001001010101111110110010000010010100111100001011011110000001010100110101100000111111110111101101001011000110001111100111001 1101010010011000110100101011101000011110000000010011111011010011000101001001101101011011011111111011101000011011011010101111111110000100000100000010011111011000110001101000010000010000011000100000001101101011100011011001110111001100011101100000110101010010010000001101111101100100001101111000000101010000010101100001101010001000101111101110010101010100001000101010101111110010011010100001010010011000 1010100011110010001111001100000001000111011100010001110111011101010011101111101010000001100111110101000001001111111010010111001010110110111101000110010101101011110001011100110000101111110001100100101100001101000000000011111111010000100001100010110100010101000100101101100111111110000010111000111110100000100011011000111111000100100101000001011011111001111010101110001100101001101101000000110110010011 1010101001000100101101000111010100101100100110111010110010110011001001100110110100001010111000010110110010111100010100010001100001010010001101000011101000101010100001101011010001011001100011001010101011111100011110010110010011101101000011011001000110110101101000010100100000100000110110001110000101011011001101100001111000110110011101000101001100111101101111111110111000010010111101101011011111011101 0110011101010101011101010011100110110001010010101111111111100000100001100100110001000110110011111000011011100001011010011011001000011100011111001000001001011001011101111000001101000001111001000000010101110100101000000001111001100101101100000000111111100100110010001010001111001000111001011001101001001111001110011100111011100010011111100011101111011000000101101111011010000010100010110101010000110100 0110001010000111001110110010100010010011001101100010100010011011001001011011111111101111010001110000110000011101010111110110000010101010110011100110101101111011011111001000000101000111111010110011011011001000010111010011010010000001011100101000110101010010000100110000101010101010100101110000011010000110100000010101110110111101111011100101101011100001010011101110111010100110111100000010010011110000 0000010010111010010000110011001010111011101011100011001001011101001101000101101110010010110110111100011011001000100011010010000100011011110001001100000001100001110011010001001110001110001000101110001011011111100110010100010011110110110010010111001000011010100101101000101111110011100011000110110010000111111010100100111010011010111001111110110111110111111100101000101010011100100101100010001010111000 1001010101100010110111110110100110101101001101100001100101111011111001000111111010111000111111000001011100100010111001011010000110011011000010110001100011110101000110011100111001100011111011111011000111111000101111000110111000011110101110100100110101011010100100010010011111001000110010100110010101100011000001110010010111000101110001010111111011001010111110011101110110101011100110001100101001001110 0101111001010100101000101111001010001110010010011111011011001101100011111101001001011100110101111110111100010100011100000001000111111111011100110010111001010000010110001111000110011110111100101010000111011111011111011011100110010001111001100110011001000001101011110000100000001100110110010111010101100001000001001110100111100101111001100111101101100101010010011010000010010000110101111111000010001111 0100111010010000010100100000101010100000011011111010101111111111010101111010101110110100100000010101100101000110111100111001000110111000000100100110100101100011001000100000101111001000000100101111011000000010010010011010000111111101001000100100110000000100000110111001100101001111000110000000110111110000010110110111000111110001001110111010010100111000100111110101110100111101101010110111101011000101 1101011000100001100010000011000101100001101110001000100001000101111101011001001111110001101011010111010010001001000100000011001100011111000111001111111100011101000100000011001100110001000011011101010011110000100111000110110101000001010001001100001000010100110110011111110110010011101110001110010100110100010001001111111100011011110100010000001010000010011001001011100010000010101011101000011011100100 1000000111101111001000001010011100001010011001011111111000011000010010101011111000111000100011110100001100011000010101011000100110101101010001001100110101100110011011000111000100100001011101001000001010001111011011110101001111000010000100011111100100111011000101100011101100110001010001011001111001100100011000000110111011110111000110100101000101100011111011010001101000110010111101110000001010101100 0110101010100100000101000000000000100000000010101101111110001001001001110101011101100000100101100110101110111000000001110001101101101010110000001000110110010110101010001100110111100001111001101110111011001111000110100101001101001011101111101100011101001010001100111100010111110000010010111100000010110011001011100110101010000100100011100101011011001110010001101011100011010001110010010011111000110000 1011111001010001111001110001010110111011000011110011010000010011111011000101011101101001010010100010000110010010110001001010000001001011101111111111000110101010011100000110111110100001001110110100111000010000010010101011111011011110010110000010111101001000010010001011111110111010111001010100010011100011000110000001010110100010011110100111000010100101001011101111001111101111110000101110100001001000 0010111111110001000100110110101000010010011001101110010110110101001011101000011111111000101100101011111001010111101111010100010101110111011001000100110001101110011010001100000011010001011100110011111011111110100110111100000011010000111110000010100001101011010101000111111000101100111010010110001010100011101101111010111110110000110011100000011001100010011111111100100000100100110000100100110000111000 1101011101101010110100110111111001100010100001000111101000111100001110100010101000011001000111011110001111011000001101101010101110001100010111111000001110000011100011110011110110100001001111000101000000000000000001000100101001111011011111100111001100100010111111100001011011001110010000100000111001010001000011000100111101101011100011010001010001011110111110001000001001110111010010101100110011111101 1001101001011101110000110110001010110100100100001100011000000010001110001110001011001110111110000101111101100110011111011100010000101111011000100011010110000100001110100111010001000101100100101000011110010000100111000110100001111001100010000010000001100100100111000000011100001000100011000110010000111000101101001000001011111000101011101001100100111000110011111011101000010110111101011010010110110010 0010011100000010100111010110111100000100001000110100110110110110010001000111101110010100000100000111011001000101000011010010000110011110001011010001011000110101100110111101001001100001000100000101011110100111010000101010100110001011010100111011111101110101010011110110001100100010001001101011011011101101010011000010010100001101011010011001000000011000101001011100111010111100010110011100001010110110 0001001001100011101110001101111111011001100011111010001010001101101010110011001101110101111000110111111001010100111101101101010010001011000111101001001110101111111001110110100111000110001111001110010011001011010001001101000001111100101010010100110110111110000101011100111100000011101100001010110011010000000100011010000111101011000111010000101001011101010011011100111110100111100010010111111000111111 0110111111001010100011111000011011100101100001111000011001110011101111111111001010101111111100001101101010111011011000010110100001110001100110101010110101001101100101111010011000111000000101101110000011010010000011100101100001110000011111101010011100101010100111111000100100000110111000111110110011000000010101000111111010100101110011101011101000001001001001001101110101111100100100100100000110100101 1000110010011011100100110100010000010011000010011111011000000100010010110100110000101100010010011001101011110101011110010101101111001000011011110010110010001101010000100110001010100000011011100011110110000100100100101111011011100101111111000011100010001111001111001011011000000101000110011100100111011001111110101001000011100110000000110010000110110001100001101101010010100101100100011111110111000001 1101000001001101110001100110001011011101000000011010000111000110000010001100000110111110010010001110101000000100001111011001100000000110010100111111000010010010001110101111100111010111101010011000000100111110111011110100110110100100001011111110100101101011111101100111010001011000111110101010100000001110010011010001000100001101111001011100011001000001110101000000110010010111011100000000011101100111 0010011111101111100010011110010001110110010010011010111000101100100110111101001011001000010100000101101101100110011110010111110010101110000001001000101011101100101000010011011011000110010000101111010101100000000101000111101101100010101100110110101001111100011010010000110000100110110000101010101111011000101110001110010101101111001011010100100001000110101101101111101101010001000111011000000100000001 1001001110000110100011101011110101011110000001011100101011101010000100110010101111100010001011001001111011010011010111010001110101100101111111000011000000011100110010110011010000110110100110100011100011100110111010001001101011011111000100010011111100011011001000001011001111100001111110011111100010011100110110110101000000111000101100111001010001010111011101111011000000000111110010111000100100010010 0111101101100010100010101011100001101100101110110110000001010000101001011111110001101011110111000000111110000100111100011010001001111000110100101101010001001100111001000001101000010111101010111001010100101000100110100010100000110000010111010011000011010001010001101001110010000001100101111011100100001011101100000110110110111111100110000101111110010101010110010110011111011010000000000100000011000011 1111100001101111110110000101000000001100000010110000110000111011011100100101101011110110011110001011101110000001111010100011011100011010100011100100100011110101011111000110111001010101011100001011000100010111100110101010100110101100010110000010111001101100011100100111000011111010011101011010101010001000100001100011001001011001101010110000100000101001100100110101100111001001000110001100010111001111 0000110000000001100010000101010001001110010010001011101101100000110010111010111000000010111110000100100000001100010100110010011000110111010111001001111110011000001100001001001100110111000110010000001101100110011111111111001110110000000010111101110100101001010110100000100010010111111110011100100000100001010010001101010000011001000000111111011001010111110110010111111101101101010001101101111010000100 0110111010011001110001100101011001101010111000011001100111111110110100110101001110011000000000000100111110110001110001000111011111100110110001000101011001011110000101011100110000001100001001000010000010011111010001101100000101100110000111100111100110010011101110010100101010010101011111111110010101001101101001001110001101111101001010001110101111100011110010101110000000111100010010000111111111100110 0111100010101010110101100010000011001111100111010100011111100001110101000101101011111000010111010111010111100010101111001111111001000111001110110010100111000101101001001101000101110111011000011001001000001001010100101010000010110010000111110100101010101110010011000100100011010101010111110001100100100110011101011100101111101000011011000110110111101110101101000100111111100111111101110100110101100100 0001010110100000010111100101111111111000111100001001000101000001010101100111110000010011011010010101101011001010011011111011000100011010100011001001101110100110010101101111010100010111010110110101101001100010001100111100110001000101101000011010011101100111000010110001001001110000010110101011000001011000001010010111001110100011110101110001001101011101011000011110111001110111001111001110101010001000 0001001010110011101100100011101111100111000011111011101010011111011010110001101011111000000011011000010101111011010011100001101000111011000100000110110101100000101110101111111110101010101111011101101101100011101111111000001011000101011000010101011000101010100000101001111101111011111001101011100001000110001101011011000010100110010001011010011111000100000110110011110100110101010000001111001110000101 0011010110000111110010010110111000000010110111101101111010110111100101111110000001100001010111001010001110001110101111010101011000000101101111010000101010000101011010101010111010000110110011101101101100111000111001111101101100000100101111010101010011110001000010101101010101011101111000001100100101010101010001100101000011010101000111110110101000011010000100001000111101101000001110010101010111101110 1110100101110010101001001111110101000000100001001001000111001110010110111101100100101110111101011100010000100001101010000111101100001111011100000011000100111100001000011111000100010110100110100101000101100001001001101001111000010010111001011101011100111001101111110110000101000110000100110001000101110000010001011011000000111110010111110100101000101010101110011101010010011001000001100011010011111101 1111000100110010111101000011101001101000110001111111000111011101010000010011010011111100010101100011000100010000101101010010100011111000001101000100000100000101110111110010000111101100010110110101001101101001110101111001101100001010110010100010101001111010000111000010010111111001001100010000000001111100000110010110110110100111110110100011100011011111011010010111110101011010011010000001010100010000 1001010000000101111111000010001000011110110101110111110010000011101111010010001000100100000000111001000011111110011000101001110001111001101010001010010000110001111110111010111011001001001011011101001110110001001110011110011011101011010011110001111010100011111101000011001001010110001100000100110100101100010001100110101101100001110010000111001001000011001111001011000000110110001011011000010110110000 1010010001010011001111010110001111110100101001111001000101000111011111110011010001100001111110011000110011111010110111011101110101111111101101000111110101111100011001101011100100111001001100000111111000010000011111000100101000100101001110011101010110100111101101111011110100010011110110100111111010011000101010111100000101111000111001111110011000101001111011111001101101100011101100010010001011011111 1111010000011011100110001000000110010011101011000001011010011001101100101111100010101100101001001011100010111101111111001111001000111000110100110110100111011110011110001100110011010111100100111101000000000011000110111110110010011000011000000000011101110110001100000110010101101010001011101101111001001100000110001110001011001011011110011111001111101011000001111101100001000111101010100010010011110011 1101001100110111000010001000010011011010000110110000110011001010001011111011101110110011111111101110101010011100111011101111100111100110011010010000101101010100011110010001111010000110011011001100110001101011011011111010001100101111001011010100001001110011010011011010000100001100000101001010101010100101100110010101011100001010111000010010110000101110100001111010111110100001101000001010100111011111 1001011000010111110101011100000001100001001001000011000111111000010000011111001101011011011101110111100110100100100000011011011000010000001100101010111001001001100010101010100000100101000001110110110010000010101111100100010010011111000111001011100010100111000011111001101101110011000101011101111101110101110011110110111110100111000110000010010001111101110010010110011101111010011100101000100000100100 1111010010111001000110101101100001000001110110110011101000110010001011111100110010101001101010111001101101010101111110101111001111111010001011101010100011101001000001000000000000001011000001010000011011100000110010100110011111111100010000000010001011000111100111100100010110001101001111001100101110000011101001001101110010000001011111001000100001000001111001010011000101000100001101110101000100101111 1001101010111111000110111111100101011010001110001100111111001111111101001110010111111100000100101011101101001101101101011101011010100111101101011100100100010101101010110110000000110010111100000100111111101101110010000110000001001101010000100001001011001010000001110001000001111100010001110100000010010001110011101101001101110100001100000000000111101110011011100101110011001100001111001011111110111011 1101010000101010101001101001111101000101010101010000100100110010101111010000110110111010011001000100111010101011001111011001100011100011101110110101010011000111000110101110100111101111001000010000010000110100001001101010101011110101000100101010111111001010001001001110010010110011111010000100000011100010000011011111100011001010101000001101110001010100011111000011100111010111011000100110011011100001 1000010011001100110100111011110011111100100010111101010000101010010011110111101111000111001111111101011101000100110111001001101001111010000100001001111000101110111110110001110100101111011101101101011110001001011011110100111010001101111110111101001001101011001010000011001101010010011101100010001001110110100110101000010011011110110101000011111001111011101010000100111110110001000010111000010011110100 0110100011111111100111001001100111110011000000110001101100111011011101011100100001010110001000001110010111100101111010101101010110011101001100001101110100100100001100010001000111111111100101111111010100101001101001010001110001111011101100000011010111110011011101100101000000010001110011111001001011101001001001110110110001111000111001010000010011010101010000100010011101010011011101111110111010101001 0100000010101001010111111010111110000100111010110100011111111100110000110111110100011010100110010011001111101011101101101110101100111010100000000110111100000000110001100100011001111011000110100001110001100100111010110111011100110000110100000101101100111000010111110000001101111000110001110010001010011000010011001000101111101111010111110110101010011010010110010000101100011100011011001100101000111001 1010101101011011111100001110110000010110000110010011110110011000000001100100010011000011110111100110001011011101000000000000100001001000110111111011000111010011000100010110010000011110011111011100111110011011111011001110010101100100101100011101001101110100000000110001001111010010110110110010100111010011111001010110110111011011011000011100101010001111100111100111011011101001111001101100100010110111 0010100011111010001001011001010101100110111010000001001001100010011110011001101110001001101100000000001001011111010000101101001000010000110111010110011001111111101010111101010000100011100101100101101001101010001110101100000001000010000100110110001110100000001110000111100101001010010011000000011100001101110110010001101100101011010000111000101001000111100001111101101001011111101111000110100011101101 1000100101100101111011111010001100011011100010111111110010011010010011001011111100010011100110111001010110000010100001011011001111111010000011001010110101010110110101000010101000100100001000100100000110011110110101011100101000100000000111000100010000011010010010100110111111110111000100010010010001101000111100011000110100010110111010111111011001010101101101101011111010010100000011011111111011100111 1000000100111010000101101010011011110100000100111000010001111011101011011011100111010001001101011010111101101010001000001011110111011100100110111100111111100111111010101111010010100111101100110001111010111100000011100111000011110111110110000001110011010001110011111000100100110101110110001001001010101111110000001001010011100100100110000001110010111001111110100111100111110011110011001010010011100010 0100100000011001001100011111001101111111000000000111010010101100100011010101110101110010000101100111111010011100000011000100011101010111110010011100110110100111001101100011010100110010101101101011000011110101010010000000110000101100000000010100000101100111000101001101110010001110000001100110100001110010010111000100111001100000110111010100011100000011000100010101100101101110110011110010001101101000 0000100010110101011010011000001001011110001010001000110000000100101001001111110001011101101110000010011010000101000110101010010100011010100011011100010100101110101101111101000011011000111100101101000001111000011100010010100001001000001100001111010111101001100011110100110110011000000101101001011001110111011101011011010111001001110011100101010101010000001101001111100000111010001000110000101111011111 0001000010100010101110111001010110100001110100001000111110010001011101000111000011101001001100010011100011100010000100000101010011101011010110110001011101010100001010011110110100101101010100010111101001110101110111101011100000001001100001100010110111000000001111110101011000010111111001110100010001001111000100101011100110000110011101000011000101011111001011000010101100001110100110010111100111011101 1011100101110000000111011100000011010001111111110111101011101000011010010011010001100110111001110110110100011100011000000001001010001110000100100110100110101100000000011101101001010001001110100111010111001100000010111010110011000000000111010000000000110110010011100100000001010101011000010111100010000011010011111011101101011010000100101110001110100010110101010000110011011110110001111101101111101001 0100100100000101001101110001110101110010110101001111011111001111010000000011011111000011001010001100101110001111111100011001100101010000000000011001101111110000001010111101010111111101101000101100001001100100101010100110000011100010001101110100110110011101011110011111010100110100000110000100001011001100110011001011101110101110111011000010000011110011101001001111011010101010101110110101011011000010
cTrader Algo

cBot開発のためのオブジェクト指向用語

11/5/2020 6/29/2021

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

とりあえず使えるようになろう

オブジェクト指向プログラミングでは自分でクラスを作ってそれらを組み合わせて目的のプログラムを作っていくのですが、cAlgoでは主要なクラス(オブジェクト)はすでに用意されてるので自分でクラスを作らずとも自動売買システムを作ることは可能です。

まずは「用意されてるオブジェクトを使えるようになる」ことを目的として学びましょう。

 

用語はある程度知ってた方がいい

EAプログラマーの方が、オブジェクト指向が敷居が高く感じる理由の一つとして、聞いたことないような用語が多いというところがあるのではないでしょうか。わからないこと調べようとしても、その先もわからない用語だらけで・・・となってしまってはせっかくのやる気も消え失せます。

ここではオブジェクト指向の話をする際に出くわしそうな用語について簡単に説明します。・・・まあ、こんなページ見るより先にチュートリアルでも実際にやってみた方が早いと思いますが。

なお、言語によって多少呼び名が変わったりすることはありますが、どれも概念は共通です。ここでの呼び名はMQLやC#で使われる呼び名を用います。

 

まずは復習

オブジェクト指向の話に入る前に、今までも触れたことがありそうな用語から復習していきましょう。

データの種類を表します。int は整数、doubleは小数(倍浮動小数点) stringは文字列など。MQLでもC#でも変数は必ず決まった型を持ちます。int型の変数にはint型のデータしか入れられません。例えばdouble型をint型に入れたいならキャストという型変換処理が必要です。

 

構造体

単純な型のデータをひとまとめにした「型」の一種です。MQL定義されてるのMqlDateTime構造体を例にとると

struct MqlDateTime{
    int year;             // 年
    int mon;               // 月
    int day;              // 日
    int hour;              // 時間
    int min;              // 分
    int sec;              // 秒
    int day_of_week;    // 週の何日目か
    int day_of_year;     // 年の何日目か
};

こんな感じでintがひとまとめにされてます。

自分で作ることも可能です。また、型の一種なのでintやdoubleと同じ感覚で宣言して使うことができます。

// 自分で作った構造体
struct HealthData {
   string name;
   int age;
   double height;
   double weight;
};

void OnStart(){
   // int等と同様に普通に宣言する
   HealthData dataA;
   
   //中のデータには.(ドット)でアクセス
   dataA.name = "Takeshi";
   dataA.age = 52;
   dataA.height = 168.3;
   dataA.weight = 60.5;
   // 使い方の例だけなので、このコード実行しても何も起きないよ
}

このコードはMQLもしくはC言語のコードですが、C#でも使い方は同じです。(作り方はこれじゃダメ。)

 

変数

データの入れ物です。MQLやC#では変数はすべてあらかじめ「型」つまりデータの種類を決めておく必要があります。MQLやC#では 「型名 変数名」のように宣言します。たとえばint i ;という記述があったら i はint(整数)型の変数、つまり「整数の入れ物」です。小数や文字列を入れることはできません。

C#のコードをみていると、var Name = “mybot”; のように、一見なんでもかんでもvarで宣言して、varという型不定の変数を作ってるように見えるかもしれませんが、これは中身から変数の型を自動的に決めてもらっているだけです。変数の型は一度決めたら変えられませんし、型不定の変数も作れません

 

関数

なんらかの機能を実現するいくつかの処理をまとめて簡単に呼び出せるようにしておいたものです。手続き型プログラミングは言ってしまえば作業としては「関数と計算処理を組み合わせて関数を作る→その関数と計算処理を組み合わせてさらに大きな関数を作る→…」の繰り返しです。

ただ決まった処理をしておしまい、ということもありますし、決まった型の変数を渡したら、なんか処理して結果として返してくれることもあります。

オブジェクト指向の話になると関数という言葉は聞くことが少なくなりますが、後にでてくるメソッドはつまりはオブジェクトの持つ関数です。

 

 

オブジェクト指向の用語

クラス

オブジェクト指向の肝です。構造体は「単純なデータをまとめたもの」でしたが、クラスは「データと振る舞い =機能(関数) をまとめたもの」です。構造体のすげーやつ。命が吹き込まれた構造体みたいな。(なんか詳しい人に怒られそうなのでそのうち別記事でちゃんと説明します)

using System;

namespace sample {
    class Program {
        // エントリーポイント
        static void Main(string[] args) {
            //手続き型的なやりかた
            HealthDataStruct structObject;
            structObject.name = "Takeshi";
            structObject.age = 52; 
            structObject.height = 168.3;
            structObject.weight = 60.5;
            double bmi = structObject.weight / (structObject.height / 100 * structObject.height / 100);
            Console.WriteLine($"{structObject.name}のBMIは{bmi:f1}です。");

            //オブジェクト指向的なやり方
            HealthDataClass classObject = new HealthDataClass("Takeshi", 52, 168.3, 60.5);
            Console.WriteLine($"{classObject.Name}のBMIは{classObject.GetBMI():f1}です。");

            Console.ReadKey();
        }
    }

    //=====================================
    // 構造体: ただのデータの集まり
    struct HealthDataStruct {
        public string name;
        public int age;
        public double height;
        public double weight;
    }

    //===================================
    // クラス: データと関数の集まり
    // BMI計算機能付き!
    class HealthDataClass {
        public string Name { get; private set; }
        public int Age { get; private set; }
        public double Height { get; private set; }
        public double Weight { get; private set; }
        public HealthDataClass(string name, int age, double height, double weight) {
            Name = name;
            Age = age;
            Height = height;
            Weight = weight;
        }
        public double GetBMI() {
            return Weight / (Height / 100 * Height / 100);
        }
    }
}

(ちょっと偏った思考ですがなんとなく構造体とクラスの違いのイメージを。cAlgoではなくC#コンソールアプリで書いてます。)

 

継承、ベースクラス、サブクラス、親クラス、子クラス

あるクラスをもとにして別のクラスを作成できます。C#だとこんな風に宣言します。

class Cat : Animal{ //書き方はclass 子クラス:親クラス
    // ・・・ここにクラスの中身を書く
}

Animalはすでにどっかに定義があるものとします。ここではAnimalクラスを継承したCatクラスを作成しました。CatはAnimalの子クラスとかサブクラスとか呼ばれます。逆に言うならAnimalはCatのベースクラス親クラスに当たります。

子クラスは親クラスのメンバをすべて持ちます。リファレンスを見ても目的のメソッドが見当たらない!ってときは親クラスまでたどって探してみてください。

 

オブジェクト

すべてのモノ。クラスや構造体が実体がオブジェクトと呼ばれることが多いです。なお、C#では変数の中身はすべてオブジェクトです。int型やdouble型もオブジェクトです。コードのどこかに「”mojiretsu”」があれば、これはstring型のオブジェクトですし、「7」 ならint型のオブジェクトと解釈さます。もちろんすべてのオブジェクトに型があります。

ちなみにインスタンスといったらクラスを実体化させたものを指します。ニュアンスの違いが伝わりにくいと思いますが、まぁとりあえずオブジェクトのことと思ってもらっといていいです。

型について

オブジェクト指向になると、大量のクラスを扱うことになるので「型」の種類が一気に増えます。子クラスは親クラスの性質をすべてもつため、親クラス型の変数には子クラスや孫クラスを入れることができます。子供が親のようにふるまえます。

しかし、そのままでは子クラス特有のメソッドは使えません。特有のメソッドにアクセスするにはやはりキャスト(型変換)が必要です。

 

プロパティ

プロパティは外から見えるオブジェクトの情報です。だいたいはオブジェクトが自分専用の変数として持ってます。とりあえずオブジェクトが持ってる変数のうち、外部に公開されてるものがプロパティと考えていいです。(厳密には違いますが、使うだけならこれでいいです。)

なお、このプロパティ内の情報自体ももちろんオブジェクトです。例えばcAlgoのChart型オブジェクトはBarsプロパティを持っていますが、Barsプロパティ自体がBars型のオブジェクトのため、Bars自身もBars型としてのプロパティを持っている、という形になります。

公開されてるといっても、「外部からは見ることだけが許されてるもの」と「外部から見るだけでなく、値を変えることも許されてるもの」の2種類があります。cAlgoでは圧倒的に「見ることだけが許されてる」方が多いです。当ブログのリファレンス記事では「値を変えることも許されてる」プロパティ名の後ろに {get; set;}と付記してます。

メソッド

メソッドはオブジェクトが持ってる関数 のことです。MQLでは標準関数としてどこからでも呼び出せたのに対し、cAlgo (C#) ではオブジェクト毎に自分専用の関数を持つため、関数(メソッド)の呼び出しは必ず持ち主のオブジェクトを通じて行います

なお、C#ではプロパティもメソッドもオブジェクト名に.(ドット)をつけてアクセスします。自分のメソッド内で自分のプロパティやメソッドを使うときは、直接プロパティ名、メソッド名を書けばアクセスできますが、thisという自分自身を表すキーワードを通じて呼び出すことも可能です。

 

メンバ

オブジェクトは自分専用の変数とプロパティ、メソッド(関数)を持ってます。MQLではどこからでも自由に変数や関数を使えたのに対して、オブジェクト指向ではオブジェクトを通じて、各クラス固有のプロパティや関数を使う、というのが大きな特徴です。

>これらオブジェクトの持つ変数、メソッド(関数)、プロパティなどを全部ひっくるめてオブジェクトのメンバといいます。C#ではオブジェクトの持つメンバ変数のことをフィールドと呼びます。

 

インターフェイス

インターフェイスは中身が空っぽのクラスです。プロパティやメソッドを持ってるのですが、中に変数は持たず、処理もからっぽです。そんなもん何に使うんだと思うかもしれません。

自動販売機の外側の箱だけみたいなのをイメージしてください。ジュースの種類を表示する窓もあるし、お金の投入口も、押しボタンもある、でも中にはジュースも機械もなにもない空っぽ状態なのでお金入れてもボタン押しても何も起きない。

この箱は何に使うか。もちろん中に機械とジュースを入れて使うんです。そしてこの箱を通じて自動販売機を操作してもらうんです。そりゃそーだ。

ここで重要なのは「箱の使い方さえわかってれば、中の機械のことなんてなにも知らなくてもジュースが買える」ということなんです。

ジュースを買うとき、中の機械がどう動いてるかなんて気にしないですよね、「ここにお金入れてボタン押せばジュースが出てくる」それさえ知ってれば十分です。

そして逆に言えば、それくらいのことしかできないので、間違った操作で中の機械を壊してしまったり変な設定にしてしまったりすることもないですよね。

インターフェイスとはそういうオブジェクトの操作パネル的な役割を持ったものです。

cAlgoAPIではほとんどがインターフェイスの型で提供されています。cBotを作りたい人は箱(インターフェイス)の使い方さえ知ってればいいのです。「中に入れる機械部分(オブジェクト)はcTrader側で準備するから気にすんな」ってことですね。

リファレンス記事上ではChartインターフェイスとかTradeResultクラスとかわざわざ種類を書いてますが、一切気にする必要はありません。クラスだろうとインターフェースだろうとcAlgo内で使うだけなら使い方は全く同じです。

インターフェイスもクラス同様、継承ができます。cAlgo APIでも様々な親子関係をもつインターフェイスが出てきます。子供は親のメンバをすべて持ってる、ということは覚えておいてください。

 

列挙型

ラベル代わりに使う型です。(これは別にオブジェクト指向の用語じゃないですが、説明の都合上こっちで。)

例えばPositionというクラスがあり、売りか買いかを表すTradeTypeというプロパティがあったとします。さて、この場合プロパティの型は何が適切でしょうか。int型にしておいて0なら売り、1なら買いとか決めておきましょうか。それでもいいのですが、なにかの間違いで2が入ってしまったらどうしましょう。-1が入ったら?こう考えるとめんどくさいですよね。じゃあどうするか。答えはTradeTypeを表すためだけに専用の型を作ってしまえばいいのです。こういうときに使うのが列挙型です。

実際にcAlgoではTradeType列挙型というのが定義されてます。TradeType型の変数(プロパティ)にはTradeType.BuyかTradeType.Sellのどちらかしか入りません。列挙型の変数(プロパティ)に入れられるのは列挙型名.~といった形だけになります。

MQLの列挙型と基本的に同じですが、cAlgoでは整数を列挙型に強制キャストみたいなことはしないで、列挙型は列挙型として使うことをお勧めします。

 

 

まずはやってみよう

読んでいただきありがとうございます。たぶん実際にチュートリアルも何もやる前に読んだ方はちんぷんかんぷんの内容も多かったのではないでしょうか。それが普通だと思います。

まずはやってみて、よくわからなくて調べてみて、「ああこれがそういうことか」と後からわかってもらえればそれでいいです。

少しでも興味がわきましたら初めてのcBotからぜひ試してみてください。

 


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

新しいコメント

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

cTrader's Life

© 2026 ajinori