library;
import self as self;
import "dart:core" as core;

static method method1(core::List<dynamic> o) → dynamic {
  #L1:
  {
    final synthesized core::List<dynamic> #0#0 = o;
    {
      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) {
        {
          core::print(o);
        }
      }
    }
  }
  #L2:
  {
    final synthesized core::List<dynamic> #1#0 = o;
    {
      if(#1#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2) {
        {
          core::print(o);
        }
      }
    }
  }
  #L3:
  {
    final synthesized core::List<dynamic> #2#0 = o;
    {
      if(#2#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L4:
  {
    final synthesized core::List<dynamic> #3#0 = o;
    {
      if(#3#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L5:
  {
    final synthesized core::List<dynamic> #4#0 = o;
    {
      if(#4#0.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool}) {
        {
          core::print(o);
        }
      }
    }
  }
}
static method method2(dynamic o) → dynamic {
  #L6:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L7:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L8:
  {
    final synthesized dynamic #2#0 = o;
    {
      if(#2#0 is core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L9:
  {
    final synthesized dynamic #3#0 = o;
    {
      if(#3#0 is core::List<dynamic> && #3#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L10:
  {
    final synthesized dynamic #4#0 = o;
    {
      if(#4#0 is core::List<dynamic> && #4#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}
static method method3(core::List<dynamic> o) → dynamic {
  #L11:
  {
    final synthesized core::List<dynamic> #0#0 = o;
    {
      if(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0.{core::List::[]}(1){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L12:
  {
    final synthesized core::List<dynamic> #1#0 = o;
    {
      if(#1#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #1#0.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L13:
  {
    final synthesized core::List<dynamic> #2#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(#2#0.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t1 = a = #2#0.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o);
        }
      }
    }
  }
  #L14:
  {
    final synthesized core::List<dynamic> #3#0 = o;
    late final synthesized core::int #3#1 = #3#0.{core::List::length}{core::int};
    {
      hoisted core::List<dynamic> a;
      if(#3#1.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t2 = a = #3#0.{core::List::sublist}(0, #3#1.{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o);
        }
      }
    }
  }
  #L15:
  {
    final synthesized core::List<dynamic> #4#0 = o;
    {
      if(#4#0.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #4#0.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
  #L16:
  {
    final synthesized core::List<dynamic> #5#0 = o;
    late final synthesized core::int #5#1 = #5#0.{core::List::length}{core::int};
    {
      if(#5#1.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #5#0.{core::List::[]}(#5#1.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) {
        {
          core::print(o);
        }
      }
    }
  }
}
static method method4(dynamic o) → dynamic {
  #L17:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #0#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L18:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #C1 =={core::num::==}{(core::Object) → core::bool} #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L19:
  {
    final synthesized dynamic #2#0 = o;
    {
      hoisted core::List<dynamic> a;
      if(#2#0 is core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t3 = a = #2#0{core::List<dynamic>}.{core::List::sublist}(1){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L20:
  {
    final synthesized dynamic #3#0 = o;
    late final synthesized core::int #3#2 = (#3#0 as{Unchecked} core::List<dynamic>).{core::List::length}{core::int};
    {
      hoisted core::List<dynamic> a;
      if(#3#0 is core::List<dynamic> && #3#2.{core::num::>=}(#C1){(core::num) → core::bool} && (let final dynamic #t4 = a = #3#0{core::List<dynamic>}.{core::List::sublist}(0, #3#2.{core::num::-}(1){(core::num) → core::int}){(core::int, [core::int?]) → core::List<dynamic>} in true)) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L21:
  {
    final synthesized dynamic #4#0 = o;
    {
      if(#4#0 is core::List<dynamic> && #4#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #4#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L22:
  {
    final synthesized dynamic #5#0 = o;
    late final synthesized core::int #5#2 = (#5#0 as{Unchecked} core::List<dynamic>).{core::List::length}{core::int};
    {
      if(#5#0 is core::List<dynamic> && #5#2.{core::num::>=}(#C2){(core::num) → core::bool} && #C1 =={core::num::==}{(core::Object) → core::bool} #5#0{core::List<dynamic>}.{core::List::[]}(#5#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic}) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}
static method method5(dynamic o) → dynamic {
  #L23:
  {
    final synthesized dynamic #0#0 = o;
    {
      if(#0#0 is core::List<dynamic> && #0#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && #0#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L24:
  {
    final synthesized dynamic #1#0 = o;
    {
      if(#1#0 is core::List<dynamic> && #1#0{core::List<dynamic>}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C2 && #1#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is core::int && #1#0{core::List<dynamic>}.{core::List::[]}(1){(core::int) → dynamic} is core::String) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L25:
  {
    final synthesized dynamic #2#0 = o;
    {
      if(#2#0 is core::List<dynamic> && #2#0{core::List<dynamic>}.{core::List::length}{core::int}.{core::num::>=}(#C1){(core::num) → core::bool} && #2#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L26:
  {
    final synthesized dynamic #3#0 = o;
    late final synthesized core::int #3#2 = (#3#0 as{Unchecked} core::List<dynamic>).{core::List::length}{core::int};
    {
      if(#3#0 is core::List<dynamic> && #3#2.{core::num::>=}(#C1){(core::num) → core::bool} && #3#0{core::List<dynamic>}.{core::List::[]}(#3#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic} is core::String) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
  #L27:
  {
    final synthesized dynamic #4#0 = o;
    late final synthesized core::int #4#2 = (#4#0 as{Unchecked} core::List<dynamic>).{core::List::length}{core::int};
    {
      if(#4#0 is core::List<dynamic> && #4#2.{core::num::>=}(#C2){(core::num) → core::bool} && #4#0{core::List<dynamic>}.{core::List::[]}(0){(core::int) → dynamic} is core::String && #4#0{core::List<dynamic>}.{core::List::[]}(#4#2.{core::num::-}(1){(core::num) → core::int}){(core::int) → dynamic} is core::int) {
        {
          core::print(o{core::List<dynamic>});
        }
      }
    }
  }
}

constants  {
  #C1 = 1
  #C2 = 2
}
