description: <image>
  
  William has two numbers a and b initially both equal to zero. William mastered performing three different operations with them quickly. Before performing each operation some positive integer k is picked, which is then used to perform one of the following operations: (note, that for each operation you can choose a new positive integer k)
  
    1. add number k to both a and b, or 
    2. add number k to a and subtract k from b, or 
    3. add number k to b and subtract k from a. 
  
  
  
  Note that after performing operations, numbers a and b may become negative as well.
  
  William wants to find out the minimal number of operations he would have to perform to make a equal to his favorite number c and b equal to his second favorite number d.
  
  Input
  
  Each test contains multiple test cases. The first line contains the number of test cases t (1 ≤ t ≤ 10^4). Description of the test cases follows.
  
  The only line of each test case contains two integers c and d (0 ≤ c, d ≤ 10^9), which are William's favorite numbers and which he wants a and b to be transformed into.
  
  Output
  
  For each test case output a single number, which is the minimal number of operations which William would have to perform to make a equal to c and b equal to d, or -1 if it is impossible to achieve this using the described operations.
  
  Example
  
  Input
  
  
  6
  1 2
  3 5
  5 3
  6 6
  8 0
  0 0
  
  
  Output
  
  
  -1
  2
  2
  1
  2
  0
  
  Note
  
  Let us demonstrate one of the suboptimal ways of getting a pair (3, 5):
  
    * Using an operation of the first type with k=1, the current pair would be equal to (1, 1). 
    * Using an operation of the third type with k=8, the current pair would be equal to (-7, 9). 
    * Using an operation of the second type with k=7, the current pair would be equal to (0, 2). 
    * Using an operation of the first type with k=3, the current pair would be equal to (3, 5). 
