[Retrace] Return frames as streams rather than visitors

Bug: 201042571
Change-Id: Ia9b0765848991f8ce493dacda7eb3b2cc1ab37c2
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
index e728463..cd85fba 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
@@ -5,7 +5,8 @@
 
 import com.android.tools.r8.Keep;
 import java.util.List;
-import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
 
 @Keep
 public interface RetraceFrameElement extends RetraceElement<RetraceFrameResult> {
@@ -16,9 +17,14 @@
 
   RetraceClassElement getClassElement();
 
-  void visitAllFrames(BiConsumer<RetracedMethodReference, Integer> consumer);
+  void visitFrames(Consumer<RetracedSingleFrame> consumer);
 
-  void visitRewrittenFrames(BiConsumer<RetracedMethodReference, Integer> consumer);
+  Stream<RetracedSingleFrame> forEachFrame();
+
+  void visitRewrittenFrames(
+      RetraceStackTraceContext context, Consumer<RetracedSingleFrame> consumer);
+
+  Stream<RetracedSingleFrame> forEachRewrittenFrame(RetraceStackTraceContext context);
 
   RetracedSourceFile getSourceFile(RetracedClassMemberReference frame);
 
diff --git a/src/main/java/com/android/tools/r8/retrace/RetracedSingleFrame.java b/src/main/java/com/android/tools/r8/retrace/RetracedSingleFrame.java
new file mode 100644
index 0000000..6f14809
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/RetracedSingleFrame.java
@@ -0,0 +1,15 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace;
+
+import com.android.tools.r8.Keep;
+
+@Keep
+public interface RetracedSingleFrame {
+
+  RetracedMethodReference getMethodReference();
+
+  int getIndex();
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
index 21060dc..870399c 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.retrace.RetraceInvalidRewriteFrameDiagnostics;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedClassMemberReference;
-import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedSingleFrame;
 import com.android.tools.r8.retrace.RetracedSourceFile;
 import com.android.tools.r8.retrace.internal.RetraceClassResultImpl.RetraceClassElementImpl;
 import com.android.tools.r8.utils.ListUtils;
@@ -27,7 +27,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.OptionalInt;
-import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 import java.util.stream.Stream;
 
 class RetraceFrameResultImpl implements RetraceFrameResult {
@@ -220,46 +220,67 @@
     }
 
     @Override
-    public void visitAllFrames(BiConsumer<RetracedMethodReference, Integer> consumer) {
+    public void visitFrames(Consumer<RetracedSingleFrame> consumer) {
+      if (mappedRanges == null || mappedRanges.isEmpty()) {
+        consumer.accept(RetracedSingleFrameImpl.create(getTopFrame(), 0));
+        return;
+      }
       int counter = 0;
-      consumer.accept(getTopFrame(), counter++);
+      consumer.accept(RetracedSingleFrameImpl.create(getTopFrame(), counter++));
       for (RetracedMethodReferenceImpl outerFrame : getOuterFrames()) {
-        consumer.accept(outerFrame, counter++);
+        consumer.accept(RetracedSingleFrameImpl.create(outerFrame, counter++));
       }
     }
 
     @Override
-    public void visitRewrittenFrames(BiConsumer<RetracedMethodReference, Integer> consumer) {
+    public Stream<RetracedSingleFrame> forEachFrame() {
+      Stream.Builder<RetracedSingleFrame> builder = Stream.builder();
+      visitFrames(builder::add);
+      return builder.build();
+    }
+
+    @Override
+    public void visitRewrittenFrames(
+        RetraceStackTraceContext context, Consumer<RetracedSingleFrame> consumer) {
+      RetraceStackTraceContextImpl contextImpl = (RetraceStackTraceContextImpl) context;
       RetraceStackTraceCurrentEvaluationInformation currentFrameInformation =
           context == null
               ? RetraceStackTraceCurrentEvaluationInformation.empty()
-              : context.computeRewritingInformation(mappedRanges);
+              : contextImpl.computeRewritingInformation(mappedRanges);
       int index = 0;
       int numberOfFramesToRemove = currentFrameInformation.getRemoveInnerFrames();
-      RetracedMethodReferenceImpl prev = getTopFrame();
-      List<RetracedMethodReferenceImpl> outerFrames = getOuterFrames();
-      if (numberOfFramesToRemove > outerFrames.size() + 1) {
-        assert prev.isKnown();
+      int totalNumberOfFrames =
+          (mappedRanges == null || mappedRanges.isEmpty()) ? 1 : mappedRanges.size();
+      if (numberOfFramesToRemove > totalNumberOfFrames) {
         DiagnosticsHandler diagnosticsHandler = retracer.getDiagnosticsHandler();
         diagnosticsHandler.warning(
             RetraceInvalidRewriteFrameDiagnostics.create(
-                numberOfFramesToRemove, prev.asKnown().toString()));
+                numberOfFramesToRemove, getTopFrame().asKnown().toString()));
         numberOfFramesToRemove = 0;
       }
+      RetracedMethodReferenceImpl prev = getTopFrame();
+      List<RetracedMethodReferenceImpl> outerFrames = getOuterFrames();
       for (RetracedMethodReferenceImpl next : outerFrames) {
         if (numberOfFramesToRemove-- <= 0) {
-          consumer.accept(prev, index++);
+          consumer.accept(RetracedSingleFrameImpl.create(prev, index++));
         }
         prev = next;
       }
       // We expect only the last frame, i.e., the outer-most caller to potentially be synthesized.
       // If not include it too.
       if (numberOfFramesToRemove <= 0 && !isOuterMostFrameCompilerSynthesized()) {
-        consumer.accept(prev, index);
+        consumer.accept(RetracedSingleFrameImpl.create(prev, index));
       }
     }
 
     @Override
+    public Stream<RetracedSingleFrame> forEachRewrittenFrame(RetraceStackTraceContext context) {
+      Stream.Builder<RetracedSingleFrame> builder = Stream.builder();
+      visitRewrittenFrames(context, builder::add);
+      return builder.build();
+    }
+
+    @Override
     public RetracedSourceFile getSourceFile(RetracedClassMemberReference frame) {
       return RetraceUtils.getSourceFileOrLookup(
           frame.getHolderClass(), classElement, retraceFrameResult.retracer);
@@ -272,16 +293,18 @@
       }
       List<RetracedMethodReferenceImpl> outerFrames = new ArrayList<>();
       for (int i = 1; i < mappedRanges.size(); i++) {
-        MappedRange mappedRange = mappedRanges.get(i);
-        MethodReference methodReference =
-            methodReferenceFromMappedRange(
-                mappedRange, classElement.getRetracedClass().getClassReference());
-        outerFrames.add(
-            retraceFrameResult.getRetracedMethod(methodReference, mappedRange, obfuscatedPosition));
+        outerFrames.add(getMethodReferenceFromMappedRange(mappedRanges.get(i)));
       }
       return outerFrames;
     }
 
+    private RetracedMethodReferenceImpl getMethodReferenceFromMappedRange(MappedRange mappedRange) {
+      MethodReference methodReference =
+          methodReferenceFromMappedRange(
+              mappedRange, classElement.getRetracedClass().getClassReference());
+      return retraceFrameResult.getRetracedMethod(methodReference, mappedRange, obfuscatedPosition);
+    }
+
     @Override
     public RetraceStackTraceContext getContext() {
       // This will change when supporting outline frames.
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedSingleFrameImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedSingleFrameImpl.java
new file mode 100644
index 0000000..c69b148
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedSingleFrameImpl.java
@@ -0,0 +1,33 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.retrace.internal;
+
+import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedSingleFrame;
+
+public class RetracedSingleFrameImpl implements RetracedSingleFrame {
+
+  private final RetracedMethodReference methodReference;
+  private final int index;
+
+  private RetracedSingleFrameImpl(RetracedMethodReference methodReference, int index) {
+    this.methodReference = methodReference;
+    this.index = index;
+  }
+
+  @Override
+  public RetracedMethodReference getMethodReference() {
+    return methodReference;
+  }
+
+  @Override
+  public int getIndex() {
+    return index;
+  }
+
+  static RetracedSingleFrameImpl create(RetracedMethodReference methodReference, int index) {
+    return new RetracedSingleFrameImpl(methodReference, index);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
index 4db09aa..ade7733 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
@@ -114,44 +114,42 @@
                   element.getMethodName());
           return frameResult.stream()
               .flatMap(
-                  frameElement -> {
-                    List<RetraceStackTraceElementProxyImpl<T, ST>> retracedProxies =
-                        new ArrayList<>();
-                    frameElement.visitRewrittenFrames(
-                        (frame, index) -> {
-                          boolean isTopFrame = index == 0;
-                          retracedProxies.add(
-                              proxy
-                                  .builder()
-                                  .setRetracedClass(frame.getHolderClass())
-                                  .setRetracedMethod(frame)
-                                  .joinAmbiguous(frameResult.isAmbiguous() && isTopFrame)
-                                  .setTopFrame(isTopFrame)
-                                  .setContext(frameElement.getContext())
-                                  .applyIf(
-                                      element.hasLineNumber(),
-                                      builder -> {
-                                        builder.setLineNumber(
-                                            frame.getOriginalPositionOrDefault(
-                                                element.getLineNumber()));
-                                      })
-                                  .applyIf(
-                                      element.hasSourceFile(),
-                                      builder -> {
-                                        RetracedSourceFile sourceFileResult =
-                                            frameElement.getSourceFile(frame);
-                                        builder.setSourceFile(
-                                            sourceFileResult.hasRetraceResult()
-                                                ? sourceFileResult.getSourceFile()
-                                                : RetraceUtils.inferSourceFile(
-                                                    frame.getHolderClass().getTypeName(),
-                                                    element.getSourceFile(),
-                                                    classResult.hasRetraceResult()));
-                                      })
-                                  .build());
-                        });
-                    return retracedProxies.stream();
-                  });
+                  frameElement ->
+                      frameElement
+                          .forEachRewrittenFrame(proxy.getContext())
+                          .map(
+                              singleFrame -> {
+                                boolean isTopFrame = singleFrame.getIndex() == 0;
+                                RetracedMethodReference method = singleFrame.getMethodReference();
+                                return proxy
+                                    .builder()
+                                    .setRetracedClass(method.getHolderClass())
+                                    .setRetracedMethod(method)
+                                    .joinAmbiguous(frameResult.isAmbiguous() && isTopFrame)
+                                    .setTopFrame(isTopFrame)
+                                    .setContext(frameElement.getContext())
+                                    .applyIf(
+                                        element.hasLineNumber(),
+                                        builder -> {
+                                          builder.setLineNumber(
+                                              method.getOriginalPositionOrDefault(
+                                                  element.getLineNumber()));
+                                        })
+                                    .applyIf(
+                                        element.hasSourceFile(),
+                                        builder -> {
+                                          RetracedSourceFile sourceFileResult =
+                                              frameElement.getSourceFile(method);
+                                          builder.setSourceFile(
+                                              sourceFileResult.hasRetraceResult()
+                                                  ? sourceFileResult.getSourceFile()
+                                                  : RetraceUtils.inferSourceFile(
+                                                      method.getHolderClass().getTypeName(),
+                                                      element.getSourceFile(),
+                                                      classResult.hasRetraceResult()));
+                                        })
+                                    .build();
+                              }));
         });
   }
 
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
index 686f785..9485d99 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
@@ -118,8 +118,10 @@
       // Check that rewriting the frames will remove the top 1 frames if the condition is active.
       Map<Integer, RetracedMethodReference> results = new LinkedHashMap<>();
       retraceFrameElement.visitRewrittenFrames(
-          (methodReference, index) -> {
-            RetracedMethodReference existingValue = results.put(index, methodReference);
+          throwingContext,
+          frame -> {
+            RetracedMethodReference existingValue =
+                results.put(frame.getIndex(), frame.getMethodReference());
             assertNull(existingValue);
           });
       if (shouldRemove) {
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
index f581c1b..2e32209 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
@@ -82,11 +82,14 @@
       RetraceFrameElement retraceFrameElement = retraceFrameElements.get(0);
       // Check that rewriting the frames will remove the top 1 frames if the condition is active.
       Map<Integer, RetracedMethodReference> results = new LinkedHashMap<>();
-      retraceFrameElement.visitRewrittenFrames(
-          (methodReference, index) -> {
-            RetracedMethodReference existingValue = results.put(index, methodReference);
-            assertNull(existingValue);
-          });
+      retraceFrameElement
+          .forEachRewrittenFrame(throwingContext)
+          .forEach(
+              frame -> {
+                RetracedMethodReference existingValue =
+                    results.put(frame.getIndex(), frame.getMethodReference());
+                assertNull(existingValue);
+              });
       assertEquals(1, results.size());
       assertEquals(7, results.get(0).getOriginalPositionOrDefault(4));
       assertEquals(results.get(0).getMethodName(), "caller");
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java
index c502dd7..6b2bea4 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFrameTest.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedSingleFrame;
 import com.android.tools.r8.retrace.Retracer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.OptionalInt;
 import java.util.stream.Collectors;
@@ -58,12 +58,17 @@
               .collect(Collectors.toList());
       assertEquals(1, frameResults.size());
       RetraceFrameElement retraceFrameElement = frameResults.get(0);
-      List<RetracedMethodReference> allFrames = new ArrayList<>();
-      retraceFrameElement.visitAllFrames((method, ignored) -> allFrames.add(method));
+      List<RetracedMethodReference> allFrames =
+          retraceFrameElement
+              .forEachFrame()
+              .map(RetracedSingleFrame::getMethodReference)
+              .collect(Collectors.toList());
       assertEquals(2, allFrames.size());
-      List<RetracedMethodReference> nonSyntheticFrames = new ArrayList<>();
-      retraceFrameElement.visitRewrittenFrames(
-          (method, ignored) -> nonSyntheticFrames.add(method));
+      List<RetracedMethodReference> nonSyntheticFrames =
+          retraceFrameElement
+              .forEachRewrittenFrame(RetraceStackTraceContext.empty())
+              .map(RetracedSingleFrame::getMethodReference)
+              .collect(Collectors.toList());
       assertEquals(1, nonSyntheticFrames.size());
       assertEquals(nonSyntheticFrames.get(0), allFrames.get(0));
       assertEquals("mango", allFrames.get(1).getMethodName());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
index f0f5631..e7d0936 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedInnerFrameTest.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetracedMethodReference;
+import com.android.tools.r8.retrace.RetracedSingleFrame;
 import com.android.tools.r8.retrace.Retracer;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.OptionalInt;
 import java.util.stream.Collectors;
@@ -58,12 +58,17 @@
               .collect(Collectors.toList());
       assertEquals(1, frameResults.size());
       RetraceFrameElement retraceFrameElement = frameResults.get(0);
-      List<RetracedMethodReference> allFrames = new ArrayList<>();
-      retraceFrameElement.visitAllFrames((method, ignored) -> allFrames.add(method));
+      List<RetracedMethodReference> allFrames =
+          retraceFrameElement
+              .forEachFrame()
+              .map(RetracedSingleFrame::getMethodReference)
+              .collect(Collectors.toList());
       assertEquals(2, allFrames.size());
-      List<RetracedMethodReference> nonSyntheticFrames = new ArrayList<>();
-      retraceFrameElement.visitRewrittenFrames(
-          (method, ignored) -> nonSyntheticFrames.add(method));
+      List<RetracedMethodReference> nonSyntheticFrames =
+          retraceFrameElement
+              .forEachRewrittenFrame(RetraceStackTraceContext.empty())
+              .map(RetracedSingleFrame::getMethodReference)
+              .collect(Collectors.toList());
       assertEquals(allFrames, nonSyntheticFrames);
     }
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
index edeed5a..98e2e09 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/Matchers.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.retrace.RetraceFrameElement;
 import com.android.tools.r8.retrace.RetraceFrameResult;
+import com.android.tools.r8.retrace.RetracedMethodReference;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.Visibility;
 import com.google.common.collect.ImmutableList;
@@ -588,27 +589,30 @@
         RetraceFrameElement single = item.stream().collect(Collectors.toSingle());
         Box<LinePosition> currentPosition = new Box<>(startPosition);
         Box<Boolean> returnValue = new Box<>();
-        single.visitAllFrames(
-            (method, __) -> {
-              LinePosition currentInline = currentPosition.get();
-              if (currentInline == null) {
-                returnValue.set(false);
-                return;
-              }
-              if (method.isUnknown()) {
-                returnValue.set(false);
-                return;
-              }
-              boolean sameMethod =
-                  method.asKnown().getMethodReference().equals(currentInline.methodReference);
-              boolean samePosition =
-                  method.getOriginalPositionOrDefault(currentInline.minifiedPosition)
-                      == currentInline.originalPosition;
-              if (!returnValue.isSet() || returnValue.get()) {
-                returnValue.set(sameMethod & samePosition);
-              }
-              currentPosition.set(currentInline.caller);
-            });
+        single
+            .forEachFrame()
+            .forEach(
+                frame -> {
+                  LinePosition currentInline = currentPosition.get();
+                  if (currentInline == null) {
+                    returnValue.set(false);
+                    return;
+                  }
+                  RetracedMethodReference method = frame.getMethodReference();
+                  if (method.isUnknown()) {
+                    returnValue.set(false);
+                    return;
+                  }
+                  boolean sameMethod =
+                      method.asKnown().getMethodReference().equals(currentInline.methodReference);
+                  boolean samePosition =
+                      method.getOriginalPositionOrDefault(currentInline.minifiedPosition)
+                          == currentInline.originalPosition;
+                  if (!returnValue.isSet() || returnValue.get()) {
+                    returnValue.set(sameMethod & samePosition);
+                  }
+                  currentPosition.set(currentInline.caller);
+                });
         return returnValue.isSet() && returnValue.get();
       }
 
