using namespace std;

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#define DEBUG

#ifdef DEBUG
#define debug(args...)            {dbg,args; cerr<<endl;}
#else
#define debug(args...)              // Just strip off all debug tokens
#endif

struct debugger
{
  template<typename T> debugger& operator , (const T& v)
  {
  cerr<<v<<" ";
  return *this;
  }
} dbg;

// templates
template<typename T> int size(const T& c) { return int(c.size()); }
template<typename T> T abs(T x) { return x < 0 ? -x : x; }
template<typename T> T sqr(T x) { return x*x; }
template<typename T> bool remin(T& x, T y) { if (x <= y) return false; x = y; return true; }
template<typename T> bool remax(T& x, T y) { if (x >= y) return false; x = y; return true; }

// misc
#define EPSILON 1e-3

// types
typedef long long int64;
typedef unsigned long long uint64;

// shortcuts
#define ALL(_xx) _xx.begin(), _xx.end()

#define pb push_back
#define vi vector<int>
#define vpii vector<pair<int,int> >

#define pii pair<int,int>
#define pdd pair<double, double>
#define mp(XX, YY) make_pair(XX, YY)
#define fi first
#define se second

#define SS stringstream

// for loops
#define re(II, NN) for (int II(0), _NN(NN); (II) < (NN); ++(II))
#define fod(II, XX, YY) for (int II(XX), _YY(YY); (II) >= (_YY); --(II))
#define fo(II, XX, YY) for (int II(XX), _YY(YY); (II) <= (_YY); ++(II))

const string filein = "evil.in";
const string fileout = "evil.out";

const int N = 3;
int counter;
int cx[3], cy[3], rx[3], ry[3];

inline bool in_elipse(const pdd & p, int index) {
  return 1.0 * sqr(cx[index] - p.fi) * sqr(ry[index]) +
         1.0 * sqr(cy[index] - p.se) * sqr(rx[index]) + EPSILON < sqr(rx[index] * ry[index]);
}

inline int fast_in_elipses(const pdd & p) {
  re (i, N)
    if (in_elipse(p, i))
      return 1;
  return 0;
}

inline int in_elipses(const pdd & p, int * msk) {
  int val = 0;
  re (i, N) {
    if (!in_elipse(p, i))
      msk[i] = 0;
    else
      val = 1;
  }
  return val;
}

inline void monte() {
  const int iter = 30000000;
  
  int lim = 30, ok = 0;
  
  re (i, iter) {
    double px = (rand() % (1000001)) / (1e6);
    double py = (rand() % (1000001)) / (1e6);
    px = -lim + 2 * lim * px;
    py = -lim + 2 * lim * py;
  
    ok += fast_in_elipses(mp(px, py));
  }
  
  debug("monte: ", iter, ok, (1.0 * ok / iter) * sqr(2*lim));
}

inline double rec(double x, double y, double l) {
  double area = l * l;
  
  if (area <= EPSILON * EPSILON)
    return area / 2;
  
  ++counter;
/*
  int msk[3] = {1, 1, 1};

  int sum = in_elipses(mp(x, y), msk) +
            in_elipses(mp(x + l, y), msk) +
            in_elipses(mp(x, y + l), msk) +
            in_elipses(mp(x + l, y + l), msk);

  // all in same elipse
  if(msk[0] + msk[1] + msk[2])
    return area;
  else if (sum == 0)
    return 0.0;
*/
  int sum = fast_in_elipses(mp(x, y)) +
  fast_in_elipses(mp(x + l, y)) +
  fast_in_elipses(mp(x, y + l)) +
  fast_in_elipses(mp(x + l, y + l));
  
  // all in same elipse
  if(sum == 4)
    return area;
  else if (sum == 0)
    return 0.0;

  
  return rec(x, y, l / 2) +
  rec(x + l / 2, y, l / 2) +
  rec(x, y + l / 2, l / 2) +
  rec(x + l / 2, y + l / 2, l / 2);
}

void solve_rec() {
  int lim = 80;
  
  double area = 0.0;
  fo (xx, -lim - 1, lim) {
    fo (yy, -lim - 1, lim) {
      area += rec(xx, yy, 1.0);
    }
  }
  
  cout << std::fixed << std::setprecision(6);
  cout << area << endl;
}

int main() {
  re (i, N)
    cin >> cx[i] >> cy[i] >> rx[i] >> ry[i];
  
  //monte();
  solve_rec();
  
  return 0;
}