solution: import java.io.*;
  import java.util.*;
   
  public class Practice
  {
  	static int mod=1000000007;
  	static HashSet<Integer> pr;
  	static FastReader sc=new FastReader(System.in);
  //	static Reader sc=new Reader();
  	static  PrintWriter out=new PrintWriter(System.out);
  	public static void main(String[] args) throws IOException
  	{ 
  		int t=1;
  		t=sc.nextInt();
  //		StringBuilder sb=new StringBuilder();
  		while(t-->0)
  		{
  			solve();
  //			sb.append("\n");
  		}
  //		out.print(sb);
  		out.close();
  		out.flush();
  	}
  	static class Pair
  	{
  		int x;	
  		int y;	
  		Pair(int a,int b)
  		{
  			x=a;
  			y=b;
  		}
  		@Override
  		public String toString() 
  		{
  			return x+" "+y;
  		}
  	}
  	static void arraySort(int arr[])
  	{
  		ArrayList<Integer> a=new ArrayList<Integer>();
  		for (int i = 0; i < arr.length; i++) {
  			a.add(arr[i]);
  		}
  		Collections.sort(a);
  		for (int i = 0; i < arr.length; i++) {
  			arr[i]=a.get(i);
  		}
  	}
  	static void solve() throws IOException
  	{
  		int a=sc.nextInt(),b=sc.nextInt();
  		if(a==b)
  		{
  			if(a==0)
  				out.println("0");
  			else
  				out.println("1");
  		}
  		else
  		{
  			int d=Math.abs(a-b);
  			if((d&1)==0)
  				out.println("2");
  			else
  				out.println("-1");
  		}
  		
  	}
  	static double dfs(Node ver,Node par)
  	{
  		if(ver.adj.size()==1 && ver.adj.get(0)==par)
  		{
  			return 0;
  		}
  		else
  		{
  			double sum=0,c=0;			
  			for(Node child: ver.adj)
  			if(child!=par)
  			{
  				c++;
  				sum+=dfs(child, ver);
  			}
  			return 1+(sum/c);
  		}
  	}
  	static int LOWER_BOUND(ArrayList<Integer> arr,int x)
  	{
  		int low=0,high=arr.size();
  		int ans=0;
  		while(low<=high)
  		{
  			int mid=(low+high)/2;
  			if(arr.get(mid)==x)
  			{
  				ans=arr.get(mid);
  				break;
  			}
  			else if(arr.get(mid)<x)
  			{
  				ans=arr.get(mid);
  				low=mid+1;
  			}
  			else
  				high=mid-1;
  		}
  		return ans;
  	}
  	static int gcd(int a,int b)
  	{
  		return (b==0)?a:gcd(b,a%b);
  	}
  	static class UnionFind
  	{
  		  private int size;
  		  private int[] sz;
  		  private int[] parent;
  		  private int numComponents;
  		  public UnionFind(int size,Pair dancers[]) 
  		  {
  		    if (size <= 0) throw new IllegalArgumentException("Size <= 0 is not allowed");
  		    this.size = numComponents = size;
  		    sz = new int[size];
  		    parent = new int[size];
  		    for (int i = 0; i < size; i++) 
  		    {
  		      parent[i] = i; 									// Link to itself (self root)
  		      sz[i] = 1; 										// Each component is originally of size one
  		    }
  		  }
  		  public int find(int p) 
  		  {
  		    int root = p;
  		    while (root != parent[root])
  		    	root = parent[root];
  		    while (p != root)
  		    {
  		      int next = parent[p];
  		      parent[p] = root;
  		      p = next;
  		    }
  		    return root;
  		  }
  		  public boolean isConnected(int p, int q) 
  		  {
  		    return find(p) == find(q);
  		  }
  		  public int componentSize(int x) 
  		  {
  		    return sz[find(x)];
  		  }
  		  public int size() 
  		  {
  		    return size;
  		  }
  		  public int components() 
  		  {
  		    return numComponents;
  		  }
  		  public void unify(int p, int q) 
  		  {
  		    int root1 = find(p);
  		    int root2 = find(q);
  		    if(root1==root2)
  		    {
  		    	return;
  		    }
  		    else if (sz[root1] < sz[root2]) 
  		    {
  		    	parent[root1] = root2;
  		    	sz[root2] += sz[root1];
  		    	sz[root1] = 0;
  		  } 
  		    else 
  		    {
  		    	parent[root2] = root1;
  		    	sz[root1] += sz[root2];
  		    	sz[root2] = 0;
  		    }
  		    numComponents--;
  		  }
  		  void calc()
  		  {
  			  for(int i=0;i<size;i++)
  				  find(i);
  			  
  		  }
  	}
  	static class Node
  	{
  		int vertex;
  		ArrayList<Node> adj;
  		boolean rec;
  		boolean vis;
  		int color;
  		Node(int v)
  		{
  			vertex=v;
  			adj=new ArrayList<Node>();
  			vis=false;
  			color=-1;
  		}
  		@Override
  		public String toString() 
  		{
  			return vertex+" ";
  		}
  	}
  	static class Edge
  	{
  		Node a;
  		Node b;
  		Edge(Node m,Node n)
  		{
  			this.a=m;
  			this.b=n;
  		}
  		@Override
  		public String toString() {
  			return a.vertex+" "+b.vertex;
  		}
  	}
  	static long power(long x, long y)
  	  {
  	    long res = 1; 
  	    x = x % mod; 
  	    if (x == 0)
  	      return 0; 
  	    while (y > 0)
  	    {
  	    	if ((y & 1) != 0)
  	    		res = (res * x) % mod;
  	    	
  	    	y = y >> 1; // y = y/2
  	    	x = (x * x) % mod;
  	    }
  	    return res;
  	  }
  	static long binomialCoeff(long n, long k)
      {
          long res = 1;
          if(k>n)
          	return 0;
          // Since C(n, k) = C(n, n-k)
          if (k > n - k)
              k = n - k;
   
          // Calculate value of
          // [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1]
          for (long i = 0; i < k; ++i) {
              res *= (n - i);
              res /= (i + 1);
          }
   
          return res;
      }
  	static class FastReader
  	{
          byte[] buf = new byte[2048];
          int index, total;
          InputStream in;
   
          FastReader(InputStream is) 
          {
              in = is;
          }
   
          int scan() throws IOException 
          {
              if (index >= total) {
                  index = 0;
                  total = in.read(buf);
                  if (total <= 0) {
                      return -1;
                  }
              }
              return buf[index++];
          }
   
          String next() throws IOException 
          {
              int c;
              for (c = scan(); c <= 32; c = scan());
              StringBuilder sb = new StringBuilder();
              for (; c > 32; c = scan()) {
                  sb.append((char) c);
              }
              return sb.toString();
          }
   
          int nextInt() throws IOException 
          {
              int c, val = 0;
              for (c = scan(); c <= 32; c = scan());
              boolean neg = c == '-';
              if (c == '-' || c == '+') {
                  c = scan();
              }
              for (; c >= '0' && c <= '9'; c = scan()) {
                  val = (val << 3) + (val << 1) + (c & 15);
              }
              return neg ? -val : val;
          }
   
          long nextLong() throws IOException 
          {
              int c;
              long val = 0;
              for (c = scan(); c <= 32; c = scan());
              boolean neg = c == '-';
              if (c == '-' || c == '+') {
                  c = scan();
              }
              for (; c >= '0' && c <= '9'; c = scan()) {
                  val = (val << 3) + (val << 1) + (c & 15);
              }
              return neg ? -val : val;
          }
      }
  	static class Reader 
  	{
          final private int BUFFER_SIZE = 1 << 16;
          private DataInputStream din;
          private byte[] buffer;
          private int bufferPointer, bytesRead;
   
          public Reader()
          {
              din = new DataInputStream(System.in);
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
   
          public Reader(String file_name) throws IOException
          {
              din = new DataInputStream(
                  new FileInputStream(file_name));
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
   
          public String readLine() throws IOException
          {
              byte[] buf = new byte[64]; // line length
              int cnt = 0, c;
              while ((c = read()) != -1) {
                  if (c == '\n') {
                      if (cnt != 0) {
                          break;
                      }
                      else {
                          continue;
                      }
                  }
                  buf[cnt++] = (byte)c;
              }
              return new String(buf, 0, cnt);
          }
   
          public int nextInt() throws IOException
          {
              int ret = 0;
              byte c = read();
              while (c <= ' ') {
                  c = read();
              }
              boolean neg = (c == '-');
              if (neg)
                  c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
   
              if (neg)
                  return -ret;
              return ret;
          }
   
          public long nextLong() throws IOException
          {
              long ret = 0;
              byte c = read();
              while (c <= ' ')
                  c = read();
              boolean neg = (c == '-');
              if (neg)
                  c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
              if (neg)
                  return -ret;
              return ret;
          }
   
          public double nextDouble() throws IOException
          {
              double ret = 0, div = 1;
              byte c = read();
              while (c <= ' ')
                  c = read();
              boolean neg = (c == '-');
              if (neg)
                  c = read();
   
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
   
              if (c == '.') {
                  while ((c = read()) >= '0' && c <= '9') {
                      ret += (c - '0') / (div *= 10);
                  }
              }
   
              if (neg)
                  return -ret;
              return ret;
          }
   
          private void fillBuffer() throws IOException
          {
              bytesRead = din.read(buffer, bufferPointer = 0,
                                   BUFFER_SIZE);
              if (bytesRead == -1)
                  buffer[0] = -1;
          }
   
          private byte read() throws IOException
          {
              if (bufferPointer == bytesRead)
                  fillBuffer();
              return buffer[bufferPointer++];
          }
   
          public void close() throws IOException
          {
              if (din == null)
                  return;
              din.close();
          }
          public void printarray(int arr[])
          {
          	for (int i = 0; i < arr.length; i++)
  				System.out.print(arr[i]+" ");
          	System.out.println();
          }
      }
  }
  
  
  
  
  
  
  
  
  