docs: @Override
    public byte[] transform(ClassLoader loader, String className,
        Class<?> redefinedClass, ProtectionDomain protectionDomain,
        byte[] bytecode) {
      if (blacklistManager.isIgnored(className)) {
        DebugUtils.info("agent", "ignoring " + className);
        return null;
      }
      try {
        this.loader = loader;
        ContractAnalyzer contracts = analyze(className);
        if (contracts == null) {
          if (className.endsWith(JavaUtils.HELPER_CLASS_SUFFIX)) {
            DebugUtils.info("agent", "adding source info to " + className);
            return instrumentWithDebug(bytecode);
          } else {
            return null;
          }
        } else {
          DebugUtils.info("agent", "adding contracts to " + className);
          return instrumentWithContracts(bytecode, contracts);
        }
      } catch (Throwable e) {
        DebugUtils.err("agent", "while instrumenting " + className, e);
        /* Not reached. */
        throw new RuntimeException(e);
      }
    }