org_aspectj_tools_ant_taskdefs_Ajc11CompilerAdapterTest_java
org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend
@Override
    public TypeBinding resolveType(BlockScope scope) {
        ReferenceContext referenceContext;
        TypeBinding returnType;
        TypeBinding methodType;
        if (this.constant != Constant.NotAConstant) {
            int i;
            TypeBinding resolvedType2;
            this.constant = Constant.NotAConstant;
            long sourceLevel = scope.compilerOptions().sourceLevel;
            boolean receiverCast = false;
            if (this.receiver instanceof CastExpression) {
                this.receiver.bits |= 0x20;
                receiverCast = true;
            }
            this.actualReceiverType = this.receiver.resolveType(scope);
            if (this.actualReceiverType instanceof InferenceVariable) {
                return null;
            }
            this.receiverIsType = this.receiver.isType();
            if (receiverCast && this.actualReceiverType != null && TypeBinding.equalsEquals(resolvedType2 = ((CastExpression)this.receiver).expression.resolvedType, this.actualReceiverType) && (!scope.environment().usesNullTypeAnnotations() || !NullAnnotationMatching.analyse(this.actualReceiverType, resolvedType2, -1).isAnyMismatch())) {
                scope.problemReporter().unnecessaryCast((CastExpression)this.receiver);
            }
            if (this.typeArguments != null) {
                int length = this.typeArguments.length;
                this.argumentsHaveErrors = sourceLevel < 0x310000L;
                this.genericTypeArguments = new TypeBinding[length];
                i = 0;
                while (i < length) {
                    TypeReference typeReference = this.typeArguments[i];
                    this.genericTypeArguments[i] = typeReference.resolveType(scope, true, 64);
                    if (this.genericTypeArguments[i] == null) {
                        this.argumentsHaveErrors = true;
                    }
                    if (this.argumentsHaveErrors && typeReference instanceof Wildcard) {
                        scope.problemReporter().illegalUsageOfWildcard(typeReference);
                    }
                    ++i;
                }
                if (this.argumentsHaveErrors) {
                    if (this.arguments != null) {
                        i = 0;
                        int max = this.arguments.length;
                        while (i < max) {
                            this.arguments[i].resolveType(scope);
                            ++i;
                        }
                    }
                    return null;
                }
            }
            if (this.arguments != null) {
                this.argumentsHaveErrors = false;
                int length = this.arguments.length;
                this.argumentTypes = new TypeBinding[length];
                i = 0;
                while (i < length) {
                    Expression argument = this.arguments[i];
                    if (this.arguments[i].resolvedType != null) {
                        scope.problemReporter().genericInferenceError("Argument was unexpectedly found resolved", this);
                    }
                    if (argument instanceof CastExpression) {
                        argument.bits |= 0x20;
                        this.argsContainCast = true;
                    }
                    argument.setExpressionContext(ExpressionContext.INVOCATION_CONTEXT);
                    this.argumentTypes[i] = argument.resolveType(scope);
                    if (this.argumentTypes[i] == null) {
                        this.argumentsHaveErrors = true;
                    }
                    ++i;
                }
                if (this.argumentsHaveErrors) {
                    if (this.actualReceiverType instanceof ReferenceBinding) {
                        MethodBinding closestMatch;
                        TypeBinding[] pseudoArgs = new TypeBinding[length];
                        int i2 = length;
                        while (--i2 >= 0) {
                            TypeBinding typeBinding = pseudoArgs[i2] = this.argumentTypes[i2] == null ? TypeBinding.NULL : this.argumentTypes[i2];
                        }
                        MethodBinding methodBinding = this.binding = this.receiver.isImplicitThis() ? scope.getImplicitMethod(this.selector, pseudoArgs, this) : scope.findMethod((ReferenceBinding)this.actualReceiverType, this.selector, pseudoArgs, this, false);
                        if (this.binding != null && !this.binding.isValidBinding() && (closestMatch = ((ProblemMethodBinding)this.binding).closestMatch) != null) {
                            if (closestMatch.original().typeVariables != Binding.NO_TYPE_VARIABLES) {
                                closestMatch = scope.environment().createParameterizedGenericMethod(closestMatch.original(), (RawTypeBinding)null);
                            }
                            this.binding = closestMatch;
                            MethodBinding closestMatchOriginal = closestMatch.original();
                            if (closestMatchOriginal.isOrEnclosedByPrivateType() && !scope.isDefinedInMethod(closestMatchOriginal)) {
                                closestMatchOriginal.modifiers |= 0x8000000;
                            }
                        }
                    }
                    return null;
                }
            }
            if (this.actualReceiverType == null) {
                return null;
            }
            if (this.actualReceiverType.isBaseType()) {
                scope.problemReporter().errorNoMethodFor(this, this.actualReceiverType, this.argumentTypes);
                return null;
            }
        }
        if ((methodType = this.findMethodBinding(scope)) != null && methodType.isPolyType()) {
            this.resolvedType = this.binding.returnType.capture(scope, this.sourceStart, this.sourceEnd);
            return methodType;
        }
        if (!this.binding.isValidBinding()) {
            MethodBinding methodBinding;
            ReferenceBinding declaringClass;
            boolean avoidSecondary;
            MethodBinding methodBinding2 = this.binding;
            if ((ReferenceBinding)MessageSend.declaringClass_aroundBody15$advice(this, methodBinding2, OwningClassSupportForMethodBindings.aspectOf(), methodBinding2, null) == null) {
                if (this.actualReceiverType instanceof ReferenceBinding) {
                    this.binding.declaringClass = (ReferenceBinding)this.actualReceiverType;
                } else {
                    scope.problemReporter().errorNoMethodFor(this, this.actualReceiverType, this.argumentTypes);
                    return null;
                }
            }
            boolean bl = avoidSecondary = (declaringClass = (ReferenceBinding)MessageSend.declaringClass_aroundBody17$advice(this, methodBinding = this.binding, OwningClassSupportForMethodBindings.aspectOf(), methodBinding, null)) != null && declaringClass.isAnonymousType() && declaringClass.superclass() instanceof MissingTypeBinding;
            if (!avoidSecondary) {
                scope.problemReporter().invalidMethod(this, this.binding, scope);
            }
            MethodBinding closestMatch = ((ProblemMethodBinding)this.binding).closestMatch;
            switch (this.binding.problemId()) {
                case 3: {
                    break;
                }
                case 23: 
                case 27: {
                    if (this.expressionContext != ExpressionContext.INVOCATION_CONTEXT) break;
                }
                case 2: 
                case 6: 
                case 7: 
                case 8: 
                case 10: {
                    if (closestMatch == null) break;
                    this.resolvedType = closestMatch.returnType;
                    break;
                }
                case 25: {
                    if (closestMatch == null || closestMatch.returnType == null) break;
                    this.resolvedType = closestMatch.returnType.withoutToplevelNullAnnotation();
                }
            }
            if (closestMatch != null) {
                this.binding = closestMatch;
                MethodBinding closestMatchOriginal = closestMatch.original();
                if (closestMatchOriginal.isOrEnclosedByPrivateType() && !scope.isDefinedInMethod(closestMatchOriginal)) {
                    closestMatchOriginal.modifiers |= 0x8000000;
                }
            }
            return this.resolvedType != null && (this.resolvedType.tagBits & 0x80L) == 0L ? this.resolvedType : null;
        }
        CompilerOptions compilerOptions = scope.compilerOptions();
        if (compilerOptions.complianceLevel <= 0x320000L && this.binding.isPolymorphic()) {
            scope.problemReporter().polymorphicMethodNotBelow17(this);
            return null;
        }
        if (compilerOptions.isAnnotationBasedNullAnalysisEnabled) {
            ImplicitNullAnnotationVerifier.ensureNullnessIsKnown(this.binding, scope);
            if (compilerOptions.sourceLevel >= 0x340000L && this.binding instanceof ParameterizedGenericMethodBinding && this.typeArguments != null) {
                TypeBinding[] typeVariables = this.binding.original().typeVariables();
                int i = 0;
                while (i < this.typeArguments.length) {
                    this.typeArguments[i].checkNullConstraints(scope, (ParameterizedGenericMethodBinding)this.binding, typeVariables, i);
                    ++i;
                }
            }
        }
        if ((this.bits & 0x100000) != 0 && this.binding.isPolymorphic()) {
            this.binding = scope.environment().updatePolymorphicMethodReturnType((PolymorphicMethodBinding)this.binding, TypeBinding.VOID);
        }
        if ((this.binding.tagBits & 0x80L) != 0L) {
            scope.problemReporter().missingTypeInMethod(this, this.binding);
        }
        if (!this.binding.isStatic()) {
            if (this.receiverIsType) {
                scope.problemReporter().mustUseAStaticMethod(this, this.binding);
                if (this.actualReceiverType.isRawType() && (this.receiver.bits & 0x40000000) == 0 && compilerOptions.getSeverity(0x20010000) != 256) {
                    scope.problemReporter().rawTypeReference(this.receiver, this.actualReceiverType);
                }
            } else {
                TypeBinding oldReceiverType = this.actualReceiverType;
                MethodBinding methodBinding = this.binding;
                this.actualReceiverType = this.actualReceiverType.getErasureCompatibleType((ReferenceBinding)MessageSend.declaringClass_aroundBody19$advice(this, methodBinding, OwningClassSupportForMethodBindings.aspectOf(), methodBinding, null));
                this.receiver.computeConversion(scope, this.actualReceiverType, this.actualReceiverType);
                if (TypeBinding.notEquals(this.actualReceiverType, oldReceiverType) && TypeBinding.notEquals(this.receiver.postConversionType(scope), this.actualReceiverType)) {
                    this.bits |= 0x40000;
                }
            }
        } else {
            MethodBinding methodBinding;
            MethodBinding methodBinding3;
            MethodBinding methodBinding4 = this.binding;
            if (((ReferenceBinding)MessageSend.declaringClass_aroundBody21$advice(this, methodBinding4, OwningClassSupportForMethodBindings.aspectOf(), methodBinding4, null)).isInterface() && (!this.isTypeAccess() && !this.receiver.isImplicitThis() || !TypeBinding.equalsEquals((ReferenceBinding)MessageSend.declaringClass_aroundBody23$advice(this, methodBinding3 = this.binding, OwningClassSupportForMethodBindings.aspectOf(), methodBinding3, null), this.actualReceiverType))) {
                scope.problemReporter().nonStaticOrAlienTypeReceiver(this, this.binding);
            } else if (!(this.receiver.isImplicitThis() || this.receiver.isSuper() || this.receiverIsType)) {
                scope.problemReporter().nonStaticAccessToStaticMethod(this, this.binding);
            }
            if (!this.receiver.isImplicitThis() && TypeBinding.notEquals((ReferenceBinding)MessageSend.declaringClass_aroundBody25$advice(this, methodBinding = this.binding, OwningClassSupportForMethodBindings.aspectOf(), methodBinding, null), this.actualReceiverType)) {
                scope.problemReporter().indirectAccessToStaticMethod(this, this.binding);
            }
        }
        if (MessageSend.checkInvocationArguments(scope, this.receiver, this.actualReceiverType, this.binding, this.arguments, this.argumentTypes, this.argsContainCast, this)) {
            this.bits |= 0x10000;
        }
        if (this.binding.isAbstract() && this.receiver.isSuper()) {
            scope.problemReporter().cannotDireclyInvokeAbstractMethod(this, this.binding);
        }
        if (this.isMethodUseDeprecated(this.binding, scope, true, this)) {
            scope.problemReporter().deprecatedMethod(this.binding, this);
        }
        if ((this.bits & 0x10000) != 0 && this.genericTypeArguments == null) {
            returnType = this.binding.returnType;
            if (returnType != null) {
                returnType = scope.environment().convertToRawType(returnType.erasure(), true);
            }
        } else {
            returnType = this.binding.returnType;
            if (returnType != null) {
                returnType = returnType.capture(scope, this.sourceStart, this.sourceEnd);
            }
        }
        this.resolvedType = returnType;
        if (this.receiver.isSuper() && compilerOptions.getSeverity(0x20100000) != 256 && (referenceContext = scope.methodScope().referenceContext) instanceof AbstractMethodDeclaration) {
            AbstractMethodDeclaration abstractMethodDeclaration = (AbstractMethodDeclaration)referenceContext;
            MethodBinding enclosingMethodBinding = abstractMethodDeclaration.binding;
            if (enclosingMethodBinding.isOverriding() && CharOperation.equals(this.binding.selector, enclosingMethodBinding.selector) && this.binding.areParametersEqual(enclosingMethodBinding)) {
                abstractMethodDeclaration.bits |= 0x10;
            }
        }
        if (this.receiver.isSuper() && this.actualReceiverType.isInterface()) {
            scope.checkAppropriateMethodAgainstSupers(this.selector, this.binding, this.argumentTypes, this);
        }
        if (this.typeArguments != null && this.binding.original().typeVariables == Binding.NO_TYPE_VARIABLES) {
            scope.problemReporter().unnecessaryTypeArgumentsForMethodInvocation(this.binding, this.genericTypeArguments, this.typeArguments);
        }
        return (this.resolvedType.tagBits & 0x80L) == 0L ? this.resolvedType : null;
    }
 -> java.util.Arrays.equals(char[],char[]): boolean -> java.lang.Object.hashCode(): int -> java.util.LinkedHashSet.add(java.lang.Object): boolean -> java.lang.Math.min(int,int): int -> java.lang.Math.min(int,int): int -> java.lang.Math.min(int,int): int -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.hashCode(char[]): int -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.HashMap.get(java.lang.Object): java.lang.Object -> java.util.Arrays.hashCode(char[]): int -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.hashCode(char[]): int -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean
 [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] -> java.lang.Object.hashCode(): int [EXIT] [EXIT] -> java.util.LinkedHashSet.add(java.lang.Object): boolean [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] -> java.lang.Math.min(int,int): int [EXIT] [CALL] -> java.lang.Math.min(int,int): int [EXIT] [CALL] -> java.lang.Math.min(int,int): int [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.hashCode(char[]): int [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] -> java.util.HashMap.get(java.lang.Object): java.lang.Object [CALL] -> java.util.Arrays.hashCode(char[]): int [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.hashCode(char[]): int [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT]