code: @Override
      public List<? extends SatConstraint> buildConstraint(BtrPlaceTree t, List<BtrpOperand> args) {
  
          if (!checkConformance(t, args)) {
              return Collections.emptyList();
          }
  
          // Get the first parameter
          @SuppressWarnings("unchecked")
          List<VM> s = (List<VM>) params[0].transform(this, t, args.get(0));
          if (s == null) {
              return Collections.emptyList();
          }
  
          // Get param 'OneOf'
          Object obj = params[1].transform(this, t, args.get(1));
          if (obj == null) {
              return Collections.emptyList();
          }
          if (obj instanceof List) {
              @SuppressWarnings("unchecked")
              List<VM> s2 = (List<VM>) obj;
              if (s2.isEmpty()) {
                  t.ignoreError("Parameter '" + params[1].getName() + "' expects a non-empty list of VMs");
                  return Collections.emptyList();
              }
              return Precedence.newPrecedence(s, s2);
          } else if (obj instanceof String) {
              String timestamp = (String) obj;
              if ("".equals(timestamp)) {
                  t.ignoreError("Parameter '" + params[1].getName() + "' expects a non-empty string");
                  return Collections.emptyList();
              }
              return Deadline.newDeadline(s, timestamp);
          } else {
              return Collections.emptyList();
          }
      }
docs: Build a precedence constraint.
  
  @param t    the current tree
  @param args can be a non-empty set of vms ({@see Precedence} constraint) or
  a timestamp string ({@see Deadline} constraint)
  @return a constraint