anchor.diff:          startResponse(req.socket, fileList[path]);
         }
       });
  -  }).catchError((e){
  +  }).catchError((e) {
       completer.completeError(e);
     });
     return completer.future;
  
positive.code:   }
  
    _retryBind().then((hetima.HetiHttpServer server) {
      m.localPort = "${port}";
      _server = server;
      completer.complete(0);
      server.onNewRequest().listen((hetima.HetiHttpServerRequest req) {
  
negative.code:         res.externalIp;
          m.globalIP = res.externalIp;
        });
        int baseExternalPort = externalPort + 50;
        a() {
          pppDevice.requestAddPortMapping(externalPort, hetima.UPnpPPPDevice.VALUE_PORT_MAPPING_PROTOCOL_TCP, localPort, localAddress, hetima.UPnpPPPDevice.VALUE_ENABLE, "HetimaDelphinium", 0).then((hetima.UPnpAddPortMappingResponse res) {
            if (200 == res.resultCode) {
              m.globalPort = "${externalPort}";
              return;
            }
            if (-500 == res.resultCode) {
              externalPort++;
              if (externalPort < baseExternalPort) {
                a();
              }
            }
          });
        }
        ;
        a();
      });
    });
  }
  
  void stopPortMap() {
    hetima.UpnpDeviceSearcher.createInstance(new hetimacl.HetiSocketBuilderChrome()).then((hetima.UpnpDeviceSearcher searcher) {
      searcher.searchWanPPPDevice().then((int e) {
        if (searcher.deviceInfoList.length <= 0) {
          return;
        }
        hetima.UPnpDeviceInfo info = searcher.deviceInfoList.first;
        hetima.UPnpPPPDevice pppDevice = new hetima.UPnpPPPDevice(info);
        pppDevice.requestGetExternalIPAddress().then((hetima.UPnpGetExternalIPAddressResponse res) {
          res.externalIp;
          m.globalIP = res.externalIp;
        });
        int baseExternalPort = externalPort + 50;
  
        pppDevice.requestDeletePortMapping(externalPort, hetima.UPnpPPPDevice.VALUE_PORT_MAPPING_PROTOCOL_TCP);
      });
    });
  }
  
  
  async.Future<int> startLocalIp() {
    async.Completer<int> completer = new async.Completer();
    (new hetimacl.HetiSocketBuilderChrome()).getNetworkInterfaces().then((List<hetima.HetiNetworkInterface> l) {
      // search 24
      for (hetima.HetiNetworkInterface i in l) {
        if (i.prefixLength == 24 && !i.address.startsWith("127")) {
          m.localIP = i.address;
          localAddress = i.address;
          completer.complete(0);
          return;
        }
      }
      //
      for (hetima.HetiNetworkInterface i in l) {
        if (i.prefixLength == 64) {
          m.localIP = i.address;
          localAddress = i.address;
          completer.complete(0);
          return;
        }
      }
    }).catchError((e) {
      completer.completeError(e);
    });
    return completer.future;
  