public static function Ut1utc($ut11, $ut12, $dut1, &$utc1, &$utc2) {
    $big1;
    $i;
    $iy;
    $im;
    $id;
    $js;
    $duts;
    $u1;
    $u2;
    $d1;
    $dats1;
    $d2;
    $fd;
    $dats2;
    $ddats;
    $us1;
    $us2;
    $du;

    /* UT1-UTC in seconds. */
    $duts = $dut1;

    /* Put the two parts of the UT1 into big-first order. */
    $big1 = ( $ut11 >= $ut12 );
    if ($big1) {
      $u1 = $ut11;
      $u2 = $ut12;
    }
    else {
      $u1 = $ut12;
      $u2 = $ut11;
    }

    /* See if the UT1 can possibly be in a leap-second day. */
    $d1    = $u1;
    $dats1 = 0;
    for ($i = -1; $i <= 3; $i++) {
      $d2    = $u2 + (double)$i;
      if (IAU::Jd2cal($d1, $d2, $iy, $im, $id, $fd))
        return -1;
      $js    = IAU::Dat($iy, $im, $id, 0.0, $dats2);
      if ($js < 0)
        return -1;
      if ($i == - 1)
        $dats1 = $dats2;
      $ddats = $dats2 - $dats1;
      if (abs($ddats) >= 0.5) {

        /* Yes, leap second nearby: ensure UT1-UTC is "before" value. */
        if ($ddats * $duts >= 0)
          $duts -= $ddats;

        /* UT1 for the start of the UTC day that ends in a leap. */
        if (IAU::Cal2jd($iy, $im, $id, $d1, $d2))
          return -1;
        $us1 = $d1;
        $us2 = $d2 - 1.0 + $duts / DAYSEC;

        /* Is the UT1 after this point? */
        $du = $u1 - $us1;
        $du += $u2 - $us2;
        if ($du > 0) {

          /* Yes:  fraction of the current UTC day that has elapsed. */
          $fd = $du * DAYSEC / ( DAYSEC + $ddats );

          /* Ramp UT1-UTC to bring about SOFA's JD(UTC) convention. */
          $duts += $ddats * ( $fd <= 1.0 ? $fd : 1.0 );
        }

        /* Done. */
        break;
      }
      $dats1 = $dats2;
    }

    /* Subtract the (possibly adjusted) UT1-UTC from UT1 to give UTC. */
    $u2 -= $duts / DAYSEC;

    /* Result, safeguarding precision. */
    if ($big1) {
      $utc1 = $u1;
      $utc2 = $u2;
    }
    else {
      $utc1 = $u2;
      $utc2 = $u1;
    }

    /* Status. */
    return $js;
  }