@Override
 public AccumT addInputs(K key, Iterable<InputT> inputs, OldDoFn<?, ?>.ProcessContext c) {
   CombineWithContext.Context combineContext = CombineContextFactory.createFromProcessContext(c);
   AccumT accum = keyedCombineFnWithContext.createAccumulator(key, combineContext);
   for (InputT input : inputs) {
     accum = keyedCombineFnWithContext.addInput(key, accum, input, combineContext);
   }
   return accum;
 }
 @Override
 public AccumT createAccumulator(
     K key,
     PipelineOptions options,
     SideInputReader sideInputReader,
     Collection<? extends BoundedWindow> windows) {
   return keyedCombineFnWithContext.createAccumulator(
       key,
       CombineContextFactory.createFromComponents(
           options, sideInputReader, Iterables.getOnlyElement(windows)));
 }
 @Override
 public OutputT apply(K key, Iterable<? extends InputT> inputs, OldDoFn<?, ?>.ProcessContext c) {
   return keyedCombineFnWithContext.apply(
       key, inputs, CombineContextFactory.createFromProcessContext(c));
 }
 @Override
 public AccumT compact(K key, AccumT accumulator, OldDoFn<?, ?>.ProcessContext c) {
   return keyedCombineFnWithContext.compact(
       key, accumulator, CombineContextFactory.createFromProcessContext(c));
 }
 @Override
 public AccumT mergeAccumulators(
     K key, Iterable<AccumT> accumulators, OldDoFn<?, ?>.ProcessContext c) {
   return keyedCombineFnWithContext.mergeAccumulators(
       key, accumulators, CombineContextFactory.createFromProcessContext(c));
 }
 @Override
 public AccumT addInput(
     K key, AccumT accumulator, InputT value, OldDoFn<?, ?>.ProcessContext c) {
   return keyedCombineFnWithContext.addInput(
       key, accumulator, value, CombineContextFactory.createFromProcessContext(c));
 }