# Copyright (c) 2016, 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.

.class public final LTestObject;
.super Ljava/lang/Object;

.method public constructor <init>()V
    .registers 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V
    return-void
.end method

.method public final a(LTest;LTest;)LTest;
    .registers 7
    .prologue
    const/4 v0, 0x0
    if-eqz p1, :cond_23
    iget-boolean v1, p1, LTest;->b:Z
    if-eqz v1, :cond_35
    iget-object v1, p0, LTest;->f:LTest;
    iget-object v1, v1, LTest;->b:LTest;
    invoke-virtual {v1}, LTest;->hasPrevious()Z
    move-result v1
    if-eqz v1, :cond_35
    new-instance p2, LTest;
    const/4 v1, 0x1
    iget-object v2, p0, LTest;->f:LTest;
    iget-object v3, v2, LTest;->b:LTest;
    invoke-virtual {v3}, LTest;->hasPrevious()Z
    move-result v3
    if-nez v3, :cond_24
    :goto_1e
    iget-object v0, v0, LTest;->a:LTest;
    invoke-direct {p2, v1, v0}, LTest;-><init>(ILTest;)V
    :cond_23
    :goto_23
    return-object p2
    :cond_24
    iget-object v0, v2, LTest;->b:LTest;
    iget-object v0, v0, LTest;->a:Ljava/util/ArrayList;
    iget-object v2, v2, LTest;->b:LTest;
    invoke-virtual {v2}, LTest;->previousIndex()I
    move-result v2
    invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v0
    check-cast v0, LTest;
    goto :goto_1e
    :cond_35
    iget-boolean v1, p1, LTest;->b:Z
    if-eqz v1, :cond_67
    iget-object v1, p0, LTest;->f:LTest;
    iget-object v1, v1, LTest;->b:LTest;
    invoke-virtual {v1}, LTest;->hasNext()Z
    move-result v1
    if-eqz v1, :cond_67
    new-instance p2, LTest;
    const/4 v1, 0x2
    iget-object v2, p0, LTest;->f:LTest;
    iget-object v3, v2, LTest;->b:LTest;
    invoke-virtual {v3}, LTest;->hasNext()Z
    move-result v3
    if-nez v3, :cond_56
    :goto_50
    iget-object v0, v0, LTest;->a:LTest;
    invoke-direct {p2, v1, v0}, LTest;-><init>(ILTest;)V
    goto :goto_23
    :cond_56
    iget-object v0, v2, LTest;->b:LTest;
    iget-object v0, v0, LTest;->a:Ljava/util/ArrayList;
    iget-object v2, v2, LTest;->b:LTest;
    invoke-virtual {v2}, LTest;->nextIndex()I
    move-result v2
    invoke-interface {v0, v2}, Ljava/util/List;->get(I)Ljava/lang/Object;
    move-result-object v0
    check-cast v0, LTest;
    goto :goto_50
    :cond_67
    iget-object v0, p1, LTest;->a:LTest;
    if-eqz v0, :cond_23
    new-instance p2, LTest;
    const/4 v0, 0x0
    new-instance v1, LTest;
    iget-object v2, p1, LTest;->a:LTest;
    invoke-direct {v1, v2}, LTest;-><init>(LTest;)V
    invoke-direct {p2, v0, v1}, LTest;-><init>(ILTest;)V
    goto :goto_23
.end method