docs: public long convertLocalToUTC(long instantLocal, boolean strict) {
          // get the offset at instantLocal (first estimate)
          int offsetLocal = getOffset(instantLocal);
          // adjust instantLocal using the estimate and recalc the offset
          int offset = getOffset(instantLocal - offsetLocal);
          // if the offsets differ, we must be near a DST boundary
          if (offsetLocal != offset) {
              // if strict then always check if in DST gap
              // otherwise only check if zone in Western hemisphere (as the
              // value of offset is already correct for Eastern hemisphere)
              if (strict || offsetLocal < 0) {
                  // determine if we are in the DST gap
                  long nextLocal = nextTransition(instantLocal - offsetLocal);
                  if (nextLocal == (instantLocal - offsetLocal)) {
                      nextLocal = Long.MAX_VALUE;
                  }
                  long nextAdjusted = nextTransition(instantLocal - offset);
                  if (nextAdjusted == (instantLocal - offset)) {
                      nextAdjusted = Long.MAX_VALUE;
                  }
                  if (nextLocal != nextAdjusted) {
                      // yes we are in the DST gap
                      if (strict) {
                          // DST gap is not acceptable
                          throw new IllegalInstantException(instantLocal, getID());
                      } else {
                          // DST gap is acceptable, but for the Western hemisphere
                          // the offset is wrong and will result in local times
                          // before the cutover so use the offsetLocal instead
                          offset = offsetLocal;
                      }
                  }
              }
          }
          // check for overflow
          long instantUTC = instantLocal - offset;
          // If there is a sign change, but the two values have different signs...
          if ((instantLocal ^ instantUTC) < 0 && (instantLocal ^ offset) < 0) {
              throw new ArithmeticException("Subtracting time zone offset caused overflow");
          }
          return instantUTC;
      }