Java 类org.eclipse.xtext.util.PolymorphicDispatcher 实例源码

项目:xtext-core    文件:AbstractDeclarativeScopeProvider.java   
protected IScope polymorphicFindScopeForReferenceName(EObject context, EReference reference) {
    Predicate<Method> predicate = getPredicate(context, reference);
    PolymorphicDispatcher<IScope> dispatcher = new PolymorphicDispatcher<IScope>(Collections
            .singletonList(this), predicate, errorHandler) {
        @Override
        protected IScope handleNoSuchMethod(Object... params) {
            if (PolymorphicDispatcher.NullErrorHandler.class.equals(errorHandler.getClass()))
                return null;
            return super.handleNoSuchMethod(params);
        }
    };
    EObject current = context;
    IScope scope = null;
    while (scope == null && current != null) {
        scope = dispatcher.invoke(current, reference);
        current = current.eContainer();
    }
    return scope;
}
项目:bts    文件:AbstractJavaBasedContentProposalProvider.java   
protected void invokeMethod(String methodName, ICompletionProposalAcceptor acceptor, Object... params) {
    PolymorphicDispatcher<Void> dispatcher = dispatchers.get(methodName);
    if (dispatcher == null) {
        ErrorHandler<Void> errorHandler = WarningErrorHandler.get(log);
        dispatcher = new PolymorphicDispatcher<Void>(methodName, params.length + 1, params.length + 1,
                Collections.singletonList(this), errorHandler) {
            @Override
            public Class<?> getDefaultClass(int paramIndex) {
                if (paramIndex == 0)
                    return EObject.class;
                return super.getDefaultClass(paramIndex);
            }
        };
        dispatchers.put(methodName, dispatcher);
    }
    Object[] paramAsArray = new Object[params.length + 1];
    System.arraycopy(params, 0, paramAsArray, 0, params.length);
    paramAsArray[params.length] = acceptor;
    if (handledArguments.add(Lists.asList(methodName, paramAsArray))) {
        dispatcher.invoke(paramAsArray);
    }
}
项目:pokemon-tcgo-deck-generator    文件:PartialPkmntcgoContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:n4js    文件:N4JSInjectorProvider.java   
@Override
public Injector getInjector() {
    if (injector == null) {
        stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
        try {
            this.injector = internalCreateInjector();

        } catch (Throwable e) {
            // #############################################################################
            // IDE-2514: Temporarily exists on exception due to PolymorphicDispatcher problem
            boolean polymorphicDispatchProblem = false;
            if (e.getMessage().contains("Comparison method violates its general contract!")) {
                String pdName = PolymorphicDispatcher.class.getName();
                for (StackTraceElement ste : e.getStackTrace()) {
                    String steName = ste.toString();
                    if (steName.contains(pdName)) {
                        polymorphicDispatchProblem = true;
                    }
                }
            }

            if (polymorphicDispatchProblem) {
                String msg = "Comparison method violates its general contract!\n\t";
                msg += "at org.eclipse.n4js.N4JSInjectorProvider.getInjector(N4JSInjectorProvider.java:90)\\n\\t";
                msg += "Reason might be the PolymorphicDispatcher";
                msg += "Exit.";
                System.err.println(msg);
                System.exit(-1);
            } else {
                throw e;
            }
            // Fail fast End
            // #############################################################################
        }
        stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
    }
    return injector;
}
项目:n4js    文件:PartialN4JSContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:n4js    文件:PartialRegularExpressionContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:n4js    文件:PartialN4MFContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:n4js    文件:PartialTypesContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:DocIT    文件:PartialIOIContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:Xtext_Xtend_HTML_Generator    文件:PartialMyDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:bromium    文件:PartialBromiumContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:gw4e.project    文件:PartialDSLPoliciesContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:lcdsl    文件:PartialLcDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:gemoc-studio    文件:PartialDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:gemoc-studio    文件:PartialGExpressionsContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:org.xtext.dsl.restaurante    文件:PartialRestauranteContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:OCCI-Studio    文件:PartialOCCIContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:SurveyDSL    文件:PartialQueryITContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:jason-eclipse-plugin    文件:PartialMas2jContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:jason-eclipse-plugin    文件:PartialAslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-extras    文件:PartialPureXbaseContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:M2Doc    文件:PartialMyDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:minitl    文件:PartialMinitlContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:AbstractDeclarativeScopeProvider.java   
protected IScope polymorphicFindScopeForClassName(EObject context, EReference reference) {
    IScope scope = null;
    PolymorphicDispatcher<IScope> dispatcher = new PolymorphicDispatcher<IScope>(
            Collections.singletonList(this), 
            getPredicate(context, reference.getEReferenceType()),
            errorHandler) {
        @Override
        protected IScope handleNoSuchMethod(Object... params) {
            if (PolymorphicDispatcher.NullErrorHandler.class.equals(errorHandler.getClass()))
                return null;
            return super.handleNoSuchMethod(params);
        }
    };
    EObject current = context;
    while (scope == null && current != null) {
        scope = dispatcher.invoke(current, reference);
        current = current.eContainer();
    }
    current = context;
    while (scope == null && current != null) {
        scope = dispatcher.invoke(current, reference.getEReferenceType());
        if (scope!=null)
            logger.warn("scope_<EClass>(EObject,EClass) is deprecated. Use scope_<EClass>(EObject,EReference) instead.");
        current = current.eContainer();
    }
    return scope;
}
项目:xtext-core    文件:PartialTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialPartialContentAssistTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialIndentationAwareUiTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialPartialSerializationTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialXtextContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialFileAwareTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialXtextGrammarTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:xtext-core    文件:PartialNoJdtTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:Sparrow    文件:PartialModelEditorContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:dsl-devkit    文件:PartialTestLanguageContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:dsl-devkit    文件:PartialCheckContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:dsl-devkit    文件:PartialCheckCfgContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:bts    文件:PartialEgyDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:scribble-eclipse    文件:PartialScribbleDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:scribble-eclipse    文件:PartialScribbleTraceDslContentAssistParser.java   
@Override
protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
    if (rule == null || rule.eIsProxy())
        return Collections.emptyList();
    String methodName = "entryRule" + rule.getName();
    PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
        new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
    dispatcher.invoke();
    return parser.getFollowElements();
}
项目:statecharts    文件:JavaOperationMockup.java   
public Object execute(Operation definition, Object[] parameter) {
    PolymorphicDispatcher<Object> dispatcher = new PolymorphicDispatcher<Object>(definition.getName(), definition
            .getParameters().size(), definition.getParameters().size(), callbacks);
    try {
        return dispatcher.invoke(parameter);
    } catch (Exception ex) {
        throw new WrappedException("Error during invocation of operation '" + definition.getName()
                + "' with params " + definition.getParameters() + " '", ex);
    }
}