docs: public MpnsService build() {
          checkInitialization();
  
          // Client Configuration
          HttpClient client;
          if (httpClient != null) {
              client = httpClient;
          } else if (pooledMax == 1) {
              client = new DefaultHttpClient();
          } else {
              client = new DefaultHttpClient(Utilities.poolManager(pooledMax));
          }
  
          if (proxy != null) {
              client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);
          }
          
          if( securityInfo != null ) {
          	try {
  	        	KeyStore keyStore;
  	        	if( securityInfo.getProvider() == null ) {
  	        		keyStore = KeyStore.getInstance(securityInfo.getName());
  	        	} else {
  	        		keyStore = KeyStore.getInstance(securityInfo.getName(), securityInfo.getProvider());
  	        	}
  	        	keyStore.load(new ByteArrayInputStream(securityInfo.getCert()),
  	        			securityInfo.getPassword().toCharArray());
  	        				
  	        	KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  	        	kmfactory.init(keyStore, securityInfo.getPassword().toCharArray());
  	        	KeyManager[] km = kmfactory.getKeyManagers();
  	
  	        	// create SSL socket factory
  	        	SSLContext sslContext = SSLContext.getInstance("TLS");
  	        	sslContext.init(km, null, null);
  	        	org.apache.http.conn.ssl.SSLSocketFactory sslSocketFactory = new org.apache.http.conn.ssl.SSLSocketFactory(sslContext);
  	     
  	        	Scheme https = new Scheme("https", 443, sslSocketFactory);
  	        	client.getConnectionManager().getSchemeRegistry().register(https);
          	} catch( Exception e ) {
          		throw new IllegalArgumentException(e);
          	}
          }
  
          if (timeout > 0) {
              HttpParams params = client.getParams();
              HttpConnectionParams.setConnectionTimeout(params, timeout);
              HttpConnectionParams.setSoTimeout(params, timeout);
          }
  
          // Configure service
          AbstractMpnsService service;
          if (pooledMax == 1) {
              service = new MpnsServiceImpl(client, delegate);
          } else {
              service = new MpnsPooledService(client, executor, delegate);
          }
  
          if (isQueued) {
              service = new MpnsQueuedService(service);
          }
  
          service.start();
          return service;
      }