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

static method guard() → dynamic
  return true;
static method main() → dynamic {
  hoisted has-declared-initializer core::int a;
  {
    final synthesized core::List<core::int> #0#0 = <core::int>[5];
    if(!(#0#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t1 = a = #0#0.{core::List::[]}(0){(core::int) → core::int} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  core::int b;
  {
    final synthesized core::List<core::int> #2#0 = block {
      final core::List<core::int> #t2 = <core::int>[];
      {
        final synthesized core::int #1#0 = a;
        if(#1#0 =={core::num::==}{(core::Object) → core::bool} #C2 && self::guard() as{TypeError} core::bool)
          #t2.{core::List::add}{Invariant}(5){(core::int) → void};
      }
    } =>#t2;
    if(!(#2#0.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} #C1 && (let final dynamic #t3 = b = #2#0.{core::List::[]}(0){(core::int) → core::int} in true)))
      throw{for-error-handling} new core::StateError::•("Pattern matching error");
  }
  {
    final synthesized core::int #3#0 = a;
    if(#3#0 =={core::num::==}{(core::Object) → core::bool} #C2 && self::guard() as{TypeError} core::bool) {
      a = 6;
    }
  }
  core::int c = block {
    core::int #t4;
    final synthesized core::int #4#0 = a;
    #L1:
    {
      {
        hoisted core::int d;
        if(#4#0 is core::int && (let final dynamic #t5 = d = #4#0 in true) && self::guard() as{TypeError} core::bool) {
          #t4 = d;
          break #L1;
        }
      }
      {
        if(true) {
          #t4 = 0;
          break #L1;
        }
      }
    }
  } =>#t4;
  #L2:
  {
    final synthesized core::int #5#0 = b;
    {
      hoisted core::int e;
      if(#5#0 is core::int && (let final dynamic #t6 = e = #5#0 in true) && self::guard() as{TypeError} core::bool) {
        {
          core::print(a);
        }
      }
    }
  }
  core::Map<core::int, core::int> d = block {
    final core::Map<core::int, core::int> #t7 = <core::int, core::int>{};
    {
      final synthesized core::int #6#0 = a;
      if(#6#0 =={core::num::==}{(core::Object) → core::bool} #C2 && self::guard() as{TypeError} core::bool)
        #t7.{core::Map::[]=}{Invariant}(5, 6){(core::int, core::int) → void};
    }
  } =>#t7;
}

constants  {
  #C1 = 1
  #C2 = 5
}
