JetFile: BinaryHeap.kt
  PACKAGE_DIRECTIVE
    <empty list>
  IMPORT_LIST
    <empty list>
  CLASS
    PsiElement(class)('class')
    PsiWhiteSpace(' ')
    PsiElement(IDENTIFIER)('BinaryHeap')
    TYPE_PARAMETER_LIST
      PsiElement(LT)('<')
      TYPE_PARAMETER
        PsiElement(IDENTIFIER)('T')
      PsiElement(GT)('>')
    PsiWhiteSpace(' ')
    PsiElement(COLON)(':')
    PsiWhiteSpace(' ')
    SUPER_TYPE_LIST
      SUPER_TYPE_ENTRY
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('IPriorityQueue')
            TYPE_ARGUMENT_LIST
              PsiElement(LT)('<')
              TYPE_PROJECTION
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('T')
              PsiElement(GT)('>')
    PsiWhiteSpace(' ')
    CLASS_BODY
      PsiElement(LBRACE)('{')
      PsiWhiteSpace('\n  ')
      PROPERTY
        MODIFIER_LIST
          PsiElement(private)('private')
        PsiWhiteSpace(' ')
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('data')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('IMutableList')
            TYPE_ARGUMENT_LIST
              PsiElement(LT)('<')
              TYPE_PROJECTION
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('T')
              PsiElement(GT)('>')
      PsiWhiteSpace('\n  ')
      PROPERTY
        MODIFIER_LIST
          PsiElement(private)('private')
        PsiWhiteSpace(' ')
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('compare')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Comparison')
            TYPE_ARGUMENT_LIST
              PsiElement(LT)('<')
              TYPE_PROJECTION
                TYPE_REFERENCE
                  USER_TYPE
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('T')
              PsiElement(GT)('>')
      PsiWhiteSpace('\n\n')
      PsiComment(EOL_COMMENT)('//  this(data : IIterable<T>, compare : Comparison<T> = naturalOrder<T>) {')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//    this.compare = compare')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//    this.data = ArrayList(data)')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('////    siftDown(* this.data.size / 2 .. 0)')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//    for (val i in data.size / 2 .. 0) {')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//      siftDown(i)')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//    }')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//')
      PsiWhiteSpace('\n')
      PsiComment(EOL_COMMENT)('//  }')
      PsiWhiteSpace('\n\n  ')
      PsiComment(EOL_COMMENT)('//this(compare : Comparison<T>) {')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//  this.compare = compare')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//  this.data = ArrayList()')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//}')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//this() {')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//  this.data = ArrayList()')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//  Assert(T is IComparable<T>)')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//  this.comparator = naturalOrder<T>')
      PsiWhiteSpace('\n  ')
      PsiComment(EOL_COMMENT)('//}')
      PsiWhiteSpace('\n\n  ')
      FUN
        MODIFIER_LIST
          PsiElement(override)('override')
        PsiWhiteSpace(' ')
        PsiElement(fun)('fun')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('extract')
        VALUE_PARAMETER_LIST
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('T')
        PsiWhiteSpace(' ')
        BLOCK
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          IF
            PsiElement(if)('if')
            PsiWhiteSpace(' ')
            PsiElement(LPAR)('(')
            CONDITION
              DOT_QUALIFIED_EXPRESSION
                THIS_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(this)('this')
                PsiElement(DOT)('.')
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('isEmpty')
            PsiElement(RPAR)(')')
            PsiWhiteSpace('\n      ')
            THEN
              THROW
                PsiElement(throw)('throw')
                PsiWhiteSpace(' ')
                CALL_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('UnderflowException')
                  VALUE_ARGUMENT_LIST
                    PsiElement(LPAR)('(')
                    PsiElement(RPAR)(')')
          PsiWhiteSpace('\n    ')
          DOT_QUALIFIED_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('data')
            PsiElement(DOT)('.')
            CALL_EXPRESSION
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('swap')
              VALUE_ARGUMENT_LIST
                PsiElement(LPAR)('(')
                VALUE_ARGUMENT
                  INTEGER_CONSTANT
                    PsiElement(INTEGER_LITERAL)('0')
                PsiElement(COMMA)(',')
                PsiWhiteSpace(' ')
                VALUE_ARGUMENT
                  DOT_QUALIFIED_EXPRESSION
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('data')
                    PsiElement(DOT)('.')
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('lastIndex')
                PsiElement(RPAR)(')')
          PsiWhiteSpace('\n    ')
          DOT_QUALIFIED_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('data')
            PsiElement(DOT)('.')
            CALL_EXPRESSION
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('remove')
              VALUE_ARGUMENT_LIST
                PsiElement(LPAR)('(')
                VALUE_ARGUMENT
                  DOT_QUALIFIED_EXPRESSION
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('data')
                    PsiElement(DOT)('.')
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('lastIndex')
                PsiElement(RPAR)(')')
          PsiWhiteSpace('\n    ')
          CALL_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('siftDown')
            VALUE_ARGUMENT_LIST
              PsiElement(LPAR)('(')
              VALUE_ARGUMENT
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('0')
              PsiElement(RPAR)(')')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
      PsiWhiteSpace('\n\n  ')
      FUN
        MODIFIER_LIST
          PsiElement(override)('override')
        PsiWhiteSpace(' ')
        PsiElement(fun)('fun')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('add')
        VALUE_PARAMETER_LIST
          PsiElement(LPAR)('(')
          VALUE_PARAMETER
            PsiElement(IDENTIFIER)('item')
            PsiWhiteSpace(' ')
            PsiElement(COLON)(':')
            PsiWhiteSpace(' ')
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('T')
          PsiElement(RPAR)(')')
        PsiWhiteSpace(' ')
        BLOCK
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          DOT_QUALIFIED_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('data')
            PsiElement(DOT)('.')
            CALL_EXPRESSION
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('add')
              VALUE_ARGUMENT_LIST
                PsiElement(LPAR)('(')
                VALUE_ARGUMENT
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('item')
                PsiElement(RPAR)(')')
          PsiWhiteSpace('\n    ')
          CALL_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('siftUp')
            VALUE_ARGUMENT_LIST
              PsiElement(LPAR)('(')
              VALUE_ARGUMENT
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('data')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('lastItem')
              PsiElement(RPAR)(')')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
      PsiWhiteSpace('\n\n  ')
      FUN
        MODIFIER_LIST
          PsiElement(private)('private')
        PsiWhiteSpace(' ')
        PsiElement(fun)('fun')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('siftDown')
        VALUE_PARAMETER_LIST
          PsiElement(LPAR)('(')
          VALUE_PARAMETER
            PsiElement(IDENTIFIER)('index')
            PsiWhiteSpace(' ')
            PsiElement(COLON)(':')
            PsiWhiteSpace(' ')
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('Int')
          PsiElement(RPAR)(')')
        PsiWhiteSpace(' ')
        BLOCK
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          PROPERTY
            PsiElement(var)('var')
            PsiWhiteSpace(' ')
            PsiElement(IDENTIFIER)('current')
            PsiWhiteSpace(' ')
            PsiElement(EQ)('=')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('index')
          PsiWhiteSpace('\n    ')
          WHILE
            PsiElement(while)('while')
            PsiWhiteSpace(' ')
            PsiElement(LPAR)('(')
            CONDITION
              DOT_QUALIFIED_EXPRESSION
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('current')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('left')
                PsiElement(DOT)('.')
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('exists')
            PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            BODY
              BLOCK
                PsiElement(LBRACE)('{')
                PsiWhiteSpace('\n      ')
                PROPERTY
                  PsiElement(var)('var')
                  PsiWhiteSpace(' ')
                  PsiElement(IDENTIFIER)('min')
                  PsiWhiteSpace(' ')
                  PsiElement(EQ)('=')
                  PsiWhiteSpace(' ')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('current')
                PsiWhiteSpace('\n      ')
                IF
                  PsiElement(if)('if')
                  PsiWhiteSpace(' ')
                  PsiElement(LPAR)('(')
                  CONDITION
                    BINARY_EXPRESSION
                      DOT_QUALIFIED_EXPRESSION
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('left')
                        PsiElement(DOT)('.')
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('value')
                      PsiWhiteSpace(' ')
                      OPERATION_REFERENCE
                        PsiElement(LT)('<')
                      PsiWhiteSpace(' ')
                      DOT_QUALIFIED_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('min')
                        PsiElement(DOT)('.')
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('value')
                  PsiElement(RPAR)(')')
                  PsiWhiteSpace(' ')
                  THEN
                    BLOCK
                      PsiElement(LBRACE)('{')
                      PsiWhiteSpace('\n        ')
                      BINARY_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('min')
                        PsiWhiteSpace(' ')
                        OPERATION_REFERENCE
                          PsiElement(EQ)('=')
                        PsiWhiteSpace(' ')
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('left')
                      PsiWhiteSpace('\n      ')
                      PsiElement(RBRACE)('}')
                PsiWhiteSpace('\n      ')
                IF
                  PsiElement(if)('if')
                  PsiWhiteSpace(' ')
                  PsiElement(LPAR)('(')
                  CONDITION
                    BINARY_EXPRESSION
                      DOT_QUALIFIED_EXPRESSION
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('right')
                        PsiElement(DOT)('.')
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('exists')
                      PsiWhiteSpace(' ')
                      OPERATION_REFERENCE
                        PsiElement(ANDAND)('&&')
                      PsiWhiteSpace(' ')
                      BINARY_EXPRESSION
                        DOT_QUALIFIED_EXPRESSION
                          DOT_QUALIFIED_EXPRESSION
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('current')
                            PsiElement(DOT)('.')
                            REFERENCE_EXPRESSION
                              PsiElement(IDENTIFIER)('right')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('value')
                        PsiWhiteSpace(' ')
                        OPERATION_REFERENCE
                          PsiElement(LT)('<')
                        PsiWhiteSpace(' ')
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('min')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('value')
                  PsiElement(RPAR)(')')
                  PsiWhiteSpace(' ')
                  THEN
                    BLOCK
                      PsiElement(LBRACE)('{')
                      PsiWhiteSpace('\n        ')
                      BINARY_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('min')
                        PsiWhiteSpace(' ')
                        OPERATION_REFERENCE
                          PsiElement(EQ)('=')
                        PsiWhiteSpace(' ')
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('right')
                      PsiWhiteSpace('\n      ')
                      PsiElement(RBRACE)('}')
                PsiWhiteSpace('\n      ')
                IF
                  PsiElement(if)('if')
                  PsiWhiteSpace(' ')
                  PsiElement(LPAR)('(')
                  CONDITION
                    BINARY_EXPRESSION
                      REFERENCE_EXPRESSION
                        PsiElement(IDENTIFIER)('min')
                      PsiWhiteSpace(' ')
                      OPERATION_REFERENCE
                        PsiElement(EQEQ)('==')
                      PsiWhiteSpace(' ')
                      REFERENCE_EXPRESSION
                        PsiElement(IDENTIFIER)('current')
                  PsiElement(RPAR)(')')
                  PsiWhiteSpace(' ')
                  THEN
                    BREAK
                      PsiElement(break)('break')
                PsiWhiteSpace('\n      ')
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('data')
                  PsiElement(DOT)('.')
                  CALL_EXPRESSION
                    REFERENCE_EXPRESSION
                      PsiElement(IDENTIFIER)('swap')
                    VALUE_ARGUMENT_LIST
                      PsiElement(LPAR)('(')
                      VALUE_ARGUMENT
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('min')
                      PsiElement(COMMA)(',')
                      PsiWhiteSpace(' ')
                      VALUE_ARGUMENT
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('current')
                      PsiElement(RPAR)(')')
                PsiWhiteSpace('\n      ')
                BINARY_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('current')
                  PsiWhiteSpace(' ')
                  OPERATION_REFERENCE
                    PsiElement(EQ)('=')
                  PsiWhiteSpace(' ')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('min')
                PsiWhiteSpace('\n    ')
                PsiElement(RBRACE)('}')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
      PsiWhiteSpace('\n\n  ')
      FUN
        MODIFIER_LIST
          PsiElement(private)('private')
        PsiWhiteSpace(' ')
        PsiElement(fun)('fun')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('siftUp')
        VALUE_PARAMETER_LIST
          PsiElement(LPAR)('(')
          VALUE_PARAMETER
            PsiElement(IDENTIFIER)('index')
            PsiWhiteSpace(' ')
            PsiElement(COLON)(':')
            PsiWhiteSpace(' ')
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('Int')
          PsiElement(RPAR)(')')
        PsiWhiteSpace(' ')
        BLOCK
          PsiElement(LBRACE)('{')
          PsiWhiteSpace('\n    ')
          IF
            PsiElement(if)('if')
            PsiWhiteSpace(' ')
            PsiElement(LPAR)('(')
            CONDITION
              PREFIX_EXPRESSION
                OPERATION_REFERENCE
                  PsiElement(EXCL)('!')
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('current')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('exists')
            PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            THEN
              RETURN
                PsiElement(return)('return')
          PsiWhiteSpace('\n    ')
          PROPERTY
            PsiElement(var)('var')
            PsiWhiteSpace(' ')
            PsiElement(IDENTIFIER)('current')
            PsiWhiteSpace(' ')
            PsiElement(EQ)('=')
            PsiWhiteSpace(' ')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('index')
          PsiWhiteSpace('\n    ')
          WHILE
            PsiElement(while)('while')
            PsiWhiteSpace(' ')
            PsiElement(LPAR)('(')
            CONDITION
              DOT_QUALIFIED_EXPRESSION
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('current')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('parent')
                PsiElement(DOT)('.')
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('exists')
            PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            BODY
              BLOCK
                PsiElement(LBRACE)('{')
                PsiWhiteSpace('\n      ')
                IF
                  PsiElement(if)('if')
                  PsiWhiteSpace(' ')
                  PsiElement(LPAR)('(')
                  CONDITION
                    BINARY_EXPRESSION
                      DOT_QUALIFIED_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('current')
                        PsiElement(DOT)('.')
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('value')
                      PsiWhiteSpace(' ')
                      OPERATION_REFERENCE
                        PsiElement(LT)('<')
                      PsiWhiteSpace(' ')
                      DOT_QUALIFIED_EXPRESSION
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('parent')
                        PsiElement(DOT)('.')
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('value')
                  PsiElement(RPAR)(')')
                  PsiWhiteSpace(' ')
                  THEN
                    BLOCK
                      PsiElement(LBRACE)('{')
                      PsiWhiteSpace('\n        ')
                      DOT_QUALIFIED_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('data')
                        PsiElement(DOT)('.')
                        CALL_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('swap')
                          VALUE_ARGUMENT_LIST
                            PsiElement(LPAR)('(')
                            VALUE_ARGUMENT
                              REFERENCE_EXPRESSION
                                PsiElement(IDENTIFIER)('current')
                            PsiElement(COMMA)(',')
                            PsiWhiteSpace(' ')
                            VALUE_ARGUMENT
                              DOT_QUALIFIED_EXPRESSION
                                REFERENCE_EXPRESSION
                                  PsiElement(IDENTIFIER)('current')
                                PsiElement(DOT)('.')
                                REFERENCE_EXPRESSION
                                  PsiElement(IDENTIFIER)('parent')
                            PsiElement(RPAR)(')')
                      PsiWhiteSpace('\n        ')
                      BINARY_EXPRESSION
                        REFERENCE_EXPRESSION
                          PsiElement(IDENTIFIER)('current')
                        PsiWhiteSpace(' ')
                        OPERATION_REFERENCE
                          PsiElement(EQ)('=')
                        PsiWhiteSpace(' ')
                        DOT_QUALIFIED_EXPRESSION
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('current')
                          PsiElement(DOT)('.')
                          REFERENCE_EXPRESSION
                            PsiElement(IDENTIFIER)('parent')
                      PsiWhiteSpace('\n      ')
                      PsiElement(RBRACE)('}')
                PsiWhiteSpace('\n    ')
                PsiElement(RBRACE)('}')
          PsiWhiteSpace('\n  ')
          PsiElement(RBRACE)('}')
      PsiWhiteSpace('\n\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('parent')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(get)('get')
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          BINARY_EXPRESSION
            PARENTHESIZED
              PsiElement(LPAR)('(')
              BINARY_EXPRESSION
                THIS_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(this)('this')
                PsiWhiteSpace(' ')
                OPERATION_REFERENCE
                  PsiElement(MINUS)('-')
                PsiWhiteSpace(' ')
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('1')
              PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            OPERATION_REFERENCE
              PsiElement(DIV)('/')
            PsiWhiteSpace(' ')
            INTEGER_CONSTANT
              PsiElement(INTEGER_LITERAL)('2')
      PsiWhiteSpace('\n\n\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('left')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(get)('get')
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          BINARY_EXPRESSION
            BINARY_EXPRESSION
              THIS_EXPRESSION
                REFERENCE_EXPRESSION
                  PsiElement(this)('this')
              PsiWhiteSpace(' ')
              OPERATION_REFERENCE
                PsiElement(MUL)('*')
              PsiWhiteSpace(' ')
              INTEGER_CONSTANT
                PsiElement(INTEGER_LITERAL)('2')
            PsiWhiteSpace(' ')
            OPERATION_REFERENCE
              PsiElement(PLUS)('+')
            PsiWhiteSpace(' ')
            INTEGER_CONSTANT
              PsiElement(INTEGER_LITERAL)('1')
      PsiWhiteSpace('\n\n\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('right')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(get)('get')
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          BINARY_EXPRESSION
            BINARY_EXPRESSION
              THIS_EXPRESSION
                REFERENCE_EXPRESSION
                  PsiElement(this)('this')
              PsiWhiteSpace(' ')
              OPERATION_REFERENCE
                PsiElement(MUL)('*')
              PsiWhiteSpace(' ')
              INTEGER_CONSTANT
                PsiElement(INTEGER_LITERAL)('2')
            PsiWhiteSpace(' ')
            OPERATION_REFERENCE
              PsiElement(PLUS)('+')
            PsiWhiteSpace(' ')
            INTEGER_CONSTANT
              PsiElement(INTEGER_LITERAL)('2')
      PsiWhiteSpace('\n\n\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('value')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('T')
        PsiWhiteSpace(' ')
        PsiElement(EQ)('=')
        PsiWhiteSpace(' ')
        DOT_QUALIFIED_EXPRESSION
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('foo')
          PsiElement(DOT)('.')
          CALL_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('bar')
            VALUE_ARGUMENT_LIST
              PsiElement(LPAR)('(')
              PsiElement(RPAR)(')')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(get)('get')
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          ARRAY_ACCESS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('data')
            INDICES
              PsiElement(LBRACKET)('[')
              THIS_EXPRESSION
                REFERENCE_EXPRESSION
                  PsiElement(this)('this')
              PsiElement(RBRACKET)(']')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(set)('set')
          PsiElement(LPAR)('(')
          VALUE_PARAMETER_LIST
            VALUE_PARAMETER
              PsiElement(IDENTIFIER)('it')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          BLOCK
            PsiElement(LBRACE)('{')
            PsiWhiteSpace('\n      ')
            BINARY_EXPRESSION
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('field')
              PsiWhiteSpace(' ')
              OPERATION_REFERENCE
                PsiElement(EQ)('=')
              PsiWhiteSpace(' ')
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('it')
            PsiWhiteSpace('\n    ')
            PsiElement(RBRACE)('}')
      PsiWhiteSpace('\n\n\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('exists')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Boolean')
        PsiWhiteSpace('\n    ')
        PROPERTY_ACCESSOR
          PsiElement(get)('get')
          PsiElement(LPAR)('(')
          PsiElement(RPAR)(')')
          PsiWhiteSpace(' ')
          PsiElement(EQ)('=')
          PsiWhiteSpace(' ')
          BINARY_EXPRESSION
            PARENTHESIZED
              PsiElement(LPAR)('(')
              BINARY_EXPRESSION
                THIS_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(this)('this')
                PsiWhiteSpace(' ')
                OPERATION_REFERENCE
                  PsiElement(LT)('<')
                PsiWhiteSpace(' ')
                DOT_QUALIFIED_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('data')
                  PsiElement(DOT)('.')
                  REFERENCE_EXPRESSION
                    PsiElement(IDENTIFIER)('size')
              PsiElement(RPAR)(')')
            PsiWhiteSpace(' ')
            OPERATION_REFERENCE
              PsiElement(ANDAND)('&&')
            PsiWhiteSpace(' ')
            PARENTHESIZED
              PsiElement(LPAR)('(')
              BINARY_EXPRESSION
                THIS_EXPRESSION
                  REFERENCE_EXPRESSION
                    PsiElement(this)('this')
                PsiWhiteSpace(' ')
                OPERATION_REFERENCE
                  PsiElement(GTEQ)('>=')
                PsiWhiteSpace(' ')
                INTEGER_CONSTANT
                  PsiElement(INTEGER_LITERAL)('0')
              PsiElement(RPAR)(')')
      PsiWhiteSpace('\n\n  ')
      FUN
        PsiElement(fun)('fun')
        PsiWhiteSpace(' ')
        TYPE_PARAMETER_LIST
          PsiElement(LT)('<')
          TYPE_PARAMETER
            PsiElement(IDENTIFIER)('T')
          PsiElement(GT)('>')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('T')
        PsiElement(DOT)('.')
        PsiElement(IDENTIFIER)('compareTo')
        VALUE_PARAMETER_LIST
          PsiElement(LPAR)('(')
          VALUE_PARAMETER
            PsiElement(IDENTIFIER)('other')
            PsiWhiteSpace(' ')
            PsiElement(COLON)(':')
            PsiWhiteSpace(' ')
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('T')
          PsiElement(RPAR)(')')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
        PsiWhiteSpace(' ')
        PsiElement(EQ)('=')
        PsiWhiteSpace(' ')
        CALL_EXPRESSION
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('compare')
          VALUE_ARGUMENT_LIST
            PsiElement(LPAR)('(')
            VALUE_ARGUMENT
              THIS_EXPRESSION
                REFERENCE_EXPRESSION
                  PsiElement(this)('this')
            PsiElement(COMMA)(',')
            PsiWhiteSpace(' ')
            VALUE_ARGUMENT
              REFERENCE_EXPRESSION
                PsiElement(IDENTIFIER)('other')
            PsiElement(RPAR)(')')
      PsiWhiteSpace('\n\n')
      PsiElement(RBRACE)('}')
  PsiWhiteSpace('\n\n')
  FUN
    PsiElement(fun)('fun')
    PsiWhiteSpace(' ')
    TYPE_REFERENCE
      USER_TYPE
        REFERENCE_EXPRESSION
          PsiElement(IDENTIFIER)('IMutableList')
        TYPE_ARGUMENT_LIST
          PsiElement(LT)('<')
          TYPE_PROJECTION
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('T')
          PsiElement(GT)('>')
    PsiElement(DOT)('.')
    PsiElement(IDENTIFIER)('swap')
    VALUE_PARAMETER_LIST
      PsiElement(LPAR)('(')
      VALUE_PARAMETER
        PsiElement(IDENTIFIER)('a')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
      PsiElement(COMMA)(',')
      PsiWhiteSpace(' ')
      VALUE_PARAMETER
        PsiElement(IDENTIFIER)('b')
        PsiWhiteSpace(' ')
        PsiElement(COLON)(':')
        PsiWhiteSpace(' ')
        TYPE_REFERENCE
          USER_TYPE
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('Int')
      PsiElement(RPAR)(')')
    PsiWhiteSpace(' ')
    BLOCK
      PsiElement(LBRACE)('{')
      PsiWhiteSpace('\n  ')
      PROPERTY
        PsiElement(val)('val')
        PsiWhiteSpace(' ')
        PsiElement(IDENTIFIER)('t')
        PsiWhiteSpace(' ')
        PsiElement(EQ)('=')
        PsiWhiteSpace(' ')
        ARRAY_ACCESS_EXPRESSION
          THIS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(this)('this')
          INDICES
            PsiElement(LBRACKET)('[')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('a')
            PsiElement(RBRACKET)(']')
      PsiWhiteSpace('\n  ')
      BINARY_EXPRESSION
        ARRAY_ACCESS_EXPRESSION
          THIS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(this)('this')
          INDICES
            PsiElement(LBRACKET)('[')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('a')
            PsiElement(RBRACKET)(']')
        PsiWhiteSpace(' ')
        OPERATION_REFERENCE
          PsiElement(EQ)('=')
        PsiWhiteSpace(' ')
        ARRAY_ACCESS_EXPRESSION
          THIS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(this)('this')
          INDICES
            PsiElement(LBRACKET)('[')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('b')
            PsiElement(RBRACKET)(']')
      PsiWhiteSpace('\n  ')
      BINARY_EXPRESSION
        ARRAY_ACCESS_EXPRESSION
          THIS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(this)('this')
          INDICES
            PsiElement(LBRACKET)('[')
            REFERENCE_EXPRESSION
              PsiElement(IDENTIFIER)('b')
            PsiElement(RBRACKET)(']')
        PsiWhiteSpace(' ')
        OPERATION_REFERENCE
          PsiElement(EQ)('=')
        PsiWhiteSpace(' ')
        REFERENCE_EXPRESSION
          PsiElement(IDENTIFIER)('t')
      PsiWhiteSpace('\n')
      PsiElement(RBRACE)('}')
  PsiWhiteSpace('\n\n')
  PROPERTY
    PsiElement(val)('val')
    PsiWhiteSpace(' ')
    TYPE_REFERENCE
      USER_TYPE
        REFERENCE_EXPRESSION
          PsiElement(IDENTIFIER)('IList')
        TYPE_ARGUMENT_LIST
          PsiElement(LT)('<')
          TYPE_PROJECTION
            TYPE_REFERENCE
              USER_TYPE
                REFERENCE_EXPRESSION
                  PsiElement(IDENTIFIER)('T')
          PsiElement(GT)('>')
    PsiElement(DOT)('.')
    PsiElement(IDENTIFIER)('lastIndex')
    PsiWhiteSpace(' ')
    PsiElement(COLON)(':')
    PsiWhiteSpace(' ')
    TYPE_REFERENCE
      USER_TYPE
        REFERENCE_EXPRESSION
          PsiElement(IDENTIFIER)('Int')
    PsiWhiteSpace('\n  ')
    PROPERTY_ACCESSOR
      PsiElement(get)('get')
      PsiElement(LPAR)('(')
      PsiElement(RPAR)(')')
      PsiWhiteSpace(' ')
      PsiElement(EQ)('=')
      PsiWhiteSpace(' ')
      BINARY_EXPRESSION
        DOT_QUALIFIED_EXPRESSION
          THIS_EXPRESSION
            REFERENCE_EXPRESSION
              PsiElement(this)('this')
          PsiElement(DOT)('.')
          REFERENCE_EXPRESSION
            PsiElement(IDENTIFIER)('size')
        PsiWhiteSpace(' ')
        OPERATION_REFERENCE
          PsiElement(MINUS)('-')
        PsiWhiteSpace(' ')
        INTEGER_CONSTANT
          PsiElement(INTEGER_LITERAL)('1')
