Re-try to subscribe if not subscribed
[?]
Oct 27, 2019, 12:35 PM
U3UZTFCHHGY3ZCBSFFCC76EPEJBBDTEAQDREM4KDYTNDSTVMUS2QCDependencies
- [2]
5WHNHD42Update dependencies - [3]
Z3NQEYVIRename IqSetHandler to IqResuestHandler as it should provide both get and set handling - [4]
S754Y5DFRefactor IQ processing Always answer to set and get requests. Use XML encoding for stanzas. - [5]
ZFBPXPADCleanup timeouted iq requests with ping Output elapsed time. Refactor iq handling. - [6]
AEH7WP42Make element processors static - [7]
SH3LIQ4SStarting commands support - [8]
BYJPYYSMProcess iq ping response - [9]
3DSOPLCGAdd rustdoc - [10]
WDCZNZOPFix rustdoc - [11]
4IPZTMFIUpdate dependencies - [12]
PLWPCM47Add id to initital presence - [13]
LL3D5CXKStaring using element processor - [14]
PJV5HPIFStarting to imlements timeouts for iqs - [15]
GXQCDLYQUse element processor for incoming iq get - [16]
YTN366WASupport disco#items - [17]
RQZCVDFDImplement applying timeout for expired iq await - [18]
ZT3YEIVXConsume connection on processing command - [19]
CCLGGFKRMove out XmppConnection into own file - [20]
FV6BJ5K6Send self-presence and store account info in Rc so it willbe used in some future in parallel - [21]
JY4F7VBCUse element processor for incoming iq set - [22]
GVZ4JAR5Process self-presence with incoming stanza processor - [23]
DYRPAV6TUpdate dependencies - [24]
YEMBT7TBAdd support for XEP-0092: Software Version - [25]
2THKW66MIgnore .orig files - [26]
OFLAP2G2Fix possible utf8 errors - [27]
DCMDASHVMention XEP-0050 and XEP-0203 support - [28]
HDLI2X4HIgnore delayed XEP-0203 messages - [29]
LNUU5R56Support disco#info from XEP-0030 Service Discovery - [30]
LQXBWNFTRemove unneeded requirement - [31]
SSOKGGCEUpdate dependencies - [32]
QDHDTOLMStarting support for commands XEP-0050: Ad-Hoc Commands (there no support in xmpp_parsers still) - [33]
RRLRZTMRUse element processor for iq - [34]
6UKCVM6EUse new iq processng for initial roster - [*]
VS6AHRWIMove XMPP to separate dir - [*]
FVVPKFTLInitial commit
Change contents
- replacement in src/xmpp/xmpp_connection.rs at line 0
use tokio_xmpp::{Client, Event, Packet};use tokio::prelude::future::{self, Either};use tokio::prelude::stream;use tokio::prelude::{Future, Stream};use std::collections::{HashMap, VecDeque};use std::time::{Duration, Instant};use super::stanzas;use super::element_processor;use crate::config;#[derive(Debug)]pub enum XmppCommand {/// Send message to someone by jidChat {xmpp_to: xmpp_parsers::Jid,message: String,},/// Send message to MUCChatroom { muc_id: String, message: String },/// Send ping request to the server to test connectionPing,/// Check iq requests if some have expired timeoutsTimeoutCleanup,}/// trait of processing iq/// each function consumes handlers and/// returns false if connection should be resettrait IqHandler {/// process resultfn result(self: Box<Self>,conn: &mut XmppConnection,opt_element: Option<xmpp_parsers::Element>,) -> bool;/// process errorfn error(self: Box<Self>,conn: &mut XmppConnection,error: xmpp_parsers::stanza_error::StanzaError,) -> bool;/// process tmeoutfn timeout(self: Box<Self>, conn: &mut XmppConnection) -> bool;}struct AddRosterIqHandler {jid: xmpp_parsers::Jid,}impl IqHandler for AddRosterIqHandler {fn result(self: Box<Self>,conn: &mut XmppConnection,opt_element: Option<xmpp_parsers::Element>,) -> bool {match opt_element {Some(element) => {warn!("Wrong payload when adding {} to roster: {}",self.jid,String::from(&element));}None => {if conn.state.data.roster.contains_key(&self.jid) {info!("Jid {} updated to roster", self.jid);} else {info!("Jid {} added in roster", self.jid);conn.state.data.roster.insert(self.jid.clone(),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,),);}conn.process_jid(&self.jid);}}true}fn error(self: Box<Self>,_conn: &mut XmppConnection,_error: xmpp_parsers::stanza_error::StanzaError,) -> bool {true}fn timeout(self: Box<Self>, _conn: &mut XmppConnection) -> bool {true // ignore}}struct PingIqHandler {}impl IqHandler for PingIqHandler {fn result(self: Box<Self>,_conn: &mut XmppConnection,_opt_element: Option<xmpp_parsers::Element>,) -> bool {info!("ping successed");true}fn error(self: Box<Self>,_conn: &mut XmppConnection,_error: xmpp_parsers::stanza_error::StanzaError,) -> bool {false}fn timeout(self: Box<Self>, _conn: &mut XmppConnection) -> bool {false}}struct InitRosterIqHandler {}impl IqHandler for InitRosterIqHandler {fn result(self: Box<Self>,conn: &mut XmppConnection,opt_element: Option<xmpp_parsers::Element>,) -> bool {if let Some(result) = opt_element {use std::convert::TryInto;match result.try_into() as Result<xmpp_parsers::roster::Roster, _> {Ok(roster) => {conn.state.data.roster_init = true;conn.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);conn.state.data.roster.insert(i.jid, (i.subscription, i.ask));}true}Err(e) => {error!("Cann't parse roster: {}", e);false}}} else {error!("No roster responded");false}}fn error(self: Box<Self>,_conn: &mut XmppConnection,_error: xmpp_parsers::stanza_error::StanzaError,) -> bool {false}fn timeout(self: Box<Self>, _conn: &mut XmppConnection) -> bool {false}}#[derive(Default)]struct XmppData {/// known roster dataroster: HashMap<xmpp_parsers::Jid,(xmpp_parsers::roster::Subscription,xmpp_parsers::roster::Ask,),>,/// if roster was initialized/// ToDo: remove it as it is used only for initializationroster_init: bool,/// if self-presence accepted/// ToDo: remove it as it is used only for initializationself_presence: bool,/// ids countercounter: usize,/// stanzas to sendsend_queue: VecDeque<minidom::Element>,/// outgoing mailboxoutgoing_mailbox: HashMap<xmpp_parsers::Jid, Vec<String>>,/// muc id to muc jidmucs: HashMap<String, xmpp_parsers::Jid>,/// map from iq's id to handler of this type of iqspending_ids: HashMap<String, (Instant, Box<dyn IqHandler>)>,}struct XmppState {client: Client,data: XmppData,}pub struct XmppConnection {account: std::rc::Rc<config::Account>,state: XmppState,}lazy_static! {static ref INCOMING: element_processor::Processor<XmppConnection, bool, xmpp_parsers::Element> = {let mut incoming = element_processor::Processor::new(&|_, e| {warn!("Unknown stanza {}", String::from(&e));true});incoming.register(&XmppConnection::incoming_iq_processing);incoming.register(&XmppConnection::incoming_presence_processing);incoming.register(&XmppConnection::incoming_message_processing);incoming};}pub struct MaybeXmppConnection {account: std::rc::Rc<config::Account>,state: Option<XmppState>,}impl From<XmppConnection> for MaybeXmppConnection {fn from(from: XmppConnection) -> MaybeXmppConnection {MaybeXmppConnection {account: from.account,state: Some(from.state),}}}impl From<config::Account> for MaybeXmppConnection {fn from(from: config::Account) -> MaybeXmppConnection {MaybeXmppConnection {account: std::rc::Rc::new(from),state: None,}}}impl From<std::rc::Rc<config::Account>> for MaybeXmppConnection {fn from(from: std::rc::Rc<config::Account>) -> MaybeXmppConnection {MaybeXmppConnection {account: from,state: None,}}}impl MaybeXmppConnection {/// connects if nothing connected/// don't connect only if stop_future resolvedpub fn connect<F>(self,stop_future: F,) -> impl Future<Item = XmppConnection, Error = failure::Error>whereF: future::Future + Clone + 'static,<F as hyper::rt::Future>::Error: Into<failure::Error> + Send,{info!("xmpp connection...");let MaybeXmppConnection { account, state } = self;if let Some(state) = state {Box::new(future::ok(XmppConnection { account, state }))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(stop_future.clone().select2(future::loop_fn(account, move |account| {info!("xmpp initialization...");let client =Client::new_with_jid(account.jid.clone(), &account.password);info!("xmpp initialized");let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone();let stop_future4 = stop_future.clone();// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,}.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).and_then(|conn| conn.enter_mucs(stop_future4)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),}),)}).map_err(|_: ()| ()),).then(|r| match r {Ok(Either::A((_x, _b))) => future::err(format_err!("Stop XMMP connection")),Ok(Either::B((x, _a))) => future::ok(x),Err(Either::A((e, _b))) => future::err(e.into()),Err(Either::B((_, _a))) => {future::err(format_err!("Cann't initiate XMPP connection"))}}),)}}}impl XmppConnection {/// base XMPP processing/// Returns false on error to disconnectfn xmpp_processing(&mut self, event: &Event) -> bool {match event {Event::Stanza(stanza) => INCOMING.process(self, stanza.clone()),Event::Online => true,e => {warn!("Unexpected event {:?}", e);false}}}/// Enforce to answer to IQ "set"fn incoming_iq_processing_set(&mut self,id: String,from: Option<xmpp_parsers::Jid>,element: minidom::Element,) -> xmpp_parsers::iq::Iq {use std::convert::TryInto;if let Some(roster) =element.clone().try_into().ok() as Option<xmpp_parsers::roster::Roster>{// RFC 6212 2.1.6. Roster Pushinfo!("Got roster push {} from {:?}", id, from);for i in roster.items {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&i.jid) {info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));}self.process_jid(&i.jid);}return stanzas::make_roster_push_answer(id, self.state.client.jid.clone(), from);}warn!("Unsupported IQ set request from {:?}: {}",from,String::from(&element));stanzas::make_iq_unsupported_error(id, self.state.client.jid.clone(), from)}/// Enforce to answer to IQ "get"fn incoming_iq_processing_get(&mut self,id: String,from: Option<xmpp_parsers::Jid>,element: minidom::Element,) -> xmpp_parsers::iq::Iq {use std::convert::TryInto;if let Some(_ping) = element.clone().try_into().ok() as Option<xmpp_parsers::ping::Ping> {info!("Got ping {} from {:?}", id, from);return stanzas::make_pong(&id, self.state.client.jid.clone(), from);}warn!("Unsupported IQ get request from {:?}: {}",from,String::from(&element));stanzas::make_iq_unsupported_error(id, self.state.client.jid.clone(), from)}fn incoming_iq_processing(&mut self, iq: xmpp_parsers::iq::Iq) -> bool {match iq.payload {xmpp_parsers::iq::IqType::Set(element) => {let iq_answer = self.incoming_iq_processing_set(iq.id, iq.from, element);self.state.data.send_queue.push_back(iq_answer.into());}xmpp_parsers::iq::IqType::Error(e) => {if let Some((_, handler)) = self.state.data.pending_ids.remove_entry(&iq.id) {return handler.1.error(self, e);}error!("iq error: {:?}", e);return false;}xmpp_parsers::iq::IqType::Get(element) => {let iq_answer = self.incoming_iq_processing_get(iq.id, iq.from, element);self.state.data.send_queue.push_back(iq_answer.into());}xmpp_parsers::iq::IqType::Result(opt_element) => {if let Some((_, handler)) = self.state.data.pending_ids.remove_entry(&iq.id) {return handler.1.result(self, opt_element);}warn!("Unwanted iq result id {} from {:?}: {:?}",iq.id,iq.from,opt_element.map(|e| String::from(&e)));}}true}fn incoming_presence_processing(&mut self, presence: xmpp_parsers::presence::Presence) -> bool {if presence.from.as_ref() == Some(&self.state.client.jid) {info!("Self-presence accepted");self.state.data.self_presence = true;} else {warn!("Incoming presence stanza: {:?}", presence);}true}fn incoming_message_processing(&mut self, message: xmpp_parsers::message::Message) -> bool {for payload in message.payloads.iter() {use std::convert::TryInto;if let Some(_delay) =payload.clone().try_into().ok() as Option<xmpp_parsers::delay::Delay>{return true; // ignore delayed messages}}warn!("Incoming message stanza: {:?}", message);true}/// process event from xmpp stream/// returns from future when condition met/// or stop future was resolved./// Return item if connection was preserved or error otherwise./// Second part is a state of stop_futurepub fn processing<S, F, T, E>(self,stop_condition: S,stop_future: F,) -> impl Future<Item = (Self, Result<Either<F, T>, E>),Error = (std::rc::Rc<config::Account>, Result<Either<F, T>, E>),>whereF: Future<Item = T, Error = E> + 'static,S: FnMut(&mut Self, Event) -> Result<bool, ()> + 'static,T: 'static,E: 'static,{future::loop_fn((self, stop_future, stop_condition),|(xmpp, stop_future, mut stop_condition)| {// ToDo: check timeouts if iqslet XmppConnection {state: XmppState { client, mut data },account,} = xmpp;if let Some(send_element) = data.send_queue.pop_front() {use tokio::prelude::Sink;info!("Sending {}", String::from(&send_element));Box::new(client.send(Packet::Stanza(send_element)).select2(stop_future).then(move |r| match r {Ok(Either::A((client, b))) => {Box::new(future::ok(future::Loop::Continue((XmppConnection {state: XmppState { client, data },account,},b,stop_condition,))))as Box<dyn Future<Item = _, Error = _>>}Ok(Either::B((t, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Ok(Either::B(t))))}})),Err(Either::A((e, b))) => {warn!("XMPP sending error: {}", e);Box::new(future::err((account, Ok(Either::A(b)))))}Err(Either::B((e, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Err(e)))}})),}),) as Box<dyn Future<Item = _, Error = _>>} else {Box::new(client.into_future().select2(stop_future).then(move |r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let mut xmpp = XmppConnection {state: XmppState { client, data },account,};if xmpp.xmpp_processing(&event) {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => {future::err((xmpp.account, Ok(Either::A(b))))}}} else {future::err((xmpp.account, Ok(Either::A(b))))}} else {future::err((account, Ok(Either::A(b))))}}Ok(Either::B((t, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),)))} else {future::err((account, Ok(Either::B(t))))}}Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0);future::err((account, Ok(Either::A(b))))}Err(Either::B((e, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),)))} else {future::err((account, Err(e)))}}}),)}},)}/// get connection and wait for online status and set presence/// returns error if something went wrong and xmpp connection is brokenfn online(&mut self, event: Event) -> Result<bool, ()> {match event {Event::Online => {info!("Online!");Ok(true)}Event::Stanza(s) => {warn!("Stanza before online: {}", String::from(&s));Ok(false)}_ => {error!("Disconnected while online");Err(())}}}fn initial_roster<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: 'static,{let XmppConnection {account,state: XmppState { client, mut data },} = self;use tokio::prelude::Sink;data.counter += 1;let id_init_roster = format!("id_init_roster{}", data.counter);let get_roster = stanzas::make_get_roster(&id_init_roster);let account2 = account.clone();info!("Quering roster... {}", String::from(&get_roster));data.pending_ids.insert(id_init_roster.clone(),(Instant::now() + Duration::from_secs(60),Box::new(InitRosterIqHandler {}),),);client.send(Packet::Stanza(get_roster)).map_err(move |e| {error!("Error on querying roster: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, _| Ok(conn.state.data.roster_init), stop_future).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn self_presence<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection {account,state: XmppState { client, data },} = self;use tokio::prelude::Sink;let presence = stanzas::make_presence(&account);let account2 = account.clone();info!("Sending presence... {}", String::from(&presence));client.send(Packet::Stanza(presence)).map_err(|e| {error!("Error on send self-presence: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, _| Ok(conn.state.data.self_presence),stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn process_jid(&mut self, xmpp_to: &xmpp_parsers::Jid) {if let Some(ref mut mailbox) = self.state.data.outgoing_mailbox.get_mut(xmpp_to) {if !mailbox.is_empty() {if let Some(ref mut rdata) = self.state.data.roster.get_mut(xmpp_to) {info!("Jid {} in roster", xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", xmpp_to);self.state.data.send_queue.extend(mailbox.drain(..).map(|message| {stanzas::make_chat_message(xmpp_to.clone(), message)}),);} else if rdata.1 == xmpp_parsers::roster::Ask::None {info!("Not subscribed to {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to.clone()));}let sub_from = match rdata.0 {xmpp_parsers::roster::Subscription::From => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if !sub_from {info!("Not subscription from {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_allow_subscribe(xmpp_to.clone()));}} else {info!("Jid {} not in roster", xmpp_to);self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, xmpp_to.clone());info!("Adding jid {} to roster id {}", xmpp_to, id_add_roster);self.state.data.pending_ids.insert(id_add_roster,(Instant::now() + Duration::from_secs(60),Box::new(AddRosterIqHandler {jid: xmpp_to.clone(),}),),);self.state.data.send_queue.push_back(add_roster);}}}}pub fn process_command(&mut self, cmd: XmppCommand) {info!("Got command");match cmd {XmppCommand::Chat { xmpp_to, message } => {self.state.data.outgoing_mailbox.entry(xmpp_to.clone()).or_default().push(message);self.process_jid(&xmpp_to);}XmppCommand::Chatroom { muc_id, message } => {if let Some(muc) = self.state.data.mucs.get(&muc_id) {self.state.data.send_queue.push_back(stanzas::make_muc_message(muc.clone(), message));} else {error!("Not found MUC {}", muc_id);}}XmppCommand::Ping => {self.state.data.counter += 1;let id_ping = format!("id_ping{}", self.state.data.counter);let ping = stanzas::make_ping(&id_ping, self.state.client.jid.clone());self.state.data.send_queue.push_back(ping);self.state.data.pending_ids.insert(id_ping,(Instant::now() + Duration::from_secs(30),Box::new(PingIqHandler {}),),);}XmppCommand::TimeoutCleanup => {let now = Instant::now();let timeouted: Vec<String> = self.state.data.pending_ids.iter().filter_map(|(id, (timeout, _))| {if now >= *timeout {Some(id.to_string())} else {None}}).collect();let mut correct = true;timeouted.into_iter().for_each(|id| {if let Some((_, handler)) = self.state.data.pending_ids.remove(&id) {correct &= handler.timeout(&mut self);}})}}}pub fn shutdown(self) -> impl Future<Item = (), Error = failure::Error> {info!("Shutdown connection");let XmppConnection { account, state } = self;stream::iter_ok(state.data.mucs.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, data }, muc_jid| {let muc_presence =stanzas::make_muc_presence_leave(account.jid.clone(), muc_jid.clone());info!("Sending muc leave presence... {}",String::from(&muc_presence));use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);e}).and_then(|client| future::ok(XmppState { client, data }))}).map(|_| ())}fn enter_mucs<F, E>(self,_stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection { account, state } = self;let account2 = account.clone();let account3 = account.clone();stream::iter_ok(account.chatrooms.clone()).fold(state, move |XmppState { client, mut data }, muc_jid| {data.counter += 1;let id_muc_presence = format!("id_muc_presence{}", data.counter);let muc_presence = stanzas::make_muc_presence(&id_muc_presence,account2.jid.clone(),muc_jid.1.clone(),);info!("Sending muc presence... {}", String::from(&muc_presence));let account4 = account2.clone();use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);account4}).and_then(|client| {data.mucs.insert(muc_jid.0, muc_jid.1);future::ok(XmppState { client, data })})}).map(|state| XmppConnection {account: account3,state,})}}[3.21]use tokio_xmpp::{Client, Event, Packet};use tokio::prelude::future::{self, Either};use tokio::prelude::stream;use tokio::prelude::{Future, Stream};use std::collections::{HashMap, VecDeque};use super::XmppCommand;use super::stanzas;use super::element_processor;use crate::config;#[derive(Default)]struct XmppData {/// known roster dataroster: HashMap<xmpp_parsers::Jid,(xmpp_parsers::roster::Subscription,xmpp_parsers::roster::Ask,),>,/// ids countercounter: usize,/// map from id of adding item to roster and jid of itempending_add_roster_ids: HashMap<String, xmpp_parsers::Jid>,/// stanzas to sendsend_queue: VecDeque<minidom::Element>,/// outgoing mailboxoutgoing_mailbox: HashMap<xmpp_parsers::Jid, Vec<String>>,/// muc id to muc jidmucs: HashMap<String, xmpp_parsers::Jid>,}struct XmppState {client: Client,data: XmppData,}pub struct XmppConnection {account: std::rc::Rc<config::Account>,state: XmppState,}struct XmppElementProcessor {incoming: element_processor::Processor<XmppConnection, bool, xmpp_parsers::Element>,}impl XmppElementProcessor {fn new() -> XmppElementProcessor {let mut incoming = element_processor::Processor::new(&|_, e| {warn!("Unknown stanza {:#?}", e);true});incoming.register(&XmppConnection::incoming_iq_processing);XmppElementProcessor { incoming }}}pub struct MaybeXmppConnection {account: std::rc::Rc<config::Account>,state: Option<XmppState>,}impl From<XmppConnection> for MaybeXmppConnection {fn from(from: XmppConnection) -> MaybeXmppConnection {MaybeXmppConnection {account: from.account,state: Some(from.state),}}}impl From<config::Account> for MaybeXmppConnection {fn from(from: config::Account) -> MaybeXmppConnection {MaybeXmppConnection {account: std::rc::Rc::new(from),state: None,}}}impl From<std::rc::Rc<config::Account>> for MaybeXmppConnection {fn from(from: std::rc::Rc<config::Account>) -> MaybeXmppConnection {MaybeXmppConnection {account: from,state: None,}}}impl MaybeXmppConnection {/// connects if nothing connected/// don't connect only if stop_future resolvedpub fn connect<F>(self,stop_future: F,) -> impl Future<Item = XmppConnection, Error = failure::Error>whereF: future::Future + Clone + 'static,<F as hyper::rt::Future>::Error: Into<failure::Error> + Send,{info!("xmpp connection...");let MaybeXmppConnection { account, state } = self;if let Some(state) = state {Box::new(future::ok(XmppConnection { account, state }))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(stop_future.clone().select2(future::loop_fn(account, move |account| {info!("xmpp initialization...");let client =Client::new_with_jid(account.jid.clone(), &account.password);info!("xmpp initialized");let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone();let stop_future4 = stop_future.clone();// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,}.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).and_then(|conn| conn.enter_mucs(stop_future4)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),}),)}).map_err(|_: ()| ()),).then(|r| match r {Ok(Either::A((_x, _b))) => future::err(format_err!("Stop XMMP connection")),Ok(Either::B((x, _a))) => future::ok(x),Err(Either::A((e, _b))) => future::err(e.into()),Err(Either::B((_, _a))) => {future::err(format_err!("Cann't initiate XMPP connection"))}}),)}}}impl XmppConnection {/// base XMPP processing/// Returns false on error to disconnectfn xmpp_processing(&mut self, event: &Event) -> bool {match event {Event::Stanza(stanza) => {let processors = XmppElementProcessor::new();processors.incoming.process(self, stanza.clone())}Event::Online => true,e => {warn!("Unexpected event {:?}", e);false}}}fn incoming_iq_processing(&mut self, iq: xmpp_parsers::iq::Iq) -> bool {use std::convert::TryInto;if let Some((_, jid)) = self.state.data.pending_add_roster_ids.remove_entry(&iq.id) {if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {if self.state.data.roster.contains_key(&jid) {info!("Jid {} updated to roster", jid);} else {info!("Jid {} added in roster", jid);self.state.data.roster.insert(jid.clone(),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,),);}self.process_jid(&jid);} else {warn!("Wrong payload when adding {} to roster: {:?}",jid, iq.payload);}}match iq.payload {xmpp_parsers::iq::IqType::Set(element) => {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{for i in roster.items {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&i.jid) {info!("Update {} in roster", i.jid);rdata.0 = i.subscription;rdata.1 = i.ask;} else {info!("Add {} to roster", i.jid);self.state.data.roster.insert(i.jid.clone(), (i.subscription, i.ask));}self.process_jid(&i.jid);}}}xmpp_parsers::iq::IqType::Error(e) => {error!("iq error: {:?}", e);return false;}xmpp_parsers::iq::IqType::Get(element) => {if let Some(_ping) = element.try_into().ok() as Option<xmpp_parsers::ping::Ping> {let pong = stanzas::make_pong(&iq.id, self.state.client.jid.clone(), iq.from);self.state.data.send_queue.push_back(pong);}}_ => (), // ignore}true}/// process event from xmpp stream/// returns from future when condition met/// or stop future was resolved./// Return item if connection was preserved or error otherwise./// Second part is a state of stop_futurepub fn processing<S, F, T, E>(self,stop_condition: S,stop_future: F,) -> impl Future<Item = (Self, Result<Either<F, T>, E>),Error = (std::rc::Rc<config::Account>, Result<Either<F, T>, E>),>whereF: Future<Item = T, Error = E> + 'static,S: FnMut(&mut Self, Event) -> Result<bool, ()> + 'static,T: 'static,E: 'static,{future::loop_fn((self, stop_future, stop_condition),|(xmpp, stop_future, mut stop_condition)| {let XmppConnection {state: XmppState { client, mut data },account,} = xmpp;if let Some(send_element) = data.send_queue.pop_front() {use tokio::prelude::Sink;info!("Sending {:?}", send_element);Box::new(client.send(Packet::Stanza(send_element)).select2(stop_future).then(move |r| match r {Ok(Either::A((client, b))) => {Box::new(future::ok(future::Loop::Continue((XmppConnection {state: XmppState { client, data },account,},b,stop_condition,))))as Box<dyn Future<Item = _, Error = _>>}Ok(Either::B((t, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Ok(Either::B(t))))}})),Err(Either::A((e, b))) => {warn!("XMPP sending error: {}", e);Box::new(future::err((account, Ok(Either::A(b)))))}Err(Either::B((e, a))) => Box::new(a.then(|r| match r {Ok(client) => future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),))),Err(se) => {warn!("XMPP sending error: {}", se);future::err((account, Err(e)))}})),}),) as Box<dyn Future<Item = _, Error = _>>} else {Box::new(client.into_future().select2(stop_future).then(move |r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let mut xmpp = XmppConnection {state: XmppState { client, data },account,};if xmpp.xmpp_processing(&event) {match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => {future::err((xmpp.account, Ok(Either::A(b))))}}} else {future::err((xmpp.account, Ok(Either::A(b))))}} else {future::err((account, Ok(Either::A(b))))}}Ok(Either::B((t, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Ok(Either::B(t)),)))} else {future::err((account, Ok(Either::B(t))))}}Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0);future::err((account, Ok(Either::A(b))))}Err(Either::B((e, a))) => {if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),)))} else {future::err((account, Err(e)))}}}),)}},)}/// get connection and wait for online status and set presence/// returns error if something went wrong and xmpp connection is brokenfn online(&mut self, event: Event) -> Result<bool, ()> {match event {Event::Online => {info!("Online!");Ok(true)}Event::Stanza(s) => {warn!("Stanza before online: {:?}", s);Ok(false)}_ => {error!("Disconnected while online");Err(())}}}fn process_initial_roster(&mut self, event: Event, id_init_roster: &str) -> Result<bool, ()> {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::iq::Iq, _> {Ok(iq) => {if iq.id == id_init_roster {match iq.payload {xmpp_parsers::iq::IqType::Error(_e) => {error!("Get error instead of roster");Err(())}xmpp_parsers::iq::IqType::Result(Some(result)) => {match result.try_into() as Result<xmpp_parsers::roster::Roster, _> {Ok(roster) => {self.state.data.roster.clear();info!("Got first roster:");for i in roster.items {info!(" >>> {:?}", i);self.state.data.roster.insert(i.jid, (i.subscription, i.ask));}Ok(true)}Err(e) => {error!("Cann't parse roster: {}", e);Err(())}}}_ => {error!("Unknown result of roster");Err(())}}} else {Ok(false)}}Err(_e) => Ok(false),}} else {error!("Wrong event while waiting roster");Err(())}}fn initial_roster<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: 'static,{let XmppConnection {account,state: XmppState { client, mut data },} = self;use tokio::prelude::Sink;data.counter += 1;let id_init_roster = format!("id_init_roster{}", data.counter);let get_roster = stanzas::make_get_roster(&id_init_roster);let account2 = account.clone();info!("Quering roster... {:?}", get_roster);client.send(Packet::Stanza(get_roster)).map_err(move |e| {error!("Error on querying roster: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| conn.process_initial_roster(event, &id_init_roster),stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn self_presence<F, E>(self,stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection {account,state: XmppState { client, data },} = self;use tokio::prelude::Sink;let presence = stanzas::make_presence(&account);let account2 = account.clone();info!("Sending presence... {:?}", presence);client.send(Packet::Stanza(presence)).map_err(|e| {error!("Error on send self-presence: {}", e);account2}).and_then(move |client| {XmppConnection {state: XmppState { client, data },account,}.processing(move |conn, event| {if let Event::Stanza(s) = event {use std::convert::TryInto;match s.try_into() as Result<xmpp_parsers::presence::Presence, _> {Ok(presence) => {Ok(presence.from.as_ref() == Some(&conn.state.client.jid))}Err(e) => {warn!("Not a self-presence: {}", e);Ok(false)}}} else {error!("Wrong event while waiting self-presence");Err(())}},stop_future,).map_err(|(account, _)| account).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),})})}fn process_jid(&mut self, xmpp_to: &xmpp_parsers::Jid) {if let Some(ref mut mailbox) = self.state.data.outgoing_mailbox.get_mut(xmpp_to) {if !mailbox.is_empty() {if let Some(ref mut rdata) = self.state.data.roster.get_mut(xmpp_to) {info!("Jid {} in roster", xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", xmpp_to);self.state.data.send_queue.extend(mailbox.drain(..).map(|message| {stanzas::make_chat_message(xmpp_to.clone(), message)}),);} else if rdata.1 == xmpp_parsers::roster::Ask::None {info!("Not subscribed to {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to.clone()));} else {warn!("Not subscribed to {}. Currently in {:?} state",xmpp_to, rdata.1);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to.clone()));}let sub_from = match rdata.0 {xmpp_parsers::roster::Subscription::From => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if !sub_from {info!("Not subscription from {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_allow_subscribe(xmpp_to.clone()));}} else {info!("Jid {} not in roster", xmpp_to);self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, xmpp_to.clone());self.state.data.pending_add_roster_ids.insert(id_add_roster, xmpp_to.clone());info!("Adding jid to roster... {:?}", add_roster);self.state.data.send_queue.push_back(add_roster);}}}}pub fn process_command(&mut self, cmd: XmppCommand) {info!("Got command");match cmd {XmppCommand::Chat { xmpp_to, message } => {self.state.data.outgoing_mailbox.entry(xmpp_to.clone()).or_default().push(message);self.process_jid(&xmpp_to);}XmppCommand::Chatroom { muc_id, message } => {if let Some(muc) = self.state.data.mucs.get(&muc_id) {self.state.data.send_queue.push_back(stanzas::make_muc_message(muc.clone(), message));} else {error!("Not found MUC {}", muc_id);}}XmppCommand::Ping => {self.state.data.counter += 1;let id_ping = format!("id_ping{}", self.state.data.counter);let ping = stanzas::make_ping(&id_ping, self.state.client.jid.clone());self.state.data.send_queue.push_back(ping);}}}pub fn shutdown(self) -> impl Future<Item = (), Error = failure::Error> {info!("Shutdown connection");let XmppConnection { account, state } = self;stream::iter_ok(state.data.mucs.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, data }, muc_jid| {let muc_presence =stanzas::make_muc_presence_leave(account.jid.clone(), muc_jid.clone());info!("Sending muc leave presence... {:?}", muc_presence);use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);e}).and_then(|client| future::ok(XmppState { client, data }))}).map(|_| ())}fn enter_mucs<F, E>(self,_stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection { account, state } = self;let account2 = account.clone();let account3 = account.clone();stream::iter_ok(account.chatrooms.clone()).fold(state, move |XmppState { client, mut data }, muc_jid| {data.counter += 1;let id_muc_presence = format!("id_muc_presence{}", data.counter);let muc_presence = stanzas::make_muc_presence(&id_muc_presence,account2.jid.clone(),muc_jid.1.clone(),);info!("Sending muc presence... {:?}", muc_presence);let account4 = account2.clone();use tokio::prelude::Sink;client.send(Packet::Stanza(muc_presence)).map_err(|e| {error!("Error on send muc presence: {}", e);account4}).and_then(|client| {data.mucs.insert(muc_jid.0, muc_jid.1);future::ok(XmppState { client, data })})}).map(|state| XmppConnection {account: account3,state,})}} - edit in src/xmpp/stanzas.rs at line 7
use xmpp_parsers::stanza_error::{DefinedCondition, ErrorType, StanzaError}; - edit in src/xmpp/stanzas.rs at line 43
}pub fn make_roster_push_answer(id: String,from: xmpp_parsers::Jid,to: Option<xmpp_parsers::Jid>,) -> Iq {let mut answer = Iq::from_result(id, None as Option<Roster>);answer.from = Some(from);answer.to = to;answer - replacement in src/xmpp/stanzas.rs at line 94
pub fn make_pong(id: &str, from: xmpp_parsers::Jid, to: Option<xmpp_parsers::Jid>) -> Iq {pub fn make_pong(id: &str, from: xmpp_parsers::Jid, to: Option<xmpp_parsers::Jid>) -> Element { - replacement in src/xmpp/stanzas.rs at line 98
pong}pub fn make_iq_unsupported_error(id: String,from: xmpp_parsers::Jid,to: Option<xmpp_parsers::Jid>,) -> Iq {let mut error = Iq::from_error(id,StanzaError {type_: ErrorType::Cancel,by: Some(from.clone()),defined_condition: DefinedCondition::ServiceUnavailable,texts: std::collections::BTreeMap::new(),other: None,},);error.from = Some(from);error.to = to;errorpong.into() - replacement in src/xmpp/mod.rs at line 12
pub use xmpp_connection::XmppCommand;#[derive(Debug)]pub enum XmppCommand {Chat {xmpp_to: xmpp_parsers::Jid,message: String,},Chatroom {muc_id: String,message: String,},Ping,} - replacement in src/xmpp/element_processor.rs at line 0
type Func<S, T, E> = dyn Fn(&mut S, E) -> T + Sync;pub struct Processor<S: 'static, T: 'static, E: Clone + 'static> {processors: Vec<Box<Func<S, Option<T>, E>>>,default: &'static Func<S, T, E>,}impl<S: 'static, T: 'static, E: Clone + 'static> Processor<S, T, E> {pub fn new<F>(f: &'static F) -> Processor<S, T, E>whereF: Fn(&mut S, E) -> T + Sync + 'static,{Processor {processors: vec![],default: f,}}pub fn register<F, A>(&mut self, f: &'static F)whereF: Fn(&mut S, A) -> T + Sync + 'static,A: std::convert::TryFrom<E>,{self.processors.push(Box::new(move |s, e: E| {use std::convert::TryInto;(e.try_into().ok() as Option<A>).map(|a| f(s, a))}));}pub fn process(&self, s: &mut S, e: E) -> T {for processor in self.processors.iter() {match processor(s, e.clone()) {Some(t) => return t,None => continue,}}(*self.default)(s, e)}}[3.11301]type Func<S, T, E> = dyn Fn(&mut S, E) -> T;pub struct Processor<S: 'static, T: 'static, E: Clone + 'static> {processors: Vec<Box<Func<S, Option<T>, E>>>,default: &'static Func<S, T, E>,}impl<S: 'static, T: 'static, E: Clone + 'static> Processor<S, T, E> {pub fn new<F>(f: &'static F) -> Processor<S, T, E>whereF: Fn(&mut S, E) -> T + 'static,{Processor {processors: vec![],default: f,}}pub fn register<F, A>(&mut self, f: &'static F)whereF: Fn(&mut S, A) -> T + 'static,A: std::convert::TryFrom<E>,{self.processors.push(Box::new(move |s, e: E| {use std::convert::TryInto;(e.try_into().ok() as Option<A>).map(|a| f(s, a))}));}pub fn process(&self, s: &mut S, e: E) -> T {for processor in self.processors.iter() {match processor(s, e.clone()) {Some(t) => return t,None => continue,}}(*self.default)(s, e)}} - edit in src/main.rs at line 21
#[macro_use]extern crate lazy_static; - edit in src/main.rs at line 215
use hyper::rt::{Future, Stream}; - edit in Cargo.toml at line 23
lazy_static = "1.3.0" # ToDo: remove after const fn will be powerfull enough - edit in Cargo.lock at line 2
[[package]]name = "MacTypes-sys"version = "2.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",] - replacement in Cargo.lock at line 28
version = "0.3.11"version = "0.3.10" - replacement in Cargo.lock at line 44
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 51
version = "0.1.4"version = "0.1.2" - replacement in Cargo.lock at line 56
version = "0.3.30"version = "0.3.15" - replacement in Cargo.lock at line 59
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 61
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)","winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 72
"cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 81
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 86
version = "1.1.0"version = "1.0.4" - replacement in Cargo.lock at line 102
version = "0.7.3"version = "0.7.0" - replacement in Cargo.lock at line 105
"block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 107
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 113
version = "0.1.4"version = "0.1.3" - replacement in Cargo.lock at line 126
version = "1.3.2"version = "1.3.1" - replacement in Cargo.lock at line 134
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 145
version = "1.0.37"version = "1.0.35" - replacement in Cargo.lock at line 150
version = "0.1.9"version = "0.1.7" - replacement in Cargo.lock at line 158
"num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)","num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)","num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 170
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)","bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 182
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)","bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 187
version = "0.6.4"version = "0.5.1" - replacement in Cargo.lock at line 190
"core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 196
version = "0.6.2"version = "0.5.1" - edit in Cargo.lock at line 198
dependencies = ["libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)",] - replacement in Cargo.lock at line 217
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 237
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 267[3.61551]→[3.61551:61564](∅→∅),[3.61551]→[3.61551:61564](∅→∅),[3.61551]→[3.61551:61564](∅→∅),[3.61564]→[2.39518:39617](∅→∅)
[[package]]name = "either"version = "1.5.2"source = "registry+https://github.com/rust-lang/crates.io-index" - replacement in Cargo.lock at line 273
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 284
"regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)","termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)","regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)","termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 293
"backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)","backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 301
"backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)","backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 310
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 312
"syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)","synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)","synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 349
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)","bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 369
version = "0.1.27"version = "0.1.26" - replacement in Cargo.lock at line 377
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 391
version = "0.1.23"version = "0.1.18" - replacement in Cargo.lock at line 394
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 397
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 402
"string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)","string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 420
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 431
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)","itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 435
name = "http-body"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","http 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)","tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",][[package]] - replacement in Cargo.lock at line 449
version = "0.12.30"version = "0.12.27" - replacement in Cargo.lock at line 453
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 455
"h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)","h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 457
"http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 459
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)","itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 464
"tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)","tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 469
"tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 494
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 504
"socket2 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)","socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 512
version = "0.4.4"version = "0.4.3" - edit in Cargo.lock at line 542
source = "registry+https://github.com/rust-lang/crates.io-index"[[package]]name = "lazycell"version = "1.2.1" - replacement in Cargo.lock at line 551
version = "0.2.58"version = "0.2.51" - replacement in Cargo.lock at line 573
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 596
"serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 631
version = "0.6.19"version = "0.6.16" - replacement in Cargo.lock at line 638
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 653
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 670
version = "0.2.3"version = "0.2.2" - replacement in Cargo.lock at line 674
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 676
"openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)","openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 678
"openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)","openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 680
"security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)","security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 690
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 707
version = "0.1.41"version = "0.1.39" - replacement in Cargo.lock at line 710
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 715
version = "0.2.8"version = "0.2.6" - edit in Cargo.lock at line 717
dependencies = ["autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",] - replacement in Cargo.lock at line 720
version = "1.10.1"version = "1.10.0" - replacement in Cargo.lock at line 723
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 727
name = "numtoa"version = "0.1.0"source = "registry+https://github.com/rust-lang/crates.io-index"[[package]] - replacement in Cargo.lock at line 733
version = "0.10.23"version = "0.10.20" - replacement in Cargo.lock at line 736
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 740
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 751
version = "0.9.47"version = "0.9.43" - replacement in Cargo.lock at line 754
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 757
"rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 783
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 786
"smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 795
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 850
version = "0.4.30"version = "0.4.27" - replacement in Cargo.lock at line 882
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 892
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 902
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 908
"rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 920
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 955
version = "0.1.4"version = "0.1.3" - replacement in Cargo.lock at line 958
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 970
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 981
"autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)","autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1016
version = "1.1.7"version = "1.1.5" - replacement in Cargo.lock at line 1021
"regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)","regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1023
"utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)","utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1028
version = "0.6.7"version = "0.6.6" - replacement in Cargo.lock at line 1036
version = "0.5.2"version = "0.5.1" - replacement in Cargo.lock at line 1053
version = "0.1.15"version = "0.1.14" - replacement in Cargo.lock at line 1066
version = "0.2.8"version = "0.2.7" - replacement in Cargo.lock at line 1098
version = "0.3.1"version = "0.2.2" - replacement in Cargo.lock at line 1101
"core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1109
version = "0.3.1"version = "0.2.3" - replacement in Cargo.lock at line 1112
"core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)","MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)","core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1137
"hyper 0.12.30 (registry+https://github.com/rust-lang/crates.io-index)","lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)","hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1140
"serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1146
"toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)","toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1152
version = "1.0.92"version = "1.0.90" - replacement in Cargo.lock at line 1157
version = "1.0.92"version = "1.0.90" - replacement in Cargo.lock at line 1160
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1162
"syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1170
"itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)","ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)","ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1180
"block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)","block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1191
"block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)","block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1199
version = "0.8.2"version = "0.8.1" - replacement in Cargo.lock at line 1202
"block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)","block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1211
version = "0.1.9"version = "0.1.8" - replacement in Cargo.lock at line 1214
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","signal-hook-registry 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)","arc-swap 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 1219[2.49347]→[2.49347:49395](∅→∅),[3.75380]→[3.94343:94425](∅→∅),[3.57031]→[3.94343:94425](∅→∅),[3.63707]→[3.94343:94425](∅→∅),[3.80173]→[3.94343:94425](∅→∅),[3.47651]→[3.94343:94425](∅→∅),[2.49395]→[3.94343:94425](∅→∅),[3.57209]→[3.94343:94425](∅→∅),[3.94343]→[3.94343:94425](∅→∅),[3.94425]→[2.49396:49544](∅→∅),[3.75529]→[3.94573:94588](∅→∅),[3.57179]→[3.94573:94588](∅→∅),[3.63855]→[3.94573:94588](∅→∅),[3.80321]→[3.94573:94588](∅→∅),[3.47800]→[3.94573:94588](∅→∅),[2.49544]→[3.94573:94588](∅→∅),[3.57358]→[3.94573:94588](∅→∅),[3.94573]→[3.94573:94588](∅→∅)
name = "signal-hook-registry"version = "1.0.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)",][[package]] - replacement in Cargo.lock at line 1230
version = "0.6.10"version = "0.6.9" - replacement in Cargo.lock at line 1235
version = "0.3.9"version = "0.3.8" - replacement in Cargo.lock at line 1238
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1251
version = "0.2.0"version = "0.1.3" - edit in Cargo.lock at line 1253
dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)",] - replacement in Cargo.lock at line 1263
"serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1275
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1307
version = "0.15.36"version = "0.15.30" - replacement in Cargo.lock at line 1310
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1325
version = "0.10.2"version = "0.10.1" - replacement in Cargo.lock at line 1328
"proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)","proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1330
"syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)","syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1336
version = "3.0.8"version = "3.0.7" - replacement in Cargo.lock at line 1339
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1343
"remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)","remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1359
version = "1.0.5"version = "1.0.4" - replacement in Cargo.lock at line 1367
version = "1.5.3"version = "1.5.1" - replacement in Cargo.lock at line 1370
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1396
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1403
version = "0.1.21"version = "0.1.18" - replacement in Cargo.lock at line 1407
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1416
"tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)","tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1418
"tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)","tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)","tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 1423
][[package]]name = "tokio-buf"version = "0.1.1"source = "registry+https://github.com/rust-lang/crates.io-index"dependencies = ["bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)","either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1430
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1439
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1448
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1458
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1466
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1468
"tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)","tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1477
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1487
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1490
"mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1496
"tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)","tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1504
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1508
"signal-hook 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1517
version = "0.1.6"version = "0.1.4" - replacement in Cargo.lock at line 1521
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1530
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1532
"mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1539
version = "0.1.14"version = "0.1.13" - replacement in Cargo.lock at line 1545
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1547
"num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)","num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1555
version = "0.2.11"version = "0.2.10" - replacement in Cargo.lock at line 1559
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1569
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)","native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1576
version = "0.2.0"version = "0.1.0" - replacement in Cargo.lock at line 1588
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1590
"mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1602
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1604
"libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)","libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1606
"mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)","mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1620
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1622
"native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)","native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1625
"tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1637
version = "0.5.1"version = "0.5.0" - replacement in Cargo.lock at line 1640
"serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)","serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1648
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)","byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1650
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1655
"smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)","socket2 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)","socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1661
"tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)","tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1671
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1673
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1679
"smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)","tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1694
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)","cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1720
"smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)","smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1755
version = "1.0.3"version = "1.0.2" - replacement in Cargo.lock at line 1773
"futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)","futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1878
"sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)","sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - replacement in Cargo.lock at line 1895
"sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)","sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - edit in Cargo.lock at line 1899
"checksum MacTypes-sys 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eaf9f0d0b1cc33a4d2aee14fb4b2eac03462ef4db29c8ac4057327d8a71ad86f" - replacement in Cargo.lock at line 1902
"checksum arc-swap 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "bc4662175ead9cd84451d5c35070517777949a2ed84551764129cedb88384841""checksum arc-swap 0.3.10 (registry+https://github.com/rust-lang/crates.io-index)" = "a57a5698f85c6fd92f19dad87ff2d822fc4ba79dd85c13914d8c4dad589cb815" - replacement in Cargo.lock at line 1905
"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf""checksum backtrace 0.3.30 (registry+https://github.com/rust-lang/crates.io-index)" = "ada4c783bb7e7443c14e0480f429ae2cc99da95065aeab7ee1b81ada0419404f""checksum autocfg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a6d640bee2da49f60a4068a7fae53acde8982514ab7bae8b8cea9e88cbcfd799""checksum backtrace 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "f106c02a3604afcdc0df5d36cc47b44b55917dbaf3d808f71c163a0ddba64637" - replacement in Cargo.lock at line 1909
"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd""checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" - replacement in Cargo.lock at line 1911
"checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b""checksum block-padding 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc3af3ee2e12f3e5d224e5e1e3d73668abbeb69e566d361f7d5563a4fdf09""checksum block-buffer 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "49665c62e0e700857531fa5d3763e91b539ff1abeebd56808d378b495870d60d""checksum block-padding 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d75255892aeb580d3c566f213a2b6fdc1c66667839f45719ee1d30ebf2aea591" - replacement in Cargo.lock at line 1914
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5""checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" - replacement in Cargo.lock at line 1917
"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d""checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33""checksum cc 1.0.35 (registry+https://github.com/rust-lang/crates.io-index)" = "5e5f3fee5eeb60324c2781f1e41286bdee933850fff9b3c672587fed5ec58c83""checksum cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "11d43355396e872eefb45ce6342e4374ed7bc2b3a502d1b28e36d6e23c05d1f4" - replacement in Cargo.lock at line 1922
"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d""checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b""checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980""checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" - edit in Cargo.lock at line 1931
"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" - replacement in Cargo.lock at line 1944
"checksum futures 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "a2037ec1c6c1c4f79557762eab1f7eae1f64f6cb418ace90fae88f0942b60139""checksum futures 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "62941eff9507c8177d448bd83a44d9b9760856e184081d8cd79ba9f03dd24981" - replacement in Cargo.lock at line 1947
"checksum h2 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "1e42e3daed5a7e17b12a0c23b5b2fbff23a925a570938ebee4baca1a9a1a2240""checksum h2 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "85ab6286db06040ddefb71641b50017c06874614001a134b423783e2db2920bd" - edit in Cargo.lock at line 1951
"checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" - replacement in Cargo.lock at line 1953
"checksum hyper 0.12.30 (registry+https://github.com/rust-lang/crates.io-index)" = "40e7692b2009a70b1e9b362284add4d8b75880fefddb4acaa5e67194e843f219""checksum hyper 0.12.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4f2777434f26af6e4ce4fdcdccd3bed9d861d11e87bcbe72c0f51ddaca8ff848" - replacement in Cargo.lock at line 1958
"checksum itoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "501266b7edd0174f8530248f87f99c88fbe60ca4ef3dd486835b8d8d53136f7f""checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" - replacement in Cargo.lock at line 1963
"checksum libc 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)" = "6281b86796ba5e4366000be6e9e18bf35580adf9e63fbe2294aadb587613a319""checksum lazycell 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f""checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" - replacement in Cargo.lock at line 1975
"checksum mio 0.6.19 (registry+https://github.com/rust-lang/crates.io-index)" = "83f51996a3ed004ef184e16818edc51fadffe8e7ca68be67f9dee67d84d0ff23""checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" - replacement in Cargo.lock at line 1978
"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e""checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" - replacement in Cargo.lock at line 1982
"checksum num-integer 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "b85e541ef8255f6cf42bbfe4ef361305c6c135d10919ecc26126c4e5ae94bc09""checksum num-traits 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba9a427cfca2be13aa6f6403b0b7e7368fe982bfa16fccc450ce74c46cd9b32""checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273""checksum numtoa 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef""checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea""checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1""checksum num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a23f0ed30a54abaa0c7e83b1d2d87ada7c3c23078d1d87815af3e3b6385fbba" - replacement in Cargo.lock at line 1986
"checksum openssl 0.10.23 (registry+https://github.com/rust-lang/crates.io-index)" = "97c140cbb82f3b3468193dd14c1b88def39f341f68257f8a7fe8ed9ed3f628a5""checksum openssl 0.10.20 (registry+https://github.com/rust-lang/crates.io-index)" = "5a0d6b781aac4ac1bd6cafe2a2f0ad8c16ae8e1dd5184822a16c50139f8838d9" - replacement in Cargo.lock at line 1988
"checksum openssl-sys 0.9.47 (registry+https://github.com/rust-lang/crates.io-index)" = "75bdd6dbbb4958d38e47a1d2348847ad1eb4dc205dc5d37473ae504391865acc""checksum openssl-sys 0.9.43 (registry+https://github.com/rust-lang/crates.io-index)" = "33c86834957dd5b915623e94f2f4ab2c70dd8f6b70679824155d5ae21dbd495d" - replacement in Cargo.lock at line 2000
"checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759""checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" - replacement in Cargo.lock at line 2012
"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b""checksum rand_jitter 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b9ea758282efe12823e0d952ddb269d2e1897227e464919a554f2a03ef1b832" - replacement in Cargo.lock at line 2019
"checksum regex 1.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0b2f0808e7d7e4fb1cb07feb6ff2f4bc827938f24f8c2e6a3beb7370af544bdd""checksum regex-syntax 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9d76410686f9e3a17f06128962e0ecc5755870bb890c34820c7af7f1db2e1d48""checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e""checksum regex 1.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "559008764a17de49a3146b234641644ed37d118d1ef641a0bb573d146edc6ce0""checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96""checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" - replacement in Cargo.lock at line 2023
"checksum rustc-demangle 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "a7f4dccf6f4891ebcc0c39f9b6eb1a83b9bf5d747cb439ec6fba4f3b977038af""checksum rustc-demangle 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "ccc78bfd5acd7bf3e89cffcf899e5cb1a52d6fafa8dec2739ad70c9577a57288" - replacement in Cargo.lock at line 2025
"checksum ryu 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "b96a9549dc8d48f2c283938303c4b5a77aa29bfbc5b54b084fb1630408899a8f""checksum ryu 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9e9b8cde282a9fe6a42dd4681319bfb63f121b8a8ee9439c6f4107e58a46f7" - replacement in Cargo.lock at line 2029
"checksum security-framework 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eee63d0f4a9ec776eeb30e220f0bc1e092c3ad744b2a379e3993070364d3adc2""checksum security-framework-sys 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9636f8989cbf61385ae4824b98c1aaa54c994d7d8b41f11c601ed799f0549a56""checksum security-framework 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfab8dda0e7a327c696d893df9ffa19cadc4bd195797997f5223cf5831beaf05""checksum security-framework-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3d6696852716b589dff9e886ff83778bb635150168e83afa8ac6b8a78cb82abc" - replacement in Cargo.lock at line 2033
"checksum serde 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "32746bf0f26eab52f06af0d0aa1984f641341d06d8d673c693871da2d188c9be""checksum serde_derive 1.0.92 (registry+https://github.com/rust-lang/crates.io-index)" = "46a3223d0c9ba936b61c0d2e3e559e3217dbfb8d65d06d26e8b3c25de38bae3e""checksum serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "aa5f7c20820475babd2c077c3ab5f8c77a31c15e16ea38687b4c02d3e48680f4""checksum serde_derive 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc82bec244f168b23d1963b45c8bf5726e9a15a9d146a067f9081aeed2de79" - replacement in Cargo.lock at line 2038
"checksum sha3 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd26bc0e7a2e3a7c959bc494caf58b72ee0c71d67704e9520f736ca7e4853ecf""checksum signal-hook 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "72ab58f1fda436857e6337dcb6a5aaa34f16c5ddc87b3a8b6ef7a212f90b9c5a""checksum signal-hook-registry 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cded4ffa32146722ec54ab1f16320568465aa922aa9ab4708129599740da85d7""checksum sha3 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "34a5e54083ce2b934bf059fdf38e7330a154177e029ab6c4e18638f2f624053a""checksum signal-hook 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "97a47ae722318beceb0294e6f3d601205a1e6abaa4437d9d33e3a212233e3021" - replacement in Cargo.lock at line 2042
"checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7""checksum socket2 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "4e626972d3593207547f14bf5fc9efa4d0e7283deb73fef1dff313dae9ab8878""checksum smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c4488ae950c49d403731982257768f48fada354a5203fe81f9bb6f43ca9002be""checksum socket2 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "c4d11a52082057d87cb5caa31ad812f4504b97ab44732cd8359df2e9ff9f48e7" - replacement in Cargo.lock at line 2045
"checksum string 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0bbfb8937e38e34c3444ff00afb28b0811d9554f15c5ad64d12b0308d1d1995""checksum string 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b639411d0b9c738748b5397d5ceba08e648f4f1992231aa859af1a017f31f60b" - replacement in Cargo.lock at line 2052
"checksum syn 0.15.36 (registry+https://github.com/rust-lang/crates.io-index)" = "8b4f551a91e2e3848aeef8751d0d4eec9489b6474c720fd4c55958d8d31a430c""checksum syn 0.15.30 (registry+https://github.com/rust-lang/crates.io-index)" = "66c8865bf5a7cbb662d8b011950060b3c8743dca141b054bf7195b20d314d8e2" - replacement in Cargo.lock at line 2054
"checksum synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "02353edf96d6e4dc81aea2d8490a7e9db177bf8acb0e951c24940bf866cb313f""checksum tempfile 3.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7dc4738f2e68ed2855de5ac9cdbe05c9216773ecde4739b2f095002ab03a13ef""checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015""checksum tempfile 3.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b86c784c88d98c801132806dadd3819ed29d8600836c4088e855cdf3e178ed8a" - replacement in Cargo.lock at line 2057
"checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e""checksum termion 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a8fb22f7cde82c8220e5aeacb3258ed7ce996142c77cba193f203515e26c330""checksum termcolor 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4096add70612622289f2fdcdbd5086dc81c1e2675e6ae58d6c4f62a16c6d7f2f""checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" - replacement in Cargo.lock at line 2062
"checksum tokio 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "ec2ffcf4bcfc641413fa0f1427bf8f91dfc78f56a6559cbf50e04837ae442a87""checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46""checksum tokio 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "65641e515a437b308ab131a82ce3042ff9795bef5d6c5a9be4eb24195c417fd9" - replacement in Cargo.lock at line 2071
"checksum tokio-sync 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2162248ff317e2bc713b261f242b69dbb838b85248ed20bb21df56d60ea4cae7""checksum tokio-sync 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fda385df506bf7546e70872767f71e81640f1f251bdf2fd8eb81a0eaec5fe022" - replacement in Cargo.lock at line 2073
"checksum tokio-threadpool 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72558af20be886ea124595ea0f806dd5703b8958e4705429dd58b3d8231f72f2""checksum tokio-timer 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "f2106812d500ed25a4f38235b9cae8f78a09edf43203e16e59c3b769a342a60e""checksum tokio-threadpool 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "ec5759cf26cf9659555f36c431b515e3d05f66831741c85b4b5d5dfb9cf1323c""checksum tokio-timer 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2910970404ba6fa78c5539126a9ae2045d62e3713041e447f695f41405a120c6" - replacement in Cargo.lock at line 2076
"checksum tokio-trace-core 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9c8a256d6956f7cb5e2bdfe8b1e8022f1a09206c6c2b1ba00f3b746b260c613""checksum tokio-trace-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "350c9edade9830dc185ae48ba45667a445ab59f6167ef6d0254ec9d2430d9dd3" - replacement in Cargo.lock at line 2080
"checksum toml 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8c96d7873fa7ef8bdeb3a9cda3ac48389b4154f32b9803b4bc26220b677b039""checksum toml 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "87c5890a989fa47ecdc7bcb4c63a77a82c18f306714104b1decfd722db17b39e" - replacement in Cargo.lock at line 2094
"checksum utf8-ranges 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9d50aa7650df78abf942826607c62468ce18d9019673d4a2ebe1865dbb96ffde""checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737"