@@ -625,18 +629,18 @@
       @Override
       protected boolean matchesSafely(RetraceFrameResult item) {
         RetraceFrameElement single = item.stream().collect(Collectors.toSingle());
-        Box<Boolean> matches = new Box<>(true);
-        single.visitAllFrames(
-            (method, index) -> {
-              StackTraceLine stackTraceLine = stackTrace.get(index);
-              if (!stackTraceLine.methodName.equals(method.getMethodName())
-                  || !stackTraceLine.className.equals(method.getHolderClass().getTypeName())
-                  || stackTraceLine.lineNumber
-                      != method.getOriginalPositionOrDefault(minifiedPositions.get(index))) {
-                matches.set(false);
-              }
-            });
-        return matches.get();
+        return !single
+            .forEachFrame()
+            .anyMatch(
+                frame -> {
+                  StackTraceLine stackTraceLine = stackTrace.get(frame.getIndex());
+                  RetracedMethodReference method = frame.getMethodReference();
+                  return !stackTraceLine.methodName.equals(method.getMethodName())
+                      || !stackTraceLine.className.equals(method.getHolderClass().getTypeName())
+                      || stackTraceLine.lineNumber
+                          != method.getOriginalPositionOrDefault(
+                              minifiedPositions.get(frame.getIndex()));
+                });
       }
 
       @Override
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index a20af66..fab5560 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-a95653b53ad0ce72106c9ab57810d993758dfe02
\ No newline at end of file
+a8c20544e37364820cdfa29bda44fc356b9fd04f
\ No newline at end of file