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

static method main() → dynamic {
  core::List<core::int*>* list1 = <core::int*>[0];
  core::List<core::num*>* list2 = <core::num*>[0];
  dynamic list3 = <core::int*>[0];
  core::List<core::int*>* list = block {
    final core::List<core::int*>* #t1 = <core::int*>[];
    #t1.{core::List::add}{Invariant}(0);
    for (final core::int* #t2 in list1)
      #t1.{core::List::add}{Invariant}(#t2);
    for (final dynamic #t3 in list2) {
      final core::int* #t4 = #t3 as{TypeError} core::int*;
      #t1.{core::List::add}{Invariant}(#t4);
    }
    for (final dynamic #t5 in list3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t6 = #t5 as{TypeError} core::int*;
      #t1.{core::List::add}{Invariant}(#t6);
    }
    if(true)
      #t1.{core::List::add}{Invariant}(2);
  } =>#t1;
  core::Set<core::int*>* set1 = block {
    final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>();
    #t7.{core::Set::add}{Invariant}(0);
  } =>#t7;
  core::Set<core::num*>* set2 = block {
    final core::Set<core::num*>* #t8 = col::LinkedHashSet::•<core::num*>();
    #t8.{core::Set::add}{Invariant}(0);
  } =>#t8;
  dynamic set3 = block {
    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
    #t9.{core::Set::add}{Invariant}(0);
  } =>#t9;
  core::Set<core::int*>* set = block {
    final core::Set<core::int*>* #t10 = col::LinkedHashSet::•<core::int*>();
    #t10.{core::Set::add}{Invariant}(0);
    for (final core::int* #t11 in set1)
      #t10.{core::Set::add}{Invariant}(#t11);
    for (final dynamic #t12 in set2) {
      final core::int* #t13 = #t12 as{TypeError} core::int*;
      #t10.{core::Set::add}{Invariant}(#t13);
    }
    for (final dynamic #t14 in set3 as{TypeError,ForDynamic} core::Iterable<dynamic>*) {
      final core::int* #t15 = #t14 as{TypeError} core::int*;
      #t10.{core::Set::add}{Invariant}(#t15);
    }
    if(true)
      #t10.{core::Set::add}{Invariant}(2);
  } =>#t10;
  core::Map<core::int*, core::String*>* map1 = <core::int*, core::String*>{0: "foo"};
  core::Map<core::num*, core::Object*>* map2 = <core::num*, core::Object*>{0: "bar"};
  dynamic map3 = <core::int*, core::String*>{0: "baz"};
  core::Map<core::int*, core::String*>* map = block {
    final core::Map<core::int*, core::String*>* #t16 = <core::int*, core::String*>{};
    #t16.{core::Map::[]=}{Invariant}(0, "foo");
    for (final core::MapEntry<core::int*, core::String*>* #t17 in map1.{core::Map::entries})
      #t16.{core::Map::[]=}{Invariant}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
    for (final core::MapEntry<dynamic, dynamic>* #t18 in map2.{core::Map::entries}) {
      final core::int* #t19 = #t18.{core::MapEntry::key} as{TypeError} core::int*;
      final core::String* #t20 = #t18.{core::MapEntry::value} as{TypeError} core::String*;
      #t16.{core::Map::[]=}{Invariant}(#t19, #t20);
    }
    for (final core::MapEntry<dynamic, dynamic>* #t21 in (map3 as{TypeError,ForDynamic} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
      final core::int* #t22 = #t21.{core::MapEntry::key} as{TypeError} core::int*;
      final core::String* #t23 = #t21.{core::MapEntry::value} as{TypeError} core::String*;
      #t16.{core::Map::[]=}{Invariant}(#t22, #t23);
    }
    if(true)
      #t16.{core::Map::[]=}{Invariant}(2, "baz");
  } =>#t16;
}
