c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v1.0.6-b27-fcs
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// Any modifications to this file will be lost upon recompilation of the source schema.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// Generated on: 2012.06.11 at 10:34:16 AM PDT
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkpackage com.sun.identity.wsfederation.jaxb.entityconfig.impl.runtime;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport java.util.HashMap;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport java.util.HashSet;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport java.util.Iterator;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport java.util.Map;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport javax.xml.bind.ValidationEvent;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport javax.xml.bind.ValidationEventHandler;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport javax.xml.bind.helpers.NotIdentifiableEventImpl;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport javax.xml.bind.helpers.ValidationEventImpl;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport javax.xml.bind.helpers.ValidationEventLocatorImpl;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport org.xml.sax.SAXException;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport com.sun.xml.bind.ProxyGroup;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport com.sun.xml.bind.serializer.AbortSerializationException;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkimport com.sun.xml.bind.validator.Messages;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk/**
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Maintains information that needs to be stored across
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * validations of multiple objects.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Specifically, this object is responsible for:
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * <ol>
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * <li>detecting a cycle in a content tree by keeping track of
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * objects that were validated.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * <li>keeping an instance of NamespaceContextImpl, which is
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * shared by all MSVValidators.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk *
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * <li>keeping a reference to {@link ValidationErrorHandler}.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * MSVValidators should use this error handler to report any error.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * </ol>
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenkclass ValidationContext
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk{
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk final DefaultJAXBContextImpl jaxbContext;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /**
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * @param validateID
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * if true, ID/IDREF validation will be performed.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk ValidationContext( DefaultJAXBContextImpl _context, ValidationEventHandler _eventHandler, boolean validateID ) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk this.jaxbContext = _context;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk this.eventHandler = _eventHandler;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk this.validateID = validateID;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// detecting cycles.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /** Set of all validated objects. Used to detect a cycle. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final IdentityHashSet validatedObjects = new IdentityHashSet();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /**
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Validates the sub-tree rooted at <code>vo</code> and reports
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * any errors/warnings to the error handler.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public void validate( ValidatableObject vo ) throws SAXException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if( validatedObjects.add(ProxyGroup.unwrap(vo)) ) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // setup a new validator for this object and validate it.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk MSVValidator.validate(jaxbContext,this,vo);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk } else {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // this object has already been validated once.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk reportEvent( vo, Messages.format( Messages.CYCLE_DETECTED ) );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// Keeping track of namespace bindings.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /** namespace context. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final NamespaceContextImpl nsContext = new NamespaceContextImpl(null);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public NamespaceContextImpl getNamespaceContext() { return nsContext; }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// ID/IDREF validation
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /** ID/IDREF validation is done only when this flag is true. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final boolean validateID;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final HashSet IDs = new HashSet();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final HashMap IDREFs = new HashMap();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public String onID( XMLSerializable owner, String value ) throws SAXException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(!validateID) return value;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(!IDs.add(value)) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // this ID value has already been used.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk //reportEvent(Util.toValidatableObject(owner),
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // Messages.format(Messages.DUPLICATE_ID,value));
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk reportEvent(jaxbContext.getGrammarInfo().castToValidatableObject(owner),
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk Messages.format(Messages.DUPLICATE_ID,value));
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk return value;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public String onIDREF( XMLSerializable referer, String value ) throws SAXException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(!validateID) return value;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(IDs.contains(value))
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk return value; // this IDREF has the corresponding ID.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // remember the value to check the value later.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk IDREFs.put(value,referer);
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk return value;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /** Tests if all IDREFs have corresponding IDs. */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk protected void reconcileIDs() throws SAXException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(!validateID) return;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk for (Iterator itr = IDREFs.entrySet().iterator(); itr.hasNext();) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk Map.Entry e = (Map.Entry) itr.next();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(IDs.contains(e.getKey()))
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk continue; // OK.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // ID was not found.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk ValidatableObject source = (ValidatableObject)e.getValue();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk reportEvent(
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk source,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new NotIdentifiableEventImpl(
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk ValidationEvent.ERROR,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk Messages.format( Messages.ID_NOT_FOUND, e.getKey() ),
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new ValidationEventLocatorImpl( source ) ) );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk IDREFs.clear();
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk// Keeping track of ValidationErrorHandler
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk//
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk private final ValidationEventHandler eventHandler;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /**
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Reports an error to the application.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public void reportEvent(ValidatableObject source, String formattedMessage) throws AbortSerializationException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk reportEvent(
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk source,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new ValidationEventImpl( ValidationEvent.ERROR,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk formattedMessage,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new ValidationEventLocatorImpl(source) ) );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk /**
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * Reports an error to the client.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk * This version should be used when an exception is thrown from sub-modules.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk */
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public void reportEvent(ValidatableObject source, Exception nestedException ) throws AbortSerializationException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk reportEvent(
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk source,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new ValidationEventImpl( ValidationEvent.ERROR,
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk nestedException.toString(),
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk new ValidationEventLocatorImpl(source),
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk nestedException ) );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk public void reportEvent( ValidatableObject source, ValidationEvent event ) throws AbortSerializationException {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk boolean r;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk try {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk r = eventHandler.handleEvent( event );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk } catch( RuntimeException re ) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // if the client event handler causes a RuntimeException, then
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // we have to return false.
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk r = false;
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk if(!r) {
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk // throw an exception to abort validation
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk throw new AbortSerializationException( event.getMessage() );
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk }
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk
c1350cf5bc50458ba79cc93ff9e0e5fe3f1aeeb0jeff.schenk}