
/**
 * AmazonEC2MessageReceiverInOut.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.5.6  Built on : Aug 30, 2011 (10:00:16 CEST)
 */
        package com.amazon.ec2;

        /**
        *  AmazonEC2MessageReceiverInOut message receiver
        */

        public class AmazonEC2MessageReceiverInOut extends org.apache.axis2.receivers.AbstractInOutMessageReceiver{


        public void invokeBusinessLogic(org.apache.axis2.context.MessageContext msgContext, org.apache.axis2.context.MessageContext newMsgContext)
        throws org.apache.axis2.AxisFault{

        try {

        // get the implementation class for the Web Service
        Object obj = getTheImplementationObject(msgContext);

        AmazonEC2SkeletonInterface skel = (AmazonEC2SkeletonInterface)obj;
        //Out Envelop
        org.apache.axiom.soap.SOAPEnvelope envelope = null;
        //Find the axisOperation that has been set by the Dispatch phase.
        org.apache.axis2.description.AxisOperation op = msgContext.getOperationContext().getAxisOperation();
        if (op == null) {
        throw new org.apache.axis2.AxisFault("Operation is not located, if this is doclit style the SOAP-ACTION should specified via the SOAP Action to use the RawXMLProvider");
        }

        java.lang.String methodName;
        if((op.getName() != null) && ((methodName = org.apache.axis2.util.JavaUtils.xmlNameToJavaIdentifier(op.getName().getLocalPart())) != null)){

        

            if("describePlacementGroups".equals(methodName)){
                
                com.amazon.ec2.DescribePlacementGroupsResponse describePlacementGroupsResponse289 = null;
	                        com.amazon.ec2.DescribePlacementGroups wrappedParam =
                                                             (com.amazon.ec2.DescribePlacementGroups)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribePlacementGroups.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describePlacementGroupsResponse289 =
                                                   
                                                   
                                                         skel.describePlacementGroups(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describePlacementGroupsResponse289, false);
                                    } else 

            if("createSecurityGroup".equals(methodName)){
                
                com.amazon.ec2.CreateSecurityGroupResponse createSecurityGroupResponse291 = null;
	                        com.amazon.ec2.CreateSecurityGroup wrappedParam =
                                                             (com.amazon.ec2.CreateSecurityGroup)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateSecurityGroup.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createSecurityGroupResponse291 =
                                                   
                                                   
                                                         skel.createSecurityGroup(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createSecurityGroupResponse291, false);
                                    } else 

            if("resetNetworkInterfaceAttribute".equals(methodName)){
                
                com.amazon.ec2.ResetNetworkInterfaceAttributeResponse resetNetworkInterfaceAttributeResponse293 = null;
	                        com.amazon.ec2.ResetNetworkInterfaceAttribute wrappedParam =
                                                             (com.amazon.ec2.ResetNetworkInterfaceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ResetNetworkInterfaceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               resetNetworkInterfaceAttributeResponse293 =
                                                   
                                                   
                                                         skel.resetNetworkInterfaceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), resetNetworkInterfaceAttributeResponse293, false);
                                    } else 

            if("createDhcpOptions".equals(methodName)){
                
                com.amazon.ec2.CreateDhcpOptionsResponse createDhcpOptionsResponse295 = null;
	                        com.amazon.ec2.CreateDhcpOptions wrappedParam =
                                                             (com.amazon.ec2.CreateDhcpOptions)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateDhcpOptions.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createDhcpOptionsResponse295 =
                                                   
                                                   
                                                         skel.createDhcpOptions(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createDhcpOptionsResponse295, false);
                                    } else 

            if("createRouteTable".equals(methodName)){
                
                com.amazon.ec2.CreateRouteTableResponse createRouteTableResponse297 = null;
	                        com.amazon.ec2.CreateRouteTable wrappedParam =
                                                             (com.amazon.ec2.CreateRouteTable)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateRouteTable.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createRouteTableResponse297 =
                                                   
                                                   
                                                         skel.createRouteTable(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createRouteTableResponse297, false);
                                    } else 

            if("describeSubnets".equals(methodName)){
                
                com.amazon.ec2.DescribeSubnetsResponse describeSubnetsResponse299 = null;
	                        com.amazon.ec2.DescribeSubnets wrappedParam =
                                                             (com.amazon.ec2.DescribeSubnets)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSubnets.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSubnetsResponse299 =
                                                   
                                                   
                                                         skel.describeSubnets(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSubnetsResponse299, false);
                                    } else 

            if("deactivateLicense".equals(methodName)){
                
                com.amazon.ec2.DeactivateLicenseResponse deactivateLicenseResponse301 = null;
	                        com.amazon.ec2.DeactivateLicense wrappedParam =
                                                             (com.amazon.ec2.DeactivateLicense)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeactivateLicense.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deactivateLicenseResponse301 =
                                                   
                                                   
                                                         skel.deactivateLicense(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deactivateLicenseResponse301, false);
                                    } else 

            if("deleteVpc".equals(methodName)){
                
                com.amazon.ec2.DeleteVpcResponse deleteVpcResponse303 = null;
	                        com.amazon.ec2.DeleteVpc wrappedParam =
                                                             (com.amazon.ec2.DeleteVpc)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteVpc.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteVpcResponse303 =
                                                   
                                                   
                                                         skel.deleteVpc(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteVpcResponse303, false);
                                    } else 

            if("cancelSpotInstanceRequests".equals(methodName)){
                
                com.amazon.ec2.CancelSpotInstanceRequestsResponse cancelSpotInstanceRequestsResponse305 = null;
	                        com.amazon.ec2.CancelSpotInstanceRequests wrappedParam =
                                                             (com.amazon.ec2.CancelSpotInstanceRequests)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CancelSpotInstanceRequests.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               cancelSpotInstanceRequestsResponse305 =
                                                   
                                                   
                                                         skel.cancelSpotInstanceRequests(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), cancelSpotInstanceRequestsResponse305, false);
                                    } else 

            if("createSubnet".equals(methodName)){
                
                com.amazon.ec2.CreateSubnetResponse createSubnetResponse307 = null;
	                        com.amazon.ec2.CreateSubnet wrappedParam =
                                                             (com.amazon.ec2.CreateSubnet)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateSubnet.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createSubnetResponse307 =
                                                   
                                                   
                                                         skel.createSubnet(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createSubnetResponse307, false);
                                    } else 

            if("deleteVpnGateway".equals(methodName)){
                
                com.amazon.ec2.DeleteVpnGatewayResponse deleteVpnGatewayResponse309 = null;
	                        com.amazon.ec2.DeleteVpnGateway wrappedParam =
                                                             (com.amazon.ec2.DeleteVpnGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteVpnGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteVpnGatewayResponse309 =
                                                   
                                                   
                                                         skel.deleteVpnGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteVpnGatewayResponse309, false);
                                    } else 

            if("createNetworkAclEntry".equals(methodName)){
                
                com.amazon.ec2.CreateNetworkAclEntryResponse createNetworkAclEntryResponse311 = null;
	                        com.amazon.ec2.CreateNetworkAclEntry wrappedParam =
                                                             (com.amazon.ec2.CreateNetworkAclEntry)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateNetworkAclEntry.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createNetworkAclEntryResponse311 =
                                                   
                                                   
                                                         skel.createNetworkAclEntry(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createNetworkAclEntryResponse311, false);
                                    } else 

            if("requestSpotInstances".equals(methodName)){
                
                com.amazon.ec2.RequestSpotInstancesResponse requestSpotInstancesResponse313 = null;
	                        com.amazon.ec2.RequestSpotInstances wrappedParam =
                                                             (com.amazon.ec2.RequestSpotInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RequestSpotInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               requestSpotInstancesResponse313 =
                                                   
                                                   
                                                         skel.requestSpotInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), requestSpotInstancesResponse313, false);
                                    } else 

            if("describeVolumeAttribute".equals(methodName)){
                
                com.amazon.ec2.DescribeVolumeAttributeResponse describeVolumeAttributeResponse315 = null;
	                        com.amazon.ec2.DescribeVolumeAttribute wrappedParam =
                                                             (com.amazon.ec2.DescribeVolumeAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVolumeAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVolumeAttributeResponse315 =
                                                   
                                                   
                                                         skel.describeVolumeAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVolumeAttributeResponse315, false);
                                    } else 

            if("associateDhcpOptions".equals(methodName)){
                
                com.amazon.ec2.AssociateDhcpOptionsResponse associateDhcpOptionsResponse317 = null;
	                        com.amazon.ec2.AssociateDhcpOptions wrappedParam =
                                                             (com.amazon.ec2.AssociateDhcpOptions)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AssociateDhcpOptions.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               associateDhcpOptionsResponse317 =
                                                   
                                                   
                                                         skel.associateDhcpOptions(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), associateDhcpOptionsResponse317, false);
                                    } else 

            if("describeTags".equals(methodName)){
                
                com.amazon.ec2.DescribeTagsResponse describeTagsResponse319 = null;
	                        com.amazon.ec2.DescribeTags wrappedParam =
                                                             (com.amazon.ec2.DescribeTags)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeTags.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeTagsResponse319 =
                                                   
                                                   
                                                         skel.describeTags(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeTagsResponse319, false);
                                    } else 

            if("importKeyPair".equals(methodName)){
                
                com.amazon.ec2.ImportKeyPairResponse importKeyPairResponse321 = null;
	                        com.amazon.ec2.ImportKeyPair wrappedParam =
                                                             (com.amazon.ec2.ImportKeyPair)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ImportKeyPair.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               importKeyPairResponse321 =
                                                   
                                                   
                                                         skel.importKeyPair(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), importKeyPairResponse321, false);
                                    } else 

            if("deleteNetworkInterface".equals(methodName)){
                
                com.amazon.ec2.DeleteNetworkInterfaceResponse deleteNetworkInterfaceResponse323 = null;
	                        com.amazon.ec2.DeleteNetworkInterface wrappedParam =
                                                             (com.amazon.ec2.DeleteNetworkInterface)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteNetworkInterface.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteNetworkInterfaceResponse323 =
                                                   
                                                   
                                                         skel.deleteNetworkInterface(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteNetworkInterfaceResponse323, false);
                                    } else 

            if("describeVpcs".equals(methodName)){
                
                com.amazon.ec2.DescribeVpcsResponse describeVpcsResponse325 = null;
	                        com.amazon.ec2.DescribeVpcs wrappedParam =
                                                             (com.amazon.ec2.DescribeVpcs)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVpcs.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVpcsResponse325 =
                                                   
                                                   
                                                         skel.describeVpcs(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVpcsResponse325, false);
                                    } else 

            if("describeLicenses".equals(methodName)){
                
                com.amazon.ec2.DescribeLicensesResponse describeLicensesResponse327 = null;
	                        com.amazon.ec2.DescribeLicenses wrappedParam =
                                                             (com.amazon.ec2.DescribeLicenses)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeLicenses.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeLicensesResponse327 =
                                                   
                                                   
                                                         skel.describeLicenses(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeLicensesResponse327, false);
                                    } else 

            if("bundleInstance".equals(methodName)){
                
                com.amazon.ec2.BundleInstanceResponse bundleInstanceResponse329 = null;
	                        com.amazon.ec2.BundleInstance wrappedParam =
                                                             (com.amazon.ec2.BundleInstance)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.BundleInstance.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               bundleInstanceResponse329 =
                                                   
                                                   
                                                         skel.bundleInstance(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), bundleInstanceResponse329, false);
                                    } else 

            if("describeVpnConnections".equals(methodName)){
                
                com.amazon.ec2.DescribeVpnConnectionsResponse describeVpnConnectionsResponse331 = null;
	                        com.amazon.ec2.DescribeVpnConnections wrappedParam =
                                                             (com.amazon.ec2.DescribeVpnConnections)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVpnConnections.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVpnConnectionsResponse331 =
                                                   
                                                   
                                                         skel.describeVpnConnections(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVpnConnectionsResponse331, false);
                                    } else 

            if("describeImages".equals(methodName)){
                
                com.amazon.ec2.DescribeImagesResponse describeImagesResponse333 = null;
	                        com.amazon.ec2.DescribeImages wrappedParam =
                                                             (com.amazon.ec2.DescribeImages)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeImages.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeImagesResponse333 =
                                                   
                                                   
                                                         skel.describeImages(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeImagesResponse333, false);
                                    } else 

            if("createInternetGateway".equals(methodName)){
                
                com.amazon.ec2.CreateInternetGatewayResponse createInternetGatewayResponse335 = null;
	                        com.amazon.ec2.CreateInternetGateway wrappedParam =
                                                             (com.amazon.ec2.CreateInternetGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateInternetGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createInternetGatewayResponse335 =
                                                   
                                                   
                                                         skel.createInternetGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createInternetGatewayResponse335, false);
                                    } else 

            if("disassociateRouteTable".equals(methodName)){
                
                com.amazon.ec2.DisassociateRouteTableResponse disassociateRouteTableResponse337 = null;
	                        com.amazon.ec2.DisassociateRouteTable wrappedParam =
                                                             (com.amazon.ec2.DisassociateRouteTable)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DisassociateRouteTable.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               disassociateRouteTableResponse337 =
                                                   
                                                   
                                                         skel.disassociateRouteTable(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), disassociateRouteTableResponse337, false);
                                    } else 

            if("replaceNetworkAclEntry".equals(methodName)){
                
                com.amazon.ec2.ReplaceNetworkAclEntryResponse replaceNetworkAclEntryResponse339 = null;
	                        com.amazon.ec2.ReplaceNetworkAclEntry wrappedParam =
                                                             (com.amazon.ec2.ReplaceNetworkAclEntry)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReplaceNetworkAclEntry.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               replaceNetworkAclEntryResponse339 =
                                                   
                                                   
                                                         skel.replaceNetworkAclEntry(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), replaceNetworkAclEntryResponse339, false);
                                    } else 

            if("authorizeSecurityGroupIngress".equals(methodName)){
                
                com.amazon.ec2.AuthorizeSecurityGroupIngressResponse authorizeSecurityGroupIngressResponse341 = null;
	                        com.amazon.ec2.AuthorizeSecurityGroupIngress wrappedParam =
                                                             (com.amazon.ec2.AuthorizeSecurityGroupIngress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AuthorizeSecurityGroupIngress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               authorizeSecurityGroupIngressResponse341 =
                                                   
                                                   
                                                         skel.authorizeSecurityGroupIngress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), authorizeSecurityGroupIngressResponse341, false);
                                    } else 

            if("describeSnapshotAttribute".equals(methodName)){
                
                com.amazon.ec2.DescribeSnapshotAttributeResponse describeSnapshotAttributeResponse343 = null;
	                        com.amazon.ec2.DescribeSnapshotAttribute wrappedParam =
                                                             (com.amazon.ec2.DescribeSnapshotAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSnapshotAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSnapshotAttributeResponse343 =
                                                   
                                                   
                                                         skel.describeSnapshotAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSnapshotAttributeResponse343, false);
                                    } else 

            if("createVpnGateway".equals(methodName)){
                
                com.amazon.ec2.CreateVpnGatewayResponse createVpnGatewayResponse345 = null;
	                        com.amazon.ec2.CreateVpnGateway wrappedParam =
                                                             (com.amazon.ec2.CreateVpnGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateVpnGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createVpnGatewayResponse345 =
                                                   
                                                   
                                                         skel.createVpnGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createVpnGatewayResponse345, false);
                                    } else 

            if("resetInstanceAttribute".equals(methodName)){
                
                com.amazon.ec2.ResetInstanceAttributeResponse resetInstanceAttributeResponse347 = null;
	                        com.amazon.ec2.ResetInstanceAttribute wrappedParam =
                                                             (com.amazon.ec2.ResetInstanceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ResetInstanceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               resetInstanceAttributeResponse347 =
                                                   
                                                   
                                                         skel.resetInstanceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), resetInstanceAttributeResponse347, false);
                                    } else 

            if("createTags".equals(methodName)){
                
                com.amazon.ec2.CreateTagsResponse createTagsResponse349 = null;
	                        com.amazon.ec2.CreateTags wrappedParam =
                                                             (com.amazon.ec2.CreateTags)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateTags.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createTagsResponse349 =
                                                   
                                                   
                                                         skel.createTags(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createTagsResponse349, false);
                                    } else 

            if("authorizeSecurityGroupEgress".equals(methodName)){
                
                com.amazon.ec2.AuthorizeSecurityGroupEgressResponse authorizeSecurityGroupEgressResponse351 = null;
	                        com.amazon.ec2.AuthorizeSecurityGroupEgress wrappedParam =
                                                             (com.amazon.ec2.AuthorizeSecurityGroupEgress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AuthorizeSecurityGroupEgress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               authorizeSecurityGroupEgressResponse351 =
                                                   
                                                   
                                                         skel.authorizeSecurityGroupEgress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), authorizeSecurityGroupEgressResponse351, false);
                                    } else 

            if("associateAddress".equals(methodName)){
                
                com.amazon.ec2.AssociateAddressResponse associateAddressResponse353 = null;
	                        com.amazon.ec2.AssociateAddress wrappedParam =
                                                             (com.amazon.ec2.AssociateAddress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AssociateAddress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               associateAddressResponse353 =
                                                   
                                                   
                                                         skel.associateAddress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), associateAddressResponse353, false);
                                    } else 

            if("describeImageAttribute".equals(methodName)){
                
                com.amazon.ec2.DescribeImageAttributeResponse describeImageAttributeResponse355 = null;
	                        com.amazon.ec2.DescribeImageAttribute wrappedParam =
                                                             (com.amazon.ec2.DescribeImageAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeImageAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeImageAttributeResponse355 =
                                                   
                                                   
                                                         skel.describeImageAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeImageAttributeResponse355, false);
                                    } else 

            if("describeSpotPriceHistory".equals(methodName)){
                
                com.amazon.ec2.DescribeSpotPriceHistoryResponse describeSpotPriceHistoryResponse357 = null;
	                        com.amazon.ec2.DescribeSpotPriceHistory wrappedParam =
                                                             (com.amazon.ec2.DescribeSpotPriceHistory)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSpotPriceHistory.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSpotPriceHistoryResponse357 =
                                                   
                                                   
                                                         skel.describeSpotPriceHistory(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSpotPriceHistoryResponse357, false);
                                    } else 

            if("modifySnapshotAttribute".equals(methodName)){
                
                com.amazon.ec2.ModifySnapshotAttributeResponse modifySnapshotAttributeResponse359 = null;
	                        com.amazon.ec2.ModifySnapshotAttribute wrappedParam =
                                                             (com.amazon.ec2.ModifySnapshotAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ModifySnapshotAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               modifySnapshotAttributeResponse359 =
                                                   
                                                   
                                                         skel.modifySnapshotAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), modifySnapshotAttributeResponse359, false);
                                    } else 

            if("describeSpotInstanceRequests".equals(methodName)){
                
                com.amazon.ec2.DescribeSpotInstanceRequestsResponse describeSpotInstanceRequestsResponse361 = null;
	                        com.amazon.ec2.DescribeSpotInstanceRequests wrappedParam =
                                                             (com.amazon.ec2.DescribeSpotInstanceRequests)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSpotInstanceRequests.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSpotInstanceRequestsResponse361 =
                                                   
                                                   
                                                         skel.describeSpotInstanceRequests(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSpotInstanceRequestsResponse361, false);
                                    } else 

            if("importInstance".equals(methodName)){
                
                com.amazon.ec2.ImportInstanceResponse importInstanceResponse363 = null;
	                        com.amazon.ec2.ImportInstance wrappedParam =
                                                             (com.amazon.ec2.ImportInstance)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ImportInstance.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               importInstanceResponse363 =
                                                   
                                                   
                                                         skel.importInstance(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), importInstanceResponse363, false);
                                    } else 

            if("describeKeyPairs".equals(methodName)){
                
                com.amazon.ec2.DescribeKeyPairsResponse describeKeyPairsResponse365 = null;
	                        com.amazon.ec2.DescribeKeyPairs wrappedParam =
                                                             (com.amazon.ec2.DescribeKeyPairs)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeKeyPairs.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeKeyPairsResponse365 =
                                                   
                                                   
                                                         skel.describeKeyPairs(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeKeyPairsResponse365, false);
                                    } else 

            if("revokeSecurityGroupIngress".equals(methodName)){
                
                com.amazon.ec2.RevokeSecurityGroupIngressResponse revokeSecurityGroupIngressResponse367 = null;
	                        com.amazon.ec2.RevokeSecurityGroupIngress wrappedParam =
                                                             (com.amazon.ec2.RevokeSecurityGroupIngress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RevokeSecurityGroupIngress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               revokeSecurityGroupIngressResponse367 =
                                                   
                                                   
                                                         skel.revokeSecurityGroupIngress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), revokeSecurityGroupIngressResponse367, false);
                                    } else 

            if("createPlacementGroup".equals(methodName)){
                
                com.amazon.ec2.CreatePlacementGroupResponse createPlacementGroupResponse369 = null;
	                        com.amazon.ec2.CreatePlacementGroup wrappedParam =
                                                             (com.amazon.ec2.CreatePlacementGroup)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreatePlacementGroup.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createPlacementGroupResponse369 =
                                                   
                                                   
                                                         skel.createPlacementGroup(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createPlacementGroupResponse369, false);
                                    } else 

            if("deleteNetworkAclEntry".equals(methodName)){
                
                com.amazon.ec2.DeleteNetworkAclEntryResponse deleteNetworkAclEntryResponse371 = null;
	                        com.amazon.ec2.DeleteNetworkAclEntry wrappedParam =
                                                             (com.amazon.ec2.DeleteNetworkAclEntry)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteNetworkAclEntry.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteNetworkAclEntryResponse371 =
                                                   
                                                   
                                                         skel.deleteNetworkAclEntry(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteNetworkAclEntryResponse371, false);
                                    } else 

            if("activateLicense".equals(methodName)){
                
                com.amazon.ec2.ActivateLicenseResponse activateLicenseResponse373 = null;
	                        com.amazon.ec2.ActivateLicense wrappedParam =
                                                             (com.amazon.ec2.ActivateLicense)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ActivateLicense.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               activateLicenseResponse373 =
                                                   
                                                   
                                                         skel.activateLicense(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), activateLicenseResponse373, false);
                                    } else 

            if("deleteRouteTable".equals(methodName)){
                
                com.amazon.ec2.DeleteRouteTableResponse deleteRouteTableResponse375 = null;
	                        com.amazon.ec2.DeleteRouteTable wrappedParam =
                                                             (com.amazon.ec2.DeleteRouteTable)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteRouteTable.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteRouteTableResponse375 =
                                                   
                                                   
                                                         skel.deleteRouteTable(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteRouteTableResponse375, false);
                                    } else 

            if("unmonitorInstances".equals(methodName)){
                
                com.amazon.ec2.UnmonitorInstancesResponse unmonitorInstancesResponse377 = null;
	                        com.amazon.ec2.UnmonitorInstances wrappedParam =
                                                             (com.amazon.ec2.UnmonitorInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.UnmonitorInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               unmonitorInstancesResponse377 =
                                                   
                                                   
                                                         skel.unmonitorInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), unmonitorInstancesResponse377, false);
                                    } else 

            if("startInstances".equals(methodName)){
                
                com.amazon.ec2.StartInstancesResponse startInstancesResponse379 = null;
	                        com.amazon.ec2.StartInstances wrappedParam =
                                                             (com.amazon.ec2.StartInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.StartInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               startInstancesResponse379 =
                                                   
                                                   
                                                         skel.startInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), startInstancesResponse379, false);
                                    } else 

            if("confirmProductInstance".equals(methodName)){
                
                com.amazon.ec2.ConfirmProductInstanceResponse confirmProductInstanceResponse381 = null;
	                        com.amazon.ec2.ConfirmProductInstance wrappedParam =
                                                             (com.amazon.ec2.ConfirmProductInstance)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ConfirmProductInstance.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               confirmProductInstanceResponse381 =
                                                   
                                                   
                                                         skel.confirmProductInstance(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), confirmProductInstanceResponse381, false);
                                    } else 

            if("describeNetworkInterfaceAttribute".equals(methodName)){
                
                com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse describeNetworkInterfaceAttributeResponse383 = null;
	                        com.amazon.ec2.DescribeNetworkInterfaceAttribute wrappedParam =
                                                             (com.amazon.ec2.DescribeNetworkInterfaceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeNetworkInterfaceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeNetworkInterfaceAttributeResponse383 =
                                                   
                                                   
                                                         skel.describeNetworkInterfaceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeNetworkInterfaceAttributeResponse383, false);
                                    } else 

            if("runInstances".equals(methodName)){
                
                com.amazon.ec2.RunInstancesResponse runInstancesResponse385 = null;
	                        com.amazon.ec2.RunInstances wrappedParam =
                                                             (com.amazon.ec2.RunInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RunInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               runInstancesResponse385 =
                                                   
                                                   
                                                         skel.runInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), runInstancesResponse385, false);
                                    } else 

            if("createReservedInstancesListing".equals(methodName)){
                
                com.amazon.ec2.CreateReservedInstancesListingResponse createReservedInstancesListingResponse387 = null;
	                        com.amazon.ec2.CreateReservedInstancesListing wrappedParam =
                                                             (com.amazon.ec2.CreateReservedInstancesListing)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateReservedInstancesListing.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createReservedInstancesListingResponse387 =
                                                   
                                                   
                                                         skel.createReservedInstancesListing(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createReservedInstancesListingResponse387, false);
                                    } else 

            if("createCustomerGateway".equals(methodName)){
                
                com.amazon.ec2.CreateCustomerGatewayResponse createCustomerGatewayResponse389 = null;
	                        com.amazon.ec2.CreateCustomerGateway wrappedParam =
                                                             (com.amazon.ec2.CreateCustomerGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateCustomerGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createCustomerGatewayResponse389 =
                                                   
                                                   
                                                         skel.createCustomerGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createCustomerGatewayResponse389, false);
                                    } else 

            if("createNetworkAcl".equals(methodName)){
                
                com.amazon.ec2.CreateNetworkAclResponse createNetworkAclResponse391 = null;
	                        com.amazon.ec2.CreateNetworkAcl wrappedParam =
                                                             (com.amazon.ec2.CreateNetworkAcl)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateNetworkAcl.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createNetworkAclResponse391 =
                                                   
                                                   
                                                         skel.createNetworkAcl(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createNetworkAclResponse391, false);
                                    } else 

            if("resetImageAttribute".equals(methodName)){
                
                com.amazon.ec2.ResetImageAttributeResponse resetImageAttributeResponse393 = null;
	                        com.amazon.ec2.ResetImageAttribute wrappedParam =
                                                             (com.amazon.ec2.ResetImageAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ResetImageAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               resetImageAttributeResponse393 =
                                                   
                                                   
                                                         skel.resetImageAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), resetImageAttributeResponse393, false);
                                    } else 

            if("modifyVolumeAttribute".equals(methodName)){
                
                com.amazon.ec2.ModifyVolumeAttributeResponse modifyVolumeAttributeResponse395 = null;
	                        com.amazon.ec2.ModifyVolumeAttribute wrappedParam =
                                                             (com.amazon.ec2.ModifyVolumeAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ModifyVolumeAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               modifyVolumeAttributeResponse395 =
                                                   
                                                   
                                                         skel.modifyVolumeAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), modifyVolumeAttributeResponse395, false);
                                    } else 

            if("describeReservedInstances".equals(methodName)){
                
                com.amazon.ec2.DescribeReservedInstancesResponse describeReservedInstancesResponse397 = null;
	                        com.amazon.ec2.DescribeReservedInstances wrappedParam =
                                                             (com.amazon.ec2.DescribeReservedInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeReservedInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeReservedInstancesResponse397 =
                                                   
                                                   
                                                         skel.describeReservedInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeReservedInstancesResponse397, false);
                                    } else 

            if("resetSnapshotAttribute".equals(methodName)){
                
                com.amazon.ec2.ResetSnapshotAttributeResponse resetSnapshotAttributeResponse399 = null;
	                        com.amazon.ec2.ResetSnapshotAttribute wrappedParam =
                                                             (com.amazon.ec2.ResetSnapshotAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ResetSnapshotAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               resetSnapshotAttributeResponse399 =
                                                   
                                                   
                                                         skel.resetSnapshotAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), resetSnapshotAttributeResponse399, false);
                                    } else 

            if("deleteVolume".equals(methodName)){
                
                com.amazon.ec2.DeleteVolumeResponse deleteVolumeResponse401 = null;
	                        com.amazon.ec2.DeleteVolume wrappedParam =
                                                             (com.amazon.ec2.DeleteVolume)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteVolume.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteVolumeResponse401 =
                                                   
                                                   
                                                         skel.deleteVolume(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteVolumeResponse401, false);
                                    } else 

            if("describeAvailabilityZones".equals(methodName)){
                
                com.amazon.ec2.DescribeAvailabilityZonesResponse describeAvailabilityZonesResponse403 = null;
	                        com.amazon.ec2.DescribeAvailabilityZones wrappedParam =
                                                             (com.amazon.ec2.DescribeAvailabilityZones)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeAvailabilityZones.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeAvailabilityZonesResponse403 =
                                                   
                                                   
                                                         skel.describeAvailabilityZones(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeAvailabilityZonesResponse403, false);
                                    } else 

            if("createVpnConnection".equals(methodName)){
                
                com.amazon.ec2.CreateVpnConnectionResponse createVpnConnectionResponse405 = null;
	                        com.amazon.ec2.CreateVpnConnection wrappedParam =
                                                             (com.amazon.ec2.CreateVpnConnection)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateVpnConnection.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createVpnConnectionResponse405 =
                                                   
                                                   
                                                         skel.createVpnConnection(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createVpnConnectionResponse405, false);
                                    } else 

            if("cancelBundleTask".equals(methodName)){
                
                com.amazon.ec2.CancelBundleTaskResponse cancelBundleTaskResponse407 = null;
	                        com.amazon.ec2.CancelBundleTask wrappedParam =
                                                             (com.amazon.ec2.CancelBundleTask)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CancelBundleTask.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               cancelBundleTaskResponse407 =
                                                   
                                                   
                                                         skel.cancelBundleTask(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), cancelBundleTaskResponse407, false);
                                    } else 

            if("replaceNetworkAclAssociation".equals(methodName)){
                
                com.amazon.ec2.ReplaceNetworkAclAssociationResponse replaceNetworkAclAssociationResponse409 = null;
	                        com.amazon.ec2.ReplaceNetworkAclAssociation wrappedParam =
                                                             (com.amazon.ec2.ReplaceNetworkAclAssociation)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReplaceNetworkAclAssociation.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               replaceNetworkAclAssociationResponse409 =
                                                   
                                                   
                                                         skel.replaceNetworkAclAssociation(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), replaceNetworkAclAssociationResponse409, false);
                                    } else 

            if("detachVpnGateway".equals(methodName)){
                
                com.amazon.ec2.DetachVpnGatewayResponse detachVpnGatewayResponse411 = null;
	                        com.amazon.ec2.DetachVpnGateway wrappedParam =
                                                             (com.amazon.ec2.DetachVpnGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DetachVpnGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               detachVpnGatewayResponse411 =
                                                   
                                                   
                                                         skel.detachVpnGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), detachVpnGatewayResponse411, false);
                                    } else 

            if("describeSnapshots".equals(methodName)){
                
                com.amazon.ec2.DescribeSnapshotsResponse describeSnapshotsResponse413 = null;
	                        com.amazon.ec2.DescribeSnapshots wrappedParam =
                                                             (com.amazon.ec2.DescribeSnapshots)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSnapshots.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSnapshotsResponse413 =
                                                   
                                                   
                                                         skel.describeSnapshots(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSnapshotsResponse413, false);
                                    } else 

            if("deleteSubnet".equals(methodName)){
                
                com.amazon.ec2.DeleteSubnetResponse deleteSubnetResponse415 = null;
	                        com.amazon.ec2.DeleteSubnet wrappedParam =
                                                             (com.amazon.ec2.DeleteSubnet)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteSubnet.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteSubnetResponse415 =
                                                   
                                                   
                                                         skel.deleteSubnet(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteSubnetResponse415, false);
                                    } else 

            if("describeBundleTasks".equals(methodName)){
                
                com.amazon.ec2.DescribeBundleTasksResponse describeBundleTasksResponse417 = null;
	                        com.amazon.ec2.DescribeBundleTasks wrappedParam =
                                                             (com.amazon.ec2.DescribeBundleTasks)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeBundleTasks.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeBundleTasksResponse417 =
                                                   
                                                   
                                                         skel.describeBundleTasks(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeBundleTasksResponse417, false);
                                    } else 

            if("createKeyPair".equals(methodName)){
                
                com.amazon.ec2.CreateKeyPairResponse createKeyPairResponse419 = null;
	                        com.amazon.ec2.CreateKeyPair wrappedParam =
                                                             (com.amazon.ec2.CreateKeyPair)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateKeyPair.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createKeyPairResponse419 =
                                                   
                                                   
                                                         skel.createKeyPair(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createKeyPairResponse419, false);
                                    } else 

            if("createImage".equals(methodName)){
                
                com.amazon.ec2.CreateImageResponse createImageResponse421 = null;
	                        com.amazon.ec2.CreateImage wrappedParam =
                                                             (com.amazon.ec2.CreateImage)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateImage.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createImageResponse421 =
                                                   
                                                   
                                                         skel.createImage(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createImageResponse421, false);
                                    } else 

            if("enableVgwRoutePropagation".equals(methodName)){
                
                com.amazon.ec2.EnableVgwRoutePropagationResponse enableVgwRoutePropagationResponse423 = null;
	                        com.amazon.ec2.EnableVgwRoutePropagation wrappedParam =
                                                             (com.amazon.ec2.EnableVgwRoutePropagation)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.EnableVgwRoutePropagation.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               enableVgwRoutePropagationResponse423 =
                                                   
                                                   
                                                         skel.enableVgwRoutePropagation(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), enableVgwRoutePropagationResponse423, false);
                                    } else 

            if("unassignPrivateIpAddresses".equals(methodName)){
                
                com.amazon.ec2.UnassignPrivateIpAddressesResponse unassignPrivateIpAddressesResponse425 = null;
	                        com.amazon.ec2.UnassignPrivateIpAddresses wrappedParam =
                                                             (com.amazon.ec2.UnassignPrivateIpAddresses)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.UnassignPrivateIpAddresses.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               unassignPrivateIpAddressesResponse425 =
                                                   
                                                   
                                                         skel.unassignPrivateIpAddresses(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), unassignPrivateIpAddressesResponse425, false);
                                    } else 

            if("deregisterImage".equals(methodName)){
                
                com.amazon.ec2.DeregisterImageResponse deregisterImageResponse427 = null;
	                        com.amazon.ec2.DeregisterImage wrappedParam =
                                                             (com.amazon.ec2.DeregisterImage)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeregisterImage.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deregisterImageResponse427 =
                                                   
                                                   
                                                         skel.deregisterImage(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deregisterImageResponse427, false);
                                    } else 

            if("deleteVpnConnectionRoute".equals(methodName)){
                
                com.amazon.ec2.DeleteVpnConnectionRouteResponse deleteVpnConnectionRouteResponse429 = null;
	                        com.amazon.ec2.DeleteVpnConnectionRoute wrappedParam =
                                                             (com.amazon.ec2.DeleteVpnConnectionRoute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteVpnConnectionRoute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteVpnConnectionRouteResponse429 =
                                                   
                                                   
                                                         skel.deleteVpnConnectionRoute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteVpnConnectionRouteResponse429, false);
                                    } else 

            if("modifyImageAttribute".equals(methodName)){
                
                com.amazon.ec2.ModifyImageAttributeResponse modifyImageAttributeResponse431 = null;
	                        com.amazon.ec2.ModifyImageAttribute wrappedParam =
                                                             (com.amazon.ec2.ModifyImageAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ModifyImageAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               modifyImageAttributeResponse431 =
                                                   
                                                   
                                                         skel.modifyImageAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), modifyImageAttributeResponse431, false);
                                    } else 

            if("cancelConversionTask".equals(methodName)){
                
                com.amazon.ec2.CancelConversionTaskResponse cancelConversionTaskResponse433 = null;
	                        com.amazon.ec2.CancelConversionTask wrappedParam =
                                                             (com.amazon.ec2.CancelConversionTask)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CancelConversionTask.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               cancelConversionTaskResponse433 =
                                                   
                                                   
                                                         skel.cancelConversionTask(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), cancelConversionTaskResponse433, false);
                                    } else 

            if("describeVolumes".equals(methodName)){
                
                com.amazon.ec2.DescribeVolumesResponse describeVolumesResponse435 = null;
	                        com.amazon.ec2.DescribeVolumes wrappedParam =
                                                             (com.amazon.ec2.DescribeVolumes)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVolumes.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVolumesResponse435 =
                                                   
                                                   
                                                         skel.describeVolumes(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVolumesResponse435, false);
                                    } else 

            if("cancelReservedInstancesListing".equals(methodName)){
                
                com.amazon.ec2.CancelReservedInstancesListingResponse cancelReservedInstancesListingResponse437 = null;
	                        com.amazon.ec2.CancelReservedInstancesListing wrappedParam =
                                                             (com.amazon.ec2.CancelReservedInstancesListing)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CancelReservedInstancesListing.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               cancelReservedInstancesListingResponse437 =
                                                   
                                                   
                                                         skel.cancelReservedInstancesListing(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), cancelReservedInstancesListingResponse437, false);
                                    } else 

            if("getPasswordData".equals(methodName)){
                
                com.amazon.ec2.GetPasswordDataResponse getPasswordDataResponse439 = null;
	                        com.amazon.ec2.GetPasswordData wrappedParam =
                                                             (com.amazon.ec2.GetPasswordData)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.GetPasswordData.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               getPasswordDataResponse439 =
                                                   
                                                   
                                                         skel.getPasswordData(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), getPasswordDataResponse439, false);
                                    } else 

            if("allocateAddress".equals(methodName)){
                
                com.amazon.ec2.AllocateAddressResponse allocateAddressResponse441 = null;
	                        com.amazon.ec2.AllocateAddress wrappedParam =
                                                             (com.amazon.ec2.AllocateAddress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AllocateAddress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               allocateAddressResponse441 =
                                                   
                                                   
                                                         skel.allocateAddress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), allocateAddressResponse441, false);
                                    } else 

            if("deleteSecurityGroup".equals(methodName)){
                
                com.amazon.ec2.DeleteSecurityGroupResponse deleteSecurityGroupResponse443 = null;
	                        com.amazon.ec2.DeleteSecurityGroup wrappedParam =
                                                             (com.amazon.ec2.DeleteSecurityGroup)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteSecurityGroup.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteSecurityGroupResponse443 =
                                                   
                                                   
                                                         skel.deleteSecurityGroup(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteSecurityGroupResponse443, false);
                                    } else 

            if("deletePlacementGroup".equals(methodName)){
                
                com.amazon.ec2.DeletePlacementGroupResponse deletePlacementGroupResponse445 = null;
	                        com.amazon.ec2.DeletePlacementGroup wrappedParam =
                                                             (com.amazon.ec2.DeletePlacementGroup)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeletePlacementGroup.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deletePlacementGroupResponse445 =
                                                   
                                                   
                                                         skel.deletePlacementGroup(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deletePlacementGroupResponse445, false);
                                    } else 

            if("disassociateAddress".equals(methodName)){
                
                com.amazon.ec2.DisassociateAddressResponse disassociateAddressResponse447 = null;
	                        com.amazon.ec2.DisassociateAddress wrappedParam =
                                                             (com.amazon.ec2.DisassociateAddress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DisassociateAddress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               disassociateAddressResponse447 =
                                                   
                                                   
                                                         skel.disassociateAddress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), disassociateAddressResponse447, false);
                                    } else 

            if("deleteDhcpOptions".equals(methodName)){
                
                com.amazon.ec2.DeleteDhcpOptionsResponse deleteDhcpOptionsResponse449 = null;
	                        com.amazon.ec2.DeleteDhcpOptions wrappedParam =
                                                             (com.amazon.ec2.DeleteDhcpOptions)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteDhcpOptions.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteDhcpOptionsResponse449 =
                                                   
                                                   
                                                         skel.deleteDhcpOptions(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteDhcpOptionsResponse449, false);
                                    } else 

            if("describeSpotDatafeedSubscription".equals(methodName)){
                
                com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse describeSpotDatafeedSubscriptionResponse451 = null;
	                        com.amazon.ec2.DescribeSpotDatafeedSubscription wrappedParam =
                                                             (com.amazon.ec2.DescribeSpotDatafeedSubscription)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSpotDatafeedSubscription.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSpotDatafeedSubscriptionResponse451 =
                                                   
                                                   
                                                         skel.describeSpotDatafeedSubscription(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSpotDatafeedSubscriptionResponse451, false);
                                    } else 

            if("describeNetworkAcls".equals(methodName)){
                
                com.amazon.ec2.DescribeNetworkAclsResponse describeNetworkAclsResponse453 = null;
	                        com.amazon.ec2.DescribeNetworkAcls wrappedParam =
                                                             (com.amazon.ec2.DescribeNetworkAcls)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeNetworkAcls.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeNetworkAclsResponse453 =
                                                   
                                                   
                                                         skel.describeNetworkAcls(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeNetworkAclsResponse453, false);
                                    } else 

            if("enableVolumeIO".equals(methodName)){
                
                com.amazon.ec2.EnableVolumeIOResponse enableVolumeIOResponse455 = null;
	                        com.amazon.ec2.EnableVolumeIO wrappedParam =
                                                             (com.amazon.ec2.EnableVolumeIO)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.EnableVolumeIO.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               enableVolumeIOResponse455 =
                                                   
                                                   
                                                         skel.enableVolumeIO(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), enableVolumeIOResponse455, false);
                                    } else 

            if("attachVpnGateway".equals(methodName)){
                
                com.amazon.ec2.AttachVpnGatewayResponse attachVpnGatewayResponse457 = null;
	                        com.amazon.ec2.AttachVpnGateway wrappedParam =
                                                             (com.amazon.ec2.AttachVpnGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AttachVpnGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               attachVpnGatewayResponse457 =
                                                   
                                                   
                                                         skel.attachVpnGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), attachVpnGatewayResponse457, false);
                                    } else 

            if("describeInternetGateways".equals(methodName)){
                
                com.amazon.ec2.DescribeInternetGatewaysResponse describeInternetGatewaysResponse459 = null;
	                        com.amazon.ec2.DescribeInternetGateways wrappedParam =
                                                             (com.amazon.ec2.DescribeInternetGateways)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeInternetGateways.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeInternetGatewaysResponse459 =
                                                   
                                                   
                                                         skel.describeInternetGateways(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeInternetGatewaysResponse459, false);
                                    } else 

            if("describeDhcpOptions".equals(methodName)){
                
                com.amazon.ec2.DescribeDhcpOptionsResponse describeDhcpOptionsResponse461 = null;
	                        com.amazon.ec2.DescribeDhcpOptions wrappedParam =
                                                             (com.amazon.ec2.DescribeDhcpOptions)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeDhcpOptions.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeDhcpOptionsResponse461 =
                                                   
                                                   
                                                         skel.describeDhcpOptions(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeDhcpOptionsResponse461, false);
                                    } else 

            if("createSpotDatafeedSubscription".equals(methodName)){
                
                com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse createSpotDatafeedSubscriptionResponse463 = null;
	                        com.amazon.ec2.CreateSpotDatafeedSubscription wrappedParam =
                                                             (com.amazon.ec2.CreateSpotDatafeedSubscription)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateSpotDatafeedSubscription.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createSpotDatafeedSubscriptionResponse463 =
                                                   
                                                   
                                                         skel.createSpotDatafeedSubscription(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createSpotDatafeedSubscriptionResponse463, false);
                                    } else 

            if("describeReservedInstancesListings".equals(methodName)){
                
                com.amazon.ec2.DescribeReservedInstancesListingsResponse describeReservedInstancesListingsResponse465 = null;
	                        com.amazon.ec2.DescribeReservedInstancesListings wrappedParam =
                                                             (com.amazon.ec2.DescribeReservedInstancesListings)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeReservedInstancesListings.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeReservedInstancesListingsResponse465 =
                                                   
                                                   
                                                         skel.describeReservedInstancesListings(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeReservedInstancesListingsResponse465, false);
                                    } else 

            if("describeInstanceStatus".equals(methodName)){
                
                com.amazon.ec2.DescribeInstanceStatusResponse describeInstanceStatusResponse467 = null;
	                        com.amazon.ec2.DescribeInstanceStatus wrappedParam =
                                                             (com.amazon.ec2.DescribeInstanceStatus)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeInstanceStatus.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeInstanceStatusResponse467 =
                                                   
                                                   
                                                         skel.describeInstanceStatus(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeInstanceStatusResponse467, false);
                                    } else 

            if("modifyNetworkInterfaceAttribute".equals(methodName)){
                
                com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse modifyNetworkInterfaceAttributeResponse469 = null;
	                        com.amazon.ec2.ModifyNetworkInterfaceAttribute wrappedParam =
                                                             (com.amazon.ec2.ModifyNetworkInterfaceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ModifyNetworkInterfaceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               modifyNetworkInterfaceAttributeResponse469 =
                                                   
                                                   
                                                         skel.modifyNetworkInterfaceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), modifyNetworkInterfaceAttributeResponse469, false);
                                    } else 

            if("disableVgwRoutePropagation".equals(methodName)){
                
                com.amazon.ec2.DisableVgwRoutePropagationResponse disableVgwRoutePropagationResponse471 = null;
	                        com.amazon.ec2.DisableVgwRoutePropagation wrappedParam =
                                                             (com.amazon.ec2.DisableVgwRoutePropagation)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DisableVgwRoutePropagation.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               disableVgwRoutePropagationResponse471 =
                                                   
                                                   
                                                         skel.disableVgwRoutePropagation(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), disableVgwRoutePropagationResponse471, false);
                                    } else 

            if("describeVolumeStatus".equals(methodName)){
                
                com.amazon.ec2.DescribeVolumeStatusResponse describeVolumeStatusResponse473 = null;
	                        com.amazon.ec2.DescribeVolumeStatus wrappedParam =
                                                             (com.amazon.ec2.DescribeVolumeStatus)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVolumeStatus.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVolumeStatusResponse473 =
                                                   
                                                   
                                                         skel.describeVolumeStatus(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVolumeStatusResponse473, false);
                                    } else 

            if("detachNetworkInterface".equals(methodName)){
                
                com.amazon.ec2.DetachNetworkInterfaceResponse detachNetworkInterfaceResponse475 = null;
	                        com.amazon.ec2.DetachNetworkInterface wrappedParam =
                                                             (com.amazon.ec2.DetachNetworkInterface)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DetachNetworkInterface.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               detachNetworkInterfaceResponse475 =
                                                   
                                                   
                                                         skel.detachNetworkInterface(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), detachNetworkInterfaceResponse475, false);
                                    } else 

            if("describeSecurityGroups".equals(methodName)){
                
                com.amazon.ec2.DescribeSecurityGroupsResponse describeSecurityGroupsResponse477 = null;
	                        com.amazon.ec2.DescribeSecurityGroups wrappedParam =
                                                             (com.amazon.ec2.DescribeSecurityGroups)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeSecurityGroups.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeSecurityGroupsResponse477 =
                                                   
                                                   
                                                         skel.describeSecurityGroups(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeSecurityGroupsResponse477, false);
                                    } else 

            if("describeInstances".equals(methodName)){
                
                com.amazon.ec2.DescribeInstancesResponse describeInstancesResponse479 = null;
	                        com.amazon.ec2.DescribeInstances wrappedParam =
                                                             (com.amazon.ec2.DescribeInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeInstancesResponse479 =
                                                   
                                                   
                                                         skel.describeInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeInstancesResponse479, false);
                                    } else 

            if("describeNetworkInterfaces".equals(methodName)){
                
                com.amazon.ec2.DescribeNetworkInterfacesResponse describeNetworkInterfacesResponse481 = null;
	                        com.amazon.ec2.DescribeNetworkInterfaces wrappedParam =
                                                             (com.amazon.ec2.DescribeNetworkInterfaces)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeNetworkInterfaces.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeNetworkInterfacesResponse481 =
                                                   
                                                   
                                                         skel.describeNetworkInterfaces(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeNetworkInterfacesResponse481, false);
                                    } else 

            if("deleteKeyPair".equals(methodName)){
                
                com.amazon.ec2.DeleteKeyPairResponse deleteKeyPairResponse483 = null;
	                        com.amazon.ec2.DeleteKeyPair wrappedParam =
                                                             (com.amazon.ec2.DeleteKeyPair)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteKeyPair.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteKeyPairResponse483 =
                                                   
                                                   
                                                         skel.deleteKeyPair(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteKeyPairResponse483, false);
                                    } else 

            if("createSnapshot".equals(methodName)){
                
                com.amazon.ec2.CreateSnapshotResponse createSnapshotResponse485 = null;
	                        com.amazon.ec2.CreateSnapshot wrappedParam =
                                                             (com.amazon.ec2.CreateSnapshot)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateSnapshot.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createSnapshotResponse485 =
                                                   
                                                   
                                                         skel.createSnapshot(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createSnapshotResponse485, false);
                                    } else 

            if("describeVpnGateways".equals(methodName)){
                
                com.amazon.ec2.DescribeVpnGatewaysResponse describeVpnGatewaysResponse487 = null;
	                        com.amazon.ec2.DescribeVpnGateways wrappedParam =
                                                             (com.amazon.ec2.DescribeVpnGateways)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeVpnGateways.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeVpnGatewaysResponse487 =
                                                   
                                                   
                                                         skel.describeVpnGateways(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeVpnGatewaysResponse487, false);
                                    } else 

            if("deleteTags".equals(methodName)){
                
                com.amazon.ec2.DeleteTagsResponse deleteTagsResponse489 = null;
	                        com.amazon.ec2.DeleteTags wrappedParam =
                                                             (com.amazon.ec2.DeleteTags)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteTags.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteTagsResponse489 =
                                                   
                                                   
                                                         skel.deleteTags(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteTagsResponse489, false);
                                    } else 

            if("deleteSnapshot".equals(methodName)){
                
                com.amazon.ec2.DeleteSnapshotResponse deleteSnapshotResponse491 = null;
	                        com.amazon.ec2.DeleteSnapshot wrappedParam =
                                                             (com.amazon.ec2.DeleteSnapshot)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteSnapshot.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteSnapshotResponse491 =
                                                   
                                                   
                                                         skel.deleteSnapshot(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteSnapshotResponse491, false);
                                    } else 

            if("deleteCustomerGateway".equals(methodName)){
                
                com.amazon.ec2.DeleteCustomerGatewayResponse deleteCustomerGatewayResponse493 = null;
	                        com.amazon.ec2.DeleteCustomerGateway wrappedParam =
                                                             (com.amazon.ec2.DeleteCustomerGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteCustomerGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteCustomerGatewayResponse493 =
                                                   
                                                   
                                                         skel.deleteCustomerGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteCustomerGatewayResponse493, false);
                                    } else 

            if("createVolume".equals(methodName)){
                
                com.amazon.ec2.CreateVolumeResponse createVolumeResponse495 = null;
	                        com.amazon.ec2.CreateVolume wrappedParam =
                                                             (com.amazon.ec2.CreateVolume)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateVolume.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createVolumeResponse495 =
                                                   
                                                   
                                                         skel.createVolume(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createVolumeResponse495, false);
                                    } else 

            if("cancelExportTask".equals(methodName)){
                
                com.amazon.ec2.CancelExportTaskResponse cancelExportTaskResponse497 = null;
	                        com.amazon.ec2.CancelExportTask wrappedParam =
                                                             (com.amazon.ec2.CancelExportTask)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CancelExportTask.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               cancelExportTaskResponse497 =
                                                   
                                                   
                                                         skel.cancelExportTask(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), cancelExportTaskResponse497, false);
                                    } else 

            if("registerImage".equals(methodName)){
                
                com.amazon.ec2.RegisterImageResponse registerImageResponse499 = null;
	                        com.amazon.ec2.RegisterImage wrappedParam =
                                                             (com.amazon.ec2.RegisterImage)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RegisterImage.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               registerImageResponse499 =
                                                   
                                                   
                                                         skel.registerImage(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), registerImageResponse499, false);
                                    } else 

            if("detachVolume".equals(methodName)){
                
                com.amazon.ec2.DetachVolumeResponse detachVolumeResponse501 = null;
	                        com.amazon.ec2.DetachVolume wrappedParam =
                                                             (com.amazon.ec2.DetachVolume)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DetachVolume.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               detachVolumeResponse501 =
                                                   
                                                   
                                                         skel.detachVolume(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), detachVolumeResponse501, false);
                                    } else 

            if("stopInstances".equals(methodName)){
                
                com.amazon.ec2.StopInstancesResponse stopInstancesResponse503 = null;
	                        com.amazon.ec2.StopInstances wrappedParam =
                                                             (com.amazon.ec2.StopInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.StopInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               stopInstancesResponse503 =
                                                   
                                                   
                                                         skel.stopInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), stopInstancesResponse503, false);
                                    } else 

            if("createRoute".equals(methodName)){
                
                com.amazon.ec2.CreateRouteResponse createRouteResponse505 = null;
	                        com.amazon.ec2.CreateRoute wrappedParam =
                                                             (com.amazon.ec2.CreateRoute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateRoute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createRouteResponse505 =
                                                   
                                                   
                                                         skel.createRoute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createRouteResponse505, false);
                                    } else 

            if("releaseAddress".equals(methodName)){
                
                com.amazon.ec2.ReleaseAddressResponse releaseAddressResponse507 = null;
	                        com.amazon.ec2.ReleaseAddress wrappedParam =
                                                             (com.amazon.ec2.ReleaseAddress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReleaseAddress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               releaseAddressResponse507 =
                                                   
                                                   
                                                         skel.releaseAddress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), releaseAddressResponse507, false);
                                    } else 

            if("describeRouteTables".equals(methodName)){
                
                com.amazon.ec2.DescribeRouteTablesResponse describeRouteTablesResponse509 = null;
	                        com.amazon.ec2.DescribeRouteTables wrappedParam =
                                                             (com.amazon.ec2.DescribeRouteTables)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeRouteTables.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeRouteTablesResponse509 =
                                                   
                                                   
                                                         skel.describeRouteTables(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeRouteTablesResponse509, false);
                                    } else 

            if("describeCustomerGateways".equals(methodName)){
                
                com.amazon.ec2.DescribeCustomerGatewaysResponse describeCustomerGatewaysResponse511 = null;
	                        com.amazon.ec2.DescribeCustomerGateways wrappedParam =
                                                             (com.amazon.ec2.DescribeCustomerGateways)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeCustomerGateways.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeCustomerGatewaysResponse511 =
                                                   
                                                   
                                                         skel.describeCustomerGateways(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeCustomerGatewaysResponse511, false);
                                    } else 

            if("deleteNetworkAcl".equals(methodName)){
                
                com.amazon.ec2.DeleteNetworkAclResponse deleteNetworkAclResponse513 = null;
	                        com.amazon.ec2.DeleteNetworkAcl wrappedParam =
                                                             (com.amazon.ec2.DeleteNetworkAcl)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteNetworkAcl.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteNetworkAclResponse513 =
                                                   
                                                   
                                                         skel.deleteNetworkAcl(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteNetworkAclResponse513, false);
                                    } else 

            if("deleteRoute".equals(methodName)){
                
                com.amazon.ec2.DeleteRouteResponse deleteRouteResponse515 = null;
	                        com.amazon.ec2.DeleteRoute wrappedParam =
                                                             (com.amazon.ec2.DeleteRoute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteRoute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteRouteResponse515 =
                                                   
                                                   
                                                         skel.deleteRoute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteRouteResponse515, false);
                                    } else 

            if("rebootInstances".equals(methodName)){
                
                com.amazon.ec2.RebootInstancesResponse rebootInstancesResponse517 = null;
	                        com.amazon.ec2.RebootInstances wrappedParam =
                                                             (com.amazon.ec2.RebootInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RebootInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               rebootInstancesResponse517 =
                                                   
                                                   
                                                         skel.rebootInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), rebootInstancesResponse517, false);
                                    } else 

            if("modifyInstanceAttribute".equals(methodName)){
                
                com.amazon.ec2.ModifyInstanceAttributeResponse modifyInstanceAttributeResponse519 = null;
	                        com.amazon.ec2.ModifyInstanceAttribute wrappedParam =
                                                             (com.amazon.ec2.ModifyInstanceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ModifyInstanceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               modifyInstanceAttributeResponse519 =
                                                   
                                                   
                                                         skel.modifyInstanceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), modifyInstanceAttributeResponse519, false);
                                    } else 

            if("terminateInstances".equals(methodName)){
                
                com.amazon.ec2.TerminateInstancesResponse terminateInstancesResponse521 = null;
	                        com.amazon.ec2.TerminateInstances wrappedParam =
                                                             (com.amazon.ec2.TerminateInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.TerminateInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               terminateInstancesResponse521 =
                                                   
                                                   
                                                         skel.terminateInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), terminateInstancesResponse521, false);
                                    } else 

            if("createVpnConnectionRoute".equals(methodName)){
                
                com.amazon.ec2.CreateVpnConnectionRouteResponse createVpnConnectionRouteResponse523 = null;
	                        com.amazon.ec2.CreateVpnConnectionRoute wrappedParam =
                                                             (com.amazon.ec2.CreateVpnConnectionRoute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateVpnConnectionRoute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createVpnConnectionRouteResponse523 =
                                                   
                                                   
                                                         skel.createVpnConnectionRoute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createVpnConnectionRouteResponse523, false);
                                    } else 

            if("describeConversionTasks".equals(methodName)){
                
                com.amazon.ec2.DescribeConversionTasksResponse describeConversionTasksResponse525 = null;
	                        com.amazon.ec2.DescribeConversionTasks wrappedParam =
                                                             (com.amazon.ec2.DescribeConversionTasks)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeConversionTasks.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeConversionTasksResponse525 =
                                                   
                                                   
                                                         skel.describeConversionTasks(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeConversionTasksResponse525, false);
                                    } else 

            if("describeAddresses".equals(methodName)){
                
                com.amazon.ec2.DescribeAddressesResponse describeAddressesResponse527 = null;
	                        com.amazon.ec2.DescribeAddresses wrappedParam =
                                                             (com.amazon.ec2.DescribeAddresses)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeAddresses.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeAddressesResponse527 =
                                                   
                                                   
                                                         skel.describeAddresses(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeAddressesResponse527, false);
                                    } else 

            if("describeInstanceAttribute".equals(methodName)){
                
                com.amazon.ec2.DescribeInstanceAttributeResponse describeInstanceAttributeResponse529 = null;
	                        com.amazon.ec2.DescribeInstanceAttribute wrappedParam =
                                                             (com.amazon.ec2.DescribeInstanceAttribute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeInstanceAttribute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeInstanceAttributeResponse529 =
                                                   
                                                   
                                                         skel.describeInstanceAttribute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeInstanceAttributeResponse529, false);
                                    } else 

            if("attachInternetGateway".equals(methodName)){
                
                com.amazon.ec2.AttachInternetGatewayResponse attachInternetGatewayResponse531 = null;
	                        com.amazon.ec2.AttachInternetGateway wrappedParam =
                                                             (com.amazon.ec2.AttachInternetGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AttachInternetGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               attachInternetGatewayResponse531 =
                                                   
                                                   
                                                         skel.attachInternetGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), attachInternetGatewayResponse531, false);
                                    } else 

            if("createVpc".equals(methodName)){
                
                com.amazon.ec2.CreateVpcResponse createVpcResponse533 = null;
	                        com.amazon.ec2.CreateVpc wrappedParam =
                                                             (com.amazon.ec2.CreateVpc)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateVpc.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createVpcResponse533 =
                                                   
                                                   
                                                         skel.createVpc(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createVpcResponse533, false);
                                    } else 

            if("replaceRouteTableAssociation".equals(methodName)){
                
                com.amazon.ec2.ReplaceRouteTableAssociationResponse replaceRouteTableAssociationResponse535 = null;
	                        com.amazon.ec2.ReplaceRouteTableAssociation wrappedParam =
                                                             (com.amazon.ec2.ReplaceRouteTableAssociation)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReplaceRouteTableAssociation.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               replaceRouteTableAssociationResponse535 =
                                                   
                                                   
                                                         skel.replaceRouteTableAssociation(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), replaceRouteTableAssociationResponse535, false);
                                    } else 

            if("associateRouteTable".equals(methodName)){
                
                com.amazon.ec2.AssociateRouteTableResponse associateRouteTableResponse537 = null;
	                        com.amazon.ec2.AssociateRouteTable wrappedParam =
                                                             (com.amazon.ec2.AssociateRouteTable)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AssociateRouteTable.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               associateRouteTableResponse537 =
                                                   
                                                   
                                                         skel.associateRouteTable(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), associateRouteTableResponse537, false);
                                    } else 

            if("detachInternetGateway".equals(methodName)){
                
                com.amazon.ec2.DetachInternetGatewayResponse detachInternetGatewayResponse539 = null;
	                        com.amazon.ec2.DetachInternetGateway wrappedParam =
                                                             (com.amazon.ec2.DetachInternetGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DetachInternetGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               detachInternetGatewayResponse539 =
                                                   
                                                   
                                                         skel.detachInternetGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), detachInternetGatewayResponse539, false);
                                    } else 

            if("purchaseReservedInstancesOffering".equals(methodName)){
                
                com.amazon.ec2.PurchaseReservedInstancesOfferingResponse purchaseReservedInstancesOfferingResponse541 = null;
	                        com.amazon.ec2.PurchaseReservedInstancesOffering wrappedParam =
                                                             (com.amazon.ec2.PurchaseReservedInstancesOffering)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.PurchaseReservedInstancesOffering.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               purchaseReservedInstancesOfferingResponse541 =
                                                   
                                                   
                                                         skel.purchaseReservedInstancesOffering(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), purchaseReservedInstancesOfferingResponse541, false);
                                    } else 

            if("importVolume".equals(methodName)){
                
                com.amazon.ec2.ImportVolumeResponse importVolumeResponse543 = null;
	                        com.amazon.ec2.ImportVolume wrappedParam =
                                                             (com.amazon.ec2.ImportVolume)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ImportVolume.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               importVolumeResponse543 =
                                                   
                                                   
                                                         skel.importVolume(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), importVolumeResponse543, false);
                                    } else 

            if("describeExportTasks".equals(methodName)){
                
                com.amazon.ec2.DescribeExportTasksResponse describeExportTasksResponse545 = null;
	                        com.amazon.ec2.DescribeExportTasks wrappedParam =
                                                             (com.amazon.ec2.DescribeExportTasks)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeExportTasks.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeExportTasksResponse545 =
                                                   
                                                   
                                                         skel.describeExportTasks(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeExportTasksResponse545, false);
                                    } else 

            if("createInstanceExportTask".equals(methodName)){
                
                com.amazon.ec2.CreateInstanceExportTaskResponse createInstanceExportTaskResponse547 = null;
	                        com.amazon.ec2.CreateInstanceExportTask wrappedParam =
                                                             (com.amazon.ec2.CreateInstanceExportTask)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateInstanceExportTask.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createInstanceExportTaskResponse547 =
                                                   
                                                   
                                                         skel.createInstanceExportTask(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createInstanceExportTaskResponse547, false);
                                    } else 

            if("assignPrivateIpAddresses".equals(methodName)){
                
                com.amazon.ec2.AssignPrivateIpAddressesResponse assignPrivateIpAddressesResponse549 = null;
	                        com.amazon.ec2.AssignPrivateIpAddresses wrappedParam =
                                                             (com.amazon.ec2.AssignPrivateIpAddresses)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AssignPrivateIpAddresses.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               assignPrivateIpAddressesResponse549 =
                                                   
                                                   
                                                         skel.assignPrivateIpAddresses(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), assignPrivateIpAddressesResponse549, false);
                                    } else 

            if("reportInstanceStatus".equals(methodName)){
                
                com.amazon.ec2.ReportInstanceStatusResponse reportInstanceStatusResponse551 = null;
	                        com.amazon.ec2.ReportInstanceStatus wrappedParam =
                                                             (com.amazon.ec2.ReportInstanceStatus)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReportInstanceStatus.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               reportInstanceStatusResponse551 =
                                                   
                                                   
                                                         skel.reportInstanceStatus(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), reportInstanceStatusResponse551, false);
                                    } else 

            if("describeReservedInstancesOfferings".equals(methodName)){
                
                com.amazon.ec2.DescribeReservedInstancesOfferingsResponse describeReservedInstancesOfferingsResponse553 = null;
	                        com.amazon.ec2.DescribeReservedInstancesOfferings wrappedParam =
                                                             (com.amazon.ec2.DescribeReservedInstancesOfferings)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeReservedInstancesOfferings.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeReservedInstancesOfferingsResponse553 =
                                                   
                                                   
                                                         skel.describeReservedInstancesOfferings(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeReservedInstancesOfferingsResponse553, false);
                                    } else 

            if("deleteVpnConnection".equals(methodName)){
                
                com.amazon.ec2.DeleteVpnConnectionResponse deleteVpnConnectionResponse555 = null;
	                        com.amazon.ec2.DeleteVpnConnection wrappedParam =
                                                             (com.amazon.ec2.DeleteVpnConnection)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteVpnConnection.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteVpnConnectionResponse555 =
                                                   
                                                   
                                                         skel.deleteVpnConnection(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteVpnConnectionResponse555, false);
                                    } else 

            if("deleteInternetGateway".equals(methodName)){
                
                com.amazon.ec2.DeleteInternetGatewayResponse deleteInternetGatewayResponse557 = null;
	                        com.amazon.ec2.DeleteInternetGateway wrappedParam =
                                                             (com.amazon.ec2.DeleteInternetGateway)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteInternetGateway.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteInternetGatewayResponse557 =
                                                   
                                                   
                                                         skel.deleteInternetGateway(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteInternetGatewayResponse557, false);
                                    } else 

            if("deleteSpotDatafeedSubscription".equals(methodName)){
                
                com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse deleteSpotDatafeedSubscriptionResponse559 = null;
	                        com.amazon.ec2.DeleteSpotDatafeedSubscription wrappedParam =
                                                             (com.amazon.ec2.DeleteSpotDatafeedSubscription)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DeleteSpotDatafeedSubscription.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               deleteSpotDatafeedSubscriptionResponse559 =
                                                   
                                                   
                                                         skel.deleteSpotDatafeedSubscription(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), deleteSpotDatafeedSubscriptionResponse559, false);
                                    } else 

            if("attachNetworkInterface".equals(methodName)){
                
                com.amazon.ec2.AttachNetworkInterfaceResponse attachNetworkInterfaceResponse561 = null;
	                        com.amazon.ec2.AttachNetworkInterface wrappedParam =
                                                             (com.amazon.ec2.AttachNetworkInterface)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AttachNetworkInterface.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               attachNetworkInterfaceResponse561 =
                                                   
                                                   
                                                         skel.attachNetworkInterface(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), attachNetworkInterfaceResponse561, false);
                                    } else 

            if("createNetworkInterface".equals(methodName)){
                
                com.amazon.ec2.CreateNetworkInterfaceResponse createNetworkInterfaceResponse563 = null;
	                        com.amazon.ec2.CreateNetworkInterface wrappedParam =
                                                             (com.amazon.ec2.CreateNetworkInterface)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.CreateNetworkInterface.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               createNetworkInterfaceResponse563 =
                                                   
                                                   
                                                         skel.createNetworkInterface(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), createNetworkInterfaceResponse563, false);
                                    } else 

            if("revokeSecurityGroupEgress".equals(methodName)){
                
                com.amazon.ec2.RevokeSecurityGroupEgressResponse revokeSecurityGroupEgressResponse565 = null;
	                        com.amazon.ec2.RevokeSecurityGroupEgress wrappedParam =
                                                             (com.amazon.ec2.RevokeSecurityGroupEgress)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.RevokeSecurityGroupEgress.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               revokeSecurityGroupEgressResponse565 =
                                                   
                                                   
                                                         skel.revokeSecurityGroupEgress(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), revokeSecurityGroupEgressResponse565, false);
                                    } else 

            if("monitorInstances".equals(methodName)){
                
                com.amazon.ec2.MonitorInstancesResponse monitorInstancesResponse567 = null;
	                        com.amazon.ec2.MonitorInstances wrappedParam =
                                                             (com.amazon.ec2.MonitorInstances)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.MonitorInstances.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               monitorInstancesResponse567 =
                                                   
                                                   
                                                         skel.monitorInstances(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), monitorInstancesResponse567, false);
                                    } else 

            if("replaceRoute".equals(methodName)){
                
                com.amazon.ec2.ReplaceRouteResponse replaceRouteResponse569 = null;
	                        com.amazon.ec2.ReplaceRoute wrappedParam =
                                                             (com.amazon.ec2.ReplaceRoute)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.ReplaceRoute.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               replaceRouteResponse569 =
                                                   
                                                   
                                                         skel.replaceRoute(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), replaceRouteResponse569, false);
                                    } else 

            if("attachVolume".equals(methodName)){
                
                com.amazon.ec2.AttachVolumeResponse attachVolumeResponse571 = null;
	                        com.amazon.ec2.AttachVolume wrappedParam =
                                                             (com.amazon.ec2.AttachVolume)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.AttachVolume.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               attachVolumeResponse571 =
                                                   
                                                   
                                                         skel.attachVolume(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), attachVolumeResponse571, false);
                                    } else 

            if("getConsoleOutput".equals(methodName)){
                
                com.amazon.ec2.GetConsoleOutputResponse getConsoleOutputResponse573 = null;
	                        com.amazon.ec2.GetConsoleOutput wrappedParam =
                                                             (com.amazon.ec2.GetConsoleOutput)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.GetConsoleOutput.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               getConsoleOutputResponse573 =
                                                   
                                                   
                                                         skel.getConsoleOutput(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), getConsoleOutputResponse573, false);
                                    } else 

            if("describeRegions".equals(methodName)){
                
                com.amazon.ec2.DescribeRegionsResponse describeRegionsResponse575 = null;
	                        com.amazon.ec2.DescribeRegions wrappedParam =
                                                             (com.amazon.ec2.DescribeRegions)fromOM(
                                    msgContext.getEnvelope().getBody().getFirstElement(),
                                    com.amazon.ec2.DescribeRegions.class,
                                    getEnvelopeNamespaces(msgContext.getEnvelope()));
                                                
                                               describeRegionsResponse575 =
                                                   
                                                   
                                                         skel.describeRegions(wrappedParam)
                                                    ;
                                            
                                        envelope = toEnvelope(getSOAPFactory(msgContext), describeRegionsResponse575, false);
                                    
            } else {
              throw new java.lang.RuntimeException("method not found");
            }
        

        newMsgContext.setEnvelope(envelope);
        }
        }
        catch (java.lang.Exception e) {
        throw org.apache.axis2.AxisFault.makeFault(e);
        }
        }
        
        //
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribePlacementGroups param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribePlacementGroups.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribePlacementGroupsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribePlacementGroupsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSecurityGroup param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSecurityGroup.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSecurityGroupResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSecurityGroupResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetNetworkInterfaceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetNetworkInterfaceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetNetworkInterfaceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetNetworkInterfaceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateDhcpOptions param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateDhcpOptions.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateDhcpOptionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateDhcpOptionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateRouteTable param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateRouteTable.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateRouteTableResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateRouteTableResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSubnets param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSubnets.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSubnetsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSubnetsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeactivateLicense param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeactivateLicense.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeactivateLicenseResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeactivateLicenseResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpc param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpc.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpcResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpcResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelSpotInstanceRequests param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelSpotInstanceRequests.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelSpotInstanceRequestsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelSpotInstanceRequestsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSubnet param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSubnet.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSubnetResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSubnetResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkAclEntry param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkAclEntry.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkAclEntryResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkAclEntryResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RequestSpotInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RequestSpotInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RequestSpotInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RequestSpotInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumeAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumeAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumeAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumeAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateDhcpOptions param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateDhcpOptions.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateDhcpOptionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateDhcpOptionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeTags param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeTags.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeTagsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeTagsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportKeyPair param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportKeyPair.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportKeyPairResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportKeyPairResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkInterface param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkInterface.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkInterfaceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkInterfaceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpcs param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpcs.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpcsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpcsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeLicenses param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeLicenses.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeLicensesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeLicensesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.BundleInstance param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.BundleInstance.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.BundleInstanceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.BundleInstanceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpnConnections param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpnConnections.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpnConnectionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpnConnectionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeImages param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeImages.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeImagesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeImagesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateInternetGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateInternetGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateInternetGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateInternetGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisassociateRouteTable param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisassociateRouteTable.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisassociateRouteTableResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisassociateRouteTableResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceNetworkAclEntry param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceNetworkAclEntry.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceNetworkAclEntryResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceNetworkAclEntryResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AuthorizeSecurityGroupIngress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupIngress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AuthorizeSecurityGroupIngressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupIngressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSnapshotAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSnapshotAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSnapshotAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSnapshotAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetInstanceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetInstanceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetInstanceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetInstanceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateTags param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateTags.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateTagsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateTagsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AuthorizeSecurityGroupEgress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupEgress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AuthorizeSecurityGroupEgressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupEgressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateAddress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateAddress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateAddressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateAddressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeImageAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeImageAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeImageAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeImageAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotPriceHistory param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotPriceHistory.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotPriceHistoryResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotPriceHistoryResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifySnapshotAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifySnapshotAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifySnapshotAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifySnapshotAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotInstanceRequests param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotInstanceRequests.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotInstanceRequestsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotInstanceRequestsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportInstance param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportInstance.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportInstanceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportInstanceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeKeyPairs param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeKeyPairs.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeKeyPairsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeKeyPairsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RevokeSecurityGroupIngress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RevokeSecurityGroupIngress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RevokeSecurityGroupIngressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RevokeSecurityGroupIngressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreatePlacementGroup param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreatePlacementGroup.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreatePlacementGroupResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreatePlacementGroupResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkAclEntry param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkAclEntry.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkAclEntryResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkAclEntryResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ActivateLicense param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ActivateLicense.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ActivateLicenseResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ActivateLicenseResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteRouteTable param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteRouteTable.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteRouteTableResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteRouteTableResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.UnmonitorInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.UnmonitorInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.UnmonitorInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.UnmonitorInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.StartInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.StartInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.StartInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.StartInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ConfirmProductInstance param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ConfirmProductInstance.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ConfirmProductInstanceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ConfirmProductInstanceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkInterfaceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkInterfaceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RunInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RunInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RunInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RunInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateReservedInstancesListing param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateReservedInstancesListing.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateReservedInstancesListingResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateReservedInstancesListingResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateCustomerGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateCustomerGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateCustomerGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateCustomerGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkAcl param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkAcl.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkAclResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkAclResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetImageAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetImageAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetImageAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetImageAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyVolumeAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyVolumeAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyVolumeAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyVolumeAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetSnapshotAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetSnapshotAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ResetSnapshotAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ResetSnapshotAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVolume param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVolume.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVolumeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVolumeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeAvailabilityZones param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeAvailabilityZones.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeAvailabilityZonesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeAvailabilityZonesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnConnection param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnConnection.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnConnectionResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnConnectionResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelBundleTask param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelBundleTask.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelBundleTaskResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelBundleTaskResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceNetworkAclAssociation param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceNetworkAclAssociation.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceNetworkAclAssociationResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceNetworkAclAssociationResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachVpnGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachVpnGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachVpnGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachVpnGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSnapshots param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSnapshots.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSnapshotsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSnapshotsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSubnet param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSubnet.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSubnetResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSubnetResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeBundleTasks param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeBundleTasks.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeBundleTasksResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeBundleTasksResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateKeyPair param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateKeyPair.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateKeyPairResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateKeyPairResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateImage param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateImage.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateImageResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateImageResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.EnableVgwRoutePropagation param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.EnableVgwRoutePropagation.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.EnableVgwRoutePropagationResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.EnableVgwRoutePropagationResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.UnassignPrivateIpAddresses param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.UnassignPrivateIpAddresses.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.UnassignPrivateIpAddressesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.UnassignPrivateIpAddressesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeregisterImage param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeregisterImage.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeregisterImageResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeregisterImageResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnConnectionRoute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnConnectionRoute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnConnectionRouteResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnConnectionRouteResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyImageAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyImageAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyImageAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyImageAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelConversionTask param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelConversionTask.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelConversionTaskResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelConversionTaskResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumes param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumes.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelReservedInstancesListing param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelReservedInstancesListing.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelReservedInstancesListingResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelReservedInstancesListingResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.GetPasswordData param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.GetPasswordData.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.GetPasswordDataResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.GetPasswordDataResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AllocateAddress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AllocateAddress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AllocateAddressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AllocateAddressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSecurityGroup param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSecurityGroup.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSecurityGroupResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSecurityGroupResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeletePlacementGroup param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeletePlacementGroup.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeletePlacementGroupResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeletePlacementGroupResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisassociateAddress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisassociateAddress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisassociateAddressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisassociateAddressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteDhcpOptions param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteDhcpOptions.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteDhcpOptionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteDhcpOptionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotDatafeedSubscription param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotDatafeedSubscription.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkAcls param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkAcls.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkAclsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkAclsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.EnableVolumeIO param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.EnableVolumeIO.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.EnableVolumeIOResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.EnableVolumeIOResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachVpnGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachVpnGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachVpnGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachVpnGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInternetGateways param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInternetGateways.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInternetGatewaysResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInternetGatewaysResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeDhcpOptions param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeDhcpOptions.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeDhcpOptionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeDhcpOptionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSpotDatafeedSubscription param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSpotDatafeedSubscription.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstancesListings param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstancesListings.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstancesListingsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstancesListingsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstanceStatus param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstanceStatus.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstanceStatusResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstanceStatusResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyNetworkInterfaceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyNetworkInterfaceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisableVgwRoutePropagation param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisableVgwRoutePropagation.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DisableVgwRoutePropagationResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DisableVgwRoutePropagationResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumeStatus param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumeStatus.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVolumeStatusResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVolumeStatusResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachNetworkInterface param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachNetworkInterface.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachNetworkInterfaceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachNetworkInterfaceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSecurityGroups param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSecurityGroups.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeSecurityGroupsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeSecurityGroupsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkInterfaces param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkInterfaces.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeNetworkInterfacesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeNetworkInterfacesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteKeyPair param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteKeyPair.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteKeyPairResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteKeyPairResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSnapshot param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSnapshot.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateSnapshotResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateSnapshotResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpnGateways param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpnGateways.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeVpnGatewaysResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeVpnGatewaysResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteTags param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteTags.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteTagsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteTagsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSnapshot param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSnapshot.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSnapshotResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSnapshotResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteCustomerGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteCustomerGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteCustomerGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteCustomerGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVolume param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVolume.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVolumeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVolumeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelExportTask param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelExportTask.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CancelExportTaskResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CancelExportTaskResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RegisterImage param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RegisterImage.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RegisterImageResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RegisterImageResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachVolume param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachVolume.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachVolumeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachVolumeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.StopInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.StopInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.StopInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.StopInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateRoute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateRoute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateRouteResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateRouteResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReleaseAddress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReleaseAddress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReleaseAddressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReleaseAddressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeRouteTables param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeRouteTables.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeRouteTablesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeRouteTablesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeCustomerGateways param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeCustomerGateways.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeCustomerGatewaysResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeCustomerGatewaysResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkAcl param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkAcl.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteNetworkAclResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteNetworkAclResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteRoute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteRoute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteRouteResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteRouteResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RebootInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RebootInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RebootInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RebootInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyInstanceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyInstanceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ModifyInstanceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ModifyInstanceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.TerminateInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.TerminateInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.TerminateInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.TerminateInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnConnectionRoute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnConnectionRoute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpnConnectionRouteResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpnConnectionRouteResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeConversionTasks param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeConversionTasks.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeConversionTasksResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeConversionTasksResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeAddresses param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeAddresses.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeAddressesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeAddressesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstanceAttribute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstanceAttribute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeInstanceAttributeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeInstanceAttributeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachInternetGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachInternetGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachInternetGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachInternetGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpc param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpc.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateVpcResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateVpcResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceRouteTableAssociation param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceRouteTableAssociation.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceRouteTableAssociationResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceRouteTableAssociationResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateRouteTable param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateRouteTable.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssociateRouteTableResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssociateRouteTableResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachInternetGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachInternetGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DetachInternetGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DetachInternetGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.PurchaseReservedInstancesOffering param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.PurchaseReservedInstancesOffering.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.PurchaseReservedInstancesOfferingResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.PurchaseReservedInstancesOfferingResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportVolume param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportVolume.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ImportVolumeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ImportVolumeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeExportTasks param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeExportTasks.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeExportTasksResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeExportTasksResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateInstanceExportTask param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateInstanceExportTask.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateInstanceExportTaskResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateInstanceExportTaskResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssignPrivateIpAddresses param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssignPrivateIpAddresses.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AssignPrivateIpAddressesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AssignPrivateIpAddressesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReportInstanceStatus param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReportInstanceStatus.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReportInstanceStatusResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReportInstanceStatusResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstancesOfferings param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstancesOfferings.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeReservedInstancesOfferingsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeReservedInstancesOfferingsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnConnection param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnConnection.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteVpnConnectionResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteVpnConnectionResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteInternetGateway param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteInternetGateway.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteInternetGatewayResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteInternetGatewayResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSpotDatafeedSubscription param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSpotDatafeedSubscription.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachNetworkInterface param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachNetworkInterface.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachNetworkInterfaceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachNetworkInterfaceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkInterface param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkInterface.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.CreateNetworkInterfaceResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.CreateNetworkInterfaceResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RevokeSecurityGroupEgress param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RevokeSecurityGroupEgress.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.RevokeSecurityGroupEgressResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.RevokeSecurityGroupEgressResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.MonitorInstances param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.MonitorInstances.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.MonitorInstancesResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.MonitorInstancesResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceRoute param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceRoute.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.ReplaceRouteResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.ReplaceRouteResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachVolume param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachVolume.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.AttachVolumeResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.AttachVolumeResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.GetConsoleOutput param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.GetConsoleOutput.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.GetConsoleOutputResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.GetConsoleOutputResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeRegions param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeRegions.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
            private  org.apache.axiom.om.OMElement  toOM(com.amazon.ec2.DescribeRegionsResponse param, boolean optimizeContent)
            throws org.apache.axis2.AxisFault {

            
                        try{
                             return param.getOMElement(com.amazon.ec2.DescribeRegionsResponse.MY_QNAME,
                                          org.apache.axiom.om.OMAbstractFactory.getOMFactory());
                        } catch(org.apache.axis2.databinding.ADBException e){
                            throw org.apache.axis2.AxisFault.makeFault(e);
                        }
                    

            }
        
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribePlacementGroupsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribePlacementGroupsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribePlacementGroupsResponse wrapDescribePlacementGroups(){
                                com.amazon.ec2.DescribePlacementGroupsResponse wrappedElement = new com.amazon.ec2.DescribePlacementGroupsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateSecurityGroupResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateSecurityGroupResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateSecurityGroupResponse wrapCreateSecurityGroup(){
                                com.amazon.ec2.CreateSecurityGroupResponse wrappedElement = new com.amazon.ec2.CreateSecurityGroupResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ResetNetworkInterfaceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ResetNetworkInterfaceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ResetNetworkInterfaceAttributeResponse wrapResetNetworkInterfaceAttribute(){
                                com.amazon.ec2.ResetNetworkInterfaceAttributeResponse wrappedElement = new com.amazon.ec2.ResetNetworkInterfaceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateDhcpOptionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateDhcpOptionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateDhcpOptionsResponse wrapCreateDhcpOptions(){
                                com.amazon.ec2.CreateDhcpOptionsResponse wrappedElement = new com.amazon.ec2.CreateDhcpOptionsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateRouteTableResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateRouteTableResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateRouteTableResponse wrapCreateRouteTable(){
                                com.amazon.ec2.CreateRouteTableResponse wrappedElement = new com.amazon.ec2.CreateRouteTableResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSubnetsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSubnetsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSubnetsResponse wrapDescribeSubnets(){
                                com.amazon.ec2.DescribeSubnetsResponse wrappedElement = new com.amazon.ec2.DescribeSubnetsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeactivateLicenseResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeactivateLicenseResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeactivateLicenseResponse wrapDeactivateLicense(){
                                com.amazon.ec2.DeactivateLicenseResponse wrappedElement = new com.amazon.ec2.DeactivateLicenseResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteVpcResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteVpcResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteVpcResponse wrapDeleteVpc(){
                                com.amazon.ec2.DeleteVpcResponse wrappedElement = new com.amazon.ec2.DeleteVpcResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CancelSpotInstanceRequestsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CancelSpotInstanceRequestsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CancelSpotInstanceRequestsResponse wrapCancelSpotInstanceRequests(){
                                com.amazon.ec2.CancelSpotInstanceRequestsResponse wrappedElement = new com.amazon.ec2.CancelSpotInstanceRequestsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateSubnetResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateSubnetResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateSubnetResponse wrapCreateSubnet(){
                                com.amazon.ec2.CreateSubnetResponse wrappedElement = new com.amazon.ec2.CreateSubnetResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteVpnGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteVpnGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteVpnGatewayResponse wrapDeleteVpnGateway(){
                                com.amazon.ec2.DeleteVpnGatewayResponse wrappedElement = new com.amazon.ec2.DeleteVpnGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateNetworkAclEntryResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateNetworkAclEntryResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateNetworkAclEntryResponse wrapCreateNetworkAclEntry(){
                                com.amazon.ec2.CreateNetworkAclEntryResponse wrappedElement = new com.amazon.ec2.CreateNetworkAclEntryResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RequestSpotInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RequestSpotInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RequestSpotInstancesResponse wrapRequestSpotInstances(){
                                com.amazon.ec2.RequestSpotInstancesResponse wrappedElement = new com.amazon.ec2.RequestSpotInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVolumeAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVolumeAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVolumeAttributeResponse wrapDescribeVolumeAttribute(){
                                com.amazon.ec2.DescribeVolumeAttributeResponse wrappedElement = new com.amazon.ec2.DescribeVolumeAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AssociateDhcpOptionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AssociateDhcpOptionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AssociateDhcpOptionsResponse wrapAssociateDhcpOptions(){
                                com.amazon.ec2.AssociateDhcpOptionsResponse wrappedElement = new com.amazon.ec2.AssociateDhcpOptionsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeTagsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeTagsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeTagsResponse wrapDescribeTags(){
                                com.amazon.ec2.DescribeTagsResponse wrappedElement = new com.amazon.ec2.DescribeTagsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ImportKeyPairResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ImportKeyPairResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ImportKeyPairResponse wrapImportKeyPair(){
                                com.amazon.ec2.ImportKeyPairResponse wrappedElement = new com.amazon.ec2.ImportKeyPairResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteNetworkInterfaceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteNetworkInterfaceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteNetworkInterfaceResponse wrapDeleteNetworkInterface(){
                                com.amazon.ec2.DeleteNetworkInterfaceResponse wrappedElement = new com.amazon.ec2.DeleteNetworkInterfaceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVpcsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVpcsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVpcsResponse wrapDescribeVpcs(){
                                com.amazon.ec2.DescribeVpcsResponse wrappedElement = new com.amazon.ec2.DescribeVpcsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeLicensesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeLicensesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeLicensesResponse wrapDescribeLicenses(){
                                com.amazon.ec2.DescribeLicensesResponse wrappedElement = new com.amazon.ec2.DescribeLicensesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.BundleInstanceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.BundleInstanceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.BundleInstanceResponse wrapBundleInstance(){
                                com.amazon.ec2.BundleInstanceResponse wrappedElement = new com.amazon.ec2.BundleInstanceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVpnConnectionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVpnConnectionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVpnConnectionsResponse wrapDescribeVpnConnections(){
                                com.amazon.ec2.DescribeVpnConnectionsResponse wrappedElement = new com.amazon.ec2.DescribeVpnConnectionsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeImagesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeImagesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeImagesResponse wrapDescribeImages(){
                                com.amazon.ec2.DescribeImagesResponse wrappedElement = new com.amazon.ec2.DescribeImagesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateInternetGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateInternetGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateInternetGatewayResponse wrapCreateInternetGateway(){
                                com.amazon.ec2.CreateInternetGatewayResponse wrappedElement = new com.amazon.ec2.CreateInternetGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DisassociateRouteTableResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DisassociateRouteTableResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DisassociateRouteTableResponse wrapDisassociateRouteTable(){
                                com.amazon.ec2.DisassociateRouteTableResponse wrappedElement = new com.amazon.ec2.DisassociateRouteTableResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReplaceNetworkAclEntryResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReplaceNetworkAclEntryResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReplaceNetworkAclEntryResponse wrapReplaceNetworkAclEntry(){
                                com.amazon.ec2.ReplaceNetworkAclEntryResponse wrappedElement = new com.amazon.ec2.ReplaceNetworkAclEntryResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AuthorizeSecurityGroupIngressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupIngressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AuthorizeSecurityGroupIngressResponse wrapAuthorizeSecurityGroupIngress(){
                                com.amazon.ec2.AuthorizeSecurityGroupIngressResponse wrappedElement = new com.amazon.ec2.AuthorizeSecurityGroupIngressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSnapshotAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSnapshotAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSnapshotAttributeResponse wrapDescribeSnapshotAttribute(){
                                com.amazon.ec2.DescribeSnapshotAttributeResponse wrappedElement = new com.amazon.ec2.DescribeSnapshotAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateVpnGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateVpnGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateVpnGatewayResponse wrapCreateVpnGateway(){
                                com.amazon.ec2.CreateVpnGatewayResponse wrappedElement = new com.amazon.ec2.CreateVpnGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ResetInstanceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ResetInstanceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ResetInstanceAttributeResponse wrapResetInstanceAttribute(){
                                com.amazon.ec2.ResetInstanceAttributeResponse wrappedElement = new com.amazon.ec2.ResetInstanceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateTagsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateTagsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateTagsResponse wrapCreateTags(){
                                com.amazon.ec2.CreateTagsResponse wrappedElement = new com.amazon.ec2.CreateTagsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AuthorizeSecurityGroupEgressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AuthorizeSecurityGroupEgressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AuthorizeSecurityGroupEgressResponse wrapAuthorizeSecurityGroupEgress(){
                                com.amazon.ec2.AuthorizeSecurityGroupEgressResponse wrappedElement = new com.amazon.ec2.AuthorizeSecurityGroupEgressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AssociateAddressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AssociateAddressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AssociateAddressResponse wrapAssociateAddress(){
                                com.amazon.ec2.AssociateAddressResponse wrappedElement = new com.amazon.ec2.AssociateAddressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeImageAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeImageAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeImageAttributeResponse wrapDescribeImageAttribute(){
                                com.amazon.ec2.DescribeImageAttributeResponse wrappedElement = new com.amazon.ec2.DescribeImageAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSpotPriceHistoryResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSpotPriceHistoryResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSpotPriceHistoryResponse wrapDescribeSpotPriceHistory(){
                                com.amazon.ec2.DescribeSpotPriceHistoryResponse wrappedElement = new com.amazon.ec2.DescribeSpotPriceHistoryResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ModifySnapshotAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ModifySnapshotAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ModifySnapshotAttributeResponse wrapModifySnapshotAttribute(){
                                com.amazon.ec2.ModifySnapshotAttributeResponse wrappedElement = new com.amazon.ec2.ModifySnapshotAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSpotInstanceRequestsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSpotInstanceRequestsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSpotInstanceRequestsResponse wrapDescribeSpotInstanceRequests(){
                                com.amazon.ec2.DescribeSpotInstanceRequestsResponse wrappedElement = new com.amazon.ec2.DescribeSpotInstanceRequestsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ImportInstanceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ImportInstanceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ImportInstanceResponse wrapImportInstance(){
                                com.amazon.ec2.ImportInstanceResponse wrappedElement = new com.amazon.ec2.ImportInstanceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeKeyPairsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeKeyPairsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeKeyPairsResponse wrapDescribeKeyPairs(){
                                com.amazon.ec2.DescribeKeyPairsResponse wrappedElement = new com.amazon.ec2.DescribeKeyPairsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RevokeSecurityGroupIngressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RevokeSecurityGroupIngressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RevokeSecurityGroupIngressResponse wrapRevokeSecurityGroupIngress(){
                                com.amazon.ec2.RevokeSecurityGroupIngressResponse wrappedElement = new com.amazon.ec2.RevokeSecurityGroupIngressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreatePlacementGroupResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreatePlacementGroupResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreatePlacementGroupResponse wrapCreatePlacementGroup(){
                                com.amazon.ec2.CreatePlacementGroupResponse wrappedElement = new com.amazon.ec2.CreatePlacementGroupResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteNetworkAclEntryResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteNetworkAclEntryResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteNetworkAclEntryResponse wrapDeleteNetworkAclEntry(){
                                com.amazon.ec2.DeleteNetworkAclEntryResponse wrappedElement = new com.amazon.ec2.DeleteNetworkAclEntryResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ActivateLicenseResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ActivateLicenseResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ActivateLicenseResponse wrapActivateLicense(){
                                com.amazon.ec2.ActivateLicenseResponse wrappedElement = new com.amazon.ec2.ActivateLicenseResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteRouteTableResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteRouteTableResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteRouteTableResponse wrapDeleteRouteTable(){
                                com.amazon.ec2.DeleteRouteTableResponse wrappedElement = new com.amazon.ec2.DeleteRouteTableResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.UnmonitorInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.UnmonitorInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.UnmonitorInstancesResponse wrapUnmonitorInstances(){
                                com.amazon.ec2.UnmonitorInstancesResponse wrappedElement = new com.amazon.ec2.UnmonitorInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.StartInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.StartInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.StartInstancesResponse wrapStartInstances(){
                                com.amazon.ec2.StartInstancesResponse wrappedElement = new com.amazon.ec2.StartInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ConfirmProductInstanceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ConfirmProductInstanceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ConfirmProductInstanceResponse wrapConfirmProductInstance(){
                                com.amazon.ec2.ConfirmProductInstanceResponse wrappedElement = new com.amazon.ec2.ConfirmProductInstanceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse wrapDescribeNetworkInterfaceAttribute(){
                                com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse wrappedElement = new com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RunInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RunInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RunInstancesResponse wrapRunInstances(){
                                com.amazon.ec2.RunInstancesResponse wrappedElement = new com.amazon.ec2.RunInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateReservedInstancesListingResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateReservedInstancesListingResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateReservedInstancesListingResponse wrapCreateReservedInstancesListing(){
                                com.amazon.ec2.CreateReservedInstancesListingResponse wrappedElement = new com.amazon.ec2.CreateReservedInstancesListingResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateCustomerGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateCustomerGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateCustomerGatewayResponse wrapCreateCustomerGateway(){
                                com.amazon.ec2.CreateCustomerGatewayResponse wrappedElement = new com.amazon.ec2.CreateCustomerGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateNetworkAclResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateNetworkAclResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateNetworkAclResponse wrapCreateNetworkAcl(){
                                com.amazon.ec2.CreateNetworkAclResponse wrappedElement = new com.amazon.ec2.CreateNetworkAclResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ResetImageAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ResetImageAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ResetImageAttributeResponse wrapResetImageAttribute(){
                                com.amazon.ec2.ResetImageAttributeResponse wrappedElement = new com.amazon.ec2.ResetImageAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ModifyVolumeAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ModifyVolumeAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ModifyVolumeAttributeResponse wrapModifyVolumeAttribute(){
                                com.amazon.ec2.ModifyVolumeAttributeResponse wrappedElement = new com.amazon.ec2.ModifyVolumeAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeReservedInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeReservedInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeReservedInstancesResponse wrapDescribeReservedInstances(){
                                com.amazon.ec2.DescribeReservedInstancesResponse wrappedElement = new com.amazon.ec2.DescribeReservedInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ResetSnapshotAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ResetSnapshotAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ResetSnapshotAttributeResponse wrapResetSnapshotAttribute(){
                                com.amazon.ec2.ResetSnapshotAttributeResponse wrappedElement = new com.amazon.ec2.ResetSnapshotAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteVolumeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteVolumeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteVolumeResponse wrapDeleteVolume(){
                                com.amazon.ec2.DeleteVolumeResponse wrappedElement = new com.amazon.ec2.DeleteVolumeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeAvailabilityZonesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeAvailabilityZonesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeAvailabilityZonesResponse wrapDescribeAvailabilityZones(){
                                com.amazon.ec2.DescribeAvailabilityZonesResponse wrappedElement = new com.amazon.ec2.DescribeAvailabilityZonesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateVpnConnectionResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateVpnConnectionResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateVpnConnectionResponse wrapCreateVpnConnection(){
                                com.amazon.ec2.CreateVpnConnectionResponse wrappedElement = new com.amazon.ec2.CreateVpnConnectionResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CancelBundleTaskResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CancelBundleTaskResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CancelBundleTaskResponse wrapCancelBundleTask(){
                                com.amazon.ec2.CancelBundleTaskResponse wrappedElement = new com.amazon.ec2.CancelBundleTaskResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReplaceNetworkAclAssociationResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReplaceNetworkAclAssociationResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReplaceNetworkAclAssociationResponse wrapReplaceNetworkAclAssociation(){
                                com.amazon.ec2.ReplaceNetworkAclAssociationResponse wrappedElement = new com.amazon.ec2.ReplaceNetworkAclAssociationResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DetachVpnGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DetachVpnGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DetachVpnGatewayResponse wrapDetachVpnGateway(){
                                com.amazon.ec2.DetachVpnGatewayResponse wrappedElement = new com.amazon.ec2.DetachVpnGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSnapshotsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSnapshotsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSnapshotsResponse wrapDescribeSnapshots(){
                                com.amazon.ec2.DescribeSnapshotsResponse wrappedElement = new com.amazon.ec2.DescribeSnapshotsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteSubnetResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteSubnetResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteSubnetResponse wrapDeleteSubnet(){
                                com.amazon.ec2.DeleteSubnetResponse wrappedElement = new com.amazon.ec2.DeleteSubnetResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeBundleTasksResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeBundleTasksResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeBundleTasksResponse wrapDescribeBundleTasks(){
                                com.amazon.ec2.DescribeBundleTasksResponse wrappedElement = new com.amazon.ec2.DescribeBundleTasksResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateKeyPairResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateKeyPairResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateKeyPairResponse wrapCreateKeyPair(){
                                com.amazon.ec2.CreateKeyPairResponse wrappedElement = new com.amazon.ec2.CreateKeyPairResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateImageResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateImageResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateImageResponse wrapCreateImage(){
                                com.amazon.ec2.CreateImageResponse wrappedElement = new com.amazon.ec2.CreateImageResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.EnableVgwRoutePropagationResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.EnableVgwRoutePropagationResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.EnableVgwRoutePropagationResponse wrapEnableVgwRoutePropagation(){
                                com.amazon.ec2.EnableVgwRoutePropagationResponse wrappedElement = new com.amazon.ec2.EnableVgwRoutePropagationResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.UnassignPrivateIpAddressesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.UnassignPrivateIpAddressesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.UnassignPrivateIpAddressesResponse wrapUnassignPrivateIpAddresses(){
                                com.amazon.ec2.UnassignPrivateIpAddressesResponse wrappedElement = new com.amazon.ec2.UnassignPrivateIpAddressesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeregisterImageResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeregisterImageResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeregisterImageResponse wrapDeregisterImage(){
                                com.amazon.ec2.DeregisterImageResponse wrappedElement = new com.amazon.ec2.DeregisterImageResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteVpnConnectionRouteResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteVpnConnectionRouteResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteVpnConnectionRouteResponse wrapDeleteVpnConnectionRoute(){
                                com.amazon.ec2.DeleteVpnConnectionRouteResponse wrappedElement = new com.amazon.ec2.DeleteVpnConnectionRouteResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ModifyImageAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ModifyImageAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ModifyImageAttributeResponse wrapModifyImageAttribute(){
                                com.amazon.ec2.ModifyImageAttributeResponse wrappedElement = new com.amazon.ec2.ModifyImageAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CancelConversionTaskResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CancelConversionTaskResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CancelConversionTaskResponse wrapCancelConversionTask(){
                                com.amazon.ec2.CancelConversionTaskResponse wrappedElement = new com.amazon.ec2.CancelConversionTaskResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVolumesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVolumesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVolumesResponse wrapDescribeVolumes(){
                                com.amazon.ec2.DescribeVolumesResponse wrappedElement = new com.amazon.ec2.DescribeVolumesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CancelReservedInstancesListingResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CancelReservedInstancesListingResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CancelReservedInstancesListingResponse wrapCancelReservedInstancesListing(){
                                com.amazon.ec2.CancelReservedInstancesListingResponse wrappedElement = new com.amazon.ec2.CancelReservedInstancesListingResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.GetPasswordDataResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.GetPasswordDataResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.GetPasswordDataResponse wrapGetPasswordData(){
                                com.amazon.ec2.GetPasswordDataResponse wrappedElement = new com.amazon.ec2.GetPasswordDataResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AllocateAddressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AllocateAddressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AllocateAddressResponse wrapAllocateAddress(){
                                com.amazon.ec2.AllocateAddressResponse wrappedElement = new com.amazon.ec2.AllocateAddressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteSecurityGroupResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteSecurityGroupResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteSecurityGroupResponse wrapDeleteSecurityGroup(){
                                com.amazon.ec2.DeleteSecurityGroupResponse wrappedElement = new com.amazon.ec2.DeleteSecurityGroupResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeletePlacementGroupResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeletePlacementGroupResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeletePlacementGroupResponse wrapDeletePlacementGroup(){
                                com.amazon.ec2.DeletePlacementGroupResponse wrappedElement = new com.amazon.ec2.DeletePlacementGroupResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DisassociateAddressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DisassociateAddressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DisassociateAddressResponse wrapDisassociateAddress(){
                                com.amazon.ec2.DisassociateAddressResponse wrappedElement = new com.amazon.ec2.DisassociateAddressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteDhcpOptionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteDhcpOptionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteDhcpOptionsResponse wrapDeleteDhcpOptions(){
                                com.amazon.ec2.DeleteDhcpOptionsResponse wrappedElement = new com.amazon.ec2.DeleteDhcpOptionsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse wrapDescribeSpotDatafeedSubscription(){
                                com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse wrappedElement = new com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeNetworkAclsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeNetworkAclsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeNetworkAclsResponse wrapDescribeNetworkAcls(){
                                com.amazon.ec2.DescribeNetworkAclsResponse wrappedElement = new com.amazon.ec2.DescribeNetworkAclsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.EnableVolumeIOResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.EnableVolumeIOResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.EnableVolumeIOResponse wrapEnableVolumeIO(){
                                com.amazon.ec2.EnableVolumeIOResponse wrappedElement = new com.amazon.ec2.EnableVolumeIOResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AttachVpnGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AttachVpnGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AttachVpnGatewayResponse wrapAttachVpnGateway(){
                                com.amazon.ec2.AttachVpnGatewayResponse wrappedElement = new com.amazon.ec2.AttachVpnGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeInternetGatewaysResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeInternetGatewaysResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeInternetGatewaysResponse wrapDescribeInternetGateways(){
                                com.amazon.ec2.DescribeInternetGatewaysResponse wrappedElement = new com.amazon.ec2.DescribeInternetGatewaysResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeDhcpOptionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeDhcpOptionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeDhcpOptionsResponse wrapDescribeDhcpOptions(){
                                com.amazon.ec2.DescribeDhcpOptionsResponse wrappedElement = new com.amazon.ec2.DescribeDhcpOptionsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse wrapCreateSpotDatafeedSubscription(){
                                com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse wrappedElement = new com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeReservedInstancesListingsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeReservedInstancesListingsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeReservedInstancesListingsResponse wrapDescribeReservedInstancesListings(){
                                com.amazon.ec2.DescribeReservedInstancesListingsResponse wrappedElement = new com.amazon.ec2.DescribeReservedInstancesListingsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeInstanceStatusResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeInstanceStatusResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeInstanceStatusResponse wrapDescribeInstanceStatus(){
                                com.amazon.ec2.DescribeInstanceStatusResponse wrappedElement = new com.amazon.ec2.DescribeInstanceStatusResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse wrapModifyNetworkInterfaceAttribute(){
                                com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse wrappedElement = new com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DisableVgwRoutePropagationResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DisableVgwRoutePropagationResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DisableVgwRoutePropagationResponse wrapDisableVgwRoutePropagation(){
                                com.amazon.ec2.DisableVgwRoutePropagationResponse wrappedElement = new com.amazon.ec2.DisableVgwRoutePropagationResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVolumeStatusResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVolumeStatusResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVolumeStatusResponse wrapDescribeVolumeStatus(){
                                com.amazon.ec2.DescribeVolumeStatusResponse wrappedElement = new com.amazon.ec2.DescribeVolumeStatusResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DetachNetworkInterfaceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DetachNetworkInterfaceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DetachNetworkInterfaceResponse wrapDetachNetworkInterface(){
                                com.amazon.ec2.DetachNetworkInterfaceResponse wrappedElement = new com.amazon.ec2.DetachNetworkInterfaceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeSecurityGroupsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeSecurityGroupsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeSecurityGroupsResponse wrapDescribeSecurityGroups(){
                                com.amazon.ec2.DescribeSecurityGroupsResponse wrappedElement = new com.amazon.ec2.DescribeSecurityGroupsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeInstancesResponse wrapDescribeInstances(){
                                com.amazon.ec2.DescribeInstancesResponse wrappedElement = new com.amazon.ec2.DescribeInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeNetworkInterfacesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeNetworkInterfacesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeNetworkInterfacesResponse wrapDescribeNetworkInterfaces(){
                                com.amazon.ec2.DescribeNetworkInterfacesResponse wrappedElement = new com.amazon.ec2.DescribeNetworkInterfacesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteKeyPairResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteKeyPairResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteKeyPairResponse wrapDeleteKeyPair(){
                                com.amazon.ec2.DeleteKeyPairResponse wrappedElement = new com.amazon.ec2.DeleteKeyPairResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateSnapshotResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateSnapshotResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateSnapshotResponse wrapCreateSnapshot(){
                                com.amazon.ec2.CreateSnapshotResponse wrappedElement = new com.amazon.ec2.CreateSnapshotResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeVpnGatewaysResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeVpnGatewaysResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeVpnGatewaysResponse wrapDescribeVpnGateways(){
                                com.amazon.ec2.DescribeVpnGatewaysResponse wrappedElement = new com.amazon.ec2.DescribeVpnGatewaysResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteTagsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteTagsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteTagsResponse wrapDeleteTags(){
                                com.amazon.ec2.DeleteTagsResponse wrappedElement = new com.amazon.ec2.DeleteTagsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteSnapshotResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteSnapshotResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteSnapshotResponse wrapDeleteSnapshot(){
                                com.amazon.ec2.DeleteSnapshotResponse wrappedElement = new com.amazon.ec2.DeleteSnapshotResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteCustomerGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteCustomerGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteCustomerGatewayResponse wrapDeleteCustomerGateway(){
                                com.amazon.ec2.DeleteCustomerGatewayResponse wrappedElement = new com.amazon.ec2.DeleteCustomerGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateVolumeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateVolumeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateVolumeResponse wrapCreateVolume(){
                                com.amazon.ec2.CreateVolumeResponse wrappedElement = new com.amazon.ec2.CreateVolumeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CancelExportTaskResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CancelExportTaskResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CancelExportTaskResponse wrapCancelExportTask(){
                                com.amazon.ec2.CancelExportTaskResponse wrappedElement = new com.amazon.ec2.CancelExportTaskResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RegisterImageResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RegisterImageResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RegisterImageResponse wrapRegisterImage(){
                                com.amazon.ec2.RegisterImageResponse wrappedElement = new com.amazon.ec2.RegisterImageResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DetachVolumeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DetachVolumeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DetachVolumeResponse wrapDetachVolume(){
                                com.amazon.ec2.DetachVolumeResponse wrappedElement = new com.amazon.ec2.DetachVolumeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.StopInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.StopInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.StopInstancesResponse wrapStopInstances(){
                                com.amazon.ec2.StopInstancesResponse wrappedElement = new com.amazon.ec2.StopInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateRouteResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateRouteResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateRouteResponse wrapCreateRoute(){
                                com.amazon.ec2.CreateRouteResponse wrappedElement = new com.amazon.ec2.CreateRouteResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReleaseAddressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReleaseAddressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReleaseAddressResponse wrapReleaseAddress(){
                                com.amazon.ec2.ReleaseAddressResponse wrappedElement = new com.amazon.ec2.ReleaseAddressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeRouteTablesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeRouteTablesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeRouteTablesResponse wrapDescribeRouteTables(){
                                com.amazon.ec2.DescribeRouteTablesResponse wrappedElement = new com.amazon.ec2.DescribeRouteTablesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeCustomerGatewaysResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeCustomerGatewaysResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeCustomerGatewaysResponse wrapDescribeCustomerGateways(){
                                com.amazon.ec2.DescribeCustomerGatewaysResponse wrappedElement = new com.amazon.ec2.DescribeCustomerGatewaysResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteNetworkAclResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteNetworkAclResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteNetworkAclResponse wrapDeleteNetworkAcl(){
                                com.amazon.ec2.DeleteNetworkAclResponse wrappedElement = new com.amazon.ec2.DeleteNetworkAclResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteRouteResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteRouteResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteRouteResponse wrapDeleteRoute(){
                                com.amazon.ec2.DeleteRouteResponse wrappedElement = new com.amazon.ec2.DeleteRouteResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RebootInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RebootInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RebootInstancesResponse wrapRebootInstances(){
                                com.amazon.ec2.RebootInstancesResponse wrappedElement = new com.amazon.ec2.RebootInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ModifyInstanceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ModifyInstanceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ModifyInstanceAttributeResponse wrapModifyInstanceAttribute(){
                                com.amazon.ec2.ModifyInstanceAttributeResponse wrappedElement = new com.amazon.ec2.ModifyInstanceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.TerminateInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.TerminateInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.TerminateInstancesResponse wrapTerminateInstances(){
                                com.amazon.ec2.TerminateInstancesResponse wrappedElement = new com.amazon.ec2.TerminateInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateVpnConnectionRouteResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateVpnConnectionRouteResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateVpnConnectionRouteResponse wrapCreateVpnConnectionRoute(){
                                com.amazon.ec2.CreateVpnConnectionRouteResponse wrappedElement = new com.amazon.ec2.CreateVpnConnectionRouteResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeConversionTasksResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeConversionTasksResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeConversionTasksResponse wrapDescribeConversionTasks(){
                                com.amazon.ec2.DescribeConversionTasksResponse wrappedElement = new com.amazon.ec2.DescribeConversionTasksResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeAddressesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeAddressesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeAddressesResponse wrapDescribeAddresses(){
                                com.amazon.ec2.DescribeAddressesResponse wrappedElement = new com.amazon.ec2.DescribeAddressesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeInstanceAttributeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeInstanceAttributeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeInstanceAttributeResponse wrapDescribeInstanceAttribute(){
                                com.amazon.ec2.DescribeInstanceAttributeResponse wrappedElement = new com.amazon.ec2.DescribeInstanceAttributeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AttachInternetGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AttachInternetGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AttachInternetGatewayResponse wrapAttachInternetGateway(){
                                com.amazon.ec2.AttachInternetGatewayResponse wrappedElement = new com.amazon.ec2.AttachInternetGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateVpcResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateVpcResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateVpcResponse wrapCreateVpc(){
                                com.amazon.ec2.CreateVpcResponse wrappedElement = new com.amazon.ec2.CreateVpcResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReplaceRouteTableAssociationResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReplaceRouteTableAssociationResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReplaceRouteTableAssociationResponse wrapReplaceRouteTableAssociation(){
                                com.amazon.ec2.ReplaceRouteTableAssociationResponse wrappedElement = new com.amazon.ec2.ReplaceRouteTableAssociationResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AssociateRouteTableResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AssociateRouteTableResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AssociateRouteTableResponse wrapAssociateRouteTable(){
                                com.amazon.ec2.AssociateRouteTableResponse wrappedElement = new com.amazon.ec2.AssociateRouteTableResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DetachInternetGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DetachInternetGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DetachInternetGatewayResponse wrapDetachInternetGateway(){
                                com.amazon.ec2.DetachInternetGatewayResponse wrappedElement = new com.amazon.ec2.DetachInternetGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.PurchaseReservedInstancesOfferingResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.PurchaseReservedInstancesOfferingResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.PurchaseReservedInstancesOfferingResponse wrapPurchaseReservedInstancesOffering(){
                                com.amazon.ec2.PurchaseReservedInstancesOfferingResponse wrappedElement = new com.amazon.ec2.PurchaseReservedInstancesOfferingResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ImportVolumeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ImportVolumeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ImportVolumeResponse wrapImportVolume(){
                                com.amazon.ec2.ImportVolumeResponse wrappedElement = new com.amazon.ec2.ImportVolumeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeExportTasksResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeExportTasksResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeExportTasksResponse wrapDescribeExportTasks(){
                                com.amazon.ec2.DescribeExportTasksResponse wrappedElement = new com.amazon.ec2.DescribeExportTasksResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateInstanceExportTaskResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateInstanceExportTaskResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateInstanceExportTaskResponse wrapCreateInstanceExportTask(){
                                com.amazon.ec2.CreateInstanceExportTaskResponse wrappedElement = new com.amazon.ec2.CreateInstanceExportTaskResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AssignPrivateIpAddressesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AssignPrivateIpAddressesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AssignPrivateIpAddressesResponse wrapAssignPrivateIpAddresses(){
                                com.amazon.ec2.AssignPrivateIpAddressesResponse wrappedElement = new com.amazon.ec2.AssignPrivateIpAddressesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReportInstanceStatusResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReportInstanceStatusResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReportInstanceStatusResponse wrapReportInstanceStatus(){
                                com.amazon.ec2.ReportInstanceStatusResponse wrappedElement = new com.amazon.ec2.ReportInstanceStatusResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeReservedInstancesOfferingsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeReservedInstancesOfferingsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeReservedInstancesOfferingsResponse wrapDescribeReservedInstancesOfferings(){
                                com.amazon.ec2.DescribeReservedInstancesOfferingsResponse wrappedElement = new com.amazon.ec2.DescribeReservedInstancesOfferingsResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteVpnConnectionResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteVpnConnectionResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteVpnConnectionResponse wrapDeleteVpnConnection(){
                                com.amazon.ec2.DeleteVpnConnectionResponse wrappedElement = new com.amazon.ec2.DeleteVpnConnectionResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteInternetGatewayResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteInternetGatewayResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteInternetGatewayResponse wrapDeleteInternetGateway(){
                                com.amazon.ec2.DeleteInternetGatewayResponse wrappedElement = new com.amazon.ec2.DeleteInternetGatewayResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse wrapDeleteSpotDatafeedSubscription(){
                                com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse wrappedElement = new com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AttachNetworkInterfaceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AttachNetworkInterfaceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AttachNetworkInterfaceResponse wrapAttachNetworkInterface(){
                                com.amazon.ec2.AttachNetworkInterfaceResponse wrappedElement = new com.amazon.ec2.AttachNetworkInterfaceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.CreateNetworkInterfaceResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.CreateNetworkInterfaceResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.CreateNetworkInterfaceResponse wrapCreateNetworkInterface(){
                                com.amazon.ec2.CreateNetworkInterfaceResponse wrappedElement = new com.amazon.ec2.CreateNetworkInterfaceResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.RevokeSecurityGroupEgressResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.RevokeSecurityGroupEgressResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.RevokeSecurityGroupEgressResponse wrapRevokeSecurityGroupEgress(){
                                com.amazon.ec2.RevokeSecurityGroupEgressResponse wrappedElement = new com.amazon.ec2.RevokeSecurityGroupEgressResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.MonitorInstancesResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.MonitorInstancesResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.MonitorInstancesResponse wrapMonitorInstances(){
                                com.amazon.ec2.MonitorInstancesResponse wrappedElement = new com.amazon.ec2.MonitorInstancesResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.ReplaceRouteResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.ReplaceRouteResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.ReplaceRouteResponse wrapReplaceRoute(){
                                com.amazon.ec2.ReplaceRouteResponse wrappedElement = new com.amazon.ec2.ReplaceRouteResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.AttachVolumeResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.AttachVolumeResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.AttachVolumeResponse wrapAttachVolume(){
                                com.amazon.ec2.AttachVolumeResponse wrappedElement = new com.amazon.ec2.AttachVolumeResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.GetConsoleOutputResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.GetConsoleOutputResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.GetConsoleOutputResponse wrapGetConsoleOutput(){
                                com.amazon.ec2.GetConsoleOutputResponse wrappedElement = new com.amazon.ec2.GetConsoleOutputResponse();
                                return wrappedElement;
                         }
                    
                    private  org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory, com.amazon.ec2.DescribeRegionsResponse param, boolean optimizeContent)
                        throws org.apache.axis2.AxisFault{
                      try{
                          org.apache.axiom.soap.SOAPEnvelope emptyEnvelope = factory.getDefaultEnvelope();
                           
                                    emptyEnvelope.getBody().addChild(param.getOMElement(com.amazon.ec2.DescribeRegionsResponse.MY_QNAME,factory));
                                

                         return emptyEnvelope;
                    } catch(org.apache.axis2.databinding.ADBException e){
                        throw org.apache.axis2.AxisFault.makeFault(e);
                    }
                    }
                    
                         private com.amazon.ec2.DescribeRegionsResponse wrapDescribeRegions(){
                                com.amazon.ec2.DescribeRegionsResponse wrappedElement = new com.amazon.ec2.DescribeRegionsResponse();
                                return wrappedElement;
                         }
                    


        /**
        *  get the default envelope
        */
        private org.apache.axiom.soap.SOAPEnvelope toEnvelope(org.apache.axiom.soap.SOAPFactory factory){
        return factory.getDefaultEnvelope();
        }


        private  java.lang.Object fromOM(
        org.apache.axiom.om.OMElement param,
        java.lang.Class type,
        java.util.Map extraNamespaces) throws org.apache.axis2.AxisFault{

        try {
        
                if (com.amazon.ec2.DescribePlacementGroups.class.equals(type)){
                
                           return com.amazon.ec2.DescribePlacementGroups.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribePlacementGroupsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribePlacementGroupsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSecurityGroup.class.equals(type)){
                
                           return com.amazon.ec2.CreateSecurityGroup.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSecurityGroupResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateSecurityGroupResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetNetworkInterfaceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ResetNetworkInterfaceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetNetworkInterfaceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ResetNetworkInterfaceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateDhcpOptions.class.equals(type)){
                
                           return com.amazon.ec2.CreateDhcpOptions.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateDhcpOptionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateDhcpOptionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateRouteTable.class.equals(type)){
                
                           return com.amazon.ec2.CreateRouteTable.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateRouteTableResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateRouteTableResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSubnets.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSubnets.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSubnetsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSubnetsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeactivateLicense.class.equals(type)){
                
                           return com.amazon.ec2.DeactivateLicense.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeactivateLicenseResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeactivateLicenseResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpc.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpc.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpcResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpcResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelSpotInstanceRequests.class.equals(type)){
                
                           return com.amazon.ec2.CancelSpotInstanceRequests.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelSpotInstanceRequestsResponse.class.equals(type)){
                
                           return com.amazon.ec2.CancelSpotInstanceRequestsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSubnet.class.equals(type)){
                
                           return com.amazon.ec2.CreateSubnet.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSubnetResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateSubnetResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnGateway.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkAclEntry.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkAclEntry.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkAclEntryResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkAclEntryResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RequestSpotInstances.class.equals(type)){
                
                           return com.amazon.ec2.RequestSpotInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RequestSpotInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.RequestSpotInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumeAttribute.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumeAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumeAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumeAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateDhcpOptions.class.equals(type)){
                
                           return com.amazon.ec2.AssociateDhcpOptions.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateDhcpOptionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.AssociateDhcpOptionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeTags.class.equals(type)){
                
                           return com.amazon.ec2.DescribeTags.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeTagsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeTagsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportKeyPair.class.equals(type)){
                
                           return com.amazon.ec2.ImportKeyPair.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportKeyPairResponse.class.equals(type)){
                
                           return com.amazon.ec2.ImportKeyPairResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkInterface.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkInterface.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkInterfaceResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkInterfaceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpcs.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpcs.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpcsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpcsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeLicenses.class.equals(type)){
                
                           return com.amazon.ec2.DescribeLicenses.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeLicensesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeLicensesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.BundleInstance.class.equals(type)){
                
                           return com.amazon.ec2.BundleInstance.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.BundleInstanceResponse.class.equals(type)){
                
                           return com.amazon.ec2.BundleInstanceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpnConnections.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpnConnections.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpnConnectionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpnConnectionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeImages.class.equals(type)){
                
                           return com.amazon.ec2.DescribeImages.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeImagesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeImagesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateInternetGateway.class.equals(type)){
                
                           return com.amazon.ec2.CreateInternetGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateInternetGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateInternetGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisassociateRouteTable.class.equals(type)){
                
                           return com.amazon.ec2.DisassociateRouteTable.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisassociateRouteTableResponse.class.equals(type)){
                
                           return com.amazon.ec2.DisassociateRouteTableResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceNetworkAclEntry.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceNetworkAclEntry.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceNetworkAclEntryResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceNetworkAclEntryResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AuthorizeSecurityGroupIngress.class.equals(type)){
                
                           return com.amazon.ec2.AuthorizeSecurityGroupIngress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AuthorizeSecurityGroupIngressResponse.class.equals(type)){
                
                           return com.amazon.ec2.AuthorizeSecurityGroupIngressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSnapshotAttribute.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSnapshotAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSnapshotAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSnapshotAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnGateway.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetInstanceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ResetInstanceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetInstanceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ResetInstanceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateTags.class.equals(type)){
                
                           return com.amazon.ec2.CreateTags.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateTagsResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateTagsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AuthorizeSecurityGroupEgress.class.equals(type)){
                
                           return com.amazon.ec2.AuthorizeSecurityGroupEgress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AuthorizeSecurityGroupEgressResponse.class.equals(type)){
                
                           return com.amazon.ec2.AuthorizeSecurityGroupEgressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateAddress.class.equals(type)){
                
                           return com.amazon.ec2.AssociateAddress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateAddressResponse.class.equals(type)){
                
                           return com.amazon.ec2.AssociateAddressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeImageAttribute.class.equals(type)){
                
                           return com.amazon.ec2.DescribeImageAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeImageAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeImageAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotPriceHistory.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotPriceHistory.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotPriceHistoryResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotPriceHistoryResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifySnapshotAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ModifySnapshotAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifySnapshotAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ModifySnapshotAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotInstanceRequests.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotInstanceRequests.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotInstanceRequestsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotInstanceRequestsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportInstance.class.equals(type)){
                
                           return com.amazon.ec2.ImportInstance.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportInstanceResponse.class.equals(type)){
                
                           return com.amazon.ec2.ImportInstanceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeKeyPairs.class.equals(type)){
                
                           return com.amazon.ec2.DescribeKeyPairs.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeKeyPairsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeKeyPairsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RevokeSecurityGroupIngress.class.equals(type)){
                
                           return com.amazon.ec2.RevokeSecurityGroupIngress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RevokeSecurityGroupIngressResponse.class.equals(type)){
                
                           return com.amazon.ec2.RevokeSecurityGroupIngressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreatePlacementGroup.class.equals(type)){
                
                           return com.amazon.ec2.CreatePlacementGroup.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreatePlacementGroupResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreatePlacementGroupResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkAclEntry.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkAclEntry.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkAclEntryResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkAclEntryResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ActivateLicense.class.equals(type)){
                
                           return com.amazon.ec2.ActivateLicense.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ActivateLicenseResponse.class.equals(type)){
                
                           return com.amazon.ec2.ActivateLicenseResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteRouteTable.class.equals(type)){
                
                           return com.amazon.ec2.DeleteRouteTable.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteRouteTableResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteRouteTableResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.UnmonitorInstances.class.equals(type)){
                
                           return com.amazon.ec2.UnmonitorInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.UnmonitorInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.UnmonitorInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.StartInstances.class.equals(type)){
                
                           return com.amazon.ec2.StartInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.StartInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.StartInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ConfirmProductInstance.class.equals(type)){
                
                           return com.amazon.ec2.ConfirmProductInstance.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ConfirmProductInstanceResponse.class.equals(type)){
                
                           return com.amazon.ec2.ConfirmProductInstanceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkInterfaceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkInterfaceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkInterfaceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RunInstances.class.equals(type)){
                
                           return com.amazon.ec2.RunInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RunInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.RunInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateReservedInstancesListing.class.equals(type)){
                
                           return com.amazon.ec2.CreateReservedInstancesListing.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateReservedInstancesListingResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateReservedInstancesListingResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateCustomerGateway.class.equals(type)){
                
                           return com.amazon.ec2.CreateCustomerGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateCustomerGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateCustomerGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkAcl.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkAcl.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkAclResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkAclResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetImageAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ResetImageAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetImageAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ResetImageAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyVolumeAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ModifyVolumeAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyVolumeAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ModifyVolumeAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstances.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetSnapshotAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ResetSnapshotAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ResetSnapshotAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ResetSnapshotAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVolume.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVolume.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVolumeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVolumeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeAvailabilityZones.class.equals(type)){
                
                           return com.amazon.ec2.DescribeAvailabilityZones.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeAvailabilityZonesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeAvailabilityZonesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnConnection.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnConnection.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnConnectionResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnConnectionResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelBundleTask.class.equals(type)){
                
                           return com.amazon.ec2.CancelBundleTask.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelBundleTaskResponse.class.equals(type)){
                
                           return com.amazon.ec2.CancelBundleTaskResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceNetworkAclAssociation.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceNetworkAclAssociation.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceNetworkAclAssociationResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceNetworkAclAssociationResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachVpnGateway.class.equals(type)){
                
                           return com.amazon.ec2.DetachVpnGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachVpnGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.DetachVpnGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSnapshots.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSnapshots.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSnapshotsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSnapshotsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSubnet.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSubnet.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSubnetResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSubnetResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeBundleTasks.class.equals(type)){
                
                           return com.amazon.ec2.DescribeBundleTasks.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeBundleTasksResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeBundleTasksResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateKeyPair.class.equals(type)){
                
                           return com.amazon.ec2.CreateKeyPair.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateKeyPairResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateKeyPairResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateImage.class.equals(type)){
                
                           return com.amazon.ec2.CreateImage.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateImageResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateImageResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.EnableVgwRoutePropagation.class.equals(type)){
                
                           return com.amazon.ec2.EnableVgwRoutePropagation.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.EnableVgwRoutePropagationResponse.class.equals(type)){
                
                           return com.amazon.ec2.EnableVgwRoutePropagationResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.UnassignPrivateIpAddresses.class.equals(type)){
                
                           return com.amazon.ec2.UnassignPrivateIpAddresses.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.UnassignPrivateIpAddressesResponse.class.equals(type)){
                
                           return com.amazon.ec2.UnassignPrivateIpAddressesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeregisterImage.class.equals(type)){
                
                           return com.amazon.ec2.DeregisterImage.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeregisterImageResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeregisterImageResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnConnectionRoute.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnConnectionRoute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnConnectionRouteResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnConnectionRouteResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyImageAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ModifyImageAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyImageAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ModifyImageAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelConversionTask.class.equals(type)){
                
                           return com.amazon.ec2.CancelConversionTask.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelConversionTaskResponse.class.equals(type)){
                
                           return com.amazon.ec2.CancelConversionTaskResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumes.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumes.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelReservedInstancesListing.class.equals(type)){
                
                           return com.amazon.ec2.CancelReservedInstancesListing.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelReservedInstancesListingResponse.class.equals(type)){
                
                           return com.amazon.ec2.CancelReservedInstancesListingResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.GetPasswordData.class.equals(type)){
                
                           return com.amazon.ec2.GetPasswordData.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.GetPasswordDataResponse.class.equals(type)){
                
                           return com.amazon.ec2.GetPasswordDataResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AllocateAddress.class.equals(type)){
                
                           return com.amazon.ec2.AllocateAddress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AllocateAddressResponse.class.equals(type)){
                
                           return com.amazon.ec2.AllocateAddressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSecurityGroup.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSecurityGroup.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSecurityGroupResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSecurityGroupResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeletePlacementGroup.class.equals(type)){
                
                           return com.amazon.ec2.DeletePlacementGroup.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeletePlacementGroupResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeletePlacementGroupResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisassociateAddress.class.equals(type)){
                
                           return com.amazon.ec2.DisassociateAddress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisassociateAddressResponse.class.equals(type)){
                
                           return com.amazon.ec2.DisassociateAddressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteDhcpOptions.class.equals(type)){
                
                           return com.amazon.ec2.DeleteDhcpOptions.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteDhcpOptionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteDhcpOptionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotDatafeedSubscription.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotDatafeedSubscription.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSpotDatafeedSubscriptionResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkAcls.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkAcls.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkAclsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkAclsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.EnableVolumeIO.class.equals(type)){
                
                           return com.amazon.ec2.EnableVolumeIO.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.EnableVolumeIOResponse.class.equals(type)){
                
                           return com.amazon.ec2.EnableVolumeIOResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachVpnGateway.class.equals(type)){
                
                           return com.amazon.ec2.AttachVpnGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachVpnGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.AttachVpnGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInternetGateways.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInternetGateways.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInternetGatewaysResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInternetGatewaysResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeDhcpOptions.class.equals(type)){
                
                           return com.amazon.ec2.DescribeDhcpOptions.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeDhcpOptionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeDhcpOptionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSpotDatafeedSubscription.class.equals(type)){
                
                           return com.amazon.ec2.CreateSpotDatafeedSubscription.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateSpotDatafeedSubscriptionResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstancesListings.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstancesListings.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstancesListingsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstancesListingsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstanceStatus.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstanceStatus.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstanceStatusResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstanceStatusResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyNetworkInterfaceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ModifyNetworkInterfaceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ModifyNetworkInterfaceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisableVgwRoutePropagation.class.equals(type)){
                
                           return com.amazon.ec2.DisableVgwRoutePropagation.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DisableVgwRoutePropagationResponse.class.equals(type)){
                
                           return com.amazon.ec2.DisableVgwRoutePropagationResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumeStatus.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumeStatus.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVolumeStatusResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVolumeStatusResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachNetworkInterface.class.equals(type)){
                
                           return com.amazon.ec2.DetachNetworkInterface.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachNetworkInterfaceResponse.class.equals(type)){
                
                           return com.amazon.ec2.DetachNetworkInterfaceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSecurityGroups.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSecurityGroups.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeSecurityGroupsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeSecurityGroupsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstances.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkInterfaces.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkInterfaces.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeNetworkInterfacesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeNetworkInterfacesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteKeyPair.class.equals(type)){
                
                           return com.amazon.ec2.DeleteKeyPair.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteKeyPairResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteKeyPairResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSnapshot.class.equals(type)){
                
                           return com.amazon.ec2.CreateSnapshot.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateSnapshotResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateSnapshotResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpnGateways.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpnGateways.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeVpnGatewaysResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeVpnGatewaysResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteTags.class.equals(type)){
                
                           return com.amazon.ec2.DeleteTags.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteTagsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteTagsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSnapshot.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSnapshot.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSnapshotResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSnapshotResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteCustomerGateway.class.equals(type)){
                
                           return com.amazon.ec2.DeleteCustomerGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteCustomerGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteCustomerGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVolume.class.equals(type)){
                
                           return com.amazon.ec2.CreateVolume.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVolumeResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateVolumeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelExportTask.class.equals(type)){
                
                           return com.amazon.ec2.CancelExportTask.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CancelExportTaskResponse.class.equals(type)){
                
                           return com.amazon.ec2.CancelExportTaskResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RegisterImage.class.equals(type)){
                
                           return com.amazon.ec2.RegisterImage.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RegisterImageResponse.class.equals(type)){
                
                           return com.amazon.ec2.RegisterImageResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachVolume.class.equals(type)){
                
                           return com.amazon.ec2.DetachVolume.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachVolumeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DetachVolumeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.StopInstances.class.equals(type)){
                
                           return com.amazon.ec2.StopInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.StopInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.StopInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateRoute.class.equals(type)){
                
                           return com.amazon.ec2.CreateRoute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateRouteResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateRouteResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReleaseAddress.class.equals(type)){
                
                           return com.amazon.ec2.ReleaseAddress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReleaseAddressResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReleaseAddressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeRouteTables.class.equals(type)){
                
                           return com.amazon.ec2.DescribeRouteTables.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeRouteTablesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeRouteTablesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeCustomerGateways.class.equals(type)){
                
                           return com.amazon.ec2.DescribeCustomerGateways.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeCustomerGatewaysResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeCustomerGatewaysResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkAcl.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkAcl.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteNetworkAclResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteNetworkAclResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteRoute.class.equals(type)){
                
                           return com.amazon.ec2.DeleteRoute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteRouteResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteRouteResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RebootInstances.class.equals(type)){
                
                           return com.amazon.ec2.RebootInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RebootInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.RebootInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyInstanceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.ModifyInstanceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ModifyInstanceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ModifyInstanceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.TerminateInstances.class.equals(type)){
                
                           return com.amazon.ec2.TerminateInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.TerminateInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.TerminateInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnConnectionRoute.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnConnectionRoute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpnConnectionRouteResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpnConnectionRouteResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeConversionTasks.class.equals(type)){
                
                           return com.amazon.ec2.DescribeConversionTasks.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeConversionTasksResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeConversionTasksResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeAddresses.class.equals(type)){
                
                           return com.amazon.ec2.DescribeAddresses.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeAddressesResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeAddressesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstanceAttribute.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstanceAttribute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeInstanceAttributeResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeInstanceAttributeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachInternetGateway.class.equals(type)){
                
                           return com.amazon.ec2.AttachInternetGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachInternetGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.AttachInternetGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpc.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpc.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateVpcResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateVpcResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceRouteTableAssociation.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceRouteTableAssociation.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceRouteTableAssociationResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceRouteTableAssociationResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateRouteTable.class.equals(type)){
                
                           return com.amazon.ec2.AssociateRouteTable.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssociateRouteTableResponse.class.equals(type)){
                
                           return com.amazon.ec2.AssociateRouteTableResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachInternetGateway.class.equals(type)){
                
                           return com.amazon.ec2.DetachInternetGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DetachInternetGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.DetachInternetGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.PurchaseReservedInstancesOffering.class.equals(type)){
                
                           return com.amazon.ec2.PurchaseReservedInstancesOffering.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.PurchaseReservedInstancesOfferingResponse.class.equals(type)){
                
                           return com.amazon.ec2.PurchaseReservedInstancesOfferingResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportVolume.class.equals(type)){
                
                           return com.amazon.ec2.ImportVolume.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ImportVolumeResponse.class.equals(type)){
                
                           return com.amazon.ec2.ImportVolumeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeExportTasks.class.equals(type)){
                
                           return com.amazon.ec2.DescribeExportTasks.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeExportTasksResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeExportTasksResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateInstanceExportTask.class.equals(type)){
                
                           return com.amazon.ec2.CreateInstanceExportTask.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateInstanceExportTaskResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateInstanceExportTaskResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssignPrivateIpAddresses.class.equals(type)){
                
                           return com.amazon.ec2.AssignPrivateIpAddresses.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AssignPrivateIpAddressesResponse.class.equals(type)){
                
                           return com.amazon.ec2.AssignPrivateIpAddressesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReportInstanceStatus.class.equals(type)){
                
                           return com.amazon.ec2.ReportInstanceStatus.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReportInstanceStatusResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReportInstanceStatusResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstancesOfferings.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstancesOfferings.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeReservedInstancesOfferingsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeReservedInstancesOfferingsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnConnection.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnConnection.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteVpnConnectionResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteVpnConnectionResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteInternetGateway.class.equals(type)){
                
                           return com.amazon.ec2.DeleteInternetGateway.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteInternetGatewayResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteInternetGatewayResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSpotDatafeedSubscription.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSpotDatafeedSubscription.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse.class.equals(type)){
                
                           return com.amazon.ec2.DeleteSpotDatafeedSubscriptionResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachNetworkInterface.class.equals(type)){
                
                           return com.amazon.ec2.AttachNetworkInterface.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachNetworkInterfaceResponse.class.equals(type)){
                
                           return com.amazon.ec2.AttachNetworkInterfaceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkInterface.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkInterface.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.CreateNetworkInterfaceResponse.class.equals(type)){
                
                           return com.amazon.ec2.CreateNetworkInterfaceResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RevokeSecurityGroupEgress.class.equals(type)){
                
                           return com.amazon.ec2.RevokeSecurityGroupEgress.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.RevokeSecurityGroupEgressResponse.class.equals(type)){
                
                           return com.amazon.ec2.RevokeSecurityGroupEgressResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.MonitorInstances.class.equals(type)){
                
                           return com.amazon.ec2.MonitorInstances.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.MonitorInstancesResponse.class.equals(type)){
                
                           return com.amazon.ec2.MonitorInstancesResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceRoute.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceRoute.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.ReplaceRouteResponse.class.equals(type)){
                
                           return com.amazon.ec2.ReplaceRouteResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachVolume.class.equals(type)){
                
                           return com.amazon.ec2.AttachVolume.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.AttachVolumeResponse.class.equals(type)){
                
                           return com.amazon.ec2.AttachVolumeResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.GetConsoleOutput.class.equals(type)){
                
                           return com.amazon.ec2.GetConsoleOutput.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.GetConsoleOutputResponse.class.equals(type)){
                
                           return com.amazon.ec2.GetConsoleOutputResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeRegions.class.equals(type)){
                
                           return com.amazon.ec2.DescribeRegions.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
                if (com.amazon.ec2.DescribeRegionsResponse.class.equals(type)){
                
                           return com.amazon.ec2.DescribeRegionsResponse.Factory.parse(param.getXMLStreamReaderWithoutCaching());
                    

                }
           
        } catch (java.lang.Exception e) {
        throw org.apache.axis2.AxisFault.makeFault(e);
        }
           return null;
        }



    

        /**
        *  A utility method that copies the namepaces from the SOAPEnvelope
        */
        private java.util.Map getEnvelopeNamespaces(org.apache.axiom.soap.SOAPEnvelope env){
        java.util.Map returnMap = new java.util.HashMap();
        java.util.Iterator namespaceIterator = env.getAllDeclaredNamespaces();
        while (namespaceIterator.hasNext()) {
        org.apache.axiom.om.OMNamespace ns = (org.apache.axiom.om.OMNamespace) namespaceIterator.next();
        returnMap.put(ns.getPrefix(),ns.getNamespaceURI());
        }
        return returnMap;
        }

        private org.apache.axis2.AxisFault createAxisFault(java.lang.Exception e) {
        org.apache.axis2.AxisFault f;
        Throwable cause = e.getCause();
        if (cause != null) {
            f = new org.apache.axis2.AxisFault(e.getMessage(), cause);
        } else {
            f = new org.apache.axis2.AxisFault(e.getMessage());
        }

        return f;
    }

        }//end of class
    